Skip to content

Commit 96562f2

Browse files
Dominik Brodowskizx2c4
authored andcommitted
random: early initialization of ChaCha constants
Previously, the ChaCha constants for the primary pool were only initialized in crng_initialize_primary(), called by rand_initialize(). However, some randomness is actually extracted from the primary pool beforehand, e.g. by kmem_cache_create(). Therefore, statically initialize the ChaCha constants for the primary pool. Cc: Herbert Xu <[email protected]> Cc: "David S. Miller" <[email protected]> Cc: <[email protected]> Signed-off-by: Dominik Brodowski <[email protected]> Signed-off-by: Jason A. Donenfeld <[email protected]>
1 parent 7b87324 commit 96562f2

File tree

2 files changed

+15
-5
lines changed

2 files changed

+15
-5
lines changed

drivers/char/random.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -457,6 +457,10 @@ struct crng_state {
457457

458458
static struct crng_state primary_crng = {
459459
.lock = __SPIN_LOCK_UNLOCKED(primary_crng.lock),
460+
.state[0] = CHACHA_CONSTANT_EXPA,
461+
.state[1] = CHACHA_CONSTANT_ND_3,
462+
.state[2] = CHACHA_CONSTANT_2_BY,
463+
.state[3] = CHACHA_CONSTANT_TE_K,
460464
};
461465

462466
/*
@@ -823,7 +827,6 @@ static void crng_initialize_secondary(struct crng_state *crng)
823827

824828
static void __init crng_initialize_primary(struct crng_state *crng)
825829
{
826-
chacha_init_consts(crng->state);
827830
_extract_entropy(&input_pool, &crng->state[4], sizeof(__u32) * 12, 0);
828831
if (crng_init_try_arch_early(crng) && trust_cpu && crng_init < 2) {
829832
invalidate_batched_entropy();

include/crypto/chacha.h

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,19 @@ static inline void hchacha_block(const u32 *state, u32 *out, int nrounds)
4747
hchacha_block_generic(state, out, nrounds);
4848
}
4949

50+
enum chacha_constants { /* expand 32-byte k */
51+
CHACHA_CONSTANT_EXPA = 0x61707865U,
52+
CHACHA_CONSTANT_ND_3 = 0x3320646eU,
53+
CHACHA_CONSTANT_2_BY = 0x79622d32U,
54+
CHACHA_CONSTANT_TE_K = 0x6b206574U
55+
};
56+
5057
static inline void chacha_init_consts(u32 *state)
5158
{
52-
state[0] = 0x61707865; /* "expa" */
53-
state[1] = 0x3320646e; /* "nd 3" */
54-
state[2] = 0x79622d32; /* "2-by" */
55-
state[3] = 0x6b206574; /* "te k" */
59+
state[0] = CHACHA_CONSTANT_EXPA;
60+
state[1] = CHACHA_CONSTANT_ND_3;
61+
state[2] = CHACHA_CONSTANT_2_BY;
62+
state[3] = CHACHA_CONSTANT_TE_K;
5663
}
5764

5865
void chacha_init_arch(u32 *state, const u32 *key, const u8 *iv);

0 commit comments

Comments
 (0)