From 4dbe86f1fde56e3155fcb14ad848554868f9a1b5 Mon Sep 17 00:00:00 2001 From: Sean Parkinson Date: Wed, 29 Aug 2018 10:16:51 +1000 Subject: [PATCH] Small stack usage fixes Stack pointer logging added. --- configure.ac | 13 ++++++++ src/internal.c | 13 +++++++- wolfcrypt/src/memory.c | 19 ++++++++++++ wolfcrypt/src/sp_arm32.c | 32 ++++++++++---------- wolfcrypt/src/sp_arm64.c | 32 ++++++++++---------- wolfcrypt/src/sp_c32.c | 32 ++++++++++---------- wolfcrypt/src/sp_c64.c | 32 ++++++++++---------- wolfcrypt/src/sp_x86_64.c | 62 ++++++++++++++++++--------------------- 8 files changed, 133 insertions(+), 102 deletions(-) diff --git a/configure.ac b/configure.ac index c2da7e6d6f..b0cde298fa 100644 --- a/configure.ac +++ b/configure.ac @@ -1645,6 +1645,19 @@ then fi +# STACK usage logging +AC_ARG_ENABLE([stacklog], + [AS_HELP_STRING([--enable-stacklog],[Enable stack logging (default: disabled)])], + [ ENABLED_STACKLOG=$enableval ], + [ ENABLED_STACKLOG=no ] + ) + +if test "$ENABLED_STACKLOG" = "yes" +then + AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_STACK_LOG -finstrument-functions" +fi + + # RSA AC_ARG_ENABLE([rsa], diff --git a/src/internal.c b/src/internal.c index 00419981e4..4e0ca6eaa0 100644 --- a/src/internal.c +++ b/src/internal.c @@ -8678,6 +8678,8 @@ int ProcessPeerCerts(WOLFSSL* ssl, byte* input, word32* inOutIdx, (void)sizeof(args_test); #elif defined(WOLFSSL_NONBLOCK_OCSP) ProcPeerCertArgs* args = ssl->nonblockarg; +#elif defined(WOLFSSL_SMALL_STACK) + ProcPeerCertArgs* args = NULL; #else ProcPeerCertArgs args[1]; #endif @@ -8706,6 +8708,12 @@ int ProcessPeerCerts(WOLFSSL* ssl, byte* input, word32* inOutIdx, } } if (ssl->nonblockarg == NULL) /* new args */ +#elif defined(WOLFSSL_SMALL_STACK) + args = (ProcPeerCertArgs*)XMALLOC( + sizeof(ProcPeerCertArgs), ssl->heap, DYNAMIC_TYPE_TMP_BUFFER); + if (args == NULL) { + ERROR_OUT(MEMORY_E, exit_ppc); + } #endif { /* Reset state */ @@ -9836,9 +9844,12 @@ exit_ppc: FreeProcPeerCertArgs(ssl, args); -#if !defined(WOLFSSL_ASYNC_CRYPT) && defined(WOLFSSL_NONBLOCK_OCSP) +#if defined(WOLFSSL_ASYNC_CRYPT) +#elif defined(WOLFSSL_NONBLOCK_OCSP) XFREE(args, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER); ssl->nonblockarg = NULL; +#elif defined(WOLFSSL_SMALL_STACK) + XFREE(args, ssl->heap, DYNAMIC_TYPE_TMP_BUFFER); #endif FreeKeyExchange(ssl); diff --git a/wolfcrypt/src/memory.c b/wolfcrypt/src/memory.c index 87ed921f3d..55111662f3 100644 --- a/wolfcrypt/src/memory.c +++ b/wolfcrypt/src/memory.c @@ -1074,3 +1074,22 @@ void xfree(void *p, void* heap, int type, const char* func, const char* file, } #endif /* WOLFSSL_MEMORY_LOG */ +#ifdef WOLFSSL_STACK_LOG +/* Note: this code only works with GCC using -finstrument-functions. */ +void __attribute__((no_instrument_function)) + __cyg_profile_func_enter(void *func, void *caller) +{ + register void* sp asm("sp"); + fprintf(stderr, "ENTER: %016lx %p\n", (size_t)func, sp); + (void)caller; +} + +void __attribute__((no_instrument_function)) + __cyg_profile_func_exit(void *func, void *caller) +{ + register void* sp asm("sp"); + fprintf(stderr, "EXIT: %016lx %p\n", (size_t)func, sp); + (void)caller; +} +#endif + diff --git a/wolfcrypt/src/sp_arm32.c b/wolfcrypt/src/sp_arm32.c index aa61fee154..dd765d3fb6 100644 --- a/wolfcrypt/src/sp_arm32.c +++ b/wolfcrypt/src/sp_arm32.c @@ -19166,8 +19166,7 @@ static void sp_256_div2_8(sp_digit* r, sp_digit* a, sp_digit* m) */ static void sp_256_proj_point_dbl_8(sp_point* r, sp_point* p, sp_digit* t) { - sp_point *rp[2]; - sp_point tp; + sp_point* rp[2]; sp_digit* t1 = t; sp_digit* t2 = t + 2*8; sp_digit* x; @@ -19177,7 +19176,8 @@ static void sp_256_proj_point_dbl_8(sp_point* r, sp_point* p, sp_digit* t) /* When infinity don't double point passed in - constant time. */ rp[0] = r; - rp[1] = &tp; + rp[1] = (sp_point*)t; + XMEMSET(rp[1], 0, sizeof(sp_point)); x = rp[p->infinity]->x; y = rp[p->infinity]->y; z = rp[p->infinity]->z; @@ -19352,9 +19352,8 @@ static int sp_256_cmp_equal_8(const sp_digit* a, const sp_digit* b) static void sp_256_proj_point_add_8(sp_point* r, sp_point* p, sp_point* q, sp_digit* t) { - sp_point *ap[2]; - sp_point *rp[2]; - sp_point tp; + sp_point* ap[2]; + sp_point* rp[2]; sp_digit* t1 = t; sp_digit* t2 = t + 2*8; sp_digit* t3 = t + 4*8; @@ -19381,8 +19380,8 @@ static void sp_256_proj_point_add_8(sp_point* r, sp_point* p, sp_point* q, } else { rp[0] = r; - rp[1] = &tp; - XMEMSET(&tp, 0, sizeof(tp)); + rp[1] = (sp_point*)t; + XMEMSET(rp[1], 0, sizeof(sp_point)); x = rp[p->infinity | q->infinity]->x; y = rp[p->infinity | q->infinity]->y; z = rp[p->infinity | q->infinity]->z; @@ -19577,8 +19576,7 @@ typedef struct sp_table_entry { static void sp_256_proj_point_dbl_n_8(sp_point* r, sp_point* p, int n, sp_digit* t) { - sp_point *rp[2]; - sp_point tp; + sp_point* rp[2]; sp_digit* w = t; sp_digit* a = t + 2*8; sp_digit* b = t + 4*8; @@ -19590,7 +19588,8 @@ static void sp_256_proj_point_dbl_n_8(sp_point* r, sp_point* p, int n, int i; rp[0] = r; - rp[1] = &tp; + rp[1] = (sp_point*)t; + XMEMSET(rp[1], 0, sizeof(sp_point)); x = rp[p->infinity]->x; y = rp[p->infinity]->y; z = rp[p->infinity]->z; @@ -19652,9 +19651,8 @@ static void sp_256_proj_point_dbl_n_8(sp_point* r, sp_point* p, int n, static void sp_256_proj_point_add_qz1_8(sp_point* r, sp_point* p, sp_point* q, sp_digit* t) { - sp_point *ap[2]; - sp_point *rp[2]; - sp_point tp; + sp_point* ap[2]; + sp_point* rp[2]; sp_digit* t1 = t; sp_digit* t2 = t + 2*8; sp_digit* t3 = t + 4*8; @@ -19674,8 +19672,8 @@ static void sp_256_proj_point_add_qz1_8(sp_point* r, sp_point* p, } else { rp[0] = r; - rp[1] = &tp; - XMEMSET(&tp, 0, sizeof(tp)); + rp[1] = (sp_point*)t; + XMEMSET(rp[1], 0, sizeof(sp_point)); x = rp[p->infinity | q->infinity]->x; y = rp[p->infinity | q->infinity]->y; z = rp[p->infinity | q->infinity]->z; @@ -23984,7 +23982,7 @@ int sp_ecc_sign_256(const byte* hash, word32 hashLen, WC_RNG* rng, mp_int* priv, mp_int* rm, mp_int* sm, void* heap) { #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK) - sp_digit* d; + sp_digit* d = NULL; #else sp_digit ed[2*8]; sp_digit xd[2*8]; diff --git a/wolfcrypt/src/sp_arm64.c b/wolfcrypt/src/sp_arm64.c index 190602fd3c..471a6fec1a 100644 --- a/wolfcrypt/src/sp_arm64.c +++ b/wolfcrypt/src/sp_arm64.c @@ -13389,8 +13389,7 @@ static void sp_256_div2_4(sp_digit* r, sp_digit* a, sp_digit* m) */ static void sp_256_proj_point_dbl_4(sp_point* r, sp_point* p, sp_digit* t) { - sp_point *rp[2]; - sp_point tp; + sp_point* rp[2]; sp_digit* t1 = t; sp_digit* t2 = t + 2*4; sp_digit* x; @@ -13400,7 +13399,8 @@ static void sp_256_proj_point_dbl_4(sp_point* r, sp_point* p, sp_digit* t) /* When infinity don't double point passed in - constant time. */ rp[0] = r; - rp[1] = &tp; + rp[1] = (sp_point*)t; + XMEMSET(rp[1], 0, sizeof(sp_point)); x = rp[p->infinity]->x; y = rp[p->infinity]->y; z = rp[p->infinity]->z; @@ -13464,8 +13464,7 @@ static void sp_256_proj_point_dbl_4(sp_point* r, sp_point* p, sp_digit* t) static void sp_256_proj_point_dbl_n_4(sp_point* r, sp_point* p, int n, sp_digit* t) { - sp_point *rp[2]; - sp_point tp; + sp_point* rp[2]; sp_digit* w = t; sp_digit* a = t + 2*4; sp_digit* b = t + 4*4; @@ -13477,7 +13476,8 @@ static void sp_256_proj_point_dbl_n_4(sp_point* r, sp_point* p, int n, int i; rp[0] = r; - rp[1] = &tp; + rp[1] = (sp_point*)t; + XMEMSET(rp[1], 0, sizeof(sp_point)); x = rp[p->infinity]->x; y = rp[p->infinity]->y; z = rp[p->infinity]->z; @@ -13548,9 +13548,8 @@ static int sp_256_cmp_equal_4(const sp_digit* a, const sp_digit* b) static void sp_256_proj_point_add_4(sp_point* r, sp_point* p, sp_point* q, sp_digit* t) { - sp_point *ap[2]; - sp_point *rp[2]; - sp_point tp; + sp_point* ap[2]; + sp_point* rp[2]; sp_digit* t1 = t; sp_digit* t2 = t + 2*4; sp_digit* t3 = t + 4*4; @@ -13577,8 +13576,8 @@ static void sp_256_proj_point_add_4(sp_point* r, sp_point* p, sp_point* q, } else { rp[0] = r; - rp[1] = &tp; - XMEMSET(&tp, 0, sizeof(tp)); + rp[1] = (sp_point*)t; + XMEMSET(rp[1], 0, sizeof(sp_point)); x = rp[p->infinity | q->infinity]->x; y = rp[p->infinity | q->infinity]->y; z = rp[p->infinity | q->infinity]->z; @@ -13978,9 +13977,8 @@ typedef struct sp_table_entry { static void sp_256_proj_point_add_qz1_4(sp_point* r, sp_point* p, sp_point* q, sp_digit* t) { - sp_point *ap[2]; - sp_point *rp[2]; - sp_point tp; + sp_point* ap[2]; + sp_point* rp[2]; sp_digit* t1 = t; sp_digit* t2 = t + 2*4; sp_digit* t3 = t + 4*4; @@ -14000,8 +13998,8 @@ static void sp_256_proj_point_add_qz1_4(sp_point* r, sp_point* p, } else { rp[0] = r; - rp[1] = &tp; - XMEMSET(&tp, 0, sizeof(tp)); + rp[1] = (sp_point*)t; + XMEMSET(rp[1], 0, sizeof(sp_point)); x = rp[p->infinity | q->infinity]->x; y = rp[p->infinity | q->infinity]->y; z = rp[p->infinity | q->infinity]->z; @@ -28915,7 +28913,7 @@ int sp_ecc_sign_256(const byte* hash, word32 hashLen, WC_RNG* rng, mp_int* priv, mp_int* rm, mp_int* sm, void* heap) { #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK) - sp_digit* d; + sp_digit* d = NULL; #else sp_digit ed[2*4]; sp_digit xd[2*4]; diff --git a/wolfcrypt/src/sp_c32.c b/wolfcrypt/src/sp_c32.c index 9b03435502..4c7a076b7b 100644 --- a/wolfcrypt/src/sp_c32.c +++ b/wolfcrypt/src/sp_c32.c @@ -8503,8 +8503,7 @@ static void sp_256_div2_10(sp_digit* r, sp_digit* a, sp_digit* m) */ static void sp_256_proj_point_dbl_10(sp_point* r, sp_point* p, sp_digit* t) { - sp_point *rp[2]; - sp_point tp; + sp_point* rp[2]; sp_digit* t1 = t; sp_digit* t2 = t + 2*10; sp_digit* x; @@ -8514,7 +8513,8 @@ static void sp_256_proj_point_dbl_10(sp_point* r, sp_point* p, sp_digit* t) /* When infinity don't double point passed in - constant time. */ rp[0] = r; - rp[1] = &tp; + rp[1] = (sp_point*)t; + XMEMSET(rp[1], 0, sizeof(sp_point)); x = rp[p->infinity]->x; y = rp[p->infinity]->y; z = rp[p->infinity]->z; @@ -8592,9 +8592,8 @@ static int sp_256_cmp_equal_10(const sp_digit* a, const sp_digit* b) static void sp_256_proj_point_add_10(sp_point* r, sp_point* p, sp_point* q, sp_digit* t) { - sp_point *ap[2]; - sp_point *rp[2]; - sp_point tp; + sp_point* ap[2]; + sp_point* rp[2]; sp_digit* t1 = t; sp_digit* t2 = t + 2*10; sp_digit* t3 = t + 4*10; @@ -8621,8 +8620,8 @@ static void sp_256_proj_point_add_10(sp_point* r, sp_point* p, sp_point* q, } else { rp[0] = r; - rp[1] = &tp; - XMEMSET(&tp, 0, sizeof(tp)); + rp[1] = (sp_point*)t; + XMEMSET(rp[1], 0, sizeof(sp_point)); x = rp[p->infinity | q->infinity]->x; y = rp[p->infinity | q->infinity]->y; z = rp[p->infinity | q->infinity]->z; @@ -9017,8 +9016,7 @@ static int sp_256_ecc_mulmod_fast_10(sp_point* r, sp_point* g, sp_digit* k, static void sp_256_proj_point_dbl_n_10(sp_point* r, sp_point* p, int n, sp_digit* t) { - sp_point *rp[2]; - sp_point tp; + sp_point* rp[2]; sp_digit* w = t; sp_digit* a = t + 2*10; sp_digit* b = t + 4*10; @@ -9030,7 +9028,8 @@ static void sp_256_proj_point_dbl_n_10(sp_point* r, sp_point* p, int n, int i; rp[0] = r; - rp[1] = &tp; + rp[1] = (sp_point*)t; + XMEMSET(rp[1], 0, sizeof(sp_point)); x = rp[p->infinity]->x; y = rp[p->infinity]->y; z = rp[p->infinity]->z; @@ -9092,9 +9091,8 @@ static void sp_256_proj_point_dbl_n_10(sp_point* r, sp_point* p, int n, static void sp_256_proj_point_add_qz1_10(sp_point* r, sp_point* p, sp_point* q, sp_digit* t) { - sp_point *ap[2]; - sp_point *rp[2]; - sp_point tp; + sp_point* ap[2]; + sp_point* rp[2]; sp_digit* t1 = t; sp_digit* t2 = t + 2*10; sp_digit* t3 = t + 4*10; @@ -9114,8 +9112,8 @@ static void sp_256_proj_point_add_qz1_10(sp_point* r, sp_point* p, } else { rp[0] = r; - rp[1] = &tp; - XMEMSET(&tp, 0, sizeof(tp)); + rp[1] = (sp_point*)t; + XMEMSET(rp[1], 0, sizeof(sp_point)); x = rp[p->infinity | q->infinity]->x; y = rp[p->infinity | q->infinity]->y; z = rp[p->infinity | q->infinity]->z; @@ -11888,7 +11886,7 @@ int sp_ecc_sign_256(const byte* hash, word32 hashLen, WC_RNG* rng, mp_int* priv, mp_int* rm, mp_int* sm, void* heap) { #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK) - sp_digit* d; + sp_digit* d = NULL; #else sp_digit ed[2*10]; sp_digit xd[2*10]; diff --git a/wolfcrypt/src/sp_c64.c b/wolfcrypt/src/sp_c64.c index 5b719e916b..c0823eba66 100644 --- a/wolfcrypt/src/sp_c64.c +++ b/wolfcrypt/src/sp_c64.c @@ -7726,8 +7726,7 @@ static void sp_256_div2_5(sp_digit* r, sp_digit* a, sp_digit* m) */ static void sp_256_proj_point_dbl_5(sp_point* r, sp_point* p, sp_digit* t) { - sp_point *rp[2]; - sp_point tp; + sp_point* rp[2]; sp_digit* t1 = t; sp_digit* t2 = t + 2*5; sp_digit* x; @@ -7737,7 +7736,8 @@ static void sp_256_proj_point_dbl_5(sp_point* r, sp_point* p, sp_digit* t) /* When infinity don't double point passed in - constant time. */ rp[0] = r; - rp[1] = &tp; + rp[1] = (sp_point*)t; + XMEMSET(rp[1], 0, sizeof(sp_point)); x = rp[p->infinity]->x; y = rp[p->infinity]->y; z = rp[p->infinity]->z; @@ -7814,9 +7814,8 @@ static int sp_256_cmp_equal_5(const sp_digit* a, const sp_digit* b) static void sp_256_proj_point_add_5(sp_point* r, sp_point* p, sp_point* q, sp_digit* t) { - sp_point *ap[2]; - sp_point *rp[2]; - sp_point tp; + sp_point* ap[2]; + sp_point* rp[2]; sp_digit* t1 = t; sp_digit* t2 = t + 2*5; sp_digit* t3 = t + 4*5; @@ -7843,8 +7842,8 @@ static void sp_256_proj_point_add_5(sp_point* r, sp_point* p, sp_point* q, } else { rp[0] = r; - rp[1] = &tp; - XMEMSET(&tp, 0, sizeof(tp)); + rp[1] = (sp_point*)t; + XMEMSET(rp[1], 0, sizeof(sp_point)); x = rp[p->infinity | q->infinity]->x; y = rp[p->infinity | q->infinity]->y; z = rp[p->infinity | q->infinity]->z; @@ -8239,8 +8238,7 @@ static int sp_256_ecc_mulmod_fast_5(sp_point* r, sp_point* g, sp_digit* k, static void sp_256_proj_point_dbl_n_5(sp_point* r, sp_point* p, int n, sp_digit* t) { - sp_point *rp[2]; - sp_point tp; + sp_point* rp[2]; sp_digit* w = t; sp_digit* a = t + 2*5; sp_digit* b = t + 4*5; @@ -8252,7 +8250,8 @@ static void sp_256_proj_point_dbl_n_5(sp_point* r, sp_point* p, int n, int i; rp[0] = r; - rp[1] = &tp; + rp[1] = (sp_point*)t; + XMEMSET(rp[1], 0, sizeof(sp_point)); x = rp[p->infinity]->x; y = rp[p->infinity]->y; z = rp[p->infinity]->z; @@ -8314,9 +8313,8 @@ static void sp_256_proj_point_dbl_n_5(sp_point* r, sp_point* p, int n, static void sp_256_proj_point_add_qz1_5(sp_point* r, sp_point* p, sp_point* q, sp_digit* t) { - sp_point *ap[2]; - sp_point *rp[2]; - sp_point tp; + sp_point* ap[2]; + sp_point* rp[2]; sp_digit* t1 = t; sp_digit* t2 = t + 2*5; sp_digit* t3 = t + 4*5; @@ -8336,8 +8334,8 @@ static void sp_256_proj_point_add_qz1_5(sp_point* r, sp_point* p, } else { rp[0] = r; - rp[1] = &tp; - XMEMSET(&tp, 0, sizeof(tp)); + rp[1] = (sp_point*)t; + XMEMSET(rp[1], 0, sizeof(sp_point)); x = rp[p->infinity | q->infinity]->x; y = rp[p->infinity | q->infinity]->y; z = rp[p->infinity | q->infinity]->z; @@ -11099,7 +11097,7 @@ int sp_ecc_sign_256(const byte* hash, word32 hashLen, WC_RNG* rng, mp_int* priv, mp_int* rm, mp_int* sm, void* heap) { #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK) - sp_digit* d; + sp_digit* d = NULL; #else sp_digit ed[2*5]; sp_digit xd[2*5]; diff --git a/wolfcrypt/src/sp_x86_64.c b/wolfcrypt/src/sp_x86_64.c index 3b974ac9c6..17363a832e 100644 --- a/wolfcrypt/src/sp_x86_64.c +++ b/wolfcrypt/src/sp_x86_64.c @@ -28681,8 +28681,7 @@ SP_NOINLINE static void sp_256_div2_4(sp_digit* r, sp_digit* a, sp_digit* m) */ static void sp_256_proj_point_dbl_4(sp_point* r, sp_point* p, sp_digit* t) { - sp_point *rp[2]; - sp_point tp; + sp_point* rp[2]; sp_digit* t1 = t; sp_digit* t2 = t + 2*4; sp_digit* x; @@ -28692,7 +28691,8 @@ static void sp_256_proj_point_dbl_4(sp_point* r, sp_point* p, sp_digit* t) /* When infinity don't double point passed in - constant time. */ rp[0] = r; - rp[1] = &tp; + rp[1] = (sp_point*)t; + XMEMSET(rp[1], 0, sizeof(sp_point)); x = rp[p->infinity]->x; y = rp[p->infinity]->y; z = rp[p->infinity]->z; @@ -28756,8 +28756,7 @@ static void sp_256_proj_point_dbl_4(sp_point* r, sp_point* p, sp_digit* t) static void sp_256_proj_point_dbl_n_4(sp_point* r, sp_point* p, int n, sp_digit* t) { - sp_point *rp[2]; - sp_point tp; + sp_point* rp[2]; sp_digit* w = t; sp_digit* a = t + 2*4; sp_digit* b = t + 4*4; @@ -28769,7 +28768,8 @@ static void sp_256_proj_point_dbl_n_4(sp_point* r, sp_point* p, int n, int i; rp[0] = r; - rp[1] = &tp; + rp[1] = (sp_point*)t; + XMEMSET(rp[1], 0, sizeof(sp_point)); x = rp[p->infinity]->x; y = rp[p->infinity]->y; z = rp[p->infinity]->z; @@ -28840,9 +28840,8 @@ static int sp_256_cmp_equal_4(const sp_digit* a, const sp_digit* b) static void sp_256_proj_point_add_4(sp_point* r, sp_point* p, sp_point* q, sp_digit* t) { - sp_point *ap[2]; - sp_point *rp[2]; - sp_point tp; + sp_point* ap[2]; + sp_point* rp[2]; sp_digit* t1 = t; sp_digit* t2 = t + 2*4; sp_digit* t3 = t + 4*4; @@ -28869,8 +28868,8 @@ static void sp_256_proj_point_add_4(sp_point* r, sp_point* p, sp_point* q, } else { rp[0] = r; - rp[1] = &tp; - XMEMSET(&tp, 0, sizeof(tp)); + rp[1] = (sp_point*)t; + XMEMSET(rp[1], 0, sizeof(sp_point)); x = rp[p->infinity | q->infinity]->x; y = rp[p->infinity | q->infinity]->y; z = rp[p->infinity | q->infinity]->z; @@ -29703,8 +29702,7 @@ static void sp_256_map_avx2_4(sp_point* r, sp_point* p, sp_digit* t) */ static void sp_256_proj_point_dbl_avx2_4(sp_point* r, sp_point* p, sp_digit* t) { - sp_point *rp[2]; - sp_point tp; + sp_point* rp[2]; sp_digit* t1 = t; sp_digit* t2 = t + 2*4; sp_digit* x; @@ -29714,7 +29712,8 @@ static void sp_256_proj_point_dbl_avx2_4(sp_point* r, sp_point* p, sp_digit* t) /* When infinity don't double point passed in - constant time. */ rp[0] = r; - rp[1] = &tp; + rp[1] = (sp_point*)t; + XMEMSET(rp[1], 0, sizeof(sp_point)); x = rp[p->infinity]->x; y = rp[p->infinity]->y; z = rp[p->infinity]->z; @@ -29778,8 +29777,7 @@ static void sp_256_proj_point_dbl_avx2_4(sp_point* r, sp_point* p, sp_digit* t) static void sp_256_proj_point_dbl_n_avx2_4(sp_point* r, sp_point* p, int n, sp_digit* t) { - sp_point *rp[2]; - sp_point tp; + sp_point* rp[2]; sp_digit* w = t; sp_digit* a = t + 2*4; sp_digit* b = t + 4*4; @@ -29791,7 +29789,8 @@ static void sp_256_proj_point_dbl_n_avx2_4(sp_point* r, sp_point* p, int n, int i; rp[0] = r; - rp[1] = &tp; + rp[1] = (sp_point*)t; + XMEMSET(rp[1], 0, sizeof(sp_point)); x = rp[p->infinity]->x; y = rp[p->infinity]->y; z = rp[p->infinity]->z; @@ -29850,9 +29849,8 @@ static void sp_256_proj_point_dbl_n_avx2_4(sp_point* r, sp_point* p, int n, static void sp_256_proj_point_add_avx2_4(sp_point* r, sp_point* p, sp_point* q, sp_digit* t) { - sp_point *ap[2]; - sp_point *rp[2]; - sp_point tp; + sp_point* ap[2]; + sp_point* rp[2]; sp_digit* t1 = t; sp_digit* t2 = t + 2*4; sp_digit* t3 = t + 4*4; @@ -29879,8 +29877,8 @@ static void sp_256_proj_point_add_avx2_4(sp_point* r, sp_point* p, sp_point* q, } else { rp[0] = r; - rp[1] = &tp; - XMEMSET(&tp, 0, sizeof(tp)); + rp[1] = (sp_point*)t; + XMEMSET(rp[1], 0, sizeof(sp_point)); x = rp[p->infinity | q->infinity]->x; y = rp[p->infinity | q->infinity]->y; z = rp[p->infinity | q->infinity]->z; @@ -30211,9 +30209,8 @@ typedef struct sp_table_entry { static void sp_256_proj_point_add_qz1_4(sp_point* r, sp_point* p, sp_point* q, sp_digit* t) { - sp_point *ap[2]; - sp_point *rp[2]; - sp_point tp; + sp_point* ap[2]; + sp_point* rp[2]; sp_digit* t1 = t; sp_digit* t2 = t + 2*4; sp_digit* t3 = t + 4*4; @@ -30233,8 +30230,8 @@ static void sp_256_proj_point_add_qz1_4(sp_point* r, sp_point* p, } else { rp[0] = r; - rp[1] = &tp; - XMEMSET(&tp, 0, sizeof(tp)); + rp[1] = (sp_point*)t; + XMEMSET(rp[1], 0, sizeof(sp_point)); x = rp[p->infinity | q->infinity]->x; y = rp[p->infinity | q->infinity]->y; z = rp[p->infinity | q->infinity]->z; @@ -30604,9 +30601,8 @@ static int sp_256_ecc_mulmod_4(sp_point* r, sp_point* g, sp_digit* k, static void sp_256_proj_point_add_qz1_avx2_4(sp_point* r, sp_point* p, sp_point* q, sp_digit* t) { - sp_point *ap[2]; - sp_point *rp[2]; - sp_point tp; + sp_point* ap[2]; + sp_point* rp[2]; sp_digit* t1 = t; sp_digit* t2 = t + 2*4; sp_digit* t3 = t + 4*4; @@ -30626,8 +30622,8 @@ static void sp_256_proj_point_add_qz1_avx2_4(sp_point* r, sp_point* p, } else { rp[0] = r; - rp[1] = &tp; - XMEMSET(&tp, 0, sizeof(tp)); + rp[1] = (sp_point*)t; + XMEMSET(rp[1], 0, sizeof(sp_point)); x = rp[p->infinity | q->infinity]->x; y = rp[p->infinity | q->infinity]->y; z = rp[p->infinity | q->infinity]->z; @@ -45799,7 +45795,7 @@ int sp_ecc_sign_256(const byte* hash, word32 hashLen, WC_RNG* rng, mp_int* priv, mp_int* rm, mp_int* sm, void* heap) { #if defined(WOLFSSL_SP_SMALL) || defined(WOLFSSL_SMALL_STACK) - sp_digit* d; + sp_digit* d = NULL; #else sp_digit ed[2*4]; sp_digit xd[2*4];