mirror of
https://github.com/wolfSSL/wolfssl.git
synced 2025-07-30 18:57:27 +02:00
more WOLFSSL_NO_MALLOC fixes:
wolfcrypt/src/dh.c: in wc_DhGenerateParams(), use named constant for buf size, and only XFREE it if !WOLFSSL_NO_MALLOC; wolfcrypt/src/ecc.c and wolfssl/wolfcrypt/ecc.h: in wc_ecc_new_point_ex(), remove !WOLFSSL_NO_MALLOC gate around XMALLOC(), and if XMALLOC()ed, set ecc_point.isAllocated, then in wc_ecc_del_point_ex, XFREE() iff ecc_point.isAllocated; wolfcrypt/src/pkcs7.c: in wc_PKCS7_RsaVerify(), when WOLFSSL_NO_MALLOC, jumbo-size the digest buffer to cope with in-place dynamics in RsaUnPad(); wolfcrypt/test/test.c: add !WOLFSSL_NO_MALLOC gates around various XFREE()s of objects that are on the stack in WOLFSSL_NO_MALLOC builds; wolfssl/wolfcrypt/types.h: add an unconditional include of memory.h (itself guarded against multiple inclusion) to assure availability of WC_DEBUG_CIPHER_LIFECYCLE prototypes/macros.
This commit is contained in:
@ -2980,7 +2980,7 @@ int wc_DhGenerateParams(WC_RNG *rng, int modSz, DhKey *dh)
|
|||||||
int primeCheck = MP_NO,
|
int primeCheck = MP_NO,
|
||||||
ret = 0;
|
ret = 0;
|
||||||
#ifdef WOLFSSL_NO_MALLOC
|
#ifdef WOLFSSL_NO_MALLOC
|
||||||
unsigned char buf[4096 / WOLFSSL_BIT_SIZE];
|
unsigned char buf[DH_MAX_SIZE / WOLFSSL_BIT_SIZE];
|
||||||
#else
|
#else
|
||||||
unsigned char *buf = NULL;
|
unsigned char *buf = NULL;
|
||||||
#endif
|
#endif
|
||||||
@ -3181,9 +3181,11 @@ int wc_DhGenerateParams(WC_RNG *rng, int modSz, DhKey *dh)
|
|||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
ForceZero(buf, bufSz);
|
ForceZero(buf, bufSz);
|
||||||
|
#ifndef WOLFSSL_NO_MALLOC
|
||||||
if (dh != NULL) {
|
if (dh != NULL) {
|
||||||
XFREE(buf, dh->heap, DYNAMIC_TYPE_TMP_BUFFER);
|
XFREE(buf, dh->heap, DYNAMIC_TYPE_TMP_BUFFER);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC)
|
#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC)
|
||||||
|
@ -4092,23 +4092,23 @@ static int wc_ecc_new_point_ex(ecc_point** point, void* heap)
|
|||||||
}
|
}
|
||||||
|
|
||||||
p = *point;
|
p = *point;
|
||||||
#ifndef WOLFSSL_NO_MALLOC
|
|
||||||
if (p == NULL) {
|
if (p == NULL) {
|
||||||
p = (ecc_point*)XMALLOC(sizeof(ecc_point), heap, DYNAMIC_TYPE_ECC);
|
p = (ecc_point*)XMALLOC(sizeof(ecc_point), heap, DYNAMIC_TYPE_ECC);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
if (p == NULL) {
|
if (p == NULL) {
|
||||||
return MEMORY_E;
|
return MEMORY_E;
|
||||||
}
|
}
|
||||||
XMEMSET(p, 0, sizeof(ecc_point));
|
XMEMSET(p, 0, sizeof(ecc_point));
|
||||||
|
|
||||||
|
if (*point == NULL)
|
||||||
|
p->isAllocated = 1;
|
||||||
|
|
||||||
#ifndef ALT_ECC_SIZE
|
#ifndef ALT_ECC_SIZE
|
||||||
err = mp_init_multi(p->x, p->y, p->z, NULL, NULL, NULL);
|
err = mp_init_multi(p->x, p->y, p->z, NULL, NULL, NULL);
|
||||||
if (err != MP_OKAY) {
|
if (err != MP_OKAY) {
|
||||||
WOLFSSL_MSG("mp_init_multi failed.");
|
WOLFSSL_MSG("mp_init_multi failed.");
|
||||||
#ifndef WOLFSSL_NO_MALLOC
|
if (p->isAllocated)
|
||||||
XFREE(p, heap, DYNAMIC_TYPE_ECC);
|
XFREE(p, heap, DYNAMIC_TYPE_ECC);
|
||||||
#endif
|
|
||||||
p = NULL;
|
p = NULL;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
@ -4148,9 +4148,8 @@ static void wc_ecc_del_point_ex(ecc_point* p, void* heap)
|
|||||||
mp_clear(p->x);
|
mp_clear(p->x);
|
||||||
mp_clear(p->y);
|
mp_clear(p->y);
|
||||||
mp_clear(p->z);
|
mp_clear(p->z);
|
||||||
#ifndef WOLFSSL_NO_MALLOC
|
if (p->isAllocated)
|
||||||
XFREE(p, heap, DYNAMIC_TYPE_ECC);
|
XFREE(p, heap, DYNAMIC_TYPE_ECC);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
(void)heap;
|
(void)heap;
|
||||||
}
|
}
|
||||||
|
@ -32,6 +32,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <wolfssl/wolfcrypt/types.h>
|
#include <wolfssl/wolfcrypt/types.h>
|
||||||
|
#include <wolfssl/wolfcrypt/error-crypt.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Possible memory options:
|
Possible memory options:
|
||||||
|
@ -4040,8 +4040,14 @@ static int wc_PKCS7_RsaVerify(PKCS7* pkcs7, byte* sig, int sigSz,
|
|||||||
byte* digest;
|
byte* digest;
|
||||||
RsaKey* key;
|
RsaKey* key;
|
||||||
DecodedCert* dCert;
|
DecodedCert* dCert;
|
||||||
|
#else
|
||||||
|
#ifdef WOLFSSL_NO_MALLOC
|
||||||
|
byte digest[RSA_MAX_SIZE / WOLFSSL_BIT_SIZE]; /* accessed in-place with size
|
||||||
|
* key->dataLen
|
||||||
|
*/
|
||||||
#else
|
#else
|
||||||
byte digest[MAX_PKCS7_DIGEST_SZ];
|
byte digest[MAX_PKCS7_DIGEST_SZ];
|
||||||
|
#endif
|
||||||
RsaKey key[1];
|
RsaKey key[1];
|
||||||
DecodedCert stack_dCert;
|
DecodedCert stack_dCert;
|
||||||
DecodedCert* dCert = &stack_dCert;
|
DecodedCert* dCert = &stack_dCert;
|
||||||
|
@ -2673,23 +2673,31 @@ static wc_test_ret_t _SaveDerAndPem(const byte* der, int derSz,
|
|||||||
/* Convert to PEM */
|
/* Convert to PEM */
|
||||||
pemSz = wc_DerToPem(der, (word32)derSz, pem, (word32)pemSz, pemType);
|
pemSz = wc_DerToPem(der, (word32)derSz, pem, (word32)pemSz, pemType);
|
||||||
if (pemSz < 0) {
|
if (pemSz < 0) {
|
||||||
|
#ifndef WOLFSSL_NO_MALLOC
|
||||||
XFREE(pem, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER);
|
XFREE(pem, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER);
|
||||||
|
#endif
|
||||||
return WC_TEST_RET_ENC(calling_line, 4, WC_TEST_RET_TAG_I);
|
return WC_TEST_RET_ENC(calling_line, 4, WC_TEST_RET_TAG_I);
|
||||||
}
|
}
|
||||||
#if !defined(NO_FILESYSTEM) && !defined(NO_WRITE_TEMP_FILES)
|
#if !defined(NO_FILESYSTEM) && !defined(NO_WRITE_TEMP_FILES)
|
||||||
pemFile = XFOPEN(filePem, "wb");
|
pemFile = XFOPEN(filePem, "wb");
|
||||||
if (!pemFile) {
|
if (!pemFile) {
|
||||||
|
#ifndef WOLFSSL_NO_MALLOC
|
||||||
XFREE(pem, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER);
|
XFREE(pem, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER);
|
||||||
|
#endif
|
||||||
return WC_TEST_RET_ENC(calling_line, 5, WC_TEST_RET_TAG_I);
|
return WC_TEST_RET_ENC(calling_line, 5, WC_TEST_RET_TAG_I);
|
||||||
}
|
}
|
||||||
ret = (int)XFWRITE(pem, 1, (size_t)pemSz, pemFile);
|
ret = (int)XFWRITE(pem, 1, (size_t)pemSz, pemFile);
|
||||||
XFCLOSE(pemFile);
|
XFCLOSE(pemFile);
|
||||||
if (ret != pemSz) {
|
if (ret != pemSz) {
|
||||||
|
#ifndef WOLFSSL_NO_MALLOC
|
||||||
XFREE(pem, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER);
|
XFREE(pem, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER);
|
||||||
|
#endif
|
||||||
return WC_TEST_RET_ENC(calling_line, 6, WC_TEST_RET_TAG_I);
|
return WC_TEST_RET_ENC(calling_line, 6, WC_TEST_RET_TAG_I);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef WOLFSSL_NO_MALLOC
|
||||||
XFREE(pem, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER);
|
XFREE(pem, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
#endif /* WOLFSSL_DER_TO_PEM */
|
#endif /* WOLFSSL_DER_TO_PEM */
|
||||||
|
|
||||||
@ -37926,8 +37934,10 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t ed448_test(void)
|
|||||||
}
|
}
|
||||||
} while(0);
|
} while(0);
|
||||||
|
|
||||||
|
#ifndef WOLFSSL_NO_MALLOC
|
||||||
XFREE(exportPKey, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER);
|
XFREE(exportPKey, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER);
|
||||||
XFREE(exportSKey, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER);
|
XFREE(exportSKey, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -467,6 +467,7 @@ struct ecc_point {
|
|||||||
#if defined(WOLFSSL_SMALL_STACK_CACHE) && !defined(WOLFSSL_ECC_NO_SMALL_STACK)
|
#if defined(WOLFSSL_SMALL_STACK_CACHE) && !defined(WOLFSSL_ECC_NO_SMALL_STACK)
|
||||||
ecc_key* key;
|
ecc_key* key;
|
||||||
#endif
|
#endif
|
||||||
|
byte isAllocated:1;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* ECC Flags */
|
/* ECC Flags */
|
||||||
|
@ -602,6 +602,8 @@ typedef struct w64wrapper {
|
|||||||
#endif /* WOLFSSL_STATIC_MEMORY */
|
#endif /* WOLFSSL_STATIC_MEMORY */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <wolfssl/wolfcrypt/memory.h>
|
||||||
|
|
||||||
/* declare/free variable handling for async and smallstack */
|
/* declare/free variable handling for async and smallstack */
|
||||||
#ifndef WC_ALLOC_DO_ON_FAILURE
|
#ifndef WC_ALLOC_DO_ON_FAILURE
|
||||||
#define WC_ALLOC_DO_ON_FAILURE() WC_DO_NOTHING
|
#define WC_ALLOC_DO_ON_FAILURE() WC_DO_NOTHING
|
||||||
|
Reference in New Issue
Block a user