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