From: Niels Möller Date: Sun, 3 May 2026 18:12:53 +0000 (+0200) Subject: Rework test randomization, new functions test_get_seed and test_randinit. X-Git-Url: http://git.ipfire.org/gitweb/index.cgi?a=commitdiff_plain;h=9410de4ea7dbd69aeea36aefc5dab656e7b4ebe1;p=thirdparty%2Fnettle.git Rework test randomization, new functions test_get_seed and test_randinit. --- diff --git a/ChangeLog b/ChangeLog index 470df6fb..3750e0e7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2026-05-03 Niels Möller + + * testsuite/testutils.c (test_random_seed, test_get_seed): New functions. + (get_random_seed): Deleted, replaced by test_random_seed. + (test_randinit): New function, using gmp_randinit_default and + test_random_seed. Replaces... + (test_randomize): ... deleted function. Updated all callers. + 2026-04-30 Niels Möller * sexp.c: Fix bugs reported by Sebastián Alba Vives. diff --git a/testsuite/ecc-mod-arith-test.c b/testsuite/ecc-mod-arith-test.c index de77d489..414813f6 100644 --- a/testsuite/ecc-mod-arith-test.c +++ b/testsuite/ecc-mod-arith-test.c @@ -145,9 +145,7 @@ test_main (void) gmp_randstate_t rands; unsigned i; - gmp_randinit_default (rands); - - test_randomize(rands); + test_randinit (rands); for (i = 0; ecc_curves[i]; i++) { diff --git a/testsuite/ecc-mod-test.c b/testsuite/ecc-mod-test.c index d6641d38..4133b86d 100644 --- a/testsuite/ecc-mod-test.c +++ b/testsuite/ecc-mod-test.c @@ -217,8 +217,6 @@ test_main (void) gmp_randstate_t rands; unsigned i; - gmp_randinit_default (rands); - test_fixed (); for (i = 0; ecc_curves[i]; i++) @@ -227,7 +225,7 @@ test_main (void) test_patterns ("q", &ecc_curves[i]->p); } - test_randomize(rands); + test_randinit (rands); for (i = 0; ecc_curves[i]; i++) { diff --git a/testsuite/ecc-modinv-test.c b/testsuite/ecc-modinv-test.c index fdb013d7..99ce0fb6 100644 --- a/testsuite/ecc-modinv-test.c +++ b/testsuite/ecc-modinv-test.c @@ -139,8 +139,7 @@ test_main (void) gmp_randstate_t rands; unsigned i; - gmp_randinit_default (rands); - test_randomize(rands); + test_randinit (rands); for (i = 0; ecc_curves[i]; i++) { diff --git a/testsuite/ecc-mul-a-test.c b/testsuite/ecc-mul-a-test.c index ec78ca57..a3657d76 100644 --- a/testsuite/ecc-mul-a-test.c +++ b/testsuite/ecc-mul-a-test.c @@ -7,8 +7,7 @@ test_main (void) mpz_t r; unsigned i; - gmp_randinit_default (rands); - test_randomize (rands); + test_randinit (rands); mpz_init (r); for (i = 0; ecc_curves[i]; i++) diff --git a/testsuite/ecc-mul-g-test.c b/testsuite/ecc-mul-g-test.c index e2396ad0..36282eac 100644 --- a/testsuite/ecc-mul-g-test.c +++ b/testsuite/ecc-mul-g-test.c @@ -7,8 +7,7 @@ test_main (void) mpz_t r; unsigned i; - gmp_randinit_default (rands); - test_randomize(rands); + test_randinit (rands); mpz_init (r); diff --git a/testsuite/ecc-redc-test.c b/testsuite/ecc-redc-test.c index 7caab0b7..1135bb51 100644 --- a/testsuite/ecc-redc-test.c +++ b/testsuite/ecc-redc-test.c @@ -50,8 +50,7 @@ test_main (void) unsigned i; mpz_t r; - gmp_randinit_default (rands); - test_randomize(rands); + test_randinit (rands); mpz_init (r); diff --git a/testsuite/ecc-sqrt-test.c b/testsuite/ecc-sqrt-test.c index 7fe6f176..6747f8e8 100644 --- a/testsuite/ecc-sqrt-test.c +++ b/testsuite/ecc-sqrt-test.c @@ -291,8 +291,7 @@ test_main (void) gmp_randstate_t rands; unsigned i; - gmp_randinit_default (rands); - test_randomize(rands); + test_randinit (rands); for (i = 0; ecc_curves[i]; i++) { diff --git a/testsuite/eddsa-compress-test.c b/testsuite/eddsa-compress-test.c index c0d2c52c..93602af3 100644 --- a/testsuite/eddsa-compress-test.c +++ b/testsuite/eddsa-compress-test.c @@ -41,8 +41,7 @@ void test_main (void) gmp_randstate_t rands; unsigned i; - gmp_randinit_default (rands); - test_randomize(rands); + test_randinit (rands); for (i = 0; ecc_curves[i]; i++) { diff --git a/testsuite/rsa-compute-root-test.c b/testsuite/rsa-compute-root-test.c index e7e7848d..b5851090 100644 --- a/testsuite/rsa-compute-root-test.c +++ b/testsuite/rsa-compute-root-test.c @@ -151,8 +151,7 @@ test_main (void) rsa_public_key_init(&pub); mpz_init (plaintext); - gmp_randinit_default (rands); - test_randomize(rands); + test_randinit (rands); for (j = 0; j < KEY_COUNT; j++) { diff --git a/testsuite/testutils.c b/testsuite/testutils.c index 74798c49..e5173c87 100644 --- a/testsuite/testutils.c +++ b/testsuite/testutils.c @@ -11,6 +11,7 @@ #include "nettle-internal.h" #include +#include #include #include #include @@ -175,6 +176,53 @@ void mark_bytes_defined (size_t size UNUSED, const void *p UNUSED) {} #endif +static uint64_t +test_random_seed (void) +{ + struct timeval tv; + FILE *f = fopen ("/dev/urandom", "rb"); + if (f) + { + uint64_t seed; + size_t res; + + setbuf (f, NULL); + res = fread (&seed, sizeof(seed), 1, f); + fclose(f); + if (res == 1) + return seed; + + fprintf (stderr, "Read of /dev/urandom failed: %s\n", + strerror (errno)); + } + gettimeofday (&tv, NULL); + return (uint64_t) tv.tv_sec * 10000000 + tv.tv_usec; +} + +uint64_t +test_get_seed (void) +{ + const char *nettle_test_seed; + + nettle_test_seed = getenv ("NETTLE_TEST_SEED"); + if (nettle_test_seed && *nettle_test_seed) + { + char *endp; + uint64_t seed = strtoull (nettle_test_seed, &endp, 10); + if (*endp) + die ("Invalid $NETTLE_TEST_SEED value.\n"); + + if (seed == 0) + { + seed = test_random_seed (); + fprintf (stderr, "Using NETTLE_TEST_SEED=%" PRIu64 "\n", seed); + } + return seed; + } + else + return UINT64_C(0x15c0a3c132cefe24); +} + int main(int argc, char **argv) { @@ -1379,11 +1427,6 @@ mpn_out_str (FILE *f, int base, const mp_limb_t *xp, mp_size_t xn) #if NETTLE_USE_MINI_GMP void -gmp_randinit_default (struct knuth_lfib_ctx *ctx) -{ - knuth_lfib_init (ctx, 17); -} -void mpz_urandomb (mpz_t r, struct knuth_lfib_ctx *ctx, mp_bitcnt_t bits) { size_t bytes = (bits+7)/8; @@ -1401,61 +1444,27 @@ mpz_urandomm (mpz_t r, struct knuth_lfib_ctx *ctx, const mpz_t n) mpz_urandomb(r, ctx, mpz_sizeinbase(n, 2) + 30); mpz_mod(r, r, n); } -#else /* !NETTLE_USE_MINI_GMP */ -static void -get_random_seed(mpz_t seed) -{ - struct timeval tv; - FILE *f; - f = fopen ("/dev/urandom", "rb"); - if (f) - { - uint8_t buf[8]; - size_t res; - setbuf (f, NULL); - res = fread (&buf, sizeof(buf), 1, f); - fclose(f); - if (res == 1) - { - nettle_mpz_set_str_256_u (seed, sizeof(buf), buf); - return; - } - fprintf (stderr, "Read of /dev/urandom failed: %s\n", - strerror (errno)); - } - gettimeofday(&tv, NULL); - mpz_set_ui (seed, tv.tv_sec); - mpz_mul_ui (seed, seed, 1000000UL); - mpz_add_ui (seed, seed, tv.tv_usec); +void +test_randinit(gmp_randstate_t rands) +{ + knuth_lfib_init (rands, 17); } -int -test_randomize(gmp_randstate_t rands) +#else /* !NETTLE_USE_MINI_GMP */ + +void +test_randinit(gmp_randstate_t rands) { - const char *nettle_test_seed; + uint64_t seed = test_get_seed (); + mpz_t seed_z; - nettle_test_seed = getenv ("NETTLE_TEST_SEED"); - if (nettle_test_seed && *nettle_test_seed) - { - mpz_t seed; - mpz_init (seed); - if (mpz_set_str (seed, nettle_test_seed, 0) < 0 - || mpz_sgn (seed) < 0) - die ("Invalid NETTLE_TEST_SEED: %s\n", - nettle_test_seed); - if (mpz_sgn (seed) == 0) - get_random_seed (seed); - fprintf (stderr, "Using NETTLE_TEST_SEED="); - mpz_out_str (stderr, 10, seed); - fprintf (stderr, "\n"); - - gmp_randseed (rands, seed); - mpz_clear (seed); - return 1; - } - else - return 0; + mpz_init (seed_z); + mpz_import (seed_z, 1, 1, sizeof (seed), 0, 0, &seed); + gmp_randinit_default (rands); + gmp_randseed (rands, seed_z); + + mpz_clear (seed_z); } #endif /* !NETTLE_USE_MINI_GMP */ diff --git a/testsuite/testutils.h b/testsuite/testutils.h index b30dedac..698028f2 100644 --- a/testsuite/testutils.h +++ b/testsuite/testutils.h @@ -82,6 +82,9 @@ mark_bytes_undefined (size_t size, const void *p); void mark_bytes_defined (size_t size, const void *p); +uint64_t +test_get_seed (void); + /* The main program */ void test_main(void); @@ -210,20 +213,16 @@ test_mac(const struct nettle_mac *mac, #if NETTLE_USE_MINI_GMP typedef struct knuth_lfib_ctx gmp_randstate_t[1]; -void gmp_randinit_default (struct knuth_lfib_ctx *ctx); #define gmp_randclear(state) void mpz_urandomb (mpz_t r, struct knuth_lfib_ctx *ctx, mp_bitcnt_t bits); void mpz_urandomm (mpz_t r, struct knuth_lfib_ctx *ctx, const mpz_t n); /* This is cheating */ #define mpz_rrandomb mpz_urandomb #define mpz_rrandomm mpz_urandomm -static inline int -test_randomize (gmp_randstate_t rands UNUSED) { return 0; } -#else /* !NETTLE_USE_MINI_GMP */ -int -test_randomize (gmp_randstate_t rands); +#endif /* NETTLE_USE_MINI_GMP */ -#endif /* !NETTLE_USE_MINI_GMP */ +void +test_randinit (gmp_randstate_t rands); void mpn_out_str (FILE *f, int base, const mp_limb_t *xp, mp_size_t xn);