From: Philipp Gesang Date: Fri, 2 Oct 2020 14:33:45 +0000 (+0200) Subject: update for OpenSSL 1.1.1 API X-Git-Url: http://developer.intra2net.com/git/?a=commitdiff_plain;h=9eed72fcaf64a95b20bf86e64aca6a2b4c3ab392;p=bpdyndnsd update for OpenSSL 1.1.1 API There were some changes to EVP handling that affect us, mostly concerning data structures that were moved behind opaque pointers. --- diff --git a/src/util.cpp b/src/util.cpp index 8aa5bd9..83d5351 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -25,7 +25,7 @@ std::string compute_md5_digest(std::string data) { // 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; @@ -36,50 +36,54 @@ std::string compute_md5_digest(std::string data) // 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;