Index: base/rand_util_win.cc |
diff --git a/base/rand_util_win.cc b/base/rand_util_win.cc |
index 52103eb93e556ce19269edd04cda5c2d2c84fccc..8573b6b601b2fb34324e39dbae8ca60127696ab0 100644 |
--- a/base/rand_util_win.cc |
+++ b/base/rand_util_win.cc |
@@ -4,37 +4,39 @@ |
#include "base/rand_util.h" |
-#include <stdlib.h> |
+#include <windows.h> |
-#include "base/basictypes.h" |
-#include "base/logging.h" |
- |
-namespace { |
+// #define needed to link in RtlGenRandom(), a.k.a. SystemFunction036. See the |
+// "Community Additions" comment on MSDN here: |
+// http://msdn.microsoft.com/en-us/library/windows/desktop/aa387694.aspx |
+#define SystemFunction036 NTAPI SystemFunction036 |
+#include <NTSecAPI.h> |
+#undef SystemFunction036 |
-uint32 RandUint32() { |
- uint32 number; |
- CHECK_EQ(rand_s(&number), 0); |
- return number; |
-} |
+#include <algorithm> |
+#include <limits> |
-} // namespace |
+#include "base/logging.h" |
namespace base { |
// NOTE: This function must be cryptographically secure. http://crbug.com/140076 |
uint64 RandUint64() { |
- uint32 first_half = RandUint32(); |
- uint32 second_half = RandUint32(); |
- return (static_cast<uint64>(first_half) << 32) + second_half; |
+ uint64 number; |
+ RandBytes(&number, sizeof(number)); |
+ return number; |
} |
void RandBytes(void* output, size_t output_length) { |
- uint64 random_int; |
- const size_t random_int_size = sizeof(random_int); |
- for (size_t i = 0; i < output_length; i += random_int_size) { |
- random_int = base::RandUint64(); |
- const size_t copy_count = std::min(output_length - i, random_int_size); |
- memcpy(((uint8*)output) + i, &random_int, copy_count); |
+ char* output_ptr = static_cast<char*>(output); |
+ while (output_length > 0) { |
+ const ULONG output_bytes_this_pass = static_cast<ULONG>(std::min( |
+ output_length, static_cast<size_t>(std::numeric_limits<ULONG>::max()))); |
+ const bool success = |
+ RtlGenRandom(output_ptr, output_bytes_this_pass) != FALSE; |
+ CHECK(success); |
+ output_length -= output_bytes_this_pass; |
+ output_ptr += output_bytes_this_pass; |
} |
} |