diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/libcrypto/arc4random/getentropy_linux.c | 39 | ||||
| -rw-r--r-- | src/lib/libcrypto/crypto/getentropy_linux.c | 39 |
2 files changed, 42 insertions, 36 deletions
diff --git a/src/lib/libcrypto/arc4random/getentropy_linux.c b/src/lib/libcrypto/arc4random/getentropy_linux.c index 37efdfa53b..d833d4c9e1 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.7 2014/06/23 03:32:57 beck Exp $ */ | 1 | /* $OpenBSD: getentropy_linux.c,v 1.8 2014/06/23 03:47:46 beck 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> |
| @@ -44,6 +44,7 @@ | |||
| 44 | #include <openssl/sha.h> | 44 | #include <openssl/sha.h> |
| 45 | 45 | ||
| 46 | #include <linux/random.h> | 46 | #include <linux/random.h> |
| 47 | #include <linux/sysctl.h> | ||
| 47 | #include <sys/vfs.h> | 48 | #include <sys/vfs.h> |
| 48 | 49 | ||
| 49 | #define REPEAT 5 | 50 | #define REPEAT 5 |
| @@ -64,7 +65,9 @@ int getentropy(void *buf, size_t len); | |||
| 64 | extern int main(int, char *argv[]); | 65 | extern int main(int, char *argv[]); |
| 65 | static int gotdata(char *buf, size_t len); | 66 | static int gotdata(char *buf, size_t len); |
| 66 | static int getentropy_urandom(void *buf, size_t len); | 67 | static int getentropy_urandom(void *buf, size_t len); |
| 68 | #ifdef CTL_MAXNAME | ||
| 67 | static int getentropy_sysctl(void *buf, size_t len); | 69 | static int getentropy_sysctl(void *buf, size_t len); |
| 70 | #endif | ||
| 68 | static int getentropy_fallback(void *buf, size_t len); | 71 | static int getentropy_fallback(void *buf, size_t len); |
| 69 | 72 | ||
| 70 | int | 73 | int |
| @@ -87,7 +90,7 @@ getentropy(void *buf, size_t len) | |||
| 87 | if (ret != -1) | 90 | if (ret != -1) |
| 88 | return (ret); | 91 | return (ret); |
| 89 | 92 | ||
| 90 | #ifdef RANDOM_UUID | 93 | #ifdef CTL_MAXNAME |
| 91 | /* | 94 | /* |
| 92 | * Try to use sysctl CTL_KERN, KERN_RANDOM, RANDOM_UUID. | 95 | * Try to use sysctl CTL_KERN, KERN_RANDOM, RANDOM_UUID. |
| 93 | * sysctl is a failsafe API, so it guarantees a result. This | 96 | * sysctl is a failsafe API, so it guarantees a result. This |
| @@ -108,7 +111,7 @@ getentropy(void *buf, size_t len) | |||
| 108 | ret = getentropy_sysctl(buf, len); | 111 | ret = getentropy_sysctl(buf, len); |
| 109 | if (ret != -1) | 112 | if (ret != -1) |
| 110 | return (ret); | 113 | return (ret); |
| 111 | #endif /* RANDOM_UUID */ | 114 | #endif /* CTL_MAXNAME */ |
| 112 | 115 | ||
| 113 | /* | 116 | /* |
| 114 | * Entropy collection via /dev/urandom and sysctl have failed. | 117 | * Entropy collection via /dev/urandom and sysctl have failed. |
| @@ -218,11 +221,11 @@ nodevrandom: | |||
| 218 | return -1; | 221 | return -1; |
| 219 | } | 222 | } |
| 220 | 223 | ||
| 221 | #ifdef RANDOM_UUID | 224 | #ifdef CTL_MAXNAME |
| 222 | static int | 225 | static int |
| 223 | getentropy_sysctl(void *buf, size_t len) | 226 | getentropy_sysctl(void *buf, size_t len) |
| 224 | { | 227 | { |
| 225 | static const int mib[] = { CTL_KERN, KERN_RANDOM, RANDOM_UUID }; | 228 | static int mib[] = { CTL_KERN, KERN_RANDOM, RANDOM_UUID }; |
| 226 | size_t i, chunk; | 229 | size_t i, chunk; |
| 227 | int save_errno = errno; | 230 | int save_errno = errno; |
| 228 | 231 | ||
| @@ -233,7 +236,7 @@ getentropy_sysctl(void *buf, size_t len) | |||
| 233 | struct __sysctl_args args = { | 236 | struct __sysctl_args args = { |
| 234 | .name = mib, | 237 | .name = mib, |
| 235 | .nlen = 3, | 238 | .nlen = 3, |
| 236 | .oldval = &buf[i], | 239 | .oldval = buf + i, |
| 237 | .oldlenp = &chunk, | 240 | .oldlenp = &chunk, |
| 238 | }; | 241 | }; |
| 239 | if (syscall(SYS__sysctl, &args) != 0) | 242 | if (syscall(SYS__sysctl, &args) != 0) |
| @@ -248,7 +251,7 @@ sysctlfailed: | |||
| 248 | errno = EIO; | 251 | errno = EIO; |
| 249 | return -1; | 252 | return -1; |
| 250 | } | 253 | } |
| 251 | #endif /* RANDOM_UUID */ | 254 | #endif /* CTL_MAXNAME */ |
| 252 | 255 | ||
| 253 | static int cl[] = { | 256 | static int cl[] = { |
| 254 | CLOCK_REALTIME, | 257 | CLOCK_REALTIME, |
| @@ -333,7 +336,7 @@ getentropy_fallback(void *buf, size_t len) | |||
| 333 | struct statfs stfs; | 336 | struct statfs stfs; |
| 334 | socklen_t ssl; | 337 | socklen_t ssl; |
| 335 | off_t off; | 338 | off_t off; |
| 336 | 339 | ||
| 337 | /* | 340 | /* |
| 338 | * Prime-sized mappings encourage fragmentation; | 341 | * Prime-sized mappings encourage fragmentation; |
| 339 | * thus exposing some address entropy. | 342 | * thus exposing some address entropy. |
| @@ -349,7 +352,7 @@ getentropy_fallback(void *buf, size_t len) | |||
| 349 | { 57, MAP_FAILED }, { 3, MAP_FAILED }, | 352 | { 57, MAP_FAILED }, { 3, MAP_FAILED }, |
| 350 | { 131, MAP_FAILED }, { 1, MAP_FAILED }, | 353 | { 131, MAP_FAILED }, { 1, MAP_FAILED }, |
| 351 | }; | 354 | }; |
| 352 | 355 | ||
| 353 | for (m = 0; m < sizeof mm/sizeof(mm[0]); m++) { | 356 | for (m = 0; m < sizeof mm/sizeof(mm[0]); m++) { |
| 354 | HX(mm[m].p = mmap(NULL, | 357 | HX(mm[m].p = mmap(NULL, |
| 355 | mm[m].npg * pgs, | 358 | mm[m].npg * pgs, |
| @@ -367,7 +370,7 @@ getentropy_fallback(void *buf, size_t len) | |||
| 367 | cnt += (int)((long)(mm[m].p) | 370 | cnt += (int)((long)(mm[m].p) |
| 368 | / pgs); | 371 | / pgs); |
| 369 | } | 372 | } |
| 370 | 373 | ||
| 371 | /* Check cnts and times... */ | 374 | /* Check cnts and times... */ |
| 372 | for (ii = 0; ii < sizeof(cl)/sizeof(cl[0]); | 375 | for (ii = 0; ii < sizeof(cl)/sizeof(cl[0]); |
| 373 | ii++) { | 376 | ii++) { |
| @@ -376,7 +379,7 @@ getentropy_fallback(void *buf, size_t len) | |||
| 376 | if (e != -1) | 379 | if (e != -1) |
| 377 | cnt += (int)ts.tv_nsec; | 380 | cnt += (int)ts.tv_nsec; |
| 378 | } | 381 | } |
| 379 | 382 | ||
| 380 | HX((e = getrusage(RUSAGE_SELF, | 383 | HX((e = getrusage(RUSAGE_SELF, |
| 381 | &ru)) == -1, ru); | 384 | &ru)) == -1, ru); |
| 382 | if (e != -1) { | 385 | if (e != -1) { |
| @@ -384,21 +387,21 @@ getentropy_fallback(void *buf, size_t len) | |||
| 384 | cnt += (int)ru.ru_utime.tv_usec; | 387 | cnt += (int)ru.ru_utime.tv_usec; |
| 385 | } | 388 | } |
| 386 | } | 389 | } |
| 387 | 390 | ||
| 388 | for (m = 0; m < sizeof mm/sizeof(mm[0]); m++) { | 391 | for (m = 0; m < sizeof mm/sizeof(mm[0]); m++) { |
| 389 | if (mm[m].p != MAP_FAILED) | 392 | if (mm[m].p != MAP_FAILED) |
| 390 | munmap(mm[m].p, mm[m].npg * pgs); | 393 | munmap(mm[m].p, mm[m].npg * pgs); |
| 391 | mm[m].p = MAP_FAILED; | 394 | mm[m].p = MAP_FAILED; |
| 392 | } | 395 | } |
| 393 | 396 | ||
| 394 | HX(stat(".", &st) == -1, st); | 397 | HX(stat(".", &st) == -1, st); |
| 395 | HX(statvfs(".", &stvfs) == -1, stvfs); | 398 | HX(statvfs(".", &stvfs) == -1, stvfs); |
| 396 | HX(statfs(".", &stfs) == -1, stfs); | 399 | HX(statfs(".", &stfs) == -1, stfs); |
| 397 | 400 | ||
| 398 | HX(stat("/", &st) == -1, st); | 401 | HX(stat("/", &st) == -1, st); |
| 399 | HX(statvfs("/", &stvfs) == -1, stvfs); | 402 | HX(statvfs("/", &stvfs) == -1, stvfs); |
| 400 | HX(statfs("/", &stfs) == -1, stfs); | 403 | HX(statfs("/", &stfs) == -1, stfs); |
| 401 | 404 | ||
| 402 | HX((e = fstat(0, &st)) == -1, st); | 405 | HX((e = fstat(0, &st)) == -1, st); |
| 403 | if (e == -1) { | 406 | if (e == -1) { |
| 404 | if (S_ISREG(st.st_mode) || | 407 | if (S_ISREG(st.st_mode) || |
| @@ -422,7 +425,7 @@ getentropy_fallback(void *buf, size_t len) | |||
| 422 | ss); | 425 | ss); |
| 423 | } | 426 | } |
| 424 | } | 427 | } |
| 425 | 428 | ||
| 426 | HX((e = getrusage(RUSAGE_CHILDREN, | 429 | HX((e = getrusage(RUSAGE_CHILDREN, |
| 427 | &ru)) == -1, ru); | 430 | &ru)) == -1, ru); |
| 428 | if (e != -1) { | 431 | if (e != -1) { |
| @@ -433,13 +436,13 @@ getentropy_fallback(void *buf, size_t len) | |||
| 433 | /* Subsequent hashes absorb previous result */ | 436 | /* Subsequent hashes absorb previous result */ |
| 434 | HD(results); | 437 | HD(results); |
| 435 | } | 438 | } |
| 436 | 439 | ||
| 437 | HX((e = gettimeofday(&tv, NULL)) == -1, tv); | 440 | HX((e = gettimeofday(&tv, NULL)) == -1, tv); |
| 438 | if (e != -1) { | 441 | if (e != -1) { |
| 439 | cnt += (int)tv.tv_sec; | 442 | cnt += (int)tv.tv_sec; |
| 440 | cnt += (int)tv.tv_usec; | 443 | cnt += (int)tv.tv_usec; |
| 441 | } | 444 | } |
| 442 | 445 | ||
| 443 | HD(cnt); | 446 | HD(cnt); |
| 444 | } | 447 | } |
| 445 | SHA512_Final(results, &ctx); | 448 | SHA512_Final(results, &ctx); |
diff --git a/src/lib/libcrypto/crypto/getentropy_linux.c b/src/lib/libcrypto/crypto/getentropy_linux.c index 37efdfa53b..d833d4c9e1 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.7 2014/06/23 03:32:57 beck Exp $ */ | 1 | /* $OpenBSD: getentropy_linux.c,v 1.8 2014/06/23 03:47:46 beck 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> |
| @@ -44,6 +44,7 @@ | |||
| 44 | #include <openssl/sha.h> | 44 | #include <openssl/sha.h> |
| 45 | 45 | ||
| 46 | #include <linux/random.h> | 46 | #include <linux/random.h> |
| 47 | #include <linux/sysctl.h> | ||
| 47 | #include <sys/vfs.h> | 48 | #include <sys/vfs.h> |
| 48 | 49 | ||
| 49 | #define REPEAT 5 | 50 | #define REPEAT 5 |
| @@ -64,7 +65,9 @@ int getentropy(void *buf, size_t len); | |||
| 64 | extern int main(int, char *argv[]); | 65 | extern int main(int, char *argv[]); |
| 65 | static int gotdata(char *buf, size_t len); | 66 | static int gotdata(char *buf, size_t len); |
| 66 | static int getentropy_urandom(void *buf, size_t len); | 67 | static int getentropy_urandom(void *buf, size_t len); |
| 68 | #ifdef CTL_MAXNAME | ||
| 67 | static int getentropy_sysctl(void *buf, size_t len); | 69 | static int getentropy_sysctl(void *buf, size_t len); |
| 70 | #endif | ||
| 68 | static int getentropy_fallback(void *buf, size_t len); | 71 | static int getentropy_fallback(void *buf, size_t len); |
| 69 | 72 | ||
| 70 | int | 73 | int |
| @@ -87,7 +90,7 @@ getentropy(void *buf, size_t len) | |||
| 87 | if (ret != -1) | 90 | if (ret != -1) |
| 88 | return (ret); | 91 | return (ret); |
| 89 | 92 | ||
| 90 | #ifdef RANDOM_UUID | 93 | #ifdef CTL_MAXNAME |
| 91 | /* | 94 | /* |
| 92 | * Try to use sysctl CTL_KERN, KERN_RANDOM, RANDOM_UUID. | 95 | * Try to use sysctl CTL_KERN, KERN_RANDOM, RANDOM_UUID. |
| 93 | * sysctl is a failsafe API, so it guarantees a result. This | 96 | * sysctl is a failsafe API, so it guarantees a result. This |
| @@ -108,7 +111,7 @@ getentropy(void *buf, size_t len) | |||
| 108 | ret = getentropy_sysctl(buf, len); | 111 | ret = getentropy_sysctl(buf, len); |
| 109 | if (ret != -1) | 112 | if (ret != -1) |
| 110 | return (ret); | 113 | return (ret); |
| 111 | #endif /* RANDOM_UUID */ | 114 | #endif /* CTL_MAXNAME */ |
| 112 | 115 | ||
| 113 | /* | 116 | /* |
| 114 | * Entropy collection via /dev/urandom and sysctl have failed. | 117 | * Entropy collection via /dev/urandom and sysctl have failed. |
| @@ -218,11 +221,11 @@ nodevrandom: | |||
| 218 | return -1; | 221 | return -1; |
| 219 | } | 222 | } |
| 220 | 223 | ||
| 221 | #ifdef RANDOM_UUID | 224 | #ifdef CTL_MAXNAME |
| 222 | static int | 225 | static int |
| 223 | getentropy_sysctl(void *buf, size_t len) | 226 | getentropy_sysctl(void *buf, size_t len) |
| 224 | { | 227 | { |
| 225 | static const int mib[] = { CTL_KERN, KERN_RANDOM, RANDOM_UUID }; | 228 | static int mib[] = { CTL_KERN, KERN_RANDOM, RANDOM_UUID }; |
| 226 | size_t i, chunk; | 229 | size_t i, chunk; |
| 227 | int save_errno = errno; | 230 | int save_errno = errno; |
| 228 | 231 | ||
| @@ -233,7 +236,7 @@ getentropy_sysctl(void *buf, size_t len) | |||
| 233 | struct __sysctl_args args = { | 236 | struct __sysctl_args args = { |
| 234 | .name = mib, | 237 | .name = mib, |
| 235 | .nlen = 3, | 238 | .nlen = 3, |
| 236 | .oldval = &buf[i], | 239 | .oldval = buf + i, |
| 237 | .oldlenp = &chunk, | 240 | .oldlenp = &chunk, |
| 238 | }; | 241 | }; |
| 239 | if (syscall(SYS__sysctl, &args) != 0) | 242 | if (syscall(SYS__sysctl, &args) != 0) |
| @@ -248,7 +251,7 @@ sysctlfailed: | |||
| 248 | errno = EIO; | 251 | errno = EIO; |
| 249 | return -1; | 252 | return -1; |
| 250 | } | 253 | } |
| 251 | #endif /* RANDOM_UUID */ | 254 | #endif /* CTL_MAXNAME */ |
| 252 | 255 | ||
| 253 | static int cl[] = { | 256 | static int cl[] = { |
| 254 | CLOCK_REALTIME, | 257 | CLOCK_REALTIME, |
| @@ -333,7 +336,7 @@ getentropy_fallback(void *buf, size_t len) | |||
| 333 | struct statfs stfs; | 336 | struct statfs stfs; |
| 334 | socklen_t ssl; | 337 | socklen_t ssl; |
| 335 | off_t off; | 338 | off_t off; |
| 336 | 339 | ||
| 337 | /* | 340 | /* |
| 338 | * Prime-sized mappings encourage fragmentation; | 341 | * Prime-sized mappings encourage fragmentation; |
| 339 | * thus exposing some address entropy. | 342 | * thus exposing some address entropy. |
| @@ -349,7 +352,7 @@ getentropy_fallback(void *buf, size_t len) | |||
| 349 | { 57, MAP_FAILED }, { 3, MAP_FAILED }, | 352 | { 57, MAP_FAILED }, { 3, MAP_FAILED }, |
| 350 | { 131, MAP_FAILED }, { 1, MAP_FAILED }, | 353 | { 131, MAP_FAILED }, { 1, MAP_FAILED }, |
| 351 | }; | 354 | }; |
| 352 | 355 | ||
| 353 | for (m = 0; m < sizeof mm/sizeof(mm[0]); m++) { | 356 | for (m = 0; m < sizeof mm/sizeof(mm[0]); m++) { |
| 354 | HX(mm[m].p = mmap(NULL, | 357 | HX(mm[m].p = mmap(NULL, |
| 355 | mm[m].npg * pgs, | 358 | mm[m].npg * pgs, |
| @@ -367,7 +370,7 @@ getentropy_fallback(void *buf, size_t len) | |||
| 367 | cnt += (int)((long)(mm[m].p) | 370 | cnt += (int)((long)(mm[m].p) |
| 368 | / pgs); | 371 | / pgs); |
| 369 | } | 372 | } |
| 370 | 373 | ||
| 371 | /* Check cnts and times... */ | 374 | /* Check cnts and times... */ |
| 372 | for (ii = 0; ii < sizeof(cl)/sizeof(cl[0]); | 375 | for (ii = 0; ii < sizeof(cl)/sizeof(cl[0]); |
| 373 | ii++) { | 376 | ii++) { |
| @@ -376,7 +379,7 @@ getentropy_fallback(void *buf, size_t len) | |||
| 376 | if (e != -1) | 379 | if (e != -1) |
| 377 | cnt += (int)ts.tv_nsec; | 380 | cnt += (int)ts.tv_nsec; |
| 378 | } | 381 | } |
| 379 | 382 | ||
| 380 | HX((e = getrusage(RUSAGE_SELF, | 383 | HX((e = getrusage(RUSAGE_SELF, |
| 381 | &ru)) == -1, ru); | 384 | &ru)) == -1, ru); |
| 382 | if (e != -1) { | 385 | if (e != -1) { |
| @@ -384,21 +387,21 @@ getentropy_fallback(void *buf, size_t len) | |||
| 384 | cnt += (int)ru.ru_utime.tv_usec; | 387 | cnt += (int)ru.ru_utime.tv_usec; |
| 385 | } | 388 | } |
| 386 | } | 389 | } |
| 387 | 390 | ||
| 388 | for (m = 0; m < sizeof mm/sizeof(mm[0]); m++) { | 391 | for (m = 0; m < sizeof mm/sizeof(mm[0]); m++) { |
| 389 | if (mm[m].p != MAP_FAILED) | 392 | if (mm[m].p != MAP_FAILED) |
| 390 | munmap(mm[m].p, mm[m].npg * pgs); | 393 | munmap(mm[m].p, mm[m].npg * pgs); |
| 391 | mm[m].p = MAP_FAILED; | 394 | mm[m].p = MAP_FAILED; |
| 392 | } | 395 | } |
| 393 | 396 | ||
| 394 | HX(stat(".", &st) == -1, st); | 397 | HX(stat(".", &st) == -1, st); |
| 395 | HX(statvfs(".", &stvfs) == -1, stvfs); | 398 | HX(statvfs(".", &stvfs) == -1, stvfs); |
| 396 | HX(statfs(".", &stfs) == -1, stfs); | 399 | HX(statfs(".", &stfs) == -1, stfs); |
| 397 | 400 | ||
| 398 | HX(stat("/", &st) == -1, st); | 401 | HX(stat("/", &st) == -1, st); |
| 399 | HX(statvfs("/", &stvfs) == -1, stvfs); | 402 | HX(statvfs("/", &stvfs) == -1, stvfs); |
| 400 | HX(statfs("/", &stfs) == -1, stfs); | 403 | HX(statfs("/", &stfs) == -1, stfs); |
| 401 | 404 | ||
| 402 | HX((e = fstat(0, &st)) == -1, st); | 405 | HX((e = fstat(0, &st)) == -1, st); |
| 403 | if (e == -1) { | 406 | if (e == -1) { |
| 404 | if (S_ISREG(st.st_mode) || | 407 | if (S_ISREG(st.st_mode) || |
| @@ -422,7 +425,7 @@ getentropy_fallback(void *buf, size_t len) | |||
| 422 | ss); | 425 | ss); |
| 423 | } | 426 | } |
| 424 | } | 427 | } |
| 425 | 428 | ||
| 426 | HX((e = getrusage(RUSAGE_CHILDREN, | 429 | HX((e = getrusage(RUSAGE_CHILDREN, |
| 427 | &ru)) == -1, ru); | 430 | &ru)) == -1, ru); |
| 428 | if (e != -1) { | 431 | if (e != -1) { |
| @@ -433,13 +436,13 @@ getentropy_fallback(void *buf, size_t len) | |||
| 433 | /* Subsequent hashes absorb previous result */ | 436 | /* Subsequent hashes absorb previous result */ |
| 434 | HD(results); | 437 | HD(results); |
| 435 | } | 438 | } |
| 436 | 439 | ||
| 437 | HX((e = gettimeofday(&tv, NULL)) == -1, tv); | 440 | HX((e = gettimeofday(&tv, NULL)) == -1, tv); |
| 438 | if (e != -1) { | 441 | if (e != -1) { |
| 439 | cnt += (int)tv.tv_sec; | 442 | cnt += (int)tv.tv_sec; |
| 440 | cnt += (int)tv.tv_usec; | 443 | cnt += (int)tv.tv_usec; |
| 441 | } | 444 | } |
| 442 | 445 | ||
| 443 | HD(cnt); | 446 | HD(cnt); |
| 444 | } | 447 | } |
| 445 | SHA512_Final(results, &ctx); | 448 | SHA512_Final(results, &ctx); |
