Annotation of embedaddon/ipsec-tools/src/racoon/eaytest.c, revision 1.1.1.1
1.1 misho 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
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
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 *
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
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 **
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
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
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
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
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
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
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
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
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
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:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>