wolfcrypt/benchmark/benchmark.c: smallstack refactors for bench_mlkem() and bench_dilithiumKeySign(), and globally replace stray uses of fprintf(stderr, ...) with printf(...) for portability.

This commit is contained in:
Daniel Pouzzner
2025-07-31 11:30:42 -05:00
parent bbd606538a
commit 1152d612a6

View File

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