~mdw
/
sgt
/
putty
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Avoid trying to take the modular inverse of zero in response to a
[sgt/putty]
/
sshbn.c
diff --git
a/sshbn.c
b/sshbn.c
index
677b121
..
76529cf
100644
(file)
--- a/
sshbn.c
+++ b/
sshbn.c
@@
-624,6
+624,7
@@
static void internal_mod(BignumInt *a, int alen,
int i, k;
m0 = m[0];
int i, k;
m0 = m[0];
+ assert(m0 >> (BIGNUM_INT_BITS-1) == 1);
if (mlen > 1)
m1 = m[1];
else
if (mlen > 1)
m1 = m[1];
else
@@
-815,20
+816,15
@@
Bignum modpow_simple(Bignum base_in, Bignum exp, Bignum mod)
result[0]--;
/* Free temporary arrays */
result[0]--;
/* Free temporary arrays */
- for (i = 0; i < 2 * mlen; i++)
- a[i] = 0;
+ smemclr(a, 2 * mlen * sizeof(*a));
sfree(a);
sfree(a);
- for (i = 0; i < scratchlen; i++)
- scratch[i] = 0;
+ smemclr(scratch, scratchlen * sizeof(*scratch));
sfree(scratch);
sfree(scratch);
- for (i = 0; i < 2 * mlen; i++)
- b[i] = 0;
+ smemclr(b, 2 * mlen * sizeof(*b));
sfree(b);
sfree(b);
- for (i = 0; i < mlen; i++)
- m[i] = 0;
+ smemclr(m, mlen * sizeof(*m));
sfree(m);
sfree(m);
- for (i = 0; i < mlen; i++)
- n[i] = 0;
+ smemclr(n, mlen * sizeof(*n));
sfree(n);
freebn(base);
sfree(n);
freebn(base);
@@
-965,23
+961,17
@@
Bignum modpow(Bignum base_in, Bignum exp, Bignum mod)
result[0]--;
/* Free temporary arrays */
result[0]--;
/* Free temporary arrays */
- for (i = 0; i < scratchlen; i++)
- scratch[i] = 0;
+ smemclr(scratch, scratchlen * sizeof(*scratch));
sfree(scratch);
sfree(scratch);
- for (i = 0; i < 2 * len; i++)
- a[i] = 0;
+ smemclr(a, 2 * len * sizeof(*a));
sfree(a);
sfree(a);
- for (i = 0; i < 2 * len; i++)
- b[i] = 0;
+ smemclr(b, 2 * len * sizeof(*b));
sfree(b);
sfree(b);
- for (i = 0; i < len; i++)
- mninv[i] = 0;
+ smemclr(mninv, len * sizeof(*mninv));
sfree(mninv);
sfree(mninv);
- for (i = 0; i < len; i++)
- n[i] = 0;
+ smemclr(n, len * sizeof(*n));
sfree(n);
sfree(n);
- for (i = 0; i < len; i++)
- x[i] = 0;
+ smemclr(x, len * sizeof(*x));
sfree(x);
return result;
sfree(x);
return result;
@@
-999,6
+989,12
@@
Bignum modmul(Bignum p, Bignum q, Bignum mod)
int pqlen, mlen, rlen, i, j;
Bignum result;
int pqlen, mlen, rlen, i, j;
Bignum result;
+ /*
+ * The most significant word of mod needs to be non-zero. It
+ * should already be, but let's make sure.
+ */
+ assert(mod[mod[0]] != 0);
+
/* Allocate m of size mlen, copy mod to m */
/* We use big endian internally */
mlen = mod[0];
/* Allocate m of size mlen, copy mod to m */
/* We use big endian internally */
mlen = mod[0];
@@
-1071,20
+1067,15
@@
Bignum modmul(Bignum p, Bignum q, Bignum mod)
result[0]--;
/* Free temporary arrays */
result[0]--;
/* Free temporary arrays */
- for (i = 0; i < scratchlen; i++)
- scratch[i] = 0;
+ smemclr(scratch, scratchlen * sizeof(*scratch));
sfree(scratch);
sfree(scratch);
- for (i = 0; i < 2 * pqlen; i++)
- a[i] = 0;
+ smemclr(a, 2 * pqlen * sizeof(*a));
sfree(a);
sfree(a);
- for (i = 0; i < mlen; i++)
- m[i] = 0;
+ smemclr(m, mlen * sizeof(*m));
sfree(m);
sfree(m);
- for (i = 0; i < pqlen; i++)
- n[i] = 0;
+ smemclr(n, pqlen * sizeof(*n));
sfree(n);
sfree(n);
- for (i = 0; i < pqlen; i++)
- o[i] = 0;
+ smemclr(o, pqlen * sizeof(*o));
sfree(o);
return result;
sfree(o);
return result;
@@
-1103,6
+1094,12
@@
static void bigdivmod(Bignum p, Bignum mod, Bignum result, Bignum quotient)
int mshift;
int plen, mlen, i, j;
int mshift;
int plen, mlen, i, j;
+ /*
+ * The most significant word of mod needs to be non-zero. It
+ * should already be, but let's make sure.
+ */
+ assert(mod[mod[0]] != 0);
+
/* Allocate m of size mlen, copy mod to m */
/* We use big endian internally */
mlen = mod[0];
/* Allocate m of size mlen, copy mod to m */
/* We use big endian internally */
mlen = mod[0];
@@
-1154,11
+1151,9
@@
static void bigdivmod(Bignum p, Bignum mod, Bignum result, Bignum quotient)
}
/* Free temporary arrays */
}
/* Free temporary arrays */
- for (i = 0; i < mlen; i++)
- m[i] = 0;
+ smemclr(m, mlen * sizeof(*m));
sfree(m);
sfree(m);
- for (i = 0; i < plen; i++)
- n[i] = 0;
+ smemclr(n, plen * sizeof(*n));
sfree(n);
}
sfree(n);
}
@@
-1405,8
+1400,7
@@
Bignum bigmuladd(Bignum a, Bignum b, Bignum addend)
}
ret[0] = maxspot;
}
ret[0] = maxspot;
- for (i = 0; i < wslen; i++)
- workspace[i] = 0;
+ smemclr(workspace, wslen * sizeof(*workspace));
sfree(workspace);
return ret;
}
sfree(workspace);
return ret;
}
@@
-1636,6
+1630,9
@@
Bignum modinv(Bignum number, Bignum modulus)
Bignum x = copybn(One);
int sign = +1;
Bignum x = copybn(One);
int sign = +1;
+ assert(number[number[0]] != 0);
+ assert(modulus[modulus[0]] != 0);
+
while (bignum_cmp(b, One) != 0) {
Bignum t = newbn(b[0]);
Bignum q = newbn(a[0]);
while (bignum_cmp(b, One) != 0) {
Bignum t = newbn(b[0]);
Bignum q = newbn(a[0]);
@@
-1757,6
+1754,7
@@
char *bignum_decimal(Bignum x)
/*
* Done.
*/
/*
* Done.
*/
+ smemclr(workspace, x[0] * sizeof(*workspace));
sfree(workspace);
return ret;
}
sfree(workspace);
return ret;
}