diff --git a/examples/hogweed-benchmark.c b/examples/hogweed-benchmark.c index 1731f3609bbf0cd886256536ac8153ca99f44027..f438bd7ecb345845946cee4559d882a26f98ce31 100644 --- a/examples/hogweed-benchmark.c +++ b/examples/hogweed-benchmark.c @@ -61,12 +61,9 @@ #include "../gmp-glue.h" #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> +#include <openssl/rsa.h> #endif #define BENCH_INTERVAL 0.1 @@ -697,7 +694,6 @@ bench_gostdsa_clear (void *p) #if WITH_OPENSSL struct openssl_rsa_ctx { - EVP_PKEY_CTX *pkey_ctx; EVP_PKEY *key; EVP_MD_CTX *md_ctx; unsigned char *signature; @@ -708,17 +704,11 @@ 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); - EVP_PKEY_CTX_set1_rsa_keygen_pubexp (ctx->pkey_ctx, e); - EVP_PKEY_keygen (ctx->pkey_ctx, &ctx->key); + + /* Always uses e = 65537? */ + ctx->key = EVP_RSA_gen(size); + if (!ctx->key) + die ("OpenSSL EVP_RSA_gen failed.\n"); ctx->md_ctx = EVP_MD_CTX_create(); if (!ctx->md_ctx) @@ -733,7 +723,6 @@ bench_openssl_rsa_init (unsigned size) if (EVP_DigestSignFinal (ctx->md_ctx, ctx->signature, &ctx->siglen) <= 0) die ("OpenSSL EVP_DigestSignFinal failed.\n"); - BN_free(e); // Ok ? return ctx; } @@ -771,7 +760,6 @@ static void bench_openssl_rsa_clear (void *p) { struct openssl_rsa_ctx *ctx = p; - EVP_PKEY_CTX_free (ctx->pkey_ctx); EVP_PKEY_free (ctx->key); EVP_MD_CTX_free (ctx->md_ctx); free (ctx->signature); @@ -780,10 +768,12 @@ bench_openssl_rsa_clear (void *p) struct openssl_ecdsa_ctx { - EC_KEY *key; - ECDSA_SIG *signature; - unsigned digest_length; - uint8_t *digest; + 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 * @@ -794,29 +784,24 @@ bench_openssl_ecdsa_init (unsigned size) switch (size) { case 192: - ctx->key = EC_KEY_new_by_curve_name (NID_X9_62_prime192v1); - ctx->digest_length = 24; /* truncated */ - ctx->digest = hash_string (&nettle_sha224, "abc"); + ctx->key = EVP_EC_gen ("P-192"); + ctx->md = EVP_sha256(); /* truncated? */ break; case 224: - ctx->key = EC_KEY_new_by_curve_name (NID_secp224r1); - ctx->digest_length = SHA224_DIGEST_SIZE; - ctx->digest = hash_string (&nettle_sha224, "abc"); + ctx->key = EVP_EC_gen ("P-224"); + ctx->md = EVP_sha224(); break; case 256: - ctx->key = EC_KEY_new_by_curve_name (NID_X9_62_prime256v1); - ctx->digest_length = SHA256_DIGEST_SIZE; - ctx->digest = hash_string (&nettle_sha256, "abc"); + ctx->key = EVP_EC_gen ("P-256"); + ctx->md = EVP_sha256(); break; case 384: - ctx->key = EC_KEY_new_by_curve_name (NID_secp384r1); - ctx->digest_length = SHA384_DIGEST_SIZE; - ctx->digest = hash_string (&nettle_sha384, "abc"); + ctx->key = EVP_EC_gen ("P-384"); + ctx->md = EVP_sha384(); break; case 521: - ctx->key = EC_KEY_new_by_curve_name (NID_secp521r1); - ctx->digest_length = SHA512_DIGEST_SIZE; - ctx->digest = hash_string (&nettle_sha512, "abc"); + ctx->key = EVP_EC_gen ("P-521"); + ctx->md = EVP_sha512(); break; default: die ("Internal error.\n"); @@ -828,11 +813,19 @@ bench_openssl_ecdsa_init (unsigned size) free(ctx); return NULL; } - - if (!EC_KEY_generate_key( ctx->key)) - die ("Openssl EC_KEY_generate_key failed.\n"); - - ctx->signature = ECDSA_do_sign (ctx->digest, ctx->digest_length, 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, 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; } @@ -840,26 +833,44 @@ bench_openssl_ecdsa_init (unsigned size) static void bench_openssl_ecdsa_sign (void *p) { - const struct openssl_ecdsa_ctx *ctx = p; - ECDSA_SIG *sig = ECDSA_do_sign (ctx->digest, ctx->digest_length, ctx->key); - ECDSA_SIG_free (sig); + 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 (ECDSA_do_verify (ctx->digest, ctx->digest_length, - ctx->signature, ctx->key) != 1) - die ("Openssl ECDSA_do_verify failed.\n"); + + 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; - ECDSA_SIG_free (ctx->signature); - EC_KEY_free (ctx->key); - free (ctx->digest); + EVP_PKEY_free (ctx->key); + EVP_MD_CTX_free (ctx->md_ctx); + free (ctx->signature); free (ctx); } #endif