| CPRNG(9) | Kernel Developer's Manual | CPRNG(9) |
cprng,
cprng_strong_create,
cprng_strong_destroy,
cprng_strong,
cprng_strong32,
cprng_strong64, cprng_fast,
cprng_fast32, cprng_fast64
— cryptographic pseudorandom number
generators
#include
<sys/cprng.h>
cprng_strong_t *
cprng_strong_create(const
char *name, int
ipl, int
flags);
void
cprng_strong_destroy(cprng_strong_t
*cprng);
size_t
cprng_strong(cprng_strong_t
*cprng, void *buf,
size_t len,
int flags);
uint32_t
cprng_strong32(void);
uint64_t
cprng_strong64(void);
size_t
cprng_fast(void
*buf, size_t
len);
uint32_t
cprng_fast32(void);
uint64_t
cprng_fast64(void);
#define CPRNG_MAX_LEN 524288
The cprng family of functions provide
cryptographic pseudorandom number generators automatically seeded from the
kernel entropy pool. All applications in the kernel requiring random data or
random choices should use the cprng_strong family of
functions, unless performance constraints demand otherwise.
The cprng_fast family of functions may be
used in applications that can tolerate exposure of past random data, such as
initialization vectors or transaction ids that are sent over the internet
anyway, if the applications require higher throughput or lower per-request
latency than the cprng_strong family of functions
provide. If in doubt, choose cprng_strong.
A single instance of the fast generator
serves the entire kernel. A well-known instance of the strong generator,
kern_cprng, may be used by any in-kernel caller, but
separately seeded instances of the strong generator can also be created by
calling
cprng_strong_create().
The cprng
functions may be used in soft interrupt context, except for
cprng_strong_create()
and cprng_strong_destroy() which are allowed only at
IPL_NONE in thread context; see
spl(9).
The cprng functions replace the legacy
arc4random(9) and
rnd_extract_data(9)
functions.
cprng_strong_create(name,
ipl, flags)The name argument is used to “personalize” the Hash_DRBG according to the standard, so that its initial state will depend both on seed material from the entropy pool and also on the personalization string (name).
The ipl argument specifies the interrupt
priority level for the mutex which will serialize access to the new
instance of the generator (see
spl(9)), and must be no
higher than IPL_SOFTSERIAL.
The flags argument must be zero.
Creation will succeed even if full entropy for the generator is not available. In this case, the first request to read from the generator may cause reseeding.
cprng_strong_create()
may sleep to allocate memory.
cprng_strong_destroy(cprng)cprng_strong_destroy()
may sleep.
cprng_strong(cprng,
buf, len,
flags)CPRNG_MAX_LEN. flags must be
zero.cprng_strong32()kern_cprng strong
generator.
cprng_strong32()
does not sleep.
cprng_strong64()kern_cprng strong
generator.
cprng_strong64()
does not sleep.
cprng_fast(buf,
len)cprng_fast()
does not sleep.
cprng_fast32()cprng_fast32()
does not sleep.
cprng_fast64()cprng_fast64()
does not sleep.
The cprng family of functions provide the
following security properties:
cprng functions cannot predict past or future
unseen outputs.cprng_strong functions. However, such an
attacker may be able to predict past outputs of the
cprng_fast functions.The second property is sometimes called “backtracking
resistance”, “forward secrecy”, or “key
erasure” in the cryptography literature. The
cprng_strong functions provide backtracking
resistance; the cprng_fast functions do not.
The cprng_strong functions are implemented
in sys/kern/subr_cprng.c, and use the NIST SP
800-90A Hash_DRBG implementation in
sys/crypto/nist_hash_drbg. The
cprng_fast functions are implemented in
sys/crypto/cprng_fast/cprng_fast.c, and use the
ChaCha8 stream cipher.
Elaine Barker and John Kelsey, Recommendation for Random Number Generation Using Deterministic Random Bit Generators (Revised), National Institute of Standards and Technology, 2011, NIST Special Publication 800-90A, Rev 1.
Daniel J. Bernstein, ChaCha, a variant of Salsa20, http://cr.yp.to/papers.html#chacha, 2008-01-28, Document ID: 4027b5256e17b9796842e6d0f68b0b5e.
The cprng family of functions first appeared in NetBSD 6.0.
| August 16, 2020 | NetBSD 11.0 |