dns_util.h revision 5821806d5e7f356e8fa4b058a389a808ea183019
1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 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_BASE_DNS_UTIL_H_ 6#define NET_BASE_DNS_UTIL_H_ 7 8#include <string> 9 10#include "base/basictypes.h" 11#include "base/string_piece.h" 12#include "net/base/net_export.h" 13 14namespace net { 15 16// DNSDomainFromDot - convert a domain string to DNS format. From DJB's 17// public domain DNS library. 18// 19// dotted: a string in dotted form: "www.google.com" 20// out: a result in DNS form: "\x03www\x06google\x03com\x00" 21NET_EXPORT_PRIVATE bool DNSDomainFromDot(const base::StringPiece& dotted, 22 std::string* out); 23 24// DNSDomainToString converts a domain in DNS format to a dotted string. 25// Excludes the dot at the end. 26NET_EXPORT_PRIVATE std::string DNSDomainToString( 27 const base::StringPiece& domain); 28 29// Returns true iff the given character is in the set of valid DNS label 30// characters as given in RFC 3490, 4.1, 3(a) 31NET_EXPORT_PRIVATE bool IsSTD3ASCIIValidCharacter(char c); 32 33// Returns the hostname by trimming the ending dot, if one exists. 34NET_EXPORT std::string TrimEndingDot(const base::StringPiece& host); 35 36// TODO(szym): remove all definitions below once DnsRRResolver migrates to 37// DnsClient 38 39// DNS class types. 40static const uint16 kClassIN = 1; 41 42// DNS resource record types. See 43// http://www.iana.org/assignments/dns-parameters 44// WARNING: if you're adding any new values here you may need to add them to 45// dnsrr_resolver.cc:DnsRRIsParsedByWindows. 46static const uint16 kDNS_A = 1; 47static const uint16 kDNS_CNAME = 5; 48static const uint16 kDNS_TXT = 16; 49static const uint16 kDNS_AAAA = 28; 50static const uint16 kDNS_CERT = 37; 51static const uint16 kDNS_DS = 43; 52static const uint16 kDNS_RRSIG = 46; 53static const uint16 kDNS_DNSKEY = 48; 54static const uint16 kDNS_ANY = 0xff; 55static const uint16 kDNS_CAA = 257; 56static const uint16 kDNS_TESTING = 0xfffe; // in private use area. 57 58// http://www.iana.org/assignments/dns-sec-alg-numbers/dns-sec-alg-numbers.xhtml 59static const uint8 kDNSSEC_RSA_SHA1 = 5; 60static const uint8 kDNSSEC_RSA_SHA1_NSEC3 = 7; 61static const uint8 kDNSSEC_RSA_SHA256 = 8; 62static const uint8 kDNSSEC_RSA_SHA512 = 10; 63 64// RFC 4509 65static const uint8 kDNSSEC_SHA1 = 1; 66static const uint8 kDNSSEC_SHA256 = 2; 67 68// A Buffer is used for walking over a DNS response packet. 69class DnsResponseBuffer { 70 public: 71 DnsResponseBuffer(const uint8* p, unsigned len) 72 : p_(p), 73 packet_(p), 74 len_(len), 75 packet_len_(len) { 76 } 77 78 bool U8(uint8* v); 79 bool U16(uint16* v); 80 bool U32(uint32* v); 81 bool Skip(unsigned n); 82 83 bool Block(base::StringPiece* out, unsigned len); 84 85 // DNSName parses a (possibly compressed) DNS name from the packet. If |name| 86 // is not NULL, then the name is written into it. See RFC 1035 section 4.1.4. 87 bool DNSName(std::string* name); 88 89 private: 90 const uint8* p_; 91 const uint8* const packet_; 92 unsigned len_; 93 const unsigned packet_len_; 94 95 DISALLOW_COPY_AND_ASSIGN(DnsResponseBuffer); 96}; 97 98 99} // namespace net 100 101#endif // NET_BASE_DNS_UTIL_H_ 102