diff options
author | Theodore Ts'o <tytso@mit.edu> | 2018-07-17 18:24:27 -0400 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2018-07-24 15:43:24 -0400 |
commit | 39a8883a2b989d1d21bd8dd99f5557f0c5e89694 (patch) | |
tree | 9e86c920e258b8ca73ffa3955cd82c6c1ee84cea | |
parent | 3672476edaa0660eb833f54fa9edeb505417b75c (diff) |
random: add a config option to trust the CPU's hwrng
This gives the user building their own kernel (or a Linux
distribution) the option of deciding whether or not to trust the CPU's
hardware random number generator (e.g., RDRAND for x86 CPU's) as being
correctly implemented and not having a back door introduced (perhaps
courtesy of a Nation State's law enforcement or intelligence
agencies).
This will prevent getrandom(2) from blocking, if there is a
willingness to trust the CPU manufacturer.
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
-rw-r--r-- | drivers/char/Kconfig | 14 | ||||
-rw-r--r-- | drivers/char/random.c | 11 |
2 files changed, 24 insertions, 1 deletions
diff --git a/drivers/char/Kconfig b/drivers/char/Kconfig index 212f447938ae..ce277ee0a28a 100644 --- a/drivers/char/Kconfig +++ b/drivers/char/Kconfig | |||
@@ -554,3 +554,17 @@ config ADI | |||
554 | 554 | ||
555 | endmenu | 555 | endmenu |
556 | 556 | ||
557 | config RANDOM_TRUST_CPU | ||
558 | bool "Trust the CPU manufacturer to initialize Linux's CRNG" | ||
559 | depends on X86 || S390 || PPC | ||
560 | default n | ||
561 | help | ||
562 | Assume that CPU manufacturer (e.g., Intel or AMD for RDSEED or | ||
563 | RDRAND, IBM for the S390 and Power PC architectures) is trustworthy | ||
564 | for the purposes of initializing Linux's CRNG. Since this is not | ||
565 | something that can be independently audited, this amounts to trusting | ||
566 | that CPU manufacturer (perhaps with the insistence or mandate | ||
567 | of a Nation State's intelligence or law enforcement agencies) | ||
568 | has not installed a hidden back door to compromise the CPU's | ||
569 | random number generation facilities. | ||
570 | |||
diff --git a/drivers/char/random.c b/drivers/char/random.c index 34ddfd57419b..f4013b8a711b 100644 --- a/drivers/char/random.c +++ b/drivers/char/random.c | |||
@@ -782,6 +782,7 @@ static void invalidate_batched_entropy(void); | |||
782 | static void crng_initialize(struct crng_state *crng) | 782 | static void crng_initialize(struct crng_state *crng) |
783 | { | 783 | { |
784 | int i; | 784 | int i; |
785 | int arch_init = 1; | ||
785 | unsigned long rv; | 786 | unsigned long rv; |
786 | 787 | ||
787 | memcpy(&crng->state[0], "expand 32-byte k", 16); | 788 | memcpy(&crng->state[0], "expand 32-byte k", 16); |
@@ -792,10 +793,18 @@ static void crng_initialize(struct crng_state *crng) | |||
792 | _get_random_bytes(&crng->state[4], sizeof(__u32) * 12); | 793 | _get_random_bytes(&crng->state[4], sizeof(__u32) * 12); |
793 | for (i = 4; i < 16; i++) { | 794 | for (i = 4; i < 16; i++) { |
794 | if (!arch_get_random_seed_long(&rv) && | 795 | if (!arch_get_random_seed_long(&rv) && |
795 | !arch_get_random_long(&rv)) | 796 | !arch_get_random_long(&rv)) { |
796 | rv = random_get_entropy(); | 797 | rv = random_get_entropy(); |
798 | arch_init = 0; | ||
799 | } | ||
797 | crng->state[i] ^= rv; | 800 | crng->state[i] ^= rv; |
798 | } | 801 | } |
802 | #ifdef CONFIG_RANDOM_TRUST_CPU | ||
803 | if (arch_init) { | ||
804 | crng_init = 2; | ||
805 | pr_notice("random: crng done (trusting CPU's manufacturer)\n"); | ||
806 | } | ||
807 | #endif | ||
799 | crng->init_time = jiffies - CRNG_RESEED_INTERVAL - 1; | 808 | crng->init_time = jiffies - CRNG_RESEED_INTERVAL - 1; |
800 | } | 809 | } |
801 | 810 | ||