diff options
author | Nick Mathewson <nickm@torproject.org> | 2019-03-18 12:15:46 -0400 |
---|---|---|
committer | David Goulet <dgoulet@torproject.org> | 2019-04-30 11:11:39 -0400 |
commit | 604e849d36232def4fa186c4eee4c1caa551e894 (patch) | |
tree | 2d8ac95c6514edabaf49e03a7da5276743d5a8af /src/test/rng_test_helpers.c | |
parent | 587a525cc5aedaee51fff33a78f004f103a4e0c4 (diff) | |
download | tor-604e849d36232def4fa186c4eee4c1caa551e894.tar.gz tor-604e849d36232def4fa186c4eee4c1caa551e894.zip |
Make the deterministic and reproducible rng test code handle fast_rng
Diffstat (limited to 'src/test/rng_test_helpers.c')
-rw-r--r-- | src/test/rng_test_helpers.c | 34 |
1 files changed, 27 insertions, 7 deletions
diff --git a/src/test/rng_test_helpers.c b/src/test/rng_test_helpers.c index aaf42ca05a..c11709ed88 100644 --- a/src/test/rng_test_helpers.c +++ b/src/test/rng_test_helpers.c @@ -32,6 +32,11 @@ */ static tor_mutex_t *rng_mutex = NULL; +/** + * Cached old value for the thread prng. + **/ +static crypto_fast_rng_t *stored_fast_rng = NULL; + /** replacement for crypto_strongest_rand that delegates to crypto_rand. */ static void mock_crypto_strongest_rand(uint8_t *out, size_t len) @@ -87,12 +92,21 @@ enable_deterministic_rng_impl(const uint8_t *seed, size_t seed_len) crypto_xof_add_bytes(rng_xof, rng_seed, sizeof(rng_seed)); MOCK(crypto_rand, crypto_rand_deterministic); MOCK(crypto_strongest_rand_, mock_crypto_strongest_rand); + + uint8_t fast_rng_seed[CRYPTO_FAST_RNG_SEED_LEN]; + memset(fast_rng_seed, 0xff, sizeof(fast_rng_seed)); + memcpy(fast_rng_seed, rng_seed, MIN(sizeof(rng_seed), + sizeof(fast_rng_seed))); + crypto_fast_rng_t *fast_rng = crypto_fast_rng_new_from_seed(fast_rng_seed); + crypto_fast_rng_disable_reseed(fast_rng); + stored_fast_rng = crypto_replace_thread_fast_rng(fast_rng); } /** - * Replace our crypto_rand() and crypto_strongest_rand() prngs with a variant - * that generates all of its output deterministically from a randomly chosen - * seed. In the event of an error, you can log the seed later on with + * Replace our get_thread_fast_rng(), crypto_rand() and + * crypto_strongest_rand() prngs with a variant that generates all of its + * output deterministically from a randomly chosen seed. In the event of an + * error, you can log the seed later on with * testing_dump_reproducible_rng_seed. **/ void @@ -104,10 +118,10 @@ testing_enable_reproducible_rng(void) } /** - * Replace our crypto_rand() and crypto_strongest_rand() prngs with a variant - * that generates all of its output deterministically from a fixed seed. This - * variant is mainly useful for cases when we don't want coverage to change - * between runs. + * Replace our get_thread_fast_rng(), crypto_rand() and + * crypto_strongest_rand() prngs with a variant that generates all of its + * output deterministically from a fixed seed. This variant is mainly useful + * for cases when we don't want coverage to change between runs. * * USAGE NOTE: Test correctness SHOULD NOT depend on the specific output of * this "rng". If you need a specific output, use @@ -151,6 +165,9 @@ crypto_rand_prefilled(char *out, size_t n) * Replace our crypto_rand() and crypto_strongest_rand() prngs with a variant * that yields output from a buffer. If it reaches the end of the buffer, it * starts over. + * + * Note: the get_thread_fast_rng() prng is not replaced by this; we'll need + * more code to support that. **/ void testing_enable_prefilled_rng(const void *buffer, size_t buflen) @@ -188,4 +205,7 @@ testing_disable_rng_override(void) UNMOCK(crypto_rand); UNMOCK(crypto_strongest_rand_); tor_mutex_free(rng_mutex); + + crypto_fast_rng_t *rng = crypto_replace_thread_fast_rng(stored_fast_rng); + crypto_fast_rng_free(rng); } |