[PATCH] random: Use 64 bits from get_random_long() in extract_crng()

From: Sandy Harris
Date: Wed Nov 10 2021 - 04:25:23 EST


---
drivers/char/random.c | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/drivers/char/random.c b/drivers/char/random.c
index 605969ed0f96..bf644b594fb7 100644
--- a/drivers/char/random.c
+++ b/drivers/char/random.c
@@ -989,14 +989,20 @@ static void _extract_crng(struct crng_state *crng,
__u8 out[CHACHA_BLOCK_SIZE])
{
unsigned long v, flags;
+ u32 *p, *q ;
+ p = crng->state ;
+ q = (u32 *) &v ;

if (crng_ready() &&
(time_after(crng_global_init_time, crng->init_time) ||
time_after(jiffies, crng->init_time + CRNG_RESEED_INTERVAL)))
crng_reseed(crng, crng == &primary_crng ? &input_pool : NULL);
spin_lock_irqsave(&crng->lock, flags);
- if (arch_get_random_long(&v))
- crng->state[14] ^= v;
+ if (arch_get_random_long(&v)) {
+ p[14] ^= q[0];
+ if (sizeof(v) == 8)
+ p[15] ^= q[1];
+ }
chacha20_block(&crng->state[0], out);
if (crng->state[12] == 0)
crng->state[13]++;
--