]> git.saurik.com Git - apple/ipsec.git/blame - ipsec-tools/racoon/eaytest.c
ipsec-93.10.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
382#ifdef __APPLE__
383 /* print subject alt name */
384 {
385 int pos;
386 int len;
387 for (pos = 1; ; pos++) {
388 error = eay_get_x509subjectaltname(&c, &str, &type, pos, &len);
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#else
400 /* print subject alt name */
401 {
402 int pos;
403 for (pos = 1; ; pos++) {
404 error = eay_get_x509subjectaltname(&c, &str, &type, pos);
405 if (error) {
406 printf("no subjectaltname found.\n");
407 break;
408 }
409 if (!str)
410 break;
411 printf("SubjectAltName: %d: %s\n", type, str);
412 racoon_free(str);
413 }
414 }
415#endif
416
417 /* NULL => name of the certificate file */
418 error = eay_check_x509cert(&c, certpath, NULL, 1);
419 if (error)
420 printf("ERROR: cert is invalid.\n");
421 printf("\n");
422
423 certs++;
424 }
425 return 0;
426}
427
428static char **
429getcerts(path)
430 char *path;
431{
432 char **certs = NULL, **p;
433 DIR *dirp;
434 struct dirent *dp;
435 struct stat sb;
436 char buf[512];
437 int len;
438 int n;
439 int fd;
440
441 static char *samplecerts[] = {
442/* self signed */
443"-----BEGIN CERTIFICATE-----\n"
444"MIICpTCCAg4CAQAwDQYJKoZIhvcNAQEEBQAwgZoxCzAJBgNVBAYTAkpQMREwDwYD\n"
445"VQQIEwhLYW5hZ2F3YTERMA8GA1UEBxMIRnVqaXNhd2ExFTATBgNVBAoTDFdJREUg\n"
446"UHJvamVjdDEVMBMGA1UECxMMS0FNRSBQcm9qZWN0MRcwFQYDVQQDEw5TaG9pY2hp\n"
447"IFNha2FuZTEeMBwGCSqGSIb3DQEJARYPc2FrYW5lQGthbWUubmV0MB4XDTAwMDgy\n"
448"NDAxMzc0NFoXDTAwMDkyMzAxMzc0NFowgZoxCzAJBgNVBAYTAkpQMREwDwYDVQQI\n"
449"EwhLYW5hZ2F3YTERMA8GA1UEBxMIRnVqaXNhd2ExFTATBgNVBAoTDFdJREUgUHJv\n"
450"amVjdDEVMBMGA1UECxMMS0FNRSBQcm9qZWN0MRcwFQYDVQQDEw5TaG9pY2hpIFNh\n"
451"a2FuZTEeMBwGCSqGSIb3DQEJARYPc2FrYW5lQGthbWUubmV0MIGfMA0GCSqGSIb3\n"
452"DQEBAQUAA4GNADCBiQKBgQCpIQG/H3zn4czAmPBcbkDrYxE1A9vcpghpib3Of0Op\n"
453"SsiWIBOyIMiVAzK/I/JotWp3Vdn5fzGp/7DGAbWXAALas2xHkNmTMPpu6qhmNQ57\n"
454"kJHZHal24mgc1hwbrI9fb5olvIexx9a1riNPnKMRVHzXYizsyMbf+lJJmZ8QFhWN\n"
455"twIDAQABMA0GCSqGSIb3DQEBBAUAA4GBACKs6X/BYycuHI3iop403R3XWMHHnNBN\n"
456"5XTHVWiWgR1cMWkq/dp51gn+nPftpdAaYGpqGkiHGhZcXLoBaX9uON3p+7av+sQN\n"
457"plXwnvUf2Zsgu+fojskS0gKcDlYiq1O8TOaBgJouFZgr1q6PiYjVEJGogAP28+HN\n"
458"M4o+GBFbFoqK\n"
459"-----END CERTIFICATE-----\n\n",
460/* signed by SSH testing CA + CA1 + CA2 */
461"-----BEGIN X509 CERTIFICATE-----\n"
462"MIICtTCCAj+gAwIBAgIEOaR8NjANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJG\n"
463"STEkMCIGA1UEChMbU1NIIENvbW11bmljYXRpb25zIFNlY3VyaXR5MREwDwYDVQQL\n"
464"EwhXZWIgdGVzdDEbMBkGA1UEAxMSVGVzdCBDQSAxIHN1YiBjYSAyMB4XDTAwMDgy\n"
465"NDAwMDAwMFoXDTAwMTAwMTAwMDAwMFowgZoxCzAJBgNVBAYTAkpQMREwDwYDVQQI\n"
466"EwhLYW5hZ2F3YTERMA8GA1UEBxMIRnVqaXNhd2ExFTATBgNVBAoTDFdJREUgUHJv\n"
467"amVjdDEVMBMGA1UECxMMS0FNRSBQcm9qZWN0MRcwFQYDVQQDEw5TaG9pY2hpIFNh\n"
468"a2FuZTEeMBwGCSqGSIb3DQEJAQwPc2FrYW5lQGthbWUubmV0MIGfMA0GCSqGSIb3\n"
469"DQEBAQUAA4GNADCBiQKBgQCpIQG/H3zn4czAmPBcbkDrYxE1A9vcpghpib3Of0Op\n"
470"SsiWIBOyIMiVAzK/I/JotWp3Vdn5fzGp/7DGAbWXAALas2xHkNmTMPpu6qhmNQ57\n"
471"kJHZHal24mgc1hwbrI9fb5olvIexx9a1riNPnKMRVHzXYizsyMbf+lJJmZ8QFhWN\n"
472"twIDAQABo18wXTALBgNVHQ8EBAMCBaAwGgYDVR0RBBMwEYEPc2FrYW5lQGthbWUu\n"
473"bmV0MDIGA1UdHwQrMCkwJ6AloCOGIWh0dHA6Ly9sZGFwLnNzaC5maS9jcmxzL2Nh\n"
474"MS0yLmNybDANBgkqhkiG9w0BAQUFAANhADtaqual41OWshF/rwCTuR6zySBJysGp\n"
475"+qjkp5efCiYKhAu1L4WXlMsV/SNdzspui5tHasPBvUw8gzFsU/VW/B2zuQZkimf1\n"
476"u6ZPjUb/vt8vLOPScP5MeH7xrTk9iigsqQ==\n"
477"-----END X509 CERTIFICATE-----\n\n",
478/* VP100 */
479"-----BEGIN CERTIFICATE-----\n"
480"MIICXzCCAcigAwIBAgIEOXGBIzANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJG\n"
481"STEkMCIGA1UEChMbU1NIIENvbW11bmljYXRpb25zIFNlY3VyaXR5MREwDwYDVQQL\n"
482"EwhXZWIgdGVzdDESMBAGA1UEAxMJVGVzdCBDQSAxMB4XDTAwMDcxNjAwMDAwMFoX\n"
483"DTAwMDkwMTAwMDAwMFowNTELMAkGA1UEBhMCanAxETAPBgNVBAoTCHRhaGl0ZXN0\n"
484"MRMwEQYDVQQDEwpmdXJ1a2F3YS0xMIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKB\n"
485"gQDUmI2RaAuoLvtRDbASwRhbkj/Oq0BBIKgAqbFknc/EanJSQwZQu82gD88nf7gG\n"
486"VEioWmKPLDuEjz5JCuM+k5f7HYHI1wWmz1KFr7UA+avZm4Kp6YKnhuH7soZp7kBL\n"
487"hTiZEpL0jdmCWLW3ZXoro55rmPrBsCd+bt8VU6tRZm5dUwIBKaNZMFcwCwYDVR0P\n"
488"BAQDAgWgMBYGA1UdEQQPMA2CBVZQMTAwhwQKFIaFMDAGA1UdHwQpMCcwJaAjoCGG\n"
489"H2h0dHA6Ly9sZGFwLnNzaC5maS9jcmxzL2NhMS5jcmwwDQYJKoZIhvcNAQEFBQAD\n"
490"gYEAKJ/2Co/KYW65mwpGG3CBvsoRL8xyUMHGt6gQpFLHiiHuAdix1ADTL6uoFuYi\n"
491"4sE5omQm1wKVv2ZhS03zDtUfKoVEv0HZ7IY3AU/FZT/M5gQvbt43Dki/ma3ock2I\n"
492"PPhbLsvXm+GCVh3jvkYGk1zr7VERVeTPtmT+hW63lcxfFp4=\n"
493"-----END CERTIFICATE-----\n\n",
494/* IKED */
495"-----BEGIN CERTIFICATE-----\n"
496"MIIEFTCCA7+gAwIBAgIKYU5X6AAAAAAACTANBgkqhkiG9w0BAQUFADCBljEpMCcG\n"
497"CSqGSIb3DQEJARYaeS13YXRhbmFAc2RsLmhpdGFjaGkuY28uanAxCzAJBgNVBAYT\n"
498"AkpQMREwDwYDVQQIEwhLQU5BR0FXQTERMA8GA1UEBxMIWW9rb2hhbWExEDAOBgNV\n"
499"BAoTB0hJVEFDSEkxDDAKBgNVBAsTA1NETDEWMBQGA1UEAxMNSVBzZWMgVGVzdCBD\n"
500"QTAeFw0wMDA3MTUwMjUxNDdaFw0wMTA3MTUwMzAxNDdaMEUxCzAJBgNVBAYTAkpQ\n"
501"MREwDwYDVQQIEwhLQU5BR0FXQTEQMA4GA1UEChMHSElUQUNISTERMA8GA1UEAxMI\n"
502"V0FUQU5BQkUwXDANBgkqhkiG9w0BAQEFAANLADBIAkEA6Wja5A7Ldzrtx+rMWHEB\n"
503"Cyt+/ZoG0qdFQbuuUiU1vOSq+1f+ZSCYAdTq13Lrr6Xfz3jDVFEZLPID9PSTFwq+\n"
504"yQIDAQABo4ICPTCCAjkwDgYDVR0PAQH/BAQDAgTwMBMGA1UdJQQMMAoGCCsGAQUF\n"
505"CAICMB0GA1UdDgQWBBTkv7/MH5Ra+S1zBAmnUIH5w8ZTUTCB0gYDVR0jBIHKMIHH\n"
506"gBQsF2qoaTl5F3GFLKrttaxPJ8j4faGBnKSBmTCBljEpMCcGCSqGSIb3DQEJARYa\n"
507"eS13YXRhbmFAc2RsLmhpdGFjaGkuY28uanAxCzAJBgNVBAYTAkpQMREwDwYDVQQI\n"
508"EwhLQU5BR0FXQTERMA8GA1UEBxMIWW9rb2hhbWExEDAOBgNVBAoTB0hJVEFDSEkx\n"
509"DDAKBgNVBAsTA1NETDEWMBQGA1UEAxMNSVBzZWMgVGVzdCBDQYIQeccIf4GYDIBA\n"
510"rS6HSUt8XjB7BgNVHR8EdDByMDagNKAyhjBodHRwOi8vZmxvcmEyMjAvQ2VydEVu\n"
511"cm9sbC9JUHNlYyUyMFRlc3QlMjBDQS5jcmwwOKA2oDSGMmZpbGU6Ly9cXGZsb3Jh\n"
512"MjIwXENlcnRFbnJvbGxcSVBzZWMlMjBUZXN0JTIwQ0EuY3JsMIGgBggrBgEFBQcB\n"
513"AQSBkzCBkDBFBggrBgEFBQcwAoY5aHR0cDovL2Zsb3JhMjIwL0NlcnRFbnJvbGwv\n"
514"ZmxvcmEyMjBfSVBzZWMlMjBUZXN0JTIwQ0EuY3J0MEcGCCsGAQUFBzAChjtmaWxl\n"
515"Oi8vXFxmbG9yYTIyMFxDZXJ0RW5yb2xsXGZsb3JhMjIwX0lQc2VjJTIwVGVzdCUy\n"
516"MENBLmNydDANBgkqhkiG9w0BAQUFAANBAG8yZAWHb6g3zba453Hw5loojVDZO6fD\n"
517"9lCsyaxeo9/+7x1JEEcdZ6qL7KKqe7ZBwza+hIN0ITkp2WEWo22gTz4=\n"
518"-----END CERTIFICATE-----\n\n",
519/* From Entrust */
520"-----BEGIN CERTIFICATE-----\n"
521"MIIDXTCCAsagAwIBAgIEOb6khTANBgkqhkiG9w0BAQUFADA4MQswCQYDVQQGEwJV\n"
522"UzEQMA4GA1UEChMHRW50cnVzdDEXMBUGA1UECxMOVlBOIEludGVyb3AgUk8wHhcN\n"
523"MDAwOTE4MjMwMDM3WhcNMDMwOTE4MjMzMDM3WjBTMQswCQYDVQQGEwJVUzEQMA4G\n"
524"A1UEChMHRW50cnVzdDEXMBUGA1UECxMOVlBOIEludGVyb3AgUk8xGTAXBgNVBAMT\n"
525"EFNob2ljaGkgU2FrYW5lIDIwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAKj3\n"
526"eXSt1qXxFXzpa265B/NQYk5BZN7pNJg0tlTKBTVV3UgpQ92Bx5DoNfZh11oIv0Sw\n"
527"6YnG5p9F9ma36U9HDoD3hVTjAvQKy4ssCsnU1y6v5XOU1QvYQo6UTzgsXUTaIau4\n"
528"Lrccl+nyoiNzy3lG51tLR8CxuA+3OOAK9xPjszClAgMBAAGjggFXMIIBUzBABgNV\n"
529"HREEOTA3gQ9zYWthbmVAa2FtZS5uZXSHBM6vIHWCHjIwNi0xNzUtMzItMTE3LnZw\n"
530"bndvcmtzaG9wLmNvbTATBgNVHSUEDDAKBggrBgEFBQgCAjALBgNVHQ8EBAMCAKAw\n"
531"KwYDVR0QBCQwIoAPMjAwMDA5MTgyMzAwMzdagQ8yMDAyMTAyNTExMzAzN1owWgYD\n"
532"VR0fBFMwUTBPoE2gS6RJMEcxCzAJBgNVBAYTAlVTMRAwDgYDVQQKEwdFbnRydXN0\n"
533"MRcwFQYDVQQLEw5WUE4gSW50ZXJvcCBSTzENMAsGA1UEAxMEQ1JMMTAfBgNVHSME\n"
534"GDAWgBTzVmhu0tBoWKwkZE5mXpooE9630DAdBgNVHQ4EFgQUEgBHPtXggJqei5Xz\n"
535"92CrWXTJxfAwCQYDVR0TBAIwADAZBgkqhkiG9n0HQQAEDDAKGwRWNS4wAwIEsDAN\n"
536"BgkqhkiG9w0BAQUFAAOBgQCIFriNGMUE8GH5LuDrTJfA8uGx8vLy2seljuo694TR\n"
537"et/ojp9QnfOJ1PF9iAdGaEaSLfkwhY4fZNZzxic5HBoHLeo9BXLP7i7FByXjvOZC\n"
538"Y8++0dC8NVvendIILcJBM5nbDq1TqIbb8K3SP80XhO5JLVJkoZiQftAMjo0peZPO\n"
539"EQ==\n"
540"-----END CERTIFICATE-----\n\n",
541 NULL,
542 };
543
544 if (path == NULL)
545 return (char **)&samplecerts;
546
547 stat(path, &sb);
548 if (!(sb.st_mode & S_IFDIR)) {
549 printf("ERROR: %s is not directory.\n", path);
550 exit(0);
551 }
552
553 dirp = opendir(path);
554 if (dirp == NULL) {
555 printf("opendir failed.\n");
556 exit(0);
557 }
558
559 n = 0;
560 while ((dp = readdir(dirp)) != NULL) {
561 if (dp->d_type != DT_REG)
562 continue;
563 if (strcmp(dp->d_name + strlen(dp->d_name) - 4, "cert"))
564 continue;
565 snprintf(buf, sizeof(buf), "%s/%s", path, dp->d_name);
566 stat(buf, &sb);
567
568 p = (char **)realloc(certs, (n + 1) * sizeof(certs));
569 if (p == NULL)
570 err(1, "realloc");
571 certs = p;
572
573 certs[n] = malloc(sb.st_size + 1);
574 if (certs[n] == NULL)
575 err(1, "malloc");
576
577 fd = open(buf, O_RDONLY);
578 if (fd == -1)
579 err(1, "open");
580 len = read(fd, certs[n], sb.st_size);
581 if (len == -1)
582 err(1, "read");
583 if (len != sb.st_size)
584 errx(1, "read: length mismatch");
585 certs[n][sb.st_size] = '\0';
586 close(fd);
587
588 printf("%s: %d\n", dp->d_name, (int)sb.st_size);
589
590 n++;
591 }
592
593 p = (char **)realloc(certs, (n + 1) * sizeof(certs));
594 if (p == NULL)
595 err(1, "realloc");
596 certs = p;
597 certs[n] = NULL;
598
599 return certs;
600}
601#endif /* CERTTEST_BROKEN */
602
603typedef vchar_t* (eay_func) (vchar_t *, vchar_t *, vchar_t *);
604
605static int
606ciphertest_1 (const char *name,
607 vchar_t *data,
608 size_t data_align,
609 vchar_t *key,
610 size_t min_keysize,
611 vchar_t *iv0,
612 size_t iv_length,
613 eay_func encrypt,
614 eay_func decrypt)
615{
616 int padlen;
617 vchar_t *buf, *iv, *res1, *res2;
618 iv = vmalloc(iv_length);
619
620 printf("Test for cipher %s\n", name);
621 printf("data:\n");
622 PVDUMP(data);
623
624 if (data_align <= 1 || (data->l % data_align) == 0)
625 padlen = 0;
626 else
627 padlen = data_align - data->l % data_align;
628
629 buf = vmalloc(data->l + padlen);
630 memcpy(buf->v, data->v, data->l);
631
632 memcpy(iv->v, iv0->v, iv_length);
633 res1 = (encrypt)(buf, key, iv);
634 if (res1 == NULL) {
635 printf("%s encryption failed.\n", name);
636 return -1;
637 }
638 printf("encrypted:\n");
639 PVDUMP(res1);
640
641 memcpy(iv->v, iv0->v, iv_length);
642 res2 = (decrypt)(res1, key, iv);
643 if (res2 == NULL) {
644 printf("%s decryption failed.\n", name);
645 return -1;
646 }
647 printf("decrypted:\n");
648 PVDUMP(res2);
649
650 if (memcmp(data->v, res2->v, data->l)) {
651 printf("XXXX NG (%s) XXXX\n", name);
652 return -1;
653 }
654 else
655 printf("%s cipher verified.\n", name);
656 vfree(res1);
657 vfree(res2);
658 vfree(buf);
659 vfree(iv);
660
661 return 0;
662}
663
664int
665ciphertest(ac, av)
666 int ac;
667 char **av;
668{
669 vchar_t data;
670 vchar_t key;
671 vchar_t iv0;
672
673 printf("\n**Testing CIPHERS**\n");
674
675 data.v = str2val("\
67606000017 03000000 73616b61 6e65406b 616d652e 6e657409 0002c104 308202b8 \
67704f05a90 \
678 ", 16, &data.l);
679 key.v = str2val("f59bd70f 81b9b9cc 2a32c7fd 229a4b37", 16, &key.l);
680 iv0.v = str2val("26b68c90 9467b4ab 7ec29fa0 0b696b55", 16, &iv0.l);
681
682 if (ciphertest_1 ("DES",
683 &data, 8,
684 &key, 8,
685 &iv0, 8,
686 eay_des_encrypt, eay_des_decrypt) < 0)
687 return -1;
688
689 if (ciphertest_1 ("3DES",
690 &data, 8,
691 &key, 24,
692 &iv0, 8,
693 eay_3des_encrypt, eay_3des_decrypt) < 0)
694 return -1;
695
696 if (ciphertest_1 ("AES",
697 &data, 16,
698 &key, key.l,
699 &iv0, 16,
700 eay_aes_encrypt, eay_aes_decrypt) < 0)
701 return -1;
702
703 if (ciphertest_1 ("BLOWFISH",
704 &data, 8,
705 &key, key.l,
706 &iv0, 8,
707 eay_bf_encrypt, eay_bf_decrypt) < 0)
708 return -1;
709
710 if (ciphertest_1 ("CAST",
711 &data, 8,
712 &key, key.l,
713 &iv0, 8,
714 eay_cast_encrypt, eay_cast_decrypt) < 0)
715 return -1;
716
717#ifdef HAVE_OPENSSL_IDEA_H
718 if (ciphertest_1 ("IDEA",
719 &data, 8,
720 &key, key.l,
721 &iv0, 8,
722 eay_idea_encrypt, eay_idea_decrypt) < 0)
723 return -1;
724#endif
725
726#ifdef HAVE_OPENSSL_RC5_H
727 if (ciphertest_1 ("RC5",
728 &data, 8,
729 &key, key.l,
730 &iv0, 8,
731 eay_rc5_encrypt, eay_rc5_decrypt) < 0)
732 return -1;
733#endif
734 return 0;
735}
736
737int
738hmactest(ac, av)
739 int ac;
740 char **av;
741{
742 char *keyword = "hehehe test secret!";
743 char *object = "d7e6a6c1876ef0488bb74958b9fee94e";
744 char *object1 = "d7e6a6c1876ef048";
745 char *object2 = "8bb74958b9fee94e";
746 char *r_hmd5 = "5702d7d1 fd1bfc7e 210fc9fa cda7d02c";
747 char *r_hsha1 = "309999aa 9779a43e ebdea839 1b4e7ee1 d8646874";
748#ifdef WITH_SHA2
749 char *r_hsha2 = "d47262d8 a5b6f39d d8686939 411b3e79 ed2e27f9 2c4ea89f dd0a06ae 0c0aa396";
750#endif
751 vchar_t *key, *data, *data1, *data2, *res;
752 vchar_t mod;
753 caddr_t ctx;
754
755#ifdef WITH_SHA2
756 printf("\n**Test for HMAC MD5, SHA1, and SHA256.**\n");
757#else
758 printf("\n**Test for HMAC MD5 & SHA1.**\n");
759#endif
760
761 key = vmalloc(strlen(keyword));
762 memcpy(key->v, keyword, key->l);
763
764 data = vmalloc(strlen(object));
765 data1 = vmalloc(strlen(object1));
766 data2 = vmalloc(strlen(object2));
767 memcpy(data->v, object, data->l);
768 memcpy(data1->v, object1, data1->l);
769 memcpy(data2->v, object2, data2->l);
770
771 /* HMAC MD5 */
772 printf("HMAC MD5 by eay_hmacmd5_one()\n");
773 res = eay_hmacmd5_one(key, data);
774 PVDUMP(res);
775 mod.v = str2val(r_hmd5, 16, &mod.l);
776 if (memcmp(res->v, mod.v, mod.l)) {
777 printf(" XXX NG XXX\n");
778 return -1;
779 }
780 free(mod.v);
781 vfree(res);
782
783 /* HMAC MD5 */
784 printf("HMAC MD5 by eay_hmacmd5_xxx()\n");
785 ctx = eay_hmacmd5_init(key);
786 eay_hmacmd5_update(ctx, data1);
787 eay_hmacmd5_update(ctx, data2);
788 res = eay_hmacmd5_final(ctx);
789 PVDUMP(res);
790 mod.v = str2val(r_hmd5, 16, &mod.l);
791 if (memcmp(res->v, mod.v, mod.l)) {
792 printf(" XXX NG XXX\n");
793 return -1;
794 }
795 free(mod.v);
796 vfree(res);
797
798 /* HMAC SHA1 */
799 printf("HMAC SHA1 by eay_hmacsha1_one()\n");
800 res = eay_hmacsha1_one(key, data);
801 PVDUMP(res);
802 mod.v = str2val(r_hsha1, 16, &mod.l);
803 if (memcmp(res->v, mod.v, mod.l)) {
804 printf(" XXX NG XXX\n");
805 return -1;
806 }
807 free(mod.v);
808 vfree(res);
809
810 /* HMAC SHA1 */
811 printf("HMAC SHA1 by eay_hmacsha1_xxx()\n");
812 ctx = eay_hmacsha1_init(key);
813 eay_hmacsha1_update(ctx, data1);
814 eay_hmacsha1_update(ctx, data2);
815 res = eay_hmacsha1_final(ctx);
816 PVDUMP(res);
817 mod.v = str2val(r_hsha1, 16, &mod.l);
818 if (memcmp(res->v, mod.v, mod.l)) {
819 printf(" XXX NG XXX\n");
820 return -1;
821 }
822 free(mod.v);
823 vfree(res);
824
825#ifdef WITH_SHA2
826 /* HMAC SHA2 */
827 printf("HMAC SHA2 by eay_hmacsha2_256_one()\n");
828 res = eay_hmacsha2_256_one(key, data);
829 PVDUMP(res);
830 mod.v = str2val(r_hsha2, 16, &mod.l);
831 if (memcmp(res->v, mod.v, mod.l)) {
832 printf(" XXX NG XXX\n");
833 return -1;
834 }
835 free(mod.v);
836 vfree(res);
837#endif
838
839 vfree(data);
840 vfree(data1);
841 vfree(data2);
842 vfree(key);
843
844 return 0;
845}
846
847int
848sha1test(ac, av)
849 int ac;
850 char **av;
851{
852 char *word1 = "1234567890", *word2 = "12345678901234567890";
853 caddr_t ctx;
854 vchar_t *buf, *res;
855
856 printf("\n**Test for SHA1.**\n");
857
858 ctx = eay_sha1_init();
859 buf = vmalloc(strlen(word1));
860 memcpy(buf->v, word1, buf->l);
861 eay_sha1_update(ctx, buf);
862 eay_sha1_update(ctx, buf);
863 res = eay_sha1_final(ctx);
864 PVDUMP(res);
865 vfree(res);
866 vfree(buf);
867
868 ctx = eay_sha1_init();
869 buf = vmalloc(strlen(word2));
870 memcpy(buf->v, word2, buf->l);
871 eay_sha1_update(ctx, buf);
872 res = eay_sha1_final(ctx);
873 PVDUMP(res);
874 vfree(res);
875
876 res = eay_sha1_one(buf);
877 PVDUMP(res);
878 vfree(res);
879 vfree(buf);
880
881 return 0;
882}
883
884int
885md5test(ac, av)
886 int ac;
887 char **av;
888{
889 char *word1 = "1234567890", *word2 = "12345678901234567890";
890 caddr_t ctx;
891 vchar_t *buf, *res;
892
893 printf("\n**Test for MD5.**\n");
894
895 ctx = eay_md5_init();
896 buf = vmalloc(strlen(word1));
897 memcpy(buf->v, word1, buf->l);
898 eay_md5_update(ctx, buf);
899 eay_md5_update(ctx, buf);
900 res = eay_md5_final(ctx);
901 PVDUMP(res);
902 vfree(res);
903 vfree(buf);
904
905 ctx = eay_md5_init();
906 buf = vmalloc(strlen(word2));
907 memcpy(buf->v, word2, buf->l);
908 eay_md5_update(ctx, buf);
909 res = eay_md5_final(ctx);
910 PVDUMP(res);
911 vfree(res);
912
913 res = eay_md5_one(buf);
914 PVDUMP(res);
915 vfree(res);
916 vfree(buf);
917
918 return 0;
919}
920
921int
922dhtest(ac, av)
923 int ac;
924 char **av;
925{
926 static struct {
927 char *name;
928 char *p;
929 } px[] = {
930 { "modp768", OAKLEY_PRIME_MODP768, },
931 { "modp1024", OAKLEY_PRIME_MODP1024, },
932 { "modp1536", OAKLEY_PRIME_MODP1536, },
933 { "modp2048", OAKLEY_PRIME_MODP2048, },
934 { "modp3072", OAKLEY_PRIME_MODP3072, },
935 { "modp4096", OAKLEY_PRIME_MODP4096, },
936 { "modp6144", OAKLEY_PRIME_MODP6144, },
937 { "modp8192", OAKLEY_PRIME_MODP8192, },
938 };
939 vchar_t p1, *pub1, *priv1, *gxy1;
940 vchar_t p2, *pub2, *priv2, *gxy2;
941 int i;
942
943 printf("\n**Test for DH.**\n");
944
945 for (i = 0; i < sizeof(px)/sizeof(px[0]); i++) {
946 printf("\n**Test for DH %s.**\n", px[i].name);
947
948 p1.v = str2val(px[i].p, 16, &p1.l);
949 p2.v = str2val(px[i].p, 16, &p2.l);
950 printf("prime number = \n"); PVDUMP(&p1);
951
952 if (eay_dh_generate(&p1, 2, 96, &pub1, &priv1) < 0) {
953 printf("error\n");
954 return -1;
955 }
956 printf("private key for user 1 = \n"); PVDUMP(priv1);
957 printf("public key for user 1 = \n"); PVDUMP(pub1);
958
959 if (eay_dh_generate(&p2, 2, 96, &pub2, &priv2) < 0) {
960 printf("error\n");
961 return -1;
962 }
963 printf("private key for user 2 = \n"); PVDUMP(priv2);
964 printf("public key for user 2 = \n"); PVDUMP(pub2);
965
966 /* process to generate key for user 1 */
967 gxy1 = vmalloc(p1.l);
968 memset(gxy1->v, 0, gxy1->l);
969 eay_dh_compute(&p1, 2, pub1, priv1, pub2, &gxy1);
970 printf("sharing gxy1 of user 1 = \n"); PVDUMP(gxy1);
971
972 /* process to generate key for user 2 */
973 gxy2 = vmalloc(p1.l);
974 memset(gxy2->v, 0, gxy2->l);
975 eay_dh_compute(&p2, 2, pub2, priv2, pub1, &gxy2);
976 printf("sharing gxy2 of user 2 = \n"); PVDUMP(gxy2);
977
978 if (memcmp(gxy1->v, gxy2->v, gxy1->l)) {
979 printf("ERROR: sharing gxy mismatched.\n");
980 return -1;
981 }
982
983 vfree(pub1);
984 vfree(pub2);
985 vfree(priv1);
986 vfree(priv2);
987 vfree(gxy1);
988 vfree(gxy2);
989 }
990
991 return 0;
992}
993
994int
995bntest(ac, av)
996 int ac;
997 char **av;
998{
999 vchar_t *rn;
1000
1001 printf("\n**Test for generate a random number.**\n");
1002
1003 rn = eay_set_random((u_int32_t)96);
1004 PVDUMP(rn);
1005 vfree(rn);
1006
1007 return 0;
1008}
1009
1010struct {
1011 char *name;
1012 int (*func) __P((int, char **));
1013} func[] = {
1014 { "random", bntest, },
1015 { "dh", dhtest, },
1016 { "md5", md5test, },
1017 { "sha1", sha1test, },
1018 { "hmac", hmactest, },
1019 { "cipher", ciphertest, },
1020#ifndef CERTTEST_BROKEN
1021 { "cert", certtest, },
1022#endif
1023 { "rsa", rsatest, },
1024};
1025
1026int
1027main(ac, av)
1028 int ac;
1029 char **av;
1030{
1031 int i;
1032 int len = sizeof(func)/sizeof(func[0]);
1033
1034 f_foreground = 1;
1035 ploginit();
1036
1037 //printf ("\nTestsuite of the %s\nlinked with %s\n\n", TOP_PACKAGE_STRING, eay_version());
1038
1039 if (strcmp(*av, "-h") == 0)
1040 Usage();
1041
1042 ac--;
1043 av++;
1044
1045 for (i = 0; i < len; i++) {
1046 if ((ac == 0) || (strcmp(*av, func[i].name) == 0)) {
1047 if ((func[i].func)(ac, av) != 0) {
1048 printf ("\n!!!!! Test '%s' failed. !!!!!\n\n", func[i].name);
1049 exit(1);
1050 }
1051 if (ac)
1052 break;
1053 }
1054 }
1055 if (ac && i == len)
1056 Usage();
1057
1058 printf ("\n===== All tests passed =====\n\n");
1059 exit(0);
1060}
1061
1062void
1063Usage()
1064{
1065 int i;
1066 int len = sizeof(func)/sizeof(func[0]);
1067
1068 printf("Usage: eaytest [");
1069 for (i = 0; i < len; i++)
1070 printf("%s%s", func[i].name, (i<len-1)?"|":"");
1071 printf("]\n");
1072#ifndef CERTTEST_BROKEN
1073 printf(" eaytest cert [cert_directory]\n");
1074#endif
1075 exit(1);
1076}
1077