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; |
