update for OpenSSL 1.1.1 API openssl-1.1.1
authorPhilipp Gesang <philipp.gesang@intra2net.com>
Fri, 2 Oct 2020 14:33:45 +0000 (16:33 +0200)
committerPhilipp Gesang <philipp.gesang@intra2net.com>
Fri, 2 Oct 2020 14:33:48 +0000 (16:33 +0200)
There were some changes to EVP handling that affect us, mostly
concerning data structures that were moved behind opaque pointers.

src/util.cpp

index 8aa5bd9..83d5351 100644 (file)
@@ -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;