diff --git a/src/lib/libcrypto/arc4random/getentropy_linux.c b/src/lib/libcrypto/arc4random/getentropy_linux.c index 04f21e14..2ad84462 100644 --- a/src/lib/libcrypto/arc4random/getentropy_linux.c +++ b/src/lib/libcrypto/arc4random/getentropy_linux.c @@ -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 @@ -74,6 +74,7 @@ int getentropy(void *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); #ifdef CTL_MAXNAME static int getentropy_sysctl(void *buf, size_t len); @@ -91,6 +92,13 @@ getentropy(void *buf, size_t len) return -1; } + /* + * Try descriptor-less getrandom() + */ + ret = getentropy_getrandom(buf, len); + if (ret != -1) + return (ret); + /* * Try to get entropy with /dev/urandom * @@ -176,6 +184,34 @@ gotdata(char *buf, size_t len) 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 getentropy_urandom(void *buf, size_t len) { diff --git a/src/lib/libcrypto/crypto/getentropy_linux.c b/src/lib/libcrypto/crypto/getentropy_linux.c index 04f21e14..2ad84462 100644 --- a/src/lib/libcrypto/crypto/getentropy_linux.c +++ b/src/lib/libcrypto/crypto/getentropy_linux.c @@ -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 @@ -74,6 +74,7 @@ int getentropy(void *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); #ifdef CTL_MAXNAME static int getentropy_sysctl(void *buf, size_t len); @@ -91,6 +92,13 @@ getentropy(void *buf, size_t len) return -1; } + /* + * Try descriptor-less getrandom() + */ + ret = getentropy_getrandom(buf, len); + if (ret != -1) + return (ret); + /* * Try to get entropy with /dev/urandom * @@ -176,6 +184,34 @@ gotdata(char *buf, size_t len) 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 getentropy_urandom(void *buf, size_t len) {