Skip to content

Commit 43f4ba9

Browse files
authored
Merge pull request #7608 from ejohnstown/rsa-add
Import Raw RSA Private Key
2 parents 4140a05 + e8e6eae commit 43f4ba9

3 files changed

Lines changed: 206 additions & 0 deletions

File tree

tests/api.c

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19712,6 +19712,104 @@ static int test_wc_RsaPublicKeyDecodeRaw(void)
1971219712
} /* END test_wc_RsaPublicKeyDecodeRaw */
1971319713

1971419714

19715+
/*
19716+
* Testing wc_RsaPrivateKeyDecodeRaw()
19717+
*/
19718+
static int test_wc_RsaPrivateKeyDecodeRaw(void)
19719+
{
19720+
EXPECT_DECLS;
19721+
#if !defined(NO_RSA) && !defined(WOLFSSL_RSA_PUBLIC_ONLY) \
19722+
&& !defined(HAVE_SELFTEST) && !defined(HAVE_FIPS)
19723+
RsaKey key;
19724+
const byte n = 33;
19725+
const byte e = 3;
19726+
const byte d = 7;
19727+
const byte u = 2;
19728+
const byte p = 3;
19729+
const byte q = 11;
19730+
const byte dp = 1;
19731+
const byte dq = 7;
19732+
19733+
ExpectIntEQ(wc_InitRsaKey(&key, HEAP_HINT), 0);
19734+
ExpectIntEQ(wc_RsaPrivateKeyDecodeRaw(&n, sizeof(n),
19735+
&e, sizeof(e), &d, sizeof(d), &u, sizeof(u),
19736+
&p, sizeof(p), &q, sizeof(q), NULL, 0,
19737+
NULL, 0, &key), 0);
19738+
ExpectIntEQ(wc_RsaPrivateKeyDecodeRaw(&n, sizeof(n),
19739+
&e, sizeof(e), &d, sizeof(d), &u, sizeof(u),
19740+
&p, sizeof(p), &q, sizeof(q), &dp, sizeof(dp),
19741+
NULL, 0, &key), 0);
19742+
ExpectIntEQ(wc_RsaPrivateKeyDecodeRaw(&n, sizeof(n),
19743+
&e, sizeof(e), &d, sizeof(d), &u, sizeof(u),
19744+
&p, sizeof(p), &q, sizeof(q), NULL, 0,
19745+
&dq, sizeof(dq), &key), 0);
19746+
ExpectIntEQ(wc_RsaPrivateKeyDecodeRaw(&n, sizeof(n),
19747+
&e, sizeof(e), &d, sizeof(d), &u, sizeof(u),
19748+
&p, sizeof(p), &q, sizeof(q), &dp, sizeof(dp),
19749+
&dq, sizeof(dq), &key), 0);
19750+
19751+
/* Pass in bad args. */
19752+
ExpectIntEQ(wc_RsaPrivateKeyDecodeRaw(NULL, sizeof(n),
19753+
&e, sizeof(e), &d, sizeof(d), &u, sizeof(u),
19754+
&p, sizeof(p), &q, sizeof(q), &dp, sizeof(dp),
19755+
&dq, sizeof(dq), &key), BAD_FUNC_ARG);
19756+
ExpectIntEQ(wc_RsaPrivateKeyDecodeRaw(&n, 0,
19757+
&e, sizeof(e), &d, sizeof(d), &u, sizeof(u),
19758+
&p, sizeof(p), &q, sizeof(q), &dp, sizeof(dp),
19759+
&dq, sizeof(dq), &key), BAD_FUNC_ARG);
19760+
ExpectIntEQ(wc_RsaPrivateKeyDecodeRaw(&n, sizeof(n),
19761+
NULL, sizeof(e), &d, sizeof(d), &u, sizeof(u),
19762+
&p, sizeof(p), &q, sizeof(q), &dp, sizeof(dp),
19763+
&dq, sizeof(dq), &key), BAD_FUNC_ARG);
19764+
ExpectIntEQ(wc_RsaPrivateKeyDecodeRaw(&n, sizeof(n),
19765+
&e, 0, &d, sizeof(d), &u, sizeof(u),
19766+
&p, sizeof(p), &q, sizeof(q), &dp, sizeof(dp),
19767+
&dq, sizeof(dq), &key), BAD_FUNC_ARG);
19768+
ExpectIntEQ(wc_RsaPrivateKeyDecodeRaw(&n, sizeof(n),
19769+
&e, sizeof(e), NULL, sizeof(d), &u, sizeof(u),
19770+
&p, sizeof(p), &q, sizeof(q), &dp, sizeof(dp),
19771+
&dq, sizeof(dq), &key), BAD_FUNC_ARG);
19772+
ExpectIntEQ(wc_RsaPrivateKeyDecodeRaw(&n, sizeof(n),
19773+
&e, sizeof(e), &d, 0, &u, sizeof(u),
19774+
&p, sizeof(p), &q, sizeof(q), &dp, sizeof(dp),
19775+
&dq, sizeof(dq), &key), BAD_FUNC_ARG);
19776+
ExpectIntEQ(wc_RsaPrivateKeyDecodeRaw(&n, sizeof(n),
19777+
&e, sizeof(e), &d, sizeof(d), &u, sizeof(u),
19778+
NULL, sizeof(p), &q, sizeof(q), &dp, sizeof(dp),
19779+
&dq, sizeof(dq), &key), BAD_FUNC_ARG);
19780+
ExpectIntEQ(wc_RsaPrivateKeyDecodeRaw(&n, sizeof(n),
19781+
&e, sizeof(e), &d, sizeof(d), &u, sizeof(u),
19782+
&p, 0, &q, sizeof(q), &dp, sizeof(dp),
19783+
&dq, sizeof(dq), &key), BAD_FUNC_ARG);
19784+
ExpectIntEQ(wc_RsaPrivateKeyDecodeRaw(&n, sizeof(n),
19785+
&e, sizeof(e), &d, sizeof(d), &u, sizeof(u),
19786+
&p, sizeof(p), NULL, sizeof(q), &dp, sizeof(dp),
19787+
&dq, sizeof(dq), &key), BAD_FUNC_ARG);
19788+
ExpectIntEQ(wc_RsaPrivateKeyDecodeRaw(&n, sizeof(n),
19789+
&e, sizeof(e), &d, sizeof(d), &u, sizeof(u),
19790+
&p, sizeof(p), &q, 0, &dp, sizeof(dp),
19791+
&dq, sizeof(dq), &key), BAD_FUNC_ARG);
19792+
#if defined(WOLFSSL_KEY_GEN) || defined(OPENSSL_EXTRA) || !defined(RSA_LOW_MEM)
19793+
ExpectIntEQ(wc_RsaPrivateKeyDecodeRaw(&n, sizeof(n),
19794+
&e, sizeof(e), &d, sizeof(d), &u, 0,
19795+
&p, sizeof(p), &q, sizeof(q), &dp, sizeof(dp),
19796+
&dq, sizeof(dq), &key), BAD_FUNC_ARG);
19797+
ExpectIntEQ(wc_RsaPrivateKeyDecodeRaw(&n, sizeof(n),
19798+
&e, sizeof(e), &d, sizeof(d), NULL, sizeof(u),
19799+
&p, sizeof(p), &q, sizeof(q), &dp, sizeof(dp),
19800+
&dq, sizeof(dq), &key), BAD_FUNC_ARG);
19801+
ExpectIntEQ(wc_RsaPrivateKeyDecodeRaw(&n, sizeof(n),
19802+
&e, sizeof(e), &d, sizeof(d), &u, 0,
19803+
&p, sizeof(p), &q, sizeof(q), &dp, sizeof(dp),
19804+
&dq, sizeof(dq), &key), BAD_FUNC_ARG);
19805+
#endif
19806+
19807+
DoExpectIntEQ(wc_FreeRsaKey(&key), 0);
19808+
#endif
19809+
return EXPECT_RESULT();
19810+
} /* END test_wc_RsaPrivateKeyDecodeRaw */
19811+
19812+
1971519813
#if !defined(NO_RSA) && defined(WOLFSSL_KEY_GEN)
1971619814
/* In FIPS builds, wc_MakeRsaKey() will return an error if it cannot find
1971719815
* a probable prime in 5*(modLen/2) attempts. In non-FIPS builds, it keeps
@@ -72426,6 +72524,7 @@ TEST_CASE testCases[] = {
7242672524
TEST_DECL(test_wc_RsaPrivateKeyDecode),
7242772525
TEST_DECL(test_wc_RsaPublicKeyDecode),
7242872526
TEST_DECL(test_wc_RsaPublicKeyDecodeRaw),
72527+
TEST_DECL(test_wc_RsaPrivateKeyDecodeRaw),
7242972528
TEST_DECL(test_wc_MakeRsaKey),
7243072529
TEST_DECL(test_wc_CheckProbablePrime),
7243172530
TEST_DECL(test_wc_RsaPSS_Verify),

wolfcrypt/src/rsa.c

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5148,4 +5148,105 @@ int wc_RsaSetNonBlockTime(RsaKey* key, word32 maxBlockUs, word32 cpuMHz)
51485148
#endif /* WC_RSA_NONBLOCK_TIME */
51495149
#endif /* WC_RSA_NONBLOCK */
51505150

5151+
#ifndef WOLFSSL_RSA_PUBLIC_ONLY
5152+
5153+
#if defined(WOLFSSL_KEY_GEN) || defined(OPENSSL_EXTRA) || !defined(RSA_LOW_MEM)
5154+
/*
5155+
* Calculate y = d mod(x-1)
5156+
*/
5157+
static int CalcDX(mp_int* y, mp_int* x, mp_int* d)
5158+
{
5159+
mp_int m;
5160+
int err;
5161+
5162+
err = mp_init(&m);
5163+
if (err == MP_OKAY) {
5164+
err = mp_sub_d(x, 1, &m);
5165+
if (err == MP_OKAY)
5166+
err = mp_mod(d, &m, y);
5167+
mp_forcezero(&m);
5168+
}
5169+
5170+
return err;
5171+
}
5172+
#endif
5173+
5174+
int wc_RsaPrivateKeyDecodeRaw(const byte* n, word32 nSz,
5175+
const byte* e, word32 eSz, const byte* d, word32 dSz,
5176+
const byte* u, word32 uSz, const byte* p, word32 pSz,
5177+
const byte* q, word32 qSz, const byte* dP, word32 dPSz,
5178+
const byte* dQ, word32 dQSz, RsaKey* key)
5179+
{
5180+
int err = MP_OKAY;
5181+
5182+
if (n == NULL || nSz == 0 || e == NULL || eSz == 0
5183+
|| d == NULL || dSz == 0 || p == NULL || pSz == 0
5184+
|| q == NULL || qSz == 0 || key == NULL) {
5185+
err = BAD_FUNC_ARG;
5186+
}
5187+
5188+
#if defined(WOLFSSL_KEY_GEN) || defined(OPENSSL_EXTRA) || !defined(RSA_LOW_MEM)
5189+
if (err == MP_OKAY) {
5190+
if ((u == NULL || uSz == 0)
5191+
|| (dP != NULL && dPSz == 0)
5192+
|| (dQ != NULL && dQSz == 0)) {
5193+
err = BAD_FUNC_ARG;
5194+
}
5195+
}
5196+
#else
5197+
(void)u;
5198+
(void)uSz;
5199+
(void)dP;
5200+
(void)dPSz;
5201+
(void)dQ;
5202+
(void)dQSz;
5203+
#endif
5204+
5205+
if (err == MP_OKAY)
5206+
err = mp_read_unsigned_bin(&key->n, n, nSz);
5207+
if (err == MP_OKAY)
5208+
err = mp_read_unsigned_bin(&key->e, e, eSz);
5209+
if (err == MP_OKAY)
5210+
err = mp_read_unsigned_bin(&key->d, d, dSz);
5211+
if (err == MP_OKAY)
5212+
err = mp_read_unsigned_bin(&key->p, p, pSz);
5213+
if (err == MP_OKAY)
5214+
err = mp_read_unsigned_bin(&key->q, q, qSz);
5215+
#if defined(WOLFSSL_KEY_GEN) || defined(OPENSSL_EXTRA) || !defined(RSA_LOW_MEM)
5216+
if (err == MP_OKAY)
5217+
err = mp_read_unsigned_bin(&key->u, u, uSz);
5218+
if (err == MP_OKAY) {
5219+
if (dP != NULL)
5220+
err = mp_read_unsigned_bin(&key->dP, dP, dPSz);
5221+
else
5222+
err = CalcDX(&key->dP, &key->p, &key->d);
5223+
}
5224+
if (err == MP_OKAY) {
5225+
if (dQ != NULL)
5226+
err = mp_read_unsigned_bin(&key->dQ, dQ, dQSz);
5227+
else
5228+
err = CalcDX(&key->dQ, &key->q, &key->d);
5229+
}
5230+
#endif
5231+
5232+
if (err == MP_OKAY) {
5233+
key->type = RSA_PRIVATE;
5234+
}
5235+
else {
5236+
mp_clear(&key->n);
5237+
mp_clear(&key->e);
5238+
mp_clear(&key->d);
5239+
mp_clear(&key->p);
5240+
mp_clear(&key->q);
5241+
#if defined(WOLFSSL_KEY_GEN) || defined(OPENSSL_EXTRA) || !defined(RSA_LOW_MEM)
5242+
mp_clear(&key->u);
5243+
mp_clear(&key->dP);
5244+
mp_clear(&key->dQ);
5245+
#endif
5246+
}
5247+
5248+
return err;
5249+
}
5250+
#endif /* WOLFSSL_RSA_PUBLIC_ONLY */
5251+
51515252
#endif /* NO_RSA */

wolfssl/wolfcrypt/rsa.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,12 @@ WOLFSSL_LOCAL int wc_hash2mgf(enum wc_HashType hType);
454454
WOLFSSL_LOCAL int RsaFunctionCheckIn(const byte* in, word32 inLen, RsaKey* key,
455455
int checkSmallCt);
456456

457+
WOLFSSL_API int wc_RsaPrivateKeyDecodeRaw(const byte* n, word32 nSz,
458+
const byte* e, word32 eSz, const byte* d, word32 dSz,
459+
const byte* u, word32 uSz, const byte* p, word32 pSz,
460+
const byte* q, word32 qSz, const byte* dP, word32 dPSz,
461+
const byte* dQ, word32 dQSz, RsaKey* key);
462+
457463
#ifdef __cplusplus
458464
} /* extern "C" */
459465
#endif

0 commit comments

Comments
 (0)