]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#1614] Checkpoint: get rid of EVP_MD_CTX_copy
authorFrancis Dupont <fdupont@isc.org>
Tue, 22 Feb 2022 11:41:05 +0000 (12:41 +0100)
committerTomek Mrugalski <tomek@isc.org>
Fri, 24 Jun 2022 15:37:29 +0000 (17:37 +0200)
src/lib/cryptolink/openssl_hmac.cc

index 29850f79a82c51eb5cb21e39d2956394465972d9..de609fe9ae3d3581d6263fb7c2f29bf0eb4901be 100644 (file)
@@ -36,7 +36,7 @@ public:
     /// @param hash_algorithm The hash algorithm
     explicit HMACImpl(const void* secret, size_t secret_len,
                       const HashAlgorithm hash_algorithm)
-      : hash_algorithm_(hash_algorithm), md_() {
+        : hash_algorithm_(hash_algorithm), md_(), digest_() {
         const EVP_MD* algo = ossl::getHashAlgorithm(hash_algorithm);
         if (algo == 0) {
             isc_throw(UnsupportedAlgorithm,
@@ -169,30 +169,20 @@ public:
         if (len < 10 || len < size / 2) {
             return (false);
         }
-        // Get the digest from a copy of the context
-        EVP_MD_CTX* tmp = EVP_MD_CTX_new();
-        if (tmp == 0) {
-            isc_throw(LibraryError, "OpenSSL EVP_MD_CTX_new() failed");
-        }
-        if (!EVP_MD_CTX_copy(tmp, md_)) {
-            EVP_MD_CTX_free(tmp);
-            isc_throw(LibraryError, "OpenSSL EVP_MD_CTX_copy() failed");
-        }
-        ossl::SecBuf<unsigned char> digest(size);
-        size_t digest_len = size;
-        if (!EVP_DigestSignFinal(tmp, &digest[0], &digest_len)) {
-            EVP_MD_CTX_free(tmp);
-            isc_throw(LibraryError, "OpenSSL EVP_DigestSignFinal() failed");
+        if (digest_.size() == 0) {
+            digest_.resize(size);
+            size_t digest_len = size;
+            if (!EVP_DigestSignFinal(md_, &digest_[0], &digest_len)) {
+                isc_throw(LibraryError, "OpenSSL EVP_DigestSignFinal() failed");
+            }
+            if (digest_len != size) {
+                isc_throw(LibraryError, "OpenSSL partial EVP_DigestSignFinal()");
+            }
         }
-        if (digest_len != size) {
-            EVP_MD_CTX_free(tmp);
-            isc_throw(LibraryError, "OpenSSL partial EVP_DigestSignFinal()");
-        }
-        EVP_MD_CTX_free(tmp);
         if (len > size) {
             len = size;
         }
-        return (digest.same(sig, len));
+        return (digest_.same(sig, len));
     }
 
 private:
@@ -201,6 +191,9 @@ private:
 
     /// @brief The protected pointer to the OpenSSL EVP_MD_CTX structure
     EVP_MD_CTX* md_;
+
+    /// @brief The digest cache for multiple verify
+    ossl::SecBuf<unsigned char> digest_;
 };
 
 HMAC::HMAC(const void* secret, size_t secret_length,