From: Niels Möller Date: Fri, 22 Oct 2021 07:46:03 +0000 (+0200) Subject: Extend ecc-mod-test, with improved coverage of corner cases. X-Git-Tag: nettle_3.8_release_20220602~88 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=45028ff232dd90fd2afce6e1550a4ca3b0844612;p=thirdparty%2Fnettle.git Extend ecc-mod-test, with improved coverage of corner cases. --- diff --git a/ChangeLog b/ChangeLog index c3bae072..64d2b311 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2021-10-06 Niels Möller + + * 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 * Makefile.in (nettle.pdf): Generate pdf manual using texi2pdf, diff --git a/testsuite/ecc-mod-test.c b/testsuite/ecc-mod-test.c index 8a074c7d..719789c0 100644 --- a/testsuite/ecc-mod-test.c +++ b/testsuite/ecc-mod-test.c @@ -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);