/* * rrdef.h * * RR definitions * * a Net::DNS like library for C * * (c) NLnet Labs, 2005-2006 * * See the file LICENSE for the license */ /** * \file * * Defines resource record types and constants. */ #ifndef LDNS_RRDEF_H #define LDNS_RRDEF_H #ifdef __cplusplus extern "C" { #endif /** Maximum length of a dname label */ #define LDNS_MAX_LABELLEN 63 /** Maximum length of a complete dname */ #define LDNS_MAX_DOMAINLEN 255 /** Maximum number of pointers in 1 dname */ #define LDNS_MAX_POINTERS 65535 /** The bytes TTL, CLASS and length use up in an rr */ #define LDNS_RR_OVERHEAD 10 #define LDNS_DNSSEC_KEYPROTO 3 #define LDNS_KEY_ZONE_KEY 0x0100 /* set for ZSK&KSK, rfc 4034 */ #define LDNS_KEY_SEP_KEY 0x0001 /* set for KSK, rfc 4034 */ #define LDNS_KEY_REVOKE_KEY 0x0080 /* used to revoke KSK, rfc 5011 */ /* The first fields are contiguous and can be referenced instantly */ #define LDNS_RDATA_FIELD_DESCRIPTORS_COMMON 258 /** lookuptable for rr classes */ extern struct sldns_struct_lookup_table* sldns_rr_classes; /** * The different RR classes. */ enum sldns_enum_rr_class { /** the Internet */ LDNS_RR_CLASS_IN = 1, /** Chaos class */ LDNS_RR_CLASS_CH = 3, /** Hesiod (Dyer 87) */ LDNS_RR_CLASS_HS = 4, /** None class, dynamic update */ LDNS_RR_CLASS_NONE = 254, /** Any class */ LDNS_RR_CLASS_ANY = 255, LDNS_RR_CLASS_FIRST = 0, LDNS_RR_CLASS_LAST = 65535, LDNS_RR_CLASS_COUNT = LDNS_RR_CLASS_LAST - LDNS_RR_CLASS_FIRST + 1 }; typedef enum sldns_enum_rr_class sldns_rr_class; /** * Used to specify whether compression is allowed. */ enum sldns_enum_rr_compress { /** compression is allowed */ LDNS_RR_COMPRESS, LDNS_RR_NO_COMPRESS }; typedef enum sldns_enum_rr_compress sldns_rr_compress; /** * The different RR types. */ enum sldns_enum_rr_type { /** a host address */ LDNS_RR_TYPE_A = 1, /** an authoritative name server */ LDNS_RR_TYPE_NS = 2, /** a mail destination (Obsolete - use MX) */ LDNS_RR_TYPE_MD = 3, /** a mail forwarder (Obsolete - use MX) */ LDNS_RR_TYPE_MF = 4, /** the canonical name for an alias */ LDNS_RR_TYPE_CNAME = 5, /** marks the start of a zone of authority */ LDNS_RR_TYPE_SOA = 6, /** a mailbox domain name (EXPERIMENTAL) */ LDNS_RR_TYPE_MB = 7, /** a mail group member (EXPERIMENTAL) */ LDNS_RR_TYPE_MG = 8, /** a mail rename domain name (EXPERIMENTAL) */ LDNS_RR_TYPE_MR = 9, /** a null RR (EXPERIMENTAL) */ LDNS_RR_TYPE_NULL = 10, /** a well known service description */ LDNS_RR_TYPE_WKS = 11, /** a domain name pointer */ LDNS_RR_TYPE_PTR = 12, /** host information */ LDNS_RR_TYPE_HINFO = 13, /** mailbox or mail list information */ LDNS_RR_TYPE_MINFO = 14, /** mail exchange */ LDNS_RR_TYPE_MX = 15, /** text strings */ LDNS_RR_TYPE_TXT = 16, /** RFC1183 */ LDNS_RR_TYPE_RP = 17, /** RFC1183 */ LDNS_RR_TYPE_AFSDB = 18, /** RFC1183 */ LDNS_RR_TYPE_X25 = 19, /** RFC1183 */ LDNS_RR_TYPE_ISDN = 20, /** RFC1183 */ LDNS_RR_TYPE_RT = 21, /** RFC1706 */ LDNS_RR_TYPE_NSAP = 22, /** RFC1348 */ LDNS_RR_TYPE_NSAP_PTR = 23, /** 2535typecode */ LDNS_RR_TYPE_SIG = 24, /** 2535typecode */ LDNS_RR_TYPE_KEY = 25, /** RFC2163 */ LDNS_RR_TYPE_PX = 26, /** RFC1712 */ LDNS_RR_TYPE_GPOS = 27, /** ipv6 address */ LDNS_RR_TYPE_AAAA = 28, /** LOC record RFC1876 */ LDNS_RR_TYPE_LOC = 29, /** 2535typecode */ LDNS_RR_TYPE_NXT = 30, /** draft-ietf-nimrod-dns-01.txt */ LDNS_RR_TYPE_EID = 31, /** draft-ietf-nimrod-dns-01.txt */ LDNS_RR_TYPE_NIMLOC = 32, /** SRV record RFC2782 */ LDNS_RR_TYPE_SRV = 33, /** http://www.jhsoft.com/rfc/af-saa-0069.000.rtf */ LDNS_RR_TYPE_ATMA = 34, /** RFC2915 */ LDNS_RR_TYPE_NAPTR = 35, /** RFC2230 */ LDNS_RR_TYPE_KX = 36, /** RFC2538 */ LDNS_RR_TYPE_CERT = 37, /** RFC2874 */ LDNS_RR_TYPE_A6 = 38, /** RFC2672 */ LDNS_RR_TYPE_DNAME = 39, /** dnsind-kitchen-sink-02.txt */ LDNS_RR_TYPE_SINK = 40, /** Pseudo OPT record... */ LDNS_RR_TYPE_OPT = 41, /** RFC3123 */ LDNS_RR_TYPE_APL = 42, /** RFC4034, RFC3658 */ LDNS_RR_TYPE_DS = 43, /** SSH Key Fingerprint */ LDNS_RR_TYPE_SSHFP = 44, /* RFC 4255 */ /** IPsec Key */ LDNS_RR_TYPE_IPSECKEY = 45, /* RFC 4025 */ /** DNSSEC */ LDNS_RR_TYPE_RRSIG = 46, /* RFC 4034 */ LDNS_RR_TYPE_NSEC = 47, /* RFC 4034 */ LDNS_RR_TYPE_DNSKEY = 48, /* RFC 4034 */ LDNS_RR_TYPE_DHCID = 49, /* RFC 4701 */ /* NSEC3 */ LDNS_RR_TYPE_NSEC3 = 50, /* RFC 5155 */ LDNS_RR_TYPE_NSEC3PARAM = 51, /* RFC 5155 */ LDNS_RR_TYPE_NSEC3PARAMS = 51, LDNS_RR_TYPE_TLSA = 52, /* RFC 6698 */ LDNS_RR_TYPE_HIP = 55, /* RFC 5205 */ /** draft-reid-dnsext-zs */ LDNS_RR_TYPE_NINFO = 56, /** draft-reid-dnsext-rkey */ LDNS_RR_TYPE_RKEY = 57, /** draft-ietf-dnsop-trust-history */ LDNS_RR_TYPE_TALINK = 58, LDNS_RR_TYPE_CDS = 59, /** RFC 7344 */ LDNS_RR_TYPE_CDNSKEY = 60, /** RFC 7344 */ LDNS_RR_TYPE_SPF = 99, /* RFC 4408 */ LDNS_RR_TYPE_UINFO = 100, LDNS_RR_TYPE_UID = 101, LDNS_RR_TYPE_GID = 102, LDNS_RR_TYPE_UNSPEC = 103, LDNS_RR_TYPE_NID = 104, /* RFC 6742 */ LDNS_RR_TYPE_L32 = 105, /* RFC 6742 */ LDNS_RR_TYPE_L64 = 106, /* RFC 6742 */ LDNS_RR_TYPE_LP = 107, /* RFC 6742 */ /** draft-jabley-dnsext-eui48-eui64-rrtypes */ LDNS_RR_TYPE_EUI48 = 108, LDNS_RR_TYPE_EUI64 = 109, LDNS_RR_TYPE_TKEY = 249, /* RFC 2930 */ LDNS_RR_TYPE_TSIG = 250, LDNS_RR_TYPE_IXFR = 251, LDNS_RR_TYPE_AXFR = 252, /** A request for mailbox-related records (MB, MG or MR) */ LDNS_RR_TYPE_MAILB = 253, /** A request for mail agent RRs (Obsolete - see MX) */ LDNS_RR_TYPE_MAILA = 254, /** any type (wildcard) */ LDNS_RR_TYPE_ANY = 255, LDNS_RR_TYPE_URI = 256, /* RFC 7553 */ LDNS_RR_TYPE_CAA = 257, /* RFC 6844 */ /** DNSSEC Trust Authorities */ LDNS_RR_TYPE_TA = 32768, /* RFC 4431, 5074, DNSSEC Lookaside Validation */ LDNS_RR_TYPE_DLV = 32769, /* type codes from nsec3 experimental phase LDNS_RR_TYPE_NSEC3 = 65324, LDNS_RR_TYPE_NSEC3PARAMS = 65325, */ LDNS_RR_TYPE_FIRST = 0, LDNS_RR_TYPE_LAST = 65535, LDNS_RR_TYPE_COUNT = LDNS_RR_TYPE_LAST - LDNS_RR_TYPE_FIRST + 1 }; typedef enum sldns_enum_rr_type sldns_rr_type; /* RDATA */ #define LDNS_MAX_RDFLEN 65535 #define LDNS_RDF_SIZE_BYTE 1 #define LDNS_RDF_SIZE_WORD 2 #define LDNS_RDF_SIZE_DOUBLEWORD 4 #define LDNS_RDF_SIZE_6BYTES 6 #define LDNS_RDF_SIZE_8BYTES 8 #define LDNS_RDF_SIZE_16BYTES 16 #define LDNS_NSEC3_VARS_OPTOUT_MASK 0x01 #define LDNS_APL_IP4 1 #define LDNS_APL_IP6 2 #define LDNS_APL_MASK 0x7f #define LDNS_APL_NEGATION 0x80 /** * The different types of RDATA fields. */ enum sldns_enum_rdf_type { /** none */ LDNS_RDF_TYPE_NONE, /** domain name */ LDNS_RDF_TYPE_DNAME, /** 8 bits */ LDNS_RDF_TYPE_INT8, /** 16 bits */ LDNS_RDF_TYPE_INT16, /** 32 bits */ LDNS_RDF_TYPE_INT32, /** A record */ LDNS_RDF_TYPE_A, /** AAAA record */ LDNS_RDF_TYPE_AAAA, /** txt string */ LDNS_RDF_TYPE_STR, /** apl data */ LDNS_RDF_TYPE_APL, /** b32 string */ LDNS_RDF_TYPE_B32_EXT, /** b64 string */ LDNS_RDF_TYPE_B64, /** hex string */ LDNS_RDF_TYPE_HEX, /** nsec type codes */ LDNS_RDF_TYPE_NSEC, /** a RR type */ LDNS_RDF_TYPE_TYPE, /** a class */ LDNS_RDF_TYPE_CLASS, /** certificate algorithm */ LDNS_RDF_TYPE_CERT_ALG, /** a key algorithm */ LDNS_RDF_TYPE_ALG, /** unknown types */ LDNS_RDF_TYPE_UNKNOWN, /** time (32 bits) */ LDNS_RDF_TYPE_TIME, /** period */ LDNS_RDF_TYPE_PERIOD, /** tsig time 48 bits */ LDNS_RDF_TYPE_TSIGTIME, /** Represents the Public Key Algorithm, HIT and Public Key fields for the HIP RR types. A HIP specific rdf type is used because of the unusual layout in wireformat (see RFC 5205 Section 5) */ LDNS_RDF_TYPE_HIP, /** variable length any type rdata where the length is specified by the first 2 bytes */ LDNS_RDF_TYPE_INT16_DATA, /** protocol and port bitmaps */ LDNS_RDF_TYPE_SERVICE, /** location data */ LDNS_RDF_TYPE_LOC, /** well known services */ LDNS_RDF_TYPE_WKS, /** NSAP */ LDNS_RDF_TYPE_NSAP, /** ATMA */ LDNS_RDF_TYPE_ATMA, /** IPSECKEY */ LDNS_RDF_TYPE_IPSECKEY, /** nsec3 hash salt */ LDNS_RDF_TYPE_NSEC3_SALT, /** nsec3 base32 string (with length byte on wire */ LDNS_RDF_TYPE_NSEC3_NEXT_OWNER, /** 4 shorts represented as 4 * 16 bit hex numbers * seperated by colons. For NID and L64. */ LDNS_RDF_TYPE_ILNP64, /** 6 * 8 bit hex numbers seperated by dashes. For EUI48. */ LDNS_RDF_TYPE_EUI48, /** 8 * 8 bit hex numbers seperated by dashes. For EUI64. */ LDNS_RDF_TYPE_EUI64, /** A non-zero sequence of US-ASCII letters and numbers in lower case. * For CAA. */ LDNS_RDF_TYPE_TAG, /** A encoding of the value field as specified * [RFC1035], Section 5.1., encoded as remaining rdata. * For CAA, URI. */ LDNS_RDF_TYPE_LONG_STR, /* Aliases */ LDNS_RDF_TYPE_BITMAP = LDNS_RDF_TYPE_NSEC }; typedef enum sldns_enum_rdf_type sldns_rdf_type; /** * Algorithms used in dns */ enum sldns_enum_algorithm { LDNS_RSAMD5 = 1, /* RFC 4034,4035 */ LDNS_DH = 2, LDNS_DSA = 3, LDNS_ECC = 4, LDNS_RSASHA1 = 5, LDNS_DSA_NSEC3 = 6, LDNS_RSASHA1_NSEC3 = 7, LDNS_RSASHA256 = 8, /* RFC 5702 */ LDNS_RSASHA512 = 10, /* RFC 5702 */ LDNS_ECC_GOST = 12, /* RFC 5933 */ LDNS_ECDSAP256SHA256 = 13, /* RFC 6605 */ LDNS_ECDSAP384SHA384 = 14, /* RFC 6605 */ LDNS_INDIRECT = 252, LDNS_PRIVATEDNS = 253, LDNS_PRIVATEOID = 254 }; typedef enum sldns_enum_algorithm sldns_algorithm; /** * Hashing algorithms used in the DS record */ enum sldns_enum_hash { LDNS_SHA1 = 1, /* RFC 4034 */ LDNS_SHA256 = 2, /* RFC 4509 */ LDNS_HASH_GOST = 3, /* RFC 5933 */ LDNS_SHA384 = 4 /* RFC 6605 */ }; typedef enum sldns_enum_hash sldns_hash; /** * algorithms used in CERT rrs */ enum sldns_enum_cert_algorithm { LDNS_CERT_PKIX = 1, LDNS_CERT_SPKI = 2, LDNS_CERT_PGP = 3, LDNS_CERT_IPKIX = 4, LDNS_CERT_ISPKI = 5, LDNS_CERT_IPGP = 6, LDNS_CERT_ACPKIX = 7, LDNS_CERT_IACPKIX = 8, LDNS_CERT_URI = 253, LDNS_CERT_OID = 254 }; typedef enum sldns_enum_cert_algorithm sldns_cert_algorithm; /** * EDNS option codes */ enum sldns_enum_edns_option { LDNS_EDNS_LLQ = 1, /* http://files.dns-sd.org/draft-sekar-dns-llq.txt */ LDNS_EDNS_UL = 2, /* http://files.dns-sd.org/draft-sekar-dns-ul.txt */ LDNS_EDNS_NSID = 3, /* RFC5001 */ /* 4 draft-cheshire-edns0-owner-option */ LDNS_EDNS_DAU = 5, /* RFC6975 */ LDNS_EDNS_DHU = 6, /* RFC6975 */ LDNS_EDNS_N3U = 7, /* RFC6975 */ LDNS_EDNS_CLIENT_SUBNET = 8 /* draft-vandergaast-edns-client-subnet */ }; typedef enum sldns_enum_edns_option sldns_edns_option; #define LDNS_EDNS_MASK_DO_BIT 0x8000 /** * Contains all information about resource record types. * * This structure contains, for all rr types, the rdata fields that are defined. */ struct sldns_struct_rr_descriptor { /** Type of the RR that is described here */ sldns_rr_type _type; /** Textual name of the RR type. */ const char *_name; /** Minimum number of rdata fields in the RRs of this type. */ uint8_t _minimum; /** Maximum number of rdata fields in the RRs of this type. */ uint8_t _maximum; /** Wireformat specification for the rr, i.e. the types of rdata fields in their respective order. */ const sldns_rdf_type *_wireformat; /** Special rdf types */ sldns_rdf_type _variable; /** Specifies whether compression can be used for dnames in this RR type. */ sldns_rr_compress _compress; /** The number of DNAMEs in the _wireformat string, for parsing. */ uint8_t _dname_count; }; typedef struct sldns_struct_rr_descriptor sldns_rr_descriptor; /** * returns the resource record descriptor for the given rr type. * * \param[in] type the type value of the rr type *\return the sldns_rr_descriptor for this type */ const sldns_rr_descriptor *sldns_rr_descript(uint16_t type); /** * returns the minimum number of rdata fields of the rr type this descriptor describes. * * \param[in] descriptor for an rr type * \return the minimum number of rdata fields */ size_t sldns_rr_descriptor_minimum(const sldns_rr_descriptor *descriptor); /** * returns the maximum number of rdata fields of the rr type this descriptor describes. * * \param[in] descriptor for an rr type * \return the maximum number of rdata fields */ size_t sldns_rr_descriptor_maximum(const sldns_rr_descriptor *descriptor); /** * returns the rdf type for the given rdata field number of the rr type for the given descriptor. * * \param[in] descriptor for an rr type * \param[in] field the field number * \return the rdf type for the field */ sldns_rdf_type sldns_rr_descriptor_field_type(const sldns_rr_descriptor *descriptor, size_t field); /** * retrieves a rrtype by looking up its name. * \param[in] name a string with the name * \return the type which corresponds with the name */ sldns_rr_type sldns_get_rr_type_by_name(const char *name); /** * retrieves a class by looking up its name. * \param[in] name string with the name * \return the cass which corresponds with the name */ sldns_rr_class sldns_get_rr_class_by_name(const char *name); #ifdef __cplusplus } #endif #endif /* LDNS_RRDEF_H */