1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef NET_BASE_HASH_VALUE_H_
6 #define NET_BASE_HASH_VALUE_H_
7 
8 #include <stddef.h>
9 #include <stdint.h>
10 #include <string.h>
11 
12 #include <string>
13 #include <vector>
14 
15 #include "base/containers/span.h"
16 #include "base/strings/string_piece.h"
17 #include "build/build_config.h"
18 #include "net/base/net_export.h"
19 
20 namespace net {
21 
22 struct NET_EXPORT SHA256HashValue {
23   unsigned char data[32];
24 };
25 
26 inline bool operator==(const SHA256HashValue& lhs, const SHA256HashValue& rhs) {
27   return memcmp(lhs.data, rhs.data, sizeof(lhs.data)) == 0;
28 }
29 
30 inline bool operator!=(const SHA256HashValue& lhs, const SHA256HashValue& rhs) {
31   return memcmp(lhs.data, rhs.data, sizeof(lhs.data)) != 0;
32 }
33 
34 inline bool operator<(const SHA256HashValue& lhs, const SHA256HashValue& rhs) {
35   return memcmp(lhs.data, rhs.data, sizeof(lhs.data)) < 0;
36 }
37 
38 inline bool operator>(const SHA256HashValue& lhs, const SHA256HashValue& rhs) {
39   return memcmp(lhs.data, rhs.data, sizeof(lhs.data)) > 0;
40 }
41 
42 inline bool operator<=(const SHA256HashValue& lhs, const SHA256HashValue& rhs) {
43   return memcmp(lhs.data, rhs.data, sizeof(lhs.data)) <= 0;
44 }
45 
46 inline bool operator>=(const SHA256HashValue& lhs, const SHA256HashValue& rhs) {
47   return memcmp(lhs.data, rhs.data, sizeof(lhs.data)) >= 0;
48 }
49 
50 enum HashValueTag {
51   HASH_VALUE_SHA256,
52 };
53 
54 class NET_EXPORT HashValue {
55  public:
56   explicit HashValue(const SHA256HashValue& hash);
HashValue(HashValueTag tag)57   explicit HashValue(HashValueTag tag) : tag_(tag) {}
HashValue()58   HashValue() : tag_(HASH_VALUE_SHA256) {}
59 
60   // Serializes/Deserializes hashes in the form of
61   // <hash-name>"/"<base64-hash-value>
62   // (eg: "sha256/...")
63   // This format may be persisted to permanent storage, so
64   // care should be taken before changing the serialization.
65   //
66   // This format is used for:
67   //   - net_internals display/setting public-key pins
68   //   - logging public-key pins
69   //   - serializing public-key pins
70 
71   // Deserializes a HashValue from a string. On error, returns
72   // false and MAY change the contents of HashValue to contain invalid data.
73   bool FromString(const base::StringPiece input);
74 
75   // Serializes the HashValue to a string. If an invalid HashValue
76   // is supplied (eg: an unknown hash tag), returns "unknown"/<base64>
77   std::string ToString() const;
78 
79   size_t size() const;
80   unsigned char* data();
81   const unsigned char* data() const;
82 
tag()83   HashValueTag tag() const { return tag_; }
84 
85   NET_EXPORT friend bool operator==(const HashValue& lhs, const HashValue& rhs);
86   NET_EXPORT friend bool operator!=(const HashValue& lhs, const HashValue& rhs);
87   NET_EXPORT friend bool operator<(const HashValue& lhs, const HashValue& rhs);
88   NET_EXPORT friend bool operator>(const HashValue& lhs, const HashValue& rhs);
89   NET_EXPORT friend bool operator<=(const HashValue& lhs, const HashValue& rhs);
90   NET_EXPORT friend bool operator>=(const HashValue& lhs, const HashValue& rhs);
91 
92  private:
93   HashValueTag tag_;
94 
95   union {
96     SHA256HashValue sha256;
97   } fingerprint;
98 };
99 
100 typedef std::vector<HashValue> HashValueVector;
101 
102 
103 // IsSHA256HashInSortedArray returns true iff |hash| is in |array|, a sorted
104 // array of SHA256 hashes.
105 bool IsSHA256HashInSortedArray(const HashValue& hash,
106                                base::span<const SHA256HashValue> array);
107 
108 // IsAnySHA256HashInSortedArray returns true iff any value in |hashes| is in
109 // |array|, a sorted array of SHA256 hashes.
110 bool IsAnySHA256HashInSortedArray(base::span<const HashValue> hashes,
111                                   base::span<const SHA256HashValue> array);
112 
113 }  // namespace net
114 
115 #endif  // NET_BASE_HASH_VALUE_H_
116