From 9062b98319fa8a386da846fbc19a053dd6fc1aee Mon Sep 17 00:00:00 2001 From: Eric Blankenhorn Date: Thu, 5 Mar 2026 15:25:29 -0600 Subject: [PATCH 1/3] Fix f284 harden wc_FreeRsaKey --- wolfcrypt/src/rsa.c | 28 +++++++++------------------- 1 file changed, 9 insertions(+), 19 deletions(-) diff --git a/wolfcrypt/src/rsa.c b/wolfcrypt/src/rsa.c index 8d1fb103858..ab40a6efa95 100644 --- a/wolfcrypt/src/rsa.c +++ b/wolfcrypt/src/rsa.c @@ -564,27 +564,17 @@ int wc_FreeRsaKey(RsaKey* key) #endif #ifndef WOLFSSL_RSA_PUBLIC_ONLY - if (key->type == RSA_PRIVATE) { + /* Always forcezero private key fields, since they may contain residual + * sensitive data even when key->type is not RSA_PRIVATE (e.g., after a + * partial key decode failure). */ #if defined(WOLFSSL_KEY_GEN) || defined(OPENSSL_EXTRA) || !defined(RSA_LOW_MEM) - mp_forcezero(&key->u); - mp_forcezero(&key->dQ); - mp_forcezero(&key->dP); + mp_forcezero(&key->u); + mp_forcezero(&key->dQ); + mp_forcezero(&key->dP); #endif - mp_forcezero(&key->q); - mp_forcezero(&key->p); - mp_forcezero(&key->d); - } - else { - /* private part */ -#if defined(WOLFSSL_KEY_GEN) || defined(OPENSSL_EXTRA) || !defined(RSA_LOW_MEM) - mp_clear(&key->u); - mp_clear(&key->dQ); - mp_clear(&key->dP); -#endif - mp_clear(&key->q); - mp_clear(&key->p); - mp_clear(&key->d); - } + mp_forcezero(&key->q); + mp_forcezero(&key->p); + mp_forcezero(&key->d); #endif /* WOLFSSL_RSA_PUBLIC_ONLY */ /* public part */ From b03a732d92c3be35401b843a1a8cea31728e84ff Mon Sep 17 00:00:00 2001 From: Eric Blankenhorn Date: Thu, 5 Mar 2026 15:27:05 -0600 Subject: [PATCH 2/3] Fix f285 harden wc_RsaPrivateKeyDecodeRaw --- wolfcrypt/src/rsa.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/wolfcrypt/src/rsa.c b/wolfcrypt/src/rsa.c index ab40a6efa95..1c3302a78ef 100644 --- a/wolfcrypt/src/rsa.c +++ b/wolfcrypt/src/rsa.c @@ -5400,13 +5400,13 @@ int wc_RsaPrivateKeyDecodeRaw(const byte* n, word32 nSz, else if (key != NULL) { mp_clear(&key->n); mp_clear(&key->e); - mp_clear(&key->d); - mp_clear(&key->p); - mp_clear(&key->q); + mp_forcezero(&key->d); + mp_forcezero(&key->p); + mp_forcezero(&key->q); #if defined(WOLFSSL_KEY_GEN) || defined(OPENSSL_EXTRA) || !defined(RSA_LOW_MEM) - mp_clear(&key->u); - mp_clear(&key->dP); - mp_clear(&key->dQ); + mp_forcezero(&key->u); + mp_forcezero(&key->dP); + mp_forcezero(&key->dQ); #endif } From c0a4b94cb7019fb035ec5b02077ae39d69173b43 Mon Sep 17 00:00:00 2001 From: Eric Blankenhorn Date: Thu, 5 Mar 2026 15:39:20 -0600 Subject: [PATCH 3/3] Fix from review --- wolfcrypt/src/rsa.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/wolfcrypt/src/rsa.c b/wolfcrypt/src/rsa.c index 1c3302a78ef..d47fa0f4378 100644 --- a/wolfcrypt/src/rsa.c +++ b/wolfcrypt/src/rsa.c @@ -564,9 +564,9 @@ int wc_FreeRsaKey(RsaKey* key) #endif #ifndef WOLFSSL_RSA_PUBLIC_ONLY - /* Always forcezero private key fields, since they may contain residual - * sensitive data even when key->type is not RSA_PRIVATE (e.g., after a - * partial key decode failure). */ + /* Forcezero all private key fields that are present in this build + * configuration, since they may contain residual sensitive data even when + * key->type is not RSA_PRIVATE (e.g., after a partial key decode failure). */ #if defined(WOLFSSL_KEY_GEN) || defined(OPENSSL_EXTRA) || !defined(RSA_LOW_MEM) mp_forcezero(&key->u); mp_forcezero(&key->dQ);