xref: /minix/external/bsd/bind/dist/bin/tests/dst/t_dst.c (revision 00b67f09)
1*00b67f09SDavid van Moolenbroek /*	$NetBSD: t_dst.c,v 1.10 2014/12/10 04:37:53 christos Exp $	*/
2*00b67f09SDavid van Moolenbroek 
3*00b67f09SDavid van Moolenbroek /*
4*00b67f09SDavid van Moolenbroek  * Copyright (C) 2004, 2005, 2007-2009, 2011-2014  Internet Systems Consortium, Inc. ("ISC")
5*00b67f09SDavid van Moolenbroek  * Copyright (C) 1999-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: t_dst.c,v 1.60 2011/03/17 23:47:29 tbox Exp  */
21*00b67f09SDavid van Moolenbroek 
22*00b67f09SDavid van Moolenbroek #include <config.h>
23*00b67f09SDavid van Moolenbroek 
24*00b67f09SDavid van Moolenbroek #include <errno.h>
25*00b67f09SDavid van Moolenbroek #include <fcntl.h>
26*00b67f09SDavid van Moolenbroek #include <limits.h>
27*00b67f09SDavid van Moolenbroek #include <stdlib.h>
28*00b67f09SDavid van Moolenbroek 
29*00b67f09SDavid van Moolenbroek #ifndef WIN32
30*00b67f09SDavid van Moolenbroek #include <unistd.h>		/* XXX */
31*00b67f09SDavid van Moolenbroek #else
32*00b67f09SDavid van Moolenbroek #include <direct.h>
33*00b67f09SDavid van Moolenbroek #endif
34*00b67f09SDavid van Moolenbroek 
35*00b67f09SDavid van Moolenbroek #include <isc/buffer.h>
36*00b67f09SDavid van Moolenbroek #include <isc/dir.h>
37*00b67f09SDavid van Moolenbroek #include <isc/entropy.h>
38*00b67f09SDavid van Moolenbroek #include <isc/file.h>
39*00b67f09SDavid van Moolenbroek #include <isc/mem.h>
40*00b67f09SDavid van Moolenbroek #include <isc/region.h>
41*00b67f09SDavid van Moolenbroek #include <isc/stdio.h>
42*00b67f09SDavid van Moolenbroek #include <isc/string.h>
43*00b67f09SDavid van Moolenbroek #include <isc/util.h>
44*00b67f09SDavid van Moolenbroek 
45*00b67f09SDavid van Moolenbroek #include <dns/fixedname.h>
46*00b67f09SDavid van Moolenbroek #include <dns/name.h>
47*00b67f09SDavid van Moolenbroek 
48*00b67f09SDavid van Moolenbroek #include <dst/dst.h>
49*00b67f09SDavid van Moolenbroek #include <dst/result.h>
50*00b67f09SDavid van Moolenbroek 
51*00b67f09SDavid van Moolenbroek #include <tests/t_api.h>
52*00b67f09SDavid van Moolenbroek 
53*00b67f09SDavid van Moolenbroek #ifndef PATH_MAX
54*00b67f09SDavid van Moolenbroek #define PATH_MAX	256
55*00b67f09SDavid van Moolenbroek #endif
56*00b67f09SDavid van Moolenbroek 
57*00b67f09SDavid van Moolenbroek /*
58*00b67f09SDavid van Moolenbroek  * Adapted from the original dst_test.c program.
59*00b67f09SDavid van Moolenbroek  */
60*00b67f09SDavid van Moolenbroek 
61*00b67f09SDavid van Moolenbroek static void
cleandir(char * path)62*00b67f09SDavid van Moolenbroek cleandir(char *path) {
63*00b67f09SDavid van Moolenbroek 	isc_dir_t	dir;
64*00b67f09SDavid van Moolenbroek 	char		fullname[PATH_MAX + 1];
65*00b67f09SDavid van Moolenbroek 	size_t		l;
66*00b67f09SDavid van Moolenbroek 	isc_result_t	ret;
67*00b67f09SDavid van Moolenbroek 
68*00b67f09SDavid van Moolenbroek 	isc_dir_init(&dir);
69*00b67f09SDavid van Moolenbroek 	ret = isc_dir_open(&dir, path);
70*00b67f09SDavid van Moolenbroek 	if (ret != ISC_R_SUCCESS) {
71*00b67f09SDavid van Moolenbroek 		t_info("isc_dir_open(%s) failed %s\n",
72*00b67f09SDavid van Moolenbroek 		       path, isc_result_totext(ret));
73*00b67f09SDavid van Moolenbroek 		return;
74*00b67f09SDavid van Moolenbroek 	}
75*00b67f09SDavid van Moolenbroek 
76*00b67f09SDavid van Moolenbroek 	while (isc_dir_read(&dir) == ISC_R_SUCCESS) {
77*00b67f09SDavid van Moolenbroek 		if (!strcmp(dir.entry.name, "."))
78*00b67f09SDavid van Moolenbroek 			continue;
79*00b67f09SDavid van Moolenbroek 		if (!strcmp(dir.entry.name, ".."))
80*00b67f09SDavid van Moolenbroek 			continue;
81*00b67f09SDavid van Moolenbroek 		(void)strlcpy(fullname, path, sizeof(fullname));
82*00b67f09SDavid van Moolenbroek 		(void)strlcat(fullname, "/", sizeof(fullname));
83*00b67f09SDavid van Moolenbroek 		l = strlcat(fullname, dir.entry.name, sizeof(fullname));
84*00b67f09SDavid van Moolenbroek 		if (l < sizeof(fullname)) {
85*00b67f09SDavid van Moolenbroek 			if (remove(fullname))
86*00b67f09SDavid van Moolenbroek 				t_info("remove(%s) failed %d\n", fullname,
87*00b67f09SDavid van Moolenbroek 				       errno);
88*00b67f09SDavid van Moolenbroek 		} else
89*00b67f09SDavid van Moolenbroek 		       t_info("unable to remove '%s/%s': path too long\n",
90*00b67f09SDavid van Moolenbroek 			      path, dir.entry.name);
91*00b67f09SDavid van Moolenbroek 
92*00b67f09SDavid van Moolenbroek 	}
93*00b67f09SDavid van Moolenbroek 	isc_dir_close(&dir);
94*00b67f09SDavid van Moolenbroek 	if (rmdir(path))
95*00b67f09SDavid van Moolenbroek 		t_info("rmdir(%s) failed %d\n", path, errno);
96*00b67f09SDavid van Moolenbroek 
97*00b67f09SDavid van Moolenbroek 	return;
98*00b67f09SDavid van Moolenbroek }
99*00b67f09SDavid van Moolenbroek 
100*00b67f09SDavid van Moolenbroek static void
use(dst_key_t * key,isc_mem_t * mctx,isc_result_t exp_result,int * nfails)101*00b67f09SDavid van Moolenbroek use(dst_key_t *key, isc_mem_t *mctx, isc_result_t exp_result, int *nfails) {
102*00b67f09SDavid van Moolenbroek 
103*00b67f09SDavid van Moolenbroek 	isc_result_t ret;
104*00b67f09SDavid van Moolenbroek 	const char *data = "This is some data";
105*00b67f09SDavid van Moolenbroek 	unsigned char sig[512];
106*00b67f09SDavid van Moolenbroek 	isc_buffer_t databuf, sigbuf;
107*00b67f09SDavid van Moolenbroek 	isc_region_t datareg, sigreg;
108*00b67f09SDavid van Moolenbroek 	dst_context_t *ctx = NULL;
109*00b67f09SDavid van Moolenbroek 
110*00b67f09SDavid van Moolenbroek 	isc_buffer_init(&sigbuf, sig, sizeof(sig));
111*00b67f09SDavid van Moolenbroek 	isc_buffer_constinit(&databuf, data, strlen(data));
112*00b67f09SDavid van Moolenbroek 	isc_buffer_add(&databuf, strlen(data));
113*00b67f09SDavid van Moolenbroek 	isc_buffer_usedregion(&databuf, &datareg);
114*00b67f09SDavid van Moolenbroek 
115*00b67f09SDavid van Moolenbroek 	ret = dst_context_create3(key, mctx,
116*00b67f09SDavid van Moolenbroek 				  DNS_LOGCATEGORY_GENERAL, ISC_TRUE, &ctx);
117*00b67f09SDavid van Moolenbroek 	if (ret != exp_result) {
118*00b67f09SDavid van Moolenbroek 		t_info("dst_context_create(%d) returned (%s) expected (%s)\n",
119*00b67f09SDavid van Moolenbroek 		       dst_key_alg(key), dst_result_totext(ret),
120*00b67f09SDavid van Moolenbroek 		       dst_result_totext(exp_result));
121*00b67f09SDavid van Moolenbroek 		++*nfails;
122*00b67f09SDavid van Moolenbroek 		return;
123*00b67f09SDavid van Moolenbroek 	}
124*00b67f09SDavid van Moolenbroek 	if (exp_result != ISC_R_SUCCESS)
125*00b67f09SDavid van Moolenbroek 		return;
126*00b67f09SDavid van Moolenbroek 	ret = dst_context_adddata(ctx, &datareg);
127*00b67f09SDavid van Moolenbroek 	if (ret != ISC_R_SUCCESS) {
128*00b67f09SDavid van Moolenbroek 		t_info("dst_context_adddata(%d) returned (%s)\n",
129*00b67f09SDavid van Moolenbroek 		       dst_key_alg(key), dst_result_totext(ret));
130*00b67f09SDavid van Moolenbroek 		++*nfails;
131*00b67f09SDavid van Moolenbroek 		dst_context_destroy(&ctx);
132*00b67f09SDavid van Moolenbroek 		return;
133*00b67f09SDavid van Moolenbroek 	}
134*00b67f09SDavid van Moolenbroek 	ret = dst_context_sign(ctx, &sigbuf);
135*00b67f09SDavid van Moolenbroek 	if (ret != ISC_R_SUCCESS) {
136*00b67f09SDavid van Moolenbroek 		t_info("dst_context_sign(%d) returned (%s)\n",
137*00b67f09SDavid van Moolenbroek 		       dst_key_alg(key), dst_result_totext(ret));
138*00b67f09SDavid van Moolenbroek 		++*nfails;
139*00b67f09SDavid van Moolenbroek 		dst_context_destroy(&ctx);
140*00b67f09SDavid van Moolenbroek 		return;
141*00b67f09SDavid van Moolenbroek 	}
142*00b67f09SDavid van Moolenbroek 	dst_context_destroy(&ctx);
143*00b67f09SDavid van Moolenbroek 
144*00b67f09SDavid van Moolenbroek 	isc_buffer_remainingregion(&sigbuf, &sigreg);
145*00b67f09SDavid van Moolenbroek 	ret = dst_context_create3(key, mctx,
146*00b67f09SDavid van Moolenbroek 				  DNS_LOGCATEGORY_GENERAL, ISC_FALSE, &ctx);
147*00b67f09SDavid van Moolenbroek 	if (ret != ISC_R_SUCCESS) {
148*00b67f09SDavid van Moolenbroek 		t_info("dst_context_create(%d) returned (%s)\n",
149*00b67f09SDavid van Moolenbroek 		       dst_key_alg(key), dst_result_totext(ret));
150*00b67f09SDavid van Moolenbroek 		++*nfails;
151*00b67f09SDavid van Moolenbroek 		return;
152*00b67f09SDavid van Moolenbroek 	}
153*00b67f09SDavid van Moolenbroek 	ret = dst_context_adddata(ctx, &datareg);
154*00b67f09SDavid van Moolenbroek 	if (ret != ISC_R_SUCCESS) {
155*00b67f09SDavid van Moolenbroek 		t_info("dst_context_adddata(%d) returned (%s)\n",
156*00b67f09SDavid van Moolenbroek 		       dst_key_alg(key), dst_result_totext(ret));
157*00b67f09SDavid van Moolenbroek 		++*nfails;
158*00b67f09SDavid van Moolenbroek 		dst_context_destroy(&ctx);
159*00b67f09SDavid van Moolenbroek 		return;
160*00b67f09SDavid van Moolenbroek 	}
161*00b67f09SDavid van Moolenbroek 	ret = dst_context_verify(ctx, &sigreg);
162*00b67f09SDavid van Moolenbroek 	if (ret != exp_result) {
163*00b67f09SDavid van Moolenbroek 		t_info("dst_context_verify(%d) returned (%s) expected (%s)\n",
164*00b67f09SDavid van Moolenbroek 		       dst_key_alg(key), dst_result_totext(ret),
165*00b67f09SDavid van Moolenbroek 		       dst_result_totext(exp_result));
166*00b67f09SDavid van Moolenbroek 		++*nfails;
167*00b67f09SDavid van Moolenbroek 		dst_context_destroy(&ctx);
168*00b67f09SDavid van Moolenbroek 		return;
169*00b67f09SDavid van Moolenbroek 	}
170*00b67f09SDavid van Moolenbroek 	dst_context_destroy(&ctx);
171*00b67f09SDavid van Moolenbroek }
172*00b67f09SDavid van Moolenbroek 
173*00b67f09SDavid van Moolenbroek static void
dh(dns_name_t * name1,int id1,dns_name_t * name2,int id2,isc_mem_t * mctx,isc_result_t exp_result,int * nfails,int * nprobs)174*00b67f09SDavid van Moolenbroek dh(dns_name_t *name1, int id1, dns_name_t *name2, int id2, isc_mem_t *mctx,
175*00b67f09SDavid van Moolenbroek    isc_result_t exp_result, int *nfails, int *nprobs)
176*00b67f09SDavid van Moolenbroek {
177*00b67f09SDavid van Moolenbroek 	dst_key_t	*key1 = NULL, *key2 = NULL;
178*00b67f09SDavid van Moolenbroek 	isc_result_t	ret;
179*00b67f09SDavid van Moolenbroek 	char		current[PATH_MAX + 1];
180*00b67f09SDavid van Moolenbroek 	char		tmp[PATH_MAX + 1];
181*00b67f09SDavid van Moolenbroek 	char		*p;
182*00b67f09SDavid van Moolenbroek 	int		alg = DST_ALG_DH;
183*00b67f09SDavid van Moolenbroek 	int		type = DST_TYPE_PUBLIC|DST_TYPE_PRIVATE|DST_TYPE_KEY;
184*00b67f09SDavid van Moolenbroek 	unsigned char	array1[1024], array2[1024];
185*00b67f09SDavid van Moolenbroek 	isc_buffer_t	b1, b2;
186*00b67f09SDavid van Moolenbroek 	isc_region_t	r1, r2;
187*00b67f09SDavid van Moolenbroek 
188*00b67f09SDavid van Moolenbroek 	UNUSED(exp_result);
189*00b67f09SDavid van Moolenbroek 
190*00b67f09SDavid van Moolenbroek 	p = getcwd(current, PATH_MAX);;
191*00b67f09SDavid van Moolenbroek 	if (p == NULL) {
192*00b67f09SDavid van Moolenbroek 		t_info("getcwd failed %d\n", errno);
193*00b67f09SDavid van Moolenbroek 		++*nprobs;
194*00b67f09SDavid van Moolenbroek 		goto cleanup;
195*00b67f09SDavid van Moolenbroek 	}
196*00b67f09SDavid van Moolenbroek 
197*00b67f09SDavid van Moolenbroek 	ret = dst_key_fromfile(name1, id1, alg, type, current, mctx, &key1);
198*00b67f09SDavid van Moolenbroek 	if (ret != ISC_R_SUCCESS) {
199*00b67f09SDavid van Moolenbroek 		t_info("dst_key_fromfile(%d) returned: %s\n",
200*00b67f09SDavid van Moolenbroek 		       alg, dst_result_totext(ret));
201*00b67f09SDavid van Moolenbroek 		++*nfails;
202*00b67f09SDavid van Moolenbroek 		goto cleanup;
203*00b67f09SDavid van Moolenbroek 	}
204*00b67f09SDavid van Moolenbroek 
205*00b67f09SDavid van Moolenbroek 	ret = dst_key_fromfile(name2, id2, alg, type, current, mctx, &key2);
206*00b67f09SDavid van Moolenbroek 	if (ret != ISC_R_SUCCESS) {
207*00b67f09SDavid van Moolenbroek 		t_info("dst_key_fromfile(%d) returned: %s\n",
208*00b67f09SDavid van Moolenbroek 		       alg, dst_result_totext(ret));
209*00b67f09SDavid van Moolenbroek 		++*nfails;
210*00b67f09SDavid van Moolenbroek 		goto cleanup;
211*00b67f09SDavid van Moolenbroek 	}
212*00b67f09SDavid van Moolenbroek 
213*00b67f09SDavid van Moolenbroek #ifndef WIN32
214*00b67f09SDavid van Moolenbroek 	ret = isc_file_mktemplate("/tmp/", tmp, sizeof(tmp));
215*00b67f09SDavid van Moolenbroek #else
216*00b67f09SDavid van Moolenbroek 	ret = isc_file_mktemplate(getenv("TEMP"), tmp, sizeof(tmp));
217*00b67f09SDavid van Moolenbroek #endif
218*00b67f09SDavid van Moolenbroek 	if (ret != ISC_R_SUCCESS) {
219*00b67f09SDavid van Moolenbroek 		t_info("isc_file_mktemplate failed %s\n",
220*00b67f09SDavid van Moolenbroek 		       isc_result_totext(ret));
221*00b67f09SDavid van Moolenbroek 		++*nprobs;
222*00b67f09SDavid van Moolenbroek 		goto cleanup;
223*00b67f09SDavid van Moolenbroek 	}
224*00b67f09SDavid van Moolenbroek 
225*00b67f09SDavid van Moolenbroek 	ret = isc_dir_createunique(tmp);
226*00b67f09SDavid van Moolenbroek 	if (ret != ISC_R_SUCCESS) {
227*00b67f09SDavid van Moolenbroek 		t_info("isc_dir_createunique failed %s\n",
228*00b67f09SDavid van Moolenbroek 		       isc_result_totext(ret));
229*00b67f09SDavid van Moolenbroek 		++*nprobs;
230*00b67f09SDavid van Moolenbroek 		goto cleanup;
231*00b67f09SDavid van Moolenbroek 	}
232*00b67f09SDavid van Moolenbroek 
233*00b67f09SDavid van Moolenbroek 	ret = dst_key_tofile(key1, type, tmp);
234*00b67f09SDavid van Moolenbroek 	if (ret != 0) {
235*00b67f09SDavid van Moolenbroek 		t_info("dst_key_tofile(%d) returned: %s\n",
236*00b67f09SDavid van Moolenbroek 		       alg, dst_result_totext(ret));
237*00b67f09SDavid van Moolenbroek 		++*nfails;
238*00b67f09SDavid van Moolenbroek 		goto cleanup;
239*00b67f09SDavid van Moolenbroek 	}
240*00b67f09SDavid van Moolenbroek 
241*00b67f09SDavid van Moolenbroek 	ret = dst_key_tofile(key2, type, tmp);
242*00b67f09SDavid van Moolenbroek 	if (ret != 0) {
243*00b67f09SDavid van Moolenbroek 		t_info("dst_key_tofile(%d) returned: %s\n",
244*00b67f09SDavid van Moolenbroek 		       alg, dst_result_totext(ret));
245*00b67f09SDavid van Moolenbroek 		++*nfails;
246*00b67f09SDavid van Moolenbroek 		goto cleanup;
247*00b67f09SDavid van Moolenbroek 	}
248*00b67f09SDavid van Moolenbroek 
249*00b67f09SDavid van Moolenbroek 	cleandir(tmp);
250*00b67f09SDavid van Moolenbroek 
251*00b67f09SDavid van Moolenbroek 	isc_buffer_init(&b1, array1, sizeof(array1));
252*00b67f09SDavid van Moolenbroek 	ret = dst_key_computesecret(key1, key2, &b1);
253*00b67f09SDavid van Moolenbroek 	if (ret != 0) {
254*00b67f09SDavid van Moolenbroek 		t_info("dst_computesecret() returned: %s\n",
255*00b67f09SDavid van Moolenbroek 		       dst_result_totext(ret));
256*00b67f09SDavid van Moolenbroek 		++*nfails;
257*00b67f09SDavid van Moolenbroek 		goto cleanup;
258*00b67f09SDavid van Moolenbroek 	}
259*00b67f09SDavid van Moolenbroek 
260*00b67f09SDavid van Moolenbroek 	isc_buffer_init(&b2, array2, sizeof(array2));
261*00b67f09SDavid van Moolenbroek 	ret = dst_key_computesecret(key2, key1, &b2);
262*00b67f09SDavid van Moolenbroek 	if (ret != 0) {
263*00b67f09SDavid van Moolenbroek 		t_info("dst_computesecret() returned: %s\n",
264*00b67f09SDavid van Moolenbroek 		       dst_result_totext(ret));
265*00b67f09SDavid van Moolenbroek 		++*nfails;
266*00b67f09SDavid van Moolenbroek 		goto cleanup;
267*00b67f09SDavid van Moolenbroek 	}
268*00b67f09SDavid van Moolenbroek 
269*00b67f09SDavid van Moolenbroek 	isc_buffer_usedregion(&b1, &r1);
270*00b67f09SDavid van Moolenbroek 	isc_buffer_usedregion(&b2, &r2);
271*00b67f09SDavid van Moolenbroek 	if (r1.length != r2.length || memcmp(r1.base, r2.base, r1.length) != 0)
272*00b67f09SDavid van Moolenbroek 	{
273*00b67f09SDavid van Moolenbroek 		t_info("computed secrets don't match\n");
274*00b67f09SDavid van Moolenbroek 		++*nfails;
275*00b67f09SDavid van Moolenbroek 		goto cleanup;
276*00b67f09SDavid van Moolenbroek 	}
277*00b67f09SDavid van Moolenbroek 
278*00b67f09SDavid van Moolenbroek  cleanup:
279*00b67f09SDavid van Moolenbroek 	if (key1 != NULL)
280*00b67f09SDavid van Moolenbroek 		dst_key_free(&key1);
281*00b67f09SDavid van Moolenbroek 	if (key2 != NULL)
282*00b67f09SDavid van Moolenbroek 		dst_key_free(&key2);
283*00b67f09SDavid van Moolenbroek }
284*00b67f09SDavid van Moolenbroek 
285*00b67f09SDavid van Moolenbroek static void
io(dns_name_t * name,isc_uint16_t id,isc_uint16_t alg,int type,isc_mem_t * mctx,isc_result_t exp_result,int * nfails,int * nprobs)286*00b67f09SDavid van Moolenbroek io(dns_name_t *name, isc_uint16_t id, isc_uint16_t alg, int type,
287*00b67f09SDavid van Moolenbroek    isc_mem_t *mctx, isc_result_t exp_result, int *nfails, int *nprobs)
288*00b67f09SDavid van Moolenbroek {
289*00b67f09SDavid van Moolenbroek 	dst_key_t	*key = NULL;
290*00b67f09SDavid van Moolenbroek 	isc_result_t	ret;
291*00b67f09SDavid van Moolenbroek 	char		current[PATH_MAX + 1];
292*00b67f09SDavid van Moolenbroek 	char		tmp[PATH_MAX + 1];
293*00b67f09SDavid van Moolenbroek 	char		*p;
294*00b67f09SDavid van Moolenbroek 
295*00b67f09SDavid van Moolenbroek 	p = getcwd(current, PATH_MAX);;
296*00b67f09SDavid van Moolenbroek 	if (p == NULL) {
297*00b67f09SDavid van Moolenbroek 		t_info("getcwd failed %d\n", errno);
298*00b67f09SDavid van Moolenbroek 		++*nprobs;
299*00b67f09SDavid van Moolenbroek 		goto failure;
300*00b67f09SDavid van Moolenbroek 	}
301*00b67f09SDavid van Moolenbroek 
302*00b67f09SDavid van Moolenbroek 	ret = dst_key_fromfile(name, id, alg, type, current, mctx, &key);
303*00b67f09SDavid van Moolenbroek 	if (ret != ISC_R_SUCCESS) {
304*00b67f09SDavid van Moolenbroek 		t_info("dst_key_fromfile(%d) returned: %s\n",
305*00b67f09SDavid van Moolenbroek 		       alg, dst_result_totext(ret));
306*00b67f09SDavid van Moolenbroek 		++*nfails;
307*00b67f09SDavid van Moolenbroek 		goto failure;
308*00b67f09SDavid van Moolenbroek 	}
309*00b67f09SDavid van Moolenbroek 
310*00b67f09SDavid van Moolenbroek 	if (dst_key_id(key) != id) {
311*00b67f09SDavid van Moolenbroek 		t_info("key ID incorrect\n");
312*00b67f09SDavid van Moolenbroek 		++*nfails;
313*00b67f09SDavid van Moolenbroek 		goto failure;
314*00b67f09SDavid van Moolenbroek 	}
315*00b67f09SDavid van Moolenbroek 
316*00b67f09SDavid van Moolenbroek 	if (dst_key_alg(key) != alg) {
317*00b67f09SDavid van Moolenbroek 		t_info("key algorithm incorrect\n");
318*00b67f09SDavid van Moolenbroek 		++*nfails;
319*00b67f09SDavid van Moolenbroek 		goto failure;
320*00b67f09SDavid van Moolenbroek 	}
321*00b67f09SDavid van Moolenbroek 
322*00b67f09SDavid van Moolenbroek 	if (dst_key_getttl(key) != 0) {
323*00b67f09SDavid van Moolenbroek 		t_info("initial key TTL incorrect\n");
324*00b67f09SDavid van Moolenbroek 		++*nfails;
325*00b67f09SDavid van Moolenbroek 		goto failure;
326*00b67f09SDavid van Moolenbroek 	}
327*00b67f09SDavid van Moolenbroek 
328*00b67f09SDavid van Moolenbroek #ifndef WIN32
329*00b67f09SDavid van Moolenbroek 	ret = isc_file_mktemplate("/tmp/", tmp, sizeof(tmp));
330*00b67f09SDavid van Moolenbroek #else
331*00b67f09SDavid van Moolenbroek 	ret = isc_file_mktemplate(getenv("TEMP"), tmp, sizeof(tmp));
332*00b67f09SDavid van Moolenbroek #endif
333*00b67f09SDavid van Moolenbroek 	if (ret != ISC_R_SUCCESS) {
334*00b67f09SDavid van Moolenbroek 		t_info("isc_file_mktemplate failed %s\n",
335*00b67f09SDavid van Moolenbroek 		       isc_result_totext(ret));
336*00b67f09SDavid van Moolenbroek 		++*nprobs;
337*00b67f09SDavid van Moolenbroek 		goto failure;
338*00b67f09SDavid van Moolenbroek 	}
339*00b67f09SDavid van Moolenbroek 
340*00b67f09SDavid van Moolenbroek 	ret = isc_dir_createunique(tmp);
341*00b67f09SDavid van Moolenbroek 	if (ret != ISC_R_SUCCESS) {
342*00b67f09SDavid van Moolenbroek 		t_info("mkdir failed %d\n", errno);
343*00b67f09SDavid van Moolenbroek 		++*nprobs;
344*00b67f09SDavid van Moolenbroek 		goto failure;
345*00b67f09SDavid van Moolenbroek 	}
346*00b67f09SDavid van Moolenbroek 
347*00b67f09SDavid van Moolenbroek 	ret = dst_key_tofile(key, type, tmp);
348*00b67f09SDavid van Moolenbroek 	if (ret != 0) {
349*00b67f09SDavid van Moolenbroek 		t_info("dst_key_tofile(%d) returned: %s\n",
350*00b67f09SDavid van Moolenbroek 		       alg, dst_result_totext(ret));
351*00b67f09SDavid van Moolenbroek 		++*nfails;
352*00b67f09SDavid van Moolenbroek 		goto failure;
353*00b67f09SDavid van Moolenbroek 	}
354*00b67f09SDavid van Moolenbroek 
355*00b67f09SDavid van Moolenbroek 	if (dst_key_alg(key) != DST_ALG_DH)
356*00b67f09SDavid van Moolenbroek 		use(key, mctx, exp_result, nfails);
357*00b67f09SDavid van Moolenbroek 
358*00b67f09SDavid van Moolenbroek 	/*
359*00b67f09SDavid van Moolenbroek 	 * Skip the rest of this test if we weren't expecting
360*00b67f09SDavid van Moolenbroek 	 * the read to be successful.
361*00b67f09SDavid van Moolenbroek 	 */
362*00b67f09SDavid van Moolenbroek 	if (exp_result != ISC_R_SUCCESS)
363*00b67f09SDavid van Moolenbroek 		goto cleanup;
364*00b67f09SDavid van Moolenbroek 
365*00b67f09SDavid van Moolenbroek 	dst_key_setttl(key, 3600);
366*00b67f09SDavid van Moolenbroek 	ret = dst_key_tofile(key, type, tmp);
367*00b67f09SDavid van Moolenbroek 	if (ret != 0) {
368*00b67f09SDavid van Moolenbroek 		t_info("dst_key_tofile(%d) returned: %s\n",
369*00b67f09SDavid van Moolenbroek 		       alg, dst_result_totext(ret));
370*00b67f09SDavid van Moolenbroek 		++*nfails;
371*00b67f09SDavid van Moolenbroek 		goto failure;
372*00b67f09SDavid van Moolenbroek 	}
373*00b67f09SDavid van Moolenbroek 
374*00b67f09SDavid van Moolenbroek 	/* Reread key to confirm TTL was changed */
375*00b67f09SDavid van Moolenbroek 	dst_key_free(&key);
376*00b67f09SDavid van Moolenbroek 	ret = dst_key_fromfile(name, id, alg, type, tmp, mctx, &key);
377*00b67f09SDavid van Moolenbroek 	if (ret != ISC_R_SUCCESS) {
378*00b67f09SDavid van Moolenbroek 		t_info("dst_key_fromfile(%d) returned: %s\n",
379*00b67f09SDavid van Moolenbroek 		       alg, dst_result_totext(ret));
380*00b67f09SDavid van Moolenbroek 		++*nfails;
381*00b67f09SDavid van Moolenbroek 		goto failure;
382*00b67f09SDavid van Moolenbroek 	}
383*00b67f09SDavid van Moolenbroek 
384*00b67f09SDavid van Moolenbroek 	if (dst_key_getttl(key) != 3600) {
385*00b67f09SDavid van Moolenbroek 		t_info("modified key TTL incorrect\n");
386*00b67f09SDavid van Moolenbroek 		++*nfails;
387*00b67f09SDavid van Moolenbroek 		goto failure;
388*00b67f09SDavid van Moolenbroek 	}
389*00b67f09SDavid van Moolenbroek 
390*00b67f09SDavid van Moolenbroek  cleanup:
391*00b67f09SDavid van Moolenbroek 	cleandir(tmp);
392*00b67f09SDavid van Moolenbroek 
393*00b67f09SDavid van Moolenbroek  failure:
394*00b67f09SDavid van Moolenbroek 	dst_key_free(&key);
395*00b67f09SDavid van Moolenbroek }
396*00b67f09SDavid van Moolenbroek 
397*00b67f09SDavid van Moolenbroek static void
generate(int alg,isc_mem_t * mctx,int size,int * nfails)398*00b67f09SDavid van Moolenbroek generate(int alg, isc_mem_t *mctx, int size, int *nfails) {
399*00b67f09SDavid van Moolenbroek 	isc_result_t ret;
400*00b67f09SDavid van Moolenbroek 	dst_key_t *key = NULL;
401*00b67f09SDavid van Moolenbroek 
402*00b67f09SDavid van Moolenbroek 	ret = dst_key_generate(dns_rootname, alg, size, 0, 0, 0,
403*00b67f09SDavid van Moolenbroek 			       dns_rdataclass_in, mctx, &key);
404*00b67f09SDavid van Moolenbroek 	if (ret != ISC_R_SUCCESS) {
405*00b67f09SDavid van Moolenbroek 		t_info("dst_key_generate(%d) returned: %s\n", alg,
406*00b67f09SDavid van Moolenbroek 		       dst_result_totext(ret));
407*00b67f09SDavid van Moolenbroek 		++*nfails;
408*00b67f09SDavid van Moolenbroek 		goto cleanup;
409*00b67f09SDavid van Moolenbroek 	}
410*00b67f09SDavid van Moolenbroek 
411*00b67f09SDavid van Moolenbroek 	if (alg != DST_ALG_DH)
412*00b67f09SDavid van Moolenbroek 		use(key, mctx, ISC_R_SUCCESS, nfails);
413*00b67f09SDavid van Moolenbroek  cleanup:
414*00b67f09SDavid van Moolenbroek 	if (key != NULL)
415*00b67f09SDavid van Moolenbroek 		dst_key_free(&key);
416*00b67f09SDavid van Moolenbroek }
417*00b67f09SDavid van Moolenbroek 
418*00b67f09SDavid van Moolenbroek #define	DBUFSIZ	25
419*00b67f09SDavid van Moolenbroek 
420*00b67f09SDavid van Moolenbroek static const char *a1 =
421*00b67f09SDavid van Moolenbroek 		"the dst module provides the capability to "
422*00b67f09SDavid van Moolenbroek 		"generate, store and retrieve public and private keys, "
423*00b67f09SDavid van Moolenbroek 		"sign and verify data using the RSA, DSA and MD5 algorithms, "
424*00b67f09SDavid van Moolenbroek 		"and compute Diffie-Hellman shared secrets.";
425*00b67f09SDavid van Moolenbroek static void
t1(void)426*00b67f09SDavid van Moolenbroek t1(void) {
427*00b67f09SDavid van Moolenbroek 	isc_mem_t	*mctx;
428*00b67f09SDavid van Moolenbroek 	isc_entropy_t	*ectx;
429*00b67f09SDavid van Moolenbroek 	int		nfails;
430*00b67f09SDavid van Moolenbroek 	int		nprobs;
431*00b67f09SDavid van Moolenbroek 	int		result;
432*00b67f09SDavid van Moolenbroek 	isc_result_t	isc_result;
433*00b67f09SDavid van Moolenbroek 	dns_fixedname_t	fname;
434*00b67f09SDavid van Moolenbroek 	dns_name_t	*name;
435*00b67f09SDavid van Moolenbroek 	isc_buffer_t	b;
436*00b67f09SDavid van Moolenbroek 
437*00b67f09SDavid van Moolenbroek 	t_assert("dst", 1, T_REQUIRED, "%s", a1);
438*00b67f09SDavid van Moolenbroek 
439*00b67f09SDavid van Moolenbroek 	nfails = 0;
440*00b67f09SDavid van Moolenbroek 	nprobs = 0;
441*00b67f09SDavid van Moolenbroek 	mctx = NULL;
442*00b67f09SDavid van Moolenbroek 	isc_result = isc_mem_create(0, 0, &mctx);
443*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
444*00b67f09SDavid van Moolenbroek 		t_info("isc_mem_create failed %s\n",
445*00b67f09SDavid van Moolenbroek 		       isc_result_totext(isc_result));
446*00b67f09SDavid van Moolenbroek 		t_result(T_UNRESOLVED);
447*00b67f09SDavid van Moolenbroek 		return;
448*00b67f09SDavid van Moolenbroek 	}
449*00b67f09SDavid van Moolenbroek 	ectx = NULL;
450*00b67f09SDavid van Moolenbroek 	isc_result = isc_entropy_create(mctx, &ectx);
451*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
452*00b67f09SDavid van Moolenbroek 		t_info("isc_entropy_create failed %s\n",
453*00b67f09SDavid van Moolenbroek 		       isc_result_totext(isc_result));
454*00b67f09SDavid van Moolenbroek 		t_result(T_UNRESOLVED);
455*00b67f09SDavid van Moolenbroek 		return;
456*00b67f09SDavid van Moolenbroek 	}
457*00b67f09SDavid van Moolenbroek 	isc_result = isc_entropy_createfilesource(ectx, "randomfile");
458*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
459*00b67f09SDavid van Moolenbroek 		t_info("isc_entropy_create failed %s\n",
460*00b67f09SDavid van Moolenbroek 		       isc_result_totext(isc_result));
461*00b67f09SDavid van Moolenbroek 		t_result(T_UNRESOLVED);
462*00b67f09SDavid van Moolenbroek 		return;
463*00b67f09SDavid van Moolenbroek 	}
464*00b67f09SDavid van Moolenbroek 	isc_result = dst_lib_init(mctx, ectx, ISC_ENTROPY_BLOCKING);
465*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
466*00b67f09SDavid van Moolenbroek 		t_info("dst_lib_init failed %s\n",
467*00b67f09SDavid van Moolenbroek 		       isc_result_totext(isc_result));
468*00b67f09SDavid van Moolenbroek 		t_result(T_UNRESOLVED);
469*00b67f09SDavid van Moolenbroek 		return;
470*00b67f09SDavid van Moolenbroek 	}
471*00b67f09SDavid van Moolenbroek 
472*00b67f09SDavid van Moolenbroek 	if (!dst_algorithm_supported(DST_ALG_RSAMD5)) {
473*00b67f09SDavid van Moolenbroek 		dst_lib_destroy();
474*00b67f09SDavid van Moolenbroek 		t_info("library built without crypto support\n");
475*00b67f09SDavid van Moolenbroek 		t_result(T_SKIPPED);
476*00b67f09SDavid van Moolenbroek 		return;
477*00b67f09SDavid van Moolenbroek 	}
478*00b67f09SDavid van Moolenbroek 
479*00b67f09SDavid van Moolenbroek 	t_info("testing use of stored keys [1]\n");
480*00b67f09SDavid van Moolenbroek 
481*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&fname);
482*00b67f09SDavid van Moolenbroek 	name = dns_fixedname_name(&fname);
483*00b67f09SDavid van Moolenbroek 	isc_buffer_constinit(&b, "test.", 5);
484*00b67f09SDavid van Moolenbroek 	isc_buffer_add(&b, 5);
485*00b67f09SDavid van Moolenbroek 	isc_result = dns_name_fromtext(name, &b, NULL, 0, NULL);
486*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
487*00b67f09SDavid van Moolenbroek 		t_info("dns_name_fromtext failed %s\n",
488*00b67f09SDavid van Moolenbroek 		       isc_result_totext(isc_result));
489*00b67f09SDavid van Moolenbroek 		t_result(T_UNRESOLVED);
490*00b67f09SDavid van Moolenbroek 		return;
491*00b67f09SDavid van Moolenbroek 	}
492*00b67f09SDavid van Moolenbroek 	io(name, 23616, DST_ALG_DSA, DST_TYPE_PRIVATE|DST_TYPE_PUBLIC,
493*00b67f09SDavid van Moolenbroek 			mctx, ISC_R_SUCCESS, &nfails, &nprobs);
494*00b67f09SDavid van Moolenbroek 	t_info("testing use of stored keys [2]\n");
495*00b67f09SDavid van Moolenbroek 	io(name, 54622, DST_ALG_RSAMD5, DST_TYPE_PRIVATE|DST_TYPE_PUBLIC,
496*00b67f09SDavid van Moolenbroek 			mctx, ISC_R_SUCCESS, &nfails, &nprobs);
497*00b67f09SDavid van Moolenbroek 
498*00b67f09SDavid van Moolenbroek 	t_info("testing use of stored keys [3]\n");
499*00b67f09SDavid van Moolenbroek 	io(name, 49667, DST_ALG_DSA, DST_TYPE_PRIVATE|DST_TYPE_PUBLIC,
500*00b67f09SDavid van Moolenbroek 			mctx, DST_R_NULLKEY, &nfails, &nprobs);
501*00b67f09SDavid van Moolenbroek 	t_info("testing use of stored keys [4]\n");
502*00b67f09SDavid van Moolenbroek 	io(name, 2, DST_ALG_RSAMD5, DST_TYPE_PRIVATE|DST_TYPE_PUBLIC,
503*00b67f09SDavid van Moolenbroek 			mctx, DST_R_NULLKEY, &nfails, &nprobs);
504*00b67f09SDavid van Moolenbroek 
505*00b67f09SDavid van Moolenbroek 	isc_buffer_constinit(&b, "dh.", 3);
506*00b67f09SDavid van Moolenbroek 	isc_buffer_add(&b, 3);
507*00b67f09SDavid van Moolenbroek 	isc_result = dns_name_fromtext(name, &b, NULL, 0, NULL);
508*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
509*00b67f09SDavid van Moolenbroek 		t_info("dns_name_fromtext failed %s\n",
510*00b67f09SDavid van Moolenbroek 		       isc_result_totext(isc_result));
511*00b67f09SDavid van Moolenbroek 		t_result(T_UNRESOLVED);
512*00b67f09SDavid van Moolenbroek 		return;
513*00b67f09SDavid van Moolenbroek 	}
514*00b67f09SDavid van Moolenbroek 
515*00b67f09SDavid van Moolenbroek 	dh(name, 18602, name, 48957, mctx, ISC_R_SUCCESS, &nfails, &nprobs);
516*00b67f09SDavid van Moolenbroek 
517*00b67f09SDavid van Moolenbroek 	t_info("testing use of generated keys\n");
518*00b67f09SDavid van Moolenbroek 	generate(DST_ALG_RSAMD5, mctx, 512, &nfails);
519*00b67f09SDavid van Moolenbroek 	generate(DST_ALG_DSA, mctx, 512, &nfails);
520*00b67f09SDavid van Moolenbroek 	generate(DST_ALG_DH, mctx, 512, &nfails);
521*00b67f09SDavid van Moolenbroek 	/*
522*00b67f09SDavid van Moolenbroek 	 * This one uses a constant.
523*00b67f09SDavid van Moolenbroek 	 */
524*00b67f09SDavid van Moolenbroek 	generate(DST_ALG_DH, mctx, 768, &nfails);
525*00b67f09SDavid van Moolenbroek 	generate(DST_ALG_HMACMD5, mctx, 512, &nfails);
526*00b67f09SDavid van Moolenbroek 
527*00b67f09SDavid van Moolenbroek 	dst_lib_destroy();
528*00b67f09SDavid van Moolenbroek 
529*00b67f09SDavid van Moolenbroek 	isc_entropy_detach(&ectx);
530*00b67f09SDavid van Moolenbroek 
531*00b67f09SDavid van Moolenbroek 	isc_mem_destroy(&mctx);
532*00b67f09SDavid van Moolenbroek 
533*00b67f09SDavid van Moolenbroek 	result = T_UNRESOLVED;
534*00b67f09SDavid van Moolenbroek 	if ((nfails == 0) && (nprobs == 0))
535*00b67f09SDavid van Moolenbroek 		result = T_PASS;
536*00b67f09SDavid van Moolenbroek 	else if (nfails)
537*00b67f09SDavid van Moolenbroek 		result = T_FAIL;
538*00b67f09SDavid van Moolenbroek 	t_result(result);
539*00b67f09SDavid van Moolenbroek 
540*00b67f09SDavid van Moolenbroek }
541*00b67f09SDavid van Moolenbroek 
542*00b67f09SDavid van Moolenbroek #define	T_SIGMAX	512
543*00b67f09SDavid van Moolenbroek 
544*00b67f09SDavid van Moolenbroek #undef	NEWSIG	/* Define NEWSIG to generate the original signature file. */
545*00b67f09SDavid van Moolenbroek 
546*00b67f09SDavid van Moolenbroek #ifdef	NEWSIG
547*00b67f09SDavid van Moolenbroek 
548*00b67f09SDavid van Moolenbroek /*
549*00b67f09SDavid van Moolenbroek  * Write a sig in buf to file at path.
550*00b67f09SDavid van Moolenbroek  */
551*00b67f09SDavid van Moolenbroek static int
sig_tofile(char * path,isc_buffer_t * buf)552*00b67f09SDavid van Moolenbroek sig_tofile(char *path, isc_buffer_t *buf) {
553*00b67f09SDavid van Moolenbroek 	int		rval;
554*00b67f09SDavid van Moolenbroek 	int		fd;
555*00b67f09SDavid van Moolenbroek 	int		len;
556*00b67f09SDavid van Moolenbroek 	int		nprobs;
557*00b67f09SDavid van Moolenbroek 	int		cnt;
558*00b67f09SDavid van Moolenbroek 	unsigned char	c;
559*00b67f09SDavid van Moolenbroek 	unsigned char	val;
560*00b67f09SDavid van Moolenbroek 
561*00b67f09SDavid van Moolenbroek 	cnt = 0;
562*00b67f09SDavid van Moolenbroek 	nprobs = 0;
563*00b67f09SDavid van Moolenbroek 	len = buf->used - buf->current;
564*00b67f09SDavid van Moolenbroek 
565*00b67f09SDavid van Moolenbroek 	t_info("buf: current %d used %d len %d\n",
566*00b67f09SDavid van Moolenbroek 	       buf->current, buf->used, len);
567*00b67f09SDavid van Moolenbroek 
568*00b67f09SDavid van Moolenbroek 	fd = open(path, O_CREAT|O_TRUNC|O_WRONLY, S_IRWXU|S_IRWXO|S_IRWXG);
569*00b67f09SDavid van Moolenbroek 	if (fd < 0) {
570*00b67f09SDavid van Moolenbroek 		t_info("open %s failed %d\n", path, errno);
571*00b67f09SDavid van Moolenbroek 		return(1);
572*00b67f09SDavid van Moolenbroek 	}
573*00b67f09SDavid van Moolenbroek 
574*00b67f09SDavid van Moolenbroek 	while (len) {
575*00b67f09SDavid van Moolenbroek 		c = (unsigned char) isc_buffer_getuint8(buf);
576*00b67f09SDavid van Moolenbroek 		val = ((c >> 4 ) & 0x0f);
577*00b67f09SDavid van Moolenbroek 		if ((0 <= val) && (val <= 9))
578*00b67f09SDavid van Moolenbroek 			val = '0' + val;
579*00b67f09SDavid van Moolenbroek 		else
580*00b67f09SDavid van Moolenbroek 			val = 'A' + val - 10;
581*00b67f09SDavid van Moolenbroek 		rval = write(fd, &val, 1);
582*00b67f09SDavid van Moolenbroek 		if (rval != 1) {
583*00b67f09SDavid van Moolenbroek 			++nprobs;
584*00b67f09SDavid van Moolenbroek 			t_info("write failed %d %d\n", rval, errno);
585*00b67f09SDavid van Moolenbroek 			break;
586*00b67f09SDavid van Moolenbroek 		}
587*00b67f09SDavid van Moolenbroek 		val = (c & 0x0f);
588*00b67f09SDavid van Moolenbroek 		if ((0 <= val) && (val <= 9))
589*00b67f09SDavid van Moolenbroek 			val = '0' + val;
590*00b67f09SDavid van Moolenbroek 		else
591*00b67f09SDavid van Moolenbroek 			val = 'A' + val - 10;
592*00b67f09SDavid van Moolenbroek 		rval = write(fd, &val, 1);
593*00b67f09SDavid van Moolenbroek 		if (rval != 1) {
594*00b67f09SDavid van Moolenbroek 			++nprobs;
595*00b67f09SDavid van Moolenbroek 			t_info("write failed %d %d\n", rval, errno);
596*00b67f09SDavid van Moolenbroek 			break;
597*00b67f09SDavid van Moolenbroek 		}
598*00b67f09SDavid van Moolenbroek 		--len;
599*00b67f09SDavid van Moolenbroek 		++cnt;
600*00b67f09SDavid van Moolenbroek 		if ((cnt % 16) == 0) {
601*00b67f09SDavid van Moolenbroek 			val = '\n';
602*00b67f09SDavid van Moolenbroek 			rval = write(fd, &val, 1);
603*00b67f09SDavid van Moolenbroek 			if (rval != 1) {
604*00b67f09SDavid van Moolenbroek 				++nprobs;
605*00b67f09SDavid van Moolenbroek 				t_info("write failed %d %d\n", rval, errno);
606*00b67f09SDavid van Moolenbroek 				break;
607*00b67f09SDavid van Moolenbroek 			}
608*00b67f09SDavid van Moolenbroek 		}
609*00b67f09SDavid van Moolenbroek 	}
610*00b67f09SDavid van Moolenbroek 	val = '\n';
611*00b67f09SDavid van Moolenbroek 	rval = write(fd, &val, 1);
612*00b67f09SDavid van Moolenbroek 	if (rval != 1) {
613*00b67f09SDavid van Moolenbroek 		++nprobs;
614*00b67f09SDavid van Moolenbroek 		t_info("write failed %d %d\n", rval, errno);
615*00b67f09SDavid van Moolenbroek 	}
616*00b67f09SDavid van Moolenbroek 	(void) close(fd);
617*00b67f09SDavid van Moolenbroek 	return(nprobs);
618*00b67f09SDavid van Moolenbroek }
619*00b67f09SDavid van Moolenbroek 
620*00b67f09SDavid van Moolenbroek #endif	/* NEWSIG */
621*00b67f09SDavid van Moolenbroek 
622*00b67f09SDavid van Moolenbroek /*
623*00b67f09SDavid van Moolenbroek  * Read sig in file at path to buf.
624*00b67f09SDavid van Moolenbroek  */
625*00b67f09SDavid van Moolenbroek static int
sig_fromfile(char * path,isc_buffer_t * iscbuf)626*00b67f09SDavid van Moolenbroek sig_fromfile(char *path, isc_buffer_t *iscbuf) {
627*00b67f09SDavid van Moolenbroek 	size_t		rval;
628*00b67f09SDavid van Moolenbroek 	size_t		len;
629*00b67f09SDavid van Moolenbroek 	FILE		*fp;
630*00b67f09SDavid van Moolenbroek 	unsigned char	val;
631*00b67f09SDavid van Moolenbroek 	char		*p;
632*00b67f09SDavid van Moolenbroek 	char		*buf;
633*00b67f09SDavid van Moolenbroek 	isc_result_t	isc_result;
634*00b67f09SDavid van Moolenbroek 	off_t		size;
635*00b67f09SDavid van Moolenbroek 
636*00b67f09SDavid van Moolenbroek 	isc_result = isc_stdio_open(path, "rb", &fp);
637*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
638*00b67f09SDavid van Moolenbroek 		t_info("open failed, result: %s\n",
639*00b67f09SDavid van Moolenbroek 		       isc_result_totext(isc_result));
640*00b67f09SDavid van Moolenbroek 		return(1);
641*00b67f09SDavid van Moolenbroek 	}
642*00b67f09SDavid van Moolenbroek 
643*00b67f09SDavid van Moolenbroek 	isc_result = isc_file_getsizefd(fileno(fp), &size);
644*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
645*00b67f09SDavid van Moolenbroek 		t_info("stat %s failed, result: %s\n",
646*00b67f09SDavid van Moolenbroek 		       path, isc_result_totext(isc_result));
647*00b67f09SDavid van Moolenbroek 		isc_stdio_close(fp);
648*00b67f09SDavid van Moolenbroek 		return(1);
649*00b67f09SDavid van Moolenbroek 	}
650*00b67f09SDavid van Moolenbroek 
651*00b67f09SDavid van Moolenbroek 	buf = (char *) malloc((size + 1) * sizeof(char));
652*00b67f09SDavid van Moolenbroek 	if (buf == NULL) {
653*00b67f09SDavid van Moolenbroek 		t_info("malloc failed, errno == %d\n", errno);
654*00b67f09SDavid van Moolenbroek 		isc_stdio_close(fp);
655*00b67f09SDavid van Moolenbroek 		return(1);
656*00b67f09SDavid van Moolenbroek 	}
657*00b67f09SDavid van Moolenbroek 
658*00b67f09SDavid van Moolenbroek 	len = (size_t)size;
659*00b67f09SDavid van Moolenbroek 	p = buf;
660*00b67f09SDavid van Moolenbroek 	while (len != 0U) {
661*00b67f09SDavid van Moolenbroek 		isc_result = isc_stdio_read(p, 1, len, fp, &rval);
662*00b67f09SDavid van Moolenbroek 		if (isc_result == ISC_R_SUCCESS) {
663*00b67f09SDavid van Moolenbroek 			len -= rval;
664*00b67f09SDavid van Moolenbroek 			p += rval;
665*00b67f09SDavid van Moolenbroek 		} else {
666*00b67f09SDavid van Moolenbroek 			t_info("read failed %d, result: %s\n",
667*00b67f09SDavid van Moolenbroek 			       (int)rval, isc_result_totext(isc_result));
668*00b67f09SDavid van Moolenbroek 			(void) free(buf);
669*00b67f09SDavid van Moolenbroek 			(void) isc_stdio_close(fp);
670*00b67f09SDavid van Moolenbroek 			return(1);
671*00b67f09SDavid van Moolenbroek 		}
672*00b67f09SDavid van Moolenbroek 	}
673*00b67f09SDavid van Moolenbroek 	isc_stdio_close(fp);
674*00b67f09SDavid van Moolenbroek 
675*00b67f09SDavid van Moolenbroek 	p = buf;
676*00b67f09SDavid van Moolenbroek 	len = size;
677*00b67f09SDavid van Moolenbroek 	while (len > 0U) {
678*00b67f09SDavid van Moolenbroek 		if ((*p == '\r') || (*p == '\n')) {
679*00b67f09SDavid van Moolenbroek 			++p;
680*00b67f09SDavid van Moolenbroek 			--len;
681*00b67f09SDavid van Moolenbroek 			continue;
682*00b67f09SDavid van Moolenbroek 		} else if (len < 2U)
683*00b67f09SDavid van Moolenbroek 		       goto err;
684*00b67f09SDavid van Moolenbroek 		if (('0' <= *p) && (*p <= '9'))
685*00b67f09SDavid van Moolenbroek 			val = *p - '0';
686*00b67f09SDavid van Moolenbroek 		else if (('A' <= *p) && (*p <= 'F'))
687*00b67f09SDavid van Moolenbroek 			val = *p - 'A' + 10;
688*00b67f09SDavid van Moolenbroek 		else
689*00b67f09SDavid van Moolenbroek 			goto err;
690*00b67f09SDavid van Moolenbroek 		++p;
691*00b67f09SDavid van Moolenbroek 		val <<= 4;
692*00b67f09SDavid van Moolenbroek 		--len;
693*00b67f09SDavid van Moolenbroek 		if (('0' <= *p) && (*p <= '9'))
694*00b67f09SDavid van Moolenbroek 			val |= (*p - '0');
695*00b67f09SDavid van Moolenbroek 		else if (('A' <= *p) && (*p <= 'F'))
696*00b67f09SDavid van Moolenbroek 			val |= (*p - 'A' + 10);
697*00b67f09SDavid van Moolenbroek 		else
698*00b67f09SDavid van Moolenbroek 			goto err;
699*00b67f09SDavid van Moolenbroek 		++p;
700*00b67f09SDavid van Moolenbroek 		--len;
701*00b67f09SDavid van Moolenbroek 		isc_buffer_putuint8(iscbuf, val);
702*00b67f09SDavid van Moolenbroek 	}
703*00b67f09SDavid van Moolenbroek 	(void) free(buf);
704*00b67f09SDavid van Moolenbroek 	return(0);
705*00b67f09SDavid van Moolenbroek 
706*00b67f09SDavid van Moolenbroek  err:
707*00b67f09SDavid van Moolenbroek 	(void) free(buf);
708*00b67f09SDavid van Moolenbroek 	return (1);
709*00b67f09SDavid van Moolenbroek }
710*00b67f09SDavid van Moolenbroek 
711*00b67f09SDavid van Moolenbroek static void
t2_sigchk(char * datapath,char * sigpath,char * keyname,int id,int alg,int type,isc_mem_t * mctx,char * expected_result,int * nfails,int * nprobs)712*00b67f09SDavid van Moolenbroek t2_sigchk(char *datapath, char *sigpath, char *keyname,
713*00b67f09SDavid van Moolenbroek 		int id, int alg, int type,
714*00b67f09SDavid van Moolenbroek 		isc_mem_t *mctx, char *expected_result,
715*00b67f09SDavid van Moolenbroek 		int *nfails, int *nprobs)
716*00b67f09SDavid van Moolenbroek {
717*00b67f09SDavid van Moolenbroek 	size_t		rval;
718*00b67f09SDavid van Moolenbroek 	size_t		len;
719*00b67f09SDavid van Moolenbroek 	FILE		*fp;
720*00b67f09SDavid van Moolenbroek 	int		exp_res;
721*00b67f09SDavid van Moolenbroek 	dst_key_t	*key = NULL;
722*00b67f09SDavid van Moolenbroek 	unsigned char	sig[T_SIGMAX];
723*00b67f09SDavid van Moolenbroek 	unsigned char	*p;
724*00b67f09SDavid van Moolenbroek 	unsigned char	*data;
725*00b67f09SDavid van Moolenbroek 	off_t		size;
726*00b67f09SDavid van Moolenbroek 	isc_result_t	isc_result;
727*00b67f09SDavid van Moolenbroek 	isc_buffer_t	databuf;
728*00b67f09SDavid van Moolenbroek 	isc_buffer_t	sigbuf;
729*00b67f09SDavid van Moolenbroek 	isc_region_t	datareg;
730*00b67f09SDavid van Moolenbroek 	isc_region_t	sigreg;
731*00b67f09SDavid van Moolenbroek 	dns_fixedname_t	fname;
732*00b67f09SDavid van Moolenbroek 	dns_name_t	*name;
733*00b67f09SDavid van Moolenbroek 	isc_buffer_t	b;
734*00b67f09SDavid van Moolenbroek 	dst_context_t	*ctx = NULL;
735*00b67f09SDavid van Moolenbroek 
736*00b67f09SDavid van Moolenbroek 	/*
737*00b67f09SDavid van Moolenbroek 	 * Read data from file in a form usable by dst_verify.
738*00b67f09SDavid van Moolenbroek 	 */
739*00b67f09SDavid van Moolenbroek 	isc_result = isc_stdio_open(datapath, "rb", &fp);
740*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
741*00b67f09SDavid van Moolenbroek 		t_info("t2_sigchk: open failed %s\n",
742*00b67f09SDavid van Moolenbroek 		       isc_result_totext(isc_result));
743*00b67f09SDavid van Moolenbroek 		++*nprobs;
744*00b67f09SDavid van Moolenbroek 		return;
745*00b67f09SDavid van Moolenbroek 	}
746*00b67f09SDavid van Moolenbroek 
747*00b67f09SDavid van Moolenbroek 	isc_result = isc_file_getsizefd(fileno(fp), &size);
748*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
749*00b67f09SDavid van Moolenbroek 		t_info("t2_sigchk: stat (%s) failed %s\n",
750*00b67f09SDavid van Moolenbroek 		       datapath, isc_result_totext(isc_result));
751*00b67f09SDavid van Moolenbroek 		++*nprobs;
752*00b67f09SDavid van Moolenbroek 		isc_stdio_close(fp);
753*00b67f09SDavid van Moolenbroek 		return;
754*00b67f09SDavid van Moolenbroek 	}
755*00b67f09SDavid van Moolenbroek 
756*00b67f09SDavid van Moolenbroek 	data = (unsigned char *) malloc(size * sizeof(unsigned char));
757*00b67f09SDavid van Moolenbroek 	if (data == NULL) {
758*00b67f09SDavid van Moolenbroek 		t_info("t2_sigchk: malloc failed %d\n", errno);
759*00b67f09SDavid van Moolenbroek 		++*nprobs;
760*00b67f09SDavid van Moolenbroek 		isc_stdio_close(fp);
761*00b67f09SDavid van Moolenbroek 		return;
762*00b67f09SDavid van Moolenbroek 	}
763*00b67f09SDavid van Moolenbroek 
764*00b67f09SDavid van Moolenbroek 	p = data;
765*00b67f09SDavid van Moolenbroek 	len = (size_t)size;
766*00b67f09SDavid van Moolenbroek 	do {
767*00b67f09SDavid van Moolenbroek 		isc_result = isc_stdio_read(p, 1, len, fp, &rval);
768*00b67f09SDavid van Moolenbroek 		if (isc_result == ISC_R_SUCCESS) {
769*00b67f09SDavid van Moolenbroek 			len -= rval;
770*00b67f09SDavid van Moolenbroek 			p += rval;
771*00b67f09SDavid van Moolenbroek 		}
772*00b67f09SDavid van Moolenbroek 	} while (len);
773*00b67f09SDavid van Moolenbroek 	(void) isc_stdio_close(fp);
774*00b67f09SDavid van Moolenbroek 
775*00b67f09SDavid van Moolenbroek 	/*
776*00b67f09SDavid van Moolenbroek 	 * Read key from file in a form usable by dst_verify.
777*00b67f09SDavid van Moolenbroek 	 */
778*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&fname);
779*00b67f09SDavid van Moolenbroek 	name = dns_fixedname_name(&fname);
780*00b67f09SDavid van Moolenbroek 	isc_buffer_constinit(&b, keyname, strlen(keyname));
781*00b67f09SDavid van Moolenbroek 	isc_buffer_add(&b, strlen(keyname));
782*00b67f09SDavid van Moolenbroek 	isc_result = dns_name_fromtext(name, &b, dns_rootname, 0, NULL);
783*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
784*00b67f09SDavid van Moolenbroek 		t_info("dns_name_fromtext failed %s\n",
785*00b67f09SDavid van Moolenbroek 			isc_result_totext(isc_result));
786*00b67f09SDavid van Moolenbroek 		(void) free(data);
787*00b67f09SDavid van Moolenbroek 		++*nprobs;
788*00b67f09SDavid van Moolenbroek 		return;
789*00b67f09SDavid van Moolenbroek 	}
790*00b67f09SDavid van Moolenbroek 	isc_result = dst_key_fromfile(name, id, alg, type, NULL, mctx, &key);
791*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
792*00b67f09SDavid van Moolenbroek 		t_info("dst_key_fromfile failed %s\n",
793*00b67f09SDavid van Moolenbroek 			isc_result_totext(isc_result));
794*00b67f09SDavid van Moolenbroek 		(void) free(data);
795*00b67f09SDavid van Moolenbroek 		++*nprobs;
796*00b67f09SDavid van Moolenbroek 		return;
797*00b67f09SDavid van Moolenbroek 	}
798*00b67f09SDavid van Moolenbroek 
799*00b67f09SDavid van Moolenbroek 	isc_buffer_init(&databuf, data, (unsigned int)size);
800*00b67f09SDavid van Moolenbroek 	isc_buffer_add(&databuf, (unsigned int)size);
801*00b67f09SDavid van Moolenbroek 	isc_buffer_usedregion(&databuf, &datareg);
802*00b67f09SDavid van Moolenbroek 
803*00b67f09SDavid van Moolenbroek #ifdef	NEWSIG
804*00b67f09SDavid van Moolenbroek 
805*00b67f09SDavid van Moolenbroek 	/*
806*00b67f09SDavid van Moolenbroek 	 * If we're generating a signature for the first time,
807*00b67f09SDavid van Moolenbroek 	 * sign the data and save the signature to a file
808*00b67f09SDavid van Moolenbroek 	 */
809*00b67f09SDavid van Moolenbroek 
810*00b67f09SDavid van Moolenbroek 	memset(sig, 0, sizeof(sig));
811*00b67f09SDavid van Moolenbroek 	isc_buffer_init(&sigbuf, sig, sizeof(sig));
812*00b67f09SDavid van Moolenbroek 
813*00b67f09SDavid van Moolenbroek 	isc_result = dst_context_create3(key, mctx,
814*00b67f09SDavid van Moolenbroek 					 DNS_LOGCATEGORY_GENERAL,
815*00b67f09SDavid van Moolenbroek 					 ISC_TRUE, &ctx);
816*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
817*00b67f09SDavid van Moolenbroek 		t_info("dst_context_create(%d) failed %s\n",
818*00b67f09SDavid van Moolenbroek 		       dst_result_totext(isc_result));
819*00b67f09SDavid van Moolenbroek 		(void) free(data);
820*00b67f09SDavid van Moolenbroek 		dst_key_free(&key);
821*00b67f09SDavid van Moolenbroek 		++*nprobs;
822*00b67f09SDavid van Moolenbroek 		return;
823*00b67f09SDavid van Moolenbroek 	}
824*00b67f09SDavid van Moolenbroek 	isc_result = dst_context_adddata(ctx, &datareg);
825*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
826*00b67f09SDavid van Moolenbroek 		t_info("dst_context_adddata(%d) failed %s\n",
827*00b67f09SDavid van Moolenbroek 		       dst_result_totext(isc_result));
828*00b67f09SDavid van Moolenbroek 		(void) free(data);
829*00b67f09SDavid van Moolenbroek 		dst_key_free(&key);
830*00b67f09SDavid van Moolenbroek 		dst_context_destroy(&ctx);
831*00b67f09SDavid van Moolenbroek 		++*nprobs;
832*00b67f09SDavid van Moolenbroek 		return;
833*00b67f09SDavid van Moolenbroek 	}
834*00b67f09SDavid van Moolenbroek 	isc_result = dst_context_sign(ctx, &sigbuf);
835*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
836*00b67f09SDavid van Moolenbroek 		t_info("dst_sign(%d) failed %s\n",
837*00b67f09SDavid van Moolenbroek 		       dst_result_totext(isc_result));
838*00b67f09SDavid van Moolenbroek 		(void) free(data);
839*00b67f09SDavid van Moolenbroek 		dst_key_free(&key);
840*00b67f09SDavid van Moolenbroek 		dst_context_destroy(&ctx);
841*00b67f09SDavid van Moolenbroek 		++*nprobs;
842*00b67f09SDavid van Moolenbroek 		return;
843*00b67f09SDavid van Moolenbroek 	}
844*00b67f09SDavid van Moolenbroek 	dst_context_destroy(&ctx);
845*00b67f09SDavid van Moolenbroek 
846*00b67f09SDavid van Moolenbroek 	rval = sig_tofile(sigpath, &sigbuf);
847*00b67f09SDavid van Moolenbroek 	if (rval != 0) {
848*00b67f09SDavid van Moolenbroek 		t_info("sig_tofile failed\n");
849*00b67f09SDavid van Moolenbroek 		++*nprobs;
850*00b67f09SDavid van Moolenbroek 		(void) free(data);
851*00b67f09SDavid van Moolenbroek 		dst_key_free(&key);
852*00b67f09SDavid van Moolenbroek 		return;
853*00b67f09SDavid van Moolenbroek 	}
854*00b67f09SDavid van Moolenbroek 
855*00b67f09SDavid van Moolenbroek #endif	/* NEWSIG */
856*00b67f09SDavid van Moolenbroek 
857*00b67f09SDavid van Moolenbroek 	memset(sig, 0, sizeof(sig));
858*00b67f09SDavid van Moolenbroek 	isc_buffer_init(&sigbuf, sig, sizeof(sig));
859*00b67f09SDavid van Moolenbroek 
860*00b67f09SDavid van Moolenbroek 	/*
861*00b67f09SDavid van Moolenbroek 	 * Read precomputed signature from file in a form usable by dst_verify.
862*00b67f09SDavid van Moolenbroek 	 */
863*00b67f09SDavid van Moolenbroek 	rval = sig_fromfile(sigpath, &sigbuf);
864*00b67f09SDavid van Moolenbroek 	if (rval != 0U) {
865*00b67f09SDavid van Moolenbroek 		t_info("sig_fromfile failed\n");
866*00b67f09SDavid van Moolenbroek 		(void) free(data);
867*00b67f09SDavid van Moolenbroek 		dst_key_free(&key);
868*00b67f09SDavid van Moolenbroek 		++*nprobs;
869*00b67f09SDavid van Moolenbroek 		return;
870*00b67f09SDavid van Moolenbroek 	}
871*00b67f09SDavid van Moolenbroek 
872*00b67f09SDavid van Moolenbroek 	/*
873*00b67f09SDavid van Moolenbroek 	 * Verify that the key signed the data.
874*00b67f09SDavid van Moolenbroek 	 */
875*00b67f09SDavid van Moolenbroek 	isc_buffer_remainingregion(&sigbuf, &sigreg);
876*00b67f09SDavid van Moolenbroek 
877*00b67f09SDavid van Moolenbroek 	exp_res = 0;
878*00b67f09SDavid van Moolenbroek 	if (strstr(expected_result, "!"))
879*00b67f09SDavid van Moolenbroek 		exp_res = 1;
880*00b67f09SDavid van Moolenbroek 
881*00b67f09SDavid van Moolenbroek 	isc_result = dst_context_create3(key, mctx,
882*00b67f09SDavid van Moolenbroek 					 DNS_LOGCATEGORY_GENERAL,
883*00b67f09SDavid van Moolenbroek 					 ISC_FALSE, &ctx);
884*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
885*00b67f09SDavid van Moolenbroek 		t_info("dst_context_create returned %s\n",
886*00b67f09SDavid van Moolenbroek 			isc_result_totext(isc_result));
887*00b67f09SDavid van Moolenbroek 		(void) free(data);
888*00b67f09SDavid van Moolenbroek 		dst_key_free(&key);
889*00b67f09SDavid van Moolenbroek 		++*nfails;
890*00b67f09SDavid van Moolenbroek 		return;
891*00b67f09SDavid van Moolenbroek 	}
892*00b67f09SDavid van Moolenbroek 	isc_result = dst_context_adddata(ctx, &datareg);
893*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
894*00b67f09SDavid van Moolenbroek 		t_info("dst_context_adddata returned %s\n",
895*00b67f09SDavid van Moolenbroek 			isc_result_totext(isc_result));
896*00b67f09SDavid van Moolenbroek 		(void) free(data);
897*00b67f09SDavid van Moolenbroek 		dst_context_destroy(&ctx);
898*00b67f09SDavid van Moolenbroek 		dst_key_free(&key);
899*00b67f09SDavid van Moolenbroek 		++*nfails;
900*00b67f09SDavid van Moolenbroek 		return;
901*00b67f09SDavid van Moolenbroek 	}
902*00b67f09SDavid van Moolenbroek 	isc_result = dst_context_verify(ctx, &sigreg);
903*00b67f09SDavid van Moolenbroek 	if (	((exp_res == 0) && (isc_result != ISC_R_SUCCESS))	||
904*00b67f09SDavid van Moolenbroek 		((exp_res != 0) && (isc_result == ISC_R_SUCCESS)))	{
905*00b67f09SDavid van Moolenbroek 
906*00b67f09SDavid van Moolenbroek 		t_info("dst_context_verify returned %s, expected %s\n",
907*00b67f09SDavid van Moolenbroek 			isc_result_totext(isc_result),
908*00b67f09SDavid van Moolenbroek 			expected_result);
909*00b67f09SDavid van Moolenbroek 		++*nfails;
910*00b67f09SDavid van Moolenbroek 	}
911*00b67f09SDavid van Moolenbroek 
912*00b67f09SDavid van Moolenbroek 	(void) free(data);
913*00b67f09SDavid van Moolenbroek 	dst_context_destroy(&ctx);
914*00b67f09SDavid van Moolenbroek 	dst_key_free(&key);
915*00b67f09SDavid van Moolenbroek 	return;
916*00b67f09SDavid van Moolenbroek }
917*00b67f09SDavid van Moolenbroek 
918*00b67f09SDavid van Moolenbroek /*
919*00b67f09SDavid van Moolenbroek  * The astute observer will note that t1() signs then verifies data
920*00b67f09SDavid van Moolenbroek  * during the test but that t2() verifies data that has been
921*00b67f09SDavid van Moolenbroek  * signed at some earlier time, possibly with an entire different
922*00b67f09SDavid van Moolenbroek  * version or implementation of the DSA and RSA algorithms
923*00b67f09SDavid van Moolenbroek  */
924*00b67f09SDavid van Moolenbroek static const char *a2 =
925*00b67f09SDavid van Moolenbroek 		"the dst module provides the capability to "
926*00b67f09SDavid van Moolenbroek 		"verify data signed with the RSA and DSA algorithms";
927*00b67f09SDavid van Moolenbroek 
928*00b67f09SDavid van Moolenbroek /*
929*00b67f09SDavid van Moolenbroek  * av ==  datafile, sigpath, keyname, keyid, alg, exp_result.
930*00b67f09SDavid van Moolenbroek  */
931*00b67f09SDavid van Moolenbroek static int
t2_vfy(char ** av)932*00b67f09SDavid van Moolenbroek t2_vfy(char **av) {
933*00b67f09SDavid van Moolenbroek 	char		*datapath;
934*00b67f09SDavid van Moolenbroek 	char		*sigpath;
935*00b67f09SDavid van Moolenbroek 	char		*keyname;
936*00b67f09SDavid van Moolenbroek 	char		*key;
937*00b67f09SDavid van Moolenbroek 	int		keyid;
938*00b67f09SDavid van Moolenbroek 	char		*alg;
939*00b67f09SDavid van Moolenbroek 	int		algid;
940*00b67f09SDavid van Moolenbroek 	char		*exp_result;
941*00b67f09SDavid van Moolenbroek 	int		nfails;
942*00b67f09SDavid van Moolenbroek 	int		nprobs;
943*00b67f09SDavid van Moolenbroek 	isc_mem_t	*mctx;
944*00b67f09SDavid van Moolenbroek 	isc_entropy_t	*ectx;
945*00b67f09SDavid van Moolenbroek 	isc_result_t	isc_result;
946*00b67f09SDavid van Moolenbroek 	int		result;
947*00b67f09SDavid van Moolenbroek 
948*00b67f09SDavid van Moolenbroek 	datapath	= *av++;
949*00b67f09SDavid van Moolenbroek 	sigpath		= *av++;
950*00b67f09SDavid van Moolenbroek 	keyname		= *av++;
951*00b67f09SDavid van Moolenbroek 	key		= *av++;
952*00b67f09SDavid van Moolenbroek 	keyid		= atoi(key);
953*00b67f09SDavid van Moolenbroek 	alg		= *av++;
954*00b67f09SDavid van Moolenbroek 	exp_result	= *av++;
955*00b67f09SDavid van Moolenbroek 	nfails		= 0;
956*00b67f09SDavid van Moolenbroek 	nprobs		= 0;
957*00b67f09SDavid van Moolenbroek 
958*00b67f09SDavid van Moolenbroek 	if (! strcasecmp(alg, "DST_ALG_DSA"))
959*00b67f09SDavid van Moolenbroek 		algid = DST_ALG_DSA;
960*00b67f09SDavid van Moolenbroek 	else if (! strcasecmp(alg, "DST_ALG_RSAMD5"))
961*00b67f09SDavid van Moolenbroek 		algid = DST_ALG_RSAMD5;
962*00b67f09SDavid van Moolenbroek 	else {
963*00b67f09SDavid van Moolenbroek 		t_info("Unknown algorithm %s\n", alg);
964*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
965*00b67f09SDavid van Moolenbroek 	}
966*00b67f09SDavid van Moolenbroek 
967*00b67f09SDavid van Moolenbroek 	mctx = NULL;
968*00b67f09SDavid van Moolenbroek 	isc_result = isc_mem_create(0, 0, &mctx);
969*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
970*00b67f09SDavid van Moolenbroek 		t_info("isc_mem_create failed %s\n",
971*00b67f09SDavid van Moolenbroek 		       isc_result_totext(isc_result));
972*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
973*00b67f09SDavid van Moolenbroek 	}
974*00b67f09SDavid van Moolenbroek 	ectx = NULL;
975*00b67f09SDavid van Moolenbroek 	isc_result = isc_entropy_create(mctx, &ectx);
976*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
977*00b67f09SDavid van Moolenbroek 		t_info("isc_entropy_create failed %s\n",
978*00b67f09SDavid van Moolenbroek 		       isc_result_totext(isc_result));
979*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
980*00b67f09SDavid van Moolenbroek 	}
981*00b67f09SDavid van Moolenbroek 	isc_result = isc_entropy_createfilesource(ectx, "randomfile");
982*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
983*00b67f09SDavid van Moolenbroek 		t_info("isc_entropy_create failed %s\n",
984*00b67f09SDavid van Moolenbroek 		       isc_result_totext(isc_result));
985*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
986*00b67f09SDavid van Moolenbroek 	}
987*00b67f09SDavid van Moolenbroek 	isc_result = dst_lib_init(mctx, ectx, ISC_ENTROPY_BLOCKING);
988*00b67f09SDavid van Moolenbroek 	if (isc_result != ISC_R_SUCCESS) {
989*00b67f09SDavid van Moolenbroek 		t_info("dst_lib_init failed %s\n",
990*00b67f09SDavid van Moolenbroek 		       isc_result_totext(isc_result));
991*00b67f09SDavid van Moolenbroek 		return(T_UNRESOLVED);
992*00b67f09SDavid van Moolenbroek 	}
993*00b67f09SDavid van Moolenbroek 
994*00b67f09SDavid van Moolenbroek 	if (!dst_algorithm_supported(DST_ALG_RSAMD5)) {
995*00b67f09SDavid van Moolenbroek 		dst_lib_destroy();
996*00b67f09SDavid van Moolenbroek 		t_info("library built without crypto support\n");
997*00b67f09SDavid van Moolenbroek 		return (T_SKIPPED);
998*00b67f09SDavid van Moolenbroek 	}
999*00b67f09SDavid van Moolenbroek 
1000*00b67f09SDavid van Moolenbroek 	t_info("testing %s, %s, %s, %s, %s, %s\n",
1001*00b67f09SDavid van Moolenbroek 			datapath, sigpath, keyname, key, alg, exp_result);
1002*00b67f09SDavid van Moolenbroek 	t2_sigchk(datapath, sigpath, keyname, keyid,
1003*00b67f09SDavid van Moolenbroek 			algid, DST_TYPE_PRIVATE|DST_TYPE_PUBLIC,
1004*00b67f09SDavid van Moolenbroek 			mctx, exp_result,
1005*00b67f09SDavid van Moolenbroek 			&nfails, &nprobs);
1006*00b67f09SDavid van Moolenbroek 
1007*00b67f09SDavid van Moolenbroek 	dst_lib_destroy();
1008*00b67f09SDavid van Moolenbroek 
1009*00b67f09SDavid van Moolenbroek 	isc_entropy_detach(&ectx);
1010*00b67f09SDavid van Moolenbroek 
1011*00b67f09SDavid van Moolenbroek 	isc_mem_destroy(&mctx);
1012*00b67f09SDavid van Moolenbroek 
1013*00b67f09SDavid van Moolenbroek 	result = T_UNRESOLVED;
1014*00b67f09SDavid van Moolenbroek 	if (nfails)
1015*00b67f09SDavid van Moolenbroek 		result = T_FAIL;
1016*00b67f09SDavid van Moolenbroek 	else if ((nfails == 0) && (nprobs == 0))
1017*00b67f09SDavid van Moolenbroek 		result = T_PASS;
1018*00b67f09SDavid van Moolenbroek 
1019*00b67f09SDavid van Moolenbroek 	return(result);
1020*00b67f09SDavid van Moolenbroek }
1021*00b67f09SDavid van Moolenbroek 
1022*00b67f09SDavid van Moolenbroek static void
t2(void)1023*00b67f09SDavid van Moolenbroek t2(void) {
1024*00b67f09SDavid van Moolenbroek 	int	result;
1025*00b67f09SDavid van Moolenbroek 	t_assert("dst", 2, T_REQUIRED, "%s", a2);
1026*00b67f09SDavid van Moolenbroek 	result = t_eval("dst_2_data", t2_vfy, 6);
1027*00b67f09SDavid van Moolenbroek 	t_result(result);
1028*00b67f09SDavid van Moolenbroek }
1029*00b67f09SDavid van Moolenbroek 
1030*00b67f09SDavid van Moolenbroek testspec_t	T_testlist[] = {
1031*00b67f09SDavid van Moolenbroek 	{	(PFV) t1,	"basic dst module verification"	},
1032*00b67f09SDavid van Moolenbroek 	{	(PFV) t2,	"signature ineffability"	},
1033*00b67f09SDavid van Moolenbroek 	{	(PFV) 0,	NULL				}
1034*00b67f09SDavid van Moolenbroek };
1035*00b67f09SDavid van Moolenbroek 
1036*00b67f09SDavid van Moolenbroek #ifdef WIN32
1037*00b67f09SDavid van Moolenbroek int
main(int argc,char ** argv)1038*00b67f09SDavid van Moolenbroek main(int argc, char **argv) {
1039*00b67f09SDavid van Moolenbroek 	t_settests(T_testlist);
1040*00b67f09SDavid van Moolenbroek 	return (t_main(argc, argv));
1041*00b67f09SDavid van Moolenbroek }
1042*00b67f09SDavid van Moolenbroek #endif
1043