From 13ee04c8c32ac810d3430c8e26baa5b591be3f62 Mon Sep 17 00:00:00 2001 From: Daniel Micay Date: Mon, 15 Apr 2019 07:11:39 -0400 Subject: [PATCH] fill CSPRNG caches lazily to speed up early init --- random.c | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/random.c b/random.c index c6dc759..0bd7af4 100644 --- a/random.c +++ b/random.c @@ -39,8 +39,7 @@ void random_state_init(struct random_state *state) { get_random_seed(rnd, sizeof(rnd)); chacha_keysetup(&state->ctx, rnd); chacha_ivsetup(&state->ctx, rnd + CHACHA_KEY_SIZE); - chacha_keystream_bytes(&state->ctx, state->cache, RANDOM_CACHE_SIZE); - state->index = 0; + state->index = RANDOM_CACHE_SIZE; state->reseed = 0; } @@ -49,19 +48,17 @@ void random_state_init_from_random_state(struct random_state *state, struct rand get_random_bytes(source, rnd, sizeof(rnd)); chacha_keysetup(&state->ctx, rnd); chacha_ivsetup(&state->ctx, rnd + CHACHA_KEY_SIZE); - chacha_keystream_bytes(&state->ctx, state->cache, RANDOM_CACHE_SIZE); - state->index = 0; + state->index = RANDOM_CACHE_SIZE; state->reseed = 0; } static void refill(struct random_state *state) { - if (state->reseed < RANDOM_RESEED_SIZE) { - chacha_keystream_bytes(&state->ctx, state->cache, RANDOM_CACHE_SIZE); - state->index = 0; - state->reseed += RANDOM_CACHE_SIZE; - } else { + if (state->reseed >= RANDOM_RESEED_SIZE) { random_state_init(state); } + chacha_keystream_bytes(&state->ctx, state->cache, RANDOM_CACHE_SIZE); + state->index = 0; + state->reseed += RANDOM_CACHE_SIZE; } void get_random_bytes(struct random_state *state, void *buf, size_t size) {