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