1 #pragma once 2 3 #ifdef __cplusplus 4 extern "C" { 5 #endif 6 7 #include <stddef.h> 8 #include <stdint.h> 9 10 #define __NAMESER 19991006 11 #define NS_PACKETSZ 512 12 #define NS_MAXDNAME 1025 13 #define NS_MAXMSG 65535 14 #define NS_MAXCDNAME 255 15 #define NS_MAXLABEL 63 16 #define NS_HFIXEDSZ 12 17 #define NS_QFIXEDSZ 4 18 #define NS_RRFIXEDSZ 10 19 #define NS_INT32SZ 4 20 #define NS_INT16SZ 2 21 #define NS_INT8SZ 1 22 #define NS_INADDRSZ 4 23 #define NS_IN6ADDRSZ 16 24 #define NS_CMPRSFLGS 0xc0 25 #define NS_DEFAULTPORT 53 26 27 typedef enum __ns_sect { 28 ns_s_qd = 0, 29 ns_s_zn = 0, 30 ns_s_an = 1, 31 ns_s_pr = 1, 32 ns_s_ns = 2, 33 ns_s_ud = 2, 34 ns_s_ar = 3, 35 ns_s_max = 4 36 } ns_sect; 37 38 typedef struct __ns_msg { 39 const unsigned char *_msg, *_eom; 40 uint16_t _id, _flags, _counts[ns_s_max]; 41 const unsigned char* _sections[ns_s_max]; 42 ns_sect _sect; 43 int _rrnum; 44 const unsigned char* _msg_ptr; 45 } ns_msg; 46 47 struct _ns_flagdata { 48 int mask, shift; 49 }; 50 extern const struct _ns_flagdata _ns_flagdata[]; 51 52 #define ns_msg_id(handle) ((handle)._id + 0) 53 #define ns_msg_base(handle) ((handle)._msg + 0) 54 #define ns_msg_end(handle) ((handle)._eom + 0) 55 #define ns_msg_size(handle) ((handle)._eom - (handle)._msg) 56 #define ns_msg_count(handle, section) ((handle)._counts[section] + 0) 57 #define ns_msg_getflag(handle, flag) \ 58 (((handle)._flags & _ns_flagdata[flag].mask) >> _ns_flagdata[flag].shift) 59 60 typedef struct __ns_rr { 61 char name[NS_MAXDNAME]; 62 uint16_t type; 63 uint16_t rr_class; 64 uint32_t ttl; 65 uint16_t rdlength; 66 const unsigned char* rdata; 67 } ns_rr; 68 69 #define ns_rr_name(rr) (((rr).name[0] != '\0') ? (rr).name : ".") 70 #define ns_rr_type(rr) ((ns_type)((rr).type + 0)) 71 #define ns_rr_class(rr) ((ns_class)((rr).rr_class + 0)) 72 #define ns_rr_ttl(rr) ((rr).ttl + 0) 73 #define ns_rr_rdlen(rr) ((rr).rdlength + 0) 74 #define ns_rr_rdata(rr) ((rr).rdata + 0) 75 76 typedef enum __ns_flag { 77 ns_f_qr, 78 ns_f_opcode, 79 ns_f_aa, 80 ns_f_tc, 81 ns_f_rd, 82 ns_f_ra, 83 ns_f_z, 84 ns_f_ad, 85 ns_f_cd, 86 ns_f_rcode, 87 ns_f_max 88 } ns_flag; 89 90 typedef enum __ns_opcode { 91 ns_o_query = 0, 92 ns_o_iquery = 1, 93 ns_o_status = 2, 94 ns_o_notify = 4, 95 ns_o_update = 5, 96 ns_o_max = 6 97 } ns_opcode; 98 99 typedef enum __ns_rcode { 100 ns_r_noerror = 0, 101 ns_r_formerr = 1, 102 ns_r_servfail = 2, 103 ns_r_nxdomain = 3, 104 ns_r_notimpl = 4, 105 ns_r_refused = 5, 106 ns_r_yxdomain = 6, 107 ns_r_yxrrset = 7, 108 ns_r_nxrrset = 8, 109 ns_r_notauth = 9, 110 ns_r_notzone = 10, 111 ns_r_max = 11, 112 ns_r_badvers = 16, 113 ns_r_badsig = 16, 114 ns_r_badkey = 17, 115 ns_r_badtime = 18 116 } ns_rcode; 117 118 typedef enum __ns_update_operation { 119 ns_uop_delete = 0, 120 ns_uop_add = 1, 121 ns_uop_max = 2 122 } ns_update_operation; 123 124 struct ns_tsig_key { 125 char name[NS_MAXDNAME], alg[NS_MAXDNAME]; 126 unsigned char* data; 127 int len; 128 }; 129 typedef struct ns_tsig_key ns_tsig_key; 130 131 struct ns_tcp_tsig_state { 132 int counter; 133 struct dst_key* key; 134 void* ctx; 135 unsigned char sig[NS_PACKETSZ]; 136 int siglen; 137 }; 138 typedef struct ns_tcp_tsig_state ns_tcp_tsig_state; 139 140 #define NS_TSIG_FUDGE 300 141 #define NS_TSIG_TCP_COUNT 100 142 #define NS_TSIG_ALG_HMAC_MD5 "HMAC-MD5.SIG-ALG.REG.INT" 143 144 #define NS_TSIG_ERROR_NO_TSIG -10 145 #define NS_TSIG_ERROR_NO_SPACE -11 146 #define NS_TSIG_ERROR_FORMERR -12 147 148 typedef enum __ns_type { 149 ns_t_invalid = 0, 150 ns_t_a = 1, 151 ns_t_ns = 2, 152 ns_t_md = 3, 153 ns_t_mf = 4, 154 ns_t_cname = 5, 155 ns_t_soa = 6, 156 ns_t_mb = 7, 157 ns_t_mg = 8, 158 ns_t_mr = 9, 159 ns_t_null = 10, 160 ns_t_wks = 11, 161 ns_t_ptr = 12, 162 ns_t_hinfo = 13, 163 ns_t_minfo = 14, 164 ns_t_mx = 15, 165 ns_t_txt = 16, 166 ns_t_rp = 17, 167 ns_t_afsdb = 18, 168 ns_t_x25 = 19, 169 ns_t_isdn = 20, 170 ns_t_rt = 21, 171 ns_t_nsap = 22, 172 ns_t_nsap_ptr = 23, 173 ns_t_sig = 24, 174 ns_t_key = 25, 175 ns_t_px = 26, 176 ns_t_gpos = 27, 177 ns_t_aaaa = 28, 178 ns_t_loc = 29, 179 ns_t_nxt = 30, 180 ns_t_eid = 31, 181 ns_t_nimloc = 32, 182 ns_t_srv = 33, 183 ns_t_atma = 34, 184 ns_t_naptr = 35, 185 ns_t_kx = 36, 186 ns_t_cert = 37, 187 ns_t_a6 = 38, 188 ns_t_dname = 39, 189 ns_t_sink = 40, 190 ns_t_opt = 41, 191 ns_t_apl = 42, 192 ns_t_tkey = 249, 193 ns_t_tsig = 250, 194 ns_t_ixfr = 251, 195 ns_t_axfr = 252, 196 ns_t_mailb = 253, 197 ns_t_maila = 254, 198 ns_t_any = 255, 199 ns_t_zxfr = 256, 200 ns_t_max = 65536 201 } ns_type; 202 203 #define ns_t_qt_p(t) (ns_t_xfr_p(t) || (t) == ns_t_any || (t) == ns_t_mailb || (t) == ns_t_maila) 204 #define ns_t_mrr_p(t) ((t) == ns_t_tsig || (t) == ns_t_opt) 205 #define ns_t_rr_p(t) (!ns_t_qt_p(t) && !ns_t_mrr_p(t)) 206 #define ns_t_udp_p(t) ((t) != ns_t_axfr && (t) != ns_t_zxfr) 207 #define ns_t_xfr_p(t) ((t) == ns_t_axfr || (t) == ns_t_ixfr || (t) == ns_t_zxfr) 208 209 typedef enum __ns_class { 210 ns_c_invalid = 0, 211 ns_c_in = 1, 212 ns_c_2 = 2, 213 ns_c_chaos = 3, 214 ns_c_hs = 4, 215 ns_c_none = 254, 216 ns_c_any = 255, 217 ns_c_max = 65536 218 } ns_class; 219 220 typedef enum __ns_key_types { 221 ns_kt_rsa = 1, 222 ns_kt_dh = 2, 223 ns_kt_dsa = 3, 224 ns_kt_private = 254 225 } ns_key_types; 226 227 typedef enum __ns_cert_types { 228 cert_t_pkix = 1, 229 cert_t_spki = 2, 230 cert_t_pgp = 3, 231 cert_t_url = 253, 232 cert_t_oid = 254 233 } ns_cert_types; 234 235 #define NS_KEY_TYPEMASK 0xC000 236 #define NS_KEY_TYPE_AUTH_CONF 0x0000 237 #define NS_KEY_TYPE_CONF_ONLY 0x8000 238 #define NS_KEY_TYPE_AUTH_ONLY 0x4000 239 #define NS_KEY_TYPE_NO_KEY 0xC000 240 #define NS_KEY_NO_AUTH 0x8000 241 #define NS_KEY_NO_CONF 0x4000 242 #define NS_KEY_RESERVED2 0x2000 243 #define NS_KEY_EXTENDED_FLAGS 0x1000 244 #define NS_KEY_RESERVED4 0x0800 245 #define NS_KEY_RESERVED5 0x0400 246 #define NS_KEY_NAME_TYPE 0x0300 247 #define NS_KEY_NAME_USER 0x0000 248 #define NS_KEY_NAME_ENTITY 0x0200 249 #define NS_KEY_NAME_ZONE 0x0100 250 #define NS_KEY_NAME_RESERVED 0x0300 251 #define NS_KEY_RESERVED8 0x0080 252 #define NS_KEY_RESERVED9 0x0040 253 #define NS_KEY_RESERVED10 0x0020 254 #define NS_KEY_RESERVED11 0x0010 255 #define NS_KEY_SIGNATORYMASK 0x000F 256 #define NS_KEY_RESERVED_BITMASK \ 257 (NS_KEY_RESERVED2 | NS_KEY_RESERVED4 | NS_KEY_RESERVED5 | NS_KEY_RESERVED8 | \ 258 NS_KEY_RESERVED9 | NS_KEY_RESERVED10 | NS_KEY_RESERVED11) 259 #define NS_KEY_RESERVED_BITMASK2 0xFFFF 260 #define NS_ALG_MD5RSA 1 261 #define NS_ALG_DH 2 262 #define NS_ALG_DSA 3 263 #define NS_ALG_DSS NS_ALG_DSA 264 #define NS_ALG_EXPIRE_ONLY 253 265 #define NS_ALG_PRIVATE_OID 254 266 267 #define NS_KEY_PROT_TLS 1 268 #define NS_KEY_PROT_EMAIL 2 269 #define NS_KEY_PROT_DNSSEC 3 270 #define NS_KEY_PROT_IPSEC 4 271 #define NS_KEY_PROT_ANY 255 272 273 #define NS_MD5RSA_MIN_BITS 512 274 #define NS_MD5RSA_MAX_BITS 4096 275 #define NS_MD5RSA_MAX_BYTES ((NS_MD5RSA_MAX_BITS + 7 / 8) * 2 + 3) 276 #define NS_MD5RSA_MAX_BASE64 (((NS_MD5RSA_MAX_BYTES + 2) / 3) * 4) 277 #define NS_MD5RSA_MIN_SIZE ((NS_MD5RSA_MIN_BITS + 7) / 8) 278 #define NS_MD5RSA_MAX_SIZE ((NS_MD5RSA_MAX_BITS + 7) / 8) 279 280 #define NS_DSA_SIG_SIZE 41 281 #define NS_DSA_MIN_SIZE 213 282 #define NS_DSA_MAX_BYTES 405 283 284 #define NS_SIG_TYPE 0 285 #define NS_SIG_ALG 2 286 #define NS_SIG_LABELS 3 287 #define NS_SIG_OTTL 4 288 #define NS_SIG_EXPIR 8 289 #define NS_SIG_SIGNED 12 290 #define NS_SIG_FOOT 16 291 #define NS_SIG_SIGNER 18 292 #define NS_NXT_BITS 8 293 #define NS_NXT_BIT_SET(n, p) (p[(n) / NS_NXT_BITS] |= (0x80 >> ((n) % NS_NXT_BITS))) 294 #define NS_NXT_BIT_CLEAR(n, p) (p[(n) / NS_NXT_BITS] &= ~(0x80 >> ((n) % NS_NXT_BITS))) 295 #define NS_NXT_BIT_ISSET(n, p) (p[(n) / NS_NXT_BITS] & (0x80 >> ((n) % NS_NXT_BITS))) 296 #define NS_NXT_MAX 127 297 298 #define NS_OPT_DNSSEC_OK 0x8000U 299 #define NS_OPT_NSID 3 300 301 #define NS_GET16(s, cp) (void)((s) = ns_get16(((cp) += 2) - 2)) 302 #define NS_GET32(l, cp) (void)((l) = ns_get32(((cp) += 4) - 4)) 303 #define NS_PUT16(s, cp) ns_put16((s), ((cp) += 2) - 2) 304 #define NS_PUT32(l, cp) ns_put32((l), ((cp) += 4) - 4) 305 306 unsigned ns_get16(const unsigned char*); 307 unsigned long ns_get32(const unsigned char*); 308 void ns_put16(unsigned, unsigned char*); 309 void ns_put32(unsigned long, unsigned char*); 310 311 int ns_initparse(const unsigned char*, int, ns_msg*); 312 int ns_parserr(ns_msg*, ns_sect, int, ns_rr*); 313 int ns_skiprr(const unsigned char*, const unsigned char*, ns_sect, int); 314 int ns_name_uncompress(const unsigned char*, const unsigned char*, const unsigned char*, char*, 315 size_t); 316 317 #define __BIND 19950621 318 319 typedef struct { 320 unsigned id : 16; 321 #if __BYTE_ORDER == __BIG_ENDIAN 322 unsigned qr : 1; 323 unsigned opcode : 4; 324 unsigned aa : 1; 325 unsigned tc : 1; 326 unsigned rd : 1; 327 unsigned ra : 1; 328 unsigned unused : 1; 329 unsigned ad : 1; 330 unsigned cd : 1; 331 unsigned rcode : 4; 332 #else 333 unsigned rd : 1; 334 unsigned tc : 1; 335 unsigned aa : 1; 336 unsigned opcode : 4; 337 unsigned qr : 1; 338 unsigned rcode : 4; 339 unsigned cd : 1; 340 unsigned ad : 1; 341 unsigned unused : 1; 342 unsigned ra : 1; 343 #endif 344 unsigned qdcount : 16; 345 unsigned ancount : 16; 346 unsigned nscount : 16; 347 unsigned arcount : 16; 348 } HEADER; 349 350 #define PACKETSZ NS_PACKETSZ 351 #define MAXDNAME NS_MAXDNAME 352 #define MAXCDNAME NS_MAXCDNAME 353 #define MAXLABEL NS_MAXLABEL 354 #define HFIXEDSZ NS_HFIXEDSZ 355 #define QFIXEDSZ NS_QFIXEDSZ 356 #define RRFIXEDSZ NS_RRFIXEDSZ 357 #define INT32SZ NS_INT32SZ 358 #define INT16SZ NS_INT16SZ 359 #define INT8SZ NS_INT8SZ 360 #define INADDRSZ NS_INADDRSZ 361 #define IN6ADDRSZ NS_IN6ADDRSZ 362 #define INDIR_MASK NS_CMPRSFLGS 363 #define NAMESERVER_PORT NS_DEFAULTPORT 364 365 #define S_ZONE ns_s_zn 366 #define S_PREREQ ns_s_pr 367 #define S_UPDATE ns_s_ud 368 #define S_ADDT ns_s_ar 369 370 #define QUERY ns_o_query 371 #define IQUERY ns_o_iquery 372 #define STATUS ns_o_status 373 #define NS_NOTIFY_OP ns_o_notify 374 #define NS_UPDATE_OP ns_o_update 375 376 #define NOERROR ns_r_noerror 377 #define FORMERR ns_r_formerr 378 #define SERVFAIL ns_r_servfail 379 #define NXDOMAIN ns_r_nxdomain 380 #define NOTIMP ns_r_notimpl 381 #define REFUSED ns_r_refused 382 #define YXDOMAIN ns_r_yxdomain 383 #define YXRRSET ns_r_yxrrset 384 #define NXRRSET ns_r_nxrrset 385 #define NOTAUTH ns_r_notauth 386 #define NOTZONE ns_r_notzone 387 388 #define DELETE ns_uop_delete 389 #define ADD ns_uop_add 390 391 #define T_A ns_t_a 392 #define T_NS ns_t_ns 393 #define T_MD ns_t_md 394 #define T_MF ns_t_mf 395 #define T_CNAME ns_t_cname 396 #define T_SOA ns_t_soa 397 #define T_MB ns_t_mb 398 #define T_MG ns_t_mg 399 #define T_MR ns_t_mr 400 #define T_NULL ns_t_null 401 #define T_WKS ns_t_wks 402 #define T_PTR ns_t_ptr 403 #define T_HINFO ns_t_hinfo 404 #define T_MINFO ns_t_minfo 405 #define T_MX ns_t_mx 406 #define T_TXT ns_t_txt 407 #define T_RP ns_t_rp 408 #define T_AFSDB ns_t_afsdb 409 #define T_X25 ns_t_x25 410 #define T_ISDN ns_t_isdn 411 #define T_RT ns_t_rt 412 #define T_NSAP ns_t_nsap 413 #define T_NSAP_PTR ns_t_nsap_ptr 414 #define T_SIG ns_t_sig 415 #define T_KEY ns_t_key 416 #define T_PX ns_t_px 417 #define T_GPOS ns_t_gpos 418 #define T_AAAA ns_t_aaaa 419 #define T_LOC ns_t_loc 420 #define T_NXT ns_t_nxt 421 #define T_EID ns_t_eid 422 #define T_NIMLOC ns_t_nimloc 423 #define T_SRV ns_t_srv 424 #define T_ATMA ns_t_atma 425 #define T_NAPTR ns_t_naptr 426 #define T_A6 ns_t_a6 427 #define T_DNAME ns_t_dname 428 #define T_TSIG ns_t_tsig 429 #define T_IXFR ns_t_ixfr 430 #define T_AXFR ns_t_axfr 431 #define T_MAILB ns_t_mailb 432 #define T_MAILA ns_t_maila 433 #define T_ANY ns_t_any 434 435 #define C_IN ns_c_in 436 #define C_CHAOS ns_c_chaos 437 #define C_HS ns_c_hs 438 #define C_NONE ns_c_none 439 #define C_ANY ns_c_any 440 441 #define GETSHORT NS_GET16 442 #define GETLONG NS_GET32 443 #define PUTSHORT NS_PUT16 444 #define PUTLONG NS_PUT32 445 446 #ifdef __cplusplus 447 } 448 #endif 449