summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/rng.cc
diff options
context:
space:
mode:
authorRobert Vollmert <rvollmert@gmx.net>2009-12-14 20:05:31 +0100
committerRobert Vollmert <rvollmert@gmx.net>2009-12-14 20:05:31 +0100
commit2033e2af0461bc98d09af36dcb601f1d308f2c04 (patch)
tree50bbbc8b8be2d2c0e96c04f87e0d04951e5285af /crawl-ref/source/rng.cc
parent09636d72edc4fc3ab748bc75daee8035ac89dacd (diff)
downloadcrawl-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.cc20
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
}