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