summaryrefslogtreecommitdiffstats
path: root/crypto/bn/bn_exp2.c
diff options
context:
space:
mode:
authorBodo Möller <bodo@openssl.org>2000-11-30 00:33:18 +0000
committerBodo Möller <bodo@openssl.org>2000-11-30 00:33:18 +0000
commit73c2522c7ce821f2c837b58eec7780fb43aa7d4f (patch)
treeba2134dd79ac3f63a164dc40a059627f9801a6b2 /crypto/bn/bn_exp2.c
parent6b5d39e82d9919f204dae3acae3769e00df71b4d (diff)
Handle special cases correctly in exponentation functions.
test_bn still fails in the BN_sqrt test because small primes appear to turn into zero for no obvious reason, leading to "div by zero" errors.
Diffstat (limited to 'crypto/bn/bn_exp2.c')
-rw-r--r--crypto/bn/bn_exp2.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/crypto/bn/bn_exp2.c b/crypto/bn/bn_exp2.c
index 56f1c959bd..4b41dae078 100644
--- a/crypto/bn/bn_exp2.c
+++ b/crypto/bn/bn_exp2.c
@@ -144,11 +144,6 @@ int BN_mod_exp2_mont(BIGNUM *rr, const BIGNUM *a1, const BIGNUM *p1,
ret = BN_one(rr);
return ret;
}
- if (BN_is_zero(a1) || BN_is_zero(a2))
- {
- ret = BN_zero(rr);
- return ret;
- }
bits=(bits1 > bits2)?bits1:bits2;
@@ -173,7 +168,7 @@ int BN_mod_exp2_mont(BIGNUM *rr, const BIGNUM *a1, const BIGNUM *p1,
*/
BN_init(&val1[0]);
ts1=1;
- if (BN_ucmp(a1,m) >= 0)
+ if (a1->neg || BN_ucmp(a1,m) >= 0)
{
if (!BN_mod(&(val1[0]),a1,m,ctx))
goto err;
@@ -181,6 +176,12 @@ int BN_mod_exp2_mont(BIGNUM *rr, const BIGNUM *a1, const BIGNUM *p1,
}
else
a_mod_m = a1;
+ if (BN_is_zero(&(val1[0])))
+ {
+ ret = BN_zero(rr);
+ goto err;
+ }
+
if (!BN_to_montgomery(&(val1[0]),a_mod_m,mont,ctx)) goto err;
if (window1 > 1)
{
@@ -202,7 +203,7 @@ int BN_mod_exp2_mont(BIGNUM *rr, const BIGNUM *a1, const BIGNUM *p1,
*/
BN_init(&val2[0]);
ts2=1;
- if (BN_ucmp(a2,m) >= 0)
+ if (a2->neg || BN_ucmp(a2,m) >= 0)
{
if (!BN_mod(&(val2[0]),a2,m,ctx))
goto err;
@@ -210,6 +211,11 @@ int BN_mod_exp2_mont(BIGNUM *rr, const BIGNUM *a1, const BIGNUM *p1,
}
else
a_mod_m = a2;
+ if (BN_is_zero(&(val2[0])))
+ {
+ ret = BN_zero(rr);
+ goto err;
+ }
if (!BN_to_montgomery(&(val2[0]),a_mod_m,mont,ctx)) goto err;
if (window2 > 1)
{