Browse Source

unbreak build of getentropy_sysctl - we need linux/sysctl.h, and

RANDOM_UUID is an enum member.
OPENBSD_5_6
beck 10 years ago
parent
commit
dca54ba442
2 changed files with 42 additions and 36 deletions
  1. +21
    -18
      src/lib/libcrypto/arc4random/getentropy_linux.c
  2. +21
    -18
      src/lib/libcrypto/crypto/getentropy_linux.c

+ 21
- 18
src/lib/libcrypto/arc4random/getentropy_linux.c View File

@ -1,4 +1,4 @@
/* $OpenBSD: getentropy_linux.c,v 1.7 2014/06/23 03:32:57 beck Exp $ */
/* $OpenBSD: getentropy_linux.c,v 1.8 2014/06/23 03:47:46 beck Exp $ */
/* /*
* Copyright (c) 2014 Theo de Raadt <deraadt@openbsd.org> * Copyright (c) 2014 Theo de Raadt <deraadt@openbsd.org>
@ -44,6 +44,7 @@
#include <openssl/sha.h> #include <openssl/sha.h>
#include <linux/random.h> #include <linux/random.h>
#include <linux/sysctl.h>
#include <sys/vfs.h> #include <sys/vfs.h>
#define REPEAT 5 #define REPEAT 5
@ -64,7 +65,9 @@ int getentropy(void *buf, size_t len);
extern int main(int, char *argv[]); extern int main(int, char *argv[]);
static int gotdata(char *buf, size_t len); static int gotdata(char *buf, size_t len);
static int getentropy_urandom(void *buf, size_t len); static int getentropy_urandom(void *buf, size_t len);
#ifdef CTL_MAXNAME
static int getentropy_sysctl(void *buf, size_t len); static int getentropy_sysctl(void *buf, size_t len);
#endif
static int getentropy_fallback(void *buf, size_t len); static int getentropy_fallback(void *buf, size_t len);
int int
@ -87,7 +90,7 @@ getentropy(void *buf, size_t len)
if (ret != -1) if (ret != -1)
return (ret); return (ret);
#ifdef RANDOM_UUID
#ifdef CTL_MAXNAME
/* /*
* Try to use sysctl CTL_KERN, KERN_RANDOM, RANDOM_UUID. * Try to use sysctl CTL_KERN, KERN_RANDOM, RANDOM_UUID.
* sysctl is a failsafe API, so it guarantees a result. This * sysctl is a failsafe API, so it guarantees a result. This
@ -108,7 +111,7 @@ getentropy(void *buf, size_t len)
ret = getentropy_sysctl(buf, len); ret = getentropy_sysctl(buf, len);
if (ret != -1) if (ret != -1)
return (ret); return (ret);
#endif /* RANDOM_UUID */
#endif /* CTL_MAXNAME */
/* /*
* Entropy collection via /dev/urandom and sysctl have failed. * Entropy collection via /dev/urandom and sysctl have failed.
@ -218,11 +221,11 @@ nodevrandom:
return -1; return -1;
} }
#ifdef RANDOM_UUID
#ifdef CTL_MAXNAME
static int static int
getentropy_sysctl(void *buf, size_t len) getentropy_sysctl(void *buf, size_t len)
{ {
static const int mib[] = { CTL_KERN, KERN_RANDOM, RANDOM_UUID };
static int mib[] = { CTL_KERN, KERN_RANDOM, RANDOM_UUID };
size_t i, chunk; size_t i, chunk;
int save_errno = errno; int save_errno = errno;
@ -233,7 +236,7 @@ getentropy_sysctl(void *buf, size_t len)
struct __sysctl_args args = { struct __sysctl_args args = {
.name = mib, .name = mib,
.nlen = 3, .nlen = 3,
.oldval = &buf[i],
.oldval = buf + i,
.oldlenp = &chunk, .oldlenp = &chunk,
}; };
if (syscall(SYS__sysctl, &args) != 0) if (syscall(SYS__sysctl, &args) != 0)
@ -248,7 +251,7 @@ sysctlfailed:
errno = EIO; errno = EIO;
return -1; return -1;
} }
#endif /* RANDOM_UUID */
#endif /* CTL_MAXNAME */
static int cl[] = { static int cl[] = {
CLOCK_REALTIME, CLOCK_REALTIME,
@ -333,7 +336,7 @@ getentropy_fallback(void *buf, size_t len)
struct statfs stfs; struct statfs stfs;
socklen_t ssl; socklen_t ssl;
off_t off; off_t off;
/* /*
* Prime-sized mappings encourage fragmentation; * Prime-sized mappings encourage fragmentation;
* thus exposing some address entropy. * thus exposing some address entropy.
@ -349,7 +352,7 @@ getentropy_fallback(void *buf, size_t len)
{ 57, MAP_FAILED }, { 3, MAP_FAILED }, { 57, MAP_FAILED }, { 3, MAP_FAILED },
{ 131, MAP_FAILED }, { 1, MAP_FAILED }, { 131, MAP_FAILED }, { 1, MAP_FAILED },
}; };
for (m = 0; m < sizeof mm/sizeof(mm[0]); m++) { for (m = 0; m < sizeof mm/sizeof(mm[0]); m++) {
HX(mm[m].p = mmap(NULL, HX(mm[m].p = mmap(NULL,
mm[m].npg * pgs, mm[m].npg * pgs,
@ -367,7 +370,7 @@ getentropy_fallback(void *buf, size_t len)
cnt += (int)((long)(mm[m].p) cnt += (int)((long)(mm[m].p)
/ pgs); / pgs);
} }
/* Check cnts and times... */ /* Check cnts and times... */
for (ii = 0; ii < sizeof(cl)/sizeof(cl[0]); for (ii = 0; ii < sizeof(cl)/sizeof(cl[0]);
ii++) { ii++) {
@ -376,7 +379,7 @@ getentropy_fallback(void *buf, size_t len)
if (e != -1) if (e != -1)
cnt += (int)ts.tv_nsec; cnt += (int)ts.tv_nsec;
} }
HX((e = getrusage(RUSAGE_SELF, HX((e = getrusage(RUSAGE_SELF,
&ru)) == -1, ru); &ru)) == -1, ru);
if (e != -1) { if (e != -1) {
@ -384,21 +387,21 @@ getentropy_fallback(void *buf, size_t len)
cnt += (int)ru.ru_utime.tv_usec; cnt += (int)ru.ru_utime.tv_usec;
} }
} }
for (m = 0; m < sizeof mm/sizeof(mm[0]); m++) { for (m = 0; m < sizeof mm/sizeof(mm[0]); m++) {
if (mm[m].p != MAP_FAILED) if (mm[m].p != MAP_FAILED)
munmap(mm[m].p, mm[m].npg * pgs); munmap(mm[m].p, mm[m].npg * pgs);
mm[m].p = MAP_FAILED; mm[m].p = MAP_FAILED;
} }
HX(stat(".", &st) == -1, st); HX(stat(".", &st) == -1, st);
HX(statvfs(".", &stvfs) == -1, stvfs); HX(statvfs(".", &stvfs) == -1, stvfs);
HX(statfs(".", &stfs) == -1, stfs); HX(statfs(".", &stfs) == -1, stfs);
HX(stat("/", &st) == -1, st); HX(stat("/", &st) == -1, st);
HX(statvfs("/", &stvfs) == -1, stvfs); HX(statvfs("/", &stvfs) == -1, stvfs);
HX(statfs("/", &stfs) == -1, stfs); HX(statfs("/", &stfs) == -1, stfs);
HX((e = fstat(0, &st)) == -1, st); HX((e = fstat(0, &st)) == -1, st);
if (e == -1) { if (e == -1) {
if (S_ISREG(st.st_mode) || if (S_ISREG(st.st_mode) ||
@ -422,7 +425,7 @@ getentropy_fallback(void *buf, size_t len)
ss); ss);
} }
} }
HX((e = getrusage(RUSAGE_CHILDREN, HX((e = getrusage(RUSAGE_CHILDREN,
&ru)) == -1, ru); &ru)) == -1, ru);
if (e != -1) { if (e != -1) {
@ -433,13 +436,13 @@ getentropy_fallback(void *buf, size_t len)
/* Subsequent hashes absorb previous result */ /* Subsequent hashes absorb previous result */
HD(results); HD(results);
} }
HX((e = gettimeofday(&tv, NULL)) == -1, tv); HX((e = gettimeofday(&tv, NULL)) == -1, tv);
if (e != -1) { if (e != -1) {
cnt += (int)tv.tv_sec; cnt += (int)tv.tv_sec;
cnt += (int)tv.tv_usec; cnt += (int)tv.tv_usec;
} }
HD(cnt); HD(cnt);
} }
SHA512_Final(results, &ctx); SHA512_Final(results, &ctx);


+ 21
- 18
src/lib/libcrypto/crypto/getentropy_linux.c View File

@ -1,4 +1,4 @@
/* $OpenBSD: getentropy_linux.c,v 1.7 2014/06/23 03:32:57 beck Exp $ */
/* $OpenBSD: getentropy_linux.c,v 1.8 2014/06/23 03:47:46 beck Exp $ */
/* /*
* Copyright (c) 2014 Theo de Raadt <deraadt@openbsd.org> * Copyright (c) 2014 Theo de Raadt <deraadt@openbsd.org>
@ -44,6 +44,7 @@
#include <openssl/sha.h> #include <openssl/sha.h>
#include <linux/random.h> #include <linux/random.h>
#include <linux/sysctl.h>
#include <sys/vfs.h> #include <sys/vfs.h>
#define REPEAT 5 #define REPEAT 5
@ -64,7 +65,9 @@ int getentropy(void *buf, size_t len);
extern int main(int, char *argv[]); extern int main(int, char *argv[]);
static int gotdata(char *buf, size_t len); static int gotdata(char *buf, size_t len);
static int getentropy_urandom(void *buf, size_t len); static int getentropy_urandom(void *buf, size_t len);
#ifdef CTL_MAXNAME
static int getentropy_sysctl(void *buf, size_t len); static int getentropy_sysctl(void *buf, size_t len);
#endif
static int getentropy_fallback(void *buf, size_t len); static int getentropy_fallback(void *buf, size_t len);
int int
@ -87,7 +90,7 @@ getentropy(void *buf, size_t len)
if (ret != -1) if (ret != -1)
return (ret); return (ret);
#ifdef RANDOM_UUID
#ifdef CTL_MAXNAME
/* /*
* Try to use sysctl CTL_KERN, KERN_RANDOM, RANDOM_UUID. * Try to use sysctl CTL_KERN, KERN_RANDOM, RANDOM_UUID.
* sysctl is a failsafe API, so it guarantees a result. This * sysctl is a failsafe API, so it guarantees a result. This
@ -108,7 +111,7 @@ getentropy(void *buf, size_t len)
ret = getentropy_sysctl(buf, len); ret = getentropy_sysctl(buf, len);
if (ret != -1) if (ret != -1)
return (ret); return (ret);
#endif /* RANDOM_UUID */
#endif /* CTL_MAXNAME */
/* /*
* Entropy collection via /dev/urandom and sysctl have failed. * Entropy collection via /dev/urandom and sysctl have failed.
@ -218,11 +221,11 @@ nodevrandom:
return -1; return -1;
} }
#ifdef RANDOM_UUID
#ifdef CTL_MAXNAME
static int static int
getentropy_sysctl(void *buf, size_t len) getentropy_sysctl(void *buf, size_t len)
{ {
static const int mib[] = { CTL_KERN, KERN_RANDOM, RANDOM_UUID };
static int mib[] = { CTL_KERN, KERN_RANDOM, RANDOM_UUID };
size_t i, chunk; size_t i, chunk;
int save_errno = errno; int save_errno = errno;
@ -233,7 +236,7 @@ getentropy_sysctl(void *buf, size_t len)
struct __sysctl_args args = { struct __sysctl_args args = {
.name = mib, .name = mib,
.nlen = 3, .nlen = 3,
.oldval = &buf[i],
.oldval = buf + i,
.oldlenp = &chunk, .oldlenp = &chunk,
}; };
if (syscall(SYS__sysctl, &args) != 0) if (syscall(SYS__sysctl, &args) != 0)
@ -248,7 +251,7 @@ sysctlfailed:
errno = EIO; errno = EIO;
return -1; return -1;
} }
#endif /* RANDOM_UUID */
#endif /* CTL_MAXNAME */
static int cl[] = { static int cl[] = {
CLOCK_REALTIME, CLOCK_REALTIME,
@ -333,7 +336,7 @@ getentropy_fallback(void *buf, size_t len)
struct statfs stfs; struct statfs stfs;
socklen_t ssl; socklen_t ssl;
off_t off; off_t off;
/* /*
* Prime-sized mappings encourage fragmentation; * Prime-sized mappings encourage fragmentation;
* thus exposing some address entropy. * thus exposing some address entropy.
@ -349,7 +352,7 @@ getentropy_fallback(void *buf, size_t len)
{ 57, MAP_FAILED }, { 3, MAP_FAILED }, { 57, MAP_FAILED }, { 3, MAP_FAILED },
{ 131, MAP_FAILED }, { 1, MAP_FAILED }, { 131, MAP_FAILED }, { 1, MAP_FAILED },
}; };
for (m = 0; m < sizeof mm/sizeof(mm[0]); m++) { for (m = 0; m < sizeof mm/sizeof(mm[0]); m++) {
HX(mm[m].p = mmap(NULL, HX(mm[m].p = mmap(NULL,
mm[m].npg * pgs, mm[m].npg * pgs,
@ -367,7 +370,7 @@ getentropy_fallback(void *buf, size_t len)
cnt += (int)((long)(mm[m].p) cnt += (int)((long)(mm[m].p)
/ pgs); / pgs);
} }
/* Check cnts and times... */ /* Check cnts and times... */
for (ii = 0; ii < sizeof(cl)/sizeof(cl[0]); for (ii = 0; ii < sizeof(cl)/sizeof(cl[0]);
ii++) { ii++) {
@ -376,7 +379,7 @@ getentropy_fallback(void *buf, size_t len)
if (e != -1) if (e != -1)
cnt += (int)ts.tv_nsec; cnt += (int)ts.tv_nsec;
} }
HX((e = getrusage(RUSAGE_SELF, HX((e = getrusage(RUSAGE_SELF,
&ru)) == -1, ru); &ru)) == -1, ru);
if (e != -1) { if (e != -1) {
@ -384,21 +387,21 @@ getentropy_fallback(void *buf, size_t len)
cnt += (int)ru.ru_utime.tv_usec; cnt += (int)ru.ru_utime.tv_usec;
} }
} }
for (m = 0; m < sizeof mm/sizeof(mm[0]); m++) { for (m = 0; m < sizeof mm/sizeof(mm[0]); m++) {
if (mm[m].p != MAP_FAILED) if (mm[m].p != MAP_FAILED)
munmap(mm[m].p, mm[m].npg * pgs); munmap(mm[m].p, mm[m].npg * pgs);
mm[m].p = MAP_FAILED; mm[m].p = MAP_FAILED;
} }
HX(stat(".", &st) == -1, st); HX(stat(".", &st) == -1, st);
HX(statvfs(".", &stvfs) == -1, stvfs); HX(statvfs(".", &stvfs) == -1, stvfs);
HX(statfs(".", &stfs) == -1, stfs); HX(statfs(".", &stfs) == -1, stfs);
HX(stat("/", &st) == -1, st); HX(stat("/", &st) == -1, st);
HX(statvfs("/", &stvfs) == -1, stvfs); HX(statvfs("/", &stvfs) == -1, stvfs);
HX(statfs("/", &stfs) == -1, stfs); HX(statfs("/", &stfs) == -1, stfs);
HX((e = fstat(0, &st)) == -1, st); HX((e = fstat(0, &st)) == -1, st);
if (e == -1) { if (e == -1) {
if (S_ISREG(st.st_mode) || if (S_ISREG(st.st_mode) ||
@ -422,7 +425,7 @@ getentropy_fallback(void *buf, size_t len)
ss); ss);
} }
} }
HX((e = getrusage(RUSAGE_CHILDREN, HX((e = getrusage(RUSAGE_CHILDREN,
&ru)) == -1, ru); &ru)) == -1, ru);
if (e != -1) { if (e != -1) {
@ -433,13 +436,13 @@ getentropy_fallback(void *buf, size_t len)
/* Subsequent hashes absorb previous result */ /* Subsequent hashes absorb previous result */
HD(results); HD(results);
} }
HX((e = gettimeofday(&tv, NULL)) == -1, tv); HX((e = gettimeofday(&tv, NULL)) == -1, tv);
if (e != -1) { if (e != -1) {
cnt += (int)tv.tv_sec; cnt += (int)tv.tv_sec;
cnt += (int)tv.tv_usec; cnt += (int)tv.tv_usec;
} }
HD(cnt); HD(cnt);
} }
SHA512_Final(results, &ctx); SHA512_Final(results, &ctx);


Loading…
Cancel
Save