diff options
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | openbsd-compat/arc4random.c | 16 |
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 */ | ||
83 | static void | 88 | static void |
84 | getrnd(u_char *s, size_t len) | 89 | getrnd(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 | ||
106 | static void | 116 | static void |
107 | _rs_stir(void) | 117 | _rs_stir(void) |