1// Copyright (c) 2010 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 "chrome/browser/sync/util/crypto_helpers.h"
6
7#include <string>
8#include <vector>
9
10#include "base/basictypes.h"
11#include "base/format_macros.h"
12#include "base/logging.h"
13#include "base/base64.h"
14#include "base/rand_util.h"
15#include "base/string_number_conversions.h"
16#include "base/string_util.h"
17
18using std::string;
19using std::vector;
20
21MD5Calculator::MD5Calculator() {
22  MD5Init(&context_);
23}
24
25MD5Calculator::~MD5Calculator() {}
26
27void MD5Calculator::AddData(const unsigned char* data, int length) {
28  CHECK(bin_digest_.empty());
29  MD5Update(&context_, data, length);
30}
31
32void MD5Calculator::CalcDigest() {
33  if (bin_digest_.empty()) {
34    MD5Digest digest;
35    MD5Final(&digest, &context_);
36    bin_digest_.assign(digest.a, digest.a + arraysize(digest.a));
37  }
38}
39
40const vector<uint8>& MD5Calculator::GetDigest() {
41  CalcDigest();
42  return bin_digest_;
43}
44
45std::string MD5Calculator::GetHexDigest() {
46  CalcDigest();
47  string hex = base::HexEncode(reinterpret_cast<char*>(&bin_digest_.front()),
48                               bin_digest_.size());
49  StringToLowerASCII(&hex);
50  return hex;
51}
52
53void GetRandomBytes(char* output, int output_length) {
54  uint64 random_int;
55  const char* random_int_bytes = reinterpret_cast<const char*>(&random_int);
56  int random_int_size = sizeof(random_int);
57  for (int i = 0; i < output_length; i += random_int_size) {
58    random_int = base::RandUint64();
59    int copy_count = std::min(output_length - i, random_int_size);
60    memcpy(output + i, random_int_bytes, copy_count);
61  }
62}
63
64string Generate128BitRandomHexString() {
65  const int kNumberBytes = 128 / 8;
66  std::string random_bytes(kNumberBytes, ' ');
67  GetRandomBytes(&random_bytes[0], kNumberBytes);
68  std::string base64_encoded_bytes;
69  base::Base64Encode(random_bytes, &base64_encoded_bytes);
70  return base64_encoded_bytes;
71}
72