1f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh/*	$NetBSD: eaytest.c,v 1.10 2010/01/17 23:02:48 wiz Exp $	*/
20a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
30a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* Id: eaytest.c,v 1.22 2005/06/19 18:02:54 manubsd Exp */
40a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
50a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/*
60a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
70a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * All rights reserved.
80a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang *
90a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * Redistribution and use in source and binary forms, with or without
100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * modification, are permitted provided that the following conditions
110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * are met:
120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * 1. Redistributions of source code must retain the above copyright
130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang *    notice, this list of conditions and the following disclaimer.
140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * 2. Redistributions in binary form must reproduce the above copyright
150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang *    notice, this list of conditions and the following disclaimer in the
160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang *    documentation and/or other materials provided with the distribution.
170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * 3. Neither the name of the project nor the names of its contributors
180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang *    may be used to endorse or promote products derived from this software
190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang *    without specific prior written permission.
200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang *
210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * SUCH DAMAGE.
320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang */
330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "config.h"
350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <sys/types.h>
370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <sys/stat.h>
380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <sys/socket.h>
390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <netinet/in.h>
410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <stdlib.h>
430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <stdio.h>
440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <string.h>
450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <limits.h>
460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <dirent.h>
470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <fcntl.h>
480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <unistd.h>
490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <err.h>
500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <openssl/bio.h>
520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <openssl/pem.h>
530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "var.h"
550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "vmbuf.h"
560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "misc.h"
570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "debug.h"
580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "str2val.h"
590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "plog.h"
600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "oakley.h"
620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "dhgroup.h"
630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "crypto_openssl.h"
640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "gnuc.h"
650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "package_version.h"
670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#define PVDUMP(var) racoon_hexdump((var)->v, (var)->l)
690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/*#define CERTTEST_BROKEN */
710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* prototype */
730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t *pem_read_buf __P((char *));
750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid Usage __P((void));
760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint rsatest __P((int, char **));
780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint ciphertest __P((int, char **));
790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint hmactest __P((int, char **));
800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint sha1test __P((int, char **));
810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint md5test __P((int, char **));
820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint dhtest __P((int, char **));
830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint bntest __P((int, char **));
840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifndef CERTTEST_BROKEN
850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic char **getcerts __P((char *));
860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint certtest __P((int, char **));
870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif
880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* test */
900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic int
920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangrsa_verify_with_pubkey(src, sig, pubkey_txt)
930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vchar_t *src, *sig;
940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *pubkey_txt;
950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	BIO *bio;
970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	EVP_PKEY *evp;
980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int error;
990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
1000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	bio = BIO_new_mem_buf(pubkey_txt, strlen(pubkey_txt));
1010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	evp = PEM_read_bio_PUBKEY(bio, NULL, NULL, NULL);
1020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (! evp) {
1030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf ("PEM_read_PUBKEY(): %s\n", eay_strerror());
1040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		return -1;
1050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
1060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	error = eay_check_rsasign(src, sig, evp->pkey.rsa);
1070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
1080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	return error;
1090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
1100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
1110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint
1120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangrsatest(ac, av)
1130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int ac;
1140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char **av;
1150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
1160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *text = "this is test.";
1170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vchar_t src;
1180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vchar_t *priv, *sig;
1190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int loglevel_saved;
1200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
1210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *pkcs1 =
1220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"-----BEGIN RSA PRIVATE KEY-----\n"
1230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"MIICXQIBAAKBgQChe5/Fzk9SA0vCKBOcu9jBcLb9oLv50PeuEfQojhakY+OH8A3Q\n"
1240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"M8A0qIDG6uhTNGPvzCWb/+mKeOB48n5HJpLxlDFyP3kyd2yXHIZ/MN8g1nh4FsB0\n"
1250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"iTkk8QUCJkkan6FCOBrIeLEsGA5AdodzuR+khnCMt8vO+NFHZYKAQeynyQIDAQAB\n"
1260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"AoGAOfDcnCHxjhDGrwyoNNWl6Yqi7hAtQm67YAbrH14UO7nnmxAENM9MyNgpFLaW\n"
1270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"07v5m8IZQIcradcDXAJOUwNBN8E06UflwEYCaScIwndvr5UpVlN3e2NC6Wyg2yC7\n"
1280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"GarxQput3zj35XNR5bK42UneU0H6zDxpHWqI1SwE+ToAHu0CQQDNl9gUJTpg0L09\n"
1290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"HkbE5jeb8bA5I20nKqBOBP0v5tnzpwu41umQwk9I7Ru0ucD7j+DW4k8otadW+FnI\n"
1300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"G1M1MpSjAkEAyRMt4bN8otfpOpsOQWzw4jQtouohOxRFCrQTntHhU20PrQnQLZWs\n"
1310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"pOVzqCjRytYtkPEUA1z8QK5gGcVPcOQsowJBALmt2rwPB1NrEo5Bat7noO+Zb3Ob\n"
1320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"WDiYWeE8xkHd95gDlSWiC53ur9aINo6ZeP556jGIgL+el/yHHecJLrQL84sCQH48\n"
1330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"zUxq/C/cb++8UzneJGlPqusiJNTLiAENR1gpmlZfHT1c8Nb9phMsfu0vG29GAfuC\n"
1340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"bzchVLljALCNQK+2gRMCQQCNIgN+R9mRWZhFAcC1sq++YnuSBlw4VwdL/fd1Yg9e\n"
1350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"Ul+U98yPl/NXt8Rs4TRBFcOZjkFI8xv0hQtevTgTmgz+\n"
1360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"-----END RSA PRIVATE KEY-----\n\n";
1370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *pubkey =
1380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"-----BEGIN PUBLIC KEY-----\n"
1390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQChe5/Fzk9SA0vCKBOcu9jBcLb9\n"
1400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"oLv50PeuEfQojhakY+OH8A3QM8A0qIDG6uhTNGPvzCWb/+mKeOB48n5HJpLxlDFy\n"
1410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"P3kyd2yXHIZ/MN8g1nh4FsB0iTkk8QUCJkkan6FCOBrIeLEsGA5AdodzuR+khnCM\n"
1420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"t8vO+NFHZYKAQeynyQIDAQAB\n"
1430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"-----END PUBLIC KEY-----\n\n";
1440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *pubkey_wrong =
1450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"-----BEGIN PUBLIC KEY-----\n"
1460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwDncG2tSokRBhK8la1mO\n"
1470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"QnUpxg6KvpoFUjEyRiIE1GRap5V6jCCEOmA9ZAz4Oa/97oxewwMWtchIxSBZVCia\n"
1480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"H9oGasbOFzrtSR+MKl6Cb/Ow3Fu+PKbHTsnfTk/nOOWyaQh91PRD7fdwHe8L9P7w\n"
1490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"2kFPmDW6+RNKIR4OErhXf1O0eSShPe0TO3vx43O7dWqhmh3Kgr4Jq7zAGqHtwu0B\n"
1500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"RFZnmsocOnVZb2yAHndp51/Mk1H37ThHwN7qMx7RqrS3ru3XtchpJd9IQJPBIRfY\n"
1510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"VYQ68u5ix/Z80Y6VkRf0qnAvel8B6D3N3Zyq5u7G60PfvvtCybeMn7nVrSMxqMW/\n"
1520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"xwIDAQAB\n"
1530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"-----END PUBLIC KEY-----\n\n";
1540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
1550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	printf ("%s", pkcs1);
1560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	printf ("%s", pubkey);
1570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	priv = pem_read_buf(pkcs1);
1580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
1590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	src.v = text;
1600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	src.l = strlen(text);
1610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
1620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	/* sign */
1630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	sig = eay_get_x509sign(&src, priv);
1640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (sig == NULL) {
1650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("sign failed. %s\n", eay_strerror());
1660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		return -1;
1670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
1680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
1690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	printf("RSA signed data.\n");
1700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	PVDUMP(sig);
1710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
1720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	printf("Verification with correct pubkey: ");
1730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (rsa_verify_with_pubkey (&src, sig, pubkey) != 0) {
1740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf ("Failed.\n");
1750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		return -1;
1760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
1770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	else
1780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf ("Verified. Good.\n");
1790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
1800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	loglevel_saved = loglevel;
1810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	loglevel = 0;
1820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	printf("Verification with wrong pubkey: ");
1830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (rsa_verify_with_pubkey (&src, sig, pubkey_wrong) != 0)
1840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf ("Not verified. Good.\n");
1850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	else {
1860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf ("Verified. This is bad...\n");
1870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		loglevel = loglevel_saved;
1880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		return -1;
1890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
1900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	loglevel = loglevel_saved;
1910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
1920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	return 0;
1930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
1940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
1950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic vchar_t *
1960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangpem_read_buf(buf)
1970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *buf;
1980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
1990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	BIO *bio;
2000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *nm = NULL, *header = NULL;
2010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	unsigned char *data = NULL;
2020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	long len;
2030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vchar_t *ret;
2040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int error;
2050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
2060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	bio = BIO_new_mem_buf(buf, strlen(buf));
2070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	error = PEM_read_bio(bio, &nm, &header, &data, &len);
2080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (error == 0)
2090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		errx(1, "%s", eay_strerror());
2100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	ret = vmalloc(len);
2110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (ret == NULL)
2120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		err(1, "vmalloc");
2130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	memcpy(ret->v, data, len);
2140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
2150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	return ret;
2160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
2170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
2180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifndef CERTTEST_BROKEN
2190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint
2200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangcerttest(ac, av)
2210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int ac;
2220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char **av;
2230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
2240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *certpath;
2250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char **certs;
2260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int type;
2270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int error;
2280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
2290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	printf("\n**Test for Certificate.**\n");
2300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
2310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang    {
2320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vchar_t *asn1dn = NULL, asn1dn0;
2330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef ORIG_DN
2340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char dnstr[] = "C=JP, ST=Kanagawa, L=Fujisawa, O=WIDE Project, OU=KAME Project, CN=Shoichi Sakane/Email=sakane@kame.net";
2350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *dnstr_w1 = NULL;
2360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *dnstr_w2 = NULL;
2370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char dn0[] = {
2380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		0x30,0x81,0x9a,0x31,0x0b,0x30,0x09,0x06,
2390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		0x03,0x55,0x04,0x06,0x13,0x02,0x4a,0x50,
2400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		0x31,0x11,0x30,0x0f,0x06,0x03,0x55,0x04,
2410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		0x08,0x13,0x08,0x4b,0x61,0x6e,0x61,0x67,
2420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		0x61,0x77,0x61,0x31,0x11,0x30,0x0f,0x06,
2430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		0x03,0x55,0x04,0x07,0x13,0x08,0x46,0x75,
2440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		0x6a,0x69,0x73,0x61,0x77,0x61,0x31,0x15,
2450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		0x30,0x13,0x06,0x03,0x55,0x04,0x0a,0x13,
2460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		0x0c,0x57,0x49,0x44,0x45,0x20,0x50,0x72,
2470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		0x6f,0x6a,0x65,0x63,0x74,0x31,0x15,0x30,
2480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		0x13,0x06,0x03,0x55,0x04,0x0b,0x13,0x0c,
2490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		0x4b,0x41,0x4d,0x45,0x20,0x50,0x72,0x6f,
2500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		0x6a,0x65,0x63,0x74,0x31,0x17,0x30,0x15,
2510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		0x06,0x03,0x55,0x04,0x03,0x13,0x0e,0x53,
2520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		0x68,0x6f,0x69,0x63,0x68,0x69,0x20,0x53,
2530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		0x61,0x6b,0x61,0x6e,0x65,0x31,0x1e,0x30,
2540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		0x1c,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,
2550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		0x0d,0x01,0x09,0x01,
2560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		0x0c,	/* <== XXX */
2570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		0x0f,0x73,0x61,
2580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		0x6b,0x61,0x6e,0x65,0x40,0x6b,0x61,0x6d,
2590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		0x65,0x2e,0x6e,0x65,0x74,
2600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	};
2610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#else /* not ORIG_DN */
2620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char dnstr[] = "C=JP, ST=Kanagawa, L=Fujisawa, O=WIDE Project, OU=KAME Project, CN=Shoichi Sakane";
2630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char dnstr_w1[] = "C=JP, ST=Kanagawa, L=Fujisawa, O=WIDE Project, OU=*, CN=Shoichi Sakane";
2640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char dnstr_w2[] = "C=JP, ST=Kanagawa, L=Fujisawa, O=WIDE Project, OU=KAME Project, CN=*";
2650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char dn0[] = {
2660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		0x30,0x7a,0x31,0x0b,0x30,0x09,0x06,0x03,
2670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		0x55,0x04,0x06,0x13,0x02,0x4a,0x50,0x31,
2680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		0x11,0x30,0x0f,0x06,0x03,0x55,0x04,0x08,
2690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		0x13,0x08,0x4b,0x61,0x6e,0x61,0x67,0x61,
2700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		0x77,0x61,0x31,0x11,0x30,0x0f,0x06,0x03,
2710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		0x55,0x04,0x07,0x13,0x08,0x46,0x75,0x6a,
2720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		0x69,0x73,0x61,0x77,0x61,0x31,0x15,0x30,
2730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		0x13,0x06,0x03,0x55,0x04,0x0a,0x13,0x0c,
2740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		0x57,0x49,0x44,0x45,0x20,0x50,0x72,0x6f,
2750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		0x6a,0x65,0x63,0x74,0x31,0x15,0x30,0x13,
2760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		0x06,0x03,0x55,0x04,0x0b,0x13,0x0c,0x4b,
2770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		0x41,0x4d,0x45,0x20,0x50,0x72,0x6f,0x6a,
2780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		0x65,0x63,0x74,0x31,0x17,0x30,0x15,0x06,
2790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		0x03,0x55,0x04,0x03,0x13,0x0e,0x53,0x68,
2800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		0x6f,0x69,0x63,0x68,0x69,0x20,0x53,0x61,
2810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		0x6b,0x61,0x6e,0x65,
2820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	};
2830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif /* ORIG_DN */
2840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
2850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	printf("check to convert the string into subjectName.\n");
2860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	printf("%s\n", dnstr);
2870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
2880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	asn1dn0.v = dn0;
2890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	asn1dn0.l = sizeof(dn0);
2900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
2910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	asn1dn = eay_str2asn1dn(dnstr, strlen(dnstr));
2920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (asn1dn == NULL || asn1dn->l != asn1dn0.l)
2930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef OUTPUT_VALID_ASN1DN
2940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{
2950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		unsigned char *cp; int  i;
2960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("asn1dn length mismatched (%zu != %zu).\n", asn1dn ? asn1dn->l : -1, asn1dn0.l);
2970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		for (cp = asn1dn->v, i = 0; i < asn1dn->l; i++)
2980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		    printf ("0x%02x,", *cp++);
2990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		exit (1);
3000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
3010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#else
3020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		errx(1, "asn1dn length mismatched (%zu != %zu).\n", asn1dn ? asn1dn->l : -1, asn1dn0.l);
3030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif
3040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
3050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	/*
3060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	 * NOTE: The value pointed by "<==" above is different from the
3070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	 * return of eay_str2asn1dn().  but eay_cmp_asn1dn() can distinguish
3080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	 * both of the names are same name.
3090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	 */
3100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (eay_cmp_asn1dn(&asn1dn0,  asn1dn))
3110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		errx(1, "asn1dn mismatched.\n");
3120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vfree(asn1dn);
3130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
3140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	printf("exact match: succeed.\n");
3150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
3160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (dnstr_w1 != NULL) {
3170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		asn1dn = eay_str2asn1dn(dnstr_w1, strlen(dnstr_w1));
3180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if (asn1dn == NULL || asn1dn->l == asn1dn0.l)
3190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			errx(1, "asn1dn length wrong for wildcard 1\n");
3200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if (eay_cmp_asn1dn(&asn1dn0,  asn1dn))
3210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			errx(1, "asn1dn mismatched for wildcard 1.\n");
3220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		vfree(asn1dn);
3230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("wildcard 1 match: succeed.\n");
3240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
3250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
3260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (dnstr_w1 != NULL) {
3270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		asn1dn = eay_str2asn1dn(dnstr_w2, strlen(dnstr_w2));
3280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if (asn1dn == NULL || asn1dn->l == asn1dn0.l)
3290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			errx(1, "asn1dn length wrong for wildcard 2\n");
3300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if (eay_cmp_asn1dn(&asn1dn0,  asn1dn))
3310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			errx(1, "asn1dn mismatched for wildcard 2.\n");
3320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		vfree(asn1dn);
3330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("wildcard 2 match: succeed.\n");
3340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
3350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
3360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang    }
3370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	eay_init();
3380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
3390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	/* get certs */
3400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (ac > 1) {
3410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		certpath = *(av + 1);
3420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		certs = getcerts(certpath);
3430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	} else {
3440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef ORIG_DN
3450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("\nCAUTION: These certificates are probably invalid "
3460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			"on your environment because you don't have their "
3470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			"issuer's certs in your environment.\n\n");
3480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
3490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		certpath = "/usr/local/openssl/certs";
3500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		certs = getcerts(NULL);
3510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#else
3520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("\nWARNING: The main certificates are probably invalid "
3530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			"on your environment\nbecause you don't have their "
3540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			"issuer's certs in your environment\nso not doing "
3550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			"this test.\n\n");
3560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		return (0);
3570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif
3580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
3590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
3600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	while (*certs != NULL) {
3610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
3620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		vchar_t c;
3630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		char *str;
3640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		vchar_t *vstr;
3650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
3660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("===CERT===\n");
3670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
3680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		c.v = *certs;
3690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		c.l = strlen(*certs);
3700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
3710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		/* print text */
3720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		str = eay_get_x509text(&c);
3730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("%s", str);
3740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		racoon_free(str);
3750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
3760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		/* print ASN.1 of subject name */
3770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		vstr = eay_get_x509asn1subjectname(&c);
3780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if (!vstr)
3790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			return 0;
3800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		PVDUMP(vstr);
3810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("\n");
3820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		vfree(vstr);
3830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
3840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		/* print subject alt name */
3850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	    {
3860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		int pos;
3870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		for (pos = 1; ; pos++) {
3880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			error = eay_get_x509subjectaltname(&c, &str, &type, pos);
3890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			if (error) {
3900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				printf("no subjectaltname found.\n");
3910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				break;
3920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			}
3930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			if (!str)
3940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				break;
3950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			printf("SubjectAltName: %d: %s\n", type, str);
3960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			racoon_free(str);
3970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		}
3980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	    }
3990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
4000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		/* NULL => name of the certificate file */
4010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		error = eay_check_x509cert(&c, certpath, NULL, 1);
4020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if (error)
4030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			printf("ERROR: cert is invalid.\n");
4040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("\n");
4050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
4060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		certs++;
4070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
4080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	return 0;
4090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
4100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
4110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic char **
4120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wanggetcerts(path)
4130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *path;
4140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
4150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char **certs = NULL, **p;
4160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	DIR *dirp;
4170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	struct dirent *dp;
4180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	struct stat sb;
4190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char buf[512];
4200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int len;
4210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int n;
4220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int fd;
4230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
4240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	static char *samplecerts[] = {
4250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* self signed */
4260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"-----BEGIN CERTIFICATE-----\n"
4270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"MIICpTCCAg4CAQAwDQYJKoZIhvcNAQEEBQAwgZoxCzAJBgNVBAYTAkpQMREwDwYD\n"
4280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"VQQIEwhLYW5hZ2F3YTERMA8GA1UEBxMIRnVqaXNhd2ExFTATBgNVBAoTDFdJREUg\n"
4290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"UHJvamVjdDEVMBMGA1UECxMMS0FNRSBQcm9qZWN0MRcwFQYDVQQDEw5TaG9pY2hp\n"
4300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"IFNha2FuZTEeMBwGCSqGSIb3DQEJARYPc2FrYW5lQGthbWUubmV0MB4XDTAwMDgy\n"
4310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"NDAxMzc0NFoXDTAwMDkyMzAxMzc0NFowgZoxCzAJBgNVBAYTAkpQMREwDwYDVQQI\n"
4320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"EwhLYW5hZ2F3YTERMA8GA1UEBxMIRnVqaXNhd2ExFTATBgNVBAoTDFdJREUgUHJv\n"
4330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"amVjdDEVMBMGA1UECxMMS0FNRSBQcm9qZWN0MRcwFQYDVQQDEw5TaG9pY2hpIFNh\n"
4340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"a2FuZTEeMBwGCSqGSIb3DQEJARYPc2FrYW5lQGthbWUubmV0MIGfMA0GCSqGSIb3\n"
4350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"DQEBAQUAA4GNADCBiQKBgQCpIQG/H3zn4czAmPBcbkDrYxE1A9vcpghpib3Of0Op\n"
4360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"SsiWIBOyIMiVAzK/I/JotWp3Vdn5fzGp/7DGAbWXAALas2xHkNmTMPpu6qhmNQ57\n"
4370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"kJHZHal24mgc1hwbrI9fb5olvIexx9a1riNPnKMRVHzXYizsyMbf+lJJmZ8QFhWN\n"
4380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"twIDAQABMA0GCSqGSIb3DQEBBAUAA4GBACKs6X/BYycuHI3iop403R3XWMHHnNBN\n"
4390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"5XTHVWiWgR1cMWkq/dp51gn+nPftpdAaYGpqGkiHGhZcXLoBaX9uON3p+7av+sQN\n"
4400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"plXwnvUf2Zsgu+fojskS0gKcDlYiq1O8TOaBgJouFZgr1q6PiYjVEJGogAP28+HN\n"
4410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"M4o+GBFbFoqK\n"
4420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"-----END CERTIFICATE-----\n\n",
4430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* signed by SSH testing CA + CA1 + CA2 */
4440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"-----BEGIN X509 CERTIFICATE-----\n"
4450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"MIICtTCCAj+gAwIBAgIEOaR8NjANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJG\n"
4460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"STEkMCIGA1UEChMbU1NIIENvbW11bmljYXRpb25zIFNlY3VyaXR5MREwDwYDVQQL\n"
4470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"EwhXZWIgdGVzdDEbMBkGA1UEAxMSVGVzdCBDQSAxIHN1YiBjYSAyMB4XDTAwMDgy\n"
4480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"NDAwMDAwMFoXDTAwMTAwMTAwMDAwMFowgZoxCzAJBgNVBAYTAkpQMREwDwYDVQQI\n"
4490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"EwhLYW5hZ2F3YTERMA8GA1UEBxMIRnVqaXNhd2ExFTATBgNVBAoTDFdJREUgUHJv\n"
4500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"amVjdDEVMBMGA1UECxMMS0FNRSBQcm9qZWN0MRcwFQYDVQQDEw5TaG9pY2hpIFNh\n"
4510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"a2FuZTEeMBwGCSqGSIb3DQEJAQwPc2FrYW5lQGthbWUubmV0MIGfMA0GCSqGSIb3\n"
4520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"DQEBAQUAA4GNADCBiQKBgQCpIQG/H3zn4czAmPBcbkDrYxE1A9vcpghpib3Of0Op\n"
4530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"SsiWIBOyIMiVAzK/I/JotWp3Vdn5fzGp/7DGAbWXAALas2xHkNmTMPpu6qhmNQ57\n"
4540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"kJHZHal24mgc1hwbrI9fb5olvIexx9a1riNPnKMRVHzXYizsyMbf+lJJmZ8QFhWN\n"
4550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"twIDAQABo18wXTALBgNVHQ8EBAMCBaAwGgYDVR0RBBMwEYEPc2FrYW5lQGthbWUu\n"
4560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"bmV0MDIGA1UdHwQrMCkwJ6AloCOGIWh0dHA6Ly9sZGFwLnNzaC5maS9jcmxzL2Nh\n"
4570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"MS0yLmNybDANBgkqhkiG9w0BAQUFAANhADtaqual41OWshF/rwCTuR6zySBJysGp\n"
4580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"+qjkp5efCiYKhAu1L4WXlMsV/SNdzspui5tHasPBvUw8gzFsU/VW/B2zuQZkimf1\n"
4590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"u6ZPjUb/vt8vLOPScP5MeH7xrTk9iigsqQ==\n"
4600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"-----END X509 CERTIFICATE-----\n\n",
4610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* VP100 */
4620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"-----BEGIN CERTIFICATE-----\n"
4630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"MIICXzCCAcigAwIBAgIEOXGBIzANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJG\n"
4640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"STEkMCIGA1UEChMbU1NIIENvbW11bmljYXRpb25zIFNlY3VyaXR5MREwDwYDVQQL\n"
4650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"EwhXZWIgdGVzdDESMBAGA1UEAxMJVGVzdCBDQSAxMB4XDTAwMDcxNjAwMDAwMFoX\n"
4660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"DTAwMDkwMTAwMDAwMFowNTELMAkGA1UEBhMCanAxETAPBgNVBAoTCHRhaGl0ZXN0\n"
4670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"MRMwEQYDVQQDEwpmdXJ1a2F3YS0xMIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKB\n"
4680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"gQDUmI2RaAuoLvtRDbASwRhbkj/Oq0BBIKgAqbFknc/EanJSQwZQu82gD88nf7gG\n"
4690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"VEioWmKPLDuEjz5JCuM+k5f7HYHI1wWmz1KFr7UA+avZm4Kp6YKnhuH7soZp7kBL\n"
4700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"hTiZEpL0jdmCWLW3ZXoro55rmPrBsCd+bt8VU6tRZm5dUwIBKaNZMFcwCwYDVR0P\n"
4710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"BAQDAgWgMBYGA1UdEQQPMA2CBVZQMTAwhwQKFIaFMDAGA1UdHwQpMCcwJaAjoCGG\n"
4720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"H2h0dHA6Ly9sZGFwLnNzaC5maS9jcmxzL2NhMS5jcmwwDQYJKoZIhvcNAQEFBQAD\n"
4730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"gYEAKJ/2Co/KYW65mwpGG3CBvsoRL8xyUMHGt6gQpFLHiiHuAdix1ADTL6uoFuYi\n"
4740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"4sE5omQm1wKVv2ZhS03zDtUfKoVEv0HZ7IY3AU/FZT/M5gQvbt43Dki/ma3ock2I\n"
4750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"PPhbLsvXm+GCVh3jvkYGk1zr7VERVeTPtmT+hW63lcxfFp4=\n"
4760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"-----END CERTIFICATE-----\n\n",
4770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* IKED */
4780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"-----BEGIN CERTIFICATE-----\n"
4790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"MIIEFTCCA7+gAwIBAgIKYU5X6AAAAAAACTANBgkqhkiG9w0BAQUFADCBljEpMCcG\n"
4800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"CSqGSIb3DQEJARYaeS13YXRhbmFAc2RsLmhpdGFjaGkuY28uanAxCzAJBgNVBAYT\n"
4810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"AkpQMREwDwYDVQQIEwhLQU5BR0FXQTERMA8GA1UEBxMIWW9rb2hhbWExEDAOBgNV\n"
4820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"BAoTB0hJVEFDSEkxDDAKBgNVBAsTA1NETDEWMBQGA1UEAxMNSVBzZWMgVGVzdCBD\n"
4830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"QTAeFw0wMDA3MTUwMjUxNDdaFw0wMTA3MTUwMzAxNDdaMEUxCzAJBgNVBAYTAkpQ\n"
4840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"MREwDwYDVQQIEwhLQU5BR0FXQTEQMA4GA1UEChMHSElUQUNISTERMA8GA1UEAxMI\n"
4850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"V0FUQU5BQkUwXDANBgkqhkiG9w0BAQEFAANLADBIAkEA6Wja5A7Ldzrtx+rMWHEB\n"
4860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"Cyt+/ZoG0qdFQbuuUiU1vOSq+1f+ZSCYAdTq13Lrr6Xfz3jDVFEZLPID9PSTFwq+\n"
4870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"yQIDAQABo4ICPTCCAjkwDgYDVR0PAQH/BAQDAgTwMBMGA1UdJQQMMAoGCCsGAQUF\n"
4880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"CAICMB0GA1UdDgQWBBTkv7/MH5Ra+S1zBAmnUIH5w8ZTUTCB0gYDVR0jBIHKMIHH\n"
4890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"gBQsF2qoaTl5F3GFLKrttaxPJ8j4faGBnKSBmTCBljEpMCcGCSqGSIb3DQEJARYa\n"
4900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"eS13YXRhbmFAc2RsLmhpdGFjaGkuY28uanAxCzAJBgNVBAYTAkpQMREwDwYDVQQI\n"
4910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"EwhLQU5BR0FXQTERMA8GA1UEBxMIWW9rb2hhbWExEDAOBgNVBAoTB0hJVEFDSEkx\n"
4920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"DDAKBgNVBAsTA1NETDEWMBQGA1UEAxMNSVBzZWMgVGVzdCBDQYIQeccIf4GYDIBA\n"
4930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"rS6HSUt8XjB7BgNVHR8EdDByMDagNKAyhjBodHRwOi8vZmxvcmEyMjAvQ2VydEVu\n"
4940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"cm9sbC9JUHNlYyUyMFRlc3QlMjBDQS5jcmwwOKA2oDSGMmZpbGU6Ly9cXGZsb3Jh\n"
4950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"MjIwXENlcnRFbnJvbGxcSVBzZWMlMjBUZXN0JTIwQ0EuY3JsMIGgBggrBgEFBQcB\n"
4960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"AQSBkzCBkDBFBggrBgEFBQcwAoY5aHR0cDovL2Zsb3JhMjIwL0NlcnRFbnJvbGwv\n"
4970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"ZmxvcmEyMjBfSVBzZWMlMjBUZXN0JTIwQ0EuY3J0MEcGCCsGAQUFBzAChjtmaWxl\n"
4980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"Oi8vXFxmbG9yYTIyMFxDZXJ0RW5yb2xsXGZsb3JhMjIwX0lQc2VjJTIwVGVzdCUy\n"
4990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"MENBLmNydDANBgkqhkiG9w0BAQUFAANBAG8yZAWHb6g3zba453Hw5loojVDZO6fD\n"
5000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"9lCsyaxeo9/+7x1JEEcdZ6qL7KKqe7ZBwza+hIN0ITkp2WEWo22gTz4=\n"
5010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"-----END CERTIFICATE-----\n\n",
5020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/* From Entrust */
5030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"-----BEGIN CERTIFICATE-----\n"
5040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"MIIDXTCCAsagAwIBAgIEOb6khTANBgkqhkiG9w0BAQUFADA4MQswCQYDVQQGEwJV\n"
5050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"UzEQMA4GA1UEChMHRW50cnVzdDEXMBUGA1UECxMOVlBOIEludGVyb3AgUk8wHhcN\n"
5060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"MDAwOTE4MjMwMDM3WhcNMDMwOTE4MjMzMDM3WjBTMQswCQYDVQQGEwJVUzEQMA4G\n"
5070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"A1UEChMHRW50cnVzdDEXMBUGA1UECxMOVlBOIEludGVyb3AgUk8xGTAXBgNVBAMT\n"
5080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"EFNob2ljaGkgU2FrYW5lIDIwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAKj3\n"
5090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"eXSt1qXxFXzpa265B/NQYk5BZN7pNJg0tlTKBTVV3UgpQ92Bx5DoNfZh11oIv0Sw\n"
5100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"6YnG5p9F9ma36U9HDoD3hVTjAvQKy4ssCsnU1y6v5XOU1QvYQo6UTzgsXUTaIau4\n"
5110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"Lrccl+nyoiNzy3lG51tLR8CxuA+3OOAK9xPjszClAgMBAAGjggFXMIIBUzBABgNV\n"
5120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"HREEOTA3gQ9zYWthbmVAa2FtZS5uZXSHBM6vIHWCHjIwNi0xNzUtMzItMTE3LnZw\n"
5130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"bndvcmtzaG9wLmNvbTATBgNVHSUEDDAKBggrBgEFBQgCAjALBgNVHQ8EBAMCAKAw\n"
5140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"KwYDVR0QBCQwIoAPMjAwMDA5MTgyMzAwMzdagQ8yMDAyMTAyNTExMzAzN1owWgYD\n"
5150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"VR0fBFMwUTBPoE2gS6RJMEcxCzAJBgNVBAYTAlVTMRAwDgYDVQQKEwdFbnRydXN0\n"
5160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"MRcwFQYDVQQLEw5WUE4gSW50ZXJvcCBSTzENMAsGA1UEAxMEQ1JMMTAfBgNVHSME\n"
5170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"GDAWgBTzVmhu0tBoWKwkZE5mXpooE9630DAdBgNVHQ4EFgQUEgBHPtXggJqei5Xz\n"
5180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"92CrWXTJxfAwCQYDVR0TBAIwADAZBgkqhkiG9n0HQQAEDDAKGwRWNS4wAwIEsDAN\n"
5190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"BgkqhkiG9w0BAQUFAAOBgQCIFriNGMUE8GH5LuDrTJfA8uGx8vLy2seljuo694TR\n"
5200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"et/ojp9QnfOJ1PF9iAdGaEaSLfkwhY4fZNZzxic5HBoHLeo9BXLP7i7FByXjvOZC\n"
5210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"Y8++0dC8NVvendIILcJBM5nbDq1TqIbb8K3SP80XhO5JLVJkoZiQftAMjo0peZPO\n"
5220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"EQ==\n"
5230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang"-----END CERTIFICATE-----\n\n",
5240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	NULL,
5250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	};
5260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
5270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (path == NULL)
5280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		return (char **)&samplecerts;
5290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
5300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	stat(path, &sb);
5310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (!(sb.st_mode & S_IFDIR)) {
5320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("ERROR: %s is not directory.\n", path);
5330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		exit(0);
5340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
5350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
5360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	dirp = opendir(path);
5370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (dirp == NULL) {
5380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("opendir failed.\n");
5390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		exit(0);
5400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
5410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
5420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	n = 0;
5430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	while ((dp = readdir(dirp)) != NULL) {
5440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if (dp->d_type != DT_REG)
5450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			continue;
5460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if (strcmp(dp->d_name + strlen(dp->d_name) - 4, "cert"))
5470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			continue;
5480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		snprintf(buf, sizeof(buf), "%s/%s", path, dp->d_name);
5490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		stat(buf, &sb);
5500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
5510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		p = (char **)realloc(certs, (n + 1) * sizeof(certs));
5520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if (p == NULL)
5530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			err(1, "realloc");
5540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		certs = p;
5550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
5560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		certs[n] = malloc(sb.st_size + 1);
5570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if (certs[n] == NULL)
5580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			err(1, "malloc");
5590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
5600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		fd = open(buf, O_RDONLY);
5610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if (fd == -1)
5620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			err(1, "open");
5630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		len = read(fd, certs[n], sb.st_size);
5640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if (len == -1)
5650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			err(1, "read");
5660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if (len != sb.st_size)
5670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			errx(1, "read: length mismatch");
5680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		certs[n][sb.st_size] = '\0';
5690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		close(fd);
5700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
5710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("%s: %d\n", dp->d_name, (int)sb.st_size);
5720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
5730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		n++;
5740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
575f8a6a7636d53a5730c58ae041e4e09ae12e1657cChia-chi Yeh	closedir(dirp);
5760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
5770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	p = (char **)realloc(certs, (n + 1) * sizeof(certs));
5780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (p == NULL)
5790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		err(1, "realloc");
5800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	certs = p;
5810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	certs[n] = NULL;
5820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
5830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	return certs;
5840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
5850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif /* CERTTEST_BROKEN */
5860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
5870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangtypedef vchar_t* (eay_func) (vchar_t *, vchar_t *, vchar_t *);
5880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
5890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic int
5900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangciphertest_1 (const char *name,
5910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	      vchar_t *data,
5920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	      size_t data_align,
5930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	      vchar_t *key,
5940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	      size_t min_keysize,
5950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	      vchar_t *iv0,
5960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	      size_t iv_length,
5970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	      eay_func encrypt,
5980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	      eay_func decrypt)
5990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
6000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int padlen;
6010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vchar_t *buf, *iv, *res1, *res2;
6020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	iv = vmalloc(iv_length);
6030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
6040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	printf("Test for cipher %s\n", name);
6050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	printf("data:\n");
6060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	PVDUMP(data);
6070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
6080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (data_align <= 1 || (data->l % data_align) == 0)
6090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	  padlen = 0;
6100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	else
6110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	  padlen = data_align - data->l % data_align;
6120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
6130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	buf = vmalloc(data->l + padlen);
6140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	memcpy(buf->v, data->v, data->l);
6150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
6160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	memcpy(iv->v, iv0->v, iv_length);
6170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	res1 = (encrypt)(buf, key, iv);
6180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (res1 == NULL) {
6190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("%s encryption failed.\n", name);
6200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		return -1;
6210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
6220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	printf("encrypted:\n");
6230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	PVDUMP(res1);
6240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
6250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	memcpy(iv->v, iv0->v, iv_length);
6260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	res2 = (decrypt)(res1, key, iv);
6270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (res2 == NULL) {
6280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("%s decryption failed.\n", name);
6290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		return -1;
6300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
6310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	printf("decrypted:\n");
6320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	PVDUMP(res2);
6330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
6340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (memcmp(data->v, res2->v, data->l)) {
6350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("XXXX NG (%s) XXXX\n", name);
6360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		return -1;
6370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
6380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	else
6390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("%s cipher verified.\n", name);
6400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vfree(res1);
6410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vfree(res2);
6420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vfree(buf);
6430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vfree(iv);
6440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
6450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	return 0;
6460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
6470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
6480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint
6490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangciphertest(ac, av)
6500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int ac;
6510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char **av;
6520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
6530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vchar_t data;
6540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vchar_t key;
6550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vchar_t iv0;
6560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
6570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	printf("\n**Testing CIPHERS**\n");
6580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
6590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	data.v = str2val("\
6600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang06000017 03000000 73616b61 6e65406b 616d652e 6e657409 0002c104 308202b8 \
6610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang04f05a90 \
6620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	", 16, &data.l);
6630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	key.v = str2val("f59bd70f 81b9b9cc 2a32c7fd 229a4b37", 16, &key.l);
6640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	iv0.v = str2val("26b68c90 9467b4ab 7ec29fa0 0b696b55", 16, &iv0.l);
6650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
6660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (ciphertest_1 ("DES",
6670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			  &data, 8,
6680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			  &key, 8,
6690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			  &iv0, 8,
6700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			  eay_des_encrypt, eay_des_decrypt) < 0)
6710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	  return -1;
6720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
6730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (ciphertest_1 ("3DES",
6740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			  &data, 8,
6750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			  &key, 24,
6760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			  &iv0, 8,
6770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			  eay_3des_encrypt, eay_3des_decrypt) < 0)
6780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	  return -1;
6790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
6800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (ciphertest_1 ("AES",
6810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			  &data, 16,
6820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			  &key, key.l,
6830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			  &iv0, 16,
6840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			  eay_aes_encrypt, eay_aes_decrypt) < 0)
6850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	  return -1;
6860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
6870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (ciphertest_1 ("BLOWFISH",
6880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			  &data, 8,
6890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			  &key, key.l,
6900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			  &iv0, 8,
6910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			  eay_bf_encrypt, eay_bf_decrypt) < 0)
6920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	  return -1;
6930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
6940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (ciphertest_1 ("CAST",
6950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			  &data, 8,
6960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			  &key, key.l,
6970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			  &iv0, 8,
6980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			  eay_cast_encrypt, eay_cast_decrypt) < 0)
6990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	  return -1;
7000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
7010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef HAVE_OPENSSL_IDEA_H
7020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (ciphertest_1 ("IDEA",
7030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			  &data, 8,
7040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			  &key, key.l,
7050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			  &iv0, 8,
7060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			  eay_idea_encrypt, eay_idea_decrypt) < 0)
7070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	  return -1;
7080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif
7090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
7100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef HAVE_OPENSSL_RC5_H
7110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (ciphertest_1 ("RC5",
7120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			  &data, 8,
7130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			  &key, key.l,
7140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			  &iv0, 8,
7150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			  eay_rc5_encrypt, eay_rc5_decrypt) < 0)
7160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	  return -1;
7170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif
7180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#if defined(HAVE_OPENSSL_CAMELLIA_H)
7190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (ciphertest_1 ("CAMELLIA",
7200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			  &data, 16,
7210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			  &key, key.l,
7220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			  &iv0, 16,
7230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			  eay_camellia_encrypt, eay_camellia_decrypt) < 0)
7240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	  return -1;
7250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif
7260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	return 0;
7270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
7280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
7290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint
7300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wanghmactest(ac, av)
7310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int ac;
7320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char **av;
7330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
7340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *keyword = "hehehe test secret!";
7350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *object  = "d7e6a6c1876ef0488bb74958b9fee94e";
7360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *object1 = "d7e6a6c1876ef048";
7370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *object2 =                 "8bb74958b9fee94e";
7380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *r_hmd5  = "5702d7d1 fd1bfc7e 210fc9fa cda7d02c";
7390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *r_hsha1 = "309999aa 9779a43e ebdea839 1b4e7ee1 d8646874";
7400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef WITH_SHA2
7410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *r_hsha2 = "d47262d8 a5b6f39d d8686939 411b3e79 ed2e27f9 2c4ea89f dd0a06ae 0c0aa396";
7420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif
7430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vchar_t *key, *data, *data1, *data2, *res;
7440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vchar_t mod;
7450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	caddr_t ctx;
7460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
7470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef WITH_SHA2
7480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	printf("\n**Test for HMAC MD5, SHA1, and SHA256.**\n");
7490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#else
7500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	printf("\n**Test for HMAC MD5 & SHA1.**\n");
7510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif
7520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
7530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	key = vmalloc(strlen(keyword));
7540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	memcpy(key->v, keyword, key->l);
7550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
7560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	data = vmalloc(strlen(object));
7570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	data1 = vmalloc(strlen(object1));
7580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	data2 = vmalloc(strlen(object2));
7590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	memcpy(data->v, object, data->l);
7600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	memcpy(data1->v, object1, data1->l);
7610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	memcpy(data2->v, object2, data2->l);
7620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
7630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	/* HMAC MD5 */
7640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	printf("HMAC MD5 by eay_hmacmd5_one()\n");
7650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	res = eay_hmacmd5_one(key, data);
7660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	PVDUMP(res);
7670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	mod.v = str2val(r_hmd5, 16, &mod.l);
7680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (memcmp(res->v, mod.v, mod.l)) {
7690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf(" XXX NG XXX\n");
7700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		return -1;
7710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
7720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	free(mod.v);
7730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vfree(res);
7740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
7750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	/* HMAC MD5 */
7760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	printf("HMAC MD5 by eay_hmacmd5_xxx()\n");
7770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	ctx = eay_hmacmd5_init(key);
7780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	eay_hmacmd5_update(ctx, data1);
7790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	eay_hmacmd5_update(ctx, data2);
7800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	res = eay_hmacmd5_final(ctx);
7810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	PVDUMP(res);
7820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	mod.v = str2val(r_hmd5, 16, &mod.l);
7830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (memcmp(res->v, mod.v, mod.l)) {
7840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf(" XXX NG XXX\n");
7850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		return -1;
7860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
7870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	free(mod.v);
7880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vfree(res);
7890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
7900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	/* HMAC SHA1 */
7910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	printf("HMAC SHA1 by eay_hmacsha1_one()\n");
7920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	res = eay_hmacsha1_one(key, data);
7930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	PVDUMP(res);
7940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	mod.v = str2val(r_hsha1, 16, &mod.l);
7950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (memcmp(res->v, mod.v, mod.l)) {
7960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf(" XXX NG XXX\n");
7970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		return -1;
7980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
7990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	free(mod.v);
8000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vfree(res);
8010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
8020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	/* HMAC SHA1 */
8030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	printf("HMAC SHA1 by eay_hmacsha1_xxx()\n");
8040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	ctx = eay_hmacsha1_init(key);
8050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	eay_hmacsha1_update(ctx, data1);
8060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	eay_hmacsha1_update(ctx, data2);
8070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	res = eay_hmacsha1_final(ctx);
8080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	PVDUMP(res);
8090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	mod.v = str2val(r_hsha1, 16, &mod.l);
8100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (memcmp(res->v, mod.v, mod.l)) {
8110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf(" XXX NG XXX\n");
8120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		return -1;
8130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
8140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	free(mod.v);
8150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vfree(res);
8160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
8170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifdef WITH_SHA2
8180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	/* HMAC SHA2 */
8190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	printf("HMAC SHA2 by eay_hmacsha2_256_one()\n");
8200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	res = eay_hmacsha2_256_one(key, data);
8210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	PVDUMP(res);
8220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	mod.v = str2val(r_hsha2, 16, &mod.l);
8230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (memcmp(res->v, mod.v, mod.l)) {
8240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf(" XXX NG XXX\n");
8250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		return -1;
8260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
8270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	free(mod.v);
8280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vfree(res);
8290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif
8300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
8310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vfree(data);
8320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vfree(data1);
8330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vfree(data2);
8340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vfree(key);
8350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
8360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	return 0;
8370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
8380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
8390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint
8400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangsha1test(ac, av)
8410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int ac;
8420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char **av;
8430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
8440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *word1 = "1234567890", *word2 = "12345678901234567890";
8450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	caddr_t ctx;
8460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vchar_t *buf, *res;
8470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
8480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	printf("\n**Test for SHA1.**\n");
8490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
8500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	ctx = eay_sha1_init();
8510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	buf = vmalloc(strlen(word1));
8520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	memcpy(buf->v, word1, buf->l);
8530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	eay_sha1_update(ctx, buf);
8540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	eay_sha1_update(ctx, buf);
8550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	res = eay_sha1_final(ctx);
8560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	PVDUMP(res);
8570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vfree(res);
8580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vfree(buf);
8590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
8600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	ctx = eay_sha1_init();
8610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	buf = vmalloc(strlen(word2));
8620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	memcpy(buf->v, word2, buf->l);
8630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	eay_sha1_update(ctx, buf);
8640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	res = eay_sha1_final(ctx);
8650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	PVDUMP(res);
8660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vfree(res);
8670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
8680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	res = eay_sha1_one(buf);
8690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	PVDUMP(res);
8700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vfree(res);
8710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vfree(buf);
8720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
8730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	return 0;
8740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
8750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
8760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint
8770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangmd5test(ac, av)
8780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int ac;
8790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char **av;
8800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
8810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *word1 = "1234567890", *word2 = "12345678901234567890";
8820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	caddr_t ctx;
8830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vchar_t *buf, *res;
8840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
8850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	printf("\n**Test for MD5.**\n");
8860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
8870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	ctx = eay_md5_init();
8880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	buf = vmalloc(strlen(word1));
8890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	memcpy(buf->v, word1, buf->l);
8900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	eay_md5_update(ctx, buf);
8910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	eay_md5_update(ctx, buf);
8920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	res = eay_md5_final(ctx);
8930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	PVDUMP(res);
8940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vfree(res);
8950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vfree(buf);
8960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
8970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	ctx = eay_md5_init();
8980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	buf = vmalloc(strlen(word2));
8990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	memcpy(buf->v, word2, buf->l);
9000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	eay_md5_update(ctx, buf);
9010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	res = eay_md5_final(ctx);
9020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	PVDUMP(res);
9030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vfree(res);
9040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
9050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	res = eay_md5_one(buf);
9060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	PVDUMP(res);
9070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vfree(res);
9080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vfree(buf);
9090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
9100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	return 0;
9110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
9120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
9130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint
9140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangdhtest(ac, av)
9150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int ac;
9160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char **av;
9170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
9180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	static struct {
9190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		char *name;
9200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		char *p;
9210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	} px[] = {
9220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		{ "modp768",	OAKLEY_PRIME_MODP768, },
9230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		{ "modp1024",	OAKLEY_PRIME_MODP1024, },
9240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		{ "modp1536",	OAKLEY_PRIME_MODP1536, },
9250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		{ "modp2048",	OAKLEY_PRIME_MODP2048, },
9260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		{ "modp3072",	OAKLEY_PRIME_MODP3072, },
9270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		{ "modp4096",	OAKLEY_PRIME_MODP4096, },
9280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		{ "modp6144",	OAKLEY_PRIME_MODP6144, },
9290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		{ "modp8192",	OAKLEY_PRIME_MODP8192, },
9300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	};
9310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vchar_t p1, *pub1, *priv1, *gxy1;
9320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vchar_t p2, *pub2, *priv2, *gxy2;
9330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int i;
9340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
9350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	printf("\n**Test for DH.**\n");
9360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
9370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	for (i = 0; i < sizeof(px)/sizeof(px[0]); i++) {
9380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("\n**Test for DH %s.**\n", px[i].name);
9390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
9400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		p1.v = str2val(px[i].p, 16, &p1.l);
9410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		p2.v = str2val(px[i].p, 16, &p2.l);
9420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("prime number = \n"); PVDUMP(&p1);
9430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
9440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if (eay_dh_generate(&p1, 2, 96, &pub1, &priv1) < 0) {
9450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			printf("error\n");
9460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			return -1;
9470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		}
9480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("private key for user 1 = \n"); PVDUMP(priv1);
9490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("public key for user 1  = \n"); PVDUMP(pub1);
9500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
9510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if (eay_dh_generate(&p2, 2, 96, &pub2, &priv2) < 0) {
9520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			printf("error\n");
9530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			return -1;
9540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		}
9550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("private key for user 2 = \n"); PVDUMP(priv2);
9560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("public key for user 2  = \n"); PVDUMP(pub2);
9570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
9580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		/* process to generate key for user 1 */
9590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		gxy1 = vmalloc(p1.l);
9600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		memset(gxy1->v, 0, gxy1->l);
9610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		eay_dh_compute(&p1, 2, pub1, priv1, pub2, &gxy1);
9620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("sharing gxy1 of user 1 = \n"); PVDUMP(gxy1);
9630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
9640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		/* process to generate key for user 2 */
9650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		gxy2 = vmalloc(p1.l);
9660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		memset(gxy2->v, 0, gxy2->l);
9670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		eay_dh_compute(&p2, 2, pub2, priv2, pub1, &gxy2);
9680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("sharing gxy2 of user 2 = \n"); PVDUMP(gxy2);
9690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
9700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if (memcmp(gxy1->v, gxy2->v, gxy1->l)) {
9710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			printf("ERROR: sharing gxy mismatched.\n");
9720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			return -1;
9730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		}
9740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
9750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		vfree(pub1);
9760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		vfree(pub2);
9770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		vfree(priv1);
9780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		vfree(priv2);
9790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		vfree(gxy1);
9800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		vfree(gxy2);
9810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
9820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
9830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	return 0;
9840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
9850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
9860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint
9870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangbntest(ac, av)
9880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int ac;
9890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char **av;
9900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
9910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vchar_t *rn;
9920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
9930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	printf("\n**Test for generate a random number.**\n");
9940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
9950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	rn = eay_set_random((u_int32_t)96);
9960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	PVDUMP(rn);
9970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vfree(rn);
9980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
9990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	return 0;
10000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
10010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
10020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstruct {
10030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *name;
10040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int (*func) __P((int, char **));
10050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang} func[] = {
10060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ "random", bntest, },
10070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ "dh", dhtest, },
10080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ "md5", md5test, },
10090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ "sha1", sha1test, },
10100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ "hmac", hmactest, },
10110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ "cipher", ciphertest, },
10120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifndef CERTTEST_BROKEN
10130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ "cert", certtest, },
10140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif
10150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	{ "rsa", rsatest, },
10160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang};
10170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
10180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint
10190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangmain(ac, av)
10200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int ac;
10210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char **av;
10220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
10230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int i;
10240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int len = sizeof(func)/sizeof(func[0]);
10250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
10260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	f_foreground = 1;
10270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	ploginit();
10280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
10290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	printf ("\nTestsuite of the %s\nlinked with %s\n\n", TOP_PACKAGE_STRING, eay_version());
10300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
10310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (strcmp(*av, "-h") == 0)
10320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		Usage();
10330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
10340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	ac--;
10350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	av++;
10360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
10370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	for (i = 0; i < len; i++) {
10380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if ((ac == 0) || (strcmp(*av, func[i].name) == 0)) {
10390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			if ((func[i].func)(ac, av) != 0) {
10400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				printf ("\n!!!!! Test '%s' failed. !!!!!\n\n", func[i].name);
10410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				exit(1);
10420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			}
10430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			if (ac)
10440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				break;
10450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		}
10460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
10470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (ac && i == len)
10480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		Usage();
10490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
10500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	printf ("\n===== All tests passed =====\n\n");
10510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	exit(0);
10520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
10530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
10540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid
10550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih WangUsage()
10560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
10570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int i;
10580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int len = sizeof(func)/sizeof(func[0]);
10590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
10600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	printf("Usage: eaytest [");
10610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	for (i = 0; i < len; i++)
10620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		printf("%s%s", func[i].name, (i<len-1)?"|":"");
10630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	printf("]\n");
10640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#ifndef CERTTEST_BROKEN
10650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	printf("       eaytest cert [cert_directory]\n");
10660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif
10670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	exit(1);
10680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
10690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
1070