xref: /freebsd/crypto/heimdal/lib/roken/resolve.h (revision 6a068746777241722b2b32c5d0bc443a2a64d80b)
1b528cefcSMark Murray /*
2*ae771770SStanislav Sedov  * Copyright (c) 1995 - 2002 Kungliga Tekniska Högskolan
3b528cefcSMark Murray  * (Royal Institute of Technology, Stockholm, Sweden).
4b528cefcSMark Murray  * All rights reserved.
5b528cefcSMark Murray  *
6b528cefcSMark Murray  * Redistribution and use in source and binary forms, with or without
7b528cefcSMark Murray  * modification, are permitted provided that the following conditions
8b528cefcSMark Murray  * are met:
9b528cefcSMark Murray  *
10b528cefcSMark Murray  * 1. Redistributions of source code must retain the above copyright
11b528cefcSMark Murray  *    notice, this list of conditions and the following disclaimer.
12b528cefcSMark Murray  *
13b528cefcSMark Murray  * 2. Redistributions in binary form must reproduce the above copyright
14b528cefcSMark Murray  *    notice, this list of conditions and the following disclaimer in the
15b528cefcSMark Murray  *    documentation and/or other materials provided with the distribution.
16b528cefcSMark Murray  *
17b528cefcSMark Murray  * 3. Neither the name of the Institute nor the names of its contributors
18b528cefcSMark Murray  *    may be used to endorse or promote products derived from this software
19b528cefcSMark Murray  *    without specific prior written permission.
20b528cefcSMark Murray  *
21b528cefcSMark Murray  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22b528cefcSMark Murray  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23b528cefcSMark Murray  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24b528cefcSMark Murray  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25b528cefcSMark Murray  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26b528cefcSMark Murray  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27b528cefcSMark Murray  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28b528cefcSMark Murray  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29b528cefcSMark Murray  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30b528cefcSMark Murray  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31b528cefcSMark Murray  * SUCH DAMAGE.
32b528cefcSMark Murray  */
33b528cefcSMark Murray 
34*ae771770SStanislav Sedov /* $Id$ */
35b528cefcSMark Murray 
36b528cefcSMark Murray #ifndef __RESOLVE_H__
37b528cefcSMark Murray #define __RESOLVE_H__
38b528cefcSMark Murray 
39c19800e8SDoug Rabson #ifndef ROKEN_LIB_FUNCTION
40c19800e8SDoug Rabson #ifdef _WIN32
41*ae771770SStanislav Sedov #define ROKEN_LIB_FUNCTION
42*ae771770SStanislav Sedov #define ROKEN_LIB_CALL     __cdecl
43c19800e8SDoug Rabson #else
44c19800e8SDoug Rabson #define ROKEN_LIB_FUNCTION
45*ae771770SStanislav Sedov #define ROKEN_LIB_CALL
46c19800e8SDoug Rabson #endif
47c19800e8SDoug Rabson #endif
48c19800e8SDoug Rabson 
49*ae771770SStanislav Sedov enum {
50*ae771770SStanislav Sedov     rk_ns_c_in = 1
51*ae771770SStanislav Sedov };
52*ae771770SStanislav Sedov 
53*ae771770SStanislav Sedov enum {
54c19800e8SDoug Rabson 	rk_ns_t_invalid = 0,	/* Cookie. */
55c19800e8SDoug Rabson 	rk_ns_t_a = 1,		/* Host address. */
56c19800e8SDoug Rabson 	rk_ns_t_ns = 2,		/* Authoritative server. */
57c19800e8SDoug Rabson 	rk_ns_t_md = 3,		/* Mail destination. */
58c19800e8SDoug Rabson 	rk_ns_t_mf = 4,		/* Mail forwarder. */
59c19800e8SDoug Rabson 	rk_ns_t_cname = 5,	/* Canonical name. */
60c19800e8SDoug Rabson 	rk_ns_t_soa = 6,	/* Start of authority zone. */
61c19800e8SDoug Rabson 	rk_ns_t_mb = 7,		/* Mailbox domain name. */
62c19800e8SDoug Rabson 	rk_ns_t_mg = 8,		/* Mail group member. */
63c19800e8SDoug Rabson 	rk_ns_t_mr = 9,		/* Mail rename name. */
64c19800e8SDoug Rabson 	rk_ns_t_null = 10,	/* Null resource record. */
65c19800e8SDoug Rabson 	rk_ns_t_wks = 11,	/* Well known service. */
66c19800e8SDoug Rabson 	rk_ns_t_ptr = 12,	/* Domain name pointer. */
67c19800e8SDoug Rabson 	rk_ns_t_hinfo = 13,	/* Host information. */
68c19800e8SDoug Rabson 	rk_ns_t_minfo = 14,	/* Mailbox information. */
69c19800e8SDoug Rabson 	rk_ns_t_mx = 15,	/* Mail routing information. */
70c19800e8SDoug Rabson 	rk_ns_t_txt = 16,	/* Text strings. */
71c19800e8SDoug Rabson 	rk_ns_t_rp = 17,	/* Responsible person. */
72c19800e8SDoug Rabson 	rk_ns_t_afsdb = 18,	/* AFS cell database. */
73c19800e8SDoug Rabson 	rk_ns_t_x25 = 19,	/* X_25 calling address. */
74c19800e8SDoug Rabson 	rk_ns_t_isdn = 20,	/* ISDN calling address. */
75c19800e8SDoug Rabson 	rk_ns_t_rt = 21,	/* Router. */
76c19800e8SDoug Rabson 	rk_ns_t_nsap = 22,	/* NSAP address. */
77c19800e8SDoug Rabson 	rk_ns_t_nsap_ptr = 23,	/* Reverse NSAP lookup (deprecated). */
78c19800e8SDoug Rabson 	rk_ns_t_sig = 24,	/* Security signature. */
79c19800e8SDoug Rabson 	rk_ns_t_key = 25,	/* Security key. */
80c19800e8SDoug Rabson 	rk_ns_t_px = 26,	/* X.400 mail mapping. */
81c19800e8SDoug Rabson 	rk_ns_t_gpos = 27,	/* Geographical position (withdrawn). */
82c19800e8SDoug Rabson 	rk_ns_t_aaaa = 28,	/* Ip6 Address. */
83c19800e8SDoug Rabson 	rk_ns_t_loc = 29,	/* Location Information. */
84c19800e8SDoug Rabson 	rk_ns_t_nxt = 30,	/* Next domain (security). */
85c19800e8SDoug Rabson 	rk_ns_t_eid = 31,	/* Endpoint identifier. */
86c19800e8SDoug Rabson 	rk_ns_t_nimloc = 32,	/* Nimrod Locator. */
87c19800e8SDoug Rabson 	rk_ns_t_srv = 33,	/* Server Selection. */
88c19800e8SDoug Rabson 	rk_ns_t_atma = 34,	/* ATM Address */
89c19800e8SDoug Rabson 	rk_ns_t_naptr = 35,	/* Naming Authority PoinTeR */
90c19800e8SDoug Rabson 	rk_ns_t_kx = 36,	/* Key Exchange */
91c19800e8SDoug Rabson 	rk_ns_t_cert = 37,	/* Certification record */
92c19800e8SDoug Rabson 	rk_ns_t_a6 = 38,	/* IPv6 address (deprecates AAAA) */
93c19800e8SDoug Rabson 	rk_ns_t_dname = 39,	/* Non-terminal DNAME (for IPv6) */
94c19800e8SDoug Rabson 	rk_ns_t_sink = 40,	/* Kitchen sink (experimentatl) */
95c19800e8SDoug Rabson 	rk_ns_t_opt = 41,	/* EDNS0 option (meta-RR) */
96c19800e8SDoug Rabson 	rk_ns_t_apl = 42,	/* Address prefix list (RFC 3123) */
97c19800e8SDoug Rabson 	rk_ns_t_ds = 43,	/* Delegation Signer (RFC 3658) */
98c19800e8SDoug Rabson 	rk_ns_t_sshfp = 44,	/* SSH fingerprint */
99c19800e8SDoug Rabson 	rk_ns_t_tkey = 249,	/* Transaction key */
100c19800e8SDoug Rabson 	rk_ns_t_tsig = 250,	/* Transaction signature. */
101c19800e8SDoug Rabson 	rk_ns_t_ixfr = 251,	/* Incremental zone transfer. */
102c19800e8SDoug Rabson 	rk_ns_t_axfr = 252,	/* Transfer zone of authority. */
103c19800e8SDoug Rabson 	rk_ns_t_mailb = 253,	/* Transfer mailbox records. */
104c19800e8SDoug Rabson 	rk_ns_t_maila = 254,	/* Transfer mail agent records. */
105c19800e8SDoug Rabson 	rk_ns_t_any = 255,	/* Wildcard match. */
106c19800e8SDoug Rabson 	rk_ns_t_zxfr = 256,	/* BIND-specific, nonstandard. */
107c19800e8SDoug Rabson 	rk_ns_t_max = 65536
108*ae771770SStanislav Sedov };
109c19800e8SDoug Rabson 
110c19800e8SDoug Rabson #ifndef MAXDNAME
111c19800e8SDoug Rabson #define MAXDNAME	1025
112c19800e8SDoug Rabson #endif
113b528cefcSMark Murray 
1148373020dSJacques Vidrine #define mx_record		rk_mx_record
1158373020dSJacques Vidrine #define srv_record		rk_srv_record
1168373020dSJacques Vidrine #define key_record		rk_key_record
1178373020dSJacques Vidrine #define sig_record		rk_sig_record
1188373020dSJacques Vidrine #define cert_record		rk_cert_record
119c19800e8SDoug Rabson #define sshfp_record		rk_sshfp_record
1208373020dSJacques Vidrine 
121*ae771770SStanislav Sedov struct rk_dns_query{
122b528cefcSMark Murray     char *domain;
123b528cefcSMark Murray     unsigned type;
124b528cefcSMark Murray     unsigned class;
125b528cefcSMark Murray };
126b528cefcSMark Murray 
127*ae771770SStanislav Sedov struct rk_mx_record{
128b528cefcSMark Murray     unsigned  preference;
129b528cefcSMark Murray     char domain[1];
130b528cefcSMark Murray };
131b528cefcSMark Murray 
132*ae771770SStanislav Sedov struct rk_srv_record{
133b528cefcSMark Murray     unsigned priority;
134b528cefcSMark Murray     unsigned weight;
135b528cefcSMark Murray     unsigned port;
136b528cefcSMark Murray     char target[1];
137b528cefcSMark Murray };
138b528cefcSMark Murray 
139*ae771770SStanislav Sedov struct rk_key_record {
1405e9cd1aeSAssar Westerlund     unsigned flags;
1415e9cd1aeSAssar Westerlund     unsigned protocol;
1425e9cd1aeSAssar Westerlund     unsigned algorithm;
1435e9cd1aeSAssar Westerlund     size_t   key_len;
1445e9cd1aeSAssar Westerlund     u_char   key_data[1];
1455e9cd1aeSAssar Westerlund };
1465e9cd1aeSAssar Westerlund 
147*ae771770SStanislav Sedov struct rk_sig_record {
1485e9cd1aeSAssar Westerlund     unsigned type;
1495e9cd1aeSAssar Westerlund     unsigned algorithm;
1505e9cd1aeSAssar Westerlund     unsigned labels;
1515e9cd1aeSAssar Westerlund     unsigned orig_ttl;
1525e9cd1aeSAssar Westerlund     unsigned sig_expiration;
1535e9cd1aeSAssar Westerlund     unsigned sig_inception;
1545e9cd1aeSAssar Westerlund     unsigned key_tag;
1555e9cd1aeSAssar Westerlund     char     *signer;
156*ae771770SStanislav Sedov     size_t   sig_len;
1575e9cd1aeSAssar Westerlund     char     sig_data[1];	/* also includes signer */
1585e9cd1aeSAssar Westerlund };
1595e9cd1aeSAssar Westerlund 
160*ae771770SStanislav Sedov struct rk_cert_record {
1615e9cd1aeSAssar Westerlund     unsigned type;
1625e9cd1aeSAssar Westerlund     unsigned tag;
1635e9cd1aeSAssar Westerlund     unsigned algorithm;
1645e9cd1aeSAssar Westerlund     size_t   cert_len;
1655e9cd1aeSAssar Westerlund     u_char   cert_data[1];
1665e9cd1aeSAssar Westerlund };
1675e9cd1aeSAssar Westerlund 
168*ae771770SStanislav Sedov struct rk_sshfp_record {
169c19800e8SDoug Rabson     unsigned algorithm;
170c19800e8SDoug Rabson     unsigned type;
171c19800e8SDoug Rabson     size_t   sshfp_len;
172c19800e8SDoug Rabson     u_char   sshfp_data[1];
173c19800e8SDoug Rabson };
174c19800e8SDoug Rabson 
175*ae771770SStanislav Sedov struct rk_ds_record {
176c19800e8SDoug Rabson     unsigned key_tag;
177c19800e8SDoug Rabson     unsigned algorithm;
178c19800e8SDoug Rabson     unsigned digest_type;
179*ae771770SStanislav Sedov     size_t digest_len;
180c19800e8SDoug Rabson     u_char digest_data[1];
181c19800e8SDoug Rabson };
182c19800e8SDoug Rabson 
183*ae771770SStanislav Sedov struct rk_resource_record{
184b528cefcSMark Murray     char *domain;
185b528cefcSMark Murray     unsigned type;
186b528cefcSMark Murray     unsigned class;
187b528cefcSMark Murray     unsigned ttl;
188b528cefcSMark Murray     unsigned size;
189b528cefcSMark Murray     union {
190b528cefcSMark Murray 	void *data;
191*ae771770SStanislav Sedov 	struct rk_mx_record *mx;
192*ae771770SStanislav Sedov 	struct rk_mx_record *afsdb; /* mx and afsdb are identical */
193*ae771770SStanislav Sedov 	struct rk_srv_record *srv;
194b528cefcSMark Murray 	struct in_addr *a;
195b528cefcSMark Murray 	char *txt;
196*ae771770SStanislav Sedov 	struct rk_key_record *key;
197*ae771770SStanislav Sedov 	struct rk_cert_record *cert;
198*ae771770SStanislav Sedov 	struct rk_sig_record *sig;
199*ae771770SStanislav Sedov 	struct rk_sshfp_record *sshfp;
200*ae771770SStanislav Sedov 	struct rk_ds_record *ds;
201b528cefcSMark Murray     }u;
202*ae771770SStanislav Sedov     struct rk_resource_record *next;
203b528cefcSMark Murray };
204b528cefcSMark Murray 
205c19800e8SDoug Rabson #define rk_DNS_MAX_PACKET_SIZE		0xffff
206c19800e8SDoug Rabson 
207*ae771770SStanislav Sedov struct rk_dns_header {
208c19800e8SDoug Rabson     unsigned id;
209c19800e8SDoug Rabson     unsigned flags;
210c19800e8SDoug Rabson #define rk_DNS_HEADER_RESPONSE_FLAG		1
211c19800e8SDoug Rabson #define rk_DNS_HEADER_AUTHORITIVE_ANSWER	2
212c19800e8SDoug Rabson #define rk_DNS_HEADER_TRUNCATED_MESSAGE		4
213c19800e8SDoug Rabson #define rk_DNS_HEADER_RECURSION_DESIRED		8
214c19800e8SDoug Rabson #define rk_DNS_HEADER_RECURSION_AVAILABLE	16
215c19800e8SDoug Rabson #define rk_DNS_HEADER_AUTHENTIC_DATA		32
216c19800e8SDoug Rabson #define rk_DNS_HEADER_CHECKING_DISABLED		64
217c19800e8SDoug Rabson     unsigned opcode;
218c19800e8SDoug Rabson     unsigned response_code;
219c19800e8SDoug Rabson     unsigned qdcount;
220c19800e8SDoug Rabson     unsigned ancount;
221c19800e8SDoug Rabson     unsigned nscount;
222c19800e8SDoug Rabson     unsigned arcount;
223c19800e8SDoug Rabson };
224b528cefcSMark Murray 
225*ae771770SStanislav Sedov struct rk_dns_reply{
226*ae771770SStanislav Sedov     struct rk_dns_header h;
227*ae771770SStanislav Sedov     struct rk_dns_query q;
228*ae771770SStanislav Sedov     struct rk_resource_record *head;
229b528cefcSMark Murray };
230b528cefcSMark Murray 
231b528cefcSMark Murray 
232*ae771770SStanislav Sedov #ifdef __cplusplus
233*ae771770SStanislav Sedov extern "C" {
234*ae771770SStanislav Sedov #endif
235*ae771770SStanislav Sedov 
236*ae771770SStanislav Sedov ROKEN_LIB_FUNCTION struct rk_dns_reply* ROKEN_LIB_CALL
237*ae771770SStanislav Sedov 	rk_dns_lookup(const char *, const char *);
238*ae771770SStanislav Sedov ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL
239*ae771770SStanislav Sedov 	rk_dns_free_data(struct rk_dns_reply *);
240*ae771770SStanislav Sedov ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
241*ae771770SStanislav Sedov 	rk_dns_string_to_type(const char *name);
242*ae771770SStanislav Sedov ROKEN_LIB_FUNCTION const char * ROKEN_LIB_CALL
243*ae771770SStanislav Sedov 	rk_dns_type_to_string(int type);
244*ae771770SStanislav Sedov ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL
245*ae771770SStanislav Sedov 	rk_dns_srv_order(struct rk_dns_reply*);
246*ae771770SStanislav Sedov 
247*ae771770SStanislav Sedov #ifdef __cplusplus
248*ae771770SStanislav Sedov }
249*ae771770SStanislav Sedov #endif
250b528cefcSMark Murray 
251b528cefcSMark Murray #endif /* __RESOLVE_H__ */
252