Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2771)

Unified Diff: base/rand_util_win.cc

Issue 141753009: Use RtlGenRandom() directly instead of going through rand_s(). (Closed) Base URL: http://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add missing header. Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;
}
}
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698