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:
parent
a9db850c21
commit
bccc8d9231
@ -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 */
|
||||
|
||||
/*
|
||||
|
Loading…
x
Reference in New Issue
Block a user