Implement a fast aes-ctr prng
commitf3cbd6426cbb27b9ab4e5492a50a785cce77f805
authorNick Mathewson <nickm@torproject.org>
Tue, 5 Feb 2019 17:49:04 +0000 (5 12:49 -0500)
committerNick Mathewson <nickm@torproject.org>
Thu, 14 Feb 2019 14:26:40 +0000 (14 09:26 -0500)
treefe986b31fcf87010db296fa38fed759ed4aeb66d
parent3d3578ab41c9be602fad5c4172a880668994c8c3
Implement a fast aes-ctr prng

This module is currently implemented to use the same technique as
libottery (later used by the bsds' arc4random replacement), using
AES-CTR-256 as its underlying stream cipher.  It's backtracking-
resistant immediately after each call, and prediction-resistant
after a while.

Here's how it works:

We generate psuedorandom bytes using AES-CTR-256.  We generate BUFLEN bytes
at a time.  When we do this, we keep the first SEED_LEN bytes as the key
and the IV for our next invocation of AES_CTR, and yield the remaining
BUFLEN - SEED_LEN bytes to the user as they invoke the PRNG.  As we yield
bytes to the user, we clear them from the buffer.

Every RESEED_AFTER times we refill the buffer, we mix in an additional
SEED_LEN bytes from our strong PRNG into the seed.

If the user ever asks for a huge number of bytes at once, we pull SEED_LEN
bytes from the PRNG and use them with our stream cipher to fill the user's
request.
src/lib/crypt_ops/crypto_rand.h
src/lib/crypt_ops/crypto_rand_fast.c [new file with mode: 0644]
src/lib/crypt_ops/crypto_rand_numeric.c
src/lib/crypt_ops/include.am
src/test/test_crypto_rng.c