From 2033e2af0461bc98d09af36dcb601f1d308f2c04 Mon Sep 17 00:00:00 2001 From: Robert Vollmert Date: Mon, 14 Dec 2009 20:05:31 +0100 Subject: Implement rng pushing and popping for sha256 hardened prng (Adeon) the rng.cc used to call just push_mt_state which bypassed the hashing process and didn't return the state as it was after popping the state Fixes bug #52. --- crawl-ref/source/rng.cc | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'crawl-ref/source/rng.cc') diff --git a/crawl-ref/source/rng.cc b/crawl-ref/source/rng.cc index 8c856e7229..4b7200093c 100644 --- a/crawl-ref/source/rng.cc +++ b/crawl-ref/source/rng.cc @@ -29,6 +29,12 @@ void seed_rng(unsigned long* seed_key, size_t num_keys) // MT19937 -- see mt19937ar.cc for details/licence init_by_array(seed_key, num_keys); + // Reset the sha256 generator to get predictable random numbers in case + // of a saved rng state. +#ifdef MORE_HARDENED_PRNG + reset_sha256_state(); +#endif + // for std::random_shuffle() srand(seed_key[0]); } @@ -38,6 +44,12 @@ void seed_rng(long seed) // MT19937 -- see mt19937ar.cc for details/licence init_genrand(seed); + // Reset the sha256 generator to get predictable random numbers in case + // of a saved rng state. +#ifdef MORE_HARDENED_PRNG + reset_sha256_state(); +#endif + // for std::random_shuffle() srand(seed); } @@ -87,11 +99,19 @@ unsigned long random_int( void ) void push_rng_state() { +#ifndef MORE_HARDENED_PRNG push_mt_state(); +#else + push_sha256_state(); +#endif } void pop_rng_state() { +#ifndef MORE_HARDENED_PRNG pop_mt_state(); +#else + pop_sha256_state(); +#endif } -- cgit v1.2.3-54-g00ecf