Skip to content

Commit d930825

Browse files
authored
Merge pull request #7362 from jpbland1/rsa-make-key-no-malloc
fix wc_MakeRsaKey and wc_RsaKeyToDer to work with WOLFSSL_NO_MALLOC
2 parents 03d7eac + d8e9e90 commit d930825

5 files changed

Lines changed: 96 additions & 8 deletions

File tree

.github/workflows/main.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,4 +52,5 @@ jobs:
5252
# uses: ./.github/workflows/haproxy.yml
5353
ocsp:
5454
uses: ./.github/workflows/ocsp.yml
55-
55+
no-malloc:
56+
uses: ./.github/workflows/no-malloc.yml

.github/workflows/no-malloc.yml

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
name: No Malloc Tests
2+
3+
on:
4+
workflow_call:
5+
6+
jobs:
7+
make_check:
8+
strategy:
9+
matrix:
10+
config: [
11+
# Add new configs here
12+
'--enable-rsa --enable-keygen --disable-dh CFLAGS="-DWOLFSSL_NO_MALLOC"',
13+
]
14+
name: make check
15+
runs-on: ubuntu-latest
16+
# This should be a safe limit for the tests to run.
17+
timeout-minutes: 6
18+
steps:
19+
- uses: actions/checkout@v4
20+
name: Checkout wolfSSL
21+
22+
- name: Test wolfSSL
23+
run: |
24+
./autogen.sh
25+
./configure ${{ matrix.config }}
26+
make
27+
./wolfcrypt/test/testwolfcrypt
28+
29+
- name: Print errors
30+
if: ${{ failure() }}
31+
run: |
32+
if [ -f test-suite.log ] ; then
33+
cat test-suite.log
34+
fi

wolfcrypt/src/asn.c

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25937,30 +25937,35 @@ int wc_RsaKeyToDer(RsaKey* key, byte* output, word32 inLen)
2593725937
{
2593825938
#ifndef WOLFSSL_ASN_TEMPLATE
2593925939
int ret = 0, i;
25940+
int mpSz;
2594025941
word32 seqSz = 0, verSz = 0, intTotalLen = 0, outLen = 0;
2594125942
word32 sizes[RSA_INTS];
2594225943
byte seq[MAX_SEQ_SZ];
2594325944
byte ver[MAX_VERSION_SZ];
25945+
mp_int* keyInt;
25946+
#ifndef WOLFSSL_NO_MALLOC
25947+
word32 rawLen;
2594425948
byte* tmps[RSA_INTS];
25949+
#endif
2594525950

2594625951
if (key == NULL)
2594725952
return BAD_FUNC_ARG;
2594825953

2594925954
if (key->type != RSA_PRIVATE)
2595025955
return BAD_FUNC_ARG;
2595125956

25957+
#ifndef WOLFSSL_NO_MALLOC
2595225958
for (i = 0; i < RSA_INTS; i++)
2595325959
tmps[i] = NULL;
25960+
#endif
2595425961

2595525962
/* write all big ints from key to DER tmps */
2595625963
for (i = 0; i < RSA_INTS; i++) {
25957-
mp_int* keyInt = GetRsaInt(key, i);
25958-
int mpSz;
25959-
word32 rawLen;
25960-
25964+
keyInt = GetRsaInt(key, i);
2596125965
ret = mp_unsigned_bin_size(keyInt);
2596225966
if (ret < 0)
25963-
return ret;
25967+
break;
25968+
#ifndef WOLFSSL_NO_MALLOC
2596425969
rawLen = (word32)ret + 1;
2596525970
ret = 0;
2596625971
if (output != NULL) {
@@ -25971,8 +25976,11 @@ int wc_RsaKeyToDer(RsaKey* key, byte* output, word32 inLen)
2597125976
break;
2597225977
}
2597325978
}
25974-
2597525979
mpSz = SetASNIntMP(keyInt, MAX_RSA_INT_SZ, tmps[i]);
25980+
#else
25981+
ret = 0;
25982+
mpSz = SetASNIntMP(keyInt, MAX_RSA_INT_SZ, NULL);
25983+
#endif
2597625984
if (mpSz < 0) {
2597725985
ret = mpSz;
2597825986
break;
@@ -26004,15 +26012,33 @@ int wc_RsaKeyToDer(RsaKey* key, byte* output, word32 inLen)
2600426012
j += verSz;
2600526013

2600626014
for (i = 0; i < RSA_INTS; i++) {
26015+
/* copy from tmps if we have malloc, otherwise re-export with buffer */
26016+
#ifndef WOLFSSL_NO_MALLOC
2600726017
XMEMCPY(output + j, tmps[i], sizes[i]);
2600826018
j += sizes[i];
26019+
#else
26020+
keyInt = GetRsaInt(key, i);
26021+
ret = mp_unsigned_bin_size(keyInt);
26022+
if (ret < 0)
26023+
break;
26024+
ret = 0;
26025+
/* This won't overrun output due to the outLen check above */
26026+
mpSz = SetASNIntMP(keyInt, MAX_RSA_INT_SZ, output + j);
26027+
if (mpSz < 0) {
26028+
ret = mpSz;
26029+
break;
26030+
}
26031+
j += mpSz;
26032+
#endif
2600926033
}
2601026034
}
2601126035

26036+
#ifndef WOLFSSL_NO_MALLOC
2601226037
for (i = 0; i < RSA_INTS; i++) {
2601326038
if (tmps[i])
2601426039
XFREE(tmps[i], key->heap, DYNAMIC_TYPE_RSA);
2601526040
}
26041+
#endif
2601626042

2601726043
if (ret == 0)
2601826044
ret = (int)outLen;

wolfcrypt/src/rsa.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4721,7 +4721,12 @@ int wc_MakeRsaKey(RsaKey* key, int size, long e, WC_RNG* rng)
47214721
#endif /* WOLFSSL_SMALL_STACK */
47224722
int i, failCount, isPrime = 0;
47234723
word32 primeSz;
4724+
#ifndef WOLFSSL_NO_MALLOC
47244725
byte* buf = NULL;
4726+
#else
4727+
/* RSA_MAX_SIZE is the size of n in bits. */
4728+
byte buf[RSA_MAX_SIZE/16];
4729+
#endif
47254730
#endif /* !WOLFSSL_CRYPTOCELL && !WOLFSSL_SE050 */
47264731
int err;
47274732

@@ -4827,12 +4832,14 @@ int wc_MakeRsaKey(RsaKey* key, int size, long e, WC_RNG* rng)
48274832
primeSz = (word32)size / 16; /* size is the size of n in bits.
48284833
primeSz is in bytes. */
48294834

4835+
#ifndef WOLFSSL_NO_MALLOC
48304836
/* allocate buffer to work with */
48314837
if (err == MP_OKAY) {
48324838
buf = (byte*)XMALLOC(primeSz, key->heap, DYNAMIC_TYPE_RSA);
48334839
if (buf == NULL)
48344840
err = MEMORY_E;
48354841
}
4842+
#endif
48364843

48374844
SAVE_VECTOR_REGISTERS(err = _svr_ret;);
48384845

@@ -4935,10 +4942,14 @@ int wc_MakeRsaKey(RsaKey* key, int size, long e, WC_RNG* rng)
49354942
if (err == MP_OKAY && !isPrime)
49364943
err = PRIME_GEN_E;
49374944

4945+
#ifndef WOLFSSL_NO_MALLOC
49384946
if (buf) {
49394947
ForceZero(buf, primeSz);
49404948
XFREE(buf, key->heap, DYNAMIC_TYPE_RSA);
49414949
}
4950+
#else
4951+
ForceZero(buf, primeSz);
4952+
#endif
49424953

49434954
if (err == MP_OKAY && mp_cmp(p, q) < 0) {
49444955
err = mp_copy(p, tmp1);

wolfcrypt/test/test.c

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2125,18 +2125,27 @@ static wc_test_ret_t _SaveDerAndPem(const byte* der, int derSz,
21252125
#if !defined(NO_FILESYSTEM) && !defined(NO_WRITE_TEMP_FILES)
21262126
XFILE pemFile;
21272127
#endif
2128+
#ifndef WOLFSSL_NO_MALLOC
21282129
byte* pem;
2130+
#else
2131+
byte pem[1024];
2132+
#endif
21292133
int pemSz;
21302134

21312135
/* calculate PEM size */
21322136
pemSz = wc_DerToPem(der, derSz, NULL, 0, pemType);
21332137
if (pemSz < 0) {
21342138
return WC_TEST_RET_ENC(calling_line, 2, WC_TEST_RET_TAG_I);
21352139
}
2140+
#ifndef WOLFSSL_NO_MALLOC
21362141
pem = (byte*)XMALLOC(pemSz, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER);
21372142
if (pem == NULL) {
21382143
return WC_TEST_RET_ENC(calling_line, 3, WC_TEST_RET_TAG_I);
21392144
}
2145+
#else
2146+
if (pemSz > (int)sizeof(pem))
2147+
return BAD_FUNC_ARG;
2148+
#endif
21402149
/* Convert to PEM */
21412150
pemSz = wc_DerToPem(der, derSz, pem, pemSz, pemType);
21422151
if (pemSz < 0) {
@@ -19001,7 +19010,11 @@ static wc_test_ret_t rsa_keygen_test(WC_RNG* rng)
1900119010
RsaKey genKey[1];
1900219011
#endif
1900319012
wc_test_ret_t ret;
19013+
#ifndef WOLFSSL_NO_MALLOC
1900419014
byte* der = NULL;
19015+
#else
19016+
byte der[1024];
19017+
#endif
1900519018
#ifndef WOLFSSL_CRYPTOCELL
1900619019
word32 idx = 0;
1900719020
#endif
@@ -19046,11 +19059,12 @@ static wc_test_ret_t rsa_keygen_test(WC_RNG* rng)
1904619059
if (ret != 0)
1904719060
ERROR_OUT(WC_TEST_RET_ENC_EC(ret), exit_rsa);
1904819061
#endif
19062+
#ifndef WOLFSSL_NO_MALLOC
1904919063
der = (byte*)XMALLOC(FOURK_BUF, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER);
1905019064
if (der == NULL) {
1905119065
ERROR_OUT(WC_TEST_RET_ENC_ERRNO, exit_rsa);
1905219066
}
19053-
19067+
#endif
1905419068
derSz = wc_RsaKeyToDer(genKey, der, FOURK_BUF);
1905519069
if (derSz < 0) {
1905619070
ERROR_OUT(WC_TEST_RET_ENC_EC(derSz), exit_rsa);
@@ -19086,10 +19100,12 @@ static wc_test_ret_t rsa_keygen_test(WC_RNG* rng)
1908619100
wc_FreeRsaKey(genKey);
1908719101
#endif
1908819102

19103+
#ifndef WOLFSSL_NO_MALLOC
1908919104
if (der != NULL) {
1909019105
XFREE(der, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER);
1909119106
der = NULL;
1909219107
}
19108+
#endif
1909319109

1909419110
return ret;
1909519111
}

0 commit comments

Comments
 (0)