{
// compute an MD5 digest.
- EVP_MD_CTX mdctx;
+ EVP_MD_CTX *mdctx;
const EVP_MD *md;
unsigned char md_value[EVP_MAX_MD_SIZE];
unsigned int md_len = 0;
// Get the md5 digest algorithm from the internal table.
md = EVP_get_digestbyname("md5");
+ mdctx = EVP_MD_CTX_new();
+ if (mdctx == NULL)
+ throw std::invalid_argument("NULL pointer: mdctx");
+
// Test if md is initialized.
if ( (md == NULL) || (EVP_MD_size(md) == 0) )
throw std::invalid_argument("NULL pointer: md");
// Initalize digest content mdctx.
- EVP_MD_CTX_init(&mdctx);
+ EVP_MD_CTX_init(mdctx);
// Now we can call init_ex.
- if ( EVP_DigestInit_ex(&mdctx, md, NULL) == 0 )
+ if ( EVP_DigestInit_ex(mdctx, md, NULL) == 0 )
{
- EVP_MD_CTX_cleanup(&mdctx); /*lint !e534 */
+ EVP_MD_CTX_free(mdctx); /*lint !e534 */
throw std::invalid_argument("Could not set up digest context correctly");
}
// Test if data is empty.
if ( data.empty() )
{
- EVP_MD_CTX_cleanup(&mdctx); /*lint !e534 */
+ EVP_MD_CTX_free(mdctx); /*lint !e534 */
throw std::invalid_argument("Passed data is empty");
}
// Hash the data. At this point data is not empty and &mdctx is initialized.
- if ( EVP_DigestUpdate(&mdctx, data.c_str(), data.size()) == 0 )
+ if ( EVP_DigestUpdate(mdctx, data.c_str(), data.size()) == 0 )
{
- EVP_MD_CTX_cleanup(&mdctx); /*lint !e534 */
+ EVP_MD_CTX_free(mdctx); /*lint !e534 */
throw std::invalid_argument("Could not hash data into digest context");
}
// Retrieve the digest value from &mdctx and place it in md_value.
- if ( EVP_DigestFinal_ex(&mdctx, md_value, &md_len) == 0 )
+ if ( EVP_DigestFinal_ex(mdctx, md_value, &md_len) == 0 )
{
- EVP_MD_CTX_cleanup(&mdctx); /*lint !e534 */
+ EVP_MD_CTX_free(mdctx); /*lint !e534 */
throw std::invalid_argument("Could not retrieve digest value");
}
// Test if md_value is filled correctly and md_len is not zero.
- if ( (md_len == 0) || (EVP_MD_CTX_size(&mdctx) == 0) )
+ if ( (md_len == 0) || (EVP_MD_CTX_size(mdctx) == 0) )
{
- EVP_MD_CTX_cleanup(&mdctx); /*lint !e534 */
+ EVP_MD_CTX_free(mdctx); /*lint !e534 */
throw std::invalid_argument("Retrieved invalid digest value");
}
// Internal cleanup of the digest content.
- EVP_MD_CTX_cleanup(&mdctx); /*lint !e534 */
+ EVP_MD_CTX_free(mdctx); /*lint !e534 */
// Convert md5 digest C string to hex.
std::ostringstream oss_digest_md5_hex;