From c072c879f481ea625cad2107a9125e983dd57683 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Niels=20M=C3=B6ller?= <nisse@lysator.liu.se>
Date: Mon, 4 Dec 2023 20:27:08 +0100
Subject: [PATCH] Unify openssl signing benchmarks.

---
 examples/hogweed-benchmark.c | 175 ++++++++++-------------------------
 1 file changed, 48 insertions(+), 127 deletions(-)

diff --git a/examples/hogweed-benchmark.c b/examples/hogweed-benchmark.c
index f438bd7e..20698a88 100644
--- a/examples/hogweed-benchmark.c
+++ b/examples/hogweed-benchmark.c
@@ -692,186 +692,107 @@ bench_gostdsa_clear (void *p)
 }
 
 #if WITH_OPENSSL
-struct openssl_rsa_ctx
+struct openssl_ctx
 {
   EVP_PKEY *key;
+  const EVP_MD *md;
   EVP_MD_CTX *md_ctx;
   unsigned char *signature;
-  size_t siglen;
+  size_t sig_alloc;
+  size_t sig_size;
 };
 
 static void *
-bench_openssl_rsa_init (unsigned size)
+bench_openssl_init (EVP_PKEY *key, const EVP_MD *md)
 {
-  struct openssl_rsa_ctx *ctx = xalloc (sizeof (*ctx));
-
-  /* Always uses e = 65537? */
-  ctx->key = EVP_RSA_gen(size);
-  if (!ctx->key)
-    die ("OpenSSL EVP_RSA_gen failed.\n");
+  struct openssl_ctx *ctx = xalloc (sizeof (*ctx));
 
+  if (!key)
+    die ("OpenSSL key eneration failed.\n");
+  ctx->key = key;
+  ctx->md = md;
   ctx->md_ctx = EVP_MD_CTX_create();
   if (!ctx->md_ctx)
     die ("OpenSSL EVP_MD_CTX_create failed.");
-  if (EVP_DigestSignInit (ctx->md_ctx, NULL, EVP_sha256(), NULL, ctx->key) <= 0)
+
+  if (EVP_DigestSignInit (ctx->md_ctx, NULL, ctx->md, NULL, ctx->key) <= 0)
     die ("OpenSSL EVP_DigestSignInit failed.");
   if (EVP_DigestSignUpdate (ctx->md_ctx, "foo", 3) <= 0)
     die ("OpenSSL EVP_DigestSignUpdate failed.");
-  if (EVP_DigestSignFinal (ctx->md_ctx, NULL, &ctx->siglen) <= 0)
+  if (EVP_DigestSignFinal (ctx->md_ctx, NULL, &ctx->sig_alloc) <= 0)
     die ("OpenSSL EVP_DigestSignFinal (... NULL ...) failed.\n");
-  ctx->signature = xalloc (ctx->siglen);
-  if (EVP_DigestSignFinal (ctx->md_ctx, ctx->signature, &ctx->siglen) <= 0)
+  ctx->signature = xalloc (ctx->sig_alloc);
+  ctx->sig_size = ctx->sig_alloc;
+  if (EVP_DigestSignFinal (ctx->md_ctx, ctx->signature, &ctx->sig_size) <= 0)
     die ("OpenSSL EVP_DigestSignFinal failed.\n");
 
   return ctx;
 }
 
+static void *
+bench_openssl_rsa_init (unsigned size)
+{
+  /* Always uses e = 65537? */
+  return bench_openssl_init (EVP_RSA_gen(size), EVP_sha256());
+}
+
 static void
-bench_openssl_rsa_sign (void *p)
+bench_openssl_sign (void *p)
 {
-  const struct openssl_rsa_ctx *ctx = p;
-  size_t siglen;
+  struct openssl_ctx *ctx = p;
 
-  if (EVP_DigestSignInit (ctx->md_ctx, NULL, EVP_sha256(), NULL, ctx->key) <= 0)
+  if (EVP_DigestSignInit (ctx->md_ctx, NULL, ctx->md, NULL, ctx->key) <= 0)
     die ("OpenSSL EVP_DigestSignInit failed.");
   if (EVP_DigestSignUpdate (ctx->md_ctx, "foo", 3) <= 0)
     die ("OpenSSL EVP_DigestSignUpdate failed.");
-  if (EVP_DigestSignFinal (ctx->md_ctx, NULL, &siglen) <= 0)
-    die ("OpenSSL EVP_DigestSignFinal (... NULL ...) failed.\n");
-  if (siglen != ctx->siglen)
-    die ("Unexpected siglen from EVP_DigestSignFinal.\n");
-  if (EVP_DigestSignFinal (ctx->md_ctx, ctx->signature, &siglen) <= 0)
+  ctx->sig_size = ctx->sig_alloc;
+  if (EVP_DigestSignFinal (ctx->md_ctx, ctx->signature, &ctx->sig_size) <= 0)
     die ("OpenSSL EVP_DigestSignFinal failed.\n");
 }
 
 static void
-bench_openssl_rsa_verify (void *p)
+bench_openssl_verify (void *p)
 {
-  const struct openssl_rsa_ctx *ctx = p;
-  if (EVP_DigestVerifyInit (ctx->md_ctx, NULL, EVP_sha256(), NULL, ctx->key) <= 0)
+  const struct openssl_ctx *ctx = p;
+  if (EVP_DigestVerifyInit (ctx->md_ctx, NULL, ctx->md, NULL, ctx->key) <= 0)
     die ("OpenSSL EVP_DigestVerifyInit failed.\n");
   if (EVP_DigestVerifyUpdate (ctx->md_ctx, "foo", 3) <= 0)
     die ("OpenSSL EVP_DigestVerifyUpdate failed.");
-  if (EVP_DigestVerifyFinal (ctx->md_ctx, ctx->signature, ctx->siglen) <= 0)
+  if (EVP_DigestVerifyFinal (ctx->md_ctx, ctx->signature, ctx->sig_size) <= 0)
     die ("OpenSSL EVP_DigestVerifyFinal failed.\n");
 }
 
 static void
-bench_openssl_rsa_clear (void *p)
+bench_openssl_clear (void *p)
 {
-  struct openssl_rsa_ctx *ctx = p;
+  struct openssl_ctx *ctx = p;
   EVP_PKEY_free (ctx->key);
   EVP_MD_CTX_free (ctx->md_ctx);
   free (ctx->signature);
   free (ctx);
 }
 
-struct openssl_ecdsa_ctx
-{
-  EVP_PKEY *key;
-  const EVP_MD *md;
-  EVP_MD_CTX *md_ctx;
-  unsigned char *signature;
-  size_t sig_alloc;
-  size_t sig_size;
-};
-
 static void *
 bench_openssl_ecdsa_init (unsigned size)
 {
-  struct openssl_ecdsa_ctx *ctx = xalloc (sizeof (*ctx));
+  struct openssl_ctx *ctx = xalloc (sizeof (*ctx));
 
   switch (size)
     {
     case 192:
-      ctx->key = EVP_EC_gen ("P-192");
-      ctx->md = EVP_sha256(); /* truncated? */
-      break;
+      /* Larger hash is truncated? */
+      return bench_openssl_init (EVP_EC_gen ("P-192"), EVP_sha256());
     case 224:
-      ctx->key = EVP_EC_gen ("P-224");
-      ctx->md = EVP_sha224();
-      break;
+      return bench_openssl_init (EVP_EC_gen ("P-224"), EVP_sha224());
     case 256:
-      ctx->key = EVP_EC_gen ("P-256");
-      ctx->md = EVP_sha256();
-      break;
+      return bench_openssl_init (EVP_EC_gen ("P-256"), EVP_sha256());
     case 384:
-      ctx->key = EVP_EC_gen ("P-384");
-      ctx->md = EVP_sha384();
-      break;
+      return bench_openssl_init (EVP_EC_gen ("P-384"), EVP_sha384());
     case 521:
-      ctx->key = EVP_EC_gen ("P-521");
-      ctx->md = EVP_sha512();
-      break;
+      return bench_openssl_init (EVP_EC_gen ("P-521"), EVP_sha512());
     default:
       die ("Internal error.\n");
     }
-
-  /* This curve isn't supported in this build of openssl */
-  if (ctx->key == NULL)
-    {
-      free(ctx);
-      return NULL;
-    }
-  ctx->md_ctx = EVP_MD_CTX_create();
-  if (!ctx->md_ctx)
-    die ("OpenSSL EVP_MD_CTX_create failed.");
-  if (EVP_DigestSignInit (ctx->md_ctx, NULL, ctx->md, NULL, ctx->key) <= 0)
-    die ("OpenSSL EVP_DigestSignInit failed.");
-  if (EVP_DigestSignUpdate (ctx->md_ctx, "foo", 3) <= 0)
-    die ("OpenSSL EVP_DigestSignUpdate failed.");
-  if (EVP_DigestSignFinal (ctx->md_ctx, NULL, &ctx->sig_alloc) <= 0)
-    die ("OpenSSL EVP_DigestSignFinal (... NULL ...) failed.\n");
-  ctx->signature = xalloc (ctx->sig_alloc);
-  ctx->sig_size = ctx->sig_alloc;
-  if (EVP_DigestSignFinal (ctx->md_ctx, ctx->signature, &ctx->sig_size) <= 0)
-    die ("OpenSSL EVP_DigestSignFinal failed.\n");
-  
-  return ctx;
-}
-
-static void
-bench_openssl_ecdsa_sign (void *p)
-{
-  struct openssl_ecdsa_ctx *ctx = p;
-  size_t siglen;
-
-  if (EVP_DigestSignInit (ctx->md_ctx, NULL, ctx->md, NULL, ctx->key) <= 0)
-    die ("OpenSSL EVP_DigestSignInit failed.");
-  if (EVP_DigestSignUpdate (ctx->md_ctx, "foo", 3) <= 0)
-    die ("OpenSSL EVP_DigestSignUpdate failed.");
-  if (EVP_DigestSignFinal (ctx->md_ctx, NULL, &siglen) <= 0)
-    die ("OpenSSL EVP_DigestSignFinal (... NULL ...) failed.\n");
-  if (siglen != ctx->sig_alloc)
-    die ("Unexpected sig_alloc from EVP_DigestSignFinal.\n");
-  ctx->sig_size = siglen;
-  if (EVP_DigestSignFinal (ctx->md_ctx, ctx->signature, &ctx->sig_size) <= 0)
-    die ("OpenSSL EVP_DigestSignFinal failed.\n");
-  if (ctx->sig_size > ctx->sig_alloc)
-    die ("Unexpected sig_size from EVP_DigestSignFinal.\n");
-}
-
-static void
-bench_openssl_ecdsa_verify (void *p)
-{
-  const struct openssl_ecdsa_ctx *ctx = p;
-
-  if (EVP_DigestVerifyInit (ctx->md_ctx, NULL, ctx->md, NULL, ctx->key) <= 0)
-    die ("OpenSSL EVP_DigestVerifyInit failed.\n");
-  if (EVP_DigestVerifyUpdate (ctx->md_ctx, "foo", 3) <= 0)
-    die ("OpenSSL EVP_DigestVerifyUpdate failed.");
-  if (EVP_DigestVerifyFinal (ctx->md_ctx, ctx->signature, ctx->sig_size) <= 0)
-    die ("OpenSSL EVP_DigestVerifyFinal failed.\n");
-}
-
-static void
-bench_openssl_ecdsa_clear (void *p)
-{
-  struct openssl_ecdsa_ctx *ctx = p;
-  EVP_PKEY_free (ctx->key);
-  EVP_MD_CTX_free (ctx->md_ctx);
-  free (ctx->signature);
-  free (ctx);
 }
 #endif
 
@@ -936,8 +857,8 @@ struct alg alg_list[] = {
   { "rsa-tr",   1024, bench_rsa_init,   bench_rsa_sign_tr,   bench_rsa_verify,   bench_rsa_clear },
   { "rsa-tr",   2048, bench_rsa_init,   bench_rsa_sign_tr,   bench_rsa_verify,   bench_rsa_clear },
 #if WITH_OPENSSL
-  { "rsa (openssl)",  1024, bench_openssl_rsa_init, bench_openssl_rsa_sign, bench_openssl_rsa_verify, bench_openssl_rsa_clear },
-  { "rsa (openssl)",  2048, bench_openssl_rsa_init, bench_openssl_rsa_sign, bench_openssl_rsa_verify, bench_openssl_rsa_clear },
+  { "rsa (openssl)",  1024, bench_openssl_rsa_init, bench_openssl_sign, bench_openssl_verify, bench_openssl_clear },
+  { "rsa (openssl)",  2048, bench_openssl_rsa_init, bench_openssl_sign, bench_openssl_verify, bench_openssl_clear },
 #endif
   { "dsa",   1024, bench_dsa_init,   bench_dsa_sign,   bench_dsa_verify,   bench_dsa_clear },
 #if 0
@@ -949,11 +870,11 @@ struct alg alg_list[] = {
   { "ecdsa",  384, bench_ecdsa_init, bench_ecdsa_sign, bench_ecdsa_verify, bench_ecdsa_clear },
   { "ecdsa",  521, bench_ecdsa_init, bench_ecdsa_sign, bench_ecdsa_verify, bench_ecdsa_clear },
 #if WITH_OPENSSL
-  { "ecdsa (openssl)",  192, bench_openssl_ecdsa_init, bench_openssl_ecdsa_sign, bench_openssl_ecdsa_verify, bench_openssl_ecdsa_clear },
-  { "ecdsa (openssl)",  224, bench_openssl_ecdsa_init, bench_openssl_ecdsa_sign, bench_openssl_ecdsa_verify, bench_openssl_ecdsa_clear },
-  { "ecdsa (openssl)",  256, bench_openssl_ecdsa_init, bench_openssl_ecdsa_sign, bench_openssl_ecdsa_verify, bench_openssl_ecdsa_clear },
-  { "ecdsa (openssl)",  384, bench_openssl_ecdsa_init, bench_openssl_ecdsa_sign, bench_openssl_ecdsa_verify, bench_openssl_ecdsa_clear },
-  { "ecdsa (openssl)",  521, bench_openssl_ecdsa_init, bench_openssl_ecdsa_sign, bench_openssl_ecdsa_verify, bench_openssl_ecdsa_clear },
+  { "ecdsa (openssl)",  192, bench_openssl_ecdsa_init, bench_openssl_sign, bench_openssl_verify, bench_openssl_clear },
+  { "ecdsa (openssl)",  224, bench_openssl_ecdsa_init, bench_openssl_sign, bench_openssl_verify, bench_openssl_clear },
+  { "ecdsa (openssl)",  256, bench_openssl_ecdsa_init, bench_openssl_sign, bench_openssl_verify, bench_openssl_clear },
+  { "ecdsa (openssl)",  384, bench_openssl_ecdsa_init, bench_openssl_sign, bench_openssl_verify, bench_openssl_clear },
+  { "ecdsa (openssl)",  521, bench_openssl_ecdsa_init, bench_openssl_sign, bench_openssl_verify, bench_openssl_clear },
 #endif
   { "eddsa", 255, bench_eddsa_init, bench_eddsa_sign, bench_eddsa_verify, bench_eddsa_clear },
   { "eddsa", 448, bench_eddsa_init, bench_eddsa_sign, bench_eddsa_verify, bench_eddsa_clear },
-- 
GitLab