Commit 5cbe0f13 authored by Mark Rutland's avatar Mark Rutland Committed by Theodore Ts'o

random: split primary/secondary crng init paths

Currently crng_initialize() is used for both the primary CRNG and
secondary CRNGs. While we wish to share common logic, we need to do a
number of additional things for the primary CRNG, and this would be
easier to deal with were these handled in separate functions.

This patch splits crng_initialize() into crng_initialize_primary() and
crng_initialize_secondary(), with common logic factored out into a
crng_init_try_arch() helper.

There should be no functional change as a result of this patch.
Signed-off-by: default avatarMark Rutland <mark.rutland@arm.com>
Cc: Mark Brown <broonie@kernel.org>
Cc: Theodore Ts'o <tytso@mit.edu>
Link: https://lore.kernel.org/r/20200210130015.17664-2-mark.rutland@arm.comSigned-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
parent f8788d86
...@@ -781,27 +781,37 @@ static int __init parse_trust_cpu(char *arg) ...@@ -781,27 +781,37 @@ static int __init parse_trust_cpu(char *arg)
} }
early_param("random.trust_cpu", parse_trust_cpu); early_param("random.trust_cpu", parse_trust_cpu);
static void crng_initialize(struct crng_state *crng) static bool crng_init_try_arch(struct crng_state *crng)
{ {
int i; int i;
int arch_init = 1; bool arch_init = true;
unsigned long rv; unsigned long rv;
memcpy(&crng->state[0], "expand 32-byte k", 16);
if (crng == &primary_crng)
_extract_entropy(&input_pool, &crng->state[4],
sizeof(__u32) * 12, 0);
else
_get_random_bytes(&crng->state[4], sizeof(__u32) * 12);
for (i = 4; i < 16; i++) { for (i = 4; i < 16; i++) {
if (!arch_get_random_seed_long(&rv) && if (!arch_get_random_seed_long(&rv) &&
!arch_get_random_long(&rv)) { !arch_get_random_long(&rv)) {
rv = random_get_entropy(); rv = random_get_entropy();
arch_init = 0; arch_init = false;
} }
crng->state[i] ^= rv; crng->state[i] ^= rv;
} }
if (trust_cpu && arch_init && crng == &primary_crng) {
return arch_init;
}
static void crng_initialize_secondary(struct crng_state *crng)
{
memcpy(&crng->state[0], "expand 32-byte k", 16);
_get_random_bytes(&crng->state[4], sizeof(__u32) * 12);
crng_init_try_arch(crng);
crng->init_time = jiffies - CRNG_RESEED_INTERVAL - 1;
}
static void __init crng_initialize_primary(struct crng_state *crng)
{
memcpy(&crng->state[0], "expand 32-byte k", 16);
_extract_entropy(&input_pool, &crng->state[4], sizeof(__u32) * 12, 0);
if (crng_init_try_arch(crng) && trust_cpu) {
invalidate_batched_entropy(); invalidate_batched_entropy();
numa_crng_init(); numa_crng_init();
crng_init = 2; crng_init = 2;
...@@ -822,7 +832,7 @@ static void do_numa_crng_init(struct work_struct *work) ...@@ -822,7 +832,7 @@ static void do_numa_crng_init(struct work_struct *work)
crng = kmalloc_node(sizeof(struct crng_state), crng = kmalloc_node(sizeof(struct crng_state),
GFP_KERNEL | __GFP_NOFAIL, i); GFP_KERNEL | __GFP_NOFAIL, i);
spin_lock_init(&crng->lock); spin_lock_init(&crng->lock);
crng_initialize(crng); crng_initialize_secondary(crng);
pool[i] = crng; pool[i] = crng;
} }
mb(); mb();
...@@ -1771,7 +1781,7 @@ static void __init init_std_data(struct entropy_store *r) ...@@ -1771,7 +1781,7 @@ static void __init init_std_data(struct entropy_store *r)
int __init rand_initialize(void) int __init rand_initialize(void)
{ {
init_std_data(&input_pool); init_std_data(&input_pool);
crng_initialize(&primary_crng); crng_initialize_primary(&primary_crng);
crng_global_init_time = jiffies; crng_global_init_time = jiffies;
if (ratelimit_disable) { if (ratelimit_disable) {
urandom_warning.interval = 0; urandom_warning.interval = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment