| Index: net/tools/domain_security_preload_generator/spki_hash.cc | 
| diff --git a/net/tools/domain_security_preload_generator/spki_hash.cc b/net/tools/domain_security_preload_generator/spki_hash.cc | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..d95de696c87ce9b6524e1eba340d2c5d3113bc64 | 
| --- /dev/null | 
| +++ b/net/tools/domain_security_preload_generator/spki_hash.cc | 
| @@ -0,0 +1,50 @@ | 
| +// Copyright 2016 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 "net/tools/domain_security_preload_generator/spki_hash.h" | 
| + | 
| +#include <string> | 
| + | 
| +#include "base/base64.h" | 
| +#include "base/logging.h" | 
| +#include "base/strings/string_util.h" | 
| +#include "third_party/boringssl/src/include/openssl/sha.h" | 
| + | 
| +namespace net { | 
| + | 
| +namespace transport_security_state { | 
| + | 
| +SPKIHash::SPKIHash() {} | 
| + | 
| +SPKIHash::~SPKIHash() {} | 
| + | 
| +bool SPKIHash::FromString(const std::string& hash_string) { | 
| +  std::string base64_string; | 
| + | 
| +  if (!base::StartsWith(hash_string, "sha256/", | 
| +                        base::CompareCase::INSENSITIVE_ASCII)) { | 
| +    return false; | 
| +  } | 
| +  base64_string = hash_string.substr(7); | 
| + | 
| +  std::string decoded; | 
| +  if (!base::Base64Decode(base64_string, &decoded)) { | 
| +    return false; | 
| +  } | 
| + | 
| +  if (decoded.size() != size()) { | 
| +    return false; | 
| +  } | 
| + | 
| +  memcpy(data_, decoded.data(), decoded.size()); | 
| +  return true; | 
| +} | 
| + | 
| +void SPKIHash::CalculateFromBytes(const uint8_t* input, size_t input_length) { | 
| +  SHA256(input, input_length, data_); | 
| +} | 
| + | 
| +}  // namespace transport_security_state | 
| + | 
| +}  // namespace net | 
|  |