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