best we’ll ship some hashing utility
[alioth/early-rng-init-tools.git] / irc4random_buf.c
1 /*-
2  * Copyright (c) 2010, 2014, 2016, 2019
3  *      mirabilos <m@mirbsd.org>
4  *
5  * Provided that these terms and disclaimer and all copyright notices
6  * are retained or reproduced in an accompanying document, permission
7  * is granted to deal in this work without restriction, including un-
8  * limited rights to use, publicly perform, distribute, sell, modify,
9  * merge, give away, or sublicence.
10  *
11  * This work is provided "AS IS" and WITHOUT WARRANTY of any kind, to
12  * the utmost extent permitted by applicable law, neither express nor
13  * implied; without malicious intent or gross negligence. In no event
14  * may a licensor, author or contributor be held liable for indirect,
15  * direct, other damage, loss, or other issues arising in any way out
16  * of dealing in the work, even if advised of the possibility of such
17  * damage or existence of a defect, except proven that it results out
18  * of said person's immediate fault when using the work as intended.
19  *-
20  * Implement a useful arc4random(3) related API.
21  */
22
23 #include <stdint.h>
24 #include <stdlib.h>
25 #include <unistd.h>
26
27 #include "irc4random.h"
28
29 void
30 irc4random_buf(void *buf_, size_t len)
31 {
32         uint8_t *buf = (uint8_t *)buf_;
33         size_t n;
34
35         while (len) {
36                 /* randomly skip 1-4 bytes */
37                 /*XXX this should be constant-time */
38                 /* but this is userspace, so don't bother */
39                 n = arcfour_byte(&i4state) & 3;
40                 while (n--)
41                         (void)arcfour_byte(&i4state);
42
43                 /* fill the buffer in small increments */
44                 n = len < 128 ? len : 128;
45                 len -= n;
46                 while (n--)
47                         *buf++ = arcfour_byte(&i4state);
48         }
49 }