| // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/sync/util/crypto_helpers.h" |
| |
| #include <string> |
| #include <vector> |
| |
| #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" |
| |
| using std::string; |
| using std::vector; |
| |
| MD5Calculator::MD5Calculator() { |
| MD5Init(&context_); |
| } |
| |
| MD5Calculator::~MD5Calculator() {} |
| |
| void MD5Calculator::AddData(const unsigned char* data, int length) { |
| CHECK(bin_digest_.empty()); |
| MD5Update(&context_, data, length); |
| } |
| |
| void MD5Calculator::CalcDigest() { |
| if (bin_digest_.empty()) { |
| MD5Digest digest; |
| MD5Final(&digest, &context_); |
| bin_digest_.assign(digest.a, digest.a + arraysize(digest.a)); |
| } |
| } |
| |
| const vector<uint8>& MD5Calculator::GetDigest() { |
| CalcDigest(); |
| return bin_digest_; |
| } |
| |
| std::string MD5Calculator::GetHexDigest() { |
| CalcDigest(); |
| string hex = base::HexEncode(reinterpret_cast<char*>(&bin_digest_.front()), |
| bin_digest_.size()); |
| StringToLowerASCII(&hex); |
| return hex; |
| } |
| |
| void GetRandomBytes(char* output, int output_length) { |
| 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() { |
| 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; |
| } |