summaryrefslogtreecommitdiff
path: root/src/common/util.h
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2013-02-08 16:28:05 -0500
committerNick Mathewson <nickm@torproject.org>2013-02-08 16:28:05 -0500
commit8cdd8b83539e57fb1891cce5b527dda335ab1452 (patch)
tree656a1bbdfe0c240a810333c803b3c2a718cf7a13 /src/common/util.h
parentfd1c2a13e7558086732288eb1a4f52aef2edeb2f (diff)
downloadtor-8cdd8b83539e57fb1891cce5b527dda335ab1452.tar.gz
tor-8cdd8b83539e57fb1891cce5b527dda335ab1452.zip
Fix numerous problems with Tor's weak RNG.
We need a weak RNG in a couple of places where the strong RNG is both needless and too slow. We had been using the weak RNG from our platform's libc implementation, but that was problematic (because many platforms have exceptionally horrible weak RNGs -- like, ones that only return values between 0 and SHORT_MAX) and because we were using it in a way that was wrong for LCG-based weak RNGs. (We were counting on the low bits of the LCG output to be as random as the high ones, which isn't true.) This patch adds a separate type for a weak RNG, adds an LCG implementation for it, and uses that exclusively where we had been using the platform weak RNG.
Diffstat (limited to 'src/common/util.h')
-rw-r--r--src/common/util.h14
1 files changed, 14 insertions, 0 deletions
diff --git a/src/common/util.h b/src/common/util.h
index 911b1b5a37..ac88f1ca1c 100644
--- a/src/common/util.h
+++ b/src/common/util.h
@@ -494,6 +494,20 @@ int tor_terminate_process(process_handle_t *process_handle);
void tor_process_handle_destroy(process_handle_t *process_handle,
int also_terminate_process);
+/* ===== Insecure rng */
+typedef struct tor_weak_rng_t {
+ uint32_t state;
+} tor_weak_rng_t;
+
+#define TOR_WEAK_RNG_INIT {383745623}
+#define TOR_WEAK_RANDOM_MAX (INT_MAX)
+void tor_init_weak_random(tor_weak_rng_t *weak_rng, unsigned seed);
+int32_t tor_weak_random(tor_weak_rng_t *weak_rng);
+int32_t tor_weak_random_range(tor_weak_rng_t *rng, int32_t top);
+/** Randomly return true according to <b>rng</b> with probability 1 in
+ * <b>n</b> */
+#define tor_weak_random_one_in_n(rng, n) (0==tor_weak_random_range((rng),(n)))
+
#ifdef UTIL_PRIVATE
/* Prototypes for private functions only used by util.c (and unit tests) */