From: Stephan Mueller <smueller@chronox.de>
To: herbert@gondor.apana.org.au
Cc: Andreas Steffen <andreas.steffen@strongswan.org>,
Theodore Ts'o <tytso@mit.edu>,
Sandy Harris <sandyinchina@gmail.com>,
linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: [PATCH 5/6] crypto: drbg - use Jitter RNG to obtain seed
Date: Wed, 22 Apr 2015 21:24:49 +0200 [thread overview]
Message-ID: <2016176.70CSf50Lea@myon.chronox.de> (raw)
In-Reply-To: <5054521.el7mZro33c@myon.chronox.de>
During initialization, the DRBG now tries to allocate a handle of the
Jitter RNG. If such a Jitter RNG is available during seeding, the DRBG
pulls the required entropy/nonce string from get_random_bytes and
concatenates it with a string of equal size from the Jitter RNG. That
combined string is now the seed for the DRBG.
Written differently, the initial seed of the DRBG is now:
get_random_bytes(entropy/nonce) || jitterentropy (entropy/nonce)
If the Jitter RNG is not available, the DRBG only seeds from
get_random_bytes.
CC: Andreas Steffen <andreas.steffen@strongswan.org>
CC: Theodore Ts'o <tytso@mit.edu>
CC: Sandy Harris <sandyinchina@gmail.com>
Signed-off-by: Stephan Mueller <smueller@chronox.de>
---
crypto/drbg.c | 44 ++++++++++++++++++++++++++++++++++++++------
include/crypto/drbg.h | 1 +
2 files changed, 39 insertions(+), 6 deletions(-)
diff --git a/crypto/drbg.c b/crypto/drbg.c
index cdc23c8..c98941a 100644
--- a/crypto/drbg.c
+++ b/crypto/drbg.c
@@ -1125,10 +1125,25 @@ static int drbg_seed(struct drbg_state *drbg, struct drbg_string *pers,
drbg->test_data.len);
pr_devel("DRBG: using test entropy\n");
} else {
- pr_devel("DRBG: (re)seeding with %zu bytes of entropy\n",
- drbg->seed_buf_len);
+ /* Get seed from in-kernel /dev/urandom */
get_random_bytes(drbg->seed_buf, drbg->seed_buf_len);
- drbg_string_fill(&data1, drbg->seed_buf, drbg->seed_buf_len);
+
+ /* Get seed from Jitter RNG */
+ if (!drbg->jent ||
+ crypto_rng_get_bytes(drbg->jent,
+ drbg->seed_buf + drbg->seed_buf_len,
+ drbg->seed_buf_len)) {
+ pr_info("DRBG: could not obtain random data from Jitter RNG\n");
+ drbg_string_fill(&data1, drbg->seed_buf,
+ drbg->seed_buf_len);
+ pr_devel("DRBG: (re)seeding with %zu bytes of entropy\n",
+ drbg->seed_buf_len);
+ } else {
+ drbg_string_fill(&data1, drbg->seed_buf,
+ drbg->seed_buf_len * 2);
+ pr_devel("DRBG: (re)seeding with %zu bytes of entropy\n",
+ drbg->seed_buf_len * 2);
+ }
}
list_add_tail(&data1.list, &seedlist);
@@ -1153,7 +1168,7 @@ static int drbg_seed(struct drbg_state *drbg, struct drbg_string *pers,
* Clear the initial entropy buffer as the async call may not overwrite
* that buffer for quite some time.
*/
- memzero_explicit(drbg->seed_buf, drbg->seed_buf_len);
+ memzero_explicit(drbg->seed_buf, drbg->seed_buf_len * 2);
if (ret)
goto out;
/*
@@ -1195,6 +1210,8 @@ static inline void drbg_dealloc_state(struct drbg_state *drbg)
#endif
kzfree(drbg->seed_buf);
drbg->seed_buf = NULL;
+ crypto_free_rng(drbg->jent);
+ drbg->jent = NULL;
}
/*
@@ -1270,12 +1287,27 @@ static inline int drbg_alloc_state(struct drbg_state *drbg)
ret = -EFAULT;
goto err;
}
- /* ensure we have sufficient buffer space for initial seed */
+ /*
+ * Ensure we have sufficient buffer space for initial seed which
+ * consists of the seed from get_random_bytes and the Jitter RNG.
+ */
drbg->seed_buf_len = ((drbg->seed_buf_len + 1) / 2) * 3;
- drbg->seed_buf = kzalloc(drbg->seed_buf_len, GFP_KERNEL);
+ drbg->seed_buf = kzalloc(drbg->seed_buf_len * 2, GFP_KERNEL);
if (!drbg->seed_buf)
goto err;
+ drbg->jent = crypto_alloc_rng("jitterentropy_rng", 0, 0);
+ if(IS_ERR(drbg->jent))
+ {
+ pr_info("DRBG: could not allocate Jitter RNG handle for seeding\n");
+ /*
+ * As the Jitter RNG is a module that may not be present, we
+ * continue with the operation and do not fully tie the DRBG
+ * to the Jitter RNG.
+ */
+ drbg->jent = NULL;
+ }
+
return 0;
err:
diff --git a/include/crypto/drbg.h b/include/crypto/drbg.h
index e4980a1..fabf102 100644
--- a/include/crypto/drbg.h
+++ b/include/crypto/drbg.h
@@ -122,6 +122,7 @@ struct drbg_state {
struct random_work seed_work; /* asynchronous seeding support */
u8 *seed_buf; /* buffer holding the seed */
size_t seed_buf_len;
+ struct crypto_rng *jent;
const struct drbg_state_ops *d_ops;
const struct drbg_core *core;
struct drbg_string test_data;
--
2.1.0
next prev parent reply other threads:[~2015-04-22 19:27 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-04-22 19:16 [PATCH 0/6] Seeding DRBG with more entropy Stephan Mueller
2015-04-22 19:18 ` [PATCH 1/6] random: Addition of kernel_pool Stephan Mueller
2015-04-22 19:19 ` [PATCH 2/6] random: Async and sync API for accessing kernel_pool Stephan Mueller
2015-04-22 19:20 ` [PATCH 3/6] crypto: drbg - prepare for async seeding Stephan Mueller
2015-04-22 19:24 ` [PATCH 4/6] crypto: drbg - add async seeding operation Stephan Mueller
2015-04-22 19:24 ` Stephan Mueller [this message]
2015-04-22 19:25 ` [PATCH 6/6] crypto: add jitterentropy RNG Stephan Mueller
2015-04-23 14:05 ` Paul Bolle
2015-04-23 14:08 ` Stephan Mueller
2015-04-23 14:18 ` Paul Bolle
2015-04-23 14:26 ` Stephan Mueller
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=2016176.70CSf50Lea@myon.chronox.de \
--to=smueller@chronox.de \
--cc=andreas.steffen@strongswan.org \
--cc=herbert@gondor.apana.org.au \
--cc=linux-crypto@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=sandyinchina@gmail.com \
--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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.