Home | History | Annotate | Download | only in racoon
      1 /*	$NetBSD: oakley.c,v 1.9.6.4 2009/08/13 09:18:45 vanhu Exp $	*/
      2 
      3 /* Id: oakley.c,v 1.32 2006/05/26 12:19:46 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/param.h>
     38 #include <sys/socket.h>	/* XXX for subjectaltname */
     39 #include <netinet/in.h>	/* XXX for subjectaltname */
     40 
     41 #include <openssl/pkcs7.h>
     42 #include <openssl/x509.h>
     43 
     44 #include <stdlib.h>
     45 #include <stdio.h>
     46 #include <string.h>
     47 #include <errno.h>
     48 
     49 #if TIME_WITH_SYS_TIME
     50 # include <sys/time.h>
     51 # include <time.h>
     52 #else
     53 # if HAVE_SYS_TIME_H
     54 #  include <sys/time.h>
     55 # else
     56 #  include <time.h>
     57 # endif
     58 #endif
     59 #ifdef ENABLE_HYBRID
     60 #include <resolv.h>
     61 #endif
     62 
     63 #include "var.h"
     64 #include "misc.h"
     65 #include "vmbuf.h"
     66 #include "str2val.h"
     67 #include "plog.h"
     68 #include "debug.h"
     69 
     70 #include "isakmp_var.h"
     71 #include "isakmp.h"
     72 #ifdef ENABLE_HYBRID
     73 #include "isakmp_xauth.h"
     74 #include "isakmp_cfg.h"
     75 #endif
     76 #include "oakley.h"
     77 #include "admin.h"
     78 #include "privsep.h"
     79 #include "localconf.h"
     80 #include "remoteconf.h"
     81 #include "policy.h"
     82 #include "handler.h"
     83 #include "ipsec_doi.h"
     84 #include "algorithm.h"
     85 #include "dhgroup.h"
     86 #include "sainfo.h"
     87 #include "proposal.h"
     88 #include "crypto_openssl.h"
     89 #include "dnssec.h"
     90 #include "sockmisc.h"
     91 #include "strnames.h"
     92 #include "gcmalloc.h"
     93 #include "rsalist.h"
     94 
     95 #ifdef HAVE_GSSAPI
     96 #include "gssapi.h"
     97 #endif
     98 
     99 #define OUTBOUND_SA	0
    100 #define INBOUND_SA	1
    101 
    102 #define INITDHVAL(a, s, d, t)                                                  \
    103 do {                                                                           \
    104 	vchar_t buf;                                                           \
    105 	buf.v = str2val((s), 16, &buf.l);                                      \
    106 	memset(&a, 0, sizeof(struct dhgroup));                                 \
    107 	a.type = (t);                                                          \
    108 	a.prime = vdup(&buf);                                                  \
    109 	a.gen1 = 2;                                                            \
    110 	a.gen2 = 0;                                                            \
    111 	racoon_free(buf.v);                                                    \
    112 } while(0);
    113 
    114 struct dhgroup dh_modp768;
    115 struct dhgroup dh_modp1024;
    116 struct dhgroup dh_modp1536;
    117 struct dhgroup dh_modp2048;
    118 struct dhgroup dh_modp3072;
    119 struct dhgroup dh_modp4096;
    120 struct dhgroup dh_modp6144;
    121 struct dhgroup dh_modp8192;
    122 
    123 
    124 static int oakley_check_dh_pub __P((vchar_t *, vchar_t **));
    125 static int oakley_compute_keymat_x __P((struct ph2handle *, int, int));
    126 static int get_cert_fromlocal __P((struct ph1handle *, int));
    127 static int get_plainrsa_fromlocal __P((struct ph1handle *, int));
    128 static int oakley_check_certid __P((struct ph1handle *iph1));
    129 static int check_typeofcertname __P((int, int));
    130 static cert_t *save_certbuf __P((struct isakmp_gen *));
    131 static cert_t *save_certx509 __P((X509 *));
    132 static int oakley_padlen __P((int, int));
    133 
    134 int
    135 oakley_get_defaultlifetime()
    136 {
    137 	return OAKLEY_ATTR_SA_LD_SEC_DEFAULT;
    138 }
    139 
    140 int
    141 oakley_dhinit()
    142 {
    143 	/* set DH MODP */
    144 	INITDHVAL(dh_modp768, OAKLEY_PRIME_MODP768,
    145 		OAKLEY_ATTR_GRP_DESC_MODP768, OAKLEY_ATTR_GRP_TYPE_MODP);
    146 	INITDHVAL(dh_modp1024, OAKLEY_PRIME_MODP1024,
    147 		OAKLEY_ATTR_GRP_DESC_MODP1024, OAKLEY_ATTR_GRP_TYPE_MODP);
    148 	INITDHVAL(dh_modp1536, OAKLEY_PRIME_MODP1536,
    149 		OAKLEY_ATTR_GRP_DESC_MODP1536, OAKLEY_ATTR_GRP_TYPE_MODP);
    150 	INITDHVAL(dh_modp2048, OAKLEY_PRIME_MODP2048,
    151 		OAKLEY_ATTR_GRP_DESC_MODP2048, OAKLEY_ATTR_GRP_TYPE_MODP);
    152 	INITDHVAL(dh_modp3072, OAKLEY_PRIME_MODP3072,
    153 		OAKLEY_ATTR_GRP_DESC_MODP3072, OAKLEY_ATTR_GRP_TYPE_MODP);
    154 	INITDHVAL(dh_modp4096, OAKLEY_PRIME_MODP4096,
    155 		OAKLEY_ATTR_GRP_DESC_MODP4096, OAKLEY_ATTR_GRP_TYPE_MODP);
    156 	INITDHVAL(dh_modp6144, OAKLEY_PRIME_MODP6144,
    157 		OAKLEY_ATTR_GRP_DESC_MODP6144, OAKLEY_ATTR_GRP_TYPE_MODP);
    158 	INITDHVAL(dh_modp8192, OAKLEY_PRIME_MODP8192,
    159 		OAKLEY_ATTR_GRP_DESC_MODP8192, OAKLEY_ATTR_GRP_TYPE_MODP);
    160 
    161 	return 0;
    162 }
    163 
    164 void
    165 oakley_dhgrp_free(dhgrp)
    166 	struct dhgroup *dhgrp;
    167 {
    168 	if (dhgrp->prime)
    169 		vfree(dhgrp->prime);
    170 	if (dhgrp->curve_a)
    171 		vfree(dhgrp->curve_a);
    172 	if (dhgrp->curve_b)
    173 		vfree(dhgrp->curve_b);
    174 	if (dhgrp->order)
    175 		vfree(dhgrp->order);
    176 	racoon_free(dhgrp);
    177 }
    178 
    179 /*
    180  * RFC2409 5
    181  * The length of the Diffie-Hellman public value MUST be equal to the
    182  * length of the prime modulus over which the exponentiation was
    183  * performed, prepending zero bits to the value if necessary.
    184  */
    185 static int
    186 oakley_check_dh_pub(prime, pub0)
    187 	vchar_t *prime, **pub0;
    188 {
    189 	vchar_t *tmp;
    190 	vchar_t *pub = *pub0;
    191 
    192 	if (prime->l == pub->l)
    193 		return 0;
    194 
    195 	if (prime->l < pub->l) {
    196 		/* what should i do ? */
    197 		plog(LLV_ERROR, LOCATION, NULL,
    198 			"invalid public information was generated.\n");
    199 		return -1;
    200 	}
    201 
    202 	/* prime->l > pub->l */
    203 	tmp = vmalloc(prime->l);
    204 	if (tmp == NULL) {
    205 		plog(LLV_ERROR, LOCATION, NULL,
    206 			"failed to get DH buffer.\n");
    207 		return -1;
    208 	}
    209 	memcpy(tmp->v + prime->l - pub->l, pub->v, pub->l);
    210 
    211 	vfree(*pub0);
    212 	*pub0 = tmp;
    213 
    214 	return 0;
    215 }
    216 
    217 /*
    218  * compute sharing secret of DH
    219  * IN:	*dh, *pub, *priv, *pub_p
    220  * OUT: **gxy
    221  */
    222 int
    223 oakley_dh_compute(dh, pub, priv, pub_p, gxy)
    224 	const struct dhgroup *dh;
    225 	vchar_t *pub, *priv, *pub_p, **gxy;
    226 {
    227 #ifdef ENABLE_STATS
    228 	struct timeval start, end;
    229 #endif
    230 	if ((*gxy = vmalloc(dh->prime->l)) == NULL) {
    231 		plog(LLV_ERROR, LOCATION, NULL,
    232 			"failed to get DH buffer.\n");
    233 		return -1;
    234 	}
    235 
    236 #ifdef ENABLE_STATS
    237 	gettimeofday(&start, NULL);
    238 #endif
    239 	switch (dh->type) {
    240 	case OAKLEY_ATTR_GRP_TYPE_MODP:
    241 		if (eay_dh_compute(dh->prime, dh->gen1, pub, priv, pub_p, gxy) < 0) {
    242 			plog(LLV_ERROR, LOCATION, NULL,
    243 				"failed to compute dh value.\n");
    244 			return -1;
    245 		}
    246 		break;
    247 	case OAKLEY_ATTR_GRP_TYPE_ECP:
    248 	case OAKLEY_ATTR_GRP_TYPE_EC2N:
    249 		plog(LLV_ERROR, LOCATION, NULL,
    250 			"dh type %d isn't supported.\n", dh->type);
    251 		return -1;
    252 	default:
    253 		plog(LLV_ERROR, LOCATION, NULL,
    254 			"invalid dh type %d.\n", dh->type);
    255 		return -1;
    256 	}
    257 
    258 #ifdef ENABLE_STATS
    259 	gettimeofday(&end, NULL);
    260 	syslog(LOG_NOTICE, "%s(%s%zu): %8.6f", __func__,
    261 		s_attr_isakmp_group(dh->type), dh->prime->l << 3,
    262 		timedelta(&start, &end));
    263 #endif
    264 
    265 	plog(LLV_DEBUG, LOCATION, NULL, "compute DH's shared.\n");
    266 	plogdump(LLV_DEBUG, (*gxy)->v, (*gxy)->l);
    267 
    268 	return 0;
    269 }
    270 
    271 /*
    272  * generate values of DH
    273  * IN:	*dh
    274  * OUT: **pub, **priv
    275  */
    276 int
    277 oakley_dh_generate(dh, pub, priv)
    278 	const struct dhgroup *dh;
    279 	vchar_t **pub, **priv;
    280 {
    281 #ifdef ENABLE_STATS
    282 	struct timeval start, end;
    283 	gettimeofday(&start, NULL);
    284 #endif
    285 	switch (dh->type) {
    286 	case OAKLEY_ATTR_GRP_TYPE_MODP:
    287 		if (eay_dh_generate(dh->prime, dh->gen1, dh->gen2, pub, priv) < 0) {
    288 			plog(LLV_ERROR, LOCATION, NULL,
    289 				"failed to compute dh value.\n");
    290 			return -1;
    291 		}
    292 		break;
    293 
    294 	case OAKLEY_ATTR_GRP_TYPE_ECP:
    295 	case OAKLEY_ATTR_GRP_TYPE_EC2N:
    296 		plog(LLV_ERROR, LOCATION, NULL,
    297 			"dh type %d isn't supported.\n", dh->type);
    298 		return -1;
    299 	default:
    300 		plog(LLV_ERROR, LOCATION, NULL,
    301 			"invalid dh type %d.\n", dh->type);
    302 		return -1;
    303 	}
    304 
    305 #ifdef ENABLE_STATS
    306 	gettimeofday(&end, NULL);
    307 	syslog(LOG_NOTICE, "%s(%s%zu): %8.6f", __func__,
    308 		s_attr_isakmp_group(dh->type), dh->prime->l << 3,
    309 		timedelta(&start, &end));
    310 #endif
    311 
    312 	if (oakley_check_dh_pub(dh->prime, pub) != 0)
    313 		return -1;
    314 
    315 	plog(LLV_DEBUG, LOCATION, NULL, "compute DH's private.\n");
    316 	plogdump(LLV_DEBUG, (*priv)->v, (*priv)->l);
    317 	plog(LLV_DEBUG, LOCATION, NULL, "compute DH's public.\n");
    318 	plogdump(LLV_DEBUG, (*pub)->v, (*pub)->l);
    319 
    320 	return 0;
    321 }
    322 
    323 /*
    324  * copy pre-defined dhgroup values.
    325  */
    326 int
    327 oakley_setdhgroup(group, dhgrp)
    328 	int group;
    329 	struct dhgroup **dhgrp;
    330 {
    331 	struct dhgroup *g;
    332 
    333 	*dhgrp = NULL;	/* just make sure, initialize */
    334 
    335 	g = alg_oakley_dhdef_group(group);
    336 	if (g == NULL) {
    337 		plog(LLV_ERROR, LOCATION, NULL,
    338 			"invalid DH parameter grp=%d.\n", group);
    339 		return -1;
    340 	}
    341 
    342 	if (!g->type || !g->prime || !g->gen1) {
    343 		/* unsuported */
    344 		plog(LLV_ERROR, LOCATION, NULL,
    345 			"unsupported DH parameters grp=%d.\n", group);
    346 		return -1;
    347 	}
    348 
    349 	*dhgrp = racoon_calloc(1, sizeof(struct dhgroup));
    350 	if (*dhgrp == NULL) {
    351 		plog(LLV_ERROR, LOCATION, NULL,
    352 			"failed to get DH buffer.\n");
    353 		return 0;
    354 	}
    355 
    356 	/* set defined dh vlaues */
    357 	memcpy(*dhgrp, g, sizeof(*g));
    358 	(*dhgrp)->prime = vdup(g->prime);
    359 
    360 	return 0;
    361 }
    362 
    363 /*
    364  * PRF
    365  *
    366  * NOTE: we do not support prf with different input/output bitwidth,
    367  * so we do not implement RFC2409 Appendix B (DOORAK-MAC example) in
    368  * oakley_compute_keymat().  If you add support for such prf function,
    369  * modify oakley_compute_keymat() accordingly.
    370  */
    371 vchar_t *
    372 oakley_prf(key, buf, iph1)
    373 	vchar_t *key, *buf;
    374 	struct ph1handle *iph1;
    375 {
    376 	vchar_t *res = NULL;
    377 	int type;
    378 
    379 	if (iph1->approval == NULL) {
    380 		/*
    381 		 * it's before negotiating hash algorithm.
    382 		 * We use md5 as default.
    383 		 */
    384 		type = OAKLEY_ATTR_HASH_ALG_MD5;
    385 	} else
    386 		type = iph1->approval->hashtype;
    387 
    388 	res = alg_oakley_hmacdef_one(type, key, buf);
    389 	if (res == NULL) {
    390 		plog(LLV_ERROR, LOCATION, NULL,
    391 			"invalid hmac algorithm %d.\n", type);
    392 		return NULL;
    393 	}
    394 
    395 	return res;
    396 }
    397 
    398 /*
    399  * hash
    400  */
    401 vchar_t *
    402 oakley_hash(buf, iph1)
    403 	vchar_t *buf;
    404 	struct ph1handle *iph1;
    405 {
    406 	vchar_t *res = NULL;
    407 	int type;
    408 
    409 	if (iph1->approval == NULL) {
    410 		/*
    411 		 * it's before negotiating hash algorithm.
    412 		 * We use md5 as default.
    413 		 */
    414 		type = OAKLEY_ATTR_HASH_ALG_MD5;
    415 	} else
    416 		type = iph1->approval->hashtype;
    417 
    418 	res = alg_oakley_hashdef_one(type, buf);
    419 	if (res == NULL) {
    420 		plog(LLV_ERROR, LOCATION, NULL,
    421 			"invalid hash algoriym %d.\n", type);
    422 		return NULL;
    423 	}
    424 
    425 	return res;
    426 }
    427 
    428 /*
    429  * compute KEYMAT
    430  *   see seciton 5.5 Phase 2 - Quick Mode in isakmp-oakley-05.
    431  */
    432 int
    433 oakley_compute_keymat(iph2, side)
    434 	struct ph2handle *iph2;
    435 	int side;
    436 {
    437 	int error = -1;
    438 
    439 	/* compute sharing secret of DH when PFS */
    440 	if (iph2->approval->pfs_group && iph2->dhpub_p) {
    441 		if (oakley_dh_compute(iph2->pfsgrp, iph2->dhpub,
    442 				iph2->dhpriv, iph2->dhpub_p, &iph2->dhgxy) < 0)
    443 			goto end;
    444 	}
    445 
    446 	/* compute keymat */
    447 	if (oakley_compute_keymat_x(iph2, side, INBOUND_SA) < 0
    448 	 || oakley_compute_keymat_x(iph2, side, OUTBOUND_SA) < 0)
    449 		goto end;
    450 
    451 	plog(LLV_DEBUG, LOCATION, NULL, "KEYMAT computed.\n");
    452 
    453 	error = 0;
    454 
    455 end:
    456 	return error;
    457 }
    458 
    459 /*
    460  * compute KEYMAT.
    461  * KEYMAT = prf(SKEYID_d, protocol | SPI | Ni_b | Nr_b).
    462  * If PFS is desired and KE payloads were exchanged,
    463  *   KEYMAT = prf(SKEYID_d, g(qm)^xy | protocol | SPI | Ni_b | Nr_b)
    464  *
    465  * NOTE: we do not support prf with different input/output bitwidth,
    466  * so we do not implement RFC2409 Appendix B (DOORAK-MAC example).
    467  */
    468 static int
    469 oakley_compute_keymat_x(iph2, side, sa_dir)
    470 	struct ph2handle *iph2;
    471 	int side;
    472 	int sa_dir;
    473 {
    474 	vchar_t *buf = NULL, *res = NULL, *bp;
    475 	char *p;
    476 	int len;
    477 	int error = -1;
    478 	int pfs = 0;
    479 	int dupkeymat;	/* generate K[1-dupkeymat] */
    480 	struct saproto *pr;
    481 	struct satrns *tr;
    482 	int encklen, authklen, l;
    483 
    484 	pfs = ((iph2->approval->pfs_group && iph2->dhgxy) ? 1 : 0);
    485 
    486 	len = pfs ? iph2->dhgxy->l : 0;
    487 	len += (1
    488 		+ sizeof(u_int32_t)	/* XXX SPI size */
    489 		+ iph2->nonce->l
    490 		+ iph2->nonce_p->l);
    491 	buf = vmalloc(len);
    492 	if (buf == NULL) {
    493 		plog(LLV_ERROR, LOCATION, NULL,
    494 			"failed to get keymat buffer.\n");
    495 		goto end;
    496 	}
    497 
    498 	for (pr = iph2->approval->head; pr != NULL; pr = pr->next) {
    499 		p = buf->v;
    500 
    501 		/* if PFS */
    502 		if (pfs) {
    503 			memcpy(p, iph2->dhgxy->v, iph2->dhgxy->l);
    504 			p += iph2->dhgxy->l;
    505 		}
    506 
    507 		p[0] = pr->proto_id;
    508 		p += 1;
    509 
    510 		memcpy(p, (sa_dir == INBOUND_SA ? &pr->spi : &pr->spi_p),
    511 			sizeof(pr->spi));
    512 		p += sizeof(pr->spi);
    513 
    514 		bp = (side == INITIATOR ? iph2->nonce : iph2->nonce_p);
    515 		memcpy(p, bp->v, bp->l);
    516 		p += bp->l;
    517 
    518 		bp = (side == INITIATOR ? iph2->nonce_p : iph2->nonce);
    519 		memcpy(p, bp->v, bp->l);
    520 		p += bp->l;
    521 
    522 		/* compute IV */
    523 		plog(LLV_DEBUG, LOCATION, NULL, "KEYMAT compute with\n");
    524 		plogdump(LLV_DEBUG, buf->v, buf->l);
    525 
    526 		/* res = K1 */
    527 		res = oakley_prf(iph2->ph1->skeyid_d, buf, iph2->ph1);
    528 		if (res == NULL)
    529 			goto end;
    530 
    531 		/* compute key length needed */
    532 		encklen = authklen = 0;
    533 		switch (pr->proto_id) {
    534 		case IPSECDOI_PROTO_IPSEC_ESP:
    535 			for (tr = pr->head; tr; tr = tr->next) {
    536 				l = alg_ipsec_encdef_keylen(tr->trns_id,
    537 				    tr->encklen);
    538 				if (l > encklen)
    539 					encklen = l;
    540 
    541 				l = alg_ipsec_hmacdef_hashlen(tr->authtype);
    542 				if (l > authklen)
    543 					authklen = l;
    544 			}
    545 			break;
    546 		case IPSECDOI_PROTO_IPSEC_AH:
    547 			for (tr = pr->head; tr; tr = tr->next) {
    548 				l = alg_ipsec_hmacdef_hashlen(tr->trns_id);
    549 				if (l > authklen)
    550 					authklen = l;
    551 			}
    552 			break;
    553 		default:
    554 			break;
    555 		}
    556 		plog(LLV_DEBUG, LOCATION, NULL, "encklen=%d authklen=%d\n",
    557 			encklen, authklen);
    558 
    559 		dupkeymat = (encklen + authklen) / 8 / res->l;
    560 		dupkeymat += 2;	/* safety mergin */
    561 		if (dupkeymat < 3)
    562 			dupkeymat = 3;
    563 		plog(LLV_DEBUG, LOCATION, NULL,
    564 			"generating %zu bits of key (dupkeymat=%d)\n",
    565 			dupkeymat * 8 * res->l, dupkeymat);
    566 		if (0 < --dupkeymat) {
    567 			vchar_t *prev = res;	/* K(n-1) */
    568 			vchar_t *seed = NULL;	/* seed for Kn */
    569 			size_t l;
    570 
    571 			/*
    572 			 * generating long key (isakmp-oakley-08 5.5)
    573 			 *   KEYMAT = K1 | K2 | K3 | ...
    574 			 * where
    575 			 *   src = [ g(qm)^xy | ] protocol | SPI | Ni_b | Nr_b
    576 			 *   K1 = prf(SKEYID_d, src)
    577 			 *   K2 = prf(SKEYID_d, K1 | src)
    578 			 *   K3 = prf(SKEYID_d, K2 | src)
    579 			 *   Kn = prf(SKEYID_d, K(n-1) | src)
    580 			 */
    581 			plog(LLV_DEBUG, LOCATION, NULL,
    582 				"generating K1...K%d for KEYMAT.\n",
    583 				dupkeymat + 1);
    584 
    585 			seed = vmalloc(prev->l + buf->l);
    586 			if (seed == NULL) {
    587 				plog(LLV_ERROR, LOCATION, NULL,
    588 					"failed to get keymat buffer.\n");
    589 				if (prev && prev != res)
    590 					vfree(prev);
    591 				goto end;
    592 			}
    593 
    594 			while (dupkeymat--) {
    595 				vchar_t *this = NULL;	/* Kn */
    596 				int update_prev;
    597 
    598 				memcpy(seed->v, prev->v, prev->l);
    599 				memcpy(seed->v + prev->l, buf->v, buf->l);
    600 				this = oakley_prf(iph2->ph1->skeyid_d, seed,
    601 							iph2->ph1);
    602 				if (!this) {
    603 					plog(LLV_ERROR, LOCATION, NULL,
    604 						"oakley_prf memory overflow\n");
    605 					if (prev && prev != res)
    606 						vfree(prev);
    607 					vfree(this);
    608 					vfree(seed);
    609 					goto end;
    610 				}
    611 
    612 				update_prev = (prev && prev == res) ? 1 : 0;
    613 
    614 				l = res->l;
    615 				res = vrealloc(res, l + this->l);
    616 
    617 				if (update_prev)
    618 					prev = res;
    619 
    620 				if (res == NULL) {
    621 					plog(LLV_ERROR, LOCATION, NULL,
    622 						"failed to get keymat buffer.\n");
    623 					if (prev && prev != res)
    624 						vfree(prev);
    625 					vfree(this);
    626 					vfree(seed);
    627 					goto end;
    628 				}
    629 				memcpy(res->v + l, this->v, this->l);
    630 
    631 				if (prev && prev != res)
    632 					vfree(prev);
    633 				prev = this;
    634 				this = NULL;
    635 			}
    636 
    637 			if (prev && prev != res)
    638 				vfree(prev);
    639 			vfree(seed);
    640 		}
    641 
    642 		plogdump(LLV_DEBUG, res->v, res->l);
    643 
    644 		if (sa_dir == INBOUND_SA)
    645 			pr->keymat = res;
    646 		else
    647 			pr->keymat_p = res;
    648 		res = NULL;
    649 	}
    650 
    651 	error = 0;
    652 
    653 end:
    654 	if (error) {
    655 		for (pr = iph2->approval->head; pr != NULL; pr = pr->next) {
    656 			if (pr->keymat) {
    657 				vfree(pr->keymat);
    658 				pr->keymat = NULL;
    659 			}
    660 			if (pr->keymat_p) {
    661 				vfree(pr->keymat_p);
    662 				pr->keymat_p = NULL;
    663 			}
    664 		}
    665 	}
    666 
    667 	if (buf != NULL)
    668 		vfree(buf);
    669 	if (res)
    670 		vfree(res);
    671 
    672 	return error;
    673 }
    674 
    675 #if notyet
    676 /*
    677  * NOTE: Must terminate by NULL.
    678  */
    679 vchar_t *
    680 oakley_compute_hashx(struct ph1handle *iph1, ...)
    681 {
    682 	vchar_t *buf, *res;
    683 	vchar_t *s;
    684 	caddr_t p;
    685 	int len;
    686 
    687 	va_list ap;
    688 
    689 	/* get buffer length */
    690 	va_start(ap, iph1);
    691 	len = 0;
    692         while ((s = va_arg(ap, vchar_t *)) != NULL) {
    693 		len += s->l
    694         }
    695 	va_end(ap);
    696 
    697 	buf = vmalloc(len);
    698 	if (buf == NULL) {
    699 		plog(LLV_ERROR, LOCATION, NULL,
    700 			"failed to get hash buffer\n");
    701 		return NULL;
    702 	}
    703 
    704 	/* set buffer */
    705 	va_start(ap, iph1);
    706 	p = buf->v;
    707         while ((s = va_arg(ap, char *)) != NULL) {
    708 		memcpy(p, s->v, s->l);
    709 		p += s->l;
    710 	}
    711 	va_end(ap);
    712 
    713 	plog(LLV_DEBUG, LOCATION, NULL, "HASH with: \n");
    714 	plogdump(LLV_DEBUG, buf->v, buf->l);
    715 
    716 	/* compute HASH */
    717 	res = oakley_prf(iph1->skeyid_a, buf, iph1);
    718 	vfree(buf);
    719 	if (res == NULL)
    720 		return NULL;
    721 
    722 	plog(LLV_DEBUG, LOCATION, NULL, "HASH computed:\n");
    723 	plogdump(LLV_DEBUG, res->v, res->l);
    724 
    725 	return res;
    726 }
    727 #endif
    728 
    729 /*
    730  * compute HASH(3) prf(SKEYID_a, 0 | M-ID | Ni_b | Nr_b)
    731  *   see seciton 5.5 Phase 2 - Quick Mode in isakmp-oakley-05.
    732  */
    733 vchar_t *
    734 oakley_compute_hash3(iph1, msgid, body)
    735 	struct ph1handle *iph1;
    736 	u_int32_t msgid;
    737 	vchar_t *body;
    738 {
    739 	vchar_t *buf = 0, *res = 0;
    740 	int len;
    741 	int error = -1;
    742 
    743 	/* create buffer */
    744 	len = 1 + sizeof(u_int32_t) + body->l;
    745 	buf = vmalloc(len);
    746 	if (buf == NULL) {
    747 		plog(LLV_DEBUG, LOCATION, NULL,
    748 			"failed to get hash buffer\n");
    749 		goto end;
    750 	}
    751 
    752 	buf->v[0] = 0;
    753 
    754 	memcpy(buf->v + 1, (char *)&msgid, sizeof(msgid));
    755 
    756 	memcpy(buf->v + 1 + sizeof(u_int32_t), body->v, body->l);
    757 
    758 	plog(LLV_DEBUG, LOCATION, NULL, "HASH with: \n");
    759 	plogdump(LLV_DEBUG, buf->v, buf->l);
    760 
    761 	/* compute HASH */
    762 	res = oakley_prf(iph1->skeyid_a, buf, iph1);
    763 	if (res == NULL)
    764 		goto end;
    765 
    766 	error = 0;
    767 
    768 	plog(LLV_DEBUG, LOCATION, NULL, "HASH computed:\n");
    769 	plogdump(LLV_DEBUG, res->v, res->l);
    770 
    771 end:
    772 	if (buf != NULL)
    773 		vfree(buf);
    774 	return res;
    775 }
    776 
    777 /*
    778  * compute HASH type of prf(SKEYID_a, M-ID | buffer)
    779  *	e.g.
    780  *	for quick mode HASH(1):
    781  *		prf(SKEYID_a, M-ID | SA | Ni [ | KE ] [ | IDci | IDcr ])
    782  *	for quick mode HASH(2):
    783  *		prf(SKEYID_a, M-ID | Ni_b | SA | Nr [ | KE ] [ | IDci | IDcr ])
    784  *	for Informational exchange:
    785  *		prf(SKEYID_a, M-ID | N/D)
    786  */
    787 vchar_t *
    788 oakley_compute_hash1(iph1, msgid, body)
    789 	struct ph1handle *iph1;
    790 	u_int32_t msgid;
    791 	vchar_t *body;
    792 {
    793 	vchar_t *buf = NULL, *res = NULL;
    794 	char *p;
    795 	int len;
    796 	int error = -1;
    797 
    798 	/* create buffer */
    799 	len = sizeof(u_int32_t) + body->l;
    800 	buf = vmalloc(len);
    801 	if (buf == NULL) {
    802 		plog(LLV_DEBUG, LOCATION, NULL,
    803 			"failed to get hash buffer\n");
    804 		goto end;
    805 	}
    806 
    807 	p = buf->v;
    808 
    809 	memcpy(buf->v, (char *)&msgid, sizeof(msgid));
    810 	p += sizeof(u_int32_t);
    811 
    812 	memcpy(p, body->v, body->l);
    813 
    814 	plog(LLV_DEBUG, LOCATION, NULL, "HASH with:\n");
    815 	plogdump(LLV_DEBUG, buf->v, buf->l);
    816 
    817 	/* compute HASH */
    818 	res = oakley_prf(iph1->skeyid_a, buf, iph1);
    819 	if (res == NULL)
    820 		goto end;
    821 
    822 	error = 0;
    823 
    824 	plog(LLV_DEBUG, LOCATION, NULL, "HASH computed:\n");
    825 	plogdump(LLV_DEBUG, res->v, res->l);
    826 
    827 end:
    828 	if (buf != NULL)
    829 		vfree(buf);
    830 	return res;
    831 }
    832 
    833 /*
    834  * compute phase1 HASH
    835  * main/aggressive
    836  *   I-digest = prf(SKEYID, g^i | g^r | CKY-I | CKY-R | SAi_b | ID_i1_b)
    837  *   R-digest = prf(SKEYID, g^r | g^i | CKY-R | CKY-I | SAi_b | ID_r1_b)
    838  * for gssapi, also include all GSS tokens, and call gss_wrap on the result
    839  */
    840 vchar_t *
    841 oakley_ph1hash_common(iph1, sw)
    842 	struct ph1handle *iph1;
    843 	int sw;
    844 {
    845 	vchar_t *buf = NULL, *res = NULL, *bp;
    846 	char *p, *bp2;
    847 	int len, bl;
    848 	int error = -1;
    849 #ifdef HAVE_GSSAPI
    850 	vchar_t *gsstokens = NULL;
    851 #endif
    852 
    853 	/* create buffer */
    854 	len = iph1->dhpub->l
    855 		+ iph1->dhpub_p->l
    856 		+ sizeof(cookie_t) * 2
    857 		+ iph1->sa->l
    858 		+ (sw == GENERATE ? iph1->id->l : iph1->id_p->l);
    859 
    860 #ifdef HAVE_GSSAPI
    861 	if (AUTHMETHOD(iph1) == OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB) {
    862 		if (iph1->gi_i != NULL && iph1->gi_r != NULL) {
    863 			bp = (sw == GENERATE ? iph1->gi_i : iph1->gi_r);
    864 			len += bp->l;
    865 		}
    866 		if (sw == GENERATE)
    867 			gssapi_get_itokens(iph1, &gsstokens);
    868 		else
    869 			gssapi_get_rtokens(iph1, &gsstokens);
    870 		if (gsstokens == NULL)
    871 			return NULL;
    872 		len += gsstokens->l;
    873 	}
    874 #endif
    875 
    876 	buf = vmalloc(len);
    877 	if (buf == NULL) {
    878 		plog(LLV_ERROR, LOCATION, NULL,
    879 			"failed to get hash buffer\n");
    880 		goto end;
    881 	}
    882 
    883 	p = buf->v;
    884 
    885 	bp = (sw == GENERATE ? iph1->dhpub : iph1->dhpub_p);
    886 	memcpy(p, bp->v, bp->l);
    887 	p += bp->l;
    888 
    889 	bp = (sw == GENERATE ? iph1->dhpub_p : iph1->dhpub);
    890 	memcpy(p, bp->v, bp->l);
    891 	p += bp->l;
    892 
    893 	if (iph1->side == INITIATOR)
    894 		bp2 = (sw == GENERATE ?
    895 		      (char *)&iph1->index.i_ck : (char *)&iph1->index.r_ck);
    896 	else
    897 		bp2 = (sw == GENERATE ?
    898 		      (char *)&iph1->index.r_ck : (char *)&iph1->index.i_ck);
    899 	bl = sizeof(cookie_t);
    900 	memcpy(p, bp2, bl);
    901 	p += bl;
    902 
    903 	if (iph1->side == INITIATOR)
    904 		bp2 = (sw == GENERATE ?
    905 		      (char *)&iph1->index.r_ck : (char *)&iph1->index.i_ck);
    906 	else
    907 		bp2 = (sw == GENERATE ?
    908 		      (char *)&iph1->index.i_ck : (char *)&iph1->index.r_ck);
    909 	bl = sizeof(cookie_t);
    910 	memcpy(p, bp2, bl);
    911 	p += bl;
    912 
    913 	bp = iph1->sa;
    914 	memcpy(p, bp->v, bp->l);
    915 	p += bp->l;
    916 
    917 	bp = (sw == GENERATE ? iph1->id : iph1->id_p);
    918 	memcpy(p, bp->v, bp->l);
    919 	p += bp->l;
    920 
    921 #ifdef HAVE_GSSAPI
    922 	if (AUTHMETHOD(iph1) == OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB) {
    923 		if (iph1->gi_i != NULL && iph1->gi_r != NULL) {
    924 			bp = (sw == GENERATE ? iph1->gi_i : iph1->gi_r);
    925 			memcpy(p, bp->v, bp->l);
    926 			p += bp->l;
    927 		}
    928 		memcpy(p, gsstokens->v, gsstokens->l);
    929 		p += gsstokens->l;
    930 	}
    931 #endif
    932 
    933 	plog(LLV_DEBUG, LOCATION, NULL, "HASH with:\n");
    934 	plogdump(LLV_DEBUG, buf->v, buf->l);
    935 
    936 	/* compute HASH */
    937 	res = oakley_prf(iph1->skeyid, buf, iph1);
    938 	if (res == NULL)
    939 		goto end;
    940 
    941 	error = 0;
    942 
    943 	plog(LLV_DEBUG, LOCATION, NULL, "HASH (%s) computed:\n",
    944 		iph1->side == INITIATOR ? "init" : "resp");
    945 	plogdump(LLV_DEBUG, res->v, res->l);
    946 
    947 end:
    948 	if (buf != NULL)
    949 		vfree(buf);
    950 #ifdef HAVE_GSSAPI
    951 	if (gsstokens != NULL)
    952 		vfree(gsstokens);
    953 #endif
    954 	return res;
    955 }
    956 
    957 /*
    958  * compute HASH_I on base mode.
    959  * base:psk,rsa
    960  *   HASH_I = prf(SKEYID, g^xi | CKY-I | CKY-R | SAi_b | IDii_b)
    961  * base:sig
    962  *   HASH_I = prf(hash(Ni_b | Nr_b), g^xi | CKY-I | CKY-R | SAi_b | IDii_b)
    963  */
    964 vchar_t *
    965 oakley_ph1hash_base_i(iph1, sw)
    966 	struct ph1handle *iph1;
    967 	int sw;
    968 {
    969 	vchar_t *buf = NULL, *res = NULL, *bp;
    970 	vchar_t *hashkey = NULL;
    971 	vchar_t *hash = NULL;	/* for signature mode */
    972 	char *p;
    973 	int len;
    974 	int error = -1;
    975 
    976 	/* sanity check */
    977 	if (iph1->etype != ISAKMP_ETYPE_BASE) {
    978 		plog(LLV_ERROR, LOCATION, NULL,
    979 			"invalid etype for this hash function\n");
    980 		return NULL;
    981 	}
    982 
    983 	switch (AUTHMETHOD(iph1)) {
    984 	case OAKLEY_ATTR_AUTH_METHOD_PSKEY:
    985 	case OAKLEY_ATTR_AUTH_METHOD_RSAENC:
    986 	case OAKLEY_ATTR_AUTH_METHOD_RSAREV:
    987 #ifdef ENABLE_HYBRID
    988 	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_I:
    989 	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_R:
    990 	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_I:
    991 	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_R:
    992 	case FICTIVE_AUTH_METHOD_XAUTH_PSKEY_I:
    993 	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_R:
    994 #endif
    995 		if (iph1->skeyid == NULL) {
    996 			plog(LLV_ERROR, LOCATION, NULL, "no SKEYID found.\n");
    997 			return NULL;
    998 		}
    999 		hashkey = iph1->skeyid;
   1000 		break;
   1001 
   1002 	case OAKLEY_ATTR_AUTH_METHOD_DSSSIG:
   1003 	case OAKLEY_ATTR_AUTH_METHOD_RSASIG:
   1004 #ifdef HAVE_GSSAPI
   1005 	case OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB:
   1006 #endif
   1007 #ifdef ENABLE_HYBRID
   1008 	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_I:
   1009 	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_R:
   1010 	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_I:
   1011 	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_R:
   1012 	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_I:
   1013 	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_R:
   1014 	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_I:
   1015 	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_R:
   1016 #endif
   1017 		/* make hash for seed */
   1018 		len = iph1->nonce->l + iph1->nonce_p->l;
   1019 		buf = vmalloc(len);
   1020 		if (buf == NULL) {
   1021 			plog(LLV_ERROR, LOCATION, NULL,
   1022 				"failed to get hash buffer\n");
   1023 			goto end;
   1024 		}
   1025 		p = buf->v;
   1026 
   1027 		bp = (sw == GENERATE ? iph1->nonce_p : iph1->nonce);
   1028 		memcpy(p, bp->v, bp->l);
   1029 		p += bp->l;
   1030 
   1031 		bp = (sw == GENERATE ? iph1->nonce : iph1->nonce_p);
   1032 		memcpy(p, bp->v, bp->l);
   1033 		p += bp->l;
   1034 
   1035 		hash = oakley_hash(buf, iph1);
   1036 		if (hash == NULL)
   1037 			goto end;
   1038 		vfree(buf);
   1039 		buf = NULL;
   1040 
   1041 		hashkey = hash;
   1042 		break;
   1043 
   1044 	default:
   1045 		plog(LLV_ERROR, LOCATION, NULL,
   1046 			"not supported authentication method %d\n",
   1047 			iph1->approval->authmethod);
   1048 		return NULL;
   1049 
   1050 	}
   1051 
   1052 	len = (sw == GENERATE ? iph1->dhpub->l : iph1->dhpub_p->l)
   1053 		+ sizeof(cookie_t) * 2
   1054 		+ iph1->sa->l
   1055 		+ (sw == GENERATE ? iph1->id->l : iph1->id_p->l);
   1056 	buf = vmalloc(len);
   1057 	if (buf == NULL) {
   1058 		plog(LLV_ERROR, LOCATION, NULL,
   1059 			"failed to get hash buffer\n");
   1060 		goto end;
   1061 	}
   1062 	p = buf->v;
   1063 
   1064 	bp = (sw == GENERATE ? iph1->dhpub : iph1->dhpub_p);
   1065 	memcpy(p, bp->v, bp->l);
   1066 	p += bp->l;
   1067 
   1068 	memcpy(p, &iph1->index.i_ck, sizeof(cookie_t));
   1069 	p += sizeof(cookie_t);
   1070 	memcpy(p, &iph1->index.r_ck, sizeof(cookie_t));
   1071 	p += sizeof(cookie_t);
   1072 
   1073 	memcpy(p, iph1->sa->v, iph1->sa->l);
   1074 	p += iph1->sa->l;
   1075 
   1076 	bp = (sw == GENERATE ? iph1->id : iph1->id_p);
   1077 	memcpy(p, bp->v, bp->l);
   1078 	p += bp->l;
   1079 
   1080 	plog(LLV_DEBUG, LOCATION, NULL, "HASH_I with:\n");
   1081 	plogdump(LLV_DEBUG, buf->v, buf->l);
   1082 
   1083 	/* compute HASH */
   1084 	res = oakley_prf(hashkey, buf, iph1);
   1085 	if (res == NULL)
   1086 		goto end;
   1087 
   1088 	error = 0;
   1089 
   1090 	plog(LLV_DEBUG, LOCATION, NULL, "HASH_I computed:\n");
   1091 	plogdump(LLV_DEBUG, res->v, res->l);
   1092 
   1093 end:
   1094 	if (hash != NULL)
   1095 		vfree(hash);
   1096 	if (buf != NULL)
   1097 		vfree(buf);
   1098 	return res;
   1099 }
   1100 
   1101 /*
   1102  * compute HASH_R on base mode for signature method.
   1103  * base:
   1104  * HASH_R = prf(hash(Ni_b | Nr_b), g^xi | g^xr | CKY-I | CKY-R | SAi_b | IDii_b)
   1105  */
   1106 vchar_t *
   1107 oakley_ph1hash_base_r(iph1, sw)
   1108 	struct ph1handle *iph1;
   1109 	int sw;
   1110 {
   1111 	vchar_t *buf = NULL, *res = NULL, *bp;
   1112 	vchar_t *hash = NULL;
   1113 	char *p;
   1114 	int len;
   1115 	int error = -1;
   1116 
   1117 	/* sanity check */
   1118 	if (iph1->etype != ISAKMP_ETYPE_BASE) {
   1119 		plog(LLV_ERROR, LOCATION, NULL,
   1120 			"invalid etype for this hash function\n");
   1121 		return NULL;
   1122 	}
   1123 
   1124 	switch(AUTHMETHOD(iph1)) {
   1125 	case OAKLEY_ATTR_AUTH_METHOD_DSSSIG:
   1126 	case OAKLEY_ATTR_AUTH_METHOD_RSASIG:
   1127 #ifdef ENABLE_HYBRID
   1128 	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_I:
   1129 	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_R:
   1130 	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_I:
   1131 	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_R:
   1132 	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_I:
   1133 	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_R:
   1134 	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_I:
   1135 	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_R:
   1136 	case FICTIVE_AUTH_METHOD_XAUTH_PSKEY_I:
   1137 #endif
   1138 		break;
   1139 	default:
   1140 		plog(LLV_ERROR, LOCATION, NULL,
   1141 			"not supported authentication method %d\n",
   1142 			iph1->approval->authmethod);
   1143 		return NULL;
   1144 		break;
   1145 	}
   1146 
   1147 	/* make hash for seed */
   1148 	len = iph1->nonce->l + iph1->nonce_p->l;
   1149 	buf = vmalloc(len);
   1150 	if (buf == NULL) {
   1151 		plog(LLV_ERROR, LOCATION, NULL,
   1152 			"failed to get hash buffer\n");
   1153 		goto end;
   1154 	}
   1155 	p = buf->v;
   1156 
   1157 	bp = (sw == GENERATE ? iph1->nonce_p : iph1->nonce);
   1158 	memcpy(p, bp->v, bp->l);
   1159 	p += bp->l;
   1160 
   1161 	bp = (sw == GENERATE ? iph1->nonce : iph1->nonce_p);
   1162 	memcpy(p, bp->v, bp->l);
   1163 	p += bp->l;
   1164 
   1165 	hash = oakley_hash(buf, iph1);
   1166 	if (hash == NULL)
   1167 		goto end;
   1168 	vfree(buf);
   1169 	buf = NULL;
   1170 
   1171 	/* make really hash */
   1172 	len = (sw == GENERATE ? iph1->dhpub_p->l : iph1->dhpub->l)
   1173 		+ (sw == GENERATE ? iph1->dhpub->l : iph1->dhpub_p->l)
   1174 		+ sizeof(cookie_t) * 2
   1175 		+ iph1->sa->l
   1176 		+ (sw == GENERATE ? iph1->id_p->l : iph1->id->l);
   1177 	buf = vmalloc(len);
   1178 	if (buf == NULL) {
   1179 		plog(LLV_ERROR, LOCATION, NULL,
   1180 			"failed to get hash buffer\n");
   1181 		goto end;
   1182 	}
   1183 	p = buf->v;
   1184 
   1185 
   1186 	bp = (sw == GENERATE ? iph1->dhpub_p : iph1->dhpub);
   1187 	memcpy(p, bp->v, bp->l);
   1188 	p += bp->l;
   1189 
   1190 	bp = (sw == GENERATE ? iph1->dhpub : iph1->dhpub_p);
   1191 	memcpy(p, bp->v, bp->l);
   1192 	p += bp->l;
   1193 
   1194 	memcpy(p, &iph1->index.i_ck, sizeof(cookie_t));
   1195 	p += sizeof(cookie_t);
   1196 	memcpy(p, &iph1->index.r_ck, sizeof(cookie_t));
   1197 	p += sizeof(cookie_t);
   1198 
   1199 	memcpy(p, iph1->sa->v, iph1->sa->l);
   1200 	p += iph1->sa->l;
   1201 
   1202 	bp = (sw == GENERATE ? iph1->id_p : iph1->id);
   1203 	memcpy(p, bp->v, bp->l);
   1204 	p += bp->l;
   1205 
   1206 	plog(LLV_DEBUG, LOCATION, NULL, "HASH_R with:\n");
   1207 	plogdump(LLV_DEBUG, buf->v, buf->l);
   1208 
   1209 	/* compute HASH */
   1210 	res = oakley_prf(hash, buf, iph1);
   1211 	if (res == NULL)
   1212 		goto end;
   1213 
   1214 	error = 0;
   1215 
   1216 	plog(LLV_DEBUG, LOCATION, NULL, "HASH_R computed:\n");
   1217 	plogdump(LLV_DEBUG, res->v, res->l);
   1218 
   1219 end:
   1220 	if (buf != NULL)
   1221 		vfree(buf);
   1222 	if (hash)
   1223 		vfree(hash);
   1224 	return res;
   1225 }
   1226 
   1227 /*
   1228  * compute each authentication method in phase 1.
   1229  * OUT:
   1230  *	0:	OK
   1231  *	-1:	error
   1232  *	other:	error to be reply with notification.
   1233  *	        the value is notification type.
   1234  */
   1235 int
   1236 oakley_validate_auth(iph1)
   1237 	struct ph1handle *iph1;
   1238 {
   1239 	vchar_t *my_hash = NULL;
   1240 	int result;
   1241 #ifdef HAVE_GSSAPI
   1242 	vchar_t *gsshash = NULL;
   1243 #endif
   1244 #ifdef ENABLE_STATS
   1245 	struct timeval start, end;
   1246 #endif
   1247 
   1248 #ifdef ENABLE_STATS
   1249 	gettimeofday(&start, NULL);
   1250 #endif
   1251 
   1252 	switch (AUTHMETHOD(iph1)) {
   1253 	case OAKLEY_ATTR_AUTH_METHOD_PSKEY:
   1254 #ifdef ENABLE_HYBRID
   1255 	case FICTIVE_AUTH_METHOD_XAUTH_PSKEY_I:
   1256 	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_R:
   1257 #endif
   1258 		/* validate HASH */
   1259 	    {
   1260 		char *r_hash;
   1261 
   1262 		if (iph1->id_p == NULL || iph1->pl_hash == NULL) {
   1263 			plog(LLV_ERROR, LOCATION, iph1->remote,
   1264 				"few isakmp message received.\n");
   1265 			return ISAKMP_NTYPE_PAYLOAD_MALFORMED;
   1266 		}
   1267 #ifdef ENABLE_HYBRID
   1268 		if (AUTHMETHOD(iph1) == FICTIVE_AUTH_METHOD_XAUTH_PSKEY_I &&
   1269 		    ((iph1->mode_cfg->flags & ISAKMP_CFG_VENDORID_XAUTH) == 0))
   1270 		{
   1271 			plog(LLV_ERROR, LOCATION, NULL, "No SIG was passed, "
   1272 			    "hybrid auth is enabled, "
   1273 			    "but peer is no Xauth compliant\n");
   1274 			return ISAKMP_NTYPE_SITUATION_NOT_SUPPORTED;
   1275 			break;
   1276 		}
   1277 #endif
   1278 		r_hash = (caddr_t)(iph1->pl_hash + 1);
   1279 
   1280 		plog(LLV_DEBUG, LOCATION, NULL, "HASH received:\n");
   1281 		plogdump(LLV_DEBUG, r_hash,
   1282 			ntohs(iph1->pl_hash->h.len) - sizeof(*iph1->pl_hash));
   1283 
   1284 		switch (iph1->etype) {
   1285 		case ISAKMP_ETYPE_IDENT:
   1286 		case ISAKMP_ETYPE_AGG:
   1287 			my_hash = oakley_ph1hash_common(iph1, VALIDATE);
   1288 			break;
   1289 		case ISAKMP_ETYPE_BASE:
   1290 			if (iph1->side == INITIATOR)
   1291 				my_hash = oakley_ph1hash_common(iph1, VALIDATE);
   1292 			else
   1293 				my_hash = oakley_ph1hash_base_i(iph1, VALIDATE);
   1294 			break;
   1295 		default:
   1296 			plog(LLV_ERROR, LOCATION, NULL,
   1297 				"invalid etype %d\n", iph1->etype);
   1298 			return ISAKMP_NTYPE_INVALID_EXCHANGE_TYPE;
   1299 		}
   1300 		if (my_hash == NULL)
   1301 			return ISAKMP_INTERNAL_ERROR;
   1302 
   1303 		result = memcmp(my_hash->v, r_hash, my_hash->l);
   1304 		vfree(my_hash);
   1305 
   1306 		if (result) {
   1307 			plog(LLV_ERROR, LOCATION, NULL, "HASH mismatched\n");
   1308 			return ISAKMP_NTYPE_INVALID_HASH_INFORMATION;
   1309 		}
   1310 
   1311 		plog(LLV_DEBUG, LOCATION, NULL, "HASH for PSK validated.\n");
   1312 	    }
   1313 		break;
   1314 	case OAKLEY_ATTR_AUTH_METHOD_DSSSIG:
   1315 	case OAKLEY_ATTR_AUTH_METHOD_RSASIG:
   1316 #ifdef ENABLE_HYBRID
   1317 	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_I:
   1318 	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_I:
   1319 	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_I:
   1320 	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_R:
   1321 	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_I:
   1322 	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_R:
   1323 #endif
   1324 	    {
   1325 		int error = 0;
   1326 		int certtype = 0;
   1327 
   1328 		/* validation */
   1329 		if (iph1->id_p == NULL) {
   1330 			plog(LLV_ERROR, LOCATION, iph1->remote,
   1331 				"no ID payload was passed.\n");
   1332 			return ISAKMP_NTYPE_PAYLOAD_MALFORMED;
   1333 		}
   1334 		if (iph1->sig_p == NULL) {
   1335 			plog(LLV_ERROR, LOCATION, iph1->remote,
   1336 				"no SIG payload was passed.\n");
   1337 			return ISAKMP_NTYPE_PAYLOAD_MALFORMED;
   1338 		}
   1339 
   1340 		plog(LLV_DEBUG, LOCATION, NULL, "SIGN passed:\n");
   1341 		plogdump(LLV_DEBUG, iph1->sig_p->v, iph1->sig_p->l);
   1342 
   1343 		/* get peer's cert */
   1344 		switch (iph1->rmconf->getcert_method) {
   1345 		case ISAKMP_GETCERT_PAYLOAD:
   1346 			if (iph1->cert_p == NULL) {
   1347 				plog(LLV_ERROR, LOCATION, NULL,
   1348 					"no peer's CERT payload found.\n");
   1349 				return ISAKMP_INTERNAL_ERROR;
   1350 			}
   1351 			break;
   1352 		case ISAKMP_GETCERT_LOCALFILE:
   1353 			switch (iph1->rmconf->certtype) {
   1354 				case ISAKMP_CERT_X509SIGN:
   1355 					if (iph1->rmconf->peerscertfile == NULL) {
   1356 						plog(LLV_ERROR, LOCATION, NULL,
   1357 							"no peer's CERT file found.\n");
   1358 						return ISAKMP_INTERNAL_ERROR;
   1359 					}
   1360 
   1361 					/* don't use cached cert */
   1362 					if (iph1->cert_p != NULL) {
   1363 						oakley_delcert(iph1->cert_p);
   1364 						iph1->cert_p = NULL;
   1365 					}
   1366 
   1367 					error = get_cert_fromlocal(iph1, 0);
   1368 #ifdef ANDROID_PATCHED
   1369 					if (!error)
   1370 						break;
   1371 				default:
   1372 					return ISAKMP_INTERNAL_ERROR;
   1373 #else
   1374 					break;
   1375 
   1376 				case ISAKMP_CERT_PLAINRSA:
   1377 					error = get_plainrsa_fromlocal(iph1, 0);
   1378 					break;
   1379 			}
   1380 			if (error)
   1381 				return ISAKMP_INTERNAL_ERROR;
   1382 			break;
   1383 		case ISAKMP_GETCERT_DNS:
   1384 			if (iph1->rmconf->peerscertfile != NULL) {
   1385 				plog(LLV_ERROR, LOCATION, NULL,
   1386 					"why peer's CERT file is defined "
   1387 					"though getcert method is dns ?\n");
   1388 				return ISAKMP_INTERNAL_ERROR;
   1389 			}
   1390 
   1391 			/* don't use cached cert */
   1392 			if (iph1->cert_p != NULL) {
   1393 				oakley_delcert(iph1->cert_p);
   1394 				iph1->cert_p = NULL;
   1395 			}
   1396 
   1397 			iph1->cert_p = dnssec_getcert(iph1->id_p);
   1398 			if (iph1->cert_p == NULL) {
   1399 				plog(LLV_ERROR, LOCATION, NULL,
   1400 					"no CERT RR found.\n");
   1401 				return ISAKMP_INTERNAL_ERROR;
   1402 #endif
   1403 			}
   1404 			break;
   1405 		default:
   1406 			plog(LLV_ERROR, LOCATION, NULL,
   1407 				"invalid getcert_mothod: %d\n",
   1408 				iph1->rmconf->getcert_method);
   1409 			return ISAKMP_INTERNAL_ERROR;
   1410 		}
   1411 
   1412 		/* compare ID payload and certificate name */
   1413 		if (iph1->rmconf->verify_cert &&
   1414 		    (error = oakley_check_certid(iph1)) != 0)
   1415 			return error;
   1416 
   1417 		/* verify certificate */
   1418 		if (iph1->rmconf->verify_cert
   1419 		 && iph1->rmconf->getcert_method == ISAKMP_GETCERT_PAYLOAD) {
   1420 			certtype = iph1->rmconf->certtype;
   1421 #ifdef ENABLE_HYBRID
   1422 			switch (AUTHMETHOD(iph1)) {
   1423 			case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_I:
   1424 			case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_I:
   1425 				certtype = iph1->cert_p->type;
   1426 				break;
   1427 			default:
   1428 				break;
   1429 			}
   1430 #endif
   1431 			switch (certtype) {
   1432 			case ISAKMP_CERT_X509SIGN: {
   1433 				char path[MAXPATHLEN];
   1434 				char *ca;
   1435 
   1436 				if (iph1->rmconf->cacertfile != NULL) {
   1437 					getpathname(path, sizeof(path),
   1438 					    LC_PATHTYPE_CERT,
   1439 					    iph1->rmconf->cacertfile);
   1440 					ca = path;
   1441 				} else {
   1442 					ca = NULL;
   1443 				}
   1444 
   1445 				error = eay_check_x509cert(&iph1->cert_p->cert,
   1446 					lcconf->pathinfo[LC_PATHTYPE_CERT],
   1447 					ca, 0);
   1448 				break;
   1449 			}
   1450 
   1451 			default:
   1452 				plog(LLV_ERROR, LOCATION, NULL,
   1453 					"no supported certtype %d\n", certtype);
   1454 				return ISAKMP_INTERNAL_ERROR;
   1455 			}
   1456 			if (error != 0) {
   1457 				plog(LLV_ERROR, LOCATION, NULL,
   1458 					"the peer's certificate is not verified.\n");
   1459 				return ISAKMP_NTYPE_INVALID_CERT_AUTHORITY;
   1460 			}
   1461 		}
   1462 
   1463 		/* Generate a warning if verify_cert == 0
   1464 		 */
   1465 		if (iph1->rmconf->verify_cert){
   1466 			plog(LLV_DEBUG, LOCATION, NULL, "CERT validated\n");
   1467 		}else{
   1468 			plog(LLV_WARNING, LOCATION, NULL,
   1469 				"CERT validation disabled by configuration\n");
   1470 		}
   1471 
   1472 		/* compute hash */
   1473 		switch (iph1->etype) {
   1474 		case ISAKMP_ETYPE_IDENT:
   1475 		case ISAKMP_ETYPE_AGG:
   1476 			my_hash = oakley_ph1hash_common(iph1, VALIDATE);
   1477 			break;
   1478 		case ISAKMP_ETYPE_BASE:
   1479 			if (iph1->side == INITIATOR)
   1480 				my_hash = oakley_ph1hash_base_r(iph1, VALIDATE);
   1481 			else
   1482 				my_hash = oakley_ph1hash_base_i(iph1, VALIDATE);
   1483 			break;
   1484 		default:
   1485 			plog(LLV_ERROR, LOCATION, NULL,
   1486 				"invalid etype %d\n", iph1->etype);
   1487 			return ISAKMP_NTYPE_INVALID_EXCHANGE_TYPE;
   1488 		}
   1489 		if (my_hash == NULL)
   1490 			return ISAKMP_INTERNAL_ERROR;
   1491 
   1492 
   1493 		certtype = iph1->rmconf->certtype;
   1494 #ifdef ENABLE_HYBRID
   1495 		switch (AUTHMETHOD(iph1)) {
   1496 		case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_I:
   1497 		case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_I:
   1498 			certtype = iph1->cert_p->type;
   1499 			break;
   1500 		default:
   1501 			break;
   1502 		}
   1503 #endif
   1504 		/* check signature */
   1505 		switch (certtype) {
   1506 		case ISAKMP_CERT_X509SIGN:
   1507 		case ISAKMP_CERT_DNS:
   1508 			error = eay_check_x509sign(my_hash,
   1509 					iph1->sig_p,
   1510 					&iph1->cert_p->cert);
   1511 			break;
   1512 #ifndef ANDROID_PATCHED
   1513 		case ISAKMP_CERT_PLAINRSA:
   1514 			iph1->rsa_p = rsa_try_check_rsasign(my_hash,
   1515 					iph1->sig_p, iph1->rsa_candidates);
   1516 			error = iph1->rsa_p ? 0 : -1;
   1517 
   1518 			break;
   1519 #endif
   1520 		default:
   1521 			plog(LLV_ERROR, LOCATION, NULL,
   1522 				"no supported certtype %d\n",
   1523 				certtype);
   1524 			vfree(my_hash);
   1525 			return ISAKMP_INTERNAL_ERROR;
   1526 		}
   1527 
   1528 		vfree(my_hash);
   1529 		if (error != 0) {
   1530 			plog(LLV_ERROR, LOCATION, NULL,
   1531 				"Invalid SIG.\n");
   1532 			return ISAKMP_NTYPE_INVALID_SIGNATURE;
   1533 		}
   1534 		plog(LLV_DEBUG, LOCATION, NULL, "SIG authenticated\n");
   1535 	    }
   1536 		break;
   1537 #ifdef ENABLE_HYBRID
   1538 	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_R:
   1539 	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_R:
   1540 	    {
   1541 		if ((iph1->mode_cfg->flags & ISAKMP_CFG_VENDORID_XAUTH) == 0) {
   1542 			plog(LLV_ERROR, LOCATION, NULL, "No SIG was passed, "
   1543 			    "hybrid auth is enabled, "
   1544 			    "but peer is no Xauth compliant\n");
   1545 			return ISAKMP_NTYPE_SITUATION_NOT_SUPPORTED;
   1546 			break;
   1547 		}
   1548 		plog(LLV_INFO, LOCATION, NULL, "No SIG was passed, "
   1549 		    "but hybrid auth is enabled\n");
   1550 
   1551 		return 0;
   1552 		break;
   1553 	    }
   1554 #endif
   1555 #ifdef HAVE_GSSAPI
   1556 	case OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB:
   1557 		/* check if we're not into XAUTH_PSKEY_I instead */
   1558 #ifdef ENABLE_HYBRID
   1559 		if (iph1->rmconf->xauth)
   1560 			break;
   1561 #endif
   1562 		switch (iph1->etype) {
   1563 		case ISAKMP_ETYPE_IDENT:
   1564 		case ISAKMP_ETYPE_AGG:
   1565 			my_hash = oakley_ph1hash_common(iph1, VALIDATE);
   1566 			break;
   1567 		default:
   1568 			plog(LLV_ERROR, LOCATION, NULL,
   1569 				"invalid etype %d\n", iph1->etype);
   1570 			return ISAKMP_NTYPE_INVALID_EXCHANGE_TYPE;
   1571 		}
   1572 
   1573 		if (my_hash == NULL) {
   1574 			if (gssapi_more_tokens(iph1))
   1575 				return ISAKMP_NTYPE_INVALID_EXCHANGE_TYPE;
   1576 			else
   1577 				return ISAKMP_NTYPE_INVALID_HASH_INFORMATION;
   1578 		}
   1579 
   1580 		gsshash = gssapi_unwraphash(iph1);
   1581 		if (gsshash == NULL) {
   1582 			vfree(my_hash);
   1583 			return ISAKMP_NTYPE_INVALID_HASH_INFORMATION;
   1584 		}
   1585 
   1586 		result = memcmp(my_hash->v, gsshash->v, my_hash->l);
   1587 		vfree(my_hash);
   1588 		vfree(gsshash);
   1589 
   1590 		if (result) {
   1591 			plog(LLV_ERROR, LOCATION, NULL, "HASH mismatched\n");
   1592 			return ISAKMP_NTYPE_INVALID_HASH_INFORMATION;
   1593 		}
   1594 		plog(LLV_DEBUG, LOCATION, NULL, "hash compared OK\n");
   1595 		break;
   1596 #endif
   1597 	case OAKLEY_ATTR_AUTH_METHOD_RSAENC:
   1598 	case OAKLEY_ATTR_AUTH_METHOD_RSAREV:
   1599 #ifdef ENABLE_HYBRID
   1600 	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_I:
   1601 	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_R:
   1602 	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_I:
   1603 	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_R:
   1604 #endif
   1605 		if (iph1->id_p == NULL || iph1->pl_hash == NULL) {
   1606 			plog(LLV_ERROR, LOCATION, iph1->remote,
   1607 				"few isakmp message received.\n");
   1608 			return ISAKMP_NTYPE_PAYLOAD_MALFORMED;
   1609 		}
   1610 		plog(LLV_ERROR, LOCATION, iph1->remote,
   1611 			"not supported authmethod type %s\n",
   1612 			s_oakley_attr_method(iph1->approval->authmethod));
   1613 		return ISAKMP_INTERNAL_ERROR;
   1614 	default:
   1615 		plog(LLV_ERROR, LOCATION, iph1->remote,
   1616 			"invalid authmethod %d why ?\n",
   1617 			iph1->approval->authmethod);
   1618 		return ISAKMP_INTERNAL_ERROR;
   1619 	}
   1620 #ifdef ENABLE_STATS
   1621 	gettimeofday(&end, NULL);
   1622 	syslog(LOG_NOTICE, "%s(%s): %8.6f", __func__,
   1623 		s_oakley_attr_method(iph1->approval->authmethod),
   1624 		timedelta(&start, &end));
   1625 #endif
   1626 
   1627 	return 0;
   1628 }
   1629 
   1630 /* get my certificate
   1631  * NOTE: include certificate type.
   1632  */
   1633 int
   1634 oakley_getmycert(iph1)
   1635 	struct ph1handle *iph1;
   1636 {
   1637 	switch (iph1->rmconf->certtype) {
   1638 		case ISAKMP_CERT_X509SIGN:
   1639 			if (iph1->cert)
   1640 				return 0;
   1641 			return get_cert_fromlocal(iph1, 1);
   1642 
   1643 #ifndef ANDROID_PATCHED
   1644 		case ISAKMP_CERT_PLAINRSA:
   1645 			if (iph1->rsa)
   1646 				return 0;
   1647 			return get_plainrsa_fromlocal(iph1, 1);
   1648 #endif
   1649 
   1650 		default:
   1651 			plog(LLV_ERROR, LOCATION, NULL,
   1652 			     "Unknown certtype #%d\n",
   1653 			     iph1->rmconf->certtype);
   1654 			return -1;
   1655 	}
   1656 
   1657 }
   1658 
   1659 /*
   1660  * get a CERT from local file.
   1661  * IN:
   1662  *	my != 0 my cert.
   1663  *	my == 0 peer's cert.
   1664  */
   1665 static int
   1666 get_cert_fromlocal(iph1, my)
   1667 	struct ph1handle *iph1;
   1668 	int my;
   1669 {
   1670 	char path[MAXPATHLEN];
   1671 	vchar_t *cert = NULL;
   1672 	cert_t **certpl;
   1673 	char *certfile;
   1674 	int error = -1;
   1675 
   1676 	if (my) {
   1677 		certfile = iph1->rmconf->mycertfile;
   1678 		certpl = &iph1->cert;
   1679 	} else {
   1680 		certfile = iph1->rmconf->peerscertfile;
   1681 		certpl = &iph1->cert_p;
   1682 	}
   1683 	if (!certfile) {
   1684 		plog(LLV_ERROR, LOCATION, NULL, "no CERT defined.\n");
   1685 		return 0;
   1686 	}
   1687 
   1688 	switch (iph1->rmconf->certtype) {
   1689 	case ISAKMP_CERT_X509SIGN:
   1690 	case ISAKMP_CERT_DNS:
   1691 		/* make public file name */
   1692 		getpathname(path, sizeof(path), LC_PATHTYPE_CERT, certfile);
   1693 		cert = eay_get_x509cert(path);
   1694 		if (cert) {
   1695 			char *p = NULL;
   1696 			p = eay_get_x509text(cert);
   1697 			plog(LLV_DEBUG, LOCATION, NULL, "%s", p ? p : "\n");
   1698 			racoon_free(p);
   1699 		};
   1700 		break;
   1701 
   1702 	default:
   1703 		plog(LLV_ERROR, LOCATION, NULL,
   1704 			"not supported certtype %d\n",
   1705 			iph1->rmconf->certtype);
   1706 		goto end;
   1707 	}
   1708 
   1709 	if (!cert) {
   1710 		plog(LLV_ERROR, LOCATION, NULL,
   1711 			"failed to get %s CERT.\n",
   1712 			my ? "my" : "peers");
   1713 		goto end;
   1714 	}
   1715 
   1716 	*certpl = oakley_newcert();
   1717 	if (!*certpl) {
   1718 		plog(LLV_ERROR, LOCATION, NULL,
   1719 			"failed to get cert buffer.\n");
   1720 		goto end;
   1721 	}
   1722 	(*certpl)->pl = vmalloc(cert->l + 1);
   1723 	if ((*certpl)->pl == NULL) {
   1724 		plog(LLV_ERROR, LOCATION, NULL,
   1725 			"failed to get cert buffer\n");
   1726 		oakley_delcert(*certpl);
   1727 		*certpl = NULL;
   1728 		goto end;
   1729 	}
   1730 	memcpy((*certpl)->pl->v + 1, cert->v, cert->l);
   1731 	(*certpl)->pl->v[0] = iph1->rmconf->certtype;
   1732 	(*certpl)->type = iph1->rmconf->certtype;
   1733 	(*certpl)->cert.v = (*certpl)->pl->v + 1;
   1734 	(*certpl)->cert.l = (*certpl)->pl->l - 1;
   1735 
   1736 	plog(LLV_DEBUG, LOCATION, NULL, "created CERT payload:\n");
   1737 	plogdump(LLV_DEBUG, (*certpl)->pl->v, (*certpl)->pl->l);
   1738 
   1739 	error = 0;
   1740 
   1741 end:
   1742 	if (cert != NULL)
   1743 		vfree(cert);
   1744 
   1745 	return error;
   1746 }
   1747 
   1748 #ifndef ANDROID_PATCHED
   1749 static int
   1750 get_plainrsa_fromlocal(iph1, my)
   1751 	struct ph1handle *iph1;
   1752 	int my;
   1753 {
   1754 	char path[MAXPATHLEN];
   1755 	vchar_t *cert = NULL;
   1756 	char *certfile;
   1757 	int error = -1;
   1758 
   1759 	iph1->rsa_candidates = rsa_lookup_keys(iph1, my);
   1760 	if (!iph1->rsa_candidates ||
   1761 	    rsa_list_count(iph1->rsa_candidates) == 0) {
   1762 		plog(LLV_ERROR, LOCATION, NULL,
   1763 			"%s RSA key not found for %s\n",
   1764 			my ? "Private" : "Public",
   1765 			saddr2str_fromto("%s <-> %s",
   1766 			iph1->local, iph1->remote));
   1767 		goto end;
   1768 	}
   1769 
   1770 	if (my && rsa_list_count(iph1->rsa_candidates) > 1) {
   1771 		plog(LLV_WARNING, LOCATION, NULL,
   1772 			"More than one (=%lu) private "
   1773 			"PlainRSA key found for %s\n",
   1774 			rsa_list_count(iph1->rsa_candidates),
   1775 			saddr2str_fromto("%s <-> %s",
   1776 			iph1->local, iph1->remote));
   1777 		plog(LLV_WARNING, LOCATION, NULL,
   1778 			"This may have unpredictable results, "
   1779 			"i.e. wrong key could be used!\n");
   1780 		plog(LLV_WARNING, LOCATION, NULL,
   1781 			"Consider using only one single private "
   1782 			"key for all peers...\n");
   1783 	}
   1784 	if (my) {
   1785 		iph1->rsa = ((struct rsa_key *)
   1786 		    genlist_next(iph1->rsa_candidates, NULL))->rsa;
   1787 
   1788 		genlist_free(iph1->rsa_candidates, NULL);
   1789 		iph1->rsa_candidates = NULL;
   1790 
   1791 		if (iph1->rsa == NULL)
   1792 			goto end;
   1793 	}
   1794 
   1795 	error = 0;
   1796 
   1797 end:
   1798 	return error;
   1799 }
   1800 #endif
   1801 
   1802 /* get signature */
   1803 int
   1804 oakley_getsign(iph1)
   1805 	struct ph1handle *iph1;
   1806 {
   1807 	char path[MAXPATHLEN];
   1808 	vchar_t *privkey = NULL;
   1809 	int error = -1;
   1810 
   1811 	switch (iph1->rmconf->certtype) {
   1812 	case ISAKMP_CERT_X509SIGN:
   1813 	case ISAKMP_CERT_DNS:
   1814 		if (iph1->rmconf->myprivfile == NULL) {
   1815 			plog(LLV_ERROR, LOCATION, NULL, "no cert defined.\n");
   1816 			goto end;
   1817 		}
   1818 
   1819 		/* make private file name */
   1820 		getpathname(path, sizeof(path),
   1821 			LC_PATHTYPE_CERT,
   1822 			iph1->rmconf->myprivfile);
   1823 		privkey = privsep_eay_get_pkcs1privkey(path);
   1824 		if (privkey == NULL) {
   1825 			plog(LLV_ERROR, LOCATION, NULL,
   1826 				"failed to get private key.\n");
   1827 			goto end;
   1828 		}
   1829 		plog(LLV_DEBUG2, LOCATION, NULL, "private key:\n");
   1830 		plogdump(LLV_DEBUG2, privkey->v, privkey->l);
   1831 
   1832 		iph1->sig = eay_get_x509sign(iph1->hash, privkey);
   1833 		break;
   1834 #ifndef ANDROID_PATCHED
   1835 	case ISAKMP_CERT_PLAINRSA:
   1836 		iph1->sig = eay_get_rsasign(iph1->hash, iph1->rsa);
   1837 		break;
   1838 #endif
   1839 	default:
   1840 		plog(LLV_ERROR, LOCATION, NULL,
   1841 		     "Unknown certtype #%d\n",
   1842 		     iph1->rmconf->certtype);
   1843 		goto end;
   1844 	}
   1845 
   1846 	if (iph1->sig == NULL) {
   1847 		plog(LLV_ERROR, LOCATION, NULL, "failed to sign.\n");
   1848 		goto end;
   1849 	}
   1850 
   1851 	plog(LLV_DEBUG, LOCATION, NULL, "SIGN computed:\n");
   1852 	plogdump(LLV_DEBUG, iph1->sig->v, iph1->sig->l);
   1853 
   1854 	error = 0;
   1855 
   1856 end:
   1857 	if (privkey != NULL)
   1858 		vfree(privkey);
   1859 
   1860 	return error;
   1861 }
   1862 
   1863 /*
   1864  * compare certificate name and ID value.
   1865  */
   1866 static int
   1867 oakley_check_certid(iph1)
   1868 	struct ph1handle *iph1;
   1869 {
   1870 	struct ipsecdoi_id_b *id_b;
   1871 	vchar_t *name = NULL;
   1872 	char *altname = NULL;
   1873 	int idlen, type;
   1874 	int error;
   1875 
   1876 	if (iph1->id_p == NULL || iph1->cert_p == NULL) {
   1877 		plog(LLV_ERROR, LOCATION, NULL, "no ID nor CERT found.\n");
   1878 		return ISAKMP_NTYPE_INVALID_ID_INFORMATION;
   1879 	}
   1880 
   1881 	id_b = (struct ipsecdoi_id_b *)iph1->id_p->v;
   1882 	idlen = iph1->id_p->l - sizeof(*id_b);
   1883 
   1884 	switch (id_b->type) {
   1885 	case IPSECDOI_ID_DER_ASN1_DN:
   1886 		name = eay_get_x509asn1subjectname(&iph1->cert_p->cert);
   1887 		if (!name) {
   1888 			plog(LLV_ERROR, LOCATION, NULL,
   1889 				"failed to get subjectName\n");
   1890 			return ISAKMP_NTYPE_INVALID_CERTIFICATE;
   1891 		}
   1892 		if (idlen != name->l) {
   1893 			plog(LLV_ERROR, LOCATION, NULL,
   1894 				"Invalid ID length in phase 1.\n");
   1895 			vfree(name);
   1896 			return ISAKMP_NTYPE_INVALID_ID_INFORMATION;
   1897 		}
   1898 		error = memcmp(id_b + 1, name->v, idlen);
   1899 		vfree(name);
   1900 		if (error != 0) {
   1901 			plog(LLV_ERROR, LOCATION, NULL,
   1902 				"ID mismatched with ASN1 SubjectName.\n");
   1903 			plogdump(LLV_DEBUG, id_b + 1, idlen);
   1904 			plogdump(LLV_DEBUG, name->v, idlen);
   1905 			return ISAKMP_NTYPE_INVALID_ID_INFORMATION;
   1906 		}
   1907 		return 0;
   1908 	case IPSECDOI_ID_IPV4_ADDR:
   1909 	case IPSECDOI_ID_IPV6_ADDR:
   1910 	{
   1911 		/*
   1912 		 * converting to binary from string because openssl return
   1913 		 * a string even if object is a binary.
   1914 		 * XXX fix it !  access by ASN.1 directly without.
   1915 		 */
   1916 		struct addrinfo hints, *res;
   1917 		caddr_t a = NULL;
   1918 		int pos;
   1919 
   1920 		for (pos = 1; ; pos++) {
   1921 			if (eay_get_x509subjectaltname(&iph1->cert_p->cert,
   1922 					&altname, &type, pos) !=0) {
   1923 				plog(LLV_ERROR, LOCATION, NULL,
   1924 					"failed to get subjectAltName\n");
   1925 				return ISAKMP_NTYPE_INVALID_CERTIFICATE;
   1926 			}
   1927 
   1928 			/* it's the end condition of the loop. */
   1929 			if (!altname) {
   1930 				plog(LLV_ERROR, LOCATION, NULL,
   1931 					"no proper subjectAltName.\n");
   1932 				return ISAKMP_NTYPE_INVALID_CERTIFICATE;
   1933 			}
   1934 
   1935 			if (check_typeofcertname(id_b->type, type) == 0)
   1936 				break;
   1937 
   1938 			/* next name */
   1939 			racoon_free(altname);
   1940 			altname = NULL;
   1941 		}
   1942 		memset(&hints, 0, sizeof(hints));
   1943 		hints.ai_family = PF_UNSPEC;
   1944 		hints.ai_socktype = SOCK_RAW;
   1945 		hints.ai_flags = AI_NUMERICHOST;
   1946 		error = getaddrinfo(altname, NULL, &hints, &res);
   1947 		if (error != 0) {
   1948 			plog(LLV_ERROR, LOCATION, NULL,
   1949 				"no proper subjectAltName.\n");
   1950 			racoon_free(altname);
   1951 			return ISAKMP_NTYPE_INVALID_CERTIFICATE;
   1952 		}
   1953 		switch (res->ai_family) {
   1954 		case AF_INET:
   1955 			a = (caddr_t)&((struct sockaddr_in *)res->ai_addr)->sin_addr.s_addr;
   1956 			break;
   1957 #ifdef INET6
   1958 		case AF_INET6:
   1959 			a = (caddr_t)&((struct sockaddr_in6 *)res->ai_addr)->sin6_addr.s6_addr;
   1960 			break;
   1961 #endif
   1962 		default:
   1963 			plog(LLV_ERROR, LOCATION, NULL,
   1964 				"family not supported: %d.\n", res->ai_family);
   1965 			racoon_free(altname);
   1966 			freeaddrinfo(res);
   1967 			return ISAKMP_NTYPE_INVALID_CERTIFICATE;
   1968 		}
   1969 		error = memcmp(id_b + 1, a, idlen);
   1970 		freeaddrinfo(res);
   1971 		vfree(name);
   1972 		if (error != 0) {
   1973 			plog(LLV_ERROR, LOCATION, NULL,
   1974 				"ID mismatched with subjectAltName.\n");
   1975 			plogdump(LLV_DEBUG, id_b + 1, idlen);
   1976 			plogdump(LLV_DEBUG, a, idlen);
   1977 			return ISAKMP_NTYPE_INVALID_ID_INFORMATION;
   1978 		}
   1979 		return 0;
   1980 	}
   1981 	case IPSECDOI_ID_FQDN:
   1982 	case IPSECDOI_ID_USER_FQDN:
   1983 	{
   1984 		int pos;
   1985 
   1986 		for (pos = 1; ; pos++) {
   1987 			if (eay_get_x509subjectaltname(&iph1->cert_p->cert,
   1988 					&altname, &type, pos) != 0){
   1989 				plog(LLV_ERROR, LOCATION, NULL,
   1990 					"failed to get subjectAltName\n");
   1991 				return ISAKMP_NTYPE_INVALID_CERTIFICATE;
   1992 			}
   1993 
   1994 			/* it's the end condition of the loop. */
   1995 			if (!altname) {
   1996 				plog(LLV_ERROR, LOCATION, NULL,
   1997 					"no proper subjectAltName.\n");
   1998 				return ISAKMP_NTYPE_INVALID_CERTIFICATE;
   1999 			}
   2000 
   2001 			if (check_typeofcertname(id_b->type, type) == 0)
   2002 				break;
   2003 
   2004 			/* next name */
   2005 			racoon_free(altname);
   2006 			altname = NULL;
   2007 		}
   2008 		if (idlen != strlen(altname)) {
   2009 			plog(LLV_ERROR, LOCATION, NULL,
   2010 				"Invalid ID length in phase 1.\n");
   2011 			racoon_free(altname);
   2012 			return ISAKMP_NTYPE_INVALID_ID_INFORMATION;
   2013 		}
   2014 		if (check_typeofcertname(id_b->type, type) != 0) {
   2015 			plog(LLV_ERROR, LOCATION, NULL,
   2016 				"ID type mismatched. ID: %s CERT: %s.\n",
   2017 				s_ipsecdoi_ident(id_b->type),
   2018 				s_ipsecdoi_ident(type));
   2019 			racoon_free(altname);
   2020 			return ISAKMP_NTYPE_INVALID_ID_INFORMATION;
   2021 		}
   2022 		error = memcmp(id_b + 1, altname, idlen);
   2023 		if (error) {
   2024 			plog(LLV_ERROR, LOCATION, NULL, "ID mismatched.\n");
   2025 			plogdump(LLV_DEBUG, id_b + 1, idlen);
   2026 			plogdump(LLV_DEBUG, altname, idlen);
   2027 			racoon_free(altname);
   2028 			return ISAKMP_NTYPE_INVALID_ID_INFORMATION;
   2029 		}
   2030 		racoon_free(altname);
   2031 		return 0;
   2032 	}
   2033 	default:
   2034 		plog(LLV_ERROR, LOCATION, NULL,
   2035 			"Inpropper ID type passed: %s.\n",
   2036 			s_ipsecdoi_ident(id_b->type));
   2037 		return ISAKMP_NTYPE_INVALID_ID_INFORMATION;
   2038 	}
   2039 	/*NOTREACHED*/
   2040 }
   2041 
   2042 static int
   2043 check_typeofcertname(doi, genid)
   2044 	int doi, genid;
   2045 {
   2046 	switch (doi) {
   2047 	case IPSECDOI_ID_IPV4_ADDR:
   2048 	case IPSECDOI_ID_IPV4_ADDR_SUBNET:
   2049 	case IPSECDOI_ID_IPV6_ADDR:
   2050 	case IPSECDOI_ID_IPV6_ADDR_SUBNET:
   2051 	case IPSECDOI_ID_IPV4_ADDR_RANGE:
   2052 	case IPSECDOI_ID_IPV6_ADDR_RANGE:
   2053 		if (genid != GENT_IPADD)
   2054 			return -1;
   2055 		return 0;
   2056 	case IPSECDOI_ID_FQDN:
   2057 		if (genid != GENT_DNS)
   2058 			return -1;
   2059 		return 0;
   2060 	case IPSECDOI_ID_USER_FQDN:
   2061 		if (genid != GENT_EMAIL)
   2062 			return -1;
   2063 		return 0;
   2064 	case IPSECDOI_ID_DER_ASN1_DN: /* should not be passed to this function*/
   2065 	case IPSECDOI_ID_DER_ASN1_GN:
   2066 	case IPSECDOI_ID_KEY_ID:
   2067 	default:
   2068 		return -1;
   2069 	}
   2070 	/*NOTREACHED*/
   2071 }
   2072 
   2073 /*
   2074  * save certificate including certificate type.
   2075  */
   2076 int
   2077 oakley_savecert(iph1, gen)
   2078 	struct ph1handle *iph1;
   2079 	struct isakmp_gen *gen;
   2080 {
   2081 	cert_t **c;
   2082 	u_int8_t type;
   2083 	STACK_OF(X509) *certs=NULL;
   2084 	PKCS7 *p7;
   2085 
   2086 	type = *(u_int8_t *)(gen + 1) & 0xff;
   2087 
   2088 	switch (type) {
   2089 	case ISAKMP_CERT_DNS:
   2090 		plog(LLV_WARNING, LOCATION, NULL,
   2091 			"CERT payload is unnecessary in DNSSEC. "
   2092 			"ignore this CERT payload.\n");
   2093 		return 0;
   2094 	case ISAKMP_CERT_PKCS7:
   2095 	case ISAKMP_CERT_PGP:
   2096 	case ISAKMP_CERT_X509SIGN:
   2097 	case ISAKMP_CERT_KERBEROS:
   2098 	case ISAKMP_CERT_SPKI:
   2099 		c = &iph1->cert_p;
   2100 		break;
   2101 	case ISAKMP_CERT_CRL:
   2102 		c = &iph1->crl_p;
   2103 		break;
   2104 	case ISAKMP_CERT_X509KE:
   2105 	case ISAKMP_CERT_X509ATTR:
   2106 	case ISAKMP_CERT_ARL:
   2107 		plog(LLV_ERROR, LOCATION, NULL,
   2108 			"No supported such CERT type %d\n", type);
   2109 		return -1;
   2110 	default:
   2111 		plog(LLV_ERROR, LOCATION, NULL,
   2112 			"Invalid CERT type %d\n", type);
   2113 		return -1;
   2114 	}
   2115 
   2116 	/* XXX choice the 1th cert, ignore after the cert. */
   2117 	/* XXX should be processed. */
   2118 	if (*c) {
   2119 		plog(LLV_WARNING, LOCATION, NULL,
   2120 			"ignore 2nd CERT payload.\n");
   2121 		return 0;
   2122 	}
   2123 
   2124 	if (type == ISAKMP_CERT_PKCS7) {
   2125 		u_char *bp;
   2126 		int i;
   2127 
   2128 		/* Skip the header */
   2129 		bp = (u_char *)(gen + 1);
   2130 		/* And the first byte is the certificate type,
   2131 		 * we know that already
   2132 		 */
   2133 		bp++;
   2134 		p7 = d2i_PKCS7(NULL, (void *)&bp,
   2135 		    ntohs(gen->len) - sizeof(*gen) - 1);
   2136 
   2137 		if (!p7) {
   2138 			plog(LLV_ERROR, LOCATION, NULL,
   2139 			     "Failed to parse PKCS#7 CERT.\n");
   2140 			return -1;
   2141 		}
   2142 
   2143 		/* Copied this from the openssl pkcs7 application;
   2144 		 * there"s little by way of documentation for any of
   2145 		 * it. I can only presume it"s correct.
   2146 		 */
   2147 
   2148 		i = OBJ_obj2nid(p7->type);
   2149 		switch (i) {
   2150 		case NID_pkcs7_signed:
   2151 			certs=p7->d.sign->cert;
   2152 			break;
   2153 		case NID_pkcs7_signedAndEnveloped:
   2154 			certs=p7->d.signed_and_enveloped->cert;
   2155 			break;
   2156 		default:
   2157 			 break;
   2158 		}
   2159 
   2160 		if (!certs) {
   2161 			plog(LLV_ERROR, LOCATION, NULL,
   2162 			     "CERT PKCS#7 bundle contains no certs.\n");
   2163 			PKCS7_free(p7);
   2164 			return -1;
   2165 		}
   2166 
   2167 		for (i = 0; i < sk_X509_num(certs); i++) {
   2168 			int len;
   2169 			u_char *bp;
   2170 			X509 *cert = sk_X509_value(certs,i);
   2171 
   2172 			plog(LLV_DEBUG, LOCATION, NULL,
   2173 			     "Trying PKCS#7 cert %d.\n", i);
   2174 
   2175 			/* We'll just try each cert in turn */
   2176 			*c = save_certx509(cert);
   2177 
   2178 			if (!*c) {
   2179 				plog(LLV_ERROR, LOCATION, NULL,
   2180 				     "Failed to get CERT buffer.\n");
   2181 				continue;
   2182 			}
   2183 
   2184 			/* Ignore cert if it doesn't match identity
   2185 			 * XXX If verify cert is disabled, we still just take
   2186 			 * the first certificate....
   2187 			 */
   2188 			if(iph1->rmconf->verify_cert &&
   2189 			   oakley_check_certid(iph1)) {
   2190 				plog(LLV_DEBUG, LOCATION, NULL,
   2191 				     "Discarding CERT: does not match ID.\n");
   2192 				oakley_delcert((*c));
   2193 				*c = NULL;
   2194 				continue;
   2195 			}
   2196 
   2197 			{
   2198 				char *p = eay_get_x509text(&(*c)->cert);
   2199 				plog(LLV_DEBUG, LOCATION, NULL, "CERT saved:\n");
   2200 				plogdump(LLV_DEBUG, (*c)->cert.v, (*c)->cert.l);
   2201 				plog(LLV_DEBUG, LOCATION, NULL, "%s",
   2202 				     p ? p : "\n");
   2203 				racoon_free(p);
   2204 			}
   2205 			break;
   2206 		}
   2207 		PKCS7_free(p7);
   2208 
   2209 	} else {
   2210 		*c = save_certbuf(gen);
   2211 		if (!*c) {
   2212 			plog(LLV_ERROR, LOCATION, NULL,
   2213 			     "Failed to get CERT buffer.\n");
   2214 			return -1;
   2215 		}
   2216 
   2217 		switch ((*c)->type) {
   2218 		case ISAKMP_CERT_DNS:
   2219 			plog(LLV_WARNING, LOCATION, NULL,
   2220 			     "CERT payload is unnecessary in DNSSEC. "
   2221 			     "ignore it.\n");
   2222 			return 0;
   2223 		case ISAKMP_CERT_PGP:
   2224 		case ISAKMP_CERT_X509SIGN:
   2225 		case ISAKMP_CERT_KERBEROS:
   2226 		case ISAKMP_CERT_SPKI:
   2227 			/* Ignore cert if it doesn't match identity
   2228 			 * XXX If verify cert is disabled, we still just take
   2229 			 * the first certificate....
   2230 			 */
   2231 			if(iph1->rmconf->verify_cert &&
   2232 			   oakley_check_certid(iph1)){
   2233 				plog(LLV_DEBUG, LOCATION, NULL,
   2234 				     "Discarding CERT: does not match ID.\n");
   2235 				oakley_delcert((*c));
   2236 				*c = NULL;
   2237 				return 0;
   2238 			}
   2239 
   2240 			{
   2241 				char *p = eay_get_x509text(&(*c)->cert);
   2242 				plog(LLV_DEBUG, LOCATION, NULL, "CERT saved:\n");
   2243 				plogdump(LLV_DEBUG, (*c)->cert.v, (*c)->cert.l);
   2244 				plog(LLV_DEBUG, LOCATION, NULL, "%s", p ? p : "\n");
   2245 				racoon_free(p);
   2246 			}
   2247 			break;
   2248 		case ISAKMP_CERT_CRL:
   2249 			plog(LLV_DEBUG, LOCATION, NULL, "CRL saved:\n");
   2250 			plogdump(LLV_DEBUG, (*c)->cert.v, (*c)->cert.l);
   2251 			break;
   2252 		case ISAKMP_CERT_X509KE:
   2253 		case ISAKMP_CERT_X509ATTR:
   2254 		case ISAKMP_CERT_ARL:
   2255 		default:
   2256 			/* XXX */
   2257 			oakley_delcert((*c));
   2258 			*c = NULL;
   2259 			return 0;
   2260 		}
   2261 	}
   2262 
   2263 	return 0;
   2264 }
   2265 
   2266 /*
   2267  * save certificate including certificate type.
   2268  */
   2269 int
   2270 oakley_savecr(iph1, gen)
   2271 	struct ph1handle *iph1;
   2272 	struct isakmp_gen *gen;
   2273 {
   2274 	cert_t **c;
   2275 	u_int8_t type;
   2276 
   2277 	type = *(u_int8_t *)(gen + 1) & 0xff;
   2278 
   2279 	switch (type) {
   2280 	case ISAKMP_CERT_DNS:
   2281 		plog(LLV_WARNING, LOCATION, NULL,
   2282 			"CERT payload is unnecessary in DNSSEC\n");
   2283 		/*FALLTHRU*/
   2284 	case ISAKMP_CERT_PKCS7:
   2285 	case ISAKMP_CERT_PGP:
   2286 	case ISAKMP_CERT_X509SIGN:
   2287 	case ISAKMP_CERT_KERBEROS:
   2288 	case ISAKMP_CERT_SPKI:
   2289 		c = &iph1->cr_p;
   2290 		break;
   2291 	case ISAKMP_CERT_X509KE:
   2292 	case ISAKMP_CERT_X509ATTR:
   2293 	case ISAKMP_CERT_ARL:
   2294 		plog(LLV_ERROR, LOCATION, NULL,
   2295 			"No supported such CR type %d\n", type);
   2296 		return -1;
   2297 	case ISAKMP_CERT_CRL:
   2298 	default:
   2299 		plog(LLV_ERROR, LOCATION, NULL,
   2300 			"Invalid CR type %d\n", type);
   2301 		return -1;
   2302 	}
   2303 
   2304 	*c = save_certbuf(gen);
   2305 	if (!*c) {
   2306 		plog(LLV_ERROR, LOCATION, NULL,
   2307 			"Failed to get CR buffer.\n");
   2308 		return -1;
   2309 	}
   2310 
   2311 	plog(LLV_DEBUG, LOCATION, NULL, "CR saved:\n");
   2312 	plogdump(LLV_DEBUG, (*c)->cert.v, (*c)->cert.l);
   2313 
   2314 	return 0;
   2315 }
   2316 
   2317 static cert_t *
   2318 save_certbuf(gen)
   2319 	struct isakmp_gen *gen;
   2320 {
   2321 	cert_t *new;
   2322 
   2323 	if(ntohs(gen->len) <= sizeof(*gen)){
   2324 		plog(LLV_ERROR, LOCATION, NULL,
   2325 			 "Len is too small !!.\n");
   2326 		return NULL;
   2327 	}
   2328 
   2329 	new = oakley_newcert();
   2330 	if (!new) {
   2331 		plog(LLV_ERROR, LOCATION, NULL,
   2332 			"Failed to get CERT buffer.\n");
   2333 		return NULL;
   2334 	}
   2335 
   2336 	new->pl = vmalloc(ntohs(gen->len) - sizeof(*gen));
   2337 	if (new->pl == NULL) {
   2338 		plog(LLV_ERROR, LOCATION, NULL,
   2339 			"Failed to copy CERT from packet.\n");
   2340 		oakley_delcert(new);
   2341 		new = NULL;
   2342 		return NULL;
   2343 	}
   2344 	memcpy(new->pl->v, gen + 1, new->pl->l);
   2345 	new->type = new->pl->v[0] & 0xff;
   2346 	new->cert.v = new->pl->v + 1;
   2347 	new->cert.l = new->pl->l - 1;
   2348 
   2349 	return new;
   2350 }
   2351 
   2352 static cert_t *
   2353 save_certx509(cert)
   2354 	X509 *cert;
   2355 {
   2356 	cert_t *new;
   2357         int len;
   2358         u_char *bp;
   2359 
   2360 	new = oakley_newcert();
   2361 	if (!new) {
   2362 		plog(LLV_ERROR, LOCATION, NULL,
   2363 			"Failed to get CERT buffer.\n");
   2364 		return NULL;
   2365 	}
   2366 
   2367         len = i2d_X509(cert, NULL);
   2368 	new->pl = vmalloc(len);
   2369 	if (new->pl == NULL) {
   2370 		plog(LLV_ERROR, LOCATION, NULL,
   2371 			"Failed to copy CERT from packet.\n");
   2372 		oakley_delcert(new);
   2373 		new = NULL;
   2374 		return NULL;
   2375 	}
   2376         bp = (u_char *) new->pl->v;
   2377         len = i2d_X509(cert, &bp);
   2378 	new->type = ISAKMP_CERT_X509SIGN;
   2379 	new->cert.v = new->pl->v;
   2380 	new->cert.l = new->pl->l;
   2381 
   2382 	return new;
   2383 }
   2384 
   2385 /*
   2386  * get my CR.
   2387  * NOTE: No Certificate Authority field is included to CR payload at the
   2388  * moment. Becuase any certificate authority are accepted without any check.
   2389  * The section 3.10 in RFC2408 says that this field SHOULD not be included,
   2390  * if there is no specific certificate authority requested.
   2391  */
   2392 vchar_t *
   2393 oakley_getcr(iph1)
   2394 	struct ph1handle *iph1;
   2395 {
   2396 	vchar_t *buf;
   2397 
   2398 	buf = vmalloc(1);
   2399 	if (buf == NULL) {
   2400 		plog(LLV_ERROR, LOCATION, NULL,
   2401 			"failed to get cr buffer\n");
   2402 		return NULL;
   2403 	}
   2404 	if(iph1->rmconf->certtype == ISAKMP_CERT_NONE) {
   2405 		buf->v[0] = iph1->rmconf->cacerttype;
   2406 		plog(LLV_DEBUG, LOCATION, NULL, "create my CR: NONE, using %s instead\n",
   2407 		s_isakmp_certtype(iph1->rmconf->cacerttype));
   2408 	} else {
   2409 		buf->v[0] = iph1->rmconf->certtype;
   2410 		plog(LLV_DEBUG, LOCATION, NULL, "create my CR: %s\n",
   2411 		s_isakmp_certtype(iph1->rmconf->certtype));
   2412 	}
   2413 	if (buf->l > 1)
   2414 		plogdump(LLV_DEBUG, buf->v, buf->l);
   2415 
   2416 	return buf;
   2417 }
   2418 
   2419 /*
   2420  * check peer's CR.
   2421  */
   2422 int
   2423 oakley_checkcr(iph1)
   2424 	struct ph1handle *iph1;
   2425 {
   2426 	if (iph1->cr_p == NULL)
   2427 		return 0;
   2428 
   2429 	plog(LLV_DEBUG, LOCATION, iph1->remote,
   2430 		"peer transmitted CR: %s\n",
   2431 		s_isakmp_certtype(iph1->cr_p->type));
   2432 
   2433 	if (iph1->cr_p->type != iph1->rmconf->certtype) {
   2434 		plog(LLV_ERROR, LOCATION, iph1->remote,
   2435 			"such a cert type isn't supported: %d\n",
   2436 			(char)iph1->cr_p->type);
   2437 		return -1;
   2438 	}
   2439 
   2440 	return 0;
   2441 }
   2442 
   2443 /*
   2444  * check to need CR payload.
   2445  */
   2446 int
   2447 oakley_needcr(type)
   2448 	int type;
   2449 {
   2450 	switch (type) {
   2451 	case OAKLEY_ATTR_AUTH_METHOD_DSSSIG:
   2452 	case OAKLEY_ATTR_AUTH_METHOD_RSASIG:
   2453 #ifdef ENABLE_HYBRID
   2454 	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_I:
   2455 	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_I:
   2456 	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_I:
   2457 	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_R:
   2458 	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_I:
   2459 	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_R:
   2460 #endif
   2461 		return 1;
   2462 	default:
   2463 		return 0;
   2464 	}
   2465 	/*NOTREACHED*/
   2466 }
   2467 
   2468 /*
   2469  * compute SKEYID
   2470  * see seciton 5. Exchanges in RFC 2409
   2471  * psk: SKEYID = prf(pre-shared-key, Ni_b | Nr_b)
   2472  * sig: SKEYID = prf(Ni_b | Nr_b, g^ir)
   2473  * enc: SKEYID = prf(H(Ni_b | Nr_b), CKY-I | CKY-R)
   2474  */
   2475 int
   2476 oakley_skeyid(iph1)
   2477 	struct ph1handle *iph1;
   2478 {
   2479 	vchar_t *buf = NULL, *bp;
   2480 	char *p;
   2481 	int len;
   2482 	int error = -1;
   2483 
   2484 	/* SKEYID */
   2485 	switch (AUTHMETHOD(iph1)) {
   2486 	case OAKLEY_ATTR_AUTH_METHOD_PSKEY:
   2487 #ifdef ENABLE_HYBRID
   2488 	case FICTIVE_AUTH_METHOD_XAUTH_PSKEY_I:
   2489 	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_R:
   2490 #endif
   2491 		if (iph1->etype != ISAKMP_ETYPE_IDENT) {
   2492 			iph1->authstr = getpskbyname(iph1->id_p);
   2493 			if (iph1->authstr == NULL) {
   2494 				if (iph1->rmconf->verify_identifier) {
   2495 					plog(LLV_ERROR, LOCATION, iph1->remote,
   2496 						"couldn't find the pskey.\n");
   2497 					goto end;
   2498 				}
   2499 				plog(LLV_NOTIFY, LOCATION, iph1->remote,
   2500 					"couldn't find the proper pskey, "
   2501 					"try to get one by the peer's address.\n");
   2502 			}
   2503 		}
   2504 		if (iph1->authstr == NULL) {
   2505 			/*
   2506 			 * If the exchange type is the main mode or if it's
   2507 			 * failed to get the psk by ID, racoon try to get
   2508 			 * the psk by remote IP address.
   2509 			 * It may be nonsense.
   2510 			 */
   2511 			iph1->authstr = getpskbyaddr(iph1->remote);
   2512 			if (iph1->authstr == NULL) {
   2513 				plog(LLV_ERROR, LOCATION, iph1->remote,
   2514 					"couldn't find the pskey for %s.\n",
   2515 					saddrwop2str(iph1->remote));
   2516 				goto end;
   2517 			}
   2518 		}
   2519 		plog(LLV_DEBUG, LOCATION, NULL, "the psk found.\n");
   2520 		/* should be secret PSK */
   2521 		plog(LLV_DEBUG2, LOCATION, NULL, "psk: ");
   2522 		plogdump(LLV_DEBUG2, iph1->authstr->v, iph1->authstr->l);
   2523 
   2524 		len = iph1->nonce->l + iph1->nonce_p->l;
   2525 		buf = vmalloc(len);
   2526 		if (buf == NULL) {
   2527 			plog(LLV_ERROR, LOCATION, NULL,
   2528 				"failed to get skeyid buffer\n");
   2529 			goto end;
   2530 		}
   2531 		p = buf->v;
   2532 
   2533 		bp = (iph1->side == INITIATOR ? iph1->nonce : iph1->nonce_p);
   2534 		plog(LLV_DEBUG, LOCATION, NULL, "nonce 1: ");
   2535 		plogdump(LLV_DEBUG, bp->v, bp->l);
   2536 		memcpy(p, bp->v, bp->l);
   2537 		p += bp->l;
   2538 
   2539 		bp = (iph1->side == INITIATOR ? iph1->nonce_p : iph1->nonce);
   2540 		plog(LLV_DEBUG, LOCATION, NULL, "nonce 2: ");
   2541 		plogdump(LLV_DEBUG, bp->v, bp->l);
   2542 		memcpy(p, bp->v, bp->l);
   2543 		p += bp->l;
   2544 
   2545 		iph1->skeyid = oakley_prf(iph1->authstr, buf, iph1);
   2546 		if (iph1->skeyid == NULL)
   2547 			goto end;
   2548 		break;
   2549 
   2550 	case OAKLEY_ATTR_AUTH_METHOD_DSSSIG:
   2551 	case OAKLEY_ATTR_AUTH_METHOD_RSASIG:
   2552 #ifdef ENABLE_HYBRID
   2553 	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_I:
   2554 	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_I:
   2555 	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_R:
   2556 	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_R:
   2557 	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_I:
   2558 	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_R:
   2559 	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_I:
   2560 	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_R:
   2561 #endif
   2562 #ifdef HAVE_GSSAPI
   2563 	case OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB:
   2564 #endif
   2565 		len = iph1->nonce->l + iph1->nonce_p->l;
   2566 		buf = vmalloc(len);
   2567 		if (buf == NULL) {
   2568 			plog(LLV_ERROR, LOCATION, NULL,
   2569 				"failed to get nonce buffer\n");
   2570 			goto end;
   2571 		}
   2572 		p = buf->v;
   2573 
   2574 		bp = (iph1->side == INITIATOR ? iph1->nonce : iph1->nonce_p);
   2575 		plog(LLV_DEBUG, LOCATION, NULL, "nonce1: ");
   2576 		plogdump(LLV_DEBUG, bp->v, bp->l);
   2577 		memcpy(p, bp->v, bp->l);
   2578 		p += bp->l;
   2579 
   2580 		bp = (iph1->side == INITIATOR ? iph1->nonce_p : iph1->nonce);
   2581 		plog(LLV_DEBUG, LOCATION, NULL, "nonce2: ");
   2582 		plogdump(LLV_DEBUG, bp->v, bp->l);
   2583 		memcpy(p, bp->v, bp->l);
   2584 		p += bp->l;
   2585 
   2586 		iph1->skeyid = oakley_prf(buf, iph1->dhgxy, iph1);
   2587 		if (iph1->skeyid == NULL)
   2588 			goto end;
   2589 		break;
   2590 	case OAKLEY_ATTR_AUTH_METHOD_RSAENC:
   2591 	case OAKLEY_ATTR_AUTH_METHOD_RSAREV:
   2592 #ifdef ENABLE_HYBRID
   2593 	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_I:
   2594 	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_R:
   2595 	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_I:
   2596 	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_R:
   2597 #endif
   2598 		plog(LLV_WARNING, LOCATION, NULL,
   2599 			"not supported authentication method %s\n",
   2600 			s_oakley_attr_method(iph1->approval->authmethod));
   2601 		goto end;
   2602 	default:
   2603 		plog(LLV_ERROR, LOCATION, NULL,
   2604 			"invalid authentication method %d\n",
   2605 			iph1->approval->authmethod);
   2606 		goto end;
   2607 	}
   2608 
   2609 	plog(LLV_DEBUG, LOCATION, NULL, "SKEYID computed:\n");
   2610 	plogdump(LLV_DEBUG, iph1->skeyid->v, iph1->skeyid->l);
   2611 
   2612 	error = 0;
   2613 
   2614 end:
   2615 	if (buf != NULL)
   2616 		vfree(buf);
   2617 	return error;
   2618 }
   2619 
   2620 /*
   2621  * compute SKEYID_[dae]
   2622  * see seciton 5. Exchanges in RFC 2409
   2623  * SKEYID_d = prf(SKEYID, g^ir | CKY-I | CKY-R | 0)
   2624  * SKEYID_a = prf(SKEYID, SKEYID_d | g^ir | CKY-I | CKY-R | 1)
   2625  * SKEYID_e = prf(SKEYID, SKEYID_a | g^ir | CKY-I | CKY-R | 2)
   2626  */
   2627 int
   2628 oakley_skeyid_dae(iph1)
   2629 	struct ph1handle *iph1;
   2630 {
   2631 	vchar_t *buf = NULL;
   2632 	char *p;
   2633 	int len;
   2634 	int error = -1;
   2635 
   2636 	if (iph1->skeyid == NULL) {
   2637 		plog(LLV_ERROR, LOCATION, NULL, "no SKEYID found.\n");
   2638 		goto end;
   2639 	}
   2640 
   2641 	/* SKEYID D */
   2642 	/* SKEYID_d = prf(SKEYID, g^xy | CKY-I | CKY-R | 0) */
   2643 	len = iph1->dhgxy->l + sizeof(cookie_t) * 2 + 1;
   2644 	buf = vmalloc(len);
   2645 	if (buf == NULL) {
   2646 		plog(LLV_ERROR, LOCATION, NULL,
   2647 			"failed to get skeyid buffer\n");
   2648 		goto end;
   2649 	}
   2650 	p = buf->v;
   2651 
   2652 	memcpy(p, iph1->dhgxy->v, iph1->dhgxy->l);
   2653 	p += iph1->dhgxy->l;
   2654 	memcpy(p, (caddr_t)&iph1->index.i_ck, sizeof(cookie_t));
   2655 	p += sizeof(cookie_t);
   2656 	memcpy(p, (caddr_t)&iph1->index.r_ck, sizeof(cookie_t));
   2657 	p += sizeof(cookie_t);
   2658 	*p = 0;
   2659 	iph1->skeyid_d = oakley_prf(iph1->skeyid, buf, iph1);
   2660 	if (iph1->skeyid_d == NULL)
   2661 		goto end;
   2662 
   2663 	vfree(buf);
   2664 	buf = NULL;
   2665 
   2666 	plog(LLV_DEBUG, LOCATION, NULL, "SKEYID_d computed:\n");
   2667 	plogdump(LLV_DEBUG, iph1->skeyid_d->v, iph1->skeyid_d->l);
   2668 
   2669 	/* SKEYID A */
   2670 	/* SKEYID_a = prf(SKEYID, SKEYID_d | g^xy | CKY-I | CKY-R | 1) */
   2671 	len = iph1->skeyid_d->l + iph1->dhgxy->l + sizeof(cookie_t) * 2 + 1;
   2672 	buf = vmalloc(len);
   2673 	if (buf == NULL) {
   2674 		plog(LLV_ERROR, LOCATION, NULL,
   2675 			"failed to get skeyid buffer\n");
   2676 		goto end;
   2677 	}
   2678 	p = buf->v;
   2679 	memcpy(p, iph1->skeyid_d->v, iph1->skeyid_d->l);
   2680 	p += iph1->skeyid_d->l;
   2681 	memcpy(p, iph1->dhgxy->v, iph1->dhgxy->l);
   2682 	p += iph1->dhgxy->l;
   2683 	memcpy(p, (caddr_t)&iph1->index.i_ck, sizeof(cookie_t));
   2684 	p += sizeof(cookie_t);
   2685 	memcpy(p, (caddr_t)&iph1->index.r_ck, sizeof(cookie_t));
   2686 	p += sizeof(cookie_t);
   2687 	*p = 1;
   2688 	iph1->skeyid_a = oakley_prf(iph1->skeyid, buf, iph1);
   2689 	if (iph1->skeyid_a == NULL)
   2690 		goto end;
   2691 
   2692 	vfree(buf);
   2693 	buf = NULL;
   2694 
   2695 	plog(LLV_DEBUG, LOCATION, NULL, "SKEYID_a computed:\n");
   2696 	plogdump(LLV_DEBUG, iph1->skeyid_a->v, iph1->skeyid_a->l);
   2697 
   2698 	/* SKEYID E */
   2699 	/* SKEYID_e = prf(SKEYID, SKEYID_a | g^xy | CKY-I | CKY-R | 2) */
   2700 	len = iph1->skeyid_a->l + iph1->dhgxy->l + sizeof(cookie_t) * 2 + 1;
   2701 	buf = vmalloc(len);
   2702 	if (buf == NULL) {
   2703 		plog(LLV_ERROR, LOCATION, NULL,
   2704 			"failed to get skeyid buffer\n");
   2705 		goto end;
   2706 	}
   2707 	p = buf->v;
   2708 	memcpy(p, iph1->skeyid_a->v, iph1->skeyid_a->l);
   2709 	p += iph1->skeyid_a->l;
   2710 	memcpy(p, iph1->dhgxy->v, iph1->dhgxy->l);
   2711 	p += iph1->dhgxy->l;
   2712 	memcpy(p, (caddr_t)&iph1->index.i_ck, sizeof(cookie_t));
   2713 	p += sizeof(cookie_t);
   2714 	memcpy(p, (caddr_t)&iph1->index.r_ck, sizeof(cookie_t));
   2715 	p += sizeof(cookie_t);
   2716 	*p = 2;
   2717 	iph1->skeyid_e = oakley_prf(iph1->skeyid, buf, iph1);
   2718 	if (iph1->skeyid_e == NULL)
   2719 		goto end;
   2720 
   2721 	vfree(buf);
   2722 	buf = NULL;
   2723 
   2724 	plog(LLV_DEBUG, LOCATION, NULL, "SKEYID_e computed:\n");
   2725 	plogdump(LLV_DEBUG, iph1->skeyid_e->v, iph1->skeyid_e->l);
   2726 
   2727 	error = 0;
   2728 
   2729 end:
   2730 	if (buf != NULL)
   2731 		vfree(buf);
   2732 	return error;
   2733 }
   2734 
   2735 /*
   2736  * compute final encryption key.
   2737  * see Appendix B.
   2738  */
   2739 int
   2740 oakley_compute_enckey(iph1)
   2741 	struct ph1handle *iph1;
   2742 {
   2743 	u_int keylen, prflen;
   2744 	int error = -1;
   2745 
   2746 	/* RFC2409 p39 */
   2747 	keylen = alg_oakley_encdef_keylen(iph1->approval->enctype,
   2748 					iph1->approval->encklen);
   2749 	if (keylen == -1) {
   2750 		plog(LLV_ERROR, LOCATION, NULL,
   2751 			"invalid encryption algoritym %d, "
   2752 			"or invalid key length %d.\n",
   2753 			iph1->approval->enctype,
   2754 			iph1->approval->encklen);
   2755 		goto end;
   2756 	}
   2757 	iph1->key = vmalloc(keylen >> 3);
   2758 	if (iph1->key == NULL) {
   2759 		plog(LLV_ERROR, LOCATION, NULL,
   2760 			"failed to get key buffer\n");
   2761 		goto end;
   2762 	}
   2763 
   2764 	/* set prf length */
   2765 	prflen = alg_oakley_hashdef_hashlen(iph1->approval->hashtype);
   2766 	if (prflen == -1) {
   2767 		plog(LLV_ERROR, LOCATION, NULL,
   2768 			"invalid hash type %d.\n", iph1->approval->hashtype);
   2769 		goto end;
   2770 	}
   2771 
   2772 	/* see isakmp-oakley-08 5.3. */
   2773 	if (iph1->key->l <= iph1->skeyid_e->l) {
   2774 		/*
   2775 		 * if length(Ka) <= length(SKEYID_e)
   2776 		 *	Ka = first length(K) bit of SKEYID_e
   2777 		 */
   2778 		memcpy(iph1->key->v, iph1->skeyid_e->v, iph1->key->l);
   2779 	} else {
   2780 		vchar_t *buf = NULL, *res = NULL;
   2781 		u_char *p, *ep;
   2782 		int cplen;
   2783 		int subkey;
   2784 
   2785 		/*
   2786 		 * otherwise,
   2787 		 *	Ka = K1 | K2 | K3
   2788 		 * where
   2789 		 *	K1 = prf(SKEYID_e, 0)
   2790 		 *	K2 = prf(SKEYID_e, K1)
   2791 		 *	K3 = prf(SKEYID_e, K2)
   2792 		 */
   2793 		plog(LLV_DEBUG, LOCATION, NULL,
   2794 			"len(SKEYID_e) < len(Ka) (%zu < %zu), "
   2795 			"generating long key (Ka = K1 | K2 | ...)\n",
   2796 			iph1->skeyid_e->l, iph1->key->l);
   2797 
   2798 		if ((buf = vmalloc(prflen >> 3)) == 0) {
   2799 			plog(LLV_ERROR, LOCATION, NULL,
   2800 				"failed to get key buffer\n");
   2801 			goto end;
   2802 		}
   2803 		p = (u_char *)iph1->key->v;
   2804 		ep = p + iph1->key->l;
   2805 
   2806 		subkey = 1;
   2807 		while (p < ep) {
   2808 			if (p == (u_char *)iph1->key->v) {
   2809 				/* just for computing K1 */
   2810 				buf->v[0] = 0;
   2811 				buf->l = 1;
   2812 			}
   2813 			res = oakley_prf(iph1->skeyid_e, buf, iph1);
   2814 			if (res == NULL) {
   2815 				vfree(buf);
   2816 				goto end;
   2817 			}
   2818 			plog(LLV_DEBUG, LOCATION, NULL,
   2819 				"compute intermediate encryption key K%d\n",
   2820 				subkey);
   2821 			plogdump(LLV_DEBUG, buf->v, buf->l);
   2822 			plogdump(LLV_DEBUG, res->v, res->l);
   2823 
   2824 			cplen = (res->l < ep - p) ? res->l : ep - p;
   2825 			memcpy(p, res->v, cplen);
   2826 			p += cplen;
   2827 
   2828 			buf->l = prflen >> 3;	/* to cancel K1 speciality */
   2829 			if (res->l != buf->l) {
   2830 				plog(LLV_ERROR, LOCATION, NULL,
   2831 					"internal error: res->l=%zu buf->l=%zu\n",
   2832 					res->l, buf->l);
   2833 				vfree(res);
   2834 				vfree(buf);
   2835 				goto end;
   2836 			}
   2837 			memcpy(buf->v, res->v, res->l);
   2838 			vfree(res);
   2839 			subkey++;
   2840 		}
   2841 
   2842 		vfree(buf);
   2843 	}
   2844 
   2845 	/*
   2846 	 * don't check any weak key or not.
   2847 	 * draft-ietf-ipsec-ike-01.txt Appendix B.
   2848 	 * draft-ietf-ipsec-ciph-aes-cbc-00.txt Section 2.3.
   2849 	 */
   2850 #if 0
   2851 	/* weakkey check */
   2852 	if (iph1->approval->enctype > ARRAYLEN(oakley_encdef)
   2853 	 || oakley_encdef[iph1->approval->enctype].weakkey == NULL) {
   2854 		plog(LLV_ERROR, LOCATION, NULL,
   2855 			"encryption algoritym %d isn't supported.\n",
   2856 			iph1->approval->enctype);
   2857 		goto end;
   2858 	}
   2859 	if ((oakley_encdef[iph1->approval->enctype].weakkey)(iph1->key)) {
   2860 		plog(LLV_ERROR, LOCATION, NULL,
   2861 			"weakkey was generated.\n");
   2862 		goto end;
   2863 	}
   2864 #endif
   2865 
   2866 	plog(LLV_DEBUG, LOCATION, NULL, "final encryption key computed:\n");
   2867 	plogdump(LLV_DEBUG, iph1->key->v, iph1->key->l);
   2868 
   2869 	error = 0;
   2870 
   2871 end:
   2872 	return error;
   2873 }
   2874 
   2875 /* allocated new buffer for CERT */
   2876 cert_t *
   2877 oakley_newcert()
   2878 {
   2879 	cert_t *new;
   2880 
   2881 	new = racoon_calloc(1, sizeof(*new));
   2882 	if (new == NULL) {
   2883 		plog(LLV_ERROR, LOCATION, NULL,
   2884 			"failed to get cert's buffer\n");
   2885 		return NULL;
   2886 	}
   2887 
   2888 	new->pl = NULL;
   2889 
   2890 	return new;
   2891 }
   2892 
   2893 /* delete buffer for CERT */
   2894 void
   2895 oakley_delcert(cert)
   2896 	cert_t *cert;
   2897 {
   2898 	if (!cert)
   2899 		return;
   2900 	if (cert->pl)
   2901 		VPTRINIT(cert->pl);
   2902 	racoon_free(cert);
   2903 }
   2904 
   2905 /*
   2906  * compute IV and set to ph1handle
   2907  *	IV = hash(g^xi | g^xr)
   2908  * see 4.1 Phase 1 state in draft-ietf-ipsec-ike.
   2909  */
   2910 int
   2911 oakley_newiv(iph1)
   2912 	struct ph1handle *iph1;
   2913 {
   2914 	struct isakmp_ivm *newivm = NULL;
   2915 	vchar_t *buf = NULL, *bp;
   2916 	char *p;
   2917 	int len;
   2918 
   2919 	/* create buffer */
   2920 	len = iph1->dhpub->l + iph1->dhpub_p->l;
   2921 	buf = vmalloc(len);
   2922 	if (buf == NULL) {
   2923 		plog(LLV_ERROR, LOCATION, NULL,
   2924 			"failed to get iv buffer\n");
   2925 		return -1;
   2926 	}
   2927 
   2928 	p = buf->v;
   2929 
   2930 	bp = (iph1->side == INITIATOR ? iph1->dhpub : iph1->dhpub_p);
   2931 	memcpy(p, bp->v, bp->l);
   2932 	p += bp->l;
   2933 
   2934 	bp = (iph1->side == INITIATOR ? iph1->dhpub_p : iph1->dhpub);
   2935 	memcpy(p, bp->v, bp->l);
   2936 	p += bp->l;
   2937 
   2938 	/* allocate IVm */
   2939 	newivm = racoon_calloc(1, sizeof(struct isakmp_ivm));
   2940 	if (newivm == NULL) {
   2941 		plog(LLV_ERROR, LOCATION, NULL,
   2942 			"failed to get iv buffer\n");
   2943 		vfree(buf);
   2944 		return -1;
   2945 	}
   2946 
   2947 	/* compute IV */
   2948 	newivm->iv = oakley_hash(buf, iph1);
   2949 	if (newivm->iv == NULL) {
   2950 		vfree(buf);
   2951 		oakley_delivm(newivm);
   2952 		return -1;
   2953 	}
   2954 
   2955 	/* adjust length of iv */
   2956 	newivm->iv->l = alg_oakley_encdef_blocklen(iph1->approval->enctype);
   2957 	if (newivm->iv->l == -1) {
   2958 		plog(LLV_ERROR, LOCATION, NULL,
   2959 			"invalid encryption algoriym %d.\n",
   2960 			iph1->approval->enctype);
   2961 		vfree(buf);
   2962 		oakley_delivm(newivm);
   2963 		return -1;
   2964 	}
   2965 
   2966 	/* create buffer to save iv */
   2967 	if ((newivm->ive = vdup(newivm->iv)) == NULL) {
   2968 		plog(LLV_ERROR, LOCATION, NULL,
   2969 			"vdup (%s)\n", strerror(errno));
   2970 		vfree(buf);
   2971 		oakley_delivm(newivm);
   2972 		return -1;
   2973 	}
   2974 
   2975 	vfree(buf);
   2976 
   2977 	plog(LLV_DEBUG, LOCATION, NULL, "IV computed:\n");
   2978 	plogdump(LLV_DEBUG, newivm->iv->v, newivm->iv->l);
   2979 
   2980 	iph1->ivm = newivm;
   2981 
   2982 	return 0;
   2983 }
   2984 
   2985 /*
   2986  * compute IV for the payload after phase 1.
   2987  * It's not limited for phase 2.
   2988  * if pahse 1 was encrypted.
   2989  *	IV = hash(last CBC block of Phase 1 | M-ID)
   2990  * if phase 1 was not encrypted.
   2991  *	IV = hash(phase 1 IV | M-ID)
   2992  * see 4.2 Phase 2 state in draft-ietf-ipsec-ike.
   2993  */
   2994 struct isakmp_ivm *
   2995 oakley_newiv2(iph1, msgid)
   2996 	struct ph1handle *iph1;
   2997 	u_int32_t msgid;
   2998 {
   2999 	struct isakmp_ivm *newivm = NULL;
   3000 	vchar_t *buf = NULL;
   3001 	char *p;
   3002 	int len;
   3003 	int error = -1;
   3004 
   3005 	/* create buffer */
   3006 	len = iph1->ivm->iv->l + sizeof(msgid_t);
   3007 	buf = vmalloc(len);
   3008 	if (buf == NULL) {
   3009 		plog(LLV_ERROR, LOCATION, NULL,
   3010 			"failed to get iv buffer\n");
   3011 		goto end;
   3012 	}
   3013 
   3014 	p = buf->v;
   3015 
   3016 	memcpy(p, iph1->ivm->iv->v, iph1->ivm->iv->l);
   3017 	p += iph1->ivm->iv->l;
   3018 
   3019 	memcpy(p, &msgid, sizeof(msgid));
   3020 
   3021 	plog(LLV_DEBUG, LOCATION, NULL, "compute IV for phase2\n");
   3022 	plog(LLV_DEBUG, LOCATION, NULL, "phase1 last IV:\n");
   3023 	plogdump(LLV_DEBUG, buf->v, buf->l);
   3024 
   3025 	/* allocate IVm */
   3026 	newivm = racoon_calloc(1, sizeof(struct isakmp_ivm));
   3027 	if (newivm == NULL) {
   3028 		plog(LLV_ERROR, LOCATION, NULL,
   3029 			"failed to get iv buffer\n");
   3030 		goto end;
   3031 	}
   3032 
   3033 	/* compute IV */
   3034 	if ((newivm->iv = oakley_hash(buf, iph1)) == NULL)
   3035 		goto end;
   3036 
   3037 	/* adjust length of iv */
   3038 	newivm->iv->l = alg_oakley_encdef_blocklen(iph1->approval->enctype);
   3039 	if (newivm->iv->l == -1) {
   3040 		plog(LLV_ERROR, LOCATION, NULL,
   3041 			"invalid encryption algoriym %d.\n",
   3042 			iph1->approval->enctype);
   3043 		goto end;
   3044 	}
   3045 
   3046 	/* create buffer to save new iv */
   3047 	if ((newivm->ive = vdup(newivm->iv)) == NULL) {
   3048 		plog(LLV_ERROR, LOCATION, NULL, "vdup (%s)\n", strerror(errno));
   3049 		goto end;
   3050 	}
   3051 
   3052 	error = 0;
   3053 
   3054 	plog(LLV_DEBUG, LOCATION, NULL, "phase2 IV computed:\n");
   3055 	plogdump(LLV_DEBUG, newivm->iv->v, newivm->iv->l);
   3056 
   3057 end:
   3058 	if (error && newivm != NULL){
   3059 		oakley_delivm(newivm);
   3060 		newivm=NULL;
   3061 	}
   3062 	if (buf != NULL)
   3063 		vfree(buf);
   3064 	return newivm;
   3065 }
   3066 
   3067 void
   3068 oakley_delivm(ivm)
   3069 	struct isakmp_ivm *ivm;
   3070 {
   3071 	if (ivm == NULL)
   3072 		return;
   3073 
   3074 	if (ivm->iv != NULL)
   3075 		vfree(ivm->iv);
   3076 	if (ivm->ive != NULL)
   3077 		vfree(ivm->ive);
   3078 	racoon_free(ivm);
   3079 	plog(LLV_DEBUG, LOCATION, NULL, "IV freed\n");
   3080 
   3081 	return;
   3082 }
   3083 
   3084 /*
   3085  * decrypt packet.
   3086  *   save new iv and old iv.
   3087  */
   3088 vchar_t *
   3089 oakley_do_decrypt(iph1, msg, ivdp, ivep)
   3090 	struct ph1handle *iph1;
   3091 	vchar_t *msg, *ivdp, *ivep;
   3092 {
   3093 	vchar_t *buf = NULL, *new = NULL;
   3094 	char *pl;
   3095 	int len;
   3096 	u_int8_t padlen;
   3097 	int blen;
   3098 	int error = -1;
   3099 
   3100 	plog(LLV_DEBUG, LOCATION, NULL, "begin decryption.\n");
   3101 
   3102 	blen = alg_oakley_encdef_blocklen(iph1->approval->enctype);
   3103 	if (blen == -1) {
   3104 		plog(LLV_ERROR, LOCATION, NULL,
   3105 			"invalid encryption algoriym %d.\n",
   3106 			iph1->approval->enctype);
   3107 		goto end;
   3108 	}
   3109 
   3110 	/* save IV for next, but not sync. */
   3111 	memset(ivep->v, 0, ivep->l);
   3112 	memcpy(ivep->v, (caddr_t)&msg->v[msg->l - blen], blen);
   3113 
   3114 	plog(LLV_DEBUG, LOCATION, NULL,
   3115 		"IV was saved for next processing:\n");
   3116 	plogdump(LLV_DEBUG, ivep->v, ivep->l);
   3117 
   3118 	pl = msg->v + sizeof(struct isakmp);
   3119 
   3120 	len = msg->l - sizeof(struct isakmp);
   3121 
   3122 	/* create buffer */
   3123 	buf = vmalloc(len);
   3124 	if (buf == NULL) {
   3125 		plog(LLV_ERROR, LOCATION, NULL,
   3126 			"failed to get buffer to decrypt.\n");
   3127 		goto end;
   3128 	}
   3129 	memcpy(buf->v, pl, len);
   3130 
   3131 	/* do decrypt */
   3132 	new = alg_oakley_encdef_decrypt(iph1->approval->enctype,
   3133 					buf, iph1->key, ivdp);
   3134 	if (new == NULL || new->v == NULL || new->l == 0) {
   3135 		plog(LLV_ERROR, LOCATION, NULL,
   3136 			"decryption %d failed.\n", iph1->approval->enctype);
   3137 		goto end;
   3138 	}
   3139 	plog(LLV_DEBUG, LOCATION, NULL, "with key:\n");
   3140 	plogdump(LLV_DEBUG, iph1->key->v, iph1->key->l);
   3141 
   3142 	vfree(buf);
   3143 	buf = NULL;
   3144 
   3145 	plog(LLV_DEBUG, LOCATION, NULL, "decrypted payload by IV:\n");
   3146 	plogdump(LLV_DEBUG, ivdp->v, ivdp->l);
   3147 
   3148 	plog(LLV_DEBUG, LOCATION, NULL,
   3149 		"decrypted payload, but not trimed.\n");
   3150 	plogdump(LLV_DEBUG, new->v, new->l);
   3151 
   3152 	/* get padding length */
   3153 	if (lcconf->pad_excltail)
   3154 		padlen = new->v[new->l - 1] + 1;
   3155 	else
   3156 		padlen = new->v[new->l - 1];
   3157 	plog(LLV_DEBUG, LOCATION, NULL, "padding len=%u\n", padlen);
   3158 
   3159 	/* trim padding */
   3160 	if (lcconf->pad_strict) {
   3161 		if (padlen > new->l) {
   3162 			plog(LLV_ERROR, LOCATION, NULL,
   3163 				"invalied padding len=%u, buflen=%zu.\n",
   3164 				padlen, new->l);
   3165 			plogdump(LLV_ERROR, new->v, new->l);
   3166 			goto end;
   3167 		}
   3168 		new->l -= padlen;
   3169 		plog(LLV_DEBUG, LOCATION, NULL, "trimmed padding\n");
   3170 	} else {
   3171 		plog(LLV_DEBUG, LOCATION, NULL, "skip to trim padding.\n");
   3172 	}
   3173 
   3174 	/* create new buffer */
   3175 	len = sizeof(struct isakmp) + new->l;
   3176 	buf = vmalloc(len);
   3177 	if (buf == NULL) {
   3178 		plog(LLV_ERROR, LOCATION, NULL,
   3179 			"failed to get buffer to decrypt.\n");
   3180 		goto end;
   3181 	}
   3182 	memcpy(buf->v, msg->v, sizeof(struct isakmp));
   3183 	memcpy(buf->v + sizeof(struct isakmp), new->v, new->l);
   3184 	((struct isakmp *)buf->v)->len = htonl(buf->l);
   3185 
   3186 	plog(LLV_DEBUG, LOCATION, NULL, "decrypted.\n");
   3187 	plogdump(LLV_DEBUG, buf->v, buf->l);
   3188 
   3189 #ifdef HAVE_PRINT_ISAKMP_C
   3190 	isakmp_printpacket(buf, iph1->remote, iph1->local, 1);
   3191 #endif
   3192 
   3193 	error = 0;
   3194 
   3195 end:
   3196 	if (error && buf != NULL) {
   3197 		vfree(buf);
   3198 		buf = NULL;
   3199 	}
   3200 	if (new != NULL)
   3201 		vfree(new);
   3202 
   3203 	return buf;
   3204 }
   3205 
   3206 /*
   3207  * encrypt packet.
   3208  */
   3209 vchar_t *
   3210 oakley_do_encrypt(iph1, msg, ivep, ivp)
   3211 	struct ph1handle *iph1;
   3212 	vchar_t *msg, *ivep, *ivp;
   3213 {
   3214 	vchar_t *buf = 0, *new = 0;
   3215 	char *pl;
   3216 	int len;
   3217 	u_int padlen;
   3218 	int blen;
   3219 	int error = -1;
   3220 
   3221 	plog(LLV_DEBUG, LOCATION, NULL, "begin encryption.\n");
   3222 
   3223 	/* set cbc block length */
   3224 	blen = alg_oakley_encdef_blocklen(iph1->approval->enctype);
   3225 	if (blen == -1) {
   3226 		plog(LLV_ERROR, LOCATION, NULL,
   3227 			"invalid encryption algoriym %d.\n",
   3228 			iph1->approval->enctype);
   3229 		goto end;
   3230 	}
   3231 
   3232 	pl = msg->v + sizeof(struct isakmp);
   3233 	len = msg->l - sizeof(struct isakmp);
   3234 
   3235 	/* add padding */
   3236 	padlen = oakley_padlen(len, blen);
   3237 	plog(LLV_DEBUG, LOCATION, NULL, "pad length = %u\n", padlen);
   3238 
   3239 	/* create buffer */
   3240 	buf = vmalloc(len + padlen);
   3241 	if (buf == NULL) {
   3242 		plog(LLV_ERROR, LOCATION, NULL,
   3243 			"failed to get buffer to encrypt.\n");
   3244 		goto end;
   3245 	}
   3246         if (padlen) {
   3247                 int i;
   3248 		char *p = &buf->v[len];
   3249 		if (lcconf->pad_random) {
   3250 			for (i = 0; i < padlen; i++)
   3251 				*p++ = eay_random() & 0xff;
   3252 		}
   3253         }
   3254         memcpy(buf->v, pl, len);
   3255 
   3256 	/* make pad into tail */
   3257 	if (lcconf->pad_excltail)
   3258 		buf->v[len + padlen - 1] = padlen - 1;
   3259 	else
   3260 		buf->v[len + padlen - 1] = padlen;
   3261 
   3262 	plogdump(LLV_DEBUG, buf->v, buf->l);
   3263 
   3264 	/* do encrypt */
   3265 	new = alg_oakley_encdef_encrypt(iph1->approval->enctype,
   3266 					buf, iph1->key, ivep);
   3267 	if (new == NULL) {
   3268 		plog(LLV_ERROR, LOCATION, NULL,
   3269 			"encryption %d failed.\n", iph1->approval->enctype);
   3270 		goto end;
   3271 	}
   3272 	plog(LLV_DEBUG, LOCATION, NULL, "with key:\n");
   3273 	plogdump(LLV_DEBUG, iph1->key->v, iph1->key->l);
   3274 
   3275 	vfree(buf);
   3276 	buf = NULL;
   3277 
   3278 	plog(LLV_DEBUG, LOCATION, NULL, "encrypted payload by IV:\n");
   3279 	plogdump(LLV_DEBUG, ivep->v, ivep->l);
   3280 
   3281 	/* save IV for next */
   3282 	memset(ivp->v, 0, ivp->l);
   3283 	memcpy(ivp->v, (caddr_t)&new->v[new->l - blen], blen);
   3284 
   3285 	plog(LLV_DEBUG, LOCATION, NULL, "save IV for next:\n");
   3286 	plogdump(LLV_DEBUG, ivp->v, ivp->l);
   3287 
   3288 	/* create new buffer */
   3289 	len = sizeof(struct isakmp) + new->l;
   3290 	buf = vmalloc(len);
   3291 	if (buf == NULL) {
   3292 		plog(LLV_ERROR, LOCATION, NULL,
   3293 			"failed to get buffer to encrypt.\n");
   3294 		goto end;
   3295 	}
   3296 	memcpy(buf->v, msg->v, sizeof(struct isakmp));
   3297 	memcpy(buf->v + sizeof(struct isakmp), new->v, new->l);
   3298 	((struct isakmp *)buf->v)->len = htonl(buf->l);
   3299 
   3300 	error = 0;
   3301 
   3302 	plog(LLV_DEBUG, LOCATION, NULL, "encrypted.\n");
   3303 
   3304 end:
   3305 	if (error && buf != NULL) {
   3306 		vfree(buf);
   3307 		buf = NULL;
   3308 	}
   3309 	if (new != NULL)
   3310 		vfree(new);
   3311 
   3312 	return buf;
   3313 }
   3314 
   3315 /* culculate padding length */
   3316 static int
   3317 oakley_padlen(len, base)
   3318 	int len, base;
   3319 {
   3320 	int padlen;
   3321 
   3322 	padlen = base - len % base;
   3323 
   3324 	if (lcconf->pad_randomlen)
   3325 		padlen += ((eay_random() % (lcconf->pad_maxsize + 1) + 1) *
   3326 		    base);
   3327 
   3328 	return padlen;
   3329 }
   3330 
   3331