Skip to content

Commit 4170d1a

Browse files
committed
backport b2ef89b, cd88a8a, and b66f1b7 to wolfcrypt/src/rsa.c and wolfssl/wolfcrypt/rsa.h: make RsaKey.rng and wc_RsaSetRNG() available unconditionally, rather than only if WC_RSA_BLINDING, for use by wc_CheckRsaKey().
1 parent 72bf78b commit 4170d1a

2 files changed

Lines changed: 40 additions & 22 deletions

File tree

wolfcrypt/src/rsa.c

Lines changed: 38 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ int wc_InitRsaKey_ex(RsaKey* key, void* heap, int devId)
273273
key->data = NULL;
274274
#endif
275275
key->dataLen = 0;
276-
#ifdef WC_RSA_BLINDING
276+
#ifndef WC_NO_RNG
277277
key->rng = NULL;
278278
#endif
279279

@@ -677,25 +677,44 @@ int wc_CheckRsaKey(RsaKey* key)
677677
#endif
678678
#ifdef WOLFSSL_SMALL_STACK
679679
mp_int *tmp = NULL;
680-
WC_RNG *rng = NULL;
681680
#else
682681
mp_int tmp[1];
683-
WC_RNG rng[1];
682+
WC_RNG rng_buf;
684683
#endif
684+
WC_RNG *rng = NULL;
685685
int ret = 0;
686686

687+
if (key == NULL)
688+
return BAD_FUNC_ARG;
689+
687690
#ifdef WOLFSSL_SMALL_STACK
688-
rng = (WC_RNG*)XMALLOC(sizeof(WC_RNG), NULL, DYNAMIC_TYPE_RNG);
689-
if (rng != NULL)
690-
tmp = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_RSA);
691-
if (rng == NULL || tmp == NULL) {
692-
XFREE(rng, NULL, DYNAMIC_TYPE_RNG);
693-
XFREE(tmp, NULL, DYNAMIC_TYPE_RSA);
691+
tmp = (mp_int*)XMALLOC(sizeof(mp_int), NULL, DYNAMIC_TYPE_RSA);
692+
if (tmp == NULL) {
694693
return MEMORY_E;
695694
}
696695
#endif
697696

698-
ret = wc_InitRng(rng);
697+
if (key->rng)
698+
rng = key->rng;
699+
else {
700+
#ifdef WOLFSSL_SMALL_STACK
701+
rng = (WC_RNG *)XMALLOC(sizeof(*rng), NULL, DYNAMIC_TYPE_RNG);
702+
if (rng == NULL) {
703+
XFREE(tmp, NULL, DYNAMIC_TYPE_RSA);
704+
return MEMORY_E;
705+
}
706+
#else
707+
rng = &rng_buf;
708+
#endif
709+
ret = wc_InitRng(rng);
710+
if (ret != 0) {
711+
#ifdef WOLFSSL_SMALL_STACK
712+
XFREE(tmp, NULL, DYNAMIC_TYPE_RSA);
713+
XFREE(rng, NULL, DYNAMIC_TYPE_RNG);
714+
#endif
715+
return ret;
716+
}
717+
}
699718

700719
if (ret == 0)
701720
SAVE_VECTOR_REGISTERS(ret = _svr_ret;);
@@ -705,11 +724,6 @@ int wc_CheckRsaKey(RsaKey* key)
705724
ret = MP_INIT_E;
706725
}
707726

708-
if (ret == 0) {
709-
if (key == NULL)
710-
ret = BAD_FUNC_ARG;
711-
}
712-
713727
if (ret == 0)
714728
ret = _ifc_pairwise_consistency_test(key, rng);
715729

@@ -801,10 +815,15 @@ int wc_CheckRsaKey(RsaKey* key)
801815

802816
RESTORE_VECTOR_REGISTERS();
803817

804-
wc_FreeRng(rng);
818+
if ((rng != NULL) && (rng != key->rng)) {
819+
wc_FreeRng(rng);
820+
#ifdef WOLFSSL_SMALL_STACK
821+
XFREE(rng, NULL, DYNAMIC_TYPE_RNG);
822+
#endif
823+
}
824+
805825
#ifdef WOLFSSL_SMALL_STACK
806826
XFREE(tmp, NULL, DYNAMIC_TYPE_RSA);
807-
XFREE(rng, NULL, DYNAMIC_TYPE_RNG);
808827
#endif
809828

810829
return ret;
@@ -4685,8 +4704,7 @@ int wc_MakeRsaKey(RsaKey* key, int size, long e, WC_RNG* rng)
46854704
#endif /* !FIPS || FIPS_VER >= 2 */
46864705
#endif /* WOLFSSL_KEY_GEN */
46874706

4688-
4689-
#ifdef WC_RSA_BLINDING
4707+
#ifndef WC_NO_RNG
46904708
int wc_RsaSetRNG(RsaKey* key, WC_RNG* rng)
46914709
{
46924710
if (key == NULL || rng == NULL)
@@ -4696,7 +4714,7 @@ int wc_RsaSetRNG(RsaKey* key, WC_RNG* rng)
46964714

46974715
return 0;
46984716
}
4699-
#endif /* WC_RSA_BLINDING */
4717+
#endif /* !WC_NO_RNG */
47004718

47014719
#ifdef WC_RSA_NONBLOCK
47024720
int wc_RsaSetNonBlock(RsaKey* key, RsaNb* nb)

wolfssl/wolfcrypt/rsa.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ struct RsaKey {
175175
int type; /* public or private */
176176
int state;
177177
word32 dataLen;
178-
#ifdef WC_RSA_BLINDING
178+
#ifndef WC_NO_RNG
179179
WC_RNG* rng; /* for PrivateDecrypt blinding */
180180
#endif
181181
#ifdef WOLF_CRYPTO_CB
@@ -313,7 +313,7 @@ WOLFSSL_API int wc_RsaPublicKeyDecodeRaw(const byte* n, word32 nSz,
313313
WOLFSSL_API int wc_RsaKeyToDer(RsaKey*, byte* output, word32 inLen);
314314
#endif
315315

316-
#ifdef WC_RSA_BLINDING
316+
#ifndef WC_NO_RNG
317317
WOLFSSL_API int wc_RsaSetRNG(RsaKey* key, WC_RNG* rng);
318318
#endif
319319
#ifdef WC_RSA_NONBLOCK

0 commit comments

Comments
 (0)