[PATCH 07/14] random: exploit any extra entropy too when reseeding

From: Greg Price
Date: Sat Dec 14 2013 - 21:01:32 EST


When extracting from the input pool to feed one of the output
pools, extracting more bytes can't hurt the reseed, and it can
help if there happens to be more entropy than we estimated. We
deliberately try to be conservative in our estimates -- for
example, mixing in the cycle counter on each event but estimating
based on the low-resolution clock -- so this situation is likely.

For example, the authors of http://eprint.iacr.org/2012/251.pdf
found in a multi-week run on a desktop that the actual entropy
from add_input_randomness was much higher than our estimates,
at 9.69 bits min-entropy per event from the cycle counters alone
vs. 1.85 bits estimated.

The only reason to hold back is that we have to debit the input
pool's entropy estimate for every byte we extract, which may delay
us the next time we want to extract from the input pool. But if
we're already leaving the pool practically empty, this isn't much
of a cost. So go ahead and suck up two full extractions, 160 bits.
If we have even more than that and didn't know it, this should
still be a good solid seed.

We just have to make sure not to give ourselves credit for more
entropy than our sober estimates allow. The credit_bits output
parameter takes care of that.

Signed-off-by: Greg Price <price@xxxxxxx>
---
drivers/char/random.c | 7 +++++++
1 file changed, 7 insertions(+)

diff --git a/drivers/char/random.c b/drivers/char/random.c
index c11281551..c2428ecb2 100644
--- a/drivers/char/random.c
+++ b/drivers/char/random.c
@@ -1001,6 +1001,13 @@ retry:
ibytes = 0;
if (credit_bits != NULL)
*credit_bits = ibytes * 8;
+ if (dest != NULL && ibytes && ibytes == have_bytes) {
+ /* When a reseed drains the pool, we might as well
+ * suck up any underestimated entropy as well as what
+ * we estimate is there. */
+ WARN_ON(credit_bits == NULL);
+ ibytes = max_t(size_t, ibytes, 2*EXTRACT_SIZE);
+ }
entropy_count = max_t(int, 0,
entropy_count - (ibytes << (ENTROPY_SHIFT + 3)));
if (cmpxchg(&r->entropy_count, orig, entropy_count) != orig)
--
1.8.3.2

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/