forked from wolfSSL/wolfssl
fix wc_MakeRsaKey and wc_RsaKeyToDer to work with
WOLFSSL_NO_MALLOC
This commit is contained in:
@@ -25937,10 +25937,13 @@ int wc_RsaKeyToDer(RsaKey* key, byte* output, word32 inLen)
|
|||||||
{
|
{
|
||||||
#ifndef WOLFSSL_ASN_TEMPLATE
|
#ifndef WOLFSSL_ASN_TEMPLATE
|
||||||
int ret = 0, i;
|
int ret = 0, i;
|
||||||
|
int mpSz;
|
||||||
|
word32 rawLen;
|
||||||
word32 seqSz = 0, verSz = 0, intTotalLen = 0, outLen = 0;
|
word32 seqSz = 0, verSz = 0, intTotalLen = 0, outLen = 0;
|
||||||
word32 sizes[RSA_INTS];
|
word32 sizes[RSA_INTS];
|
||||||
byte seq[MAX_SEQ_SZ];
|
byte seq[MAX_SEQ_SZ];
|
||||||
byte ver[MAX_VERSION_SZ];
|
byte ver[MAX_VERSION_SZ];
|
||||||
|
mp_int* keyInt;
|
||||||
byte* tmps[RSA_INTS];
|
byte* tmps[RSA_INTS];
|
||||||
|
|
||||||
if (key == NULL)
|
if (key == NULL)
|
||||||
@@ -25949,20 +25952,28 @@ int wc_RsaKeyToDer(RsaKey* key, byte* output, word32 inLen)
|
|||||||
if (key->type != RSA_PRIVATE)
|
if (key->type != RSA_PRIVATE)
|
||||||
return BAD_FUNC_ARG;
|
return BAD_FUNC_ARG;
|
||||||
|
|
||||||
|
XMEMSET(tmps, 0, sizeof(tmps));
|
||||||
|
|
||||||
for (i = 0; i < RSA_INTS; i++)
|
for (i = 0; i < RSA_INTS; i++)
|
||||||
tmps[i] = NULL;
|
tmps[i] = NULL;
|
||||||
|
|
||||||
/* write all big ints from key to DER tmps */
|
/* write all big ints from key to DER tmps */
|
||||||
for (i = 0; i < RSA_INTS; i++) {
|
for (i = 0; i < RSA_INTS; i++) {
|
||||||
mp_int* keyInt = GetRsaInt(key, i);
|
keyInt = GetRsaInt(key, i);
|
||||||
int mpSz;
|
|
||||||
word32 rawLen;
|
|
||||||
|
|
||||||
ret = mp_unsigned_bin_size(keyInt);
|
ret = mp_unsigned_bin_size(keyInt);
|
||||||
if (ret < 0)
|
if (ret < 0) {
|
||||||
|
#ifndef WOLFSSL_NO_MALLOC
|
||||||
|
/* free outstanding tmps */
|
||||||
|
for (i = 0; i < RSA_INTS; i++) {
|
||||||
|
if (tmps[i] != NULL)
|
||||||
|
XFREE(tmps[i]);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
return ret;
|
return ret;
|
||||||
|
}
|
||||||
rawLen = (word32)ret + 1;
|
rawLen = (word32)ret + 1;
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
#ifndef WOLFSSL_NO_MALLOC
|
||||||
if (output != NULL) {
|
if (output != NULL) {
|
||||||
tmps[i] = (byte*)XMALLOC(rawLen + MAX_SEQ_SZ, key->heap,
|
tmps[i] = (byte*)XMALLOC(rawLen + MAX_SEQ_SZ, key->heap,
|
||||||
DYNAMIC_TYPE_RSA);
|
DYNAMIC_TYPE_RSA);
|
||||||
@@ -25971,7 +25982,7 @@ int wc_RsaKeyToDer(RsaKey* key, byte* output, word32 inLen)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
mpSz = SetASNIntMP(keyInt, MAX_RSA_INT_SZ, tmps[i]);
|
mpSz = SetASNIntMP(keyInt, MAX_RSA_INT_SZ, tmps[i]);
|
||||||
if (mpSz < 0) {
|
if (mpSz < 0) {
|
||||||
ret = mpSz;
|
ret = mpSz;
|
||||||
@@ -26004,8 +26015,25 @@ int wc_RsaKeyToDer(RsaKey* key, byte* output, word32 inLen)
|
|||||||
j += verSz;
|
j += verSz;
|
||||||
|
|
||||||
for (i = 0; i < RSA_INTS; i++) {
|
for (i = 0; i < RSA_INTS; i++) {
|
||||||
|
/* copy from tmps if we have malloc, otherwise re-export with buffer */
|
||||||
|
#ifndef WOLFSSL_NO_MALLOC
|
||||||
XMEMCPY(output + j, tmps[i], sizes[i]);
|
XMEMCPY(output + j, tmps[i], sizes[i]);
|
||||||
j += sizes[i];
|
j += sizes[i];
|
||||||
|
#else
|
||||||
|
keyInt = GetRsaInt(key, i);
|
||||||
|
ret = mp_unsigned_bin_size(keyInt);
|
||||||
|
if (ret < 0) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
rawLen = (word32)ret + 1;
|
||||||
|
ret = 0;
|
||||||
|
mpSz = SetASNIntMP(keyInt, MAX_RSA_INT_SZ, output + j);
|
||||||
|
if (mpSz < 0) {
|
||||||
|
ret = mpSz;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
j += mpSz;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -4721,7 +4721,11 @@ int wc_MakeRsaKey(RsaKey* key, int size, long e, WC_RNG* rng)
|
|||||||
#endif /* WOLFSSL_SMALL_STACK */
|
#endif /* WOLFSSL_SMALL_STACK */
|
||||||
int i, failCount, isPrime = 0;
|
int i, failCount, isPrime = 0;
|
||||||
word32 primeSz;
|
word32 primeSz;
|
||||||
|
#ifndef WOLFSSL_NO_MALLOC
|
||||||
byte* buf = NULL;
|
byte* buf = NULL;
|
||||||
|
#else
|
||||||
|
byte buf[RSA_MAX_SIZE/16];
|
||||||
|
#endif
|
||||||
#endif /* !WOLFSSL_CRYPTOCELL && !WOLFSSL_SE050 */
|
#endif /* !WOLFSSL_CRYPTOCELL && !WOLFSSL_SE050 */
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
@@ -4827,12 +4831,14 @@ int wc_MakeRsaKey(RsaKey* key, int size, long e, WC_RNG* rng)
|
|||||||
primeSz = (word32)size / 16; /* size is the size of n in bits.
|
primeSz = (word32)size / 16; /* size is the size of n in bits.
|
||||||
primeSz is in bytes. */
|
primeSz is in bytes. */
|
||||||
|
|
||||||
|
#ifndef WOLFSSL_NO_MALLOC
|
||||||
/* allocate buffer to work with */
|
/* allocate buffer to work with */
|
||||||
if (err == MP_OKAY) {
|
if (err == MP_OKAY) {
|
||||||
buf = (byte*)XMALLOC(primeSz, key->heap, DYNAMIC_TYPE_RSA);
|
buf = (byte*)XMALLOC(primeSz, key->heap, DYNAMIC_TYPE_RSA);
|
||||||
if (buf == NULL)
|
if (buf == NULL)
|
||||||
err = MEMORY_E;
|
err = MEMORY_E;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
SAVE_VECTOR_REGISTERS(err = _svr_ret;);
|
SAVE_VECTOR_REGISTERS(err = _svr_ret;);
|
||||||
|
|
||||||
@@ -4935,10 +4941,12 @@ int wc_MakeRsaKey(RsaKey* key, int size, long e, WC_RNG* rng)
|
|||||||
if (err == MP_OKAY && !isPrime)
|
if (err == MP_OKAY && !isPrime)
|
||||||
err = PRIME_GEN_E;
|
err = PRIME_GEN_E;
|
||||||
|
|
||||||
|
#ifndef WOLFSSL_NO_MALLOC
|
||||||
if (buf) {
|
if (buf) {
|
||||||
ForceZero(buf, primeSz);
|
ForceZero(buf, primeSz);
|
||||||
XFREE(buf, key->heap, DYNAMIC_TYPE_RSA);
|
XFREE(buf, key->heap, DYNAMIC_TYPE_RSA);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (err == MP_OKAY && mp_cmp(p, q) < 0) {
|
if (err == MP_OKAY && mp_cmp(p, q) < 0) {
|
||||||
err = mp_copy(p, tmp1);
|
err = mp_copy(p, tmp1);
|
||||||
|
Reference in New Issue
Block a user