OLD | NEW |
| (Empty) |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "base/rand_util.h" | |
6 | |
7 #include <windows.h> | |
8 | |
9 // #define needed to link in RtlGenRandom(), a.k.a. SystemFunction036. See the | |
10 // "Community Additions" comment on MSDN here: | |
11 // http://msdn.microsoft.com/en-us/library/windows/desktop/aa387694.aspx | |
12 #define SystemFunction036 NTAPI SystemFunction036 | |
13 #include <NTSecAPI.h> | |
14 #undef SystemFunction036 | |
15 | |
16 #include <algorithm> | |
17 #include <limits> | |
18 | |
19 #include "base/logging.h" | |
20 | |
21 namespace base { | |
22 | |
23 // NOTE: This function must be cryptographically secure. http://crbug.com/140076 | |
24 uint64 RandUint64() { | |
25 uint64 number; | |
26 RandBytes(&number, sizeof(number)); | |
27 return number; | |
28 } | |
29 | |
30 void RandBytes(void* output, size_t output_length) { | |
31 char* output_ptr = static_cast<char*>(output); | |
32 while (output_length > 0) { | |
33 const ULONG output_bytes_this_pass = static_cast<ULONG>(std::min( | |
34 output_length, static_cast<size_t>(std::numeric_limits<ULONG>::max()))); | |
35 const bool success = | |
36 RtlGenRandom(output_ptr, output_bytes_this_pass) != FALSE; | |
37 CHECK(success); | |
38 output_length -= output_bytes_this_pass; | |
39 output_ptr += output_bytes_this_pass; | |
40 } | |
41 } | |
42 | |
43 } // namespace base | |
OLD | NEW |