mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-30 23:53:32 +01:00
Merge remote branch 'public/rand_double2'
This commit is contained in:
commit
485cab869d
@ -2067,6 +2067,26 @@ 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;
|
||||||
|
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>,
|
/** Generate and return a new random hostname starting with <b>prefix</b>,
|
||||||
* ending with <b>suffix</b>, and containing no less than
|
* 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
|
* <b>min_rand_len</b> and no more than <b>max_rand_len</b> random base32
|
||||||
|
@ -210,6 +210,7 @@ int crypto_seed_rng(int startup);
|
|||||||
int crypto_rand(char *to, size_t n);
|
int crypto_rand(char *to, size_t n);
|
||||||
int crypto_rand_int(unsigned int max);
|
int crypto_rand_int(unsigned int max);
|
||||||
uint64_t crypto_rand_uint64(uint64_t 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,
|
char *crypto_random_hostname(int min_rand_len, int max_rand_len,
|
||||||
const char *prefix, const char *suffix);
|
const char *prefix, const char *suffix);
|
||||||
|
@ -815,18 +815,20 @@ build_time_t
|
|||||||
circuit_build_times_generate_sample(circuit_build_times_t *cbt,
|
circuit_build_times_generate_sample(circuit_build_times_t *cbt,
|
||||||
double q_lo, double q_hi)
|
double q_lo, double q_hi)
|
||||||
{
|
{
|
||||||
uint64_t r = crypto_rand_uint64(UINT64_MAX-1);
|
double randval = crypto_rand_double();
|
||||||
build_time_t ret;
|
build_time_t ret;
|
||||||
double u;
|
double u;
|
||||||
|
|
||||||
/* Generate between [q_lo, q_hi) */
|
/* 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);
|
q_hi -= 1.0/(INT32_MAX);
|
||||||
|
|
||||||
tor_assert(q_lo >= 0);
|
tor_assert(q_lo >= 0);
|
||||||
tor_assert(q_hi < 1);
|
tor_assert(q_hi < 1);
|
||||||
tor_assert(q_lo < q_hi);
|
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);
|
tor_assert(0 <= u && u < 1.0);
|
||||||
/* circuit_build_times_calculate_timeout returns <= INT32_MAX */
|
/* circuit_build_times_calculate_timeout returns <= INT32_MAX */
|
||||||
|
@ -57,6 +57,7 @@ test_crypto_rng(void)
|
|||||||
{
|
{
|
||||||
int i, j, allok;
|
int i, j, allok;
|
||||||
char data1[100], data2[100];
|
char data1[100], data2[100];
|
||||||
|
double d;
|
||||||
|
|
||||||
/* Try out RNG. */
|
/* Try out RNG. */
|
||||||
test_assert(! crypto_seed_rng(0));
|
test_assert(! crypto_seed_rng(0));
|
||||||
@ -76,6 +77,9 @@ test_crypto_rng(void)
|
|||||||
big = crypto_rand_uint64(U64_LITERAL(5));
|
big = crypto_rand_uint64(U64_LITERAL(5));
|
||||||
if (big >= 5)
|
if (big >= 5)
|
||||||
allok = 0;
|
allok = 0;
|
||||||
|
d = crypto_rand_double();
|
||||||
|
test_assert(d >= 0);
|
||||||
|
test_assert(d < 1.0);
|
||||||
host = crypto_random_hostname(3,8,"www.",".onion");
|
host = crypto_random_hostname(3,8,"www.",".onion");
|
||||||
if (strcmpstart(host,"www.") ||
|
if (strcmpstart(host,"www.") ||
|
||||||
strcmpend(host,".onion") ||
|
strcmpend(host,".onion") ||
|
||||||
|
Loading…
Reference in New Issue
Block a user