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