Home | History | Annotate | Line # | Download | only in gen
arc4random.c revision 1.34
      1 /*	$NetBSD: arc4random.c,v 1.34 2024/01/20 14:52:47 christos Exp $	*/
      2 
      3 /*-
      4  * Copyright (c) 2014 The NetBSD Foundation, Inc.
      5  * All rights reserved.
      6  *
      7  * This code is derived from software contributed to The NetBSD Foundation
      8  * by Taylor R. Campbell.
      9  *
     10  * Redistribution and use in source and binary forms, with or without
     11  * modification, are permitted provided that the following conditions
     12  * are met:
     13  * 1. Redistributions of source code must retain the above copyright
     14  *    notice, this list of conditions and the following disclaimer.
     15  * 2. Redistributions in binary form must reproduce the above copyright
     16  *    notice, this list of conditions and the following disclaimer in the
     17  *    documentation and/or other materials provided with the distribution.
     18  *
     19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     29  * POSSIBILITY OF SUCH DAMAGE.
     30  */
     31 
     32 /*
     33  * Legacy arc4random(3) API from OpenBSD reimplemented using the
     34  * ChaCha20 PRF, with per-thread state.
     35  *
     36  * Security model:
     37  * - An attacker who sees some outputs cannot predict past or future
     38  *   outputs.
     39  * - An attacker who sees the PRNG state cannot predict past outputs.
     40  * - An attacker who sees a child's PRNG state cannot predict past or
     41  *   future outputs in the parent, or in other children.
     42  *
     43  * The arc4random(3) API may abort the process if:
     44  *
     45  * (a) the crypto self-test fails,
     46  * (b) pthread_atfork or thr_keycreate fail, or
     47  * (c) sysctl(KERN_ARND) fails when reseeding the PRNG.
     48  *
     49  * The crypto self-test, pthread_atfork, and thr_keycreate occur only
     50  * once, on the first use of any of the arc4random(3) API.  KERN_ARND
     51  * is unlikely to fail later unless the kernel is seriously broken.
     52  */
     53 
     54 #include <sys/cdefs.h>
     55 __RCSID("$NetBSD: arc4random.c,v 1.34 2024/01/20 14:52:47 christos Exp $");
     56 
     57 #include "namespace.h"
     58 #include "reentrant.h"
     59 
     60 #include <sys/bitops.h>
     61 #include <sys/endian.h>
     62 #include <sys/errno.h>
     63 #include <sys/mman.h>
     64 #include <sys/sysctl.h>
     65 
     66 #include <assert.h>
     67 #include <sha2.h>
     68 #include <stdbool.h>
     69 #include <stdint.h>
     70 #include <stdlib.h>
     71 #include <string.h>
     72 #include <unistd.h>
     73 
     74 #ifdef __weak_alias
     75 __weak_alias(arc4random,_arc4random)
     76 __weak_alias(arc4random_addrandom,_arc4random_addrandom)
     77 __weak_alias(arc4random_buf,_arc4random_buf)
     78 __weak_alias(arc4random_stir,_arc4random_stir)
     79 __weak_alias(arc4random_uniform,_arc4random_uniform)
     80 #endif
     81 
     82 /*
     83  * For standard ChaCha, use le32dec/le32enc.  We don't need that for
     84  * the purposes of a nondeterministic random number generator -- we
     85  * don't need to be bit-for-bit compatible over any wire.
     86  */
     87 
     88 static inline uint32_t
     89 crypto_le32dec(const void *p)
     90 {
     91 	uint32_t v;
     92 
     93 	(void)memcpy(&v, p, sizeof v);
     94 
     95 	return v;
     96 }
     97 
     98 static inline void
     99 crypto_le32enc(void *p, uint32_t v)
    100 {
    101 
    102 	(void)memcpy(p, &v, sizeof v);
    103 }
    104 
    105 /* ChaCha core */
    106 
    107 #define	crypto_core_OUTPUTBYTES	64
    108 #define	crypto_core_INPUTBYTES	16
    109 #define	crypto_core_KEYBYTES	32
    110 #define	crypto_core_CONSTBYTES	16
    111 
    112 #define	crypto_core_ROUNDS	20
    113 
    114 static uint32_t
    115 rotate(uint32_t u, unsigned c)
    116 {
    117 
    118 	return (u << c) | (u >> (32 - c));
    119 }
    120 
    121 #define	QUARTERROUND(a, b, c, d) do {					      \
    122 	(a) += (b); (d) ^= (a); (d) = rotate((d), 16);			      \
    123 	(c) += (d); (b) ^= (c); (b) = rotate((b), 12);			      \
    124 	(a) += (b); (d) ^= (a); (d) = rotate((d),  8);			      \
    125 	(c) += (d); (b) ^= (c); (b) = rotate((b),  7);			      \
    126 } while (0)
    127 
    128 static const uint8_t crypto_core_constant32[16] = "expand 32-byte k";
    129 
    130 static void
    131 crypto_core(uint8_t *out, const uint8_t *in, const uint8_t *k,
    132     const uint8_t *c)
    133 {
    134 	uint32_t x0,x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x15;
    135 	uint32_t j0,j1,j2,j3,j4,j5,j6,j7,j8,j9,j10,j11,j12,j13,j14,j15;
    136 	int i;
    137 
    138 	j0 = x0 = crypto_le32dec(c + 0);
    139 	j1 = x1 = crypto_le32dec(c + 4);
    140 	j2 = x2 = crypto_le32dec(c + 8);
    141 	j3 = x3 = crypto_le32dec(c + 12);
    142 	j4 = x4 = crypto_le32dec(k + 0);
    143 	j5 = x5 = crypto_le32dec(k + 4);
    144 	j6 = x6 = crypto_le32dec(k + 8);
    145 	j7 = x7 = crypto_le32dec(k + 12);
    146 	j8 = x8 = crypto_le32dec(k + 16);
    147 	j9 = x9 = crypto_le32dec(k + 20);
    148 	j10 = x10 = crypto_le32dec(k + 24);
    149 	j11 = x11 = crypto_le32dec(k + 28);
    150 	j12 = x12 = crypto_le32dec(in + 0);
    151 	j13 = x13 = crypto_le32dec(in + 4);
    152 	j14 = x14 = crypto_le32dec(in + 8);
    153 	j15 = x15 = crypto_le32dec(in + 12);
    154 
    155 	for (i = crypto_core_ROUNDS; i > 0; i -= 2) {
    156 		QUARTERROUND( x0, x4, x8,x12);
    157 		QUARTERROUND( x1, x5, x9,x13);
    158 		QUARTERROUND( x2, x6,x10,x14);
    159 		QUARTERROUND( x3, x7,x11,x15);
    160 		QUARTERROUND( x0, x5,x10,x15);
    161 		QUARTERROUND( x1, x6,x11,x12);
    162 		QUARTERROUND( x2, x7, x8,x13);
    163 		QUARTERROUND( x3, x4, x9,x14);
    164 	}
    165 
    166 	crypto_le32enc(out + 0, x0 + j0);
    167 	crypto_le32enc(out + 4, x1 + j1);
    168 	crypto_le32enc(out + 8, x2 + j2);
    169 	crypto_le32enc(out + 12, x3 + j3);
    170 	crypto_le32enc(out + 16, x4 + j4);
    171 	crypto_le32enc(out + 20, x5 + j5);
    172 	crypto_le32enc(out + 24, x6 + j6);
    173 	crypto_le32enc(out + 28, x7 + j7);
    174 	crypto_le32enc(out + 32, x8 + j8);
    175 	crypto_le32enc(out + 36, x9 + j9);
    176 	crypto_le32enc(out + 40, x10 + j10);
    177 	crypto_le32enc(out + 44, x11 + j11);
    178 	crypto_le32enc(out + 48, x12 + j12);
    179 	crypto_le32enc(out + 52, x13 + j13);
    180 	crypto_le32enc(out + 56, x14 + j14);
    181 	crypto_le32enc(out + 60, x15 + j15);
    182 }
    183 
    184 /* ChaCha self-test */
    185 
    186 #ifdef _DIAGNOSTIC
    187 
    188 /*
    189  * Test vector for ChaCha20 from
    190  * <http://tools.ietf.org/html/draft-strombergson-chacha-test-vectors-00>,
    191  * test vectors for ChaCha12 and ChaCha8 and for big-endian machines
    192  * generated by the same crypto_core code with crypto_core_ROUNDS and
    193  * crypto_le32enc/dec varied.
    194  */
    195 
    196 static const uint8_t crypto_core_selftest_vector[64] = {
    197 #if _BYTE_ORDER == _LITTLE_ENDIAN
    198 #  if crypto_core_ROUNDS == 8
    199 	0x3e,0x00,0xef,0x2f,0x89,0x5f,0x40,0xd6,
    200 	0x7f,0x5b,0xb8,0xe8,0x1f,0x09,0xa5,0xa1,
    201 	0x2c,0x84,0x0e,0xc3,0xce,0x9a,0x7f,0x3b,
    202 	0x18,0x1b,0xe1,0x88,0xef,0x71,0x1a,0x1e,
    203 	0x98,0x4c,0xe1,0x72,0xb9,0x21,0x6f,0x41,
    204 	0x9f,0x44,0x53,0x67,0x45,0x6d,0x56,0x19,
    205 	0x31,0x4a,0x42,0xa3,0xda,0x86,0xb0,0x01,
    206 	0x38,0x7b,0xfd,0xb8,0x0e,0x0c,0xfe,0x42,
    207 #  elif crypto_core_ROUNDS == 12
    208 	0x9b,0xf4,0x9a,0x6a,0x07,0x55,0xf9,0x53,
    209 	0x81,0x1f,0xce,0x12,0x5f,0x26,0x83,0xd5,
    210 	0x04,0x29,0xc3,0xbb,0x49,0xe0,0x74,0x14,
    211 	0x7e,0x00,0x89,0xa5,0x2e,0xae,0x15,0x5f,
    212 	0x05,0x64,0xf8,0x79,0xd2,0x7a,0xe3,0xc0,
    213 	0x2c,0xe8,0x28,0x34,0xac,0xfa,0x8c,0x79,
    214 	0x3a,0x62,0x9f,0x2c,0xa0,0xde,0x69,0x19,
    215 	0x61,0x0b,0xe8,0x2f,0x41,0x13,0x26,0xbe,
    216 #  elif crypto_core_ROUNDS == 20
    217 	0x76,0xb8,0xe0,0xad,0xa0,0xf1,0x3d,0x90,
    218 	0x40,0x5d,0x6a,0xe5,0x53,0x86,0xbd,0x28,
    219 	0xbd,0xd2,0x19,0xb8,0xa0,0x8d,0xed,0x1a,
    220 	0xa8,0x36,0xef,0xcc,0x8b,0x77,0x0d,0xc7,
    221 	0xda,0x41,0x59,0x7c,0x51,0x57,0x48,0x8d,
    222 	0x77,0x24,0xe0,0x3f,0xb8,0xd8,0x4a,0x37,
    223 	0x6a,0x43,0xb8,0xf4,0x15,0x18,0xa1,0x1c,
    224 	0xc3,0x87,0xb6,0x69,0xb2,0xee,0x65,0x86,
    225 #  else
    226 #    error crypto_core_ROUNDS must be 8, 12, or 20.
    227 #  endif
    228 #elif _BYTE_ORDER == _BIG_ENDIAN
    229 #  if crypto_core_ROUNDS == 8
    230 	0x9a,0x13,0x07,0xe3,0x38,0x18,0x9e,0x99,
    231 	0x15,0x37,0x16,0x4d,0x04,0xe6,0x48,0x9a,
    232 	0x07,0xd6,0xe8,0x7a,0x02,0xf9,0xf5,0xc7,
    233 	0x3f,0xa9,0xc2,0x0a,0xe1,0xc6,0x62,0xea,
    234 	0x80,0xaf,0xb6,0x51,0xca,0x52,0x43,0x87,
    235 	0xe3,0xa6,0xa6,0x61,0x11,0xf5,0xe6,0xcf,
    236 	0x09,0x0f,0xdc,0x9d,0xc3,0xc3,0xbb,0x43,
    237 	0xd7,0xfa,0x70,0x42,0xbf,0xa5,0xee,0xa2,
    238 #  elif crypto_core_ROUNDS == 12
    239 	0xcf,0x6c,0x16,0x48,0xbf,0xf4,0xba,0x85,
    240 	0x32,0x69,0xd3,0x98,0xc8,0x7d,0xcd,0x3f,
    241 	0xdc,0x76,0x6b,0xa2,0x7b,0xcb,0x17,0x4d,
    242 	0x05,0xda,0xdd,0xd8,0x62,0x54,0xbf,0xe0,
    243 	0x65,0xed,0x0e,0xf4,0x01,0x7e,0x3c,0x05,
    244 	0x35,0xb2,0x7a,0x60,0xf3,0x8f,0x12,0x33,
    245 	0x24,0x60,0xcd,0x85,0xfe,0x4c,0xf3,0x39,
    246 	0xb1,0x0e,0x3e,0xe0,0xba,0xa6,0x2f,0xa9,
    247 #  elif crypto_core_ROUNDS == 20
    248 	0x83,0x8b,0xf8,0x75,0xf7,0xde,0x9d,0x8c,
    249 	0x33,0x14,0x72,0x28,0xd1,0xbe,0x88,0xe5,
    250 	0x94,0xb5,0xed,0xb8,0x56,0xb5,0x9e,0x0c,
    251 	0x64,0x6a,0xaf,0xd9,0xa7,0x49,0x10,0x59,
    252 	0xba,0x3a,0x82,0xf8,0x4a,0x70,0x9c,0x00,
    253 	0x82,0x2c,0xae,0xc6,0xd7,0x1c,0x2e,0xda,
    254 	0x2a,0xfb,0x61,0x70,0x2b,0xd1,0xbf,0x8b,
    255 	0x95,0xbc,0x23,0xb6,0x4b,0x60,0x02,0xec,
    256 #  else
    257 #    error crypto_core_ROUNDS must be 8, 12, or 20.
    258 #  endif
    259 #else
    260 #  error Byte order must be little-endian or big-endian.
    261 #endif
    262 };
    263 
    264 static int
    265 crypto_core_selftest(void)
    266 {
    267 	const uint8_t nonce[crypto_core_INPUTBYTES] = {0};
    268 	const uint8_t key[crypto_core_KEYBYTES] = {0};
    269 	uint8_t block[64];
    270 	unsigned i;
    271 
    272 	crypto_core(block, nonce, key, crypto_core_constant32);
    273 	for (i = 0; i < 64; i++) {
    274 		if (block[i] != crypto_core_selftest_vector[i])
    275 			return EIO;
    276 	}
    277 
    278 	return 0;
    279 }
    280 
    281 #else  /* !_DIAGNOSTIC */
    282 
    283 static int
    284 crypto_core_selftest(void)
    285 {
    286 
    287 	return 0;
    288 }
    289 
    290 #endif
    291 
    292 /* PRNG */
    293 
    294 /*
    295  * For a state s, rather than use ChaCha20 as a stream cipher to
    296  * generate the concatenation ChaCha20_s(0) || ChaCha20_s(1) || ..., we
    297  * split ChaCha20_s(0) into s' || x and yield x for the first request,
    298  * split ChaCha20_s'(0) into s'' || y and yield y for the second
    299  * request, &c.  This provides backtracking resistance: an attacker who
    300  * finds s'' can't recover s' or x.
    301  */
    302 
    303 #define	crypto_prng_SEEDBYTES		crypto_core_KEYBYTES
    304 #define	crypto_prng_MAXOUTPUTBYTES	\
    305 	(crypto_core_OUTPUTBYTES - crypto_prng_SEEDBYTES)
    306 
    307 struct crypto_prng {
    308 	uint8_t		state[crypto_prng_SEEDBYTES];
    309 };
    310 
    311 static void
    312 crypto_prng_seed(struct crypto_prng *prng, const void *seed)
    313 {
    314 
    315 	(void)memcpy(prng->state, seed, crypto_prng_SEEDBYTES);
    316 }
    317 
    318 static void
    319 crypto_prng_buf(struct crypto_prng *prng, void *buf, size_t n)
    320 {
    321 	const uint8_t nonce[crypto_core_INPUTBYTES] = {0};
    322 	uint8_t output[crypto_core_OUTPUTBYTES];
    323 
    324 	_DIAGASSERT(n <= crypto_prng_MAXOUTPUTBYTES);
    325 	__CTASSERT(sizeof prng->state + crypto_prng_MAXOUTPUTBYTES
    326 	    <= sizeof output);
    327 
    328 	crypto_core(output, nonce, prng->state, crypto_core_constant32);
    329 	(void)memcpy(prng->state, output, sizeof prng->state);
    330 	(void)memcpy(buf, output + sizeof prng->state, n);
    331 	(void)explicit_memset(output, 0, sizeof output);
    332 }
    333 
    334 /* One-time stream: expand short single-use secret into long secret */
    335 
    336 #define	crypto_onetimestream_SEEDBYTES	crypto_core_KEYBYTES
    337 
    338 static void
    339 crypto_onetimestream(const void *seed, void *buf, size_t n)
    340 {
    341 	uint32_t nonce[crypto_core_INPUTBYTES / sizeof(uint32_t)] = {0};
    342 	uint8_t block[crypto_core_OUTPUTBYTES];
    343 	uint8_t *p8, *p32;
    344 	const uint8_t *nonce8 = (const uint8_t *)(void *)nonce;
    345 	size_t ni, nb, nf;
    346 
    347 	/*
    348 	 * Guarantee we can generate up to n bytes.  We have
    349 	 * 2^(8*INPUTBYTES) possible inputs yielding output of
    350 	 * OUTPUTBYTES*2^(8*INPUTBYTES) bytes.  It suffices to require
    351 	 * that sizeof n > (1/CHAR_BIT) log_2 n be less than
    352 	 * (1/CHAR_BIT) log_2 of the total output stream length.  We
    353 	 * have
    354 	 *
    355 	 *	log_2 (o 2^(8 i)) = log_2 o + log_2 2^(8 i)
    356 	 *	  = log_2 o + 8 i.
    357 	 */
    358 #ifndef __lint__
    359 	__CTASSERT(CHAR_BIT * sizeof n <= (ilog2(crypto_core_OUTPUTBYTES) +
    360 		8 * crypto_core_INPUTBYTES));
    361 #endif
    362 
    363 	p8 = buf;
    364 	p32 = (uint8_t *)roundup2((uintptr_t)p8, 4);
    365 	ni = p32 - p8;
    366 	if (n < ni)
    367 		ni = n;
    368 	nb = (n - ni) / sizeof block;
    369 	nf = (n - ni) % sizeof block;
    370 
    371 	_DIAGASSERT(((uintptr_t)p32 & 3) == 0);
    372 	_DIAGASSERT(ni <= n);
    373 	_DIAGASSERT(nb <= (n / sizeof block));
    374 	_DIAGASSERT(nf <= n);
    375 	_DIAGASSERT(n == (ni + (nb * sizeof block) + nf));
    376 	_DIAGASSERT(ni < 4);
    377 	_DIAGASSERT(nf < sizeof block);
    378 
    379 	if (ni) {
    380 		crypto_core(block, nonce8, seed, crypto_core_constant32);
    381 		nonce[0]++;
    382 		(void)memcpy(p8, block, ni);
    383 	}
    384 	while (nb--) {
    385 		crypto_core(p32, nonce8, seed, crypto_core_constant32);
    386 		if (++nonce[0] == 0)
    387 			nonce[1]++;
    388 		p32 += crypto_core_OUTPUTBYTES;
    389 	}
    390 	if (nf) {
    391 		crypto_core(block, nonce8, seed, crypto_core_constant32);
    392 		if (++nonce[0] == 0)
    393 			nonce[1]++;
    394 		(void)memcpy(p32, block, nf);
    395 	}
    396 
    397 	if (ni | nf)
    398 		(void)explicit_memset(block, 0, sizeof block);
    399 }
    400 
    401 /* arc4random state: per-thread, per-process (zeroed in child on fork) */
    402 
    403 struct arc4random_prng {
    404 	struct crypto_prng	arc4_prng;
    405 	bool			arc4_seeded;
    406 };
    407 
    408 static void
    409 arc4random_prng_addrandom(struct arc4random_prng *prng, const void *data,
    410     size_t datalen)
    411 {
    412 	const int mib[] = { CTL_KERN, KERN_ARND };
    413 	SHA256_CTX ctx;
    414 	uint8_t buf[crypto_prng_SEEDBYTES];
    415 	size_t buflen = sizeof buf;
    416 
    417 	__CTASSERT(sizeof buf == SHA256_DIGEST_LENGTH);
    418 
    419 	SHA256_Init(&ctx);
    420 
    421 	crypto_prng_buf(&prng->arc4_prng, buf, sizeof buf);
    422 	SHA256_Update(&ctx, buf, sizeof buf);
    423 
    424 	if (sysctl(mib, (u_int)__arraycount(mib), buf, &buflen, NULL, 0) == -1)
    425 		abort();
    426 	if (buflen != sizeof buf)
    427 		abort();
    428 	SHA256_Update(&ctx, buf, sizeof buf);
    429 
    430 	if (data != NULL)
    431 		SHA256_Update(&ctx, data, datalen);
    432 
    433 	SHA256_Final(buf, &ctx);
    434 	(void)explicit_memset(&ctx, 0, sizeof ctx);
    435 
    436 	/* reseed(SHA256(prng() || sysctl(KERN_ARND) || data)) */
    437 	crypto_prng_seed(&prng->arc4_prng, buf);
    438 	(void)explicit_memset(buf, 0, sizeof buf);
    439 	prng->arc4_seeded = true;
    440 }
    441 
    442 #ifdef _REENTRANT
    443 static struct arc4random_prng *
    444 arc4random_prng_create(void)
    445 {
    446 	struct arc4random_prng *prng;
    447 	const size_t size = roundup(sizeof(*prng), sysconf(_SC_PAGESIZE));
    448 
    449 	prng = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1,
    450 	    0);
    451 	if (prng == MAP_FAILED)
    452 		goto fail0;
    453 	if (minherit(prng, size, MAP_INHERIT_ZERO) == -1)
    454 		goto fail1;
    455 
    456 	return prng;
    457 
    458 fail1:	(void)munmap(prng, size);
    459 fail0:	return NULL;
    460 }
    461 #endif
    462 
    463 #ifdef _REENTRANT
    464 static void
    465 arc4random_prng_destroy(struct arc4random_prng *prng)
    466 {
    467 	const size_t size = roundup(sizeof(*prng), sysconf(_SC_PAGESIZE));
    468 
    469 	(void)explicit_memset(prng, 0, sizeof(*prng));
    470 	(void)munmap(prng, size);
    471 }
    472 #endif
    473 
    474 /* Library state */
    475 
    476 static struct arc4random_global {
    477 #ifdef _REENTRANT
    478 	mutex_t			lock;
    479 	thread_key_t		thread_key;
    480 #endif
    481 	struct arc4random_prng	prng;
    482 	bool			initialized;
    483 } arc4random_global = {
    484 #ifdef _REENTRANT
    485 	.lock		= MUTEX_INITIALIZER,
    486 #endif
    487 	.initialized	= false,
    488 };
    489 
    490 static void
    491 arc4random_atfork_prepare(void)
    492 {
    493 
    494 	mutex_lock(&arc4random_global.lock);
    495 	(void)explicit_memset(&arc4random_global.prng, 0,
    496 	    sizeof arc4random_global.prng);
    497 }
    498 
    499 static void
    500 arc4random_atfork_parent(void)
    501 {
    502 
    503 	mutex_unlock(&arc4random_global.lock);
    504 }
    505 
    506 static void
    507 arc4random_atfork_child(void)
    508 {
    509 
    510 	mutex_unlock(&arc4random_global.lock);
    511 }
    512 
    513 #ifdef _REENTRANT
    514 static void
    515 arc4random_tsd_destructor(void *p)
    516 {
    517 	struct arc4random_prng *const prng = p;
    518 
    519 	arc4random_prng_destroy(prng);
    520 }
    521 #endif
    522 
    523 static void
    524 arc4random_initialize(void)
    525 {
    526 
    527 	mutex_lock(&arc4random_global.lock);
    528 	if (!arc4random_global.initialized) {
    529 		if (crypto_core_selftest() != 0)
    530 			abort();
    531 		if (pthread_atfork(&arc4random_atfork_prepare,
    532 			&arc4random_atfork_parent, &arc4random_atfork_child)
    533 		    != 0)
    534 			abort();
    535 #ifdef _REENTRANT
    536 		if (thr_keycreate(&arc4random_global.thread_key,
    537 			&arc4random_tsd_destructor) != 0)
    538 			abort();
    539 #endif
    540 		arc4random_global.initialized = true;
    541 	}
    542 	mutex_unlock(&arc4random_global.lock);
    543 }
    544 
    545 static struct arc4random_prng *
    546 arc4random_prng_get(void)
    547 {
    548 	struct arc4random_prng *prng = NULL;
    549 
    550 	/* Make sure the library is initialized.  */
    551 	if (__predict_false(!arc4random_global.initialized))
    552 		arc4random_initialize();
    553 
    554 #ifdef _REENTRANT
    555 	/* Get or create the per-thread PRNG state.  */
    556 	prng = thr_getspecific(arc4random_global.thread_key);
    557 	if (__predict_false(prng == NULL)) {
    558 		prng = arc4random_prng_create();
    559 		thr_setspecific(arc4random_global.thread_key, prng);
    560 	}
    561 #endif
    562 
    563 	/* If we can't create it, fall back to the global PRNG.  */
    564 	if (__predict_false(prng == NULL)) {
    565 		mutex_lock(&arc4random_global.lock);
    566 		prng = &arc4random_global.prng;
    567 	}
    568 
    569 	/* Guarantee the PRNG is seeded.  */
    570 	if (__predict_false(!prng->arc4_seeded))
    571 		arc4random_prng_addrandom(prng, NULL, 0);
    572 
    573 	return prng;
    574 }
    575 
    576 static void
    577 arc4random_prng_put(struct arc4random_prng *prng)
    578 {
    579 
    580 	/* If we had fallen back to the global PRNG, unlock it.  */
    581 	if (__predict_false(prng == &arc4random_global.prng))
    582 		mutex_unlock(&arc4random_global.lock);
    583 }
    584 
    585 /* Public API */
    586 
    587 uint32_t
    588 arc4random(void)
    589 {
    590 	struct arc4random_prng *prng;
    591 	uint32_t v;
    592 
    593 	prng = arc4random_prng_get();
    594 	crypto_prng_buf(&prng->arc4_prng, &v, sizeof v);
    595 	arc4random_prng_put(prng);
    596 
    597 	return v;
    598 }
    599 
    600 void
    601 arc4random_buf(void *buf, size_t len)
    602 {
    603 	struct arc4random_prng *prng;
    604 
    605 	if (len <= crypto_prng_MAXOUTPUTBYTES) {
    606 		prng = arc4random_prng_get();
    607 		crypto_prng_buf(&prng->arc4_prng, buf, len);
    608 		arc4random_prng_put(prng);
    609 	} else {
    610 		uint8_t seed[crypto_onetimestream_SEEDBYTES];
    611 
    612 		prng = arc4random_prng_get();
    613 		crypto_prng_buf(&prng->arc4_prng, seed, sizeof seed);
    614 		arc4random_prng_put(prng);
    615 
    616 		crypto_onetimestream(seed, buf, len);
    617 		(void)explicit_memset(seed, 0, sizeof seed);
    618 	}
    619 }
    620 
    621 uint32_t
    622 arc4random_uniform(uint32_t bound)
    623 {
    624 	struct arc4random_prng *prng;
    625 	uint32_t minimum, r;
    626 
    627 	/*
    628 	 * We want a uniform random choice in [0, n), and arc4random()
    629 	 * makes a uniform random choice in [0, 2^32).  If we reduce
    630 	 * that modulo n, values in [0, 2^32 mod n) will be represented
    631 	 * slightly more than values in [2^32 mod n, n).  Instead we
    632 	 * choose only from [2^32 mod n, 2^32) by rejecting samples in
    633 	 * [0, 2^32 mod n), to avoid counting the extra representative
    634 	 * of [0, 2^32 mod n).  To compute 2^32 mod n, note that
    635 	 *
    636 	 *	2^32 mod n = 2^32 mod n - 0
    637 	 *	  = 2^32 mod n - n mod n
    638 	 *	  = (2^32 - n) mod n,
    639 	 *
    640 	 * the last of which is what we compute in 32-bit arithmetic.
    641 	 */
    642 	minimum = (-bound % bound);
    643 
    644 	prng = arc4random_prng_get();
    645 	do crypto_prng_buf(&prng->arc4_prng, &r, sizeof r);
    646 	while (__predict_false(r < minimum));
    647 	arc4random_prng_put(prng);
    648 
    649 	return (r % bound);
    650 }
    651 
    652 void
    653 arc4random_stir(void)
    654 {
    655 	struct arc4random_prng *prng;
    656 
    657 	prng = arc4random_prng_get();
    658 	arc4random_prng_addrandom(prng, NULL, 0);
    659 	arc4random_prng_put(prng);
    660 }
    661 
    662 /*
    663  * Silly signature here is for hysterical raisins.  Should instead be
    664  * const void *data and size_t datalen.
    665  */
    666 void
    667 arc4random_addrandom(u_char *data, int datalen)
    668 {
    669 	struct arc4random_prng *prng;
    670 
    671 	_DIAGASSERT(0 <= datalen);
    672 
    673 	prng = arc4random_prng_get();
    674 	arc4random_prng_addrandom(prng, data, datalen);
    675 	arc4random_prng_put(prng);
    676 }
    677 
    678 #ifdef _ARC4RANDOM_TEST
    679 
    680 #include <sys/wait.h>
    681 
    682 #include <err.h>
    683 #include <stdio.h>
    684 
    685 int
    686 main(int argc __unused, char **argv __unused)
    687 {
    688 	unsigned char gubbish[] = "random gubbish";
    689 	const uint8_t zero64[64] = {0};
    690 	uint8_t buf[2048];
    691 	unsigned i, a, n;
    692 
    693 	/* Test arc4random: should not be deterministic.  */
    694 	if (printf("arc4random: %08"PRIx32"\n", arc4random()) < 0)
    695 		err(1, "printf");
    696 
    697 	/* Test stirring: should definitely not be deterministic.  */
    698 	arc4random_stir();
    699 
    700 	/* Test small buffer.  */
    701 	arc4random_buf(buf, 8);
    702 	if (printf("arc4randombuf small:") < 0)
    703 		err(1, "printf");
    704 	for (i = 0; i < 8; i++)
    705 		if (printf(" %02x", buf[i]) < 0)
    706 			err(1, "printf");
    707 	if (printf("\n") < 0)
    708 		err(1, "printf");
    709 
    710 	/* Test addrandom: should not make the rest deterministic.  */
    711 	arc4random_addrandom(gubbish, sizeof gubbish);
    712 
    713 	/* Test large buffer.  */
    714 	arc4random_buf(buf, sizeof buf);
    715 	if (printf("arc4randombuf_large:") < 0)
    716 		err(1, "printf");
    717 	for (i = 0; i < sizeof buf; i++)
    718 		if (printf(" %02x", buf[i]) < 0)
    719 			err(1, "printf");
    720 	if (printf("\n") < 0)
    721 		err(1, "printf");
    722 
    723 	/* Test misaligned small and large.  */
    724 	for (a = 0; a < 64; a++) {
    725 		for (n = a; n < sizeof buf; n++) {
    726 			(void)memset(buf, 0, sizeof buf);
    727 			arc4random_buf(buf, n - a);
    728 			if (memcmp(buf + n - a, zero64, a) != 0)
    729 				errx(1, "arc4random buffer overflow 0");
    730 
    731 			(void)memset(buf, 0, sizeof buf);
    732 			arc4random_buf(buf + a, n - a);
    733 			if (memcmp(buf, zero64, a) != 0)
    734 				errx(1, "arc4random buffer overflow 1");
    735 
    736 			if ((2*a) <= n) {
    737 				(void)memset(buf, 0, sizeof buf);
    738 				arc4random_buf(buf + a, n - a - a);
    739 				if (memcmp(buf + n - a, zero64, a) != 0)
    740 					errx(1,
    741 					    "arc4random buffer overflow 2");
    742 			}
    743 		}
    744 	}
    745 
    746 	/* Test fork-safety.  */
    747     {
    748 	pid_t pid, rpid;
    749 	int status;
    750 
    751 	pid = fork();
    752 	switch (pid) {
    753 	case -1:
    754 		err(1, "fork");
    755 	case 0:
    756 		_exit(arc4random_prng_get()->arc4_seeded);
    757 	default:
    758 		rpid = waitpid(pid, &status, 0);
    759 		if (rpid == -1)
    760 			err(1, "waitpid");
    761 		if (rpid != pid)
    762 			errx(1, "waitpid returned wrong pid"
    763 			    ": %"PRIdMAX" != %"PRIdMAX,
    764 			    (intmax_t)rpid,
    765 			    (intmax_t)pid);
    766 		if (WIFEXITED(status)) {
    767 			if (WEXITSTATUS(status) != 0)
    768 				errx(1, "child exited with %d",
    769 				    WEXITSTATUS(status));
    770 		} else if (WIFSIGNALED(status)) {
    771 			errx(1, "child terminated on signal %d",
    772 			    WTERMSIG(status));
    773 		} else {
    774 			errx(1, "child died mysteriously: %d", status);
    775 		}
    776 	}
    777     }
    778 
    779 	/* XXX Test multithreaded fork safety...?  */
    780 
    781 	return 0;
    782 }
    783 #endif
    784