diff --git a/wolfcrypt/src/rsa.c b/wolfcrypt/src/rsa.c index 8d1fb10385..d47fa0f437 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) { + /* 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); - 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 */ @@ -5410,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 }