diff --git a/wolfcrypt/benchmark/benchmark.c b/wolfcrypt/benchmark/benchmark.c index 4bc47bb24..373816ffb 100644 --- a/wolfcrypt/benchmark/benchmark.c +++ b/wolfcrypt/benchmark/benchmark.c @@ -9830,8 +9830,13 @@ exit_decap: void bench_mlkem(int type) { - KyberKey key1; - KyberKey key2; +#ifdef WOLFSSL_SMALL_STACK + KyberKey *key1 = NULL; + KyberKey *key2 = NULL; +#else + KyberKey key1[1]; + KyberKey key2[1]; +#endif const char* name = NULL; int keySize = 0; @@ -9880,14 +9885,30 @@ void bench_mlkem(int type) return; } - bench_mlkem_keygen(type, name, keySize, &key1); -#if !defined(WOLFSSL_MLKEM_NO_ENCAPSULATE) || \ - !defined(WOLFSSL_MLKEM_NO_DECAPSULATE) - bench_mlkem_encap(type, name, keySize, &key1, &key2); +#ifdef WOLFSSL_SMALL_STACK + key1 = (KyberKey *)XMALLOC(sizeof(*key1), HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + if (key1 == NULL) + return; + key2 = (KyberKey *)XMALLOC(sizeof(*key2), HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + if (key2 == NULL) { + XFREE(key1, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + return; + } #endif - wc_KyberKey_Free(&key2); - wc_KyberKey_Free(&key1); + bench_mlkem_keygen(type, name, keySize, key1); +#if !defined(WOLFSSL_MLKEM_NO_ENCAPSULATE) || \ + !defined(WOLFSSL_MLKEM_NO_DECAPSULATE) + bench_mlkem_encap(type, name, keySize, key1, key2); +#endif + + wc_KyberKey_Free(key2); + wc_KyberKey_Free(key1); + +#ifdef WOLFSSL_SMALL_STACK + XFREE(key1, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(key2, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); +#endif } #endif @@ -10095,7 +10116,7 @@ static void bench_lms_keygen(enum wc_LmsParm parm, byte* pub) ret = wc_InitRng(&rng); #endif if (ret != 0) { - fprintf(stderr, "error: wc_InitRng failed: %d\n", ret); + printf("error: wc_InitRng failed: %d\n", ret); return; } @@ -10129,27 +10150,27 @@ static void bench_lms_keygen(enum wc_LmsParm parm, byte* pub) ret = wc_LmsKey_GetParameters(&key, &levels, &height, &winternitz); if (ret) { - fprintf(stderr, "error: wc_LmsKey_GetParameters failed: %d\n", + printf("error: wc_LmsKey_GetParameters failed: %d\n", ret); goto exit_lms_keygen; } ret = wc_LmsKey_SetWriteCb(&key, lms_write_key_mem); if (ret) { - fprintf(stderr, "error: wc_LmsKey_SetWriteCb failed: %d\n", + printf("error: wc_LmsKey_SetWriteCb failed: %d\n", ret); goto exit_lms_keygen; } ret = wc_LmsKey_SetReadCb(&key, lms_read_key_mem); if (ret) { - fprintf(stderr, "error: wc_LmsKey_SetReadCb failed: %d\n", ret); + printf("error: wc_LmsKey_SetReadCb failed: %d\n", ret); goto exit_lms_keygen; } ret = wc_LmsKey_SetContext(&key, (void*)lms_priv); if (ret) { - fprintf(stderr, "error: wc_LmsKey_SetContext failed: %d\n", + printf("error: wc_LmsKey_SetContext failed: %d\n", ret); goto exit_lms_keygen; } @@ -10178,7 +10199,7 @@ static void bench_lms_keygen(enum wc_LmsParm parm, byte* pub) ret = wc_LmsKey_ExportPubRaw(&key, pub, &pubLen); if (ret) { - fprintf(stderr, "error: wc_LmsKey_ExportPubRaw failed: %d\n", ret); + printf("error: wc_LmsKey_ExportPubRaw failed: %d\n", ret); } exit_lms_keygen: @@ -10312,19 +10333,19 @@ static void bench_lms_sign_verify(enum wc_LmsParm parm, byte* pub) ret = wc_LmsKey_SetWriteCb(&key, lms_write_key_mem); if (ret) { - fprintf(stderr, "error: wc_LmsKey_SetWriteCb failed: %d\n", ret); + printf("error: wc_LmsKey_SetWriteCb failed: %d\n", ret); goto exit_lms_sign_verify; } ret = wc_LmsKey_SetReadCb(&key, lms_read_key_mem); if (ret) { - fprintf(stderr, "error: wc_LmsKey_SetReadCb failed: %d\n", ret); + printf("error: wc_LmsKey_SetReadCb failed: %d\n", ret); goto exit_lms_sign_verify; } ret = wc_LmsKey_SetContext(&key, (void*)lms_priv); if (ret) { - fprintf(stderr, "error: wc_LmsKey_SetContext failed: %d\n", ret); + printf("error: wc_LmsKey_SetContext failed: %d\n", ret); goto exit_lms_sign_verify; } @@ -10625,7 +10646,7 @@ static void bench_xmss_sign_verify(const char * params) ret = wc_InitRng(&rng); #endif if (ret != 0) { - fprintf(stderr, "error: wc_InitRng failed: %d\n", ret); + printf("error: wc_InitRng failed: %d\n", ret); goto exit_xmss_sign_verify; } @@ -10633,24 +10654,24 @@ static void bench_xmss_sign_verify(const char * params) ret = wc_XmssKey_Init(&key, NULL, INVALID_DEVID); if (ret != 0) { - fprintf(stderr, "wc_XmssKey_Init failed: %d\n", ret); + printf("wc_XmssKey_Init failed: %d\n", ret); goto exit_xmss_sign_verify; } ret = wc_XmssKey_SetParamStr(&key, params); if (ret != 0) { - fprintf(stderr, "wc_XmssKey_SetParamStr failed: %d\n", ret); + printf("wc_XmssKey_SetParamStr failed: %d\n", ret); goto exit_xmss_sign_verify; } ret = wc_XmssKey_GetPubLen(&key, &pkSz); if (ret != 0) { - fprintf(stderr, "wc_XmssKey_GetPubLen failed: %d\n", ret); + printf("wc_XmssKey_GetPubLen failed: %d\n", ret); goto exit_xmss_sign_verify; } #ifndef WOLFSSL_WC_XMSS if (pkSz != XMSS_SHA256_PUBLEN) { - fprintf(stderr, "error: xmss pub len: got %u, expected %d\n", pkSz, + printf("error: xmss pub len: got %u, expected %d\n", pkSz, XMSS_SHA256_PUBLEN); goto exit_xmss_sign_verify; } @@ -10658,53 +10679,53 @@ static void bench_xmss_sign_verify(const char * params) ret = wc_XmssKey_GetPrivLen(&key, &skSz); if (ret != 0 || skSz <= 0) { - fprintf(stderr, "error: wc_XmssKey_GetPrivLen failed\n"); + printf("error: wc_XmssKey_GetPrivLen failed\n"); goto exit_xmss_sign_verify; } ret = wc_XmssKey_GetSigLen(&key, &sigSz); if (ret != 0 || sigSz <= 0) { - fprintf(stderr, "error: wc_XmssKey_GetSigLen failed\n"); + printf("error: wc_XmssKey_GetSigLen failed\n"); goto exit_xmss_sign_verify; } /* Allocate secret keys.*/ sk = (unsigned char *)XMALLOC(skSz, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); if (sk == NULL) { - fprintf(stderr, "error: allocate xmss sk failed\n"); + printf("error: allocate xmss sk failed\n"); goto exit_xmss_sign_verify; } /* Allocate signature array. */ sig = (byte *)XMALLOC(sigSz, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); if (sig == NULL) { - fprintf(stderr, "error: allocate xmss sig failed\n"); + printf("error: allocate xmss sig failed\n"); goto exit_xmss_sign_verify; } ret = wc_XmssKey_SetWriteCb(&key, xmss_write_key_mem); if (ret != 0) { - fprintf(stderr, "error: wc_XmssKey_SetWriteCb failed: %d\n", ret); + printf("error: wc_XmssKey_SetWriteCb failed: %d\n", ret); goto exit_xmss_sign_verify; } ret = wc_XmssKey_SetReadCb(&key, xmss_read_key_mem); if (ret != 0) { - fprintf(stderr, "error: wc_XmssKey_SetReadCb failed: %d\n", ret); + printf("error: wc_XmssKey_SetReadCb failed: %d\n", ret); goto exit_xmss_sign_verify; } ret = wc_XmssKey_SetContext(&key, (void *)sk); if (ret != 0) { - fprintf(stderr, "error: wc_XmssKey_SetContext failed: %d\n", ret); + printf("error: wc_XmssKey_SetContext failed: %d\n", ret); goto exit_xmss_sign_verify; } #if defined(DEBUG_WOLFSSL) || defined(WOLFSSL_DEBUG_NONBLOCK) - fprintf(stderr, "params: %s\n", params); - fprintf(stderr, "pkSz: %d\n", pkSz); - fprintf(stderr, "skSz: %d\n", skSz); - fprintf(stderr, "sigSz: %d\n", sigSz); + printf("params: %s\n", params); + printf("pkSz: %d\n", pkSz); + printf("skSz: %d\n", skSz); + printf("sigSz: %d\n", sigSz); #endif /* Making the private key is the bottleneck for larger heights. */ @@ -14248,18 +14269,45 @@ static const int sizeof_bench_dilithium_level5_sig = void bench_dilithiumKeySign(byte level) { int ret = 0; - dilithium_key key; double start; int i, count; #if !defined(WOLFSSL_DILITHIUM_NO_SIGN) || !defined(WOLFSSL_DILITHIUM_NO_VERIFY) - byte sig[DILITHIUM_MAX_SIG_SIZE]; - byte msg[512]; word32 x = 0; #endif + +#define DILITHIUM_BENCH_MSG_SIZE 512 +#ifdef WOLFSSL_SMALL_STACK + dilithium_key *key = NULL; + #if !defined(WOLFSSL_DILITHIUM_NO_SIGN) || !defined(WOLFSSL_DILITHIUM_NO_VERIFY) + byte *sig = NULL; + byte *msg = NULL; + #endif +#else + dilithium_key key[1]; + #if !defined(WOLFSSL_DILITHIUM_NO_SIGN) || !defined(WOLFSSL_DILITHIUM_NO_VERIFY) + byte sig[DILITHIUM_MAX_SIG_SIZE]; + byte msg[DILITHIUM_BENCH_MSG_SIZE]; + #endif +#endif + const char**desc = bench_desc_words[lng_index]; DECLARE_MULTI_VALUE_STATS_VARS() byte params = 0; +#ifdef WOLFSSL_SMALL_STACK + key = (dilithium_key *)XMALLOC(sizeof(*key), HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + #if !defined(WOLFSSL_DILITHIUM_NO_SIGN) || !defined(WOLFSSL_DILITHIUM_NO_VERIFY) + sig = (byte *)XMALLOC(DILITHIUM_MAX_SIG_SIZE, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + msg = (byte *)XMALLOC(DILITHIUM_BENCH_MSG_SIZE, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + #endif + + if ((key == NULL) || (sig == NULL) || (msg == NULL)) { + XFREE(key, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + key = NULL; + goto out; + } +#endif /* WOLFSSL_SMALL_STACK */ + if (level == 2) { params = 44; } @@ -14272,18 +14320,18 @@ void bench_dilithiumKeySign(byte level) #if !defined(WOLFSSL_DILITHIUM_NO_SIGN) || !defined(WOLFSSL_DILITHIUM_NO_VERIFY) /* make dummy msg */ - for (i = 0; i < (int)sizeof(msg); i++) { + for (i = 0; i < DILITHIUM_BENCH_MSG_SIZE; i++) { msg[i] = (byte)i; } #endif - ret = wc_dilithium_init(&key); + ret = wc_dilithium_init(key); if (ret != 0) { printf("wc_dilithium_init failed %d\n", ret); - return; + goto out; } - ret = wc_dilithium_set_level(&key, level); + ret = wc_dilithium_set_level(key, level); if (ret != 0) { printf("wc_dilithium_set_level() failed %d\n", ret); } @@ -14292,10 +14340,10 @@ void bench_dilithiumKeySign(byte level) bench_stats_start(&count, &start); do { for (i = 0; i < agreeTimes; i++) { - ret = wc_dilithium_make_key(&key, GLOBAL_RNG); + ret = wc_dilithium_make_key(key, GLOBAL_RNG); if (ret != 0) { printf("wc_dilithium_import_private_key failed %d\n", ret); - return; + goto out; } } count += i; @@ -14318,24 +14366,24 @@ void bench_dilithiumKeySign(byte level) #ifndef WOLFSSL_NO_ML_DSA_44 if (level == 2) { ret = wc_dilithium_import_private(bench_dilithium_level2_key, - sizeof_bench_dilithium_level2_key, &key); + sizeof_bench_dilithium_level2_key, key); } #endif #ifndef WOLFSSL_NO_ML_DSA_65 if (level == 3) { ret = wc_dilithium_import_private(bench_dilithium_level3_key, - sizeof_bench_dilithium_level3_key, &key); + sizeof_bench_dilithium_level3_key, key); } #endif #ifndef WOLFSSL_NO_ML_DSA_87 if (level == 5) { ret = wc_dilithium_import_private(bench_dilithium_level5_key, - sizeof_bench_dilithium_level5_key, &key); + sizeof_bench_dilithium_level5_key, key); } #endif if (ret != 0) { printf("Failed to load private key\n"); - return; + goto out; } #endif @@ -14357,7 +14405,7 @@ void bench_dilithiumKeySign(byte level) do { for (i = 0; i < agreeTimes; i++) { if (ret == 0) { - ret = wc_dilithium_sign_msg(msg, sizeof(msg), sig, &x, &key, + ret = wc_dilithium_sign_msg(msg, DILITHIUM_BENCH_MSG_SIZE, sig, &x, key, GLOBAL_RNG); if (ret != 0) { printf("wc_dilithium_sign_msg failed\n"); @@ -14393,7 +14441,7 @@ void bench_dilithiumKeySign(byte level) XMEMCPY(sig, bench_dilithium_level2_sig, x); #endif ret = wc_dilithium_import_public(bench_dilithium_level2_pubkey, - sizeof_bench_dilithium_level2_pubkey, &key); + sizeof_bench_dilithium_level2_pubkey, key); } #endif #ifndef WOLFSSL_NO_ML_DSA_65 @@ -14403,7 +14451,7 @@ void bench_dilithiumKeySign(byte level) XMEMCPY(sig, bench_dilithium_level3_sig, x); #endif ret = wc_dilithium_import_public(bench_dilithium_level3_pubkey, - sizeof_bench_dilithium_level3_pubkey, &key); + sizeof_bench_dilithium_level3_pubkey, key); } #endif #ifndef WOLFSSL_NO_ML_DSA_87 @@ -14413,12 +14461,12 @@ void bench_dilithiumKeySign(byte level) XMEMCPY(sig, bench_dilithium_level5_sig, x); #endif ret = wc_dilithium_import_public(bench_dilithium_level5_pubkey, - sizeof_bench_dilithium_level5_pubkey, &key); + sizeof_bench_dilithium_level5_pubkey, key); } #endif if (ret != 0) { printf("Failed to load public key\n"); - return; + goto out; } #endif @@ -14431,8 +14479,8 @@ void bench_dilithiumKeySign(byte level) for (i = 0; i < agreeTimes; i++) { if (ret == 0) { int verify = 0; - ret = wc_dilithium_verify_msg(sig, x, msg, sizeof(msg), - &verify, &key); + ret = wc_dilithium_verify_msg(sig, x, msg, DILITHIUM_BENCH_MSG_SIZE, + &verify, key); if (ret != 0 || verify != 1) { printf("wc_dilithium_verify_msg failed %d, verify %d\n", @@ -14458,7 +14506,22 @@ void bench_dilithiumKeySign(byte level) } #endif - wc_dilithium_free(&key); +out: + +#ifdef WOLFSSL_SMALL_STACK + if (key) +#endif + { + wc_dilithium_free(key); + } + +#ifdef WOLFSSL_SMALL_STACK + XFREE(key, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + #if !defined(WOLFSSL_DILITHIUM_NO_SIGN) || !defined(WOLFSSL_DILITHIUM_NO_VERIFY) + XFREE(sig, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + XFREE(msg, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER); + #endif +#endif } #endif /* HAVE_DILITHIUM */