1 /*------------------------------------------------------------------------------
2 *
3 * Copyright (c) 2011-2021, EURid vzw. All rights reserved.
4 * The YADIFA TM software product is provided under the BSD 3-clause license:
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * * Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * * Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * * Neither the name of EURid nor the names of its contributors may be
16 * used to endorse or promote products derived from this software
17 * without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
23 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
30 *
31 *------------------------------------------------------------------------------
32 *
33 */
34
35 /** @defgroup
36 * @ingroup dnscore
37 * @brief
38 *
39 *
40 *
41 * @{
42 *
43 *----------------------------------------------------------------------------*/
44 #ifndef RFC_H_
45 #define RFC_H_
46
47 #include <dnscore/sys_types.h>
48 #include <netinet/in.h>
49
50 /* ------------------------------------------------------------
51 *
52 * INCLUDES
53 */
54
55 /* ------------------------------------------------------------
56 *
57 * VALUES
58 */
59 /* http://en.wikipedia.org/wiki/List_of_DNS_record_types */
60
61 /* dns */
62 #define DNS_HEADER_LENGTH 12 /* rfc 1035 */
63 #define MAX_LABEL_LENGTH 63 /* rfc 1034 */
64 #define MAX_DOMAIN_TEXT_LENGTH (MAX_DOMAIN_LENGTH - 1) /* rfc 1034 */
65 #define MAX_DOMAIN_LENGTH 255 /* rfc 1034 */
66 #define MAX_LABEL_COUNT ((MAX_DOMAIN_LENGTH + 1) / 2)
67 #define MAX_SOA_RDATA_LENGTH (255 + 255 + 20)
68
69 #define DNS_DEFAULT_PORT 53
70
71 /* edns0 */
72 #define EDNS0_MAX_LENGTH 65535 /* See 4.5.5 in RFC rfc 2671 */
73 #define EDNS0_MIN_LENGTH 512 /* rfc 2671 */
74 #define EDNS0_DO 0 /* DNSSEC OK flag */
75 #define EDNS0_OPT_0 0 /* Reserverd rfc 2671 */
76 #define EDNS0_OPT_3 3 /* NSID rfc 5001 */
77
78 #define DNSPACKET_MAX_LENGTH 0xffff
79 #define UDPPACKET_MAX_LENGTH 512
80 #define RDATA_MAX_LENGTH 0xffff
81
82
83 /* dnssec (dns & bind) */
84 #define DNSSEC_AD 0x20 /* Authenticated Data flag */
85 #define DNSSEC_CD 0x10 /* Checking Disabled flag */
86
87 #define RRSIG_RDATA_HEADER_LEN 18 /* The length of an RRSIG rdata without the
88 * signer_name and the signature: MUST BE 18 ! */
89
90 #define ID_BITS 0xFF /* rfc 1035 */
91
92 // HIGH flags
93
94 #define QR_BITS 0x80U /* rfc 1035 */
95 #define OPCODE_BITS 0x78U /* rfc 1035 */
96 #define OPCODE_SHIFT 3U
97 #define AA_BITS 0x04U /* rfc 1035 */
98 #define TC_BITS 0x02U /* rfc 1035 */
99 #define RD_BITS 0x01U /* rfc 1035 */
100
101 // LOW flags
102
103 #define RA_BITS 0x80U /* rfc 1035 */
104 #define Z_BITS 0x40U /* rfc 1035 */
105 #define AD_BITS 0x20U /* rfc 2065 */
106 #define CD_BITS 0x10U /* rfc 2065 */
107 #define RCODE_BITS 0x0FU /* rfc 1035 */
108
109 #ifdef WORDS_BIGENDIAN
110 // BIG endian
111
112 #define DNS_FLAGS_HAS_QR(f_) (f_ & ((u16)QR_BITS << 8))
113 #define DNS_FLAGS_GET_OPCODE(f_) ((f_ >> (OPCODE_SHIFT + 8)) & OPCODE_BITS)
114 #define DNS_FLAGS_HAS_AA(f_) (f_ & ((u16)AA_BITS << 8))
115 #define DNS_FLAGS_HAS_TC(f_) (f_ & ((u16)TC_BITS << 8))
116 #define DNS_FLAGS_HAS_RD(f_) (f_ & ((u16)RD_BITS << 8))
117
118 #define DNS_FLAGS_HAS_RA(f_) (f_ & ((u16)RA_BITS))
119 #define DNS_FLAGS_HAS_Z(f_) (f_ & ((u16)Z_BITS))
120 #define DNS_FLAGS_HAS_AD(f_) (f_ & ((u16)AD_BITS))
121 #define DNS_FLAGS_HAS_CD(f_) (f_ & ((u16)CD_BITS))
122 #define DNS_FLAGS_GET_RCODE(f_) (f_ & RCODE_BITS)
123
124 #else
125
126 #define DNS_FLAGS_HAS_QR(f_) (f_ & ((u16)QR_BITS))
127 #define DNS_FLAGS_GET_OPCODE(f_) ((f_ >> OPCODE_SHIFT) & OPCODE_BITS)
128 #define DNS_FLAGS_HAS_AA(f_) (f_ & ((u16)AA_BITS))
129 #define DNS_FLAGS_HAS_TC(f_) (f_ & ((u16)TC_BITS))
130 #define DNS_FLAGS_HAS_RD(f_) (f_ & ((u16)RD_BITS))
131
132 #define DNS_FLAGS_HAS_RA(f_) (f_ & ((u16)RA_BITS << 8))
133 #define DNS_FLAGS_HAS_Z(f_) (f_ & ((u16)Z_BITS << 8))
134 #define DNS_FLAGS_HAS_AD(f_) (f_ & ((u16)AD_BITS << 8))
135 #define DNS_FLAGS_HAS_CD(f_) (f_ & ((u16)CD_BITS << 8))
136 #define DNS_FLAGS_GET_RCODE(f_) ((f_ >> 8) & RCODE_BITS)
137
138 #endif
139
140 #define QDCOUNT_BITS 0xFFFF /* number of questions rfc 1035 */
141 #define ANCOUNT_BITS 0xFFFF /* number of resource records rfc 1035 */
142 #define NSCOUNT_BITS 0xFFFF /* name servers in the author.rec. rfc 1035 */
143 #define ARCOUNT_BITS 0xFFFF /* additional records rfc 1035 */
144 #define ZOCOUNT_BITS 0xFFFF /* Number of RRs in the Zone Sect. rfc 2136 */
145 #define PRCOUNT_BITS 0xFFFF /* Number of RRs in the Prereq. Sect. rfc 2136 */
146 #define UPCOUNT_BITS 0xFFFF /* Number of RRs in the Upd. Sect. rfc 2136 */
147 #define ADCOUNT_BITS 0xFFFF /* Number of RRs in the Add Sect. rfc 2136 */
148
149 #define OPCODE_QUERY (0<<OPCODE_SHIFT) /* a standard query (QUERY) rfc 1035 */
150 #define OPCODE_IQUERY (1<<OPCODE_SHIFT) /* an inverse query (IQUERY) rfc 3425 */
151 #define OPCODE_STATUS (2<<OPCODE_SHIFT) /* a server status request (STATUS) rfc 1035 */
152 #define OPCODE_NOTIFY (4<<OPCODE_SHIFT) /* rfc 1996 */
153 #define OPCODE_UPDATE (5<<OPCODE_SHIFT) /* update rfc 2136 */
154
155 #define RCODE_OK 0 /* No error rfc 1035 */
156 #define RCODE_NOERROR 0 /* No error rfc 1035 */
157 #define RCODE_FE 1 /* Format error rfc 1035 */
158 #define RCODE_FORMERR 1 /* Format error rfc 1035 */
159 #define RCODE_SF 2 /* Server failure rfc 1035 */
160 #define RCODE_SERVFAIL 2 /* Server failure rfc 1035 */
161 #define RCODE_NE 3 /* Name error rfc 1035 */
162 #define RCODE_NXDOMAIN 3 /* Name error rfc 1035 */
163 #define RCODE_NI 4 /* Not implemented rfc 1035 */
164 #define RCODE_NOTIMP 4 /* Not implemented rfc 1035 */
165 #define RCODE_RE 5 /* Refused rfc 1035 */
166 #define RCODE_REFUSED 5 /* Refused rfc 1035 */
167
168 #define RCODE_YXDOMAIN 6 /* Name exists when it should not rfc 2136 */
169 #define RCODE_YXRRSET 7 /* RR Set exists when it should not rfc 2136 */
170 #define RCODE_NXRRSET 8 /* RR set that should exist doesn't rfc 2136 */
171 #define RCODE_NOTAUTH 9 /* Server not Authortative for zone rfc 2136 */
172 #define RCODE_NOTZONE 10 /* Name not contained in zone rfc 2136 */
173
174 #define RCODE_BADVERS 16 /* Bad OPT Version rfc 2671 */
175 #define RCODE_BADSIG 16 /* TSIG Signature Failure rfc 2845 */
176 #define RCODE_BADKEY 17 /* Key not recognized rfc 2845 */
177 #define RCODE_BADTIME 18 /* Signatue out of time window rfc 2845 */
178 #define RCODE_BADMODE 19 /* Bad TKEY Mode rfc 2930 */
179 #define RCODE_BADNAME 20 /* Duplicate key name rfc 2930 */
180 #define RCODE_BADALG 21 /* Algorithm not supported rfc 2930 */
181 #define RCODE_BADTRUNC 22 /* Bad Truncation rfc 4635 */
182
183 /* EDNS0 */
184
185 #define RCODE_EXT_DNSSEC 0x00800000 /* Network-order, DNSSEC requested */
186
187 #define TYPE_NONE 0
188 /*
189 1 1 1 1 1 1
190 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
191 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
192 | ADDRESS | 32 bit address
193 | |
194 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
195 */
196 #define TYPE_A NU16(1) /* a host address rfc 1035 */
197 /*
198 1 1 1 1 1 1
199 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
200 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
201 / NSDNAME / dns formatted domain name
202 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
203 */
204 #define TYPE_NS NU16(2) /* an authoritative name server rfc 1035 */
205 /*
206 1 1 1 1 1 1
207 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
208 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
209 / MADNAME / dns formatted domain name
210 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
211 */
212 #define TYPE_MD NU16(3) /* mail destination - OBSOLETE rfc 1035 rfc 882 */
213 /*
214 1 1 1 1 1 1
215 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
216 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
217 / MADNAME / dns formatted domain name
218 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
219 */
220 #define TYPE_MF NU16(4) /* mail forwarder - OBSOLETE rfc 1035 rfc 882 */
221 /*
222 1 1 1 1 1 1
223 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
224 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
225 / CNAME / dns formatted domain name
226 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
227 */
228 #define TYPE_CNAME NU16(5) /* the canonical name of a alias rfc 1035 */
229 /*
230 1 1 1 1 1 1
231 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
232 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
233 / MNAME / dns formatted domain name
234 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
235 / RNAME / dns formatted domain name with local-part.
236 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ Can have '\' before '.'
237 | SERIAL | 32 bit
238 | |
239 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
240 | REFRESH | 32 bit
241 | |
242 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
243 | RETRY | 32 bit
244 | |
245 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
246 | EXPIRE | 32 bit
247 | |
248 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
249 | MINIMUM | 32 bit
250 | |
251 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
252 */
253 #define TYPE_SOA NU16(6) /* start of a zone of authority rfc 1035 */
254 /*
255 1 1 1 1 1 1
256 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
257 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
258 / MADNAME / dns formatted domain name
259 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
260 */
261 #define TYPE_MB NU16(7) /* mailbox domain name - EXPERIMENTAL rfc 1035 */
262 /*
263 1 1 1 1 1 1
264 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
265 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
266 / MMGNAME / dns formatted domain name
267 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
268 */
269 #define TYPE_MG NU16(8) /* mail group member - EXPERIMENTAL rfc 1035 */
270 /*
271 1 1 1 1 1 1
272 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
273 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
274 / NEWNAME / dns formatted domain name
275 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
276 */
277 #define TYPE_MR NU16(9) /* mail rename domain name - EXPERIMENTAL rfc 1035 */
278 /*
279 1 1 1 1 1 1
280 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
281 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
282 / <ANYTHING> /
283 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
284 */
285 #define TYPE_NULL NU16(10) /* a null RR - EXPERIMENTAL rfc 1035 */
286 /*
287 1 1 1 1 1 1
288 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
289 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
290 | ADDRESS | 32 bit address ARPA Internet address
291 | |
292 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
293 | PROTOCOL | | PROTOCOL: 8 bit IP protocol number
294 +--+--+--+--+--+--+--+--+ |
295 / <BIT MAP> / BIT MAP: variable length bit map. The bit map
296 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ must be a multiple of 8 bits long.
297 */
298 #define TYPE_WKS NU16(11) /* a well known service description rfc 1035 */
299 /*
300 1 1 1 1 1 1
301 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
302 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
303 / PTRNAME / dns formatted domain name
304 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
305 */
306 #define TYPE_PTR NU16(12) /* a domain name pointer rfc 1035 */
307 /*
308 1 1 1 1 1 1
309 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
310 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
311 / CPU / character-string
312 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
313 / OS / character-string
314 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
315 */
316 #define TYPE_HINFO NU16(13) /* host information rfc 1035 */
317 /*
318 1 1 1 1 1 1
319 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
320 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
321 / RMAILBX / character-string
322 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
323 / EMAILBX / character-string
324 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
325 */
326 #define TYPE_MINFO NU16(14) /* mailbox or mail list information rfc 1035 */
327 /*
328 1 1 1 1 1 1
329 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
330 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
331 | PREFERENCE | 16 bit
332 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
333 / EXCHANGE / dns formatted domain name
334 / /
335 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
336 */
337 #define TYPE_MX NU16(15) /* mail exchange rfc 1035 */
338 /*
339 1 1 1 1 1 1
340 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
341 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
342 / TXT-DATA / one or more <character string>s (pascal string)
343 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
344 */
345 #define TYPE_TXT NU16(16) /* text strings rfc 1035 */
346 /*
347 1 1 1 1 1 1
348 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
349 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
350 / MBOX-DNAME / dns formatted domain name local-part. Can have '\'before .
351 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
352 / TXT-DNAME / dns formatted domain name
353 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
354 */
355 #define TYPE_RP NU16(17) /* For Responsible Person rfc 1183 */
356 /*
357 1 1 1 1 1 1
358 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
359 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
360 | SUBTYPE | 16 bit
361 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
362 / HOSTNAME / dns formatted domain name
363 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
364 */
365 #define TYPE_AFSDB NU16(18) /* AFS Data Base location rfc 1183 rfc 5864 */
366 /*
367 1 1 1 1 1 1
368 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
369 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
370 / PSDN-ADDRESS / pascal string (numeric only)
371 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
372 */
373 #define TYPE_X25 NU16(19) /* X.25 PSDN address rfc 1183 */
374 /*
375 1 1 1 1 1 1
376 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
377 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
378 / ISDN-ADDRESS / pascal string (IA5 allowed)
379 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
380 / SA / pascal string (numeric BCD) (OPTIONAL)
381 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
382 */
383 #define TYPE_ISDN NU16(20) /* ISDN address rfc 1183 */
384 /*
385 1 1 1 1 1 1
386 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
387 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
388 | PREFERENCE | 16 bit
389 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
390 / INTERMEDIATE-HOST / dns formatted domain name
391 / /
392 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
393 */
394 #define TYPE_RT NU16(21) /* Route Through rfc 1183 */
395 /*
396 1 1 1 1 1 1
397 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
398 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
399 / NSAP (in hex) / binary encoding of NSAP in hex
400 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
401 */
402 /*
403 |--------------|
404 | <-- IDP --> |
405 |--------------|-------------------------------------|
406 | AFI | IDI | <-- DSP --> |
407 |-----|--------|-------------------------------------|
408 | 47 | 0005 | DFI | AA |Rsvd | RD |Area | ID |Sel |
409 |-----|--------|-----|----|-----|----|-----|----|----|
410 octets | 1 | 2 | 1 | 3 | 2 | 2 | 2 | 6 | 1 |
411 |-----|--------|-----|----|-----|----|-----|----|----|
412
413 IDP Initial Domain Part
414 AFI Authority and Format Identifier
415 IDI Initial Domain Identifier
416 DSP Domain Specific Part
417 DFI DSP Format Identifier
418 AA Administrative Authority
419 Rsvd Reserved
420 RD Routing Domain Identifier
421 Area Area Identifier
422 ID System Identifier
423 SEL NSAP Selector
424 */
425 #define TYPE_NSAP NU16(22) /* NSAP address, NSAP style A record rfc 1706 */
426 /*
427 1 1 1 1 1 1
428 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
429 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
430 / PTRNAME / dns formatted domain name
431 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
432 */
433 #define TYPE_NSAP_PTR NU16(23) /* domain name pointer, NSAP style rfc 1348 */
434 /*
435 1 1 1 1 1 1
436 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
437 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
438 | TYPE COVERED | 16 bit unsigned integer
439 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
440 | ALGORITHM | LABELS |
441 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
442 | ORIGINAL TTL | 32 bit
443 | |
444 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
445 | SIGNATURE EXPIRATION | 32 bit
446 | |
447 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
448 | SIGNATURE INCEPTION | 32 bit
449 | |
450 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
451 | KEY TAG | 16 bit unsigned integer
452 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
453 / SIGNER'S NAME /
454 / /
455 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
456 / /
457 / SIGNATURE /
458 / /
459 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
460 */
461 #define TYPE_SIG NU16(24) /* for security signature rfc 4034 rfc 3755 rfc 2535 rfc 2536 rfc 2537 rfc 2931 rfc 3110 rfc 3008 */
462 /*
463 1 1 1 1 1 1
464 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
465 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
466 | FLAGS | 16 bit
467 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
468 | PROTOCOL | ALGORITHM | PROTOCOL: 8 bit, ALGORITHM: 8 bit
469 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
470 / /
471 / PUBLIC KEY /
472 / /
473 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
474 */
475 /* flags
476 1 1 1 1 1 1
477 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
478 +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
479 | A/C | Z | XT| Z | Z | NAMTYP| Z | Z | Z | Z | SIG |
480 +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
481 */
482 #define TYPE_KEY NU16(25) /* for security key rfc 4034 rfc 3755 rfc 2535 rfc 2536 rfc 2537 rfc 2539 rfc 3008 rfc 3110 */
483 /*
484 1 1 1 1 1 1
485 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
486 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
487 | PREFERENCE | 16 bit
488 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
489 / MAP822 / dns formatted domain name
490 / /
491 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
492 / MAPX400 / dns formatted domain name
493 / /
494 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
495 */
496 #define TYPE_PX NU16(26) /* X.400 mail mapping information rfc 2163 */
497 /*
498 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
499 / LONGITUDE / c-string (representing a real number)
500 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
501 / LATITUDE / c-string (representing a real number)
502 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
503 / ALTITUDE / c-string (representing a real number)
504 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
505 */
506 #define TYPE_GPOS NU16(27) /* Geographical Position rfc 1712 */
507 /*
508 1 1 1 1 1 1
509 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
510 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
511 | ADDRESS | 32 bit address address
512 | |
513 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
514 | ADDRESS | 32 bit address address
515 | |
516 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
517 | ADDRESS | 32 bit address address
518 | |
519 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
520 | ADDRESS | 32 bit address address
521 | |
522 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
523 */
524 #define TYPE_AAAA NU16(28) /* IP6 Address rfc 3596 */
525 /*
526 1 1 1 1 1 1
527 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
528 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
529 | VERSION | SIZE | VERSION: 8 bit int, SIZE: 8 bit int
530 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
531 | HORIZ PRE | VERT PRE | HORIZ PRE: 8 bit int, VERT PRE: 8 bit int
532 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
533 | LATITUDE | 32 bit integer
534 | |
535 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
536 | LONGITUDE | 32 bit integer
537 | |
538 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
539 | ALTITUDE | 32 bit integer
540 | |
541 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
542 */
543 #define TYPE_LOC NU16(29) /* Location information rfc 1876 */
544 /*
545 1 1 1 1 1 1
546 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
547 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
548 / NEXT DOMAIN NAME / dns formatted domain name
549 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
550 / TYPE BIT MAPS /
551 / /
552 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
553 */
554 #define TYPE_NXT NU16(30) /* Next Domain - OBSOLETE rfc 3755 rfc 2535 */
555 /*
556 1 1 1 1 1 1
557 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
558 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
559 / ENDPOINT IDENTIFIER / string of octets. (Binary encoding of the Identifier,
560 / / meaningful only to the system utilizing it)
561 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
562 */
563 #define TYPE_EID NU16(31) /* Endpoint Identifier @note undocumented see draft-ietf-nimrod-dns-01.txt */
564 /*
565 1 1 1 1 1 1
566 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
567 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
568 / NIMROD LOCATOR / variable string of octets. (Binary encoding of the Locator
569 / / specified in the Nimrod protocol)
570 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
571 */
572 #define TYPE_NIMLOC NU16(32) /* Nimrod Locator @note undocumented see draft-ietf-nimrod-dns-01.txt */
573 /*
574 1 1 1 1 1 1
575 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
576 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
577 | PRIORITY | 16 bit unsigned integer
578 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
579 | WEIGHT | 16 bit unsigned integer
580 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
581 | PORT | 16 bit unsigned integer
582 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
583 / TARGET / dns formatted domain name
584 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
585 */
586 #define TYPE_SRV NU16(33) /* Server selection rfc 2782 */
587 /*
588 1 1 1 1 1 1
589 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
590 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
591 | FORMAT | | FORMAT: 8 bit
592 +--+--+--+--+--+--+--+--+ | ADDRESS: c-string
593 / ADDRESS /
594 | |
595 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
596 */
597 #define TYPE_ATMA NU16(34) /* ATM Address @note undocumented see ATM Name System V2.0 */
598 /*
599 1 1 1 1 1 1
600 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
601 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
602 | ORDER | 16 bit unsigned integer
603 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
604 | PREFERENCE | 16 bit unsigned integer
605 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
606 / FLAGS / character-string (a-z0-9) can be empty
607 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
608 / SERVICES / character-string (a-z0-9) can be empty
609 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
610 / REGEXP / character-string
611 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
612 / REPLACEMENT / <domain name>
613 / /
614 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
615 */
616 #define TYPE_NAPTR NU16(35) /* Naming Authority Pointer rfc 2915 rfc 2168 rfc 3403 */
617 /*
618 1 1 1 1 1 1
619 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
620 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
621 | PREFERENCE | 16 bit unsigned integer
622 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
623 / EXCHANGER / dns formatted domain name
624 / /
625 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
626 */
627 #define TYPE_KX NU16(36) /* Key Exchanger rfc 2230 */
628 /*
629 1 1 1 1 1 1
630 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
631 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
632 | TYPE | 16 bit unsigned integer
633 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
634 | KEY TAG | 16 bit unsigned integer
635 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
636 | ALGORITHM | /
637 +--+--+--+--+--+--+--+--+ /
638 / /
639 / CERTIFICATE OR CRL /
640 / /
641 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
642 */
643 #define TYPE_CERT NU16(37) /* CERT rfc 4398 */
644 /*
645 1 1 1 1 1 1
646 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
647 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
648 | PREFIX | / 8 bit unsigned integer
649 +--+--+--+--+--+--+--+--+ /
650 / /
651 / ADDRESS SUFFIX / 0..16 octets
652 / /
653 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
654 / PREFIX NAME / uncompressed domain name
655 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
656 */
657 #define TYPE_A6 NU16(38) /* A6 rfc 3226 rfc 2874 rfc 6563 */
658 /*
659 1 1 1 1 1 1
660 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
661 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
662 / DNAME / dns formatted domain name
663 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
664 */
665 #define TYPE_DNAME NU16(39) /* DNAME rfc 6672 */
666 /*
667 1 1 1 1 1 1
668 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
669 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
670 | CODING | SUBCODING | CODING: 8 bit, SUBCODING: 8 bit
671 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
672 | / c-string
673 / DATA /
674 / /
675 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
676 */
677 #define TYPE_SINK NU16(40) /* SINK @note undocumented see The Kitchen Sink Resource Record */
678 /*
679 1 1 1 1 1 1
680 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
681 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
682 | OPTION-CODE | 16 bit unsigned integer
683 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
684 | OPTION-LENGTH | 16 bit unsigned integer
685 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
686 | |
687 / OPTION-DATA /
688 / /
689 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
690 */
691 /*
692 * @todo 20171121 thx -- this is not about RDATA, fix this (maybe it should not
693 * be here at all ?)
694 *
695 *
696 1 1 1 1 1 1
697 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
698 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
699 | EXTENDED-RCODE | VERSION |
700 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
701 | Z |
702 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
703 */
704 #define TYPE_OPT NU16(41) /* edns0 flag rfc 6891 rfc 3225 */
705 /*
706 1 1 1 1 1 1
707 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
708 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
709 | ADDRESSFAMILY | 16 bit unsigned integer
710 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
711 | PREFIX | N| AFDLENGTH | PREFIX: 8 bit unsigned binary coded, N: 1 bit,
712 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ ADFLENGTH: 7 bit unsigned
713 / /
714 / AFDPART / address family dependent
715 | |
716 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
717 */
718 #define TYPE_APL NU16(42) /* APL rfc 3123 */
719 /*
720 1 1 1 1 1 1
721 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
722 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
723 | KEY TAG | 16 bit
724 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
725 | ALGORITHM | DIGEST TYPE | ALGORITHM: 8 bit, DIGEST TYPE: 8 bit
726 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
727 / /
728 / DIGEST / digest dependent
729 / /
730 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
731 */
732 #define TYPE_DS NU16(43) /* Delegation Signer rfc 4034 rfc 3658 */
733 /*
734 1 1 1 1 1 1
735 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
736 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
737 | ALGORITHM | FP TYPE | ALGORITHM: 8 bit, FP TYPE: 8 bit
738 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
739 / /
740 / FINGERPRINT /
741 / /
742 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
743 */
744 #define TYPE_SSHFP NU16(44) /* SSH Key Fingerprint rfc 4255 */
745 /*
746 1 1 1 1 1 1
747 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
748 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
749 | PRECEDENCE | GATEWAY TYPE | PRECEDENCE: 8 bit, GATEWAY TYPE: 8 bit
750 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
751 | ALGORITHM | | ALGORITHM: 8 bit
752 +--+--+--+--+--+--+--+--+ |
753 | GATEWAY | GATEWAY: 32 bit IPv4 / 128 bit IPv6 / uncompressed domain name
754 / /
755 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
756 / /
757 / PUBLIC KEY /
758 / /
759 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
760 */
761 #define TYPE_IPSECKEY NU16(45) /* IPSECKEY rfc 4025 */
762 /*
763 1 1 1 1 1 1
764 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
765 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
766 | TYPE COVERED | 16 bit unsigned integer
767 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
768 | ALGORITHM | LABELS |
769 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
770 | ORIGINAL TTL | 32 bit
771 | |
772 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
773 | SIGNATURE EXPIRATION | 32 bit
774 | |
775 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
776 | SIGNATURE INCEPTION | 32 bit
777 | |
778 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
779 | KEY TAG | 16 bit unsigned integer
780 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
781 / SIGNER'S NAME /
782 / /
783 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
784 / /
785 / SIGNATURE /
786 / /
787 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
788 */
789 #define TYPE_RRSIG NU16(46) /* RRSIG rfc 4034 rfc 3755 */
790 /*
791 1 1 1 1 1 1
792 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
793 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
794 / NEXT DOMAIN NAME /
795 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
796 / TYPE NIT MAPS /
797 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
798 */
799 #define TYPE_NSEC NU16(47) /* NSEC rfc 4034 rfc 3755 */
800 /*
801 1 1 1 1 1 1
802 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
803 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
804 | FLAGS | 16 bit
805 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
806 | PROTOCOL | ALGORITHM | PROTOCOL: 8 bit, ALGORITHM: 8 bit
807 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
808 / /
809 / PUBLIC KEY /
810 / /
811 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
812 */
813 #define TYPE_DNSKEY NU16(48) /* DNSKEY rfc 4034 rfc 3755 */
814 /*
815 1 1 1 1 1 1
816 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
817 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
818 | IDENTIFIER TYPE | 16 bit
819 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
820 | DIGEST TYPE | / 8 bit
821 +--+--+--+--+--+--+--+--+ /
822 / DIGEST / dependent on the digest type
823 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
824 */
825 #define TYPE_DHCID NU16(49) /* DHCID rfc 4701 */
826 /*
827 1 1 1 1 1 1
828 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
829 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
830 | HASH ALGORITHM | FLAGS | HASH ALGORITHM: 8 bit, FLAGS: 8 bit
831 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
832 | ITERATIONS | 16 bit unsigned integer
833 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
834 | SALT LENGTH | / 8 bit unsigned integer
835 +--+--+--+--+--+--+--+--+ /
836 / SALT / Can be zero length
837 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
838 | HASH LENGTH | / 8 bit unsigned integer
839 +--+--+--+--+--+--+--+--+ /
840 / NEXT HASHED OWNER NAME / unmodified binary hash value.
841 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
842 / TYPE BIT MAPS /
843 / /
844 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
845 */
846 /* Flags
847 0 1 2 3 4 5 6 7
848 +-+-+-+-+-+-+-+-+
849 | |O|
850 +-+-+-+-+-+-+-+-+
851 ^
852 OPT-OUT flag
853 */
854 #define TYPE_NSEC3 NU16(50) /* NSEC3 rfc 5155 */
855 /*
856 1 1 1 1 1 1
857 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
858 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
859 | HASH ALGORITHM | FLAGS | HASH ALGORITHM: 8 bit, FLAGS: 8 bit
860 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
861 | ITERATIONS | 16 bit unsigned integer
862 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
863 | SALT LENGTH | / 8 bit unsigned integer
864 +--+--+--+--+--+--+--+--+ /
865 / SALT / Can be zero length
866 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
867 */
868 #define TYPE_NSEC3PARAM NU16(51) /* NSEC3PARAM rfc 5155 */
869 /*
870 1 1 1 1 1 1
871 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
872 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
873 | CERTIFICATE USAGE | SELECTOR | CERTIFICATE USAGE: 8 bit, SELECTOR: 8 bit
874 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
875 / MATCHING TYPE | /
876 +--+--+--+--+--+--+--+--+ /
877 / /
878 / CERTIFICATE ASSOCIATION DATA /
879 / /
880 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
881 */
882 #define TYPE_TLSA NU16(52) /* TLSA rfc 6698 */
883 /*
884 1 1 1 1 1 1
885 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
886 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
887 | HIT LENGTH | PK ALGORITHM | HIT LENGTH: 8 bit unsigned integer,
888 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ PK ALGORITHM: 8 bit unsigned integer
889 | PK LENGTH | PK LENTH: 16 bit unsigned integer
890 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
891 / /
892 / HIT / binary value in network order
893 / /
894 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
895 / /
896 / PUBLIC KEY / dependent on the type
897 / /
898 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
899 / /
900 / RENDEZVOUS SERVERS / dns formatted domain name
901 / /
902 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
903 */
904 #define TYPE_HIP NU16(55) /* Host Identity Protocol rfc 5205 */
905 /*
906 1 1 1 1 1 1
907 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
908 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
909 / NINFO-DATA / one or more c-strings
910 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
911 */
912 #define TYPE_NINFO NU16(56) /* NINFO @note undocumented see draft-reid-dnsext-zs-01.txt */
913 /*
914 1 1 1 1 1 1
915 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
916 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
917 | FLAGS | 16 bit: (value 0)
918 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
919 | PROTOCOL | ALGORITHM | PROTOCOL: 8 bit (value 1), ALGORITHM: 8 bit
920 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
921 / /
922 / PUBLIC KEY /
923 / /
924 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
925 */
926 #define TYPE_RKEY NU16(57) /* RKEY @note undocumented see draft-reid-dnsext-rkey-00.txt */
927 /*
928 1 1 1 1 1 1
929 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
930 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
931 / TALINK START/PREVIOUS / dns formatted domain name
932 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
933 / TALINK NEXT/END / dns formatted domain name
934 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
935 */
936 #define TYPE_TALINK NU16(58) /* Trust Anchor LINK @note undocumented see talink-completed-template */
937 /*
938 1 1 1 1 1 1
939 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
940 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
941 | KEY TAG | 16 bit
942 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
943 | ALGORITHM | DIGEST TYPE | ALGORITHM: 8 bit, DIGEST TYPE: 8 bit
944 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
945 / /
946 / DIGEST / digest dependent
947 / /
948 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
949 */
950 #define TYPE_CDS NU16(59) /* Child DS rfc 7344 */
951 /*
952 1 1 1 1 1 1
953 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
954 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
955 | FLAGS | 16 bit
956 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
957 | PROTOCOL | ALGORITHM | PROTOCOL: 8 bit, ALGORITHM: 8 bit
958 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
959 / /
960 / PUBLIC KEY /
961 / /
962 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
963 */
964 #define TYPE_CDNSKEY NU16(60) /* DNSKEY(s) the Child wants reflected in DS rfc 7344 */
965 /*
966
967 1 1 1 1 1 1
968 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
969 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
970 / /
971 / OPENPGP PUBLIC KEY / single OpenPGP public key as defined in Section 5.5.1.1 of [RFC4880].
972 / / without ASCII armor or base64 encoding
973 / /
974 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
975
976 */
977 #define TYPE_OPENPGPKEY NU16(61) /* OpenPGP Key @note undocumented see draft-ietf-dane-openpgpkey-03 */
978
979 /*
980 1 1 1 1 1 1
981 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
982 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
983 | SOA SERIAL | 32 bit
984 | |
985 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
986 | FLAGS | 16 bit
987 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
988 / TYPE BIT MAP /
989 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
990 */
991 #define TYPE_CSYNC NU16(62) /* Child-To-Parent Synchronization rfc 7477 */
992
993 /*
994 1 1 1 1 1 1
995 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
996 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
997 / SPF-DATA / one or more c-strings
998 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
999 */
1000 #define TYPE_SPF NU16(99) /* SPF rfc7208 */
1001
1002 #define TYPE_UINFO NU16(100) /* IANA-Reserved */
1003 #define TYPE_UID NU16(101) /* IANA-Reserved */
1004 #define TYPE_GID NU16(102) /* IANA-Reserved */
1005 #define TYPE_UNSPEC NU16(103) /* IANA-Reserved */
1006
1007 /*
1008 1 1 1 1 1 1
1009 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
1010 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1011 | PREFERENCE | 16 bit unsigned integer
1012 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1013 | |
1014 | NODEID | 64 bit
1015 | |
1016 | |
1017 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1018 */
1019 #define TYPE_NID NU16(104) /* NODE ID rfc 6742 */
1020 /*
1021 1 1 1 1 1 1
1022 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
1023 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1024 | PREFERENCE | 16 bit unsigned integer
1025 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1026 | LOCATOR32 | 32 bit unsigned integer
1027 | |
1028 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1029 */
1030 #define TYPE_L32 NU16(105) /* LOCATOR 32 rfc 6742 */
1031 /*
1032 1 1 1 1 1 1
1033 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
1034 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1035 | PREFERENCE | 16 bit unsigned integer
1036 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1037 | |
1038 | LOCATOR64 | 64 bit unsigned integer
1039 | |
1040 | |
1041 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1042 */
1043 #define TYPE_L64 NU16(106) /* LOCATOR 64 rfc 6742 */
1044 /*
1045 1 1 1 1 1 1
1046 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
1047 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1048 | PREFERENCE | 16 bit unsigned integer
1049 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1050 / FQDN / dns formatted domain name
1051 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1052 */
1053 #define TYPE_LP NU16(107) /* LOCATOR POINTER rfc 6742 */
1054 /*
1055 1 1 1 1 1 1
1056 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
1057 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1058 | |
1059 | EUI-48 ADDRESS | 48 bit (MUST be represented as six two-digit hexadecimal
1060 | | numbers separated by hyphens)
1061 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1062 */
1063 #define TYPE_EUI48 NU16(108) /* EUI-48 address rfc 7043 */
1064 /*
1065 1 1 1 1 1 1
1066 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
1067 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1068 | |
1069 | EUI-64 ADDRESS | 64 bit (MUST be represented as six two-digit hexadecimal
1070 | | numbers separated by hyphens)
1071 | |
1072 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1073 */
1074 #define TYPE_EUI64 NU16(109) /* EUI-64 address rfc 7043 */
1075
1076 /*
1077 1 1 1 1 1 1
1078 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
1079 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1080 / ALGORITHM / algorithm in dns formatted domain name
1081 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1082 | INCEPTION | 32 bit unsigned integer
1083 | |
1084 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1085 | EXPIRATION | 32 bit unsigned integer
1086 | |
1087 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1088 | MODE | 16 bit unsigned integer
1089 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1090 | ERROR | 16 bit unsigned integer
1091 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1092 | KEY SIZE | 16 bit unsigned integer
1093 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1094 / KEY DATA /
1095 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1096 | OTHER SIZE | 16 bit unsigned integer
1097 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1098 / OTHER DATA /
1099 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1100 */
1101 #define TYPE_TKEY NU16(249) /* Transaction Key rfc 2930 */
1102 /*
1103 1 1 1 1 1 1
1104 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
1105 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1106 / ALGORITHM / algorithm in dns formatted domain name
1107 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1108 | |
1109 | INCEPTION | 48 bit unsigned integer
1110 | |
1111 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1112 | FUDGE | 16 bit unsigned integer
1113 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1114 | MAC SIZE | 16 bit unsigned integer
1115 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1116 / MAC /
1117 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1118 | ORIGINAL ID | 16 bit unsigned integer
1119 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1120 | ERROR | 16 bit unsigned integer
1121 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1122 | OTHER SIZE | 16 bit unsigned integer
1123 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1124 / OTHER DATA /
1125 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1126 */
1127 #define TYPE_TSIG NU16(250) /* Transaction Signature rfc 2845 */
1128 #define TYPE_IXFR NU16(251) /* Incremental Transfer rfc 1995 */
1129 #define TYPE_AXFR NU16(252) /* Transfer of an entire zone rfc 1035 rfc 5936 */
1130 #define TYPE_MAILB NU16(253) /* A request for mailbox-related records (MB, MG or MR) rfc 1035 */
1131 #define TYPE_MAILA NU16(254) /* A request for mail agent RRs (Obsolete - see MX) rfc 1035 */
1132 #define TYPE_ANY NU16(255) /* a request for all records rfc 1035 rfc 6895 */
1133 /*
1134 1 1 1 1 1 1
1135 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
1136 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1137 | PRIORITY | 16 bit unsigned integer
1138 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1139 | WEIGHT | 16 bit unsigned integer
1140 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1141 / /
1142 / TARGET /
1143 / /
1144 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1145 */
1146 #define TYPE_URI NU16(256) /* URI @note undocumented see draft-faltstrom-uri-14 */
1147 /*
1148 1 1 1 1 1 1
1149 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
1150 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1151 | FLAGS | TAG LENGTH | FLAGS: 8 bit, TAG LENGTH: 8 bit unsigned integer
1152 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1153 / TAG /
1154 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1155 / VALUE /
1156 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1157 */
1158 #define TYPE_CAA NU16(257) /* Certification Authority Authorization rfc 6844 */
1159
1160
1161 #define TYPE_AVC NU16(258) // Visibility and control, no rfc yet
1162
1163 /*
1164 1 1 1 1 1 1
1165 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
1166 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1167 | KEY TAG | 16 bit
1168 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1169 | ALGORITHM | DIGEST TYPE | ALGORITHM: 8 bit, DIGEST TYPE: 8 bit
1170 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1171 / /
1172 / DIGEST / digest dependent
1173 / /
1174 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1175 */
1176 #define TYPE_TA NU16(32768) /* DNSSEC Trust Authorities @note undocumented see Deploying DNSSEC Without a Signed Root */
1177 /*
1178 1 1 1 1 1 1
1179 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
1180 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1181 | KEY TAG | 16 bit
1182 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1183 | ALGORITHM | DIGEST TYPE | ALGORITHM: 8 bit, DIGEST TYPE: 8 bit
1184 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1185 / /
1186 / DIGEST / digest dependent
1187 / /
1188 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
1189 */
1190 #define TYPE_DLV NU16(32769) /* DNSSEC Lookaside Validation rfc 4431 */
1191
1192 #define TYPE_PRIVATE_FIRST NU16(65280)
1193 #define TYPE_PRIVATE_LAST NU16(65534)
1194
1195 #define HOST_CLASS_IN 1 /* the Internet rfc 1025 */
1196
1197 #define CLASS_IN NU16(HOST_CLASS_IN) /* the Internet rfc 1025 */
1198 #define CLASS_CS NU16(2) /* CSNET class rfc 1025 */
1199 #define CLASS_CH NU16(3) /* the CHAOS class rfc 1025 */
1200 #define CLASS_HS NU16(4) /* Hesiod rfc 1025 */
1201 #define CLASS_CTRL NU16(0x2A) /* @note Yadifa controller class */
1202
1203 #if HAS_WHOIS
1204 #define CLASS_WHOIS NU16(0x2B) /* @note WHOIS class */
1205 #endif // HAS_WHOIS
1206
1207 #define CLASS_NONE NU16(254) /* rfc 2136 rfc 2136 */
1208 #define CLASS_ANY NU16(255) /* rfc 1035 QCLASS ONLY rfc 1025 */
1209
1210
1211 /* -----------------------------------------------------------------*/
1212
1213 #define AXFR_TSIG_PERIOD 100
1214
1215 /* -----------------------------------------------------------------*/
1216
1217 #ifdef WORDS_BIGENDIAN
1218 #define DNSKEY_FLAG_KEYSIGNINGKEY 0x0001
1219 #define DNSKEY_FLAG_ZONEKEY 0x0100
1220 #else
1221 #define DNSKEY_FLAG_KEYSIGNINGKEY 0x0100
1222 #define DNSKEY_FLAG_ZONEKEY 0x0001
1223 #endif
1224
1225 #define DNSKEY_PROTOCOL_FIELD 3 /* MUST be this */
1226
1227 #define DNSKEY_ALGORITHM_RSAMD5 1 // DEPRECATED
1228 #define DNSKEY_ALGORITHM_DIFFIE_HELLMAN 2 // NOT USED
1229 #define DNSKEY_ALGORITHM_DSASHA1 3
1230 #define DNSKEY_ALGORITHM_RSASHA1 5
1231 #define DNSKEY_ALGORITHM_DSASHA1_NSEC3 6
1232 #define DNSKEY_ALGORITHM_RSASHA1_NSEC3 7
1233 #define DNSKEY_ALGORITHM_RSASHA256_NSEC3 8 /* RFC 5702 */
1234 #define DNSKEY_ALGORITHM_RSASHA512_NSEC3 10 /* RFC 5702 */
1235 #define DNSKEY_ALGORITHM_GOST 12 /* RFC 5933, not supported by YADIFA */
1236 #define DNSKEY_ALGORITHM_ECDSAP256SHA256 13 /* RFC 6605 */
1237 #define DNSKEY_ALGORITHM_ECDSAP384SHA384 14 /* RFC 6605 */
1238 #define DNSKEY_ALGORITHM_ED25519 15 /* RFC 8080 */
1239 #define DNSKEY_ALGORITHM_ED448 16 /* RFC 8080 */
1240
1241 #define DS_DIGEST_SHA1 1
1242 #define DS_DIGEST_SHA256 2
1243
1244 #define NSEC3_FLAGS_OPTOUT 1 /* */
1245
1246 #define DNSKEY_ALGORITHM_RSAMD5_NAME "RSAMD5" /* RFC 4034 */ // RSA // DEPRECATED
1247 #define DNSKEY_ALGORITHM_DIFFIE_HELLMAN_NAME "DH" /* RFC 2539 */ // NOT USED
1248 #define DNSKEY_ALGORITHM_DSASHA1_NAME "DSA" /* RFC 3755 */
1249 #define DNSKEY_ALGORITHM_RSASHA1_NAME "RSASHA1" /* RFC 4034 */
1250 #define DNSKEY_ALGORITHM_DSASHA1_NSEC3_NAME "DSA-NSEC3-SHA1" /* RFC 5155 */ // NSEC3DSA"
1251 #define DNSKEY_ALGORITHM_RSASHA1_NSEC3_NAME "RSASHA1-NSEC3-SHA1" /* RFC 5155 */ // NSEC3RSASHA1
1252 #define DNSKEY_ALGORITHM_RSASHA256_NSEC3_NAME "RSASHA256" /* RFC 5702 */
1253 #define DNSKEY_ALGORITHM_RSASHA512_NSEC3_NAME "RSASHA512" /* RFC 5702 */
1254 #define DNSKEY_ALGORITHM_GOST_NAME "ECC-GOST" // GOST /* RFC 5933 */ // not supported by YADIFA
1255 #define DNSKEY_ALGORITHM_ECDSAP256SHA256_NAME "ECDSAP256SHA256" /* RFC 6605 */
1256 #define DNSKEY_ALGORITHM_ECDSAP384SHA384_NAME "ECDSAP384SHA384" /* RFC 6605 */
1257 #define DNSKEY_ALGORITHM_ED25519_NAME "ED25519" /* RFC 8080 */
1258 #define DNSKEY_ALGORITHM_ED448_NAME "ED448" /* RFC 8080 */
1259
1260 #define DNSKEY_ALGORITHM_DSASHA1_NSEC3_NAME2 "NSEC3DSA"
1261 #define DNSKEY_ALGORITHM_RSASHA1_NSEC3_NAME2 "NSEC3RSASHA1"
1262
1263 #ifdef DNSKEY_ALGORITHM_DUMMY
1264 #define DNSKEY_ALGORITHM_DUMMY_NAME "DUMMY"
1265 #endif
1266
1267 #define IS_TYPE_PRIVATE(t) (((t) >= 65280) && ( (t) <= 65534))
1268 #define IS_TYPE_NPRIVATE(t) ((NU16(t) >= 65280) && ( NU16(t) <= 65534))
1269
1270 /*
1271 * STRUCTS
1272 */
1273
1274 #define EDNS0_RECORD_SIZE 11
1275
1276 /* rfc 2671 */
1277 struct edns0_data
1278 {
1279 u8 domain_name; /* must be empty */
1280 u16 opt;
1281 u16 payload_size;
1282 u8 extended_rcode; /* extended rcode and flags */
1283 u8 version; /* extended rcode and flags */
1284 u8 z_bits; /* extended rcode and flags */
1285 u8 option_code;
1286 u16 option_length;
1287 };
1288
1289 typedef struct edns0_data edns0_data;
1290
1291 /* - */
1292
1293 typedef struct value_name_table value_name_table;
1294
1295 struct value_name_table
1296 {
1297 u32 id;
1298 char *data;
1299 };
1300
1301
1302 typedef value_name_table class_table;
1303 typedef value_name_table type_table;
1304 typedef value_name_table dnssec_algo_table;
1305
1306 typedef struct message_header message_header;
1307
1308 struct message_header
1309 {
1310 u16 id;
1311 u8 opcode;
1312 u8 flags;
1313 u16 qdcount;
1314 u16 ancount;
1315 u16 nscount;
1316 u16 arcount;
1317 };
1318
1319 /* ------------------------------------------------------------ */
1320
1321 #define CLASS_IN_NAME "IN"
1322 #define CLASS_CS_NAME "CS"
1323 #define CLASS_CH_NAME "CH"
1324 #define CLASS_HS_NAME "HS"
1325 #define CLASS_CTRL_NAME "CTRL" /* @note YADIFA's personal class, maybe one day in a RFC */
1326
1327 #if HAS_WHOIS
1328 #define CLASS_WHOIS_NAME "WHOIS"
1329 #endif // HAS_WHOIS
1330
1331 #define CLASS_NONE_NAME "NONE"
1332 #define CLASS_ANY_NAME "ANY"
1333
1334 extern const class_table qclass[];
1335
1336 #define TYPE_A_NAME "A"
1337 #define TYPE_NS_NAME "NS"
1338 #define TYPE_MD_NAME "MD"
1339 #define TYPE_MF_NAME "MF"
1340 #define TYPE_CNAME_NAME "CNAME"
1341 #define TYPE_SOA_NAME "SOA"
1342 #define TYPE_MB_NAME "MB"
1343 #define TYPE_MG_NAME "MG"
1344 #define TYPE_MR_NAME "MR"
1345 #define TYPE_NULL_NAME "NULL"
1346 #define TYPE_WKS_NAME "WKS"
1347 #define TYPE_PTR_NAME "PTR"
1348 #define TYPE_HINFO_NAME "HINFO"
1349 #define TYPE_MINFO_NAME "MINFO"
1350 #define TYPE_MX_NAME "MX"
1351 #define TYPE_TXT_NAME "TXT"
1352 #define TYPE_RP_NAME "RP"
1353 #define TYPE_AFSDB_NAME "AFSDB"
1354 #define TYPE_X25_NAME "X25"
1355 #define TYPE_ISDN_NAME "ISDN"
1356 #define TYPE_RT_NAME "RT"
1357 #define TYPE_NSAP_NAME "NSAP"
1358 #define TYPE_NSAP_PTR_NAME "NSAP-PTR"
1359 #define TYPE_SIG_NAME "SIG"
1360 #define TYPE_KEY_NAME "KEY"
1361 #define TYPE_PX_NAME "PX"
1362 #define TYPE_GPOS_NAME "GPOS"
1363 #define TYPE_AAAA_NAME "AAAA"
1364 #define TYPE_LOC_NAME "LOC"
1365 #define TYPE_NXT_NAME "NXT"
1366 #define TYPE_EID_NAME "EID" /* @note undocumented see draft-lewis-dns-undocumented-types-01 */
1367 #define TYPE_NIMLOC_NAME "NIMLOC" /* @note undocumented see draft-lewis-dns-undocumented-types-01 */
1368 #define TYPE_SRV_NAME "SRV"
1369 #define TYPE_ATMA_NAME "ATMA"
1370 #define TYPE_NAPTR_NAME "NAPTR"
1371 #define TYPE_KX_NAME "KX"
1372 #define TYPE_CERT_NAME "CERT"
1373 #define TYPE_A6_NAME "A6"
1374 #define TYPE_DNAME_NAME "DNAME"
1375 #define TYPE_SINK_NAME "SINK" /* @note undocumented see draft-lewis-dns-undocumented-types-01 */
1376 #define TYPE_OPT_NAME "OPT"
1377 #define TYPE_APL_NAME "APL"
1378 #define TYPE_DS_NAME "DS"
1379 #define TYPE_SSHFP_NAME "SSHFP"
1380 #define TYPE_IPSECKEY_NAME "IPSECKEY"
1381 #define TYPE_RRSIG_NAME "RRSIG"
1382 #define TYPE_NSEC_NAME "NSEC"
1383 #define TYPE_DNSKEY_NAME "DNSKEY"
1384 #define TYPE_DHCID_NAME "DHCID"
1385 #define TYPE_NSEC3_NAME "NSEC3"
1386 #define TYPE_NSEC3PARAM_NAME "NSEC3PARAM"
1387 #define TYPE_TLSA_NAME "TLSA"
1388 #define TYPE_HIP_NAME "HIP"
1389 #define TYPE_NINFO_NAME "NINFO" /* @note undocumented see draft-lewis-dns-undocumented-types-01 */
1390 #define TYPE_RKEY_NAME "RKEY" /* @note undocumented see draft-lewis-dns-undocumented-types-01 */
1391 #define TYPE_TALINK_NAME "TALINK" /* @note undocumented see draft-lewis-dns-undocumented-types-01 */
1392 #define TYPE_CDS_NAME "CDS"
1393 #define TYPE_CDNSKEY_NAME "CDNSKEY"
1394 #define TYPE_OPENPGPKEY_NAME "OPENPGPKEY"
1395 #define TYPE_CSYNC_NAME "CSYNC"
1396 #define TYPE_SPF_NAME "SPF"
1397 #define TYPE_UINFO_NAME "UINFO"
1398 #define TYPE_UID_NAME "UID"
1399 #define TYPE_GID_NAME "GID"
1400 #define TYPE_UNSPEC_NAME "UNSPEC"
1401 #define TYPE_NID_NAME "NID"
1402 #define TYPE_L32_NAME "L32"
1403 #define TYPE_L64_NAME "L64"
1404 #define TYPE_LP_NAME "LP"
1405 #define TYPE_EUI48_NAME "EUI48"
1406 #define TYPE_EUI64_NAME "EUI64"
1407
1408 #define TYPE_TKEY_NAME "TKEY"
1409 #define TYPE_TSIG_NAME "TSIG"
1410 #define TYPE_IXFR_NAME "IXFR"
1411 #define TYPE_AXFR_NAME "AXFR"
1412 #define TYPE_MAILB_NAME "MAILB"
1413 #define TYPE_MAILA_NAME "MAILA"
1414 #define TYPE_ANY_NAME "ANY" /** @note type ANY's string was set to '*' ?
1415 * Setting this to anything else will break
1416 * dnsformat:358
1417 */
1418 #define TYPE_URI_NAME "URI" /* @note undocumented see draft-lewis-dns-undocumented-types-01 */
1419 #define TYPE_CAA_NAME "CAA" /* @note undocumented see draft-lewis-dns-undocumented-types-01 */
1420 #define TYPE_AVC_NAME "AVC" /* visibility and control */
1421
1422 #define TYPE_TA_NAME "TA" /* @note undocumented see draft-lewis-dns-undocumented-types-01 */
1423 #define TYPE_DLV_NAME "DLV"
1424
1425 #define OPT_NSID 3 // the option value for NSID
1426
1427 extern const type_table qtype[];
1428
1429 /**
1430 * Static asciiz representation of a dns class
1431 *
1432 * @param c
1433 * @return the c-string
1434 */
1435
1436 const char *dns_class_get_name(u16 c);
1437
1438 /**
1439 * Static asciiz representation of a dns type
1440 *
1441 * @param c
1442 * @return the c-string
1443 */
1444
1445 const char *dns_type_get_name(u16 t);
1446
1447 /** \brief Get the numeric value of a class (network order) from its name
1448 *
1449 * @param[in] src the name of the class
1450 * @param[out] dst value of the class, network order
1451 *
1452 * @retval OK
1453 * @retval NOK
1454 */
1455 int dns_class_from_name(const char *src, u16 *dst);
1456
1457 /** \brief Get the numeric value of a class (network order) from its name
1458 * Case insensitive
1459 *
1460 * @param[in] src the name of the class (case insensitive)
1461 * @param[out] dst value of the class, network order
1462 *
1463 * @retval OK
1464 * @retval NOK
1465 */
1466 int dns_class_from_case_name(const char *src, u16 *dst);
1467
1468 /** \brief Get the numeric value of a type (network order) from its name
1469 *
1470 * @param[in] src the name of the type
1471 * @param[out] dst value of the type, network order
1472 *
1473 * @retval OK
1474 * @retval NOK
1475 */
1476 int dns_type_from_name(const char *src, u16 *dst);
1477
1478 /** \brief Get the numeric value of a type (network order) from its name
1479 * Case insensitive
1480 *
1481 * @param[in] src the name of the type (case insensitive)
1482 * @param[out] dst value of the type, network order
1483 *
1484 * @retval OK
1485 * @retval NOK
1486 */
1487 int dns_type_from_case_name(const char *src, u16 *dst);
1488
1489 int dns_type_from_case_name_length(const char *src, int src_len, u16 *dst);
1490
1491 /**
1492 * @brief Case-insensitive search for the name in the table, returns the value
1493 *
1494 * @param table the name->value table
1495 * @param name the name to look for
1496 * @param out_value a pointer to an u32 that will hold the value in case of a match
1497 *
1498 * @return SUCCESS iff the name was matched
1499 */
1500 ya_result value_name_table_get_value_from_casename(const value_name_table *table, const char *name, u32 *out_value);
1501 ya_result value_name_table_get_name_from_value(const value_name_table *table, u32 value, const char** out_name);
1502
1503 const char* dns_encryption_algorithm_get_name(u16 d);
1504 int dns_encryption_algorithm_from_name(const char *src, u8 *dst);
1505 int dns_encryption_algorithm_from_case_name(const char *src, u8 *dst);
1506
1507 /**
1508 * @brief Static asciiz representation of a dns opcode
1509 *
1510 * @param c
1511 *
1512 * @return the c-string
1513 */
1514 const char *dns_message_opcode_get_name(u16 c);
1515
1516 /**
1517 * @brief Static asciiz representation of a dns rcode
1518 *
1519 * @param c
1520 *
1521 * @return the c-string
1522 */
1523 const char *dns_message_rcode_get_name(u16 c);
1524
1525 #if DNSCORE_HAS_NSID_SUPPORT
1526
1527 #ifndef DNSCORE_RFC_C
1528 extern u32 edns0_record_size;
1529 extern u8 *edns0_rdatasize_nsid_option_wire;
1530 extern u32 edns0_rdatasize_nsid_option_wire_size;
1531 #endif
1532
1533 void edns0_set_nsid(u8 *bytes, u16 size);
1534 #endif
1535
1536 ya_result protocol_name_to_id(const char* name, int *out_port);
1537 ya_result protocol_id_to_name(int proto, char *name, size_t name_len);
1538
1539 ya_result server_name_to_port(const char* name, int *out_value);
1540 ya_result server_port_to_name(int port, char *name, size_t name_len);
1541
1542 /*
1543 * SOA
1544 */
1545
1546 ya_result rr_soa_get_serial(const u8* rdata, u16 rdata_size, u32* out_serial);
1547 ya_result rr_soa_increase_serial(u8* rdata, u16 rdata_size, u32 increment);
1548 ya_result rr_soa_set_serial(u8* rdata, u16 rdata_size, u32 increment);
1549
1550 ya_result rr_soa_get_minimumttl(const u8* rdata, u16 rdata_size, s32* out_minimum_ttl);
1551
rrsig_get_type_covered_from_rdata(const void * rdata,u16 rdata_size)1552 static inline u16 rrsig_get_type_covered_from_rdata(const void *rdata, u16 rdata_size)
1553 {
1554 u16 tc = TYPE_NONE;
1555 if(rdata_size >= 2)
1556 {
1557 tc = GET_U16_AT_P(rdata);
1558 }
1559 return tc;
1560 }
1561
rrsig_get_algorithm_from_rdata(const void * rdata,u16 rdata_size)1562 static inline u8 rrsig_get_algorithm_from_rdata(const void *rdata, u16 rdata_size)
1563 {
1564 u8 a = 0;
1565 if(rdata_size >= 3)
1566 {
1567 a = ((const u8*)rdata)[2];
1568 }
1569 return a;
1570 }
1571
rrsig_get_labels_from_rdata(const void * rdata,u16 rdata_size)1572 static inline u8 rrsig_get_labels_from_rdata(const void *rdata, u16 rdata_size)
1573 {
1574 u8 l = 0;
1575 if(rdata_size >= 4)
1576 {
1577 l = ((const u8*)rdata)[3];
1578 }
1579 return l;
1580 }
1581
rrsig_get_original_ttl_from_rdata(const void * rdata,u16 rdata_size)1582 static inline s32 rrsig_get_original_ttl_from_rdata(const void *rdata, u16 rdata_size)
1583 {
1584 s32 ottl = 0;
1585 if(rdata_size >= 8)
1586 {
1587 ottl = ntohl(GET_U32_AT(((const u8*)rdata)[4]));
1588 }
1589 return ottl;
1590 }
1591
rrsig_get_valid_until_from_rdata(const void * rdata,u16 rdata_size)1592 static inline u32 rrsig_get_valid_until_from_rdata(const void *rdata, u16 rdata_size)
1593 {
1594 u32 t = 0;
1595 if(rdata_size >= RRSIG_RDATA_HEADER_LEN)
1596 {
1597 t = ntohl(GET_U32_AT(((const u8*)rdata)[8]));
1598 }
1599 return t;
1600 }
1601
rrsig_get_valid_from_from_rdata(const void * rdata,u16 rdata_size)1602 static inline u32 rrsig_get_valid_from_from_rdata(const void *rdata, u16 rdata_size)
1603 {
1604 u32 t = 0;
1605 if(rdata_size >= RRSIG_RDATA_HEADER_LEN)
1606 {
1607 t = ntohl(GET_U32_AT(((const u8*)rdata)[12]));
1608 }
1609 return t;
1610 }
1611
rrsig_get_key_tag_from_rdata(const void * rdata,u16 rdata_size)1612 static inline u16 rrsig_get_key_tag_from_rdata(const void *rdata, u16 rdata_size)
1613 {
1614 u16 tag = 0;
1615 if(rdata_size >= RRSIG_RDATA_HEADER_LEN)
1616 {
1617 tag = ntohs(GET_U16_AT(((const u8*)rdata)[16]));
1618 }
1619 return tag;
1620 }
1621
rrsig_get_signer_name_from_rdata(const void * rdata,u16 rdata_size)1622 static inline const u8* rrsig_get_signer_name_from_rdata(const void *rdata, u16 rdata_size)
1623 {
1624 const u8 *signer_name = NULL;
1625 if(rdata_size >= RRSIG_RDATA_HEADER_LEN)
1626 {
1627 signer_name = &((const u8*)rdata)[18];
1628 }
1629 return signer_name;
1630 }
1631
1632 #endif /* RFC_H_ */
1633
1634 /** @} */
1635
1636