#if defined(__linux__)
#define _GNU_SOURCE
#endif
#include <openssl/base.h>
#include <assert.h>
#include <stddef.h>
long GFp_sysrand_chunk(void *buf, size_t len);
#if defined(OPENSSL_WINDOWS)
#include <limits.h>
#if defined(_MSC_VER)
#pragma warning(push, 3)
#endif
#include <windows.h>
#define SystemFunction036 NTAPI SystemFunction036
#include <ntsecapi.h>
#undef SystemFunction036
#if defined(_MSC_VER)
#pragma warning(pop)
#endif
long GFp_sysrand_chunk(void *out, size_t requested) {
if (requested > ULONG_MAX) {
requested = ULONG_MAX;
}
if (requested > (size_t)LONG_MAX) {
requested = (size_t)LONG_MAX;
}
return RtlGenRandom(out, (ULONG)requested) ? (long)requested : 0;
}
#elif defined(__linux__)
#include <errno.h>
#include <unistd.h>
#include <sys/syscall.h>
#if !defined(SYS_getrandom)
#if defined(OPENSSL_AARCH64)
#define SYS_getrandom 278
#elif defined(OPENSSL_ARM)
#define SYS_getrandom 384
#elif defined(OPENSSL_X86)
#define SYS_getrandom 355
#elif defined(OPENSSL_X86_64)
#define SYS_getrandom 318
#else
#error "Error: Kernel headers are too old; SYS_getrandom not defined."
#endif
#endif
long GFp_sysrand_chunk(void *out, size_t requested) {
long r = syscall(SYS_getrandom, out, requested, 0u);
if (r < 0) {
if (errno == EINTR) {
return 0;
}
return -1;
}
return r;
}
#endif