1 /*
2  * Part of DNS zone file validator `validns`.
3  *
4  * Copyright 2011-2014 Anton Berezin <tobez@tobez.org>
5  * Modified BSD license.
6  * (See LICENSE file in the distribution.)
7  *
8  */
9 #ifndef _RR_H
10 #define _RR_H 1
11 
12 #define T_A		1
13 #define T_NS	2
14 #define T_CNAME	5
15 #define T_SOA	6
16 #define T_MB	7
17 #define T_MG	8
18 #define T_MR	9
19 #define T_PTR	12
20 #define T_HINFO	13
21 #define T_MINFO	14
22 #define T_MX	15
23 #define T_TXT	16
24 #define T_RP	17
25 #define T_AFSDB	18
26 #define T_X25	19
27 #define T_ISDN	20
28 #define T_RT	21
29 #define T_NSAP	22
30 #define T_PX	26
31 #define T_AAAA	28
32 #define T_LOC	29
33 #define T_SRV	33
34 #define T_NAPTR	35
35 #define T_KX	36
36 #define T_CERT	37
37 #define T_DNAME	39
38 #define T_DS	43
39 #define T_SSHFP	44
40 #define T_IPSECKEY	45
41 #define T_RRSIG	46
42 #define T_NSEC	47
43 #define T_DNSKEY	48
44 #define T_DHCID	49
45 #define T_NSEC3	50
46 #define T_NSEC3PARAM	51
47 #define T_TLSA	52
48 #define T_SPF	99
49 #define T_NID	104
50 #define T_L32	105
51 #define T_L64	106
52 #define T_LP	107
53 #define T_DLV   32769
54 #define T_MAX	32769
55 
56 #define ALG_DSA                  3
57 #define ALG_RSASHA1              5
58 #define ALG_DSA_NSEC3_SHA1       6
59 #define ALG_RSASHA1_NSEC3_SHA1   7
60 #define ALG_RSASHA256            8
61 #define ALG_RSASHA512           10
62 #define ALG_ECCGOST             12
63 #define ALG_ECDSAP256SHA256     13
64 #define ALG_ECDSAP384SHA384     14
65 #define ALG_PRIVATEDNS         253
66 #define ALG_PRIVATEOID         254
67 
68 #define ALG_UNSUPPORTED     0
69 #define ALG_DSA_FAMILY      1
70 #define ALG_RSA_FAMILY      2
71 #define ALG_PRIVATE_FAMILY  3
72 #define ALG_ECC_FAMILY      4
73 
74 #define RRCAST(t) struct rr_ ## t *rr = (struct rr_ ## t *)rrv
75 
76 struct cbtree;
77 extern struct cbtree zone_data;
78 extern char *zone_apex;
79 extern int zone_apex_l;
80 
81 struct named_rr;
82 struct rr_set;
83 struct rr;
84 
85 typedef struct rr* (*rr_parse_func)(char *, long, int, char *);
86 typedef char* (*rr_human_func)(struct rr*);
87 typedef struct binary_data (*rr_wire_func)(struct rr*);
88 typedef void* (*rr_validate_set_func)(struct rr_set*);
89 typedef void* (*rr_validate_func)(struct rr*);
90 struct rr_methods {
91 	rr_parse_func        rr_parse;
92 	rr_human_func        rr_human;
93 	rr_wire_func         rr_wire;
94 	rr_validate_set_func rr_validate_set;
95 	rr_validate_func     rr_validate;
96 };
97 extern struct rr_methods rr_methods[T_MAX+1];
98 extern struct rr_methods unknown_methods;
99 
100 struct binary_data call_get_wired(struct rr *rr);
101 struct rr *rr_parse_any(char *name, long ttl, int type, char *s);
102 char* any_human(struct rr *rrv);
103 struct binary_data any_wirerdata(struct rr *rrv);
104 
105 int name_belongs_to_zone(const char *name);
106 void validate_record(struct rr *rr);
107 void validate_zone(void);
108 struct rr *store_record(int rdtype, char *name, long ttl, void *rrptr);
109 int str2rdtype(char *rdtype, int *is_generic);
110 char *rdtype2str(int type);
111 struct named_rr *find_named_rr(char *name);
112 struct named_rr *find_next_named_rr(struct named_rr *named_rr);
113 struct rr_set *find_rr_set(int rdtype, char *name);
114 struct rr_set *find_rr_set_in_named_rr(struct named_rr *named_rr, int rdtype);
115 uint32_t get_rr_set_count(struct named_rr *named_rr);
116 struct binary_data name2wire_name(char *s);
117 int algorithm_type(int alg);
118 int extract_algorithm(char **s, char *what);
119 
120 #define NAME_FLAG_APEX                  1
121 #define NAME_FLAG_HAS_RECORDS           2
122 #define NAME_FLAG_DELEGATION            4
123 #define NAME_FLAG_NOT_AUTHORITATIVE     8
124 #define NAME_FLAG_NSEC3_ONLY           16
125 #define NAME_FLAG_KIDS_WITH_RECORDS    32
126 #define NAME_FLAG_SIGNED_DELEGATION    64
127 #define NAME_FLAG_APEX_PARENT         128
128 #define NAME_FLAG_THIS_WITH_RECORDS   256
129 #define NAME_FLAG_CONTAINS_SLASH      512
130 
131 struct named_rr
132 {
133 	char *name;
134 	void *rr_sets;
135 
136 	int line;
137 	char *file_name;
138 	uint32_t flags;
139 	struct named_rr *parent;
140 };
141 
142 struct rr_set
143 {
144 	struct rr* head;
145 	struct rr* tail;
146 	struct named_rr *named_rr;
147 	int rdtype;
148 	int count;
149 };
150 
151 struct rr
152 {
153 	struct rr* next;
154 	struct rr* prev;
155 	struct rr_set *rr_set;
156 
157 	int	ttl;
158 	int rdtype;
159 
160 	int line;
161 	int is_generic;
162 	char *file_name;
163 };
164 
165 struct rr_any
166 {
167 	struct rr rr;
168 	struct binary_data data;
169 };
170 
171 struct rr_a
172 {
173 	struct rr rr;
174 	struct in_addr address;
175 };
176 extern struct rr_methods a_methods;
177 
178 struct rr_soa
179 {
180 	struct rr rr;
181 	uint32_t serial;
182 	int refresh, retry, expire, minimum;
183 	char *rname;
184 	char *mname;
185 };
186 extern struct rr_methods soa_methods;
187 
188 struct rr_ns
189 {
190     struct rr rr;
191     char *nsdname;
192 };
193 extern struct rr_methods ns_methods;
194 
195 struct rr_dhcid
196 {
197     struct rr rr;
198     int id_type;
199     int digest_type;
200 	struct binary_data digest;
201 };
202 extern struct rr_methods dhcid_methods;
203 
204 struct rr_txt
205 {
206     struct rr rr;
207     int count;
208     struct binary_data txt[1];
209 };
210 extern struct rr_methods txt_methods;
211 
212 struct rr_tlsa
213 {
214     struct rr rr;
215     uint8_t cert_usage;
216     uint8_t selector;
217     uint8_t matching_type;
218     struct binary_data association_data;
219 };
220 extern struct rr_methods tlsa_methods;
221 
222 struct rr_ipseckey
223 {
224     struct rr rr;
225 	uint8_t precedence;
226 	uint8_t gateway_type;
227 	uint8_t algorithm;
228 	union {
229 		char           *gateway_none; /* gateway_type == 0 */
230 		struct in_addr  gateway_ipv4; /* gateway_type == 1 */
231 		struct in6_addr gateway_ipv6; /* gateway_type == 2 */
232 		char           *gateway_name; /* gateway_type == 3 */
233 	} gateway;
234 	struct binary_data public_key;
235 };
236 extern struct rr_methods ipseckey_methods;
237 
238 struct rr_nid
239 {
240     struct rr rr;
241     uint16_t preference;
242     uint64_t node_id;
243 };
244 extern struct rr_methods nid_methods;
245 
246 struct rr_l32
247 {
248     struct rr rr;
249     uint16_t preference;
250     uint32_t locator32;
251 };
252 extern struct rr_methods l32_methods;
253 
254 struct rr_l64
255 {
256     struct rr rr;
257     uint16_t preference;
258     uint64_t locator64;
259 };
260 extern struct rr_methods l64_methods;
261 
262 struct rr_lp
263 {
264     struct rr rr;
265     uint16_t preference;
266     char *fqdn;
267 };
268 extern struct rr_methods lp_methods;
269 
270 struct rr_naptr
271 {
272     struct rr rr;
273 	uint16_t order;
274 	uint16_t preference;
275 	struct binary_data flags;
276 	struct binary_data services;
277 	struct binary_data regexp;
278 	char *replacement;
279 };
280 extern struct rr_methods naptr_methods;
281 
282 struct rr_nsec
283 {
284 	struct rr rr;
285 	char *next_domain;
286 	struct binary_data type_bitmap;
287 };
288 extern struct rr_methods nsec_methods;
289 
290 void validate_nsec_chain(void);
291 
292 struct rr_nsec3
293 {
294 	struct rr rr;
295 	uint8_t hash_algorithm;
296 	uint8_t flags;
297 	uint16_t iterations;
298 	struct binary_data salt;
299 	struct binary_data next_hashed_owner;
300 	struct binary_data type_bitmap;
301 	struct binary_data this_hashed_name;
302 	struct named_rr *corresponding_name;
303 	struct rr_nsec3 *next_nsec3;
304 };
305 extern struct rr_methods nsec3_methods;
306 
307 struct rr_nsec3param
308 {
309 	struct rr rr;
310 	uint8_t hash_algorithm;
311 	uint8_t flags;
312 	uint16_t iterations;
313 	struct binary_data salt;
314 };
315 extern struct rr_methods nsec3param_methods;
316 extern struct rr *nsec3param;
317 
318 struct rr_rrsig
319 {
320 	struct rr rr;
321 	uint16_t type_covered;
322 	int algorithm;
323 	int labels;
324 	int orig_ttl;
325 	uint32_t sig_expiration;
326 	uint32_t sig_inception;
327 	uint16_t key_tag;
328 	char *signer;
329 	struct binary_data signature;
330 };
331 extern struct rr_methods rrsig_methods;
332 
333 struct rr_srv
334 {
335 	struct rr rr;
336 	uint16_t priority;
337 	uint16_t weight;
338 	uint16_t port;
339 	char *target;
340 };
341 extern struct rr_methods srv_methods;
342 
343 struct rr_cname
344 {
345 	struct rr rr;
346 	char *cname;
347 };
348 extern struct rr_methods cname_methods;
349 
350 struct rr_mb
351 {
352 	struct rr rr;
353 	char *madname;
354 };
355 extern struct rr_methods mb_methods;
356 
357 struct rr_mg
358 {
359 	struct rr rr;
360 	char *mgmname;
361 };
362 extern struct rr_methods mg_methods;
363 
364 struct rr_minfo
365 {
366 	struct rr rr;
367 	char *rmailbx;
368 	char *emailbx;
369 };
370 extern struct rr_methods minfo_methods;
371 
372 struct rr_mr
373 {
374 	struct rr rr;
375 	char *newname;
376 };
377 extern struct rr_methods mr_methods;
378 
379 struct rr_dname
380 {
381 	struct rr rr;
382 	char *target;
383 };
384 extern struct rr_methods dname_methods;
385 
386 struct rr_aaaa
387 {
388 	struct rr rr;
389 	struct in6_addr address;
390 };
391 extern struct rr_methods aaaa_methods;
392 
393 struct rr_mx
394 {
395 	struct rr rr;
396 	int   preference;
397 	char *exchange;
398 };
399 extern struct rr_methods mx_methods;
400 
401 struct rr_rt
402 {
403 	struct rr rr;
404 	int   preference;
405 	char *intermediate_host;
406 };
407 extern struct rr_methods rt_methods;
408 
409 struct rr_afsdb
410 {
411 	struct rr rr;
412 	int   subtype;
413 	char *hostname;
414 };
415 extern struct rr_methods afsdb_methods;
416 
417 struct rr_x25
418 {
419 	struct rr rr;
420     struct binary_data psdn_address;
421 };
422 extern struct rr_methods x25_methods;
423 
424 struct rr_isdn
425 {
426 	struct rr rr;
427     struct binary_data isdn_address;
428     struct binary_data sa;
429 	int sa_present;
430 };
431 extern struct rr_methods isdn_methods;
432 
433 struct rr_px
434 {
435 	struct rr rr;
436 	int   preference;
437 	char *map822;
438 	char *mapx400;
439 };
440 extern struct rr_methods px_methods;
441 
442 struct rr_kx
443 {
444 	struct rr rr;
445 	int   preference;
446 	char *exchanger;
447 };
448 extern struct rr_methods kx_methods;
449 
450 struct rr_dnskey
451 {
452 	struct rr rr;
453 	uint16_t flags;
454 	uint8_t protocol;
455 	uint8_t algorithm;
456 	struct binary_data pubkey;
457 	/* calculated */
458 	uint16_t key_tag;
459 	int pkey_built;
460 	void *pkey;
461 };
462 extern struct rr_methods dnskey_methods;
463 
464 int dnskey_build_pkey(struct rr_dnskey *rr);
465 
466 struct rr_ds
467 {
468 	struct rr rr;
469 	uint16_t key_tag;
470 	uint8_t algorithm;
471 	uint8_t digest_type;
472 	struct binary_data digest;
473 };
474 extern struct rr_methods ds_methods;
475 
476 struct rr_dlv
477 {
478 	struct rr rr;
479 	uint16_t key_tag;
480 	uint8_t algorithm;
481 	uint8_t digest_type;
482 	struct binary_data digest;
483 };
484 extern struct rr_methods dlv_methods;
485 
486 struct rr_nsap
487 {
488 	struct rr rr;
489 	struct binary_data data;
490 };
491 extern struct rr_methods nsap_methods;
492 
493 struct rr_hinfo
494 {
495 	struct rr rr;
496     struct binary_data cpu;
497     struct binary_data os;
498 };
499 extern struct rr_methods hinfo_methods;
500 
501 struct rr_rp
502 {
503 	struct rr rr;
504     char *mbox_dname;
505     char *txt_dname;
506 };
507 extern struct rr_methods rp_methods;
508 
509 struct rr_loc
510 {
511 	struct rr rr;
512 	uint8_t version;
513 	uint8_t size;
514 	uint8_t horiz_pre;
515 	uint8_t vert_pre;
516 	uint32_t latitude;
517 	uint32_t longitude;
518 	uint32_t altitude;
519 };
520 extern struct rr_methods loc_methods;
521 
522 struct rr_ptr
523 {
524     struct rr rr;
525     char *ptrdname;
526 };
527 extern struct rr_methods ptr_methods;
528 
529 struct rr_sshfp
530 {
531     struct rr rr;
532     uint8_t algorithm;
533 	uint8_t fp_type;
534 	struct binary_data fingerprint;
535 };
536 extern struct rr_methods sshfp_methods;
537 
538 struct rr_spf
539 {
540     struct rr rr;
541 	int count;
542     struct binary_data spf[1];
543 };
544 extern struct rr_methods spf_methods;
545 
546 struct rr_cert
547 {
548     struct rr rr;
549 	uint16_t type;
550 	uint16_t key_tag;
551 	int algorithm;
552 	struct binary_data certificate;
553 };
554 extern struct rr_methods cert_methods;
555 
556 extern struct rr_nsec3 *first_nsec3;
557 extern struct rr_nsec3 *latest_nsec3;
558 
559 extern void verify_all_keys(void);
560 extern void* nsec3_validate(struct rr *rrv);
561 extern void *remember_nsec3(char *name, struct rr_nsec3 *rr);
562 extern void perform_remaining_nsec3checks(void);
563 extern void *check_typemap(struct binary_data type_bitmap, struct named_rr *named_rr, struct rr *reference_rr);
564 
565 #endif
566