diff options
author | Robert Vollmert <rvollmert@gmx.net> | 2009-12-14 20:05:31 +0100 |
---|---|---|
committer | Robert Vollmert <rvollmert@gmx.net> | 2009-12-14 20:05:31 +0100 |
commit | 2033e2af0461bc98d09af36dcb601f1d308f2c04 (patch) | |
tree | 50bbbc8b8be2d2c0e96c04f87e0d04951e5285af /crawl-ref/source/rng.cc | |
parent | 09636d72edc4fc3ab748bc75daee8035ac89dacd (diff) | |
download | crawl-ref-2033e2af0461bc98d09af36dcb601f1d308f2c04.tar.gz crawl-ref-2033e2af0461bc98d09af36dcb601f1d308f2c04.zip |
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.
Diffstat (limited to 'crawl-ref/source/rng.cc')
-rw-r--r-- | crawl-ref/source/rng.cc | 20 |
1 files changed, 20 insertions, 0 deletions
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 } |