This is a note to let you know that I've just added the patch titled random: order timer entropy functions below interrupt functions to the 4.19-stable tree which can be found at: http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary The filename of the patch is: random-order-timer-entropy-functions-below-interrupt-functions.patch and it can be found in the queue-4.19 subdirectory. If you, or anyone else, feels it should not be added to the stable tree, please let <stable@xxxxxxxxxxxxxxx> know about it. >From foo@baz Fri Jun 17 08:58:56 AM CEST 2022 From: "Jason A. Donenfeld" <Jason@xxxxxxxxx> Date: Fri, 6 May 2022 18:27:38 +0200 Subject: random: order timer entropy functions below interrupt functions From: "Jason A. Donenfeld" <Jason@xxxxxxxxx> commit a4b5c26b79ffdfcfb816c198f2fc2b1e7b5b580f upstream. There are no code changes here; this is just a reordering of functions, so that in subsequent commits, the timer entropy functions can call into the interrupt ones. Signed-off-by: Jason A. Donenfeld <Jason@xxxxxxxxx> Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx> --- drivers/char/random.c | 238 +++++++++++++++++++++++++------------------------- 1 file changed, 119 insertions(+), 119 deletions(-) --- a/drivers/char/random.c +++ b/drivers/char/random.c @@ -851,13 +851,13 @@ static void credit_init_bits(size_t nbit * the above entropy accumulation routines: * * void add_device_randomness(const void *buf, size_t size); - * void add_input_randomness(unsigned int type, unsigned int code, - * unsigned int value); - * void add_disk_randomness(struct gendisk *disk); * void add_hwgenerator_randomness(const void *buffer, size_t count, * size_t entropy); * void add_bootloader_randomness(const void *buf, size_t size); * void add_interrupt_randomness(int irq); + * void add_input_randomness(unsigned int type, unsigned int code, + * unsigned int value); + * void add_disk_randomness(struct gendisk *disk); * * add_device_randomness() adds data to the input pool that * is likely to differ between two devices (or possibly even per boot). @@ -867,19 +867,6 @@ static void credit_init_bits(size_t nbit * that might otherwise be identical and have very little entropy * available to them (particularly common in the embedded world). * - * add_input_randomness() uses the input layer interrupt timing, as well - * as the event type information from the hardware. - * - * add_disk_randomness() uses what amounts to the seek time of block - * layer request events, on a per-disk_devt basis, as input to the - * entropy pool. Note that high-speed solid state drives with very low - * seek times do not make for good sources of entropy, as their seek - * times are usually fairly consistent. - * - * The above two routines try to estimate how many bits of entropy - * to credit. They do this by keeping track of the first and second - * order deltas of the event timings. - * * add_hwgenerator_randomness() is for true hardware RNGs, and will credit * entropy as specified by the caller. If the entropy pool is full it will * block until more entropy is needed. @@ -893,6 +880,19 @@ static void credit_init_bits(size_t nbit * as inputs, it feeds the input pool roughly once a second or after 64 * interrupts, crediting 1 bit of entropy for whichever comes first. * + * add_input_randomness() uses the input layer interrupt timing, as well + * as the event type information from the hardware. + * + * add_disk_randomness() uses what amounts to the seek time of block + * layer request events, on a per-disk_devt basis, as input to the + * entropy pool. Note that high-speed solid state drives with very low + * seek times do not make for good sources of entropy, as their seek + * times are usually fairly consistent. + * + * The last two routines try to estimate how many bits of entropy + * to credit. They do this by keeping track of the first and second + * order deltas of the event timings. + * **********************************************************************/ static bool trust_cpu __ro_after_init = IS_ENABLED(CONFIG_RANDOM_TRUST_CPU); @@ -970,109 +970,6 @@ void add_device_randomness(const void *b } EXPORT_SYMBOL(add_device_randomness); -/* There is one of these per entropy source */ -struct timer_rand_state { - unsigned long last_time; - long last_delta, last_delta2; -}; - -/* - * This function adds entropy to the entropy "pool" by using timing - * delays. It uses the timer_rand_state structure to make an estimate - * of how many bits of entropy this call has added to the pool. - * - * The number "num" is also added to the pool - it should somehow describe - * the type of event which just happened. This is currently 0-255 for - * keyboard scan codes, and 256 upwards for interrupts. - */ -static void add_timer_randomness(struct timer_rand_state *state, unsigned int num) -{ - unsigned long entropy = random_get_entropy(), now = jiffies, flags; - long delta, delta2, delta3; - - spin_lock_irqsave(&input_pool.lock, flags); - _mix_pool_bytes(&entropy, sizeof(entropy)); - _mix_pool_bytes(&num, sizeof(num)); - spin_unlock_irqrestore(&input_pool.lock, flags); - - if (crng_ready()) - return; - - /* - * Calculate number of bits of randomness we probably added. - * We take into account the first, second and third-order deltas - * in order to make our estimate. - */ - delta = now - READ_ONCE(state->last_time); - WRITE_ONCE(state->last_time, now); - - delta2 = delta - READ_ONCE(state->last_delta); - WRITE_ONCE(state->last_delta, delta); - - delta3 = delta2 - READ_ONCE(state->last_delta2); - WRITE_ONCE(state->last_delta2, delta2); - - if (delta < 0) - delta = -delta; - if (delta2 < 0) - delta2 = -delta2; - if (delta3 < 0) - delta3 = -delta3; - if (delta > delta2) - delta = delta2; - if (delta > delta3) - delta = delta3; - - /* - * delta is now minimum absolute delta. - * Round down by 1 bit on general principles, - * and limit entropy estimate to 12 bits. - */ - credit_init_bits(min_t(unsigned int, fls(delta >> 1), 11)); -} - -void add_input_randomness(unsigned int type, unsigned int code, - unsigned int value) -{ - static unsigned char last_value; - static struct timer_rand_state input_timer_state = { INITIAL_JIFFIES }; - - /* Ignore autorepeat and the like. */ - if (value == last_value) - return; - - last_value = value; - add_timer_randomness(&input_timer_state, - (type << 4) ^ code ^ (code >> 4) ^ value); -} -EXPORT_SYMBOL_GPL(add_input_randomness); - -#ifdef CONFIG_BLOCK -void add_disk_randomness(struct gendisk *disk) -{ - if (!disk || !disk->random) - return; - /* First major is 1, so we get >= 0x200 here. */ - add_timer_randomness(disk->random, 0x100 + disk_devt(disk)); -} -EXPORT_SYMBOL_GPL(add_disk_randomness); - -void rand_initialize_disk(struct gendisk *disk) -{ - struct timer_rand_state *state; - - /* - * If kzalloc returns null, we just won't use that entropy - * source. - */ - state = kzalloc(sizeof(struct timer_rand_state), GFP_KERNEL); - if (state) { - state->last_time = INITIAL_JIFFIES; - disk->random = state; - } -} -#endif - /* * Interface for in-kernel drivers of true hardware RNGs. * Those devices may produce endless random bits and will be throttled @@ -1234,6 +1131,109 @@ void add_interrupt_randomness(int irq) } EXPORT_SYMBOL_GPL(add_interrupt_randomness); +/* There is one of these per entropy source */ +struct timer_rand_state { + unsigned long last_time; + long last_delta, last_delta2; +}; + +/* + * This function adds entropy to the entropy "pool" by using timing + * delays. It uses the timer_rand_state structure to make an estimate + * of how many bits of entropy this call has added to the pool. + * + * The number "num" is also added to the pool - it should somehow describe + * the type of event which just happened. This is currently 0-255 for + * keyboard scan codes, and 256 upwards for interrupts. + */ +static void add_timer_randomness(struct timer_rand_state *state, unsigned int num) +{ + unsigned long entropy = random_get_entropy(), now = jiffies, flags; + long delta, delta2, delta3; + + spin_lock_irqsave(&input_pool.lock, flags); + _mix_pool_bytes(&entropy, sizeof(entropy)); + _mix_pool_bytes(&num, sizeof(num)); + spin_unlock_irqrestore(&input_pool.lock, flags); + + if (crng_ready()) + return; + + /* + * Calculate number of bits of randomness we probably added. + * We take into account the first, second and third-order deltas + * in order to make our estimate. + */ + delta = now - READ_ONCE(state->last_time); + WRITE_ONCE(state->last_time, now); + + delta2 = delta - READ_ONCE(state->last_delta); + WRITE_ONCE(state->last_delta, delta); + + delta3 = delta2 - READ_ONCE(state->last_delta2); + WRITE_ONCE(state->last_delta2, delta2); + + if (delta < 0) + delta = -delta; + if (delta2 < 0) + delta2 = -delta2; + if (delta3 < 0) + delta3 = -delta3; + if (delta > delta2) + delta = delta2; + if (delta > delta3) + delta = delta3; + + /* + * delta is now minimum absolute delta. + * Round down by 1 bit on general principles, + * and limit entropy estimate to 12 bits. + */ + credit_init_bits(min_t(unsigned int, fls(delta >> 1), 11)); +} + +void add_input_randomness(unsigned int type, unsigned int code, + unsigned int value) +{ + static unsigned char last_value; + static struct timer_rand_state input_timer_state = { INITIAL_JIFFIES }; + + /* Ignore autorepeat and the like. */ + if (value == last_value) + return; + + last_value = value; + add_timer_randomness(&input_timer_state, + (type << 4) ^ code ^ (code >> 4) ^ value); +} +EXPORT_SYMBOL_GPL(add_input_randomness); + +#ifdef CONFIG_BLOCK +void add_disk_randomness(struct gendisk *disk) +{ + if (!disk || !disk->random) + return; + /* First major is 1, so we get >= 0x200 here. */ + add_timer_randomness(disk->random, 0x100 + disk_devt(disk)); +} +EXPORT_SYMBOL_GPL(add_disk_randomness); + +void rand_initialize_disk(struct gendisk *disk) +{ + struct timer_rand_state *state; + + /* + * If kzalloc returns null, we just won't use that entropy + * source. + */ + state = kzalloc(sizeof(struct timer_rand_state), GFP_KERNEL); + if (state) { + state->last_time = INITIAL_JIFFIES; + disk->random = state; + } +} +#endif + /* * Each time the timer fires, we expect that we got an unpredictable * jump in the cycle counter. Even if the timer is running on another Patches currently in stable-queue which might be from Jason@xxxxxxxxx are queue-4.19/random-do-not-take-pool-spinlock-at-boot.patch queue-4.19/random-remove-kernel.random.read_wakeup_threshold.patch queue-4.19/random-simplify-arithmetic-function-flow-in-account.patch queue-4.19/random-order-timer-entropy-functions-below-interrupt-functions.patch queue-4.19/random-introduce-drain_entropy-helper-to-declutter-crng_reseed.patch queue-4.19/random-fix-locking-in-crng_fast_load.patch queue-4.19/random-cleanup-uuid-handling.patch queue-4.19/random-group-userspace-read-write-functions.patch queue-4.19/random-make-credit_entropy_bits-always-safe.patch queue-4.19/latent_entropy-avoid-build-error-when-plugin-cflags-are-not-set.patch queue-4.19/revert-hwrng-core-freeze-khwrng-thread-during-suspend.patch queue-4.19/drivers-char-random.c-make-primary_crng-static.patch queue-4.19/random-do-not-re-init-if-crng_reseed-completes-before-primary-init.patch queue-4.19/random-use-proper-jiffies-comparison-macro.patch queue-4.19/init-call-time_init-before-rand_initialize.patch queue-4.19/random-split-primary-secondary-crng-init-paths.patch queue-4.19/random-pull-add_hwgenerator_randomness-declaration-into-random.h.patch queue-4.19/random-unify-early-init-crng-load-accounting.patch queue-4.19/drivers-char-random.c-remove-unused-stuct-poolinfo-poolbits.patch queue-4.19/random-use-blake2s-instead-of-sha1-in-extraction.patch queue-4.19/random-convert-to-using-fops-write_iter.patch queue-4.19/random-initialize-chacha20-constants-with-correct-endianness.patch queue-4.19/random-remove-incomplete-last_data-logic.patch queue-4.19/random-group-entropy-extraction-functions.patch queue-4.19/random-add-proper-spdx-header.patch queue-4.19/linux-random.h-remove-arch_has_random-arch_has_random_seed.patch queue-4.19/random-rewrite-header-introductory-comment.patch queue-4.19/random-make-dev-random-be-almost-like-dev-urandom.patch queue-4.19/random-remove-ifdef-d-out-interrupt-bench.patch queue-4.19/um-use-fallback-for-random_get_entropy-instead-of-zero.patch queue-4.19/lib-crypto-sha1-re-roll-loops-to-reduce-code-size.patch queue-4.19/random-tie-batched-entropy-generation-to-base_crng-generation.patch queue-4.19/sparc-use-fallback-for-random_get_entropy-instead-of-zero.patch queue-4.19/random-use-linear-min-entropy-accumulation-crediting.patch queue-4.19/random-remove-batched-entropy-locking.patch queue-4.19/xtensa-use-fallback-for-random_get_entropy-instead-of-zero.patch queue-4.19/powerpc-remove-arch_has_random-arch_has_random_seed.patch queue-4.19/fdt-add-support-for-rng-seed.patch queue-4.19/random-continually-use-hwgenerator-randomness.patch queue-4.19/random-access-input_pool_data-directly-rather-than-through-pointer.patch queue-4.19/random-add-arch_get_random_-long_early.patch queue-4.19/random-inline-leaves-of-rand_initialize.patch queue-4.19/random-cleanup-poolinfo-abstraction.patch queue-4.19/random-wire-up-fops-splice_-read-write-_iter.patch queue-4.19/random-handle-latent-entropy-and-command-line-from-random_init.patch queue-4.19/random-remove-use_input_pool-parameter-from-crng_reseed.patch queue-4.19/random-credit-architectural-init-the-exact-amount.patch queue-4.19/ia64-define-get_cycles-macro-for-arch-override.patch queue-4.19/random-replace-custom-notifier-chain-with-standard-one.patch queue-4.19/random-support-freezable-kthreads-in-add_hwgenerator_randomness.patch queue-4.19/random-document-get_random_int-family.patch queue-4.19/random-remove-the-blocking-pool.patch queue-4.19/random-avoid-initializing-twice-in-credit-race.patch queue-4.19/random-avoid-warnings-for-config_numa-builds.patch queue-4.19/crypto-drbg-add-fips-140-2-ctrng-for-noise-source.patch queue-4.19/random-mark-bootloader-randomness-code-as-__init.patch queue-4.19/random-zero-buffer-after-reading-entropy-from-userspace.patch queue-4.19/random-remove-whitespace-and-reorder-includes.patch queue-4.19/random-ignore-grnd_random-in-getentropy-2.patch queue-4.19/random-clear-fast-pool-crng-and-batches-in-cpuhp-bring-up.patch queue-4.19/random-document-add_hwgenerator_randomness-with-other-input-functions.patch queue-4.19/random-fix-typo-in-add_timer_randomness.patch queue-4.19/random-do-crng-pre-init-loading-in-worker-rather-than-irq.patch queue-4.19/powerpc-use-bool-in-archrandom.h.patch queue-4.19/random-do-not-split-fast-init-input-in-add_hwgenerator_randomness.patch queue-4.19/timekeeping-add-raw-clock-fallback-for-random_get_entropy.patch queue-4.19/random-early-initialization-of-chacha-constants.patch queue-4.19/crypto-drbg-prepare-for-more-fine-grained-tracking-of-seeding-state.patch queue-4.19/random-delete-code-to-pull-data-into-pools.patch queue-4.19/crypto-drbg-always-try-to-free-jitter-rng-instance.patch queue-4.19/random-simplify-entropy-debiting.patch queue-4.19/random-don-t-reset-crng_init_cnt-on-urandom_read.patch queue-4.19/random-skip-fast_init-if-hwrng-provides-large-chunk-of-entropy.patch queue-4.19/random-use-siphash-as-interrupt-entropy-accumulator.patch queue-4.19/random-avoid-checking-crng_ready-twice-in-random_init.patch queue-4.19/random-fix-soft-lockup-when-trying-to-read-from-an-uninitialized-blocking-pool.patch queue-4.19/random-group-sysctl-functions.patch queue-4.19/random-don-t-let-644-read-only-sysctls-be-written-to.patch queue-4.19/random-document-crng_fast_key_erasure-destination-possibility.patch queue-4.19/random-only-wake-up-writers-after-zap-if-threshold-was-passed.patch queue-4.19/random-use-wait_event_freezable-in-add_hwgenerator_randomness.patch queue-4.19/random-check-for-signal-and-try-earlier-when-generating-entropy.patch queue-4.19/random-check-for-signals-every-page_size-chunk-of-dev-random.patch queue-4.19/arm-use-fallback-for-random_get_entropy-instead-of-zero.patch queue-4.19/random-absorb-fast-pool-into-input-pool-after-fast-load.patch queue-4.19/random-give-sysctl_random_min_urandom_seed-a-more-sensible-value.patch queue-4.19/crypto-blake2s-generic-c-library-implementation-and-selftest.patch queue-4.19/random-cleanup-fractional-entropy-shift-constants.patch queue-4.19/random-use-rdseed-instead-of-rdrand-in-entropy-extraction.patch queue-4.19/random-move-rand_initialize-earlier.patch queue-4.19/random-don-t-wake-crng_init_wait-when-crng_init-1.patch queue-4.19/random-add-a-urandom_read_nowait-for-random-apis-that-don-t-warn.patch queue-4.19/random-do-not-sign-extend-bytes-for-rotation-when-mixing.patch queue-4.19/random-move-initialization-functions-out-of-hot-pages.patch queue-4.19/random-remove-dead-code-left-over-from-blocking-pool.patch queue-4.19/drivers-char-random.c-constify-poolinfo_table.patch queue-4.19/crypto-drbg-track-whether-drbg-was-seeded-with-rng_is_initialized.patch queue-4.19/random-use-computational-hash-for-entropy-extraction.patch queue-4.19/random-add-and-use-pr_fmt.patch queue-4.19/random-round-robin-registers-as-ulong-not-u32.patch queue-4.19/random-always-wake-up-entropy-writers-after-extraction.patch queue-4.19/s390-remove-arch_has_random-arch_has_random_seed.patch queue-4.19/random-do-not-xor-rdrand-when-writing-into-dev-random.patch queue-4.19/crypto-drbg-make-reseeding-from-get_random_bytes-synchronous.patch queue-4.19/random-convert-to-entropy_bits-for-better-code-readability.patch queue-4.19/char-random-add-a-newline-at-the-end-of-the-file.patch queue-4.19/random-move-randomize_page-into-mm-where-it-belongs.patch queue-4.19/random-only-call-crng_finalize_init-for-primary_crng.patch queue-4.19/random-cleanup-integer-types.patch queue-4.19/random-re-add-removed-comment-about-get_random_-u32-u64-reseeding.patch queue-4.19/random-unify-cycles_t-and-jiffies-usage-and-types.patch queue-4.19/random-insist-on-random_get_entropy-existing-in-order-to-simplify.patch queue-4.19/random-group-initialization-wait-functions.patch queue-4.19/linux-random.h-mark-config_arch_random-functions-__must_check.patch queue-4.19/random-remove-unused-extract_entropy-reserved-argument.patch queue-4.19/random-check-for-signal_pending-outside-of-need_resched-check.patch queue-4.19/random-access-primary_pool-directly-rather-than-through-pointer.patch queue-4.19/random-fix-sysctl-documentation-nits.patch queue-4.19/random-remove-unused-tracepoints.patch queue-4.19/random-only-read-from-dev-random-after-its-pool-has-received-128-bits.patch queue-4.19/nios2-use-fallback-for-random_get_entropy-instead-of-zero.patch queue-4.19/random-treat-bootloader-trust-toggle-the-same-way-as-cpu-trust-toggle.patch queue-4.19/random-make-consistent-usage-of-crng_ready.patch queue-4.19/lib-crypto-blake2s-move-hmac-construction-into-wireguard.patch queue-4.19/parisc-define-get_cycles-macro-for-arch-override.patch queue-4.19/x86-tsc-use-fallback-for-random_get_entropy-instead-of-zero.patch queue-4.19/random-add-grnd_insecure-to-return-best-effort-non-cryptographic-bytes.patch queue-4.19/crypto-drbg-move-dynamic-reseed_threshold-adjustments-to-__drbg_seed.patch queue-4.19/random-check-for-signals-after-page-of-pool-writes.patch queue-4.19/random-make-random_get_entropy-return-an-unsigned-long.patch queue-4.19/random-check-for-crng_init-0-in-add_device_randomness.patch queue-4.19/random-remove-unnecessary-unlikely.patch queue-4.19/random-defer-fast-pool-mixing-to-worker.patch queue-4.19/random-harmonize-crng-init-done-messages.patch queue-4.19/crypto-blake2s-include-linux-bug.h-instead-of-asm-bug.h.patch queue-4.19/random-use-static-branch-for-crng_ready.patch queue-4.19/random-rather-than-entropy_store-abstraction-use-global.patch queue-4.19/random-remove-extern-from-functions-in-header.patch queue-4.19/siphash-use-one-source-of-truth-for-siphash-permutations.patch queue-4.19/random-group-entropy-collection-functions.patch queue-4.19/random-de-duplicate-input_pool-constants.patch queue-4.19/random-mix-build-time-latent-entropy-into-pool-at-init.patch queue-4.19/random-remove-useless-header-comment.patch queue-4.19/linux-random.h-use-false-with-bool.patch queue-4.19/maintainers-co-maintain-random.c.patch queue-4.19/random-remove-outdated-int_max-6-check-in-urandom_read.patch queue-4.19/m68k-use-fallback-for-random_get_entropy-instead-of-zero.patch queue-4.19/alpha-define-get_cycles-macro-for-arch-override.patch queue-4.19/random-mix-bootloader-randomness-into-pool.patch queue-4.19/random-remove-some-dead-code-of-poolinfo.patch queue-4.19/random-do-not-use-batches-when-crng_ready.patch queue-4.19/crypto-drbg-always-seeded-with-sp800-90b-compliant-noise-source.patch queue-4.19/s390-define-get_cycles-macro-for-arch-override.patch queue-4.19/random-do-not-pretend-to-handle-premature-next-security-model.patch queue-4.19/random-avoid-arch_get_random_seed_long-when-collecting-irq-randomness.patch queue-4.19/random-use-is_enabled-config_numa-instead-of-ifdefs.patch queue-4.19/random-avoid-superfluous-call-to-rdrand-in-crng-extraction.patch queue-4.19/random-use-symbolic-constants-for-crng_init-states.patch queue-4.19/random-reseed-more-often-immediately-after-booting.patch queue-4.19/random-ensure-early-rdseed-goes-through-mixer-on-init.patch queue-4.19/random-deobfuscate-irq-u32-u64-contributions.patch queue-4.19/random-do-not-use-input-pool-from-hard-irqs.patch queue-4.19/random-help-compiler-out-with-fast_mix-by-using-simpler-arguments.patch queue-4.19/revert-random-use-static-branch-for-crng_ready.patch queue-4.19/random-fix-crash-on-multiple-early-calls-to-add_bootloader_randomness.patch queue-4.19/random-account-for-arch-randomness-in-bits.patch queue-4.19/crypto-blake2s-adjust-include-guard-naming.patch queue-4.19/random-do-not-allow-user-to-keep-crng-key-around-on-stack.patch queue-4.19/x86-remove-arch_has_random-arch_has_random_seed.patch queue-4.19/random-remove-ratelimiting-for-in-kernel-unseeded-randomness.patch queue-4.19/random-remove-unused-irq_flags-argument-from-add_interrupt_randomness.patch queue-4.19/random-prepend-remaining-pool-constants-with-pool_.patch queue-4.19/powerpc-define-get_cycles-macro-for-arch-override.patch queue-4.19/random-remove-unused-output_pool-constants.patch queue-4.19/mips-use-fallback-for-random_get_entropy-instead-of-just-c0-random.patch queue-4.19/random-use-hash-function-for-crng_slow_load.patch queue-4.19/random-fix-typo-in-comments.patch queue-4.19/random-use-proper-return-types-on-get_random_-int-long-_wait.patch