From 777d42fabecd5b35326e1c8daa98e4b273ea2beb Mon Sep 17 00:00:00 2001 From: Daniel Pouzzner Date: Fri, 21 Mar 2025 21:12:41 -0500 Subject: [PATCH 1/7] wolfcrypt/src/siphash.c: gate armasm on defined(WOLFSSL_ARMASM), not !defined(WOLFSSL_NO_ASM). --- wolfcrypt/src/siphash.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wolfcrypt/src/siphash.c b/wolfcrypt/src/siphash.c index 4b73e7062..9dea3f3c3 100644 --- a/wolfcrypt/src/siphash.c +++ b/wolfcrypt/src/siphash.c @@ -582,7 +582,7 @@ int wc_SipHash(const unsigned char* key, const unsigned char* in, word32 inSz, return 0; } -#elif !defined(WOLFSSL_NO_ASM) && defined(__GNUC__) && defined(__aarch64__) && \ +#elif defined(WOLFSSL_ARMASM) && defined(__GNUC__) && defined(__aarch64__) && \ (WOLFSSL_SIPHASH_CROUNDS == 1 || WOLFSSL_SIPHASH_CROUNDS == 2) && \ (WOLFSSL_SIPHASH_DROUNDS == 2 || WOLFSSL_SIPHASH_DROUNDS == 4) From 1587f219383cfeec3ce27a0de376b738098048ee Mon Sep 17 00:00:00 2001 From: Daniel Pouzzner Date: Fri, 21 Mar 2025 22:33:45 -0500 Subject: [PATCH 2/7] fix a couple -Wdeclaration-after-statements. --- wolfcrypt/src/falcon.c | 16 +++++++++------- wolfcrypt/test/test.c | 8 +++++--- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/wolfcrypt/src/falcon.c b/wolfcrypt/src/falcon.c index ab529f7e2..c19bb01e6 100644 --- a/wolfcrypt/src/falcon.c +++ b/wolfcrypt/src/falcon.c @@ -62,6 +62,10 @@ int wc_falcon_sign_msg(const byte* in, word32 inLen, falcon_key* key, WC_RNG* rng) { int ret = 0; +#ifdef HAVE_LIBOQS + OQS_SIG *oqssig = NULL; + size_t localOutLen = 0; +#endif /* sanity check on arguments */ if ((in == NULL) || (out == NULL) || (outLen == NULL) || (key == NULL)) { @@ -83,9 +87,6 @@ int wc_falcon_sign_msg(const byte* in, word32 inLen, #endif #ifdef HAVE_LIBOQS - OQS_SIG *oqssig = NULL; - size_t localOutLen = 0; - if ((ret == 0) && (!key->prvKeySet)) { ret = BAD_FUNC_ARG; } @@ -161,6 +162,9 @@ int wc_falcon_verify_msg(const byte* sig, word32 sigLen, const byte* msg, word32 msgLen, int* res, falcon_key* key) { int ret = 0; +#ifdef HAVE_LIBOQS + OQS_SIG *oqssig = NULL; +#endif if (key == NULL || sig == NULL || msg == NULL || res == NULL) { return BAD_FUNC_ARG; @@ -181,8 +185,6 @@ int wc_falcon_verify_msg(const byte* sig, word32 sigLen, const byte* msg, #endif #ifdef HAVE_LIBOQS - OQS_SIG *oqssig = NULL; - if ((ret == 0) && (!key->pubKeySet)) { ret = BAD_FUNC_ARG; } @@ -708,12 +710,12 @@ int wc_falcon_export_key(falcon_key* key, byte* priv, word32 *privSz, */ int wc_falcon_check_key(falcon_key* key) { + int ret = 0; + if (key == NULL) { return BAD_FUNC_ARG; } - int ret = 0; - /* The public key is also decoded and stored within the private key buffer * behind the private key. Hence, we can compare both stored public keys. */ if (key->level == 1) { diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index 9f8db5f24..51f695441 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -6547,6 +6547,11 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t hmac_sha_test(void) wc_test_ret_t ret; int times = sizeof(test_hmac) / sizeof(testVector), i; + +#if FIPS_VERSION3_GE(6,0,0) + int allowShortKeyWithFips = 1; +#endif + WOLFSSL_ENTER("hmac_sha_test"); /* Following test vectors are from RFC 2202 section 3 */ @@ -6581,9 +6586,6 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t hmac_sha_test(void) test_hmac[1] = b; test_hmac[2] = c; test_hmac[3] = d; -#if FIPS_VERSION3_GE(6,0,0) - int allowShortKeyWithFips = 1; -#endif for (i = 0; i < times; ++i) { #if defined(HAVE_CAVIUM) || (defined(HAVE_FIPS) && FIPS_VERSION3_LT(6,0,0)) From 190f46ef23a1e0db31cb914c468b2bde30e3fe01 Mon Sep 17 00:00:00 2001 From: Daniel Pouzzner Date: Sat, 22 Mar 2025 01:22:19 -0500 Subject: [PATCH 3/7] wolfcrypt/test/test.c: fix -Wdeclaration-after-statement in sm3_test(). --- wolfcrypt/test/test.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index 51f695441..91f49e694 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -5911,12 +5911,13 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t sm3_test(void) byte hashGet[WC_SM3_DIGEST_SIZE]; byte hashCopy[WC_SM3_DIGEST_SIZE]; wc_test_ret_t ret = 0; - WOLFSSL_ENTER("sm3_test"); testVector a, b, c; testVector test_sm3[3]; int times = sizeof(test_sm3) / sizeof(struct testVector), i; + WOLFSSL_ENTER("sm3_test"); + a.input = ""; a.output = "\x1a\xb2\x1d\x83\x55\xcf\xa1\x7f\x8e\x61\x19\x48\x31\xe8\x1a" "\x8f\x22\xbe\xc8\xc7\x28\xfe\xfb\x74\x7e\xd0\x35\xeb\x50\x82" From 60ffde6d7cda53ef0e5f9ff1deb3c62cf933a17a Mon Sep 17 00:00:00 2001 From: Daniel Pouzzner Date: Sat, 22 Mar 2025 13:40:31 -0500 Subject: [PATCH 4/7] wolfcrypt/test/test.c: fix error-path various uninitialized data uses and memory leaks. --- wolfcrypt/test/test.c | 130 ++++++++++++++++++++++-------------------- 1 file changed, 67 insertions(+), 63 deletions(-) diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index 91f49e694..fb0409d1a 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -6144,37 +6144,37 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t hash_test(void) /* Parameter Validation testing. */ ret = wc_HashInit(NULL, WC_HASH_TYPE_SHA256); if (ret != WC_NO_ERR_TRACE(BAD_FUNC_ARG)) - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); ret = wc_HashUpdate(NULL, WC_HASH_TYPE_SHA256, NULL, sizeof(data)); if (ret != WC_NO_ERR_TRACE(BAD_FUNC_ARG)) - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); ret = wc_HashUpdate(hash, WC_HASH_TYPE_SHA256, NULL, sizeof(data)); if (ret != WC_NO_ERR_TRACE(BAD_FUNC_ARG)) - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); ret = wc_HashUpdate(NULL, WC_HASH_TYPE_SHA256, data, sizeof(data)); if (ret != WC_NO_ERR_TRACE(BAD_FUNC_ARG)) - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); ret = wc_HashFinal(NULL, WC_HASH_TYPE_SHA256, NULL); if (ret != WC_NO_ERR_TRACE(BAD_FUNC_ARG)) - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); ret = wc_HashFinal(hash, WC_HASH_TYPE_SHA256, NULL); if (ret != WC_NO_ERR_TRACE(BAD_FUNC_ARG)) - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); ret = wc_HashFinal(NULL, WC_HASH_TYPE_SHA256, out); if (ret != WC_NO_ERR_TRACE(BAD_FUNC_ARG)) - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); /* Try invalid hash algorithms. */ for (i = 0; i < (int)(sizeof(typesBad)/sizeof(*typesBad)); i++) { ret = wc_HashInit(hash, typesBad[i]); if (ret != WC_NO_ERR_TRACE(BAD_FUNC_ARG)) - return WC_TEST_RET_ENC_I(i); + ERROR_OUT(WC_TEST_RET_ENC_I(i), out); ret = wc_HashUpdate(hash, typesBad[i], data, sizeof(data)); if (ret != WC_NO_ERR_TRACE(BAD_FUNC_ARG)) - return WC_TEST_RET_ENC_I(i); + ERROR_OUT(WC_TEST_RET_ENC_I(i), out); ret = wc_HashFinal(hash, typesBad[i], out); if (ret != WC_NO_ERR_TRACE(BAD_FUNC_ARG)) - return WC_TEST_RET_ENC_I(i); + ERROR_OUT(WC_TEST_RET_ENC_I(i), out); wc_HashFree(hash, typesBad[i]); } @@ -6188,49 +6188,49 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t hash_test(void) } ret = wc_HashInit(hash, typesGood[i]); if (ret != exp_ret) - return WC_TEST_RET_ENC_I(i); + ERROR_OUT(WC_TEST_RET_ENC_I(i), out); ret = wc_HashUpdate(hash, typesGood[i], data, sizeof(data)); if (ret != exp_ret) - return WC_TEST_RET_ENC_I(i); + ERROR_OUT(WC_TEST_RET_ENC_I(i), out); ret = wc_HashFinal(hash, typesGood[i], out); if (ret != exp_ret) - return WC_TEST_RET_ENC_I(i); + ERROR_OUT(WC_TEST_RET_ENC_I(i), out); wc_HashFree(hash, typesGood[i]); digestSz = wc_HashGetDigestSize(typesGood[i]); if (exp_ret < 0 && digestSz != exp_ret) - return WC_TEST_RET_ENC_I(i); + ERROR_OUT(WC_TEST_RET_ENC_I(i), out); if (exp_ret == 0 && digestSz < 0) - return WC_TEST_RET_ENC_I(i); + ERROR_OUT(WC_TEST_RET_ENC_I(i), out); if (exp_ret == 0) { ret = wc_Hash(typesGood[i], data, sizeof(data), hashOut, (word32)digestSz - 1); if (ret != WC_NO_ERR_TRACE(BUFFER_E)) - return WC_TEST_RET_ENC_I(i); + ERROR_OUT(WC_TEST_RET_ENC_I(i), out); } ret = wc_Hash(typesGood[i], data, sizeof(data), hashOut, (word32)digestSz); if (ret != exp_ret) - return WC_TEST_RET_ENC_I(i); + ERROR_OUT(WC_TEST_RET_ENC_I(i), out); if (exp_ret == 0 && XMEMCMP(out, hashOut, (word32)digestSz) != 0) - return WC_TEST_RET_ENC_I(i); + ERROR_OUT(WC_TEST_RET_ENC_I(i), out); ret = wc_HashGetBlockSize(typesGood[i]); if (exp_ret < 0 && ret != exp_ret) - return WC_TEST_RET_ENC_I(i); + ERROR_OUT(WC_TEST_RET_ENC_I(i), out); if (exp_ret == 0 && ret < 0) - return WC_TEST_RET_ENC_I(i); + ERROR_OUT(WC_TEST_RET_ENC_I(i), out); #if !defined(NO_ASN) || !defined(NO_DH) || defined(HAVE_ECC) ret = wc_HashGetOID(typesGood[i]); if (ret == WC_NO_ERR_TRACE(BAD_FUNC_ARG) || (exp_ret == 0 && ret == WC_NO_ERR_TRACE(HASH_TYPE_E)) || (exp_ret != 0 && ret != WC_NO_ERR_TRACE(HASH_TYPE_E))) { - return WC_TEST_RET_ENC_I(i); + ERROR_OUT(WC_TEST_RET_ENC_I(i), out); } hashType = wc_OidGetHash(ret); if (exp_ret == 0 && hashType != typesGood[i]) - return WC_TEST_RET_ENC_I(i); + ERROR_OUT(WC_TEST_RET_ENC_I(i), out); #endif /* !defined(NO_ASN) || !defined(NO_DH) || defined(HAVE_ECC) */ } @@ -6240,7 +6240,7 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t hash_test(void) (ret != WC_NO_ERR_TRACE(BUFFER_E)) && (ret != WC_NO_ERR_TRACE(HASH_TYPE_E))) { - return WC_TEST_RET_ENC_I(i); + ERROR_OUT(WC_TEST_RET_ENC_I(i), out); } } @@ -6250,19 +6250,19 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t hash_test(void) if (ret == WC_NO_ERR_TRACE(HASH_TYPE_E) || ret == WC_NO_ERR_TRACE(BAD_FUNC_ARG)) { - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); } #else if (ret != WC_NO_ERR_TRACE(HASH_TYPE_E)) - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); #endif hashType = wc_OidGetHash(646); /* Md2h */ #ifdef WOLFSSL_MD2 if (hashType != WC_HASH_TYPE_MD2) - return WC_TEST_RET_ENC_NC; + ERROR_OUT(WC_TEST_RET_ENC_NC, out); #else if (hashType != WC_HASH_TYPE_NONE) - return WC_TEST_RET_ENC_NC; + ERROR_OUT(WC_TEST_RET_ENC_NC, out); #endif ret = wc_HashGetOID(WC_HASH_TYPE_MD5_SHA); @@ -6270,22 +6270,22 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t hash_test(void) if (ret == WC_NO_ERR_TRACE(HASH_TYPE_E) || ret == WC_NO_ERR_TRACE(BAD_FUNC_ARG)) { - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); } #else if (ret != WC_NO_ERR_TRACE(HASH_TYPE_E)) - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); #endif ret = wc_HashGetOID(WC_HASH_TYPE_MD4); if (ret != WC_NO_ERR_TRACE(BAD_FUNC_ARG)) - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); ret = wc_HashGetOID(WC_HASH_TYPE_NONE); if (ret != WC_NO_ERR_TRACE(BAD_FUNC_ARG)) - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); hashType = wc_OidGetHash(0); if (hashType != WC_HASH_TYPE_NONE) - return WC_TEST_RET_ENC_NC; + ERROR_OUT(WC_TEST_RET_ENC_NC, out); #endif /* !defined(NO_ASN) || !defined(NO_DH) || defined(HAVE_ECC) */ ret = wc_HashGetBlockSize(WC_HASH_TYPE_MD2); @@ -6293,22 +6293,22 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t hash_test(void) if (ret == WC_NO_ERR_TRACE(HASH_TYPE_E) || ret == WC_NO_ERR_TRACE(BAD_FUNC_ARG)) { - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); } #else if (ret != WC_NO_ERR_TRACE(HASH_TYPE_E)) - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); #endif ret = wc_HashGetDigestSize(WC_HASH_TYPE_MD2); #ifdef WOLFSSL_MD2 if (ret == WC_NO_ERR_TRACE(HASH_TYPE_E) || ret == WC_NO_ERR_TRACE(BAD_FUNC_ARG)) { - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); } #else if (ret != WC_NO_ERR_TRACE(HASH_TYPE_E)) - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); #endif ret = wc_HashGetBlockSize(WC_HASH_TYPE_MD4); @@ -6316,33 +6316,33 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t hash_test(void) if (ret == WC_NO_ERR_TRACE(HASH_TYPE_E) || ret == WC_NO_ERR_TRACE(BAD_FUNC_ARG)) { - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); } #else if (ret != WC_NO_ERR_TRACE(HASH_TYPE_E)) - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); #endif ret = wc_HashGetDigestSize(WC_HASH_TYPE_MD4); #ifndef NO_MD4 if (ret == WC_NO_ERR_TRACE(HASH_TYPE_E) || ret == WC_NO_ERR_TRACE(BAD_FUNC_ARG)) { - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); } #else if (ret != WC_NO_ERR_TRACE(HASH_TYPE_E)) - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); #endif ret = wc_HashGetBlockSize(WC_HASH_TYPE_MD5_SHA); #if !defined(NO_MD5) && !defined(NO_SHA) if (ret == WC_NO_ERR_TRACE(HASH_TYPE_E) || ret == WC_NO_ERR_TRACE(BAD_FUNC_ARG)) { - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); } #else if (ret != WC_NO_ERR_TRACE(HASH_TYPE_E)) - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); #endif ret = wc_HashGetBlockSize(WC_HASH_TYPE_BLAKE2B); @@ -6350,77 +6350,79 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t hash_test(void) if (ret == WC_NO_ERR_TRACE(HASH_TYPE_E) || ret == WC_NO_ERR_TRACE(BAD_FUNC_ARG)) { - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); } #else if (ret != WC_NO_ERR_TRACE(HASH_TYPE_E)) - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); #endif ret = wc_HashGetDigestSize(WC_HASH_TYPE_BLAKE2B); #if defined(HAVE_BLAKE2) || defined(HAVE_BLAKE2S) if (ret == WC_NO_ERR_TRACE(HASH_TYPE_E) || ret == WC_NO_ERR_TRACE(BAD_FUNC_ARG)) { - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); } #else if (ret != WC_NO_ERR_TRACE(HASH_TYPE_E)) - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); #endif ret = wc_HashGetBlockSize(WC_HASH_TYPE_NONE); if (ret != WC_NO_ERR_TRACE(BAD_FUNC_ARG)) - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); ret = wc_HashGetDigestSize(WC_HASH_TYPE_NONE); if (ret != WC_NO_ERR_TRACE(BAD_FUNC_ARG)) - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); #if !defined(NO_CERTS) && !defined(NO_ASN) #if defined(WOLFSSL_MD2) && !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS) ret = wc_GetCTC_HashOID(WC_HASH_TYPE_MD2); if (ret == 0) - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); #endif #ifndef NO_MD5 ret = wc_GetCTC_HashOID(WC_MD5); if (ret == 0) - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); #endif #ifndef NO_SHA ret = wc_GetCTC_HashOID(WC_SHA); if (ret == 0) - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); #endif #ifdef WOLFSSL_SHA224 ret = wc_GetCTC_HashOID(WC_SHA224); if (ret == 0) - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); #endif #ifndef NO_SHA256 ret = wc_GetCTC_HashOID(WC_SHA256); if (ret == 0) - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); #endif #ifdef WOLFSSL_SHA384 ret = wc_GetCTC_HashOID(WC_SHA384); if (ret == 0) - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); #endif #ifdef WOLFSSL_SHA512 ret = wc_GetCTC_HashOID(WC_SHA512); if (ret == 0) - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); #endif ret = wc_GetCTC_HashOID(-1); if (ret != 0) - return WC_TEST_RET_ENC_EC(ret); + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); #endif +out: + #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) (void)wc_HashDelete(hash, &hash); #endif - return 0; + return ret; } #endif /* !NO_HASH_WRAPPER */ @@ -50502,12 +50504,15 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t cmac_test(void) } #endif + (void)wc_CmacFree(cmac); } ret = 0; out: + (void)wc_CmacFree(cmac); + #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) XFREE(cmac, HEAP_HINT, DYNAMIC_TYPE_CMAC); #endif @@ -58321,22 +58326,21 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t prime_test(void) WC_RNG rng; WOLFSSL_ENTER("prime_test"); + ret = mp_init_multi(n, p1, p2, p3, NULL, NULL); + if (ret != 0) + ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) if ((n == NULL) || (p1 == NULL) || (p2 == NULL) || (p3 == NULL)) - ERROR_OUT(MEMORY_E, out); + ERROR_OUT(WC_TEST_RET_ENC_EC(MEMORY_E), out); #endif ret = wc_InitRng(&rng); if (ret != 0) ret = WC_TEST_RET_ENC_EC(ret); - if (ret == 0) { - ret = mp_init_multi(n, p1, p2, p3, NULL, NULL); - if (ret != 0) - ret = WC_TEST_RET_ENC_EC(ret); - } if (ret == 0) ret = GenerateP(p1, p2, p3, ecPairsA, sizeof(ecPairsA) / sizeof(ecPairsA[0]), kA); From 3cad38a1ca87fe794b726575d44b3e9d66b449e9 Mon Sep 17 00:00:00 2001 From: Daniel Pouzzner Date: Sat, 22 Mar 2025 17:19:37 -0500 Subject: [PATCH 5/7] wolfcrypt/test/test.c: gate wc_CmacFree()s in cmac_test() on !HAVE_FIPS || FIPS_VERSION3_GE(6,0,0); fix some return codes in hash_test(). --- wolfcrypt/test/test.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index fb0409d1a..9639e4096 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -6379,43 +6379,45 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t hash_test(void) #if defined(WOLFSSL_MD2) && !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS) ret = wc_GetCTC_HashOID(WC_HASH_TYPE_MD2); if (ret == 0) - ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + ERROR_OUT(WC_TEST_RET_ENC_NC, out); #endif #ifndef NO_MD5 ret = wc_GetCTC_HashOID(WC_MD5); if (ret == 0) - ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + ERROR_OUT(WC_TEST_RET_ENC_NC, out); #endif #ifndef NO_SHA ret = wc_GetCTC_HashOID(WC_SHA); if (ret == 0) - ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + ERROR_OUT(WC_TEST_RET_ENC_NC, out); #endif #ifdef WOLFSSL_SHA224 ret = wc_GetCTC_HashOID(WC_SHA224); if (ret == 0) - ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + ERROR_OUT(WC_TEST_RET_ENC_NC, out); #endif #ifndef NO_SHA256 ret = wc_GetCTC_HashOID(WC_SHA256); if (ret == 0) - ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + ERROR_OUT(WC_TEST_RET_ENC_NC, out); #endif #ifdef WOLFSSL_SHA384 ret = wc_GetCTC_HashOID(WC_SHA384); if (ret == 0) - ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + ERROR_OUT(WC_TEST_RET_ENC_NC, out); #endif #ifdef WOLFSSL_SHA512 ret = wc_GetCTC_HashOID(WC_SHA512); if (ret == 0) - ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); + ERROR_OUT(WC_TEST_RET_ENC_NC, out); #endif ret = wc_GetCTC_HashOID(-1); if (ret != 0) ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out); #endif + ret = 0; + out: #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) @@ -50504,14 +50506,18 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t cmac_test(void) } #endif +#if !defined(HAVE_FIPS) || FIPS_VERSION3_GE(6,0,0) (void)wc_CmacFree(cmac); +#endif } ret = 0; out: +#if !defined(HAVE_FIPS) || FIPS_VERSION3_GE(6,0,0) (void)wc_CmacFree(cmac); +#endif #if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC) XFREE(cmac, HEAP_HINT, DYNAMIC_TYPE_CMAC); From 29a0992ed58ada8228fc2724b97e60af9c1aecb8 Mon Sep 17 00:00:00 2001 From: Daniel Pouzzner Date: Sat, 22 Mar 2025 22:21:23 -0500 Subject: [PATCH 6/7] wolfssl/wolfcrypt/settings.h: for WOLFCRYPT_FIPS_RAND, don't define USE_FAST_MATH, and make sure NO_BIG_INT is defined. --- wolfssl/wolfcrypt/settings.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/wolfssl/wolfcrypt/settings.h b/wolfssl/wolfcrypt/settings.h index 55b05c18f..6cfd33d46 100644 --- a/wolfssl/wolfcrypt/settings.h +++ b/wolfssl/wolfcrypt/settings.h @@ -2847,6 +2847,10 @@ extern void uITRON4_free(void *p) ; /* default is SP Math. */ #define WOLFSSL_SP_MATH_ALL #endif +#elif defined(WOLFCRYPT_FIPS_RAND) + #ifndef NO_BIG_INT + #define NO_BIG_INT + #endif #else /* FIPS 140-2 or older */ /* Default to fast math (tfm.c), but allow heap math (integer.c) */ From 0cea9c09f7bbee6cb43db9488b4db2c47a4479e2 Mon Sep 17 00:00:00 2001 From: Daniel Pouzzner Date: Sat, 22 Mar 2025 23:51:59 -0500 Subject: [PATCH 7/7] src/internal.c: fix -Wdeclaration-after-statement in ProcessCSR_ex(). --- src/internal.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/internal.c b/src/internal.c index 9a629338a..ac4f56e72 100644 --- a/src/internal.c +++ b/src/internal.c @@ -13814,8 +13814,6 @@ static int ProcessCSR_ex(WOLFSSL* ssl, byte* input, word32* inOutIdx, #if defined(HAVE_CERTIFICATE_STATUS_REQUEST) TLSX* ext = TLSX_Find(ssl->extensions, TLSX_STATUS_REQUEST); CertificateStatusRequest* csr; -#else - (void)idx; #endif #ifdef WOLFSSL_SMALL_STACK CertStatus* status; @@ -13844,6 +13842,8 @@ static int ProcessCSR_ex(WOLFSSL* ssl, byte* input, word32* inOutIdx, ssl->status_request = 0; break; } + #else + (void)idx; #endif #ifdef HAVE_CERTIFICATE_STATUS_REQUEST_V2