SP math lshb: check space for result

pull/3700/head
Sean Parkinson 2021-01-28 15:10:54 +10:00
parent 250b59f8fd
commit ca3c5bf6c4
1 changed files with 36 additions and 27 deletions

View File

@ -4156,35 +4156,42 @@ int sp_lshd(sp_int* a, int s)
*/ */
static int sp_lshb(sp_int* a, int n) static int sp_lshb(sp_int* a, int n)
{ {
int err = MP_OKAY;
if (a->used != 0) { if (a->used != 0) {
int s = n >> SP_WORD_SHIFT; int s = n >> SP_WORD_SHIFT;
int i; int i;
n &= SP_WORD_MASK; if (a->used + s >= a->size) {
if (n != 0) { err = MP_VAL;
sp_int_digit v; }
if (err == MP_OKAY) {
n &= SP_WORD_MASK;
if (n != 0) {
sp_int_digit v;
v = a->dp[a->used - 1] >> (SP_WORD_SIZE - n); v = a->dp[a->used - 1] >> (SP_WORD_SIZE - n);
a->dp[a->used - 1 + s] = a->dp[a->used - 1] << n; a->dp[a->used - 1 + s] = a->dp[a->used - 1] << n;
for (i = a->used - 2; i >= 0; i--) { for (i = a->used - 2; i >= 0; i--) {
a->dp[i + 1 + s] |= a->dp[i] >> (SP_WORD_SIZE - n); a->dp[i + 1 + s] |= a->dp[i] >> (SP_WORD_SIZE - n);
a->dp[i + s] = a->dp[i] << n; a->dp[i + s] = a->dp[i] << n;
}
if (v != 0) {
a->dp[a->used + s] = v;
a->used++;
}
} }
if (v != 0) { else if (s > 0) {
a->dp[a->used + s] = v; for (i = a->used - 1; i >= 0; i--) {
a->used++; a->dp[i + s] = a->dp[i];
}
} }
a->used += s;
XMEMSET(a->dp, 0, SP_WORD_SIZEOF * s);
} }
else if (s > 0) {
for (i = a->used - 1; i >= 0; i--) {
a->dp[i + s] = a->dp[i];
}
}
a->used += s;
XMEMSET(a->dp, 0, SP_WORD_SIZEOF * s);
} }
return MP_OKAY; return err;
} }
#endif /* WOLFSSL_SP_MATH_ALL || !NO_DH || HAVE_ECC || #endif /* WOLFSSL_SP_MATH_ALL || !NO_DH || HAVE_ECC ||
* (!NO_RSA && !WOLFSSL_RSA_VERIFY_ONLY) */ * (!NO_RSA && !WOLFSSL_RSA_VERIFY_ONLY) */
@ -4287,14 +4294,14 @@ int sp_div(sp_int* a, sp_int* d, sp_int* r, sp_int* rem)
int ret; int ret;
int done = 0; int done = 0;
int i; int i;
int s; int s = 0;
sp_int_digit dt; sp_int_digit dt;
sp_int_digit t; sp_int_digit t;
#ifdef WOLFSSL_SMALL_STACK #ifdef WOLFSSL_SMALL_STACK
sp_int* sa = NULL; sp_int* sa = NULL;
sp_int* sd; sp_int* sd = NULL;
sp_int* tr; sp_int* tr = NULL;
sp_int* trial; sp_int* trial = NULL;
#else #else
sp_int sa[1]; sp_int sa[1];
sp_int sd[1]; sp_int sd[1];
@ -4393,10 +4400,12 @@ int sp_div(sp_int* a, sp_int* d, sp_int* r, sp_int* rem)
s = SP_WORD_SIZE - (s & SP_WORD_MASK); s = SP_WORD_SIZE - (s & SP_WORD_MASK);
sp_copy(a, sa); sp_copy(a, sa);
if (s != SP_WORD_SIZE) { if (s != SP_WORD_SIZE) {
sp_lshb(sa, s); err = sp_lshb(sa, s);
sp_copy(d, sd); if (err == MP_OKAY) {
sp_lshb(sd, s); sp_copy(d, sd);
d = sd; d = sd;
err = sp_lshb(sd, s);
}
} }
} }
if ((!done) && (err == MP_OKAY) && (d->used > 0)) { if ((!done) && (err == MP_OKAY) && (d->used > 0)) {