forked from wolfSSL/wolfssl
Merge pull request #7362 from jpbland1/rsa-make-key-no-malloc
fix wc_MakeRsaKey and wc_RsaKeyToDer to work with WOLFSSL_NO_MALLOC
This commit is contained in:
3
.github/workflows/main.yml
vendored
3
.github/workflows/main.yml
vendored
@ -52,4 +52,5 @@ jobs:
|
|||||||
# uses: ./.github/workflows/haproxy.yml
|
# uses: ./.github/workflows/haproxy.yml
|
||||||
ocsp:
|
ocsp:
|
||||||
uses: ./.github/workflows/ocsp.yml
|
uses: ./.github/workflows/ocsp.yml
|
||||||
|
no-malloc:
|
||||||
|
uses: ./.github/workflows/no-malloc.yml
|
||||||
|
34
.github/workflows/no-malloc.yml
vendored
Normal file
34
.github/workflows/no-malloc.yml
vendored
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
name: No Malloc Tests
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
make_check:
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
config: [
|
||||||
|
# Add new configs here
|
||||||
|
'--enable-rsa --enable-keygen --disable-dh CFLAGS="-DWOLFSSL_NO_MALLOC"',
|
||||||
|
]
|
||||||
|
name: make check
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
# This should be a safe limit for the tests to run.
|
||||||
|
timeout-minutes: 6
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
name: Checkout wolfSSL
|
||||||
|
|
||||||
|
- name: Test wolfSSL
|
||||||
|
run: |
|
||||||
|
./autogen.sh
|
||||||
|
./configure ${{ matrix.config }}
|
||||||
|
make
|
||||||
|
./wolfcrypt/test/testwolfcrypt
|
||||||
|
|
||||||
|
- name: Print errors
|
||||||
|
if: ${{ failure() }}
|
||||||
|
run: |
|
||||||
|
if [ -f test-suite.log ] ; then
|
||||||
|
cat test-suite.log
|
||||||
|
fi
|
@ -25937,11 +25937,16 @@ 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 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;
|
||||||
|
#ifndef WOLFSSL_NO_MALLOC
|
||||||
|
word32 rawLen;
|
||||||
byte* tmps[RSA_INTS];
|
byte* tmps[RSA_INTS];
|
||||||
|
#endif
|
||||||
|
|
||||||
if (key == NULL)
|
if (key == NULL)
|
||||||
return BAD_FUNC_ARG;
|
return BAD_FUNC_ARG;
|
||||||
@ -25949,18 +25954,18 @@ 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;
|
||||||
|
|
||||||
|
#ifndef WOLFSSL_NO_MALLOC
|
||||||
for (i = 0; i < RSA_INTS; i++)
|
for (i = 0; i < RSA_INTS; i++)
|
||||||
tmps[i] = NULL;
|
tmps[i] = NULL;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* 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)
|
||||||
return ret;
|
break;
|
||||||
|
#ifndef WOLFSSL_NO_MALLOC
|
||||||
rawLen = (word32)ret + 1;
|
rawLen = (word32)ret + 1;
|
||||||
ret = 0;
|
ret = 0;
|
||||||
if (output != NULL) {
|
if (output != NULL) {
|
||||||
@ -25971,8 +25976,11 @@ int wc_RsaKeyToDer(RsaKey* key, byte* output, word32 inLen)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mpSz = SetASNIntMP(keyInt, MAX_RSA_INT_SZ, tmps[i]);
|
mpSz = SetASNIntMP(keyInt, MAX_RSA_INT_SZ, tmps[i]);
|
||||||
|
#else
|
||||||
|
ret = 0;
|
||||||
|
mpSz = SetASNIntMP(keyInt, MAX_RSA_INT_SZ, NULL);
|
||||||
|
#endif
|
||||||
if (mpSz < 0) {
|
if (mpSz < 0) {
|
||||||
ret = mpSz;
|
ret = mpSz;
|
||||||
break;
|
break;
|
||||||
@ -26004,15 +26012,33 @@ 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)
|
||||||
|
break;
|
||||||
|
ret = 0;
|
||||||
|
/* This won't overrun output due to the outLen check above */
|
||||||
|
mpSz = SetASNIntMP(keyInt, MAX_RSA_INT_SZ, output + j);
|
||||||
|
if (mpSz < 0) {
|
||||||
|
ret = mpSz;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
j += mpSz;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef WOLFSSL_NO_MALLOC
|
||||||
for (i = 0; i < RSA_INTS; i++) {
|
for (i = 0; i < RSA_INTS; i++) {
|
||||||
if (tmps[i])
|
if (tmps[i])
|
||||||
XFREE(tmps[i], key->heap, DYNAMIC_TYPE_RSA);
|
XFREE(tmps[i], key->heap, DYNAMIC_TYPE_RSA);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (ret == 0)
|
if (ret == 0)
|
||||||
ret = (int)outLen;
|
ret = (int)outLen;
|
||||||
|
@ -4721,7 +4721,12 @@ 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
|
||||||
|
/* RSA_MAX_SIZE is the size of n in bits. */
|
||||||
|
byte buf[RSA_MAX_SIZE/16];
|
||||||
|
#endif
|
||||||
#endif /* !WOLFSSL_CRYPTOCELL && !WOLFSSL_SE050 */
|
#endif /* !WOLFSSL_CRYPTOCELL && !WOLFSSL_SE050 */
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
@ -4827,12 +4832,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 +4942,14 @@ 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);
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
ForceZero(buf, primeSz);
|
||||||
|
#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);
|
||||||
|
@ -2125,7 +2125,11 @@ static wc_test_ret_t _SaveDerAndPem(const byte* der, int derSz,
|
|||||||
#if !defined(NO_FILESYSTEM) && !defined(NO_WRITE_TEMP_FILES)
|
#if !defined(NO_FILESYSTEM) && !defined(NO_WRITE_TEMP_FILES)
|
||||||
XFILE pemFile;
|
XFILE pemFile;
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef WOLFSSL_NO_MALLOC
|
||||||
byte* pem;
|
byte* pem;
|
||||||
|
#else
|
||||||
|
byte pem[1024];
|
||||||
|
#endif
|
||||||
int pemSz;
|
int pemSz;
|
||||||
|
|
||||||
/* calculate PEM size */
|
/* calculate PEM size */
|
||||||
@ -2133,10 +2137,15 @@ static wc_test_ret_t _SaveDerAndPem(const byte* der, int derSz,
|
|||||||
if (pemSz < 0) {
|
if (pemSz < 0) {
|
||||||
return WC_TEST_RET_ENC(calling_line, 2, WC_TEST_RET_TAG_I);
|
return WC_TEST_RET_ENC(calling_line, 2, WC_TEST_RET_TAG_I);
|
||||||
}
|
}
|
||||||
|
#ifndef WOLFSSL_NO_MALLOC
|
||||||
pem = (byte*)XMALLOC(pemSz, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER);
|
pem = (byte*)XMALLOC(pemSz, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER);
|
||||||
if (pem == NULL) {
|
if (pem == NULL) {
|
||||||
return WC_TEST_RET_ENC(calling_line, 3, WC_TEST_RET_TAG_I);
|
return WC_TEST_RET_ENC(calling_line, 3, WC_TEST_RET_TAG_I);
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
if (pemSz > (int)sizeof(pem))
|
||||||
|
return BAD_FUNC_ARG;
|
||||||
|
#endif
|
||||||
/* Convert to PEM */
|
/* Convert to PEM */
|
||||||
pemSz = wc_DerToPem(der, derSz, pem, pemSz, pemType);
|
pemSz = wc_DerToPem(der, derSz, pem, pemSz, pemType);
|
||||||
if (pemSz < 0) {
|
if (pemSz < 0) {
|
||||||
@ -19001,7 +19010,11 @@ static wc_test_ret_t rsa_keygen_test(WC_RNG* rng)
|
|||||||
RsaKey genKey[1];
|
RsaKey genKey[1];
|
||||||
#endif
|
#endif
|
||||||
wc_test_ret_t ret;
|
wc_test_ret_t ret;
|
||||||
|
#ifndef WOLFSSL_NO_MALLOC
|
||||||
byte* der = NULL;
|
byte* der = NULL;
|
||||||
|
#else
|
||||||
|
byte der[1024];
|
||||||
|
#endif
|
||||||
#ifndef WOLFSSL_CRYPTOCELL
|
#ifndef WOLFSSL_CRYPTOCELL
|
||||||
word32 idx = 0;
|
word32 idx = 0;
|
||||||
#endif
|
#endif
|
||||||
@ -19046,11 +19059,12 @@ static wc_test_ret_t rsa_keygen_test(WC_RNG* rng)
|
|||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
ERROR_OUT(WC_TEST_RET_ENC_EC(ret), exit_rsa);
|
ERROR_OUT(WC_TEST_RET_ENC_EC(ret), exit_rsa);
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef WOLFSSL_NO_MALLOC
|
||||||
der = (byte*)XMALLOC(FOURK_BUF, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER);
|
der = (byte*)XMALLOC(FOURK_BUF, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER);
|
||||||
if (der == NULL) {
|
if (der == NULL) {
|
||||||
ERROR_OUT(WC_TEST_RET_ENC_ERRNO, exit_rsa);
|
ERROR_OUT(WC_TEST_RET_ENC_ERRNO, exit_rsa);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
derSz = wc_RsaKeyToDer(genKey, der, FOURK_BUF);
|
derSz = wc_RsaKeyToDer(genKey, der, FOURK_BUF);
|
||||||
if (derSz < 0) {
|
if (derSz < 0) {
|
||||||
ERROR_OUT(WC_TEST_RET_ENC_EC(derSz), exit_rsa);
|
ERROR_OUT(WC_TEST_RET_ENC_EC(derSz), exit_rsa);
|
||||||
@ -19086,10 +19100,12 @@ exit_rsa:
|
|||||||
wc_FreeRsaKey(genKey);
|
wc_FreeRsaKey(genKey);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef WOLFSSL_NO_MALLOC
|
||||||
if (der != NULL) {
|
if (der != NULL) {
|
||||||
XFREE(der, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER);
|
XFREE(der, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER);
|
||||||
der = NULL;
|
der = NULL;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user