annotate librandom.c @ 0:9ee92e7a1cb5 default tip

*: initial commit this is a very simple, bare-bones randomness API. if the system can't provide it, so be it -- init will fail.
author Paper <paper@tflc.us>
date Tue, 10 Jun 2025 16:18:50 -0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
1 #include <stdio.h>
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
2 #include <stdlib.h>
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
3 #include <stdint.h>
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
4
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
5 #include "librandom.h"
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
6
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
7 #ifdef _WIN32
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
8 # define RANDOM_WIN32
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
9 #elif defined(__MACH__) && defined(__APPLE__)
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
10 # define RANDOM_ARC4RANDOM
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
11 #else
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
12 # define RANDOM_UNIX
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
13 #endif
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
14
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
15 #ifdef RANDOM_WIN32
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
16 # include <windows.h>
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
17 # include <wincrypt.h>
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
18 #endif
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
19
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
20 #define ARRAY_SIZE(x) (sizeof(x)/sizeof(*(x)))
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
21
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
22 /* NOTE: I am not sure if other platforms provide real APIs for good
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
23 * randomness. Macintosh provides SetRandomSeed and RandomBits, but I
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
24 * am skeptical of its use as a good random number generator. */
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
25
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
26 #ifdef RANDOM_UNIX
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
27
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
28 struct random_unix {
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
29 FILE *f;
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
30 };
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
31
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
32 static void random_unix_close(struct random *r)
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
33 {
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
34 struct random_unix *ru = r->userdata;
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
35
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
36 if (ru->f)
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
37 fclose(ru->f);
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
38
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
39 free(ru);
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
40 }
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
41
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
42 static size_t random_unix_read(struct random *r, void *ptr, size_t s)
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
43 {
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
44 struct random_unix *ru = r->userdata;
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
45
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
46 return fread(ptr, s, 1, ru->f);
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
47 }
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
48
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
49 static int random_unix_init(struct random *r)
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
50 {
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
51 /* hmmm. */
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
52 static const char *names[] = {
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
53 "/dev/random",
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
54 "/dev/urandom",
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
55 };
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
56 struct random_unix *ru = malloc(sizeof(*ru));
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
57 size_t i;
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
58
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
59 for (i = 0; i < ARRAY_SIZE(names); i++) {
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
60 ru->f = fopen(names[i], "rb");
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
61 if (ru->f)
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
62 goto gotdevice;
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
63 }
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
64
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
65 free(ru);
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
66 return -1;
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
67
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
68 gotdevice:
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
69
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
70 r->userdata = ru;
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
71 r->close = random_unix_close;
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
72 r->read = random_unix_read;
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
73
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
74 return 0;
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
75 }
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
76
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
77 #endif
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
78
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
79 /* ------------------------------------------------------------------------ */
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
80
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
81 #ifdef RANDOM_ARC4RANDOM
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
82
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
83 static size_t random_arc4random_read(struct random *r, void *ptr, size_t s)
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
84 {
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
85 size_t l = s;
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
86
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
87 while (l > 0) {
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
88 size_t amt;
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
89 uint32_t x;
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
90
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
91 amt = MIN(sizeof(x), l);
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
92 x = arc4random();
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
93
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
94 memcpy(ptr, &x, amt);
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
95
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
96 ptr += amt;
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
97 l -= amt;
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
98 }
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
99
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
100 return s;
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
101 }
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
102
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
103 static void random_arc4random_close(struct random *r)
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
104 {
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
105 /* nothing */
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
106 }
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
107
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
108 static int random_arc4random_init(struct random *r)
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
109 {
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
110 /* always successful */
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
111 r->read = random_arc4random_read;
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
112 r->close = random_arc4random_close;
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
113 return 0;
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
114 }
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
115
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
116 #endif
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
117
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
118 /* ------------------------------------------------------------------------ */
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
119
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
120 #ifdef RANDOM_WIN32
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
121
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
122 typedef BOOL (*pADVAPI32_CryptReleaseContext)(HCRYPTPROV hProv, DWORD dwFlags);
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
123 typedef BOOL (*pADVAPI32_CryptGenRandom)(HCRYPTPROV hProv, DWORD dwLen, BYTE *pbBuffer);
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
124 typedef BOOL (*pADVAPI32_CryptAcquireContextA)(HCRYPTPROV *phProv, LPCSTR szContainer, LPCSTR szProvider, DWORD dwProvType,DWORD dwFlags);
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
125
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
126 struct random_win32 {
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
127 HCRYPTPROV c;
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
128
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
129 HMODULE advapi32;
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
130 pADVAPI32_CryptReleaseContext ADVAPI32_CryptReleaseContext;
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
131 pADVAPI32_CryptGenRandom ADVAPI32_CryptGenRandom;
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
132 pADVAPI32_CryptAcquireContextA ADVAPI32_CryptAcquireContextA;
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
133 };
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
134
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
135 static void random_win32_close(struct random *r)
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
136 {
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
137 struct random_win32 *rw = r->userdata;
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
138
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
139 rw->ADVAPI32_CryptReleaseContext(rw->c, 0);
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
140 FreeLibrary(rw->advapi32);
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
141
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
142 free(rw);
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
143 }
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
144
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
145 static size_t random_win32_read(struct random *r, void *ptr, size_t s)
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
146 {
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
147 struct random_win32 *rw = r->userdata;
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
148
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
149 if (!rw->ADVAPI32_CryptGenRandom(rw->c, s, ptr))
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
150 return 0;
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
151
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
152 return s;
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
153 }
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
154
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
155 static int random_win32_init(struct random *r)
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
156 {
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
157 HCRYPTPROV c;
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
158 struct random_win32 *rw;
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
159
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
160 rw = malloc(sizeof(*rw));
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
161 if (!rw)
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
162 return -2;
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
163
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
164 rw->advapi32 = LoadLibraryA("ADVAPI32.DLL");
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
165 if (!rw->advapi32)
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
166 return -3;
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
167
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
168 #define LOADFUNC(x) \
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
169 rw->ADVAPI32_##x = (pADVAPI32_##x)GetProcAddress(rw->advapi32, #x); \
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
170 if (!rw->ADVAPI32_##x) \
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
171 return -4
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
172
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
173 LOADFUNC(CryptAcquireContextA);
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
174 LOADFUNC(CryptGenRandom);
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
175 LOADFUNC(CryptReleaseContext);
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
176
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
177 if (!rw->ADVAPI32_CryptAcquireContextA(&c, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT))
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
178 return -1;
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
179
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
180
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
181 rw->c = c;
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
182
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
183 r->userdata = rw;
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
184 r->close = random_win32_close;
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
185 r->read = random_win32_read;
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
186 return 0;
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
187 }
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
188
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
189 #endif
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
190
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
191 /* ------------------------------------------------------------------------ */
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
192 /* platform-independent routines */
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
193
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
194 int random_init(struct random *r)
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
195 {
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
196 int i;
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
197
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
198 int (*funcs[])(struct random *r) = {
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
199 #ifdef RANDOM_ARC4RANDOM
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
200 random_arc4random_init,
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
201 #endif
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
202 #ifdef RANDOM_UNIX
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
203 random_unix_init,
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
204 #endif
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
205 #ifdef RANDOM_WIN32
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
206 random_win32_init,
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
207 #endif
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
208 NULL,
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
209 };
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
210
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
211 for (i = 0; funcs[i]; i++)
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
212 if (!funcs[i](r))
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
213 return 0;
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
214
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
215 return -1;
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
216 }
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
217
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
218 void random_close(struct random *r)
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
219 {
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
220 r->close(r);
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
221 }
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
222
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
223 size_t random_read(struct random *r, void *ptr, size_t s)
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
224 {
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
225 return r->read(r, ptr, s);
9ee92e7a1cb5 *: initial commit
Paper <paper@tflc.us>
parents:
diff changeset
226 }