1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233
|
// Copyright 2013 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef NET_DNS_RECORD_RDATA_H_
#define NET_DNS_RECORD_RDATA_H_
#include <stdint.h>
#include <map>
#include <memory>
#include <string>
#include <vector>
#include "base/check_op.h"
#include "base/compiler_specific.h"
#include "base/strings/string_piece.h"
#include "net/base/io_buffer.h"
#include "net/base/ip_address.h"
#include "net/base/net_export.h"
#include "net/dns/public/dns_protocol.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "third_party/boringssl/src/include/openssl/sha.h"
namespace net {
class DnsRecordParser;
// Parsed represenation of the extra data in a record. Does not include standard
// DNS record data such as TTL, Name, Type and Class.
class NET_EXPORT RecordRdata {
public:
virtual ~RecordRdata() = default;
// Return true if `data` represents RDATA in the wire format with a valid size
// for the give `type`. Always returns true for unrecognized `type`s as the
// size is never known to be invalid.
static bool HasValidSize(base::StringPiece data, uint16_t type);
virtual bool IsEqual(const RecordRdata* other) const = 0;
virtual uint16_t Type() const = 0;
};
// SRV record format (http://www.ietf.org/rfc/rfc2782.txt):
// 2 bytes network-order unsigned priority
// 2 bytes network-order unsigned weight
// 2 bytes network-order unsigned port
// target: domain name (on-the-wire representation)
class NET_EXPORT_PRIVATE SrvRecordRdata : public RecordRdata {
public:
static const uint16_t kType = dns_protocol::kTypeSRV;
SrvRecordRdata(const SrvRecordRdata&) = delete;
SrvRecordRdata& operator=(const SrvRecordRdata&) = delete;
~SrvRecordRdata() override;
static std::unique_ptr<SrvRecordRdata> Create(base::StringPiece data,
const DnsRecordParser& parser);
bool IsEqual(const RecordRdata* other) const override;
uint16_t Type() const override;
uint16_t priority() const { return priority_; }
uint16_t weight() const { return weight_; }
uint16_t port() const { return port_; }
const std::string& target() const { return target_; }
private:
SrvRecordRdata();
uint16_t priority_ = 0;
uint16_t weight_ = 0;
uint16_t port_ = 0;
std::string target_;
};
// A Record format (http://www.ietf.org/rfc/rfc1035.txt):
// 4 bytes for IP address.
class NET_EXPORT ARecordRdata : public RecordRdata {
public:
static const uint16_t kType = dns_protocol::kTypeA;
ARecordRdata(const ARecordRdata&) = delete;
ARecordRdata& operator=(const ARecordRdata&) = delete;
~ARecordRdata() override;
static std::unique_ptr<ARecordRdata> Create(base::StringPiece data,
const DnsRecordParser& parser);
bool IsEqual(const RecordRdata* other) const override;
uint16_t Type() const override;
const IPAddress& address() const { return address_; }
private:
ARecordRdata();
IPAddress address_;
};
// AAAA Record format (http://www.ietf.org/rfc/rfc1035.txt):
// 16 bytes for IP address.
class NET_EXPORT AAAARecordRdata : public RecordRdata {
public:
static const uint16_t kType = dns_protocol::kTypeAAAA;
AAAARecordRdata(const AAAARecordRdata&) = delete;
AAAARecordRdata& operator=(const AAAARecordRdata&) = delete;
~AAAARecordRdata() override;
static std::unique_ptr<AAAARecordRdata> Create(base::StringPiece data,
const DnsRecordParser& parser);
bool IsEqual(const RecordRdata* other) const override;
uint16_t Type() const override;
const IPAddress& address() const { return address_; }
private:
AAAARecordRdata();
IPAddress address_;
};
// CNAME record format (http://www.ietf.org/rfc/rfc1035.txt):
// cname: On the wire representation of domain name.
class NET_EXPORT_PRIVATE CnameRecordRdata : public RecordRdata {
public:
static const uint16_t kType = dns_protocol::kTypeCNAME;
CnameRecordRdata(const CnameRecordRdata&) = delete;
CnameRecordRdata& operator=(const CnameRecordRdata&) = delete;
~CnameRecordRdata() override;
static std::unique_ptr<CnameRecordRdata> Create(
base::StringPiece data,
const DnsRecordParser& parser);
bool IsEqual(const RecordRdata* other) const override;
uint16_t Type() const override;
const std::string& cname() const { return cname_; }
private:
CnameRecordRdata();
std::string cname_;
};
// PTR record format (http://www.ietf.org/rfc/rfc1035.txt):
// domain: On the wire representation of domain name.
class NET_EXPORT_PRIVATE PtrRecordRdata : public RecordRdata {
public:
static const uint16_t kType = dns_protocol::kTypePTR;
PtrRecordRdata(const PtrRecordRdata&) = delete;
PtrRecordRdata& operator=(const PtrRecordRdata&) = delete;
~PtrRecordRdata() override;
static std::unique_ptr<PtrRecordRdata> Create(base::StringPiece data,
const DnsRecordParser& parser);
bool IsEqual(const RecordRdata* other) const override;
uint16_t Type() const override;
std::string ptrdomain() const { return ptrdomain_; }
private:
PtrRecordRdata();
std::string ptrdomain_;
};
// TXT record format (http://www.ietf.org/rfc/rfc1035.txt):
// texts: One or more <character-string>s.
// a <character-string> is a length octet followed by as many characters.
class NET_EXPORT_PRIVATE TxtRecordRdata : public RecordRdata {
public:
static const uint16_t kType = dns_protocol::kTypeTXT;
TxtRecordRdata(const TxtRecordRdata&) = delete;
TxtRecordRdata& operator=(const TxtRecordRdata&) = delete;
~TxtRecordRdata() override;
static std::unique_ptr<TxtRecordRdata> Create(base::StringPiece data,
const DnsRecordParser& parser);
bool IsEqual(const RecordRdata* other) const override;
uint16_t Type() const override;
const std::vector<std::string>& texts() const { return texts_; }
private:
TxtRecordRdata();
std::vector<std::string> texts_;
};
// Only the subset of the NSEC record format required by mDNS is supported.
// Nsec record format is described in http://www.ietf.org/rfc/rfc3845.txt and
// the limited version required for mDNS described in
// http://www.rfc-editor.org/rfc/rfc6762.txt Section 6.1.
class NET_EXPORT_PRIVATE NsecRecordRdata : public RecordRdata {
public:
static const uint16_t kType = dns_protocol::kTypeNSEC;
NsecRecordRdata(const NsecRecordRdata&) = delete;
NsecRecordRdata& operator=(const NsecRecordRdata&) = delete;
~NsecRecordRdata() override;
static std::unique_ptr<NsecRecordRdata> Create(base::StringPiece data,
const DnsRecordParser& parser);
bool IsEqual(const RecordRdata* other) const override;
uint16_t Type() const override;
// Length of the bitmap in bits.
// This will be between 8 and 256, per RFC 3845, Section 2.1.2.
uint16_t bitmap_length() const {
DCHECK_LE(bitmap_.size(), 32u);
return static_cast<uint16_t>(bitmap_.size() * 8);
}
// Returns bit i-th bit in the bitmap, where bits withing a byte are organized
// most to least significant. If it is set, a record with rrtype i exists for
// the domain name of this nsec record.
bool GetBit(unsigned i) const;
private:
NsecRecordRdata();
std::vector<uint8_t> bitmap_;
};
} // namespace net
#endif // NET_DNS_RECORD_RDATA_H_
|