[PATCH] D40319: [libcxx] Support getentropy as a source of randomness for std::random_device

Petr Hosek via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Tue Nov 21 13:29:45 PST 2017


phosek created this revision.

Use this source use on Fuchsia where this is the officially way
to obtain randomness. This could be also used on other platforms
that already support getentropy such as *BSD or Linux.


Repository:
  rL LLVM

https://reviews.llvm.org/D40319

Files:
  include/__config
  src/random.cpp


Index: src/random.cpp
===================================================================
--- src/random.cpp
+++ src/random.cpp
@@ -25,7 +25,9 @@
 #include <stdio.h>
 #include <stdlib.h>
 
-#if defined(_LIBCPP_USING_DEV_RANDOM)
+#if defined(_LIBCPP_USING_GETENTROPY)
+#include <sys/random.h>
+#elif defined(_LIBCPP_USING_DEV_RANDOM)
 #include <fcntl.h>
 #include <unistd.h>
 #elif defined(_LIBCPP_USING_NACL_RANDOM)
@@ -35,7 +37,30 @@
 
 _LIBCPP_BEGIN_NAMESPACE_STD
 
-#if defined(_LIBCPP_USING_ARC4_RANDOM)
+#if defined(_LIBCPP_USING_GETENTROPY)
+
+random_device::random_device(const string& __token)
+{
+    if (__token != "/dev/urandom")
+        __throw_system_error(ENOENT, ("random device not supported " + __token).c_str());
+}
+
+random_device::~random_device()
+{
+}
+
+unsigned
+random_device::operator()()
+{
+    unsigned r;
+    size_t n = sizeof(r);
+    int err = getentropy(&r, n);
+    if (err)
+        __throw_system_error(errno, "random_device getentropy failed");
+    return r;
+}
+
+#elif defined(_LIBCPP_USING_ARC4_RANDOM)
 
 random_device::random_device(const string& __token)
 {
Index: include/__config
===================================================================
--- include/__config
+++ include/__config
@@ -273,6 +273,8 @@
   // random data even when using sandboxing mechanisms such as chroots,
   // Capsicum, etc.
 # define _LIBCPP_USING_ARC4_RANDOM
+#elif defined(__Fuchsia__)
+# define _LIBCPP_USING_GETENTROPY
 #elif defined(__native_client__)
   // NaCl's sandbox (which PNaCl also runs in) doesn't allow filesystem access,
   // including accesses to the special files under /dev. C++11's


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D40319.123842.patch
Type: text/x-patch
Size: 1633 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20171121/85c25a11/attachment-0001.bin>


More information about the cfe-commits mailing list