diff options
-rw-r--r-- | src/lib/libcrypto/arc4random/getentropy_linux.c | 38 | ||||
-rw-r--r-- | src/lib/libcrypto/crypto/getentropy_linux.c | 38 |
2 files changed, 74 insertions, 2 deletions
diff --git a/src/lib/libcrypto/arc4random/getentropy_linux.c b/src/lib/libcrypto/arc4random/getentropy_linux.c index 04f21e147b..2ad844624f 100644 --- a/src/lib/libcrypto/arc4random/getentropy_linux.c +++ b/src/lib/libcrypto/arc4random/getentropy_linux.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: getentropy_linux.c,v 1.27 2014/07/19 16:12:00 deraadt Exp $ */ | 1 | /* $OpenBSD: getentropy_linux.c,v 1.28 2014/07/20 03:24:10 deraadt Exp $ */ |
2 | 2 | ||
3 | /* | 3 | /* |
4 | * Copyright (c) 2014 Theo de Raadt <deraadt@openbsd.org> | 4 | * Copyright (c) 2014 Theo de Raadt <deraadt@openbsd.org> |
@@ -74,6 +74,7 @@ | |||
74 | int getentropy(void *buf, size_t len); | 74 | int getentropy(void *buf, size_t len); |
75 | 75 | ||
76 | static int gotdata(char *buf, size_t len); | 76 | static int gotdata(char *buf, size_t len); |
77 | static int getentropy_getrandom(void *buf, size_t len); | ||
77 | static int getentropy_urandom(void *buf, size_t len); | 78 | static int getentropy_urandom(void *buf, size_t len); |
78 | #ifdef CTL_MAXNAME | 79 | #ifdef CTL_MAXNAME |
79 | static int getentropy_sysctl(void *buf, size_t len); | 80 | static int getentropy_sysctl(void *buf, size_t len); |
@@ -92,6 +93,13 @@ getentropy(void *buf, size_t len) | |||
92 | } | 93 | } |
93 | 94 | ||
94 | /* | 95 | /* |
96 | * Try descriptor-less getrandom() | ||
97 | */ | ||
98 | ret = getentropy_getrandom(buf, len); | ||
99 | if (ret != -1) | ||
100 | return (ret); | ||
101 | |||
102 | /* | ||
95 | * Try to get entropy with /dev/urandom | 103 | * Try to get entropy with /dev/urandom |
96 | * | 104 | * |
97 | * This can fail if the process is inside a chroot or if file | 105 | * This can fail if the process is inside a chroot or if file |
@@ -177,6 +185,34 @@ gotdata(char *buf, size_t len) | |||
177 | } | 185 | } |
178 | 186 | ||
179 | static int | 187 | static int |
188 | getentropy_getrandom(void *buf, size_t len) | ||
189 | { | ||
190 | #if 0 | ||
191 | |||
192 | /* Hand-definitions until the API becomes commonplace */ | ||
193 | #ifndef SYS__getrandom | ||
194 | #ifdef __LP64__ | ||
195 | #define SYS__getrandom 317 | ||
196 | #else | ||
197 | #define SYS__getrandom 354 | ||
198 | #endif | ||
199 | #endif | ||
200 | struct __getrandom_args args = { | ||
201 | .buf = buf; | ||
202 | .len = len; | ||
203 | .flags = 0; | ||
204 | }; | ||
205 | |||
206 | if (len > 256) | ||
207 | return (-1); | ||
208 | ret = syscall(SYS__getrandom, &args); | ||
209 | if (ret == len) | ||
210 | return (0); | ||
211 | #endif | ||
212 | return -1; | ||
213 | } | ||
214 | |||
215 | static int | ||
180 | getentropy_urandom(void *buf, size_t len) | 216 | getentropy_urandom(void *buf, size_t len) |
181 | { | 217 | { |
182 | struct stat st; | 218 | struct stat st; |
diff --git a/src/lib/libcrypto/crypto/getentropy_linux.c b/src/lib/libcrypto/crypto/getentropy_linux.c index 04f21e147b..2ad844624f 100644 --- a/src/lib/libcrypto/crypto/getentropy_linux.c +++ b/src/lib/libcrypto/crypto/getentropy_linux.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: getentropy_linux.c,v 1.27 2014/07/19 16:12:00 deraadt Exp $ */ | 1 | /* $OpenBSD: getentropy_linux.c,v 1.28 2014/07/20 03:24:10 deraadt Exp $ */ |
2 | 2 | ||
3 | /* | 3 | /* |
4 | * Copyright (c) 2014 Theo de Raadt <deraadt@openbsd.org> | 4 | * Copyright (c) 2014 Theo de Raadt <deraadt@openbsd.org> |
@@ -74,6 +74,7 @@ | |||
74 | int getentropy(void *buf, size_t len); | 74 | int getentropy(void *buf, size_t len); |
75 | 75 | ||
76 | static int gotdata(char *buf, size_t len); | 76 | static int gotdata(char *buf, size_t len); |
77 | static int getentropy_getrandom(void *buf, size_t len); | ||
77 | static int getentropy_urandom(void *buf, size_t len); | 78 | static int getentropy_urandom(void *buf, size_t len); |
78 | #ifdef CTL_MAXNAME | 79 | #ifdef CTL_MAXNAME |
79 | static int getentropy_sysctl(void *buf, size_t len); | 80 | static int getentropy_sysctl(void *buf, size_t len); |
@@ -92,6 +93,13 @@ getentropy(void *buf, size_t len) | |||
92 | } | 93 | } |
93 | 94 | ||
94 | /* | 95 | /* |
96 | * Try descriptor-less getrandom() | ||
97 | */ | ||
98 | ret = getentropy_getrandom(buf, len); | ||
99 | if (ret != -1) | ||
100 | return (ret); | ||
101 | |||
102 | /* | ||
95 | * Try to get entropy with /dev/urandom | 103 | * Try to get entropy with /dev/urandom |
96 | * | 104 | * |
97 | * This can fail if the process is inside a chroot or if file | 105 | * This can fail if the process is inside a chroot or if file |
@@ -177,6 +185,34 @@ gotdata(char *buf, size_t len) | |||
177 | } | 185 | } |
178 | 186 | ||
179 | static int | 187 | static int |
188 | getentropy_getrandom(void *buf, size_t len) | ||
189 | { | ||
190 | #if 0 | ||
191 | |||
192 | /* Hand-definitions until the API becomes commonplace */ | ||
193 | #ifndef SYS__getrandom | ||
194 | #ifdef __LP64__ | ||
195 | #define SYS__getrandom 317 | ||
196 | #else | ||
197 | #define SYS__getrandom 354 | ||
198 | #endif | ||
199 | #endif | ||
200 | struct __getrandom_args args = { | ||
201 | .buf = buf; | ||
202 | .len = len; | ||
203 | .flags = 0; | ||
204 | }; | ||
205 | |||
206 | if (len > 256) | ||
207 | return (-1); | ||
208 | ret = syscall(SYS__getrandom, &args); | ||
209 | if (ret == len) | ||
210 | return (0); | ||
211 | #endif | ||
212 | return -1; | ||
213 | } | ||
214 | |||
215 | static int | ||
180 | getentropy_urandom(void *buf, size_t len) | 216 | getentropy_urandom(void *buf, size_t len) |
181 | { | 217 | { |
182 | struct stat st; | 218 | struct stat st; |