From 9c10a8de4349970d5a1f7342336e4e0ea03199c4 Mon Sep 17 00:00:00 2001 From: Hideki Miyazaki Date: Wed, 15 Jul 2026 07:34:02 +0900 Subject: [PATCH 1/5] add guard when verify-only mode on ml-dsa --- src/wh_server_crypto.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/wh_server_crypto.c b/src/wh_server_crypto.c index b35e8e4a0..7a9278157 100644 --- a/src/wh_server_crypto.c +++ b/src/wh_server_crypto.c @@ -768,11 +768,19 @@ int wh_Server_CacheExportCurve25519Key(whServerContext* server, whKeyId keyId, #endif /* HAVE_CURVE25519 */ #ifdef WOLFSSL_HAVE_MLDSA -/* The big key cache buffer must be able to hold a full ML-DSA keypair DER, - * otherwise wh_Server_MlDsaKeyCacheImport() can never succeed. */ +/* When verify-only, the server caches only the public key DER. Otherwise it + * must be able to hold a full keypair DER (public + private). */ +#ifdef WOLFSSL_DILITHIUM_VERIFY_ONLY +#define WH_SERVER_MLDSA_MAX_CACHE_DER_SIZE MLDSA_MAX_PUB_KEY_DER_SIZE +WH_UTILS_STATIC_ASSERT( + WOLFHSM_CFG_SERVER_KEYCACHE_BIG_BUFSIZE >= MLDSA_MAX_PUB_KEY_DER_SIZE, + "WOLFHSM_CFG_SERVER_KEYCACHE_BIG_BUFSIZE too small for ML-DSA public key DER"); +#else +#define WH_SERVER_MLDSA_MAX_CACHE_DER_SIZE MLDSA_MAX_BOTH_KEY_DER_SIZE WH_UTILS_STATIC_ASSERT( WOLFHSM_CFG_SERVER_KEYCACHE_BIG_BUFSIZE >= MLDSA_MAX_BOTH_KEY_DER_SIZE, "WOLFHSM_CFG_SERVER_KEYCACHE_BIG_BUFSIZE too small for ML-DSA keypair DER"); +#endif int wh_Server_MlDsaKeyCacheImport(whServerContext* ctx, wc_MlDsaKey* key, whKeyId keyId, whNvmFlags flags, From ac05640c7239e27a9df5003cc2b1f043ea3e60d0 Mon Sep 17 00:00:00 2001 From: Hideki Miyazaki Date: Wed, 15 Jul 2026 13:47:11 +0900 Subject: [PATCH 2/5] Addressed review comments --- src/wh_server_crypto.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/wh_server_crypto.c b/src/wh_server_crypto.c index 7a9278157..62f6beeae 100644 --- a/src/wh_server_crypto.c +++ b/src/wh_server_crypto.c @@ -772,15 +772,12 @@ int wh_Server_CacheExportCurve25519Key(whServerContext* server, whKeyId keyId, * must be able to hold a full keypair DER (public + private). */ #ifdef WOLFSSL_DILITHIUM_VERIFY_ONLY #define WH_SERVER_MLDSA_MAX_CACHE_DER_SIZE MLDSA_MAX_PUB_KEY_DER_SIZE -WH_UTILS_STATIC_ASSERT( - WOLFHSM_CFG_SERVER_KEYCACHE_BIG_BUFSIZE >= MLDSA_MAX_PUB_KEY_DER_SIZE, - "WOLFHSM_CFG_SERVER_KEYCACHE_BIG_BUFSIZE too small for ML-DSA public key DER"); #else #define WH_SERVER_MLDSA_MAX_CACHE_DER_SIZE MLDSA_MAX_BOTH_KEY_DER_SIZE -WH_UTILS_STATIC_ASSERT( - WOLFHSM_CFG_SERVER_KEYCACHE_BIG_BUFSIZE >= MLDSA_MAX_BOTH_KEY_DER_SIZE, - "WOLFHSM_CFG_SERVER_KEYCACHE_BIG_BUFSIZE too small for ML-DSA keypair DER"); #endif +WH_UTILS_STATIC_ASSERT( + WOLFHSM_CFG_SERVER_KEYCACHE_BIG_BUFSIZE >= WH_SERVER_MLDSA_MAX_CACHE_DER_SIZE, + "WOLFHSM_CFG_SERVER_KEYCACHE_BIG_BUFSIZE too small for ML-DSA key DER"); int wh_Server_MlDsaKeyCacheImport(whServerContext* ctx, wc_MlDsaKey* key, whKeyId keyId, whNvmFlags flags, From 3880ad0a4dae7fa138dcab5f82291d962fc156a7 Mon Sep 17 00:00:00 2001 From: Hideki Miyazaki Date: Thu, 16 Jul 2026 11:45:03 +0900 Subject: [PATCH 3/5] Add CI unit test Fix fenrir comments --- .github/workflows/build-and-test-refactor.yml | 4 ++++ .github/workflows/build-and-test.yml | 4 ++++ src/wh_server_crypto.c | 14 ++++++++------ test-refactor/posix/Makefile | 4 ++++ test/Makefile | 4 ++++ 5 files changed, 24 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build-and-test-refactor.yml b/.github/workflows/build-and-test-refactor.yml index 4656b4a5a..c4fbaafba 100644 --- a/.github/workflows/build-and-test-refactor.yml +++ b/.github/workflows/build-and-test-refactor.yml @@ -53,6 +53,10 @@ jobs: - name: Build and test refactor DMA ASAN LMS verify-only XMSS full run: cd test-refactor/posix && make clean && make -j DMA=1 ASAN=1 LMS_VERIFY_ONLY=1 WOLFSSL_DIR=../../wolfssl && make run + # Build and test with ML-DSA in verify-only mode + - name: Build and test refactor DMA ASAN MLDSA verify-only + run: cd test-refactor/posix && make clean && make -j DMA=1 ASAN=1 MLDSA_VERIFY_ONLY=1 WOLFSSL_DIR=../../wolfssl && make run + # Build and test ASAN build, with wolfCrypt tests enabled. - name: Build and test refactor ASAN TESTWOLFCRYPT run: cd test-refactor/posix && make clean && make -j ASAN=1 TESTWOLFCRYPT=1 WOLFSSL_DIR=../../wolfssl && make run diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index d1af2729b..278f49dc8 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -53,6 +53,10 @@ jobs: - name: Build and test DMA ASAN LMS verify-only XMSS full run: cd test && make clean && make -j DMA=1 ASAN=1 LMS_VERIFY_ONLY=1 WOLFSSL_DIR=../wolfssl && make run + # Build and test with ML-DSA in verify-only mode + - name: Build and test DMA ASAN MLDSA verify-only + run: cd test && make clean && make -j DMA=1 ASAN=1 MLDSA_VERIFY_ONLY=1 WOLFSSL_DIR=../wolfssl && make run + # Build and test ASAN build, with wolfCrypt tests enabled. - name: Build and test ASAN TESTWOLFCRYPT run: cd test && make clean && make -j ASAN=1 TESTWOLFCRYPT=1 WOLFSSL_DIR=../wolfssl && make run diff --git a/src/wh_server_crypto.c b/src/wh_server_crypto.c index 62f6beeae..e91ed590b 100644 --- a/src/wh_server_crypto.c +++ b/src/wh_server_crypto.c @@ -793,14 +793,12 @@ int wh_Server_MlDsaKeyCacheImport(whServerContext* ctx, wc_MlDsaKey* key, return WH_ERROR_BADARGS; } - /* The key may hold a full keypair, in which case - * wh_Crypto_MlDsaSerializeKeyDer() encodes both the public and private key - * (wc_MlDsaKey_KeyToDer()), so size for both keys, not just the private key. */ ret = wh_Server_KeystoreGetCacheSlotChecked( - ctx, keyId, MLDSA_MAX_BOTH_KEY_DER_SIZE, &cacheBuf, &cacheMeta); + ctx, keyId, WH_SERVER_MLDSA_MAX_CACHE_DER_SIZE, &cacheBuf, &cacheMeta); if (ret == WH_ERROR_OK) { - ret = wh_Crypto_MlDsaSerializeKeyDer(key, MLDSA_MAX_BOTH_KEY_DER_SIZE, - cacheBuf, &der_size); + ret = wh_Crypto_MlDsaSerializeKeyDer(key, + WH_SERVER_MLDSA_MAX_CACHE_DER_SIZE, + cacheBuf, &der_size); WH_DEBUG_SERVER_VERBOSE("keyId:%u, ret:%d\n", keyId, ret); } @@ -4723,6 +4721,7 @@ static int _HandleMlDsaKeyGen(whServerContext* ctx, uint16_t magic, int devId, #ifdef WOLFSSL_MLDSA_NO_MAKE_KEY (void)ctx; (void)magic; + (void)devId; (void)cryptoDataIn; (void)inSize; (void)cryptoDataOut; @@ -4833,6 +4832,7 @@ static int _HandleMlDsaSign(whServerContext* ctx, uint16_t magic, int devId, #ifdef WOLFSSL_MLDSA_NO_SIGN (void)ctx; (void)magic; + (void)devId; (void)cryptoDataIn; (void)inSize; (void)cryptoDataOut; @@ -6375,6 +6375,7 @@ static int _HandleMlDsaKeyGenDma(whServerContext* ctx, uint16_t magic, #ifdef WOLFSSL_MLDSA_NO_MAKE_KEY (void)ctx; (void)magic; + (void)devId; (void)cryptoDataIn; (void)inSize; (void)cryptoDataOut; @@ -6496,6 +6497,7 @@ static int _HandleMlDsaSignDma(whServerContext* ctx, uint16_t magic, int devId, #ifdef WOLFSSL_MLDSA_NO_SIGN (void)ctx; (void)magic; + (void)devId; (void)cryptoDataIn; (void)inSize; (void)cryptoDataOut; diff --git a/test-refactor/posix/Makefile b/test-refactor/posix/Makefile index 3169736ad..9e53edef4 100644 --- a/test-refactor/posix/Makefile +++ b/test-refactor/posix/Makefile @@ -110,6 +110,10 @@ ifeq ($(XMSS_VERIFY_ONLY),1) DEF += -DWOLFSSL_XMSS_VERIFY_ONLY endif +ifeq ($(MLDSA_VERIFY_ONLY),1) + DEF += -DWOLFSSL_MLDSA_VERIFY_ONLY +endif + # Support a SHE-capable build ifeq ($(SHE),1) DEF += -DWOLFHSM_CFG_SHE_EXTENSION diff --git a/test/Makefile b/test/Makefile index faf251850..7e0562893 100644 --- a/test/Makefile +++ b/test/Makefile @@ -152,6 +152,10 @@ ifeq ($(XMSS_VERIFY_ONLY),1) DEF += -DWOLFSSL_XMSS_VERIFY_ONLY endif +ifeq ($(MLDSA_VERIFY_ONLY),1) + DEF += -DWOLFSSL_MLDSA_VERIFY_ONLY +endif + # Support a SHE-capable build ifeq ($(SHE),1) DEF += -DWOLFHSM_CFG_SHE_EXTENSION From 13ebd05123b926a1600b8ec564a2cc64e1995a45 Mon Sep 17 00:00:00 2001 From: Hideki Miyazaki Date: Thu, 16 Jul 2026 13:13:28 +0900 Subject: [PATCH 4/5] Add macro guard --- src/wh_server_crypto.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wh_server_crypto.c b/src/wh_server_crypto.c index e91ed590b..764d5284b 100644 --- a/src/wh_server_crypto.c +++ b/src/wh_server_crypto.c @@ -770,7 +770,7 @@ int wh_Server_CacheExportCurve25519Key(whServerContext* server, whKeyId keyId, #ifdef WOLFSSL_HAVE_MLDSA /* When verify-only, the server caches only the public key DER. Otherwise it * must be able to hold a full keypair DER (public + private). */ -#ifdef WOLFSSL_DILITHIUM_VERIFY_ONLY +#if defined(WOLFSSL_DILITHIUM_VERIFY_ONLY) || defined(WOLFSSL_MLDSA_VERIFY_ONLY) #define WH_SERVER_MLDSA_MAX_CACHE_DER_SIZE MLDSA_MAX_PUB_KEY_DER_SIZE #else #define WH_SERVER_MLDSA_MAX_CACHE_DER_SIZE MLDSA_MAX_BOTH_KEY_DER_SIZE From 66d8f5febf977a4d5fc211e29b419f7553c2962d Mon Sep 17 00:00:00 2001 From: Hideki Miyazaki Date: Fri, 17 Jul 2026 08:33:56 +0900 Subject: [PATCH 5/5] Addressed comments --- .github/workflows/build-and-test-refactor.yml | 7 +++++++ .github/workflows/build-and-test.yml | 7 +++++++ src/wh_server_crypto.c | 2 ++ test-refactor/posix/Makefile | 4 ++++ test/Makefile | 4 ++++ 5 files changed, 24 insertions(+) diff --git a/.github/workflows/build-and-test-refactor.yml b/.github/workflows/build-and-test-refactor.yml index c4fbaafba..bbcc32fbc 100644 --- a/.github/workflows/build-and-test-refactor.yml +++ b/.github/workflows/build-and-test-refactor.yml @@ -57,6 +57,13 @@ jobs: - name: Build and test refactor DMA ASAN MLDSA verify-only run: cd test-refactor/posix && make clean && make -j DMA=1 ASAN=1 MLDSA_VERIFY_ONLY=1 WOLFSSL_DIR=../../wolfssl && make run + # Build and test with ML-DSA verify-only and a reduced keycache buffer. + # 4096 < MLDSA_MAX_BOTH_KEY_DER_SIZE(7520) so this would fail the static + # assert without MLDSA_VERIFY_ONLY; it passes because verify-only only + # needs MLDSA_MAX_PUB_KEY_DER_SIZE(2614). LMS/XMSS full keys fit in 4096. + - name: Build and test refactor DMA ASAN MLDSA verify-only reduced keycache + run: cd test-refactor/posix && make clean && make -j DMA=1 ASAN=1 MLDSA_VERIFY_ONLY=1 KEYCACHE_BIG_BUFSIZE=4096 WOLFSSL_DIR=../../wolfssl && make run + # Build and test ASAN build, with wolfCrypt tests enabled. - name: Build and test refactor ASAN TESTWOLFCRYPT run: cd test-refactor/posix && make clean && make -j ASAN=1 TESTWOLFCRYPT=1 WOLFSSL_DIR=../../wolfssl && make run diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 278f49dc8..396433e6b 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -57,6 +57,13 @@ jobs: - name: Build and test DMA ASAN MLDSA verify-only run: cd test && make clean && make -j DMA=1 ASAN=1 MLDSA_VERIFY_ONLY=1 WOLFSSL_DIR=../wolfssl && make run + # Build and test with ML-DSA verify-only and a reduced keycache buffer. + # 4096 < MLDSA_MAX_BOTH_KEY_DER_SIZE(7520) so this would fail the static + # assert without MLDSA_VERIFY_ONLY; it passes because verify-only only + # needs MLDSA_MAX_PUB_KEY_DER_SIZE(2614). LMS/XMSS full keys fit in 4096. + - name: Build and test DMA ASAN MLDSA verify-only reduced keycache + run: cd test && make clean && make -j DMA=1 ASAN=1 MLDSA_VERIFY_ONLY=1 KEYCACHE_BIG_BUFSIZE=4096 WOLFSSL_DIR=../wolfssl && make run + # Build and test ASAN build, with wolfCrypt tests enabled. - name: Build and test ASAN TESTWOLFCRYPT run: cd test && make clean && make -j ASAN=1 TESTWOLFCRYPT=1 WOLFSSL_DIR=../wolfssl && make run diff --git a/src/wh_server_crypto.c b/src/wh_server_crypto.c index 764d5284b..23b00ccfe 100644 --- a/src/wh_server_crypto.c +++ b/src/wh_server_crypto.c @@ -4940,6 +4940,7 @@ static int _HandleMlDsaVerify(whServerContext* ctx, uint16_t magic, int devId, #ifdef WOLFSSL_MLDSA_NO_VERIFY (void)ctx; (void)magic; + (void)devId; (void)cryptoDataIn; (void)inSize; (void)cryptoDataOut; @@ -6632,6 +6633,7 @@ static int _HandleMlDsaVerifyDma(whServerContext* ctx, uint16_t magic, #ifdef WOLFSSL_MLDSA_NO_VERIFY (void)ctx; (void)magic; + (void)devId; (void)cryptoDataIn; (void)inSize; (void)cryptoDataOut; diff --git a/test-refactor/posix/Makefile b/test-refactor/posix/Makefile index 9e53edef4..6cacff622 100644 --- a/test-refactor/posix/Makefile +++ b/test-refactor/posix/Makefile @@ -114,6 +114,10 @@ ifeq ($(MLDSA_VERIFY_ONLY),1) DEF += -DWOLFSSL_MLDSA_VERIFY_ONLY endif +ifneq ($(KEYCACHE_BIG_BUFSIZE),) + DEF += -DWOLFHSM_CFG_SERVER_KEYCACHE_BIG_BUFSIZE=$(KEYCACHE_BIG_BUFSIZE) +endif + # Support a SHE-capable build ifeq ($(SHE),1) DEF += -DWOLFHSM_CFG_SHE_EXTENSION diff --git a/test/Makefile b/test/Makefile index 7e0562893..c76e877a7 100644 --- a/test/Makefile +++ b/test/Makefile @@ -156,6 +156,10 @@ ifeq ($(MLDSA_VERIFY_ONLY),1) DEF += -DWOLFSSL_MLDSA_VERIFY_ONLY endif +ifneq ($(KEYCACHE_BIG_BUFSIZE),) + DEF += -DWOLFHSM_CFG_SERVER_KEYCACHE_BIG_BUFSIZE=$(KEYCACHE_BIG_BUFSIZE) +endif + # Support a SHE-capable build ifeq ($(SHE),1) DEF += -DWOLFHSM_CFG_SHE_EXTENSION