crypto: jitterentropy - Use SHA-3 library
PATCH v7 1/1 crypto: jitterentropy - Use SHA-3 library
From: David Howells <[email protected]>
Make the jitterentropy RNG use the SHA-3 library API instead of crypto_shash. This ends up being quite a bit simpler, as various dynamic allocations and error checks become unnecessary.
---
This is a cleaned-up and rebased version of
https://lore.kernel.org/linux-crypto/[email protected]/
If there are no objections, I'll take this via libcrypto-next.
crypto/Kconfig | 2 +- crypto/jitterentropy-kcapi.c | 114 +++++++++-------------------------- crypto/jitterentropy.c | 25 ++++---- crypto/jitterentropy.h | 19 +++--- 4 files changed, 52 insertions(+), 108 deletions(-)
crypto/Kconfig +1 -1
@@ -1182,12 +1182,12 @@ config CRYPTO_DRBG endif # if CRYPTO_DRBG_MENU config CRYPTO_JITTERENTROPY tristate "CPU Jitter Non-Deterministic RNG (Random Number Generator)" + select CRYPTO_LIB_SHA3 select CRYPTO_RNG - select CRYPTO_SHA3 help CPU Jitter RNG (Random Number Generator) from the Jitterentropy library A non-physical non-deterministic ("true") RNG (e.g., an entropy source compliant with NIST SP800-90B) intended to provide a seed to a
crypto/jitterentropy-kcapi.c +29 -85
233 lines not on this page · raw message
crypto/jitterentropy.c +11 -14
@@ -66,11 +66,11 @@ struct rand_data {#define DATA_SIZE_BITS 256/* all data values that are vital to maintain the security * of the RNG are marked as SENSITIVE. A user must not * access that information while the RNG executes its loops to * calculate the next random value. */ -void *hash_state;/* SENSITIVE hash state entropy pool */ +struct sha3_ctx *hash_state;/* SENSITIVE hash state entropy pool */ __u64 prev_time;/* SENSITIVE Previous time stamp */ __u64 last_delta;/* SENSITIVE stuck test */ __s64 last_delta2;/* SENSITIVE stuck test */ unsigned int flags;/* Flags used to initialize */
@@ -415,14 +415,13 @@ static __u64 jent_loop_shuffle(unsigned int bits, unsigned int min)* * ec [in] entropy collector * time [in] time stamp to be injected * stuck [in] Is the time stamp identified as stuck? * -* Output: -* updated hash context in the entropy collector or error code +* Output: updated hash context in the entropy collector */ -static int jent_condition_data (struct rand_data *ec,__u64 time,int stuck) +static void jent_condition_data (struct rand_data *ec,__u64 time,int stuck) {#define SHA3_HASH_LOOP (1<<3)struct {int rct_count;unsigned int apt_observations;
@@ -433,12 +432,12 @@ static int jent_condition_data(struct rand_data *ec, __u64 time, int stuck) ec->apt_observations, ec->apt_count, ec->apt_base }; -return jent_hash_time (ec->hash_state, time, (u8 *)&addtl,sizeof (addtl), -SHA3_HASH_LOOP , stuck); +jent_hash_time (ec->hash_state, time, (u8 *)&addtl,sizeof (addtl), +SHA3_HASH_LOOP , stuck); }/* * Memory Access noise source -- this is a noise source based on variations in * memory access times
@@ -536,12 +535,11 @@ static int jent_measure_jitter(struct rand_data *ec, __u64 *ret_current_delta)/* Check whether we have a stuck measurement. */ stuck =jent_stuck (ec, current_delta);/* Now call the next noise sources which also injects the data */ -if (jent_condition_data (ec, current_delta, stuck)) - stuck =1 ; +jent_condition_data (ec, current_delta, stuck);/* return the raw entropy value */ if (ret_current_delta) *ret_current_delta = current_delta;
@@ -595,11 +593,11 @@ static void jent_gen_entropy(struct rand_data *ec)* in bytes * * @return 0 when request is fulfilled or an error * * The following error codes can occur: -* -1 entropy_collector is NULL or the generation failed +* -1 entropy_collector is NULL * -2 Intermittent health failure * -3 Permanent health failure */ int jent_read_entropy (struct rand_data *ec,unsigned char *data,unsigned int len)
@@ -638,12 +636,11 @@ int jent_read_entropy(struct rand_data *ec, unsigned char *data,return -2 ; } tocopy =min (DATA_SIZE_BITS /8 , len); -if (jent_read_random_block (ec->hash_state, p, tocopy)) -return -1 ; +jent_read_random_block (ec->hash_state, p, tocopy); len -= tocopy; p += tocopy; }
@@ -654,11 +651,11 @@ int jent_read_entropy(struct rand_data *ec, unsigned char *data,* Initialization logic ***************************************************************************/ struct rand_data *jent_entropy_collector_alloc (unsigned int osr,unsigned int flags, -void *hash_state) +struct sha3_ctx *hash_state) {struct rand_data *entropy_collector; entropy_collector =jent_zalloc (sizeof (struct rand_data ));if (!entropy_collector)
@@ -702,12 +699,12 @@ void jent_entropy_collector_free(struct rand_data *entropy_collector)jent_kvzfree (entropy_collector->mem,JENT_MEMORY_SIZE ); entropy_collector->mem =NULL ;jent_zfree (entropy_collector); } -int jent_entropy_init (unsigned int osr,unsigned int flags,void *hash_state, -struct rand_data *p_ec) +int jent_entropy_init (unsigned int osr,unsigned int flags, +struct sha3_ctx *hash_state,struct rand_data *p_ec) {/* * If caller provides an allocated ec, reuse it which implies that the * health test entropy data is used to further still the available * entropy pool.
crypto/jitterentropy.h +11 -8
@@ -1,26 +1,29 @@// SPDX-License-Identifier: GPL-2.0-or-later +struct sha3_ctx ;extern void *jent_kvzalloc (unsigned int len);extern void jent_kvzfree (void *ptr,unsigned int len);extern void *jent_zalloc (unsigned int len);extern void jent_zfree (void *ptr);extern void jent_get_nstime (__u64 *out); -extern int jent_hash_time (void *hash_state,__u64 time,u8 *addtl, -unsigned int addtl_len,__u64 hash_loop_cnt, -unsigned int stuck); -int jent_read_random_block (void *hash_state,char *dst,unsigned int dst_len); +void jent_hash_time (struct sha3_ctx *hash_state,__u64 time,u8 *addtl, +unsigned int addtl_len,__u64 hash_loop_cnt, +unsigned int stuck); +void jent_read_random_block (struct sha3_ctx *hash_state,char *dst, +unsigned int dst_len);struct rand_data ;extern int jent_entropy_init (unsigned int osr,unsigned int flags, -void *hash_state,struct rand_data *p_ec); +struct sha3_ctx *hash_state, +struct rand_data *p_ec);extern int jent_read_entropy (struct rand_data *ec,unsigned char *data,unsigned int len); -extern struct rand_data *jent_entropy_collector_alloc (unsigned int osr, -unsigned int flags, -void *hash_state); +extern struct rand_data * +jent_entropy_collector_alloc (unsigned int osr,unsigned int flags, +struct sha3_ctx *hash_state);extern void jent_entropy_collector_free (struct rand_data *entropy_collector);#ifdef CONFIG_CRYPTO_JITTERENTROPY_TESTINTERFACE int jent_raw_hires_entropy_store (__u64 value);void jent_testing_init (void );
base-commit: 7dff99b354601dd01829e1511711846e04340a69
Signature · 1 line
2.53.0
Quoted 15 lines · Eric Biggers
From: David Howells <[email protected]>
Make the jitterentropy RNG use the SHA-3 library API instead of
crypto_shash. This ends up being quite a bit simpler, as various dynamic allocations and error checks become unnecessary.Signed-off-by David Howells <[email protected]>Co-developed-by Eric Biggers <[email protected]>Signed-off-by Eric Biggers <[email protected]>---
This is a cleaned-up and rebased version of
https://lore.kernel.org/linux-crypto/[email protected]/
If there are no objections, I'll take this via libcrypto-next.
Quoted 6 lines
crypto/Kconfig | 2 +- crypto/jitterentropy-kcapi.c | 114 +++++++++-------------------------- crypto/jitterentropy.c | 25 ++++---- crypto/jitterentropy.h | 19 +++--- 4 files changed, 52 insertions(+), 108 deletions(-)
Eric Biggers
AppliedQuoted 6 lines · Eric Biggers
From: David Howells <[email protected]>
Make the jitterentropy RNG use the SHA-3 library API instead of
crypto_shash. This ends up being quite a bit simpler, as various dynamic allocations and error checks become unnecessary.
Quoted 8 lines
Signed-off-by David Howells <[email protected]>Co-developed-by Eric Biggers <[email protected]>Signed-off-by Eric Biggers <[email protected]>---
This is a cleaned-up and rebased version of
https://lore.kernel.org/linux-crypto/[email protected]/
If there are no objections, I'll take this via libcrypto-next.
Applied to https://git.kernel.org/pub/scm/linux/kernel/git/ebiggers/linux.git/log/?h=libcrypto-next
- Eric