summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--configure.ac2
-rw-r--r--openbsd-compat/arc4random.c16
2 files changed, 15 insertions, 3 deletions
diff --git a/configure.ac b/configure.ac
index 1e9f7412c..8aad45169 100644
--- a/configure.ac
+++ b/configure.ac
@@ -413,6 +413,7 @@ AC_CHECK_HEADERS([ \
413 sys/prctl.h \ 413 sys/prctl.h \
414 sys/pstat.h \ 414 sys/pstat.h \
415 sys/ptrace.h \ 415 sys/ptrace.h \
416 sys/random.h \
416 sys/select.h \ 417 sys/select.h \
417 sys/stat.h \ 418 sys/stat.h \
418 sys/stream.h \ 419 sys/stream.h \
@@ -1786,6 +1787,7 @@ AC_CHECK_FUNCS([ \
1786 getpgid \ 1787 getpgid \
1787 _getpty \ 1788 _getpty \
1788 getrlimit \ 1789 getrlimit \
1790 getrandom \
1789 getsid \ 1791 getsid \
1790 getttyent \ 1792 getttyent \
1791 glob \ 1793 glob \
diff --git a/openbsd-compat/arc4random.c b/openbsd-compat/arc4random.c
index b6256b4f8..578f69f4f 100644
--- a/openbsd-compat/arc4random.c
+++ b/openbsd-compat/arc4random.c
@@ -33,6 +33,10 @@
33#include <string.h> 33#include <string.h>
34#include <unistd.h> 34#include <unistd.h>
35 35
36#ifdef HAVE_SYS_RANDOM_H
37# include <sys/random.h>
38#endif
39
36#ifndef HAVE_ARC4RANDOM 40#ifndef HAVE_ARC4RANDOM
37 41
38#ifdef WITH_OPENSSL 42#ifdef WITH_OPENSSL
@@ -78,8 +82,9 @@ _rs_init(u_char *buf, size_t n)
78} 82}
79 83
80#ifndef WITH_OPENSSL 84#ifndef WITH_OPENSSL
81#define SSH_RANDOM_DEV "/dev/urandom" 85# ifndef SSH_RANDOM_DEV
82/* XXX use getrandom() if supported on Linux */ 86# define SSH_RANDOM_DEV "/dev/urandom"
87# endif /* SSH_RANDOM_DEV */
83static void 88static void
84getrnd(u_char *s, size_t len) 89getrnd(u_char *s, size_t len)
85{ 90{
@@ -87,6 +92,11 @@ getrnd(u_char *s, size_t len)
87 ssize_t r; 92 ssize_t r;
88 size_t o = 0; 93 size_t o = 0;
89 94
95#ifdef HAVE_GETRANDOM
96 if ((r = getrandom(s, len, 0)) > 0 && (size_t)r == len)
97 return;
98#endif /* HAVE_GETRANDOM */
99
90 if ((fd = open(SSH_RANDOM_DEV, O_RDONLY)) == -1) 100 if ((fd = open(SSH_RANDOM_DEV, O_RDONLY)) == -1)
91 fatal("Couldn't open %s: %s", SSH_RANDOM_DEV, strerror(errno)); 101 fatal("Couldn't open %s: %s", SSH_RANDOM_DEV, strerror(errno));
92 while (o < len) { 102 while (o < len) {
@@ -101,7 +111,7 @@ getrnd(u_char *s, size_t len)
101 } 111 }
102 close(fd); 112 close(fd);
103} 113}
104#endif 114#endif /* WITH_OPENSSL */
105 115
106static void 116static void
107_rs_stir(void) 117_rs_stir(void)