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