Fix BN_rshift, which caused lots of trouble.
authorBodo Möller <bodo@openssl.org>
Thu, 30 Nov 2000 22:34:57 +0000 (22:34 +0000)
committerBodo Möller <bodo@openssl.org>
Thu, 30 Nov 2000 22:34:57 +0000 (22:34 +0000)
CHANGES
crypto/bn/bn_mul.c
crypto/bn/bn_shift.c
crypto/bn/bntest.c

diff --git a/CHANGES b/CHANGES
index eb3e87b..71582c3 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -3,6 +3,9 @@
 
  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
      i sections depending on the subject.
      [Richard Levitte]
index b6608c4..ff351af 100644 (file)
@@ -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 */
 
-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;
        BIGNUM *rr;
index 37c6988..70f785e 100644 (file)
@@ -172,6 +172,11 @@ int BN_rshift(BIGNUM *r, const BIGNUM *a, int n)
                r->neg=a->neg;
                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]);
        t=r->d;
index 3c0c95f..2df0d29 100644 (file)
@@ -165,7 +165,6 @@ int main(int argc, char *argv[])
        if (!results)
                BIO_puts(out,"obase=16\nibase=16\n");
 
-#if 0
        message(out,"BN_add");
        if (!test_add(out)) goto err;
        BIO_flush(out);
@@ -230,7 +229,6 @@ int main(int argc, char *argv[])
        message(out,"BN_exp");
        if (!test_exp(out,ctx)) goto err;
        BIO_flush(out);
-#endif
 
        message(out,"BN_kronecker");
        if (!test_kron(out,ctx)) goto err;
@@ -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
         * works.) */
 
-#if 0
        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);
 
        for (i = 0; i < num0; i++)
                {
-#if 0
                if (!BN_rand(a, 512, 0, 0)) goto err;
                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) */
                if (!BN_copy(t, b)) goto err;
                if (!BN_sub_word(t, 1)) goto err;
                if (!BN_rshift1(t, t)) goto err;
                /* r := a^t mod b */
-#if 0
                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))
                        legendre = 1;
@@ -989,7 +973,7 @@ int test_kron(BIO *bp, BN_CTX *ctx)
                                }
                        legendre = -1;
                        }
-
+               
                kronecker = BN_kronecker(a, b, ctx);
                if (kronecker < -1) goto err;
                
@@ -997,7 +981,7 @@ int test_kron(BIO *bp, BN_CTX *ctx)
                        {
                        fprintf(stderr, "legendre != kronecker; a = ");
                        BN_print_fp(stderr, a);
-                       fprintf(stderr, ", a = ");
+                       fprintf(stderr, ", b = ");
                        BN_print_fp(stderr, b);
                        fprintf(stderr, "\n");
                        goto err;