]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Add a function to return a double in range [0,1).
authorNick Mathewson <nickm@torproject.org>
Wed, 23 Jun 2010 01:30:26 +0000 (21:30 -0400)
committerNick Mathewson <nickm@torproject.org>
Wed, 23 Jun 2010 01:30:26 +0000 (21:30 -0400)
src/common/crypto.c
src/common/crypto.h
src/test/test_crypto.c

index 1a1dad616c1a7fbe324b28e72b4d9a2e97b878af..23e2a429f5862db1bcf7a8396448d3a74d5225ad 100644 (file)
@@ -2056,6 +2056,21 @@ crypto_rand_uint64(uint64_t max)
   }
 }
 
+/** Return a pseudorandom double d, chosen uniformly from the range
+ * 0.0 <= d < 1.0.
+ */
+double
+crypto_rand_double(void)
+{
+  /* We just use an unsigned int here; we don't really care about getting
+   * more than 32 bits of resolution */
+  unsigned int uint;
+  do {
+    crypto_rand((char*)&uint, sizeof(uint));
+  } while (uint == UINT_MAX);
+  return ((double)uint) / (double)UINT_MAX;
+}
+
 /** Generate and return a new random hostname starting with <b>prefix</b>,
  * ending with <b>suffix</b>, and containing no less than
  * <b>min_rand_len</b> and no more than <b>max_rand_len</b> random base32
index 1b004dd4b899ed53c4103790a8533267e8ca5228..a30e5bcbae26ba32946b586cb3146e5003236221 100644 (file)
@@ -210,6 +210,7 @@ int crypto_seed_rng(int startup);
 int crypto_rand(char *to, size_t n);
 int crypto_rand_int(unsigned int max);
 uint64_t crypto_rand_uint64(uint64_t max);
+double crypto_rand_double(void);
 
 char *crypto_random_hostname(int min_rand_len, int max_rand_len,
                              const char *prefix, const char *suffix);
index 7aca098bc78fe0b2328f56bba2959a6063663426..b475914b1bfd67905507276b1e9f3b16eb0775db 100644 (file)
@@ -57,6 +57,7 @@ test_crypto_rng(void)
 {
   int i, j, allok;
   char data1[100], data2[100];
+  double d;
 
   /* Try out RNG. */
   test_assert(! crypto_seed_rng(0));
@@ -76,6 +77,9 @@ test_crypto_rng(void)
     big = crypto_rand_uint64(U64_LITERAL(5));
     if (big >= 5)
       allok = 0;
+    d = crypto_rand_double();
+    test_assert(d >= 0);
+    test_assert(d < 1.0);
     host = crypto_random_hostname(3,8,"www.",".onion");
     if (strcmpstart(host,"www.") ||
         strcmpend(host,".onion") ||