From 0b5fd46b42644eb58999f37040b007a4e1e1d23f Mon Sep 17 00:00:00 2001 From: Hideki Miyazaki Date: Wed, 24 Jun 2026 06:47:21 +0900 Subject: [PATCH 1/5] fix typo to guard NO_ML_DSA_87 --- benchmark/bench_modules/wh_bench_mod_mldsa.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmark/bench_modules/wh_bench_mod_mldsa.c b/benchmark/bench_modules/wh_bench_mod_mldsa.c index 20a23c3a5..0034737cd 100644 --- a/benchmark/bench_modules/wh_bench_mod_mldsa.c +++ b/benchmark/bench_modules/wh_bench_mod_mldsa.c @@ -1138,7 +1138,7 @@ int wh_Bench_Mod_MlDsa65KeyGenDma(whClientContext* client, #endif /* !defined(WOLFSSL_NO_ML_DSA_65) */ /* Benchmark functions for ML-DSA 87 */ -#if !defined(WOLFSSL_MLDSA_NO_SIGN) +#if !defined(WOLFSSL_NO_ML_DSA_87) int wh_Bench_Mod_MlDsa87Sign(whClientContext* client, whBenchOpContext* ctx, int id, void* params) { From bc3e226be2550f3c3790a72427c9df00a054ede9 Mon Sep 17 00:00:00 2001 From: Hideki Miyazaki Date: Wed, 24 Jun 2026 14:30:30 +0900 Subject: [PATCH 2/5] Gurad wh_Bench_ServerCfgLoop with WOLFHSM_CFG_ENABLE_SERVER --- benchmark/wh_bench.c | 2391 +++++++++++++++++++++--------------------- 1 file changed, 1196 insertions(+), 1195 deletions(-) diff --git a/benchmark/wh_bench.c b/benchmark/wh_bench.c index cc072a709..ed61ce129 100644 --- a/benchmark/wh_bench.c +++ b/benchmark/wh_bench.c @@ -1,1195 +1,1196 @@ -/* - * Copyright (C) 2025 wolfSSL Inc. - * - * This file is part of wolfHSM. - * - * wolfHSM is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * wolfHSM is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with wolfHSM. If not, see . - */ -#include -#include /* For memset, memcpy */ - -#if defined(WOLFHSM_CFG_TEST_POSIX) -#include /* For gettimeofday and struct timeval */ -#include /* For pthread_create/cancel/join/_t */ -#include /* For sleep */ -#endif - -#include "wolfhsm/wh_settings.h" - -#include "wolfhsm/wh_error.h" -#include "wolfhsm/wh_comm.h" -#include "wolfhsm/wh_transport_mem.h" -#include "wolfhsm/wh_nvm.h" -#include "wolfhsm/wh_nvm_flash.h" -#include "wolfhsm/wh_flash_ramsim.h" -#include "wolfhsm/wh_server.h" -#include "wolfhsm/wh_message.h" -#include "wolfhsm/wh_message_comm.h" -#include "wolfhsm/wh_client.h" -#include "wolfhsm/wh_utils.h" - -#if defined(WOLFHSM_CFG_TEST_POSIX) -/* Include transport-specific headers */ -#include "port/posix/posix_transport_shm.h" -#include "port/posix/posix_transport_tcp.h" -#endif /* WOLFHSM_CFG_TEST_POSIX */ - -#include "wh_bench.h" -#include "wh_bench_mod_all.h" -#include "wh_bench_ops.h" -#include "wh_bench_utils.h" - -#if defined(WOLFHSM_CFG_BENCH_ENABLE) - -/* Default client ID for benchmarks */ -#define WH_BENCH_CLIENT_ID (1) - -/* Buffer sizes for transport */ -/* Large enough to handle an RSA 4096 key */ -#define BUFFER_SIZE \ - (sizeof(whTransportMemCsr) + sizeof(whCommHeader) + \ - WOLFHSM_CFG_COMM_DATA_LEN) -#define FLASH_RAM_SIZE (1024 * 1024) /* 1MB */ - -typedef struct BenchModule { - /* Name and function pointer should be supplied at array initialization */ - const char* const name; - const wh_BenchModuleFunc func; - const whBenchOpThroughputType tpType; - /* ID and parameters are set after registration */ - int id; - void* params; -} BenchModule; - -/* Enum for benchmark module types. These values serve as indices for the - * array of benchmark modules to be registered, so must be contiguous. The size - * of the array will be BENCH_MODULE_IDX_COUNT */ -typedef enum BenchModuleIdx { - BENCH_MODULE_IDX_ECHO = 0, -#if !defined(WOLFHSM_CFG_NO_CRYPTO) -/* RNG */ -#if !defined(WC_NO_RNG) - BENCH_MODULE_IDX_RNG, -#endif /* !(WC_NO_RNG) */ - -/* AES */ -#if !defined(NO_AES) -#if defined(WOLFSSL_AES_COUNTER) - BENCH_MODULE_IDX_AES_128_CTR_ENCRYPT, - BENCH_MODULE_IDX_AES_128_CTR_DECRYPT, - BENCH_MODULE_IDX_AES_128_CTR_ENCRYPT_DMA, - BENCH_MODULE_IDX_AES_128_CTR_DECRYPT_DMA, - BENCH_MODULE_IDX_AES_256_CTR_ENCRYPT, - BENCH_MODULE_IDX_AES_256_CTR_DECRYPT, - BENCH_MODULE_IDX_AES_256_CTR_ENCRYPT_DMA, - BENCH_MODULE_IDX_AES_256_CTR_DECRYPT_DMA, -#endif /* WOLFSSL_AES_COUNTER */ -#if defined(HAVE_AES_ECB) - BENCH_MODULE_IDX_AES_128_ECB_ENCRYPT, - BENCH_MODULE_IDX_AES_128_ECB_DECRYPT, - BENCH_MODULE_IDX_AES_128_ECB_ENCRYPT_DMA, - BENCH_MODULE_IDX_AES_128_ECB_DECRYPT_DMA, - BENCH_MODULE_IDX_AES_256_ECB_ENCRYPT, - BENCH_MODULE_IDX_AES_256_ECB_DECRYPT, - BENCH_MODULE_IDX_AES_256_ECB_ENCRYPT_DMA, - BENCH_MODULE_IDX_AES_256_ECB_DECRYPT_DMA, -#endif /* HAVE_AES_ECB */ -#if defined(HAVE_AES_CBC) - BENCH_MODULE_IDX_AES_128_CBC_ENCRYPT, - BENCH_MODULE_IDX_AES_128_CBC_DECRYPT, - BENCH_MODULE_IDX_AES_128_CBC_ENCRYPT_DMA, - BENCH_MODULE_IDX_AES_128_CBC_DECRYPT_DMA, - BENCH_MODULE_IDX_AES_256_CBC_ENCRYPT, - BENCH_MODULE_IDX_AES_256_CBC_DECRYPT, - BENCH_MODULE_IDX_AES_256_CBC_ENCRYPT_DMA, - BENCH_MODULE_IDX_AES_256_CBC_DECRYPT_DMA, -#endif /* HAVE_AES_CBC */ -#if defined(HAVE_AESGCM) - BENCH_MODULE_IDX_AES_128_GCM_ENCRYPT, - BENCH_MODULE_IDX_AES_128_GCM_DECRYPT, - BENCH_MODULE_IDX_AES_128_GCM_ENCRYPT_DMA, - BENCH_MODULE_IDX_AES_128_GCM_DECRYPT_DMA, - BENCH_MODULE_IDX_AES_256_GCM_ENCRYPT, - BENCH_MODULE_IDX_AES_256_GCM_DECRYPT, - BENCH_MODULE_IDX_AES_256_GCM_ENCRYPT_DMA, - BENCH_MODULE_IDX_AES_256_GCM_DECRYPT_DMA, -#endif /* HAVE_AESGCM */ -#endif /* !(NO_AES) */ - -/* CMAC */ -#if defined(WOLFSSL_CMAC) - BENCH_MODULE_IDX_CMAC_128, - BENCH_MODULE_IDX_CMAC_128_DMA, - BENCH_MODULE_IDX_CMAC_256, - BENCH_MODULE_IDX_CMAC_256_DMA, -#endif /* WOLFSSL_CMAC */ - - -/* SHA2 */ -#if !defined(NO_SHA256) - BENCH_MODULE_IDX_SHA2_256, - BENCH_MODULE_IDX_SHA2_256_DMA, -#endif /* !(NO_SHA256) */ - -#if defined(WOLFSSL_SHA224) - BENCH_MODULE_IDX_SHA2_224, - BENCH_MODULE_IDX_SHA2_224_DMA, -#endif /* WOLFSSL_SHA224 */ - -#if defined(WOLFSSL_SHA384) - BENCH_MODULE_IDX_SHA2_384, - BENCH_MODULE_IDX_SHA2_384_DMA, -#endif /* WOLFSSL_SHA384 */ - -#if defined(WOLFSSL_SHA512) - BENCH_MODULE_IDX_SHA2_512, - BENCH_MODULE_IDX_SHA2_512_DMA, -#endif /* WOLFSSL_SHA512 */ - -/* SHA3 */ -#if defined(WOLFSSL_SHA3) - BENCH_MODULE_IDX_SHA3_256, - BENCH_MODULE_IDX_SHA3_256_DMA, -#endif /* WOLFSSL_SHA3 */ - -/* HMAC */ -#if !defined(NO_HMAC) -#if !defined(NO_SHA256) - BENCH_MODULE_IDX_HMAC_SHA2_256, - BENCH_MODULE_IDX_HMAC_SHA2_256_DMA, -#endif /* !(NO_SHA256) */ -#if defined(WOLFSSL_SHA3) - BENCH_MODULE_IDX_HMAC_SHA3_256, - BENCH_MODULE_IDX_HMAC_SHA3_256_DMA, -#endif /* WOLFSSL_SHA3 */ -#endif /* !(NO_HMAC) */ - -/* HKDF */ -#if defined(HAVE_HKDF) - BENCH_MODULE_IDX_HKDF_SHA2_256, -#endif /* HAVE_HKDF */ - -/* CMAC KDF */ -#if defined(HAVE_CMAC_KDF) && defined(WOLFSSL_CMAC) - BENCH_MODULE_IDX_CMAC_KDF, -#endif /* HAVE_CMAC_KDF && WOLFSSL_CMAC */ - -/* ECC */ -#if defined(HAVE_ECC) - BENCH_MODULE_IDX_ECC_P256_SIGN, - BENCH_MODULE_IDX_ECC_P256_SIGN_DMA, - BENCH_MODULE_IDX_ECC_P256_VERIFY, - BENCH_MODULE_IDX_ECC_P256_VERIFY_DMA, - BENCH_MODULE_IDX_ECC_P256_KEY_GEN, - BENCH_MODULE_IDX_ECC_P256_ECDH, -#endif /* HAVE_ECC */ - -/* RSA */ -#if !defined(NO_RSA) - /* 2048 */ - BENCH_MODULE_IDX_RSA_2048_ENCRYPT, - BENCH_MODULE_IDX_RSA_2048_ENCRYPT_DMA, - BENCH_MODULE_IDX_RSA_2048_DECRYPT, - BENCH_MODULE_IDX_RSA_2048_DECRYPT_DMA, - BENCH_MODULE_IDX_RSA_2048_SIGN, - BENCH_MODULE_IDX_RSA_2048_SIGN_DMA, - BENCH_MODULE_IDX_RSA_2048_VERIFY, - BENCH_MODULE_IDX_RSA_2048_VERIFY_DMA, - BENCH_MODULE_IDX_RSA_2048_KEY_GEN, - BENCH_MODULE_IDX_RSA_2048_KEY_GEN_DMA, - /* 4096 */ - BENCH_MODULE_IDX_RSA_4096_ENCRYPT, - BENCH_MODULE_IDX_RSA_4096_ENCRYPT_DMA, - BENCH_MODULE_IDX_RSA_4096_DECRYPT, - BENCH_MODULE_IDX_RSA_4096_DECRYPT_DMA, - BENCH_MODULE_IDX_RSA_4096_SIGN, - BENCH_MODULE_IDX_RSA_4096_SIGN_DMA, - BENCH_MODULE_IDX_RSA_4096_VERIFY, - BENCH_MODULE_IDX_RSA_4096_VERIFY_DMA, - BENCH_MODULE_IDX_RSA_4096_KEY_GEN, - BENCH_MODULE_IDX_RSA_4096_KEY_GEN_DMA, -#endif /* !(NO_RSA) */ - -/* Curve25519 */ -#if defined(HAVE_CURVE25519) - BENCH_MODULE_IDX_CURVE25519_KEY_GEN, - BENCH_MODULE_IDX_CURVE25519_SHARED_SECRET, -#endif /* HAVE_CURVE25519 */ - -/* ML-DSA */ -#if defined(WOLFSSL_HAVE_MLDSA) -#if !defined(WOLFSSL_NO_ML_DSA_44) - BENCH_MODULE_IDX_ML_DSA_44_SIGN, - BENCH_MODULE_IDX_ML_DSA_44_SIGN_DMA, - BENCH_MODULE_IDX_ML_DSA_44_VERIFY, - BENCH_MODULE_IDX_ML_DSA_44_VERIFY_DMA, - BENCH_MODULE_IDX_ML_DSA_44_KEY_GEN, - BENCH_MODULE_IDX_ML_DSA_44_KEY_GEN_DMA, -#endif /* !(WOLFSSL_NO_ML_DSA_44) */ -#if !defined(WOLFSSL_NO_ML_DSA_65) - BENCH_MODULE_IDX_ML_DSA_65_SIGN, - BENCH_MODULE_IDX_ML_DSA_65_SIGN_DMA, - BENCH_MODULE_IDX_ML_DSA_65_VERIFY, - BENCH_MODULE_IDX_ML_DSA_65_VERIFY_DMA, - BENCH_MODULE_IDX_ML_DSA_65_KEY_GEN, - BENCH_MODULE_IDX_ML_DSA_65_KEY_GEN_DMA, -#endif /* !(WOLFSSL_NO_ML_DSA_65) */ -#if !defined(WOLFSSL_NO_ML_DSA_87) - BENCH_MODULE_IDX_ML_DSA_87_SIGN, - BENCH_MODULE_IDX_ML_DSA_87_SIGN_DMA, - BENCH_MODULE_IDX_ML_DSA_87_VERIFY, - BENCH_MODULE_IDX_ML_DSA_87_VERIFY_DMA, - BENCH_MODULE_IDX_ML_DSA_87_KEY_GEN, - BENCH_MODULE_IDX_ML_DSA_87_KEY_GEN_DMA, -#endif /* !(WOLFSSL_NO_ML_DSA_87) */ -#endif /* WOLFSSL_HAVE_MLDSA */ - -/* ML-KEM */ -#if defined(WOLFSSL_HAVE_MLKEM) -#ifndef WOLFSSL_NO_ML_KEM_512 - BENCH_MODULE_IDX_ML_KEM_512_KEY_GEN, - BENCH_MODULE_IDX_ML_KEM_512_KEY_GEN_DMA, - BENCH_MODULE_IDX_ML_KEM_512_ENCAPS, - BENCH_MODULE_IDX_ML_KEM_512_ENCAPS_DMA, - BENCH_MODULE_IDX_ML_KEM_512_DECAPS, - BENCH_MODULE_IDX_ML_KEM_512_DECAPS_DMA, -#endif /* !WOLFSSL_NO_ML_KEM_512 */ -#ifndef WOLFSSL_NO_ML_KEM_768 - BENCH_MODULE_IDX_ML_KEM_768_KEY_GEN, - BENCH_MODULE_IDX_ML_KEM_768_KEY_GEN_DMA, - BENCH_MODULE_IDX_ML_KEM_768_ENCAPS, - BENCH_MODULE_IDX_ML_KEM_768_ENCAPS_DMA, - BENCH_MODULE_IDX_ML_KEM_768_DECAPS, - BENCH_MODULE_IDX_ML_KEM_768_DECAPS_DMA, -#endif /* !WOLFSSL_NO_ML_KEM_768 */ -#ifndef WOLFSSL_NO_ML_KEM_1024 - BENCH_MODULE_IDX_ML_KEM_1024_KEY_GEN, - BENCH_MODULE_IDX_ML_KEM_1024_KEY_GEN_DMA, - BENCH_MODULE_IDX_ML_KEM_1024_ENCAPS, - BENCH_MODULE_IDX_ML_KEM_1024_ENCAPS_DMA, - BENCH_MODULE_IDX_ML_KEM_1024_DECAPS, - BENCH_MODULE_IDX_ML_KEM_1024_DECAPS_DMA, -#endif /* !WOLFSSL_NO_ML_KEM_1024 */ -#endif /* WOLFSSL_HAVE_MLKEM */ -#endif /* !(WOLFHSM_CFG_NO_CRYPTO) */ - /* number of modules. This must be the last entry and will be used as the - * size of the global modules array */ - BENCH_MODULE_IDX_COUNT -} BenchModuleIdx; - -/* Ensure we have enough space for all modules in the context */ -WH_UTILS_STATIC_ASSERT(MAX_BENCH_OPS > BENCH_MODULE_IDX_COUNT, - "More modules expected than MAX_BENCH_OPS"); - -/* clang-format off */ -static BenchModule g_benchModules[] = { - [BENCH_MODULE_IDX_ECHO] = {"ECHO", wh_Bench_Mod_Echo, BENCH_THROUGHPUT_XBPS, 0, NULL}, -#if !defined(WOLFHSM_CFG_NO_CRYPTO) - /* RNG */ -#if !defined(WC_NO_RNG) - [BENCH_MODULE_IDX_RNG] = {"RNG", wh_Bench_Mod_Rng, BENCH_THROUGHPUT_XBPS, 0, NULL}, -#endif /* !(WC_NO_RNG) */ - - /* AES */ -#if !defined(NO_AES) -#if defined(WOLFSSL_AES_COUNTER) - [BENCH_MODULE_IDX_AES_128_CTR_ENCRYPT] = {"AES-128-CTR-Encrypt", wh_Bench_Mod_Aes128CTREncrypt, BENCH_THROUGHPUT_XBPS, 0, NULL}, - [BENCH_MODULE_IDX_AES_128_CTR_DECRYPT] = {"AES-128-CTR-Decrypt", wh_Bench_Mod_Aes128CTRDecrypt, BENCH_THROUGHPUT_XBPS, 0, NULL}, - [BENCH_MODULE_IDX_AES_128_CTR_ENCRYPT_DMA] = {"AES-128-CTR-Encrypt-DMA", wh_Bench_Mod_Aes128CTREncryptDma, BENCH_THROUGHPUT_XBPS, 0, NULL}, - [BENCH_MODULE_IDX_AES_128_CTR_DECRYPT_DMA] = {"AES-128-CTR-Decrypt-DMA", wh_Bench_Mod_Aes128CTRDecryptDma, BENCH_THROUGHPUT_XBPS, 0, NULL}, - [BENCH_MODULE_IDX_AES_256_CTR_ENCRYPT] = {"AES-256-CTR-Encrypt", wh_Bench_Mod_Aes256CTREncrypt, BENCH_THROUGHPUT_XBPS, 0, NULL}, - [BENCH_MODULE_IDX_AES_256_CTR_DECRYPT] = {"AES-256-CTR-Decrypt", wh_Bench_Mod_Aes256CTRDecrypt, BENCH_THROUGHPUT_XBPS, 0, NULL}, - [BENCH_MODULE_IDX_AES_256_CTR_ENCRYPT_DMA] = {"AES-256-CTR-Encrypt-DMA", wh_Bench_Mod_Aes256CTREncryptDma, BENCH_THROUGHPUT_XBPS, 0, NULL}, - [BENCH_MODULE_IDX_AES_256_CTR_DECRYPT_DMA] = {"AES-256-CTR-Decrypt-DMA", wh_Bench_Mod_Aes256CTRDecryptDma, BENCH_THROUGHPUT_XBPS, 0, NULL}, -#endif /* WOLFSSL_AES_COUNTER */ -#if defined(HAVE_AES_ECB) - [BENCH_MODULE_IDX_AES_128_ECB_ENCRYPT] = {"AES-128-ECB-Encrypt", wh_Bench_Mod_Aes128ECBEncrypt, BENCH_THROUGHPUT_XBPS, 0, NULL}, - [BENCH_MODULE_IDX_AES_128_ECB_DECRYPT] = {"AES-128-ECB-Decrypt", wh_Bench_Mod_Aes128ECBDecrypt, BENCH_THROUGHPUT_XBPS, 0, NULL}, - [BENCH_MODULE_IDX_AES_128_ECB_ENCRYPT_DMA] = {"AES-128-ECB-Encrypt-DMA", wh_Bench_Mod_Aes128ECBEncryptDma, BENCH_THROUGHPUT_XBPS, 0, NULL}, - [BENCH_MODULE_IDX_AES_128_ECB_DECRYPT_DMA] = {"AES-128-ECB-Decrypt-DMA", wh_Bench_Mod_Aes128ECBDecryptDma, BENCH_THROUGHPUT_XBPS, 0, NULL}, - [BENCH_MODULE_IDX_AES_256_ECB_ENCRYPT] = {"AES-256-ECB-Encrypt", wh_Bench_Mod_Aes256ECBEncrypt, BENCH_THROUGHPUT_XBPS, 0, NULL}, - [BENCH_MODULE_IDX_AES_256_ECB_DECRYPT] = {"AES-256-ECB-Decrypt", wh_Bench_Mod_Aes256ECBDecrypt, BENCH_THROUGHPUT_XBPS, 0, NULL}, - [BENCH_MODULE_IDX_AES_256_ECB_ENCRYPT_DMA] = {"AES-256-ECB-Encrypt-DMA", wh_Bench_Mod_Aes256ECBEncryptDma, BENCH_THROUGHPUT_XBPS, 0, NULL}, - [BENCH_MODULE_IDX_AES_256_ECB_DECRYPT_DMA] = {"AES-256-ECB-Decrypt-DMA", wh_Bench_Mod_Aes256ECBDecryptDma, BENCH_THROUGHPUT_XBPS, 0, NULL}, -#endif /* HAVE_AES_ECB */ -#if defined(HAVE_AES_CBC) - [BENCH_MODULE_IDX_AES_128_CBC_ENCRYPT] = {"AES-128-CBC-Encrypt", wh_Bench_Mod_Aes128CBCEncrypt, BENCH_THROUGHPUT_XBPS, 0, NULL}, - [BENCH_MODULE_IDX_AES_128_CBC_DECRYPT] = {"AES-128-CBC-Decrypt", wh_Bench_Mod_Aes128CBCDecrypt, BENCH_THROUGHPUT_XBPS, 0, NULL}, - [BENCH_MODULE_IDX_AES_128_CBC_ENCRYPT_DMA] = {"AES-128-CBC-Encrypt-DMA", wh_Bench_Mod_Aes128CBCEncryptDma, BENCH_THROUGHPUT_XBPS, 0, NULL}, - [BENCH_MODULE_IDX_AES_128_CBC_DECRYPT_DMA] = {"AES-128-CBC-Decrypt-DMA", wh_Bench_Mod_Aes128CBCDecryptDma, BENCH_THROUGHPUT_XBPS, 0, NULL}, - [BENCH_MODULE_IDX_AES_256_CBC_ENCRYPT] = {"AES-256-CBC-Encrypt", wh_Bench_Mod_Aes256CBCEncrypt, BENCH_THROUGHPUT_XBPS, 0, NULL}, - [BENCH_MODULE_IDX_AES_256_CBC_DECRYPT] = {"AES-256-CBC-Decrypt", wh_Bench_Mod_Aes256CBCDecrypt, BENCH_THROUGHPUT_XBPS, 0, NULL}, - [BENCH_MODULE_IDX_AES_256_CBC_ENCRYPT_DMA] = {"AES-256-CBC-Encrypt-DMA", wh_Bench_Mod_Aes256CBCEncryptDma, BENCH_THROUGHPUT_XBPS, 0, NULL}, - [BENCH_MODULE_IDX_AES_256_CBC_DECRYPT_DMA] = {"AES-256-CBC-Decrypt-DMA", wh_Bench_Mod_Aes256CBCDecryptDma, BENCH_THROUGHPUT_XBPS, 0, NULL}, -#endif /* HAVE_AES_CBC */ -#if defined(HAVE_AESGCM) - [BENCH_MODULE_IDX_AES_128_GCM_ENCRYPT] = {"AES-128-GCM-Encrypt", wh_Bench_Mod_Aes128GCMEncrypt, BENCH_THROUGHPUT_XBPS, 0, NULL}, - [BENCH_MODULE_IDX_AES_128_GCM_DECRYPT] = {"AES-128-GCM-Decrypt", wh_Bench_Mod_Aes128GCMDecrypt, BENCH_THROUGHPUT_XBPS, 0, NULL}, - [BENCH_MODULE_IDX_AES_128_GCM_ENCRYPT_DMA] = {"AES-128-GCM-Encrypt-DMA", wh_Bench_Mod_Aes128GCMEncryptDma, BENCH_THROUGHPUT_XBPS, 0, NULL}, - [BENCH_MODULE_IDX_AES_128_GCM_DECRYPT_DMA] = {"AES-128-GCM-Decrypt-DMA", wh_Bench_Mod_Aes128GCMDecryptDma, BENCH_THROUGHPUT_XBPS, 0, NULL}, - [BENCH_MODULE_IDX_AES_256_GCM_ENCRYPT] = {"AES-256-GCM-Encrypt", wh_Bench_Mod_Aes256GCMEncrypt, BENCH_THROUGHPUT_XBPS, 0, NULL}, - [BENCH_MODULE_IDX_AES_256_GCM_DECRYPT] = {"AES-256-GCM-Decrypt", wh_Bench_Mod_Aes256GCMDecrypt, BENCH_THROUGHPUT_XBPS, 0, NULL}, - [BENCH_MODULE_IDX_AES_256_GCM_ENCRYPT_DMA] = {"AES-256-GCM-Encrypt-DMA", wh_Bench_Mod_Aes256GCMEncryptDma, BENCH_THROUGHPUT_XBPS, 0, NULL}, - [BENCH_MODULE_IDX_AES_256_GCM_DECRYPT_DMA] = {"AES-256-GCM-Decrypt-DMA", wh_Bench_Mod_Aes256GCMDecryptDma, BENCH_THROUGHPUT_XBPS, 0, NULL}, -#endif /* HAVE_AESGCM */ -#endif /* !(NO_AES) */ - - /* CMAC */ -#if defined(WOLFSSL_CMAC) - [BENCH_MODULE_IDX_CMAC_128] = {"AES-CMAC-128", wh_Bench_Mod_CmacAes128, BENCH_THROUGHPUT_XBPS, 0, NULL}, - [BENCH_MODULE_IDX_CMAC_128_DMA] = {"AES-CMAC-128-DMA", wh_Bench_Mod_CmacAes128Dma, BENCH_THROUGHPUT_XBPS, 0, NULL}, - [BENCH_MODULE_IDX_CMAC_256] = {"AES-CMAC-256", wh_Bench_Mod_CmacAes256, BENCH_THROUGHPUT_XBPS, 0, NULL}, - [BENCH_MODULE_IDX_CMAC_256_DMA] = {"AES-CMAC-256-DMA", wh_Bench_Mod_CmacAes256Dma, BENCH_THROUGHPUT_XBPS, 0, NULL}, -#endif /* WOLFSSL_CMAC */ - - /* SHA2 */ -#if !defined(NO_SHA256) - [BENCH_MODULE_IDX_SHA2_256] = {"SHA2-256", wh_Bench_Mod_Sha256, BENCH_THROUGHPUT_XBPS, 0, NULL}, - [BENCH_MODULE_IDX_SHA2_256_DMA] = {"SHA2-256-DMA", wh_Bench_Mod_Sha256Dma, BENCH_THROUGHPUT_XBPS, 0, NULL}, -#endif /* !(NO_SHA256) */ -#if defined(WOLFSSL_SHA224) - [BENCH_MODULE_IDX_SHA2_224] = {"SHA2-224", wh_Bench_Mod_Sha224, BENCH_THROUGHPUT_XBPS, 0, NULL}, - [BENCH_MODULE_IDX_SHA2_224_DMA] = {"SHA2-224-DMA", wh_Bench_Mod_Sha224Dma, BENCH_THROUGHPUT_XBPS, 0, NULL}, -#endif /* WOLFSSL_SHA224 */ -#if defined(WOLFSSL_SHA384) - [BENCH_MODULE_IDX_SHA2_384] = {"SHA2-384", wh_Bench_Mod_Sha384, BENCH_THROUGHPUT_XBPS, 0, NULL}, - [BENCH_MODULE_IDX_SHA2_384_DMA] = {"SHA2-384-DMA", wh_Bench_Mod_Sha384Dma, BENCH_THROUGHPUT_XBPS, 0, NULL}, -#endif /* WOLFSSL_SHA384 */ -#if defined(WOLFSSL_SHA512) - [BENCH_MODULE_IDX_SHA2_512] = {"SHA2-512", wh_Bench_Mod_Sha512, BENCH_THROUGHPUT_XBPS, 0, NULL}, - [BENCH_MODULE_IDX_SHA2_512_DMA] = {"SHA2-512-DMA", wh_Bench_Mod_Sha512Dma, BENCH_THROUGHPUT_XBPS, 0, NULL}, -#endif /* WOLFSSL_SHA512 */ - /* SHA3 */ -#if defined(WOLFSSL_SHA3) - [BENCH_MODULE_IDX_SHA3_256] = {"SHA3-256", wh_Bench_Mod_Sha3256, BENCH_THROUGHPUT_NONE, 0, NULL}, - [BENCH_MODULE_IDX_SHA3_256_DMA] = {"SHA3-256-DMA", wh_Bench_Mod_Sha3256Dma, BENCH_THROUGHPUT_NONE, 0, NULL}, -#endif /* WOLFSSL_SHA3 */ - - /* HMAC */ -#if !defined(NO_HMAC) -#if !defined(NO_SHA256) - [BENCH_MODULE_IDX_HMAC_SHA2_256] = {"HMAC-SHA2-256", wh_Bench_Mod_HmacSha256, BENCH_THROUGHPUT_XBPS, 0, NULL}, - [BENCH_MODULE_IDX_HMAC_SHA2_256_DMA] = {"HMAC-SHA2-256-DMA", wh_Bench_Mod_HmacSha256Dma, BENCH_THROUGHPUT_XBPS, 0, NULL}, -#endif /* !(NO_SHA256) */ -#if defined(WOLFSSL_SHA3) - [BENCH_MODULE_IDX_HMAC_SHA3_256] = {"HMAC-SHA3-256", wh_Bench_Mod_HmacSha3256, BENCH_THROUGHPUT_NONE, 0, NULL}, - [BENCH_MODULE_IDX_HMAC_SHA3_256_DMA] = {"HMAC-SHA3-256-DMA", wh_Bench_Mod_HmacSha3256Dma, BENCH_THROUGHPUT_NONE, 0, NULL}, -#endif /* WOLFSSL_SHA3 */ -#endif /* !(NO_HMAC) */ - - /* HKDF */ -#if defined(HAVE_HKDF) - [BENCH_MODULE_IDX_HKDF_SHA2_256] = {"HKDF-SHA2-256", wh_Bench_Mod_HkdfSha256, BENCH_THROUGHPUT_OPS, 0, NULL}, -#endif /* HAVE_HKDF */ - - /* CMAC KDF */ -#if defined(HAVE_CMAC_KDF) && defined(WOLFSSL_CMAC) - [BENCH_MODULE_IDX_CMAC_KDF] = {"CMAC-KDF-AES", wh_Bench_Mod_CmacKdf, BENCH_THROUGHPUT_OPS, 0, NULL}, -#endif /* HAVE_CMAC_KDF && WOLFSSL_CMAC */ - - /* ECC */ -#if defined(HAVE_ECC) - [BENCH_MODULE_IDX_ECC_P256_SIGN] = {"ECC-P256-SIGN", wh_Bench_Mod_EccP256Sign, BENCH_THROUGHPUT_OPS, 0, NULL}, - [BENCH_MODULE_IDX_ECC_P256_SIGN_DMA] = {"ECC-P256-SIGN-DMA", wh_Bench_Mod_EccP256SignDma, BENCH_THROUGHPUT_OPS, 0, NULL}, - [BENCH_MODULE_IDX_ECC_P256_VERIFY] = {"ECC-P256-VERIFY", wh_Bench_Mod_EccP256Verify, BENCH_THROUGHPUT_OPS, 0, NULL}, - [BENCH_MODULE_IDX_ECC_P256_VERIFY_DMA] = {"ECC-P256-VERIFY-DMA", wh_Bench_Mod_EccP256VerifyDma, BENCH_THROUGHPUT_OPS, 0, NULL}, - [BENCH_MODULE_IDX_ECC_P256_KEY_GEN] = {"ECC-P256-KEY-GEN", wh_Bench_Mod_EccP256KeyGen, BENCH_THROUGHPUT_OPS, 0, NULL}, - [BENCH_MODULE_IDX_ECC_P256_ECDH] = {"ECC-P256-ECDH", wh_Bench_Mod_EccP256Ecdh, BENCH_THROUGHPUT_OPS, 0, NULL}, -#endif /* HAVE_ECC */ - - /* RSA */ -#if !defined(NO_RSA) - /* 2048 */ - [BENCH_MODULE_IDX_RSA_2048_ENCRYPT] = {"RSA-2048-PUBLIC-ENCRYPT", wh_Bench_Mod_Rsa2048PubEncrypt, BENCH_THROUGHPUT_XBPS, 0, NULL}, - [BENCH_MODULE_IDX_RSA_2048_ENCRYPT_DMA] = {"RSA-2048-PUBLIC-ENCRYPT-DMA", wh_Bench_Mod_Rsa2048PubEncryptDma, BENCH_THROUGHPUT_XBPS, 0, NULL}, - [BENCH_MODULE_IDX_RSA_2048_DECRYPT] = {"RSA-2048-PRIVATE-DECRYPT", wh_Bench_Mod_Rsa2048PrvDecrypt, BENCH_THROUGHPUT_XBPS, 0, NULL}, - [BENCH_MODULE_IDX_RSA_2048_DECRYPT_DMA] = {"RSA-2048-PRIVATE-DECRYPT-DMA", wh_Bench_Mod_Rsa2048PrvDecryptDma, BENCH_THROUGHPUT_XBPS, 0, NULL}, - [BENCH_MODULE_IDX_RSA_2048_SIGN] = {"RSA-2048-SIGN", wh_Bench_Mod_Rsa2048Sign, BENCH_THROUGHPUT_OPS, 0, NULL}, - [BENCH_MODULE_IDX_RSA_2048_SIGN_DMA] = {"RSA-2048-SIGN-DMA", wh_Bench_Mod_Rsa2048SignDma, BENCH_THROUGHPUT_OPS, 0, NULL}, - [BENCH_MODULE_IDX_RSA_2048_VERIFY] = {"RSA-2048-VERIFY", wh_Bench_Mod_Rsa2048Verify, BENCH_THROUGHPUT_OPS, 0, NULL}, - [BENCH_MODULE_IDX_RSA_2048_VERIFY_DMA] = {"RSA-2048-VERIFY-DMA", wh_Bench_Mod_Rsa2048VerifyDma, BENCH_THROUGHPUT_OPS, 0, NULL}, - [BENCH_MODULE_IDX_RSA_2048_KEY_GEN] = {"RSA-2048-KEY-GEN", wh_Bench_Mod_Rsa2048KeyGen, BENCH_THROUGHPUT_OPS, 0, NULL}, - [BENCH_MODULE_IDX_RSA_2048_KEY_GEN_DMA] = {"RSA-2048-KEY-GEN-DMA", wh_Bench_Mod_Rsa2048KeyGenDma, BENCH_THROUGHPUT_OPS, 0, NULL}, - /* 4096 */ - [BENCH_MODULE_IDX_RSA_4096_ENCRYPT] = {"RSA-4096-PUBLIC-ENCRYPT", wh_Bench_Mod_Rsa4096PubEncrypt, BENCH_THROUGHPUT_XBPS, 0, NULL}, - [BENCH_MODULE_IDX_RSA_4096_ENCRYPT_DMA] = {"RSA-4096-PUBLIC-ENCRYPT-DMA", wh_Bench_Mod_Rsa4096PubEncryptDma, BENCH_THROUGHPUT_XBPS, 0, NULL}, - [BENCH_MODULE_IDX_RSA_4096_DECRYPT] = {"RSA-4096-PRIVATE-DECRYPT", wh_Bench_Mod_Rsa4096PrvDecrypt, BENCH_THROUGHPUT_XBPS, 0, NULL}, - [BENCH_MODULE_IDX_RSA_4096_DECRYPT_DMA] = {"RSA-4096-PRIVATE-DECRYPT-DMA", wh_Bench_Mod_Rsa4096PrvDecryptDma, BENCH_THROUGHPUT_XBPS, 0, NULL}, - [BENCH_MODULE_IDX_RSA_4096_SIGN] = {"RSA-4096-SIGN", wh_Bench_Mod_Rsa4096Sign, BENCH_THROUGHPUT_OPS, 0, NULL}, - [BENCH_MODULE_IDX_RSA_4096_SIGN_DMA] = {"RSA-4096-SIGN-DMA", wh_Bench_Mod_Rsa4096SignDma, BENCH_THROUGHPUT_OPS, 0, NULL}, - [BENCH_MODULE_IDX_RSA_4096_VERIFY] = {"RSA-4096-VERIFY", wh_Bench_Mod_Rsa4096Verify, BENCH_THROUGHPUT_OPS, 0, NULL}, - [BENCH_MODULE_IDX_RSA_4096_VERIFY_DMA] = {"RSA-4096-VERIFY-DMA", wh_Bench_Mod_Rsa4096VerifyDma, BENCH_THROUGHPUT_OPS, 0, NULL}, - [BENCH_MODULE_IDX_RSA_4096_KEY_GEN] = {"RSA-4096-KEY-GEN", wh_Bench_Mod_Rsa4096KeyGen, BENCH_THROUGHPUT_OPS, 0, NULL}, - [BENCH_MODULE_IDX_RSA_4096_KEY_GEN_DMA] = {"RSA-4096-KEY-GEN-DMA", wh_Bench_Mod_Rsa4096KeyGenDma, BENCH_THROUGHPUT_OPS, 0, NULL}, - -#endif /* !(NO_RSA) */ - - /* Curve25519 */ -#if defined(HAVE_CURVE25519) - [BENCH_MODULE_IDX_CURVE25519_KEY_GEN] = {"CURVE25519-KEY-GEN", wh_Bench_Mod_Curve25519KeyGen, BENCH_THROUGHPUT_OPS, 0, NULL}, - [BENCH_MODULE_IDX_CURVE25519_SHARED_SECRET]= {"CURVE25519-SHARED-SECRET", wh_Bench_Mod_Curve25519SharedSecret, BENCH_THROUGHPUT_OPS, 0, NULL}, -#endif /* HAVE_CURVE25519 */ - - /* ML-DSA */ -#if defined(WOLFSSL_HAVE_MLDSA) -#if !defined(WOLFSSL_NO_ML_DSA_44) - [BENCH_MODULE_IDX_ML_DSA_44_SIGN] = {"ML-DSA-44-SIGN", wh_Bench_Mod_MlDsa44Sign, BENCH_THROUGHPUT_OPS, 0, NULL}, - [BENCH_MODULE_IDX_ML_DSA_44_SIGN_DMA] = {"ML-DSA-44-SIGN-DMA", wh_Bench_Mod_MlDsa44SignDma, BENCH_THROUGHPUT_OPS, 0, NULL}, - [BENCH_MODULE_IDX_ML_DSA_44_VERIFY] = {"ML-DSA-44-VERIFY", wh_Bench_Mod_MlDsa44Verify, BENCH_THROUGHPUT_OPS, 0, NULL}, - [BENCH_MODULE_IDX_ML_DSA_44_VERIFY_DMA] = {"ML-DSA-44-VERIFY-DMA", wh_Bench_Mod_MlDsa44VerifyDma, BENCH_THROUGHPUT_OPS, 0, NULL}, - [BENCH_MODULE_IDX_ML_DSA_44_KEY_GEN] = {"ML-DSA-44-KEY-GEN", wh_Bench_Mod_MlDsa44KeyGen, BENCH_THROUGHPUT_OPS, 0, NULL}, - [BENCH_MODULE_IDX_ML_DSA_44_KEY_GEN_DMA] = {"ML-DSA-44-KEY-GEN-DMA", wh_Bench_Mod_MlDsa44KeyGenDma, BENCH_THROUGHPUT_OPS, 0, NULL}, -#endif /* !(WOLFSSL_NO_ML_DSA_44) */ -#if !defined(WOLFSSL_NO_ML_DSA_65) - [BENCH_MODULE_IDX_ML_DSA_65_SIGN] = {"ML-DSA-65-SIGN", wh_Bench_Mod_MlDsa65Sign, BENCH_THROUGHPUT_OPS, 0, NULL}, - [BENCH_MODULE_IDX_ML_DSA_65_SIGN_DMA] = {"ML-DSA-65-SIGN-DMA", wh_Bench_Mod_MlDsa65SignDma, BENCH_THROUGHPUT_OPS, 0, NULL}, - [BENCH_MODULE_IDX_ML_DSA_65_VERIFY] = {"ML-DSA-65-VERIFY", wh_Bench_Mod_MlDsa65Verify, BENCH_THROUGHPUT_OPS, 0, NULL}, - [BENCH_MODULE_IDX_ML_DSA_65_VERIFY_DMA] = {"ML-DSA-65-VERIFY-DMA", wh_Bench_Mod_MlDsa65VerifyDma, BENCH_THROUGHPUT_OPS, 0, NULL}, - [BENCH_MODULE_IDX_ML_DSA_65_KEY_GEN] = {"ML-DSA-65-KEY-GEN", wh_Bench_Mod_MlDsa65KeyGen, BENCH_THROUGHPUT_OPS, 0, NULL}, - [BENCH_MODULE_IDX_ML_DSA_65_KEY_GEN_DMA] = {"ML-DSA-65-KEY-GEN-DMA", wh_Bench_Mod_MlDsa65KeyGenDma, BENCH_THROUGHPUT_OPS, 0, NULL}, -#endif /* !(WOLFSSL_NO_ML_DSA_65) */ -#if !defined(WOLFSSL_NO_ML_DSA_87) - [BENCH_MODULE_IDX_ML_DSA_87_SIGN] = {"ML-DSA-87-SIGN", wh_Bench_Mod_MlDsa87Sign, BENCH_THROUGHPUT_OPS, 0, NULL}, - [BENCH_MODULE_IDX_ML_DSA_87_SIGN_DMA] = {"ML-DSA-87-SIGN-DMA", wh_Bench_Mod_MlDsa87SignDma, BENCH_THROUGHPUT_OPS, 0, NULL}, - [BENCH_MODULE_IDX_ML_DSA_87_VERIFY] = {"ML-DSA-87-VERIFY", wh_Bench_Mod_MlDsa87Verify, BENCH_THROUGHPUT_OPS, 0, NULL}, - [BENCH_MODULE_IDX_ML_DSA_87_VERIFY_DMA] = {"ML-DSA-87-VERIFY-DMA", wh_Bench_Mod_MlDsa87VerifyDma, BENCH_THROUGHPUT_OPS, 0, NULL}, - [BENCH_MODULE_IDX_ML_DSA_87_KEY_GEN] = {"ML-DSA-87-KEY-GEN", wh_Bench_Mod_MlDsa87KeyGen, BENCH_THROUGHPUT_OPS, 0, NULL}, - [BENCH_MODULE_IDX_ML_DSA_87_KEY_GEN_DMA] = {"ML-DSA-87-KEY-GEN-DMA", wh_Bench_Mod_MlDsa87KeyGenDma, BENCH_THROUGHPUT_OPS, 0, NULL}, -#endif /* !(WOLFSSL_NO_ML_DSA_87) */ -#endif /* WOLFSSL_HAVE_MLDSA */ - - /* ML-KEM */ -#if defined(WOLFSSL_HAVE_MLKEM) -#ifndef WOLFSSL_NO_ML_KEM_512 - [BENCH_MODULE_IDX_ML_KEM_512_KEY_GEN] = {"ML-KEM-512-KEY-GEN", wh_Bench_Mod_MlKem512KeyGen, BENCH_THROUGHPUT_OPS, 0, NULL}, - [BENCH_MODULE_IDX_ML_KEM_512_KEY_GEN_DMA] = {"ML-KEM-512-KEY-GEN-DMA", wh_Bench_Mod_MlKem512KeyGenDma, BENCH_THROUGHPUT_OPS, 0, NULL}, - [BENCH_MODULE_IDX_ML_KEM_512_ENCAPS] = {"ML-KEM-512-ENCAPS", wh_Bench_Mod_MlKem512Encaps, BENCH_THROUGHPUT_OPS, 0, NULL}, - [BENCH_MODULE_IDX_ML_KEM_512_ENCAPS_DMA] = {"ML-KEM-512-ENCAPS-DMA", wh_Bench_Mod_MlKem512EncapsDma, BENCH_THROUGHPUT_OPS, 0, NULL}, - [BENCH_MODULE_IDX_ML_KEM_512_DECAPS] = {"ML-KEM-512-DECAPS", wh_Bench_Mod_MlKem512Decaps, BENCH_THROUGHPUT_OPS, 0, NULL}, - [BENCH_MODULE_IDX_ML_KEM_512_DECAPS_DMA] = {"ML-KEM-512-DECAPS-DMA", wh_Bench_Mod_MlKem512DecapsDma, BENCH_THROUGHPUT_OPS, 0, NULL}, -#endif /* !WOLFSSL_NO_ML_KEM_512 */ -#ifndef WOLFSSL_NO_ML_KEM_768 - [BENCH_MODULE_IDX_ML_KEM_768_KEY_GEN] = {"ML-KEM-768-KEY-GEN", wh_Bench_Mod_MlKem768KeyGen, BENCH_THROUGHPUT_OPS, 0, NULL}, - [BENCH_MODULE_IDX_ML_KEM_768_KEY_GEN_DMA] = {"ML-KEM-768-KEY-GEN-DMA", wh_Bench_Mod_MlKem768KeyGenDma, BENCH_THROUGHPUT_OPS, 0, NULL}, - [BENCH_MODULE_IDX_ML_KEM_768_ENCAPS] = {"ML-KEM-768-ENCAPS", wh_Bench_Mod_MlKem768Encaps, BENCH_THROUGHPUT_OPS, 0, NULL}, - [BENCH_MODULE_IDX_ML_KEM_768_ENCAPS_DMA] = {"ML-KEM-768-ENCAPS-DMA", wh_Bench_Mod_MlKem768EncapsDma, BENCH_THROUGHPUT_OPS, 0, NULL}, - [BENCH_MODULE_IDX_ML_KEM_768_DECAPS] = {"ML-KEM-768-DECAPS", wh_Bench_Mod_MlKem768Decaps, BENCH_THROUGHPUT_OPS, 0, NULL}, - [BENCH_MODULE_IDX_ML_KEM_768_DECAPS_DMA] = {"ML-KEM-768-DECAPS-DMA", wh_Bench_Mod_MlKem768DecapsDma, BENCH_THROUGHPUT_OPS, 0, NULL}, -#endif /* !WOLFSSL_NO_ML_KEM_768 */ -#ifndef WOLFSSL_NO_ML_KEM_1024 - [BENCH_MODULE_IDX_ML_KEM_1024_KEY_GEN] = {"ML-KEM-1024-KEY-GEN", wh_Bench_Mod_MlKem1024KeyGen, BENCH_THROUGHPUT_OPS, 0, NULL}, - [BENCH_MODULE_IDX_ML_KEM_1024_KEY_GEN_DMA] = {"ML-KEM-1024-KEY-GEN-DMA", wh_Bench_Mod_MlKem1024KeyGenDma, BENCH_THROUGHPUT_OPS, 0, NULL}, - [BENCH_MODULE_IDX_ML_KEM_1024_ENCAPS] = {"ML-KEM-1024-ENCAPS", wh_Bench_Mod_MlKem1024Encaps, BENCH_THROUGHPUT_OPS, 0, NULL}, - [BENCH_MODULE_IDX_ML_KEM_1024_ENCAPS_DMA] = {"ML-KEM-1024-ENCAPS-DMA", wh_Bench_Mod_MlKem1024EncapsDma, BENCH_THROUGHPUT_OPS, 0, NULL}, - [BENCH_MODULE_IDX_ML_KEM_1024_DECAPS] = {"ML-KEM-1024-DECAPS", wh_Bench_Mod_MlKem1024Decaps, BENCH_THROUGHPUT_OPS, 0, NULL}, - [BENCH_MODULE_IDX_ML_KEM_1024_DECAPS_DMA] = {"ML-KEM-1024-DECAPS-DMA", wh_Bench_Mod_MlKem1024DecapsDma, BENCH_THROUGHPUT_OPS, 0, NULL}, -#endif /* !WOLFSSL_NO_ML_KEM_1024 */ -#endif /* WOLFSSL_HAVE_MLKEM */ -#endif /* !(WOLFHSM_CFG_NO_CRYPTO) */ -}; -/* clang-format on */ - -static int _registerBenchModules(whBenchOpContext* benchCtx) -{ - int ret = 0; - int i; - for (i = 0; i < BENCH_MODULE_IDX_COUNT; i++) { - ret = wh_Bench_RegisterOp(benchCtx, g_benchModules[i].name, - g_benchModules[i].tpType, - &g_benchModules[i].id); - if (ret != WH_ERROR_OK) { - WH_BENCH_PRINTF("Failed to register benchmark module \"%s\": %d\n", - g_benchModules[i].name, ret); - return ret; - } - } - return ret; -} - -void wh_Bench_ListModules(void) -{ - int i; - WH_BENCH_PRINTF("Modules:\n"); - WH_BENCH_PRINTF("Index: Name\n"); - for (i = 0; i < BENCH_MODULE_IDX_COUNT; i++) { - WH_BENCH_PRINTF("%d: %s\n", i, g_benchModules[i].name); - } -} - -/* Placeholder for the benchmarking function */ -static int _runClientBenchmarks(whClientContext* client, int transport, - int moduleIndex) -{ - int ret = 0; - whBenchOpContext benchCtx; - int i; - - WH_BENCH_PRINTF("Running benchmarks...\n"); - - /* Initialize benchmark context */ - ret = wh_Bench_Init(&benchCtx); - if (ret != 0) { - WH_BENCH_PRINTF("Failed to initialize benchmark context: %d\n", ret); - return ret; - } - benchCtx.transportType = transport; - - /* Register operations to benchmark */ - ret = _registerBenchModules(&benchCtx); - if (ret != 0) { - WH_BENCH_PRINTF("Failed to register benchmark modules: %d\n", ret); - return ret; - } - - /* Run specific module or all modules */ - if (moduleIndex >= 0 && moduleIndex < BENCH_MODULE_IDX_COUNT) { - /* Run specific module */ - i = moduleIndex; - WH_BENCH_PRINTF("Benchmarking \"%s\"...\n", g_benchModules[i].name); - ret = g_benchModules[i].func(client, &benchCtx, g_benchModules[i].id, - g_benchModules[i].params); - /* Allow skipping not implemented modules. Return code could be - * wolfCrypt or wolfSSL error */ - if (ret != 0) { - if (ret == WH_ERROR_NOTIMPL) { - WH_BENCH_PRINTF(" -> SKIPPED \"%s\"\n", g_benchModules[i].name); - ret = 0; - } - else { - WH_BENCH_PRINTF( - "Benchmark module \"%s\" failed with error: %d\n", - g_benchModules[i].name, ret); - return ret; - } - } - else { - /* Print results for this module */ - wh_Bench_PrintIntermediateResult(&benchCtx, g_benchModules[i].id); - } - } - else { - /* Run all modules */ - for (i = 0; i < BENCH_MODULE_IDX_COUNT; i++) { - WH_BENCH_PRINTF("Benchmarking \"%s\"...\n", g_benchModules[i].name); - ret = - g_benchModules[i].func(client, &benchCtx, g_benchModules[i].id, - g_benchModules[i].params); - /* Allow skipping not implemented modules. Return code could be - * wolfCrypt or wolfSSL error */ - if (ret != 0) { - if (ret == WH_ERROR_NOTIMPL) { - WH_BENCH_PRINTF(" -> SKIPPED \"%s\"\n", - g_benchModules[i].name); - ret = 0; - } - else { - WH_BENCH_PRINTF( - "Benchmark module \"%s\" failed with error: %d\n", - g_benchModules[i].name, ret); - return ret; - } - } - else { - /* Print results for this module */ - wh_Bench_PrintIntermediateResult(&benchCtx, - g_benchModules[i].id); - } - } - } - - /* Print benchmark results */ - wh_Bench_PrintResults(&benchCtx); - - /* Clean up benchmark context */ - wh_Bench_Cleanup(&benchCtx); - - if (ret == 0) { - WH_BENCH_PRINTF("Benchmarks completed.\n"); - } - - return ret; -} - - -/* additional sanity check in case main() is not used for if the transport - * requested has been enabled */ -static int wh_Bench_CheckTransport(int transport) -{ - switch (transport) { - case WH_BENCH_TRANSPORT_MEM: - break; - case WH_BENCH_TRANSPORT_POSIX_DMA: -#if !defined(WOLFSSL_STATIC_MEMORY) || !defined(WOLFHSM_CFG_TEST_POSIX) - return WH_ERROR_BADARGS; -#else - break; -#endif - case WH_BENCH_TRANSPORT_POSIX_TCP: -#if !defined(WOLFHSM_CFG_TEST_POSIX) - return WH_ERROR_BADARGS; -#else - break; -#endif - case WH_BENCH_TRANSPORT_POSIX_SHM: -#if !defined(WOLFHSM_CFG_TEST_POSIX) - return WH_ERROR_BADARGS; -#else - break; -#endif - default: - return WH_ERROR_BADARGS; - } - return WH_ERROR_OK; -} - -#if defined(WOLFSSL_STATIC_MEMORY) && defined(WOLFHSM_CFG_TEST_POSIX) -static int _whBench_ClientCfg_PosixDmaHeap(posixTransportShmContext* shmCtx) -{ - static const unsigned int listSz = 9; - static const uint32_t sizeList[] = {176, 256, 288, 704, 1056, - 1712, 2112, 2368, 33800}; - static const uint32_t distList[] = {3, 1, 1, 1, 1, 1, 1, 3, 2}; - WOLFSSL_HEAP_HINT* heap = NULL; - void* dma; - size_t dmaSz; - int ret = 0; - - ret = posixTransportShm_GetDma(shmCtx, &dma, &dmaSz); - if (ret != 0) { - WOLFHSM_CFG_PRINTF("Failed to get DMA\n"); - return ret; - } - - ret = wc_LoadStaticMemory_ex(&heap, listSz, sizeList, distList, dma, dmaSz, - 0, 0); - if (ret != 0) { - WH_BENCH_PRINTF("Failed to load static memory: %d\n", ret); - return ret; - } - ret = posixTransportShm_SetDmaHeap(shmCtx, (void*)heap); - if (ret != 0) { - WH_BENCH_PRINTF("Failed to set heap: %d\n", ret); - return ret; - } - - return ret; -} -#endif - -/* Initializes a client context based on the provided config, runs the - * benchmarks, then cleans up the context */ -int wh_Bench_ClientCfg(whClientConfig* clientCfg, int transport) -{ - int ret = 0; - whClientContext client[1] = {0}; - uint32_t client_id = 0; - uint32_t server_id = 0; - - if (clientCfg == NULL) { - return WH_ERROR_BADARGS; - } - - ret = wh_Bench_CheckTransport(transport); - if (ret != WH_ERROR_OK) { - WH_BENCH_PRINTF("Transport not supported: %d\n", ret); - return ret; - } - - /* Initialize the client */ - ret = wh_Client_Init(client, clientCfg); - if (ret != 0) { - WH_BENCH_PRINTF("Failed to initialize client: %d\n", ret); - return ret; - } - -#if defined(WOLFSSL_STATIC_MEMORY) && defined(WOLFHSM_CFG_TEST_POSIX) - if (transport == WH_BENCH_TRANSPORT_POSIX_DMA) { - ret = _whBench_ClientCfg_PosixDmaHeap( - (posixTransportShmContext*)clientCfg->comm->transport_context); - if (ret != 0) { - WH_BENCH_PRINTF("Failed to load static memory: %d\n", ret); - return ret; - } - } -#endif - - /* Establish communication with the server */ - ret = wh_Client_CommInit(client, &client_id, &server_id); - if (ret != 0) { - WH_BENCH_PRINTF("Failed to establish communication with server: %d\n", - ret); - wh_Client_Cleanup(client); - return ret; - } - - /* Run the benchmarks */ - ret = _runClientBenchmarks(client, transport, - -1); /* -1 means run all modules */ - - /* Clean up */ - (void)wh_Client_CommClose(client); - (void)wh_Client_Cleanup(client); - - return ret; -} - -/* Runs the benchmarks on an already initialized client context */ -int wh_Bench_ClientCtx(whClientContext* client, int transport) -{ - if (client == NULL) { - return WH_ERROR_BADARGS; - } - - return _runClientBenchmarks(client, transport, - -1); /* -1 means run all modules */ -} - - -int wh_Bench_ServerCfgLoop(whServerConfig* serverCfg) -{ - whServerContext server[1] = {0}; - whCommConnected am_connected = WH_COMM_CONNECTED; - int ret = 0; - - if (serverCfg == NULL) { - return WH_ERROR_BADARGS; - } - - /* Initialize the server */ - ret = wh_Server_Init(server, serverCfg); - if (ret != 0) { - WH_BENCH_PRINTF("Failed to initialize server: %d\n", ret); - return ret; - } - - /* Set the server as connected */ - ret = wh_Server_SetConnected(server, am_connected); - if (ret != 0) { - WH_BENCH_PRINTF("Failed to set server connected: %d\n", ret); - wh_Server_Cleanup(server); - return ret; - } - - /* Process requests until disconnected */ - while (am_connected == WH_COMM_CONNECTED) { - ret = wh_Server_HandleRequestMessage(server); - if ((ret != WH_ERROR_NOTREADY) && (ret != WH_ERROR_OK)) { - WH_BENCH_PRINTF("Failed to handle request message: %d\n", ret); - break; - } - wh_Server_GetConnected(server, &am_connected); - } - - /* Clean up */ - if (ret == WH_ERROR_NOTREADY) { - /* Ignore not ready status */ - ret = WH_ERROR_OK; - } - (void)wh_Server_Cleanup(server); - - return ret; -} - -#if defined(WOLFHSM_CFG_TEST_POSIX) -typedef struct { - whClientConfig* config; - int moduleIndex; - int transport; -} whBenchClientTaskData; - -static void* _whBenchClientTask(void* data) -{ - whBenchClientTaskData* taskData = (whBenchClientTaskData*)data; - whClientContext client[1] = {0}; - uint32_t client_id = 0; - uint32_t server_id = 0; - int ret = 0; - - /* Initialize the client */ - sleep(1); /* Give the server a chance to setup DMA */ - ret = wh_Client_Init(client, taskData->config); - if (ret != WH_ERROR_OK) { - WH_BENCH_PRINTF("Failed to initialize client: %d\n", ret); - return NULL; - } - -#if defined(WOLFSSL_STATIC_MEMORY) && defined(WOLFHSM_CFG_TEST_POSIX) - if (taskData->transport == WH_BENCH_TRANSPORT_POSIX_DMA) { - ret = _whBench_ClientCfg_PosixDmaHeap( - (posixTransportShmContext*) - taskData->config->comm->transport_context); - if (ret != 0) { - WH_BENCH_PRINTF("Failed to load static memory: %d\n", ret); - return NULL; - } - } -#endif - - /* Establish communication with the server */ - ret = wh_Client_CommInit(client, &client_id, &server_id); - if (ret != 0) { - WH_BENCH_PRINTF("Failed to establish communication with server: %d\n", - ret); - wh_Client_Cleanup(client); - return NULL; - } - - /* Run the benchmarks */ - ret = _runClientBenchmarks(client, taskData->transport, - taskData->moduleIndex); - if (ret != 0) { - WH_BENCH_PRINTF("Client benchmark failed: %d\n", ret); - } - - /* Clean up */ - (void)wh_Client_CommClose(client); - (void)wh_Client_Cleanup(client); - return NULL; -} - -static void* _whBenchServerTask(void* cf) -{ - if (wh_Bench_ServerCfgLoop(cf) != 0) { - WH_BENCH_PRINTF("Server benchmark failed\n"); - } - return NULL; -} - -static void _whBenchClientServerThreadTest(whClientConfig* c_conf, - whServerConfig* s_conf, - int moduleIndex, int transport) -{ - pthread_t cthread = {0}; - pthread_t sthread = {0}; - void* retval; - int rc = 0; - whBenchClientTaskData clientData = {c_conf, moduleIndex, transport}; - - /* Create server thread first */ - rc = pthread_create(&sthread, NULL, _whBenchServerTask, s_conf); - if (rc == 0) { - /* Create client thread */ - rc = pthread_create(&cthread, NULL, _whBenchClientTask, &clientData); - if (rc == 0) { - /* Wait for client to finish, then cancel server */ - (void)pthread_join(cthread, &retval); - (void)pthread_cancel(sthread); - (void)pthread_join(sthread, &retval); - } - else { - /* If client thread creation failed, cancel server */ - (void)pthread_cancel(sthread); - (void)pthread_join(sthread, &retval); - } - } -} - -/* Global static variables for transport configurations */ -static uint8_t g_mem_req[BUFFER_SIZE] = {0}; -static uint8_t g_mem_resp[BUFFER_SIZE] = {0}; -static whTransportMemConfig g_mem_tmcf = { - .req = (whTransportMemCsr*)g_mem_req, - .req_size = sizeof(g_mem_req), - .resp = (whTransportMemCsr*)g_mem_resp, - .resp_size = sizeof(g_mem_resp), -}; -static whTransportClientCb g_mem_tccb = WH_TRANSPORT_MEM_CLIENT_CB; -static whTransportMemClientContext g_mem_tmcc = {0}; -static whCommClientConfig g_mem_cc_conf = { - .transport_cb = &g_mem_tccb, - .transport_context = (void*)&g_mem_tmcc, - .transport_config = (void*)&g_mem_tmcf, - .client_id = WH_BENCH_CLIENT_ID, -}; - -static whTransportServerCb g_mem_tscb = WH_TRANSPORT_MEM_SERVER_CB; -static whTransportMemServerContext g_mem_tmsc = {0}; -static whCommServerConfig g_mem_cs_conf = { - .transport_cb = &g_mem_tscb, - .transport_context = (void*)&g_mem_tmsc, - .transport_config = (void*)&g_mem_tmcf, - .server_id = 124, -}; - -/* Helper function to configure client transport based on type */ -static int _configureClientTransport(whBenchTransportType transport, - whClientConfig* c_conf) -{ - int ret = WH_ERROR_OK; - - switch (transport) { - case WH_BENCH_TRANSPORT_MEM: { - /* Memory transport configuration */ - c_conf->comm = &g_mem_cc_conf; - break; - } - -#if defined(WOLFSSL_STATIC_MEMORY) && defined(WOLFHSM_CFG_TEST_POSIX) - case WH_BENCH_TRANSPORT_POSIX_DMA: { - static whClientDmaConfig dmaConfig; - - dmaConfig.cb = posixTransportShm_ClientStaticMemDmaCallback; - dmaConfig.dmaAddrAllowList = NULL; - c_conf->dmaConfig = &dmaConfig; - }; - __attribute__((fallthrough)); - /* Fall through */ -#endif - - case WH_BENCH_TRANSPORT_POSIX_SHM: { - /* Shared memory transport configuration */ - static whTransportClientCb pttcClientShmCb[1] = { - POSIX_TRANSPORT_SHM_CLIENT_CB}; - static posixTransportShmClientContext tccShm; - static posixTransportShmConfig myshmconfig = { - .name = "wh_bench_shm", - .req_size = 7000, - .resp_size = 7000, - .dma_size = 80000, - }; - static whCommClientConfig ccShmConf = { - .transport_cb = pttcClientShmCb, - .transport_context = (void*)&tccShm, - .transport_config = (void*)&myshmconfig, - .client_id = WH_BENCH_CLIENT_ID, - }; - - memset(&tccShm, 0, sizeof(posixTransportShmClientContext)); - c_conf->comm = &ccShmConf; - break; - } - - case WH_BENCH_TRANSPORT_POSIX_TCP: { - /* TCP transport configuration */ - static whTransportClientCb pttcClientTcpCb = PTT_CLIENT_CB; - static posixTransportTcpClientContext tccTcp; - static posixTransportTcpConfig mytcpconfig = { - .server_ip_string = "127.0.0.1", - .server_port = 23456, - }; - static whCommClientConfig ccTcpConf = { - .transport_cb = &pttcClientTcpCb, - .transport_context = (void*)&tccTcp, - .transport_config = (void*)&mytcpconfig, - .client_id = WH_BENCH_CLIENT_ID, - }; - - memset(&tccTcp, 0, sizeof(posixTransportTcpClientContext)); - c_conf->comm = &ccTcpConf; - break; - } - default: - ret = WH_ERROR_BADARGS; - break; - } - - return ret; -} - -/* Helper function to configure server transport based on type */ -static int _configureServerTransport(whBenchTransportType transport, - whServerConfig* s_conf) -{ - int ret = WH_ERROR_OK; - - switch (transport) { - case WH_BENCH_TRANSPORT_MEM: { - /* Memory transport configuration */ - s_conf->comm_config = &g_mem_cs_conf; - break; - } - -#if defined(WOLFSSL_STATIC_MEMORY) && defined(WOLFHSM_CFG_TEST_POSIX) - case WH_BENCH_TRANSPORT_POSIX_DMA: { - static whServerDmaConfig dmaConfig; - - dmaConfig.cb = posixTransportShm_ServerStaticMemDmaCallback; - dmaConfig.dmaAddrAllowList = NULL; - s_conf->dmaConfig = &dmaConfig; - }; - __attribute__((fallthrough)); - /* Fall through */ -#endif - - case WH_BENCH_TRANSPORT_POSIX_SHM: { - /* Shared memory transport configuration */ - static whTransportServerCb pttServerShmCb[1] = { - POSIX_TRANSPORT_SHM_SERVER_CB}; - static posixTransportShmServerContext tscShm; - static posixTransportShmConfig myshmconfig = { - .name = "wh_bench_shm", - .req_size = 7000, - .resp_size = 7000, - .dma_size = 80000, - }; - static whCommServerConfig csShmConf = { - .transport_cb = pttServerShmCb, - .transport_context = (void*)&tscShm, - .transport_config = (void*)&myshmconfig, - .server_id = 57, - }; - - memset(&tscShm, 0, sizeof(posixTransportShmServerContext)); - s_conf->comm_config = &csShmConf; - break; - } - - case WH_BENCH_TRANSPORT_POSIX_TCP: { - /* TCP transport configuration */ - static whTransportServerCb pttServerTcpCb = PTT_SERVER_CB; - static posixTransportTcpServerContext tscTcp; - static posixTransportTcpConfig mytcpconfig = { - .server_ip_string = "127.0.0.1", - .server_port = 23456, - }; - static whCommServerConfig csTcpConf = { - .transport_cb = &pttServerTcpCb, - .transport_context = (void*)&tscTcp, - .transport_config = (void*)&mytcpconfig, - .server_id = 57, - }; - - memset(&tscTcp, 0, sizeof(posixTransportTcpServerContext)); - s_conf->comm_config = &csTcpConf; - break; - } - - default: - ret = WH_ERROR_BADARGS; - break; - } - - return ret; -} - - -/* transport is the type of transport to use */ -int wh_Bench_ClientServer_Posix(int transport, int moduleIndex) -{ - static uint8_t memory[FLASH_RAM_SIZE] = {0}; - int ret = WH_ERROR_OK; - - /* Client configuration/contexts */ - whClientConfig c_conf[1] = {{0}}; - - /* Server configuration/contexts */ - whServerConfig s_conf[1] = {{0}}; - - /* Configure transport based on type */ - ret = _configureClientTransport(transport, c_conf); - if (ret != WH_ERROR_OK) { - WH_BENCH_PRINTF("Failed to configure client transport: %d\n", ret); - return ret; - } - - ret = _configureServerTransport(transport, s_conf); - if (ret != WH_ERROR_OK) { - WH_BENCH_PRINTF("Failed to configure server transport: %d\n", ret); - return ret; - } - - /* RamSim Flash state and configuration */ - whFlashRamsimCtx fc[1] = {0}; - whFlashRamsimCfg fc_conf[1] = {{ - .size = FLASH_RAM_SIZE, - .sectorSize = FLASH_RAM_SIZE / 2, - .pageSize = 8, - .erasedByte = (uint8_t)0, - .memory = memory, - }}; - const whFlashCb fcb[1] = {WH_FLASH_RAMSIM_CB}; - - /* NVM Flash Configuration using RamSim HAL Flash */ - whNvmFlashConfig nf_conf[1] = {{ - .cb = fcb, - .context = fc, - .config = fc_conf, - }}; - whNvmFlashContext nfc[1] = {0}; - whNvmCb nfcb[1] = {WH_NVM_FLASH_CB}; - - whNvmConfig n_conf[1] = {{ - .cb = nfcb, - .context = nfc, - .config = nf_conf, - }}; - whNvmContext nvm[1] = {{0}}; - -#ifndef WOLFHSM_CFG_NO_CRYPTO - /* Crypto context */ - whServerCryptoContext crypto[1] = {0}; -#endif - - /* Set up server configuration with NVM and crypto */ - s_conf[0].nvm = nvm; -#ifndef WOLFHSM_CFG_NO_CRYPTO - s_conf[0].crypto = crypto; - s_conf[0].devId = INVALID_DEVID; -#endif - - /* Initialize Flash first */ - ret = whFlashRamsim_Init(fc, fc_conf); - if (ret != 0) { - WH_BENCH_PRINTF("Failed to initialize Flash: %d\n", ret); - return ret; - } - - /* Initialize NVM */ - ret = wh_Nvm_Init(nvm, n_conf); - if (ret != 0) { - WH_BENCH_PRINTF("Failed to initialize NVM: %d\n", ret); - whFlashRamsim_Cleanup(fc); - return ret; - } - -#ifndef WOLFHSM_CFG_NO_CRYPTO - /* Initialize wolfCrypt */ - ret = wolfCrypt_Init(); - if (ret != 0) { - WH_BENCH_PRINTF("Failed to initialize wolfCrypt: %d\n", ret); - wh_Nvm_Cleanup(nvm); - whFlashRamsim_Cleanup(fc); - return ret; - } - - /* Initialize RNG */ - ret = wc_InitRng_ex(crypto->rng, NULL, INVALID_DEVID); - if (ret != 0) { - WH_BENCH_PRINTF("Failed to initialize RNG: %d\n", ret); - wolfCrypt_Cleanup(); - wh_Nvm_Cleanup(nvm); - whFlashRamsim_Cleanup(fc); - return ret; - } -#endif - - /* Run client and server in separate threads */ - _whBenchClientServerThreadTest(c_conf, s_conf, moduleIndex, transport); - - /* Clean up */ - wh_Nvm_Cleanup(nvm); - whFlashRamsim_Cleanup(fc); - -#ifndef WOLFHSM_CFG_NO_CRYPTO - wc_FreeRng(crypto->rng); - wolfCrypt_Cleanup(); -#endif - - return WH_ERROR_OK; -} - - -#endif /* WOLFHSM_CFG_TEST_POSIX */ - -#endif /* WOLFHSM_CFG_BENCH_ENABLE */ +/* + * Copyright (C) 2025 wolfSSL Inc. + * + * This file is part of wolfHSM. + * + * wolfHSM is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * wolfHSM is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with wolfHSM. If not, see . + */ +#include +#include /* For memset, memcpy */ + +#if defined(WOLFHSM_CFG_TEST_POSIX) +#include /* For gettimeofday and struct timeval */ +#include /* For pthread_create/cancel/join/_t */ +#include /* For sleep */ +#endif + +#include "wolfhsm/wh_settings.h" + +#include "wolfhsm/wh_error.h" +#include "wolfhsm/wh_comm.h" +#include "wolfhsm/wh_transport_mem.h" +#include "wolfhsm/wh_nvm.h" +#include "wolfhsm/wh_nvm_flash.h" +#include "wolfhsm/wh_flash_ramsim.h" +#include "wolfhsm/wh_server.h" +#include "wolfhsm/wh_message.h" +#include "wolfhsm/wh_message_comm.h" +#include "wolfhsm/wh_client.h" +#include "wolfhsm/wh_utils.h" + +#if defined(WOLFHSM_CFG_TEST_POSIX) +/* Include transport-specific headers */ +#include "port/posix/posix_transport_shm.h" +#include "port/posix/posix_transport_tcp.h" +#endif /* WOLFHSM_CFG_TEST_POSIX */ + +#include "wh_bench.h" +#include "wh_bench_mod_all.h" +#include "wh_bench_ops.h" +#include "wh_bench_utils.h" + +#if defined(WOLFHSM_CFG_BENCH_ENABLE) + +/* Default client ID for benchmarks */ +#define WH_BENCH_CLIENT_ID (1) + +/* Buffer sizes for transport */ +/* Large enough to handle an RSA 4096 key */ +#define BUFFER_SIZE \ + (sizeof(whTransportMemCsr) + sizeof(whCommHeader) + \ + WOLFHSM_CFG_COMM_DATA_LEN) +#define FLASH_RAM_SIZE (1024 * 1024) /* 1MB */ + +typedef struct BenchModule { + /* Name and function pointer should be supplied at array initialization */ + const char* const name; + const wh_BenchModuleFunc func; + const whBenchOpThroughputType tpType; + /* ID and parameters are set after registration */ + int id; + void* params; +} BenchModule; + +/* Enum for benchmark module types. These values serve as indices for the + * array of benchmark modules to be registered, so must be contiguous. The size + * of the array will be BENCH_MODULE_IDX_COUNT */ +typedef enum BenchModuleIdx { + BENCH_MODULE_IDX_ECHO = 0, +#if !defined(WOLFHSM_CFG_NO_CRYPTO) +/* RNG */ +#if !defined(WC_NO_RNG) + BENCH_MODULE_IDX_RNG, +#endif /* !(WC_NO_RNG) */ + +/* AES */ +#if !defined(NO_AES) +#if defined(WOLFSSL_AES_COUNTER) + BENCH_MODULE_IDX_AES_128_CTR_ENCRYPT, + BENCH_MODULE_IDX_AES_128_CTR_DECRYPT, + BENCH_MODULE_IDX_AES_128_CTR_ENCRYPT_DMA, + BENCH_MODULE_IDX_AES_128_CTR_DECRYPT_DMA, + BENCH_MODULE_IDX_AES_256_CTR_ENCRYPT, + BENCH_MODULE_IDX_AES_256_CTR_DECRYPT, + BENCH_MODULE_IDX_AES_256_CTR_ENCRYPT_DMA, + BENCH_MODULE_IDX_AES_256_CTR_DECRYPT_DMA, +#endif /* WOLFSSL_AES_COUNTER */ +#if defined(HAVE_AES_ECB) + BENCH_MODULE_IDX_AES_128_ECB_ENCRYPT, + BENCH_MODULE_IDX_AES_128_ECB_DECRYPT, + BENCH_MODULE_IDX_AES_128_ECB_ENCRYPT_DMA, + BENCH_MODULE_IDX_AES_128_ECB_DECRYPT_DMA, + BENCH_MODULE_IDX_AES_256_ECB_ENCRYPT, + BENCH_MODULE_IDX_AES_256_ECB_DECRYPT, + BENCH_MODULE_IDX_AES_256_ECB_ENCRYPT_DMA, + BENCH_MODULE_IDX_AES_256_ECB_DECRYPT_DMA, +#endif /* HAVE_AES_ECB */ +#if defined(HAVE_AES_CBC) + BENCH_MODULE_IDX_AES_128_CBC_ENCRYPT, + BENCH_MODULE_IDX_AES_128_CBC_DECRYPT, + BENCH_MODULE_IDX_AES_128_CBC_ENCRYPT_DMA, + BENCH_MODULE_IDX_AES_128_CBC_DECRYPT_DMA, + BENCH_MODULE_IDX_AES_256_CBC_ENCRYPT, + BENCH_MODULE_IDX_AES_256_CBC_DECRYPT, + BENCH_MODULE_IDX_AES_256_CBC_ENCRYPT_DMA, + BENCH_MODULE_IDX_AES_256_CBC_DECRYPT_DMA, +#endif /* HAVE_AES_CBC */ +#if defined(HAVE_AESGCM) + BENCH_MODULE_IDX_AES_128_GCM_ENCRYPT, + BENCH_MODULE_IDX_AES_128_GCM_DECRYPT, + BENCH_MODULE_IDX_AES_128_GCM_ENCRYPT_DMA, + BENCH_MODULE_IDX_AES_128_GCM_DECRYPT_DMA, + BENCH_MODULE_IDX_AES_256_GCM_ENCRYPT, + BENCH_MODULE_IDX_AES_256_GCM_DECRYPT, + BENCH_MODULE_IDX_AES_256_GCM_ENCRYPT_DMA, + BENCH_MODULE_IDX_AES_256_GCM_DECRYPT_DMA, +#endif /* HAVE_AESGCM */ +#endif /* !(NO_AES) */ + +/* CMAC */ +#if defined(WOLFSSL_CMAC) + BENCH_MODULE_IDX_CMAC_128, + BENCH_MODULE_IDX_CMAC_128_DMA, + BENCH_MODULE_IDX_CMAC_256, + BENCH_MODULE_IDX_CMAC_256_DMA, +#endif /* WOLFSSL_CMAC */ + + +/* SHA2 */ +#if !defined(NO_SHA256) + BENCH_MODULE_IDX_SHA2_256, + BENCH_MODULE_IDX_SHA2_256_DMA, +#endif /* !(NO_SHA256) */ + +#if defined(WOLFSSL_SHA224) + BENCH_MODULE_IDX_SHA2_224, + BENCH_MODULE_IDX_SHA2_224_DMA, +#endif /* WOLFSSL_SHA224 */ + +#if defined(WOLFSSL_SHA384) + BENCH_MODULE_IDX_SHA2_384, + BENCH_MODULE_IDX_SHA2_384_DMA, +#endif /* WOLFSSL_SHA384 */ + +#if defined(WOLFSSL_SHA512) + BENCH_MODULE_IDX_SHA2_512, + BENCH_MODULE_IDX_SHA2_512_DMA, +#endif /* WOLFSSL_SHA512 */ + +/* SHA3 */ +#if defined(WOLFSSL_SHA3) + BENCH_MODULE_IDX_SHA3_256, + BENCH_MODULE_IDX_SHA3_256_DMA, +#endif /* WOLFSSL_SHA3 */ + +/* HMAC */ +#if !defined(NO_HMAC) +#if !defined(NO_SHA256) + BENCH_MODULE_IDX_HMAC_SHA2_256, + BENCH_MODULE_IDX_HMAC_SHA2_256_DMA, +#endif /* !(NO_SHA256) */ +#if defined(WOLFSSL_SHA3) + BENCH_MODULE_IDX_HMAC_SHA3_256, + BENCH_MODULE_IDX_HMAC_SHA3_256_DMA, +#endif /* WOLFSSL_SHA3 */ +#endif /* !(NO_HMAC) */ + +/* HKDF */ +#if defined(HAVE_HKDF) + BENCH_MODULE_IDX_HKDF_SHA2_256, +#endif /* HAVE_HKDF */ + +/* CMAC KDF */ +#if defined(HAVE_CMAC_KDF) && defined(WOLFSSL_CMAC) + BENCH_MODULE_IDX_CMAC_KDF, +#endif /* HAVE_CMAC_KDF && WOLFSSL_CMAC */ + +/* ECC */ +#if defined(HAVE_ECC) + BENCH_MODULE_IDX_ECC_P256_SIGN, + BENCH_MODULE_IDX_ECC_P256_SIGN_DMA, + BENCH_MODULE_IDX_ECC_P256_VERIFY, + BENCH_MODULE_IDX_ECC_P256_VERIFY_DMA, + BENCH_MODULE_IDX_ECC_P256_KEY_GEN, + BENCH_MODULE_IDX_ECC_P256_ECDH, +#endif /* HAVE_ECC */ + +/* RSA */ +#if !defined(NO_RSA) + /* 2048 */ + BENCH_MODULE_IDX_RSA_2048_ENCRYPT, + BENCH_MODULE_IDX_RSA_2048_ENCRYPT_DMA, + BENCH_MODULE_IDX_RSA_2048_DECRYPT, + BENCH_MODULE_IDX_RSA_2048_DECRYPT_DMA, + BENCH_MODULE_IDX_RSA_2048_SIGN, + BENCH_MODULE_IDX_RSA_2048_SIGN_DMA, + BENCH_MODULE_IDX_RSA_2048_VERIFY, + BENCH_MODULE_IDX_RSA_2048_VERIFY_DMA, + BENCH_MODULE_IDX_RSA_2048_KEY_GEN, + BENCH_MODULE_IDX_RSA_2048_KEY_GEN_DMA, + /* 4096 */ + BENCH_MODULE_IDX_RSA_4096_ENCRYPT, + BENCH_MODULE_IDX_RSA_4096_ENCRYPT_DMA, + BENCH_MODULE_IDX_RSA_4096_DECRYPT, + BENCH_MODULE_IDX_RSA_4096_DECRYPT_DMA, + BENCH_MODULE_IDX_RSA_4096_SIGN, + BENCH_MODULE_IDX_RSA_4096_SIGN_DMA, + BENCH_MODULE_IDX_RSA_4096_VERIFY, + BENCH_MODULE_IDX_RSA_4096_VERIFY_DMA, + BENCH_MODULE_IDX_RSA_4096_KEY_GEN, + BENCH_MODULE_IDX_RSA_4096_KEY_GEN_DMA, +#endif /* !(NO_RSA) */ + +/* Curve25519 */ +#if defined(HAVE_CURVE25519) + BENCH_MODULE_IDX_CURVE25519_KEY_GEN, + BENCH_MODULE_IDX_CURVE25519_SHARED_SECRET, +#endif /* HAVE_CURVE25519 */ + +/* ML-DSA */ +#if defined(WOLFSSL_HAVE_MLDSA) +#if !defined(WOLFSSL_NO_ML_DSA_44) + BENCH_MODULE_IDX_ML_DSA_44_SIGN, + BENCH_MODULE_IDX_ML_DSA_44_SIGN_DMA, + BENCH_MODULE_IDX_ML_DSA_44_VERIFY, + BENCH_MODULE_IDX_ML_DSA_44_VERIFY_DMA, + BENCH_MODULE_IDX_ML_DSA_44_KEY_GEN, + BENCH_MODULE_IDX_ML_DSA_44_KEY_GEN_DMA, +#endif /* !(WOLFSSL_NO_ML_DSA_44) */ +#if !defined(WOLFSSL_NO_ML_DSA_65) + BENCH_MODULE_IDX_ML_DSA_65_SIGN, + BENCH_MODULE_IDX_ML_DSA_65_SIGN_DMA, + BENCH_MODULE_IDX_ML_DSA_65_VERIFY, + BENCH_MODULE_IDX_ML_DSA_65_VERIFY_DMA, + BENCH_MODULE_IDX_ML_DSA_65_KEY_GEN, + BENCH_MODULE_IDX_ML_DSA_65_KEY_GEN_DMA, +#endif /* !(WOLFSSL_NO_ML_DSA_65) */ +#if !defined(WOLFSSL_NO_ML_DSA_87) + BENCH_MODULE_IDX_ML_DSA_87_SIGN, + BENCH_MODULE_IDX_ML_DSA_87_SIGN_DMA, + BENCH_MODULE_IDX_ML_DSA_87_VERIFY, + BENCH_MODULE_IDX_ML_DSA_87_VERIFY_DMA, + BENCH_MODULE_IDX_ML_DSA_87_KEY_GEN, + BENCH_MODULE_IDX_ML_DSA_87_KEY_GEN_DMA, +#endif /* !(WOLFSSL_NO_ML_DSA_87) */ +#endif /* WOLFSSL_HAVE_MLDSA */ + +/* ML-KEM */ +#if defined(WOLFSSL_HAVE_MLKEM) +#ifndef WOLFSSL_NO_ML_KEM_512 + BENCH_MODULE_IDX_ML_KEM_512_KEY_GEN, + BENCH_MODULE_IDX_ML_KEM_512_KEY_GEN_DMA, + BENCH_MODULE_IDX_ML_KEM_512_ENCAPS, + BENCH_MODULE_IDX_ML_KEM_512_ENCAPS_DMA, + BENCH_MODULE_IDX_ML_KEM_512_DECAPS, + BENCH_MODULE_IDX_ML_KEM_512_DECAPS_DMA, +#endif /* !WOLFSSL_NO_ML_KEM_512 */ +#ifndef WOLFSSL_NO_ML_KEM_768 + BENCH_MODULE_IDX_ML_KEM_768_KEY_GEN, + BENCH_MODULE_IDX_ML_KEM_768_KEY_GEN_DMA, + BENCH_MODULE_IDX_ML_KEM_768_ENCAPS, + BENCH_MODULE_IDX_ML_KEM_768_ENCAPS_DMA, + BENCH_MODULE_IDX_ML_KEM_768_DECAPS, + BENCH_MODULE_IDX_ML_KEM_768_DECAPS_DMA, +#endif /* !WOLFSSL_NO_ML_KEM_768 */ +#ifndef WOLFSSL_NO_ML_KEM_1024 + BENCH_MODULE_IDX_ML_KEM_1024_KEY_GEN, + BENCH_MODULE_IDX_ML_KEM_1024_KEY_GEN_DMA, + BENCH_MODULE_IDX_ML_KEM_1024_ENCAPS, + BENCH_MODULE_IDX_ML_KEM_1024_ENCAPS_DMA, + BENCH_MODULE_IDX_ML_KEM_1024_DECAPS, + BENCH_MODULE_IDX_ML_KEM_1024_DECAPS_DMA, +#endif /* !WOLFSSL_NO_ML_KEM_1024 */ +#endif /* WOLFSSL_HAVE_MLKEM */ +#endif /* !(WOLFHSM_CFG_NO_CRYPTO) */ + /* number of modules. This must be the last entry and will be used as the + * size of the global modules array */ + BENCH_MODULE_IDX_COUNT +} BenchModuleIdx; + +/* Ensure we have enough space for all modules in the context */ +WH_UTILS_STATIC_ASSERT(MAX_BENCH_OPS > BENCH_MODULE_IDX_COUNT, + "More modules expected than MAX_BENCH_OPS"); + +/* clang-format off */ +static BenchModule g_benchModules[] = { + [BENCH_MODULE_IDX_ECHO] = {"ECHO", wh_Bench_Mod_Echo, BENCH_THROUGHPUT_XBPS, 0, NULL}, +#if !defined(WOLFHSM_CFG_NO_CRYPTO) + /* RNG */ +#if !defined(WC_NO_RNG) + [BENCH_MODULE_IDX_RNG] = {"RNG", wh_Bench_Mod_Rng, BENCH_THROUGHPUT_XBPS, 0, NULL}, +#endif /* !(WC_NO_RNG) */ + + /* AES */ +#if !defined(NO_AES) +#if defined(WOLFSSL_AES_COUNTER) + [BENCH_MODULE_IDX_AES_128_CTR_ENCRYPT] = {"AES-128-CTR-Encrypt", wh_Bench_Mod_Aes128CTREncrypt, BENCH_THROUGHPUT_XBPS, 0, NULL}, + [BENCH_MODULE_IDX_AES_128_CTR_DECRYPT] = {"AES-128-CTR-Decrypt", wh_Bench_Mod_Aes128CTRDecrypt, BENCH_THROUGHPUT_XBPS, 0, NULL}, + [BENCH_MODULE_IDX_AES_128_CTR_ENCRYPT_DMA] = {"AES-128-CTR-Encrypt-DMA", wh_Bench_Mod_Aes128CTREncryptDma, BENCH_THROUGHPUT_XBPS, 0, NULL}, + [BENCH_MODULE_IDX_AES_128_CTR_DECRYPT_DMA] = {"AES-128-CTR-Decrypt-DMA", wh_Bench_Mod_Aes128CTRDecryptDma, BENCH_THROUGHPUT_XBPS, 0, NULL}, + [BENCH_MODULE_IDX_AES_256_CTR_ENCRYPT] = {"AES-256-CTR-Encrypt", wh_Bench_Mod_Aes256CTREncrypt, BENCH_THROUGHPUT_XBPS, 0, NULL}, + [BENCH_MODULE_IDX_AES_256_CTR_DECRYPT] = {"AES-256-CTR-Decrypt", wh_Bench_Mod_Aes256CTRDecrypt, BENCH_THROUGHPUT_XBPS, 0, NULL}, + [BENCH_MODULE_IDX_AES_256_CTR_ENCRYPT_DMA] = {"AES-256-CTR-Encrypt-DMA", wh_Bench_Mod_Aes256CTREncryptDma, BENCH_THROUGHPUT_XBPS, 0, NULL}, + [BENCH_MODULE_IDX_AES_256_CTR_DECRYPT_DMA] = {"AES-256-CTR-Decrypt-DMA", wh_Bench_Mod_Aes256CTRDecryptDma, BENCH_THROUGHPUT_XBPS, 0, NULL}, +#endif /* WOLFSSL_AES_COUNTER */ +#if defined(HAVE_AES_ECB) + [BENCH_MODULE_IDX_AES_128_ECB_ENCRYPT] = {"AES-128-ECB-Encrypt", wh_Bench_Mod_Aes128ECBEncrypt, BENCH_THROUGHPUT_XBPS, 0, NULL}, + [BENCH_MODULE_IDX_AES_128_ECB_DECRYPT] = {"AES-128-ECB-Decrypt", wh_Bench_Mod_Aes128ECBDecrypt, BENCH_THROUGHPUT_XBPS, 0, NULL}, + [BENCH_MODULE_IDX_AES_128_ECB_ENCRYPT_DMA] = {"AES-128-ECB-Encrypt-DMA", wh_Bench_Mod_Aes128ECBEncryptDma, BENCH_THROUGHPUT_XBPS, 0, NULL}, + [BENCH_MODULE_IDX_AES_128_ECB_DECRYPT_DMA] = {"AES-128-ECB-Decrypt-DMA", wh_Bench_Mod_Aes128ECBDecryptDma, BENCH_THROUGHPUT_XBPS, 0, NULL}, + [BENCH_MODULE_IDX_AES_256_ECB_ENCRYPT] = {"AES-256-ECB-Encrypt", wh_Bench_Mod_Aes256ECBEncrypt, BENCH_THROUGHPUT_XBPS, 0, NULL}, + [BENCH_MODULE_IDX_AES_256_ECB_DECRYPT] = {"AES-256-ECB-Decrypt", wh_Bench_Mod_Aes256ECBDecrypt, BENCH_THROUGHPUT_XBPS, 0, NULL}, + [BENCH_MODULE_IDX_AES_256_ECB_ENCRYPT_DMA] = {"AES-256-ECB-Encrypt-DMA", wh_Bench_Mod_Aes256ECBEncryptDma, BENCH_THROUGHPUT_XBPS, 0, NULL}, + [BENCH_MODULE_IDX_AES_256_ECB_DECRYPT_DMA] = {"AES-256-ECB-Decrypt-DMA", wh_Bench_Mod_Aes256ECBDecryptDma, BENCH_THROUGHPUT_XBPS, 0, NULL}, +#endif /* HAVE_AES_ECB */ +#if defined(HAVE_AES_CBC) + [BENCH_MODULE_IDX_AES_128_CBC_ENCRYPT] = {"AES-128-CBC-Encrypt", wh_Bench_Mod_Aes128CBCEncrypt, BENCH_THROUGHPUT_XBPS, 0, NULL}, + [BENCH_MODULE_IDX_AES_128_CBC_DECRYPT] = {"AES-128-CBC-Decrypt", wh_Bench_Mod_Aes128CBCDecrypt, BENCH_THROUGHPUT_XBPS, 0, NULL}, + [BENCH_MODULE_IDX_AES_128_CBC_ENCRYPT_DMA] = {"AES-128-CBC-Encrypt-DMA", wh_Bench_Mod_Aes128CBCEncryptDma, BENCH_THROUGHPUT_XBPS, 0, NULL}, + [BENCH_MODULE_IDX_AES_128_CBC_DECRYPT_DMA] = {"AES-128-CBC-Decrypt-DMA", wh_Bench_Mod_Aes128CBCDecryptDma, BENCH_THROUGHPUT_XBPS, 0, NULL}, + [BENCH_MODULE_IDX_AES_256_CBC_ENCRYPT] = {"AES-256-CBC-Encrypt", wh_Bench_Mod_Aes256CBCEncrypt, BENCH_THROUGHPUT_XBPS, 0, NULL}, + [BENCH_MODULE_IDX_AES_256_CBC_DECRYPT] = {"AES-256-CBC-Decrypt", wh_Bench_Mod_Aes256CBCDecrypt, BENCH_THROUGHPUT_XBPS, 0, NULL}, + [BENCH_MODULE_IDX_AES_256_CBC_ENCRYPT_DMA] = {"AES-256-CBC-Encrypt-DMA", wh_Bench_Mod_Aes256CBCEncryptDma, BENCH_THROUGHPUT_XBPS, 0, NULL}, + [BENCH_MODULE_IDX_AES_256_CBC_DECRYPT_DMA] = {"AES-256-CBC-Decrypt-DMA", wh_Bench_Mod_Aes256CBCDecryptDma, BENCH_THROUGHPUT_XBPS, 0, NULL}, +#endif /* HAVE_AES_CBC */ +#if defined(HAVE_AESGCM) + [BENCH_MODULE_IDX_AES_128_GCM_ENCRYPT] = {"AES-128-GCM-Encrypt", wh_Bench_Mod_Aes128GCMEncrypt, BENCH_THROUGHPUT_XBPS, 0, NULL}, + [BENCH_MODULE_IDX_AES_128_GCM_DECRYPT] = {"AES-128-GCM-Decrypt", wh_Bench_Mod_Aes128GCMDecrypt, BENCH_THROUGHPUT_XBPS, 0, NULL}, + [BENCH_MODULE_IDX_AES_128_GCM_ENCRYPT_DMA] = {"AES-128-GCM-Encrypt-DMA", wh_Bench_Mod_Aes128GCMEncryptDma, BENCH_THROUGHPUT_XBPS, 0, NULL}, + [BENCH_MODULE_IDX_AES_128_GCM_DECRYPT_DMA] = {"AES-128-GCM-Decrypt-DMA", wh_Bench_Mod_Aes128GCMDecryptDma, BENCH_THROUGHPUT_XBPS, 0, NULL}, + [BENCH_MODULE_IDX_AES_256_GCM_ENCRYPT] = {"AES-256-GCM-Encrypt", wh_Bench_Mod_Aes256GCMEncrypt, BENCH_THROUGHPUT_XBPS, 0, NULL}, + [BENCH_MODULE_IDX_AES_256_GCM_DECRYPT] = {"AES-256-GCM-Decrypt", wh_Bench_Mod_Aes256GCMDecrypt, BENCH_THROUGHPUT_XBPS, 0, NULL}, + [BENCH_MODULE_IDX_AES_256_GCM_ENCRYPT_DMA] = {"AES-256-GCM-Encrypt-DMA", wh_Bench_Mod_Aes256GCMEncryptDma, BENCH_THROUGHPUT_XBPS, 0, NULL}, + [BENCH_MODULE_IDX_AES_256_GCM_DECRYPT_DMA] = {"AES-256-GCM-Decrypt-DMA", wh_Bench_Mod_Aes256GCMDecryptDma, BENCH_THROUGHPUT_XBPS, 0, NULL}, +#endif /* HAVE_AESGCM */ +#endif /* !(NO_AES) */ + + /* CMAC */ +#if defined(WOLFSSL_CMAC) + [BENCH_MODULE_IDX_CMAC_128] = {"AES-CMAC-128", wh_Bench_Mod_CmacAes128, BENCH_THROUGHPUT_XBPS, 0, NULL}, + [BENCH_MODULE_IDX_CMAC_128_DMA] = {"AES-CMAC-128-DMA", wh_Bench_Mod_CmacAes128Dma, BENCH_THROUGHPUT_XBPS, 0, NULL}, + [BENCH_MODULE_IDX_CMAC_256] = {"AES-CMAC-256", wh_Bench_Mod_CmacAes256, BENCH_THROUGHPUT_XBPS, 0, NULL}, + [BENCH_MODULE_IDX_CMAC_256_DMA] = {"AES-CMAC-256-DMA", wh_Bench_Mod_CmacAes256Dma, BENCH_THROUGHPUT_XBPS, 0, NULL}, +#endif /* WOLFSSL_CMAC */ + + /* SHA2 */ +#if !defined(NO_SHA256) + [BENCH_MODULE_IDX_SHA2_256] = {"SHA2-256", wh_Bench_Mod_Sha256, BENCH_THROUGHPUT_XBPS, 0, NULL}, + [BENCH_MODULE_IDX_SHA2_256_DMA] = {"SHA2-256-DMA", wh_Bench_Mod_Sha256Dma, BENCH_THROUGHPUT_XBPS, 0, NULL}, +#endif /* !(NO_SHA256) */ +#if defined(WOLFSSL_SHA224) + [BENCH_MODULE_IDX_SHA2_224] = {"SHA2-224", wh_Bench_Mod_Sha224, BENCH_THROUGHPUT_XBPS, 0, NULL}, + [BENCH_MODULE_IDX_SHA2_224_DMA] = {"SHA2-224-DMA", wh_Bench_Mod_Sha224Dma, BENCH_THROUGHPUT_XBPS, 0, NULL}, +#endif /* WOLFSSL_SHA224 */ +#if defined(WOLFSSL_SHA384) + [BENCH_MODULE_IDX_SHA2_384] = {"SHA2-384", wh_Bench_Mod_Sha384, BENCH_THROUGHPUT_XBPS, 0, NULL}, + [BENCH_MODULE_IDX_SHA2_384_DMA] = {"SHA2-384-DMA", wh_Bench_Mod_Sha384Dma, BENCH_THROUGHPUT_XBPS, 0, NULL}, +#endif /* WOLFSSL_SHA384 */ +#if defined(WOLFSSL_SHA512) + [BENCH_MODULE_IDX_SHA2_512] = {"SHA2-512", wh_Bench_Mod_Sha512, BENCH_THROUGHPUT_XBPS, 0, NULL}, + [BENCH_MODULE_IDX_SHA2_512_DMA] = {"SHA2-512-DMA", wh_Bench_Mod_Sha512Dma, BENCH_THROUGHPUT_XBPS, 0, NULL}, +#endif /* WOLFSSL_SHA512 */ + /* SHA3 */ +#if defined(WOLFSSL_SHA3) + [BENCH_MODULE_IDX_SHA3_256] = {"SHA3-256", wh_Bench_Mod_Sha3256, BENCH_THROUGHPUT_NONE, 0, NULL}, + [BENCH_MODULE_IDX_SHA3_256_DMA] = {"SHA3-256-DMA", wh_Bench_Mod_Sha3256Dma, BENCH_THROUGHPUT_NONE, 0, NULL}, +#endif /* WOLFSSL_SHA3 */ + + /* HMAC */ +#if !defined(NO_HMAC) +#if !defined(NO_SHA256) + [BENCH_MODULE_IDX_HMAC_SHA2_256] = {"HMAC-SHA2-256", wh_Bench_Mod_HmacSha256, BENCH_THROUGHPUT_XBPS, 0, NULL}, + [BENCH_MODULE_IDX_HMAC_SHA2_256_DMA] = {"HMAC-SHA2-256-DMA", wh_Bench_Mod_HmacSha256Dma, BENCH_THROUGHPUT_XBPS, 0, NULL}, +#endif /* !(NO_SHA256) */ +#if defined(WOLFSSL_SHA3) + [BENCH_MODULE_IDX_HMAC_SHA3_256] = {"HMAC-SHA3-256", wh_Bench_Mod_HmacSha3256, BENCH_THROUGHPUT_NONE, 0, NULL}, + [BENCH_MODULE_IDX_HMAC_SHA3_256_DMA] = {"HMAC-SHA3-256-DMA", wh_Bench_Mod_HmacSha3256Dma, BENCH_THROUGHPUT_NONE, 0, NULL}, +#endif /* WOLFSSL_SHA3 */ +#endif /* !(NO_HMAC) */ + + /* HKDF */ +#if defined(HAVE_HKDF) + [BENCH_MODULE_IDX_HKDF_SHA2_256] = {"HKDF-SHA2-256", wh_Bench_Mod_HkdfSha256, BENCH_THROUGHPUT_OPS, 0, NULL}, +#endif /* HAVE_HKDF */ + + /* CMAC KDF */ +#if defined(HAVE_CMAC_KDF) && defined(WOLFSSL_CMAC) + [BENCH_MODULE_IDX_CMAC_KDF] = {"CMAC-KDF-AES", wh_Bench_Mod_CmacKdf, BENCH_THROUGHPUT_OPS, 0, NULL}, +#endif /* HAVE_CMAC_KDF && WOLFSSL_CMAC */ + + /* ECC */ +#if defined(HAVE_ECC) + [BENCH_MODULE_IDX_ECC_P256_SIGN] = {"ECC-P256-SIGN", wh_Bench_Mod_EccP256Sign, BENCH_THROUGHPUT_OPS, 0, NULL}, + [BENCH_MODULE_IDX_ECC_P256_SIGN_DMA] = {"ECC-P256-SIGN-DMA", wh_Bench_Mod_EccP256SignDma, BENCH_THROUGHPUT_OPS, 0, NULL}, + [BENCH_MODULE_IDX_ECC_P256_VERIFY] = {"ECC-P256-VERIFY", wh_Bench_Mod_EccP256Verify, BENCH_THROUGHPUT_OPS, 0, NULL}, + [BENCH_MODULE_IDX_ECC_P256_VERIFY_DMA] = {"ECC-P256-VERIFY-DMA", wh_Bench_Mod_EccP256VerifyDma, BENCH_THROUGHPUT_OPS, 0, NULL}, + [BENCH_MODULE_IDX_ECC_P256_KEY_GEN] = {"ECC-P256-KEY-GEN", wh_Bench_Mod_EccP256KeyGen, BENCH_THROUGHPUT_OPS, 0, NULL}, + [BENCH_MODULE_IDX_ECC_P256_ECDH] = {"ECC-P256-ECDH", wh_Bench_Mod_EccP256Ecdh, BENCH_THROUGHPUT_OPS, 0, NULL}, +#endif /* HAVE_ECC */ + + /* RSA */ +#if !defined(NO_RSA) + /* 2048 */ + [BENCH_MODULE_IDX_RSA_2048_ENCRYPT] = {"RSA-2048-PUBLIC-ENCRYPT", wh_Bench_Mod_Rsa2048PubEncrypt, BENCH_THROUGHPUT_XBPS, 0, NULL}, + [BENCH_MODULE_IDX_RSA_2048_ENCRYPT_DMA] = {"RSA-2048-PUBLIC-ENCRYPT-DMA", wh_Bench_Mod_Rsa2048PubEncryptDma, BENCH_THROUGHPUT_XBPS, 0, NULL}, + [BENCH_MODULE_IDX_RSA_2048_DECRYPT] = {"RSA-2048-PRIVATE-DECRYPT", wh_Bench_Mod_Rsa2048PrvDecrypt, BENCH_THROUGHPUT_XBPS, 0, NULL}, + [BENCH_MODULE_IDX_RSA_2048_DECRYPT_DMA] = {"RSA-2048-PRIVATE-DECRYPT-DMA", wh_Bench_Mod_Rsa2048PrvDecryptDma, BENCH_THROUGHPUT_XBPS, 0, NULL}, + [BENCH_MODULE_IDX_RSA_2048_SIGN] = {"RSA-2048-SIGN", wh_Bench_Mod_Rsa2048Sign, BENCH_THROUGHPUT_OPS, 0, NULL}, + [BENCH_MODULE_IDX_RSA_2048_SIGN_DMA] = {"RSA-2048-SIGN-DMA", wh_Bench_Mod_Rsa2048SignDma, BENCH_THROUGHPUT_OPS, 0, NULL}, + [BENCH_MODULE_IDX_RSA_2048_VERIFY] = {"RSA-2048-VERIFY", wh_Bench_Mod_Rsa2048Verify, BENCH_THROUGHPUT_OPS, 0, NULL}, + [BENCH_MODULE_IDX_RSA_2048_VERIFY_DMA] = {"RSA-2048-VERIFY-DMA", wh_Bench_Mod_Rsa2048VerifyDma, BENCH_THROUGHPUT_OPS, 0, NULL}, + [BENCH_MODULE_IDX_RSA_2048_KEY_GEN] = {"RSA-2048-KEY-GEN", wh_Bench_Mod_Rsa2048KeyGen, BENCH_THROUGHPUT_OPS, 0, NULL}, + [BENCH_MODULE_IDX_RSA_2048_KEY_GEN_DMA] = {"RSA-2048-KEY-GEN-DMA", wh_Bench_Mod_Rsa2048KeyGenDma, BENCH_THROUGHPUT_OPS, 0, NULL}, + /* 4096 */ + [BENCH_MODULE_IDX_RSA_4096_ENCRYPT] = {"RSA-4096-PUBLIC-ENCRYPT", wh_Bench_Mod_Rsa4096PubEncrypt, BENCH_THROUGHPUT_XBPS, 0, NULL}, + [BENCH_MODULE_IDX_RSA_4096_ENCRYPT_DMA] = {"RSA-4096-PUBLIC-ENCRYPT-DMA", wh_Bench_Mod_Rsa4096PubEncryptDma, BENCH_THROUGHPUT_XBPS, 0, NULL}, + [BENCH_MODULE_IDX_RSA_4096_DECRYPT] = {"RSA-4096-PRIVATE-DECRYPT", wh_Bench_Mod_Rsa4096PrvDecrypt, BENCH_THROUGHPUT_XBPS, 0, NULL}, + [BENCH_MODULE_IDX_RSA_4096_DECRYPT_DMA] = {"RSA-4096-PRIVATE-DECRYPT-DMA", wh_Bench_Mod_Rsa4096PrvDecryptDma, BENCH_THROUGHPUT_XBPS, 0, NULL}, + [BENCH_MODULE_IDX_RSA_4096_SIGN] = {"RSA-4096-SIGN", wh_Bench_Mod_Rsa4096Sign, BENCH_THROUGHPUT_OPS, 0, NULL}, + [BENCH_MODULE_IDX_RSA_4096_SIGN_DMA] = {"RSA-4096-SIGN-DMA", wh_Bench_Mod_Rsa4096SignDma, BENCH_THROUGHPUT_OPS, 0, NULL}, + [BENCH_MODULE_IDX_RSA_4096_VERIFY] = {"RSA-4096-VERIFY", wh_Bench_Mod_Rsa4096Verify, BENCH_THROUGHPUT_OPS, 0, NULL}, + [BENCH_MODULE_IDX_RSA_4096_VERIFY_DMA] = {"RSA-4096-VERIFY-DMA", wh_Bench_Mod_Rsa4096VerifyDma, BENCH_THROUGHPUT_OPS, 0, NULL}, + [BENCH_MODULE_IDX_RSA_4096_KEY_GEN] = {"RSA-4096-KEY-GEN", wh_Bench_Mod_Rsa4096KeyGen, BENCH_THROUGHPUT_OPS, 0, NULL}, + [BENCH_MODULE_IDX_RSA_4096_KEY_GEN_DMA] = {"RSA-4096-KEY-GEN-DMA", wh_Bench_Mod_Rsa4096KeyGenDma, BENCH_THROUGHPUT_OPS, 0, NULL}, + +#endif /* !(NO_RSA) */ + + /* Curve25519 */ +#if defined(HAVE_CURVE25519) + [BENCH_MODULE_IDX_CURVE25519_KEY_GEN] = {"CURVE25519-KEY-GEN", wh_Bench_Mod_Curve25519KeyGen, BENCH_THROUGHPUT_OPS, 0, NULL}, + [BENCH_MODULE_IDX_CURVE25519_SHARED_SECRET]= {"CURVE25519-SHARED-SECRET", wh_Bench_Mod_Curve25519SharedSecret, BENCH_THROUGHPUT_OPS, 0, NULL}, +#endif /* HAVE_CURVE25519 */ + + /* ML-DSA */ +#if defined(WOLFSSL_HAVE_MLDSA) +#if !defined(WOLFSSL_NO_ML_DSA_44) + [BENCH_MODULE_IDX_ML_DSA_44_SIGN] = {"ML-DSA-44-SIGN", wh_Bench_Mod_MlDsa44Sign, BENCH_THROUGHPUT_OPS, 0, NULL}, + [BENCH_MODULE_IDX_ML_DSA_44_SIGN_DMA] = {"ML-DSA-44-SIGN-DMA", wh_Bench_Mod_MlDsa44SignDma, BENCH_THROUGHPUT_OPS, 0, NULL}, + [BENCH_MODULE_IDX_ML_DSA_44_VERIFY] = {"ML-DSA-44-VERIFY", wh_Bench_Mod_MlDsa44Verify, BENCH_THROUGHPUT_OPS, 0, NULL}, + [BENCH_MODULE_IDX_ML_DSA_44_VERIFY_DMA] = {"ML-DSA-44-VERIFY-DMA", wh_Bench_Mod_MlDsa44VerifyDma, BENCH_THROUGHPUT_OPS, 0, NULL}, + [BENCH_MODULE_IDX_ML_DSA_44_KEY_GEN] = {"ML-DSA-44-KEY-GEN", wh_Bench_Mod_MlDsa44KeyGen, BENCH_THROUGHPUT_OPS, 0, NULL}, + [BENCH_MODULE_IDX_ML_DSA_44_KEY_GEN_DMA] = {"ML-DSA-44-KEY-GEN-DMA", wh_Bench_Mod_MlDsa44KeyGenDma, BENCH_THROUGHPUT_OPS, 0, NULL}, +#endif /* !(WOLFSSL_NO_ML_DSA_44) */ +#if !defined(WOLFSSL_NO_ML_DSA_65) + [BENCH_MODULE_IDX_ML_DSA_65_SIGN] = {"ML-DSA-65-SIGN", wh_Bench_Mod_MlDsa65Sign, BENCH_THROUGHPUT_OPS, 0, NULL}, + [BENCH_MODULE_IDX_ML_DSA_65_SIGN_DMA] = {"ML-DSA-65-SIGN-DMA", wh_Bench_Mod_MlDsa65SignDma, BENCH_THROUGHPUT_OPS, 0, NULL}, + [BENCH_MODULE_IDX_ML_DSA_65_VERIFY] = {"ML-DSA-65-VERIFY", wh_Bench_Mod_MlDsa65Verify, BENCH_THROUGHPUT_OPS, 0, NULL}, + [BENCH_MODULE_IDX_ML_DSA_65_VERIFY_DMA] = {"ML-DSA-65-VERIFY-DMA", wh_Bench_Mod_MlDsa65VerifyDma, BENCH_THROUGHPUT_OPS, 0, NULL}, + [BENCH_MODULE_IDX_ML_DSA_65_KEY_GEN] = {"ML-DSA-65-KEY-GEN", wh_Bench_Mod_MlDsa65KeyGen, BENCH_THROUGHPUT_OPS, 0, NULL}, + [BENCH_MODULE_IDX_ML_DSA_65_KEY_GEN_DMA] = {"ML-DSA-65-KEY-GEN-DMA", wh_Bench_Mod_MlDsa65KeyGenDma, BENCH_THROUGHPUT_OPS, 0, NULL}, +#endif /* !(WOLFSSL_NO_ML_DSA_65) */ +#if !defined(WOLFSSL_NO_ML_DSA_87) + [BENCH_MODULE_IDX_ML_DSA_87_SIGN] = {"ML-DSA-87-SIGN", wh_Bench_Mod_MlDsa87Sign, BENCH_THROUGHPUT_OPS, 0, NULL}, + [BENCH_MODULE_IDX_ML_DSA_87_SIGN_DMA] = {"ML-DSA-87-SIGN-DMA", wh_Bench_Mod_MlDsa87SignDma, BENCH_THROUGHPUT_OPS, 0, NULL}, + [BENCH_MODULE_IDX_ML_DSA_87_VERIFY] = {"ML-DSA-87-VERIFY", wh_Bench_Mod_MlDsa87Verify, BENCH_THROUGHPUT_OPS, 0, NULL}, + [BENCH_MODULE_IDX_ML_DSA_87_VERIFY_DMA] = {"ML-DSA-87-VERIFY-DMA", wh_Bench_Mod_MlDsa87VerifyDma, BENCH_THROUGHPUT_OPS, 0, NULL}, + [BENCH_MODULE_IDX_ML_DSA_87_KEY_GEN] = {"ML-DSA-87-KEY-GEN", wh_Bench_Mod_MlDsa87KeyGen, BENCH_THROUGHPUT_OPS, 0, NULL}, + [BENCH_MODULE_IDX_ML_DSA_87_KEY_GEN_DMA] = {"ML-DSA-87-KEY-GEN-DMA", wh_Bench_Mod_MlDsa87KeyGenDma, BENCH_THROUGHPUT_OPS, 0, NULL}, +#endif /* !(WOLFSSL_NO_ML_DSA_87) */ +#endif /* WOLFSSL_HAVE_MLDSA */ + + /* ML-KEM */ +#if defined(WOLFSSL_HAVE_MLKEM) +#ifndef WOLFSSL_NO_ML_KEM_512 + [BENCH_MODULE_IDX_ML_KEM_512_KEY_GEN] = {"ML-KEM-512-KEY-GEN", wh_Bench_Mod_MlKem512KeyGen, BENCH_THROUGHPUT_OPS, 0, NULL}, + [BENCH_MODULE_IDX_ML_KEM_512_KEY_GEN_DMA] = {"ML-KEM-512-KEY-GEN-DMA", wh_Bench_Mod_MlKem512KeyGenDma, BENCH_THROUGHPUT_OPS, 0, NULL}, + [BENCH_MODULE_IDX_ML_KEM_512_ENCAPS] = {"ML-KEM-512-ENCAPS", wh_Bench_Mod_MlKem512Encaps, BENCH_THROUGHPUT_OPS, 0, NULL}, + [BENCH_MODULE_IDX_ML_KEM_512_ENCAPS_DMA] = {"ML-KEM-512-ENCAPS-DMA", wh_Bench_Mod_MlKem512EncapsDma, BENCH_THROUGHPUT_OPS, 0, NULL}, + [BENCH_MODULE_IDX_ML_KEM_512_DECAPS] = {"ML-KEM-512-DECAPS", wh_Bench_Mod_MlKem512Decaps, BENCH_THROUGHPUT_OPS, 0, NULL}, + [BENCH_MODULE_IDX_ML_KEM_512_DECAPS_DMA] = {"ML-KEM-512-DECAPS-DMA", wh_Bench_Mod_MlKem512DecapsDma, BENCH_THROUGHPUT_OPS, 0, NULL}, +#endif /* !WOLFSSL_NO_ML_KEM_512 */ +#ifndef WOLFSSL_NO_ML_KEM_768 + [BENCH_MODULE_IDX_ML_KEM_768_KEY_GEN] = {"ML-KEM-768-KEY-GEN", wh_Bench_Mod_MlKem768KeyGen, BENCH_THROUGHPUT_OPS, 0, NULL}, + [BENCH_MODULE_IDX_ML_KEM_768_KEY_GEN_DMA] = {"ML-KEM-768-KEY-GEN-DMA", wh_Bench_Mod_MlKem768KeyGenDma, BENCH_THROUGHPUT_OPS, 0, NULL}, + [BENCH_MODULE_IDX_ML_KEM_768_ENCAPS] = {"ML-KEM-768-ENCAPS", wh_Bench_Mod_MlKem768Encaps, BENCH_THROUGHPUT_OPS, 0, NULL}, + [BENCH_MODULE_IDX_ML_KEM_768_ENCAPS_DMA] = {"ML-KEM-768-ENCAPS-DMA", wh_Bench_Mod_MlKem768EncapsDma, BENCH_THROUGHPUT_OPS, 0, NULL}, + [BENCH_MODULE_IDX_ML_KEM_768_DECAPS] = {"ML-KEM-768-DECAPS", wh_Bench_Mod_MlKem768Decaps, BENCH_THROUGHPUT_OPS, 0, NULL}, + [BENCH_MODULE_IDX_ML_KEM_768_DECAPS_DMA] = {"ML-KEM-768-DECAPS-DMA", wh_Bench_Mod_MlKem768DecapsDma, BENCH_THROUGHPUT_OPS, 0, NULL}, +#endif /* !WOLFSSL_NO_ML_KEM_768 */ +#ifndef WOLFSSL_NO_ML_KEM_1024 + [BENCH_MODULE_IDX_ML_KEM_1024_KEY_GEN] = {"ML-KEM-1024-KEY-GEN", wh_Bench_Mod_MlKem1024KeyGen, BENCH_THROUGHPUT_OPS, 0, NULL}, + [BENCH_MODULE_IDX_ML_KEM_1024_KEY_GEN_DMA] = {"ML-KEM-1024-KEY-GEN-DMA", wh_Bench_Mod_MlKem1024KeyGenDma, BENCH_THROUGHPUT_OPS, 0, NULL}, + [BENCH_MODULE_IDX_ML_KEM_1024_ENCAPS] = {"ML-KEM-1024-ENCAPS", wh_Bench_Mod_MlKem1024Encaps, BENCH_THROUGHPUT_OPS, 0, NULL}, + [BENCH_MODULE_IDX_ML_KEM_1024_ENCAPS_DMA] = {"ML-KEM-1024-ENCAPS-DMA", wh_Bench_Mod_MlKem1024EncapsDma, BENCH_THROUGHPUT_OPS, 0, NULL}, + [BENCH_MODULE_IDX_ML_KEM_1024_DECAPS] = {"ML-KEM-1024-DECAPS", wh_Bench_Mod_MlKem1024Decaps, BENCH_THROUGHPUT_OPS, 0, NULL}, + [BENCH_MODULE_IDX_ML_KEM_1024_DECAPS_DMA] = {"ML-KEM-1024-DECAPS-DMA", wh_Bench_Mod_MlKem1024DecapsDma, BENCH_THROUGHPUT_OPS, 0, NULL}, +#endif /* !WOLFSSL_NO_ML_KEM_1024 */ +#endif /* WOLFSSL_HAVE_MLKEM */ +#endif /* !(WOLFHSM_CFG_NO_CRYPTO) */ +}; +/* clang-format on */ + +static int _registerBenchModules(whBenchOpContext* benchCtx) +{ + int ret = 0; + int i; + for (i = 0; i < BENCH_MODULE_IDX_COUNT; i++) { + ret = wh_Bench_RegisterOp(benchCtx, g_benchModules[i].name, + g_benchModules[i].tpType, + &g_benchModules[i].id); + if (ret != WH_ERROR_OK) { + WH_BENCH_PRINTF("Failed to register benchmark module \"%s\": %d\n", + g_benchModules[i].name, ret); + return ret; + } + } + return ret; +} + +void wh_Bench_ListModules(void) +{ + int i; + WH_BENCH_PRINTF("Modules:\n"); + WH_BENCH_PRINTF("Index: Name\n"); + for (i = 0; i < BENCH_MODULE_IDX_COUNT; i++) { + WH_BENCH_PRINTF("%d: %s\n", i, g_benchModules[i].name); + } +} + +/* Placeholder for the benchmarking function */ +static int _runClientBenchmarks(whClientContext* client, int transport, + int moduleIndex) +{ + int ret = 0; + whBenchOpContext benchCtx; + int i; + + WH_BENCH_PRINTF("Running benchmarks...\n"); + + /* Initialize benchmark context */ + ret = wh_Bench_Init(&benchCtx); + if (ret != 0) { + WH_BENCH_PRINTF("Failed to initialize benchmark context: %d\n", ret); + return ret; + } + benchCtx.transportType = transport; + + /* Register operations to benchmark */ + ret = _registerBenchModules(&benchCtx); + if (ret != 0) { + WH_BENCH_PRINTF("Failed to register benchmark modules: %d\n", ret); + return ret; + } + + /* Run specific module or all modules */ + if (moduleIndex >= 0 && moduleIndex < BENCH_MODULE_IDX_COUNT) { + /* Run specific module */ + i = moduleIndex; + WH_BENCH_PRINTF("Benchmarking \"%s\"...\n", g_benchModules[i].name); + ret = g_benchModules[i].func(client, &benchCtx, g_benchModules[i].id, + g_benchModules[i].params); + /* Allow skipping not implemented modules. Return code could be + * wolfCrypt or wolfSSL error */ + if (ret != 0) { + if (ret == WH_ERROR_NOTIMPL) { + WH_BENCH_PRINTF(" -> SKIPPED \"%s\"\n", g_benchModules[i].name); + ret = 0; + } + else { + WH_BENCH_PRINTF( + "Benchmark module \"%s\" failed with error: %d\n", + g_benchModules[i].name, ret); + return ret; + } + } + else { + /* Print results for this module */ + wh_Bench_PrintIntermediateResult(&benchCtx, g_benchModules[i].id); + } + } + else { + /* Run all modules */ + for (i = 0; i < BENCH_MODULE_IDX_COUNT; i++) { + WH_BENCH_PRINTF("Benchmarking \"%s\"...\n", g_benchModules[i].name); + ret = + g_benchModules[i].func(client, &benchCtx, g_benchModules[i].id, + g_benchModules[i].params); + /* Allow skipping not implemented modules. Return code could be + * wolfCrypt or wolfSSL error */ + if (ret != 0) { + if (ret == WH_ERROR_NOTIMPL) { + WH_BENCH_PRINTF(" -> SKIPPED \"%s\"\n", + g_benchModules[i].name); + ret = 0; + } + else { + WH_BENCH_PRINTF( + "Benchmark module \"%s\" failed with error: %d\n", + g_benchModules[i].name, ret); + return ret; + } + } + else { + /* Print results for this module */ + wh_Bench_PrintIntermediateResult(&benchCtx, + g_benchModules[i].id); + } + } + } + + /* Print benchmark results */ + wh_Bench_PrintResults(&benchCtx); + + /* Clean up benchmark context */ + wh_Bench_Cleanup(&benchCtx); + + if (ret == 0) { + WH_BENCH_PRINTF("Benchmarks completed.\n"); + } + + return ret; +} + + +/* additional sanity check in case main() is not used for if the transport + * requested has been enabled */ +static int wh_Bench_CheckTransport(int transport) +{ + switch (transport) { + case WH_BENCH_TRANSPORT_MEM: + break; + case WH_BENCH_TRANSPORT_POSIX_DMA: +#if !defined(WOLFSSL_STATIC_MEMORY) || !defined(WOLFHSM_CFG_TEST_POSIX) + return WH_ERROR_BADARGS; +#else + break; +#endif + case WH_BENCH_TRANSPORT_POSIX_TCP: +#if !defined(WOLFHSM_CFG_TEST_POSIX) + return WH_ERROR_BADARGS; +#else + break; +#endif + case WH_BENCH_TRANSPORT_POSIX_SHM: +#if !defined(WOLFHSM_CFG_TEST_POSIX) + return WH_ERROR_BADARGS; +#else + break; +#endif + default: + return WH_ERROR_BADARGS; + } + return WH_ERROR_OK; +} + +#if defined(WOLFSSL_STATIC_MEMORY) && defined(WOLFHSM_CFG_TEST_POSIX) +static int _whBench_ClientCfg_PosixDmaHeap(posixTransportShmContext* shmCtx) +{ + static const unsigned int listSz = 9; + static const uint32_t sizeList[] = {176, 256, 288, 704, 1056, + 1712, 2112, 2368, 33800}; + static const uint32_t distList[] = {3, 1, 1, 1, 1, 1, 1, 3, 2}; + WOLFSSL_HEAP_HINT* heap = NULL; + void* dma; + size_t dmaSz; + int ret = 0; + + ret = posixTransportShm_GetDma(shmCtx, &dma, &dmaSz); + if (ret != 0) { + WOLFHSM_CFG_PRINTF("Failed to get DMA\n"); + return ret; + } + + ret = wc_LoadStaticMemory_ex(&heap, listSz, sizeList, distList, dma, dmaSz, + 0, 0); + if (ret != 0) { + WH_BENCH_PRINTF("Failed to load static memory: %d\n", ret); + return ret; + } + ret = posixTransportShm_SetDmaHeap(shmCtx, (void*)heap); + if (ret != 0) { + WH_BENCH_PRINTF("Failed to set heap: %d\n", ret); + return ret; + } + + return ret; +} +#endif + +/* Initializes a client context based on the provided config, runs the + * benchmarks, then cleans up the context */ +int wh_Bench_ClientCfg(whClientConfig* clientCfg, int transport) +{ + int ret = 0; + whClientContext client[1] = {0}; + uint32_t client_id = 0; + uint32_t server_id = 0; + + if (clientCfg == NULL) { + return WH_ERROR_BADARGS; + } + + ret = wh_Bench_CheckTransport(transport); + if (ret != WH_ERROR_OK) { + WH_BENCH_PRINTF("Transport not supported: %d\n", ret); + return ret; + } + + /* Initialize the client */ + ret = wh_Client_Init(client, clientCfg); + if (ret != 0) { + WH_BENCH_PRINTF("Failed to initialize client: %d\n", ret); + return ret; + } + +#if defined(WOLFSSL_STATIC_MEMORY) && defined(WOLFHSM_CFG_TEST_POSIX) + if (transport == WH_BENCH_TRANSPORT_POSIX_DMA) { + ret = _whBench_ClientCfg_PosixDmaHeap( + (posixTransportShmContext*)clientCfg->comm->transport_context); + if (ret != 0) { + WH_BENCH_PRINTF("Failed to load static memory: %d\n", ret); + return ret; + } + } +#endif + + /* Establish communication with the server */ + ret = wh_Client_CommInit(client, &client_id, &server_id); + if (ret != 0) { + WH_BENCH_PRINTF("Failed to establish communication with server: %d\n", + ret); + wh_Client_Cleanup(client); + return ret; + } + + /* Run the benchmarks */ + ret = _runClientBenchmarks(client, transport, + -1); /* -1 means run all modules */ + + /* Clean up */ + (void)wh_Client_CommClose(client); + (void)wh_Client_Cleanup(client); + + return ret; +} + +/* Runs the benchmarks on an already initialized client context */ +int wh_Bench_ClientCtx(whClientContext* client, int transport) +{ + if (client == NULL) { + return WH_ERROR_BADARGS; + } + + return _runClientBenchmarks(client, transport, + -1); /* -1 means run all modules */ +} + +#if defined(WOLFHSM_CFG_ENABLE_SERVER) +int wh_Bench_ServerCfgLoop(whServerConfig* serverCfg) +{ + whServerContext server[1] = {0}; + whCommConnected am_connected = WH_COMM_CONNECTED; + int ret = 0; + + if (serverCfg == NULL) { + return WH_ERROR_BADARGS; + } + + /* Initialize the server */ + ret = wh_Server_Init(server, serverCfg); + if (ret != 0) { + WH_BENCH_PRINTF("Failed to initialize server: %d\n", ret); + return ret; + } + + /* Set the server as connected */ + ret = wh_Server_SetConnected(server, am_connected); + if (ret != 0) { + WH_BENCH_PRINTF("Failed to set server connected: %d\n", ret); + wh_Server_Cleanup(server); + return ret; + } + + /* Process requests until disconnected */ + while (am_connected == WH_COMM_CONNECTED) { + ret = wh_Server_HandleRequestMessage(server); + if ((ret != WH_ERROR_NOTREADY) && (ret != WH_ERROR_OK)) { + WH_BENCH_PRINTF("Failed to handle request message: %d\n", ret); + break; + } + wh_Server_GetConnected(server, &am_connected); + } + + /* Clean up */ + if (ret == WH_ERROR_NOTREADY) { + /* Ignore not ready status */ + ret = WH_ERROR_OK; + } + (void)wh_Server_Cleanup(server); + + return ret; +} +#endif /* WOLFHSM_CFG_ENABLE_SERVER */ + +#if defined(WOLFHSM_CFG_TEST_POSIX) +typedef struct { + whClientConfig* config; + int moduleIndex; + int transport; +} whBenchClientTaskData; + +static void* _whBenchClientTask(void* data) +{ + whBenchClientTaskData* taskData = (whBenchClientTaskData*)data; + whClientContext client[1] = {0}; + uint32_t client_id = 0; + uint32_t server_id = 0; + int ret = 0; + + /* Initialize the client */ + sleep(1); /* Give the server a chance to setup DMA */ + ret = wh_Client_Init(client, taskData->config); + if (ret != WH_ERROR_OK) { + WH_BENCH_PRINTF("Failed to initialize client: %d\n", ret); + return NULL; + } + +#if defined(WOLFSSL_STATIC_MEMORY) && defined(WOLFHSM_CFG_TEST_POSIX) + if (taskData->transport == WH_BENCH_TRANSPORT_POSIX_DMA) { + ret = _whBench_ClientCfg_PosixDmaHeap( + (posixTransportShmContext*) + taskData->config->comm->transport_context); + if (ret != 0) { + WH_BENCH_PRINTF("Failed to load static memory: %d\n", ret); + return NULL; + } + } +#endif + + /* Establish communication with the server */ + ret = wh_Client_CommInit(client, &client_id, &server_id); + if (ret != 0) { + WH_BENCH_PRINTF("Failed to establish communication with server: %d\n", + ret); + wh_Client_Cleanup(client); + return NULL; + } + + /* Run the benchmarks */ + ret = _runClientBenchmarks(client, taskData->transport, + taskData->moduleIndex); + if (ret != 0) { + WH_BENCH_PRINTF("Client benchmark failed: %d\n", ret); + } + + /* Clean up */ + (void)wh_Client_CommClose(client); + (void)wh_Client_Cleanup(client); + return NULL; +} + +static void* _whBenchServerTask(void* cf) +{ + if (wh_Bench_ServerCfgLoop(cf) != 0) { + WH_BENCH_PRINTF("Server benchmark failed\n"); + } + return NULL; +} + +static void _whBenchClientServerThreadTest(whClientConfig* c_conf, + whServerConfig* s_conf, + int moduleIndex, int transport) +{ + pthread_t cthread = {0}; + pthread_t sthread = {0}; + void* retval; + int rc = 0; + whBenchClientTaskData clientData = {c_conf, moduleIndex, transport}; + + /* Create server thread first */ + rc = pthread_create(&sthread, NULL, _whBenchServerTask, s_conf); + if (rc == 0) { + /* Create client thread */ + rc = pthread_create(&cthread, NULL, _whBenchClientTask, &clientData); + if (rc == 0) { + /* Wait for client to finish, then cancel server */ + (void)pthread_join(cthread, &retval); + (void)pthread_cancel(sthread); + (void)pthread_join(sthread, &retval); + } + else { + /* If client thread creation failed, cancel server */ + (void)pthread_cancel(sthread); + (void)pthread_join(sthread, &retval); + } + } +} + +/* Global static variables for transport configurations */ +static uint8_t g_mem_req[BUFFER_SIZE] = {0}; +static uint8_t g_mem_resp[BUFFER_SIZE] = {0}; +static whTransportMemConfig g_mem_tmcf = { + .req = (whTransportMemCsr*)g_mem_req, + .req_size = sizeof(g_mem_req), + .resp = (whTransportMemCsr*)g_mem_resp, + .resp_size = sizeof(g_mem_resp), +}; +static whTransportClientCb g_mem_tccb = WH_TRANSPORT_MEM_CLIENT_CB; +static whTransportMemClientContext g_mem_tmcc = {0}; +static whCommClientConfig g_mem_cc_conf = { + .transport_cb = &g_mem_tccb, + .transport_context = (void*)&g_mem_tmcc, + .transport_config = (void*)&g_mem_tmcf, + .client_id = WH_BENCH_CLIENT_ID, +}; + +static whTransportServerCb g_mem_tscb = WH_TRANSPORT_MEM_SERVER_CB; +static whTransportMemServerContext g_mem_tmsc = {0}; +static whCommServerConfig g_mem_cs_conf = { + .transport_cb = &g_mem_tscb, + .transport_context = (void*)&g_mem_tmsc, + .transport_config = (void*)&g_mem_tmcf, + .server_id = 124, +}; + +/* Helper function to configure client transport based on type */ +static int _configureClientTransport(whBenchTransportType transport, + whClientConfig* c_conf) +{ + int ret = WH_ERROR_OK; + + switch (transport) { + case WH_BENCH_TRANSPORT_MEM: { + /* Memory transport configuration */ + c_conf->comm = &g_mem_cc_conf; + break; + } + +#if defined(WOLFSSL_STATIC_MEMORY) && defined(WOLFHSM_CFG_TEST_POSIX) + case WH_BENCH_TRANSPORT_POSIX_DMA: { + static whClientDmaConfig dmaConfig; + + dmaConfig.cb = posixTransportShm_ClientStaticMemDmaCallback; + dmaConfig.dmaAddrAllowList = NULL; + c_conf->dmaConfig = &dmaConfig; + }; + __attribute__((fallthrough)); + /* Fall through */ +#endif + + case WH_BENCH_TRANSPORT_POSIX_SHM: { + /* Shared memory transport configuration */ + static whTransportClientCb pttcClientShmCb[1] = { + POSIX_TRANSPORT_SHM_CLIENT_CB}; + static posixTransportShmClientContext tccShm; + static posixTransportShmConfig myshmconfig = { + .name = "wh_bench_shm", + .req_size = 7000, + .resp_size = 7000, + .dma_size = 80000, + }; + static whCommClientConfig ccShmConf = { + .transport_cb = pttcClientShmCb, + .transport_context = (void*)&tccShm, + .transport_config = (void*)&myshmconfig, + .client_id = WH_BENCH_CLIENT_ID, + }; + + memset(&tccShm, 0, sizeof(posixTransportShmClientContext)); + c_conf->comm = &ccShmConf; + break; + } + + case WH_BENCH_TRANSPORT_POSIX_TCP: { + /* TCP transport configuration */ + static whTransportClientCb pttcClientTcpCb = PTT_CLIENT_CB; + static posixTransportTcpClientContext tccTcp; + static posixTransportTcpConfig mytcpconfig = { + .server_ip_string = "127.0.0.1", + .server_port = 23456, + }; + static whCommClientConfig ccTcpConf = { + .transport_cb = &pttcClientTcpCb, + .transport_context = (void*)&tccTcp, + .transport_config = (void*)&mytcpconfig, + .client_id = WH_BENCH_CLIENT_ID, + }; + + memset(&tccTcp, 0, sizeof(posixTransportTcpClientContext)); + c_conf->comm = &ccTcpConf; + break; + } + default: + ret = WH_ERROR_BADARGS; + break; + } + + return ret; +} + +/* Helper function to configure server transport based on type */ +static int _configureServerTransport(whBenchTransportType transport, + whServerConfig* s_conf) +{ + int ret = WH_ERROR_OK; + + switch (transport) { + case WH_BENCH_TRANSPORT_MEM: { + /* Memory transport configuration */ + s_conf->comm_config = &g_mem_cs_conf; + break; + } + +#if defined(WOLFSSL_STATIC_MEMORY) && defined(WOLFHSM_CFG_TEST_POSIX) + case WH_BENCH_TRANSPORT_POSIX_DMA: { + static whServerDmaConfig dmaConfig; + + dmaConfig.cb = posixTransportShm_ServerStaticMemDmaCallback; + dmaConfig.dmaAddrAllowList = NULL; + s_conf->dmaConfig = &dmaConfig; + }; + __attribute__((fallthrough)); + /* Fall through */ +#endif + + case WH_BENCH_TRANSPORT_POSIX_SHM: { + /* Shared memory transport configuration */ + static whTransportServerCb pttServerShmCb[1] = { + POSIX_TRANSPORT_SHM_SERVER_CB}; + static posixTransportShmServerContext tscShm; + static posixTransportShmConfig myshmconfig = { + .name = "wh_bench_shm", + .req_size = 7000, + .resp_size = 7000, + .dma_size = 80000, + }; + static whCommServerConfig csShmConf = { + .transport_cb = pttServerShmCb, + .transport_context = (void*)&tscShm, + .transport_config = (void*)&myshmconfig, + .server_id = 57, + }; + + memset(&tscShm, 0, sizeof(posixTransportShmServerContext)); + s_conf->comm_config = &csShmConf; + break; + } + + case WH_BENCH_TRANSPORT_POSIX_TCP: { + /* TCP transport configuration */ + static whTransportServerCb pttServerTcpCb = PTT_SERVER_CB; + static posixTransportTcpServerContext tscTcp; + static posixTransportTcpConfig mytcpconfig = { + .server_ip_string = "127.0.0.1", + .server_port = 23456, + }; + static whCommServerConfig csTcpConf = { + .transport_cb = &pttServerTcpCb, + .transport_context = (void*)&tscTcp, + .transport_config = (void*)&mytcpconfig, + .server_id = 57, + }; + + memset(&tscTcp, 0, sizeof(posixTransportTcpServerContext)); + s_conf->comm_config = &csTcpConf; + break; + } + + default: + ret = WH_ERROR_BADARGS; + break; + } + + return ret; +} + + +/* transport is the type of transport to use */ +int wh_Bench_ClientServer_Posix(int transport, int moduleIndex) +{ + static uint8_t memory[FLASH_RAM_SIZE] = {0}; + int ret = WH_ERROR_OK; + + /* Client configuration/contexts */ + whClientConfig c_conf[1] = {{0}}; + + /* Server configuration/contexts */ + whServerConfig s_conf[1] = {{0}}; + + /* Configure transport based on type */ + ret = _configureClientTransport(transport, c_conf); + if (ret != WH_ERROR_OK) { + WH_BENCH_PRINTF("Failed to configure client transport: %d\n", ret); + return ret; + } + + ret = _configureServerTransport(transport, s_conf); + if (ret != WH_ERROR_OK) { + WH_BENCH_PRINTF("Failed to configure server transport: %d\n", ret); + return ret; + } + + /* RamSim Flash state and configuration */ + whFlashRamsimCtx fc[1] = {0}; + whFlashRamsimCfg fc_conf[1] = {{ + .size = FLASH_RAM_SIZE, + .sectorSize = FLASH_RAM_SIZE / 2, + .pageSize = 8, + .erasedByte = (uint8_t)0, + .memory = memory, + }}; + const whFlashCb fcb[1] = {WH_FLASH_RAMSIM_CB}; + + /* NVM Flash Configuration using RamSim HAL Flash */ + whNvmFlashConfig nf_conf[1] = {{ + .cb = fcb, + .context = fc, + .config = fc_conf, + }}; + whNvmFlashContext nfc[1] = {0}; + whNvmCb nfcb[1] = {WH_NVM_FLASH_CB}; + + whNvmConfig n_conf[1] = {{ + .cb = nfcb, + .context = nfc, + .config = nf_conf, + }}; + whNvmContext nvm[1] = {{0}}; + +#ifndef WOLFHSM_CFG_NO_CRYPTO + /* Crypto context */ + whServerCryptoContext crypto[1] = {0}; +#endif + + /* Set up server configuration with NVM and crypto */ + s_conf[0].nvm = nvm; +#ifndef WOLFHSM_CFG_NO_CRYPTO + s_conf[0].crypto = crypto; + s_conf[0].devId = INVALID_DEVID; +#endif + + /* Initialize Flash first */ + ret = whFlashRamsim_Init(fc, fc_conf); + if (ret != 0) { + WH_BENCH_PRINTF("Failed to initialize Flash: %d\n", ret); + return ret; + } + + /* Initialize NVM */ + ret = wh_Nvm_Init(nvm, n_conf); + if (ret != 0) { + WH_BENCH_PRINTF("Failed to initialize NVM: %d\n", ret); + whFlashRamsim_Cleanup(fc); + return ret; + } + +#ifndef WOLFHSM_CFG_NO_CRYPTO + /* Initialize wolfCrypt */ + ret = wolfCrypt_Init(); + if (ret != 0) { + WH_BENCH_PRINTF("Failed to initialize wolfCrypt: %d\n", ret); + wh_Nvm_Cleanup(nvm); + whFlashRamsim_Cleanup(fc); + return ret; + } + + /* Initialize RNG */ + ret = wc_InitRng_ex(crypto->rng, NULL, INVALID_DEVID); + if (ret != 0) { + WH_BENCH_PRINTF("Failed to initialize RNG: %d\n", ret); + wolfCrypt_Cleanup(); + wh_Nvm_Cleanup(nvm); + whFlashRamsim_Cleanup(fc); + return ret; + } +#endif + + /* Run client and server in separate threads */ + _whBenchClientServerThreadTest(c_conf, s_conf, moduleIndex, transport); + + /* Clean up */ + wh_Nvm_Cleanup(nvm); + whFlashRamsim_Cleanup(fc); + +#ifndef WOLFHSM_CFG_NO_CRYPTO + wc_FreeRng(crypto->rng); + wolfCrypt_Cleanup(); +#endif + + return WH_ERROR_OK; +} + + +#endif /* WOLFHSM_CFG_TEST_POSIX */ + +#endif /* WOLFHSM_CFG_BENCH_ENABLE */ From c42487fee3ea3f29521f26d361cc1bb32b729c90 Mon Sep 17 00:00:00 2001 From: Hideki Miyazaki Date: Wed, 24 Jun 2026 15:04:48 +0900 Subject: [PATCH 3/5] Add wh_Bench_ServerCfgLoop() stub --- benchmark/wh_bench.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/benchmark/wh_bench.c b/benchmark/wh_bench.c index ed61ce129..db0410f10 100644 --- a/benchmark/wh_bench.c +++ b/benchmark/wh_bench.c @@ -800,6 +800,12 @@ int wh_Bench_ServerCfgLoop(whServerConfig* serverCfg) return ret; } +#else +int wh_Bench_ServerCfgLoop(whServerConfig* serverCfg) +{ + (void)serverCfg; + return WH_ERROR_OK; +} #endif /* WOLFHSM_CFG_ENABLE_SERVER */ #if defined(WOLFHSM_CFG_TEST_POSIX) From 2eeeedb48535bd98def54ad52d47dde418089477 Mon Sep 17 00:00:00 2001 From: Hideki Miyazaki Date: Thu, 25 Jun 2026 07:25:40 +0900 Subject: [PATCH 4/5] Addressed comments --- benchmark/wh_bench.c | 9 ++------- benchmark/wh_bench.h | 18 ++++++++++-------- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/benchmark/wh_bench.c b/benchmark/wh_bench.c index db0410f10..fa595e847 100644 --- a/benchmark/wh_bench.c +++ b/benchmark/wh_bench.c @@ -800,15 +800,10 @@ int wh_Bench_ServerCfgLoop(whServerConfig* serverCfg) return ret; } -#else -int wh_Bench_ServerCfgLoop(whServerConfig* serverCfg) -{ - (void)serverCfg; - return WH_ERROR_OK; -} #endif /* WOLFHSM_CFG_ENABLE_SERVER */ #if defined(WOLFHSM_CFG_TEST_POSIX) +#if defined(WOLFHSM_CFG_ENABLE_SERVER) typedef struct { whClientConfig* config; int moduleIndex; @@ -1196,7 +1191,7 @@ int wh_Bench_ClientServer_Posix(int transport, int moduleIndex) return WH_ERROR_OK; } - +#endif /* WOLFHSM_CFG_ENABLE_SERVER */ #endif /* WOLFHSM_CFG_TEST_POSIX */ #endif /* WOLFHSM_CFG_BENCH_ENABLE */ diff --git a/benchmark/wh_bench.h b/benchmark/wh_bench.h index d3db47d8b..486e18000 100644 --- a/benchmark/wh_bench.h +++ b/benchmark/wh_bench.h @@ -26,14 +26,6 @@ #include "wolfhsm/wh_server.h" #include "wolfhsm/wh_client.h" -/* - * Runs the client benchmarks against a server using POSIX threads - * transport: The type of transport to use for communication - * moduleIndex: The specific benchmark module to run (optional, -1 for all) - * Returns 0 on success and a non-zero error code on failure - */ -int wh_Bench_ClientServer_Posix(int transport, int moduleIndex); - /* * Client-side benchmarking function. Takes in a client configuration, * initializes the client, runs benchmarks against the server, then cleans up @@ -47,8 +39,18 @@ int wh_Bench_ClientCfg(whClientConfig* clientCfg, int transport); */ int wh_Bench_ClientCtx(whClientContext* client, int transport); +#if defined(WOLFHSM_CFG_ENABLE_SERVER) +/* + * Runs the client benchmarks against a server using POSIX threads + * transport: The type of transport to use for communication + * moduleIndex: The specific benchmark module to run (optional, -1 for all) + * Returns 0 on success and a non-zero error code on failure + */ +int wh_Bench_ClientServer_Posix(int transport, int moduleIndex); + /* Server-side processing loop for benchmarking */ int wh_Bench_ServerCfgLoop(whServerConfig* serverCfg); +#endif /* WOLFHSM_CFG_ENABLE_SERVER */ /* List all modules */ From bda63e9facf8018b96772e03e815fb9b24b56944 Mon Sep 17 00:00:00 2001 From: Hideki Miyazaki Date: Thu, 25 Jun 2026 09:56:51 +0900 Subject: [PATCH 5/5] Addressed comments --- benchmark/wh_bench_main.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/benchmark/wh_bench_main.c b/benchmark/wh_bench_main.c index aca1aafea..95dd84afd 100644 --- a/benchmark/wh_bench_main.c +++ b/benchmark/wh_bench_main.c @@ -81,12 +81,16 @@ int main(int argc, char** argv) } } -#if defined(WOLFHSM_CFG_TEST_POSIX) +#if defined(WOLFHSM_CFG_TEST_POSIX) && defined(WOLFHSM_CFG_ENABLE_SERVER) int ret = wh_Bench_ClientServer_Posix(transport, moduleIndex); if (ret != 0) { WH_BENCH_PRINTF("Memory transport benchmark failed: %d\n", ret); return ret; } +#elif defined(WOLFHSM_CFG_TEST_POSIX) + WH_BENCH_PRINTF( + "Server support not enabled. Define WOLFHSM_CFG_ENABLE_SERVER " + "to enable.\n"); #else WH_BENCH_PRINTF( "POSIX thread benchmarks not enabled. Define WOLFHSM_CFG_TEST_POSIX "