Random Functions
Overview
// typedefs typedef struct apr_crypto_hash_t apr_crypto_hash_t; typedef void apr_crypto_hash_init_t(apr_crypto_hash_t *hash); typedef void apr_crypto_hash_add_t( apr_crypto_hash_t *hash, const void *data, apr_size_t bytes ); typedef void apr_crypto_hash_finish_t( apr_crypto_hash_t *hash, unsigned char *result ); typedef struct apr_random_t apr_random_t; // structs struct apr_crypto_hash_t; // global functions apr_status_t apr_generate_random_bytes( unsigned char* buf, apr_size_t length ); apr_crypto_hash_t* apr_crypto_sha256_new(apr_pool_t* p); void apr_random_init( apr_random_t* g, apr_pool_t* p, apr_crypto_hash_t* pool_hash, apr_crypto_hash_t* key_hash, apr_crypto_hash_t* prng_hash ); apr_random_t* apr_random_standard_new(apr_pool_t* p); void apr_random_add_entropy( apr_random_t* g, const void* entropy_, apr_size_t bytes ); apr_status_t apr_random_insecure_bytes( apr_random_t* g, void* random, apr_size_t bytes ); apr_status_t apr_random_secure_bytes( apr_random_t* g, void* random, apr_size_t bytes ); void apr_random_barrier(apr_random_t* g); apr_status_t apr_random_secure_ready(apr_random_t* r); apr_status_t apr_random_insecure_ready(apr_random_t* r); void apr_random_after_fork(apr_proc_t* proc);
Detailed Documentation
Typedefs
typedef struct apr_random_t apr_random_t
Opaque PRNG structure.
Global Functions
apr_status_t apr_generate_random_bytes( unsigned char* buf, apr_size_t length )
Generate random bytes.
Parameters:
buf |
Buffer to fill with random bytes |
length |
Length of buffer in bytes |
apr_crypto_hash_t* apr_crypto_sha256_new(apr_pool_t* p)
Allocate and initialize the SHA-256 context
Parameters:
p |
The pool to allocate from |
void apr_random_init( apr_random_t* g, apr_pool_t* p, apr_crypto_hash_t* pool_hash, apr_crypto_hash_t* key_hash, apr_crypto_hash_t* prng_hash )
Initialize a PRNG state
Parameters:
g |
The PRNG state |
p |
The pool to allocate from |
pool_hash |
Pool hash functions |
key_hash |
Key hash functions |
prng_hash |
PRNG hash functions |
apr_random_t* apr_random_standard_new(apr_pool_t* p)
Allocate and initialize (apr_crypto_sha256_new) a new PRNG state.
Parameters:
p |
The pool to allocate from |
void apr_random_add_entropy( apr_random_t* g, const void* entropy_, apr_size_t bytes )
Mix the randomness pools.
Parameters:
g |
The PRNG state |
entropy_ |
Entropy buffer |
bytes |
Length of entropy_ in bytes |
apr_status_t apr_random_insecure_bytes( apr_random_t* g, void* random, apr_size_t bytes )
Generate cryptographically insecure random bytes.
Parameters:
g |
The RNG state |
random |
Buffer to fill with random bytes |
bytes |
Length of buffer in bytes |
apr_status_t apr_random_secure_bytes( apr_random_t* g, void* random, apr_size_t bytes )
Generate cryptographically secure random bytes.
Parameters:
g |
The RNG state |
random |
Buffer to fill with random bytes |
bytes |
Length of buffer in bytes |
void apr_random_barrier(apr_random_t* g)
Ensures that E bits of conditional entropy are mixed into the PRNG before any further randomness is extracted.
Parameters:
g |
The RNG state |
apr_status_t apr_random_secure_ready(apr_random_t* r)
Return APR_SUCCESS if the cryptographic PRNG has been seeded with enough data, APR_ENOTENOUGHENTROPY otherwise.
Parameters:
r |
The RNG state |
apr_status_t apr_random_insecure_ready(apr_random_t* r)
Return APR_SUCCESS if the PRNG has been seeded with enough data, APR_ENOTENOUGHENTROPY otherwise.
Parameters:
r |
The PRNG state |
void apr_random_after_fork(apr_proc_t* proc)
Mix the randomness pools after forking. Call this in the child after forking to mix the randomness pools. Note that its generally a bad idea to fork a process with a real PRNG in it - better to have the PRNG externally and get the randomness from there. However, if you really must do it, then you should supply all your entropy to all the PRNGs - don’t worry, they won’t produce the same output.
Note that apr_proc_fork() calls this for you, so only weird applications need ever call it themselves.
Parameters:
proc |
The resulting process handle from apr_proc_fork() |