diff options
Diffstat (limited to 'chrome/browser')
-rw-r--r-- | chrome/browser/sync/util/crypto_helpers.cc | 20 | ||||
-rw-r--r-- | chrome/browser/sync/util/crypto_helpers_unittest.cc | 10 |
2 files changed, 24 insertions, 6 deletions
diff --git a/chrome/browser/sync/util/crypto_helpers.cc b/chrome/browser/sync/util/crypto_helpers.cc index 9315d8b..36c5586 100644 --- a/chrome/browser/sync/util/crypto_helpers.cc +++ b/chrome/browser/sync/util/crypto_helpers.cc @@ -10,6 +10,7 @@ #include "base/basictypes.h" #include "base/format_macros.h" #include "base/logging.h" +#include "base/base64.h" #include "base/rand_util.h" #include "base/string_number_conversions.h" #include "base/string_util.h" @@ -50,14 +51,21 @@ std::string MD5Calculator::GetHexDigest() { } void GetRandomBytes(char* output, int output_length) { - for (int i = 0; i < output_length; i++) { - // TODO(chron): replace this with something less stupid. - output[i] = static_cast<char>(base::RandUint64()); + uint64 random_int; + const char* random_int_bytes = reinterpret_cast<const char*>(&random_int); + int random_int_size = sizeof(random_int); + for (int i = 0; i < output_length; i += random_int_size) { + random_int = base::RandUint64(); + int copy_count = std::min(output_length - i, random_int_size); + memcpy(output + i, random_int_bytes, copy_count); } } string Generate128BitRandomHexString() { - int64 chunk1 = static_cast<int64>(base::RandUint64()); - int64 chunk2 = static_cast<int64>(base::RandUint64()); - return StringPrintf("%016" PRId64 "x%016" PRId64 "x", chunk1, chunk2); + const int kNumberBytes = 128 / 8; + std::string random_bytes(kNumberBytes, ' '); + GetRandomBytes(&random_bytes[0], kNumberBytes); + std::string base64_encoded_bytes; + base::Base64Encode(random_bytes, &base64_encoded_bytes); + return base64_encoded_bytes; } diff --git a/chrome/browser/sync/util/crypto_helpers_unittest.cc b/chrome/browser/sync/util/crypto_helpers_unittest.cc index 0277ae6..7be1270 100644 --- a/chrome/browser/sync/util/crypto_helpers_unittest.cc +++ b/chrome/browser/sync/util/crypto_helpers_unittest.cc @@ -15,3 +15,13 @@ TEST(ChecksumTest, MD5ChecksumTest) { std::string checksum("e2c865db4162bed963bfaa9ef6ac18f0"); ASSERT_EQ(checksum, md5.GetHexDigest()); } + +TEST(CryptoHelpers, GetRandomBytes) { + for (int i = 1; i < 25; ++i) { + std::string random_bytes(i+1, ' '); + do { + GetRandomBytes(&random_bytes[0], i); + ASSERT_EQ(random_bytes[i], ' '); + } while (random_bytes[i - 1] == ' '); + } +} |