]> git.ipfire.org Git - thirdparty/nettle.git/commitdiff
Extend ecc-mod-test, with improved coverage of corner cases.
authorNiels Möller <nisse@lysator.liu.se>
Fri, 22 Oct 2021 07:46:03 +0000 (09:46 +0200)
committerNiels Möller <nisse@lysator.liu.se>
Fri, 22 Oct 2021 07:46:03 +0000 (09:46 +0200)
ChangeLog
testsuite/ecc-mod-test.c

index c3bae072d1cd68b4dd85d2ca67b89ff84eab9e65..64d2b31197cce249460841273e39c9bbac7d9b70 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2021-10-06  Niels Möller  <nisse@lysator.liu.se>
+
+       * testsuite/ecc-mod-test.c: Extend tests to give better coverage
+       of corner cases, with input close to a multiple of the modulo.
+
 2021-09-21  Niels Möller  <nisse@lysator.liu.se>
 
        * Makefile.in (nettle.pdf): Generate pdf manual using texi2pdf,
index 8a074c7d5df302644f543d65a0c827e707f2d46c..719789c03081f49cf5da24d7e1e1e8f7b93c950d 100644 (file)
@@ -122,10 +122,39 @@ test_modulo (gmp_randstate_t rands, const char *name,
 
   for (j = 0; j < count; j++)
     {
-      if (j & 1)
-       mpz_rrandomb (r, rands, 2*m->size * GMP_NUMB_BITS);
+      if (j & 2)
+       {
+         if (j & 1)
+           mpz_rrandomb (r, rands, 2*m->size * GMP_NUMB_BITS);
+         else
+           mpz_urandomb (r, rands, 2*m->size * GMP_NUMB_BITS);
+       }
       else
-       mpz_urandomb (r, rands, 2*m->size * GMP_NUMB_BITS);
+       {
+         /* Test inputs close to a multiple of m. */
+         mpz_t q;
+         unsigned q_size;
+         int diff;
+
+         mpz_urandomb(r, rands, 30);
+         q_size = 11 + mpz_get_ui(r) % (m->size * GMP_NUMB_BITS - 10);
+         mpz_urandomb(r, rands, 30);
+         diff = mpz_get_si(r) % 20 - 10;
+
+         if (j & 1)
+           mpz_rrandomb (r, rands, q_size);
+         else
+           mpz_urandomb (r, rands, q_size);
+
+         mpz_mul (r, r, mpz_roinit_n(q, m->m, m->size));
+         if (diff >= 0)
+           mpz_add_ui (r, r, diff);
+         else
+           mpz_sub_ui (r, r, -diff);
+
+         if (mpz_sgn(r) < 0)
+           continue;
+       }
 
       test_one (name, m, r);
     }
@@ -173,9 +202,14 @@ test_patterns (const char *name,
 
   for (j = m->bit_size; j < 2*m->bit_size; j++)
     {
+      /* Single one bit */
       mpz_set_ui (r, 1);
       mpz_mul_2exp (r, r, j);
+      test_one (name, m, r);
 
+      /* All ones. */
+      mpz_mul_2exp (r, r, 1);
+      mpz_sub_ui (r, r, 1);
       test_one (name, m, r);
     }
   mpz_clear (r);