diff options
author | Nick Mathewson <nickm@torproject.org> | 2010-06-22 21:31:31 -0400 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2010-06-25 21:33:22 -0400 |
commit | b111a7cd9c5e09bedf57a67f9044a2974222cd11 (patch) | |
tree | 325adafdbc70188d95bfca098b86f506f5f28530 /src | |
parent | 006e2e8620fa9001c8df24463c06538cf58ce396 (diff) | |
download | tor-b111a7cd9c5e09bedf57a67f9044a2974222cd11.tar.gz tor-b111a7cd9c5e09bedf57a67f9044a2974222cd11.zip |
Make cbt_generate_sample use crypto_rand_double()
Possible workaround for bug 1139, if anybody cares.
Diffstat (limited to 'src')
-rw-r--r-- | src/common/crypto.c | 13 | ||||
-rw-r--r-- | src/or/circuitbuild.c | 6 |
2 files changed, 13 insertions, 6 deletions
diff --git a/src/common/crypto.c b/src/common/crypto.c index 23e2a429f5..38fbca717f 100644 --- a/src/common/crypto.c +++ b/src/common/crypto.c @@ -2065,10 +2065,15 @@ 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; + crypto_rand((char*)&uint, sizeof(uint)); +#if SIZEOF_INT == 4 +#define UINT_MAX_AS_DOUBLE 4294967296.0 +#elif SIZEOF_INT == 8 +#define UINT_MAX_AS_DOUBLE 1.8446744073709552e+19 +#else +#error SIZEOF_INT is neither 4 nor 8 +#endif + return ((double)uint) / UINT_MAX_AS_DOUBLE; } /** Generate and return a new random hostname starting with <b>prefix</b>, diff --git a/src/or/circuitbuild.c b/src/or/circuitbuild.c index 417d8ec8d8..da63ff6ef0 100644 --- a/src/or/circuitbuild.c +++ b/src/or/circuitbuild.c @@ -677,18 +677,20 @@ build_time_t circuit_build_times_generate_sample(circuit_build_times_t *cbt, double q_lo, double q_hi) { - uint64_t r = crypto_rand_uint64(UINT64_MAX-1); + double randval = crypto_rand_double(); build_time_t ret; double u; /* Generate between [q_lo, q_hi) */ + /*XXXX This is what nextafter is supposed to be for; we should use it on the + * platforms that support it. */ q_hi -= 1.0/(INT32_MAX); tor_assert(q_lo >= 0); tor_assert(q_hi < 1); tor_assert(q_lo < q_hi); - u = q_lo + ((q_hi-q_lo)*r)/(1.0*UINT64_MAX); + u = q_lo + (q_hi-q_lo)*randval; tor_assert(0 <= u && u < 1.0); /* circuit_build_times_calculate_timeout returns <= INT32_MAX */ |