From 61c2fd9a2bddf5e024be77dfbb76e45a8a3e7867 Mon Sep 17 00:00:00 2001 From: Sean Parkinson Date: Wed, 30 Nov 2022 16:36:48 +1000 Subject: [PATCH] SP int: don't call sp_clear unless no longer using sp_int Put in casts to be sure no compiler complains. Tidy up other parts of the code. --- wolfcrypt/src/sp_int.c | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/wolfcrypt/src/sp_int.c b/wolfcrypt/src/sp_int.c index 0b82ab546..bc8c6c685 100644 --- a/wolfcrypt/src/sp_int.c +++ b/wolfcrypt/src/sp_int.c @@ -5614,9 +5614,6 @@ static int _sp_add_d(sp_int* a, sp_int_digit d, sp_int* r) */ static void _sp_sub_d(sp_int* a, sp_int_digit d, sp_int* r) { - int i = 0; - sp_int_digit a0 = a->dp[0]; - /* Set result used to be same as input. Updated with clamp. */ r->used = a->used; /* Only possible when not handling negatives. */ @@ -5625,6 +5622,9 @@ static void _sp_sub_d(sp_int* a, sp_int_digit d, sp_int* r) r->dp[0] = 0; } else { + int i = 0; + sp_int_digit a0 = a->dp[0]; + r->dp[0] = a0 - d; /* Check for borrow. */ if (r->dp[0] > a0) { @@ -7796,9 +7796,12 @@ static int _sp_div(sp_int* a, sp_int* d, sp_int* r, sp_int* trial) /* Set result size to clear. */ r->used = a->used - d->used + 1; /* Set all potentially used digits to zero. */ - sp_clear(r); - /* Set result size. */ - r->used = a->used - d->used + 1; + for (i = 0; i < r->used; i++) { + r->dp[i] = 0; + } +#ifdef WOLFSSL_SP_INT_NEGATIVE + r->sign = MP_ZPOS; +#endif /* Get the most significant digit (will have top bit set). */ dt = d->dp[d->used-1]; @@ -17716,7 +17719,7 @@ static WC_INLINE int sp_div_primes(sp_int* a, int* haveRes, int* result) /* Do trial division of a with all known small primes. */ for (i = 0; i < SP_PRIME_SIZE; i++) { /* Small prime divides a when remainder is 0. */ - err = sp_mod_d(a, sp_primes[i], &d); + err = sp_mod_d(a, (sp_int_digit)sp_primes[i], &d); if ((err != MP_OKAY) || (d == 0)) { *result = MP_NO; *haveRes = 1; @@ -17726,7 +17729,7 @@ static WC_INLINE int sp_div_primes(sp_int* a, int* haveRes, int* result) #else /* Start with first prime in composite. */ i = 0; - for (j = 0; (!*haveRes) && (j < SP_COMP_CNT); j++) { + for (j = 0; (!(*haveRes)) && (j < SP_COMP_CNT); j++) { /* Reduce a down to a single word. */ err = sp_mod_d(a, sp_comp[j], &d); if ((err != MP_OKAY) || (d == 0)) { @@ -17891,7 +17894,7 @@ int sp_prime_is_prime_ex(sp_int* a, int trials, int* result, WC_RNG* rng) /* Check against known small primes when a has 1 digit. */ if ((err == MP_OKAY) && (!haveRes) && (a->used == 1) && - (a->dp[0] <= sp_primes[SP_PRIME_SIZE - 1])) { + (a->dp[0] <= (sp_int_digit)sp_primes[SP_PRIME_SIZE - 1])) { haveRes = sp_cmp_primes(a, &ret); } @@ -17940,7 +17943,7 @@ int sp_prime_is_prime_ex(sp_int* a, int trials, int* result, WC_RNG* rng) b->dp[b->used-1] >>= SP_WORD_SIZE - ((baseSz * 8) & SP_WORD_MASK); } - #endif /* LITTLE_ENDIAN_ORDER */ + #endif /* BIG_ENDIAN_ORDER */ /* Ensure the top word has no more bits than necessary. */ if (bits > 0) {