nameser.h raw

   1  #ifndef _ARPA_NAMESER_H
   2  #define _ARPA_NAMESER_H
   3  
   4  #ifdef __cplusplus
   5  extern "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  
  28  typedef 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  
  39  typedef 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  
  48  struct _ns_flagdata {  int mask, shift;  };
  49  extern 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  
  59  typedef	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  
  75  typedef 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  
  89  typedef 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  
  98  typedef	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  
 117  typedef enum __ns_update_operation {
 118  	ns_uop_delete = 0,
 119  	ns_uop_add = 1,
 120  	ns_uop_max = 2
 121  } ns_update_operation;
 122  
 123  struct ns_tsig_key {
 124          char name[NS_MAXDNAME], alg[NS_MAXDNAME];
 125          unsigned char *data;
 126          int len;
 127  };
 128  typedef struct ns_tsig_key ns_tsig_key;
 129  
 130  struct 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  };
 137  typedef 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  
 147  typedef 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  
 210  typedef 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  
 221  typedef 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  
 228  typedef 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  
 311  unsigned ns_get16(const unsigned char *);
 312  unsigned long ns_get32(const unsigned char *);
 313  void ns_put16(unsigned, unsigned char *);
 314  void ns_put32(unsigned long, unsigned char *);
 315  
 316  int ns_initparse(const unsigned char *, int, ns_msg *);
 317  int ns_parserr(ns_msg *, ns_sect, int, ns_rr *);
 318  int ns_skiprr(const unsigned char *, const unsigned char *, ns_sect, int);
 319  int ns_name_uncompress(const unsigned char *, const unsigned char *, const unsigned char *, char *, size_t);
 320  
 321  
 322  #define	__BIND		19950621
 323  
 324  typedef 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