From 2836990aff5bc1dab6a4e927304247dae469c774 Mon Sep 17 00:00:00 2001 From: "Alexander E. Patrakov" Date: Thu, 19 Sep 2019 01:18:39 +0500 Subject: [PATCH] hw_random: Add jitterentropy_hwrng This re-exports the existing "jitterentropy_rng" cryptoapi RNG as a hwrng. The use case is to replace haveged, which distributions often misconfigure by running it too late, while it is really needed even in the initramfs on some systems. Signed-off-by: Alexander E. Patrakov --- drivers/char/hw_random/Kconfig | 20 ++++++ drivers/char/hw_random/Makefile | 1 + drivers/char/hw_random/jitterentropy-hwrng.c | 70 ++++++++++++++++++++ 3 files changed, 91 insertions(+) create mode 100644 drivers/char/hw_random/jitterentropy-hwrng.c diff --git a/drivers/char/hw_random/Kconfig b/drivers/char/hw_random/Kconfig index 59f25286befe..ff2102c0159c 100644 --- a/drivers/char/hw_random/Kconfig +++ b/drivers/char/hw_random/Kconfig @@ -35,6 +35,26 @@ config HW_RANDOM_TIMERIOMEM If unsure, say Y. +config HW_RANDOM_JITTERENTROPY + tristate "Jitter Entropy HW Random Number Generator support" + select CRYPTO_JITTERENTROPY + ---help--- + This driver provides kernel-side support for extracting entropy + from CPU and memory clock jitter. + + jitterentropy-hwrng serves the same purpose as haveged, but is in + the kernel. So, if you otherwise would have to run haveged, build + this driver instead, it has an advantage of being available very + early in the boot process. + + Note that it is still not known whether clock jitter provides any + actual entropy. + + To compile this driver as a module, choose M here: the + module will be called jitterentropy-hwrng. + + If unsure, say N. + config HW_RANDOM_INTEL tristate "Intel HW Random Number Generator support" depends on (X86 || IA64) && PCI diff --git a/drivers/char/hw_random/Makefile b/drivers/char/hw_random/Makefile index 7c9ef4a7667f..9c6d1d3626f6 100644 --- a/drivers/char/hw_random/Makefile +++ b/drivers/char/hw_random/Makefile @@ -6,6 +6,7 @@ obj-$(CONFIG_HW_RANDOM) += rng-core.o rng-core-y := core.o obj-$(CONFIG_HW_RANDOM_TIMERIOMEM) += timeriomem-rng.o +obj-$(CONFIG_HW_RANDOM_JITTERENTROPY) += jitterentropy-hwrng.o obj-$(CONFIG_HW_RANDOM_INTEL) += intel-rng.o obj-$(CONFIG_HW_RANDOM_AMD) += amd-rng.o obj-$(CONFIG_HW_RANDOM_ATMEL) += atmel-rng.o diff --git a/drivers/char/hw_random/jitterentropy-hwrng.c b/drivers/char/hw_random/jitterentropy-hwrng.c new file mode 100644 index 000000000000..b7aeefe4f47d --- /dev/null +++ b/drivers/char/hw_random/jitterentropy-hwrng.c @@ -0,0 +1,70 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (C) 2019 Alexander E. Patrakov + * + * Driver that exposes CPU clock jitter as a hardware random number generator + */ + +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#include +#include +#include +#include +#include + +static struct crypto_rng *drng; + +static int jitterentropy_rng_read(struct hwrng *rng, void *data, size_t max, bool wait) +{ + int err; + + /* Prevent the hwrng_fill thread from impeding progress of everything else */ + if (wait) + schedule(); + + err = crypto_rng_get_bytes(drng, data, max); + if (err) + return err; + return max; +} + +static struct hwrng jitterentropy_rng = { + .name = KBUILD_MODNAME, + .read = jitterentropy_rng_read, + .quality = 4, /* minimum that guarantees progress in hwrng_fill thread */ +}; + +static int __init mod_init(void) +{ + int ret; + + pr_info("Registering the driver\n"); + drng = crypto_alloc_rng("jitterentropy_rng", 0, 0); + if (!drng) { + pr_err("crypto_alloc_rng() failed\n"); + return -ENODEV; + } + + ret = hwrng_register(&jitterentropy_rng); + if (ret) { + crypto_free_rng(drng); + return ret; + } + + return 0; +} + +static void __exit mod_exit(void) +{ + hwrng_unregister(&jitterentropy_rng); + crypto_free_rng(drng); +} + +module_init(mod_init); +module_exit(mod_exit); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Alexander E. Patrakov "); +MODULE_DESCRIPTION("Exposes clock jitter as a hwrng"); +MODULE_SOFTDEP("pre: jitterentropy_rng"); -- 2.23.0