Demonstrate how new linux getrandom() will be called, at least until
authorderaadt <deraadt@openbsd.org>
Sun, 20 Jul 2014 03:24:10 +0000 (03:24 +0000)
committerderaadt <deraadt@openbsd.org>
Sun, 20 Jul 2014 03:24:10 +0000 (03:24 +0000)
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.

lib/libcrypto/arc4random/getentropy_linux.c
lib/libcrypto/crypto/getentropy_linux.c

index 04f21e1..2ad8446 100644 (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>
@@ -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)
 {
index 04f21e1..2ad8446 100644 (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>
@@ -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)
 {