[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