summaryrefslogtreecommitdiffstats
path: root/libcxx/src/random.cpp
diff options
context:
space:
mode:
authorPetr Hosek <phosek@chromium.org>2017-12-01 06:34:33 +0000
committerPetr Hosek <phosek@chromium.org>2017-12-01 06:34:33 +0000
commit5c704281767f8baa0a18de110bb4462549c16e49 (patch)
tree15c9a6ecbc700327055f5ddfb2975ad900a018d1 /libcxx/src/random.cpp
parent48e4c7aae6f117fb44ad5bf50a086a25f2e382a5 (diff)
downloadbcm5719-llvm-5c704281767f8baa0a18de110bb4462549c16e49.tar.gz
bcm5719-llvm-5c704281767f8baa0a18de110bb4462549c16e49.zip
[libcxx] Support getentropy as a source of randomness for std::random_device
Use this source use on Fuchsia where this is the oficially way to obtain randomness. This could be also used on other platforms that already support getentropy such as *BSD or Linux. Differential Revision: https://reviews.llvm.org/D40319 llvm-svn: 319523
Diffstat (limited to 'libcxx/src/random.cpp')
-rw-r--r--libcxx/src/random.cpp29
1 files changed, 27 insertions, 2 deletions
diff --git a/libcxx/src/random.cpp b/libcxx/src/random.cpp
index eb2510a48c8..4a2468368d0 100644
--- a/libcxx/src/random.cpp
+++ b/libcxx/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)
{
OpenPOWER on IntegriCloud