From 4bd0b3ef4135721ef73c6d1537c3c0ebf10a7947 Mon Sep 17 00:00:00 2001 From: Daniel Pouzzner Date: Wed, 17 Dec 2025 13:07:49 -0600 Subject: [PATCH] backport f771181e1a to wolfcrypt/src/ecc.c (smallstack refactor of ecc_mul2add()). --- wolfcrypt/src/ecc.c | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/wolfcrypt/src/ecc.c b/wolfcrypt/src/ecc.c index cbaef3590..af188d8c4 100644 --- a/wolfcrypt/src/ecc.c +++ b/wolfcrypt/src/ecc.c @@ -6520,7 +6520,7 @@ int ecc_mul2add(ecc_point* A, mp_int* kA, #endif { #ifdef WOLFSSL_SMALL_STACK_CACHE - ecc_key key; + ecc_key *key = NULL; #endif #ifdef WOLFSSL_SMALL_STACK ecc_point** precomp = NULL; @@ -6561,24 +6561,35 @@ int ecc_mul2add(ecc_point* A, mp_int* kA, #endif #ifdef WOLFSSL_SMALL_STACK + #ifdef WOLFSSL_SMALL_STACK_CACHE + key = (ecc_key *)XMALLOC(sizeof(*key), heap, DYNAMIC_TYPE_ECC_BUFFER); + if (key == NULL) { + XFREE(tB, heap, DYNAMIC_TYPE_ECC_BUFFER); + XFREE(tA, heap, DYNAMIC_TYPE_ECC_BUFFER); + return GEN_MEM_ERR; + } + #endif precomp = (ecc_point**)XMALLOC(sizeof(ecc_point*) * SHAMIR_PRECOMP_SZ, heap, DYNAMIC_TYPE_ECC_BUFFER); if (precomp == NULL) { XFREE(tB, heap, DYNAMIC_TYPE_ECC_BUFFER); XFREE(tA, heap, DYNAMIC_TYPE_ECC_BUFFER); + #ifdef WOLFSSL_SMALL_STACK_CACHE + XFREE(key, heap, DYNAMIC_TYPE_ECC_BUFFER); + #endif return GEN_MEM_ERR; } #endif #ifdef WOLFSSL_SMALL_STACK_CACHE - key.t1 = (mp_int*)XMALLOC(sizeof(mp_int), heap, DYNAMIC_TYPE_ECC); - key.t2 = (mp_int*)XMALLOC(sizeof(mp_int), heap, DYNAMIC_TYPE_ECC); + key->t1 = (mp_int*)XMALLOC(sizeof(mp_int), heap, DYNAMIC_TYPE_ECC); + key->t2 = (mp_int*)XMALLOC(sizeof(mp_int), heap, DYNAMIC_TYPE_ECC); #ifdef ALT_ECC_SIZE key.x = (mp_int*)XMALLOC(sizeof(mp_int), heap, DYNAMIC_TYPE_ECC); key.y = (mp_int*)XMALLOC(sizeof(mp_int), heap, DYNAMIC_TYPE_ECC); key.z = (mp_int*)XMALLOC(sizeof(mp_int), heap, DYNAMIC_TYPE_ECC); #endif - if (key.t1 == NULL || key.t2 == NULL + if (key->t1 == NULL || key->t2 == NULL #ifdef ALT_ECC_SIZE || key.x == NULL || key.y == NULL || key.z == NULL #endif @@ -6588,14 +6599,15 @@ int ecc_mul2add(ecc_point* A, mp_int* kA, XFREE(key.y, heap, DYNAMIC_TYPE_ECC); XFREE(key.x, heap, DYNAMIC_TYPE_ECC); #endif - XFREE(key.t2, heap, DYNAMIC_TYPE_ECC); - XFREE(key.t1, heap, DYNAMIC_TYPE_ECC); + XFREE(key->t2, heap, DYNAMIC_TYPE_ECC); + XFREE(key->t1, heap, DYNAMIC_TYPE_ECC); XFREE(precomp, heap, DYNAMIC_TYPE_ECC_BUFFER); XFREE(tB, heap, DYNAMIC_TYPE_ECC_BUFFER); XFREE(tA, heap, DYNAMIC_TYPE_ECC_BUFFER); + XFREE(key, heap, DYNAMIC_TYPE_ECC_BUFFER); return MEMORY_E; } - C->key = &key; + C->key = key; #endif /* WOLFSSL_SMALL_STACK_CACHE */ /* init variables */ @@ -6635,7 +6647,7 @@ int ecc_mul2add(ecc_point* A, mp_int* kA, if (err != MP_OKAY) break; #ifdef WOLFSSL_SMALL_STACK_CACHE - precomp[x]->key = &key; + precomp[x]->key = key; #endif } } @@ -6804,8 +6816,9 @@ int ecc_mul2add(ecc_point* A, mp_int* kA, XFREE(key.y, heap, DYNAMIC_TYPE_ECC); XFREE(key.x, heap, DYNAMIC_TYPE_ECC); #endif - XFREE(key.t2, heap, DYNAMIC_TYPE_ECC); - XFREE(key.t1, heap, DYNAMIC_TYPE_ECC); + XFREE(key->t2, heap, DYNAMIC_TYPE_ECC); + XFREE(key->t1, heap, DYNAMIC_TYPE_ECC); + XFREE(key, heap, DYNAMIC_TYPE_ECC); C->key = NULL; #endif #ifdef WOLFSSL_SMALL_STACK