diff options
author | Nick Mathewson <nickm@torproject.org> | 2006-10-01 21:59:05 +0000 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2006-10-01 21:59:05 +0000 |
commit | 219ad6395cea5403857c3adf1b938741dba79c4f (patch) | |
tree | e754d3a9a6caf6dce643492a2c48bca20a0e230e | |
parent | f6e165ea0146550f1882611e4395d92251f71ee7 (diff) | |
download | tor-219ad6395cea5403857c3adf1b938741dba79c4f.tar tor-219ad6395cea5403857c3adf1b938741dba79c4f.tar.gz |
r8825@totoro: nickm | 2006-10-01 17:41:27 -0400
Add function to return a random uint64_t.
svn:r8570
-rw-r--r-- | src/common/crypto.c | 22 | ||||
-rw-r--r-- | src/common/crypto.h | 2 |
2 files changed, 24 insertions, 0 deletions
diff --git a/src/common/crypto.c b/src/common/crypto.c index 6cb0031fb..a8caed47b 100644 --- a/src/common/crypto.c +++ b/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 * diff --git a/src/common/crypto.h b/src/common/crypto.h index 050849cfe..375e2c550 100644 --- a/src/common/crypto.h +++ b/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); |