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