android_kernel_motorola_sm6375/drivers
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Jason A. Donenfeld 4e5814bd2e random: use computational hash for entropy extraction
commit 6e8ec2552c7d13991148e551e3325a624d73fac6 upstream.

The current 4096-bit LFSR used for entropy collection had a few
desirable attributes for the context in which it was created. For
example, the state was huge, which meant that /dev/random would be able
to output quite a bit of accumulated entropy before blocking. It was
also, in its time, quite fast at accumulating entropy byte-by-byte,
which matters given the varying contexts in which mix_pool_bytes() is
called. And its diffusion was relatively high, which meant that changes
would ripple across several words of state rather quickly.

However, it also suffers from a few security vulnerabilities. In
particular, inputs learned by an attacker can be undone, but moreover,
if the state of the pool leaks, its contents can be controlled and
entirely zeroed out. I've demonstrated this attack with this SMT2
script, <https://xn--4db.cc/5o9xO8pb>, which Boolector/CaDiCal solves in
a matter of seconds on a single core of my laptop, resulting in little
proof of concept C demonstrators such as <https://xn--4db.cc/jCkvvIaH/c>.

For basically all recent formal models of RNGs, these attacks represent
a significant cryptographic flaw. But how does this manifest
practically? If an attacker has access to the system to such a degree
that he can learn the internal state of the RNG, arguably there are
other lower hanging vulnerabilities -- side-channel, infoleak, or
otherwise -- that might have higher priority. On the other hand, seed
files are frequently used on systems that have a hard time generating
much entropy on their own, and these seed files, being files, often leak
or are duplicated and distributed accidentally, or are even seeded over
the Internet intentionally, where their contents might be recorded or
tampered with. Seen this way, an otherwise quasi-implausible
vulnerability is a bit more practical than initially thought.

Another aspect of the current mix_pool_bytes() function is that, while
its performance was arguably competitive for the time in which it was
created, it's no longer considered so. This patch improves performance
significantly: on a high-end CPU, an i7-11850H, it improves performance
of mix_pool_bytes() by 225%, and on a low-end CPU, a Cortex-A7, it
improves performance by 103%.

This commit replaces the LFSR of mix_pool_bytes() with a straight-
forward cryptographic hash function, BLAKE2s, which is already in use
for pool extraction. Universal hashing with a secret seed was considered
too, something along the lines of <https://eprint.iacr.org/2013/338>,
but the requirement for a secret seed makes for a chicken & egg problem.
Instead we go with a formally proven scheme using a computational hash
function, described in sections 5.1, 6.4, and B.1.8 of
<https://eprint.iacr.org/2019/198>.

BLAKE2s outputs 256 bits, which should give us an appropriate amount of
min-entropy accumulation, and a wide enough margin of collision
resistance against active attacks. mix_pool_bytes() becomes a simple
call to blake2s_update(), for accumulation, while the extraction step
becomes a blake2s_final() to generate a seed, with which we can then do
a HKDF-like or BLAKE2X-like expansion, the first part of which we fold
back as an init key for subsequent blake2s_update()s, and the rest we
produce to the caller. This then is provided to our CRNG like usual. In
that expansion step, we make opportunistic use of 32 bytes of RDRAND
output, just as before. We also always reseed the crng with 32 bytes,
unconditionally, or not at all, rather than sometimes with 16 as before,
as we don't win anything by limiting beyond the 16 byte threshold.

Going for a hash function as an entropy collector is a conservative,
proven approach. The result of all this is a much simpler and much less
bespoke construction than what's there now, which not only plugs a
vulnerability but also improves performance considerably.

Cc: Theodore Ts'o <tytso@mit.edu>
Cc: Dominik Brodowski <linux@dominikbrodowski.net>
Reviewed-by: Eric Biggers <ebiggers@google.com>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jean-Philippe Aumasson <jeanphilippe.aumasson@gmail.com>
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2022-06-22 14:11:08 +02:00
..
accessibility
acpi ACPI: property: Release subnode properties with data nodes 2022-06-14 18:11:45 +02:00
amba
android binder: fix handling of error during copy 2022-01-27 09:19:38 +01:00
ata ata: libata-transport: fix {dma|pio|xfer}_mode sysfs files 2022-06-14 18:12:02 +02:00
atm atm: eni: Add check for dma_map_single 2022-03-23 09:12:07 +01:00
auxdisplay auxdisplay: ht16k33: Fix frame buffer device blanking 2021-11-17 09:48:45 +01:00
base x86/speculation/mmio: Add sysfs reporting for Processor MMIO Stale Data 2022-06-16 13:23:32 +02:00
bcma
block nbd: fix io hung while disconnecting device 2022-06-14 18:12:01 +02:00
bluetooth Bluetooth: btmtksdio: Fix kernel oops in btmtksdio_interrupt 2022-04-15 14:18:16 +02:00
bus bus: ti-sysc: Fix warnings for unbind for serial 2022-06-14 18:11:54 +02:00
cdrom
char random: use computational hash for entropy extraction 2022-06-22 14:11:08 +02:00
clk clk: at91: generated: consider range when calculating best rate 2022-05-25 09:14:36 +02:00
clocksource clocksource/drivers/sp804: Avoid error on multiple instances 2022-06-14 18:12:00 +02:00
connector
counter
cpufreq Revert "cpufreq: Fix possible race in cpufreq online error path" 2022-06-14 18:11:36 +02:00
cpuidle
crypto crypto: marvell/cesa - ECB does not IV 2022-06-14 18:11:40 +02:00
dax dax: make sure inodes are flushed before destroy cache 2022-04-15 14:18:12 +02:00
dca
devfreq PM / devfreq: rk3399_dmc: Disable edev on remove() 2022-06-14 18:11:29 +02:00
dio
dma dmaengine: zynqmp_dma: In struct zynqmp_dma_chan fix desc_size data type 2022-06-14 18:11:56 +02:00
dma-buf udmabuf: validate ubuf->pagecount 2022-04-15 14:18:10 +02:00
edac EDAC/synopsys: Read the error count from the correct register 2022-04-27 13:50:48 +02:00
eisa
extcon extcon: Modify extcon device to be created after driver data is set 2022-06-14 18:12:00 +02:00
firewire firewire: core: extend card->lock in fw_core_handle_bus_reset 2022-05-12 12:23:41 +02:00
firmware firmware: dmi-sysfs: Fix memory leak in dmi_sysfs_register_handle 2022-06-14 18:11:54 +02:00
fpga
fsi
gnss
gpio gpio: mvebu/pwm: Refuse requests with inverted polarity 2022-05-25 09:14:37 +02:00
gpu drm/radeon: fix a possible null pointer dereference 2022-06-14 18:12:01 +02:00
greybus greybus: svc: fix an error handling bug in gb_svc_hello() 2022-04-15 14:17:58 +02:00
hid HID: elan: Fix potential double free in elan_input_configured 2022-06-14 18:11:33 +02:00
hsi HSI: core: Fix return freed object in hsi_new_client 2022-01-27 09:19:41 +01:00
hv random: remove unused irq_flags argument from add_interrupt_randomness() 2022-06-22 14:11:06 +02:00
hwmon hwmon: Make chip parameter for with_info API mandatory 2022-06-14 18:11:29 +02:00
hwspinlock
hwtracing coresight: cpu-debug: Replace mutex with mutex_trylock on panic notifier 2022-06-14 18:11:52 +02:00
i2c i2c: cadence: Increase timeout per message if necessary 2022-06-14 18:11:56 +02:00
i3c
ide
idle
iio iio: st_sensors: Add a local lock for protecting odr 2022-06-14 18:11:59 +02:00
infiniband RDMA/rxe: Generate a completion for unsupported/invalid opcode 2022-06-14 18:11:50 +02:00
input Input: bcm5974 - set missing URB_NO_TRANSFER_DMA_MAP urb flag 2022-06-14 18:12:03 +02:00
interconnect
iommu iommu/msm: Fix an incorrect NULL check on list iterator 2022-06-14 18:11:48 +02:00
ipack
irqchip irqchip: irq-xtensa-mx: fix initial IRQ affinity 2022-06-14 18:11:48 +02:00
isdn mISDN: change function names to avoid conflicts 2022-01-11 15:23:33 +01:00
leds
lightnvm lightnvm: disable the subsystem 2022-05-09 09:03:20 +02:00
macintosh macintosh: via-pmu and via-cuda need RTC_LIB 2022-06-14 18:11:42 +02:00
mailbox mailbox: forward the hrtimer if not queued and under a lock 2022-06-14 18:11:42 +02:00
mcb
md md/raid0: Ignore RAID0 layout if the second zone has only one device 2022-06-14 18:12:03 +02:00
media media: coda: Add more H264 levels for CODA960 2022-06-14 18:11:47 +02:00
memory memory: atmel-ebi: Fix missing of_node_put in atmel_ebi_probe 2022-04-20 09:19:34 +02:00
memstick
message
mfd mfd: davinci_voicecodec: Fix possible null-ptr-deref davinci_vc_probe() 2022-06-14 18:11:42 +02:00
misc misc: rtsx: set NULL intfdata when probe fails 2022-06-14 18:12:00 +02:00
mmc mmc: block: Fix CQE recovery reset success 2022-06-14 18:12:02 +02:00
mtd mtd: cfi_cmdset_0002: Use chip_ready() for write on S29GL064N 2022-06-14 18:12:03 +02:00
mux
net ixgbe: fix unexpected VLAN Rx in promisc mode on VF 2022-06-14 18:12:02 +02:00
nfc nfc: st21nfca: fix incorrect sizing calculations in EVT_TRANSACTION 2022-06-22 14:11:02 +02:00
ntb
nubus
nvdimm nvdimm: Allow overwrite in the presence of disabled dimms 2022-06-14 18:11:40 +02:00
nvme nvme-pci: fix a NULL pointer dereference in nvme_alloc_admin_tags 2022-06-14 18:11:28 +02:00
nvmem
of of: overlay: do not break notify on NOTIFY_{OK|STOP} 2022-06-14 18:11:34 +02:00
opp opp: Fix return in _opp_add_static_v2() 2021-11-17 09:48:44 +01:00
oprofile
parisc parisc: Fix CPU affinity for Lasi, WAX and Dino chips 2022-04-15 14:18:36 +02:00
parport
pci PCI: qcom: Fix unbalanced PHY init on probe errors 2022-06-14 18:11:46 +02:00
pcmcia pcmcia: db1xxx_ss: restrict to MIPS_DB1XXX boards 2022-06-14 18:11:50 +02:00
perf arm_pmu: Validate single/group leader events 2022-04-27 13:50:50 +02:00
phy phy: qcom-qmp: fix pipe-clock imbalance on power-on failure 2022-06-14 18:11:52 +02:00
pinctrl pinctrl: mvebu: Fix irq_of_parse_and_map() return value 2022-06-14 18:11:41 +02:00
platform platform/chrome: cros_ec_debugfs: detach log reader wq from devm 2022-05-25 09:14:33 +02:00
pnp
power power: supply: axp288-charger: Set Vhold to 4.4V 2022-04-15 14:18:33 +02:00
powercap
pps
ps3
ptp ptp: replace snprintf with sysfs_emit 2022-04-15 14:18:32 +02:00
pwm pwm: lp3943: Fix duty calculation in case period was clamped 2022-06-14 18:11:51 +02:00
rapidio
ras
regulator regulator: pfuze100: Fix refcount leak in pfuze_parse_regulators_dt 2022-06-14 18:11:37 +02:00
remoteproc remoteproc: qcom_wcnss: Add missing of_node_put() in wcnss_alloc_memory_region 2022-04-15 14:18:19 +02:00
reset reset: tegra-bpmp: Restore Handle errors in BPMP response 2022-04-27 13:50:47 +02:00
rpmsg rpmsg: qcom_smd: Fix returning 0 if irq_of_parse_and_map() fails 2022-06-14 18:11:52 +02:00
rtc rtc: mt6397: check return value after calling platform_get_resource() 2022-06-14 18:11:53 +02:00
s390 s390/lcs: fix variable dereferenced before check 2022-05-18 09:47:25 +02:00
sbus
scsi scsi: myrb: Fix up null pointer access on myrb_cleanup() 2022-06-14 18:12:00 +02:00
sfi
sh maple: fix wrong return value of maple_bus_init(). 2021-11-26 10:47:17 +01:00
siox
slimbus slimbus: qcom: Fix IRQ check in qcom_slim_probe 2022-05-18 09:47:27 +02:00
soc soc: rockchip: Fix refcount leak in rockchip_grf_init 2022-06-14 18:11:53 +02:00
soundwire
spi spi: img-spfi: Fix pm_runtime_get_sync() error checking 2022-06-14 18:11:33 +02:00
spmi
ssb
staging staging: rtl8712: fix uninit-value in r871xu_drv_init() 2022-06-14 18:12:00 +02:00
target scsi: target: tcmu: Fix possible page UAF 2022-04-20 09:19:36 +02:00
tc
tee optee: use driver internal tee_context for some rpc 2022-03-02 11:41:04 +01:00
thermal thermal/drivers/broadcom: Fix potential NULL dereference in sr_thermal_probe 2022-06-14 18:11:38 +02:00
thunderbolt
tty serial: msm_serial: disable interrupts in __msm_console_write() 2022-06-14 18:12:00 +02:00
uio
usb usb: dwc2: gadget: don't reset gadget's driver->bus 2022-06-14 18:12:00 +02:00
vfio
vhost vringh: Fix loop descriptors check in the indirect cases 2022-06-14 18:12:02 +02:00
video video: fbdev: pxa3xx-gcu: release the resources correctly in pxa3xx_gcu_probe/remove() 2022-06-14 18:11:57 +02:00
virt
virtio virtio: acknowledge all features before access 2022-03-16 13:21:48 +01:00
visorbus
vlynq
vme
w1 w1: w1_therm: fixes w1_seq for ds28ea00 sensors 2022-04-15 14:18:35 +02:00
watchdog watchdog: wdat_wdt: Stop watchdog when rebooting the system 2022-06-14 18:12:00 +02:00
xen xen: unexport __init-annotated xen_xlate_map_ballooned_pages() 2022-06-14 18:11:57 +02:00
zorro
Kconfig
Makefile