]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Use OpenSSL EVP_MD API directly in isc_iterated_hash()
authorOndřej Surý <ondrej@isc.org>
Mon, 16 Jan 2023 10:12:06 +0000 (11:12 +0100)
committerOndřej Surý <ondrej@isc.org>
Wed, 18 Jan 2023 17:32:57 +0000 (18:32 +0100)
Instead of going through another layer, use OpenSSL EVP_MD API directly
in the isc_iterated_hash() implementation.  This shaves off couple of
microseconds in the microbenchmark.

lib/isc/iterated_hash.c

index 14c63fb7f70d92ad9f5ebcdaf9ccbfaa1bc61a65..5e5b67c388483414249b7616785c94673c33f244 100644 (file)
@@ -13,6 +13,8 @@
 
 #include <stdio.h>
 
+#include <openssl/evp.h>
+
 #include <isc/iterated_hash.h>
 #include <isc/md.h>
 #include <isc/util.h>
@@ -22,55 +24,48 @@ isc_iterated_hash(unsigned char *out, const unsigned int hashalg,
                  const int iterations, const unsigned char *salt,
                  const int saltlength, const unsigned char *in,
                  const int inlength) {
-       isc_md_t *md;
-       isc_result_t result;
+       REQUIRE(out != NULL);
+
        int n = 0;
-       unsigned int outlength = 0;
        size_t len;
+       unsigned int outlength = 0;
        const unsigned char *buf;
+       EVP_MD_CTX *ctx = EVP_MD_CTX_create();
 
-       REQUIRE(out != NULL);
+       RUNTIME_CHECK(ctx != NULL);
 
        if (hashalg != 1) {
                return (0);
        }
 
-       if ((md = isc_md_new()) == NULL) {
-               return (0);
-       }
-
        len = inlength;
        buf = in;
        do {
-               result = isc_md_init(md, ISC_MD_SHA1);
-               if (result != ISC_R_SUCCESS) {
-                       goto md_fail;
-               }
-               result = isc_md_update(md, buf, len);
-               if (result != ISC_R_SUCCESS) {
-                       goto md_fail;
+               if (EVP_DigestInit_ex(ctx, ISC_MD_SHA1, NULL) != 1) {
+                       goto fail;
                }
-               result = isc_md_update(md, salt, saltlength);
-               if (result != ISC_R_SUCCESS) {
-                       goto md_fail;
+
+               if (EVP_DigestUpdate(ctx, buf, len) != 1) {
+                       goto fail;
                }
-               result = isc_md_final(md, out, &outlength);
-               if (result != ISC_R_SUCCESS) {
-                       goto md_fail;
+
+               if (EVP_DigestUpdate(ctx, salt, saltlength) != 1) {
+                       goto fail;
                }
-               result = isc_md_reset(md);
-               if (result != ISC_R_SUCCESS) {
-                       goto md_fail;
+
+               if (EVP_DigestFinal_ex(ctx, out, &outlength) != 1) {
+                       goto fail;
                }
+
                buf = out;
                len = outlength;
        } while (n++ < iterations);
 
-       isc_md_free(md);
+       EVP_MD_CTX_free(ctx);
 
        return (outlength);
-md_fail:
-       isc_md_free(md);
+
+fail:
+       EVP_MD_CTX_free(ctx);
        return (0);
 }
-#undef RETERR