提交 fc2e05c2 编写于 作者: B Bodo Möller

Fix BN_rshift, which caused lots of trouble.

上级 b2993bde
...@@ -3,6 +3,9 @@ ...@@ -3,6 +3,9 @@
Changes between 0.9.6 and 0.9.7 [xx XXX 2000] Changes between 0.9.6 and 0.9.7 [xx XXX 2000]
*) BN_rshift bugfix for n == 0.
[Bodo Moeller]
*) Reformat the FAQ so the different questions and answers can be divided *) Reformat the FAQ so the different questions and answers can be divided
i sections depending on the subject. i sections depending on the subject.
[Richard Levitte] [Richard Levitte]
......
...@@ -928,7 +928,7 @@ void bn_mul_high(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, BN_ULONG *l, int n2, ...@@ -928,7 +928,7 @@ void bn_mul_high(BN_ULONG *r, BN_ULONG *a, BN_ULONG *b, BN_ULONG *l, int n2,
} }
#endif /* BN_RECURSION */ #endif /* BN_RECURSION */
int BN_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx) int BN_mul(BIGNUM *r, /* almost const */ const BIGNUM *a, /* almost const */ const BIGNUM *b, BN_CTX *ctx)
{ {
int top,al,bl; int top,al,bl;
BIGNUM *rr; BIGNUM *rr;
......
...@@ -172,6 +172,11 @@ int BN_rshift(BIGNUM *r, const BIGNUM *a, int n) ...@@ -172,6 +172,11 @@ int BN_rshift(BIGNUM *r, const BIGNUM *a, int n)
r->neg=a->neg; r->neg=a->neg;
if (bn_wexpand(r,a->top-nw+1) == NULL) return(0); if (bn_wexpand(r,a->top-nw+1) == NULL) return(0);
} }
else
{
if (n == 0)
return 1; /* or the copying loop will go berserk */
}
f= &(a->d[nw]); f= &(a->d[nw]);
t=r->d; t=r->d;
......
...@@ -165,7 +165,6 @@ int main(int argc, char *argv[]) ...@@ -165,7 +165,6 @@ int main(int argc, char *argv[])
if (!results) if (!results)
BIO_puts(out,"obase=16\nibase=16\n"); BIO_puts(out,"obase=16\nibase=16\n");
#if 0
message(out,"BN_add"); message(out,"BN_add");
if (!test_add(out)) goto err; if (!test_add(out)) goto err;
BIO_flush(out); BIO_flush(out);
...@@ -230,7 +229,6 @@ int main(int argc, char *argv[]) ...@@ -230,7 +229,6 @@ int main(int argc, char *argv[])
message(out,"BN_exp"); message(out,"BN_exp");
if (!test_exp(out,ctx)) goto err; if (!test_exp(out,ctx)) goto err;
BIO_flush(out); BIO_flush(out);
#endif
message(out,"BN_kronecker"); message(out,"BN_kronecker");
if (!test_kron(out,ctx)) goto err; if (!test_kron(out,ctx)) goto err;
...@@ -946,34 +944,20 @@ int test_kron(BIO *bp, BN_CTX *ctx) ...@@ -946,34 +944,20 @@ int test_kron(BIO *bp, BN_CTX *ctx)
* don't want to test whether b is prime but whether BN_kronecker * don't want to test whether b is prime but whether BN_kronecker
* works.) */ * works.) */
#if 0
if (!BN_generate_prime(b, 512, 0, NULL, NULL, genprime_cb, NULL)) goto err; if (!BN_generate_prime(b, 512, 0, NULL, NULL, genprime_cb, NULL)) goto err;
#else
if (!BN_set_word(b,65537)) goto err;
#endif
putc('\n', stderr); putc('\n', stderr);
for (i = 0; i < num0; i++) for (i = 0; i < num0; i++)
{ {
#if 0
if (!BN_rand(a, 512, 0, 0)) goto err; if (!BN_rand(a, 512, 0, 0)) goto err;
a->neg = rand_neg(); a->neg = rand_neg();
#else
if (!BN_bin2bn("\x01\xff\xff\xff\xff", 5, a)) goto err;
#endif
/* t := (b-1)/2 (note that b is odd) */ /* t := (b-1)/2 (note that b is odd) */
if (!BN_copy(t, b)) goto err; if (!BN_copy(t, b)) goto err;
if (!BN_sub_word(t, 1)) goto err; if (!BN_sub_word(t, 1)) goto err;
if (!BN_rshift1(t, t)) goto err; if (!BN_rshift1(t, t)) goto err;
/* r := a^t mod b */ /* r := a^t mod b */
#if 0
if (!BN_mod_exp(r, a, t, b, ctx)) goto err; if (!BN_mod_exp(r, a, t, b, ctx)) goto err;
#elif 0
if (!BN_mod_exp_recp(r, a, t, b, ctx)) goto err;
#else
if (!BN_mod_exp_simple(r, a, t, b, ctx)) goto err;
#endif
if (BN_is_word(r, 1)) if (BN_is_word(r, 1))
legendre = 1; legendre = 1;
...@@ -989,7 +973,7 @@ int test_kron(BIO *bp, BN_CTX *ctx) ...@@ -989,7 +973,7 @@ int test_kron(BIO *bp, BN_CTX *ctx)
} }
legendre = -1; legendre = -1;
} }
kronecker = BN_kronecker(a, b, ctx); kronecker = BN_kronecker(a, b, ctx);
if (kronecker < -1) goto err; if (kronecker < -1) goto err;
...@@ -997,7 +981,7 @@ int test_kron(BIO *bp, BN_CTX *ctx) ...@@ -997,7 +981,7 @@ int test_kron(BIO *bp, BN_CTX *ctx)
{ {
fprintf(stderr, "legendre != kronecker; a = "); fprintf(stderr, "legendre != kronecker; a = ");
BN_print_fp(stderr, a); BN_print_fp(stderr, a);
fprintf(stderr, ", a = "); fprintf(stderr, ", b = ");
BN_print_fp(stderr, b); BN_print_fp(stderr, b);
fprintf(stderr, "\n"); fprintf(stderr, "\n");
goto err; goto err;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册