mirror of
https://github.com/QuasarApp/openssl.git
synced 2025-05-20 05:19:40 +00:00
Move reduction step from BN_mod_exp to BN_mod_exp_mont_word.
Fix BN_mod_exp_simple for a==0 (mod m). Skip useless round in BN_mod_sqrt (1 is always a square, no need to test BN_kronecker for it).
This commit is contained in:
parent
3465dd3853
commit
25439b76ad
@ -191,6 +191,7 @@ int BN_mod_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, const BIGNUM *m,
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#define MONT_MUL_MOD
|
#define MONT_MUL_MOD
|
||||||
|
#define MONT_EXP_WORD
|
||||||
#define RECP_MUL_MOD
|
#define RECP_MUL_MOD
|
||||||
|
|
||||||
#ifdef MONT_MUL_MOD
|
#ifdef MONT_MUL_MOD
|
||||||
@ -202,14 +203,14 @@ int BN_mod_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, const BIGNUM *m,
|
|||||||
|
|
||||||
if (BN_is_odd(m))
|
if (BN_is_odd(m))
|
||||||
{
|
{
|
||||||
|
# ifdef MONT_EXP_WORD
|
||||||
if (a->top == 1 && !a->neg)
|
if (a->top == 1 && !a->neg)
|
||||||
{
|
{
|
||||||
BN_ULONG A = a->d[0];
|
BN_ULONG A = a->d[0];
|
||||||
if (m->top == 1)
|
|
||||||
A %= m->d[0]; /* make sure that A is reduced */
|
|
||||||
ret=BN_mod_exp_mont_word(r,A,p,m,ctx,NULL);
|
ret=BN_mod_exp_mont_word(r,A,p,m,ctx,NULL);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
# endif
|
||||||
ret=BN_mod_exp_mont(r,a,p,m,ctx,NULL);
|
ret=BN_mod_exp_mont(r,a,p,m,ctx,NULL);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -505,11 +506,14 @@ int BN_mod_exp_mont_word(BIGNUM *rr, BN_ULONG a, const BIGNUM *p,
|
|||||||
bn_check_top(p);
|
bn_check_top(p);
|
||||||
bn_check_top(m);
|
bn_check_top(m);
|
||||||
|
|
||||||
if (!(m->d[0] & 1))
|
if (m->top == 0 || !(m->d[0] & 1))
|
||||||
{
|
{
|
||||||
BNerr(BN_F_BN_MOD_EXP_MONT_WORD,BN_R_CALLED_WITH_EVEN_MODULUS);
|
BNerr(BN_F_BN_MOD_EXP_MONT_WORD,BN_R_CALLED_WITH_EVEN_MODULUS);
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
if (m->top == 1)
|
||||||
|
a %= m->d[0]; /* make sure that 'a' is reduced */
|
||||||
|
|
||||||
bits = BN_num_bits(p);
|
bits = BN_num_bits(p);
|
||||||
if (bits == 0)
|
if (bits == 0)
|
||||||
{
|
{
|
||||||
@ -642,8 +646,8 @@ int BN_mod_exp_simple(BIGNUM *r,
|
|||||||
if (!BN_nnmod(&(val[0]),a,m,ctx)) goto err; /* 1 */
|
if (!BN_nnmod(&(val[0]),a,m,ctx)) goto err; /* 1 */
|
||||||
if (BN_is_zero(&(val[0])))
|
if (BN_is_zero(&(val[0])))
|
||||||
{
|
{
|
||||||
ret = BN_one(r);
|
ret = BN_zero(r);
|
||||||
return ret;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
window = BN_window_bits_for_exponent_size(bits);
|
window = BN_window_bits_for_exponent_size(bits);
|
||||||
|
@ -140,13 +140,13 @@ BIGNUM *BN_mod_sqrt(BIGNUM *in, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx)
|
|||||||
|
|
||||||
/* e > 1, so we really have to use the Tonelli/Shanks algorithm.
|
/* e > 1, so we really have to use the Tonelli/Shanks algorithm.
|
||||||
* First, find some y that is not a square. */
|
* First, find some y that is not a square. */
|
||||||
i = 1;
|
i = 2;
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
/* For efficiency, try small numbers first;
|
/* For efficiency, try small numbers first;
|
||||||
* if this fails, try random numbers.
|
* if this fails, try random numbers.
|
||||||
*/
|
*/
|
||||||
if (i < 20)
|
if (i < 22)
|
||||||
{
|
{
|
||||||
if (!BN_set_word(y, i)) goto end;
|
if (!BN_set_word(y, i)) goto end;
|
||||||
}
|
}
|
||||||
@ -171,7 +171,7 @@ BIGNUM *BN_mod_sqrt(BIGNUM *in, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx)
|
|||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
while (r == 1 && i++ < 80);
|
while (r == 1 && ++i < 82);
|
||||||
|
|
||||||
if (r != -1)
|
if (r != -1)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user