Browse Source

r8825@totoro: nickm | 2006-10-01 17:41:27 -0400
Add function to return a random uint64_t.


svn:r8570

Nick Mathewson 17 years ago
parent
commit
219ad6395c
2 changed files with 24 additions and 0 deletions
  1. 22 0
      src/common/crypto.c
  2. 2 0
      src/common/crypto.h

+ 22 - 0
src/common/crypto.c

@@ -1645,6 +1645,28 @@ crypto_rand_int(unsigned int max)
   }
 }
 
+/** Return a pseudorandom integer, chosen uniformly from the values
+ * between 0 and max-1. */
+uint64_t
+crypto_rand_uint64(uint64_t max)
+{
+  uint64_t val;
+  uint64_t cutoff;
+  tor_assert(max < UINT64_MAX);
+  tor_assert(max > 0); /* don't div by 0 */
+
+  /* We ignore any values that are >= 'cutoff,' to avoid biasing the
+   * distribution with clipping at the upper end of unsigned int's
+   * range.
+   */
+  cutoff = UINT64_MAX - (UINT64_MAX%max);
+  while (1) {
+    crypto_rand((char*)&val, sizeof(val));
+    if (val < cutoff)
+      return val % max;
+  }
+}
+
 /** Return a randomly chosen element of sl; or NULL if sl is empty.
  */
 void *

+ 2 - 0
src/common/crypto.h

@@ -15,6 +15,7 @@
 #define CRYPTO_H_ID "$Id$"
 
 #include <stdio.h>
+#include "torint.h"
 
 /** Length of the output of our message digest. */
 #define DIGEST_LEN 20
@@ -152,6 +153,7 @@ int crypto_expand_key_material(const char *key_in, size_t in_len,
 int crypto_seed_rng(void);
 int crypto_rand(char *to, size_t n);
 int crypto_rand_int(unsigned int max);
+uint64_t crypto_rand_uint64(uint64_t max);
 
 struct smartlist_t;
 void *smartlist_choose(const struct smartlist_t *sl);