Annotation of embedaddon/ipsec-tools/src/racoon/eaytest.c, revision 1.1

1.1     ! misho       1: /*     $NetBSD: eaytest.c,v 1.10 2010/01/17 23:02:48 wiz Exp $ */
        !             2: 
        !             3: /* Id: eaytest.c,v 1.22 2005/06/19 18:02:54 manubsd Exp */
        !             4: 
        !             5: /*
        !             6:  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
        !             7:  * All rights reserved.
        !             8:  * 
        !             9:  * Redistribution and use in source and binary forms, with or without
        !            10:  * modification, are permitted provided that the following conditions
        !            11:  * are met:
        !            12:  * 1. Redistributions of source code must retain the above copyright
        !            13:  *    notice, this list of conditions and the following disclaimer.
        !            14:  * 2. Redistributions in binary form must reproduce the above copyright
        !            15:  *    notice, this list of conditions and the following disclaimer in the
        !            16:  *    documentation and/or other materials provided with the distribution.
        !            17:  * 3. Neither the name of the project nor the names of its contributors
        !            18:  *    may be used to endorse or promote products derived from this software
        !            19:  *    without specific prior written permission.
        !            20:  * 
        !            21:  * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
        !            22:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
        !            23:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
        !            24:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
        !            25:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
        !            26:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
        !            27:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
        !            28:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
        !            29:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
        !            30:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
        !            31:  * SUCH DAMAGE.
        !            32:  */
        !            33: 
        !            34: #include "config.h"
        !            35: 
        !            36: #include <sys/types.h>
        !            37: #include <sys/stat.h>
        !            38: #include <sys/socket.h>
        !            39: 
        !            40: #include <netinet/in.h>
        !            41: 
        !            42: #include <stdlib.h>
        !            43: #include <stdio.h>
        !            44: #include <string.h>
        !            45: #include <limits.h>
        !            46: #include <dirent.h>
        !            47: #include <fcntl.h>
        !            48: #include <unistd.h>
        !            49: #include <err.h>
        !            50: 
        !            51: #include <openssl/bio.h>
        !            52: #include <openssl/pem.h>
        !            53: 
        !            54: #include "var.h"
        !            55: #include "vmbuf.h"
        !            56: #include "misc.h"
        !            57: #include "debug.h"
        !            58: #include "str2val.h"
        !            59: #include "plog.h"
        !            60: 
        !            61: #include "oakley.h"
        !            62: #include "dhgroup.h"
        !            63: #include "crypto_openssl.h"
        !            64: #include "gnuc.h"
        !            65: 
        !            66: #include "package_version.h"
        !            67: 
        !            68: #define PVDUMP(var) racoon_hexdump((var)->v, (var)->l)
        !            69: 
        !            70: /*#define CERTTEST_BROKEN */
        !            71: 
        !            72: /* prototype */
        !            73: 
        !            74: static vchar_t *pem_read_buf __P((char *));
        !            75: void Usage __P((void));
        !            76: 
        !            77: int rsatest __P((int, char **));
        !            78: int ciphertest __P((int, char **));
        !            79: int hmactest __P((int, char **));
        !            80: int sha1test __P((int, char **));
        !            81: int md5test __P((int, char **));
        !            82: int dhtest __P((int, char **));
        !            83: int bntest __P((int, char **));
        !            84: #ifndef CERTTEST_BROKEN
        !            85: static char **getcerts __P((char *));
        !            86: int certtest __P((int, char **));
        !            87: #endif
        !            88: 
        !            89: /* test */
        !            90: 
        !            91: static int
        !            92: rsa_verify_with_pubkey(src, sig, pubkey_txt)
        !            93:        vchar_t *src, *sig;
        !            94:        char *pubkey_txt;
        !            95: {
        !            96:        BIO *bio;
        !            97:        EVP_PKEY *evp;
        !            98:        int error;
        !            99: 
        !           100:        bio = BIO_new_mem_buf(pubkey_txt, strlen(pubkey_txt));
        !           101:        evp = PEM_read_bio_PUBKEY(bio, NULL, NULL, NULL);
        !           102:        if (! evp) {
        !           103:                printf ("PEM_read_PUBKEY(): %s\n", eay_strerror());
        !           104:                return -1;
        !           105:        }
        !           106:        error = eay_check_rsasign(src, sig, evp->pkey.rsa);
        !           107: 
        !           108:        return error;
        !           109: }
        !           110: 
        !           111: int
        !           112: rsatest(ac, av)
        !           113:        int ac;
        !           114:        char **av;
        !           115: {
        !           116:        char *text = "this is test.";
        !           117:        vchar_t src;
        !           118:        vchar_t *priv, *sig;
        !           119:        int loglevel_saved;
        !           120: 
        !           121:        char *pkcs1 =
        !           122: "-----BEGIN RSA PRIVATE KEY-----\n"
        !           123: "MIICXQIBAAKBgQChe5/Fzk9SA0vCKBOcu9jBcLb9oLv50PeuEfQojhakY+OH8A3Q\n"
        !           124: "M8A0qIDG6uhTNGPvzCWb/+mKeOB48n5HJpLxlDFyP3kyd2yXHIZ/MN8g1nh4FsB0\n"
        !           125: "iTkk8QUCJkkan6FCOBrIeLEsGA5AdodzuR+khnCMt8vO+NFHZYKAQeynyQIDAQAB\n"
        !           126: "AoGAOfDcnCHxjhDGrwyoNNWl6Yqi7hAtQm67YAbrH14UO7nnmxAENM9MyNgpFLaW\n"
        !           127: "07v5m8IZQIcradcDXAJOUwNBN8E06UflwEYCaScIwndvr5UpVlN3e2NC6Wyg2yC7\n"
        !           128: "GarxQput3zj35XNR5bK42UneU0H6zDxpHWqI1SwE+ToAHu0CQQDNl9gUJTpg0L09\n"
        !           129: "HkbE5jeb8bA5I20nKqBOBP0v5tnzpwu41umQwk9I7Ru0ucD7j+DW4k8otadW+FnI\n"
        !           130: "G1M1MpSjAkEAyRMt4bN8otfpOpsOQWzw4jQtouohOxRFCrQTntHhU20PrQnQLZWs\n"
        !           131: "pOVzqCjRytYtkPEUA1z8QK5gGcVPcOQsowJBALmt2rwPB1NrEo5Bat7noO+Zb3Ob\n"
        !           132: "WDiYWeE8xkHd95gDlSWiC53ur9aINo6ZeP556jGIgL+el/yHHecJLrQL84sCQH48\n"
        !           133: "zUxq/C/cb++8UzneJGlPqusiJNTLiAENR1gpmlZfHT1c8Nb9phMsfu0vG29GAfuC\n"
        !           134: "bzchVLljALCNQK+2gRMCQQCNIgN+R9mRWZhFAcC1sq++YnuSBlw4VwdL/fd1Yg9e\n"
        !           135: "Ul+U98yPl/NXt8Rs4TRBFcOZjkFI8xv0hQtevTgTmgz+\n"
        !           136: "-----END RSA PRIVATE KEY-----\n\n";
        !           137:        char *pubkey =
        !           138: "-----BEGIN PUBLIC KEY-----\n"
        !           139: "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQChe5/Fzk9SA0vCKBOcu9jBcLb9\n"
        !           140: "oLv50PeuEfQojhakY+OH8A3QM8A0qIDG6uhTNGPvzCWb/+mKeOB48n5HJpLxlDFy\n"
        !           141: "P3kyd2yXHIZ/MN8g1nh4FsB0iTkk8QUCJkkan6FCOBrIeLEsGA5AdodzuR+khnCM\n"
        !           142: "t8vO+NFHZYKAQeynyQIDAQAB\n"
        !           143: "-----END PUBLIC KEY-----\n\n";
        !           144:        char *pubkey_wrong = 
        !           145: "-----BEGIN PUBLIC KEY-----\n"
        !           146: "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwDncG2tSokRBhK8la1mO\n"
        !           147: "QnUpxg6KvpoFUjEyRiIE1GRap5V6jCCEOmA9ZAz4Oa/97oxewwMWtchIxSBZVCia\n"
        !           148: "H9oGasbOFzrtSR+MKl6Cb/Ow3Fu+PKbHTsnfTk/nOOWyaQh91PRD7fdwHe8L9P7w\n"
        !           149: "2kFPmDW6+RNKIR4OErhXf1O0eSShPe0TO3vx43O7dWqhmh3Kgr4Jq7zAGqHtwu0B\n"
        !           150: "RFZnmsocOnVZb2yAHndp51/Mk1H37ThHwN7qMx7RqrS3ru3XtchpJd9IQJPBIRfY\n"
        !           151: "VYQ68u5ix/Z80Y6VkRf0qnAvel8B6D3N3Zyq5u7G60PfvvtCybeMn7nVrSMxqMW/\n"
        !           152: "xwIDAQAB\n"
        !           153: "-----END PUBLIC KEY-----\n\n";
        !           154: 
        !           155:        printf ("%s", pkcs1);
        !           156:        printf ("%s", pubkey);
        !           157:        priv = pem_read_buf(pkcs1);
        !           158: 
        !           159:        src.v = text;
        !           160:        src.l = strlen(text);
        !           161: 
        !           162:        /* sign */
        !           163:        sig = eay_get_x509sign(&src, priv);
        !           164:        if (sig == NULL) {
        !           165:                printf("sign failed. %s\n", eay_strerror());
        !           166:                return -1;
        !           167:        }
        !           168: 
        !           169:        printf("RSA signed data.\n");
        !           170:        PVDUMP(sig);
        !           171: 
        !           172:        printf("Verification with correct pubkey: ");
        !           173:        if (rsa_verify_with_pubkey (&src, sig, pubkey) != 0) {
        !           174:                printf ("Failed.\n");
        !           175:                return -1;
        !           176:        }
        !           177:        else
        !           178:                printf ("Verified. Good.\n");
        !           179: 
        !           180:        loglevel_saved = loglevel;
        !           181:        loglevel = 0;
        !           182:        printf("Verification with wrong pubkey: ");
        !           183:        if (rsa_verify_with_pubkey (&src, sig, pubkey_wrong) != 0)
        !           184:                printf ("Not verified. Good.\n");
        !           185:        else {
        !           186:                printf ("Verified. This is bad...\n");
        !           187:                loglevel = loglevel_saved;
        !           188:                return -1;
        !           189:        }
        !           190:        loglevel = loglevel_saved;
        !           191: 
        !           192:        return 0;
        !           193: }
        !           194: 
        !           195: static vchar_t *
        !           196: pem_read_buf(buf)
        !           197:        char *buf;
        !           198: {
        !           199:        BIO *bio;
        !           200:        char *nm = NULL, *header = NULL;
        !           201:        unsigned char *data = NULL;
        !           202:        long len;
        !           203:        vchar_t *ret;
        !           204:        int error;
        !           205: 
        !           206:        bio = BIO_new_mem_buf(buf, strlen(buf));
        !           207:        error = PEM_read_bio(bio, &nm, &header, &data, &len);
        !           208:        if (error == 0)
        !           209:                errx(1, "%s", eay_strerror());
        !           210:        ret = vmalloc(len);
        !           211:        if (ret == NULL)
        !           212:                err(1, "vmalloc");
        !           213:        memcpy(ret->v, data, len);
        !           214: 
        !           215:        return ret;
        !           216: }
        !           217: 
        !           218: #ifndef CERTTEST_BROKEN
        !           219: int
        !           220: certtest(ac, av)
        !           221:        int ac;
        !           222:        char **av;
        !           223: {
        !           224:        char *certpath;
        !           225:        char **certs;
        !           226:        int type;
        !           227:        int error;
        !           228: 
        !           229:        printf("\n**Test for Certificate.**\n");
        !           230: 
        !           231:     {
        !           232:        vchar_t *asn1dn = NULL, asn1dn0;
        !           233: #ifdef ORIG_DN
        !           234:        char dnstr[] = "C=JP, ST=Kanagawa, L=Fujisawa, O=WIDE Project, OU=KAME Project, CN=Shoichi Sakane/Email=sakane@kame.net";
        !           235:        char *dnstr_w1 = NULL;
        !           236:        char *dnstr_w2 = NULL;
        !           237:        char dn0[] = {
        !           238:                0x30,0x81,0x9a,0x31,0x0b,0x30,0x09,0x06,
        !           239:                0x03,0x55,0x04,0x06,0x13,0x02,0x4a,0x50,
        !           240:                0x31,0x11,0x30,0x0f,0x06,0x03,0x55,0x04,
        !           241:                0x08,0x13,0x08,0x4b,0x61,0x6e,0x61,0x67,
        !           242:                0x61,0x77,0x61,0x31,0x11,0x30,0x0f,0x06,
        !           243:                0x03,0x55,0x04,0x07,0x13,0x08,0x46,0x75,
        !           244:                0x6a,0x69,0x73,0x61,0x77,0x61,0x31,0x15,
        !           245:                0x30,0x13,0x06,0x03,0x55,0x04,0x0a,0x13,
        !           246:                0x0c,0x57,0x49,0x44,0x45,0x20,0x50,0x72,
        !           247:                0x6f,0x6a,0x65,0x63,0x74,0x31,0x15,0x30,
        !           248:                0x13,0x06,0x03,0x55,0x04,0x0b,0x13,0x0c,
        !           249:                0x4b,0x41,0x4d,0x45,0x20,0x50,0x72,0x6f,
        !           250:                0x6a,0x65,0x63,0x74,0x31,0x17,0x30,0x15,
        !           251:                0x06,0x03,0x55,0x04,0x03,0x13,0x0e,0x53,
        !           252:                0x68,0x6f,0x69,0x63,0x68,0x69,0x20,0x53,
        !           253:                0x61,0x6b,0x61,0x6e,0x65,0x31,0x1e,0x30,
        !           254:                0x1c,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,
        !           255:                0x0d,0x01,0x09,0x01,
        !           256:                0x0c,   /* <== XXX */
        !           257:                0x0f,0x73,0x61,
        !           258:                0x6b,0x61,0x6e,0x65,0x40,0x6b,0x61,0x6d,
        !           259:                0x65,0x2e,0x6e,0x65,0x74,
        !           260:        };
        !           261: #else /* not ORIG_DN */
        !           262:        char dnstr[] = "C=JP, ST=Kanagawa, L=Fujisawa, O=WIDE Project, OU=KAME Project, CN=Shoichi Sakane";
        !           263:        char dnstr_w1[] = "C=JP, ST=Kanagawa, L=Fujisawa, O=WIDE Project, OU=*, CN=Shoichi Sakane";
        !           264:        char dnstr_w2[] = "C=JP, ST=Kanagawa, L=Fujisawa, O=WIDE Project, OU=KAME Project, CN=*";
        !           265:        char dn0[] = {
        !           266:                0x30,0x7a,0x31,0x0b,0x30,0x09,0x06,0x03,
        !           267:                0x55,0x04,0x06,0x13,0x02,0x4a,0x50,0x31,
        !           268:                0x11,0x30,0x0f,0x06,0x03,0x55,0x04,0x08,
        !           269:                0x13,0x08,0x4b,0x61,0x6e,0x61,0x67,0x61,
        !           270:                0x77,0x61,0x31,0x11,0x30,0x0f,0x06,0x03,
        !           271:                0x55,0x04,0x07,0x13,0x08,0x46,0x75,0x6a,
        !           272:                0x69,0x73,0x61,0x77,0x61,0x31,0x15,0x30,
        !           273:                0x13,0x06,0x03,0x55,0x04,0x0a,0x13,0x0c,
        !           274:                0x57,0x49,0x44,0x45,0x20,0x50,0x72,0x6f,
        !           275:                0x6a,0x65,0x63,0x74,0x31,0x15,0x30,0x13,
        !           276:                0x06,0x03,0x55,0x04,0x0b,0x13,0x0c,0x4b,
        !           277:                0x41,0x4d,0x45,0x20,0x50,0x72,0x6f,0x6a,
        !           278:                0x65,0x63,0x74,0x31,0x17,0x30,0x15,0x06,
        !           279:                0x03,0x55,0x04,0x03,0x13,0x0e,0x53,0x68,
        !           280:                0x6f,0x69,0x63,0x68,0x69,0x20,0x53,0x61,
        !           281:                0x6b,0x61,0x6e,0x65,
        !           282:        };
        !           283: #endif /* ORIG_DN */
        !           284: 
        !           285:        printf("check to convert the string into subjectName.\n");
        !           286:        printf("%s\n", dnstr);
        !           287: 
        !           288:        asn1dn0.v = dn0;
        !           289:        asn1dn0.l = sizeof(dn0);
        !           290: 
        !           291:        asn1dn = eay_str2asn1dn(dnstr, strlen(dnstr));
        !           292:        if (asn1dn == NULL || asn1dn->l != asn1dn0.l)
        !           293: #ifdef OUTPUT_VALID_ASN1DN
        !           294:        {
        !           295:                unsigned char *cp; int  i;
        !           296:                printf("asn1dn length mismatched (%zu != %zu).\n", asn1dn ? asn1dn->l : -1, asn1dn0.l);
        !           297:                for (cp = asn1dn->v, i = 0; i < asn1dn->l; i++)
        !           298:                    printf ("0x%02x,", *cp++);
        !           299:                exit (1);
        !           300:        }
        !           301: #else
        !           302:                errx(1, "asn1dn length mismatched (%zu != %zu).\n", asn1dn ? asn1dn->l : -1, asn1dn0.l);
        !           303: #endif
        !           304: 
        !           305:        /*
        !           306:         * NOTE: The value pointed by "<==" above is different from the
        !           307:         * return of eay_str2asn1dn().  but eay_cmp_asn1dn() can distinguish
        !           308:         * both of the names are same name.
        !           309:         */
        !           310:        if (eay_cmp_asn1dn(&asn1dn0,  asn1dn))
        !           311:                errx(1, "asn1dn mismatched.\n");
        !           312:        vfree(asn1dn);
        !           313: 
        !           314:        printf("exact match: succeed.\n");
        !           315: 
        !           316:        if (dnstr_w1 != NULL) {
        !           317:                asn1dn = eay_str2asn1dn(dnstr_w1, strlen(dnstr_w1));
        !           318:                if (asn1dn == NULL || asn1dn->l == asn1dn0.l)
        !           319:                        errx(1, "asn1dn length wrong for wildcard 1\n");
        !           320:                if (eay_cmp_asn1dn(&asn1dn0,  asn1dn))
        !           321:                        errx(1, "asn1dn mismatched for wildcard 1.\n");
        !           322:                vfree(asn1dn);
        !           323:                printf("wildcard 1 match: succeed.\n");
        !           324:        }
        !           325: 
        !           326:        if (dnstr_w1 != NULL) {
        !           327:                asn1dn = eay_str2asn1dn(dnstr_w2, strlen(dnstr_w2));
        !           328:                if (asn1dn == NULL || asn1dn->l == asn1dn0.l)
        !           329:                        errx(1, "asn1dn length wrong for wildcard 2\n");
        !           330:                if (eay_cmp_asn1dn(&asn1dn0,  asn1dn))
        !           331:                        errx(1, "asn1dn mismatched for wildcard 2.\n");
        !           332:                vfree(asn1dn);
        !           333:                printf("wildcard 2 match: succeed.\n");
        !           334:        }
        !           335: 
        !           336:     }
        !           337:        eay_init();
        !           338: 
        !           339:        /* get certs */
        !           340:        if (ac > 1) {
        !           341:                certpath = *(av + 1);
        !           342:                certs = getcerts(certpath);
        !           343:        } else {
        !           344: #ifdef ORIG_DN
        !           345:                printf("\nCAUTION: These certificates are probably invalid "
        !           346:                        "on your environment because you don't have their "
        !           347:                        "issuer's certs in your environment.\n\n");
        !           348: 
        !           349:                certpath = "/usr/local/openssl/certs";
        !           350:                certs = getcerts(NULL);
        !           351: #else
        !           352:                printf("\nWARNING: The main certificates are probably invalid "
        !           353:                        "on your environment\nbecause you don't have their "
        !           354:                        "issuer's certs in your environment\nso not doing "
        !           355:                        "this test.\n\n");
        !           356:                return (0);
        !           357: #endif
        !           358:        }
        !           359: 
        !           360:        while (*certs != NULL) {
        !           361: 
        !           362:                vchar_t c;
        !           363:                char *str;
        !           364:                vchar_t *vstr;
        !           365: 
        !           366:                printf("===CERT===\n");
        !           367: 
        !           368:                c.v = *certs;
        !           369:                c.l = strlen(*certs);
        !           370: 
        !           371:                /* print text */
        !           372:                str = eay_get_x509text(&c);
        !           373:                printf("%s", str);
        !           374:                racoon_free(str);
        !           375: 
        !           376:                /* print ASN.1 of subject name */
        !           377:                vstr = eay_get_x509asn1subjectname(&c);
        !           378:                if (!vstr)
        !           379:                        return 0;
        !           380:                PVDUMP(vstr);
        !           381:                printf("\n");
        !           382:                vfree(vstr);
        !           383: 
        !           384:                /* print subject alt name */
        !           385:            {
        !           386:                int pos;
        !           387:                for (pos = 1; ; pos++) {
        !           388:                        error = eay_get_x509subjectaltname(&c, &str, &type, pos);
        !           389:                        if (error) {
        !           390:                                printf("no subjectaltname found.\n");
        !           391:                                break;
        !           392:                        }
        !           393:                        if (!str)
        !           394:                                break;
        !           395:                        printf("SubjectAltName: %d: %s\n", type, str);
        !           396:                        racoon_free(str);
        !           397:                }
        !           398:            }
        !           399: 
        !           400:                /* NULL => name of the certificate file */
        !           401:                error = eay_check_x509cert(&c, certpath, NULL, 1);
        !           402:                if (error)
        !           403:                        printf("ERROR: cert is invalid.\n");
        !           404:                printf("\n");
        !           405: 
        !           406:                certs++;
        !           407:        }
        !           408:        return 0;
        !           409: }
        !           410: 
        !           411: static char **
        !           412: getcerts(path)
        !           413:        char *path;
        !           414: {
        !           415:        char **certs = NULL, **p;
        !           416:        DIR *dirp;
        !           417:        struct dirent *dp;
        !           418:        struct stat sb;
        !           419:        char buf[512];
        !           420:        int len;
        !           421:        int n;
        !           422:        int fd;
        !           423: 
        !           424:        static char *samplecerts[] = {
        !           425: /* self signed */
        !           426: "-----BEGIN CERTIFICATE-----\n"
        !           427: "MIICpTCCAg4CAQAwDQYJKoZIhvcNAQEEBQAwgZoxCzAJBgNVBAYTAkpQMREwDwYD\n"
        !           428: "VQQIEwhLYW5hZ2F3YTERMA8GA1UEBxMIRnVqaXNhd2ExFTATBgNVBAoTDFdJREUg\n"
        !           429: "UHJvamVjdDEVMBMGA1UECxMMS0FNRSBQcm9qZWN0MRcwFQYDVQQDEw5TaG9pY2hp\n"
        !           430: "IFNha2FuZTEeMBwGCSqGSIb3DQEJARYPc2FrYW5lQGthbWUubmV0MB4XDTAwMDgy\n"
        !           431: "NDAxMzc0NFoXDTAwMDkyMzAxMzc0NFowgZoxCzAJBgNVBAYTAkpQMREwDwYDVQQI\n"
        !           432: "EwhLYW5hZ2F3YTERMA8GA1UEBxMIRnVqaXNhd2ExFTATBgNVBAoTDFdJREUgUHJv\n"
        !           433: "amVjdDEVMBMGA1UECxMMS0FNRSBQcm9qZWN0MRcwFQYDVQQDEw5TaG9pY2hpIFNh\n"
        !           434: "a2FuZTEeMBwGCSqGSIb3DQEJARYPc2FrYW5lQGthbWUubmV0MIGfMA0GCSqGSIb3\n"
        !           435: "DQEBAQUAA4GNADCBiQKBgQCpIQG/H3zn4czAmPBcbkDrYxE1A9vcpghpib3Of0Op\n"
        !           436: "SsiWIBOyIMiVAzK/I/JotWp3Vdn5fzGp/7DGAbWXAALas2xHkNmTMPpu6qhmNQ57\n"
        !           437: "kJHZHal24mgc1hwbrI9fb5olvIexx9a1riNPnKMRVHzXYizsyMbf+lJJmZ8QFhWN\n"
        !           438: "twIDAQABMA0GCSqGSIb3DQEBBAUAA4GBACKs6X/BYycuHI3iop403R3XWMHHnNBN\n"
        !           439: "5XTHVWiWgR1cMWkq/dp51gn+nPftpdAaYGpqGkiHGhZcXLoBaX9uON3p+7av+sQN\n"
        !           440: "plXwnvUf2Zsgu+fojskS0gKcDlYiq1O8TOaBgJouFZgr1q6PiYjVEJGogAP28+HN\n"
        !           441: "M4o+GBFbFoqK\n"
        !           442: "-----END CERTIFICATE-----\n\n",
        !           443: /* signed by SSH testing CA + CA1 + CA2 */
        !           444: "-----BEGIN X509 CERTIFICATE-----\n"
        !           445: "MIICtTCCAj+gAwIBAgIEOaR8NjANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJG\n"
        !           446: "STEkMCIGA1UEChMbU1NIIENvbW11bmljYXRpb25zIFNlY3VyaXR5MREwDwYDVQQL\n"
        !           447: "EwhXZWIgdGVzdDEbMBkGA1UEAxMSVGVzdCBDQSAxIHN1YiBjYSAyMB4XDTAwMDgy\n"
        !           448: "NDAwMDAwMFoXDTAwMTAwMTAwMDAwMFowgZoxCzAJBgNVBAYTAkpQMREwDwYDVQQI\n"
        !           449: "EwhLYW5hZ2F3YTERMA8GA1UEBxMIRnVqaXNhd2ExFTATBgNVBAoTDFdJREUgUHJv\n"
        !           450: "amVjdDEVMBMGA1UECxMMS0FNRSBQcm9qZWN0MRcwFQYDVQQDEw5TaG9pY2hpIFNh\n"
        !           451: "a2FuZTEeMBwGCSqGSIb3DQEJAQwPc2FrYW5lQGthbWUubmV0MIGfMA0GCSqGSIb3\n"
        !           452: "DQEBAQUAA4GNADCBiQKBgQCpIQG/H3zn4czAmPBcbkDrYxE1A9vcpghpib3Of0Op\n"
        !           453: "SsiWIBOyIMiVAzK/I/JotWp3Vdn5fzGp/7DGAbWXAALas2xHkNmTMPpu6qhmNQ57\n"
        !           454: "kJHZHal24mgc1hwbrI9fb5olvIexx9a1riNPnKMRVHzXYizsyMbf+lJJmZ8QFhWN\n"
        !           455: "twIDAQABo18wXTALBgNVHQ8EBAMCBaAwGgYDVR0RBBMwEYEPc2FrYW5lQGthbWUu\n"
        !           456: "bmV0MDIGA1UdHwQrMCkwJ6AloCOGIWh0dHA6Ly9sZGFwLnNzaC5maS9jcmxzL2Nh\n"
        !           457: "MS0yLmNybDANBgkqhkiG9w0BAQUFAANhADtaqual41OWshF/rwCTuR6zySBJysGp\n"
        !           458: "+qjkp5efCiYKhAu1L4WXlMsV/SNdzspui5tHasPBvUw8gzFsU/VW/B2zuQZkimf1\n"
        !           459: "u6ZPjUb/vt8vLOPScP5MeH7xrTk9iigsqQ==\n"
        !           460: "-----END X509 CERTIFICATE-----\n\n",
        !           461: /* VP100 */
        !           462: "-----BEGIN CERTIFICATE-----\n"
        !           463: "MIICXzCCAcigAwIBAgIEOXGBIzANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJG\n"
        !           464: "STEkMCIGA1UEChMbU1NIIENvbW11bmljYXRpb25zIFNlY3VyaXR5MREwDwYDVQQL\n"
        !           465: "EwhXZWIgdGVzdDESMBAGA1UEAxMJVGVzdCBDQSAxMB4XDTAwMDcxNjAwMDAwMFoX\n"
        !           466: "DTAwMDkwMTAwMDAwMFowNTELMAkGA1UEBhMCanAxETAPBgNVBAoTCHRhaGl0ZXN0\n"
        !           467: "MRMwEQYDVQQDEwpmdXJ1a2F3YS0xMIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKB\n"
        !           468: "gQDUmI2RaAuoLvtRDbASwRhbkj/Oq0BBIKgAqbFknc/EanJSQwZQu82gD88nf7gG\n"
        !           469: "VEioWmKPLDuEjz5JCuM+k5f7HYHI1wWmz1KFr7UA+avZm4Kp6YKnhuH7soZp7kBL\n"
        !           470: "hTiZEpL0jdmCWLW3ZXoro55rmPrBsCd+bt8VU6tRZm5dUwIBKaNZMFcwCwYDVR0P\n"
        !           471: "BAQDAgWgMBYGA1UdEQQPMA2CBVZQMTAwhwQKFIaFMDAGA1UdHwQpMCcwJaAjoCGG\n"
        !           472: "H2h0dHA6Ly9sZGFwLnNzaC5maS9jcmxzL2NhMS5jcmwwDQYJKoZIhvcNAQEFBQAD\n"
        !           473: "gYEAKJ/2Co/KYW65mwpGG3CBvsoRL8xyUMHGt6gQpFLHiiHuAdix1ADTL6uoFuYi\n"
        !           474: "4sE5omQm1wKVv2ZhS03zDtUfKoVEv0HZ7IY3AU/FZT/M5gQvbt43Dki/ma3ock2I\n"
        !           475: "PPhbLsvXm+GCVh3jvkYGk1zr7VERVeTPtmT+hW63lcxfFp4=\n"
        !           476: "-----END CERTIFICATE-----\n\n",
        !           477: /* IKED */
        !           478: "-----BEGIN CERTIFICATE-----\n"
        !           479: "MIIEFTCCA7+gAwIBAgIKYU5X6AAAAAAACTANBgkqhkiG9w0BAQUFADCBljEpMCcG\n"
        !           480: "CSqGSIb3DQEJARYaeS13YXRhbmFAc2RsLmhpdGFjaGkuY28uanAxCzAJBgNVBAYT\n"
        !           481: "AkpQMREwDwYDVQQIEwhLQU5BR0FXQTERMA8GA1UEBxMIWW9rb2hhbWExEDAOBgNV\n"
        !           482: "BAoTB0hJVEFDSEkxDDAKBgNVBAsTA1NETDEWMBQGA1UEAxMNSVBzZWMgVGVzdCBD\n"
        !           483: "QTAeFw0wMDA3MTUwMjUxNDdaFw0wMTA3MTUwMzAxNDdaMEUxCzAJBgNVBAYTAkpQ\n"
        !           484: "MREwDwYDVQQIEwhLQU5BR0FXQTEQMA4GA1UEChMHSElUQUNISTERMA8GA1UEAxMI\n"
        !           485: "V0FUQU5BQkUwXDANBgkqhkiG9w0BAQEFAANLADBIAkEA6Wja5A7Ldzrtx+rMWHEB\n"
        !           486: "Cyt+/ZoG0qdFQbuuUiU1vOSq+1f+ZSCYAdTq13Lrr6Xfz3jDVFEZLPID9PSTFwq+\n"
        !           487: "yQIDAQABo4ICPTCCAjkwDgYDVR0PAQH/BAQDAgTwMBMGA1UdJQQMMAoGCCsGAQUF\n"
        !           488: "CAICMB0GA1UdDgQWBBTkv7/MH5Ra+S1zBAmnUIH5w8ZTUTCB0gYDVR0jBIHKMIHH\n"
        !           489: "gBQsF2qoaTl5F3GFLKrttaxPJ8j4faGBnKSBmTCBljEpMCcGCSqGSIb3DQEJARYa\n"
        !           490: "eS13YXRhbmFAc2RsLmhpdGFjaGkuY28uanAxCzAJBgNVBAYTAkpQMREwDwYDVQQI\n"
        !           491: "EwhLQU5BR0FXQTERMA8GA1UEBxMIWW9rb2hhbWExEDAOBgNVBAoTB0hJVEFDSEkx\n"
        !           492: "DDAKBgNVBAsTA1NETDEWMBQGA1UEAxMNSVBzZWMgVGVzdCBDQYIQeccIf4GYDIBA\n"
        !           493: "rS6HSUt8XjB7BgNVHR8EdDByMDagNKAyhjBodHRwOi8vZmxvcmEyMjAvQ2VydEVu\n"
        !           494: "cm9sbC9JUHNlYyUyMFRlc3QlMjBDQS5jcmwwOKA2oDSGMmZpbGU6Ly9cXGZsb3Jh\n"
        !           495: "MjIwXENlcnRFbnJvbGxcSVBzZWMlMjBUZXN0JTIwQ0EuY3JsMIGgBggrBgEFBQcB\n"
        !           496: "AQSBkzCBkDBFBggrBgEFBQcwAoY5aHR0cDovL2Zsb3JhMjIwL0NlcnRFbnJvbGwv\n"
        !           497: "ZmxvcmEyMjBfSVBzZWMlMjBUZXN0JTIwQ0EuY3J0MEcGCCsGAQUFBzAChjtmaWxl\n"
        !           498: "Oi8vXFxmbG9yYTIyMFxDZXJ0RW5yb2xsXGZsb3JhMjIwX0lQc2VjJTIwVGVzdCUy\n"
        !           499: "MENBLmNydDANBgkqhkiG9w0BAQUFAANBAG8yZAWHb6g3zba453Hw5loojVDZO6fD\n"
        !           500: "9lCsyaxeo9/+7x1JEEcdZ6qL7KKqe7ZBwza+hIN0ITkp2WEWo22gTz4=\n"
        !           501: "-----END CERTIFICATE-----\n\n",
        !           502: /* From Entrust */
        !           503: "-----BEGIN CERTIFICATE-----\n"
        !           504: "MIIDXTCCAsagAwIBAgIEOb6khTANBgkqhkiG9w0BAQUFADA4MQswCQYDVQQGEwJV\n"
        !           505: "UzEQMA4GA1UEChMHRW50cnVzdDEXMBUGA1UECxMOVlBOIEludGVyb3AgUk8wHhcN\n"
        !           506: "MDAwOTE4MjMwMDM3WhcNMDMwOTE4MjMzMDM3WjBTMQswCQYDVQQGEwJVUzEQMA4G\n"
        !           507: "A1UEChMHRW50cnVzdDEXMBUGA1UECxMOVlBOIEludGVyb3AgUk8xGTAXBgNVBAMT\n"
        !           508: "EFNob2ljaGkgU2FrYW5lIDIwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAKj3\n"
        !           509: "eXSt1qXxFXzpa265B/NQYk5BZN7pNJg0tlTKBTVV3UgpQ92Bx5DoNfZh11oIv0Sw\n"
        !           510: "6YnG5p9F9ma36U9HDoD3hVTjAvQKy4ssCsnU1y6v5XOU1QvYQo6UTzgsXUTaIau4\n"
        !           511: "Lrccl+nyoiNzy3lG51tLR8CxuA+3OOAK9xPjszClAgMBAAGjggFXMIIBUzBABgNV\n"
        !           512: "HREEOTA3gQ9zYWthbmVAa2FtZS5uZXSHBM6vIHWCHjIwNi0xNzUtMzItMTE3LnZw\n"
        !           513: "bndvcmtzaG9wLmNvbTATBgNVHSUEDDAKBggrBgEFBQgCAjALBgNVHQ8EBAMCAKAw\n"
        !           514: "KwYDVR0QBCQwIoAPMjAwMDA5MTgyMzAwMzdagQ8yMDAyMTAyNTExMzAzN1owWgYD\n"
        !           515: "VR0fBFMwUTBPoE2gS6RJMEcxCzAJBgNVBAYTAlVTMRAwDgYDVQQKEwdFbnRydXN0\n"
        !           516: "MRcwFQYDVQQLEw5WUE4gSW50ZXJvcCBSTzENMAsGA1UEAxMEQ1JMMTAfBgNVHSME\n"
        !           517: "GDAWgBTzVmhu0tBoWKwkZE5mXpooE9630DAdBgNVHQ4EFgQUEgBHPtXggJqei5Xz\n"
        !           518: "92CrWXTJxfAwCQYDVR0TBAIwADAZBgkqhkiG9n0HQQAEDDAKGwRWNS4wAwIEsDAN\n"
        !           519: "BgkqhkiG9w0BAQUFAAOBgQCIFriNGMUE8GH5LuDrTJfA8uGx8vLy2seljuo694TR\n"
        !           520: "et/ojp9QnfOJ1PF9iAdGaEaSLfkwhY4fZNZzxic5HBoHLeo9BXLP7i7FByXjvOZC\n"
        !           521: "Y8++0dC8NVvendIILcJBM5nbDq1TqIbb8K3SP80XhO5JLVJkoZiQftAMjo0peZPO\n"
        !           522: "EQ==\n"
        !           523: "-----END CERTIFICATE-----\n\n",
        !           524:        NULL,
        !           525:        };
        !           526: 
        !           527:        if (path == NULL)
        !           528:                return (char **)&samplecerts;
        !           529: 
        !           530:        stat(path, &sb);
        !           531:        if (!(sb.st_mode & S_IFDIR)) {
        !           532:                printf("ERROR: %s is not directory.\n", path);
        !           533:                exit(0);
        !           534:        }
        !           535: 
        !           536:        dirp = opendir(path);
        !           537:        if (dirp == NULL) {
        !           538:                printf("opendir failed.\n");
        !           539:                exit(0);
        !           540:        }
        !           541: 
        !           542:        n = 0;
        !           543:        while ((dp = readdir(dirp)) != NULL) {
        !           544:                if (dp->d_type != DT_REG)
        !           545:                        continue;
        !           546:                if (strcmp(dp->d_name + strlen(dp->d_name) - 4, "cert"))
        !           547:                        continue;
        !           548:                snprintf(buf, sizeof(buf), "%s/%s", path, dp->d_name);
        !           549:                stat(buf, &sb);
        !           550: 
        !           551:                p = (char **)realloc(certs, (n + 1) * sizeof(certs));
        !           552:                if (p == NULL)
        !           553:                        err(1, "realloc");
        !           554:                certs = p;
        !           555: 
        !           556:                certs[n] = malloc(sb.st_size + 1);
        !           557:                if (certs[n] == NULL)
        !           558:                        err(1, "malloc");
        !           559: 
        !           560:                fd = open(buf, O_RDONLY);
        !           561:                if (fd == -1)
        !           562:                        err(1, "open");
        !           563:                len = read(fd, certs[n], sb.st_size);
        !           564:                if (len == -1)
        !           565:                        err(1, "read");
        !           566:                if (len != sb.st_size)
        !           567:                        errx(1, "read: length mismatch");
        !           568:                certs[n][sb.st_size] = '\0';
        !           569:                close(fd);
        !           570: 
        !           571:                printf("%s: %d\n", dp->d_name, (int)sb.st_size);
        !           572: 
        !           573:                n++;
        !           574:        }
        !           575:        closedir(dirp);
        !           576: 
        !           577:        p = (char **)realloc(certs, (n + 1) * sizeof(certs));
        !           578:        if (p == NULL)
        !           579:                err(1, "realloc");
        !           580:        certs = p;
        !           581:        certs[n] = NULL;
        !           582: 
        !           583:        return certs;
        !           584: }
        !           585: #endif /* CERTTEST_BROKEN */
        !           586: 
        !           587: typedef vchar_t* (eay_func) (vchar_t *, vchar_t *, vchar_t *);
        !           588: 
        !           589: static int 
        !           590: ciphertest_1 (const char *name,
        !           591:              vchar_t *data,
        !           592:              size_t data_align,
        !           593:              vchar_t *key,
        !           594:              size_t min_keysize,
        !           595:              vchar_t *iv0,
        !           596:              size_t iv_length,
        !           597:              eay_func encrypt,
        !           598:              eay_func decrypt)
        !           599: {
        !           600:        int padlen;
        !           601:        vchar_t *buf, *iv, *res1, *res2;
        !           602:        iv = vmalloc(iv_length);
        !           603:        
        !           604:        printf("Test for cipher %s\n", name);
        !           605:        printf("data:\n");
        !           606:        PVDUMP(data);
        !           607: 
        !           608:        if (data_align <= 1 || (data->l % data_align) == 0)
        !           609:          padlen = 0;
        !           610:        else
        !           611:          padlen = data_align - data->l % data_align;
        !           612: 
        !           613:        buf = vmalloc(data->l + padlen);
        !           614:        memcpy(buf->v, data->v, data->l);
        !           615: 
        !           616:        memcpy(iv->v, iv0->v, iv_length);
        !           617:        res1 = (encrypt)(buf, key, iv);
        !           618:        if (res1 == NULL) {
        !           619:                printf("%s encryption failed.\n", name);
        !           620:                return -1;
        !           621:        }
        !           622:        printf("encrypted:\n");
        !           623:        PVDUMP(res1);
        !           624: 
        !           625:        memcpy(iv->v, iv0->v, iv_length);
        !           626:        res2 = (decrypt)(res1, key, iv);
        !           627:        if (res2 == NULL) {
        !           628:                printf("%s decryption failed.\n", name);
        !           629:                return -1;
        !           630:        }
        !           631:        printf("decrypted:\n");
        !           632:        PVDUMP(res2);
        !           633: 
        !           634:        if (memcmp(data->v, res2->v, data->l)) {
        !           635:                printf("XXXX NG (%s) XXXX\n", name);
        !           636:                return -1;
        !           637:        }
        !           638:        else
        !           639:                printf("%s cipher verified.\n", name);
        !           640:        vfree(res1);
        !           641:        vfree(res2);
        !           642:        vfree(buf);
        !           643:        vfree(iv);
        !           644: 
        !           645:        return 0;
        !           646: }
        !           647: 
        !           648: int
        !           649: ciphertest(ac, av)
        !           650:        int ac;
        !           651:        char **av;
        !           652: {
        !           653:        vchar_t data;
        !           654:        vchar_t key;
        !           655:        vchar_t iv0;
        !           656: 
        !           657:        printf("\n**Testing CIPHERS**\n");
        !           658: 
        !           659:        data.v = str2val("\
        !           660: 06000017 03000000 73616b61 6e65406b 616d652e 6e657409 0002c104 308202b8 \
        !           661: 04f05a90 \
        !           662:        ", 16, &data.l);
        !           663:        key.v = str2val("f59bd70f 81b9b9cc 2a32c7fd 229a4b37", 16, &key.l);
        !           664:        iv0.v = str2val("26b68c90 9467b4ab 7ec29fa0 0b696b55", 16, &iv0.l);
        !           665: 
        !           666:        if (ciphertest_1 ("DES", 
        !           667:                          &data, 8, 
        !           668:                          &key, 8, 
        !           669:                          &iv0, 8, 
        !           670:                          eay_des_encrypt, eay_des_decrypt) < 0)
        !           671:          return -1;
        !           672:        
        !           673:        if (ciphertest_1 ("3DES",
        !           674:                          &data, 8,
        !           675:                          &key, 24,
        !           676:                          &iv0, 8,
        !           677:                          eay_3des_encrypt, eay_3des_decrypt) < 0)
        !           678:          return -1;
        !           679:        
        !           680:        if (ciphertest_1 ("AES",
        !           681:                          &data, 16,
        !           682:                          &key, key.l,
        !           683:                          &iv0, 16,
        !           684:                          eay_aes_encrypt, eay_aes_decrypt) < 0)
        !           685:          return -1;
        !           686: 
        !           687:        if (ciphertest_1 ("BLOWFISH",
        !           688:                          &data, 8,
        !           689:                          &key, key.l,
        !           690:                          &iv0, 8,
        !           691:                          eay_bf_encrypt, eay_bf_decrypt) < 0)
        !           692:          return -1;
        !           693: 
        !           694:        if (ciphertest_1 ("CAST",
        !           695:                          &data, 8,
        !           696:                          &key, key.l,
        !           697:                          &iv0, 8,
        !           698:                          eay_cast_encrypt, eay_cast_decrypt) < 0)
        !           699:          return -1;
        !           700:        
        !           701: #ifdef HAVE_OPENSSL_IDEA_H
        !           702:        if (ciphertest_1 ("IDEA",
        !           703:                          &data, 8,
        !           704:                          &key, key.l,
        !           705:                          &iv0, 8,
        !           706:                          eay_idea_encrypt, eay_idea_decrypt) < 0)
        !           707:          return -1;
        !           708: #endif
        !           709: 
        !           710: #ifdef HAVE_OPENSSL_RC5_H
        !           711:        if (ciphertest_1 ("RC5",
        !           712:                          &data, 8,
        !           713:                          &key, key.l,
        !           714:                          &iv0, 8,
        !           715:                          eay_rc5_encrypt, eay_rc5_decrypt) < 0)
        !           716:          return -1;
        !           717: #endif
        !           718: #if defined(HAVE_OPENSSL_CAMELLIA_H)
        !           719:        if (ciphertest_1 ("CAMELLIA",
        !           720:                          &data, 16,
        !           721:                          &key, key.l,
        !           722:                          &iv0, 16,
        !           723:                          eay_camellia_encrypt, eay_camellia_decrypt) < 0)
        !           724:          return -1;
        !           725: #endif
        !           726:        return 0;
        !           727: }
        !           728: 
        !           729: int
        !           730: hmactest(ac, av)
        !           731:        int ac;
        !           732:        char **av;
        !           733: {
        !           734:        char *keyword = "hehehe test secret!";
        !           735:        char *object  = "d7e6a6c1876ef0488bb74958b9fee94e";
        !           736:        char *object1 = "d7e6a6c1876ef048";
        !           737:        char *object2 =                 "8bb74958b9fee94e";
        !           738:        char *r_hmd5  = "5702d7d1 fd1bfc7e 210fc9fa cda7d02c";
        !           739:        char *r_hsha1 = "309999aa 9779a43e ebdea839 1b4e7ee1 d8646874";
        !           740: #ifdef WITH_SHA2
        !           741:        char *r_hsha2 = "d47262d8 a5b6f39d d8686939 411b3e79 ed2e27f9 2c4ea89f dd0a06ae 0c0aa396";
        !           742: #endif
        !           743:        vchar_t *key, *data, *data1, *data2, *res;
        !           744:        vchar_t mod;
        !           745:        caddr_t ctx;
        !           746: 
        !           747: #ifdef WITH_SHA2
        !           748:        printf("\n**Test for HMAC MD5, SHA1, and SHA256.**\n");
        !           749: #else
        !           750:        printf("\n**Test for HMAC MD5 & SHA1.**\n");
        !           751: #endif
        !           752: 
        !           753:        key = vmalloc(strlen(keyword));
        !           754:        memcpy(key->v, keyword, key->l);
        !           755: 
        !           756:        data = vmalloc(strlen(object));
        !           757:        data1 = vmalloc(strlen(object1));
        !           758:        data2 = vmalloc(strlen(object2));
        !           759:        memcpy(data->v, object, data->l);
        !           760:        memcpy(data1->v, object1, data1->l);
        !           761:        memcpy(data2->v, object2, data2->l);
        !           762: 
        !           763:        /* HMAC MD5 */
        !           764:        printf("HMAC MD5 by eay_hmacmd5_one()\n");
        !           765:        res = eay_hmacmd5_one(key, data);
        !           766:        PVDUMP(res);
        !           767:        mod.v = str2val(r_hmd5, 16, &mod.l);
        !           768:        if (memcmp(res->v, mod.v, mod.l)) {
        !           769:                printf(" XXX NG XXX\n");
        !           770:                return -1;
        !           771:        }
        !           772:        free(mod.v);
        !           773:        vfree(res);
        !           774: 
        !           775:        /* HMAC MD5 */
        !           776:        printf("HMAC MD5 by eay_hmacmd5_xxx()\n");
        !           777:        ctx = eay_hmacmd5_init(key);
        !           778:        eay_hmacmd5_update(ctx, data1);
        !           779:        eay_hmacmd5_update(ctx, data2);
        !           780:        res = eay_hmacmd5_final(ctx);
        !           781:        PVDUMP(res);
        !           782:        mod.v = str2val(r_hmd5, 16, &mod.l);
        !           783:        if (memcmp(res->v, mod.v, mod.l)) {
        !           784:                printf(" XXX NG XXX\n");
        !           785:                return -1;
        !           786:        }
        !           787:        free(mod.v);
        !           788:        vfree(res);
        !           789: 
        !           790:        /* HMAC SHA1 */
        !           791:        printf("HMAC SHA1 by eay_hmacsha1_one()\n");
        !           792:        res = eay_hmacsha1_one(key, data);
        !           793:        PVDUMP(res);
        !           794:        mod.v = str2val(r_hsha1, 16, &mod.l);
        !           795:        if (memcmp(res->v, mod.v, mod.l)) {
        !           796:                printf(" XXX NG XXX\n");
        !           797:                return -1;
        !           798:        }
        !           799:        free(mod.v);
        !           800:        vfree(res);
        !           801: 
        !           802:        /* HMAC SHA1 */
        !           803:        printf("HMAC SHA1 by eay_hmacsha1_xxx()\n");
        !           804:        ctx = eay_hmacsha1_init(key);
        !           805:        eay_hmacsha1_update(ctx, data1);
        !           806:        eay_hmacsha1_update(ctx, data2);
        !           807:        res = eay_hmacsha1_final(ctx);
        !           808:        PVDUMP(res);
        !           809:        mod.v = str2val(r_hsha1, 16, &mod.l);
        !           810:        if (memcmp(res->v, mod.v, mod.l)) {
        !           811:                printf(" XXX NG XXX\n");
        !           812:                return -1;
        !           813:        }
        !           814:        free(mod.v);
        !           815:        vfree(res);
        !           816: 
        !           817: #ifdef WITH_SHA2
        !           818:        /* HMAC SHA2 */
        !           819:        printf("HMAC SHA2 by eay_hmacsha2_256_one()\n");
        !           820:        res = eay_hmacsha2_256_one(key, data);
        !           821:        PVDUMP(res);
        !           822:        mod.v = str2val(r_hsha2, 16, &mod.l);
        !           823:        if (memcmp(res->v, mod.v, mod.l)) {
        !           824:                printf(" XXX NG XXX\n");
        !           825:                return -1;
        !           826:        }
        !           827:        free(mod.v);
        !           828:        vfree(res);
        !           829: #endif
        !           830: 
        !           831:        vfree(data);
        !           832:        vfree(data1);
        !           833:        vfree(data2);
        !           834:        vfree(key);
        !           835: 
        !           836:        return 0;
        !           837: }
        !           838: 
        !           839: int
        !           840: sha1test(ac, av)
        !           841:        int ac;
        !           842:        char **av;
        !           843: {
        !           844:        char *word1 = "1234567890", *word2 = "12345678901234567890";
        !           845:        caddr_t ctx;
        !           846:        vchar_t *buf, *res;
        !           847: 
        !           848:        printf("\n**Test for SHA1.**\n");
        !           849: 
        !           850:        ctx = eay_sha1_init();
        !           851:        buf = vmalloc(strlen(word1));
        !           852:        memcpy(buf->v, word1, buf->l);
        !           853:        eay_sha1_update(ctx, buf);
        !           854:        eay_sha1_update(ctx, buf);
        !           855:        res = eay_sha1_final(ctx);
        !           856:        PVDUMP(res);
        !           857:        vfree(res);
        !           858:        vfree(buf);
        !           859: 
        !           860:        ctx = eay_sha1_init();
        !           861:        buf = vmalloc(strlen(word2));
        !           862:        memcpy(buf->v, word2, buf->l);
        !           863:        eay_sha1_update(ctx, buf);
        !           864:        res = eay_sha1_final(ctx);
        !           865:        PVDUMP(res);
        !           866:        vfree(res);
        !           867: 
        !           868:        res = eay_sha1_one(buf);
        !           869:        PVDUMP(res);
        !           870:        vfree(res);
        !           871:        vfree(buf);
        !           872: 
        !           873:        return 0;
        !           874: }
        !           875: 
        !           876: int
        !           877: md5test(ac, av)
        !           878:        int ac;
        !           879:        char **av;
        !           880: {
        !           881:        char *word1 = "1234567890", *word2 = "12345678901234567890";
        !           882:        caddr_t ctx;
        !           883:        vchar_t *buf, *res;
        !           884: 
        !           885:        printf("\n**Test for MD5.**\n");
        !           886: 
        !           887:        ctx = eay_md5_init();
        !           888:        buf = vmalloc(strlen(word1));
        !           889:        memcpy(buf->v, word1, buf->l);
        !           890:        eay_md5_update(ctx, buf);
        !           891:        eay_md5_update(ctx, buf);
        !           892:        res = eay_md5_final(ctx);
        !           893:        PVDUMP(res);
        !           894:        vfree(res);
        !           895:        vfree(buf);
        !           896: 
        !           897:        ctx = eay_md5_init();
        !           898:        buf = vmalloc(strlen(word2));
        !           899:        memcpy(buf->v, word2, buf->l);
        !           900:        eay_md5_update(ctx, buf);
        !           901:        res = eay_md5_final(ctx);
        !           902:        PVDUMP(res);
        !           903:        vfree(res);
        !           904: 
        !           905:        res = eay_md5_one(buf);
        !           906:        PVDUMP(res);
        !           907:        vfree(res);
        !           908:        vfree(buf);
        !           909: 
        !           910:        return 0;
        !           911: }
        !           912: 
        !           913: int
        !           914: dhtest(ac, av)
        !           915:        int ac;
        !           916:        char **av;
        !           917: {
        !           918:        static struct {
        !           919:                char *name;
        !           920:                char *p;
        !           921:        } px[] = {
        !           922:                { "modp768",    OAKLEY_PRIME_MODP768, },
        !           923:                { "modp1024",   OAKLEY_PRIME_MODP1024, },
        !           924:                { "modp1536",   OAKLEY_PRIME_MODP1536, },
        !           925:                { "modp2048",   OAKLEY_PRIME_MODP2048, },
        !           926:                { "modp3072",   OAKLEY_PRIME_MODP3072, },
        !           927:                { "modp4096",   OAKLEY_PRIME_MODP4096, },
        !           928:                { "modp6144",   OAKLEY_PRIME_MODP6144, },
        !           929:                { "modp8192",   OAKLEY_PRIME_MODP8192, },
        !           930:        };
        !           931:        vchar_t p1, *pub1, *priv1, *gxy1;
        !           932:        vchar_t p2, *pub2, *priv2, *gxy2;
        !           933:        int i;
        !           934: 
        !           935:        printf("\n**Test for DH.**\n");
        !           936: 
        !           937:        for (i = 0; i < sizeof(px)/sizeof(px[0]); i++) {
        !           938:                printf("\n**Test for DH %s.**\n", px[i].name);
        !           939: 
        !           940:                p1.v = str2val(px[i].p, 16, &p1.l);
        !           941:                p2.v = str2val(px[i].p, 16, &p2.l);
        !           942:                printf("prime number = \n"); PVDUMP(&p1);
        !           943: 
        !           944:                if (eay_dh_generate(&p1, 2, 96, &pub1, &priv1) < 0) {
        !           945:                        printf("error\n");
        !           946:                        return -1;
        !           947:                }
        !           948:                printf("private key for user 1 = \n"); PVDUMP(priv1);
        !           949:                printf("public key for user 1  = \n"); PVDUMP(pub1);
        !           950: 
        !           951:                if (eay_dh_generate(&p2, 2, 96, &pub2, &priv2) < 0) {
        !           952:                        printf("error\n");
        !           953:                        return -1;
        !           954:                }
        !           955:                printf("private key for user 2 = \n"); PVDUMP(priv2);
        !           956:                printf("public key for user 2  = \n"); PVDUMP(pub2);
        !           957: 
        !           958:                /* process to generate key for user 1 */
        !           959:                gxy1 = vmalloc(p1.l);
        !           960:                memset(gxy1->v, 0, gxy1->l);
        !           961:                eay_dh_compute(&p1, 2, pub1, priv1, pub2, &gxy1);
        !           962:                printf("sharing gxy1 of user 1 = \n"); PVDUMP(gxy1);
        !           963: 
        !           964:                /* process to generate key for user 2 */
        !           965:                gxy2 = vmalloc(p1.l);
        !           966:                memset(gxy2->v, 0, gxy2->l);
        !           967:                eay_dh_compute(&p2, 2, pub2, priv2, pub1, &gxy2);
        !           968:                printf("sharing gxy2 of user 2 = \n"); PVDUMP(gxy2);
        !           969: 
        !           970:                if (memcmp(gxy1->v, gxy2->v, gxy1->l)) {
        !           971:                        printf("ERROR: sharing gxy mismatched.\n");
        !           972:                        return -1;
        !           973:                }
        !           974: 
        !           975:                vfree(pub1);
        !           976:                vfree(pub2);
        !           977:                vfree(priv1);
        !           978:                vfree(priv2);
        !           979:                vfree(gxy1);
        !           980:                vfree(gxy2);
        !           981:        }
        !           982: 
        !           983:        return 0;
        !           984: }
        !           985: 
        !           986: int
        !           987: bntest(ac, av)
        !           988:        int ac;
        !           989:        char **av;
        !           990: {
        !           991:        vchar_t *rn;
        !           992: 
        !           993:        printf("\n**Test for generate a random number.**\n");
        !           994: 
        !           995:        rn = eay_set_random((u_int32_t)96);
        !           996:        PVDUMP(rn);
        !           997:        vfree(rn);
        !           998: 
        !           999:        return 0;
        !          1000: }
        !          1001: 
        !          1002: struct {
        !          1003:        char *name;
        !          1004:        int (*func) __P((int, char **));
        !          1005: } func[] = {
        !          1006:        { "random", bntest, },
        !          1007:        { "dh", dhtest, },
        !          1008:        { "md5", md5test, },
        !          1009:        { "sha1", sha1test, },
        !          1010:        { "hmac", hmactest, },
        !          1011:        { "cipher", ciphertest, },
        !          1012: #ifndef CERTTEST_BROKEN
        !          1013:        { "cert", certtest, },
        !          1014: #endif
        !          1015:        { "rsa", rsatest, },
        !          1016: };
        !          1017: 
        !          1018: int
        !          1019: main(ac, av)
        !          1020:        int ac;
        !          1021:        char **av;
        !          1022: {
        !          1023:        int i;
        !          1024:        int len = sizeof(func)/sizeof(func[0]);
        !          1025: 
        !          1026:        f_foreground = 1;
        !          1027:        ploginit();
        !          1028: 
        !          1029:        printf ("\nTestsuite of the %s\nlinked with %s\n\n", TOP_PACKAGE_STRING, eay_version());
        !          1030: 
        !          1031:        if (strcmp(*av, "-h") == 0)
        !          1032:                Usage();
        !          1033: 
        !          1034:        ac--;
        !          1035:        av++;
        !          1036: 
        !          1037:        for (i = 0; i < len; i++) {
        !          1038:                if ((ac == 0) || (strcmp(*av, func[i].name) == 0)) {
        !          1039:                        if ((func[i].func)(ac, av) != 0) {
        !          1040:                                printf ("\n!!!!! Test '%s' failed. !!!!!\n\n", func[i].name);
        !          1041:                                exit(1);
        !          1042:                        }
        !          1043:                        if (ac)
        !          1044:                                break;
        !          1045:                }
        !          1046:        }
        !          1047:        if (ac && i == len)
        !          1048:                Usage();
        !          1049: 
        !          1050:        printf ("\n===== All tests passed =====\n\n");
        !          1051:        exit(0);
        !          1052: }
        !          1053: 
        !          1054: void
        !          1055: Usage()
        !          1056: {
        !          1057:        int i;
        !          1058:        int len = sizeof(func)/sizeof(func[0]);
        !          1059: 
        !          1060:        printf("Usage: eaytest [");
        !          1061:        for (i = 0; i < len; i++)
        !          1062:                printf("%s%s", func[i].name, (i<len-1)?"|":"");
        !          1063:        printf("]\n");
        !          1064: #ifndef CERTTEST_BROKEN
        !          1065:        printf("       eaytest cert [cert_directory]\n");
        !          1066: #endif
        !          1067:        exit(1);
        !          1068: }
        !          1069: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>