Skip to content

Commit

Permalink
random: access input_pool_data directly rather than through pointer
Browse files Browse the repository at this point in the history
commit 6c0eace 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>
  • Loading branch information
zx2c4 authored and gregkh committed May 30, 2022
1 parent a9db850 commit bccc8d9
Showing 1 changed file with 8 additions and 13 deletions.
21 changes: 8 additions & 13 deletions drivers/char/random.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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 */

/*
Expand Down

0 comments on commit bccc8d9

Please sign in to comment.