Annotation of embedaddon/ipsec-tools/src/racoon/eaytest.c, revision 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>