summaryrefslogtreecommitdiff
path: root/openbsd-compat/arc4random.c
diff options
context:
space:
mode:
Diffstat (limited to 'openbsd-compat/arc4random.c')
-rw-r--r--openbsd-compat/arc4random.c16
1 files changed, 13 insertions, 3 deletions
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)