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; } _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits