fortuna_state
} fortuna_state;
fortuna_state.fs_minpoolsize = RANDOM_FORTUNA_DEFPOOLSIZE;
fortuna_state.fs_lasttime = 0;
&fortuna_state.fs_minpoolsize, RANDOM_FORTUNA_DEFPOOLSIZE,
KASSERT(fortuna_state.fs_minpoolsize > 0, ("random: Fortuna threshold must be > 0 at startup"));
randomdev_hash_init(&fortuna_state.fs_pool[i].fsp_hash);
fortuna_state.fs_pool[i].fsp_length = 0;
fortuna_state.fs_reseedcount = 0;
fortuna_state.fs_counter = UINT128_ZERO;
explicit_bzero(&fortuna_state.fs_key, sizeof(fortuna_state.fs_key));
randomdev_hash_iterate(&fortuna_state.fs_pool[pl].fsp_hash,
randomdev_hash_iterate(&fortuna_state.fs_pool[pl].fsp_hash,
fortuna_state.fs_pool[pl].fsp_length = MIN(RANDOM_FORTUNA_MAXPOOLSIZE,
fortuna_state.fs_pool[pl].fsp_length +
randomdev_getkey(&fortuna_state.fs_key, &keymaterial, &keysz);
randomdev_encrypt_init(&fortuna_state.fs_key, hash);
if (uint128_is_zero(fortuna_state.fs_counter))
uint128_increment(&fortuna_state.fs_counter);
KASSERT(fortuna_state.fs_minpoolsize > 0, ("random: Fortuna threshold must be > 0"));
if (fortuna_state.fs_pool[0].fsp_length < fortuna_state.fs_minpoolsize
|| (__predict_true(fortuna_state.fs_lasttime != 0) &&
now - fortuna_state.fs_lasttime <= SBT_1S/10)
fortuna_state.fs_lasttime = now;
fortuna_state.fs_reseedcount++;
if ((fortuna_state.fs_reseedcount % (1 << i)) == 0) {
randomdev_hash_finish(&fortuna_state.fs_pool[i].fsp_hash, temp);
randomdev_hash_init(&fortuna_state.fs_pool[i].fsp_hash);
fortuna_state.fs_pool[i].fsp_length = 0;
SDT_PROBE2(random, fortuna, event_processor, debug, fortuna_state.fs_reseedcount, fortuna_state.fs_pool);
KASSERT(!uint128_is_zero(fortuna_state.fs_counter), ("FS&K: C != 0"));
memcpy(&counter_copy, &fortuna_state.fs_counter, sizeof(counter_copy));
memcpy(&key_copy, &fortuna_state.fs_key, sizeof(key_copy));
uint128_add64(&fortuna_state.fs_counter, blockcount);
randomdev_keystream(&fortuna_state.fs_key, &fortuna_state.fs_counter,
randomdev_encrypt_init(&fortuna_state.fs_key, newkey);
KASSERT(!uint128_is_zero(fortuna_state.fs_counter), ("FS&K: C != 0"));
&fortuna_state.fs_counter, &fortuna_state.fs_key, FORTUNA_LOCKED);
return (!uint128_is_zero(fortuna_state.fs_counter));
#define RANDOM_RESEED_INIT_LOCK(x) mtx_init(&fortuna_state.fs_mtx, "reseed mutex", NULL, MTX_DEF)
#define RANDOM_RESEED_DEINIT_LOCK(x) mtx_destroy(&fortuna_state.fs_mtx)
#define RANDOM_RESEED_LOCK(x) mtx_lock(&fortuna_state.fs_mtx)
#define RANDOM_RESEED_UNLOCK(x) mtx_unlock(&fortuna_state.fs_mtx)
#define RANDOM_RESEED_ASSERT_LOCK_OWNED(x) mtx_assert(&fortuna_state.fs_mtx, MA_OWNED)
#define RANDOM_RESEED_ASSERT_LOCK_NOT_OWNED() mtx_assert(&fortuna_state.fs_mtx, MA_NOTOWNED)
#define RANDOM_RESEED_INIT_LOCK(x) mtx_init(&fortuna_state.fs_mtx, mtx_plain)
#define RANDOM_RESEED_DEINIT_LOCK(x) mtx_destroy(&fortuna_state.fs_mtx)
#define RANDOM_RESEED_LOCK(x) mtx_lock(&fortuna_state.fs_mtx)
#define RANDOM_RESEED_UNLOCK(x) mtx_unlock(&fortuna_state.fs_mtx)