tor  0.4.1.0-alpha-dev
Macros | Typedefs | Functions
crypto_rand.h File Reference
#include "lib/cc/compat_compiler.h"
#include "lib/cc/torint.h"
#include "lib/testsupport/testsupport.h"
#include "lib/malloc/malloc.h"

Go to the source code of this file.

Macros

#define CRYPTO_FAST_RNG_SEED_LEN   48
 
#define crypto_fast_rng_free(c)   FREE_AND_NULL(crypto_fast_rng_t, crypto_fast_rng_free_, (c))
 
#define crypto_fast_rng_one_in_n(rng, n)   (0 == (crypto_fast_rng_get_uint((rng), (n))))
 

Typedefs

typedef struct crypto_fast_rng_t crypto_fast_rng_t
 

Functions

int crypto_seed_rng (void) ATTR_WUR
 
 MOCK_DECL (void, crypto_rand,(char *to, size_t n))
 
void crypto_rand_unmocked (char *to, size_t n)
 
void crypto_strongest_rand (uint8_t *out, size_t out_len)
 
 MOCK_DECL (void, crypto_strongest_rand_,(uint8_t *out, size_t out_len))
 
int crypto_rand_int (unsigned int max)
 
unsigned crypto_rand_uint (unsigned limit)
 
int crypto_rand_int_range (unsigned int min, unsigned int max)
 
uint64_t crypto_rand_uint64_range (uint64_t min, uint64_t max)
 
time_t crypto_rand_time_range (time_t min, time_t max)
 
uint32_t crypto_rand_u32 (void)
 
uint64_t crypto_rand_uint64 (uint64_t max)
 
double crypto_rand_double (void)
 
void crypto_seed_weak_rng (struct tor_weak_rng_t *rng)
 
char * crypto_random_hostname (int min_rand_len, int max_rand_len, const char *prefix, const char *suffix)
 
void * smartlist_choose (const struct smartlist_t *sl)
 
void smartlist_shuffle (struct smartlist_t *sl)
 
int crypto_force_rand_ssleay (void)
 
crypto_fast_rng_tcrypto_fast_rng_new (void)
 
crypto_fast_rng_tcrypto_fast_rng_new_from_seed (const uint8_t *seed)
 
void crypto_fast_rng_getbytes (crypto_fast_rng_t *rng, uint8_t *out, size_t n)
 
void crypto_fast_rng_free_ (crypto_fast_rng_t *)
 
unsigned crypto_fast_rng_get_uint (crypto_fast_rng_t *rng, unsigned limit)
 
uint64_t crypto_fast_rng_get_uint64 (crypto_fast_rng_t *rng, uint64_t limit)
 
double crypto_fast_rng_get_double (crypto_fast_rng_t *rng)
 
crypto_fast_rng_tget_thread_fast_rng (void)
 

Detailed Description

Common functions for using (pseudo-)random number generators.

Definition in file crypto_rand.h.

Macro Definition Documentation

◆ crypto_fast_rng_one_in_n

#define crypto_fast_rng_one_in_n (   rng,
 
)    (0 == (crypto_fast_rng_get_uint((rng), (n))))

Using the fast_rng rng, yield true with probability 1/n. Otherwise yield false.

n must not be zero.

Definition at line 77 of file crypto_rand.h.

Referenced by circuit_resume_edge_reading_helper().

Typedef Documentation

◆ crypto_fast_rng_t

A fast PRNG, for use when the PRNG provided by our crypto library isn't fast enough. This one should be cryptographically strong, but has seen less auditing than the PRNGs in OpenSSL and NSS. Use with caution.

Note that this object is NOT thread-safe. If you need a thread-safe prng, use crypto_rand(), or wrap this in a mutex.

Definition at line 55 of file crypto_rand.h.

Function Documentation

◆ crypto_fast_rng_free_()

void crypto_fast_rng_free_ ( crypto_fast_rng_t rng)

Release all storage held by rng.

Definition at line 198 of file crypto_rand_fast.c.

References memwipe(), and tor_munmap_anonymous().

◆ crypto_fast_rng_get_double()

double crypto_fast_rng_get_double ( crypto_fast_rng_t rng)

As crypto_rand_, but extract the result from a crypto_fast_rng_t.

Definition at line 161 of file crypto_rand_numeric.c.

References crypto_fast_rng_getbytes().

◆ crypto_fast_rng_get_uint()

unsigned crypto_fast_rng_get_uint ( crypto_fast_rng_t rng,
unsigned  limit 
)

As crypto_rand_uint, but extract the result from a crypto_fast_rng_t

Definition at line 139 of file crypto_rand_numeric.c.

References crypto_fast_rng_getbytes(), IMPLEMENT_RAND_UNSIGNED, and tor_assert().

◆ crypto_fast_rng_get_uint64()

uint64_t crypto_fast_rng_get_uint64 ( crypto_fast_rng_t rng,
uint64_t  limit 
)

As crypto_rand_uint64, but extract the result from a crypto_fast_rng_t.

Definition at line 150 of file crypto_rand_numeric.c.

References crypto_fast_rng_getbytes(), IMPLEMENT_RAND_UNSIGNED, and tor_assert().

◆ crypto_fast_rng_getbytes()

void crypto_fast_rng_getbytes ( crypto_fast_rng_t rng,
uint8_t *  out,
size_t  n 
)

Extract n bytes from rng into the buffer at out.

Definition at line 238 of file crypto_rand_fast.c.

Referenced by crypto_fast_rng_get_double(), crypto_fast_rng_get_uint(), and crypto_fast_rng_get_uint64().

◆ crypto_fast_rng_new()

crypto_fast_rng_t* crypto_fast_rng_new ( void  )

Number of bytes used to seed a crypto_rand_fast_t.

Initialize and return a new fast PRNG, using a strong random seed.

Note that this object is NOT thread-safe. If you need a thread-safe prng, use crypto_rand(), or wrap this in a mutex.

Definition at line 112 of file crypto_rand_fast.c.

◆ crypto_fast_rng_new_from_seed()

crypto_fast_rng_t* crypto_fast_rng_new_from_seed ( const uint8_t *  seed)

Initialize and return a new fast PRNG, using a seed value specified in seed. This value must be CRYPTO_FAST_RNG_SEED_LEN bytes long.

Note that this object is NOT thread-safe. If you need a thread-safe prng, you should probably look at get_thread_fast_rng(). Alternatively, use crypto_rand(), wrap this in a mutex.

Definition at line 131 of file crypto_rand_fast.c.

References ANONMAP_NOINHERIT, ANONMAP_PRIVATE, crypto_fast_rng_t::cbuf::seed, and tor_mmap_anonymous().

◆ crypto_force_rand_ssleay()

int crypto_force_rand_ssleay ( void  )

Make sure that openssl is using its default PRNG. Return 1 if we had to adjust it; 0 otherwise.

Definition at line 617 of file crypto_rand.c.

◆ crypto_rand_double()

double crypto_rand_double ( void  )

Return a pseudorandom double d, chosen uniformly from the range 0.0 <= d < 1.0.

Definition at line 126 of file crypto_rand_numeric.c.

◆ crypto_rand_int()

int crypto_rand_int ( unsigned int  max)

Return a pseudorandom integer, chosen uniformly from the values between 0 and max-1 inclusive. max must be between 1 and INT_MAX+1, inclusive.

Definition at line 52 of file crypto_rand_numeric.c.

References crypto_rand_uint(), and tor_assert().

Referenced by choose_array_element_by_weight(), and crypto_rand_int_range().

◆ crypto_rand_int_range()

int crypto_rand_int_range ( unsigned int  min,
unsigned int  max 
)

Return a pseudorandom integer, chosen uniformly from the values i such that min <= i < max.

min MUST be in range [0, max). max MUST be in range (min, INT_MAX].

Definition at line 71 of file crypto_rand_numeric.c.

References crypto_rand_int(), and tor_assert().

Referenced by crypto_random_hostname(), and intro_point_should_expire_now().

◆ crypto_rand_time_range()

time_t crypto_rand_time_range ( time_t  min,
time_t  max 
)

As crypto_rand_int_range, but supports time_t.

Definition at line 95 of file crypto_rand_numeric.c.

References crypto_rand_uint64(), and tor_assert().

◆ crypto_rand_u32()

uint32_t crypto_rand_u32 ( void  )

Draw an unsigned 32-bit integer uniformly at random.

Definition at line 535 of file crypto_rand.c.

Referenced by genpareto_sample(), geometric_sample(), log_logistic_sample(), logistic_sample(), random_uniform_01(), and weibull_sample().

◆ crypto_rand_uint()

unsigned crypto_rand_uint ( unsigned  limit)

Return a pseudorandom integer chosen uniformly from the values between 0 and limit-1 inclusive. limit must be strictly between 0 and UINT_MAX.

Definition at line 39 of file crypto_rand_numeric.c.

References IMPLEMENT_RAND_UNSIGNED, and tor_assert().

Referenced by crypto_rand_int().

◆ crypto_rand_uint64()

uint64_t crypto_rand_uint64 ( uint64_t  max)

Return a pseudorandom 64-bit integer, chosen uniformly from the values between 0 and max-1 inclusive.

Definition at line 106 of file crypto_rand_numeric.c.

References IMPLEMENT_RAND_UNSIGNED, and tor_assert().

Referenced by choose_array_element_by_weight(), crypto_rand_time_range(), and crypto_rand_uint64_range().

◆ crypto_rand_uint64_range()

uint64_t crypto_rand_uint64_range ( uint64_t  min,
uint64_t  max 
)

As crypto_rand_int_range, but supports uint64_t.

Definition at line 85 of file crypto_rand_numeric.c.

References crypto_rand_uint64(), and tor_assert().

◆ crypto_rand_unmocked()

void crypto_rand_unmocked ( char *  to,
size_t  n 
)

Write n bytes of strong random data to to. Most callers will want crypto_rand instead.

This function is not allowed to fail; if it would fail to generate strong entropy, it must terminate the process instead.

Definition at line 489 of file crypto_rand.c.

References tor_assert().

Referenced by MOCK_IMPL().

◆ crypto_random_hostname()

char* crypto_random_hostname ( int  min_rand_len,
int  max_rand_len,
const char *  prefix,
const char *  suffix 
)

Generate and return a new random hostname starting with prefix, ending with suffix, and containing no fewer than min_rand_len and no more than max_rand_len random base32 characters. Does not check for failure.

Clip max_rand_len to MAX_DNS_LABEL_SIZE.

Definition at line 551 of file crypto_rand.c.

References crypto_rand_int_range(), and MAX_DNS_LABEL_SIZE.

Referenced by launch_wildcard_check(), and tor_tls_context_init_certificates().

◆ crypto_seed_rng()

int crypto_seed_rng ( void  )

Seed the RNG for any and all crypto libraries that we're using with bytes from the operating system. Return 0 on success, -1 on failure.

Definition at line 451 of file crypto_rand.c.

References tor_assert().

Referenced by add_entropy_callback().

◆ crypto_seed_weak_rng()

void crypto_seed_weak_rng ( tor_weak_rng_t rng)

Set the seed of the weak RNG to a random value.

Definition at line 109 of file crypto_rand.c.

References tor_init_weak_random().

◆ crypto_strongest_rand()

void crypto_strongest_rand ( uint8_t *  out,
size_t  out_len 
)

Try to get out_len bytes of the strongest entropy we can generate, storing it into out.

Definition at line 339 of file crypto_rand.c.

Referenced by curve25519_rand_seckey_bytes(), and ed25519_secret_key_generate().

◆ get_thread_fast_rng()

crypto_fast_rng_t* get_thread_fast_rng ( void  )

Return a per-thread fast RNG, initializing it if necessary.

You do not need to free this yourself.

It is NOT safe to share this value across threads.

Definition at line 281 of file crypto_rand_fast.c.

References thread_rng, and tor_threadlocal_get().

Referenced by circuit_resume_edge_reading_helper().

◆ smartlist_shuffle()

void smartlist_shuffle ( smartlist_t sl)

Scramble the elements of sl into a random order.

Definition at line 601 of file crypto_rand.c.