1 // Copyright 2020 The Chromium Authors 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_DNS_HTTPS_RECORD_RDATA_H_ 6 #define NET_DNS_HTTPS_RECORD_RDATA_H_ 7 8 #include <stdint.h> 9 #include <map> 10 #include <memory> 11 #include <set> 12 #include <string> 13 #include <vector> 14 15 #include "base/strings/string_piece.h" 16 #include "net/base/ip_address.h" 17 #include "net/base/net_export.h" 18 #include "net/dns/public/dns_protocol.h" 19 #include "net/dns/record_rdata.h" 20 #include "third_party/abseil-cpp/absl/types/optional.h" 21 22 namespace net { 23 24 using HttpsRecordPriority = uint16_t; 25 26 class AliasFormHttpsRecordRdata; 27 class ServiceFormHttpsRecordRdata; 28 29 class NET_EXPORT_PRIVATE HttpsRecordRdata : public RecordRdata { 30 public: 31 static const uint16_t kType = dns_protocol::kTypeHttps; 32 33 // Returns `nullptr` on malformed input. 34 static std::unique_ptr<HttpsRecordRdata> Parse(base::StringPiece data); 35 36 HttpsRecordRdata(const HttpsRecordRdata& rdata) = delete; 37 HttpsRecordRdata& operator=(const HttpsRecordRdata& rdata) = delete; 38 39 ~HttpsRecordRdata() override; 40 41 bool IsEqual(const RecordRdata* other) const override; 42 virtual bool IsEqual(const HttpsRecordRdata* other) const = 0; 43 uint16_t Type() const override; 44 45 virtual bool IsAlias() const = 0; 46 AliasFormHttpsRecordRdata* AsAliasForm(); 47 const AliasFormHttpsRecordRdata* AsAliasForm() const; 48 ServiceFormHttpsRecordRdata* AsServiceForm(); 49 const ServiceFormHttpsRecordRdata* AsServiceForm() const; 50 51 protected: 52 HttpsRecordRdata() = default; 53 }; 54 55 class NET_EXPORT_PRIVATE AliasFormHttpsRecordRdata : public HttpsRecordRdata { 56 public: 57 explicit AliasFormHttpsRecordRdata(std::string alias_name); 58 static std::unique_ptr<AliasFormHttpsRecordRdata> Parse( 59 base::StringPiece data); 60 61 bool IsEqual(const HttpsRecordRdata* other) const override; 62 bool IsAlias() const override; 63 alias_name()64 base::StringPiece alias_name() const { return alias_name_; } 65 66 private: 67 AliasFormHttpsRecordRdata() = default; 68 69 const std::string alias_name_; 70 }; 71 72 class NET_EXPORT_PRIVATE ServiceFormHttpsRecordRdata : public HttpsRecordRdata { 73 public: 74 static constexpr uint16_t kSupportedKeys[] = { 75 dns_protocol::kHttpsServiceParamKeyMandatory, 76 dns_protocol::kHttpsServiceParamKeyAlpn, 77 dns_protocol::kHttpsServiceParamKeyNoDefaultAlpn, 78 dns_protocol::kHttpsServiceParamKeyPort, 79 dns_protocol::kHttpsServiceParamKeyIpv4Hint, 80 dns_protocol::kHttpsServiceParamKeyEchConfig, 81 dns_protocol::kHttpsServiceParamKeyIpv6Hint}; 82 83 ServiceFormHttpsRecordRdata(uint16_t priority, 84 std::string service_name, 85 std::set<uint16_t> mandatory_keys, 86 std::vector<std::string> alpn_ids, 87 bool default_alpn, 88 absl::optional<uint16_t> port, 89 std::vector<IPAddress> ipv4_hint, 90 std::string ech_config, 91 std::vector<IPAddress> ipv6_hint, 92 std::map<uint16_t, std::string> unparsed_params); 93 static std::unique_ptr<ServiceFormHttpsRecordRdata> Parse( 94 base::StringPiece data); 95 96 ~ServiceFormHttpsRecordRdata() override; 97 98 bool IsEqual(const HttpsRecordRdata* other) const override; 99 bool IsAlias() const override; 100 priority()101 HttpsRecordPriority priority() const { return priority_; } service_name()102 base::StringPiece service_name() const { return service_name_; } mandatory_keys()103 const std::set<uint16_t>& mandatory_keys() const { return mandatory_keys_; } alpn_ids()104 const std::vector<std::string>& alpn_ids() const { return alpn_ids_; } default_alpn()105 bool default_alpn() const { return default_alpn_; } port()106 absl::optional<uint16_t> port() const { return port_; } ipv4_hint()107 const std::vector<IPAddress>& ipv4_hint() const { return ipv4_hint_; } ech_config()108 base::StringPiece ech_config() const { return ech_config_; } ipv6_hint()109 const std::vector<IPAddress>& ipv6_hint() const { return ipv6_hint_; } unparsed_params()110 const std::map<uint16_t, std::string>& unparsed_params() const { 111 return unparsed_params_; 112 } 113 114 // Returns whether or not this rdata parser is considered "compatible" with 115 // the parsed rdata. That is that all keys listed by mandatory_keys() (and all 116 // keys considered default mandatory for HTTPS records) are parsable by this 117 // parser. 118 bool IsCompatible() const; 119 120 private: 121 static bool IsSupportedKey(uint16_t key); 122 123 const HttpsRecordPriority priority_; 124 const std::string service_name_; 125 126 // Supported service parameters. 127 const std::set<uint16_t> mandatory_keys_; 128 const std::vector<std::string> alpn_ids_; 129 const bool default_alpn_; 130 const absl::optional<uint16_t> port_; 131 const std::vector<IPAddress> ipv4_hint_; 132 const std::string ech_config_; 133 const std::vector<IPAddress> ipv6_hint_; 134 135 const std::map<uint16_t, std::string> unparsed_params_; 136 }; 137 138 } // namespace net 139 140 #endif // NET_DNS_HTTPS_RECORD_RDATA_H_ 141