summaryrefslogtreecommitdiff
path: root/lib/libcrypto
diff options
context:
space:
mode:
authorTheo de Raadt <deraadt@cvs.openbsd.org>2014-07-20 03:24:11 +0000
committerTheo de Raadt <deraadt@cvs.openbsd.org>2014-07-20 03:24:11 +0000
commite6f0cd4441a64ae4bfa0fbd3a23a2d7a6857d51e (patch)
tree21fcbfa4a251c7698a63e9b4356c70da01a2d707 /lib/libcrypto
parent3a31672be25d8fbfc3ac7101394637f5cec8a29f (diff)
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.
Diffstat (limited to 'lib/libcrypto')
-rw-r--r--lib/libcrypto/crypto/getentropy_linux.c38
1 files changed, 37 insertions, 1 deletions
diff --git a/lib/libcrypto/crypto/getentropy_linux.c b/lib/libcrypto/crypto/getentropy_linux.c
index 04f21e147bb..2ad844624f1 100644
--- a/lib/libcrypto/crypto/getentropy_linux.c
+++ b/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 <deraadt@openbsd.org>
@@ -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);
@@ -92,6 +93,13 @@ getentropy(void *buf, size_t len)
}
/*
+ * Try descriptor-less getrandom()
+ */
+ ret = getentropy_getrandom(buf, len);
+ if (ret != -1)
+ return (ret);
+
+ /*
* Try to get entropy with /dev/urandom
*
* This can fail if the process is inside a chroot or if file
@@ -177,6 +185,34 @@ gotdata(char *buf, size_t len)
}
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)
{
struct stat st;