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