Merge 5.10.119 into android12-5.10-lts
Changes in 5.10.119 lockdown: also lock down previous kgdb use staging: rtl8723bs: prevent ->Ssid overflow in rtw_wx_set_scan() KVM: x86: Properly handle APF vs disabled LAPIC situation KVM: x86/mmu: fix NULL pointer dereference on guest INVPCID tcp: change source port randomizarion at connect() time secure_seq: use the 64 bits of the siphash for port offset calculation media: vim2m: Register video device after setting up internals media: vim2m: initialize the media device earlier ACPI: sysfs: Make sparse happy about address space in use ACPI: sysfs: Fix BERT error region memory mapping random: avoid arch_get_random_seed_long() when collecting IRQ randomness random: remove dead code left over from blocking pool MAINTAINERS: co-maintain random.c MAINTAINERS: add git tree for random.c crypto: lib/blake2s - Move selftest prototype into header file crypto: blake2s - define shash_alg structs using macros crypto: x86/blake2s - define shash_alg structs using macros crypto: blake2s - remove unneeded includes crypto: blake2s - move update and final logic to internal/blake2s.h crypto: blake2s - share the "shash" API boilerplate code crypto: blake2s - optimize blake2s initialization crypto: blake2s - add comment for blake2s_state fields crypto: blake2s - adjust include guard naming crypto: blake2s - include <linux/bug.h> instead of <asm/bug.h> lib/crypto: blake2s: include as built-in lib/crypto: blake2s: move hmac construction into wireguard lib/crypto: sha1: re-roll loops to reduce code size lib/crypto: blake2s: avoid indirect calls to compression function for Clang CFI random: document add_hwgenerator_randomness() with other input functions random: remove unused irq_flags argument from add_interrupt_randomness() random: use BLAKE2s instead of SHA1 in extraction random: do not sign extend bytes for rotation when mixing random: do not re-init if crng_reseed completes before primary init random: mix bootloader randomness into pool random: harmonize "crng init done" messages random: use IS_ENABLED(CONFIG_NUMA) instead of ifdefs random: early initialization of ChaCha constants random: avoid superfluous call to RDRAND in CRNG extraction random: don't reset crng_init_cnt on urandom_read() random: fix typo in comments random: cleanup poolinfo abstraction random: cleanup integer types random: remove incomplete last_data logic random: remove unused extract_entropy() reserved argument random: rather than entropy_store abstraction, use global random: remove unused OUTPUT_POOL constants random: de-duplicate INPUT_POOL constants random: prepend remaining pool constants with POOL_ random: cleanup fractional entropy shift constants random: access input_pool_data directly rather than through pointer random: selectively clang-format where it makes sense random: simplify arithmetic function flow in account() random: continually use hwgenerator randomness random: access primary_pool directly rather than through pointer random: only call crng_finalize_init() for primary_crng random: use computational hash for entropy extraction random: simplify entropy debiting random: use linear min-entropy accumulation crediting random: always wake up entropy writers after extraction random: make credit_entropy_bits() always safe random: remove use_input_pool parameter from crng_reseed() random: remove batched entropy locking random: fix locking in crng_fast_load() random: use RDSEED instead of RDRAND in entropy extraction random: get rid of secondary crngs random: inline leaves of rand_initialize() random: ensure early RDSEED goes through mixer on init random: do not xor RDRAND when writing into /dev/random random: absorb fast pool into input pool after fast load random: use simpler fast key erasure flow on per-cpu keys random: use hash function for crng_slow_load() random: make more consistent use of integer types random: remove outdated INT_MAX >> 6 check in urandom_read() random: zero buffer after reading entropy from userspace random: fix locking for crng_init in crng_reseed() random: tie batched entropy generation to base_crng generation random: remove ifdef'd out interrupt bench random: remove unused tracepoints random: add proper SPDX header random: deobfuscate irq u32/u64 contributions random: introduce drain_entropy() helper to declutter crng_reseed() random: remove useless header comment random: remove whitespace and reorder includes random: group initialization wait functions random: group crng functions random: group entropy extraction functions random: group entropy collection functions random: group userspace read/write functions random: group sysctl functions random: rewrite header introductory comment random: defer fast pool mixing to worker random: do not take pool spinlock at boot random: unify early init crng load accounting random: check for crng_init == 0 in add_device_randomness() random: pull add_hwgenerator_randomness() declaration into random.h random: clear fast pool, crng, and batches in cpuhp bring up random: round-robin registers as ulong, not u32 random: only wake up writers after zap if threshold was passed random: cleanup UUID handling random: unify cycles_t and jiffies usage and types random: do crng pre-init loading in worker rather than irq random: give sysctl_random_min_urandom_seed a more sensible value random: don't let 644 read-only sysctls be written to random: replace custom notifier chain with standard one random: use SipHash as interrupt entropy accumulator random: make consistent usage of crng_ready() random: reseed more often immediately after booting random: check for signal and try earlier when generating entropy random: skip fast_init if hwrng provides large chunk of entropy random: treat bootloader trust toggle the same way as cpu trust toggle random: re-add removed comment about get_random_{u32,u64} reseeding random: mix build-time latent entropy into pool at init random: do not split fast init input in add_hwgenerator_randomness() random: do not allow user to keep crng key around on stack random: check for signal_pending() outside of need_resched() check random: check for signals every PAGE_SIZE chunk of /dev/[u]random random: allow partial reads if later user copies fail random: make random_get_entropy() return an unsigned long random: document crng_fast_key_erasure() destination possibility random: fix sysctl documentation nits init: call time_init() before rand_initialize() ia64: define get_cycles macro for arch-override s390: define get_cycles macro for arch-override parisc: define get_cycles macro for arch-override alpha: define get_cycles macro for arch-override powerpc: define get_cycles macro for arch-override timekeeping: Add raw clock fallback for random_get_entropy() m68k: use fallback for random_get_entropy() instead of zero riscv: use fallback for random_get_entropy() instead of zero mips: use fallback for random_get_entropy() instead of just c0 random arm: use fallback for random_get_entropy() instead of zero nios2: use fallback for random_get_entropy() instead of zero x86/tsc: Use fallback for random_get_entropy() instead of zero um: use fallback for random_get_entropy() instead of zero sparc: use fallback for random_get_entropy() instead of zero xtensa: use fallback for random_get_entropy() instead of zero random: insist on random_get_entropy() existing in order to simplify random: do not use batches when !crng_ready() random: use first 128 bits of input as fast init random: do not pretend to handle premature next security model random: order timer entropy functions below interrupt functions random: do not use input pool from hard IRQs random: help compiler out with fast_mix() by using simpler arguments siphash: use one source of truth for siphash permutations random: use symbolic constants for crng_init states random: avoid initializing twice in credit race random: move initialization out of reseeding hot path random: remove ratelimiting for in-kernel unseeded randomness random: use proper jiffies comparison macro random: handle latent entropy and command line from random_init() random: credit architectural init the exact amount random: use static branch for crng_ready() random: remove extern from functions in header random: use proper return types on get_random_{int,long}_wait() random: make consistent use of buf and len random: move initialization functions out of hot pages random: move randomize_page() into mm where it belongs random: unify batched entropy implementations random: convert to using fops->read_iter() random: convert to using fops->write_iter() random: wire up fops->splice_{read,write}_iter() random: check for signals after page of pool writes ALSA: ctxfi: Add SB046x PCI ID Linux 5.10.119 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: I65f898474b7704881a3dd528012e7e91b09b3767
This commit is contained in:
@@ -4130,6 +4130,12 @@
|
|||||||
fully seed the kernel's CRNG. Default is controlled
|
fully seed the kernel's CRNG. Default is controlled
|
||||||
by CONFIG_RANDOM_TRUST_CPU.
|
by CONFIG_RANDOM_TRUST_CPU.
|
||||||
|
|
||||||
|
random.trust_bootloader={on,off}
|
||||||
|
[KNL] Enable or disable trusting the use of a
|
||||||
|
seed passed by the bootloader (if available) to
|
||||||
|
fully seed the kernel's CRNG. Default is controlled
|
||||||
|
by CONFIG_RANDOM_TRUST_BOOTLOADER.
|
||||||
|
|
||||||
ras=option[,option,...] [KNL] RAS-specific options
|
ras=option[,option,...] [KNL] RAS-specific options
|
||||||
|
|
||||||
cec_disable [X86]
|
cec_disable [X86]
|
||||||
|
@@ -1006,28 +1006,22 @@ This is a directory, with the following entries:
|
|||||||
* ``boot_id``: a UUID generated the first time this is retrieved, and
|
* ``boot_id``: a UUID generated the first time this is retrieved, and
|
||||||
unvarying after that;
|
unvarying after that;
|
||||||
|
|
||||||
|
* ``uuid``: a UUID generated every time this is retrieved (this can
|
||||||
|
thus be used to generate UUIDs at will);
|
||||||
|
|
||||||
* ``entropy_avail``: the pool's entropy count, in bits;
|
* ``entropy_avail``: the pool's entropy count, in bits;
|
||||||
|
|
||||||
* ``poolsize``: the entropy pool size, in bits;
|
* ``poolsize``: the entropy pool size, in bits;
|
||||||
|
|
||||||
* ``urandom_min_reseed_secs``: obsolete (used to determine the minimum
|
* ``urandom_min_reseed_secs``: obsolete (used to determine the minimum
|
||||||
number of seconds between urandom pool reseeding).
|
number of seconds between urandom pool reseeding). This file is
|
||||||
|
writable for compatibility purposes, but writing to it has no effect
|
||||||
* ``uuid``: a UUID generated every time this is retrieved (this can
|
on any RNG behavior;
|
||||||
thus be used to generate UUIDs at will);
|
|
||||||
|
|
||||||
* ``write_wakeup_threshold``: when the entropy count drops below this
|
* ``write_wakeup_threshold``: when the entropy count drops below this
|
||||||
(as a number of bits), processes waiting to write to ``/dev/random``
|
(as a number of bits), processes waiting to write to ``/dev/random``
|
||||||
are woken up.
|
are woken up. This file is writable for compatibility purposes, but
|
||||||
|
writing to it has no effect on any RNG behavior.
|
||||||
If ``drivers/char/random.c`` is built with ``ADD_INTERRUPT_BENCH``
|
|
||||||
defined, these additional entries are present:
|
|
||||||
|
|
||||||
* ``add_interrupt_avg_cycles``: the average number of cycles between
|
|
||||||
interrupts used to feed the pool;
|
|
||||||
|
|
||||||
* ``add_interrupt_avg_deviation``: the standard deviation seen on the
|
|
||||||
number of cycles between interrupts used to feed the pool.
|
|
||||||
|
|
||||||
|
|
||||||
randomize_va_space
|
randomize_va_space
|
||||||
|
@@ -14702,6 +14702,8 @@ F: arch/mips/generic/board-ranchu.c
|
|||||||
|
|
||||||
RANDOM NUMBER DRIVER
|
RANDOM NUMBER DRIVER
|
||||||
M: "Theodore Ts'o" <tytso@mit.edu>
|
M: "Theodore Ts'o" <tytso@mit.edu>
|
||||||
|
M: Jason A. Donenfeld <Jason@zx2c4.com>
|
||||||
|
T: git https://git.kernel.org/pub/scm/linux/kernel/git/crng/random.git
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/char/random.c
|
F: drivers/char/random.c
|
||||||
|
|
||||||
|
2
Makefile
2
Makefile
@@ -1,7 +1,7 @@
|
|||||||
# SPDX-License-Identifier: GPL-2.0
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
VERSION = 5
|
VERSION = 5
|
||||||
PATCHLEVEL = 10
|
PATCHLEVEL = 10
|
||||||
SUBLEVEL = 118
|
SUBLEVEL = 119
|
||||||
EXTRAVERSION =
|
EXTRAVERSION =
|
||||||
NAME = Dare mighty things
|
NAME = Dare mighty things
|
||||||
|
|
||||||
|
@@ -28,5 +28,6 @@ static inline cycles_t get_cycles (void)
|
|||||||
__asm__ __volatile__ ("rpcc %0" : "=r"(ret));
|
__asm__ __volatile__ ("rpcc %0" : "=r"(ret));
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
#define get_cycles get_cycles
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -10,6 +10,7 @@ obj-$(CONFIG_CRYPTO_SHA1_ARM_NEON) += sha1-arm-neon.o
|
|||||||
obj-$(CONFIG_CRYPTO_SHA256_ARM) += sha256-arm.o
|
obj-$(CONFIG_CRYPTO_SHA256_ARM) += sha256-arm.o
|
||||||
obj-$(CONFIG_CRYPTO_SHA512_ARM) += sha512-arm.o
|
obj-$(CONFIG_CRYPTO_SHA512_ARM) += sha512-arm.o
|
||||||
obj-$(CONFIG_CRYPTO_BLAKE2S_ARM) += blake2s-arm.o
|
obj-$(CONFIG_CRYPTO_BLAKE2S_ARM) += blake2s-arm.o
|
||||||
|
obj-$(if $(CONFIG_CRYPTO_BLAKE2S_ARM),y) += libblake2s-arm.o
|
||||||
obj-$(CONFIG_CRYPTO_BLAKE2B_NEON) += blake2b-neon.o
|
obj-$(CONFIG_CRYPTO_BLAKE2B_NEON) += blake2b-neon.o
|
||||||
obj-$(CONFIG_CRYPTO_CHACHA20_NEON) += chacha-neon.o
|
obj-$(CONFIG_CRYPTO_CHACHA20_NEON) += chacha-neon.o
|
||||||
obj-$(CONFIG_CRYPTO_POLY1305_ARM) += poly1305-arm.o
|
obj-$(CONFIG_CRYPTO_POLY1305_ARM) += poly1305-arm.o
|
||||||
@@ -31,7 +32,8 @@ sha256-arm-neon-$(CONFIG_KERNEL_MODE_NEON) := sha256_neon_glue.o
|
|||||||
sha256-arm-y := sha256-core.o sha256_glue.o $(sha256-arm-neon-y)
|
sha256-arm-y := sha256-core.o sha256_glue.o $(sha256-arm-neon-y)
|
||||||
sha512-arm-neon-$(CONFIG_KERNEL_MODE_NEON) := sha512-neon-glue.o
|
sha512-arm-neon-$(CONFIG_KERNEL_MODE_NEON) := sha512-neon-glue.o
|
||||||
sha512-arm-y := sha512-core.o sha512-glue.o $(sha512-arm-neon-y)
|
sha512-arm-y := sha512-core.o sha512-glue.o $(sha512-arm-neon-y)
|
||||||
blake2s-arm-y := blake2s-core.o blake2s-glue.o
|
blake2s-arm-y := blake2s-shash.o
|
||||||
|
libblake2s-arm-y:= blake2s-core.o blake2s-glue.o
|
||||||
blake2b-neon-y := blake2b-neon-core.o blake2b-neon-glue.o
|
blake2b-neon-y := blake2b-neon-core.o blake2b-neon-glue.o
|
||||||
sha1-arm-ce-y := sha1-ce-core.o sha1-ce-glue.o
|
sha1-arm-ce-y := sha1-ce-core.o sha1-ce-glue.o
|
||||||
sha2-arm-ce-y := sha2-ce-core.o sha2-ce-glue.o
|
sha2-arm-ce-y := sha2-ce-core.o sha2-ce-glue.o
|
||||||
|
@@ -167,8 +167,8 @@
|
|||||||
.endm
|
.endm
|
||||||
|
|
||||||
//
|
//
|
||||||
// void blake2s_compress_arch(struct blake2s_state *state,
|
// void blake2s_compress(struct blake2s_state *state,
|
||||||
// const u8 *block, size_t nblocks, u32 inc);
|
// const u8 *block, size_t nblocks, u32 inc);
|
||||||
//
|
//
|
||||||
// Only the first three fields of struct blake2s_state are used:
|
// Only the first three fields of struct blake2s_state are used:
|
||||||
// u32 h[8]; (inout)
|
// u32 h[8]; (inout)
|
||||||
@@ -176,7 +176,7 @@
|
|||||||
// u32 f[2]; (in)
|
// u32 f[2]; (in)
|
||||||
//
|
//
|
||||||
.align 5
|
.align 5
|
||||||
ENTRY(blake2s_compress_arch)
|
ENTRY(blake2s_compress)
|
||||||
push {r0-r2,r4-r11,lr} // keep this an even number
|
push {r0-r2,r4-r11,lr} // keep this an even number
|
||||||
|
|
||||||
.Lnext_block:
|
.Lnext_block:
|
||||||
@@ -303,4 +303,4 @@ ENTRY(blake2s_compress_arch)
|
|||||||
str r3, [r12], #4
|
str r3, [r12], #4
|
||||||
bne 1b
|
bne 1b
|
||||||
b .Lcopy_block_done
|
b .Lcopy_block_done
|
||||||
ENDPROC(blake2s_compress_arch)
|
ENDPROC(blake2s_compress)
|
||||||
|
@@ -1,78 +1,7 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
/*
|
|
||||||
* BLAKE2s digest algorithm, ARM scalar implementation
|
|
||||||
*
|
|
||||||
* Copyright 2020 Google LLC
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <crypto/internal/blake2s.h>
|
#include <crypto/internal/blake2s.h>
|
||||||
#include <crypto/internal/hash.h>
|
|
||||||
|
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
|
|
||||||
/* defined in blake2s-core.S */
|
/* defined in blake2s-core.S */
|
||||||
EXPORT_SYMBOL(blake2s_compress_arch);
|
EXPORT_SYMBOL(blake2s_compress);
|
||||||
|
|
||||||
static int crypto_blake2s_update_arm(struct shash_desc *desc,
|
|
||||||
const u8 *in, unsigned int inlen)
|
|
||||||
{
|
|
||||||
return crypto_blake2s_update(desc, in, inlen, blake2s_compress_arch);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int crypto_blake2s_final_arm(struct shash_desc *desc, u8 *out)
|
|
||||||
{
|
|
||||||
return crypto_blake2s_final(desc, out, blake2s_compress_arch);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define BLAKE2S_ALG(name, driver_name, digest_size) \
|
|
||||||
{ \
|
|
||||||
.base.cra_name = name, \
|
|
||||||
.base.cra_driver_name = driver_name, \
|
|
||||||
.base.cra_priority = 200, \
|
|
||||||
.base.cra_flags = CRYPTO_ALG_OPTIONAL_KEY, \
|
|
||||||
.base.cra_blocksize = BLAKE2S_BLOCK_SIZE, \
|
|
||||||
.base.cra_ctxsize = sizeof(struct blake2s_tfm_ctx), \
|
|
||||||
.base.cra_module = THIS_MODULE, \
|
|
||||||
.digestsize = digest_size, \
|
|
||||||
.setkey = crypto_blake2s_setkey, \
|
|
||||||
.init = crypto_blake2s_init, \
|
|
||||||
.update = crypto_blake2s_update_arm, \
|
|
||||||
.final = crypto_blake2s_final_arm, \
|
|
||||||
.descsize = sizeof(struct blake2s_state), \
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct shash_alg blake2s_arm_algs[] = {
|
|
||||||
BLAKE2S_ALG("blake2s-128", "blake2s-128-arm", BLAKE2S_128_HASH_SIZE),
|
|
||||||
BLAKE2S_ALG("blake2s-160", "blake2s-160-arm", BLAKE2S_160_HASH_SIZE),
|
|
||||||
BLAKE2S_ALG("blake2s-224", "blake2s-224-arm", BLAKE2S_224_HASH_SIZE),
|
|
||||||
BLAKE2S_ALG("blake2s-256", "blake2s-256-arm", BLAKE2S_256_HASH_SIZE),
|
|
||||||
};
|
|
||||||
|
|
||||||
static int __init blake2s_arm_mod_init(void)
|
|
||||||
{
|
|
||||||
return IS_REACHABLE(CONFIG_CRYPTO_HASH) ?
|
|
||||||
crypto_register_shashes(blake2s_arm_algs,
|
|
||||||
ARRAY_SIZE(blake2s_arm_algs)) : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void __exit blake2s_arm_mod_exit(void)
|
|
||||||
{
|
|
||||||
if (IS_REACHABLE(CONFIG_CRYPTO_HASH))
|
|
||||||
crypto_unregister_shashes(blake2s_arm_algs,
|
|
||||||
ARRAY_SIZE(blake2s_arm_algs));
|
|
||||||
}
|
|
||||||
|
|
||||||
module_init(blake2s_arm_mod_init);
|
|
||||||
module_exit(blake2s_arm_mod_exit);
|
|
||||||
|
|
||||||
MODULE_DESCRIPTION("BLAKE2s digest algorithm, ARM scalar implementation");
|
|
||||||
MODULE_LICENSE("GPL");
|
|
||||||
MODULE_AUTHOR("Eric Biggers <ebiggers@google.com>");
|
|
||||||
MODULE_ALIAS_CRYPTO("blake2s-128");
|
|
||||||
MODULE_ALIAS_CRYPTO("blake2s-128-arm");
|
|
||||||
MODULE_ALIAS_CRYPTO("blake2s-160");
|
|
||||||
MODULE_ALIAS_CRYPTO("blake2s-160-arm");
|
|
||||||
MODULE_ALIAS_CRYPTO("blake2s-224");
|
|
||||||
MODULE_ALIAS_CRYPTO("blake2s-224-arm");
|
|
||||||
MODULE_ALIAS_CRYPTO("blake2s-256");
|
|
||||||
MODULE_ALIAS_CRYPTO("blake2s-256-arm");
|
|
||||||
|
75
arch/arm/crypto/blake2s-shash.c
Normal file
75
arch/arm/crypto/blake2s-shash.c
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
/*
|
||||||
|
* BLAKE2s digest algorithm, ARM scalar implementation
|
||||||
|
*
|
||||||
|
* Copyright 2020 Google LLC
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <crypto/internal/blake2s.h>
|
||||||
|
#include <crypto/internal/hash.h>
|
||||||
|
|
||||||
|
#include <linux/module.h>
|
||||||
|
|
||||||
|
static int crypto_blake2s_update_arm(struct shash_desc *desc,
|
||||||
|
const u8 *in, unsigned int inlen)
|
||||||
|
{
|
||||||
|
return crypto_blake2s_update(desc, in, inlen, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int crypto_blake2s_final_arm(struct shash_desc *desc, u8 *out)
|
||||||
|
{
|
||||||
|
return crypto_blake2s_final(desc, out, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define BLAKE2S_ALG(name, driver_name, digest_size) \
|
||||||
|
{ \
|
||||||
|
.base.cra_name = name, \
|
||||||
|
.base.cra_driver_name = driver_name, \
|
||||||
|
.base.cra_priority = 200, \
|
||||||
|
.base.cra_flags = CRYPTO_ALG_OPTIONAL_KEY, \
|
||||||
|
.base.cra_blocksize = BLAKE2S_BLOCK_SIZE, \
|
||||||
|
.base.cra_ctxsize = sizeof(struct blake2s_tfm_ctx), \
|
||||||
|
.base.cra_module = THIS_MODULE, \
|
||||||
|
.digestsize = digest_size, \
|
||||||
|
.setkey = crypto_blake2s_setkey, \
|
||||||
|
.init = crypto_blake2s_init, \
|
||||||
|
.update = crypto_blake2s_update_arm, \
|
||||||
|
.final = crypto_blake2s_final_arm, \
|
||||||
|
.descsize = sizeof(struct blake2s_state), \
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct shash_alg blake2s_arm_algs[] = {
|
||||||
|
BLAKE2S_ALG("blake2s-128", "blake2s-128-arm", BLAKE2S_128_HASH_SIZE),
|
||||||
|
BLAKE2S_ALG("blake2s-160", "blake2s-160-arm", BLAKE2S_160_HASH_SIZE),
|
||||||
|
BLAKE2S_ALG("blake2s-224", "blake2s-224-arm", BLAKE2S_224_HASH_SIZE),
|
||||||
|
BLAKE2S_ALG("blake2s-256", "blake2s-256-arm", BLAKE2S_256_HASH_SIZE),
|
||||||
|
};
|
||||||
|
|
||||||
|
static int __init blake2s_arm_mod_init(void)
|
||||||
|
{
|
||||||
|
return IS_REACHABLE(CONFIG_CRYPTO_HASH) ?
|
||||||
|
crypto_register_shashes(blake2s_arm_algs,
|
||||||
|
ARRAY_SIZE(blake2s_arm_algs)) : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __exit blake2s_arm_mod_exit(void)
|
||||||
|
{
|
||||||
|
if (IS_REACHABLE(CONFIG_CRYPTO_HASH))
|
||||||
|
crypto_unregister_shashes(blake2s_arm_algs,
|
||||||
|
ARRAY_SIZE(blake2s_arm_algs));
|
||||||
|
}
|
||||||
|
|
||||||
|
module_init(blake2s_arm_mod_init);
|
||||||
|
module_exit(blake2s_arm_mod_exit);
|
||||||
|
|
||||||
|
MODULE_DESCRIPTION("BLAKE2s digest algorithm, ARM scalar implementation");
|
||||||
|
MODULE_LICENSE("GPL");
|
||||||
|
MODULE_AUTHOR("Eric Biggers <ebiggers@google.com>");
|
||||||
|
MODULE_ALIAS_CRYPTO("blake2s-128");
|
||||||
|
MODULE_ALIAS_CRYPTO("blake2s-128-arm");
|
||||||
|
MODULE_ALIAS_CRYPTO("blake2s-160");
|
||||||
|
MODULE_ALIAS_CRYPTO("blake2s-160-arm");
|
||||||
|
MODULE_ALIAS_CRYPTO("blake2s-224");
|
||||||
|
MODULE_ALIAS_CRYPTO("blake2s-224-arm");
|
||||||
|
MODULE_ALIAS_CRYPTO("blake2s-256");
|
||||||
|
MODULE_ALIAS_CRYPTO("blake2s-256-arm");
|
@@ -11,5 +11,6 @@
|
|||||||
|
|
||||||
typedef unsigned long cycles_t;
|
typedef unsigned long cycles_t;
|
||||||
#define get_cycles() ({ cycles_t c; read_current_timer(&c) ? 0 : c; })
|
#define get_cycles() ({ cycles_t c; read_current_timer(&c) ? 0 : c; })
|
||||||
|
#define random_get_entropy() (((unsigned long)get_cycles()) ?: random_get_entropy_fallback())
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -39,6 +39,7 @@ get_cycles (void)
|
|||||||
ret = ia64_getreg(_IA64_REG_AR_ITC);
|
ret = ia64_getreg(_IA64_REG_AR_ITC);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
#define get_cycles get_cycles
|
||||||
|
|
||||||
extern void ia64_cpu_local_tick (void);
|
extern void ia64_cpu_local_tick (void);
|
||||||
extern unsigned long long ia64_native_sched_clock (void);
|
extern unsigned long long ia64_native_sched_clock (void);
|
||||||
|
@@ -35,7 +35,7 @@ static inline unsigned long random_get_entropy(void)
|
|||||||
{
|
{
|
||||||
if (mach_random_get_entropy)
|
if (mach_random_get_entropy)
|
||||||
return mach_random_get_entropy();
|
return mach_random_get_entropy();
|
||||||
return 0;
|
return random_get_entropy_fallback();
|
||||||
}
|
}
|
||||||
#define random_get_entropy random_get_entropy
|
#define random_get_entropy random_get_entropy
|
||||||
|
|
||||||
|
@@ -76,25 +76,24 @@ static inline cycles_t get_cycles(void)
|
|||||||
else
|
else
|
||||||
return 0; /* no usable counter */
|
return 0; /* no usable counter */
|
||||||
}
|
}
|
||||||
|
#define get_cycles get_cycles
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Like get_cycles - but where c0_count is not available we desperately
|
* Like get_cycles - but where c0_count is not available we desperately
|
||||||
* use c0_random in an attempt to get at least a little bit of entropy.
|
* use c0_random in an attempt to get at least a little bit of entropy.
|
||||||
*
|
|
||||||
* R6000 and R6000A neither have a count register nor a random register.
|
|
||||||
* That leaves no entropy source in the CPU itself.
|
|
||||||
*/
|
*/
|
||||||
static inline unsigned long random_get_entropy(void)
|
static inline unsigned long random_get_entropy(void)
|
||||||
{
|
{
|
||||||
unsigned int prid = read_c0_prid();
|
unsigned int c0_random;
|
||||||
unsigned int imp = prid & PRID_IMP_MASK;
|
|
||||||
|
|
||||||
if (can_use_mips_counter(prid))
|
if (can_use_mips_counter(read_c0_prid()))
|
||||||
return read_c0_count();
|
return read_c0_count();
|
||||||
else if (likely(imp != PRID_IMP_R6000 && imp != PRID_IMP_R6000A))
|
|
||||||
return read_c0_random();
|
if (cpu_has_3kex)
|
||||||
|
c0_random = (read_c0_random() >> 8) & 0x3f;
|
||||||
else
|
else
|
||||||
return 0; /* no usable register */
|
c0_random = read_c0_random() & 0x3f;
|
||||||
|
return (random_get_entropy_fallback() << 6) | (0x3f - c0_random);
|
||||||
}
|
}
|
||||||
#define random_get_entropy random_get_entropy
|
#define random_get_entropy random_get_entropy
|
||||||
|
|
||||||
|
@@ -8,5 +8,8 @@
|
|||||||
typedef unsigned long cycles_t;
|
typedef unsigned long cycles_t;
|
||||||
|
|
||||||
extern cycles_t get_cycles(void);
|
extern cycles_t get_cycles(void);
|
||||||
|
#define get_cycles get_cycles
|
||||||
|
|
||||||
|
#define random_get_entropy() (((unsigned long)get_cycles()) ?: random_get_entropy_fallback())
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -13,9 +13,10 @@
|
|||||||
|
|
||||||
typedef unsigned long cycles_t;
|
typedef unsigned long cycles_t;
|
||||||
|
|
||||||
static inline cycles_t get_cycles (void)
|
static inline cycles_t get_cycles(void)
|
||||||
{
|
{
|
||||||
return mfctl(16);
|
return mfctl(16);
|
||||||
}
|
}
|
||||||
|
#define get_cycles get_cycles
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -19,6 +19,7 @@ static inline cycles_t get_cycles(void)
|
|||||||
{
|
{
|
||||||
return mftb();
|
return mftb();
|
||||||
}
|
}
|
||||||
|
#define get_cycles get_cycles
|
||||||
|
|
||||||
#endif /* __KERNEL__ */
|
#endif /* __KERNEL__ */
|
||||||
#endif /* _ASM_POWERPC_TIMEX_H */
|
#endif /* _ASM_POWERPC_TIMEX_H */
|
||||||
|
@@ -41,7 +41,7 @@ static inline u32 get_cycles_hi(void)
|
|||||||
static inline unsigned long random_get_entropy(void)
|
static inline unsigned long random_get_entropy(void)
|
||||||
{
|
{
|
||||||
if (unlikely(clint_time_val == NULL))
|
if (unlikely(clint_time_val == NULL))
|
||||||
return 0;
|
return random_get_entropy_fallback();
|
||||||
return get_cycles();
|
return get_cycles();
|
||||||
}
|
}
|
||||||
#define random_get_entropy() random_get_entropy()
|
#define random_get_entropy() random_get_entropy()
|
||||||
|
@@ -172,6 +172,7 @@ static inline cycles_t get_cycles(void)
|
|||||||
{
|
{
|
||||||
return (cycles_t) get_tod_clock() >> 2;
|
return (cycles_t) get_tod_clock() >> 2;
|
||||||
}
|
}
|
||||||
|
#define get_cycles get_cycles
|
||||||
|
|
||||||
int get_phys_clock(unsigned long *clock);
|
int get_phys_clock(unsigned long *clock);
|
||||||
void init_cpu_timer(void);
|
void init_cpu_timer(void);
|
||||||
|
@@ -9,8 +9,6 @@
|
|||||||
|
|
||||||
#define CLOCK_TICK_RATE 1193180 /* Underlying HZ */
|
#define CLOCK_TICK_RATE 1193180 /* Underlying HZ */
|
||||||
|
|
||||||
/* XXX Maybe do something better at some point... -DaveM */
|
#include <asm-generic/timex.h>
|
||||||
typedef unsigned long cycles_t;
|
|
||||||
#define get_cycles() (0)
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -2,13 +2,8 @@
|
|||||||
#ifndef __UM_TIMEX_H
|
#ifndef __UM_TIMEX_H
|
||||||
#define __UM_TIMEX_H
|
#define __UM_TIMEX_H
|
||||||
|
|
||||||
typedef unsigned long cycles_t;
|
|
||||||
|
|
||||||
static inline cycles_t get_cycles (void)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define CLOCK_TICK_RATE (HZ)
|
#define CLOCK_TICK_RATE (HZ)
|
||||||
|
|
||||||
|
#include <asm-generic/timex.h>
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -66,7 +66,9 @@ obj-$(CONFIG_CRYPTO_SHA512_SSSE3) += sha512-ssse3.o
|
|||||||
sha512-ssse3-y := sha512-ssse3-asm.o sha512-avx-asm.o sha512-avx2-asm.o sha512_ssse3_glue.o
|
sha512-ssse3-y := sha512-ssse3-asm.o sha512-avx-asm.o sha512-avx2-asm.o sha512_ssse3_glue.o
|
||||||
|
|
||||||
obj-$(CONFIG_CRYPTO_BLAKE2S_X86) += blake2s-x86_64.o
|
obj-$(CONFIG_CRYPTO_BLAKE2S_X86) += blake2s-x86_64.o
|
||||||
blake2s-x86_64-y := blake2s-core.o blake2s-glue.o
|
blake2s-x86_64-y := blake2s-shash.o
|
||||||
|
obj-$(if $(CONFIG_CRYPTO_BLAKE2S_X86),y) += libblake2s-x86_64.o
|
||||||
|
libblake2s-x86_64-y := blake2s-core.o blake2s-glue.o
|
||||||
|
|
||||||
obj-$(CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL) += ghash-clmulni-intel.o
|
obj-$(CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL) += ghash-clmulni-intel.o
|
||||||
ghash-clmulni-intel-y := ghash-clmulni-intel_asm.o ghash-clmulni-intel_glue.o
|
ghash-clmulni-intel-y := ghash-clmulni-intel_asm.o ghash-clmulni-intel_glue.o
|
||||||
|
@@ -5,7 +5,6 @@
|
|||||||
|
|
||||||
#include <crypto/internal/blake2s.h>
|
#include <crypto/internal/blake2s.h>
|
||||||
#include <crypto/internal/simd.h>
|
#include <crypto/internal/simd.h>
|
||||||
#include <crypto/internal/hash.h>
|
|
||||||
|
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/jump_label.h>
|
#include <linux/jump_label.h>
|
||||||
@@ -28,9 +27,8 @@ asmlinkage void blake2s_compress_avx512(struct blake2s_state *state,
|
|||||||
static __ro_after_init DEFINE_STATIC_KEY_FALSE(blake2s_use_ssse3);
|
static __ro_after_init DEFINE_STATIC_KEY_FALSE(blake2s_use_ssse3);
|
||||||
static __ro_after_init DEFINE_STATIC_KEY_FALSE(blake2s_use_avx512);
|
static __ro_after_init DEFINE_STATIC_KEY_FALSE(blake2s_use_avx512);
|
||||||
|
|
||||||
void blake2s_compress_arch(struct blake2s_state *state,
|
void blake2s_compress(struct blake2s_state *state, const u8 *block,
|
||||||
const u8 *block, size_t nblocks,
|
size_t nblocks, const u32 inc)
|
||||||
const u32 inc)
|
|
||||||
{
|
{
|
||||||
/* SIMD disables preemption, so relax after processing each page. */
|
/* SIMD disables preemption, so relax after processing each page. */
|
||||||
BUILD_BUG_ON(SZ_4K / BLAKE2S_BLOCK_SIZE < 8);
|
BUILD_BUG_ON(SZ_4K / BLAKE2S_BLOCK_SIZE < 8);
|
||||||
@@ -56,49 +54,12 @@ void blake2s_compress_arch(struct blake2s_state *state,
|
|||||||
block += blocks * BLAKE2S_BLOCK_SIZE;
|
block += blocks * BLAKE2S_BLOCK_SIZE;
|
||||||
} while (nblocks);
|
} while (nblocks);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(blake2s_compress_arch);
|
EXPORT_SYMBOL(blake2s_compress);
|
||||||
|
|
||||||
static int crypto_blake2s_update_x86(struct shash_desc *desc,
|
|
||||||
const u8 *in, unsigned int inlen)
|
|
||||||
{
|
|
||||||
return crypto_blake2s_update(desc, in, inlen, blake2s_compress_arch);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int crypto_blake2s_final_x86(struct shash_desc *desc, u8 *out)
|
|
||||||
{
|
|
||||||
return crypto_blake2s_final(desc, out, blake2s_compress_arch);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define BLAKE2S_ALG(name, driver_name, digest_size) \
|
|
||||||
{ \
|
|
||||||
.base.cra_name = name, \
|
|
||||||
.base.cra_driver_name = driver_name, \
|
|
||||||
.base.cra_priority = 200, \
|
|
||||||
.base.cra_flags = CRYPTO_ALG_OPTIONAL_KEY, \
|
|
||||||
.base.cra_blocksize = BLAKE2S_BLOCK_SIZE, \
|
|
||||||
.base.cra_ctxsize = sizeof(struct blake2s_tfm_ctx), \
|
|
||||||
.base.cra_module = THIS_MODULE, \
|
|
||||||
.digestsize = digest_size, \
|
|
||||||
.setkey = crypto_blake2s_setkey, \
|
|
||||||
.init = crypto_blake2s_init, \
|
|
||||||
.update = crypto_blake2s_update_x86, \
|
|
||||||
.final = crypto_blake2s_final_x86, \
|
|
||||||
.descsize = sizeof(struct blake2s_state), \
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct shash_alg blake2s_algs[] = {
|
|
||||||
BLAKE2S_ALG("blake2s-128", "blake2s-128-x86", BLAKE2S_128_HASH_SIZE),
|
|
||||||
BLAKE2S_ALG("blake2s-160", "blake2s-160-x86", BLAKE2S_160_HASH_SIZE),
|
|
||||||
BLAKE2S_ALG("blake2s-224", "blake2s-224-x86", BLAKE2S_224_HASH_SIZE),
|
|
||||||
BLAKE2S_ALG("blake2s-256", "blake2s-256-x86", BLAKE2S_256_HASH_SIZE),
|
|
||||||
};
|
|
||||||
|
|
||||||
static int __init blake2s_mod_init(void)
|
static int __init blake2s_mod_init(void)
|
||||||
{
|
{
|
||||||
if (!boot_cpu_has(X86_FEATURE_SSSE3))
|
if (boot_cpu_has(X86_FEATURE_SSSE3))
|
||||||
return 0;
|
static_branch_enable(&blake2s_use_ssse3);
|
||||||
|
|
||||||
static_branch_enable(&blake2s_use_ssse3);
|
|
||||||
|
|
||||||
if (IS_ENABLED(CONFIG_AS_AVX512) &&
|
if (IS_ENABLED(CONFIG_AS_AVX512) &&
|
||||||
boot_cpu_has(X86_FEATURE_AVX) &&
|
boot_cpu_has(X86_FEATURE_AVX) &&
|
||||||
@@ -109,26 +70,9 @@ static int __init blake2s_mod_init(void)
|
|||||||
XFEATURE_MASK_AVX512, NULL))
|
XFEATURE_MASK_AVX512, NULL))
|
||||||
static_branch_enable(&blake2s_use_avx512);
|
static_branch_enable(&blake2s_use_avx512);
|
||||||
|
|
||||||
return IS_REACHABLE(CONFIG_CRYPTO_HASH) ?
|
return 0;
|
||||||
crypto_register_shashes(blake2s_algs,
|
|
||||||
ARRAY_SIZE(blake2s_algs)) : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void __exit blake2s_mod_exit(void)
|
|
||||||
{
|
|
||||||
if (IS_REACHABLE(CONFIG_CRYPTO_HASH) && boot_cpu_has(X86_FEATURE_SSSE3))
|
|
||||||
crypto_unregister_shashes(blake2s_algs, ARRAY_SIZE(blake2s_algs));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
module_init(blake2s_mod_init);
|
module_init(blake2s_mod_init);
|
||||||
module_exit(blake2s_mod_exit);
|
|
||||||
|
|
||||||
MODULE_ALIAS_CRYPTO("blake2s-128");
|
|
||||||
MODULE_ALIAS_CRYPTO("blake2s-128-x86");
|
|
||||||
MODULE_ALIAS_CRYPTO("blake2s-160");
|
|
||||||
MODULE_ALIAS_CRYPTO("blake2s-160-x86");
|
|
||||||
MODULE_ALIAS_CRYPTO("blake2s-224");
|
|
||||||
MODULE_ALIAS_CRYPTO("blake2s-224-x86");
|
|
||||||
MODULE_ALIAS_CRYPTO("blake2s-256");
|
|
||||||
MODULE_ALIAS_CRYPTO("blake2s-256-x86");
|
|
||||||
MODULE_LICENSE("GPL v2");
|
MODULE_LICENSE("GPL v2");
|
||||||
|
77
arch/x86/crypto/blake2s-shash.c
Normal file
77
arch/x86/crypto/blake2s-shash.c
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0 OR MIT
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <crypto/internal/blake2s.h>
|
||||||
|
#include <crypto/internal/simd.h>
|
||||||
|
#include <crypto/internal/hash.h>
|
||||||
|
|
||||||
|
#include <linux/types.h>
|
||||||
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/module.h>
|
||||||
|
#include <linux/sizes.h>
|
||||||
|
|
||||||
|
#include <asm/cpufeature.h>
|
||||||
|
#include <asm/processor.h>
|
||||||
|
|
||||||
|
static int crypto_blake2s_update_x86(struct shash_desc *desc,
|
||||||
|
const u8 *in, unsigned int inlen)
|
||||||
|
{
|
||||||
|
return crypto_blake2s_update(desc, in, inlen, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int crypto_blake2s_final_x86(struct shash_desc *desc, u8 *out)
|
||||||
|
{
|
||||||
|
return crypto_blake2s_final(desc, out, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define BLAKE2S_ALG(name, driver_name, digest_size) \
|
||||||
|
{ \
|
||||||
|
.base.cra_name = name, \
|
||||||
|
.base.cra_driver_name = driver_name, \
|
||||||
|
.base.cra_priority = 200, \
|
||||||
|
.base.cra_flags = CRYPTO_ALG_OPTIONAL_KEY, \
|
||||||
|
.base.cra_blocksize = BLAKE2S_BLOCK_SIZE, \
|
||||||
|
.base.cra_ctxsize = sizeof(struct blake2s_tfm_ctx), \
|
||||||
|
.base.cra_module = THIS_MODULE, \
|
||||||
|
.digestsize = digest_size, \
|
||||||
|
.setkey = crypto_blake2s_setkey, \
|
||||||
|
.init = crypto_blake2s_init, \
|
||||||
|
.update = crypto_blake2s_update_x86, \
|
||||||
|
.final = crypto_blake2s_final_x86, \
|
||||||
|
.descsize = sizeof(struct blake2s_state), \
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct shash_alg blake2s_algs[] = {
|
||||||
|
BLAKE2S_ALG("blake2s-128", "blake2s-128-x86", BLAKE2S_128_HASH_SIZE),
|
||||||
|
BLAKE2S_ALG("blake2s-160", "blake2s-160-x86", BLAKE2S_160_HASH_SIZE),
|
||||||
|
BLAKE2S_ALG("blake2s-224", "blake2s-224-x86", BLAKE2S_224_HASH_SIZE),
|
||||||
|
BLAKE2S_ALG("blake2s-256", "blake2s-256-x86", BLAKE2S_256_HASH_SIZE),
|
||||||
|
};
|
||||||
|
|
||||||
|
static int __init blake2s_mod_init(void)
|
||||||
|
{
|
||||||
|
if (IS_REACHABLE(CONFIG_CRYPTO_HASH) && boot_cpu_has(X86_FEATURE_SSSE3))
|
||||||
|
return crypto_register_shashes(blake2s_algs, ARRAY_SIZE(blake2s_algs));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void __exit blake2s_mod_exit(void)
|
||||||
|
{
|
||||||
|
if (IS_REACHABLE(CONFIG_CRYPTO_HASH) && boot_cpu_has(X86_FEATURE_SSSE3))
|
||||||
|
crypto_unregister_shashes(blake2s_algs, ARRAY_SIZE(blake2s_algs));
|
||||||
|
}
|
||||||
|
|
||||||
|
module_init(blake2s_mod_init);
|
||||||
|
module_exit(blake2s_mod_exit);
|
||||||
|
|
||||||
|
MODULE_ALIAS_CRYPTO("blake2s-128");
|
||||||
|
MODULE_ALIAS_CRYPTO("blake2s-128-x86");
|
||||||
|
MODULE_ALIAS_CRYPTO("blake2s-160");
|
||||||
|
MODULE_ALIAS_CRYPTO("blake2s-160-x86");
|
||||||
|
MODULE_ALIAS_CRYPTO("blake2s-224");
|
||||||
|
MODULE_ALIAS_CRYPTO("blake2s-224-x86");
|
||||||
|
MODULE_ALIAS_CRYPTO("blake2s-256");
|
||||||
|
MODULE_ALIAS_CRYPTO("blake2s-256-x86");
|
||||||
|
MODULE_LICENSE("GPL v2");
|
@@ -5,6 +5,15 @@
|
|||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
#include <asm/tsc.h>
|
#include <asm/tsc.h>
|
||||||
|
|
||||||
|
static inline unsigned long random_get_entropy(void)
|
||||||
|
{
|
||||||
|
if (!IS_ENABLED(CONFIG_X86_TSC) &&
|
||||||
|
!cpu_feature_enabled(X86_FEATURE_TSC))
|
||||||
|
return random_get_entropy_fallback();
|
||||||
|
return rdtsc();
|
||||||
|
}
|
||||||
|
#define random_get_entropy random_get_entropy
|
||||||
|
|
||||||
/* Assume we use the PIT time source for the clock tick */
|
/* Assume we use the PIT time source for the clock tick */
|
||||||
#define CLOCK_TICK_RATE PIT_TICK_RATE
|
#define CLOCK_TICK_RATE PIT_TICK_RATE
|
||||||
|
|
||||||
|
@@ -20,13 +20,12 @@ extern void disable_TSC(void);
|
|||||||
|
|
||||||
static inline cycles_t get_cycles(void)
|
static inline cycles_t get_cycles(void)
|
||||||
{
|
{
|
||||||
#ifndef CONFIG_X86_TSC
|
if (!IS_ENABLED(CONFIG_X86_TSC) &&
|
||||||
if (!boot_cpu_has(X86_FEATURE_TSC))
|
!cpu_feature_enabled(X86_FEATURE_TSC))
|
||||||
return 0;
|
return 0;
|
||||||
#endif
|
|
||||||
|
|
||||||
return rdtsc();
|
return rdtsc();
|
||||||
}
|
}
|
||||||
|
#define get_cycles get_cycles
|
||||||
|
|
||||||
extern struct system_counterval_t convert_art_to_tsc(u64 art);
|
extern struct system_counterval_t convert_art_to_tsc(u64 art);
|
||||||
extern struct system_counterval_t convert_art_ns_to_tsc(u64 art_ns);
|
extern struct system_counterval_t convert_art_ns_to_tsc(u64 art_ns);
|
||||||
|
@@ -84,7 +84,7 @@ DEFINE_IDTENTRY_SYSVEC(sysvec_hyperv_stimer0)
|
|||||||
inc_irq_stat(hyperv_stimer0_count);
|
inc_irq_stat(hyperv_stimer0_count);
|
||||||
if (hv_stimer0_handler)
|
if (hv_stimer0_handler)
|
||||||
hv_stimer0_handler();
|
hv_stimer0_handler();
|
||||||
add_interrupt_randomness(HYPERV_STIMER0_VECTOR, 0);
|
add_interrupt_randomness(HYPERV_STIMER0_VECTOR);
|
||||||
ack_APIC_irq();
|
ack_APIC_irq();
|
||||||
|
|
||||||
set_irq_regs(old_regs);
|
set_irq_regs(old_regs);
|
||||||
|
@@ -297,6 +297,10 @@ static inline void apic_set_spiv(struct kvm_lapic *apic, u32 val)
|
|||||||
|
|
||||||
atomic_set_release(&apic->vcpu->kvm->arch.apic_map_dirty, DIRTY);
|
atomic_set_release(&apic->vcpu->kvm->arch.apic_map_dirty, DIRTY);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Check if there are APF page ready requests pending */
|
||||||
|
if (enabled)
|
||||||
|
kvm_make_request(KVM_REQ_APF_READY, apic->vcpu);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void kvm_apic_set_xapic_id(struct kvm_lapic *apic, u8 id)
|
static inline void kvm_apic_set_xapic_id(struct kvm_lapic *apic, u8 id)
|
||||||
@@ -2260,6 +2264,8 @@ void kvm_lapic_set_base(struct kvm_vcpu *vcpu, u64 value)
|
|||||||
if (value & MSR_IA32_APICBASE_ENABLE) {
|
if (value & MSR_IA32_APICBASE_ENABLE) {
|
||||||
kvm_apic_set_xapic_id(apic, vcpu->vcpu_id);
|
kvm_apic_set_xapic_id(apic, vcpu->vcpu_id);
|
||||||
static_key_slow_dec_deferred(&apic_hw_disabled);
|
static_key_slow_dec_deferred(&apic_hw_disabled);
|
||||||
|
/* Check if there are APF page ready requests pending */
|
||||||
|
kvm_make_request(KVM_REQ_APF_READY, vcpu);
|
||||||
} else {
|
} else {
|
||||||
static_key_slow_inc(&apic_hw_disabled.key);
|
static_key_slow_inc(&apic_hw_disabled.key);
|
||||||
atomic_set_release(&apic->vcpu->kvm->arch.apic_map_dirty, DIRTY);
|
atomic_set_release(&apic->vcpu->kvm->arch.apic_map_dirty, DIRTY);
|
||||||
|
@@ -5178,14 +5178,16 @@ void kvm_mmu_invpcid_gva(struct kvm_vcpu *vcpu, gva_t gva, unsigned long pcid)
|
|||||||
uint i;
|
uint i;
|
||||||
|
|
||||||
if (pcid == kvm_get_active_pcid(vcpu)) {
|
if (pcid == kvm_get_active_pcid(vcpu)) {
|
||||||
mmu->invlpg(vcpu, gva, mmu->root_hpa);
|
if (mmu->invlpg)
|
||||||
|
mmu->invlpg(vcpu, gva, mmu->root_hpa);
|
||||||
tlb_flush = true;
|
tlb_flush = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < KVM_MMU_NUM_PREV_ROOTS; i++) {
|
for (i = 0; i < KVM_MMU_NUM_PREV_ROOTS; i++) {
|
||||||
if (VALID_PAGE(mmu->prev_roots[i].hpa) &&
|
if (VALID_PAGE(mmu->prev_roots[i].hpa) &&
|
||||||
pcid == kvm_get_pcid(vcpu, mmu->prev_roots[i].pgd)) {
|
pcid == kvm_get_pcid(vcpu, mmu->prev_roots[i].pgd)) {
|
||||||
mmu->invlpg(vcpu, gva, mmu->prev_roots[i].hpa);
|
if (mmu->invlpg)
|
||||||
|
mmu->invlpg(vcpu, gva, mmu->prev_roots[i].hpa);
|
||||||
tlb_flush = true;
|
tlb_flush = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -11146,7 +11146,7 @@ bool kvm_arch_can_dequeue_async_page_present(struct kvm_vcpu *vcpu)
|
|||||||
if (!kvm_pv_async_pf_enabled(vcpu))
|
if (!kvm_pv_async_pf_enabled(vcpu))
|
||||||
return true;
|
return true;
|
||||||
else
|
else
|
||||||
return apf_pageready_slot_free(vcpu);
|
return kvm_lapic_enabled(vcpu) && apf_pageready_slot_free(vcpu);
|
||||||
}
|
}
|
||||||
|
|
||||||
void kvm_arch_start_assignment(struct kvm *kvm)
|
void kvm_arch_start_assignment(struct kvm *kvm)
|
||||||
|
@@ -29,10 +29,6 @@
|
|||||||
|
|
||||||
extern unsigned long ccount_freq;
|
extern unsigned long ccount_freq;
|
||||||
|
|
||||||
typedef unsigned long long cycles_t;
|
|
||||||
|
|
||||||
#define get_cycles() (0)
|
|
||||||
|
|
||||||
void local_timer_setup(unsigned cpu);
|
void local_timer_setup(unsigned cpu);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -59,4 +55,6 @@ static inline void set_linux_timer (unsigned long ccompare)
|
|||||||
xtensa_set_sr(ccompare, SREG_CCOMPARE + LINUX_TIMER);
|
xtensa_set_sr(ccompare, SREG_CCOMPARE + LINUX_TIMER);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#include <asm-generic/timex.h>
|
||||||
|
|
||||||
#endif /* _XTENSA_TIMEX_H */
|
#endif /* _XTENSA_TIMEX_H */
|
||||||
|
@@ -1966,9 +1966,10 @@ config CRYPTO_STATS
|
|||||||
config CRYPTO_HASH_INFO
|
config CRYPTO_HASH_INFO
|
||||||
bool
|
bool
|
||||||
|
|
||||||
source "lib/crypto/Kconfig"
|
|
||||||
source "drivers/crypto/Kconfig"
|
source "drivers/crypto/Kconfig"
|
||||||
source "crypto/asymmetric_keys/Kconfig"
|
source "crypto/asymmetric_keys/Kconfig"
|
||||||
source "certs/Kconfig"
|
source "certs/Kconfig"
|
||||||
|
|
||||||
endif # if CRYPTO
|
endif # if CRYPTO
|
||||||
|
|
||||||
|
source "lib/crypto/Kconfig"
|
||||||
|
@@ -15,12 +15,12 @@
|
|||||||
static int crypto_blake2s_update_generic(struct shash_desc *desc,
|
static int crypto_blake2s_update_generic(struct shash_desc *desc,
|
||||||
const u8 *in, unsigned int inlen)
|
const u8 *in, unsigned int inlen)
|
||||||
{
|
{
|
||||||
return crypto_blake2s_update(desc, in, inlen, blake2s_compress_generic);
|
return crypto_blake2s_update(desc, in, inlen, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int crypto_blake2s_final_generic(struct shash_desc *desc, u8 *out)
|
static int crypto_blake2s_final_generic(struct shash_desc *desc, u8 *out)
|
||||||
{
|
{
|
||||||
return crypto_blake2s_final(desc, out, blake2s_compress_generic);
|
return crypto_blake2s_final(desc, out, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define BLAKE2S_ALG(name, driver_name, digest_size) \
|
#define BLAKE2S_ALG(name, driver_name, digest_size) \
|
||||||
|
@@ -1491,12 +1491,13 @@ static int drbg_generate_long(struct drbg_state *drbg,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void drbg_schedule_async_seed(struct random_ready_callback *rdy)
|
static int drbg_schedule_async_seed(struct notifier_block *nb, unsigned long action, void *data)
|
||||||
{
|
{
|
||||||
struct drbg_state *drbg = container_of(rdy, struct drbg_state,
|
struct drbg_state *drbg = container_of(nb, struct drbg_state,
|
||||||
random_ready);
|
random_ready);
|
||||||
|
|
||||||
schedule_work(&drbg->seed_work);
|
schedule_work(&drbg->seed_work);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int drbg_prepare_hrng(struct drbg_state *drbg)
|
static int drbg_prepare_hrng(struct drbg_state *drbg)
|
||||||
@@ -1511,10 +1512,8 @@ static int drbg_prepare_hrng(struct drbg_state *drbg)
|
|||||||
|
|
||||||
INIT_WORK(&drbg->seed_work, drbg_async_seed);
|
INIT_WORK(&drbg->seed_work, drbg_async_seed);
|
||||||
|
|
||||||
drbg->random_ready.owner = THIS_MODULE;
|
drbg->random_ready.notifier_call = drbg_schedule_async_seed;
|
||||||
drbg->random_ready.func = drbg_schedule_async_seed;
|
err = register_random_ready_notifier(&drbg->random_ready);
|
||||||
|
|
||||||
err = add_random_ready_callback(&drbg->random_ready);
|
|
||||||
|
|
||||||
switch (err) {
|
switch (err) {
|
||||||
case 0:
|
case 0:
|
||||||
@@ -1525,7 +1524,7 @@ static int drbg_prepare_hrng(struct drbg_state *drbg)
|
|||||||
fallthrough;
|
fallthrough;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
drbg->random_ready.func = NULL;
|
drbg->random_ready.notifier_call = NULL;
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1629,8 +1628,8 @@ free_everything:
|
|||||||
*/
|
*/
|
||||||
static int drbg_uninstantiate(struct drbg_state *drbg)
|
static int drbg_uninstantiate(struct drbg_state *drbg)
|
||||||
{
|
{
|
||||||
if (drbg->random_ready.func) {
|
if (drbg->random_ready.notifier_call) {
|
||||||
del_random_ready_callback(&drbg->random_ready);
|
unregister_random_ready_notifier(&drbg->random_ready);
|
||||||
cancel_work_sync(&drbg->seed_work);
|
cancel_work_sync(&drbg->seed_work);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -439,18 +439,29 @@ static ssize_t acpi_data_show(struct file *filp, struct kobject *kobj,
|
|||||||
{
|
{
|
||||||
struct acpi_data_attr *data_attr;
|
struct acpi_data_attr *data_attr;
|
||||||
void __iomem *base;
|
void __iomem *base;
|
||||||
ssize_t rc;
|
ssize_t size;
|
||||||
|
|
||||||
data_attr = container_of(bin_attr, struct acpi_data_attr, attr);
|
data_attr = container_of(bin_attr, struct acpi_data_attr, attr);
|
||||||
|
size = data_attr->attr.size;
|
||||||
|
|
||||||
base = acpi_os_map_memory(data_attr->addr, data_attr->attr.size);
|
if (offset < 0)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
if (offset >= size)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (count > size - offset)
|
||||||
|
count = size - offset;
|
||||||
|
|
||||||
|
base = acpi_os_map_iomem(data_attr->addr, size);
|
||||||
if (!base)
|
if (!base)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
rc = memory_read_from_buffer(buf, count, &offset, base,
|
|
||||||
data_attr->attr.size);
|
|
||||||
acpi_os_unmap_memory(base, data_attr->attr.size);
|
|
||||||
|
|
||||||
return rc;
|
memcpy_fromio(buf, base + offset, count);
|
||||||
|
|
||||||
|
acpi_os_unmap_iomem(base, size);
|
||||||
|
|
||||||
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int acpi_bert_data_init(void *th, struct acpi_data_attr *data_attr)
|
static int acpi_bert_data_init(void *th, struct acpi_data_attr *data_attr)
|
||||||
|
@@ -495,4 +495,5 @@ config RANDOM_TRUST_BOOTLOADER
|
|||||||
device randomness. Say Y here to assume the entropy provided by the
|
device randomness. Say Y here to assume the entropy provided by the
|
||||||
booloader is trustworthy so it will be added to the kernel's entropy
|
booloader is trustworthy so it will be added to the kernel's entropy
|
||||||
pool. Otherwise, say N here so it will be regarded as device input that
|
pool. Otherwise, say N here so it will be regarded as device input that
|
||||||
only mixes the entropy pool.
|
only mixes the entropy pool. This can also be configured at boot with
|
||||||
|
"random.trust_bootloader=on/off".
|
||||||
|
@@ -15,6 +15,7 @@
|
|||||||
#include <linux/err.h>
|
#include <linux/err.h>
|
||||||
#include <linux/fs.h>
|
#include <linux/fs.h>
|
||||||
#include <linux/hw_random.h>
|
#include <linux/hw_random.h>
|
||||||
|
#include <linux/random.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/kthread.h>
|
#include <linux/kthread.h>
|
||||||
#include <linux/sched/signal.h>
|
#include <linux/sched/signal.h>
|
||||||
|
File diff suppressed because it is too large
Load Diff
@@ -1351,7 +1351,7 @@ static void vmbus_isr(void)
|
|||||||
tasklet_schedule(&hv_cpu->msg_dpc);
|
tasklet_schedule(&hv_cpu->msg_dpc);
|
||||||
}
|
}
|
||||||
|
|
||||||
add_interrupt_randomness(hv_get_vector(), 0);
|
add_interrupt_randomness(hv_get_vector());
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@@ -1325,12 +1325,6 @@ static int vim2m_probe(struct platform_device *pdev)
|
|||||||
vfd->lock = &dev->dev_mutex;
|
vfd->lock = &dev->dev_mutex;
|
||||||
vfd->v4l2_dev = &dev->v4l2_dev;
|
vfd->v4l2_dev = &dev->v4l2_dev;
|
||||||
|
|
||||||
ret = video_register_device(vfd, VFL_TYPE_VIDEO, 0);
|
|
||||||
if (ret) {
|
|
||||||
v4l2_err(&dev->v4l2_dev, "Failed to register video device\n");
|
|
||||||
goto error_v4l2;
|
|
||||||
}
|
|
||||||
|
|
||||||
video_set_drvdata(vfd, dev);
|
video_set_drvdata(vfd, dev);
|
||||||
v4l2_info(&dev->v4l2_dev,
|
v4l2_info(&dev->v4l2_dev,
|
||||||
"Device registered as /dev/video%d\n", vfd->num);
|
"Device registered as /dev/video%d\n", vfd->num);
|
||||||
@@ -1353,12 +1347,20 @@ static int vim2m_probe(struct platform_device *pdev)
|
|||||||
media_device_init(&dev->mdev);
|
media_device_init(&dev->mdev);
|
||||||
dev->mdev.ops = &m2m_media_ops;
|
dev->mdev.ops = &m2m_media_ops;
|
||||||
dev->v4l2_dev.mdev = &dev->mdev;
|
dev->v4l2_dev.mdev = &dev->mdev;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ret = video_register_device(vfd, VFL_TYPE_VIDEO, 0);
|
||||||
|
if (ret) {
|
||||||
|
v4l2_err(&dev->v4l2_dev, "Failed to register video device\n");
|
||||||
|
goto error_m2m;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_MEDIA_CONTROLLER
|
||||||
ret = v4l2_m2m_register_media_controller(dev->m2m_dev, vfd,
|
ret = v4l2_m2m_register_media_controller(dev->m2m_dev, vfd,
|
||||||
MEDIA_ENT_F_PROC_VIDEO_SCALER);
|
MEDIA_ENT_F_PROC_VIDEO_SCALER);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
v4l2_err(&dev->v4l2_dev, "Failed to init mem2mem media controller\n");
|
v4l2_err(&dev->v4l2_dev, "Failed to init mem2mem media controller\n");
|
||||||
goto error_dev;
|
goto error_v4l2;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = media_device_register(&dev->mdev);
|
ret = media_device_register(&dev->mdev);
|
||||||
@@ -1373,11 +1375,13 @@ static int vim2m_probe(struct platform_device *pdev)
|
|||||||
error_m2m_mc:
|
error_m2m_mc:
|
||||||
v4l2_m2m_unregister_media_controller(dev->m2m_dev);
|
v4l2_m2m_unregister_media_controller(dev->m2m_dev);
|
||||||
#endif
|
#endif
|
||||||
error_dev:
|
error_v4l2:
|
||||||
video_unregister_device(&dev->vfd);
|
video_unregister_device(&dev->vfd);
|
||||||
/* vim2m_device_release called by video_unregister_device to release various objects */
|
/* vim2m_device_release called by video_unregister_device to release various objects */
|
||||||
return ret;
|
return ret;
|
||||||
error_v4l2:
|
error_m2m:
|
||||||
|
v4l2_m2m_release(dev->m2m_dev);
|
||||||
|
error_dev:
|
||||||
v4l2_device_unregister(&dev->v4l2_dev);
|
v4l2_device_unregister(&dev->v4l2_dev);
|
||||||
error_free:
|
error_free:
|
||||||
kfree(dev);
|
kfree(dev);
|
||||||
|
@@ -80,7 +80,6 @@ config WIREGUARD
|
|||||||
select CRYPTO
|
select CRYPTO
|
||||||
select CRYPTO_LIB_CURVE25519
|
select CRYPTO_LIB_CURVE25519
|
||||||
select CRYPTO_LIB_CHACHA20POLY1305
|
select CRYPTO_LIB_CHACHA20POLY1305
|
||||||
select CRYPTO_LIB_BLAKE2S
|
|
||||||
select CRYPTO_CHACHA20_X86_64 if X86 && 64BIT
|
select CRYPTO_CHACHA20_X86_64 if X86 && 64BIT
|
||||||
select CRYPTO_POLY1305_X86_64 if X86 && 64BIT
|
select CRYPTO_POLY1305_X86_64 if X86 && 64BIT
|
||||||
select CRYPTO_BLAKE2S_X86 if X86 && 64BIT
|
select CRYPTO_BLAKE2S_X86 if X86 && 64BIT
|
||||||
|
@@ -302,6 +302,41 @@ void wg_noise_set_static_identity_private_key(
|
|||||||
static_identity->static_public, private_key);
|
static_identity->static_public, private_key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void hmac(u8 *out, const u8 *in, const u8 *key, const size_t inlen, const size_t keylen)
|
||||||
|
{
|
||||||
|
struct blake2s_state state;
|
||||||
|
u8 x_key[BLAKE2S_BLOCK_SIZE] __aligned(__alignof__(u32)) = { 0 };
|
||||||
|
u8 i_hash[BLAKE2S_HASH_SIZE] __aligned(__alignof__(u32));
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (keylen > BLAKE2S_BLOCK_SIZE) {
|
||||||
|
blake2s_init(&state, BLAKE2S_HASH_SIZE);
|
||||||
|
blake2s_update(&state, key, keylen);
|
||||||
|
blake2s_final(&state, x_key);
|
||||||
|
} else
|
||||||
|
memcpy(x_key, key, keylen);
|
||||||
|
|
||||||
|
for (i = 0; i < BLAKE2S_BLOCK_SIZE; ++i)
|
||||||
|
x_key[i] ^= 0x36;
|
||||||
|
|
||||||
|
blake2s_init(&state, BLAKE2S_HASH_SIZE);
|
||||||
|
blake2s_update(&state, x_key, BLAKE2S_BLOCK_SIZE);
|
||||||
|
blake2s_update(&state, in, inlen);
|
||||||
|
blake2s_final(&state, i_hash);
|
||||||
|
|
||||||
|
for (i = 0; i < BLAKE2S_BLOCK_SIZE; ++i)
|
||||||
|
x_key[i] ^= 0x5c ^ 0x36;
|
||||||
|
|
||||||
|
blake2s_init(&state, BLAKE2S_HASH_SIZE);
|
||||||
|
blake2s_update(&state, x_key, BLAKE2S_BLOCK_SIZE);
|
||||||
|
blake2s_update(&state, i_hash, BLAKE2S_HASH_SIZE);
|
||||||
|
blake2s_final(&state, i_hash);
|
||||||
|
|
||||||
|
memcpy(out, i_hash, BLAKE2S_HASH_SIZE);
|
||||||
|
memzero_explicit(x_key, BLAKE2S_BLOCK_SIZE);
|
||||||
|
memzero_explicit(i_hash, BLAKE2S_HASH_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
/* This is Hugo Krawczyk's HKDF:
|
/* This is Hugo Krawczyk's HKDF:
|
||||||
* - https://eprint.iacr.org/2010/264.pdf
|
* - https://eprint.iacr.org/2010/264.pdf
|
||||||
* - https://tools.ietf.org/html/rfc5869
|
* - https://tools.ietf.org/html/rfc5869
|
||||||
@@ -322,14 +357,14 @@ static void kdf(u8 *first_dst, u8 *second_dst, u8 *third_dst, const u8 *data,
|
|||||||
((third_len || third_dst) && (!second_len || !second_dst))));
|
((third_len || third_dst) && (!second_len || !second_dst))));
|
||||||
|
|
||||||
/* Extract entropy from data into secret */
|
/* Extract entropy from data into secret */
|
||||||
blake2s256_hmac(secret, data, chaining_key, data_len, NOISE_HASH_LEN);
|
hmac(secret, data, chaining_key, data_len, NOISE_HASH_LEN);
|
||||||
|
|
||||||
if (!first_dst || !first_len)
|
if (!first_dst || !first_len)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
/* Expand first key: key = secret, data = 0x1 */
|
/* Expand first key: key = secret, data = 0x1 */
|
||||||
output[0] = 1;
|
output[0] = 1;
|
||||||
blake2s256_hmac(output, output, secret, 1, BLAKE2S_HASH_SIZE);
|
hmac(output, output, secret, 1, BLAKE2S_HASH_SIZE);
|
||||||
memcpy(first_dst, output, first_len);
|
memcpy(first_dst, output, first_len);
|
||||||
|
|
||||||
if (!second_dst || !second_len)
|
if (!second_dst || !second_len)
|
||||||
@@ -337,8 +372,7 @@ static void kdf(u8 *first_dst, u8 *second_dst, u8 *third_dst, const u8 *data,
|
|||||||
|
|
||||||
/* Expand second key: key = secret, data = first-key || 0x2 */
|
/* Expand second key: key = secret, data = first-key || 0x2 */
|
||||||
output[BLAKE2S_HASH_SIZE] = 2;
|
output[BLAKE2S_HASH_SIZE] = 2;
|
||||||
blake2s256_hmac(output, output, secret, BLAKE2S_HASH_SIZE + 1,
|
hmac(output, output, secret, BLAKE2S_HASH_SIZE + 1, BLAKE2S_HASH_SIZE);
|
||||||
BLAKE2S_HASH_SIZE);
|
|
||||||
memcpy(second_dst, output, second_len);
|
memcpy(second_dst, output, second_len);
|
||||||
|
|
||||||
if (!third_dst || !third_len)
|
if (!third_dst || !third_len)
|
||||||
@@ -346,8 +380,7 @@ static void kdf(u8 *first_dst, u8 *second_dst, u8 *third_dst, const u8 *data,
|
|||||||
|
|
||||||
/* Expand third key: key = secret, data = second-key || 0x3 */
|
/* Expand third key: key = secret, data = second-key || 0x3 */
|
||||||
output[BLAKE2S_HASH_SIZE] = 3;
|
output[BLAKE2S_HASH_SIZE] = 3;
|
||||||
blake2s256_hmac(output, output, secret, BLAKE2S_HASH_SIZE + 1,
|
hmac(output, output, secret, BLAKE2S_HASH_SIZE + 1, BLAKE2S_HASH_SIZE);
|
||||||
BLAKE2S_HASH_SIZE);
|
|
||||||
memcpy(third_dst, output, third_len);
|
memcpy(third_dst, output, third_len);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
@@ -1351,9 +1351,11 @@ static int rtw_wx_set_scan(struct net_device *dev, struct iw_request_info *a,
|
|||||||
|
|
||||||
sec_len = *(pos++); len -= 1;
|
sec_len = *(pos++); len -= 1;
|
||||||
|
|
||||||
if (sec_len > 0 && sec_len <= len) {
|
if (sec_len > 0 &&
|
||||||
|
sec_len <= len &&
|
||||||
|
sec_len <= 32) {
|
||||||
ssid[ssid_index].SsidLength = sec_len;
|
ssid[ssid_index].SsidLength = sec_len;
|
||||||
memcpy(ssid[ssid_index].Ssid, pos, ssid[ssid_index].SsidLength);
|
memcpy(ssid[ssid_index].Ssid, pos, sec_len);
|
||||||
/* DBG_871X("%s COMBO_SCAN with specific ssid:%s, %d\n", __func__ */
|
/* DBG_871X("%s COMBO_SCAN with specific ssid:%s, %d\n", __func__ */
|
||||||
/* , ssid[ssid_index].Ssid, ssid[ssid_index].SsidLength); */
|
/* , ssid[ssid_index].Ssid, ssid[ssid_index].SsidLength); */
|
||||||
ssid_index++;
|
ssid_index++;
|
||||||
|
@@ -101,7 +101,4 @@ static inline void blake2s(u8 *out, const u8 *in, const u8 *key,
|
|||||||
blake2s_final(&state, out);
|
blake2s_final(&state, out);
|
||||||
}
|
}
|
||||||
|
|
||||||
void blake2s256_hmac(u8 *out, const u8 *in, const u8 *key, const size_t inlen,
|
|
||||||
const size_t keylen);
|
|
||||||
|
|
||||||
#endif /* _CRYPTO_BLAKE2S_H */
|
#endif /* _CRYPTO_BLAKE2S_H */
|
||||||
|
@@ -47,12 +47,19 @@ static inline void hchacha_block(const u32 *state, u32 *out, int nrounds)
|
|||||||
hchacha_block_generic(state, out, nrounds);
|
hchacha_block_generic(state, out, nrounds);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum chacha_constants { /* expand 32-byte k */
|
||||||
|
CHACHA_CONSTANT_EXPA = 0x61707865U,
|
||||||
|
CHACHA_CONSTANT_ND_3 = 0x3320646eU,
|
||||||
|
CHACHA_CONSTANT_2_BY = 0x79622d32U,
|
||||||
|
CHACHA_CONSTANT_TE_K = 0x6b206574U
|
||||||
|
};
|
||||||
|
|
||||||
static inline void chacha_init_consts(u32 *state)
|
static inline void chacha_init_consts(u32 *state)
|
||||||
{
|
{
|
||||||
state[0] = 0x61707865; /* "expa" */
|
state[0] = CHACHA_CONSTANT_EXPA;
|
||||||
state[1] = 0x3320646e; /* "nd 3" */
|
state[1] = CHACHA_CONSTANT_ND_3;
|
||||||
state[2] = 0x79622d32; /* "2-by" */
|
state[2] = CHACHA_CONSTANT_2_BY;
|
||||||
state[3] = 0x6b206574; /* "te k" */
|
state[3] = CHACHA_CONSTANT_TE_K;
|
||||||
}
|
}
|
||||||
|
|
||||||
void chacha_init_arch(u32 *state, const u32 *key, const u8 *iv);
|
void chacha_init_arch(u32 *state, const u32 *key, const u8 *iv);
|
||||||
|
@@ -136,7 +136,7 @@ struct drbg_state {
|
|||||||
const struct drbg_state_ops *d_ops;
|
const struct drbg_state_ops *d_ops;
|
||||||
const struct drbg_core *core;
|
const struct drbg_core *core;
|
||||||
struct drbg_string test_data;
|
struct drbg_string test_data;
|
||||||
struct random_ready_callback random_ready;
|
struct notifier_block random_ready;
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline __u8 drbg_statelen(struct drbg_state *drbg)
|
static inline __u8 drbg_statelen(struct drbg_state *drbg)
|
||||||
|
@@ -11,11 +11,11 @@
|
|||||||
#include <crypto/internal/hash.h>
|
#include <crypto/internal/hash.h>
|
||||||
#include <linux/string.h>
|
#include <linux/string.h>
|
||||||
|
|
||||||
void blake2s_compress_generic(struct blake2s_state *state,const u8 *block,
|
void blake2s_compress_generic(struct blake2s_state *state, const u8 *block,
|
||||||
size_t nblocks, const u32 inc);
|
size_t nblocks, const u32 inc);
|
||||||
|
|
||||||
void blake2s_compress_arch(struct blake2s_state *state,const u8 *block,
|
void blake2s_compress(struct blake2s_state *state, const u8 *block,
|
||||||
size_t nblocks, const u32 inc);
|
size_t nblocks, const u32 inc);
|
||||||
|
|
||||||
bool blake2s_selftest(void);
|
bool blake2s_selftest(void);
|
||||||
|
|
||||||
@@ -24,14 +24,11 @@ static inline void blake2s_set_lastblock(struct blake2s_state *state)
|
|||||||
state->f[0] = -1;
|
state->f[0] = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef void (*blake2s_compress_t)(struct blake2s_state *state,
|
|
||||||
const u8 *block, size_t nblocks, u32 inc);
|
|
||||||
|
|
||||||
/* Helper functions for BLAKE2s shared by the library and shash APIs */
|
/* Helper functions for BLAKE2s shared by the library and shash APIs */
|
||||||
|
|
||||||
static inline void __blake2s_update(struct blake2s_state *state,
|
static __always_inline void
|
||||||
const u8 *in, size_t inlen,
|
__blake2s_update(struct blake2s_state *state, const u8 *in, size_t inlen,
|
||||||
blake2s_compress_t compress)
|
bool force_generic)
|
||||||
{
|
{
|
||||||
const size_t fill = BLAKE2S_BLOCK_SIZE - state->buflen;
|
const size_t fill = BLAKE2S_BLOCK_SIZE - state->buflen;
|
||||||
|
|
||||||
@@ -39,7 +36,12 @@ static inline void __blake2s_update(struct blake2s_state *state,
|
|||||||
return;
|
return;
|
||||||
if (inlen > fill) {
|
if (inlen > fill) {
|
||||||
memcpy(state->buf + state->buflen, in, fill);
|
memcpy(state->buf + state->buflen, in, fill);
|
||||||
(*compress)(state, state->buf, 1, BLAKE2S_BLOCK_SIZE);
|
if (force_generic)
|
||||||
|
blake2s_compress_generic(state, state->buf, 1,
|
||||||
|
BLAKE2S_BLOCK_SIZE);
|
||||||
|
else
|
||||||
|
blake2s_compress(state, state->buf, 1,
|
||||||
|
BLAKE2S_BLOCK_SIZE);
|
||||||
state->buflen = 0;
|
state->buflen = 0;
|
||||||
in += fill;
|
in += fill;
|
||||||
inlen -= fill;
|
inlen -= fill;
|
||||||
@@ -47,7 +49,12 @@ static inline void __blake2s_update(struct blake2s_state *state,
|
|||||||
if (inlen > BLAKE2S_BLOCK_SIZE) {
|
if (inlen > BLAKE2S_BLOCK_SIZE) {
|
||||||
const size_t nblocks = DIV_ROUND_UP(inlen, BLAKE2S_BLOCK_SIZE);
|
const size_t nblocks = DIV_ROUND_UP(inlen, BLAKE2S_BLOCK_SIZE);
|
||||||
/* Hash one less (full) block than strictly possible */
|
/* Hash one less (full) block than strictly possible */
|
||||||
(*compress)(state, in, nblocks - 1, BLAKE2S_BLOCK_SIZE);
|
if (force_generic)
|
||||||
|
blake2s_compress_generic(state, in, nblocks - 1,
|
||||||
|
BLAKE2S_BLOCK_SIZE);
|
||||||
|
else
|
||||||
|
blake2s_compress(state, in, nblocks - 1,
|
||||||
|
BLAKE2S_BLOCK_SIZE);
|
||||||
in += BLAKE2S_BLOCK_SIZE * (nblocks - 1);
|
in += BLAKE2S_BLOCK_SIZE * (nblocks - 1);
|
||||||
inlen -= BLAKE2S_BLOCK_SIZE * (nblocks - 1);
|
inlen -= BLAKE2S_BLOCK_SIZE * (nblocks - 1);
|
||||||
}
|
}
|
||||||
@@ -55,13 +62,16 @@ static inline void __blake2s_update(struct blake2s_state *state,
|
|||||||
state->buflen += inlen;
|
state->buflen += inlen;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void __blake2s_final(struct blake2s_state *state, u8 *out,
|
static __always_inline void
|
||||||
blake2s_compress_t compress)
|
__blake2s_final(struct blake2s_state *state, u8 *out, bool force_generic)
|
||||||
{
|
{
|
||||||
blake2s_set_lastblock(state);
|
blake2s_set_lastblock(state);
|
||||||
memset(state->buf + state->buflen, 0,
|
memset(state->buf + state->buflen, 0,
|
||||||
BLAKE2S_BLOCK_SIZE - state->buflen); /* Padding */
|
BLAKE2S_BLOCK_SIZE - state->buflen); /* Padding */
|
||||||
(*compress)(state, state->buf, 1, state->buflen);
|
if (force_generic)
|
||||||
|
blake2s_compress_generic(state, state->buf, 1, state->buflen);
|
||||||
|
else
|
||||||
|
blake2s_compress(state, state->buf, 1, state->buflen);
|
||||||
cpu_to_le32_array(state->h, ARRAY_SIZE(state->h));
|
cpu_to_le32_array(state->h, ARRAY_SIZE(state->h));
|
||||||
memcpy(out, state->h, state->outlen);
|
memcpy(out, state->h, state->outlen);
|
||||||
}
|
}
|
||||||
@@ -99,20 +109,20 @@ static inline int crypto_blake2s_init(struct shash_desc *desc)
|
|||||||
|
|
||||||
static inline int crypto_blake2s_update(struct shash_desc *desc,
|
static inline int crypto_blake2s_update(struct shash_desc *desc,
|
||||||
const u8 *in, unsigned int inlen,
|
const u8 *in, unsigned int inlen,
|
||||||
blake2s_compress_t compress)
|
bool force_generic)
|
||||||
{
|
{
|
||||||
struct blake2s_state *state = shash_desc_ctx(desc);
|
struct blake2s_state *state = shash_desc_ctx(desc);
|
||||||
|
|
||||||
__blake2s_update(state, in, inlen, compress);
|
__blake2s_update(state, in, inlen, force_generic);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int crypto_blake2s_final(struct shash_desc *desc, u8 *out,
|
static inline int crypto_blake2s_final(struct shash_desc *desc, u8 *out,
|
||||||
blake2s_compress_t compress)
|
bool force_generic)
|
||||||
{
|
{
|
||||||
struct blake2s_state *state = shash_desc_ctx(desc);
|
struct blake2s_state *state = shash_desc_ctx(desc);
|
||||||
|
|
||||||
__blake2s_final(state, out, compress);
|
__blake2s_final(state, out, force_generic);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -61,6 +61,7 @@ enum cpuhp_state {
|
|||||||
CPUHP_LUSTRE_CFS_DEAD,
|
CPUHP_LUSTRE_CFS_DEAD,
|
||||||
CPUHP_AP_ARM_CACHE_B15_RAC_DEAD,
|
CPUHP_AP_ARM_CACHE_B15_RAC_DEAD,
|
||||||
CPUHP_PADATA_DEAD,
|
CPUHP_PADATA_DEAD,
|
||||||
|
CPUHP_RANDOM_PREPARE,
|
||||||
CPUHP_WORKQUEUE_PREP,
|
CPUHP_WORKQUEUE_PREP,
|
||||||
CPUHP_POWER_NUMA_PREPARE,
|
CPUHP_POWER_NUMA_PREPARE,
|
||||||
CPUHP_HRTIMERS_PREPARE,
|
CPUHP_HRTIMERS_PREPARE,
|
||||||
@@ -187,6 +188,7 @@ enum cpuhp_state {
|
|||||||
CPUHP_AP_PERF_POWERPC_HV_GPCI_ONLINE,
|
CPUHP_AP_PERF_POWERPC_HV_GPCI_ONLINE,
|
||||||
CPUHP_AP_WATCHDOG_ONLINE,
|
CPUHP_AP_WATCHDOG_ONLINE,
|
||||||
CPUHP_AP_WORKQUEUE_ONLINE,
|
CPUHP_AP_WORKQUEUE_ONLINE,
|
||||||
|
CPUHP_AP_RANDOM_ONLINE,
|
||||||
CPUHP_AP_RCUTREE_ONLINE,
|
CPUHP_AP_RCUTREE_ONLINE,
|
||||||
CPUHP_AP_BASE_CACHEINFO_ONLINE,
|
CPUHP_AP_BASE_CACHEINFO_ONLINE,
|
||||||
CPUHP_AP_ONLINE_DYN,
|
CPUHP_AP_ONLINE_DYN,
|
||||||
|
@@ -60,7 +60,5 @@ extern int devm_hwrng_register(struct device *dev, struct hwrng *rng);
|
|||||||
/** Unregister a Hardware Random Number Generator driver. */
|
/** Unregister a Hardware Random Number Generator driver. */
|
||||||
extern void hwrng_unregister(struct hwrng *rng);
|
extern void hwrng_unregister(struct hwrng *rng);
|
||||||
extern void devm_hwrng_unregister(struct device *dve, struct hwrng *rng);
|
extern void devm_hwrng_unregister(struct device *dve, struct hwrng *rng);
|
||||||
/** Feed random bits into the pool. */
|
|
||||||
extern void add_hwgenerator_randomness(const char *buffer, size_t count, size_t entropy);
|
|
||||||
|
|
||||||
#endif /* LINUX_HWRANDOM_H_ */
|
#endif /* LINUX_HWRANDOM_H_ */
|
||||||
|
@@ -2735,6 +2735,7 @@ extern int install_special_mapping(struct mm_struct *mm,
|
|||||||
unsigned long flags, struct page **pages);
|
unsigned long flags, struct page **pages);
|
||||||
|
|
||||||
unsigned long randomize_stack_top(unsigned long stack_top);
|
unsigned long randomize_stack_top(unsigned long stack_top);
|
||||||
|
unsigned long randomize_page(unsigned long start, unsigned long range);
|
||||||
|
|
||||||
extern unsigned long get_unmapped_area(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);
|
extern unsigned long get_unmapped_area(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);
|
||||||
|
|
||||||
|
@@ -10,6 +10,7 @@
|
|||||||
|
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/percpu.h>
|
#include <linux/percpu.h>
|
||||||
|
#include <linux/siphash.h>
|
||||||
|
|
||||||
u32 prandom_u32(void);
|
u32 prandom_u32(void);
|
||||||
void prandom_bytes(void *buf, size_t nbytes);
|
void prandom_bytes(void *buf, size_t nbytes);
|
||||||
@@ -27,15 +28,10 @@ DECLARE_PER_CPU(unsigned long, net_rand_noise);
|
|||||||
* The core SipHash round function. Each line can be executed in
|
* The core SipHash round function. Each line can be executed in
|
||||||
* parallel given enough CPU resources.
|
* parallel given enough CPU resources.
|
||||||
*/
|
*/
|
||||||
#define PRND_SIPROUND(v0, v1, v2, v3) ( \
|
#define PRND_SIPROUND(v0, v1, v2, v3) SIPHASH_PERMUTATION(v0, v1, v2, v3)
|
||||||
v0 += v1, v1 = rol64(v1, 13), v2 += v3, v3 = rol64(v3, 16), \
|
|
||||||
v1 ^= v0, v0 = rol64(v0, 32), v3 ^= v2, \
|
|
||||||
v0 += v3, v3 = rol64(v3, 21), v2 += v1, v1 = rol64(v1, 17), \
|
|
||||||
v3 ^= v0, v1 ^= v2, v2 = rol64(v2, 32) \
|
|
||||||
)
|
|
||||||
|
|
||||||
#define PRND_K0 (0x736f6d6570736575 ^ 0x6c7967656e657261)
|
#define PRND_K0 (SIPHASH_CONST_0 ^ SIPHASH_CONST_2)
|
||||||
#define PRND_K1 (0x646f72616e646f6d ^ 0x7465646279746573)
|
#define PRND_K1 (SIPHASH_CONST_1 ^ SIPHASH_CONST_3)
|
||||||
|
|
||||||
#elif BITS_PER_LONG == 32
|
#elif BITS_PER_LONG == 32
|
||||||
/*
|
/*
|
||||||
@@ -43,14 +39,9 @@ DECLARE_PER_CPU(unsigned long, net_rand_noise);
|
|||||||
* This is weaker, but 32-bit machines are not used for high-traffic
|
* This is weaker, but 32-bit machines are not used for high-traffic
|
||||||
* applications, so there is less output for an attacker to analyze.
|
* applications, so there is less output for an attacker to analyze.
|
||||||
*/
|
*/
|
||||||
#define PRND_SIPROUND(v0, v1, v2, v3) ( \
|
#define PRND_SIPROUND(v0, v1, v2, v3) HSIPHASH_PERMUTATION(v0, v1, v2, v3)
|
||||||
v0 += v1, v1 = rol32(v1, 5), v2 += v3, v3 = rol32(v3, 8), \
|
#define PRND_K0 (HSIPHASH_CONST_0 ^ HSIPHASH_CONST_2)
|
||||||
v1 ^= v0, v0 = rol32(v0, 16), v3 ^= v2, \
|
#define PRND_K1 (HSIPHASH_CONST_1 ^ HSIPHASH_CONST_3)
|
||||||
v0 += v3, v3 = rol32(v3, 7), v2 += v1, v1 = rol32(v1, 13), \
|
|
||||||
v3 ^= v0, v1 ^= v2, v2 = rol32(v2, 16) \
|
|
||||||
)
|
|
||||||
#define PRND_K0 0x6c796765
|
|
||||||
#define PRND_K1 0x74656462
|
|
||||||
|
|
||||||
#else
|
#else
|
||||||
#error Unsupported BITS_PER_LONG
|
#error Unsupported BITS_PER_LONG
|
||||||
|
@@ -1,9 +1,5 @@
|
|||||||
/* SPDX-License-Identifier: GPL-2.0 */
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
/*
|
|
||||||
* include/linux/random.h
|
|
||||||
*
|
|
||||||
* Include file for the random number generator.
|
|
||||||
*/
|
|
||||||
#ifndef _LINUX_RANDOM_H
|
#ifndef _LINUX_RANDOM_H
|
||||||
#define _LINUX_RANDOM_H
|
#define _LINUX_RANDOM_H
|
||||||
|
|
||||||
@@ -14,41 +10,26 @@
|
|||||||
|
|
||||||
#include <uapi/linux/random.h>
|
#include <uapi/linux/random.h>
|
||||||
|
|
||||||
struct random_ready_callback {
|
struct notifier_block;
|
||||||
struct list_head list;
|
|
||||||
void (*func)(struct random_ready_callback *rdy);
|
|
||||||
struct module *owner;
|
|
||||||
};
|
|
||||||
|
|
||||||
extern void add_device_randomness(const void *, unsigned int);
|
void add_device_randomness(const void *buf, size_t len);
|
||||||
extern void add_bootloader_randomness(const void *, unsigned int);
|
void add_bootloader_randomness(const void *buf, size_t len);
|
||||||
|
void add_input_randomness(unsigned int type, unsigned int code,
|
||||||
|
unsigned int value) __latent_entropy;
|
||||||
|
void add_interrupt_randomness(int irq) __latent_entropy;
|
||||||
|
void add_hwgenerator_randomness(const void *buf, size_t len, size_t entropy);
|
||||||
|
|
||||||
#if defined(LATENT_ENTROPY_PLUGIN) && !defined(__CHECKER__)
|
#if defined(LATENT_ENTROPY_PLUGIN) && !defined(__CHECKER__)
|
||||||
static inline void add_latent_entropy(void)
|
static inline void add_latent_entropy(void)
|
||||||
{
|
{
|
||||||
add_device_randomness((const void *)&latent_entropy,
|
add_device_randomness((const void *)&latent_entropy, sizeof(latent_entropy));
|
||||||
sizeof(latent_entropy));
|
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
static inline void add_latent_entropy(void) {}
|
static inline void add_latent_entropy(void) { }
|
||||||
#endif
|
|
||||||
|
|
||||||
extern void add_input_randomness(unsigned int type, unsigned int code,
|
|
||||||
unsigned int value) __latent_entropy;
|
|
||||||
extern void add_interrupt_randomness(int irq, int irq_flags) __latent_entropy;
|
|
||||||
|
|
||||||
extern void get_random_bytes(void *buf, int nbytes);
|
|
||||||
extern int wait_for_random_bytes(void);
|
|
||||||
extern int __init rand_initialize(void);
|
|
||||||
extern bool rng_is_initialized(void);
|
|
||||||
extern int add_random_ready_callback(struct random_ready_callback *rdy);
|
|
||||||
extern void del_random_ready_callback(struct random_ready_callback *rdy);
|
|
||||||
extern int __must_check get_random_bytes_arch(void *buf, int nbytes);
|
|
||||||
|
|
||||||
#ifndef MODULE
|
|
||||||
extern const struct file_operations random_fops, urandom_fops;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
void get_random_bytes(void *buf, size_t len);
|
||||||
|
size_t __must_check get_random_bytes_arch(void *buf, size_t len);
|
||||||
u32 get_random_u32(void);
|
u32 get_random_u32(void);
|
||||||
u64 get_random_u64(void);
|
u64 get_random_u64(void);
|
||||||
static inline unsigned int get_random_int(void)
|
static inline unsigned int get_random_int(void)
|
||||||
@@ -80,36 +61,38 @@ static inline unsigned long get_random_long(void)
|
|||||||
|
|
||||||
static inline unsigned long get_random_canary(void)
|
static inline unsigned long get_random_canary(void)
|
||||||
{
|
{
|
||||||
unsigned long val = get_random_long();
|
return get_random_long() & CANARY_MASK;
|
||||||
|
|
||||||
return val & CANARY_MASK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int __init random_init(const char *command_line);
|
||||||
|
bool rng_is_initialized(void);
|
||||||
|
int wait_for_random_bytes(void);
|
||||||
|
int register_random_ready_notifier(struct notifier_block *nb);
|
||||||
|
int unregister_random_ready_notifier(struct notifier_block *nb);
|
||||||
|
|
||||||
/* Calls wait_for_random_bytes() and then calls get_random_bytes(buf, nbytes).
|
/* Calls wait_for_random_bytes() and then calls get_random_bytes(buf, nbytes).
|
||||||
* Returns the result of the call to wait_for_random_bytes. */
|
* Returns the result of the call to wait_for_random_bytes. */
|
||||||
static inline int get_random_bytes_wait(void *buf, int nbytes)
|
static inline int get_random_bytes_wait(void *buf, size_t nbytes)
|
||||||
{
|
{
|
||||||
int ret = wait_for_random_bytes();
|
int ret = wait_for_random_bytes();
|
||||||
get_random_bytes(buf, nbytes);
|
get_random_bytes(buf, nbytes);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define declare_get_random_var_wait(var) \
|
#define declare_get_random_var_wait(name, ret_type) \
|
||||||
static inline int get_random_ ## var ## _wait(var *out) { \
|
static inline int get_random_ ## name ## _wait(ret_type *out) { \
|
||||||
int ret = wait_for_random_bytes(); \
|
int ret = wait_for_random_bytes(); \
|
||||||
if (unlikely(ret)) \
|
if (unlikely(ret)) \
|
||||||
return ret; \
|
return ret; \
|
||||||
*out = get_random_ ## var(); \
|
*out = get_random_ ## name(); \
|
||||||
return 0; \
|
return 0; \
|
||||||
}
|
}
|
||||||
declare_get_random_var_wait(u32)
|
declare_get_random_var_wait(u32, u32)
|
||||||
declare_get_random_var_wait(u64)
|
declare_get_random_var_wait(u64, u32)
|
||||||
declare_get_random_var_wait(int)
|
declare_get_random_var_wait(int, unsigned int)
|
||||||
declare_get_random_var_wait(long)
|
declare_get_random_var_wait(long, unsigned long)
|
||||||
#undef declare_get_random_var
|
#undef declare_get_random_var
|
||||||
|
|
||||||
unsigned long randomize_page(unsigned long start, unsigned long range);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This is designed to be standalone for just prandom
|
* This is designed to be standalone for just prandom
|
||||||
* users, but for now we include it from <linux/random.h>
|
* users, but for now we include it from <linux/random.h>
|
||||||
@@ -120,22 +103,10 @@ unsigned long randomize_page(unsigned long start, unsigned long range);
|
|||||||
#ifdef CONFIG_ARCH_RANDOM
|
#ifdef CONFIG_ARCH_RANDOM
|
||||||
# include <asm/archrandom.h>
|
# include <asm/archrandom.h>
|
||||||
#else
|
#else
|
||||||
static inline bool __must_check arch_get_random_long(unsigned long *v)
|
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; }
|
||||||
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; }
|
||||||
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
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -158,4 +129,13 @@ static inline bool __init arch_get_random_long_early(unsigned long *v)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_SMP
|
||||||
|
int random_prepare_cpu(unsigned int cpu);
|
||||||
|
int random_online_cpu(unsigned int cpu);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef MODULE
|
||||||
|
extern const struct file_operations random_fops, urandom_fops;
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* _LINUX_RANDOM_H */
|
#endif /* _LINUX_RANDOM_H */
|
||||||
|
@@ -121,10 +121,12 @@ enum lockdown_reason {
|
|||||||
LOCKDOWN_DEBUGFS,
|
LOCKDOWN_DEBUGFS,
|
||||||
LOCKDOWN_XMON_WR,
|
LOCKDOWN_XMON_WR,
|
||||||
LOCKDOWN_BPF_WRITE_USER,
|
LOCKDOWN_BPF_WRITE_USER,
|
||||||
|
LOCKDOWN_DBG_WRITE_KERNEL,
|
||||||
LOCKDOWN_INTEGRITY_MAX,
|
LOCKDOWN_INTEGRITY_MAX,
|
||||||
LOCKDOWN_KCORE,
|
LOCKDOWN_KCORE,
|
||||||
LOCKDOWN_KPROBES,
|
LOCKDOWN_KPROBES,
|
||||||
LOCKDOWN_BPF_READ,
|
LOCKDOWN_BPF_READ,
|
||||||
|
LOCKDOWN_DBG_READ_KERNEL,
|
||||||
LOCKDOWN_PERF,
|
LOCKDOWN_PERF,
|
||||||
LOCKDOWN_TRACEFS,
|
LOCKDOWN_TRACEFS,
|
||||||
LOCKDOWN_XMON_RW,
|
LOCKDOWN_XMON_RW,
|
||||||
|
@@ -136,4 +136,32 @@ static inline u32 hsiphash(const void *data, size_t len,
|
|||||||
return ___hsiphash_aligned(data, len, key);
|
return ___hsiphash_aligned(data, len, key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* These macros expose the raw SipHash and HalfSipHash permutations.
|
||||||
|
* Do not use them directly! If you think you have a use for them,
|
||||||
|
* be sure to CC the maintainer of this file explaining why.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define SIPHASH_PERMUTATION(a, b, c, d) ( \
|
||||||
|
(a) += (b), (b) = rol64((b), 13), (b) ^= (a), (a) = rol64((a), 32), \
|
||||||
|
(c) += (d), (d) = rol64((d), 16), (d) ^= (c), \
|
||||||
|
(a) += (d), (d) = rol64((d), 21), (d) ^= (a), \
|
||||||
|
(c) += (b), (b) = rol64((b), 17), (b) ^= (c), (c) = rol64((c), 32))
|
||||||
|
|
||||||
|
#define SIPHASH_CONST_0 0x736f6d6570736575ULL
|
||||||
|
#define SIPHASH_CONST_1 0x646f72616e646f6dULL
|
||||||
|
#define SIPHASH_CONST_2 0x6c7967656e657261ULL
|
||||||
|
#define SIPHASH_CONST_3 0x7465646279746573ULL
|
||||||
|
|
||||||
|
#define HSIPHASH_PERMUTATION(a, b, c, d) ( \
|
||||||
|
(a) += (b), (b) = rol32((b), 5), (b) ^= (a), (a) = rol32((a), 16), \
|
||||||
|
(c) += (d), (d) = rol32((d), 8), (d) ^= (c), \
|
||||||
|
(a) += (d), (d) = rol32((d), 7), (d) ^= (a), \
|
||||||
|
(c) += (b), (b) = rol32((b), 13), (b) ^= (c), (c) = rol32((c), 16))
|
||||||
|
|
||||||
|
#define HSIPHASH_CONST_0 0U
|
||||||
|
#define HSIPHASH_CONST_1 0U
|
||||||
|
#define HSIPHASH_CONST_2 0x6c796765U
|
||||||
|
#define HSIPHASH_CONST_3 0x74656462U
|
||||||
|
|
||||||
#endif /* _LINUX_SIPHASH_H */
|
#endif /* _LINUX_SIPHASH_H */
|
||||||
|
@@ -62,6 +62,8 @@
|
|||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/param.h>
|
#include <linux/param.h>
|
||||||
|
|
||||||
|
unsigned long random_get_entropy_fallback(void);
|
||||||
|
|
||||||
#include <asm/timex.h>
|
#include <asm/timex.h>
|
||||||
|
|
||||||
#ifndef random_get_entropy
|
#ifndef random_get_entropy
|
||||||
@@ -74,8 +76,14 @@
|
|||||||
*
|
*
|
||||||
* By default we use get_cycles() for this purpose, but individual
|
* By default we use get_cycles() for this purpose, but individual
|
||||||
* architectures may override this in their asm/timex.h header file.
|
* architectures may override this in their asm/timex.h header file.
|
||||||
|
* If a given arch does not have get_cycles(), then we fallback to
|
||||||
|
* using random_get_entropy_fallback().
|
||||||
*/
|
*/
|
||||||
#define random_get_entropy() get_cycles()
|
#ifdef get_cycles
|
||||||
|
#define random_get_entropy() ((unsigned long)get_cycles())
|
||||||
|
#else
|
||||||
|
#define random_get_entropy() random_get_entropy_fallback()
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@@ -419,7 +419,7 @@ static inline void sk_rcv_saddr_set(struct sock *sk, __be32 addr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int __inet_hash_connect(struct inet_timewait_death_row *death_row,
|
int __inet_hash_connect(struct inet_timewait_death_row *death_row,
|
||||||
struct sock *sk, u32 port_offset,
|
struct sock *sk, u64 port_offset,
|
||||||
int (*check_established)(struct inet_timewait_death_row *,
|
int (*check_established)(struct inet_timewait_death_row *,
|
||||||
struct sock *, __u16,
|
struct sock *, __u16,
|
||||||
struct inet_timewait_sock **));
|
struct inet_timewait_sock **));
|
||||||
|
@@ -4,8 +4,8 @@
|
|||||||
|
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
|
|
||||||
u32 secure_ipv4_port_ephemeral(__be32 saddr, __be32 daddr, __be16 dport);
|
u64 secure_ipv4_port_ephemeral(__be32 saddr, __be32 daddr, __be16 dport);
|
||||||
u32 secure_ipv6_port_ephemeral(const __be32 *saddr, const __be32 *daddr,
|
u64 secure_ipv6_port_ephemeral(const __be32 *saddr, const __be32 *daddr,
|
||||||
__be16 dport);
|
__be16 dport);
|
||||||
u32 secure_tcp_seq(__be32 saddr, __be32 daddr,
|
u32 secure_tcp_seq(__be32 saddr, __be32 daddr,
|
||||||
__be16 sport, __be16 dport);
|
__be16 sport, __be16 dport);
|
||||||
|
@@ -1,330 +0,0 @@
|
|||||||
/* SPDX-License-Identifier: GPL-2.0 */
|
|
||||||
#undef TRACE_SYSTEM
|
|
||||||
#define TRACE_SYSTEM random
|
|
||||||
|
|
||||||
#if !defined(_TRACE_RANDOM_H) || defined(TRACE_HEADER_MULTI_READ)
|
|
||||||
#define _TRACE_RANDOM_H
|
|
||||||
|
|
||||||
#include <linux/writeback.h>
|
|
||||||
#include <linux/tracepoint.h>
|
|
||||||
|
|
||||||
TRACE_EVENT(add_device_randomness,
|
|
||||||
TP_PROTO(int bytes, unsigned long IP),
|
|
||||||
|
|
||||||
TP_ARGS(bytes, IP),
|
|
||||||
|
|
||||||
TP_STRUCT__entry(
|
|
||||||
__field( int, bytes )
|
|
||||||
__field(unsigned long, IP )
|
|
||||||
),
|
|
||||||
|
|
||||||
TP_fast_assign(
|
|
||||||
__entry->bytes = bytes;
|
|
||||||
__entry->IP = IP;
|
|
||||||
),
|
|
||||||
|
|
||||||
TP_printk("bytes %d caller %pS",
|
|
||||||
__entry->bytes, (void *)__entry->IP)
|
|
||||||
);
|
|
||||||
|
|
||||||
DECLARE_EVENT_CLASS(random__mix_pool_bytes,
|
|
||||||
TP_PROTO(const char *pool_name, int bytes, unsigned long IP),
|
|
||||||
|
|
||||||
TP_ARGS(pool_name, bytes, IP),
|
|
||||||
|
|
||||||
TP_STRUCT__entry(
|
|
||||||
__field( const char *, pool_name )
|
|
||||||
__field( int, bytes )
|
|
||||||
__field(unsigned long, IP )
|
|
||||||
),
|
|
||||||
|
|
||||||
TP_fast_assign(
|
|
||||||
__entry->pool_name = pool_name;
|
|
||||||
__entry->bytes = bytes;
|
|
||||||
__entry->IP = IP;
|
|
||||||
),
|
|
||||||
|
|
||||||
TP_printk("%s pool: bytes %d caller %pS",
|
|
||||||
__entry->pool_name, __entry->bytes, (void *)__entry->IP)
|
|
||||||
);
|
|
||||||
|
|
||||||
DEFINE_EVENT(random__mix_pool_bytes, mix_pool_bytes,
|
|
||||||
TP_PROTO(const char *pool_name, int bytes, unsigned long IP),
|
|
||||||
|
|
||||||
TP_ARGS(pool_name, bytes, IP)
|
|
||||||
);
|
|
||||||
|
|
||||||
DEFINE_EVENT(random__mix_pool_bytes, mix_pool_bytes_nolock,
|
|
||||||
TP_PROTO(const char *pool_name, int bytes, unsigned long IP),
|
|
||||||
|
|
||||||
TP_ARGS(pool_name, bytes, IP)
|
|
||||||
);
|
|
||||||
|
|
||||||
TRACE_EVENT(credit_entropy_bits,
|
|
||||||
TP_PROTO(const char *pool_name, int bits, int entropy_count,
|
|
||||||
unsigned long IP),
|
|
||||||
|
|
||||||
TP_ARGS(pool_name, bits, entropy_count, IP),
|
|
||||||
|
|
||||||
TP_STRUCT__entry(
|
|
||||||
__field( const char *, pool_name )
|
|
||||||
__field( int, bits )
|
|
||||||
__field( int, entropy_count )
|
|
||||||
__field(unsigned long, IP )
|
|
||||||
),
|
|
||||||
|
|
||||||
TP_fast_assign(
|
|
||||||
__entry->pool_name = pool_name;
|
|
||||||
__entry->bits = bits;
|
|
||||||
__entry->entropy_count = entropy_count;
|
|
||||||
__entry->IP = IP;
|
|
||||||
),
|
|
||||||
|
|
||||||
TP_printk("%s pool: bits %d entropy_count %d caller %pS",
|
|
||||||
__entry->pool_name, __entry->bits,
|
|
||||||
__entry->entropy_count, (void *)__entry->IP)
|
|
||||||
);
|
|
||||||
|
|
||||||
TRACE_EVENT(push_to_pool,
|
|
||||||
TP_PROTO(const char *pool_name, int pool_bits, int input_bits),
|
|
||||||
|
|
||||||
TP_ARGS(pool_name, pool_bits, input_bits),
|
|
||||||
|
|
||||||
TP_STRUCT__entry(
|
|
||||||
__field( const char *, pool_name )
|
|
||||||
__field( int, pool_bits )
|
|
||||||
__field( int, input_bits )
|
|
||||||
),
|
|
||||||
|
|
||||||
TP_fast_assign(
|
|
||||||
__entry->pool_name = pool_name;
|
|
||||||
__entry->pool_bits = pool_bits;
|
|
||||||
__entry->input_bits = input_bits;
|
|
||||||
),
|
|
||||||
|
|
||||||
TP_printk("%s: pool_bits %d input_pool_bits %d",
|
|
||||||
__entry->pool_name, __entry->pool_bits,
|
|
||||||
__entry->input_bits)
|
|
||||||
);
|
|
||||||
|
|
||||||
TRACE_EVENT(debit_entropy,
|
|
||||||
TP_PROTO(const char *pool_name, int debit_bits),
|
|
||||||
|
|
||||||
TP_ARGS(pool_name, debit_bits),
|
|
||||||
|
|
||||||
TP_STRUCT__entry(
|
|
||||||
__field( const char *, pool_name )
|
|
||||||
__field( int, debit_bits )
|
|
||||||
),
|
|
||||||
|
|
||||||
TP_fast_assign(
|
|
||||||
__entry->pool_name = pool_name;
|
|
||||||
__entry->debit_bits = debit_bits;
|
|
||||||
),
|
|
||||||
|
|
||||||
TP_printk("%s: debit_bits %d", __entry->pool_name,
|
|
||||||
__entry->debit_bits)
|
|
||||||
);
|
|
||||||
|
|
||||||
TRACE_EVENT(add_input_randomness,
|
|
||||||
TP_PROTO(int input_bits),
|
|
||||||
|
|
||||||
TP_ARGS(input_bits),
|
|
||||||
|
|
||||||
TP_STRUCT__entry(
|
|
||||||
__field( int, input_bits )
|
|
||||||
),
|
|
||||||
|
|
||||||
TP_fast_assign(
|
|
||||||
__entry->input_bits = input_bits;
|
|
||||||
),
|
|
||||||
|
|
||||||
TP_printk("input_pool_bits %d", __entry->input_bits)
|
|
||||||
);
|
|
||||||
|
|
||||||
TRACE_EVENT(add_disk_randomness,
|
|
||||||
TP_PROTO(dev_t dev, int input_bits),
|
|
||||||
|
|
||||||
TP_ARGS(dev, input_bits),
|
|
||||||
|
|
||||||
TP_STRUCT__entry(
|
|
||||||
__field( dev_t, dev )
|
|
||||||
__field( int, input_bits )
|
|
||||||
),
|
|
||||||
|
|
||||||
TP_fast_assign(
|
|
||||||
__entry->dev = dev;
|
|
||||||
__entry->input_bits = input_bits;
|
|
||||||
),
|
|
||||||
|
|
||||||
TP_printk("dev %d,%d input_pool_bits %d", MAJOR(__entry->dev),
|
|
||||||
MINOR(__entry->dev), __entry->input_bits)
|
|
||||||
);
|
|
||||||
|
|
||||||
TRACE_EVENT(xfer_secondary_pool,
|
|
||||||
TP_PROTO(const char *pool_name, int xfer_bits, int request_bits,
|
|
||||||
int pool_entropy, int input_entropy),
|
|
||||||
|
|
||||||
TP_ARGS(pool_name, xfer_bits, request_bits, pool_entropy,
|
|
||||||
input_entropy),
|
|
||||||
|
|
||||||
TP_STRUCT__entry(
|
|
||||||
__field( const char *, pool_name )
|
|
||||||
__field( int, xfer_bits )
|
|
||||||
__field( int, request_bits )
|
|
||||||
__field( int, pool_entropy )
|
|
||||||
__field( int, input_entropy )
|
|
||||||
),
|
|
||||||
|
|
||||||
TP_fast_assign(
|
|
||||||
__entry->pool_name = pool_name;
|
|
||||||
__entry->xfer_bits = xfer_bits;
|
|
||||||
__entry->request_bits = request_bits;
|
|
||||||
__entry->pool_entropy = pool_entropy;
|
|
||||||
__entry->input_entropy = input_entropy;
|
|
||||||
),
|
|
||||||
|
|
||||||
TP_printk("pool %s xfer_bits %d request_bits %d pool_entropy %d "
|
|
||||||
"input_entropy %d", __entry->pool_name, __entry->xfer_bits,
|
|
||||||
__entry->request_bits, __entry->pool_entropy,
|
|
||||||
__entry->input_entropy)
|
|
||||||
);
|
|
||||||
|
|
||||||
DECLARE_EVENT_CLASS(random__get_random_bytes,
|
|
||||||
TP_PROTO(int nbytes, unsigned long IP),
|
|
||||||
|
|
||||||
TP_ARGS(nbytes, IP),
|
|
||||||
|
|
||||||
TP_STRUCT__entry(
|
|
||||||
__field( int, nbytes )
|
|
||||||
__field(unsigned long, IP )
|
|
||||||
),
|
|
||||||
|
|
||||||
TP_fast_assign(
|
|
||||||
__entry->nbytes = nbytes;
|
|
||||||
__entry->IP = IP;
|
|
||||||
),
|
|
||||||
|
|
||||||
TP_printk("nbytes %d caller %pS", __entry->nbytes, (void *)__entry->IP)
|
|
||||||
);
|
|
||||||
|
|
||||||
DEFINE_EVENT(random__get_random_bytes, get_random_bytes,
|
|
||||||
TP_PROTO(int nbytes, unsigned long IP),
|
|
||||||
|
|
||||||
TP_ARGS(nbytes, IP)
|
|
||||||
);
|
|
||||||
|
|
||||||
DEFINE_EVENT(random__get_random_bytes, get_random_bytes_arch,
|
|
||||||
TP_PROTO(int nbytes, unsigned long IP),
|
|
||||||
|
|
||||||
TP_ARGS(nbytes, IP)
|
|
||||||
);
|
|
||||||
|
|
||||||
DECLARE_EVENT_CLASS(random__extract_entropy,
|
|
||||||
TP_PROTO(const char *pool_name, int nbytes, int entropy_count,
|
|
||||||
unsigned long IP),
|
|
||||||
|
|
||||||
TP_ARGS(pool_name, nbytes, entropy_count, IP),
|
|
||||||
|
|
||||||
TP_STRUCT__entry(
|
|
||||||
__field( const char *, pool_name )
|
|
||||||
__field( int, nbytes )
|
|
||||||
__field( int, entropy_count )
|
|
||||||
__field(unsigned long, IP )
|
|
||||||
),
|
|
||||||
|
|
||||||
TP_fast_assign(
|
|
||||||
__entry->pool_name = pool_name;
|
|
||||||
__entry->nbytes = nbytes;
|
|
||||||
__entry->entropy_count = entropy_count;
|
|
||||||
__entry->IP = IP;
|
|
||||||
),
|
|
||||||
|
|
||||||
TP_printk("%s pool: nbytes %d entropy_count %d caller %pS",
|
|
||||||
__entry->pool_name, __entry->nbytes, __entry->entropy_count,
|
|
||||||
(void *)__entry->IP)
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
DEFINE_EVENT(random__extract_entropy, extract_entropy,
|
|
||||||
TP_PROTO(const char *pool_name, int nbytes, int entropy_count,
|
|
||||||
unsigned long IP),
|
|
||||||
|
|
||||||
TP_ARGS(pool_name, nbytes, entropy_count, IP)
|
|
||||||
);
|
|
||||||
|
|
||||||
DEFINE_EVENT(random__extract_entropy, extract_entropy_user,
|
|
||||||
TP_PROTO(const char *pool_name, int nbytes, int entropy_count,
|
|
||||||
unsigned long IP),
|
|
||||||
|
|
||||||
TP_ARGS(pool_name, nbytes, entropy_count, IP)
|
|
||||||
);
|
|
||||||
|
|
||||||
TRACE_EVENT(random_read,
|
|
||||||
TP_PROTO(int got_bits, int need_bits, int pool_left, int input_left),
|
|
||||||
|
|
||||||
TP_ARGS(got_bits, need_bits, pool_left, input_left),
|
|
||||||
|
|
||||||
TP_STRUCT__entry(
|
|
||||||
__field( int, got_bits )
|
|
||||||
__field( int, need_bits )
|
|
||||||
__field( int, pool_left )
|
|
||||||
__field( int, input_left )
|
|
||||||
),
|
|
||||||
|
|
||||||
TP_fast_assign(
|
|
||||||
__entry->got_bits = got_bits;
|
|
||||||
__entry->need_bits = need_bits;
|
|
||||||
__entry->pool_left = pool_left;
|
|
||||||
__entry->input_left = input_left;
|
|
||||||
),
|
|
||||||
|
|
||||||
TP_printk("got_bits %d still_needed_bits %d "
|
|
||||||
"blocking_pool_entropy_left %d input_entropy_left %d",
|
|
||||||
__entry->got_bits, __entry->got_bits, __entry->pool_left,
|
|
||||||
__entry->input_left)
|
|
||||||
);
|
|
||||||
|
|
||||||
TRACE_EVENT(urandom_read,
|
|
||||||
TP_PROTO(int got_bits, int pool_left, int input_left),
|
|
||||||
|
|
||||||
TP_ARGS(got_bits, pool_left, input_left),
|
|
||||||
|
|
||||||
TP_STRUCT__entry(
|
|
||||||
__field( int, got_bits )
|
|
||||||
__field( int, pool_left )
|
|
||||||
__field( int, input_left )
|
|
||||||
),
|
|
||||||
|
|
||||||
TP_fast_assign(
|
|
||||||
__entry->got_bits = got_bits;
|
|
||||||
__entry->pool_left = pool_left;
|
|
||||||
__entry->input_left = input_left;
|
|
||||||
),
|
|
||||||
|
|
||||||
TP_printk("got_bits %d nonblocking_pool_entropy_left %d "
|
|
||||||
"input_entropy_left %d", __entry->got_bits,
|
|
||||||
__entry->pool_left, __entry->input_left)
|
|
||||||
);
|
|
||||||
|
|
||||||
TRACE_EVENT(prandom_u32,
|
|
||||||
|
|
||||||
TP_PROTO(unsigned int ret),
|
|
||||||
|
|
||||||
TP_ARGS(ret),
|
|
||||||
|
|
||||||
TP_STRUCT__entry(
|
|
||||||
__field( unsigned int, ret)
|
|
||||||
),
|
|
||||||
|
|
||||||
TP_fast_assign(
|
|
||||||
__entry->ret = ret;
|
|
||||||
),
|
|
||||||
|
|
||||||
TP_printk("ret=%u" , __entry->ret)
|
|
||||||
);
|
|
||||||
|
|
||||||
#endif /* _TRACE_RANDOM_H */
|
|
||||||
|
|
||||||
/* This part must be outside protection */
|
|
||||||
#include <trace/define_trace.h>
|
|
13
init/main.c
13
init/main.c
@@ -947,21 +947,18 @@ asmlinkage __visible void __init __no_sanitize_address start_kernel(void)
|
|||||||
softirq_init();
|
softirq_init();
|
||||||
timekeeping_init();
|
timekeeping_init();
|
||||||
kfence_init();
|
kfence_init();
|
||||||
|
time_init();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* For best initial stack canary entropy, prepare it after:
|
* For best initial stack canary entropy, prepare it after:
|
||||||
* - setup_arch() for any UEFI RNG entropy and boot cmdline access
|
* - setup_arch() for any UEFI RNG entropy and boot cmdline access
|
||||||
* - timekeeping_init() for ktime entropy used in rand_initialize()
|
* - timekeeping_init() for ktime entropy used in random_init()
|
||||||
* - rand_initialize() to get any arch-specific entropy like RDRAND
|
* - time_init() for making random_get_entropy() work on some platforms
|
||||||
* - add_latent_entropy() to get any latent entropy
|
* - random_init() to initialize the RNG from from early entropy sources
|
||||||
* - adding command line entropy
|
|
||||||
*/
|
*/
|
||||||
rand_initialize();
|
random_init(command_line);
|
||||||
add_latent_entropy();
|
|
||||||
add_device_randomness(command_line, strlen(command_line));
|
|
||||||
boot_init_stack_canary();
|
boot_init_stack_canary();
|
||||||
|
|
||||||
time_init();
|
|
||||||
perf_event_init();
|
perf_event_init();
|
||||||
profile_init();
|
profile_init();
|
||||||
call_function_init();
|
call_function_init();
|
||||||
|
11
kernel/cpu.c
11
kernel/cpu.c
@@ -34,6 +34,7 @@
|
|||||||
#include <linux/scs.h>
|
#include <linux/scs.h>
|
||||||
#include <linux/percpu-rwsem.h>
|
#include <linux/percpu-rwsem.h>
|
||||||
#include <linux/cpuset.h>
|
#include <linux/cpuset.h>
|
||||||
|
#include <linux/random.h>
|
||||||
#include <uapi/linux/sched/types.h>
|
#include <uapi/linux/sched/types.h>
|
||||||
|
|
||||||
#include <trace/events/power.h>
|
#include <trace/events/power.h>
|
||||||
@@ -1882,6 +1883,11 @@ static struct cpuhp_step cpuhp_hp_states[] = {
|
|||||||
.startup.single = perf_event_init_cpu,
|
.startup.single = perf_event_init_cpu,
|
||||||
.teardown.single = perf_event_exit_cpu,
|
.teardown.single = perf_event_exit_cpu,
|
||||||
},
|
},
|
||||||
|
[CPUHP_RANDOM_PREPARE] = {
|
||||||
|
.name = "random:prepare",
|
||||||
|
.startup.single = random_prepare_cpu,
|
||||||
|
.teardown.single = NULL,
|
||||||
|
},
|
||||||
[CPUHP_WORKQUEUE_PREP] = {
|
[CPUHP_WORKQUEUE_PREP] = {
|
||||||
.name = "workqueue:prepare",
|
.name = "workqueue:prepare",
|
||||||
.startup.single = workqueue_prepare_cpu,
|
.startup.single = workqueue_prepare_cpu,
|
||||||
@@ -1998,6 +2004,11 @@ static struct cpuhp_step cpuhp_hp_states[] = {
|
|||||||
.startup.single = workqueue_online_cpu,
|
.startup.single = workqueue_online_cpu,
|
||||||
.teardown.single = workqueue_offline_cpu,
|
.teardown.single = workqueue_offline_cpu,
|
||||||
},
|
},
|
||||||
|
[CPUHP_AP_RANDOM_ONLINE] = {
|
||||||
|
.name = "random:online",
|
||||||
|
.startup.single = random_online_cpu,
|
||||||
|
.teardown.single = NULL,
|
||||||
|
},
|
||||||
[CPUHP_AP_RCUTREE_ONLINE] = {
|
[CPUHP_AP_RCUTREE_ONLINE] = {
|
||||||
.name = "RCU/tree:online",
|
.name = "RCU/tree:online",
|
||||||
.startup.single = rcutree_online_cpu,
|
.startup.single = rcutree_online_cpu,
|
||||||
|
@@ -56,6 +56,7 @@
|
|||||||
#include <linux/vmacache.h>
|
#include <linux/vmacache.h>
|
||||||
#include <linux/rcupdate.h>
|
#include <linux/rcupdate.h>
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
|
#include <linux/security.h>
|
||||||
|
|
||||||
#include <asm/cacheflush.h>
|
#include <asm/cacheflush.h>
|
||||||
#include <asm/byteorder.h>
|
#include <asm/byteorder.h>
|
||||||
@@ -756,6 +757,29 @@ cpu_master_loop:
|
|||||||
continue;
|
continue;
|
||||||
kgdb_connected = 0;
|
kgdb_connected = 0;
|
||||||
} else {
|
} else {
|
||||||
|
/*
|
||||||
|
* This is a brutal way to interfere with the debugger
|
||||||
|
* and prevent gdb being used to poke at kernel memory.
|
||||||
|
* This could cause trouble if lockdown is applied when
|
||||||
|
* there is already an active gdb session. For now the
|
||||||
|
* answer is simply "don't do that". Typically lockdown
|
||||||
|
* *will* be applied before the debug core gets started
|
||||||
|
* so only developers using kgdb for fairly advanced
|
||||||
|
* early kernel debug can be biten by this. Hopefully
|
||||||
|
* they are sophisticated enough to take care of
|
||||||
|
* themselves, especially with help from the lockdown
|
||||||
|
* message printed on the console!
|
||||||
|
*/
|
||||||
|
if (security_locked_down(LOCKDOWN_DBG_WRITE_KERNEL)) {
|
||||||
|
if (IS_ENABLED(CONFIG_KGDB_KDB)) {
|
||||||
|
/* Switch back to kdb if possible... */
|
||||||
|
dbg_kdb_mode = 1;
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
/* ... otherwise just bail */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
error = gdb_serial_stub(ks);
|
error = gdb_serial_stub(ks);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -45,6 +45,7 @@
|
|||||||
#include <linux/proc_fs.h>
|
#include <linux/proc_fs.h>
|
||||||
#include <linux/uaccess.h>
|
#include <linux/uaccess.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
|
#include <linux/security.h>
|
||||||
#include "kdb_private.h"
|
#include "kdb_private.h"
|
||||||
|
|
||||||
#undef MODULE_PARAM_PREFIX
|
#undef MODULE_PARAM_PREFIX
|
||||||
@@ -197,10 +198,62 @@ struct task_struct *kdb_curr_task(int cpu)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check whether the flags of the current command and the permissions
|
* Update the permissions flags (kdb_cmd_enabled) to match the
|
||||||
* of the kdb console has allow a command to be run.
|
* current lockdown state.
|
||||||
|
*
|
||||||
|
* Within this function the calls to security_locked_down() are "lazy". We
|
||||||
|
* avoid calling them if the current value of kdb_cmd_enabled already excludes
|
||||||
|
* flags that might be subject to lockdown. Additionally we deliberately check
|
||||||
|
* the lockdown flags independently (even though read lockdown implies write
|
||||||
|
* lockdown) since that results in both simpler code and clearer messages to
|
||||||
|
* the user on first-time debugger entry.
|
||||||
|
*
|
||||||
|
* The permission masks during a read+write lockdown permits the following
|
||||||
|
* flags: INSPECT, SIGNAL, REBOOT (and ALWAYS_SAFE).
|
||||||
|
*
|
||||||
|
* The INSPECT commands are not blocked during lockdown because they are
|
||||||
|
* not arbitrary memory reads. INSPECT covers the backtrace family (sometimes
|
||||||
|
* forcing them to have no arguments) and lsmod. These commands do expose
|
||||||
|
* some kernel state but do not allow the developer seated at the console to
|
||||||
|
* choose what state is reported. SIGNAL and REBOOT should not be controversial,
|
||||||
|
* given these are allowed for root during lockdown already.
|
||||||
*/
|
*/
|
||||||
static inline bool kdb_check_flags(kdb_cmdflags_t flags, int permissions,
|
static void kdb_check_for_lockdown(void)
|
||||||
|
{
|
||||||
|
const int write_flags = KDB_ENABLE_MEM_WRITE |
|
||||||
|
KDB_ENABLE_REG_WRITE |
|
||||||
|
KDB_ENABLE_FLOW_CTRL;
|
||||||
|
const int read_flags = KDB_ENABLE_MEM_READ |
|
||||||
|
KDB_ENABLE_REG_READ;
|
||||||
|
|
||||||
|
bool need_to_lockdown_write = false;
|
||||||
|
bool need_to_lockdown_read = false;
|
||||||
|
|
||||||
|
if (kdb_cmd_enabled & (KDB_ENABLE_ALL | write_flags))
|
||||||
|
need_to_lockdown_write =
|
||||||
|
security_locked_down(LOCKDOWN_DBG_WRITE_KERNEL);
|
||||||
|
|
||||||
|
if (kdb_cmd_enabled & (KDB_ENABLE_ALL | read_flags))
|
||||||
|
need_to_lockdown_read =
|
||||||
|
security_locked_down(LOCKDOWN_DBG_READ_KERNEL);
|
||||||
|
|
||||||
|
/* De-compose KDB_ENABLE_ALL if required */
|
||||||
|
if (need_to_lockdown_write || need_to_lockdown_read)
|
||||||
|
if (kdb_cmd_enabled & KDB_ENABLE_ALL)
|
||||||
|
kdb_cmd_enabled = KDB_ENABLE_MASK & ~KDB_ENABLE_ALL;
|
||||||
|
|
||||||
|
if (need_to_lockdown_write)
|
||||||
|
kdb_cmd_enabled &= ~write_flags;
|
||||||
|
|
||||||
|
if (need_to_lockdown_read)
|
||||||
|
kdb_cmd_enabled &= ~read_flags;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check whether the flags of the current command, the permissions of the kdb
|
||||||
|
* console and the lockdown state allow a command to be run.
|
||||||
|
*/
|
||||||
|
static bool kdb_check_flags(kdb_cmdflags_t flags, int permissions,
|
||||||
bool no_args)
|
bool no_args)
|
||||||
{
|
{
|
||||||
/* permissions comes from userspace so needs massaging slightly */
|
/* permissions comes from userspace so needs massaging slightly */
|
||||||
@@ -1194,6 +1247,9 @@ static int kdb_local(kdb_reason_t reason, int error, struct pt_regs *regs,
|
|||||||
kdb_curr_task(raw_smp_processor_id());
|
kdb_curr_task(raw_smp_processor_id());
|
||||||
|
|
||||||
KDB_DEBUG_STATE("kdb_local 1", reason);
|
KDB_DEBUG_STATE("kdb_local 1", reason);
|
||||||
|
|
||||||
|
kdb_check_for_lockdown();
|
||||||
|
|
||||||
kdb_go_count = 0;
|
kdb_go_count = 0;
|
||||||
if (reason == KDB_REASON_DEBUG) {
|
if (reason == KDB_REASON_DEBUG) {
|
||||||
/* special case below */
|
/* special case below */
|
||||||
|
@@ -195,7 +195,7 @@ irqreturn_t handle_irq_event_percpu(struct irq_desc *desc)
|
|||||||
|
|
||||||
retval = __handle_irq_event_percpu(desc, &flags);
|
retval = __handle_irq_event_percpu(desc, &flags);
|
||||||
|
|
||||||
add_interrupt_randomness(desc->irq_data.irq, flags);
|
add_interrupt_randomness(desc->irq_data.irq);
|
||||||
|
|
||||||
if (!noirqdebug)
|
if (!noirqdebug)
|
||||||
note_interrupt(desc, retval);
|
note_interrupt(desc, retval);
|
||||||
|
@@ -17,6 +17,7 @@
|
|||||||
#include <linux/clocksource.h>
|
#include <linux/clocksource.h>
|
||||||
#include <linux/jiffies.h>
|
#include <linux/jiffies.h>
|
||||||
#include <linux/time.h>
|
#include <linux/time.h>
|
||||||
|
#include <linux/timex.h>
|
||||||
#include <linux/tick.h>
|
#include <linux/tick.h>
|
||||||
#include <linux/stop_machine.h>
|
#include <linux/stop_machine.h>
|
||||||
#include <linux/pvclock_gtod.h>
|
#include <linux/pvclock_gtod.h>
|
||||||
@@ -2378,6 +2379,20 @@ static int timekeeping_validate_timex(const struct __kernel_timex *txc)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* random_get_entropy_fallback - Returns the raw clock source value,
|
||||||
|
* used by random.c for platforms with no valid random_get_entropy().
|
||||||
|
*/
|
||||||
|
unsigned long random_get_entropy_fallback(void)
|
||||||
|
{
|
||||||
|
struct tk_read_base *tkr = &tk_core.timekeeper.tkr_mono;
|
||||||
|
struct clocksource *clock = READ_ONCE(tkr->clock);
|
||||||
|
|
||||||
|
if (unlikely(timekeeping_suspended || !clock))
|
||||||
|
return 0;
|
||||||
|
return clock->read(clock);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(random_get_entropy_fallback);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* do_adjtimex() - Accessor function to NTP __do_adjtimex function
|
* do_adjtimex() - Accessor function to NTP __do_adjtimex function
|
||||||
|
@@ -1427,8 +1427,7 @@ config WARN_ALL_UNSEEDED_RANDOM
|
|||||||
so architecture maintainers really need to do what they can
|
so architecture maintainers really need to do what they can
|
||||||
to get the CRNG seeded sooner after the system is booted.
|
to get the CRNG seeded sooner after the system is booted.
|
||||||
However, since users cannot do anything actionable to
|
However, since users cannot do anything actionable to
|
||||||
address this, by default the kernel will issue only a single
|
address this, by default this option is disabled.
|
||||||
warning for the first use of unseeded randomness.
|
|
||||||
|
|
||||||
Say Y here if you want to receive warnings for all uses of
|
Say Y here if you want to receive warnings for all uses of
|
||||||
unseeded randomness. This will be of use primarily for
|
unseeded randomness. This will be of use primarily for
|
||||||
|
@@ -1,7 +1,5 @@
|
|||||||
# SPDX-License-Identifier: GPL-2.0
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
|
|
||||||
comment "Crypto library routines"
|
|
||||||
|
|
||||||
config CRYPTO_LIB_AES
|
config CRYPTO_LIB_AES
|
||||||
tristate
|
tristate
|
||||||
|
|
||||||
@@ -9,14 +7,14 @@ config CRYPTO_LIB_ARC4
|
|||||||
tristate
|
tristate
|
||||||
|
|
||||||
config CRYPTO_ARCH_HAVE_LIB_BLAKE2S
|
config CRYPTO_ARCH_HAVE_LIB_BLAKE2S
|
||||||
tristate
|
bool
|
||||||
help
|
help
|
||||||
Declares whether the architecture provides an arch-specific
|
Declares whether the architecture provides an arch-specific
|
||||||
accelerated implementation of the Blake2s library interface,
|
accelerated implementation of the Blake2s library interface,
|
||||||
either builtin or as a module.
|
either builtin or as a module.
|
||||||
|
|
||||||
config CRYPTO_LIB_BLAKE2S_GENERIC
|
config CRYPTO_LIB_BLAKE2S_GENERIC
|
||||||
tristate
|
def_bool !CRYPTO_ARCH_HAVE_LIB_BLAKE2S
|
||||||
help
|
help
|
||||||
This symbol can be depended upon by arch implementations of the
|
This symbol can be depended upon by arch implementations of the
|
||||||
Blake2s library interface that require the generic code as a
|
Blake2s library interface that require the generic code as a
|
||||||
@@ -24,15 +22,6 @@ config CRYPTO_LIB_BLAKE2S_GENERIC
|
|||||||
implementation is enabled, this implementation serves the users
|
implementation is enabled, this implementation serves the users
|
||||||
of CRYPTO_LIB_BLAKE2S.
|
of CRYPTO_LIB_BLAKE2S.
|
||||||
|
|
||||||
config CRYPTO_LIB_BLAKE2S
|
|
||||||
tristate "BLAKE2s hash function library"
|
|
||||||
depends on CRYPTO_ARCH_HAVE_LIB_BLAKE2S || !CRYPTO_ARCH_HAVE_LIB_BLAKE2S
|
|
||||||
select CRYPTO_LIB_BLAKE2S_GENERIC if CRYPTO_ARCH_HAVE_LIB_BLAKE2S=n
|
|
||||||
help
|
|
||||||
Enable the Blake2s library interface. This interface may be fulfilled
|
|
||||||
by either the generic implementation or an arch-specific one, if one
|
|
||||||
is available and enabled.
|
|
||||||
|
|
||||||
config CRYPTO_ARCH_HAVE_LIB_CHACHA
|
config CRYPTO_ARCH_HAVE_LIB_CHACHA
|
||||||
tristate
|
tristate
|
||||||
help
|
help
|
||||||
@@ -51,7 +40,7 @@ config CRYPTO_LIB_CHACHA_GENERIC
|
|||||||
of CRYPTO_LIB_CHACHA.
|
of CRYPTO_LIB_CHACHA.
|
||||||
|
|
||||||
config CRYPTO_LIB_CHACHA
|
config CRYPTO_LIB_CHACHA
|
||||||
tristate "ChaCha library interface"
|
tristate
|
||||||
depends on CRYPTO_ARCH_HAVE_LIB_CHACHA || !CRYPTO_ARCH_HAVE_LIB_CHACHA
|
depends on CRYPTO_ARCH_HAVE_LIB_CHACHA || !CRYPTO_ARCH_HAVE_LIB_CHACHA
|
||||||
select CRYPTO_LIB_CHACHA_GENERIC if CRYPTO_ARCH_HAVE_LIB_CHACHA=n
|
select CRYPTO_LIB_CHACHA_GENERIC if CRYPTO_ARCH_HAVE_LIB_CHACHA=n
|
||||||
help
|
help
|
||||||
@@ -76,7 +65,7 @@ config CRYPTO_LIB_CURVE25519_GENERIC
|
|||||||
of CRYPTO_LIB_CURVE25519.
|
of CRYPTO_LIB_CURVE25519.
|
||||||
|
|
||||||
config CRYPTO_LIB_CURVE25519
|
config CRYPTO_LIB_CURVE25519
|
||||||
tristate "Curve25519 scalar multiplication library"
|
tristate
|
||||||
depends on CRYPTO_ARCH_HAVE_LIB_CURVE25519 || !CRYPTO_ARCH_HAVE_LIB_CURVE25519
|
depends on CRYPTO_ARCH_HAVE_LIB_CURVE25519 || !CRYPTO_ARCH_HAVE_LIB_CURVE25519
|
||||||
select CRYPTO_LIB_CURVE25519_GENERIC if CRYPTO_ARCH_HAVE_LIB_CURVE25519=n
|
select CRYPTO_LIB_CURVE25519_GENERIC if CRYPTO_ARCH_HAVE_LIB_CURVE25519=n
|
||||||
help
|
help
|
||||||
@@ -111,7 +100,7 @@ config CRYPTO_LIB_POLY1305_GENERIC
|
|||||||
of CRYPTO_LIB_POLY1305.
|
of CRYPTO_LIB_POLY1305.
|
||||||
|
|
||||||
config CRYPTO_LIB_POLY1305
|
config CRYPTO_LIB_POLY1305
|
||||||
tristate "Poly1305 library interface"
|
tristate
|
||||||
depends on CRYPTO_ARCH_HAVE_LIB_POLY1305 || !CRYPTO_ARCH_HAVE_LIB_POLY1305
|
depends on CRYPTO_ARCH_HAVE_LIB_POLY1305 || !CRYPTO_ARCH_HAVE_LIB_POLY1305
|
||||||
select CRYPTO_LIB_POLY1305_GENERIC if CRYPTO_ARCH_HAVE_LIB_POLY1305=n
|
select CRYPTO_LIB_POLY1305_GENERIC if CRYPTO_ARCH_HAVE_LIB_POLY1305=n
|
||||||
help
|
help
|
||||||
@@ -120,7 +109,7 @@ config CRYPTO_LIB_POLY1305
|
|||||||
is available and enabled.
|
is available and enabled.
|
||||||
|
|
||||||
config CRYPTO_LIB_CHACHA20POLY1305
|
config CRYPTO_LIB_CHACHA20POLY1305
|
||||||
tristate "ChaCha20-Poly1305 AEAD support (8-byte nonce library version)"
|
tristate
|
||||||
depends on CRYPTO_ARCH_HAVE_LIB_CHACHA || !CRYPTO_ARCH_HAVE_LIB_CHACHA
|
depends on CRYPTO_ARCH_HAVE_LIB_CHACHA || !CRYPTO_ARCH_HAVE_LIB_CHACHA
|
||||||
depends on CRYPTO_ARCH_HAVE_LIB_POLY1305 || !CRYPTO_ARCH_HAVE_LIB_POLY1305
|
depends on CRYPTO_ARCH_HAVE_LIB_POLY1305 || !CRYPTO_ARCH_HAVE_LIB_POLY1305
|
||||||
select CRYPTO_LIB_CHACHA
|
select CRYPTO_LIB_CHACHA
|
||||||
|
@@ -10,11 +10,10 @@ libaes-y := aes.o
|
|||||||
obj-$(CONFIG_CRYPTO_LIB_ARC4) += libarc4.o
|
obj-$(CONFIG_CRYPTO_LIB_ARC4) += libarc4.o
|
||||||
libarc4-y := arc4.o
|
libarc4-y := arc4.o
|
||||||
|
|
||||||
obj-$(CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC) += libblake2s-generic.o
|
# blake2s is used by the /dev/random driver which is always builtin
|
||||||
libblake2s-generic-y += blake2s-generic.o
|
obj-y += libblake2s.o
|
||||||
|
libblake2s-y := blake2s.o
|
||||||
obj-$(CONFIG_CRYPTO_LIB_BLAKE2S) += libblake2s.o
|
libblake2s-$(CONFIG_CRYPTO_LIB_BLAKE2S_GENERIC) += blake2s-generic.o
|
||||||
libblake2s-y += blake2s.o
|
|
||||||
|
|
||||||
obj-$(CONFIG_CRYPTO_LIB_CHACHA20POLY1305) += libchacha20poly1305.o
|
obj-$(CONFIG_CRYPTO_LIB_CHACHA20POLY1305) += libchacha20poly1305.o
|
||||||
libchacha20poly1305-y += chacha20poly1305.o
|
libchacha20poly1305-y += chacha20poly1305.o
|
||||||
|
@@ -37,7 +37,11 @@ static inline void blake2s_increment_counter(struct blake2s_state *state,
|
|||||||
state->t[1] += (state->t[0] < inc);
|
state->t[1] += (state->t[0] < inc);
|
||||||
}
|
}
|
||||||
|
|
||||||
void blake2s_compress_generic(struct blake2s_state *state,const u8 *block,
|
void blake2s_compress(struct blake2s_state *state, const u8 *block,
|
||||||
|
size_t nblocks, const u32 inc)
|
||||||
|
__weak __alias(blake2s_compress_generic);
|
||||||
|
|
||||||
|
void blake2s_compress_generic(struct blake2s_state *state, const u8 *block,
|
||||||
size_t nblocks, const u32 inc)
|
size_t nblocks, const u32 inc)
|
||||||
{
|
{
|
||||||
u32 m[16];
|
u32 m[16];
|
||||||
|
@@ -15,7 +15,6 @@
|
|||||||
* #include <stdio.h>
|
* #include <stdio.h>
|
||||||
*
|
*
|
||||||
* #include <openssl/evp.h>
|
* #include <openssl/evp.h>
|
||||||
* #include <openssl/hmac.h>
|
|
||||||
*
|
*
|
||||||
* #define BLAKE2S_TESTVEC_COUNT 256
|
* #define BLAKE2S_TESTVEC_COUNT 256
|
||||||
*
|
*
|
||||||
@@ -58,16 +57,6 @@
|
|||||||
* }
|
* }
|
||||||
* printf("};\n\n");
|
* printf("};\n\n");
|
||||||
*
|
*
|
||||||
* printf("static const u8 blake2s_hmac_testvecs[][BLAKE2S_HASH_SIZE] __initconst = {\n");
|
|
||||||
*
|
|
||||||
* HMAC(EVP_blake2s256(), key, sizeof(key), buf, sizeof(buf), hash, NULL);
|
|
||||||
* print_vec(hash, BLAKE2S_OUTBYTES);
|
|
||||||
*
|
|
||||||
* HMAC(EVP_blake2s256(), buf, sizeof(buf), key, sizeof(key), hash, NULL);
|
|
||||||
* print_vec(hash, BLAKE2S_OUTBYTES);
|
|
||||||
*
|
|
||||||
* printf("};\n");
|
|
||||||
*
|
|
||||||
* return 0;
|
* return 0;
|
||||||
*}
|
*}
|
||||||
*/
|
*/
|
||||||
@@ -554,15 +543,6 @@ static const u8 blake2s_testvecs[][BLAKE2S_HASH_SIZE] __initconst = {
|
|||||||
0xd6, 0x98, 0x6b, 0x07, 0x10, 0x65, 0x52, 0x65, },
|
0xd6, 0x98, 0x6b, 0x07, 0x10, 0x65, 0x52, 0x65, },
|
||||||
};
|
};
|
||||||
|
|
||||||
static const u8 blake2s_hmac_testvecs[][BLAKE2S_HASH_SIZE] __initconst = {
|
|
||||||
{ 0xce, 0xe1, 0x57, 0x69, 0x82, 0xdc, 0xbf, 0x43, 0xad, 0x56, 0x4c, 0x70,
|
|
||||||
0xed, 0x68, 0x16, 0x96, 0xcf, 0xa4, 0x73, 0xe8, 0xe8, 0xfc, 0x32, 0x79,
|
|
||||||
0x08, 0x0a, 0x75, 0x82, 0xda, 0x3f, 0x05, 0x11, },
|
|
||||||
{ 0x77, 0x2f, 0x0c, 0x71, 0x41, 0xf4, 0x4b, 0x2b, 0xb3, 0xc6, 0xb6, 0xf9,
|
|
||||||
0x60, 0xde, 0xe4, 0x52, 0x38, 0x66, 0xe8, 0xbf, 0x9b, 0x96, 0xc4, 0x9f,
|
|
||||||
0x60, 0xd9, 0x24, 0x37, 0x99, 0xd6, 0xec, 0x31, },
|
|
||||||
};
|
|
||||||
|
|
||||||
bool __init blake2s_selftest(void)
|
bool __init blake2s_selftest(void)
|
||||||
{
|
{
|
||||||
u8 key[BLAKE2S_KEY_SIZE];
|
u8 key[BLAKE2S_KEY_SIZE];
|
||||||
@@ -607,16 +587,5 @@ bool __init blake2s_selftest(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (success) {
|
|
||||||
blake2s256_hmac(hash, buf, key, sizeof(buf), sizeof(key));
|
|
||||||
success &= !memcmp(hash, blake2s_hmac_testvecs[0], BLAKE2S_HASH_SIZE);
|
|
||||||
|
|
||||||
blake2s256_hmac(hash, key, buf, sizeof(key), sizeof(buf));
|
|
||||||
success &= !memcmp(hash, blake2s_hmac_testvecs[1], BLAKE2S_HASH_SIZE);
|
|
||||||
|
|
||||||
if (!success)
|
|
||||||
pr_err("blake2s256_hmac self-test: FAIL\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
@@ -16,63 +16,20 @@
|
|||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/bug.h>
|
#include <linux/bug.h>
|
||||||
|
|
||||||
#if IS_ENABLED(CONFIG_CRYPTO_ARCH_HAVE_LIB_BLAKE2S)
|
|
||||||
# define blake2s_compress blake2s_compress_arch
|
|
||||||
#else
|
|
||||||
# define blake2s_compress blake2s_compress_generic
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void blake2s_update(struct blake2s_state *state, const u8 *in, size_t inlen)
|
void blake2s_update(struct blake2s_state *state, const u8 *in, size_t inlen)
|
||||||
{
|
{
|
||||||
__blake2s_update(state, in, inlen, blake2s_compress);
|
__blake2s_update(state, in, inlen, false);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(blake2s_update);
|
EXPORT_SYMBOL(blake2s_update);
|
||||||
|
|
||||||
void blake2s_final(struct blake2s_state *state, u8 *out)
|
void blake2s_final(struct blake2s_state *state, u8 *out)
|
||||||
{
|
{
|
||||||
WARN_ON(IS_ENABLED(DEBUG) && !out);
|
WARN_ON(IS_ENABLED(DEBUG) && !out);
|
||||||
__blake2s_final(state, out, blake2s_compress);
|
__blake2s_final(state, out, false);
|
||||||
memzero_explicit(state, sizeof(*state));
|
memzero_explicit(state, sizeof(*state));
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(blake2s_final);
|
EXPORT_SYMBOL(blake2s_final);
|
||||||
|
|
||||||
void blake2s256_hmac(u8 *out, const u8 *in, const u8 *key, const size_t inlen,
|
|
||||||
const size_t keylen)
|
|
||||||
{
|
|
||||||
struct blake2s_state state;
|
|
||||||
u8 x_key[BLAKE2S_BLOCK_SIZE] __aligned(__alignof__(u32)) = { 0 };
|
|
||||||
u8 i_hash[BLAKE2S_HASH_SIZE] __aligned(__alignof__(u32));
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if (keylen > BLAKE2S_BLOCK_SIZE) {
|
|
||||||
blake2s_init(&state, BLAKE2S_HASH_SIZE);
|
|
||||||
blake2s_update(&state, key, keylen);
|
|
||||||
blake2s_final(&state, x_key);
|
|
||||||
} else
|
|
||||||
memcpy(x_key, key, keylen);
|
|
||||||
|
|
||||||
for (i = 0; i < BLAKE2S_BLOCK_SIZE; ++i)
|
|
||||||
x_key[i] ^= 0x36;
|
|
||||||
|
|
||||||
blake2s_init(&state, BLAKE2S_HASH_SIZE);
|
|
||||||
blake2s_update(&state, x_key, BLAKE2S_BLOCK_SIZE);
|
|
||||||
blake2s_update(&state, in, inlen);
|
|
||||||
blake2s_final(&state, i_hash);
|
|
||||||
|
|
||||||
for (i = 0; i < BLAKE2S_BLOCK_SIZE; ++i)
|
|
||||||
x_key[i] ^= 0x5c ^ 0x36;
|
|
||||||
|
|
||||||
blake2s_init(&state, BLAKE2S_HASH_SIZE);
|
|
||||||
blake2s_update(&state, x_key, BLAKE2S_BLOCK_SIZE);
|
|
||||||
blake2s_update(&state, i_hash, BLAKE2S_HASH_SIZE);
|
|
||||||
blake2s_final(&state, i_hash);
|
|
||||||
|
|
||||||
memcpy(out, i_hash, BLAKE2S_HASH_SIZE);
|
|
||||||
memzero_explicit(x_key, BLAKE2S_BLOCK_SIZE);
|
|
||||||
memzero_explicit(i_hash, BLAKE2S_HASH_SIZE);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(blake2s256_hmac);
|
|
||||||
|
|
||||||
static int __init mod_init(void)
|
static int __init mod_init(void)
|
||||||
{
|
{
|
||||||
if (!IS_ENABLED(CONFIG_CRYPTO_MANAGER_DISABLE_TESTS) &&
|
if (!IS_ENABLED(CONFIG_CRYPTO_MANAGER_DISABLE_TESTS) &&
|
||||||
|
@@ -39,8 +39,9 @@
|
|||||||
#include <linux/random.h>
|
#include <linux/random.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/bitops.h>
|
#include <linux/bitops.h>
|
||||||
|
#include <linux/slab.h>
|
||||||
|
#include <linux/notifier.h>
|
||||||
#include <asm/unaligned.h>
|
#include <asm/unaligned.h>
|
||||||
#include <trace/events/random.h>
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* prandom_u32_state - seeded pseudo-random number generator.
|
* prandom_u32_state - seeded pseudo-random number generator.
|
||||||
@@ -386,7 +387,6 @@ u32 prandom_u32(void)
|
|||||||
struct siprand_state *state = get_cpu_ptr(&net_rand_state);
|
struct siprand_state *state = get_cpu_ptr(&net_rand_state);
|
||||||
u32 res = siprand_u32(state);
|
u32 res = siprand_u32(state);
|
||||||
|
|
||||||
trace_prandom_u32(res);
|
|
||||||
put_cpu_ptr(&net_rand_state);
|
put_cpu_ptr(&net_rand_state);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
@@ -552,9 +552,11 @@ static void prandom_reseed(struct timer_list *unused)
|
|||||||
* To avoid worrying about whether it's safe to delay that interrupt
|
* To avoid worrying about whether it's safe to delay that interrupt
|
||||||
* long enough to seed all CPUs, just schedule an immediate timer event.
|
* long enough to seed all CPUs, just schedule an immediate timer event.
|
||||||
*/
|
*/
|
||||||
static void prandom_timer_start(struct random_ready_callback *unused)
|
static int prandom_timer_start(struct notifier_block *nb,
|
||||||
|
unsigned long action, void *data)
|
||||||
{
|
{
|
||||||
mod_timer(&seed_timer, jiffies);
|
mod_timer(&seed_timer, jiffies);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_RANDOM32_SELFTEST
|
#ifdef CONFIG_RANDOM32_SELFTEST
|
||||||
@@ -618,13 +620,13 @@ core_initcall(prandom32_state_selftest);
|
|||||||
*/
|
*/
|
||||||
static int __init prandom_init_late(void)
|
static int __init prandom_init_late(void)
|
||||||
{
|
{
|
||||||
static struct random_ready_callback random_ready = {
|
static struct notifier_block random_ready = {
|
||||||
.func = prandom_timer_start
|
.notifier_call = prandom_timer_start
|
||||||
};
|
};
|
||||||
int ret = add_random_ready_callback(&random_ready);
|
int ret = register_random_ready_notifier(&random_ready);
|
||||||
|
|
||||||
if (ret == -EALREADY) {
|
if (ret == -EALREADY) {
|
||||||
prandom_timer_start(&random_ready);
|
prandom_timer_start(&random_ready, 0, NULL);
|
||||||
ret = 0;
|
ret = 0;
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
|
95
lib/sha1.c
95
lib/sha1.c
@@ -9,6 +9,7 @@
|
|||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/export.h>
|
#include <linux/export.h>
|
||||||
#include <linux/bitops.h>
|
#include <linux/bitops.h>
|
||||||
|
#include <linux/string.h>
|
||||||
#include <crypto/sha.h>
|
#include <crypto/sha.h>
|
||||||
#include <asm/unaligned.h>
|
#include <asm/unaligned.h>
|
||||||
|
|
||||||
@@ -55,7 +56,8 @@
|
|||||||
#define SHA_ROUND(t, input, fn, constant, A, B, C, D, E) do { \
|
#define SHA_ROUND(t, input, fn, constant, A, B, C, D, E) do { \
|
||||||
__u32 TEMP = input(t); setW(t, TEMP); \
|
__u32 TEMP = input(t); setW(t, TEMP); \
|
||||||
E += TEMP + rol32(A,5) + (fn) + (constant); \
|
E += TEMP + rol32(A,5) + (fn) + (constant); \
|
||||||
B = ror32(B, 2); } while (0)
|
B = ror32(B, 2); \
|
||||||
|
TEMP = E; E = D; D = C; C = B; B = A; A = TEMP; } while (0)
|
||||||
|
|
||||||
#define T_0_15(t, A, B, C, D, E) SHA_ROUND(t, SHA_SRC, (((C^D)&B)^D) , 0x5a827999, A, B, C, D, E )
|
#define T_0_15(t, A, B, C, D, E) SHA_ROUND(t, SHA_SRC, (((C^D)&B)^D) , 0x5a827999, A, B, C, D, E )
|
||||||
#define T_16_19(t, A, B, C, D, E) SHA_ROUND(t, SHA_MIX, (((C^D)&B)^D) , 0x5a827999, A, B, C, D, E )
|
#define T_16_19(t, A, B, C, D, E) SHA_ROUND(t, SHA_MIX, (((C^D)&B)^D) , 0x5a827999, A, B, C, D, E )
|
||||||
@@ -84,6 +86,7 @@
|
|||||||
void sha1_transform(__u32 *digest, const char *data, __u32 *array)
|
void sha1_transform(__u32 *digest, const char *data, __u32 *array)
|
||||||
{
|
{
|
||||||
__u32 A, B, C, D, E;
|
__u32 A, B, C, D, E;
|
||||||
|
unsigned int i = 0;
|
||||||
|
|
||||||
A = digest[0];
|
A = digest[0];
|
||||||
B = digest[1];
|
B = digest[1];
|
||||||
@@ -92,94 +95,24 @@ void sha1_transform(__u32 *digest, const char *data, __u32 *array)
|
|||||||
E = digest[4];
|
E = digest[4];
|
||||||
|
|
||||||
/* Round 1 - iterations 0-16 take their input from 'data' */
|
/* Round 1 - iterations 0-16 take their input from 'data' */
|
||||||
T_0_15( 0, A, B, C, D, E);
|
for (; i < 16; ++i)
|
||||||
T_0_15( 1, E, A, B, C, D);
|
T_0_15(i, A, B, C, D, E);
|
||||||
T_0_15( 2, D, E, A, B, C);
|
|
||||||
T_0_15( 3, C, D, E, A, B);
|
|
||||||
T_0_15( 4, B, C, D, E, A);
|
|
||||||
T_0_15( 5, A, B, C, D, E);
|
|
||||||
T_0_15( 6, E, A, B, C, D);
|
|
||||||
T_0_15( 7, D, E, A, B, C);
|
|
||||||
T_0_15( 8, C, D, E, A, B);
|
|
||||||
T_0_15( 9, B, C, D, E, A);
|
|
||||||
T_0_15(10, A, B, C, D, E);
|
|
||||||
T_0_15(11, E, A, B, C, D);
|
|
||||||
T_0_15(12, D, E, A, B, C);
|
|
||||||
T_0_15(13, C, D, E, A, B);
|
|
||||||
T_0_15(14, B, C, D, E, A);
|
|
||||||
T_0_15(15, A, B, C, D, E);
|
|
||||||
|
|
||||||
/* Round 1 - tail. Input from 512-bit mixing array */
|
/* Round 1 - tail. Input from 512-bit mixing array */
|
||||||
T_16_19(16, E, A, B, C, D);
|
for (; i < 20; ++i)
|
||||||
T_16_19(17, D, E, A, B, C);
|
T_16_19(i, A, B, C, D, E);
|
||||||
T_16_19(18, C, D, E, A, B);
|
|
||||||
T_16_19(19, B, C, D, E, A);
|
|
||||||
|
|
||||||
/* Round 2 */
|
/* Round 2 */
|
||||||
T_20_39(20, A, B, C, D, E);
|
for (; i < 40; ++i)
|
||||||
T_20_39(21, E, A, B, C, D);
|
T_20_39(i, A, B, C, D, E);
|
||||||
T_20_39(22, D, E, A, B, C);
|
|
||||||
T_20_39(23, C, D, E, A, B);
|
|
||||||
T_20_39(24, B, C, D, E, A);
|
|
||||||
T_20_39(25, A, B, C, D, E);
|
|
||||||
T_20_39(26, E, A, B, C, D);
|
|
||||||
T_20_39(27, D, E, A, B, C);
|
|
||||||
T_20_39(28, C, D, E, A, B);
|
|
||||||
T_20_39(29, B, C, D, E, A);
|
|
||||||
T_20_39(30, A, B, C, D, E);
|
|
||||||
T_20_39(31, E, A, B, C, D);
|
|
||||||
T_20_39(32, D, E, A, B, C);
|
|
||||||
T_20_39(33, C, D, E, A, B);
|
|
||||||
T_20_39(34, B, C, D, E, A);
|
|
||||||
T_20_39(35, A, B, C, D, E);
|
|
||||||
T_20_39(36, E, A, B, C, D);
|
|
||||||
T_20_39(37, D, E, A, B, C);
|
|
||||||
T_20_39(38, C, D, E, A, B);
|
|
||||||
T_20_39(39, B, C, D, E, A);
|
|
||||||
|
|
||||||
/* Round 3 */
|
/* Round 3 */
|
||||||
T_40_59(40, A, B, C, D, E);
|
for (; i < 60; ++i)
|
||||||
T_40_59(41, E, A, B, C, D);
|
T_40_59(i, A, B, C, D, E);
|
||||||
T_40_59(42, D, E, A, B, C);
|
|
||||||
T_40_59(43, C, D, E, A, B);
|
|
||||||
T_40_59(44, B, C, D, E, A);
|
|
||||||
T_40_59(45, A, B, C, D, E);
|
|
||||||
T_40_59(46, E, A, B, C, D);
|
|
||||||
T_40_59(47, D, E, A, B, C);
|
|
||||||
T_40_59(48, C, D, E, A, B);
|
|
||||||
T_40_59(49, B, C, D, E, A);
|
|
||||||
T_40_59(50, A, B, C, D, E);
|
|
||||||
T_40_59(51, E, A, B, C, D);
|
|
||||||
T_40_59(52, D, E, A, B, C);
|
|
||||||
T_40_59(53, C, D, E, A, B);
|
|
||||||
T_40_59(54, B, C, D, E, A);
|
|
||||||
T_40_59(55, A, B, C, D, E);
|
|
||||||
T_40_59(56, E, A, B, C, D);
|
|
||||||
T_40_59(57, D, E, A, B, C);
|
|
||||||
T_40_59(58, C, D, E, A, B);
|
|
||||||
T_40_59(59, B, C, D, E, A);
|
|
||||||
|
|
||||||
/* Round 4 */
|
/* Round 4 */
|
||||||
T_60_79(60, A, B, C, D, E);
|
for (; i < 80; ++i)
|
||||||
T_60_79(61, E, A, B, C, D);
|
T_60_79(i, A, B, C, D, E);
|
||||||
T_60_79(62, D, E, A, B, C);
|
|
||||||
T_60_79(63, C, D, E, A, B);
|
|
||||||
T_60_79(64, B, C, D, E, A);
|
|
||||||
T_60_79(65, A, B, C, D, E);
|
|
||||||
T_60_79(66, E, A, B, C, D);
|
|
||||||
T_60_79(67, D, E, A, B, C);
|
|
||||||
T_60_79(68, C, D, E, A, B);
|
|
||||||
T_60_79(69, B, C, D, E, A);
|
|
||||||
T_60_79(70, A, B, C, D, E);
|
|
||||||
T_60_79(71, E, A, B, C, D);
|
|
||||||
T_60_79(72, D, E, A, B, C);
|
|
||||||
T_60_79(73, C, D, E, A, B);
|
|
||||||
T_60_79(74, B, C, D, E, A);
|
|
||||||
T_60_79(75, A, B, C, D, E);
|
|
||||||
T_60_79(76, E, A, B, C, D);
|
|
||||||
T_60_79(77, D, E, A, B, C);
|
|
||||||
T_60_79(78, C, D, E, A, B);
|
|
||||||
T_60_79(79, B, C, D, E, A);
|
|
||||||
|
|
||||||
digest[0] += A;
|
digest[0] += A;
|
||||||
digest[1] += B;
|
digest[1] += B;
|
||||||
|
@@ -18,19 +18,13 @@
|
|||||||
#include <asm/word-at-a-time.h>
|
#include <asm/word-at-a-time.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define SIPROUND \
|
#define SIPROUND SIPHASH_PERMUTATION(v0, v1, v2, v3)
|
||||||
do { \
|
|
||||||
v0 += v1; v1 = rol64(v1, 13); v1 ^= v0; v0 = rol64(v0, 32); \
|
|
||||||
v2 += v3; v3 = rol64(v3, 16); v3 ^= v2; \
|
|
||||||
v0 += v3; v3 = rol64(v3, 21); v3 ^= v0; \
|
|
||||||
v2 += v1; v1 = rol64(v1, 17); v1 ^= v2; v2 = rol64(v2, 32); \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define PREAMBLE(len) \
|
#define PREAMBLE(len) \
|
||||||
u64 v0 = 0x736f6d6570736575ULL; \
|
u64 v0 = SIPHASH_CONST_0; \
|
||||||
u64 v1 = 0x646f72616e646f6dULL; \
|
u64 v1 = SIPHASH_CONST_1; \
|
||||||
u64 v2 = 0x6c7967656e657261ULL; \
|
u64 v2 = SIPHASH_CONST_2; \
|
||||||
u64 v3 = 0x7465646279746573ULL; \
|
u64 v3 = SIPHASH_CONST_3; \
|
||||||
u64 b = ((u64)(len)) << 56; \
|
u64 b = ((u64)(len)) << 56; \
|
||||||
v3 ^= key->key[1]; \
|
v3 ^= key->key[1]; \
|
||||||
v2 ^= key->key[0]; \
|
v2 ^= key->key[0]; \
|
||||||
@@ -389,19 +383,13 @@ u32 hsiphash_4u32(const u32 first, const u32 second, const u32 third,
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(hsiphash_4u32);
|
EXPORT_SYMBOL(hsiphash_4u32);
|
||||||
#else
|
#else
|
||||||
#define HSIPROUND \
|
#define HSIPROUND HSIPHASH_PERMUTATION(v0, v1, v2, v3)
|
||||||
do { \
|
|
||||||
v0 += v1; v1 = rol32(v1, 5); v1 ^= v0; v0 = rol32(v0, 16); \
|
|
||||||
v2 += v3; v3 = rol32(v3, 8); v3 ^= v2; \
|
|
||||||
v0 += v3; v3 = rol32(v3, 7); v3 ^= v0; \
|
|
||||||
v2 += v1; v1 = rol32(v1, 13); v1 ^= v2; v2 = rol32(v2, 16); \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define HPREAMBLE(len) \
|
#define HPREAMBLE(len) \
|
||||||
u32 v0 = 0; \
|
u32 v0 = HSIPHASH_CONST_0; \
|
||||||
u32 v1 = 0; \
|
u32 v1 = HSIPHASH_CONST_1; \
|
||||||
u32 v2 = 0x6c796765U; \
|
u32 v2 = HSIPHASH_CONST_2; \
|
||||||
u32 v3 = 0x74656462U; \
|
u32 v3 = HSIPHASH_CONST_3; \
|
||||||
u32 b = ((u32)(len)) << 24; \
|
u32 b = ((u32)(len)) << 24; \
|
||||||
v3 ^= key->key[1]; \
|
v3 ^= key->key[1]; \
|
||||||
v2 ^= key->key[0]; \
|
v2 ^= key->key[0]; \
|
||||||
|
@@ -756,14 +756,16 @@ static void enable_ptr_key_workfn(struct work_struct *work)
|
|||||||
|
|
||||||
static DECLARE_WORK(enable_ptr_key_work, enable_ptr_key_workfn);
|
static DECLARE_WORK(enable_ptr_key_work, enable_ptr_key_workfn);
|
||||||
|
|
||||||
static void fill_random_ptr_key(struct random_ready_callback *unused)
|
static int fill_random_ptr_key(struct notifier_block *nb,
|
||||||
|
unsigned long action, void *data)
|
||||||
{
|
{
|
||||||
/* This may be in an interrupt handler. */
|
/* This may be in an interrupt handler. */
|
||||||
queue_work(system_unbound_wq, &enable_ptr_key_work);
|
queue_work(system_unbound_wq, &enable_ptr_key_work);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct random_ready_callback random_ready = {
|
static struct notifier_block random_ready = {
|
||||||
.func = fill_random_ptr_key
|
.notifier_call = fill_random_ptr_key
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init initialize_ptr_random(void)
|
static int __init initialize_ptr_random(void)
|
||||||
@@ -777,7 +779,7 @@ static int __init initialize_ptr_random(void)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = add_random_ready_callback(&random_ready);
|
ret = register_random_ready_notifier(&random_ready);
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
return 0;
|
return 0;
|
||||||
} else if (ret == -EALREADY) {
|
} else if (ret == -EALREADY) {
|
||||||
|
32
mm/util.c
32
mm/util.c
@@ -334,6 +334,38 @@ unsigned long randomize_stack_top(unsigned long stack_top)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* randomize_page - Generate a random, page aligned address
|
||||||
|
* @start: The smallest acceptable address the caller will take.
|
||||||
|
* @range: The size of the area, starting at @start, within which the
|
||||||
|
* random address must fall.
|
||||||
|
*
|
||||||
|
* If @start + @range would overflow, @range is capped.
|
||||||
|
*
|
||||||
|
* NOTE: Historical use of randomize_range, which this replaces, presumed that
|
||||||
|
* @start was already page aligned. We now align it regardless.
|
||||||
|
*
|
||||||
|
* Return: A page aligned address within [start, start + range). On error,
|
||||||
|
* @start is returned.
|
||||||
|
*/
|
||||||
|
unsigned long randomize_page(unsigned long start, unsigned long range)
|
||||||
|
{
|
||||||
|
if (!PAGE_ALIGNED(start)) {
|
||||||
|
range -= PAGE_ALIGN(start) - start;
|
||||||
|
start = PAGE_ALIGN(start);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (start > ULONG_MAX - range)
|
||||||
|
range = ULONG_MAX - start;
|
||||||
|
|
||||||
|
range >>= PAGE_SHIFT;
|
||||||
|
|
||||||
|
if (range == 0)
|
||||||
|
return start;
|
||||||
|
|
||||||
|
return start + (get_random_long() % range << PAGE_SHIFT);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT
|
#ifdef CONFIG_ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT
|
||||||
unsigned long arch_randomize_brk(struct mm_struct *mm)
|
unsigned long arch_randomize_brk(struct mm_struct *mm)
|
||||||
{
|
{
|
||||||
|
@@ -96,7 +96,7 @@ u32 secure_tcpv6_seq(const __be32 *saddr, const __be32 *daddr,
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(secure_tcpv6_seq);
|
EXPORT_SYMBOL(secure_tcpv6_seq);
|
||||||
|
|
||||||
u32 secure_ipv6_port_ephemeral(const __be32 *saddr, const __be32 *daddr,
|
u64 secure_ipv6_port_ephemeral(const __be32 *saddr, const __be32 *daddr,
|
||||||
__be16 dport)
|
__be16 dport)
|
||||||
{
|
{
|
||||||
const struct {
|
const struct {
|
||||||
@@ -146,7 +146,7 @@ u32 secure_tcp_seq(__be32 saddr, __be32 daddr,
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(secure_tcp_seq);
|
EXPORT_SYMBOL_GPL(secure_tcp_seq);
|
||||||
|
|
||||||
u32 secure_ipv4_port_ephemeral(__be32 saddr, __be32 daddr, __be16 dport)
|
u64 secure_ipv4_port_ephemeral(__be32 saddr, __be32 daddr, __be16 dport)
|
||||||
{
|
{
|
||||||
net_secret_init();
|
net_secret_init();
|
||||||
return siphash_4u32((__force u32)saddr, (__force u32)daddr,
|
return siphash_4u32((__force u32)saddr, (__force u32)daddr,
|
||||||
|
@@ -504,7 +504,7 @@ not_unique:
|
|||||||
return -EADDRNOTAVAIL;
|
return -EADDRNOTAVAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static u32 inet_sk_port_offset(const struct sock *sk)
|
static u64 inet_sk_port_offset(const struct sock *sk)
|
||||||
{
|
{
|
||||||
const struct inet_sock *inet = inet_sk(sk);
|
const struct inet_sock *inet = inet_sk(sk);
|
||||||
|
|
||||||
@@ -722,8 +722,19 @@ void inet_unhash(struct sock *sk)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(inet_unhash);
|
EXPORT_SYMBOL_GPL(inet_unhash);
|
||||||
|
|
||||||
|
/* RFC 6056 3.3.4. Algorithm 4: Double-Hash Port Selection Algorithm
|
||||||
|
* Note that we use 32bit integers (vs RFC 'short integers')
|
||||||
|
* because 2^16 is not a multiple of num_ephemeral and this
|
||||||
|
* property might be used by clever attacker.
|
||||||
|
* RFC claims using TABLE_LENGTH=10 buckets gives an improvement,
|
||||||
|
* we use 256 instead to really give more isolation and
|
||||||
|
* privacy, this only consumes 1 KB of kernel memory.
|
||||||
|
*/
|
||||||
|
#define INET_TABLE_PERTURB_SHIFT 8
|
||||||
|
static u32 table_perturb[1 << INET_TABLE_PERTURB_SHIFT];
|
||||||
|
|
||||||
int __inet_hash_connect(struct inet_timewait_death_row *death_row,
|
int __inet_hash_connect(struct inet_timewait_death_row *death_row,
|
||||||
struct sock *sk, u32 port_offset,
|
struct sock *sk, u64 port_offset,
|
||||||
int (*check_established)(struct inet_timewait_death_row *,
|
int (*check_established)(struct inet_timewait_death_row *,
|
||||||
struct sock *, __u16, struct inet_timewait_sock **))
|
struct sock *, __u16, struct inet_timewait_sock **))
|
||||||
{
|
{
|
||||||
@@ -735,8 +746,8 @@ int __inet_hash_connect(struct inet_timewait_death_row *death_row,
|
|||||||
struct inet_bind_bucket *tb;
|
struct inet_bind_bucket *tb;
|
||||||
u32 remaining, offset;
|
u32 remaining, offset;
|
||||||
int ret, i, low, high;
|
int ret, i, low, high;
|
||||||
static u32 hint;
|
|
||||||
int l3mdev;
|
int l3mdev;
|
||||||
|
u32 index;
|
||||||
|
|
||||||
if (port) {
|
if (port) {
|
||||||
head = &hinfo->bhash[inet_bhashfn(net, port,
|
head = &hinfo->bhash[inet_bhashfn(net, port,
|
||||||
@@ -763,7 +774,12 @@ int __inet_hash_connect(struct inet_timewait_death_row *death_row,
|
|||||||
if (likely(remaining > 1))
|
if (likely(remaining > 1))
|
||||||
remaining &= ~1U;
|
remaining &= ~1U;
|
||||||
|
|
||||||
offset = (hint + port_offset) % remaining;
|
net_get_random_once(table_perturb, sizeof(table_perturb));
|
||||||
|
index = hash_32(port_offset, INET_TABLE_PERTURB_SHIFT);
|
||||||
|
|
||||||
|
offset = READ_ONCE(table_perturb[index]) + port_offset;
|
||||||
|
offset %= remaining;
|
||||||
|
|
||||||
/* In first pass we try ports of @low parity.
|
/* In first pass we try ports of @low parity.
|
||||||
* inet_csk_get_port() does the opposite choice.
|
* inet_csk_get_port() does the opposite choice.
|
||||||
*/
|
*/
|
||||||
@@ -817,7 +833,7 @@ next_port:
|
|||||||
return -EADDRNOTAVAIL;
|
return -EADDRNOTAVAIL;
|
||||||
|
|
||||||
ok:
|
ok:
|
||||||
hint += i + 2;
|
WRITE_ONCE(table_perturb[index], READ_ONCE(table_perturb[index]) + i + 2);
|
||||||
|
|
||||||
/* Head lock still held and bh's disabled */
|
/* Head lock still held and bh's disabled */
|
||||||
inet_bind_hash(sk, tb, port);
|
inet_bind_hash(sk, tb, port);
|
||||||
@@ -840,7 +856,7 @@ ok:
|
|||||||
int inet_hash_connect(struct inet_timewait_death_row *death_row,
|
int inet_hash_connect(struct inet_timewait_death_row *death_row,
|
||||||
struct sock *sk)
|
struct sock *sk)
|
||||||
{
|
{
|
||||||
u32 port_offset = 0;
|
u64 port_offset = 0;
|
||||||
|
|
||||||
if (!inet_sk(sk)->inet_num)
|
if (!inet_sk(sk)->inet_num)
|
||||||
port_offset = inet_sk_port_offset(sk);
|
port_offset = inet_sk_port_offset(sk);
|
||||||
|
@@ -308,7 +308,7 @@ not_unique:
|
|||||||
return -EADDRNOTAVAIL;
|
return -EADDRNOTAVAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static u32 inet6_sk_port_offset(const struct sock *sk)
|
static u64 inet6_sk_port_offset(const struct sock *sk)
|
||||||
{
|
{
|
||||||
const struct inet_sock *inet = inet_sk(sk);
|
const struct inet_sock *inet = inet_sk(sk);
|
||||||
|
|
||||||
@@ -320,7 +320,7 @@ static u32 inet6_sk_port_offset(const struct sock *sk)
|
|||||||
int inet6_hash_connect(struct inet_timewait_death_row *death_row,
|
int inet6_hash_connect(struct inet_timewait_death_row *death_row,
|
||||||
struct sock *sk)
|
struct sock *sk)
|
||||||
{
|
{
|
||||||
u32 port_offset = 0;
|
u64 port_offset = 0;
|
||||||
|
|
||||||
if (!inet_sk(sk)->inet_num)
|
if (!inet_sk(sk)->inet_num)
|
||||||
port_offset = inet6_sk_port_offset(sk);
|
port_offset = inet6_sk_port_offset(sk);
|
||||||
|
@@ -36,6 +36,7 @@
|
|||||||
| ((IEC958_AES3_CON_FS_48000) << 24))
|
| ((IEC958_AES3_CON_FS_48000) << 24))
|
||||||
|
|
||||||
static const struct snd_pci_quirk subsys_20k1_list[] = {
|
static const struct snd_pci_quirk subsys_20k1_list[] = {
|
||||||
|
SND_PCI_QUIRK(PCI_VENDOR_ID_CREATIVE, 0x0021, "SB046x", CTSB046X),
|
||||||
SND_PCI_QUIRK(PCI_VENDOR_ID_CREATIVE, 0x0022, "SB055x", CTSB055X),
|
SND_PCI_QUIRK(PCI_VENDOR_ID_CREATIVE, 0x0022, "SB055x", CTSB055X),
|
||||||
SND_PCI_QUIRK(PCI_VENDOR_ID_CREATIVE, 0x002f, "SB055x", CTSB055X),
|
SND_PCI_QUIRK(PCI_VENDOR_ID_CREATIVE, 0x002f, "SB055x", CTSB055X),
|
||||||
SND_PCI_QUIRK(PCI_VENDOR_ID_CREATIVE, 0x0029, "SB073x", CTSB073X),
|
SND_PCI_QUIRK(PCI_VENDOR_ID_CREATIVE, 0x0029, "SB073x", CTSB073X),
|
||||||
@@ -64,6 +65,7 @@ static const struct snd_pci_quirk subsys_20k2_list[] = {
|
|||||||
|
|
||||||
static const char *ct_subsys_name[NUM_CTCARDS] = {
|
static const char *ct_subsys_name[NUM_CTCARDS] = {
|
||||||
/* 20k1 models */
|
/* 20k1 models */
|
||||||
|
[CTSB046X] = "SB046x",
|
||||||
[CTSB055X] = "SB055x",
|
[CTSB055X] = "SB055x",
|
||||||
[CTSB073X] = "SB073x",
|
[CTSB073X] = "SB073x",
|
||||||
[CTUAA] = "UAA",
|
[CTUAA] = "UAA",
|
||||||
|
@@ -26,8 +26,9 @@ enum CHIPTYP {
|
|||||||
|
|
||||||
enum CTCARDS {
|
enum CTCARDS {
|
||||||
/* 20k1 models */
|
/* 20k1 models */
|
||||||
|
CTSB046X,
|
||||||
|
CT20K1_MODEL_FIRST = CTSB046X,
|
||||||
CTSB055X,
|
CTSB055X,
|
||||||
CT20K1_MODEL_FIRST = CTSB055X,
|
|
||||||
CTSB073X,
|
CTSB073X,
|
||||||
CTUAA,
|
CTUAA,
|
||||||
CT20K1_UNKNOWN,
|
CT20K1_UNKNOWN,
|
||||||
|
Reference in New Issue
Block a user