Commit 6c0eace6 authored by Jason A. Donenfeld's avatar Jason A. Donenfeld

random: access input_pool_data directly rather than through pointer

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: default avatarDominik Brodowski <linux@dominikbrodowski.net>
Signed-off-by: default avatarJason A. Donenfeld <Jason@zx2c4.com>
parent 18263c4e
...@@ -496,17 +496,12 @@ MODULE_PARM_DESC(ratelimit_disable, "Disable random ratelimit suppression"); ...@@ -496,17 +496,12 @@ MODULE_PARM_DESC(ratelimit_disable, "Disable random ratelimit suppression");
static u32 input_pool_data[POOL_WORDS] __latent_entropy; static u32 input_pool_data[POOL_WORDS] __latent_entropy;
static struct { static struct {
/* read-only data: */
u32 *pool;
/* read-write data: */
spinlock_t lock; spinlock_t lock;
u16 add_ptr; u16 add_ptr;
u16 input_rotate; u16 input_rotate;
int entropy_count; int entropy_count;
} input_pool = { } input_pool = {
.lock = __SPIN_LOCK_UNLOCKED(input_pool.lock), .lock = __SPIN_LOCK_UNLOCKED(input_pool.lock),
.pool = input_pool_data
}; };
static ssize_t extract_entropy(void *buf, size_t nbytes, int min); 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) ...@@ -544,15 +539,15 @@ static void _mix_pool_bytes(const void *in, int nbytes)
i = (i - 1) & POOL_WORDMASK; i = (i - 1) & POOL_WORDMASK;
/* XOR in the various taps */ /* XOR in the various taps */
w ^= input_pool.pool[i]; w ^= input_pool_data[i];
w ^= input_pool.pool[(i + POOL_TAP1) & POOL_WORDMASK]; w ^= input_pool_data[(i + POOL_TAP1) & POOL_WORDMASK];
w ^= input_pool.pool[(i + POOL_TAP2) & POOL_WORDMASK]; w ^= input_pool_data[(i + POOL_TAP2) & POOL_WORDMASK];
w ^= input_pool.pool[(i + POOL_TAP3) & POOL_WORDMASK]; w ^= input_pool_data[(i + POOL_TAP3) & POOL_WORDMASK];
w ^= input_pool.pool[(i + POOL_TAP4) & POOL_WORDMASK]; w ^= input_pool_data[(i + POOL_TAP4) & POOL_WORDMASK];
w ^= input_pool.pool[(i + POOL_TAP5) & POOL_WORDMASK]; w ^= input_pool_data[(i + POOL_TAP5) & POOL_WORDMASK];
/* Mix the result back in with a twist */ /* 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. * Normally, we add 7 bits of rotation to the pool.
...@@ -1369,7 +1364,7 @@ static void extract_buf(u8 *out) ...@@ -1369,7 +1364,7 @@ static void extract_buf(u8 *out)
/* Generate a hash across the pool */ /* Generate a hash across the pool */
spin_lock_irqsave(&input_pool.lock, flags); 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 */ blake2s_final(&state, hash); /* final zeros out state */
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment