Home | History | Annotate | Line # | Download | only in gen
arc4random.c revision 1.35
      1  1.35  riastrad /*	$NetBSD: arc4random.c,v 1.35 2024/08/26 15:19:22 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.26  riastrad  * (a) the crypto self-test fails,
     46  1.26  riastrad  * (b) pthread_atfork or thr_keycreate fail, or
     47  1.26  riastrad  * (c) sysctl(KERN_ARND) fails when reseeding the PRNG.
     48   1.1    itojun  *
     49  1.26  riastrad  * The crypto self-test, pthread_atfork, and thr_keycreate occur only
     50  1.26  riastrad  * once, on the first use of any of the arc4random(3) API.  KERN_ARND
     51  1.26  riastrad  * is unlikely to fail later unless the kernel is seriously broken.
     52   1.1    itojun  */
     53   1.1    itojun 
     54   1.8     lukem #include <sys/cdefs.h>
     55  1.35  riastrad __RCSID("$NetBSD: arc4random.c,v 1.35 2024/08/26 15:19:22 riastradh Exp $");
     56   1.8     lukem 
     57   1.7    kleink #include "namespace.h"
     58  1.11       tls #include "reentrant.h"
     59  1.26  riastrad 
     60  1.26  riastrad #include <sys/bitops.h>
     61  1.26  riastrad #include <sys/endian.h>
     62  1.26  riastrad #include <sys/errno.h>
     63  1.26  riastrad #include <sys/mman.h>
     64  1.26  riastrad #include <sys/sysctl.h>
     65  1.26  riastrad 
     66  1.26  riastrad #include <assert.h>
     67  1.26  riastrad #include <sha2.h>
     68  1.35  riastrad #include <stdatomic.h>
     69  1.22       roy #include <stdbool.h>
     70  1.26  riastrad #include <stdint.h>
     71   1.1    itojun #include <stdlib.h>
     72  1.26  riastrad #include <string.h>
     73   1.1    itojun #include <unistd.h>
     74   1.1    itojun 
     75   1.7    kleink #ifdef __weak_alias
     76   1.7    kleink __weak_alias(arc4random,_arc4random)
     77  1.20       dsl __weak_alias(arc4random_addrandom,_arc4random_addrandom)
     78  1.20       dsl __weak_alias(arc4random_buf,_arc4random_buf)
     79  1.20       dsl __weak_alias(arc4random_stir,_arc4random_stir)
     80  1.20       dsl __weak_alias(arc4random_uniform,_arc4random_uniform)
     81   1.7    kleink #endif
     82   1.7    kleink 
     83  1.26  riastrad /*
     84  1.26  riastrad  * For standard ChaCha, use le32dec/le32enc.  We don't need that for
     85  1.26  riastrad  * the purposes of a nondeterministic random number generator -- we
     86  1.26  riastrad  * don't need to be bit-for-bit compatible over any wire.
     87  1.26  riastrad  */
     88  1.26  riastrad 
     89  1.26  riastrad static inline uint32_t
     90  1.26  riastrad crypto_le32dec(const void *p)
     91  1.26  riastrad {
     92  1.26  riastrad 	uint32_t v;
     93  1.26  riastrad 
     94  1.26  riastrad 	(void)memcpy(&v, p, sizeof v);
     95  1.23       apb 
     96  1.26  riastrad 	return v;
     97  1.26  riastrad }
     98  1.26  riastrad 
     99  1.26  riastrad static inline void
    100  1.26  riastrad crypto_le32enc(void *p, uint32_t v)
    101  1.26  riastrad {
    102  1.26  riastrad 
    103  1.26  riastrad 	(void)memcpy(p, &v, sizeof v);
    104  1.26  riastrad }
    105  1.26  riastrad 
    106  1.26  riastrad /* ChaCha core */
    107  1.26  riastrad 
    108  1.26  riastrad #define	crypto_core_OUTPUTBYTES	64
    109  1.26  riastrad #define	crypto_core_INPUTBYTES	16
    110  1.26  riastrad #define	crypto_core_KEYBYTES	32
    111  1.26  riastrad #define	crypto_core_CONSTBYTES	16
    112  1.26  riastrad 
    113  1.28  riastrad #define	crypto_core_ROUNDS	20
    114  1.26  riastrad 
    115  1.26  riastrad static uint32_t
    116  1.26  riastrad rotate(uint32_t u, unsigned c)
    117  1.26  riastrad {
    118  1.26  riastrad 
    119  1.26  riastrad 	return (u << c) | (u >> (32 - c));
    120  1.26  riastrad }
    121  1.26  riastrad 
    122  1.26  riastrad #define	QUARTERROUND(a, b, c, d) do {					      \
    123  1.26  riastrad 	(a) += (b); (d) ^= (a); (d) = rotate((d), 16);			      \
    124  1.26  riastrad 	(c) += (d); (b) ^= (c); (b) = rotate((b), 12);			      \
    125  1.26  riastrad 	(a) += (b); (d) ^= (a); (d) = rotate((d),  8);			      \
    126  1.26  riastrad 	(c) += (d); (b) ^= (c); (b) = rotate((b),  7);			      \
    127  1.33    rillig } while (0)
    128  1.26  riastrad 
    129  1.34  christos static const uint8_t crypto_core_constant32[16] = "expand 32-byte k";
    130  1.26  riastrad 
    131  1.26  riastrad static void
    132  1.26  riastrad crypto_core(uint8_t *out, const uint8_t *in, const uint8_t *k,
    133  1.26  riastrad     const uint8_t *c)
    134  1.26  riastrad {
    135  1.26  riastrad 	uint32_t x0,x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x15;
    136  1.26  riastrad 	uint32_t j0,j1,j2,j3,j4,j5,j6,j7,j8,j9,j10,j11,j12,j13,j14,j15;
    137  1.26  riastrad 	int i;
    138  1.26  riastrad 
    139  1.26  riastrad 	j0 = x0 = crypto_le32dec(c + 0);
    140  1.26  riastrad 	j1 = x1 = crypto_le32dec(c + 4);
    141  1.26  riastrad 	j2 = x2 = crypto_le32dec(c + 8);
    142  1.26  riastrad 	j3 = x3 = crypto_le32dec(c + 12);
    143  1.26  riastrad 	j4 = x4 = crypto_le32dec(k + 0);
    144  1.26  riastrad 	j5 = x5 = crypto_le32dec(k + 4);
    145  1.26  riastrad 	j6 = x6 = crypto_le32dec(k + 8);
    146  1.26  riastrad 	j7 = x7 = crypto_le32dec(k + 12);
    147  1.26  riastrad 	j8 = x8 = crypto_le32dec(k + 16);
    148  1.26  riastrad 	j9 = x9 = crypto_le32dec(k + 20);
    149  1.26  riastrad 	j10 = x10 = crypto_le32dec(k + 24);
    150  1.26  riastrad 	j11 = x11 = crypto_le32dec(k + 28);
    151  1.26  riastrad 	j12 = x12 = crypto_le32dec(in + 0);
    152  1.26  riastrad 	j13 = x13 = crypto_le32dec(in + 4);
    153  1.26  riastrad 	j14 = x14 = crypto_le32dec(in + 8);
    154  1.26  riastrad 	j15 = x15 = crypto_le32dec(in + 12);
    155  1.26  riastrad 
    156  1.26  riastrad 	for (i = crypto_core_ROUNDS; i > 0; i -= 2) {
    157  1.26  riastrad 		QUARTERROUND( x0, x4, x8,x12);
    158  1.26  riastrad 		QUARTERROUND( x1, x5, x9,x13);
    159  1.26  riastrad 		QUARTERROUND( x2, x6,x10,x14);
    160  1.26  riastrad 		QUARTERROUND( x3, x7,x11,x15);
    161  1.26  riastrad 		QUARTERROUND( x0, x5,x10,x15);
    162  1.26  riastrad 		QUARTERROUND( x1, x6,x11,x12);
    163  1.26  riastrad 		QUARTERROUND( x2, x7, x8,x13);
    164  1.26  riastrad 		QUARTERROUND( x3, x4, x9,x14);
    165  1.26  riastrad 	}
    166  1.26  riastrad 
    167  1.26  riastrad 	crypto_le32enc(out + 0, x0 + j0);
    168  1.26  riastrad 	crypto_le32enc(out + 4, x1 + j1);
    169  1.26  riastrad 	crypto_le32enc(out + 8, x2 + j2);
    170  1.26  riastrad 	crypto_le32enc(out + 12, x3 + j3);
    171  1.26  riastrad 	crypto_le32enc(out + 16, x4 + j4);
    172  1.26  riastrad 	crypto_le32enc(out + 20, x5 + j5);
    173  1.26  riastrad 	crypto_le32enc(out + 24, x6 + j6);
    174  1.26  riastrad 	crypto_le32enc(out + 28, x7 + j7);
    175  1.26  riastrad 	crypto_le32enc(out + 32, x8 + j8);
    176  1.26  riastrad 	crypto_le32enc(out + 36, x9 + j9);
    177  1.26  riastrad 	crypto_le32enc(out + 40, x10 + j10);
    178  1.26  riastrad 	crypto_le32enc(out + 44, x11 + j11);
    179  1.26  riastrad 	crypto_le32enc(out + 48, x12 + j12);
    180  1.26  riastrad 	crypto_le32enc(out + 52, x13 + j13);
    181  1.26  riastrad 	crypto_le32enc(out + 56, x14 + j14);
    182  1.26  riastrad 	crypto_le32enc(out + 60, x15 + j15);
    183  1.26  riastrad }
    184  1.26  riastrad 
    185  1.26  riastrad /* ChaCha self-test */
    186  1.26  riastrad 
    187  1.26  riastrad #ifdef _DIAGNOSTIC
    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 #else  /* !_DIAGNOSTIC */
    283  1.26  riastrad 
    284  1.26  riastrad static int
    285  1.26  riastrad crypto_core_selftest(void)
    286  1.22       roy {
    287  1.22       roy 
    288  1.26  riastrad 	return 0;
    289  1.22       roy }
    290  1.22       roy 
    291  1.26  riastrad #endif
    292  1.26  riastrad 
    293  1.26  riastrad /* PRNG */
    294  1.26  riastrad 
    295  1.26  riastrad /*
    296  1.26  riastrad  * For a state s, rather than use ChaCha20 as a stream cipher to
    297  1.26  riastrad  * generate the concatenation ChaCha20_s(0) || ChaCha20_s(1) || ..., we
    298  1.26  riastrad  * split ChaCha20_s(0) into s' || x and yield x for the first request,
    299  1.26  riastrad  * split ChaCha20_s'(0) into s'' || y and yield y for the second
    300  1.26  riastrad  * request, &c.  This provides backtracking resistance: an attacker who
    301  1.26  riastrad  * finds s'' can't recover s' or x.
    302  1.26  riastrad  */
    303  1.26  riastrad 
    304  1.26  riastrad #define	crypto_prng_SEEDBYTES		crypto_core_KEYBYTES
    305  1.26  riastrad #define	crypto_prng_MAXOUTPUTBYTES	\
    306  1.26  riastrad 	(crypto_core_OUTPUTBYTES - crypto_prng_SEEDBYTES)
    307  1.26  riastrad 
    308  1.26  riastrad struct crypto_prng {
    309  1.26  riastrad 	uint8_t		state[crypto_prng_SEEDBYTES];
    310  1.26  riastrad };
    311  1.26  riastrad 
    312  1.22       roy static void
    313  1.26  riastrad crypto_prng_seed(struct crypto_prng *prng, const void *seed)
    314  1.22       roy {
    315  1.22       roy 
    316  1.26  riastrad 	(void)memcpy(prng->state, seed, crypto_prng_SEEDBYTES);
    317  1.22       roy }
    318  1.22       roy 
    319  1.22       roy static void
    320  1.26  riastrad crypto_prng_buf(struct crypto_prng *prng, void *buf, size_t n)
    321  1.22       roy {
    322  1.26  riastrad 	const uint8_t nonce[crypto_core_INPUTBYTES] = {0};
    323  1.26  riastrad 	uint8_t output[crypto_core_OUTPUTBYTES];
    324  1.26  riastrad 
    325  1.26  riastrad 	_DIAGASSERT(n <= crypto_prng_MAXOUTPUTBYTES);
    326  1.26  riastrad 	__CTASSERT(sizeof prng->state + crypto_prng_MAXOUTPUTBYTES
    327  1.26  riastrad 	    <= sizeof output);
    328  1.22       roy 
    329  1.26  riastrad 	crypto_core(output, nonce, prng->state, crypto_core_constant32);
    330  1.26  riastrad 	(void)memcpy(prng->state, output, sizeof prng->state);
    331  1.26  riastrad 	(void)memcpy(buf, output + sizeof prng->state, n);
    332  1.26  riastrad 	(void)explicit_memset(output, 0, sizeof output);
    333  1.22       roy }
    334  1.22       roy 
    335  1.26  riastrad /* One-time stream: expand short single-use secret into long secret */
    336  1.26  riastrad 
    337  1.26  riastrad #define	crypto_onetimestream_SEEDBYTES	crypto_core_KEYBYTES
    338  1.26  riastrad 
    339  1.26  riastrad static void
    340  1.26  riastrad crypto_onetimestream(const void *seed, void *buf, size_t n)
    341  1.15       dsl {
    342  1.26  riastrad 	uint32_t nonce[crypto_core_INPUTBYTES / sizeof(uint32_t)] = {0};
    343  1.26  riastrad 	uint8_t block[crypto_core_OUTPUTBYTES];
    344  1.26  riastrad 	uint8_t *p8, *p32;
    345  1.27  christos 	const uint8_t *nonce8 = (const uint8_t *)(void *)nonce;
    346  1.26  riastrad 	size_t ni, nb, nf;
    347  1.26  riastrad 
    348  1.25       roy 	/*
    349  1.26  riastrad 	 * Guarantee we can generate up to n bytes.  We have
    350  1.26  riastrad 	 * 2^(8*INPUTBYTES) possible inputs yielding output of
    351  1.26  riastrad 	 * OUTPUTBYTES*2^(8*INPUTBYTES) bytes.  It suffices to require
    352  1.26  riastrad 	 * that sizeof n > (1/CHAR_BIT) log_2 n be less than
    353  1.26  riastrad 	 * (1/CHAR_BIT) log_2 of the total output stream length.  We
    354  1.26  riastrad 	 * have
    355  1.26  riastrad 	 *
    356  1.26  riastrad 	 *	log_2 (o 2^(8 i)) = log_2 o + log_2 2^(8 i)
    357  1.26  riastrad 	 *	  = log_2 o + 8 i.
    358  1.25       roy 	 */
    359  1.32  christos #ifndef __lint__
    360  1.32  christos 	__CTASSERT(CHAR_BIT * sizeof n <= (ilog2(crypto_core_OUTPUTBYTES) +
    361  1.32  christos 		8 * crypto_core_INPUTBYTES));
    362  1.32  christos #endif
    363  1.15       dsl 
    364  1.26  riastrad 	p8 = buf;
    365  1.26  riastrad 	p32 = (uint8_t *)roundup2((uintptr_t)p8, 4);
    366  1.26  riastrad 	ni = p32 - p8;
    367  1.26  riastrad 	if (n < ni)
    368  1.26  riastrad 		ni = n;
    369  1.26  riastrad 	nb = (n - ni) / sizeof block;
    370  1.26  riastrad 	nf = (n - ni) % sizeof block;
    371  1.26  riastrad 
    372  1.26  riastrad 	_DIAGASSERT(((uintptr_t)p32 & 3) == 0);
    373  1.26  riastrad 	_DIAGASSERT(ni <= n);
    374  1.26  riastrad 	_DIAGASSERT(nb <= (n / sizeof block));
    375  1.26  riastrad 	_DIAGASSERT(nf <= n);
    376  1.26  riastrad 	_DIAGASSERT(n == (ni + (nb * sizeof block) + nf));
    377  1.26  riastrad 	_DIAGASSERT(ni < 4);
    378  1.26  riastrad 	_DIAGASSERT(nf < sizeof block);
    379  1.26  riastrad 
    380  1.26  riastrad 	if (ni) {
    381  1.26  riastrad 		crypto_core(block, nonce8, seed, crypto_core_constant32);
    382  1.26  riastrad 		nonce[0]++;
    383  1.26  riastrad 		(void)memcpy(p8, block, ni);
    384  1.26  riastrad 	}
    385  1.26  riastrad 	while (nb--) {
    386  1.26  riastrad 		crypto_core(p32, nonce8, seed, crypto_core_constant32);
    387  1.26  riastrad 		if (++nonce[0] == 0)
    388  1.26  riastrad 			nonce[1]++;
    389  1.26  riastrad 		p32 += crypto_core_OUTPUTBYTES;
    390  1.26  riastrad 	}
    391  1.26  riastrad 	if (nf) {
    392  1.26  riastrad 		crypto_core(block, nonce8, seed, crypto_core_constant32);
    393  1.26  riastrad 		if (++nonce[0] == 0)
    394  1.26  riastrad 			nonce[1]++;
    395  1.26  riastrad 		(void)memcpy(p32, block, nf);
    396  1.22       roy 	}
    397  1.26  riastrad 
    398  1.26  riastrad 	if (ni | nf)
    399  1.26  riastrad 		(void)explicit_memset(block, 0, sizeof block);
    400  1.15       dsl }
    401  1.15       dsl 
    402  1.35  riastrad /*
    403  1.35  riastrad  * entropy_epoch()
    404  1.35  riastrad  *
    405  1.35  riastrad  *	Return the current entropy epoch, from the sysctl node
    406  1.35  riastrad  *	kern.entropy.epoch.
    407  1.35  riastrad  *
    408  1.35  riastrad  *	The entropy epoch is never zero.  Initially, or on error, it is
    409  1.35  riastrad  *	(unsigned)-1.  It may wrap around but it skips (unsigned)-1 and
    410  1.35  riastrad  *	0 when it does.  Changes happen less than once per second, so
    411  1.35  riastrad  *	wraparound will only affect systems after 136 years of uptime.
    412  1.35  riastrad  *
    413  1.35  riastrad  *	XXX This should get it from a page shared read-only by kernel
    414  1.35  riastrad  *	with userland, but until we implement such a mechanism, this
    415  1.35  riastrad  *	sysctl -- incurring the cost of a syscall -- will have to
    416  1.35  riastrad  *	serve.
    417  1.35  riastrad  */
    418  1.35  riastrad static unsigned
    419  1.35  riastrad entropy_epoch(void)
    420  1.35  riastrad {
    421  1.35  riastrad 	static atomic_int mib0[3];
    422  1.35  riastrad 	static atomic_bool initialized = false;
    423  1.35  riastrad 	int mib[3];
    424  1.35  riastrad 	unsigned epoch = -1;
    425  1.35  riastrad 	size_t epochlen = sizeof(epoch);
    426  1.35  riastrad 
    427  1.35  riastrad 	/*
    428  1.35  riastrad 	 * Resolve kern.entropy.epoch if we haven't already.  Cache it
    429  1.35  riastrad 	 * for the next caller.  Initialization is idempotent, so it's
    430  1.35  riastrad 	 * OK if two threads do it at once.
    431  1.35  riastrad 	 */
    432  1.35  riastrad 	if (atomic_load_explicit(&initialized, memory_order_acquire)) {
    433  1.35  riastrad 		mib[0] = atomic_load_explicit(&mib0[0], memory_order_relaxed);
    434  1.35  riastrad 		mib[1] = atomic_load_explicit(&mib0[1], memory_order_relaxed);
    435  1.35  riastrad 		mib[2] = atomic_load_explicit(&mib0[2], memory_order_relaxed);
    436  1.35  riastrad 	} else {
    437  1.35  riastrad 		size_t nmib = __arraycount(mib);
    438  1.35  riastrad 
    439  1.35  riastrad 		if (sysctlnametomib("kern.entropy.epoch", mib, &nmib) == -1)
    440  1.35  riastrad 			return -1;
    441  1.35  riastrad 		if (nmib != __arraycount(mib))
    442  1.35  riastrad 			return -1;
    443  1.35  riastrad 		atomic_store_explicit(&mib0[0], mib[0], memory_order_relaxed);
    444  1.35  riastrad 		atomic_store_explicit(&mib0[1], mib[1], memory_order_relaxed);
    445  1.35  riastrad 		atomic_store_explicit(&mib0[2], mib[2], memory_order_relaxed);
    446  1.35  riastrad 		atomic_store_explicit(&initialized, true,
    447  1.35  riastrad 		    memory_order_release);
    448  1.35  riastrad 	}
    449  1.35  riastrad 
    450  1.35  riastrad 	if (sysctl(mib, __arraycount(mib), &epoch, &epochlen, NULL, 0) == -1)
    451  1.35  riastrad 		return -1;
    452  1.35  riastrad 	if (epochlen != sizeof(epoch))
    453  1.35  riastrad 		return -1;
    454  1.35  riastrad 
    455  1.35  riastrad 	return epoch;
    456  1.35  riastrad }
    457  1.35  riastrad 
    458  1.26  riastrad /* arc4random state: per-thread, per-process (zeroed in child on fork) */
    459  1.26  riastrad 
    460  1.26  riastrad struct arc4random_prng {
    461  1.26  riastrad 	struct crypto_prng	arc4_prng;
    462  1.35  riastrad 	unsigned		arc4_epoch;
    463  1.26  riastrad };
    464  1.26  riastrad 
    465  1.26  riastrad static void
    466  1.26  riastrad arc4random_prng_addrandom(struct arc4random_prng *prng, const void *data,
    467  1.26  riastrad     size_t datalen)
    468  1.26  riastrad {
    469  1.26  riastrad 	const int mib[] = { CTL_KERN, KERN_ARND };
    470  1.26  riastrad 	SHA256_CTX ctx;
    471  1.26  riastrad 	uint8_t buf[crypto_prng_SEEDBYTES];
    472  1.26  riastrad 	size_t buflen = sizeof buf;
    473  1.35  riastrad 	unsigned epoch = entropy_epoch();
    474  1.26  riastrad 
    475  1.26  riastrad 	__CTASSERT(sizeof buf == SHA256_DIGEST_LENGTH);
    476  1.26  riastrad 
    477  1.26  riastrad 	SHA256_Init(&ctx);
    478  1.26  riastrad 
    479  1.26  riastrad 	crypto_prng_buf(&prng->arc4_prng, buf, sizeof buf);
    480  1.26  riastrad 	SHA256_Update(&ctx, buf, sizeof buf);
    481  1.26  riastrad 
    482  1.27  christos 	if (sysctl(mib, (u_int)__arraycount(mib), buf, &buflen, NULL, 0) == -1)
    483  1.26  riastrad 		abort();
    484  1.26  riastrad 	if (buflen != sizeof buf)
    485  1.26  riastrad 		abort();
    486  1.26  riastrad 	SHA256_Update(&ctx, buf, sizeof buf);
    487  1.26  riastrad 
    488  1.26  riastrad 	if (data != NULL)
    489  1.26  riastrad 		SHA256_Update(&ctx, data, datalen);
    490  1.26  riastrad 
    491  1.26  riastrad 	SHA256_Final(buf, &ctx);
    492  1.26  riastrad 	(void)explicit_memset(&ctx, 0, sizeof ctx);
    493  1.26  riastrad 
    494  1.26  riastrad 	/* reseed(SHA256(prng() || sysctl(KERN_ARND) || data)) */
    495  1.26  riastrad 	crypto_prng_seed(&prng->arc4_prng, buf);
    496  1.26  riastrad 	(void)explicit_memset(buf, 0, sizeof buf);
    497  1.35  riastrad 	prng->arc4_epoch = epoch;
    498  1.26  riastrad }
    499  1.26  riastrad 
    500  1.26  riastrad #ifdef _REENTRANT
    501  1.26  riastrad static struct arc4random_prng *
    502  1.26  riastrad arc4random_prng_create(void)
    503   1.1    itojun {
    504  1.26  riastrad 	struct arc4random_prng *prng;
    505  1.26  riastrad 	const size_t size = roundup(sizeof(*prng), sysconf(_SC_PAGESIZE));
    506   1.1    itojun 
    507  1.31  riastrad 	prng = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1,
    508  1.31  riastrad 	    0);
    509  1.26  riastrad 	if (prng == MAP_FAILED)
    510  1.26  riastrad 		goto fail0;
    511  1.26  riastrad 	if (minherit(prng, size, MAP_INHERIT_ZERO) == -1)
    512  1.26  riastrad 		goto fail1;
    513  1.26  riastrad 
    514  1.26  riastrad 	return prng;
    515  1.26  riastrad 
    516  1.26  riastrad fail1:	(void)munmap(prng, size);
    517  1.26  riastrad fail0:	return NULL;
    518   1.1    itojun }
    519  1.26  riastrad #endif
    520   1.1    itojun 
    521  1.26  riastrad #ifdef _REENTRANT
    522  1.26  riastrad static void
    523  1.26  riastrad arc4random_prng_destroy(struct arc4random_prng *prng)
    524   1.1    itojun {
    525  1.26  riastrad 	const size_t size = roundup(sizeof(*prng), sysconf(_SC_PAGESIZE));
    526   1.1    itojun 
    527  1.26  riastrad 	(void)explicit_memset(prng, 0, sizeof(*prng));
    528  1.26  riastrad 	(void)munmap(prng, size);
    529  1.26  riastrad }
    530  1.26  riastrad #endif
    531  1.22       roy 
    532  1.26  riastrad /* Library state */
    533  1.11       tls 
    534  1.26  riastrad static struct arc4random_global {
    535  1.26  riastrad #ifdef _REENTRANT
    536  1.26  riastrad 	mutex_t			lock;
    537  1.26  riastrad 	thread_key_t		thread_key;
    538  1.26  riastrad #endif
    539  1.26  riastrad 	struct arc4random_prng	prng;
    540  1.26  riastrad 	bool			initialized;
    541  1.26  riastrad } arc4random_global = {
    542  1.26  riastrad #ifdef _REENTRANT
    543  1.26  riastrad 	.lock		= MUTEX_INITIALIZER,
    544  1.26  riastrad #endif
    545  1.26  riastrad 	.initialized	= false,
    546  1.26  riastrad };
    547   1.3    itojun 
    548  1.26  riastrad static void
    549  1.26  riastrad arc4random_atfork_prepare(void)
    550  1.26  riastrad {
    551  1.18       dsl 
    552  1.26  riastrad 	mutex_lock(&arc4random_global.lock);
    553  1.26  riastrad 	(void)explicit_memset(&arc4random_global.prng, 0,
    554  1.26  riastrad 	    sizeof arc4random_global.prng);
    555  1.22       roy }
    556  1.22       roy 
    557  1.26  riastrad static void
    558  1.26  riastrad arc4random_atfork_parent(void)
    559  1.22       roy {
    560  1.22       roy 
    561  1.26  riastrad 	mutex_unlock(&arc4random_global.lock);
    562   1.1    itojun }
    563   1.1    itojun 
    564  1.26  riastrad static void
    565  1.26  riastrad arc4random_atfork_child(void)
    566   1.1    itojun {
    567   1.1    itojun 
    568  1.26  riastrad 	mutex_unlock(&arc4random_global.lock);
    569   1.1    itojun }
    570   1.1    itojun 
    571  1.26  riastrad #ifdef _REENTRANT
    572  1.26  riastrad static void
    573  1.26  riastrad arc4random_tsd_destructor(void *p)
    574  1.17       dsl {
    575  1.26  riastrad 	struct arc4random_prng *const prng = p;
    576  1.22       roy 
    577  1.26  riastrad 	arc4random_prng_destroy(prng);
    578  1.17       dsl }
    579  1.26  riastrad #endif
    580  1.17       dsl 
    581  1.26  riastrad static void
    582  1.26  riastrad arc4random_initialize(void)
    583   1.1    itojun {
    584  1.22       roy 
    585  1.26  riastrad 	mutex_lock(&arc4random_global.lock);
    586  1.26  riastrad 	if (!arc4random_global.initialized) {
    587  1.26  riastrad 		if (crypto_core_selftest() != 0)
    588  1.26  riastrad 			abort();
    589  1.26  riastrad 		if (pthread_atfork(&arc4random_atfork_prepare,
    590  1.26  riastrad 			&arc4random_atfork_parent, &arc4random_atfork_child)
    591  1.26  riastrad 		    != 0)
    592  1.26  riastrad 			abort();
    593  1.26  riastrad #ifdef _REENTRANT
    594  1.26  riastrad 		if (thr_keycreate(&arc4random_global.thread_key,
    595  1.26  riastrad 			&arc4random_tsd_destructor) != 0)
    596  1.26  riastrad 			abort();
    597  1.26  riastrad #endif
    598  1.26  riastrad 		arc4random_global.initialized = true;
    599  1.26  riastrad 	}
    600  1.26  riastrad 	mutex_unlock(&arc4random_global.lock);
    601   1.1    itojun }
    602   1.1    itojun 
    603  1.26  riastrad static struct arc4random_prng *
    604  1.26  riastrad arc4random_prng_get(void)
    605   1.1    itojun {
    606  1.26  riastrad 	struct arc4random_prng *prng = NULL;
    607  1.26  riastrad 
    608  1.26  riastrad 	/* Make sure the library is initialized.  */
    609  1.26  riastrad 	if (__predict_false(!arc4random_global.initialized))
    610  1.26  riastrad 		arc4random_initialize();
    611  1.26  riastrad 
    612  1.26  riastrad #ifdef _REENTRANT
    613  1.26  riastrad 	/* Get or create the per-thread PRNG state.  */
    614  1.26  riastrad 	prng = thr_getspecific(arc4random_global.thread_key);
    615  1.26  riastrad 	if (__predict_false(prng == NULL)) {
    616  1.26  riastrad 		prng = arc4random_prng_create();
    617  1.26  riastrad 		thr_setspecific(arc4random_global.thread_key, prng);
    618  1.26  riastrad 	}
    619  1.26  riastrad #endif
    620  1.26  riastrad 
    621  1.26  riastrad 	/* If we can't create it, fall back to the global PRNG.  */
    622  1.26  riastrad 	if (__predict_false(prng == NULL)) {
    623  1.26  riastrad 		mutex_lock(&arc4random_global.lock);
    624  1.26  riastrad 		prng = &arc4random_global.prng;
    625  1.26  riastrad 	}
    626  1.22       roy 
    627  1.26  riastrad 	/* Guarantee the PRNG is seeded.  */
    628  1.35  riastrad 	if (__predict_false(prng->arc4_epoch != entropy_epoch()))
    629  1.26  riastrad 		arc4random_prng_addrandom(prng, NULL, 0);
    630  1.26  riastrad 
    631  1.26  riastrad 	return prng;
    632   1.1    itojun }
    633   1.1    itojun 
    634  1.26  riastrad static void
    635  1.26  riastrad arc4random_prng_put(struct arc4random_prng *prng)
    636  1.11       tls {
    637  1.22       roy 
    638  1.26  riastrad 	/* If we had fallen back to the global PRNG, unlock it.  */
    639  1.26  riastrad 	if (__predict_false(prng == &arc4random_global.prng))
    640  1.26  riastrad 		mutex_unlock(&arc4random_global.lock);
    641   1.1    itojun }
    642   1.1    itojun 
    643  1.26  riastrad /* Public API */
    644  1.26  riastrad 
    645  1.10  christos uint32_t
    646  1.10  christos arc4random(void)
    647   1.1    itojun {
    648  1.26  riastrad 	struct arc4random_prng *prng;
    649  1.11       tls 	uint32_t v;
    650  1.16       dsl 
    651  1.26  riastrad 	prng = arc4random_prng_get();
    652  1.26  riastrad 	crypto_prng_buf(&prng->arc4_prng, &v, sizeof v);
    653  1.26  riastrad 	arc4random_prng_put(prng);
    654  1.26  riastrad 
    655  1.11       tls 	return v;
    656   1.1    itojun }
    657   1.1    itojun 
    658  1.16       dsl void
    659  1.16       dsl arc4random_buf(void *buf, size_t len)
    660  1.10  christos {
    661  1.26  riastrad 	struct arc4random_prng *prng;
    662  1.26  riastrad 
    663  1.26  riastrad 	if (len <= crypto_prng_MAXOUTPUTBYTES) {
    664  1.26  riastrad 		prng = arc4random_prng_get();
    665  1.26  riastrad 		crypto_prng_buf(&prng->arc4_prng, buf, len);
    666  1.26  riastrad 		arc4random_prng_put(prng);
    667  1.26  riastrad 	} else {
    668  1.26  riastrad 		uint8_t seed[crypto_onetimestream_SEEDBYTES];
    669  1.26  riastrad 
    670  1.26  riastrad 		prng = arc4random_prng_get();
    671  1.26  riastrad 		crypto_prng_buf(&prng->arc4_prng, seed, sizeof seed);
    672  1.26  riastrad 		arc4random_prng_put(prng);
    673  1.26  riastrad 
    674  1.26  riastrad 		crypto_onetimestream(seed, buf, len);
    675  1.26  riastrad 		(void)explicit_memset(seed, 0, sizeof seed);
    676  1.26  riastrad 	}
    677  1.26  riastrad }
    678  1.26  riastrad 
    679  1.26  riastrad uint32_t
    680  1.26  riastrad arc4random_uniform(uint32_t bound)
    681  1.26  riastrad {
    682  1.26  riastrad 	struct arc4random_prng *prng;
    683  1.26  riastrad 	uint32_t minimum, r;
    684  1.26  riastrad 
    685  1.26  riastrad 	/*
    686  1.26  riastrad 	 * We want a uniform random choice in [0, n), and arc4random()
    687  1.26  riastrad 	 * makes a uniform random choice in [0, 2^32).  If we reduce
    688  1.26  riastrad 	 * that modulo n, values in [0, 2^32 mod n) will be represented
    689  1.26  riastrad 	 * slightly more than values in [2^32 mod n, n).  Instead we
    690  1.26  riastrad 	 * choose only from [2^32 mod n, 2^32) by rejecting samples in
    691  1.26  riastrad 	 * [0, 2^32 mod n), to avoid counting the extra representative
    692  1.26  riastrad 	 * of [0, 2^32 mod n).  To compute 2^32 mod n, note that
    693  1.26  riastrad 	 *
    694  1.26  riastrad 	 *	2^32 mod n = 2^32 mod n - 0
    695  1.26  riastrad 	 *	  = 2^32 mod n - n mod n
    696  1.26  riastrad 	 *	  = (2^32 - n) mod n,
    697  1.26  riastrad 	 *
    698  1.26  riastrad 	 * the last of which is what we compute in 32-bit arithmetic.
    699  1.26  riastrad 	 */
    700  1.26  riastrad 	minimum = (-bound % bound);
    701  1.26  riastrad 
    702  1.26  riastrad 	prng = arc4random_prng_get();
    703  1.26  riastrad 	do crypto_prng_buf(&prng->arc4_prng, &r, sizeof r);
    704  1.26  riastrad 	while (__predict_false(r < minimum));
    705  1.26  riastrad 	arc4random_prng_put(prng);
    706  1.17       dsl 
    707  1.26  riastrad 	return (r % bound);
    708  1.11       tls }
    709  1.11       tls 
    710  1.26  riastrad void
    711  1.26  riastrad arc4random_stir(void)
    712  1.26  riastrad {
    713  1.26  riastrad 	struct arc4random_prng *prng;
    714  1.26  riastrad 
    715  1.26  riastrad 	prng = arc4random_prng_get();
    716  1.26  riastrad 	arc4random_prng_addrandom(prng, NULL, 0);
    717  1.26  riastrad 	arc4random_prng_put(prng);
    718  1.26  riastrad }
    719  1.10  christos 
    720  1.10  christos /*
    721  1.26  riastrad  * Silly signature here is for hysterical raisins.  Should instead be
    722  1.26  riastrad  * const void *data and size_t datalen.
    723  1.10  christos  */
    724  1.26  riastrad void
    725  1.26  riastrad arc4random_addrandom(u_char *data, int datalen)
    726  1.10  christos {
    727  1.26  riastrad 	struct arc4random_prng *prng;
    728  1.10  christos 
    729  1.26  riastrad 	_DIAGASSERT(0 <= datalen);
    730  1.10  christos 
    731  1.26  riastrad 	prng = arc4random_prng_get();
    732  1.26  riastrad 	arc4random_prng_addrandom(prng, data, datalen);
    733  1.26  riastrad 	arc4random_prng_put(prng);
    734  1.26  riastrad }
    735  1.26  riastrad 
    736  1.26  riastrad #ifdef _ARC4RANDOM_TEST
    737  1.26  riastrad 
    738  1.26  riastrad #include <sys/wait.h>
    739  1.26  riastrad 
    740  1.26  riastrad #include <err.h>
    741  1.26  riastrad #include <stdio.h>
    742  1.26  riastrad 
    743  1.26  riastrad int
    744  1.26  riastrad main(int argc __unused, char **argv __unused)
    745  1.26  riastrad {
    746  1.26  riastrad 	unsigned char gubbish[] = "random gubbish";
    747  1.26  riastrad 	const uint8_t zero64[64] = {0};
    748  1.26  riastrad 	uint8_t buf[2048];
    749  1.26  riastrad 	unsigned i, a, n;
    750  1.26  riastrad 
    751  1.26  riastrad 	/* Test arc4random: should not be deterministic.  */
    752  1.26  riastrad 	if (printf("arc4random: %08"PRIx32"\n", arc4random()) < 0)
    753  1.26  riastrad 		err(1, "printf");
    754  1.26  riastrad 
    755  1.26  riastrad 	/* Test stirring: should definitely not be deterministic.  */
    756  1.26  riastrad 	arc4random_stir();
    757  1.26  riastrad 
    758  1.26  riastrad 	/* Test small buffer.  */
    759  1.26  riastrad 	arc4random_buf(buf, 8);
    760  1.26  riastrad 	if (printf("arc4randombuf small:") < 0)
    761  1.26  riastrad 		err(1, "printf");
    762  1.26  riastrad 	for (i = 0; i < 8; i++)
    763  1.26  riastrad 		if (printf(" %02x", buf[i]) < 0)
    764  1.26  riastrad 			err(1, "printf");
    765  1.26  riastrad 	if (printf("\n") < 0)
    766  1.26  riastrad 		err(1, "printf");
    767  1.26  riastrad 
    768  1.26  riastrad 	/* Test addrandom: should not make the rest deterministic.  */
    769  1.26  riastrad 	arc4random_addrandom(gubbish, sizeof gubbish);
    770  1.26  riastrad 
    771  1.26  riastrad 	/* Test large buffer.  */
    772  1.26  riastrad 	arc4random_buf(buf, sizeof buf);
    773  1.26  riastrad 	if (printf("arc4randombuf_large:") < 0)
    774  1.26  riastrad 		err(1, "printf");
    775  1.26  riastrad 	for (i = 0; i < sizeof buf; i++)
    776  1.26  riastrad 		if (printf(" %02x", buf[i]) < 0)
    777  1.26  riastrad 			err(1, "printf");
    778  1.26  riastrad 	if (printf("\n") < 0)
    779  1.26  riastrad 		err(1, "printf");
    780  1.26  riastrad 
    781  1.26  riastrad 	/* Test misaligned small and large.  */
    782  1.26  riastrad 	for (a = 0; a < 64; a++) {
    783  1.26  riastrad 		for (n = a; n < sizeof buf; n++) {
    784  1.26  riastrad 			(void)memset(buf, 0, sizeof buf);
    785  1.26  riastrad 			arc4random_buf(buf, n - a);
    786  1.26  riastrad 			if (memcmp(buf + n - a, zero64, a) != 0)
    787  1.26  riastrad 				errx(1, "arc4random buffer overflow 0");
    788  1.26  riastrad 
    789  1.26  riastrad 			(void)memset(buf, 0, sizeof buf);
    790  1.26  riastrad 			arc4random_buf(buf + a, n - a);
    791  1.26  riastrad 			if (memcmp(buf, zero64, a) != 0)
    792  1.26  riastrad 				errx(1, "arc4random buffer overflow 1");
    793  1.26  riastrad 
    794  1.26  riastrad 			if ((2*a) <= n) {
    795  1.26  riastrad 				(void)memset(buf, 0, sizeof buf);
    796  1.26  riastrad 				arc4random_buf(buf + a, n - a - a);
    797  1.26  riastrad 				if (memcmp(buf + n - a, zero64, a) != 0)
    798  1.26  riastrad 					errx(1,
    799  1.26  riastrad 					    "arc4random buffer overflow 2");
    800  1.26  riastrad 			}
    801  1.26  riastrad 		}
    802  1.26  riastrad 	}
    803  1.16       dsl 
    804  1.26  riastrad 	/* Test fork-safety.  */
    805  1.26  riastrad     {
    806  1.26  riastrad 	pid_t pid, rpid;
    807  1.26  riastrad 	int status;
    808  1.26  riastrad 
    809  1.26  riastrad 	pid = fork();
    810  1.26  riastrad 	switch (pid) {
    811  1.26  riastrad 	case -1:
    812  1.26  riastrad 		err(1, "fork");
    813  1.26  riastrad 	case 0:
    814  1.26  riastrad 		_exit(arc4random_prng_get()->arc4_seeded);
    815  1.26  riastrad 	default:
    816  1.26  riastrad 		rpid = waitpid(pid, &status, 0);
    817  1.26  riastrad 		if (rpid == -1)
    818  1.26  riastrad 			err(1, "waitpid");
    819  1.26  riastrad 		if (rpid != pid)
    820  1.26  riastrad 			errx(1, "waitpid returned wrong pid"
    821  1.26  riastrad 			    ": %"PRIdMAX" != %"PRIdMAX,
    822  1.26  riastrad 			    (intmax_t)rpid,
    823  1.26  riastrad 			    (intmax_t)pid);
    824  1.26  riastrad 		if (WIFEXITED(status)) {
    825  1.26  riastrad 			if (WEXITSTATUS(status) != 0)
    826  1.26  riastrad 				errx(1, "child exited with %d",
    827  1.26  riastrad 				    WEXITSTATUS(status));
    828  1.26  riastrad 		} else if (WIFSIGNALED(status)) {
    829  1.26  riastrad 			errx(1, "child terminated on signal %d",
    830  1.26  riastrad 			    WTERMSIG(status));
    831  1.26  riastrad 		} else {
    832  1.26  riastrad 			errx(1, "child died mysteriously: %d", status);
    833  1.26  riastrad 		}
    834  1.26  riastrad 	}
    835  1.26  riastrad     }
    836  1.16       dsl 
    837  1.26  riastrad 	/* XXX Test multithreaded fork safety...?  */
    838  1.10  christos 
    839  1.26  riastrad 	return 0;
    840  1.10  christos }
    841  1.26  riastrad #endif
    842