12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef NET_BASE_HASH_VALUE_H_ 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define NET_BASE_HASH_VALUE_H_ 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string.h> 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string> 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector> 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h" 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/string_piece.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "build/build_config.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/net_export.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace net { 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct NET_EXPORT SHA1HashValue { 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool Equals(const SHA1HashValue& other) const; 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned char data[20]; 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct NET_EXPORT SHA256HashValue { 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool Equals(const SHA256HashValue& other) const; 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned char data[32]; 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)enum HashValueTag { 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HASH_VALUE_SHA1, 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HASH_VALUE_SHA256, 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This must always be last. 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HASH_VALUE_TAGS_COUNT 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class NET_EXPORT HashValue { 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit HashValue(HashValueTag tag) : tag(tag) {} 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HashValue() : tag(HASH_VALUE_SHA1) {} 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Check for equality of hash values 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This function may have VARIABLE timing which leaks information 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // about its inputs. For example it may exit early once a 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // nonequal character is discovered. Thus, for security reasons 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // this function MUST NOT be used with secret values (such as 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // password hashes, MAC tags, etc.) 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool Equals(const HashValue& other) const; 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Serializes/Deserializes hashes in the form of 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // <hash-name>"/"<base64-hash-value> 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // (eg: "sha1/...") 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This format may be persisted to permanent storage, so 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // care should be taken before changing the serialization. 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This format is used for: 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // - net_internals display/setting public-key pins 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // - logging public-key pins 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // - serializing public-key pins 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Deserializes a HashValue from a string. On error, returns 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // false and MAY change the contents of HashValue to contain invalid data. 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool FromString(const base::StringPiece input); 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Serializes the HashValue to a string. If an invalid HashValue 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // is supplied (eg: an unknown hash tag), returns "unknown"/<base64> 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string ToString() const; 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t size() const; 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned char* data(); 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const unsigned char* data() const; 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HashValueTag tag; 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) union { 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SHA1HashValue sha1; 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SHA256HashValue sha256; 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } fingerprint; 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef std::vector<HashValue> HashValueVector; 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SHA1HashValueLessThan { 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool operator()(const SHA1HashValue& lhs, 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const SHA1HashValue& rhs) const { 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return memcmp(lhs.data, rhs.data, sizeof(lhs.data)) < 0; 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SHA256HashValueLessThan { 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool operator()(const SHA256HashValue& lhs, 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const SHA256HashValue& rhs) const { 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return memcmp(lhs.data, rhs.data, sizeof(lhs.data)) < 0; 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class HashValuesEqual { 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit HashValuesEqual(const HashValue& fingerprint) : 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fingerprint_(fingerprint) {} 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool operator()(const HashValue& other) const { 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return fingerprint_.Equals(other); 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const HashValue& fingerprint_; 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// IsSHA1HashInSortedArray returns true iff |hash| is in |array|, a sorted 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// array of SHA1 hashes. 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool IsSHA1HashInSortedArray(const SHA1HashValue& hash, 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const uint8* array, 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t array_byte_len); 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace net 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // NET_BASE_HASH_VALUE_H_ 126