| From foo@baz Thu Jun 16 06:59:24 PM CEST 2022 |
| From: Kees Cook <keescook@chromium.org> |
| Date: Mon, 27 Aug 2018 14:51:54 -0700 |
| Subject: random: make CPU trust a boot parameter |
| |
| From: Kees Cook <keescook@chromium.org> |
| |
| commit 9b25436662d5fb4c66eb527ead53cab15f596ee0 upstream. |
| |
| Instead of forcing a distro or other system builder to choose |
| at build time whether the CPU is trusted for CRNG seeding via |
| CONFIG_RANDOM_TRUST_CPU, provide a boot-time parameter for end users to |
| control the choice. The CONFIG will set the default state instead. |
| |
| Signed-off-by: Kees Cook <keescook@chromium.org> |
| Signed-off-by: Theodore Ts'o <tytso@mit.edu> |
| Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| Documentation/kernel-parameters.txt | 6 ++++++ |
| drivers/char/Kconfig | 4 ++-- |
| drivers/char/random.c | 11 ++++++++--- |
| 3 files changed, 16 insertions(+), 5 deletions(-) |
| |
| --- a/Documentation/kernel-parameters.txt |
| +++ b/Documentation/kernel-parameters.txt |
| @@ -3577,6 +3577,12 @@ bytes respectively. Such letter suffixes |
| ramdisk_size= [RAM] Sizes of RAM disks in kilobytes |
| See Documentation/blockdev/ramdisk.txt. |
| |
| + random.trust_cpu={on,off} |
| + [KNL] Enable or disable trusting the use of the |
| + CPU's random number generator (if available) to |
| + fully seed the kernel's CRNG. Default is controlled |
| + by CONFIG_RANDOM_TRUST_CPU. |
| + |
| rcu_nocbs= [KNL] |
| The argument is a cpu list, as described above. |
| |
| --- a/drivers/char/Kconfig |
| +++ b/drivers/char/Kconfig |
| @@ -607,5 +607,5 @@ config RANDOM_TRUST_CPU |
| that CPU manufacturer (perhaps with the insistence or mandate |
| of a Nation State's intelligence or law enforcement agencies) |
| has not installed a hidden back door to compromise the CPU's |
| - random number generation facilities. |
| - |
| + random number generation facilities. This can also be configured |
| + at boot with "random.trust_cpu=on/off". |
| --- a/drivers/char/random.c |
| +++ b/drivers/char/random.c |
| @@ -780,6 +780,13 @@ static struct crng_state **crng_node_poo |
| |
| static void invalidate_batched_entropy(void); |
| |
| +static bool trust_cpu __ro_after_init = IS_ENABLED(CONFIG_RANDOM_TRUST_CPU); |
| +static int __init parse_trust_cpu(char *arg) |
| +{ |
| + return kstrtobool(arg, &trust_cpu); |
| +} |
| +early_param("random.trust_cpu", parse_trust_cpu); |
| + |
| static void crng_initialize(struct crng_state *crng) |
| { |
| int i; |
| @@ -800,12 +807,10 @@ static void crng_initialize(struct crng_ |
| } |
| crng->state[i] ^= rv; |
| } |
| -#ifdef CONFIG_RANDOM_TRUST_CPU |
| - if (arch_init) { |
| + if (trust_cpu && arch_init) { |
| crng_init = 2; |
| pr_notice("random: crng done (trusting CPU's manufacturer)\n"); |
| } |
| -#endif |
| crng->init_time = jiffies - CRNG_RESEED_INTERVAL - 1; |
| } |
| |