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