Change comments. (The expected number of iterations in BN_rand_range
[oweals/openssl.git] / crypto / bn / bntest.c
index 12d68fc526c665178070199437a99e3adefdc921..b83d0ba30d420e96ac70adde2c2eedd157130ca1 100644 (file)
@@ -109,11 +109,9 @@ static const char rnd_seed[] = "string to make the random number generator think
 static void message(BIO *out, char *m)
        {
        fprintf(stderr, "test %s\n", m);
-#if defined(linux) || defined(__FreeBSD__) /* can we use GNU bc features? */
        BIO_puts(out, "print \"test ");
        BIO_puts(out, m);
        BIO_puts(out, "\\n\"\n");
-#endif
        }
 
 int main(int argc, char *argv[])
@@ -909,6 +907,7 @@ int test_kron(BIO *bp, BN_CTX *ctx)
         * works.) */
 
        if (!BN_generate_prime(b, 512, 0, NULL, NULL, genprime_cb, NULL)) goto err;
+       b->neg = rand_neg();
        putc('\n', stderr);
 
        for (i = 0; i < num0; i++)
@@ -916,12 +915,16 @@ int test_kron(BIO *bp, BN_CTX *ctx)
                if (!BN_bntest_rand(a, 512, 0, 0)) goto err;
                a->neg = rand_neg();
 
-               /* 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;
+               t->neg = 0;
                if (!BN_sub_word(t, 1)) goto err;
                if (!BN_rshift1(t, t)) goto err;
                /* r := a^t mod b */
-               if (!BN_mod_exp(r, a, t, b, ctx)) goto err;
+               b->neg=0;
+               
+               if (!BN_mod_exp_recp(r, a, t, b, ctx)) goto err; /* XXX should be BN_mod_exp_recp, but ..._recp triggers a bug that must be fixed */
+               b->neg=1;
 
                if (BN_is_word(r, 1))
                        legendre = 1;
@@ -930,7 +933,7 @@ int test_kron(BIO *bp, BN_CTX *ctx)
                else
                        {
                        if (!BN_add_word(r, 1)) goto err;
-                       if (0 != BN_cmp(r, b))
+                       if (0 != BN_ucmp(r, b))
                                {
                                fprintf(stderr, "Legendre symbol computation failed\n");
                                goto err;
@@ -940,6 +943,9 @@ int test_kron(BIO *bp, BN_CTX *ctx)
                
                kronecker = BN_kronecker(a, b, ctx);
                if (kronecker < -1) goto err;
+               /* we actually need BN_kronecker(a, |b|) */
+               if (a->neg && b->neg)
+                       kronecker = -kronecker;
                
                if (legendre != kronecker)
                        {
@@ -993,6 +999,7 @@ int test_sqrt(BIO *bp, BN_CTX *ctx)
                        if (!BN_generate_prime(p, 256, 0, a, r, genprime_cb, NULL)) goto err;
                        putc('\n', stderr);
                        }
+               p->neg = rand_neg();
 
                for (j = 0; j < num2; j++)
                        {
@@ -1005,6 +1012,8 @@ int test_sqrt(BIO *bp, BN_CTX *ctx)
                        if (!BN_nnmod(a, a, p, ctx)) goto err;
                        if (!BN_mod_sqr(a, a, p, ctx)) goto err;
                        if (!BN_mul(a, a, r, ctx)) goto err;
+                       if (rand_neg())
+                               if (!BN_sub(a, a, p)) goto err;
 
                        if (!BN_mod_sqrt(r, a, p, ctx)) goto err;
                        if (!BN_mod_sqr(r, r, p, ctx)) goto err;
@@ -1210,7 +1219,7 @@ int test_rshift1(BIO *bp)
                        }
                BN_sub(c,a,b);
                BN_sub(c,c,b);
-               if(!BN_is_zero(c) && !BN_is_one(c))
+               if(!BN_is_zero(c) && !BN_abs_is_word(c, 1))
                    {
                    fprintf(stderr,"Right shift one test failed!\n");
                    return 0;