master
  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_ds = 43,
192	ns_t_sshfp = 44,
193	ns_t_ipseckey = 45,
194	ns_t_rrsig = 46,
195	ns_t_nsec = 47,
196	ns_t_dnskey = 48,
197	ns_t_dhcid = 49,
198	ns_t_nsec3 = 50,
199	ns_t_nsec3param = 51,
200	ns_t_tlsa = 52,
201	ns_t_smimea = 53,
202	ns_t_hip = 55,
203	ns_t_ninfo = 56,
204	ns_t_rkey = 57,
205	ns_t_talink = 58,
206	ns_t_cds = 59,
207	ns_t_cdnskey = 60,
208	ns_t_openpgpkey = 61,
209	ns_t_csync = 62,
210	ns_t_spf = 99,
211	ns_t_uinfo = 100,
212	ns_t_uid = 101,
213	ns_t_gid = 102,
214	ns_t_unspec = 103,
215	ns_t_nid = 104,
216	ns_t_l32 = 105,
217	ns_t_l64 = 106,
218	ns_t_lp = 107,
219	ns_t_eui48 = 108,
220	ns_t_eui64 = 109,
221	ns_t_tkey = 249,
222	ns_t_tsig = 250,
223	ns_t_ixfr = 251,
224	ns_t_axfr = 252,
225	ns_t_mailb = 253,
226	ns_t_maila = 254,
227	ns_t_any = 255,
228	ns_t_zxfr = 256,
229	ns_t_uri = 256,
230	ns_t_caa = 257,
231	ns_t_avc = 258,
232	ns_t_ta = 32768,
233	ns_t_dlv = 32769,
234	ns_t_max = 65536
235} ns_type;
236
237#define	ns_t_qt_p(t) (ns_t_xfr_p(t) || (t) == ns_t_any || \
238		      (t) == ns_t_mailb || (t) == ns_t_maila)
239#define	ns_t_mrr_p(t) ((t) == ns_t_tsig || (t) == ns_t_opt)
240#define ns_t_rr_p(t) (!ns_t_qt_p(t) && !ns_t_mrr_p(t))
241#define ns_t_udp_p(t) ((t) != ns_t_axfr && (t) != ns_t_zxfr)
242#define ns_t_xfr_p(t) ((t) == ns_t_axfr || (t) == ns_t_ixfr || \
243		       (t) == ns_t_zxfr)
244
245typedef enum __ns_class {
246	ns_c_invalid = 0,
247	ns_c_in = 1,
248	ns_c_2 = 2,
249	ns_c_chaos = 3,
250	ns_c_hs = 4,
251	ns_c_none = 254,
252	ns_c_any = 255,
253	ns_c_max = 65536
254} ns_class;
255
256typedef enum __ns_key_types {
257	ns_kt_rsa = 1,
258	ns_kt_dh  = 2,
259	ns_kt_dsa = 3,
260	ns_kt_private = 254
261} ns_key_types;
262
263typedef enum __ns_cert_types {
264	cert_t_pkix = 1,
265	cert_t_spki = 2,
266	cert_t_pgp  = 3,
267	cert_t_url  = 253,
268	cert_t_oid  = 254
269} ns_cert_types;
270
271#define	NS_KEY_TYPEMASK		0xC000
272#define	NS_KEY_TYPE_AUTH_CONF	0x0000
273#define	NS_KEY_TYPE_CONF_ONLY	0x8000
274#define	NS_KEY_TYPE_AUTH_ONLY	0x4000
275#define	NS_KEY_TYPE_NO_KEY	0xC000
276#define	NS_KEY_NO_AUTH		0x8000
277#define	NS_KEY_NO_CONF		0x4000
278#define	NS_KEY_RESERVED2	0x2000
279#define	NS_KEY_EXTENDED_FLAGS	0x1000
280#define	NS_KEY_RESERVED4	0x0800
281#define	NS_KEY_RESERVED5	0x0400
282#define	NS_KEY_NAME_TYPE	0x0300
283#define	NS_KEY_NAME_USER	0x0000
284#define	NS_KEY_NAME_ENTITY	0x0200
285#define	NS_KEY_NAME_ZONE	0x0100
286#define	NS_KEY_NAME_RESERVED	0x0300
287#define	NS_KEY_RESERVED8	0x0080
288#define	NS_KEY_RESERVED9	0x0040
289#define	NS_KEY_RESERVED10	0x0020
290#define	NS_KEY_RESERVED11	0x0010
291#define	NS_KEY_SIGNATORYMASK	0x000F
292#define	NS_KEY_RESERVED_BITMASK ( NS_KEY_RESERVED2 | \
293				  NS_KEY_RESERVED4 | \
294				  NS_KEY_RESERVED5 | \
295				  NS_KEY_RESERVED8 | \
296				  NS_KEY_RESERVED9 | \
297				  NS_KEY_RESERVED10 | \
298				  NS_KEY_RESERVED11 )
299#define NS_KEY_RESERVED_BITMASK2 0xFFFF
300#define	NS_ALG_MD5RSA		1
301#define	NS_ALG_DH               2
302#define	NS_ALG_DSA              3
303#define	NS_ALG_DSS              NS_ALG_DSA
304#define	NS_ALG_EXPIRE_ONLY	253
305#define	NS_ALG_PRIVATE_OID	254
306
307#define NS_KEY_PROT_TLS         1
308#define NS_KEY_PROT_EMAIL       2
309#define NS_KEY_PROT_DNSSEC      3
310#define NS_KEY_PROT_IPSEC       4
311#define NS_KEY_PROT_ANY		255
312
313#define	NS_MD5RSA_MIN_BITS	 512
314#define	NS_MD5RSA_MAX_BITS	4096
315#define	NS_MD5RSA_MAX_BYTES	((NS_MD5RSA_MAX_BITS+7/8)*2+3)
316#define	NS_MD5RSA_MAX_BASE64	(((NS_MD5RSA_MAX_BYTES+2)/3)*4)
317#define NS_MD5RSA_MIN_SIZE	((NS_MD5RSA_MIN_BITS+7)/8)
318#define NS_MD5RSA_MAX_SIZE	((NS_MD5RSA_MAX_BITS+7)/8)
319
320#define NS_DSA_SIG_SIZE         41
321#define NS_DSA_MIN_SIZE         213
322#define NS_DSA_MAX_BYTES        405
323
324#define	NS_SIG_TYPE	0
325#define	NS_SIG_ALG	2
326#define	NS_SIG_LABELS	3
327#define	NS_SIG_OTTL	4
328#define	NS_SIG_EXPIR	8
329#define	NS_SIG_SIGNED	12
330#define	NS_SIG_FOOT	16
331#define	NS_SIG_SIGNER	18
332#define	NS_NXT_BITS 8
333#define	NS_NXT_BIT_SET(  n,p) (p[(n)/NS_NXT_BITS] |=  (0x80>>((n)%NS_NXT_BITS)))
334#define	NS_NXT_BIT_CLEAR(n,p) (p[(n)/NS_NXT_BITS] &= ~(0x80>>((n)%NS_NXT_BITS)))
335#define	NS_NXT_BIT_ISSET(n,p) (p[(n)/NS_NXT_BITS] &   (0x80>>((n)%NS_NXT_BITS)))
336#define NS_NXT_MAX 127
337
338#define NS_OPT_DNSSEC_OK        0x8000U
339#define NS_OPT_NSID		3
340
341#define NS_GET16(s, cp) (void)((s) = ns_get16(((cp)+=2)-2))
342#define NS_GET32(l, cp) (void)((l) = ns_get32(((cp)+=4)-4))
343#define NS_PUT16(s, cp) ns_put16((s), ((cp)+=2)-2)
344#define NS_PUT32(l, cp) ns_put32((l), ((cp)+=4)-4)
345
346unsigned ns_get16(const unsigned char *);
347unsigned long ns_get32(const unsigned char *);
348void ns_put16(unsigned, unsigned char *);
349void ns_put32(unsigned long, unsigned char *);
350
351int ns_initparse(const unsigned char *, int, ns_msg *);
352int ns_parserr(ns_msg *, ns_sect, int, ns_rr *);
353int ns_skiprr(const unsigned char *, const unsigned char *, ns_sect, int);
354int ns_name_uncompress(const unsigned char *, const unsigned char *, const unsigned char *, char *, size_t);
355
356
357#define	__BIND		19950621
358
359typedef struct {
360	unsigned	id :16;
361#if __BYTE_ORDER == __BIG_ENDIAN
362	unsigned	qr: 1;
363	unsigned	opcode: 4;
364	unsigned	aa: 1;
365	unsigned	tc: 1;
366	unsigned	rd: 1;
367	unsigned	ra: 1;
368	unsigned	unused :1;
369	unsigned	ad: 1;
370	unsigned	cd: 1;
371	unsigned	rcode :4;
372#else
373	unsigned	rd :1;
374	unsigned	tc :1;
375	unsigned	aa :1;
376	unsigned	opcode :4;
377	unsigned	qr :1;
378	unsigned	rcode :4;
379	unsigned	cd: 1;
380	unsigned	ad: 1;
381	unsigned	unused :1;
382	unsigned	ra :1;
383#endif
384	unsigned	qdcount :16;
385	unsigned	ancount :16;
386	unsigned	nscount :16;
387	unsigned	arcount :16;
388} HEADER;
389
390#define PACKETSZ	NS_PACKETSZ
391#define MAXDNAME	NS_MAXDNAME
392#define MAXCDNAME	NS_MAXCDNAME
393#define MAXLABEL	NS_MAXLABEL
394#define	HFIXEDSZ	NS_HFIXEDSZ
395#define QFIXEDSZ	NS_QFIXEDSZ
396#define RRFIXEDSZ	NS_RRFIXEDSZ
397#define	INT32SZ		NS_INT32SZ
398#define	INT16SZ		NS_INT16SZ
399#define INT8SZ		NS_INT8SZ
400#define	INADDRSZ	NS_INADDRSZ
401#define	IN6ADDRSZ	NS_IN6ADDRSZ
402#define	INDIR_MASK	NS_CMPRSFLGS
403#define NAMESERVER_PORT	NS_DEFAULTPORT
404
405#define S_ZONE		ns_s_zn
406#define S_PREREQ	ns_s_pr
407#define S_UPDATE	ns_s_ud
408#define S_ADDT		ns_s_ar
409
410#define QUERY		ns_o_query
411#define IQUERY		ns_o_iquery
412#define STATUS		ns_o_status
413#define	NS_NOTIFY_OP	ns_o_notify
414#define	NS_UPDATE_OP	ns_o_update
415
416#define NOERROR		ns_r_noerror
417#define FORMERR		ns_r_formerr
418#define SERVFAIL	ns_r_servfail
419#define NXDOMAIN	ns_r_nxdomain
420#define NOTIMP		ns_r_notimpl
421#define REFUSED		ns_r_refused
422#define YXDOMAIN	ns_r_yxdomain
423#define YXRRSET		ns_r_yxrrset
424#define NXRRSET		ns_r_nxrrset
425#define NOTAUTH		ns_r_notauth
426#define NOTZONE		ns_r_notzone
427
428#define DELETE		ns_uop_delete
429#define ADD		ns_uop_add
430
431#define T_A		ns_t_a
432#define T_NS		ns_t_ns
433#define T_MD		ns_t_md
434#define T_MF		ns_t_mf
435#define T_CNAME		ns_t_cname
436#define T_SOA		ns_t_soa
437#define T_MB		ns_t_mb
438#define T_MG		ns_t_mg
439#define T_MR		ns_t_mr
440#define T_NULL		ns_t_null
441#define T_WKS		ns_t_wks
442#define T_PTR		ns_t_ptr
443#define T_HINFO		ns_t_hinfo
444#define T_MINFO		ns_t_minfo
445#define T_MX		ns_t_mx
446#define T_TXT		ns_t_txt
447#define	T_RP		ns_t_rp
448#define T_AFSDB		ns_t_afsdb
449#define T_X25		ns_t_x25
450#define T_ISDN		ns_t_isdn
451#define T_RT		ns_t_rt
452#define T_NSAP		ns_t_nsap
453#define T_NSAP_PTR	ns_t_nsap_ptr
454#define	T_SIG		ns_t_sig
455#define	T_KEY		ns_t_key
456#define	T_PX		ns_t_px
457#define	T_GPOS		ns_t_gpos
458#define	T_AAAA		ns_t_aaaa
459#define	T_LOC		ns_t_loc
460#define	T_NXT		ns_t_nxt
461#define	T_EID		ns_t_eid
462#define	T_NIMLOC	ns_t_nimloc
463#define	T_SRV		ns_t_srv
464#define T_ATMA		ns_t_atma
465#define T_NAPTR		ns_t_naptr
466#define T_A6		ns_t_a6
467#define T_DNAME		ns_t_dname
468#define T_DS		ns_t_ds
469#define T_SSHFP		ns_t_sshfp
470#define T_IPSECKEY	ns_t_ipseckey
471#define T_RRSIG		ns_t_rrsig
472#define T_NSEC		ns_t_nsec
473#define T_DNSKEY	ns_t_dnskey
474#define T_DHCID		ns_t_dhcid
475#define T_NSEC3		ns_t_nsec3
476#define T_NSEC3PARAM	ns_t_nsec3param
477#define T_TLSA		ns_t_tlsa
478#define T_SMIMEA	ns_t_smimea
479#define T_HIP		ns_t_hip
480#define T_NINFO		ns_t_ninfo
481#define T_RKEY		ns_t_rkey
482#define T_TALINK	ns_t_talink
483#define T_CDS		ns_t_cds
484#define T_CDNSKEY	ns_t_cdnskey
485#define T_OPENPGPKEY	ns_t_openpgpkey
486#define T_CSYNC		ns_t_csync
487#define T_SPF		ns_t_spf
488#define T_UINFO		ns_t_uinfo
489#define T_UID		ns_t_uid
490#define T_GID		ns_t_gid
491#define T_UNSPEC	ns_t_unspec
492#define T_NID		ns_t_nid
493#define T_L32		ns_t_l32
494#define T_L64		ns_t_l64
495#define T_LP		ns_t_lp
496#define T_EUI48		ns_t_eui48
497#define T_EUI64		ns_t_eui64
498#define T_TKEY		ns_t_tkey
499#define	T_TSIG		ns_t_tsig
500#define	T_IXFR		ns_t_ixfr
501#define T_AXFR		ns_t_axfr
502#define T_MAILB		ns_t_mailb
503#define T_MAILA		ns_t_maila
504#define T_ANY		ns_t_any
505#define T_URI		ns_t_uri
506#define T_CAA		ns_t_caa
507#define T_AVC		ns_t_avc
508#define T_TA		ns_t_ta
509#define T_DLV		ns_t_dlv
510
511#define C_IN		ns_c_in
512#define C_CHAOS		ns_c_chaos
513#define C_HS		ns_c_hs
514#define C_NONE		ns_c_none
515#define C_ANY		ns_c_any
516
517#define	GETSHORT		NS_GET16
518#define	GETLONG			NS_GET32
519#define	PUTSHORT		NS_PUT16
520#define	PUTLONG			NS_PUT32
521
522#ifdef __cplusplus
523}
524#endif
525
526#endif