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