11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2013 The Chromium Authors. All rights reserved.
21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be
31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file.
41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/profile_resetter/jtl_foundation.h"
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/logging.h"
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/strings/string_number_conversions.h"
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/strings/string_util.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace jtl_foundation {
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciHasher::Hasher(const std::string& seed) : hmac_(crypto::HMAC::SHA256) {
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!hmac_.Init(seed))
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    NOTREACHED();
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciHasher::~Hasher() {}
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistd::string Hasher::GetHash(const std::string& input) const {
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (cached_hashes_.find(input) == cached_hashes_.end()) {
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Calculate value.
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    unsigned char digest[kHashSizeInBytes];
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!hmac_.Sign(input, digest, arraysize(digest))) {
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      NOTREACHED();
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return std::string();
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Instead of using the full SHA256, we only use the hex encoding of the
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // first 16 bytes.
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    cached_hashes_[input] = base::HexEncode(digest, kHashSizeInBytes / 2);
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    DCHECK_EQ(kHashSizeInBytes, cached_hashes_[input].size());
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return cached_hashes_[input];
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// static
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool Hasher::IsHash(const std::string& maybe_hash) {
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (maybe_hash.size() != kHashSizeInBytes)
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return false;
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (std::string::const_iterator it = maybe_hash.begin();
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       it != maybe_hash.end(); ++it) {
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!IsHexDigit(*it))
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return false;
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return true;
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace jtl_foundation
49