diff --git a/crypto/bn/bn_exp.c b/crypto/bn/bn_exp.c index 51c8282593ee366f886b471fa20665ac8c6207b2..f7e7ced2ca0840973aa205f6323b7eccf4ee9f49 100644 --- a/crypto/bn/bn_exp.c +++ b/crypto/bn/bn_exp.c @@ -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) diff --git a/crypto/bn/bn_exp2.c b/crypto/bn/bn_exp2.c index 56f1c959bddce4cc363f0d9d65bb77f57de4be42..4b41dae07896ccf0f844b03839e0651e67b830ff 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) {