arc4random.c revision 1.49 1 1.49 riastrad /* $NetBSD: arc4random.c,v 1.49 2025/03/11 13:35:54 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.49 riastrad __RCSID("$NetBSD: arc4random.c,v 1.49 2025/03/11 13:35:54 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.49 riastrad crypto_le32enc(&nonce[0], 1 + crypto_le32dec(&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.49 riastrad crypto_le32enc(&nonce[0], 1 + crypto_le32dec(&nonce[0]));
421 1.49 riastrad if (crypto_le32dec(&nonce[0]) == 0) {
422 1.49 riastrad crypto_le32enc(&nonce[1],
423 1.49 riastrad 1 + crypto_le32dec(&nonce[1]));
424 1.49 riastrad }
425 1.26 riastrad p32 += crypto_core_OUTPUTBYTES;
426 1.26 riastrad }
427 1.26 riastrad if (nf) {
428 1.26 riastrad crypto_core(block, nonce8, seed, crypto_core_constant32);
429 1.49 riastrad crypto_le32enc(&nonce[0], 1 + crypto_le32dec(&nonce[0]));
430 1.49 riastrad if (crypto_le32dec(&nonce[0]) == 0) {
431 1.49 riastrad crypto_le32enc(&nonce[1],
432 1.49 riastrad 1 + crypto_le32dec(&nonce[1]));
433 1.49 riastrad }
434 1.26 riastrad (void)memcpy(p32, block, nf);
435 1.22 roy }
436 1.26 riastrad
437 1.26 riastrad if (ni | nf)
438 1.26 riastrad (void)explicit_memset(block, 0, sizeof block);
439 1.15 dsl }
440 1.15 dsl
441 1.47 riastrad static int
442 1.47 riastrad crypto_onetimestream_selftest(void)
443 1.47 riastrad {
444 1.47 riastrad const uint8_t expected[70] = {
445 1.47 riastrad 0x5a, /* guard byte */
446 1.47 riastrad #if _BYTE_ORDER == _LITTLE_ENDIAN
447 1.47 riastrad # if crypto_core_ROUNDS == 20
448 1.47 riastrad 0x39,0xfd,0x2b, /* initial block */
449 1.47 riastrad 0x18,0xb8,0x42,0x31,0xad,0xe6,0xa6,0xd1,
450 1.47 riastrad 0x13,0x61,0x5c,0x61,0xaf,0x43,0x4e,0x27,
451 1.47 riastrad 0xf8,0xb1,0xf3,0xf5,0xe1,0xad,0x5b,0x5c,
452 1.47 riastrad 0xec,0xf8,0xfc,0x12,0x2a,0x35,0x75,0x5c,
453 1.47 riastrad 0x72,0x08,0x08,0x6d,0xd1,0xee,0x3c,0x5d,
454 1.47 riastrad 0x9d,0x81,0x58,0x24,0x64,0x0e,0x00,0x3c,
455 1.47 riastrad 0x9b,0xa0,0xf6,0x5e,0xde,0x5d,0x59,0xce,
456 1.47 riastrad 0x0d,0x2a,0x4a,0x7f,0x31,0x95,0x5a,0xcd,
457 1.47 riastrad 0x42, /* final block */
458 1.47 riastrad # else
459 1.47 riastrad # error crypto_core_ROUNDS other than 20 left as exercise for reader.
460 1.47 riastrad # endif
461 1.47 riastrad #elif _BYTE_ORDER == _BIG_ENDIAN
462 1.47 riastrad # if crypto_core_ROUNDS == 20
463 1.47 riastrad 0x20,0xf0,0x66, /* initial block */
464 1.48 riastrad 0x1a,0x82,0xda,0xb6,0xba,0x90,0x42,0x19,
465 1.48 riastrad 0x39,0xc2,0x4e,0x4d,0xaf,0xbc,0x67,0xcf,
466 1.48 riastrad 0xe3,0xe4,0xe2,0x80,0x38,0x80,0x8e,0x53,
467 1.48 riastrad 0x19,0x25,0x37,0x67,0x66,0x57,0x7c,0x78,
468 1.48 riastrad 0xac,0xb3,0x8b,0x97,0x54,0x20,0xc4,0x46,
469 1.48 riastrad 0xff,0x90,0x76,0x56,0xcc,0xde,0xe5,0xb9,
470 1.48 riastrad 0xdf,0x82,0x8c,0x05,0x9d,0xf0,0x69,0x99,
471 1.48 riastrad 0x42,0x53,0x74,0x5e,0x80,0x81,0xdb,0x9b,
472 1.48 riastrad 0xb1, /* final block */
473 1.47 riastrad # else
474 1.47 riastrad # error crypto_core_ROUNDS other than 20 left as exercise for reader.
475 1.47 riastrad # endif
476 1.47 riastrad #else
477 1.47 riastrad # error Byte order must be little-endian or big-endian.
478 1.47 riastrad #endif
479 1.47 riastrad 0xcc, /* guard byte */
480 1.47 riastrad };
481 1.47 riastrad uint8_t seed[crypto_prng_SEEDBYTES];
482 1.47 riastrad uint8_t output[70] __aligned(4);
483 1.47 riastrad unsigned i;
484 1.47 riastrad
485 1.47 riastrad for (i = 0; i < __arraycount(seed); i++)
486 1.47 riastrad seed[i] = i;
487 1.47 riastrad output[0] = 0x5a;
488 1.47 riastrad output[69] = 0xcc;
489 1.47 riastrad crypto_onetimestream(seed, output + 1, 68);
490 1.47 riastrad if (memcmp(output, expected, 70) != 0)
491 1.47 riastrad return EIO;
492 1.47 riastrad return 0;
493 1.47 riastrad }
494 1.47 riastrad
495 1.35 riastrad /*
496 1.35 riastrad * entropy_epoch()
497 1.35 riastrad *
498 1.35 riastrad * Return the current entropy epoch, from the sysctl node
499 1.35 riastrad * kern.entropy.epoch.
500 1.35 riastrad *
501 1.35 riastrad * The entropy epoch is never zero. Initially, or on error, it is
502 1.35 riastrad * (unsigned)-1. It may wrap around but it skips (unsigned)-1 and
503 1.35 riastrad * 0 when it does. Changes happen less than once per second, so
504 1.35 riastrad * wraparound will only affect systems after 136 years of uptime.
505 1.35 riastrad *
506 1.35 riastrad * XXX This should get it from a page shared read-only by kernel
507 1.35 riastrad * with userland, but until we implement such a mechanism, this
508 1.35 riastrad * sysctl -- incurring the cost of a syscall -- will have to
509 1.35 riastrad * serve.
510 1.35 riastrad */
511 1.35 riastrad static unsigned
512 1.35 riastrad entropy_epoch(void)
513 1.35 riastrad {
514 1.35 riastrad static atomic_int mib0[3];
515 1.35 riastrad static atomic_bool initialized = false;
516 1.35 riastrad int mib[3];
517 1.38 riastrad unsigned epoch = (unsigned)-1;
518 1.35 riastrad size_t epochlen = sizeof(epoch);
519 1.35 riastrad
520 1.35 riastrad /*
521 1.35 riastrad * Resolve kern.entropy.epoch if we haven't already. Cache it
522 1.35 riastrad * for the next caller. Initialization is idempotent, so it's
523 1.35 riastrad * OK if two threads do it at once.
524 1.35 riastrad */
525 1.35 riastrad if (atomic_load_explicit(&initialized, memory_order_acquire)) {
526 1.35 riastrad mib[0] = atomic_load_explicit(&mib0[0], memory_order_relaxed);
527 1.35 riastrad mib[1] = atomic_load_explicit(&mib0[1], memory_order_relaxed);
528 1.35 riastrad mib[2] = atomic_load_explicit(&mib0[2], memory_order_relaxed);
529 1.35 riastrad } else {
530 1.35 riastrad size_t nmib = __arraycount(mib);
531 1.35 riastrad
532 1.35 riastrad if (sysctlnametomib("kern.entropy.epoch", mib, &nmib) == -1)
533 1.38 riastrad return (unsigned)-1;
534 1.35 riastrad if (nmib != __arraycount(mib))
535 1.38 riastrad return (unsigned)-1;
536 1.35 riastrad atomic_store_explicit(&mib0[0], mib[0], memory_order_relaxed);
537 1.35 riastrad atomic_store_explicit(&mib0[1], mib[1], memory_order_relaxed);
538 1.35 riastrad atomic_store_explicit(&mib0[2], mib[2], memory_order_relaxed);
539 1.35 riastrad atomic_store_explicit(&initialized, true,
540 1.35 riastrad memory_order_release);
541 1.35 riastrad }
542 1.35 riastrad
543 1.35 riastrad if (sysctl(mib, __arraycount(mib), &epoch, &epochlen, NULL, 0) == -1)
544 1.38 riastrad return (unsigned)-1;
545 1.35 riastrad if (epochlen != sizeof(epoch))
546 1.38 riastrad return (unsigned)-1;
547 1.35 riastrad
548 1.35 riastrad return epoch;
549 1.35 riastrad }
550 1.35 riastrad
551 1.26 riastrad /* arc4random state: per-thread, per-process (zeroed in child on fork) */
552 1.26 riastrad
553 1.26 riastrad static void
554 1.26 riastrad arc4random_prng_addrandom(struct arc4random_prng *prng, const void *data,
555 1.26 riastrad size_t datalen)
556 1.26 riastrad {
557 1.26 riastrad const int mib[] = { CTL_KERN, KERN_ARND };
558 1.26 riastrad SHA256_CTX ctx;
559 1.26 riastrad uint8_t buf[crypto_prng_SEEDBYTES];
560 1.26 riastrad size_t buflen = sizeof buf;
561 1.35 riastrad unsigned epoch = entropy_epoch();
562 1.26 riastrad
563 1.26 riastrad __CTASSERT(sizeof buf == SHA256_DIGEST_LENGTH);
564 1.26 riastrad
565 1.26 riastrad SHA256_Init(&ctx);
566 1.26 riastrad
567 1.26 riastrad crypto_prng_buf(&prng->arc4_prng, buf, sizeof buf);
568 1.26 riastrad SHA256_Update(&ctx, buf, sizeof buf);
569 1.26 riastrad
570 1.27 christos if (sysctl(mib, (u_int)__arraycount(mib), buf, &buflen, NULL, 0) == -1)
571 1.26 riastrad abort();
572 1.26 riastrad if (buflen != sizeof buf)
573 1.26 riastrad abort();
574 1.26 riastrad SHA256_Update(&ctx, buf, sizeof buf);
575 1.26 riastrad
576 1.26 riastrad if (data != NULL)
577 1.26 riastrad SHA256_Update(&ctx, data, datalen);
578 1.26 riastrad
579 1.26 riastrad SHA256_Final(buf, &ctx);
580 1.26 riastrad (void)explicit_memset(&ctx, 0, sizeof ctx);
581 1.26 riastrad
582 1.26 riastrad /* reseed(SHA256(prng() || sysctl(KERN_ARND) || data)) */
583 1.26 riastrad crypto_prng_seed(&prng->arc4_prng, buf);
584 1.26 riastrad (void)explicit_memset(buf, 0, sizeof buf);
585 1.35 riastrad prng->arc4_epoch = epoch;
586 1.26 riastrad }
587 1.26 riastrad
588 1.26 riastrad #ifdef _REENTRANT
589 1.26 riastrad static struct arc4random_prng *
590 1.26 riastrad arc4random_prng_create(void)
591 1.1 itojun {
592 1.26 riastrad struct arc4random_prng *prng;
593 1.26 riastrad const size_t size = roundup(sizeof(*prng), sysconf(_SC_PAGESIZE));
594 1.1 itojun
595 1.31 riastrad prng = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1,
596 1.31 riastrad 0);
597 1.26 riastrad if (prng == MAP_FAILED)
598 1.26 riastrad goto fail0;
599 1.26 riastrad if (minherit(prng, size, MAP_INHERIT_ZERO) == -1)
600 1.26 riastrad goto fail1;
601 1.26 riastrad
602 1.26 riastrad return prng;
603 1.26 riastrad
604 1.26 riastrad fail1: (void)munmap(prng, size);
605 1.26 riastrad fail0: return NULL;
606 1.1 itojun }
607 1.26 riastrad #endif
608 1.1 itojun
609 1.26 riastrad #ifdef _REENTRANT
610 1.26 riastrad static void
611 1.26 riastrad arc4random_prng_destroy(struct arc4random_prng *prng)
612 1.1 itojun {
613 1.26 riastrad const size_t size = roundup(sizeof(*prng), sysconf(_SC_PAGESIZE));
614 1.1 itojun
615 1.26 riastrad (void)explicit_memset(prng, 0, sizeof(*prng));
616 1.26 riastrad (void)munmap(prng, size);
617 1.26 riastrad }
618 1.26 riastrad #endif
619 1.22 roy
620 1.26 riastrad /* Library state */
621 1.11 tls
622 1.37 riastrad struct arc4random_global_state arc4random_global = {
623 1.26 riastrad #ifdef _REENTRANT
624 1.26 riastrad .lock = MUTEX_INITIALIZER,
625 1.26 riastrad #endif
626 1.44 riastrad .once = ONCE_INITIALIZER,
627 1.26 riastrad };
628 1.3 itojun
629 1.26 riastrad static void
630 1.26 riastrad arc4random_atfork_prepare(void)
631 1.26 riastrad {
632 1.18 dsl
633 1.26 riastrad mutex_lock(&arc4random_global.lock);
634 1.26 riastrad (void)explicit_memset(&arc4random_global.prng, 0,
635 1.26 riastrad sizeof arc4random_global.prng);
636 1.22 roy }
637 1.22 roy
638 1.26 riastrad static void
639 1.26 riastrad arc4random_atfork_parent(void)
640 1.22 roy {
641 1.22 roy
642 1.26 riastrad mutex_unlock(&arc4random_global.lock);
643 1.1 itojun }
644 1.1 itojun
645 1.26 riastrad static void
646 1.26 riastrad arc4random_atfork_child(void)
647 1.1 itojun {
648 1.1 itojun
649 1.26 riastrad mutex_unlock(&arc4random_global.lock);
650 1.1 itojun }
651 1.1 itojun
652 1.26 riastrad #ifdef _REENTRANT
653 1.26 riastrad static void
654 1.26 riastrad arc4random_tsd_destructor(void *p)
655 1.17 dsl {
656 1.26 riastrad struct arc4random_prng *const prng = p;
657 1.22 roy
658 1.26 riastrad arc4random_prng_destroy(prng);
659 1.17 dsl }
660 1.26 riastrad #endif
661 1.17 dsl
662 1.26 riastrad static void
663 1.26 riastrad arc4random_initialize(void)
664 1.1 itojun {
665 1.22 roy
666 1.44 riastrad /*
667 1.44 riastrad * If the crypto software is broken, abort -- something is
668 1.44 riastrad * severely wrong with this process image.
669 1.44 riastrad */
670 1.47 riastrad if (crypto_core_selftest() != 0 ||
671 1.47 riastrad crypto_prng_selftest() != 0 ||
672 1.47 riastrad crypto_onetimestream_selftest() != 0)
673 1.44 riastrad abort();
674 1.44 riastrad
675 1.44 riastrad /*
676 1.44 riastrad * Set up a pthread_atfork handler to lock the global state
677 1.44 riastrad * around fork so that if forked children can't use the
678 1.44 riastrad * per-thread state, they can take the lock and use the global
679 1.46 riastrad * state without deadlock. If this fails, we will fall back to
680 1.46 riastrad * PRNG state on the stack reinitialized from the kernel
681 1.46 riastrad * entropy pool at every call.
682 1.44 riastrad */
683 1.44 riastrad if (pthread_atfork(&arc4random_atfork_prepare,
684 1.44 riastrad &arc4random_atfork_parent, &arc4random_atfork_child)
685 1.46 riastrad == 0)
686 1.46 riastrad arc4random_global.forksafe = true;
687 1.44 riastrad
688 1.44 riastrad /*
689 1.44 riastrad * For multithreaded builds, try to allocate a per-thread PRNG
690 1.44 riastrad * state to avoid contention due to arc4random.
691 1.44 riastrad */
692 1.26 riastrad #ifdef _REENTRANT
693 1.44 riastrad if (thr_keycreate(&arc4random_global.thread_key,
694 1.44 riastrad &arc4random_tsd_destructor) == 0)
695 1.44 riastrad arc4random_global.per_thread = true;
696 1.26 riastrad #endif
697 1.44 riastrad
698 1.44 riastrad /*
699 1.44 riastrad * Note that the arc4random library state has been initialized
700 1.44 riastrad * for the sake of automatic tests.
701 1.44 riastrad */
702 1.44 riastrad arc4random_global.initialized = true;
703 1.1 itojun }
704 1.1 itojun
705 1.26 riastrad static struct arc4random_prng *
706 1.46 riastrad arc4random_prng_get(struct arc4random_prng *fallback)
707 1.1 itojun {
708 1.26 riastrad struct arc4random_prng *prng = NULL;
709 1.26 riastrad
710 1.26 riastrad /* Make sure the library is initialized. */
711 1.44 riastrad thr_once(&arc4random_global.once, &arc4random_initialize);
712 1.26 riastrad
713 1.26 riastrad #ifdef _REENTRANT
714 1.26 riastrad /* Get or create the per-thread PRNG state. */
715 1.39 riastrad prng = __predict_true(arc4random_global.per_thread)
716 1.39 riastrad ? thr_getspecific(arc4random_global.thread_key)
717 1.39 riastrad : NULL;
718 1.39 riastrad if (__predict_false(prng == NULL) && arc4random_global.per_thread) {
719 1.26 riastrad prng = arc4random_prng_create();
720 1.26 riastrad thr_setspecific(arc4random_global.thread_key, prng);
721 1.26 riastrad }
722 1.26 riastrad #endif
723 1.26 riastrad
724 1.46 riastrad /*
725 1.46 riastrad * If we can't create it, fall back to the global PRNG -- or an
726 1.46 riastrad * on-stack PRNG, in the unlikely event that pthread_atfork
727 1.46 riastrad * failed, which we have to seed from scratch each time
728 1.46 riastrad * (suboptimal, but unlikely, so not worth optimizing).
729 1.46 riastrad */
730 1.26 riastrad if (__predict_false(prng == NULL)) {
731 1.46 riastrad if (__predict_true(arc4random_global.forksafe)) {
732 1.46 riastrad mutex_lock(&arc4random_global.lock);
733 1.46 riastrad prng = &arc4random_global.prng;
734 1.46 riastrad } else {
735 1.46 riastrad prng = fallback;
736 1.46 riastrad memset(prng, 0, sizeof(*prng));
737 1.46 riastrad }
738 1.26 riastrad }
739 1.22 roy
740 1.26 riastrad /* Guarantee the PRNG is seeded. */
741 1.35 riastrad if (__predict_false(prng->arc4_epoch != entropy_epoch()))
742 1.26 riastrad arc4random_prng_addrandom(prng, NULL, 0);
743 1.26 riastrad
744 1.26 riastrad return prng;
745 1.1 itojun }
746 1.1 itojun
747 1.26 riastrad static void
748 1.46 riastrad arc4random_prng_put(struct arc4random_prng *prng,
749 1.46 riastrad struct arc4random_prng *fallback)
750 1.11 tls {
751 1.22 roy
752 1.46 riastrad /*
753 1.46 riastrad * If we had to use a stack fallback, zero it before we return
754 1.46 riastrad * so that after we return we avoid leaving secrets on the
755 1.46 riastrad * stack that could recover the parent's future outputs in an
756 1.46 riastrad * unprivileged forked child (of course, we can't guarantee
757 1.46 riastrad * that the compiler hasn't spilled anything; this is
758 1.46 riastrad * best-effort, not a guarantee).
759 1.46 riastrad */
760 1.46 riastrad if (__predict_false(prng == fallback))
761 1.46 riastrad explicit_memset(fallback, 0, sizeof(*fallback));
762 1.46 riastrad
763 1.26 riastrad /* If we had fallen back to the global PRNG, unlock it. */
764 1.26 riastrad if (__predict_false(prng == &arc4random_global.prng))
765 1.26 riastrad mutex_unlock(&arc4random_global.lock);
766 1.1 itojun }
767 1.1 itojun
768 1.26 riastrad /* Public API */
769 1.26 riastrad
770 1.10 christos uint32_t
771 1.10 christos arc4random(void)
772 1.1 itojun {
773 1.46 riastrad struct arc4random_prng *prng, fallback;
774 1.11 tls uint32_t v;
775 1.16 dsl
776 1.46 riastrad prng = arc4random_prng_get(&fallback);
777 1.26 riastrad crypto_prng_buf(&prng->arc4_prng, &v, sizeof v);
778 1.46 riastrad arc4random_prng_put(prng, &fallback);
779 1.26 riastrad
780 1.11 tls return v;
781 1.1 itojun }
782 1.1 itojun
783 1.16 dsl void
784 1.16 dsl arc4random_buf(void *buf, size_t len)
785 1.10 christos {
786 1.46 riastrad struct arc4random_prng *prng, fallback;
787 1.26 riastrad
788 1.26 riastrad if (len <= crypto_prng_MAXOUTPUTBYTES) {
789 1.46 riastrad prng = arc4random_prng_get(&fallback);
790 1.26 riastrad crypto_prng_buf(&prng->arc4_prng, buf, len);
791 1.46 riastrad arc4random_prng_put(prng, &fallback);
792 1.26 riastrad } else {
793 1.26 riastrad uint8_t seed[crypto_onetimestream_SEEDBYTES];
794 1.26 riastrad
795 1.46 riastrad prng = arc4random_prng_get(&fallback);
796 1.26 riastrad crypto_prng_buf(&prng->arc4_prng, seed, sizeof seed);
797 1.46 riastrad arc4random_prng_put(prng, &fallback);
798 1.26 riastrad
799 1.26 riastrad crypto_onetimestream(seed, buf, len);
800 1.26 riastrad (void)explicit_memset(seed, 0, sizeof seed);
801 1.26 riastrad }
802 1.26 riastrad }
803 1.26 riastrad
804 1.26 riastrad uint32_t
805 1.26 riastrad arc4random_uniform(uint32_t bound)
806 1.26 riastrad {
807 1.46 riastrad struct arc4random_prng *prng, fallback;
808 1.26 riastrad uint32_t minimum, r;
809 1.26 riastrad
810 1.26 riastrad /*
811 1.26 riastrad * We want a uniform random choice in [0, n), and arc4random()
812 1.26 riastrad * makes a uniform random choice in [0, 2^32). If we reduce
813 1.26 riastrad * that modulo n, values in [0, 2^32 mod n) will be represented
814 1.26 riastrad * slightly more than values in [2^32 mod n, n). Instead we
815 1.26 riastrad * choose only from [2^32 mod n, 2^32) by rejecting samples in
816 1.26 riastrad * [0, 2^32 mod n), to avoid counting the extra representative
817 1.26 riastrad * of [0, 2^32 mod n). To compute 2^32 mod n, note that
818 1.26 riastrad *
819 1.26 riastrad * 2^32 mod n = 2^32 mod n - 0
820 1.26 riastrad * = 2^32 mod n - n mod n
821 1.26 riastrad * = (2^32 - n) mod n,
822 1.26 riastrad *
823 1.26 riastrad * the last of which is what we compute in 32-bit arithmetic.
824 1.26 riastrad */
825 1.26 riastrad minimum = (-bound % bound);
826 1.26 riastrad
827 1.46 riastrad prng = arc4random_prng_get(&fallback);
828 1.26 riastrad do crypto_prng_buf(&prng->arc4_prng, &r, sizeof r);
829 1.26 riastrad while (__predict_false(r < minimum));
830 1.46 riastrad arc4random_prng_put(prng, &fallback);
831 1.17 dsl
832 1.26 riastrad return (r % bound);
833 1.11 tls }
834 1.11 tls
835 1.26 riastrad void
836 1.26 riastrad arc4random_stir(void)
837 1.26 riastrad {
838 1.46 riastrad struct arc4random_prng *prng, fallback;
839 1.26 riastrad
840 1.46 riastrad prng = arc4random_prng_get(&fallback);
841 1.26 riastrad arc4random_prng_addrandom(prng, NULL, 0);
842 1.46 riastrad arc4random_prng_put(prng, &fallback);
843 1.26 riastrad }
844 1.10 christos
845 1.10 christos /*
846 1.26 riastrad * Silly signature here is for hysterical raisins. Should instead be
847 1.26 riastrad * const void *data and size_t datalen.
848 1.10 christos */
849 1.26 riastrad void
850 1.26 riastrad arc4random_addrandom(u_char *data, int datalen)
851 1.10 christos {
852 1.46 riastrad struct arc4random_prng *prng, fallback;
853 1.10 christos
854 1.26 riastrad _DIAGASSERT(0 <= datalen);
855 1.10 christos
856 1.46 riastrad prng = arc4random_prng_get(&fallback);
857 1.26 riastrad arc4random_prng_addrandom(prng, data, datalen);
858 1.46 riastrad arc4random_prng_put(prng, &fallback);
859 1.26 riastrad }
860 1.26 riastrad
861 1.26 riastrad #ifdef _ARC4RANDOM_TEST
862 1.26 riastrad
863 1.26 riastrad #include <sys/wait.h>
864 1.26 riastrad
865 1.26 riastrad #include <err.h>
866 1.26 riastrad #include <stdio.h>
867 1.26 riastrad
868 1.26 riastrad int
869 1.26 riastrad main(int argc __unused, char **argv __unused)
870 1.26 riastrad {
871 1.26 riastrad unsigned char gubbish[] = "random gubbish";
872 1.26 riastrad const uint8_t zero64[64] = {0};
873 1.26 riastrad uint8_t buf[2048];
874 1.26 riastrad unsigned i, a, n;
875 1.26 riastrad
876 1.26 riastrad /* Test arc4random: should not be deterministic. */
877 1.26 riastrad if (printf("arc4random: %08"PRIx32"\n", arc4random()) < 0)
878 1.26 riastrad err(1, "printf");
879 1.26 riastrad
880 1.26 riastrad /* Test stirring: should definitely not be deterministic. */
881 1.26 riastrad arc4random_stir();
882 1.26 riastrad
883 1.26 riastrad /* Test small buffer. */
884 1.26 riastrad arc4random_buf(buf, 8);
885 1.26 riastrad if (printf("arc4randombuf small:") < 0)
886 1.26 riastrad err(1, "printf");
887 1.26 riastrad for (i = 0; i < 8; i++)
888 1.26 riastrad if (printf(" %02x", buf[i]) < 0)
889 1.26 riastrad err(1, "printf");
890 1.26 riastrad if (printf("\n") < 0)
891 1.26 riastrad err(1, "printf");
892 1.26 riastrad
893 1.26 riastrad /* Test addrandom: should not make the rest deterministic. */
894 1.26 riastrad arc4random_addrandom(gubbish, sizeof gubbish);
895 1.26 riastrad
896 1.26 riastrad /* Test large buffer. */
897 1.26 riastrad arc4random_buf(buf, sizeof buf);
898 1.26 riastrad if (printf("arc4randombuf_large:") < 0)
899 1.26 riastrad err(1, "printf");
900 1.26 riastrad for (i = 0; i < sizeof buf; i++)
901 1.26 riastrad if (printf(" %02x", buf[i]) < 0)
902 1.26 riastrad err(1, "printf");
903 1.26 riastrad if (printf("\n") < 0)
904 1.26 riastrad err(1, "printf");
905 1.26 riastrad
906 1.26 riastrad /* Test misaligned small and large. */
907 1.26 riastrad for (a = 0; a < 64; a++) {
908 1.26 riastrad for (n = a; n < sizeof buf; n++) {
909 1.26 riastrad (void)memset(buf, 0, sizeof buf);
910 1.26 riastrad arc4random_buf(buf, n - a);
911 1.26 riastrad if (memcmp(buf + n - a, zero64, a) != 0)
912 1.26 riastrad errx(1, "arc4random buffer overflow 0");
913 1.26 riastrad
914 1.26 riastrad (void)memset(buf, 0, sizeof buf);
915 1.26 riastrad arc4random_buf(buf + a, n - a);
916 1.26 riastrad if (memcmp(buf, zero64, a) != 0)
917 1.26 riastrad errx(1, "arc4random buffer overflow 1");
918 1.26 riastrad
919 1.26 riastrad if ((2*a) <= n) {
920 1.26 riastrad (void)memset(buf, 0, sizeof buf);
921 1.26 riastrad arc4random_buf(buf + a, n - a - a);
922 1.26 riastrad if (memcmp(buf + n - a, zero64, a) != 0)
923 1.26 riastrad errx(1,
924 1.26 riastrad "arc4random buffer overflow 2");
925 1.26 riastrad }
926 1.26 riastrad }
927 1.26 riastrad }
928 1.16 dsl
929 1.26 riastrad /* Test fork-safety. */
930 1.26 riastrad {
931 1.26 riastrad pid_t pid, rpid;
932 1.26 riastrad int status;
933 1.26 riastrad
934 1.26 riastrad pid = fork();
935 1.26 riastrad switch (pid) {
936 1.26 riastrad case -1:
937 1.26 riastrad err(1, "fork");
938 1.36 riastrad case 0: {
939 1.36 riastrad /*
940 1.36 riastrad * Verify the epoch has been set to zero by fork.
941 1.36 riastrad */
942 1.36 riastrad struct arc4random_prng *prng = NULL;
943 1.36 riastrad #ifdef _REENTRANT
944 1.45 riastrad prng = arc4random_global.per_thread
945 1.45 riastrad ? thr_getspecific(arc4random_global.thread_key)
946 1.45 riastrad : NULL;
947 1.36 riastrad #endif
948 1.36 riastrad if (prng == NULL)
949 1.36 riastrad prng = &arc4random_global.prng;
950 1.36 riastrad _exit(prng->arc4_epoch != 0);
951 1.36 riastrad }
952 1.26 riastrad default:
953 1.26 riastrad rpid = waitpid(pid, &status, 0);
954 1.26 riastrad if (rpid == -1)
955 1.26 riastrad err(1, "waitpid");
956 1.26 riastrad if (rpid != pid)
957 1.26 riastrad errx(1, "waitpid returned wrong pid"
958 1.26 riastrad ": %"PRIdMAX" != %"PRIdMAX,
959 1.26 riastrad (intmax_t)rpid,
960 1.26 riastrad (intmax_t)pid);
961 1.26 riastrad if (WIFEXITED(status)) {
962 1.26 riastrad if (WEXITSTATUS(status) != 0)
963 1.26 riastrad errx(1, "child exited with %d",
964 1.26 riastrad WEXITSTATUS(status));
965 1.26 riastrad } else if (WIFSIGNALED(status)) {
966 1.26 riastrad errx(1, "child terminated on signal %d",
967 1.26 riastrad WTERMSIG(status));
968 1.26 riastrad } else {
969 1.26 riastrad errx(1, "child died mysteriously: %d", status);
970 1.26 riastrad }
971 1.26 riastrad }
972 1.26 riastrad }
973 1.16 dsl
974 1.26 riastrad /* XXX Test multithreaded fork safety...? */
975 1.10 christos
976 1.26 riastrad return 0;
977 1.10 christos }
978 1.26 riastrad #endif
979