27inline void csprng_fill(
unsigned char* buf, std::size_t len)
noexcept {
30 NTSTATUS
const status = BCryptGenRandom(
31 nullptr, buf,
static_cast<ULONG
>(len), BCRYPT_USE_SYSTEM_PREFERRED_RNG);
32 if (status != 0) std::abort();
33#elif defined(__APPLE__)
34 if (SecRandomCopyBytes(kSecRandomDefault, len, buf) != errSecSuccess)
36#elif defined(__ANDROID__)
37 arc4random_buf(buf, len);
38#elif defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__)
39 std::size_t filled = 0;
40 while (filled < len) {
41 ssize_t
const r = getrandom(buf + filled, len - filled, 0);
42 if (r <= 0) std::abort();
43 filled +=
static_cast<std::size_t
>(r);
46 FILE* f = std::fopen(
"/dev/urandom",
"rb");
48 if (std::fread(buf, 1, len, f) != len) { std::fclose(f); std::abort(); }