From: Greg Price <price@MIT.EDU>
To: "Theodore Ts'o" <tytso@MIT.EDU>
Cc: linux-kernel@vger.kernel.org
Subject: [PATCH 04/14] random: accept small seeds early on
Date: Sat, 14 Dec 2013 21:01:08 -0500 [thread overview]
Message-ID: <20131215020108.GD27191@athena.dialup.mit.edu> (raw)
In-Reply-To: <cover.1387067223.git.price@mit.edu>
Early in boot, we want to get /dev/urandom (and the kernel's
internal randomness source) adequately seeded ASAP. If we're
desperately short of entropy and are asked to produce output,
we're better off getting, say, 16 bits now and 32 bits next time
rather than holding out for a whole 64-bit reseed while producing
output from virtually no entropy.
At present most input goes directly to the nonblocking pool early on
anyway, but this helps put us in a position to change that.
Signed-off-by: Greg Price <price@mit.edu>
---
drivers/char/random.c | 17 +++++++++++++----
1 file changed, 13 insertions(+), 4 deletions(-)
diff --git a/drivers/char/random.c b/drivers/char/random.c
index bf7fedadd..9f24f6468 100644
--- a/drivers/char/random.c
+++ b/drivers/char/random.c
@@ -925,12 +925,21 @@ static void _xfer_secondary_pool(struct entropy_store *r, size_t nbytes)
__u32 tmp[OUTPUT_POOL_WORDS];
int bytes, min_bytes, reserved_bytes;
- /* pull at least as much as a wakeup */
- min_bytes = random_read_wakeup_bits / 8;
- /* but never more than the buffer size */
+ /* Try to pull a full wakeup's worth if we might have just woken up
+ * for it, and a full reseed's worth (which is controlled by the same
+ * parameter) for the nonblocking pool... */
+ if (r == &blocking_pool || r->initialized) {
+ min_bytes = random_read_wakeup_bits / 8;
+ } else {
+ /* ... except if we're hardly seeded at all, we'll settle for
+ * enough to double what we have ... */
+ min_bytes = min(random_read_wakeup_bits / 8,
+ (r->entropy_total+7) / 8);
+ }
+ /* ... and in any event no more than our (giant) buffer holds. */
bytes = min(sizeof(tmp), max_t(size_t, min_bytes, nbytes));
- /* reserve some for /dev/random's pool, unless we really need it */
+ /* Reserve some for /dev/random's pool, unless we really need it. */
reserved_bytes = 0;
if (!r->limit && r->initialized)
reserved_bytes = 2 * (random_read_wakeup_bits / 8);
--
1.8.3.2
next prev parent reply other threads:[~2013-12-15 2:01 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-12-15 2:00 [PATCH 00/14] random: rework reseeding Greg Price
2013-12-15 2:00 ` [PATCH 01/14] random: fix signedness bug Greg Price
2013-12-15 2:00 ` [PATCH 02/14] random: fix a (harmless) overflow Greg Price
2013-12-15 2:01 ` [PATCH 03/14] random: reserve for /dev/random only once /dev/urandom seeded Greg Price
2013-12-15 2:01 ` Greg Price [this message]
2013-12-15 2:01 ` [PATCH 05/14] random: move transfer accounting into account() helper Greg Price
2013-12-15 2:01 ` [PATCH 06/14] random: separate quantity of bytes extracted and entropy to credit Greg Price
2013-12-15 2:01 ` [PATCH 07/14] random: exploit any extra entropy too when reseeding Greg Price
2013-12-15 2:01 ` [PATCH 08/14] random: rate-limit reseeding only after properly seeded Greg Price
2013-12-15 2:01 ` [PATCH 09/14] random: reserve entropy for nonblocking pool early on Greg Price
2013-12-15 2:01 ` [PATCH 10/14] random: direct all routine input via input pool Greg Price
2013-12-15 2:01 ` [PATCH 11/14] random: separate entropy since auto-push from entropy_total Greg Price
2013-12-15 2:01 ` [PATCH 12/14] random: separate minimum reseed size from minimum /dev/random read Greg Price
2013-12-15 2:01 ` [PATCH 13/14] random: count only catastrophic reseeds for initialization Greg Price
2013-12-15 2:02 ` [PATCH 14/14] random: target giant reseeds, to be conservative Greg Price
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20131215020108.GD27191@athena.dialup.mit.edu \
--to=price@mit.edu \
--cc=linux-kernel@vger.kernel.org \
--cc=tytso@MIT.EDU \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox