[llvm-branch-commits] [libcxx] f3b979b - [libc++] Use ioctl when available to get random_device entropy.

Marek Kurdej via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Thu Jan 21 09:06:14 PST 2021


Author: Marek Kurdej
Date: 2021-01-21T18:01:02+01:00
New Revision: f3b979b65e9ff81b656d26d9f2a1c731301fd445

URL: https://github.com/llvm/llvm-project/commit/f3b979b65e9ff81b656d26d9f2a1c731301fd445
DIFF: https://github.com/llvm/llvm-project/commit/f3b979b65e9ff81b656d26d9f2a1c731301fd445.diff

LOG: [libc++] Use ioctl when available to get random_device entropy.

Implemented the idea from D94571 to improve entropy on Linux.

Reviewed By: ldionne, #libc

Differential Revision: https://reviews.llvm.org/D94953

Added: 
    

Modified: 
    libcxx/src/random.cpp
    libcxx/test/std/numerics/rand/rand.device/entropy.pass.cpp

Removed: 
    


################################################################################
diff  --git a/libcxx/src/random.cpp b/libcxx/src/random.cpp
index 04adc59f9bc9..7d0431e5ca54 100644
--- a/libcxx/src/random.cpp
+++ b/libcxx/src/random.cpp
@@ -13,6 +13,7 @@
 #define _CRT_RAND_S
 #endif // defined(_LIBCPP_USING_WIN32_RANDOM)
 
+#include "limits"
 #include "random"
 #include "system_error"
 
@@ -29,6 +30,10 @@
 #elif defined(_LIBCPP_USING_DEV_RANDOM)
 #include <fcntl.h>
 #include <unistd.h>
+#if __has_include(<sys/ioctl.h>) && __has_include(<linux/random.h>)
+#include <sys/ioctl.h>
+#include <linux/random.h>
+#endif
 #elif defined(_LIBCPP_USING_NACL_RANDOM)
 #include <nacl/nacl_random.h>
 #endif
@@ -172,7 +177,21 @@ random_device::operator()()
 double
 random_device::entropy() const _NOEXCEPT
 {
+#if defined(_LIBCPP_USING_DEV_RANDOM) && defined(RNDGETENTCNT)
+  int ent;
+  if (::ioctl(__f_, RNDGETENTCNT, &ent) < 0)
+    return 0;
+
+  if (ent < 0)
     return 0;
+
+  if (ent > std::numeric_limits<result_type>::digits)
+    return std::numeric_limits<result_type>::digits;
+
+  return ent;
+#else
+  return 0;
+#endif
 }
 
 _LIBCPP_END_NAMESPACE_STD

diff  --git a/libcxx/test/std/numerics/rand/rand.device/entropy.pass.cpp b/libcxx/test/std/numerics/rand/rand.device/entropy.pass.cpp
index 4f09d05012ea..3f9ea85bfc05 100644
--- a/libcxx/test/std/numerics/rand/rand.device/entropy.pass.cpp
+++ b/libcxx/test/std/numerics/rand/rand.device/entropy.pass.cpp
@@ -16,14 +16,15 @@
 
 #include <random>
 #include <cassert>
+#include <climits>
 
 #include "test_macros.h"
 
-int main(int, char**)
-{
-    std::random_device r;
-    double e = r.entropy();
-    ((void)e); // Prevent unused warning
+int main(int, char**) {
+  std::random_device r;
+  double e = r.entropy();
+  assert(e >= 0);
+  assert(e <= sizeof(typename std::random_device::result_type) * CHAR_BIT);
 
   return 0;
 }


        


More information about the llvm-branch-commits mailing list