mirror of
https://github.com/llvm-mirror/libcxx.git
synced 2025-10-24 20:29:39 +08:00
[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 git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@319523 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -273,6 +273,8 @@
|
|||||||
// random data even when using sandboxing mechanisms such as chroots,
|
// random data even when using sandboxing mechanisms such as chroots,
|
||||||
// Capsicum, etc.
|
// Capsicum, etc.
|
||||||
# define _LIBCPP_USING_ARC4_RANDOM
|
# define _LIBCPP_USING_ARC4_RANDOM
|
||||||
|
#elif defined(__Fuchsia__)
|
||||||
|
# define _LIBCPP_USING_GETENTROPY
|
||||||
#elif defined(__native_client__)
|
#elif defined(__native_client__)
|
||||||
// NaCl's sandbox (which PNaCl also runs in) doesn't allow filesystem access,
|
// NaCl's sandbox (which PNaCl also runs in) doesn't allow filesystem access,
|
||||||
// including accesses to the special files under /dev. C++11's
|
// including accesses to the special files under /dev. C++11's
|
||||||
|
@@ -25,7 +25,9 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.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 <fcntl.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#elif defined(_LIBCPP_USING_NACL_RANDOM)
|
#elif defined(_LIBCPP_USING_NACL_RANDOM)
|
||||||
@@ -35,7 +37,30 @@
|
|||||||
|
|
||||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
_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)
|
random_device::random_device(const string& __token)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user