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