]> git.ipfire.org Git - thirdparty/openssl.git/commitdiff
speed: Fix regression of measuring shake with -evp
authorIngo Franzki <ifranzki@linux.ibm.com>
Wed, 22 May 2024 14:15:34 +0000 (16:15 +0200)
committerTomas Mraz <tomas@openssl.org>
Tue, 28 May 2024 06:48:36 +0000 (08:48 +0200)
After commit b911fef216d1386210ec24e201d54d709528abb4 speed with shake128 or
shake256 does not run anymore:

  # openssl speed -seconds 1 -evp shake128 -bytes 256
  Doing shake128 ops for 1s on 256 size blocks: shake128 error!
  000003FF9B7F2080:error:1C8000A6:Provider routines:keccak_final:invalid digest
                     length:providers/implementations/digests/sha3_prov.c:117:
  version: 3.4.0-dev
  ...
  type            256 bytes
  shake128             0.00

Function EVP_Digest_loop() must use EVP_DigestInit_ex2(), EVP_DigestUpdate(),
and EVP_DigestFinalXOF() in case of shake instead of just EVP_Digest() to get
around this.

Signed-off-by: Ingo Franzki <ifranzki@linux.ibm.com>
Reviewed-by: Paul Dale <ppzgs1@gmail.com>
Reviewed-by: Tomas Mraz <tomas@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/24462)

apps/speed.c

index a119a52fde9b45cb9465c5cf20f0e832419c365b..1fd7eb26b6279d9d1fa4ccad896198efe34fb232 100644 (file)
@@ -613,17 +613,37 @@ static int EVP_Digest_loop(const char *mdname, ossl_unused int algindex, void *a
     unsigned char digest[EVP_MAX_MD_SIZE];
     int count;
     EVP_MD *md = NULL;
+    EVP_MD_CTX *ctx = NULL;
 
     if (!opt_md_silent(mdname, &md))
         return -1;
-    for (count = 0; COND(c[algindex][testnum]); count++) {
-        if (!EVP_Digest(buf, (size_t)lengths[testnum], digest, NULL, md,
-                        NULL)) {
+    if (EVP_MD_get_flags(md) & EVP_MD_FLAG_XOF) {
+        ctx = EVP_MD_CTX_new();
+        if (ctx == NULL) {
             count = -1;
-            break;
+            goto out;
+        }
+
+        for (count = 0; COND(c[algindex][testnum]); count++) {
+             if (!EVP_DigestInit_ex2(ctx, md, NULL)
+                 || !EVP_DigestUpdate(ctx, buf, (size_t)lengths[testnum])
+                 || !EVP_DigestFinalXOF(ctx, digest, sizeof(digest))) {
+                count = -1;
+                break;
+            }
+        }
+    } else {
+        for (count = 0; COND(c[algindex][testnum]); count++) {
+            if (!EVP_Digest(buf, (size_t)lengths[testnum], digest, NULL, md,
+                            NULL)) {
+                count = -1;
+                break;
+            }
         }
     }
+out:
     EVP_MD_free(md);
+    EVP_MD_CTX_free(ctx);
     return count;
 }