]> git.baikalelectronics.ru Git - kernel.git/commitdiff
random: remove CONFIG_ARCH_RANDOM
authorJason A. Donenfeld <Jason@zx2c4.com>
Tue, 5 Jul 2022 18:48:41 +0000 (20:48 +0200)
committerJason A. Donenfeld <Jason@zx2c4.com>
Mon, 18 Jul 2022 13:03:37 +0000 (15:03 +0200)
When RDRAND was introduced, there was much discussion on whether it
should be trusted and how the kernel should handle that. Initially, two
mechanisms cropped up, CONFIG_ARCH_RANDOM, a compile time switch, and
"nordrand", a boot-time switch.

Later the thinking evolved. With a properly designed RNG, using RDRAND
values alone won't harm anything, even if the outputs are malicious.
Rather, the issue is whether those values are being *trusted* to be good
or not. And so a new set of options were introduced as the real
ones that people use -- CONFIG_RANDOM_TRUST_CPU and "random.trust_cpu".
With these options, RDRAND is used, but it's not always credited. So in
the worst case, it does nothing, and in the best case, maybe it helps.

Along the way, CONFIG_ARCH_RANDOM's meaning got sort of pulled into the
center and became something certain platforms force-select.

The old options don't really help with much, and it's a bit odd to have
special handling for these instructions when the kernel can deal fine
with the existence or untrusted existence or broken existence or
non-existence of that CPU capability.

Simplify the situation by removing CONFIG_ARCH_RANDOM and using the
ordinary asm-generic fallback pattern instead, keeping the two options
that are actually used. For now it leaves "nordrand" for now, as the
removal of that will take a different route.

Acked-by: Michael Ellerman <mpe@ellerman.id.au>
Acked-by: Catalin Marinas <catalin.marinas@arm.com>
Acked-by: Borislav Petkov <bp@suse.de>
Acked-by: Heiko Carstens <hca@linux.ibm.com>
Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
24 files changed:
arch/arm/include/asm/archrandom.h
arch/arm64/Kconfig
arch/arm64/include/asm/archrandom.h
arch/arm64/kernel/cpufeature.c
arch/powerpc/Kconfig
arch/powerpc/include/asm/archrandom.h
arch/powerpc/include/asm/machdep.h
arch/powerpc/platforms/microwatt/Kconfig
arch/powerpc/platforms/powernv/Kconfig
arch/powerpc/platforms/pseries/Kconfig
arch/s390/Kconfig
arch/s390/configs/zfcpdump_defconfig
arch/s390/crypto/Makefile
arch/s390/include/asm/archrandom.h
arch/s390/kernel/setup.c
arch/x86/Kconfig
arch/x86/include/asm/archrandom.h
arch/x86/kernel/cpu/rdrand.c
drivers/char/Kconfig
drivers/char/hw_random/s390-trng.c
include/asm-generic/Kbuild
include/asm-generic/archrandom.h [new file with mode: 0644]
include/linux/random.h
tools/testing/selftests/wireguard/qemu/kernel.config

index a8e84ca5c2ee4ac8af8250600482e996de6834ce..cc4714eb1a7556a84945f1ebb3edfe658e92714c 100644 (file)
@@ -7,4 +7,6 @@ static inline bool __init smccc_probe_trng(void)
        return false;
 }
 
+#include <asm-generic/archrandom.h>
+
 #endif /* _ASM_ARCHRANDOM_H */
index 1652a9800ebee645616948df2249e186e948baff..1880f71c25477856f47d21d2d749b8e996cae044 100644 (file)
@@ -1858,14 +1858,6 @@ config ARM64_E0PD
 
          This option enables E0PD for TTBR1 where available.
 
-config ARCH_RANDOM
-       bool "Enable support for random number generation"
-       default y
-       help
-         Random number generation (part of the ARMv8.5 Extensions)
-         provides a high bandwidth, cryptographically secure
-         hardware random number generator.
-
 config ARM64_AS_HAS_MTE
        # Initial support for MTE went in binutils 2.32.0, checked with
        # ".arch armv8.5-a+memtag" below. However, this was incomplete
index 3a6b6d38c5b812edcafd3e68922ef153ae4a57ea..c3b9fa56af67ed5a797dca4dde8e4e0bc71ca733 100644 (file)
@@ -2,8 +2,6 @@
 #ifndef _ASM_ARCHRANDOM_H
 #define _ASM_ARCHRANDOM_H
 
-#ifdef CONFIG_ARCH_RANDOM
-
 #include <linux/arm-smccc.h>
 #include <linux/bug.h>
 #include <linux/kernel.h>
@@ -167,12 +165,4 @@ arch_get_random_seed_long_early(unsigned long *v)
 }
 #define arch_get_random_seed_long_early arch_get_random_seed_long_early
 
-#else /* !CONFIG_ARCH_RANDOM */
-
-static inline bool __init smccc_probe_trng(void)
-{
-       return false;
-}
-
-#endif /* CONFIG_ARCH_RANDOM */
 #endif /* _ASM_ARCHRANDOM_H */
index 8d88433de81da0a0ecf890f8328433fa4a0c4d9a..0e9462abeb77ee670275aa0d1f9ee4934978695f 100644 (file)
@@ -2416,7 +2416,6 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
                .cpu_enable = cpu_enable_e0pd,
        },
 #endif
-#ifdef CONFIG_ARCH_RANDOM
        {
                .desc = "Random Number Generator",
                .capability = ARM64_HAS_RNG,
@@ -2428,7 +2427,6 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
                .sign = FTR_UNSIGNED,
                .min_field_value = 1,
        },
-#endif
 #ifdef CONFIG_ARM64_BTI
        {
                .desc = "Branch Target Identification",
index 7aa12e88c5800df99123852f15c09e3054951e2e..623deb5bedf6d52c106a63f81b2e0d9c1d8bfd6d 100644 (file)
@@ -1252,9 +1252,6 @@ config PHYSICAL_START
        default "0x00000000"
 endif
 
-config ARCH_RANDOM
-       def_bool n
-
 config PPC_LIB_RHEAP
        bool
 
index 9a53e29680f4162d8513fe2a9a00f3b3abbba4c9..25ba65df6b1ae61a61dcc7a1a42a6d2389e53cd6 100644 (file)
@@ -2,8 +2,6 @@
 #ifndef _ASM_POWERPC_ARCHRANDOM_H
 #define _ASM_POWERPC_ARCHRANDOM_H
 
-#ifdef CONFIG_ARCH_RANDOM
-
 #include <asm/machdep.h>
 
 static inline bool __must_check arch_get_random_long(unsigned long *v)
@@ -35,7 +33,6 @@ static inline bool __must_check arch_get_random_seed_int(unsigned int *v)
 
        return rc;
 }
-#endif /* CONFIG_ARCH_RANDOM */
 
 #ifdef CONFIG_PPC_POWERNV
 int powernv_hwrng_present(void);
index 358d171ae8e0e28c1e50a6a843fee92b4f9c47e1..6c1002043367e451f4acb35507290588c96caf8d 100644 (file)
@@ -200,9 +200,7 @@ struct machdep_calls {
        ssize_t (*cpu_release)(const char *, size_t);
 #endif
 
-#ifdef CONFIG_ARCH_RANDOM
        int (*get_random_seed)(unsigned long *v);
-#endif
 };
 
 extern void e500_idle(void);
index 5e320f49583aa5d922046ce3c829c889c4eb20eb..6af443a1db991e9695fd56b66a036a4332473066 100644 (file)
@@ -6,7 +6,6 @@ config PPC_MICROWATT
        select PPC_ICS_NATIVE
        select PPC_ICP_NATIVE
        select PPC_UDBG_16550
-       select ARCH_RANDOM
        help
           This option enables support for FPGA-based Microwatt implementations.
 
index 161dfe024085f07d8b3c6d220ba6233c12addc36..e1a05c5a90049996d6617145074098d078d2ff59 100644 (file)
@@ -12,7 +12,6 @@ config PPC_POWERNV
        select EPAPR_BOOT
        select PPC_INDIRECT_PIO
        select PPC_UDBG_16550
-       select ARCH_RANDOM
        select CPU_FREQ
        select PPC_DOORBELL
        select MMU_NOTIFIER
index f7fd91d153a4524be93cfbd2865feec6317fbcca..f4a647c1f0b2737e348897e658bc57275a196774 100644 (file)
@@ -19,7 +19,6 @@ config PPC_PSERIES
        select PPC_UDBG_16550
        select PPC_DOORBELL
        select HOTPLUG_CPU
-       select ARCH_RANDOM
        select FORCE_SMP
        select SWIOTLB
        default y
index 8cd9e56c629ba8c374ab9cd0c0117663809cbd27..9b6e4e7cb17bda79494493d9bf96906e1a162b24 100644 (file)
@@ -507,21 +507,6 @@ config KEXEC_SIG
          verification for the corresponding kernel image type being
          loaded in order for this to work.
 
-config ARCH_RANDOM
-       def_bool y
-       prompt "s390 architectural random number generation API"
-       help
-         Enable the s390 architectural random number generation API
-         to provide random data for all consumers within the Linux
-         kernel.
-
-         When enabled the arch_random_* functions declared in linux/random.h
-         are implemented. The implementation is based on the s390 CPACF
-         instruction subfunction TRNG which provides a real true random
-         number generator.
-
-         If unsure, say Y.
-
 config KERNEL_NOBP
        def_bool n
        prompt "Enable modified branch prediction for the kernel by default"
index a87fcc45e3071d93b5c869c89b9887236cbb2e27..f4976f611b9447dad5510c4856cbdd202f8443a2 100644 (file)
@@ -15,7 +15,6 @@ CONFIG_TUNE_ZEC12=y
 # CONFIG_COMPAT is not set
 CONFIG_NR_CPUS=2
 CONFIG_HZ_100=y
-# CONFIG_ARCH_RANDOM is not set
 # CONFIG_RELOCATABLE is not set
 # CONFIG_CHSC_SCH is not set
 # CONFIG_SCM_BUS is not set
index c63abfeb6d170549427620b2ac44066305aad220..1b1cc478fa9438833a4231d51e70b878a04542c6 100644 (file)
@@ -15,7 +15,7 @@ obj-$(CONFIG_CRYPTO_CHACHA_S390) += chacha_s390.o
 obj-$(CONFIG_S390_PRNG) += prng.o
 obj-$(CONFIG_CRYPTO_GHASH_S390) += ghash_s390.o
 obj-$(CONFIG_CRYPTO_CRC32_S390) += crc32-vx_s390.o
-obj-$(CONFIG_ARCH_RANDOM) += arch_random.o
+obj-y += arch_random.o
 
 crc32-vx_s390-y := crc32-vx.o crc32le-vx.o crc32be-vx.o
 chacha_s390-y := chacha-glue.o chacha-s390.o
index 2c6e1c6ecbe780284c2374d7ee0d4394b1a66fda..0a1c2e66c709388fdf9efb4e826867e84bc55725 100644 (file)
@@ -11,8 +11,6 @@
 #ifndef _ASM_S390_ARCHRANDOM_H
 #define _ASM_S390_ARCHRANDOM_H
 
-#ifdef CONFIG_ARCH_RANDOM
-
 #include <linux/static_key.h>
 #include <linux/atomic.h>
 #include <asm/cpacf.h>
@@ -50,5 +48,4 @@ static inline bool __must_check arch_get_random_seed_int(unsigned int *v)
        return false;
 }
 
-#endif /* CONFIG_ARCH_RANDOM */
 #endif /* _ASM_S390_ARCHRANDOM_H */
index 0a37f5de286316095598b60242318cf184fa3823..ebad41afe355921d2e2c20318136c5a336343ddb 100644 (file)
@@ -876,10 +876,8 @@ static void __init setup_randomness(void)
                add_device_randomness(&vmms->vm, sizeof(vmms->vm[0]) * vmms->count);
        memblock_free(vmms, PAGE_SIZE);
 
-#ifdef CONFIG_ARCH_RANDOM
        if (cpacf_query_func(CPACF_PRNO, CPACF_PRNO_TRNG))
                static_branch_enable(&s390_arch_random_available);
-#endif
 }
 
 /*
index e58798f636d474d277af5eb59dc9b6a42b2c31d0..ba13749c09c860d685e9a046990fcbf8a21eb858 100644 (file)
@@ -1810,15 +1810,6 @@ config ARCH_USES_PG_UNCACHED
        def_bool y
        depends on X86_PAT
 
-config ARCH_RANDOM
-       def_bool y
-       prompt "x86 architectural random number generator" if EXPERT
-       help
-         Enable the x86 architectural RDRAND instruction
-         (Intel Bull Mountain technology) to generate random numbers.
-         If supported, this is a high bandwidth, cryptographically
-         secure hardware random number generator.
-
 config X86_UMIP
        def_bool y
        prompt "User Mode Instruction Prevention" if EXPERT
index ebc248e495493a62b35a34d90583c56c82dac35c..fb235b6961753ca79d6887acb25a1604479acdff 100644 (file)
@@ -65,10 +65,8 @@ static inline bool __must_check rdseed_int(unsigned int *v)
 
 /*
  * These are the generic interfaces; they must not be declared if the
- * stubs in <linux/random.h> are to be invoked,
- * i.e. CONFIG_ARCH_RANDOM is not defined.
+ * stubs in <linux/random.h> are to be invoked.
  */
-#ifdef CONFIG_ARCH_RANDOM
 
 static inline bool __must_check arch_get_random_long(unsigned long *v)
 {
@@ -90,12 +88,8 @@ static inline bool __must_check arch_get_random_seed_int(unsigned int *v)
        return static_cpu_has(X86_FEATURE_RDSEED) ? rdseed_int(v) : false;
 }
 
-extern void x86_init_rdrand(struct cpuinfo_x86 *c);
-
-#else  /* !CONFIG_ARCH_RANDOM */
-
-static inline void x86_init_rdrand(struct cpuinfo_x86 *c) { }
-
-#endif  /* !CONFIG_ARCH_RANDOM */
+#ifndef CONFIG_UML
+void x86_init_rdrand(struct cpuinfo_x86 *c);
+#endif
 
 #endif /* ASM_X86_ARCHRANDOM_H */
index c4be62058dd96053bc0f3a2bc4588135f7010a6f..8f216669ecb81b179e2c70963818a454852b7f96 100644 (file)
@@ -26,7 +26,6 @@ __setup("nordrand", x86_rdrand_setup);
  */
 #define SANITY_CHECK_LOOPS 8
 
-#ifdef CONFIG_ARCH_RANDOM
 void x86_init_rdrand(struct cpuinfo_x86 *c)
 {
        unsigned int changed = 0;
@@ -63,4 +62,3 @@ void x86_init_rdrand(struct cpuinfo_x86 *c)
 "RDRAND gives funky smelling output, might consider not using it by booting with \"nordrand\"");
 
 }
-#endif
index 0b6c03643ddc67962a24e77b592ae4fe80abe2e4..30192e123e5fb2e9c8f07496530cb9bc3615e7a1 100644 (file)
@@ -431,7 +431,6 @@ config ADI
 config RANDOM_TRUST_CPU
        bool "Initialize RNG using CPU RNG instructions"
        default y
-       depends on ARCH_RANDOM
        help
          Initialize the RNG using random numbers supplied by the CPU's
          RNG instructions (e.g. RDRAND), if supported and available. These
index 2beaa35c0d742ba57e771bb7ab8f8a86498c2973..488808dc17a23a4ab9224b6dcb8d126d26f27a77 100644 (file)
@@ -108,7 +108,6 @@ static ssize_t trng_counter_show(struct device *dev,
 {
        u64 dev_counter = atomic64_read(&trng_dev_counter);
        u64 hwrng_counter = atomic64_read(&trng_hwrng_counter);
-#if IS_ENABLED(CONFIG_ARCH_RANDOM)
        u64 arch_counter = atomic64_read(&s390_arch_random_counter);
 
        return sysfs_emit(buf,
@@ -118,14 +117,6 @@ static ssize_t trng_counter_show(struct device *dev,
                        "total: %llu\n",
                        dev_counter, hwrng_counter, arch_counter,
                        dev_counter + hwrng_counter + arch_counter);
-#else
-       return sysfs_emit(buf,
-                       "trng:  %llu\n"
-                       "hwrng: %llu\n"
-                       "total: %llu\n",
-                       dev_counter, hwrng_counter,
-                       dev_counter + hwrng_counter);
-#endif
 }
 static DEVICE_ATTR(byte_counter, 0444, trng_counter_show, NULL);
 
index 8e47d483b524073aec44f94c6d6ab7ed9fea8b5d..36db8b9eb68ad0f97ffd7da86ddc50975da200a8 100644 (file)
@@ -5,6 +5,7 @@
 # asm headers from the host architecutre.)
 
 mandatory-y += atomic.h
+mandatory-y += archrandom.h
 mandatory-y += barrier.h
 mandatory-y += bitops.h
 mandatory-y += bug.h
diff --git a/include/asm-generic/archrandom.h b/include/asm-generic/archrandom.h
new file mode 100644 (file)
index 0000000..3a5ee20
--- /dev/null
@@ -0,0 +1,25 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef __ASM_GENERIC_ARCHRANDOM_H__
+#define __ASM_GENERIC_ARCHRANDOM_H__
+
+static inline bool __must_check arch_get_random_long(unsigned long *v)
+{
+       return false;
+}
+
+static inline bool __must_check arch_get_random_int(unsigned int *v)
+{
+       return false;
+}
+
+static inline bool __must_check arch_get_random_seed_long(unsigned long *v)
+{
+       return false;
+}
+
+static inline bool __must_check arch_get_random_seed_int(unsigned int *v)
+{
+       return false;
+}
+
+#endif
index 20e389a14e5c71935a916e76e973626d45b6bbc7..865770e29f3efbb33d294d092188aa749f96f8a8 100644 (file)
@@ -106,14 +106,7 @@ declare_get_random_var_wait(long, unsigned long)
  */
 #include <linux/prandom.h>
 
-#ifdef CONFIG_ARCH_RANDOM
-# include <asm/archrandom.h>
-#else
-static inline bool __must_check arch_get_random_long(unsigned long *v) { return false; }
-static inline bool __must_check arch_get_random_int(unsigned int *v) { return false; }
-static inline bool __must_check arch_get_random_seed_long(unsigned long *v) { return false; }
-static inline bool __must_check arch_get_random_seed_int(unsigned int *v) { return false; }
-#endif
+#include <asm/archrandom.h>
 
 /*
  * Called from the boot CPU during startup; not valid to call once
index bad88f4b0a0337671299b785bc9409a3ff56b75d..e1858ce7003f202160b52d307b137578c3765f6b 100644 (file)
@@ -58,7 +58,6 @@ CONFIG_NO_HZ_IDLE=y
 CONFIG_NO_HZ_FULL=n
 CONFIG_HZ_PERIODIC=n
 CONFIG_HIGH_RES_TIMERS=y
-CONFIG_ARCH_RANDOM=y
 CONFIG_FILE_LOCKING=y
 CONFIG_POSIX_TIMERS=y
 CONFIG_DEVTMPFS=y