1 /*	$NetBSD: eaytest.c,v 1.10 2010/01/17 23:02:48 wiz Exp $	*/
2 
3 /* Id: eaytest.c,v 1.22 2005/06/19 18:02:54 manubsd Exp */
4 
5 /*
6  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
7  * All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions and the following disclaimer.
14  * 2. Redistributions in binary form must reproduce the above copyright
15  *    notice, this list of conditions and the following disclaimer in the
16  *    documentation and/or other materials provided with the distribution.
17  * 3. Neither the name of the project nor the names of its contributors
18  *    may be used to endorse or promote products derived from this software
19  *    without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31  * SUCH DAMAGE.
32  */
33 
34 #include "config.h"
35 
36 #include <sys/types.h>
37 #include <sys/stat.h>
38 #include <sys/socket.h>
39 
40 #include <netinet/in.h>
41 
42 #include <stdlib.h>
43 #include <stdio.h>
44 #include <string.h>
45 #include <limits.h>
46 #include <dirent.h>
47 #include <fcntl.h>
48 #include <unistd.h>
49 #include <err.h>
50 
51 #include <openssl/bio.h>
52 #include <openssl/pem.h>
53 
54 #include "var.h"
55 #include "vmbuf.h"
56 #include "misc.h"
57 #include "debug.h"
58 #include "str2val.h"
59 #include "plog.h"
60 
61 #include "oakley.h"
62 #include "dhgroup.h"
63 #include "crypto_openssl.h"
64 #include "gnuc.h"
65 
66 #include "package_version.h"
67 
68 #define PVDUMP(var) racoon_hexdump((var)->v, (var)->l)
69 
70 /*#define CERTTEST_BROKEN */
71 
72 /* prototype */
73 
74 static vchar_t *pem_read_buf __P((char *));
75 void Usage __P((void));
76 
77 int rsatest __P((int, char **));
78 int ciphertest __P((int, char **));
79 int hmactest __P((int, char **));
80 int sha1test __P((int, char **));
81 int md5test __P((int, char **));
82 int dhtest __P((int, char **));
83 int bntest __P((int, char **));
84 #ifndef CERTTEST_BROKEN
85 static char **getcerts __P((char *));
86 int certtest __P((int, char **));
87 #endif
88 
89 /* test */
90 
91 static int
rsa_verify_with_pubkey(src,sig,pubkey_txt)92 rsa_verify_with_pubkey(src, sig, pubkey_txt)
93 	vchar_t *src, *sig;
94 	char *pubkey_txt;
95 {
96 	BIO *bio;
97 	EVP_PKEY *evp;
98 	int error;
99 
100 	bio = BIO_new_mem_buf(pubkey_txt, strlen(pubkey_txt));
101 	evp = PEM_read_bio_PUBKEY(bio, NULL, NULL, NULL);
102 	if (! evp) {
103 		printf ("PEM_read_PUBKEY(): %s\n", eay_strerror());
104 		return -1;
105 	}
106 	error = eay_check_rsasign(src, sig, evp->pkey.rsa);
107 
108 	return error;
109 }
110 
111 int
rsatest(ac,av)112 rsatest(ac, av)
113 	int ac;
114 	char **av;
115 {
116 	char *text = "this is test.";
117 	vchar_t src;
118 	vchar_t *priv, *sig;
119 	int loglevel_saved;
120 
121 	char *pkcs1 =
122 "-----BEGIN RSA PRIVATE KEY-----\n"
123 "MIICXQIBAAKBgQChe5/Fzk9SA0vCKBOcu9jBcLb9oLv50PeuEfQojhakY+OH8A3Q\n"
124 "M8A0qIDG6uhTNGPvzCWb/+mKeOB48n5HJpLxlDFyP3kyd2yXHIZ/MN8g1nh4FsB0\n"
125 "iTkk8QUCJkkan6FCOBrIeLEsGA5AdodzuR+khnCMt8vO+NFHZYKAQeynyQIDAQAB\n"
126 "AoGAOfDcnCHxjhDGrwyoNNWl6Yqi7hAtQm67YAbrH14UO7nnmxAENM9MyNgpFLaW\n"
127 "07v5m8IZQIcradcDXAJOUwNBN8E06UflwEYCaScIwndvr5UpVlN3e2NC6Wyg2yC7\n"
128 "GarxQput3zj35XNR5bK42UneU0H6zDxpHWqI1SwE+ToAHu0CQQDNl9gUJTpg0L09\n"
129 "HkbE5jeb8bA5I20nKqBOBP0v5tnzpwu41umQwk9I7Ru0ucD7j+DW4k8otadW+FnI\n"
130 "G1M1MpSjAkEAyRMt4bN8otfpOpsOQWzw4jQtouohOxRFCrQTntHhU20PrQnQLZWs\n"
131 "pOVzqCjRytYtkPEUA1z8QK5gGcVPcOQsowJBALmt2rwPB1NrEo5Bat7noO+Zb3Ob\n"
132 "WDiYWeE8xkHd95gDlSWiC53ur9aINo6ZeP556jGIgL+el/yHHecJLrQL84sCQH48\n"
133 "zUxq/C/cb++8UzneJGlPqusiJNTLiAENR1gpmlZfHT1c8Nb9phMsfu0vG29GAfuC\n"
134 "bzchVLljALCNQK+2gRMCQQCNIgN+R9mRWZhFAcC1sq++YnuSBlw4VwdL/fd1Yg9e\n"
135 "Ul+U98yPl/NXt8Rs4TRBFcOZjkFI8xv0hQtevTgTmgz+\n"
136 "-----END RSA PRIVATE KEY-----\n\n";
137 	char *pubkey =
138 "-----BEGIN PUBLIC KEY-----\n"
139 "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQChe5/Fzk9SA0vCKBOcu9jBcLb9\n"
140 "oLv50PeuEfQojhakY+OH8A3QM8A0qIDG6uhTNGPvzCWb/+mKeOB48n5HJpLxlDFy\n"
141 "P3kyd2yXHIZ/MN8g1nh4FsB0iTkk8QUCJkkan6FCOBrIeLEsGA5AdodzuR+khnCM\n"
142 "t8vO+NFHZYKAQeynyQIDAQAB\n"
143 "-----END PUBLIC KEY-----\n\n";
144 	char *pubkey_wrong =
145 "-----BEGIN PUBLIC KEY-----\n"
146 "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwDncG2tSokRBhK8la1mO\n"
147 "QnUpxg6KvpoFUjEyRiIE1GRap5V6jCCEOmA9ZAz4Oa/97oxewwMWtchIxSBZVCia\n"
148 "H9oGasbOFzrtSR+MKl6Cb/Ow3Fu+PKbHTsnfTk/nOOWyaQh91PRD7fdwHe8L9P7w\n"
149 "2kFPmDW6+RNKIR4OErhXf1O0eSShPe0TO3vx43O7dWqhmh3Kgr4Jq7zAGqHtwu0B\n"
150 "RFZnmsocOnVZb2yAHndp51/Mk1H37ThHwN7qMx7RqrS3ru3XtchpJd9IQJPBIRfY\n"
151 "VYQ68u5ix/Z80Y6VkRf0qnAvel8B6D3N3Zyq5u7G60PfvvtCybeMn7nVrSMxqMW/\n"
152 "xwIDAQAB\n"
153 "-----END PUBLIC KEY-----\n\n";
154 
155 	printf ("%s", pkcs1);
156 	printf ("%s", pubkey);
157 	priv = pem_read_buf(pkcs1);
158 
159 	src.v = text;
160 	src.l = strlen(text);
161 
162 	/* sign */
163 	sig = eay_get_x509sign(&src, priv);
164 	if (sig == NULL) {
165 		printf("sign failed. %s\n", eay_strerror());
166 		return -1;
167 	}
168 
169 	printf("RSA signed data.\n");
170 	PVDUMP(sig);
171 
172 	printf("Verification with correct pubkey: ");
173 	if (rsa_verify_with_pubkey (&src, sig, pubkey) != 0) {
174 		printf ("Failed.\n");
175 		return -1;
176 	}
177 	else
178 		printf ("Verified. Good.\n");
179 
180 	loglevel_saved = loglevel;
181 	loglevel = 0;
182 	printf("Verification with wrong pubkey: ");
183 	if (rsa_verify_with_pubkey (&src, sig, pubkey_wrong) != 0)
184 		printf ("Not verified. Good.\n");
185 	else {
186 		printf ("Verified. This is bad...\n");
187 		loglevel = loglevel_saved;
188 		return -1;
189 	}
190 	loglevel = loglevel_saved;
191 
192 	return 0;
193 }
194 
195 static vchar_t *
pem_read_buf(buf)196 pem_read_buf(buf)
197 	char *buf;
198 {
199 	BIO *bio;
200 	char *nm = NULL, *header = NULL;
201 	unsigned char *data = NULL;
202 	long len;
203 	vchar_t *ret;
204 	int error;
205 
206 	bio = BIO_new_mem_buf(buf, strlen(buf));
207 	error = PEM_read_bio(bio, &nm, &header, &data, &len);
208 	if (error == 0)
209 		errx(1, "%s", eay_strerror());
210 	ret = vmalloc(len);
211 	if (ret == NULL)
212 		err(1, "vmalloc");
213 	memcpy(ret->v, data, len);
214 
215 	return ret;
216 }
217 
218 #ifndef CERTTEST_BROKEN
219 int
certtest(ac,av)220 certtest(ac, av)
221 	int ac;
222 	char **av;
223 {
224 	char *certpath;
225 	char **certs;
226 	int type;
227 	int error;
228 
229 	printf("\n**Test for Certificate.**\n");
230 
231     {
232 	vchar_t *asn1dn = NULL, asn1dn0;
233 #ifdef ORIG_DN
234 	char dnstr[] = "C=JP, ST=Kanagawa, L=Fujisawa, O=WIDE Project, OU=KAME Project, CN=Shoichi Sakane/Email=sakane@kame.net";
235 	char *dnstr_w1 = NULL;
236 	char *dnstr_w2 = NULL;
237 	char dn0[] = {
238 		0x30,0x81,0x9a,0x31,0x0b,0x30,0x09,0x06,
239 		0x03,0x55,0x04,0x06,0x13,0x02,0x4a,0x50,
240 		0x31,0x11,0x30,0x0f,0x06,0x03,0x55,0x04,
241 		0x08,0x13,0x08,0x4b,0x61,0x6e,0x61,0x67,
242 		0x61,0x77,0x61,0x31,0x11,0x30,0x0f,0x06,
243 		0x03,0x55,0x04,0x07,0x13,0x08,0x46,0x75,
244 		0x6a,0x69,0x73,0x61,0x77,0x61,0x31,0x15,
245 		0x30,0x13,0x06,0x03,0x55,0x04,0x0a,0x13,
246 		0x0c,0x57,0x49,0x44,0x45,0x20,0x50,0x72,
247 		0x6f,0x6a,0x65,0x63,0x74,0x31,0x15,0x30,
248 		0x13,0x06,0x03,0x55,0x04,0x0b,0x13,0x0c,
249 		0x4b,0x41,0x4d,0x45,0x20,0x50,0x72,0x6f,
250 		0x6a,0x65,0x63,0x74,0x31,0x17,0x30,0x15,
251 		0x06,0x03,0x55,0x04,0x03,0x13,0x0e,0x53,
252 		0x68,0x6f,0x69,0x63,0x68,0x69,0x20,0x53,
253 		0x61,0x6b,0x61,0x6e,0x65,0x31,0x1e,0x30,
254 		0x1c,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,
255 		0x0d,0x01,0x09,0x01,
256 		0x0c,	/* <== XXX */
257 		0x0f,0x73,0x61,
258 		0x6b,0x61,0x6e,0x65,0x40,0x6b,0x61,0x6d,
259 		0x65,0x2e,0x6e,0x65,0x74,
260 	};
261 #else /* not ORIG_DN */
262 	char dnstr[] = "C=JP, ST=Kanagawa, L=Fujisawa, O=WIDE Project, OU=KAME Project, CN=Shoichi Sakane";
263 	char dnstr_w1[] = "C=JP, ST=Kanagawa, L=Fujisawa, O=WIDE Project, OU=*, CN=Shoichi Sakane";
264 	char dnstr_w2[] = "C=JP, ST=Kanagawa, L=Fujisawa, O=WIDE Project, OU=KAME Project, CN=*";
265 	char dn0[] = {
266 		0x30,0x7a,0x31,0x0b,0x30,0x09,0x06,0x03,
267 		0x55,0x04,0x06,0x13,0x02,0x4a,0x50,0x31,
268 		0x11,0x30,0x0f,0x06,0x03,0x55,0x04,0x08,
269 		0x13,0x08,0x4b,0x61,0x6e,0x61,0x67,0x61,
270 		0x77,0x61,0x31,0x11,0x30,0x0f,0x06,0x03,
271 		0x55,0x04,0x07,0x13,0x08,0x46,0x75,0x6a,
272 		0x69,0x73,0x61,0x77,0x61,0x31,0x15,0x30,
273 		0x13,0x06,0x03,0x55,0x04,0x0a,0x13,0x0c,
274 		0x57,0x49,0x44,0x45,0x20,0x50,0x72,0x6f,
275 		0x6a,0x65,0x63,0x74,0x31,0x15,0x30,0x13,
276 		0x06,0x03,0x55,0x04,0x0b,0x13,0x0c,0x4b,
277 		0x41,0x4d,0x45,0x20,0x50,0x72,0x6f,0x6a,
278 		0x65,0x63,0x74,0x31,0x17,0x30,0x15,0x06,
279 		0x03,0x55,0x04,0x03,0x13,0x0e,0x53,0x68,
280 		0x6f,0x69,0x63,0x68,0x69,0x20,0x53,0x61,
281 		0x6b,0x61,0x6e,0x65,
282 	};
283 #endif /* ORIG_DN */
284 
285 	printf("check to convert the string into subjectName.\n");
286 	printf("%s\n", dnstr);
287 
288 	asn1dn0.v = dn0;
289 	asn1dn0.l = sizeof(dn0);
290 
291 	asn1dn = eay_str2asn1dn(dnstr, strlen(dnstr));
292 	if (asn1dn == NULL || asn1dn->l != asn1dn0.l)
293 #ifdef OUTPUT_VALID_ASN1DN
294 	{
295 		unsigned char *cp; int  i;
296 		printf("asn1dn length mismatched (%zu != %zu).\n", asn1dn ? asn1dn->l : -1, asn1dn0.l);
297 		for (cp = asn1dn->v, i = 0; i < asn1dn->l; i++)
298 		    printf ("0x%02x,", *cp++);
299 		exit (1);
300 	}
301 #else
302 		errx(1, "asn1dn length mismatched (%zu != %zu).\n", asn1dn ? asn1dn->l : -1, asn1dn0.l);
303 #endif
304 
305 	/*
306 	 * NOTE: The value pointed by "<==" above is different from the
307 	 * return of eay_str2asn1dn().  but eay_cmp_asn1dn() can distinguish
308 	 * both of the names are same name.
309 	 */
310 	if (eay_cmp_asn1dn(&asn1dn0,  asn1dn))
311 		errx(1, "asn1dn mismatched.\n");
312 	vfree(asn1dn);
313 
314 	printf("exact match: succeed.\n");
315 
316 	if (dnstr_w1 != NULL) {
317 		asn1dn = eay_str2asn1dn(dnstr_w1, strlen(dnstr_w1));
318 		if (asn1dn == NULL || asn1dn->l == asn1dn0.l)
319 			errx(1, "asn1dn length wrong for wildcard 1\n");
320 		if (eay_cmp_asn1dn(&asn1dn0,  asn1dn))
321 			errx(1, "asn1dn mismatched for wildcard 1.\n");
322 		vfree(asn1dn);
323 		printf("wildcard 1 match: succeed.\n");
324 	}
325 
326 	if (dnstr_w1 != NULL) {
327 		asn1dn = eay_str2asn1dn(dnstr_w2, strlen(dnstr_w2));
328 		if (asn1dn == NULL || asn1dn->l == asn1dn0.l)
329 			errx(1, "asn1dn length wrong for wildcard 2\n");
330 		if (eay_cmp_asn1dn(&asn1dn0,  asn1dn))
331 			errx(1, "asn1dn mismatched for wildcard 2.\n");
332 		vfree(asn1dn);
333 		printf("wildcard 2 match: succeed.\n");
334 	}
335 
336     }
337 	eay_init();
338 
339 	/* get certs */
340 	if (ac > 1) {
341 		certpath = *(av + 1);
342 		certs = getcerts(certpath);
343 	} else {
344 #ifdef ORIG_DN
345 		printf("\nCAUTION: These certificates are probably invalid "
346 			"on your environment because you don't have their "
347 			"issuer's certs in your environment.\n\n");
348 
349 		certpath = "/usr/local/openssl/certs";
350 		certs = getcerts(NULL);
351 #else
352 		printf("\nWARNING: The main certificates are probably invalid "
353 			"on your environment\nbecause you don't have their "
354 			"issuer's certs in your environment\nso not doing "
355 			"this test.\n\n");
356 		return (0);
357 #endif
358 	}
359 
360 	while (*certs != NULL) {
361 
362 		vchar_t c;
363 		char *str;
364 		vchar_t *vstr;
365 
366 		printf("===CERT===\n");
367 
368 		c.v = *certs;
369 		c.l = strlen(*certs);
370 
371 		/* print text */
372 		str = eay_get_x509text(&c);
373 		printf("%s", str);
374 		racoon_free(str);
375 
376 		/* print ASN.1 of subject name */
377 		vstr = eay_get_x509asn1subjectname(&c);
378 		if (!vstr)
379 			return 0;
380 		PVDUMP(vstr);
381 		printf("\n");
382 		vfree(vstr);
383 
384 		/* print subject alt name */
385 	    {
386 		int pos;
387 		for (pos = 1; ; pos++) {
388 			error = eay_get_x509subjectaltname(&c, &str, &type, pos);
389 			if (error) {
390 				printf("no subjectaltname found.\n");
391 				break;
392 			}
393 			if (!str)
394 				break;
395 			printf("SubjectAltName: %d: %s\n", type, str);
396 			racoon_free(str);
397 		}
398 	    }
399 
400 		/* NULL => name of the certificate file */
401 		error = eay_check_x509cert(&c, certpath, NULL, 1);
402 		if (error)
403 			printf("ERROR: cert is invalid.\n");
404 		printf("\n");
405 
406 		certs++;
407 	}
408 	return 0;
409 }
410 
411 static char **
getcerts(path)412 getcerts(path)
413 	char *path;
414 {
415 	char **certs = NULL, **p;
416 	DIR *dirp;
417 	struct dirent *dp;
418 	struct stat sb;
419 	char buf[512];
420 	int len;
421 	int n;
422 	int fd;
423 
424 	static char *samplecerts[] = {
425 /* self signed */
426 "-----BEGIN CERTIFICATE-----\n"
427 "MIICpTCCAg4CAQAwDQYJKoZIhvcNAQEEBQAwgZoxCzAJBgNVBAYTAkpQMREwDwYD\n"
428 "VQQIEwhLYW5hZ2F3YTERMA8GA1UEBxMIRnVqaXNhd2ExFTATBgNVBAoTDFdJREUg\n"
429 "UHJvamVjdDEVMBMGA1UECxMMS0FNRSBQcm9qZWN0MRcwFQYDVQQDEw5TaG9pY2hp\n"
430 "IFNha2FuZTEeMBwGCSqGSIb3DQEJARYPc2FrYW5lQGthbWUubmV0MB4XDTAwMDgy\n"
431 "NDAxMzc0NFoXDTAwMDkyMzAxMzc0NFowgZoxCzAJBgNVBAYTAkpQMREwDwYDVQQI\n"
432 "EwhLYW5hZ2F3YTERMA8GA1UEBxMIRnVqaXNhd2ExFTATBgNVBAoTDFdJREUgUHJv\n"
433 "amVjdDEVMBMGA1UECxMMS0FNRSBQcm9qZWN0MRcwFQYDVQQDEw5TaG9pY2hpIFNh\n"
434 "a2FuZTEeMBwGCSqGSIb3DQEJARYPc2FrYW5lQGthbWUubmV0MIGfMA0GCSqGSIb3\n"
435 "DQEBAQUAA4GNADCBiQKBgQCpIQG/H3zn4czAmPBcbkDrYxE1A9vcpghpib3Of0Op\n"
436 "SsiWIBOyIMiVAzK/I/JotWp3Vdn5fzGp/7DGAbWXAALas2xHkNmTMPpu6qhmNQ57\n"
437 "kJHZHal24mgc1hwbrI9fb5olvIexx9a1riNPnKMRVHzXYizsyMbf+lJJmZ8QFhWN\n"
438 "twIDAQABMA0GCSqGSIb3DQEBBAUAA4GBACKs6X/BYycuHI3iop403R3XWMHHnNBN\n"
439 "5XTHVWiWgR1cMWkq/dp51gn+nPftpdAaYGpqGkiHGhZcXLoBaX9uON3p+7av+sQN\n"
440 "plXwnvUf2Zsgu+fojskS0gKcDlYiq1O8TOaBgJouFZgr1q6PiYjVEJGogAP28+HN\n"
441 "M4o+GBFbFoqK\n"
442 "-----END CERTIFICATE-----\n\n",
443 /* signed by SSH testing CA + CA1 + CA2 */
444 "-----BEGIN X509 CERTIFICATE-----\n"
445 "MIICtTCCAj+gAwIBAgIEOaR8NjANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJG\n"
446 "STEkMCIGA1UEChMbU1NIIENvbW11bmljYXRpb25zIFNlY3VyaXR5MREwDwYDVQQL\n"
447 "EwhXZWIgdGVzdDEbMBkGA1UEAxMSVGVzdCBDQSAxIHN1YiBjYSAyMB4XDTAwMDgy\n"
448 "NDAwMDAwMFoXDTAwMTAwMTAwMDAwMFowgZoxCzAJBgNVBAYTAkpQMREwDwYDVQQI\n"
449 "EwhLYW5hZ2F3YTERMA8GA1UEBxMIRnVqaXNhd2ExFTATBgNVBAoTDFdJREUgUHJv\n"
450 "amVjdDEVMBMGA1UECxMMS0FNRSBQcm9qZWN0MRcwFQYDVQQDEw5TaG9pY2hpIFNh\n"
451 "a2FuZTEeMBwGCSqGSIb3DQEJAQwPc2FrYW5lQGthbWUubmV0MIGfMA0GCSqGSIb3\n"
452 "DQEBAQUAA4GNADCBiQKBgQCpIQG/H3zn4czAmPBcbkDrYxE1A9vcpghpib3Of0Op\n"
453 "SsiWIBOyIMiVAzK/I/JotWp3Vdn5fzGp/7DGAbWXAALas2xHkNmTMPpu6qhmNQ57\n"
454 "kJHZHal24mgc1hwbrI9fb5olvIexx9a1riNPnKMRVHzXYizsyMbf+lJJmZ8QFhWN\n"
455 "twIDAQABo18wXTALBgNVHQ8EBAMCBaAwGgYDVR0RBBMwEYEPc2FrYW5lQGthbWUu\n"
456 "bmV0MDIGA1UdHwQrMCkwJ6AloCOGIWh0dHA6Ly9sZGFwLnNzaC5maS9jcmxzL2Nh\n"
457 "MS0yLmNybDANBgkqhkiG9w0BAQUFAANhADtaqual41OWshF/rwCTuR6zySBJysGp\n"
458 "+qjkp5efCiYKhAu1L4WXlMsV/SNdzspui5tHasPBvUw8gzFsU/VW/B2zuQZkimf1\n"
459 "u6ZPjUb/vt8vLOPScP5MeH7xrTk9iigsqQ==\n"
460 "-----END X509 CERTIFICATE-----\n\n",
461 /* VP100 */
462 "-----BEGIN CERTIFICATE-----\n"
463 "MIICXzCCAcigAwIBAgIEOXGBIzANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJG\n"
464 "STEkMCIGA1UEChMbU1NIIENvbW11bmljYXRpb25zIFNlY3VyaXR5MREwDwYDVQQL\n"
465 "EwhXZWIgdGVzdDESMBAGA1UEAxMJVGVzdCBDQSAxMB4XDTAwMDcxNjAwMDAwMFoX\n"
466 "DTAwMDkwMTAwMDAwMFowNTELMAkGA1UEBhMCanAxETAPBgNVBAoTCHRhaGl0ZXN0\n"
467 "MRMwEQYDVQQDEwpmdXJ1a2F3YS0xMIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKB\n"
468 "gQDUmI2RaAuoLvtRDbASwRhbkj/Oq0BBIKgAqbFknc/EanJSQwZQu82gD88nf7gG\n"
469 "VEioWmKPLDuEjz5JCuM+k5f7HYHI1wWmz1KFr7UA+avZm4Kp6YKnhuH7soZp7kBL\n"
470 "hTiZEpL0jdmCWLW3ZXoro55rmPrBsCd+bt8VU6tRZm5dUwIBKaNZMFcwCwYDVR0P\n"
471 "BAQDAgWgMBYGA1UdEQQPMA2CBVZQMTAwhwQKFIaFMDAGA1UdHwQpMCcwJaAjoCGG\n"
472 "H2h0dHA6Ly9sZGFwLnNzaC5maS9jcmxzL2NhMS5jcmwwDQYJKoZIhvcNAQEFBQAD\n"
473 "gYEAKJ/2Co/KYW65mwpGG3CBvsoRL8xyUMHGt6gQpFLHiiHuAdix1ADTL6uoFuYi\n"
474 "4sE5omQm1wKVv2ZhS03zDtUfKoVEv0HZ7IY3AU/FZT/M5gQvbt43Dki/ma3ock2I\n"
475 "PPhbLsvXm+GCVh3jvkYGk1zr7VERVeTPtmT+hW63lcxfFp4=\n"
476 "-----END CERTIFICATE-----\n\n",
477 /* IKED */
478 "-----BEGIN CERTIFICATE-----\n"
479 "MIIEFTCCA7+gAwIBAgIKYU5X6AAAAAAACTANBgkqhkiG9w0BAQUFADCBljEpMCcG\n"
480 "CSqGSIb3DQEJARYaeS13YXRhbmFAc2RsLmhpdGFjaGkuY28uanAxCzAJBgNVBAYT\n"
481 "AkpQMREwDwYDVQQIEwhLQU5BR0FXQTERMA8GA1UEBxMIWW9rb2hhbWExEDAOBgNV\n"
482 "BAoTB0hJVEFDSEkxDDAKBgNVBAsTA1NETDEWMBQGA1UEAxMNSVBzZWMgVGVzdCBD\n"
483 "QTAeFw0wMDA3MTUwMjUxNDdaFw0wMTA3MTUwMzAxNDdaMEUxCzAJBgNVBAYTAkpQ\n"
484 "MREwDwYDVQQIEwhLQU5BR0FXQTEQMA4GA1UEChMHSElUQUNISTERMA8GA1UEAxMI\n"
485 "V0FUQU5BQkUwXDANBgkqhkiG9w0BAQEFAANLADBIAkEA6Wja5A7Ldzrtx+rMWHEB\n"
486 "Cyt+/ZoG0qdFQbuuUiU1vOSq+1f+ZSCYAdTq13Lrr6Xfz3jDVFEZLPID9PSTFwq+\n"
487 "yQIDAQABo4ICPTCCAjkwDgYDVR0PAQH/BAQDAgTwMBMGA1UdJQQMMAoGCCsGAQUF\n"
488 "CAICMB0GA1UdDgQWBBTkv7/MH5Ra+S1zBAmnUIH5w8ZTUTCB0gYDVR0jBIHKMIHH\n"
489 "gBQsF2qoaTl5F3GFLKrttaxPJ8j4faGBnKSBmTCBljEpMCcGCSqGSIb3DQEJARYa\n"
490 "eS13YXRhbmFAc2RsLmhpdGFjaGkuY28uanAxCzAJBgNVBAYTAkpQMREwDwYDVQQI\n"
491 "EwhLQU5BR0FXQTERMA8GA1UEBxMIWW9rb2hhbWExEDAOBgNVBAoTB0hJVEFDSEkx\n"
492 "DDAKBgNVBAsTA1NETDEWMBQGA1UEAxMNSVBzZWMgVGVzdCBDQYIQeccIf4GYDIBA\n"
493 "rS6HSUt8XjB7BgNVHR8EdDByMDagNKAyhjBodHRwOi8vZmxvcmEyMjAvQ2VydEVu\n"
494 "cm9sbC9JUHNlYyUyMFRlc3QlMjBDQS5jcmwwOKA2oDSGMmZpbGU6Ly9cXGZsb3Jh\n"
495 "MjIwXENlcnRFbnJvbGxcSVBzZWMlMjBUZXN0JTIwQ0EuY3JsMIGgBggrBgEFBQcB\n"
496 "AQSBkzCBkDBFBggrBgEFBQcwAoY5aHR0cDovL2Zsb3JhMjIwL0NlcnRFbnJvbGwv\n"
497 "ZmxvcmEyMjBfSVBzZWMlMjBUZXN0JTIwQ0EuY3J0MEcGCCsGAQUFBzAChjtmaWxl\n"
498 "Oi8vXFxmbG9yYTIyMFxDZXJ0RW5yb2xsXGZsb3JhMjIwX0lQc2VjJTIwVGVzdCUy\n"
499 "MENBLmNydDANBgkqhkiG9w0BAQUFAANBAG8yZAWHb6g3zba453Hw5loojVDZO6fD\n"
500 "9lCsyaxeo9/+7x1JEEcdZ6qL7KKqe7ZBwza+hIN0ITkp2WEWo22gTz4=\n"
501 "-----END CERTIFICATE-----\n\n",
502 /* From Entrust */
503 "-----BEGIN CERTIFICATE-----\n"
504 "MIIDXTCCAsagAwIBAgIEOb6khTANBgkqhkiG9w0BAQUFADA4MQswCQYDVQQGEwJV\n"
505 "UzEQMA4GA1UEChMHRW50cnVzdDEXMBUGA1UECxMOVlBOIEludGVyb3AgUk8wHhcN\n"
506 "MDAwOTE4MjMwMDM3WhcNMDMwOTE4MjMzMDM3WjBTMQswCQYDVQQGEwJVUzEQMA4G\n"
507 "A1UEChMHRW50cnVzdDEXMBUGA1UECxMOVlBOIEludGVyb3AgUk8xGTAXBgNVBAMT\n"
508 "EFNob2ljaGkgU2FrYW5lIDIwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAKj3\n"
509 "eXSt1qXxFXzpa265B/NQYk5BZN7pNJg0tlTKBTVV3UgpQ92Bx5DoNfZh11oIv0Sw\n"
510 "6YnG5p9F9ma36U9HDoD3hVTjAvQKy4ssCsnU1y6v5XOU1QvYQo6UTzgsXUTaIau4\n"
511 "Lrccl+nyoiNzy3lG51tLR8CxuA+3OOAK9xPjszClAgMBAAGjggFXMIIBUzBABgNV\n"
512 "HREEOTA3gQ9zYWthbmVAa2FtZS5uZXSHBM6vIHWCHjIwNi0xNzUtMzItMTE3LnZw\n"
513 "bndvcmtzaG9wLmNvbTATBgNVHSUEDDAKBggrBgEFBQgCAjALBgNVHQ8EBAMCAKAw\n"
514 "KwYDVR0QBCQwIoAPMjAwMDA5MTgyMzAwMzdagQ8yMDAyMTAyNTExMzAzN1owWgYD\n"
515 "VR0fBFMwUTBPoE2gS6RJMEcxCzAJBgNVBAYTAlVTMRAwDgYDVQQKEwdFbnRydXN0\n"
516 "MRcwFQYDVQQLEw5WUE4gSW50ZXJvcCBSTzENMAsGA1UEAxMEQ1JMMTAfBgNVHSME\n"
517 "GDAWgBTzVmhu0tBoWKwkZE5mXpooE9630DAdBgNVHQ4EFgQUEgBHPtXggJqei5Xz\n"
518 "92CrWXTJxfAwCQYDVR0TBAIwADAZBgkqhkiG9n0HQQAEDDAKGwRWNS4wAwIEsDAN\n"
519 "BgkqhkiG9w0BAQUFAAOBgQCIFriNGMUE8GH5LuDrTJfA8uGx8vLy2seljuo694TR\n"
520 "et/ojp9QnfOJ1PF9iAdGaEaSLfkwhY4fZNZzxic5HBoHLeo9BXLP7i7FByXjvOZC\n"
521 "Y8++0dC8NVvendIILcJBM5nbDq1TqIbb8K3SP80XhO5JLVJkoZiQftAMjo0peZPO\n"
522 "EQ==\n"
523 "-----END CERTIFICATE-----\n\n",
524 	NULL,
525 	};
526 
527 	if (path == NULL)
528 		return (char **)&samplecerts;
529 
530 	stat(path, &sb);
531 	if (!(sb.st_mode & S_IFDIR)) {
532 		printf("ERROR: %s is not directory.\n", path);
533 		exit(0);
534 	}
535 
536 	dirp = opendir(path);
537 	if (dirp == NULL) {
538 		printf("opendir failed.\n");
539 		exit(0);
540 	}
541 
542 	n = 0;
543 	while ((dp = readdir(dirp)) != NULL) {
544 		if (dp->d_type != DT_REG)
545 			continue;
546 		if (strcmp(dp->d_name + strlen(dp->d_name) - 4, "cert"))
547 			continue;
548 		snprintf(buf, sizeof(buf), "%s/%s", path, dp->d_name);
549 		stat(buf, &sb);
550 
551 		p = (char **)realloc(certs, (n + 1) * sizeof(certs));
552 		if (p == NULL)
553 			err(1, "realloc");
554 		certs = p;
555 
556 		certs[n] = malloc(sb.st_size + 1);
557 		if (certs[n] == NULL)
558 			err(1, "malloc");
559 
560 		fd = open(buf, O_RDONLY);
561 		if (fd == -1)
562 			err(1, "open");
563 		len = read(fd, certs[n], sb.st_size);
564 		if (len == -1)
565 			err(1, "read");
566 		if (len != sb.st_size)
567 			errx(1, "read: length mismatch");
568 		certs[n][sb.st_size] = '\0';
569 		close(fd);
570 
571 		printf("%s: %d\n", dp->d_name, (int)sb.st_size);
572 
573 		n++;
574 	}
575 	closedir(dirp);
576 
577 	p = (char **)realloc(certs, (n + 1) * sizeof(certs));
578 	if (p == NULL)
579 		err(1, "realloc");
580 	certs = p;
581 	certs[n] = NULL;
582 
583 	return certs;
584 }
585 #endif /* CERTTEST_BROKEN */
586 
587 typedef vchar_t* (eay_func) (vchar_t *, vchar_t *, vchar_t *);
588 
589 static int
ciphertest_1(const char * name,vchar_t * data,size_t data_align,vchar_t * key,size_t min_keysize,vchar_t * iv0,size_t iv_length,eay_func encrypt,eay_func decrypt)590 ciphertest_1 (const char *name,
591 	      vchar_t *data,
592 	      size_t data_align,
593 	      vchar_t *key,
594 	      size_t min_keysize,
595 	      vchar_t *iv0,
596 	      size_t iv_length,
597 	      eay_func encrypt,
598 	      eay_func decrypt)
599 {
600 	int padlen;
601 	vchar_t *buf, *iv, *res1, *res2;
602 	iv = vmalloc(iv_length);
603 
604 	printf("Test for cipher %s\n", name);
605 	printf("data:\n");
606 	PVDUMP(data);
607 
608 	if (data_align <= 1 || (data->l % data_align) == 0)
609 	  padlen = 0;
610 	else
611 	  padlen = data_align - data->l % data_align;
612 
613 	buf = vmalloc(data->l + padlen);
614 	memcpy(buf->v, data->v, data->l);
615 
616 	memcpy(iv->v, iv0->v, iv_length);
617 	res1 = (encrypt)(buf, key, iv);
618 	if (res1 == NULL) {
619 		printf("%s encryption failed.\n", name);
620 		return -1;
621 	}
622 	printf("encrypted:\n");
623 	PVDUMP(res1);
624 
625 	memcpy(iv->v, iv0->v, iv_length);
626 	res2 = (decrypt)(res1, key, iv);
627 	if (res2 == NULL) {
628 		printf("%s decryption failed.\n", name);
629 		return -1;
630 	}
631 	printf("decrypted:\n");
632 	PVDUMP(res2);
633 
634 	if (memcmp(data->v, res2->v, data->l)) {
635 		printf("XXXX NG (%s) XXXX\n", name);
636 		return -1;
637 	}
638 	else
639 		printf("%s cipher verified.\n", name);
640 	vfree(res1);
641 	vfree(res2);
642 	vfree(buf);
643 	vfree(iv);
644 
645 	return 0;
646 }
647 
648 int
ciphertest(ac,av)649 ciphertest(ac, av)
650 	int ac;
651 	char **av;
652 {
653 	vchar_t data;
654 	vchar_t key;
655 	vchar_t iv0;
656 
657 	printf("\n**Testing CIPHERS**\n");
658 
659 	data.v = str2val("\
660 06000017 03000000 73616b61 6e65406b 616d652e 6e657409 0002c104 308202b8 \
661 04f05a90 \
662 	", 16, &data.l);
663 	key.v = str2val("f59bd70f 81b9b9cc 2a32c7fd 229a4b37", 16, &key.l);
664 	iv0.v = str2val("26b68c90 9467b4ab 7ec29fa0 0b696b55", 16, &iv0.l);
665 
666 	if (ciphertest_1 ("DES",
667 			  &data, 8,
668 			  &key, 8,
669 			  &iv0, 8,
670 			  eay_des_encrypt, eay_des_decrypt) < 0)
671 	  return -1;
672 
673 	if (ciphertest_1 ("3DES",
674 			  &data, 8,
675 			  &key, 24,
676 			  &iv0, 8,
677 			  eay_3des_encrypt, eay_3des_decrypt) < 0)
678 	  return -1;
679 
680 	if (ciphertest_1 ("AES",
681 			  &data, 16,
682 			  &key, key.l,
683 			  &iv0, 16,
684 			  eay_aes_encrypt, eay_aes_decrypt) < 0)
685 	  return -1;
686 
687 	if (ciphertest_1 ("BLOWFISH",
688 			  &data, 8,
689 			  &key, key.l,
690 			  &iv0, 8,
691 			  eay_bf_encrypt, eay_bf_decrypt) < 0)
692 	  return -1;
693 
694 	if (ciphertest_1 ("CAST",
695 			  &data, 8,
696 			  &key, key.l,
697 			  &iv0, 8,
698 			  eay_cast_encrypt, eay_cast_decrypt) < 0)
699 	  return -1;
700 
701 #ifdef HAVE_OPENSSL_IDEA_H
702 	if (ciphertest_1 ("IDEA",
703 			  &data, 8,
704 			  &key, key.l,
705 			  &iv0, 8,
706 			  eay_idea_encrypt, eay_idea_decrypt) < 0)
707 	  return -1;
708 #endif
709 
710 #ifdef HAVE_OPENSSL_RC5_H
711 	if (ciphertest_1 ("RC5",
712 			  &data, 8,
713 			  &key, key.l,
714 			  &iv0, 8,
715 			  eay_rc5_encrypt, eay_rc5_decrypt) < 0)
716 	  return -1;
717 #endif
718 #if defined(HAVE_OPENSSL_CAMELLIA_H)
719 	if (ciphertest_1 ("CAMELLIA",
720 			  &data, 16,
721 			  &key, key.l,
722 			  &iv0, 16,
723 			  eay_camellia_encrypt, eay_camellia_decrypt) < 0)
724 	  return -1;
725 #endif
726 	return 0;
727 }
728 
729 int
hmactest(ac,av)730 hmactest(ac, av)
731 	int ac;
732 	char **av;
733 {
734 	char *keyword = "hehehe test secret!";
735 	char *object  = "d7e6a6c1876ef0488bb74958b9fee94e";
736 	char *object1 = "d7e6a6c1876ef048";
737 	char *object2 =                 "8bb74958b9fee94e";
738 	char *r_hmd5  = "5702d7d1 fd1bfc7e 210fc9fa cda7d02c";
739 	char *r_hsha1 = "309999aa 9779a43e ebdea839 1b4e7ee1 d8646874";
740 #ifdef WITH_SHA2
741 	char *r_hsha2 = "d47262d8 a5b6f39d d8686939 411b3e79 ed2e27f9 2c4ea89f dd0a06ae 0c0aa396";
742 #endif
743 	vchar_t *key, *data, *data1, *data2, *res;
744 	vchar_t mod;
745 	caddr_t ctx;
746 
747 #ifdef WITH_SHA2
748 	printf("\n**Test for HMAC MD5, SHA1, and SHA256.**\n");
749 #else
750 	printf("\n**Test for HMAC MD5 & SHA1.**\n");
751 #endif
752 
753 	key = vmalloc(strlen(keyword));
754 	memcpy(key->v, keyword, key->l);
755 
756 	data = vmalloc(strlen(object));
757 	data1 = vmalloc(strlen(object1));
758 	data2 = vmalloc(strlen(object2));
759 	memcpy(data->v, object, data->l);
760 	memcpy(data1->v, object1, data1->l);
761 	memcpy(data2->v, object2, data2->l);
762 
763 	/* HMAC MD5 */
764 	printf("HMAC MD5 by eay_hmacmd5_one()\n");
765 	res = eay_hmacmd5_one(key, data);
766 	PVDUMP(res);
767 	mod.v = str2val(r_hmd5, 16, &mod.l);
768 	if (memcmp(res->v, mod.v, mod.l)) {
769 		printf(" XXX NG XXX\n");
770 		return -1;
771 	}
772 	free(mod.v);
773 	vfree(res);
774 
775 	/* HMAC MD5 */
776 	printf("HMAC MD5 by eay_hmacmd5_xxx()\n");
777 	ctx = eay_hmacmd5_init(key);
778 	eay_hmacmd5_update(ctx, data1);
779 	eay_hmacmd5_update(ctx, data2);
780 	res = eay_hmacmd5_final(ctx);
781 	PVDUMP(res);
782 	mod.v = str2val(r_hmd5, 16, &mod.l);
783 	if (memcmp(res->v, mod.v, mod.l)) {
784 		printf(" XXX NG XXX\n");
785 		return -1;
786 	}
787 	free(mod.v);
788 	vfree(res);
789 
790 	/* HMAC SHA1 */
791 	printf("HMAC SHA1 by eay_hmacsha1_one()\n");
792 	res = eay_hmacsha1_one(key, data);
793 	PVDUMP(res);
794 	mod.v = str2val(r_hsha1, 16, &mod.l);
795 	if (memcmp(res->v, mod.v, mod.l)) {
796 		printf(" XXX NG XXX\n");
797 		return -1;
798 	}
799 	free(mod.v);
800 	vfree(res);
801 
802 	/* HMAC SHA1 */
803 	printf("HMAC SHA1 by eay_hmacsha1_xxx()\n");
804 	ctx = eay_hmacsha1_init(key);
805 	eay_hmacsha1_update(ctx, data1);
806 	eay_hmacsha1_update(ctx, data2);
807 	res = eay_hmacsha1_final(ctx);
808 	PVDUMP(res);
809 	mod.v = str2val(r_hsha1, 16, &mod.l);
810 	if (memcmp(res->v, mod.v, mod.l)) {
811 		printf(" XXX NG XXX\n");
812 		return -1;
813 	}
814 	free(mod.v);
815 	vfree(res);
816 
817 #ifdef WITH_SHA2
818 	/* HMAC SHA2 */
819 	printf("HMAC SHA2 by eay_hmacsha2_256_one()\n");
820 	res = eay_hmacsha2_256_one(key, data);
821 	PVDUMP(res);
822 	mod.v = str2val(r_hsha2, 16, &mod.l);
823 	if (memcmp(res->v, mod.v, mod.l)) {
824 		printf(" XXX NG XXX\n");
825 		return -1;
826 	}
827 	free(mod.v);
828 	vfree(res);
829 #endif
830 
831 	vfree(data);
832 	vfree(data1);
833 	vfree(data2);
834 	vfree(key);
835 
836 	return 0;
837 }
838 
839 int
sha1test(ac,av)840 sha1test(ac, av)
841 	int ac;
842 	char **av;
843 {
844 	char *word1 = "1234567890", *word2 = "12345678901234567890";
845 	caddr_t ctx;
846 	vchar_t *buf, *res;
847 
848 	printf("\n**Test for SHA1.**\n");
849 
850 	ctx = eay_sha1_init();
851 	buf = vmalloc(strlen(word1));
852 	memcpy(buf->v, word1, buf->l);
853 	eay_sha1_update(ctx, buf);
854 	eay_sha1_update(ctx, buf);
855 	res = eay_sha1_final(ctx);
856 	PVDUMP(res);
857 	vfree(res);
858 	vfree(buf);
859 
860 	ctx = eay_sha1_init();
861 	buf = vmalloc(strlen(word2));
862 	memcpy(buf->v, word2, buf->l);
863 	eay_sha1_update(ctx, buf);
864 	res = eay_sha1_final(ctx);
865 	PVDUMP(res);
866 	vfree(res);
867 
868 	res = eay_sha1_one(buf);
869 	PVDUMP(res);
870 	vfree(res);
871 	vfree(buf);
872 
873 	return 0;
874 }
875 
876 int
md5test(ac,av)877 md5test(ac, av)
878 	int ac;
879 	char **av;
880 {
881 	char *word1 = "1234567890", *word2 = "12345678901234567890";
882 	caddr_t ctx;
883 	vchar_t *buf, *res;
884 
885 	printf("\n**Test for MD5.**\n");
886 
887 	ctx = eay_md5_init();
888 	buf = vmalloc(strlen(word1));
889 	memcpy(buf->v, word1, buf->l);
890 	eay_md5_update(ctx, buf);
891 	eay_md5_update(ctx, buf);
892 	res = eay_md5_final(ctx);
893 	PVDUMP(res);
894 	vfree(res);
895 	vfree(buf);
896 
897 	ctx = eay_md5_init();
898 	buf = vmalloc(strlen(word2));
899 	memcpy(buf->v, word2, buf->l);
900 	eay_md5_update(ctx, buf);
901 	res = eay_md5_final(ctx);
902 	PVDUMP(res);
903 	vfree(res);
904 
905 	res = eay_md5_one(buf);
906 	PVDUMP(res);
907 	vfree(res);
908 	vfree(buf);
909 
910 	return 0;
911 }
912 
913 int
dhtest(ac,av)914 dhtest(ac, av)
915 	int ac;
916 	char **av;
917 {
918 	static struct {
919 		char *name;
920 		char *p;
921 	} px[] = {
922 		{ "modp768",	OAKLEY_PRIME_MODP768, },
923 		{ "modp1024",	OAKLEY_PRIME_MODP1024, },
924 		{ "modp1536",	OAKLEY_PRIME_MODP1536, },
925 		{ "modp2048",	OAKLEY_PRIME_MODP2048, },
926 		{ "modp3072",	OAKLEY_PRIME_MODP3072, },
927 		{ "modp4096",	OAKLEY_PRIME_MODP4096, },
928 		{ "modp6144",	OAKLEY_PRIME_MODP6144, },
929 		{ "modp8192",	OAKLEY_PRIME_MODP8192, },
930 	};
931 	vchar_t p1, *pub1, *priv1, *gxy1;
932 	vchar_t p2, *pub2, *priv2, *gxy2;
933 	int i;
934 
935 	printf("\n**Test for DH.**\n");
936 
937 	for (i = 0; i < sizeof(px)/sizeof(px[0]); i++) {
938 		printf("\n**Test for DH %s.**\n", px[i].name);
939 
940 		p1.v = str2val(px[i].p, 16, &p1.l);
941 		p2.v = str2val(px[i].p, 16, &p2.l);
942 		printf("prime number = \n"); PVDUMP(&p1);
943 
944 		if (eay_dh_generate(&p1, 2, 96, &pub1, &priv1) < 0) {
945 			printf("error\n");
946 			return -1;
947 		}
948 		printf("private key for user 1 = \n"); PVDUMP(priv1);
949 		printf("public key for user 1  = \n"); PVDUMP(pub1);
950 
951 		if (eay_dh_generate(&p2, 2, 96, &pub2, &priv2) < 0) {
952 			printf("error\n");
953 			return -1;
954 		}
955 		printf("private key for user 2 = \n"); PVDUMP(priv2);
956 		printf("public key for user 2  = \n"); PVDUMP(pub2);
957 
958 		/* process to generate key for user 1 */
959 		gxy1 = vmalloc(p1.l);
960 		memset(gxy1->v, 0, gxy1->l);
961 		eay_dh_compute(&p1, 2, pub1, priv1, pub2, &gxy1);
962 		printf("sharing gxy1 of user 1 = \n"); PVDUMP(gxy1);
963 
964 		/* process to generate key for user 2 */
965 		gxy2 = vmalloc(p1.l);
966 		memset(gxy2->v, 0, gxy2->l);
967 		eay_dh_compute(&p2, 2, pub2, priv2, pub1, &gxy2);
968 		printf("sharing gxy2 of user 2 = \n"); PVDUMP(gxy2);
969 
970 		if (memcmp(gxy1->v, gxy2->v, gxy1->l)) {
971 			printf("ERROR: sharing gxy mismatched.\n");
972 			return -1;
973 		}
974 
975 		vfree(pub1);
976 		vfree(pub2);
977 		vfree(priv1);
978 		vfree(priv2);
979 		vfree(gxy1);
980 		vfree(gxy2);
981 	}
982 
983 	return 0;
984 }
985 
986 int
bntest(ac,av)987 bntest(ac, av)
988 	int ac;
989 	char **av;
990 {
991 	vchar_t *rn;
992 
993 	printf("\n**Test for generate a random number.**\n");
994 
995 	rn = eay_set_random((u_int32_t)96);
996 	PVDUMP(rn);
997 	vfree(rn);
998 
999 	return 0;
1000 }
1001 
1002 struct {
1003 	char *name;
1004 	int (*func) __P((int, char **));
1005 } func[] = {
1006 	{ "random", bntest, },
1007 	{ "dh", dhtest, },
1008 	{ "md5", md5test, },
1009 	{ "sha1", sha1test, },
1010 	{ "hmac", hmactest, },
1011 	{ "cipher", ciphertest, },
1012 #ifndef CERTTEST_BROKEN
1013 	{ "cert", certtest, },
1014 #endif
1015 	{ "rsa", rsatest, },
1016 };
1017 
1018 int
main(ac,av)1019 main(ac, av)
1020 	int ac;
1021 	char **av;
1022 {
1023 	int i;
1024 	int len = sizeof(func)/sizeof(func[0]);
1025 
1026 	f_foreground = 1;
1027 	ploginit();
1028 
1029 	printf ("\nTestsuite of the %s\nlinked with %s\n\n", TOP_PACKAGE_STRING, eay_version());
1030 
1031 	if (strcmp(*av, "-h") == 0)
1032 		Usage();
1033 
1034 	ac--;
1035 	av++;
1036 
1037 	for (i = 0; i < len; i++) {
1038 		if ((ac == 0) || (strcmp(*av, func[i].name) == 0)) {
1039 			if ((func[i].func)(ac, av) != 0) {
1040 				printf ("\n!!!!! Test '%s' failed. !!!!!\n\n", func[i].name);
1041 				exit(1);
1042 			}
1043 			if (ac)
1044 				break;
1045 		}
1046 	}
1047 	if (ac && i == len)
1048 		Usage();
1049 
1050 	printf ("\n===== All tests passed =====\n\n");
1051 	exit(0);
1052 }
1053 
1054 void
Usage()1055 Usage()
1056 {
1057 	int i;
1058 	int len = sizeof(func)/sizeof(func[0]);
1059 
1060 	printf("Usage: eaytest [");
1061 	for (i = 0; i < len; i++)
1062 		printf("%s%s", func[i].name, (i<len-1)?"|":"");
1063 	printf("]\n");
1064 #ifndef CERTTEST_BROKEN
1065 	printf("       eaytest cert [cert_directory]\n");
1066 #endif
1067 	exit(1);
1068 }
1069 
1070