File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / ipsec-tools / src / racoon / eaytest.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 22:39:10 2012 UTC (12 years, 4 months ago) by misho
Branches: ipsec-tools, MAIN
CVS tags: v0_8_2p2, v0_8_1p0, v0_8_1, v0_8_0p0, v0_8_0, HEAD
ipsec-tools

    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>