Replace getrandom() with getentropy()
authorKirill Isakov <bootctl@gmail.com>
Sun, 1 May 2022 17:09:06 +0000 (23:09 +0600)
committerKirill Isakov <bootctl@gmail.com>
Sun, 1 May 2022 17:09:06 +0000 (23:09 +0600)
Unlike getrandom(), this function is supported by most BSDs
(with the exception of NetBSD), and by various Illumos distributions.

src/linux/meson.build
src/meson.build
src/random.c
test/unit/test_random_noinit.c

index 0213d06..8c0f137 100644 (file)
@@ -2,13 +2,9 @@ check_headers += [
   'linux/if_tun.h',
   'netpacket/packet.h',
   'sys/epoll.h',
-  'sys/random.h',
 ]
 
-check_functions += [
-  'recvmmsg',
-  'getrandom',
-]
+check_functions += 'recvmmsg'
 
 src_tincd += files('device.c')
 
index 351124e..02a4283 100644 (file)
@@ -62,6 +62,7 @@ check_headers = [
   'sys/ioctl.h',
   'sys/mman.h',
   'sys/param.h',
+  'sys/random.h',
   'sys/resource.h',
   'sys/socket.h',
   'sys/stat.h',
@@ -85,6 +86,7 @@ check_functions = [
   'explicit_bzero',
   'explicit_memset',
   'fchmod',
+  'getentropy',
   'gettimeofday',
   'memset_s',
   'mlockall',
index fad7173..f2e898f 100644 (file)
@@ -2,12 +2,12 @@
 
 #include "random.h"
 
-#ifndef HAVE_GETRANDOM
+#ifndef HAVE_GETENTROPY
 static int random_fd = -1;
 #endif
 
 void random_init(void) {
-#ifndef HAVE_GETRANDOM
+#ifndef HAVE_GETENTROPY
        random_fd = open("/dev/urandom", O_RDONLY);
 
        if(random_fd < 0) {
@@ -23,7 +23,7 @@ void random_init(void) {
 }
 
 void random_exit(void) {
-#ifndef HAVE_GETRANDOM
+#ifndef HAVE_GETENTROPY
        close(random_fd);
 #endif
 }
@@ -32,8 +32,9 @@ void randomize(void *vout, size_t outlen) {
        uint8_t *out = vout;
 
        while(outlen) {
-#ifdef HAVE_GETRANDOM
-               ssize_t len = getrandom(out, outlen, 0);
+#ifdef HAVE_GETENTROPY
+               int reqlen = (int) MIN(256, outlen);
+               int len = !getentropy(out, reqlen) ? reqlen : -1;
 #else
                ssize_t len = read(random_fd, out, outlen);
 #endif
index aeedda9..fa6087f 100644 (file)
@@ -2,7 +2,7 @@
 
 #include "unittest.h"
 
-#ifdef HAVE_GETRANDOM
+#ifdef HAVE_GETENTROPY
 int main(void) {
        return 1;
 }
@@ -14,4 +14,4 @@ int main(void) {
        randomize(buf, sizeof(buf));
        return 0;
 }
-#endif // HAVE_GETRANDOM
+#endif // HAVE_GETENTROPY