7#if defined(WIN32) && !defined(__GNUC__)
8#pragma warning( disable : 4355 )
12 #include <openssl/evp.h>
21 mDigestType(digestType),
25 mFinalBin(EVP_MAX_MD_SIZE,
Data::Preallocate)
27 mFinalBin(16,
Data::Preallocate)
35 mContext = EVP_MD_CTX_new();
36 EVP_MD_CTX_init((EVP_MD_CTX*)mContext);
37 ret = EVP_DigestInit_ex((EVP_MD_CTX*)mContext, EVP_md5(),
nullptr);
46 mContext = EVP_MD_CTX_new();
47 EVP_MD_CTX_init((EVP_MD_CTX*)mContext);
48 ret = EVP_DigestInit_ex((EVP_MD_CTX*)mContext, EVP_sha1(),
nullptr);
50 mContext =
new Sha1();
56 mContext = EVP_MD_CTX_new();
57 EVP_MD_CTX_init((EVP_MD_CTX*)mContext);
58 ret = EVP_DigestInit_ex((EVP_MD_CTX*)mContext, EVP_sha256(),
nullptr);
61 mContext = EVP_MD_CTX_new();
62 EVP_MD_CTX_init((EVP_MD_CTX*)mContext);
63 ret = EVP_DigestInit_ex((EVP_MD_CTX*)mContext, EVP_sha512(),
nullptr);
66 mContext = EVP_MD_CTX_new();
67 EVP_MD_CTX_init((EVP_MD_CTX*)mContext);
68 ret = EVP_DigestInit_ex((EVP_MD_CTX*)mContext, EVP_sha512_256(),
nullptr);
77 throw std::runtime_error(
"Failed to initialize digest context");
79 setp(mBuf, mBuf +
sizeof(mBuf));
85 EVP_MD_CTX_free((EVP_MD_CTX*)mContext);
87 if (mDigestType ==
MD5)
91 else if (mDigestType ==
SHA1)
101 if (!mContext)
return -1;
103 size_t len = pptr() - pbase();
107 EVP_DigestUpdate((EVP_MD_CTX*)mContext,
reinterpret_cast <unsigned const char*
>(pbase()), len);
109 if (mDigestType ==
MD5)
111 MD5Update((
MD5Context*)mContext,
reinterpret_cast <unsigned const char*
>(pbase()), (
unsigned int)len);
113 else if (mDigestType ==
SHA1)
115 ((
Sha1*)mContext)->update(std::string(pbase(), len));
119 setp(mBuf, mBuf +
sizeof(mBuf));
148 if (mFinalBin.
size() == 0)
151 unsigned int len = EVP_MAX_MD_SIZE;
152 EVP_DigestFinal_ex((EVP_MD_CTX*)mContext, (
unsigned char*)mFinalBin.
getBuf(len), &len);
155 if (mDigestType ==
MD5)
159 else if (mDigestType ==
SHA1)
161 mFinalBin = ((
Sha1*)mContext)->finalBin();
static Data sha256Name("SHA-256")
static Data sha512Name("SHA-512")
static Data md5Name("MD5")
static Data sha512_256Name("SHA-512-256")
static Data sha1Name("SHA1")
#define resip_assert(x)
This file needs to work for both C and C++ code.
An alternative to std::string, encapsulates an arbitrary buffer of bytes.
static const Data Empty
Constant that represents a zero-length data.
char * getBuf(size_type length)
Set size to be exactly {length}, extending buffer if needed.
size_type size() const noexcept
Returns the number of bytes in this Data.
size_type truncate(size_type len)
Shortens the size of this Data.
Data hex() const
Returns a hexadecimal representation of the contents of this Data.
Implementation of std::streambuf used to back the DigestStream.
virtual int overflow(int c=-1)
DigestBuffer(DigestType digestType=MD5)
Data getHex()
Calls flush() on itself and returns the Digest data in hex format.
static const Data & getDigestName(DigestType digestType)
DigestStream(DigestType digestType=MD5)
dcm! – add UnusedChecking(_enum) below;
void MD5Final(unsigned char digest[16], struct MD5Context *context)
void MD5Init(struct MD5Context *context)
void MD5Update(struct MD5Context *context, md5byte const *buf, unsigned len)