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