1 /* $NetBSD: eaytest.c,v 1.8 2007/06/06 15:37:15 vanhu Exp $ */
3 /* Id: eaytest.c,v 1.22 2005/06/19 18:02:54 manubsd Exp */
6 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
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.
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
36 #include <sys/types.h>
38 #include <sys/socket.h>
40 #include <netinet/in.h>
51 #include <openssl/bio.h>
52 #include <openssl/pem.h>
63 #include "crypto_openssl.h"
66 #include "package_version.h"
68 #define PVDUMP(var) racoon_hexdump((var)->v, (var)->l)
70 /*#define CERTTEST_BROKEN */
74 static vchar_t
*pem_read_buf
__P((char *));
75 void Usage
__P((void));
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 **));
92 rsa_verify_with_pubkey(src
, sig
, pubkey_txt
)
100 bio
= BIO_new_mem_buf(pubkey_txt
, strlen(pubkey_txt
));
101 evp
= PEM_read_bio_PUBKEY(bio
, NULL
, NULL
, NULL
);
103 printf ("PEM_read_PUBKEY(): %s\n", eay_strerror());
106 error
= eay_check_rsasign(src
, sig
, evp
->pkey
.rsa
);
116 char *text
= "this is test.";
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";
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";
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"
153 "-----END PUBLIC KEY-----\n\n";
155 printf ("%s", pkcs1
);
156 printf ("%s", pubkey
);
157 priv
= pem_read_buf(pkcs1
);
160 src
.l
= strlen(text
);
163 sig
= eay_get_x509sign(&src
, priv
);
165 printf("sign failed. %s\n", eay_strerror());
169 printf("RSA signed data.\n");
172 printf("Verification with correct pubkey: ");
173 if (rsa_verify_with_pubkey (&src
, sig
, pubkey
) != 0) {
174 printf ("Failed.\n");
178 printf ("Verified. Good.\n");
180 loglevel_saved
= loglevel
;
182 printf("Verification with wrong pubkey: ");
183 if (rsa_verify_with_pubkey (&src
, sig
, pubkey_wrong
) != 0)
184 printf ("Not verified. Good.\n");
186 printf ("Verified. This is bad...\n");
187 loglevel
= loglevel_saved
;
190 loglevel
= loglevel_saved
;
200 char *nm
= NULL
, *header
= NULL
;
201 unsigned char *data
= NULL
;
206 bio
= BIO_new_mem_buf(buf
, strlen(buf
));
207 error
= PEM_read_bio(bio
, &nm
, &header
, &data
, &len
);
209 errx(1, "%s", eay_strerror());
213 memcpy(ret
->v
, data
, len
);
218 #ifndef CERTTEST_BROKEN
229 printf("\n**Test for Certificate.**\n");
232 vchar_t
*asn1dn
= NULL
, asn1dn0
;
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
;
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,
258 0x6b,0x61,0x6e,0x65,0x40,0x6b,0x61,0x6d,
259 0x65,0x2e,0x6e,0x65,0x74,
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=*";
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,
285 printf("check to convert the string into subjectName.\n");
286 printf("%s\n", dnstr
);
289 asn1dn0
.l
= sizeof(dn0
);
291 asn1dn
= eay_str2asn1dn(dnstr
, strlen(dnstr
));
292 if (asn1dn
== NULL
|| asn1dn
->l
!= asn1dn0
.l
)
293 #ifdef OUTPUT_VALID_ASN1DN
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
++);
302 errx(1, "asn1dn length mismatched (%zu != %zu).\n", asn1dn
? asn1dn
->l
: -1, asn1dn0
.l
);
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.
310 if (eay_cmp_asn1dn(&asn1dn0
, asn1dn
))
311 errx(1, "asn1dn mismatched.\n");
314 printf("exact match: succeed.\n");
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");
323 printf("wildcard 1 match: succeed.\n");
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");
333 printf("wildcard 2 match: succeed.\n");
341 certpath
= *(av
+ 1);
342 certs
= getcerts(certpath
);
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");
349 certpath
= "/usr/local/openssl/certs";
350 certs
= getcerts(NULL
);
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 "
360 while (*certs
!= NULL
) {
366 printf("===CERT===\n");
369 c
.l
= strlen(*certs
);
372 str
= eay_get_x509text(&c
);
376 /* print ASN.1 of subject name */
377 vstr
= eay_get_x509asn1subjectname(&c
);
384 /* print subject alt name */
387 for (pos
= 1; ; pos
++) {
388 error
= eay_get_x509subjectaltname(&c
, &str
, &type
, pos
);
390 printf("no subjectaltname found.\n");
395 printf("SubjectAltName: %d: %s\n", type
, str
);
400 /* NULL => name of the certificate file */
401 error
= eay_check_x509cert(&c
, certpath
, NULL
, 1);
403 printf("ERROR: cert is invalid.\n");
415 char **certs
= NULL
, **p
;
424 static char *samplecerts
[] = {
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"
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",
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",
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",
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"
523 "-----END CERTIFICATE-----\n\n",
528 return (char **)&samplecerts
;
531 if (!(sb
.st_mode
& S_IFDIR
)) {
532 printf("ERROR: %s is not directory.\n", path
);
536 dirp
= opendir(path
);
538 printf("opendir failed.\n");
543 while ((dp
= readdir(dirp
)) != NULL
) {
544 if (dp
->d_type
!= DT_REG
)
546 if (strcmp(dp
->d_name
+ strlen(dp
->d_name
) - 4, "cert"))
548 snprintf(buf
, sizeof(buf
), "%s/%s", path
, dp
->d_name
);
551 p
= (char **)realloc(certs
, (n
+ 1) * sizeof(certs
));
556 certs
[n
] = malloc(sb
.st_size
+ 1);
557 if (certs
[n
] == NULL
)
560 fd
= open(buf
, O_RDONLY
);
563 len
= read(fd
, certs
[n
], sb
.st_size
);
566 if (len
!= sb
.st_size
)
567 errx(1, "read: length mismatch");
568 certs
[n
][sb
.st_size
] = '\0';
571 printf("%s: %d\n", dp
->d_name
, (int)sb
.st_size
);
576 p
= (char **)realloc(certs
, (n
+ 1) * sizeof(certs
));
584 #endif /* CERTTEST_BROKEN */
586 typedef vchar_t
* (eay_func
) (vchar_t
*, vchar_t
*, vchar_t
*);
589 ciphertest_1 (const char *name
,
600 vchar_t
*buf
, *iv
, *res1
, *res2
;
601 iv
= vmalloc(iv_length
);
603 printf("Test for cipher %s\n", name
);
607 if (data_align
<= 1 || (data
->l
% data_align
) == 0)
610 padlen
= data_align
- data
->l
% data_align
;
612 buf
= vmalloc(data
->l
+ padlen
);
613 memcpy(buf
->v
, data
->v
, data
->l
);
615 memcpy(iv
->v
, iv0
->v
, iv_length
);
616 res1
= (encrypt
)(buf
, key
, iv
);
618 printf("%s encryption failed.\n", name
);
621 printf("encrypted:\n");
624 memcpy(iv
->v
, iv0
->v
, iv_length
);
625 res2
= (decrypt
)(res1
, key
, iv
);
627 printf("%s decryption failed.\n", name
);
630 printf("decrypted:\n");
633 if (memcmp(data
->v
, res2
->v
, data
->l
)) {
634 printf("XXXX NG (%s) XXXX\n", name
);
638 printf("%s cipher verified.\n", name
);
656 printf("\n**Testing CIPHERS**\n");
659 06000017 03000000 73616b61 6e65406b 616d652e 6e657409 0002c104 308202b8 \
662 key
.v
= str2val("f59bd70f 81b9b9cc 2a32c7fd 229a4b37", 16, &key
.l
);
663 iv0
.v
= str2val("26b68c90 9467b4ab 7ec29fa0 0b696b55", 16, &iv0
.l
);
665 if (ciphertest_1 ("DES",
669 eay_des_encrypt
, eay_des_decrypt
) < 0)
672 if (ciphertest_1 ("3DES",
676 eay_3des_encrypt
, eay_3des_decrypt
) < 0)
679 if (ciphertest_1 ("AES",
683 eay_aes_encrypt
, eay_aes_decrypt
) < 0)
686 if (ciphertest_1 ("BLOWFISH",
690 eay_bf_encrypt
, eay_bf_decrypt
) < 0)
693 if (ciphertest_1 ("CAST",
697 eay_cast_encrypt
, eay_cast_decrypt
) < 0)
700 #ifdef HAVE_OPENSSL_IDEA_H
701 if (ciphertest_1 ("IDEA",
705 eay_idea_encrypt
, eay_idea_decrypt
) < 0)
709 #ifdef HAVE_OPENSSL_RC5_H
710 if (ciphertest_1 ("RC5",
714 eay_rc5_encrypt
, eay_rc5_decrypt
) < 0)
717 #if defined(HAVE_OPENSSL_CAMELLIA_H)
718 if (ciphertest_1 ("CAMELLIA",
722 eay_camellia_encrypt
, eay_camellia_decrypt
) < 0)
733 char *keyword
= "hehehe test secret!";
734 char *object
= "d7e6a6c1876ef0488bb74958b9fee94e";
735 char *object1
= "d7e6a6c1876ef048";
736 char *object2
= "8bb74958b9fee94e";
737 char *r_hmd5
= "5702d7d1 fd1bfc7e 210fc9fa cda7d02c";
738 char *r_hsha1
= "309999aa 9779a43e ebdea839 1b4e7ee1 d8646874";
740 char *r_hsha2
= "d47262d8 a5b6f39d d8686939 411b3e79 ed2e27f9 2c4ea89f dd0a06ae 0c0aa396";
742 vchar_t
*key
, *data
, *data1
, *data2
, *res
;
747 printf("\n**Test for HMAC MD5, SHA1, and SHA256.**\n");
749 printf("\n**Test for HMAC MD5 & SHA1.**\n");
752 key
= vmalloc(strlen(keyword
));
753 memcpy(key
->v
, keyword
, key
->l
);
755 data
= vmalloc(strlen(object
));
756 data1
= vmalloc(strlen(object1
));
757 data2
= vmalloc(strlen(object2
));
758 memcpy(data
->v
, object
, data
->l
);
759 memcpy(data1
->v
, object1
, data1
->l
);
760 memcpy(data2
->v
, object2
, data2
->l
);
763 printf("HMAC MD5 by eay_hmacmd5_one()\n");
764 res
= eay_hmacmd5_one(key
, data
);
766 mod
.v
= str2val(r_hmd5
, 16, &mod
.l
);
767 if (memcmp(res
->v
, mod
.v
, mod
.l
)) {
768 printf(" XXX NG XXX\n");
775 printf("HMAC MD5 by eay_hmacmd5_xxx()\n");
776 ctx
= eay_hmacmd5_init(key
);
777 eay_hmacmd5_update(ctx
, data1
);
778 eay_hmacmd5_update(ctx
, data2
);
779 res
= eay_hmacmd5_final(ctx
);
781 mod
.v
= str2val(r_hmd5
, 16, &mod
.l
);
782 if (memcmp(res
->v
, mod
.v
, mod
.l
)) {
783 printf(" XXX NG XXX\n");
790 printf("HMAC SHA1 by eay_hmacsha1_one()\n");
791 res
= eay_hmacsha1_one(key
, data
);
793 mod
.v
= str2val(r_hsha1
, 16, &mod
.l
);
794 if (memcmp(res
->v
, mod
.v
, mod
.l
)) {
795 printf(" XXX NG XXX\n");
802 printf("HMAC SHA1 by eay_hmacsha1_xxx()\n");
803 ctx
= eay_hmacsha1_init(key
);
804 eay_hmacsha1_update(ctx
, data1
);
805 eay_hmacsha1_update(ctx
, data2
);
806 res
= eay_hmacsha1_final(ctx
);
808 mod
.v
= str2val(r_hsha1
, 16, &mod
.l
);
809 if (memcmp(res
->v
, mod
.v
, mod
.l
)) {
810 printf(" XXX NG XXX\n");
818 printf("HMAC SHA2 by eay_hmacsha2_256_one()\n");
819 res
= eay_hmacsha2_256_one(key
, data
);
821 mod
.v
= str2val(r_hsha2
, 16, &mod
.l
);
822 if (memcmp(res
->v
, mod
.v
, mod
.l
)) {
823 printf(" XXX NG XXX\n");
843 char *word1
= "1234567890", *word2
= "12345678901234567890";
847 printf("\n**Test for SHA1.**\n");
849 ctx
= eay_sha1_init();
850 buf
= vmalloc(strlen(word1
));
851 memcpy(buf
->v
, word1
, buf
->l
);
852 eay_sha1_update(ctx
, buf
);
853 eay_sha1_update(ctx
, buf
);
854 res
= eay_sha1_final(ctx
);
859 ctx
= eay_sha1_init();
860 buf
= vmalloc(strlen(word2
));
861 memcpy(buf
->v
, word2
, buf
->l
);
862 eay_sha1_update(ctx
, buf
);
863 res
= eay_sha1_final(ctx
);
867 res
= eay_sha1_one(buf
);
880 char *word1
= "1234567890", *word2
= "12345678901234567890";
884 printf("\n**Test for MD5.**\n");
886 ctx
= eay_md5_init();
887 buf
= vmalloc(strlen(word1
));
888 memcpy(buf
->v
, word1
, buf
->l
);
889 eay_md5_update(ctx
, buf
);
890 eay_md5_update(ctx
, buf
);
891 res
= eay_md5_final(ctx
);
896 ctx
= eay_md5_init();
897 buf
= vmalloc(strlen(word2
));
898 memcpy(buf
->v
, word2
, buf
->l
);
899 eay_md5_update(ctx
, buf
);
900 res
= eay_md5_final(ctx
);
904 res
= eay_md5_one(buf
);
921 { "modp768", OAKLEY_PRIME_MODP768
, },
922 { "modp1024", OAKLEY_PRIME_MODP1024
, },
923 { "modp1536", OAKLEY_PRIME_MODP1536
, },
924 { "modp2048", OAKLEY_PRIME_MODP2048
, },
925 { "modp3072", OAKLEY_PRIME_MODP3072
, },
926 { "modp4096", OAKLEY_PRIME_MODP4096
, },
927 { "modp6144", OAKLEY_PRIME_MODP6144
, },
928 { "modp8192", OAKLEY_PRIME_MODP8192
, },
930 vchar_t p1
, *pub1
, *priv1
, *gxy1
;
931 vchar_t p2
, *pub2
, *priv2
, *gxy2
;
934 printf("\n**Test for DH.**\n");
936 for (i
= 0; i
< sizeof(px
)/sizeof(px
[0]); i
++) {
937 printf("\n**Test for DH %s.**\n", px
[i
].name
);
939 p1
.v
= str2val(px
[i
].p
, 16, &p1
.l
);
940 p2
.v
= str2val(px
[i
].p
, 16, &p2
.l
);
941 printf("prime number = \n"); PVDUMP(&p1
);
943 if (eay_dh_generate(&p1
, 2, 96, &pub1
, &priv1
) < 0) {
947 printf("private key for user 1 = \n"); PVDUMP(priv1
);
948 printf("public key for user 1 = \n"); PVDUMP(pub1
);
950 if (eay_dh_generate(&p2
, 2, 96, &pub2
, &priv2
) < 0) {
954 printf("private key for user 2 = \n"); PVDUMP(priv2
);
955 printf("public key for user 2 = \n"); PVDUMP(pub2
);
957 /* process to generate key for user 1 */
958 gxy1
= vmalloc(p1
.l
);
959 memset(gxy1
->v
, 0, gxy1
->l
);
960 eay_dh_compute(&p1
, 2, pub1
, priv1
, pub2
, &gxy1
);
961 printf("sharing gxy1 of user 1 = \n"); PVDUMP(gxy1
);
963 /* process to generate key for user 2 */
964 gxy2
= vmalloc(p1
.l
);
965 memset(gxy2
->v
, 0, gxy2
->l
);
966 eay_dh_compute(&p2
, 2, pub2
, priv2
, pub1
, &gxy2
);
967 printf("sharing gxy2 of user 2 = \n"); PVDUMP(gxy2
);
969 if (memcmp(gxy1
->v
, gxy2
->v
, gxy1
->l
)) {
970 printf("ERROR: sharing gxy mismatched.\n");
992 printf("\n**Test for generate a random number.**\n");
994 rn
= eay_set_random((u_int32_t
)96);
1003 int (*func
) __P((int, char **));
1005 { "random", bntest
, },
1007 { "md5", md5test
, },
1008 { "sha1", sha1test
, },
1009 { "hmac", hmactest
, },
1010 { "cipher", ciphertest
, },
1011 #ifndef CERTTEST_BROKEN
1012 { "cert", certtest
, },
1014 { "rsa", rsatest
, },
1023 int len
= sizeof(func
)/sizeof(func
[0]);
1028 printf ("\nTestsuite of the %s\nlinked with %s\n\n", TOP_PACKAGE_STRING
, eay_version());
1030 if (strcmp(*av
, "-h") == 0)
1036 for (i
= 0; i
< len
; i
++) {
1037 if ((ac
== 0) || (strcmp(*av
, func
[i
].name
) == 0)) {
1038 if ((func
[i
].func
)(ac
, av
) != 0) {
1039 printf ("\n!!!!! Test '%s' failed. !!!!!\n\n", func
[i
].name
);
1049 printf ("\n===== All tests passed =====\n\n");
1057 int len
= sizeof(func
)/sizeof(func
[0]);
1059 printf("Usage: eaytest [");
1060 for (i
= 0; i
< len
; i
++)
1061 printf("%s%s", func
[i
].name
, (i
<len
-1)?"|":"");
1063 #ifndef CERTTEST_BROKEN
1064 printf(" eaytest cert [cert_directory]\n");