xref: /minix3/external/bsd/bind/dist/bin/tests/system/tkey/keycreate.c (revision 00b67f09dd46474d133c95011a48590a8e8f94c7)
1*00b67f09SDavid van Moolenbroek /*	$NetBSD: keycreate.c,v 1.7 2014/12/10 04:37:54 christos Exp $	*/
2*00b67f09SDavid van Moolenbroek 
3*00b67f09SDavid van Moolenbroek /*
4*00b67f09SDavid van Moolenbroek  * Copyright (C) 2004, 2005, 2007, 2009, 2011, 2012, 2014  Internet Systems Consortium, Inc. ("ISC")
5*00b67f09SDavid van Moolenbroek  * Copyright (C) 2001  Internet Software Consortium.
6*00b67f09SDavid van Moolenbroek  *
7*00b67f09SDavid van Moolenbroek  * Permission to use, copy, modify, and/or distribute this software for any
8*00b67f09SDavid van Moolenbroek  * purpose with or without fee is hereby granted, provided that the above
9*00b67f09SDavid van Moolenbroek  * copyright notice and this permission notice appear in all copies.
10*00b67f09SDavid van Moolenbroek  *
11*00b67f09SDavid van Moolenbroek  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
12*00b67f09SDavid van Moolenbroek  * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
13*00b67f09SDavid van Moolenbroek  * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
14*00b67f09SDavid van Moolenbroek  * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
15*00b67f09SDavid van Moolenbroek  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
16*00b67f09SDavid van Moolenbroek  * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*00b67f09SDavid van Moolenbroek  * PERFORMANCE OF THIS SOFTWARE.
18*00b67f09SDavid van Moolenbroek  */
19*00b67f09SDavid van Moolenbroek 
20*00b67f09SDavid van Moolenbroek /* Id: keycreate.c,v 1.20 2011/01/11 23:47:13 tbox Exp  */
21*00b67f09SDavid van Moolenbroek 
22*00b67f09SDavid van Moolenbroek #include <config.h>
23*00b67f09SDavid van Moolenbroek 
24*00b67f09SDavid van Moolenbroek #include <stdlib.h>
25*00b67f09SDavid van Moolenbroek #include <string.h>
26*00b67f09SDavid van Moolenbroek 
27*00b67f09SDavid van Moolenbroek #include <isc/app.h>
28*00b67f09SDavid van Moolenbroek #include <isc/base64.h>
29*00b67f09SDavid van Moolenbroek #include <isc/entropy.h>
30*00b67f09SDavid van Moolenbroek #include <isc/hash.h>
31*00b67f09SDavid van Moolenbroek #include <isc/log.h>
32*00b67f09SDavid van Moolenbroek #include <isc/mem.h>
33*00b67f09SDavid van Moolenbroek #include <isc/sockaddr.h>
34*00b67f09SDavid van Moolenbroek #include <isc/socket.h>
35*00b67f09SDavid van Moolenbroek #include <isc/task.h>
36*00b67f09SDavid van Moolenbroek #include <isc/timer.h>
37*00b67f09SDavid van Moolenbroek #include <isc/util.h>
38*00b67f09SDavid van Moolenbroek 
39*00b67f09SDavid van Moolenbroek #include <dns/dispatch.h>
40*00b67f09SDavid van Moolenbroek #include <dns/fixedname.h>
41*00b67f09SDavid van Moolenbroek #include <dns/keyvalues.h>
42*00b67f09SDavid van Moolenbroek #include <dns/message.h>
43*00b67f09SDavid van Moolenbroek #include <dns/name.h>
44*00b67f09SDavid van Moolenbroek #include <dns/request.h>
45*00b67f09SDavid van Moolenbroek #include <dns/result.h>
46*00b67f09SDavid van Moolenbroek #include <dns/tkey.h>
47*00b67f09SDavid van Moolenbroek #include <dns/tsig.h>
48*00b67f09SDavid van Moolenbroek #include <dns/view.h>
49*00b67f09SDavid van Moolenbroek 
50*00b67f09SDavid van Moolenbroek #include <dst/result.h>
51*00b67f09SDavid van Moolenbroek 
52*00b67f09SDavid van Moolenbroek #define CHECK(str, x) { \
53*00b67f09SDavid van Moolenbroek 	if ((x) != ISC_R_SUCCESS) { \
54*00b67f09SDavid van Moolenbroek 		fprintf(stderr, "I:%s: %s\n", (str), isc_result_totext(x)); \
55*00b67f09SDavid van Moolenbroek 		exit(-1); \
56*00b67f09SDavid van Moolenbroek 	} \
57*00b67f09SDavid van Moolenbroek }
58*00b67f09SDavid van Moolenbroek 
59*00b67f09SDavid van Moolenbroek #define RUNCHECK(x) RUNTIME_CHECK((x) == ISC_R_SUCCESS)
60*00b67f09SDavid van Moolenbroek 
61*00b67f09SDavid van Moolenbroek #define PORT 5300
62*00b67f09SDavid van Moolenbroek #define TIMEOUT 30
63*00b67f09SDavid van Moolenbroek 
64*00b67f09SDavid van Moolenbroek static dst_key_t *ourkey;
65*00b67f09SDavid van Moolenbroek static isc_mem_t *mctx;
66*00b67f09SDavid van Moolenbroek static dns_tsigkey_t *tsigkey, *initialkey;
67*00b67f09SDavid van Moolenbroek static dns_tsig_keyring_t *ring;
68*00b67f09SDavid van Moolenbroek static unsigned char noncedata[16];
69*00b67f09SDavid van Moolenbroek static isc_buffer_t nonce;
70*00b67f09SDavid van Moolenbroek static dns_requestmgr_t *requestmgr;
71*00b67f09SDavid van Moolenbroek static const char *ownername_str = ".";
72*00b67f09SDavid van Moolenbroek 
73*00b67f09SDavid van Moolenbroek static void
recvquery(isc_task_t * task,isc_event_t * event)74*00b67f09SDavid van Moolenbroek recvquery(isc_task_t *task, isc_event_t *event) {
75*00b67f09SDavid van Moolenbroek 	dns_requestevent_t *reqev = (dns_requestevent_t *)event;
76*00b67f09SDavid van Moolenbroek 	isc_result_t result;
77*00b67f09SDavid van Moolenbroek 	dns_message_t *query, *response;
78*00b67f09SDavid van Moolenbroek 	char keyname[256];
79*00b67f09SDavid van Moolenbroek 	isc_buffer_t keynamebuf;
80*00b67f09SDavid van Moolenbroek 	int type;
81*00b67f09SDavid van Moolenbroek 
82*00b67f09SDavid van Moolenbroek 	UNUSED(task);
83*00b67f09SDavid van Moolenbroek 
84*00b67f09SDavid van Moolenbroek 	REQUIRE(reqev != NULL);
85*00b67f09SDavid van Moolenbroek 
86*00b67f09SDavid van Moolenbroek 	if (reqev->result != ISC_R_SUCCESS) {
87*00b67f09SDavid van Moolenbroek 		fprintf(stderr, "I:request event result: %s\n",
88*00b67f09SDavid van Moolenbroek 			isc_result_totext(reqev->result));
89*00b67f09SDavid van Moolenbroek 		exit(-1);
90*00b67f09SDavid van Moolenbroek 	}
91*00b67f09SDavid van Moolenbroek 
92*00b67f09SDavid van Moolenbroek 	query = reqev->ev_arg;
93*00b67f09SDavid van Moolenbroek 
94*00b67f09SDavid van Moolenbroek 	response = NULL;
95*00b67f09SDavid van Moolenbroek 	result = dns_message_create(mctx, DNS_MESSAGE_INTENTPARSE, &response);
96*00b67f09SDavid van Moolenbroek 	CHECK("dns_message_create", result);
97*00b67f09SDavid van Moolenbroek 
98*00b67f09SDavid van Moolenbroek 	result = dns_request_getresponse(reqev->request, response,
99*00b67f09SDavid van Moolenbroek 					 DNS_MESSAGEPARSE_PRESERVEORDER);
100*00b67f09SDavid van Moolenbroek 	CHECK("dns_request_getresponse", result);
101*00b67f09SDavid van Moolenbroek 
102*00b67f09SDavid van Moolenbroek 	if (response->rcode != dns_rcode_noerror) {
103*00b67f09SDavid van Moolenbroek 		result = ISC_RESULTCLASS_DNSRCODE + response->rcode;
104*00b67f09SDavid van Moolenbroek 		fprintf(stderr, "I:response rcode: %s\n",
105*00b67f09SDavid van Moolenbroek 			isc_result_totext(result));
106*00b67f09SDavid van Moolenbroek 			exit(-1);
107*00b67f09SDavid van Moolenbroek 	}
108*00b67f09SDavid van Moolenbroek 
109*00b67f09SDavid van Moolenbroek 	result = dns_tkey_processdhresponse(query, response, ourkey, &nonce,
110*00b67f09SDavid van Moolenbroek 					    &tsigkey, ring);
111*00b67f09SDavid van Moolenbroek 	CHECK("dns_tkey_processdhresponse", result);
112*00b67f09SDavid van Moolenbroek 
113*00b67f09SDavid van Moolenbroek 	/*
114*00b67f09SDavid van Moolenbroek 	 * Yes, this is a hack.
115*00b67f09SDavid van Moolenbroek 	 */
116*00b67f09SDavid van Moolenbroek 	isc_buffer_init(&keynamebuf, keyname, sizeof(keyname));
117*00b67f09SDavid van Moolenbroek 	result = dst_key_buildfilename(tsigkey->key, 0, "", &keynamebuf);
118*00b67f09SDavid van Moolenbroek 	CHECK("dst_key_buildfilename", result);
119*00b67f09SDavid van Moolenbroek 	printf("%.*s\n", (int)isc_buffer_usedlength(&keynamebuf),
120*00b67f09SDavid van Moolenbroek 	       (char *)isc_buffer_base(&keynamebuf));
121*00b67f09SDavid van Moolenbroek 	type = DST_TYPE_PRIVATE | DST_TYPE_PUBLIC | DST_TYPE_KEY;
122*00b67f09SDavid van Moolenbroek 	result = dst_key_tofile(tsigkey->key, type, "");
123*00b67f09SDavid van Moolenbroek 	CHECK("dst_key_tofile", result);
124*00b67f09SDavid van Moolenbroek 
125*00b67f09SDavid van Moolenbroek 	dns_message_destroy(&query);
126*00b67f09SDavid van Moolenbroek 	dns_message_destroy(&response);
127*00b67f09SDavid van Moolenbroek 	dns_request_destroy(&reqev->request);
128*00b67f09SDavid van Moolenbroek 	isc_event_free(&event);
129*00b67f09SDavid van Moolenbroek 	isc_app_shutdown();
130*00b67f09SDavid van Moolenbroek 	return;
131*00b67f09SDavid van Moolenbroek }
132*00b67f09SDavid van Moolenbroek 
133*00b67f09SDavid van Moolenbroek static void
sendquery(isc_task_t * task,isc_event_t * event)134*00b67f09SDavid van Moolenbroek sendquery(isc_task_t *task, isc_event_t *event) {
135*00b67f09SDavid van Moolenbroek 	struct in_addr inaddr;
136*00b67f09SDavid van Moolenbroek 	isc_sockaddr_t address;
137*00b67f09SDavid van Moolenbroek 	isc_region_t r;
138*00b67f09SDavid van Moolenbroek 	isc_result_t result;
139*00b67f09SDavid van Moolenbroek 	dns_fixedname_t keyname;
140*00b67f09SDavid van Moolenbroek 	dns_fixedname_t ownername;
141*00b67f09SDavid van Moolenbroek 	isc_buffer_t namestr, keybuf;
142*00b67f09SDavid van Moolenbroek 	unsigned char keydata[9];
143*00b67f09SDavid van Moolenbroek 	dns_message_t *query;
144*00b67f09SDavid van Moolenbroek 	dns_request_t *request;
145*00b67f09SDavid van Moolenbroek 	static char keystr[] = "0123456789ab";
146*00b67f09SDavid van Moolenbroek 
147*00b67f09SDavid van Moolenbroek 	isc_event_free(&event);
148*00b67f09SDavid van Moolenbroek 
149*00b67f09SDavid van Moolenbroek 	result = ISC_R_FAILURE;
150*00b67f09SDavid van Moolenbroek 	if (inet_pton(AF_INET, "10.53.0.1", &inaddr) != 1)
151*00b67f09SDavid van Moolenbroek 		CHECK("inet_pton", result);
152*00b67f09SDavid van Moolenbroek 	isc_sockaddr_fromin(&address, &inaddr, PORT);
153*00b67f09SDavid van Moolenbroek 
154*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&keyname);
155*00b67f09SDavid van Moolenbroek 	isc_buffer_constinit(&namestr, "tkeytest.", 9);
156*00b67f09SDavid van Moolenbroek 	isc_buffer_add(&namestr, 9);
157*00b67f09SDavid van Moolenbroek 	result = dns_name_fromtext(dns_fixedname_name(&keyname), &namestr,
158*00b67f09SDavid van Moolenbroek 				   NULL, 0, NULL);
159*00b67f09SDavid van Moolenbroek 	CHECK("dns_name_fromtext", result);
160*00b67f09SDavid van Moolenbroek 
161*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&ownername);
162*00b67f09SDavid van Moolenbroek 	isc_buffer_constinit(&namestr, ownername_str, strlen(ownername_str));
163*00b67f09SDavid van Moolenbroek 	isc_buffer_add(&namestr, strlen(ownername_str));
164*00b67f09SDavid van Moolenbroek 	result = dns_name_fromtext(dns_fixedname_name(&ownername), &namestr,
165*00b67f09SDavid van Moolenbroek 				   NULL, 0, NULL);
166*00b67f09SDavid van Moolenbroek 	CHECK("dns_name_fromtext", result);
167*00b67f09SDavid van Moolenbroek 
168*00b67f09SDavid van Moolenbroek 	isc_buffer_init(&keybuf, keydata, 9);
169*00b67f09SDavid van Moolenbroek 	result = isc_base64_decodestring(keystr, &keybuf);
170*00b67f09SDavid van Moolenbroek 	CHECK("isc_base64_decodestring", result);
171*00b67f09SDavid van Moolenbroek 
172*00b67f09SDavid van Moolenbroek 	isc_buffer_usedregion(&keybuf, &r);
173*00b67f09SDavid van Moolenbroek 
174*00b67f09SDavid van Moolenbroek 	initialkey = NULL;
175*00b67f09SDavid van Moolenbroek 	result = dns_tsigkey_create(dns_fixedname_name(&keyname),
176*00b67f09SDavid van Moolenbroek 				    DNS_TSIG_HMACMD5_NAME,
177*00b67f09SDavid van Moolenbroek 				    isc_buffer_base(&keybuf),
178*00b67f09SDavid van Moolenbroek 				    isc_buffer_usedlength(&keybuf),
179*00b67f09SDavid van Moolenbroek 				    ISC_FALSE, NULL, 0, 0, mctx, ring,
180*00b67f09SDavid van Moolenbroek 				    &initialkey);
181*00b67f09SDavid van Moolenbroek 	CHECK("dns_tsigkey_create", result);
182*00b67f09SDavid van Moolenbroek 
183*00b67f09SDavid van Moolenbroek 	query = NULL;
184*00b67f09SDavid van Moolenbroek 	result = dns_message_create(mctx, DNS_MESSAGE_INTENTRENDER, &query);
185*00b67f09SDavid van Moolenbroek 	CHECK("dns_message_create", result);
186*00b67f09SDavid van Moolenbroek 
187*00b67f09SDavid van Moolenbroek 	result = dns_tkey_builddhquery(query, ourkey,
188*00b67f09SDavid van Moolenbroek 				       dns_fixedname_name(&ownername),
189*00b67f09SDavid van Moolenbroek 				       DNS_TSIG_HMACMD5_NAME, &nonce, 3600);
190*00b67f09SDavid van Moolenbroek 	CHECK("dns_tkey_builddhquery", result);
191*00b67f09SDavid van Moolenbroek 
192*00b67f09SDavid van Moolenbroek 	request = NULL;
193*00b67f09SDavid van Moolenbroek 	result = dns_request_create(requestmgr, query, &address,
194*00b67f09SDavid van Moolenbroek 				    DNS_REQUESTOPT_TCP, initialkey,
195*00b67f09SDavid van Moolenbroek 				    TIMEOUT, task, recvquery, query,
196*00b67f09SDavid van Moolenbroek 				    &request);
197*00b67f09SDavid van Moolenbroek 	CHECK("dns_request_create", result);
198*00b67f09SDavid van Moolenbroek }
199*00b67f09SDavid van Moolenbroek 
200*00b67f09SDavid van Moolenbroek int
main(int argc,char * argv[])201*00b67f09SDavid van Moolenbroek main(int argc, char *argv[]) {
202*00b67f09SDavid van Moolenbroek 	char *ourkeyname;
203*00b67f09SDavid van Moolenbroek 	isc_taskmgr_t *taskmgr;
204*00b67f09SDavid van Moolenbroek 	isc_timermgr_t *timermgr;
205*00b67f09SDavid van Moolenbroek 	isc_socketmgr_t *socketmgr;
206*00b67f09SDavid van Moolenbroek 	isc_socket_t *sock;
207*00b67f09SDavid van Moolenbroek 	unsigned int attrs, attrmask;
208*00b67f09SDavid van Moolenbroek 	isc_sockaddr_t bind_any;
209*00b67f09SDavid van Moolenbroek 	dns_dispatchmgr_t *dispatchmgr;
210*00b67f09SDavid van Moolenbroek 	dns_dispatch_t *dispatchv4;
211*00b67f09SDavid van Moolenbroek 	dns_view_t *view;
212*00b67f09SDavid van Moolenbroek 	isc_entropy_t *ectx;
213*00b67f09SDavid van Moolenbroek 	dns_tkeyctx_t *tctx;
214*00b67f09SDavid van Moolenbroek 	isc_log_t *log;
215*00b67f09SDavid van Moolenbroek 	isc_logconfig_t *logconfig;
216*00b67f09SDavid van Moolenbroek 	isc_task_t *task;
217*00b67f09SDavid van Moolenbroek 	isc_result_t result;
218*00b67f09SDavid van Moolenbroek 	int type;
219*00b67f09SDavid van Moolenbroek 
220*00b67f09SDavid van Moolenbroek 	RUNCHECK(isc_app_start());
221*00b67f09SDavid van Moolenbroek 
222*00b67f09SDavid van Moolenbroek 	if (argc < 2) {
223*00b67f09SDavid van Moolenbroek 		fprintf(stderr, "I:no DH key provided\n");
224*00b67f09SDavid van Moolenbroek 		exit(-1);
225*00b67f09SDavid van Moolenbroek 	}
226*00b67f09SDavid van Moolenbroek 	ourkeyname = argv[1];
227*00b67f09SDavid van Moolenbroek 
228*00b67f09SDavid van Moolenbroek 	if (argc >= 3)
229*00b67f09SDavid van Moolenbroek 		ownername_str = argv[2];
230*00b67f09SDavid van Moolenbroek 
231*00b67f09SDavid van Moolenbroek 	dns_result_register();
232*00b67f09SDavid van Moolenbroek 
233*00b67f09SDavid van Moolenbroek 	mctx = NULL;
234*00b67f09SDavid van Moolenbroek 	isc_mem_debugging = ISC_MEM_DEBUGRECORD;
235*00b67f09SDavid van Moolenbroek 	RUNCHECK(isc_mem_create(0, 0, &mctx));
236*00b67f09SDavid van Moolenbroek 
237*00b67f09SDavid van Moolenbroek 	ectx = NULL;
238*00b67f09SDavid van Moolenbroek 	RUNCHECK(isc_entropy_create(mctx, &ectx));
239*00b67f09SDavid van Moolenbroek 	RUNCHECK(isc_entropy_createfilesource(ectx, "../random.data"));
240*00b67f09SDavid van Moolenbroek 	RUNCHECK(isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE));
241*00b67f09SDavid van Moolenbroek 
242*00b67f09SDavid van Moolenbroek 	log = NULL;
243*00b67f09SDavid van Moolenbroek 	logconfig = NULL;
244*00b67f09SDavid van Moolenbroek 	RUNCHECK(isc_log_create(mctx, &log, &logconfig));
245*00b67f09SDavid van Moolenbroek 
246*00b67f09SDavid van Moolenbroek 	RUNCHECK(dst_lib_init(mctx, ectx, ISC_ENTROPY_GOODONLY));
247*00b67f09SDavid van Moolenbroek 
248*00b67f09SDavid van Moolenbroek 	taskmgr = NULL;
249*00b67f09SDavid van Moolenbroek 	RUNCHECK(isc_taskmgr_create(mctx, 1, 0, &taskmgr));
250*00b67f09SDavid van Moolenbroek 	task = NULL;
251*00b67f09SDavid van Moolenbroek 	RUNCHECK(isc_task_create(taskmgr, 0, &task));
252*00b67f09SDavid van Moolenbroek 	timermgr = NULL;
253*00b67f09SDavid van Moolenbroek 	RUNCHECK(isc_timermgr_create(mctx, &timermgr));
254*00b67f09SDavid van Moolenbroek 	socketmgr = NULL;
255*00b67f09SDavid van Moolenbroek 	RUNCHECK(isc_socketmgr_create(mctx, &socketmgr));
256*00b67f09SDavid van Moolenbroek 	dispatchmgr = NULL;
257*00b67f09SDavid van Moolenbroek 	RUNCHECK(dns_dispatchmgr_create(mctx, NULL, &dispatchmgr));
258*00b67f09SDavid van Moolenbroek 	isc_sockaddr_any(&bind_any);
259*00b67f09SDavid van Moolenbroek 	attrs = DNS_DISPATCHATTR_UDP |
260*00b67f09SDavid van Moolenbroek 		DNS_DISPATCHATTR_MAKEQUERY |
261*00b67f09SDavid van Moolenbroek 		DNS_DISPATCHATTR_IPV4;
262*00b67f09SDavid van Moolenbroek 	attrmask = DNS_DISPATCHATTR_UDP |
263*00b67f09SDavid van Moolenbroek 		   DNS_DISPATCHATTR_TCP |
264*00b67f09SDavid van Moolenbroek 		   DNS_DISPATCHATTR_IPV4 |
265*00b67f09SDavid van Moolenbroek 		   DNS_DISPATCHATTR_IPV6;
266*00b67f09SDavid van Moolenbroek 	dispatchv4 = NULL;
267*00b67f09SDavid van Moolenbroek 	RUNCHECK(dns_dispatch_getudp(dispatchmgr, socketmgr, taskmgr,
268*00b67f09SDavid van Moolenbroek 					  &bind_any, 4096, 4, 2, 3, 5,
269*00b67f09SDavid van Moolenbroek 					  attrs, attrmask, &dispatchv4));
270*00b67f09SDavid van Moolenbroek 	requestmgr = NULL;
271*00b67f09SDavid van Moolenbroek 	RUNCHECK(dns_requestmgr_create(mctx, timermgr, socketmgr, taskmgr,
272*00b67f09SDavid van Moolenbroek 					    dispatchmgr, dispatchv4, NULL,
273*00b67f09SDavid van Moolenbroek 					    &requestmgr));
274*00b67f09SDavid van Moolenbroek 
275*00b67f09SDavid van Moolenbroek 	ring = NULL;
276*00b67f09SDavid van Moolenbroek 	RUNCHECK(dns_tsigkeyring_create(mctx, &ring));
277*00b67f09SDavid van Moolenbroek 	tctx = NULL;
278*00b67f09SDavid van Moolenbroek 	RUNCHECK(dns_tkeyctx_create(mctx, ectx, &tctx));
279*00b67f09SDavid van Moolenbroek 
280*00b67f09SDavid van Moolenbroek 	view = NULL;
281*00b67f09SDavid van Moolenbroek 	RUNCHECK(dns_view_create(mctx, 0, "_test", &view));
282*00b67f09SDavid van Moolenbroek 	dns_view_setkeyring(view, ring);
283*00b67f09SDavid van Moolenbroek 	dns_tsigkeyring_detach(&ring);
284*00b67f09SDavid van Moolenbroek 
285*00b67f09SDavid van Moolenbroek 	sock = NULL;
286*00b67f09SDavid van Moolenbroek 	RUNCHECK(isc_socket_create(socketmgr, PF_INET, isc_sockettype_udp,
287*00b67f09SDavid van Moolenbroek 				   &sock));
288*00b67f09SDavid van Moolenbroek 
289*00b67f09SDavid van Moolenbroek 	RUNCHECK(isc_app_onrun(mctx, task, sendquery, NULL));
290*00b67f09SDavid van Moolenbroek 
291*00b67f09SDavid van Moolenbroek 	ourkey = NULL;
292*00b67f09SDavid van Moolenbroek 	type = DST_TYPE_PUBLIC | DST_TYPE_PRIVATE | DST_TYPE_KEY;
293*00b67f09SDavid van Moolenbroek 	result = dst_key_fromnamedfile(ourkeyname, NULL, type, mctx, &ourkey);
294*00b67f09SDavid van Moolenbroek 	CHECK("dst_key_fromnamedfile", result);
295*00b67f09SDavid van Moolenbroek 
296*00b67f09SDavid van Moolenbroek 	isc_buffer_init(&nonce, noncedata, sizeof(noncedata));
297*00b67f09SDavid van Moolenbroek 	result = isc_entropy_getdata(ectx, noncedata, sizeof(noncedata),
298*00b67f09SDavid van Moolenbroek 				     NULL, ISC_ENTROPY_BLOCKING);
299*00b67f09SDavid van Moolenbroek 	CHECK("isc_entropy_getdata", result);
300*00b67f09SDavid van Moolenbroek 	isc_buffer_add(&nonce, sizeof(noncedata));
301*00b67f09SDavid van Moolenbroek 
302*00b67f09SDavid van Moolenbroek 	(void)isc_app_run();
303*00b67f09SDavid van Moolenbroek 
304*00b67f09SDavid van Moolenbroek 	dns_requestmgr_shutdown(requestmgr);
305*00b67f09SDavid van Moolenbroek 	dns_requestmgr_detach(&requestmgr);
306*00b67f09SDavid van Moolenbroek 	dns_dispatch_detach(&dispatchv4);
307*00b67f09SDavid van Moolenbroek 	dns_dispatchmgr_destroy(&dispatchmgr);
308*00b67f09SDavid van Moolenbroek 	isc_task_shutdown(task);
309*00b67f09SDavid van Moolenbroek 	isc_task_detach(&task);
310*00b67f09SDavid van Moolenbroek 	isc_taskmgr_destroy(&taskmgr);
311*00b67f09SDavid van Moolenbroek 	isc_socket_detach(&sock);
312*00b67f09SDavid van Moolenbroek 	isc_socketmgr_destroy(&socketmgr);
313*00b67f09SDavid van Moolenbroek 	isc_timermgr_destroy(&timermgr);
314*00b67f09SDavid van Moolenbroek 
315*00b67f09SDavid van Moolenbroek 	dst_key_free(&ourkey);
316*00b67f09SDavid van Moolenbroek 	dns_tsigkey_detach(&initialkey);
317*00b67f09SDavid van Moolenbroek 	dns_tsigkey_detach(&tsigkey);
318*00b67f09SDavid van Moolenbroek 
319*00b67f09SDavid van Moolenbroek 	dns_tkeyctx_destroy(&tctx);
320*00b67f09SDavid van Moolenbroek 
321*00b67f09SDavid van Moolenbroek 	dns_view_detach(&view);
322*00b67f09SDavid van Moolenbroek 
323*00b67f09SDavid van Moolenbroek 	isc_log_destroy(&log);
324*00b67f09SDavid van Moolenbroek 
325*00b67f09SDavid van Moolenbroek 	dst_lib_destroy();
326*00b67f09SDavid van Moolenbroek 	isc_hash_destroy();
327*00b67f09SDavid van Moolenbroek 	isc_entropy_detach(&ectx);
328*00b67f09SDavid van Moolenbroek 
329*00b67f09SDavid van Moolenbroek 	isc_mem_destroy(&mctx);
330*00b67f09SDavid van Moolenbroek 
331*00b67f09SDavid van Moolenbroek 	isc_app_finish();
332*00b67f09SDavid van Moolenbroek 
333*00b67f09SDavid van Moolenbroek 	return (0);
334*00b67f09SDavid van Moolenbroek }
335