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