1 // This file defines some wrapper logic around different systems' random functions
6 #if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__APPLE__)
8 static ssize_t getrandom(void *buf, size_t buflen, unsigned int flags) {
10 arc4random_buf(buf, buflen);
13 #elif defined(__linux__)
15 #include <sys/random.h>
17 #error "Unsupported platform for secure random number generation"
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;
25 assert(getrandom(&r, sizeof(r), 0) == sizeof(r));
27 return (int64_t)((uint64_t)low + (r % range));