random: access input_pool_data directly rather than through pointer

commit 6c0eace6e1499712583b6ee62d95161e8b3449f5 upstream.

This gets rid of another abstraction we no longer need. It would be nice
if we could instead make pool an array rather than a pointer, but the
latent entropy plugin won't be able to do its magic in that case. So
instead we put all accesses to the input pool's actual data through the
input_pool_data array directly.

Reviewed-by: Dominik Brodowski <linux@dominikbrodowski.net>
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Jason A. Donenfeld 2022-01-15 14:40:04 +01:00 committed by Greg Kroah-Hartman
parent c25c7e29be
commit db7a0a9171

View File

@ -496,17 +496,12 @@ MODULE_PARM_DESC(ratelimit_disable, "Disable random ratelimit suppression");
static u32 input_pool_data[POOL_WORDS] __latent_entropy;
static struct {
/* read-only data: */
u32 *pool;
/* read-write data: */
spinlock_t lock;
u16 add_ptr;
u16 input_rotate;
int entropy_count;
} input_pool = {
.lock = __SPIN_LOCK_UNLOCKED(input_pool.lock),
.pool = input_pool_data
};
static ssize_t extract_entropy(void *buf, size_t nbytes, int min);
@ -544,15 +539,15 @@ static void _mix_pool_bytes(const void *in, int nbytes)
i = (i - 1) & POOL_WORDMASK;
/* XOR in the various taps */
w ^= input_pool.pool[i];
w ^= input_pool.pool[(i + POOL_TAP1) & POOL_WORDMASK];
w ^= input_pool.pool[(i + POOL_TAP2) & POOL_WORDMASK];
w ^= input_pool.pool[(i + POOL_TAP3) & POOL_WORDMASK];
w ^= input_pool.pool[(i + POOL_TAP4) & POOL_WORDMASK];
w ^= input_pool.pool[(i + POOL_TAP5) & POOL_WORDMASK];
w ^= input_pool_data[i];
w ^= input_pool_data[(i + POOL_TAP1) & POOL_WORDMASK];
w ^= input_pool_data[(i + POOL_TAP2) & POOL_WORDMASK];
w ^= input_pool_data[(i + POOL_TAP3) & POOL_WORDMASK];
w ^= input_pool_data[(i + POOL_TAP4) & POOL_WORDMASK];
w ^= input_pool_data[(i + POOL_TAP5) & POOL_WORDMASK];
/* Mix the result back in with a twist */
input_pool.pool[i] = (w >> 3) ^ twist_table[w & 7];
input_pool_data[i] = (w >> 3) ^ twist_table[w & 7];
/*
* Normally, we add 7 bits of rotation to the pool.
@ -1369,7 +1364,7 @@ static void extract_buf(u8 *out)
/* Generate a hash across the pool */
spin_lock_irqsave(&input_pool.lock, flags);
blake2s_update(&state, (const u8 *)input_pool.pool, POOL_BYTES);
blake2s_update(&state, (const u8 *)input_pool_data, POOL_BYTES);
blake2s_final(&state, hash); /* final zeros out state */
/*