diff --git a/wolfcrypt/src/rsa.c b/wolfcrypt/src/rsa.c index 8d1fb10385..ab40a6efa9 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 */