diff --git a/wolfcrypt/src/sp_int.c b/wolfcrypt/src/sp_int.c index cb78a7681..c7973d989 100644 --- a/wolfcrypt/src/sp_int.c +++ b/wolfcrypt/src/sp_int.c @@ -4352,10 +4352,10 @@ static int _sp_mont_red(sp_int* a, sp_int* m, sp_int_digit mp); */ static void _sp_zero(sp_int* a) { - a->used = 0; - a->dp[0] = 0; + ((sp_int_minimal *)a)->used = 0; + ((sp_int_minimal *)a)->dp[0] = 0; #ifdef WOLFSSL_SP_INT_NEGATIVE - a->sign = MP_ZPOS; + ((sp_int_minimal *)a)->sign = MP_ZPOS; #endif } @@ -4394,10 +4394,20 @@ int sp_init(sp_int* a) */ int sp_init_size(sp_int* a, int size) { - int err = sp_init(a); + int err = MP_OKAY; + + if (a == NULL) { + err = MP_VAL; + } + if (err == MP_OKAY) { + #ifdef HAVE_WOLF_BIGINT + wc_bigint_init(&a->raw); + #endif + _sp_zero(a); + } if (err == MP_OKAY) { - a->size = size; + ((sp_int_minimal *)a)->size = size; } return err; diff --git a/wolfssl/wolfcrypt/sp_int.h b/wolfssl/wolfcrypt/sp_int.h index ca91b52e1..7d5de0674 100644 --- a/wolfssl/wolfcrypt/sp_int.h +++ b/wolfssl/wolfcrypt/sp_int.h @@ -778,6 +778,19 @@ typedef struct sp_int { sp_int_digit dp[SP_INT_DIGITS]; } sp_int; +typedef struct sp_int_minimal { + int used; + int size; +#ifdef WOLFSSL_SP_INT_NEGATIVE + int sign; +#endif +#ifdef HAVE_WOLF_BIGINT + struct WC_BIGINT raw; +#endif + /** First digit of number. */ + sp_int_digit dp[1]; +} sp_int_minimal; + /* Multi-precision integer type is SP integer type. */ typedef sp_int mp_int; /* Multi-precision integer digit type is SP integer digit type.