Merge pull request #3123 from SparkiDev/mp_rshb

rshb check range of n
This commit is contained in:
toddouska
2020-07-20 13:08:45 -07:00
committed by GitHub
3 changed files with 40 additions and 11 deletions

View File

@@ -549,6 +549,17 @@ void mp_rshb (mp_int *c, int x)
mp_digit r, rr; mp_digit r, rr;
mp_digit D = x; mp_digit D = x;
/* shifting by a negative number not supported */
if (x < 0) return;
/* shift digits first if needed */
if (x >= DIGIT_BIT) {
mp_rshd(c, x / DIGIT_BIT);
/* recalculate number of bits to shift */
D = x % DIGIT_BIT;
}
/* zero shifted is always zero */
if (mp_iszero(c)) return; if (mp_iszero(c)) return;
/* mask */ /* mask */

View File

@@ -658,21 +658,28 @@ int sp_sub(sp_int* a, sp_int* b, sp_int* r)
*/ */
void sp_rshb(sp_int* a, int n, sp_int* r) void sp_rshb(sp_int* a, int n, sp_int* r)
{ {
int i; int i = n / SP_WORD_SIZE;
int j; int j;
int s = n % SP_WORD_SIZE;
if (s == 0) { if (i >= a->used) {
for (i = n / SP_WORD_SIZE, j = 0; i < a->used-1; i++, j++) r->dp[0] = 0;
r->dp[j] = a->dp[i]; r->used = 0;
} }
else { else {
for (i = n / SP_WORD_SIZE, j = 0; i < a->used-1; i++, j++) n %= SP_WORD_SIZE;
r->dp[j] = (a->dp[i] >> s) | (a->dp[i+1] << (SP_WORD_SIZE - s)); if (n == 0) {
for (j = 0; i < a->used; i++, j++)
r->dp[j] = a->dp[i];
r->used = j;
} }
r->dp[j] = a->dp[i] >> s; if (n > 0) {
for (j = 0; i < a->used-1; i++, j++)
r->dp[j] = (a->dp[i] >> n) | (a->dp[i+1] << (SP_WORD_SIZE - n));
r->dp[j] = a->dp[i] >> n;
r->used = j + 1; r->used = j + 1;
sp_clamp(r); sp_clamp(r);
}
}
} }
/* Multiply a by digit n and put result into r shifting up o digits. /* Multiply a by digit n and put result into r shifting up o digits.

View File

@@ -3415,6 +3415,17 @@ void fp_rshb(fp_int *c, int x)
fp_digit r, rr; fp_digit r, rr;
fp_digit D = x; fp_digit D = x;
/* shifting by a negative number not supported */
if (x < 0) return;
/* shift digits first if needed */
if (x >= DIGIT_BIT) {
fp_rshd(c, x / DIGIT_BIT);
/* recalculate number of bits to shift */
D = x % DIGIT_BIT;
}
/* zero shifted is always zero */
if (fp_iszero(c)) return; if (fp_iszero(c)) return;
/* mask */ /* mask */