From 3fdff2d072b3ae023fc5157ac09d34caf6b1c99e Mon Sep 17 00:00:00 2001 From: aidan Date: Thu, 30 Jul 2026 20:00:36 -0600 Subject: [PATCH 1/2] tests: guard weak-hash checks on WC_SIG_MIN_HASH_TYPE, fix RNG cleanup --- tests/api/test_signature.c | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/tests/api/test_signature.c b/tests/api/test_signature.c index 5a8bf2d490..9c9469a909 100644 --- a/tests/api/test_signature.c +++ b/tests/api/test_signature.c @@ -182,7 +182,7 @@ int test_wc_falcon_sign_verify(void) XMEMSET(&key, 0, sizeof(key)); ExpectIntEQ(wc_falcon_init(&key), 0); ExpectIntEQ(wc_falcon_set_level(&key, 1), 0); - ExpectIntEQ(wc_InitRng(&rng), 0); + DoExpectIntEQ(wc_InitRng(&rng), 0); /* Use the embedded benchmark key rather than generating one: this is a * wrapper-level smoke test (the native suite lives in test_falcon.c), so @@ -304,7 +304,7 @@ int test_wc_SignatureDecisionCoverage(void) WC_RNG rng; XMEMSET(data, 0x5A, sizeof(data)); - ExpectIntEQ(wc_InitRng(&rng), 0); + DoExpectIntEQ(wc_InitRng(&rng), 0); ExpectIntEQ(wc_SignatureVerify(WC_HASH_TYPE_SHA256, sig_type, NULL, data_len, sig, sig_len, &ecc, key_len), @@ -335,9 +335,11 @@ int test_wc_SignatureDecisionCoverage(void) data, data_len, sig, sig_len, &ecc, key_len), WC_NO_ERR_TRACE(BAD_FUNC_ARG)); -#ifndef NO_SHA - /* Hash weaker than WC_SIG_MIN_HASH_TYPE (default SHA-256) - * rejected by wc_SignatureCheckHashStrength() */ +#if !defined(NO_SHA) && !defined(WC_SIG_MIN_HASH_TYPE) + /* Hash weaker than the default WC_SIG_MIN_HASH_TYPE (SHA-256) + * rejected by wc_SignatureCheckHashStrength(). Skipped when the + * floor has been overridden: wolfCLU with MD5 compiled in lowers + * it to WC_HASH_TYPE_MD5, which lets SHA-1 through. */ ExpectIntEQ(wc_SignatureVerify(WC_HASH_TYPE_SHA, sig_type, data, data_len, sig, sig_len, &ecc, key_len), WC_NO_ERR_TRACE(BAD_FUNC_ARG)); @@ -397,7 +399,7 @@ int test_wc_SignatureDecisionCoverage(void) word32 genSigLen = (word32)eccSigMax; WC_RNG rng; - ExpectIntEQ(wc_InitRng(&rng), 0); + DoExpectIntEQ(wc_InitRng(&rng), 0); ExpectIntEQ(wc_SignatureGenerateHash_ex(WC_HASH_TYPE_SHA256, sig_type, NULL, hash_len, genSig, &genSigLen, &ecc, key_len, @@ -474,7 +476,7 @@ int test_wc_SignatureDecisionCoverage(void) WC_RNG rng; XMEMSET(data, 0xA5, sizeof(data)); - ExpectIntEQ(wc_InitRng(&rng), 0); + DoExpectIntEQ(wc_InitRng(&rng), 0); ExpectIntEQ(wc_SignatureGenerate(WC_HASH_TYPE_SHA256, sig_type, NULL, data_len, genSig, &genSigLen, &ecc, key_len, &rng), @@ -517,8 +519,9 @@ int test_wc_SignatureDecisionCoverage(void) key_len, &rng), WC_NO_ERR_TRACE(BAD_FUNC_ARG)); } -#ifndef NO_SHA - /* Weak hash rejected before any hashing/signing occurs */ +#if !defined(NO_SHA) && !defined(WC_SIG_MIN_HASH_TYPE) + /* Weak hash rejected before any hashing/signing occurs (skipped + * when WC_SIG_MIN_HASH_TYPE overrides the SHA-256 floor) */ { word32 lenCopy = (word32)eccSigMax; ExpectIntEQ(wc_SignatureGenerate(WC_HASH_TYPE_SHA, sig_type, @@ -632,7 +635,7 @@ int test_wc_SignatureDecisionCoverage(void) XMEMSET(data, 0x24, sizeof(data)); XMEMSET(otherData, 0x99, sizeof(otherData)); - ExpectIntEQ(wc_InitRng(&rng), 0); + DoExpectIntEQ(wc_InitRng(&rng), 0); ExpectIntEQ(wc_SignatureGenerate(WC_HASH_TYPE_SHA256, WC_SIGNATURE_TYPE_RSA, data, data_len, realSig, &realSigLen, &rsa_key, key_len, &rng), 0); @@ -681,7 +684,7 @@ int test_wc_SignatureFeatureCoverage(void) ExpectIntEQ(wc_ecc_init(&ecc), 0); ExpectIntEQ(wc_ecc_import_raw(&ecc, qx, qy, d, "SECP256R1"), 0); - ExpectIntEQ(wc_InitRng(&rng), 0); + DoExpectIntEQ(wc_InitRng(&rng), 0); /* wc_SignatureGetSize(): positive path for ECC */ ExpectIntGT(wc_SignatureGetSize(sig_type, &ecc, key_len), 0); @@ -767,7 +770,7 @@ int test_wc_SignatureFeatureCoverage(void) ExpectIntEQ(wc_InitRsaKey_ex(&rsa_key, HEAP_HINT, testDevId), 0); ExpectIntEQ(wc_RsaPrivateKeyDecode(tmp, &idx, &rsa_key, (word32)bytes), 0); - ExpectIntEQ(wc_InitRng(&rng), 0); + DoExpectIntEQ(wc_InitRng(&rng), 0); /* wc_SignatureGetSize(): positive path for RSA */ ExpectIntGT(wc_SignatureGetSize(WC_SIGNATURE_TYPE_RSA, &rsa_key, From 7481acb127f7432932ee7b3452d7e99bf96a4c19 Mon Sep 17 00:00:00 2001 From: Aidan Keefe Date: Fri, 31 Jul 2026 11:35:54 -0600 Subject: [PATCH 2/2] review fix --- tests/api/test_signature.c | 42 +++++++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/tests/api/test_signature.c b/tests/api/test_signature.c index 9c9469a909..244a8943b3 100644 --- a/tests/api/test_signature.c +++ b/tests/api/test_signature.c @@ -41,6 +41,13 @@ #include #include +/* Must be kept in sync with wolfcrypt/src/signature.c */ +#ifndef WC_SIG_MIN_HASH_TYPE + #define TEST_SIG_MIN_HASH_TYPE WC_HASH_TYPE_SHA256 +#else + #define TEST_SIG_MIN_HASH_TYPE WC_SIG_MIN_HASH_TYPE +#endif + /* Testing wc_SignatureGetSize() for signature type ECC */ int test_wc_SignatureGetSize_ecc(void) { @@ -334,15 +341,18 @@ int test_wc_SignatureDecisionCoverage(void) ExpectIntEQ(wc_SignatureVerify((enum wc_HashType)999, sig_type, data, data_len, sig, sig_len, &ecc, key_len), WC_NO_ERR_TRACE(BAD_FUNC_ARG)); - -#if !defined(NO_SHA) && !defined(WC_SIG_MIN_HASH_TYPE) - /* Hash weaker than the default WC_SIG_MIN_HASH_TYPE (SHA-256) - * rejected by wc_SignatureCheckHashStrength(). Skipped when the - * floor has been overridden: wolfCLU with MD5 compiled in lowers - * it to WC_HASH_TYPE_MD5, which lets SHA-1 through. */ - ExpectIntEQ(wc_SignatureVerify(WC_HASH_TYPE_SHA, sig_type, - data, data_len, sig, sig_len, &ecc, key_len), - WC_NO_ERR_TRACE(BAD_FUNC_ARG)); +#if !defined(NO_SHA) + if (TEST_SIG_MIN_HASH_TYPE > WC_HASH_TYPE_SHA) { + ExpectIntEQ(wc_SignatureVerify(WC_HASH_TYPE_SHA, sig_type, + data, data_len, sig, sig_len, &ecc, key_len), + WC_NO_ERR_TRACE(BAD_FUNC_ARG)); + } + else { + /* If SHA is allowed error should come from the sig */ + ExpectIntEQ(wc_SignatureVerify(WC_HASH_TYPE_SHA, sig_type, + data, data_len, sig, sig_len, &ecc, key_len), + WC_NO_ERR_TRACE(SIG_VERIFY_E)); + } #endif /* Real signature that fails verification: SIG_VERIFY_E. @@ -518,16 +528,20 @@ int test_wc_SignatureDecisionCoverage(void) sig_type, data, data_len, genSig, &lenCopy, &ecc, key_len, &rng), WC_NO_ERR_TRACE(BAD_FUNC_ARG)); } - -#if !defined(NO_SHA) && !defined(WC_SIG_MIN_HASH_TYPE) - /* Weak hash rejected before any hashing/signing occurs (skipped - * when WC_SIG_MIN_HASH_TYPE overrides the SHA-256 floor) */ - { +#if !defined(NO_SHA) + if (TEST_SIG_MIN_HASH_TYPE > WC_HASH_TYPE_SHA) { word32 lenCopy = (word32)eccSigMax; ExpectIntEQ(wc_SignatureGenerate(WC_HASH_TYPE_SHA, sig_type, data, data_len, genSig, &lenCopy, &ecc, key_len, &rng), WC_NO_ERR_TRACE(BAD_FUNC_ARG)); } + else { + /* Floor lowered : SHA-1 must get past the + * strength check and fail on the signature itself instead. */ + ExpectIntEQ(wc_SignatureVerify(WC_HASH_TYPE_SHA, sig_type, + data, data_len, sig, sig_len, &ecc, key_len), + WC_NO_ERR_TRACE(SIG_VERIFY_E)); + } #endif DoExpectIntEQ(wc_FreeRng(&rng), 0);