Browse Source

Demonstrate how new linux getrandom() will be called, at least until

it shows up in libraries.  Even the system call is probably not finalized.
Bit dissapointed it has turned out to be a descriptor-less read() with
EINVAL and EINTR error conditions, but we can work with it.
OPENBSD_5_6
deraadt 10 years ago
parent
commit
d107050d39
2 changed files with 74 additions and 2 deletions
  1. +37
    -1
      src/lib/libcrypto/arc4random/getentropy_linux.c
  2. +37
    -1
      src/lib/libcrypto/crypto/getentropy_linux.c

+ 37
- 1
src/lib/libcrypto/arc4random/getentropy_linux.c View File

@ -1,4 +1,4 @@
/* $OpenBSD: getentropy_linux.c,v 1.27 2014/07/19 16:12:00 deraadt Exp $ */
/* $OpenBSD: getentropy_linux.c,v 1.28 2014/07/20 03:24:10 deraadt Exp $ */
/* /*
* Copyright (c) 2014 Theo de Raadt <deraadt@openbsd.org> * Copyright (c) 2014 Theo de Raadt <deraadt@openbsd.org>
@ -74,6 +74,7 @@
int getentropy(void *buf, size_t len); int getentropy(void *buf, size_t len);
static int gotdata(char *buf, size_t len); static int gotdata(char *buf, size_t len);
static int getentropy_getrandom(void *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 #ifdef CTL_MAXNAME
static int getentropy_sysctl(void *buf, size_t len); static int getentropy_sysctl(void *buf, size_t len);
@ -91,6 +92,13 @@ getentropy(void *buf, size_t len)
return -1; return -1;
} }
/*
* Try descriptor-less getrandom()
*/
ret = getentropy_getrandom(buf, len);
if (ret != -1)
return (ret);
/* /*
* Try to get entropy with /dev/urandom * Try to get entropy with /dev/urandom
* *
@ -176,6 +184,34 @@ gotdata(char *buf, size_t len)
return 0; return 0;
} }
static int
getentropy_getrandom(void *buf, size_t len)
{
#if 0
/* Hand-definitions until the API becomes commonplace */
#ifndef SYS__getrandom
#ifdef __LP64__
#define SYS__getrandom 317
#else
#define SYS__getrandom 354
#endif
#endif
struct __getrandom_args args = {
.buf = buf;
.len = len;
.flags = 0;
};
if (len > 256)
return (-1);
ret = syscall(SYS__getrandom, &args);
if (ret == len)
return (0);
#endif
return -1;
}
static int static int
getentropy_urandom(void *buf, size_t len) getentropy_urandom(void *buf, size_t len)
{ {


+ 37
- 1
src/lib/libcrypto/crypto/getentropy_linux.c View File

@ -1,4 +1,4 @@
/* $OpenBSD: getentropy_linux.c,v 1.27 2014/07/19 16:12:00 deraadt Exp $ */
/* $OpenBSD: getentropy_linux.c,v 1.28 2014/07/20 03:24:10 deraadt Exp $ */
/* /*
* Copyright (c) 2014 Theo de Raadt <deraadt@openbsd.org> * Copyright (c) 2014 Theo de Raadt <deraadt@openbsd.org>
@ -74,6 +74,7 @@
int getentropy(void *buf, size_t len); int getentropy(void *buf, size_t len);
static int gotdata(char *buf, size_t len); static int gotdata(char *buf, size_t len);
static int getentropy_getrandom(void *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 #ifdef CTL_MAXNAME
static int getentropy_sysctl(void *buf, size_t len); static int getentropy_sysctl(void *buf, size_t len);
@ -91,6 +92,13 @@ getentropy(void *buf, size_t len)
return -1; return -1;
} }
/*
* Try descriptor-less getrandom()
*/
ret = getentropy_getrandom(buf, len);
if (ret != -1)
return (ret);
/* /*
* Try to get entropy with /dev/urandom * Try to get entropy with /dev/urandom
* *
@ -176,6 +184,34 @@ gotdata(char *buf, size_t len)
return 0; return 0;
} }
static int
getentropy_getrandom(void *buf, size_t len)
{
#if 0
/* Hand-definitions until the API becomes commonplace */
#ifndef SYS__getrandom
#ifdef __LP64__
#define SYS__getrandom 317
#else
#define SYS__getrandom 354
#endif
#endif
struct __getrandom_args args = {
.buf = buf;
.len = len;
.flags = 0;
};
if (len > 256)
return (-1);
ret = syscall(SYS__getrandom, &args);
if (ret == len)
return (0);
#endif
return -1;
}
static int static int
getentropy_urandom(void *buf, size_t len) getentropy_urandom(void *buf, size_t len)
{ {


Loading…
Cancel
Save