Loading src/common/crypto.c +22 −0 Original line number Diff line number Diff line Loading @@ -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 * Loading src/common/crypto.h +2 −0 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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); Loading Loading
src/common/crypto.c +22 −0 Original line number Diff line number Diff line Loading @@ -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 * Loading
src/common/crypto.h +2 −0 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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); Loading