NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
PR/59117 CVS commit: [netbsd-10] src
The following reply was made to PR lib/59117; it has been noted by GNATS.
From: "Martin Husemann" <martin%netbsd.org@localhost>
To: gnats-bugs%gnats.NetBSD.org@localhost
Cc:
Subject: PR/59117 CVS commit: [netbsd-10] src
Date: Fri, 23 Oct 2026 19:05:12 +0000
Module Name: src
Committed By: martin
Date: Fri Oct 23 19:05:12 UTC 2026
Modified Files:
src/lib/libc/gen [netbsd-10]: arc4random.c
src/lib/libc/include [netbsd-10]: arc4random.h
src/sys/kern [netbsd-10]: kern_entropy.c
src/sys/sys [netbsd-10]: sysctl.h
src/tests/lib/libc/gen [netbsd-10]: t_arc4random.c
Log Message:
Pull up following revision(s) (requested by riastradh in ticket #1381):
lib/libc/gen/arc4random.c: revision 1.39
sys/kern/kern_entropy.c: revision 1.73
lib/libc/gen/arc4random.c: revision 1.50
lib/libc/include/arc4random.h: revision 1.2
lib/libc/include/arc4random.h: revision 1.3
lib/libc/include/arc4random.h: revision 1.4
lib/libc/gen/arc4random.c: revision 1.42
lib/libc/gen/arc4random.c: revision 1.44
lib/libc/gen/arc4random.c: revision 1.45
lib/libc/gen/arc4random.c: revision 1.46
lib/libc/gen/arc4random.c: revision 1.47
lib/libc/gen/arc4random.c: revision 1.48
lib/libc/gen/arc4random.c: revision 1.49
tests/lib/libc/gen/t_arc4random.c: revision 1.2
tests/lib/libc/gen/t_arc4random.c: revision 1.3
tests/lib/libc/gen/t_arc4random.c: revision 1.4
tests/lib/libc/gen/t_arc4random.c: revision 1.5
sys/sys/sysctl.h: revision 1.240
tests/lib/libc/gen/t_arc4random.c: revision 1.6
(all via patch)
t_arc4random: Fix test to guarantee global state initialization.
Previously, if pthread_atfork failed, arc4random_global_buf would
fail to initialize the global state as intended. (There are separate
tests for intentional failure of global state initialization.) It is
unlikely for pthread_atfork to fail, but with RLIMIT_AS cranked down
to zero, it may. To ensure that the global state is successfully
initialized for the tests that are trying to exercise it, call
arc4random from another thread first before forcing failure of the
local state initialization.
PR lib/59117: arc4random has some failure modes it shouldn't
arc4random(3): Avoid failure due to thread key limits.
If thr_keycreate (a.k.a. pthread_key_create) fails, fall back to
using globally serialized state instead of per-thread state. This is
unlikely to happen but arc4random(3) should work even if it does.
New test case forces exercising this path (at least, simulating the
effect of key creation failure).
PR lib/59117: arc4random has some failure modes it shouldn't
arc4random(3): Don't ifdef out the self-test.
The runtime cost of this test is negligible (64 bytes of data and a
handful of instructions for the subroutine) and the security value of
verifying a known input/output for the deterministic cryptographic
function on whose security the whole API relies is high.
t_arc4random: Verify arc4random works without fds.
It must work in an empty chroot where /dev/urandom doesn't exist, and
it must work when the file descriptor resource limit is exceeded.
Prompted by discussion around:
PR lib/59117: arc4random has some failure modes it shouldn't
Fortunately these are not failure modes of the current arc4random
implementation! But it is important to test them nevertheless, to
forestall any temptation to invent new failure modes.
arc4random(3): Switch to use thr_once (libc pthread_once symbol).
This way, we reduce the problem of arc4random initialization
fork-safety to the problem of pthread_once fork-safety -- and
anything else to do with one-time lazy initialization.
PR lib/59124: arc4random(3): first call in process races with
concurrent fork
t_arc4random: Test arc4random_global.per_thread, not .initialized.
If arc4random_initialize has been called, and thr_keycreate failed,
then .initialized will be true but .per_thread will be false -- and
.thread_key will be garbage (some other thread key for another
purpose, most likely). This path was enabled by allowing
thr_keycreate to fail instead of aborting the process.
This hasn't caused trouble yet, mainly because we don't do anything
to inject faults into thr_keycreate in these tests. Tweak the
global_threadkeylimit test while here to provoke a crash with the
wrong conditional.
Fix a similar edge case in the little test program embedded in
arc4random.c (which should maybe just go away now that we have atf
tests).
PR lib/59117: arc4random has some failure modes it shouldn't
arc4random(3): Provide a fallback in case pthread_atfork fails.
This is considerably more work and burden on testing than simply
statically preallocating a bit of storage for pthread_atfork to
eliminate the failure mode altogether, but it is less work than
arguing further over the atfork interface:
https://mail-index.NetBSD.org/source-changes-d/2025/03/02/msg014387.html
PR lib/59117: arc4random has some failure modes it shouldn't
arc4random(3): Add self-tests for PRNG algorithm.
Independently generated by running:
head -c 64 </dev/zero | openssl enc -chacha -20 -K 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f -iv -iv 00000000000000000000000000000000 | hexdump -C
and then repeating with the first 32 bytes of output as the updated
key for -K, extracting bytes [32, 32 + n) for the n-byte output in
each call.
arc4random(4): Fix crypto_onetimestream_selftest on big-endian.
Had computed the nonce increment the wrong way around when simulating
a big-endian machine to generate this.
arc4random(3): Isolate endian-dependence of crypto_onetimestream.
Make it all happen in crypto_le32enc/dec (which in this file is
actually just memcpy). This way you can swap out crypto_le32enc/dec
to test either byte order on any machine, e.g. for generating the
test vectors. And if we ever decide that it's not worthwhile to take
advantage of the purely nondeterministic nature of the API to make
this have potentially less performance penalty on big-endian systems
(which I'm not sure has ever been measured anyway), it'll all
continue to work under
#define crypto_le32enc le32enc
#define crypto_le32dec le32dec
with all the _BYTE_ORDER == _BIG_ENDIAN conditionals removed from the
self-tests.
No change to the code of crypto_onetimstream on hppa under tools gcc.
Assign static MIB numbers for kern.entropy.epoch.
This sidesteps any need for dynamically sized memory in userland to
resolve sysctl names to read it out, or for a new syscall interface
to sysctl resolution by name.
It would really be better to expose this through a page shared with
userland, so querying it doesn't cost a syscall, but this will serve
for now.
PR lib/59148: arc4random calls malloc so it can't be used in an ELF
constructor
To generate a diff of this commit:
cvs rdiff -u -r1.33.2.2 -r1.33.2.3 src/lib/libc/gen/arc4random.c
cvs rdiff -u -r1.1.2.2 -r1.1.2.3 src/lib/libc/include/arc4random.h
cvs rdiff -u -r1.57.4.6 -r1.57.4.7 src/sys/kern/kern_entropy.c
cvs rdiff -u -r1.236 -r1.236.4.1 src/sys/sys/sysctl.h
cvs rdiff -u -r1.1.2.2 -r1.1.2.3 src/tests/lib/libc/gen/t_arc4random.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Home |
Main Index |
Thread Index |
Old Index