| 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;
|
| }
|
| }
|
|
|
|
|