Handle special cases correctly in exponentation functions.
authorBodo Möller <bodo@openssl.org>
Thu, 30 Nov 2000 00:33:18 +0000 (00:33 +0000)
committerBodo Möller <bodo@openssl.org>
Thu, 30 Nov 2000 00:33:18 +0000 (00:33 +0000)
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.

crypto/bn/bn_exp.c
crypto/bn/bn_exp2.c

index 51c8282593ee366f886b471fa20665ac8c6207b2..f7e7ced2ca0840973aa205f6323b7eccf4ee9f49 100644 (file)
@@ -240,11 +240,6 @@ int BN_mod_exp_recp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p,
                ret = BN_one(r);
                return ret;
                }
-       if (BN_is_zero(a))
-               {
-               ret = BN_zero(r);
-               return ret;
-               }
 
        BN_CTX_start(ctx);
        if ((aa = BN_CTX_get(ctx)) == NULL) goto err;
@@ -256,6 +251,11 @@ int BN_mod_exp_recp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p,
        ts=1;
 
        if (!BN_nnmod(&(val[0]),a,m,ctx)) goto err;             /* 1 */
+       if (BN_is_zero(&(val[0])))
+               {
+               ret = BN_zero(r);
+               goto err;
+               }
 
        window = BN_window_bits_for_exponent_size(bits);
        if (window > 1)
@@ -365,11 +365,7 @@ int BN_mod_exp_mont(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p,
                ret = BN_one(rr);
                return ret;
                }
-       if (BN_is_zero(a))
-               {
-               ret = BN_zero(rr);
-               return ret;
-               }
+
        BN_CTX_start(ctx);
        d = BN_CTX_get(ctx);
        r = BN_CTX_get(ctx);
@@ -396,6 +392,11 @@ int BN_mod_exp_mont(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p,
                }
        else
                aa=a;
+       if (BN_is_zero(aa))
+               {
+               ret = BN_zero(rr);
+               goto err;
+               }
        if (!BN_to_montgomery(&(val[0]),aa,mont,ctx)) goto err; /* 1 */
 
        window = BN_window_bits_for_exponent_size(bits);
@@ -632,11 +633,6 @@ int BN_mod_exp_simple(BIGNUM *r,
                ret = BN_one(r);
                return ret;
                }
-       if (BN_is_zero(a))
-               {
-               ret = BN_one(r);
-               return ret;
-               }
 
        BN_CTX_start(ctx);
        if ((d = BN_CTX_get(ctx)) == NULL) goto err;
@@ -644,6 +640,11 @@ int BN_mod_exp_simple(BIGNUM *r,
        BN_init(&(val[0]));
        ts=1;
        if (!BN_nnmod(&(val[0]),a,m,ctx)) goto err;             /* 1 */
+       if (BN_is_zero(&(val[0])))
+               {
+               ret = BN_one(r);
+               return ret;
+               }
 
        window = BN_window_bits_for_exponent_size(bits);
        if (window > 1)
index 56f1c959bddce4cc363f0d9d65bb77f57de4be42..4b41dae07896ccf0f844b03839e0651e67b830ff 100644 (file)
@@ -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)
                {