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