From 54c91185c9273b9699693910fa95383c86f2af22 Mon Sep 17 00:00:00 2001 From: David CARLIER Date: Sat, 16 Jan 2021 12:47:33 +0000 Subject: [PATCH] random generator update for Mac proposal using getentropy for seeding, reading 256 bytes at a time to avoid the EIO errno since this is the maximum. --- configure.ac | 1 + random.c | 20 ++++++++++++++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index 3d1c5b6225..f672f6d7f7 100644 --- a/configure.ac +++ b/configure.ac @@ -1876,6 +1876,7 @@ AC_CHECK_FUNCS(ftruncate) AC_CHECK_FUNCS(ftruncate64) # used for Win32 platform AC_CHECK_FUNCS(getattrlist) AC_CHECK_FUNCS(getcwd) +AC_CHECK_FUNCS(getentropy) AC_CHECK_FUNCS(getgidx) AC_CHECK_FUNCS(getgrnam) AC_CHECK_FUNCS(getgrnam_r) diff --git a/random.c b/random.c index 28b7a9fba4..7b78efe7ca 100644 --- a/random.c +++ b/random.c @@ -49,7 +49,7 @@ # include #endif -#if defined HAVE_GETRANDOM +#if defined HAVE_GETRANDOM || defined HAVE_GETENTROPY # include #elif defined __linux__ && defined __NR_getrandom # include @@ -425,7 +425,23 @@ random_init(int argc, VALUE *argv, VALUE obj) # define USE_DEV_URANDOM 0 #endif -#if USE_DEV_URANDOM +#if HAVE_GETENTROPY +# define MAX_SEED_LEN_PER_READ 256 +static int +fill_random_bytes_urandom(void *seed, size_t size) +{ + unsigned char *p = (unsigned char *)seed; + while (size) { + size_t len = size < MAX_SEED_LEN_PER_READ ? size : MAX_SEED_LEN_PER_READ; + if (getentropy(p, len) != 0) { + return -1; + } + p += len; + size -= len; + } + return 0; +} +#elif USE_DEV_URANDOM static int fill_random_bytes_urandom(void *seed, size_t size) {