summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbeck <>2014-06-23 03:47:46 +0000
committerbeck <>2014-06-23 03:47:46 +0000
commitf36fb0683122e796aa66b09a47e611631ede1944 (patch)
tree08c42e31a882abecf0d2c991be1ddb869ac26f98
parentca3aed695a33180fbf581f1883f15a3054e5f6fd (diff)
downloadopenbsd-f36fb0683122e796aa66b09a47e611631ede1944.tar.gz
openbsd-f36fb0683122e796aa66b09a47e611631ede1944.tar.bz2
openbsd-f36fb0683122e796aa66b09a47e611631ede1944.zip
unbreak build of getentropy_sysctl - we need linux/sysctl.h, and
RANDOM_UUID is an enum member.
-rw-r--r--src/lib/libcrypto/arc4random/getentropy_linux.c39
-rw-r--r--src/lib/libcrypto/crypto/getentropy_linux.c39
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);
64extern int main(int, char *argv[]); 65extern int main(int, char *argv[]);
65static int gotdata(char *buf, size_t len); 66static int gotdata(char *buf, size_t len);
66static int getentropy_urandom(void *buf, size_t len); 67static int getentropy_urandom(void *buf, size_t len);
68#ifdef CTL_MAXNAME
67static int getentropy_sysctl(void *buf, size_t len); 69static int getentropy_sysctl(void *buf, size_t len);
70#endif
68static int getentropy_fallback(void *buf, size_t len); 71static int getentropy_fallback(void *buf, size_t len);
69 72
70int 73int
@@ -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
222static int 225static int
223getentropy_sysctl(void *buf, size_t len) 226getentropy_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
253static int cl[] = { 256static 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);
64extern int main(int, char *argv[]); 65extern int main(int, char *argv[]);
65static int gotdata(char *buf, size_t len); 66static int gotdata(char *buf, size_t len);
66static int getentropy_urandom(void *buf, size_t len); 67static int getentropy_urandom(void *buf, size_t len);
68#ifdef CTL_MAXNAME
67static int getentropy_sysctl(void *buf, size_t len); 69static int getentropy_sysctl(void *buf, size_t len);
70#endif
68static int getentropy_fallback(void *buf, size_t len); 71static int getentropy_fallback(void *buf, size_t len);
69 72
70int 73int
@@ -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
222static int 225static int
223getentropy_sysctl(void *buf, size_t len) 226getentropy_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
253static int cl[] = { 256static 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);