[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
Thu Nov 30 22:35:00 PST 2017


This revision was automatically updated to reflect the committed changes.
Closed by commit rL319523: [libcxx] Support getentropy as a source of randomness for std::random_device (authored by phosek).

Changed prior to commit:
  https://reviews.llvm.org/D40319?vs=123842&id=125076#toc

Repository:
  rL LLVM

https://reviews.llvm.org/D40319

Files:
  libcxx/trunk/include/__config
  libcxx/trunk/src/random.cpp


Index: libcxx/trunk/include/__config
===================================================================
--- libcxx/trunk/include/__config
+++ libcxx/trunk/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
Index: libcxx/trunk/src/random.cpp
===================================================================
--- libcxx/trunk/src/random.cpp
+++ libcxx/trunk/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)
 {


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D40319.125076.patch
Type: text/x-patch
Size: 1711 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20171201/4cfbe394/attachment.bin>


More information about the cfe-commits mailing list