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