Messages in this thread Patch in this message | | | From | Bernd Edlinger <> | Subject | [PATCH] random: Make /dev/random wait for crng_ready | Date | Fri, 15 Feb 2019 01:47:16 +0000 |
| |
Reading from /dev/random may return data while the getrandom syscall is still blocking.
Those bytes are not yet cryptographically secure.
Make read and select for reading on /dev/random wait until the crng is fully initialized.
Signed-off-by: Bernd Edlinger <bernd.edlinger@hotmail.de> --- drivers/char/random.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/drivers/char/random.c b/drivers/char/random.c index 38c6d1a..ddbc0e2 100644 --- a/drivers/char/random.c +++ b/drivers/char/random.c @@ -720,7 +720,7 @@ static void credit_entropy_bits(struct entropy_store *r, int nbits) } /* should we wake readers? */ - if (entropy_bits >= random_read_wakeup_bits && + if (crng_ready() && entropy_bits >= random_read_wakeup_bits && wq_has_sleeper(&random_read_wait)) { wake_up_interruptible(&random_read_wait); kill_fasync(&fasync, SIGIO, POLL_IN); @@ -1851,7 +1851,9 @@ void rand_initialize_disk(struct gendisk *disk) nbytes = min_t(size_t, nbytes, SEC_XFER_SIZE); while (1) { - n = extract_entropy_user(&blocking_pool, buf, nbytes); + n = crng_ready() + ? extract_entropy_user(&blocking_pool, buf, nbytes) + : 0; if (n < 0) return n; trace_random_read(n*8, (nbytes-n)*8, @@ -1865,6 +1867,7 @@ void rand_initialize_disk(struct gendisk *disk) return -EAGAIN; wait_event_interruptible(random_read_wait, + crng_ready() && ENTROPY_BITS(&input_pool) >= random_read_wakeup_bits); if (signal_pending(current)) @@ -1909,7 +1912,8 @@ void rand_initialize_disk(struct gendisk *disk) poll_wait(file, &random_read_wait, wait); poll_wait(file, &random_write_wait, wait); mask = 0; - if (ENTROPY_BITS(&input_pool) >= random_read_wakeup_bits) + if (crng_ready() && + ENTROPY_BITS(&input_pool) >= random_read_wakeup_bits) mask |= EPOLLIN | EPOLLRDNORM; if (ENTROPY_BITS(&input_pool) < random_write_wakeup_bits) mask |= EPOLLOUT | EPOLLWRNORM; -- 1.9.1
| |