code / tomo

Lines41.3K C23.7K Markdown9.7K YAML5.0K Tomo2.3K
7 others 763
Python231 Shell230 make212 INI47 Text21 SVG16 Lua6
(28 lines)
1 // This file defines some wrapper logic around different systems' random functions
3 #include <assert.h>
4 #include <stdint.h>
6 #if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__APPLE__)
7 #include <stdlib.h>
8 static ssize_t getrandom(void *buf, size_t buflen, unsigned int flags) {
9 (void)flags;
10 arc4random_buf(buf, buflen);
11 return buflen;
13 #elif defined(__linux__)
14 // Use getrandom()
15 #include <sys/random.h>
16 #else
17 #error "Unsupported platform for secure random number generation"
18 #endif
20 static int64_t random_range(int64_t low, int64_t high) {
21 uint64_t range = (uint64_t)high - (uint64_t)low + 1;
22 uint64_t min_r = -range % range;
23 uint64_t r;
24 do {
25 assert(getrandom(&r, sizeof(r), 0) == sizeof(r));
26 } while (r < min_r);
27 return (int64_t)((uint64_t)low + (r % range));