Merge branch 'fix/issues' into develop This closes #90
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
diff --git a/bn_fast_mp_montgomery_reduce.c b/bn_fast_mp_montgomery_reduce.c
index 54d9b0a..43a4d37 100644
--- a/bn_fast_mp_montgomery_reduce.c
+++ b/bn_fast_mp_montgomery_reduce.c
@@ -28,6 +28,10 @@ int fast_mp_montgomery_reduce(mp_int *x, const mp_int *n, mp_digit rho)
int ix, res, olduse;
mp_word W[MP_WARRAY];
+ if (x->used > MP_WARRAY) {
+ return MP_VAL;
+ }
+
/* get old used count */
olduse = x->used;
diff --git a/bn_fast_s_mp_mul_digs.c b/bn_fast_s_mp_mul_digs.c
index 558d151..875798e 100644
--- a/bn_fast_s_mp_mul_digs.c
+++ b/bn_fast_s_mp_mul_digs.c
@@ -87,7 +87,7 @@ int fast_s_mp_mul_digs(const mp_int *a, const mp_int *b, mp_int *c, int digs)
{
mp_digit *tmpc;
tmpc = c->dp;
- for (ix = 0; ix < (pa + 1); ix++) {
+ for (ix = 0; ix < pa; ix++) {
/* now extract the previous digit [below the carry] */
*tmpc++ = W[ix];
}
diff --git a/bn_mp_lshd.c b/bn_mp_lshd.c
index 888989a..b49b545 100644
--- a/bn_mp_lshd.c
+++ b/bn_mp_lshd.c
@@ -24,6 +24,10 @@ int mp_lshd(mp_int *a, int b)
if (b <= 0) {
return MP_OKAY;
}
+ /* no need to shift 0 around */
+ if (mp_iszero(a) == MP_YES) {
+ return MP_OKAY;
+ }
/* grow to fit the new digits */
if (a->alloc < (a->used + b)) {
diff --git a/bn_mp_montgomery_reduce.c b/bn_mp_montgomery_reduce.c
index a38173e..a9c7752 100644
--- a/bn_mp_montgomery_reduce.c
+++ b/bn_mp_montgomery_reduce.c
@@ -29,6 +29,7 @@ int mp_montgomery_reduce(mp_int *x, const mp_int *n, mp_digit rho)
*/
digs = (n->used * 2) + 1;
if ((digs < MP_WARRAY) &&
+ (x->used <= MP_WARRAY) &&
(n->used <
(1 << ((CHAR_BIT * sizeof(mp_word)) - (2 * DIGIT_BIT))))) {
return fast_mp_montgomery_reduce(x, n, rho);