From 8be0d5c4cbb0a1f1939e314418af6c10d26da70d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Niels=20M=C3=B6ller?= <nisse@lysator.liu.se>
Date: Sun, 3 Dec 2023 20:51:24 +0100
Subject: [PATCH] Update openssl rsa benchmark to use evp interfaces.

---
 examples/hogweed-benchmark.c | 94 +++++++++++++++++++-----------------
 1 file changed, 51 insertions(+), 43 deletions(-)

diff --git a/examples/hogweed-benchmark.c b/examples/hogweed-benchmark.c
index 3d008021..1731f360 100644
--- a/examples/hogweed-benchmark.c
+++ b/examples/hogweed-benchmark.c
@@ -63,6 +63,7 @@
 #if WITH_OPENSSL
 #include <openssl/rsa.h>
 #include <openssl/bn.h>
+#include <openssl/evp.h>
 #include <openssl/ec.h>
 #include <openssl/ecdsa.h>
 #include <openssl/objects.h>
@@ -696,75 +697,84 @@ bench_gostdsa_clear (void *p)
 #if WITH_OPENSSL
 struct openssl_rsa_ctx
 {
-  RSA *key;
-  unsigned char *ref;
+  EVP_PKEY_CTX *pkey_ctx;
+  EVP_PKEY *key;
+  EVP_MD_CTX *md_ctx;
   unsigned char *signature;
-  unsigned int siglen;
-  uint8_t *digest;
+  size_t siglen;
 };
 
-static struct openssl_rsa_ctx*
-make_openssl_rsa_ctx (unsigned size)
+static void *
+bench_openssl_rsa_init (unsigned size)
 {
   struct openssl_rsa_ctx *ctx = xalloc (sizeof (*ctx));
+  ctx->pkey_ctx = EVP_PKEY_CTX_new_from_name (NULL, "RSA", "");
+  if (!ctx->pkey_ctx)
+    die ("OpenSSL EVP_PKEY_CTX_new_from_name (\"RSA\") failed.\n");
+  if (EVP_PKEY_keygen_init (ctx->pkey_ctx) <= 0)
+    die ("OpenSSL EVP_PKEY_keygen_init failed.\n");
+  if (EVP_PKEY_CTX_set_rsa_keygen_bits(ctx->pkey_ctx, size) <= 0)
+    die ("OpenSSL EVP_PKEY_CTX_set_rsa_keygen_bits failed.\n");
   BIGNUM *e = BN_new();
   BN_set_word(e, 65537);
-  ctx->key = RSA_new();
-  RSA_generate_key_ex (ctx->key, size, e, NULL);
-  ctx->ref = xalloc (RSA_size (ctx->key));
-  ctx->signature = xalloc (RSA_size (ctx->key));
-  ctx->digest = hash_string (&nettle_sha1, "foo");
-
-  if (! RSA_sign (NID_sha1, ctx->digest, SHA1_DIGEST_SIZE,
-		  ctx->ref, &ctx->siglen, ctx->key))
-    die ("OpenSSL RSA_sign failed.\n");
-
-  BN_free(e);
+  EVP_PKEY_CTX_set1_rsa_keygen_pubexp (ctx->pkey_ctx, e);
+  EVP_PKEY_keygen (ctx->pkey_ctx, &ctx->key);
+
+  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)
+    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)
+    die ("OpenSSL EVP_DigestSignFinal (... NULL ...) failed.\n");
+  ctx->signature = xalloc (ctx->siglen);
+  if (EVP_DigestSignFinal (ctx->md_ctx, ctx->signature, &ctx->siglen) <= 0)
+    die ("OpenSSL EVP_DigestSignFinal failed.\n");
+
+  BN_free(e); // Ok ?
   return ctx;
 }
 
-static void *
-bench_openssl_rsa_init (unsigned size)
-{
-  struct openssl_rsa_ctx *ctx = make_openssl_rsa_ctx (size);
-  RSA_blinding_off(ctx->key);
-  return ctx;
-}
-
-static void *
-bench_openssl_rsa_tr_init (unsigned size)
-{
-  return make_openssl_rsa_ctx (size);
-}
-
 static void
 bench_openssl_rsa_sign (void *p)
 {
   const struct openssl_rsa_ctx *ctx = p;
-  unsigned siglen;
+  size_t siglen;
 
-  if (! RSA_sign (NID_sha1, ctx->digest, SHA1_DIGEST_SIZE,
-		  ctx->signature, &siglen, ctx->key))
-    die ("OpenSSL RSA_sign failed.\n");
+  if (EVP_DigestSignInit (ctx->md_ctx, NULL, EVP_sha256(), 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)
+    die ("OpenSSL EVP_DigestSignFinal failed.\n");
 }
 
 static void
 bench_openssl_rsa_verify (void *p)
 {
   const struct openssl_rsa_ctx *ctx = p;
-  if (! RSA_verify (NID_sha1, ctx->digest, SHA1_DIGEST_SIZE,
-		    ctx->ref, ctx->siglen, ctx->key))
-    die ("OpenSSL RSA_verify failed.\n");    
+  if (EVP_DigestVerifyInit (ctx->md_ctx, NULL, EVP_sha256(), 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)
+    die ("OpenSSL EVP_DigestVerifyFinal failed.\n");
 }
 
 static void
 bench_openssl_rsa_clear (void *p)
 {
   struct openssl_rsa_ctx *ctx = p;
-  RSA_free (ctx->key);
-  free (ctx->ref);
+  EVP_PKEY_CTX_free (ctx->pkey_ctx);
+  EVP_PKEY_free (ctx->key);
+  EVP_MD_CTX_free (ctx->md_ctx);
   free (ctx->signature);
-  free (ctx->digest);
   free (ctx);
 }
 
@@ -917,8 +927,6 @@ struct alg alg_list[] = {
 #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-tr (openssl)",  1024, bench_openssl_rsa_tr_init, bench_openssl_rsa_sign, bench_openssl_rsa_verify, bench_openssl_rsa_clear },
-  { "rsa-tr (openssl)",  2048, bench_openssl_rsa_tr_init, bench_openssl_rsa_sign, bench_openssl_rsa_verify, bench_openssl_rsa_clear },
 #endif
   { "dsa",   1024, bench_dsa_init,   bench_dsa_sign,   bench_dsa_verify,   bench_dsa_clear },
 #if 0
-- 
GitLab