File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / ipsec-tools / src / racoon / isakmp.c
Revision 1.1.1.2 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Sun Jun 15 16:37:12 2014 UTC (10 years ago) by misho
Branches: ipsec-tools, MAIN
CVS tags: v0_8_2p2, v0_8_1p0, v0_8_1, HEAD
ipsec-tools 0.8.1

    1: /*	$NetBSD: isakmp.c,v 1.71.2.2 2012/08/29 08:55:26 tteras Exp $	*/
    2: 
    3: /* Id: isakmp.c,v 1.74 2006/05/07 21:32:59 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>
   39: #include <sys/queue.h>
   40: 
   41: #include <netinet/in.h>
   42: #include <arpa/inet.h>
   43: 
   44: #include PATH_IPSEC_H
   45: 
   46: #include <stdlib.h>
   47: #include <stdio.h>
   48: #include <string.h>
   49: #include <errno.h>
   50: #if TIME_WITH_SYS_TIME
   51: # include <sys/time.h>
   52: # include <time.h>
   53: #else
   54: # if HAVE_SYS_TIME_H
   55: #  include <sys/time.h>
   56: # else
   57: #  include <time.h>
   58: # endif
   59: #endif
   60: #include <netdb.h>
   61: #ifdef HAVE_UNISTD_H
   62: #include <unistd.h>
   63: #endif
   64: #include <ctype.h>
   65: #ifdef ENABLE_HYBRID
   66: #include <resolv.h>
   67: #endif
   68: 
   69: #include "var.h"
   70: #include "misc.h"
   71: #include "vmbuf.h"
   72: #include "plog.h"
   73: #include "sockmisc.h"
   74: #include "schedule.h"
   75: #include "session.h"
   76: #include "debug.h"
   77: 
   78: #include "remoteconf.h"
   79: #include "localconf.h"
   80: #include "grabmyaddr.h"
   81: #include "admin.h"
   82: #include "privsep.h"
   83: #include "isakmp_var.h"
   84: #include "isakmp.h"
   85: #include "oakley.h"
   86: #include "evt.h"
   87: #include "handler.h"
   88: #include "ipsec_doi.h"
   89: #include "pfkey.h"
   90: #include "crypto_openssl.h"
   91: #include "policy.h"
   92: #include "algorithm.h"
   93: #include "proposal.h"
   94: #include "sainfo.h"
   95: #include "isakmp_ident.h"
   96: #include "isakmp_agg.h"
   97: #include "isakmp_base.h"
   98: #include "isakmp_quick.h"
   99: #include "isakmp_inf.h"
  100: #include "isakmp_newg.h"
  101: #ifdef ENABLE_HYBRID
  102: #include "vendorid.h"
  103: #include "isakmp_xauth.h"
  104: #include "isakmp_unity.h"
  105: #include "isakmp_cfg.h"
  106: #endif
  107: #ifdef ENABLE_FRAG
  108: #include "isakmp_frag.h"
  109: #endif
  110: #include "strnames.h"
  111: 
  112: #include <fcntl.h>
  113: 
  114: #ifdef ENABLE_NATT
  115: # include "nattraversal.h"
  116: #endif
  117: # ifdef __linux__
  118: #  include <linux/udp.h>
  119: #  include <linux/ip.h>
  120: #  ifndef SOL_UDP
  121: #   define SOL_UDP 17
  122: #  endif
  123: # endif /* __linux__ */
  124: # if defined(__NetBSD__) || defined(__FreeBSD__) ||	\
  125:   (defined(__APPLE__) && defined(__MACH__))
  126: #  include <netinet/in.h>
  127: #  include <netinet/udp.h>
  128: #  include <netinet/in_systm.h>
  129: #  include <netinet/ip.h>
  130: #  define SOL_UDP IPPROTO_UDP
  131: # endif /* __NetBSD__ / __FreeBSD__ */
  132: 
  133: static int nostate1 __P((struct ph1handle *, vchar_t *));
  134: static int nostate2 __P((struct ph2handle *, vchar_t *));
  135: 
  136: extern caddr_t val2str(const char *, size_t);
  137: 
  138: static int (*ph1exchange[][2][PHASE1ST_MAX])
  139: 	__P((struct ph1handle *, vchar_t *)) = {
  140:  /* error */
  141:  { { 0 }, { 0 }, },
  142:  /* Identity Protection exchange */
  143:  {
  144:   { nostate1, ident_i1send, nostate1, ident_i2recv, ident_i2send,
  145:     ident_i3recv, ident_i3send, ident_i4recv, ident_i4send, nostate1, nostate1,},
  146:   { nostate1, ident_r1recv, ident_r1send, ident_r2recv, ident_r2send,
  147:     ident_r3recv, ident_r3send, nostate1, nostate1, nostate1, nostate1, },
  148:  },
  149:  /* Aggressive exchange */
  150:  {
  151:   { nostate1, agg_i1send, nostate1, agg_i2recv, agg_i2send,
  152:     nostate1, nostate1, nostate1, nostate1, nostate1, nostate1, },
  153:   { nostate1, agg_r1recv, agg_r1send, agg_r2recv, agg_r2send,
  154:     nostate1, nostate1, nostate1, nostate1, nostate1, nostate1, },
  155:  },
  156:  /* Base exchange */
  157:  {
  158:   { nostate1, base_i1send, nostate1, base_i2recv, base_i2send,
  159:     base_i3recv, base_i3send, nostate1, nostate1, nostate1, nostate1, },
  160:   { nostate1, base_r1recv, base_r1send, base_r2recv, base_r2send,
  161:     nostate1, nostate1, nostate1, nostate1, nostate1, nostate1, },
  162:  },
  163: };
  164: 
  165: static int (*ph2exchange[][2][PHASE2ST_MAX])
  166: 	__P((struct ph2handle *, vchar_t *)) = {
  167:  /* error */
  168:  { { 0 }, { 0 }, },
  169:  /* Quick mode for IKE */
  170:  {
  171:   { nostate2, nostate2, quick_i1prep, nostate2, quick_i1send,
  172:     quick_i2recv, quick_i2send, quick_i3recv, nostate2, nostate2, },
  173:   { nostate2, quick_r1recv, quick_r1prep, nostate2, quick_r2send,
  174:     quick_r3recv, quick_r3prep, quick_r3send, nostate2, nostate2, }
  175:  },
  176: };
  177: 
  178: static u_char r_ck0[] = { 0,0,0,0,0,0,0,0 }; /* used to verify the r_ck. */
  179: 
  180: static int isakmp_main __P((vchar_t *, struct sockaddr *, struct sockaddr *));
  181: static int ph1_main __P((struct ph1handle *, vchar_t *));
  182: static int quick_main __P((struct ph2handle *, vchar_t *));
  183: static int isakmp_ph1begin_r __P((vchar_t *,
  184: 	struct sockaddr *, struct sockaddr *, u_int8_t));
  185: static int isakmp_ph2begin_i __P((struct ph1handle *, struct ph2handle *));
  186: static int isakmp_ph2begin_r __P((struct ph1handle *, vchar_t *));
  187: static int etypesw1 __P((int));
  188: static int etypesw2 __P((int));
  189: static int isakmp_ph1resend __P((struct ph1handle *));
  190: static int isakmp_ph2resend __P((struct ph2handle *));
  191: 
  192: #ifdef ENABLE_FRAG
  193: static int frag_handler(struct ph1handle *,
  194:     vchar_t *, struct sockaddr *, struct sockaddr *);
  195: #endif
  196: 
  197: /*
  198:  * isakmp packet handler
  199:  */
  200: static int
  201: isakmp_handler(ctx, so_isakmp)
  202:         void *ctx;
  203: 	int so_isakmp;
  204: {
  205: 	struct isakmp isakmp;
  206: 	union {
  207: 		char		buf[sizeof (isakmp) + 4];
  208: 		u_int32_t	non_esp[2];
  209: 		struct		{
  210: 				     struct udphdr udp;
  211: #ifdef __linux
  212: 				     struct iphdr ip;
  213: #else
  214: 				     struct ip ip;
  215: #endif
  216: 				     char buf[sizeof(isakmp) + 4];
  217: 				} lbuf;
  218: 	} x;
  219: 	struct sockaddr_storage remote;
  220: 	struct sockaddr_storage local;
  221: 	unsigned int remote_len = sizeof(remote);
  222: 	unsigned int local_len = sizeof(local);
  223: 	int len = 0, extralen = 0;
  224: 	vchar_t *buf = NULL, *tmpbuf = NULL;
  225: 	int error = -1, res;
  226: 
  227: 	/* read message by MSG_PEEK */
  228: 	while ((len = recvfromto(so_isakmp, x.buf, sizeof(x),
  229: 		    MSG_PEEK, (struct sockaddr *)&remote, &remote_len,
  230: 		    (struct sockaddr *)&local, &local_len)) < 0) {
  231: 		if (errno == EINTR)
  232: 			continue;
  233: 		plog(LLV_ERROR, LOCATION, NULL,
  234: 			"failed to receive isakmp packet: %s\n",
  235: 			strerror (errno));
  236: 		goto end;
  237: 	}
  238: 
  239: 	/* keep-alive packet - ignore */
  240: 	if (len == 1 && (x.buf[0]&0xff) == 0xff) {
  241: 		/* Pull the keep-alive packet */
  242: 		if ((len = recvfrom(so_isakmp, (char *)x.buf, 1,
  243: 		    0, (struct sockaddr *)&remote, &remote_len)) != 1) {
  244: 			plog(LLV_ERROR, LOCATION, NULL,
  245: 			    "failed to receive keep alive packet: %s\n",
  246: 			    strerror (errno));
  247: 		}
  248: 		goto end;
  249: 	}
  250: 
  251: 	/* Lucent IKE in UDP encapsulation */
  252: 	{
  253: #ifdef __linux__
  254: 		if (ntohs(x.lbuf.udp.dest) == 501) {
  255: 			extralen += sizeof(x.lbuf.udp) + x.lbuf.ip.ihl;
  256: 		}
  257: #else
  258: 		if (ntohs(x.lbuf.udp.uh_dport) == 501) {
  259: 			extralen += sizeof(x.lbuf.udp) + x.lbuf.ip.ip_hl;
  260: 		}
  261: #endif
  262: 	}
  263: 
  264: #ifdef ENABLE_NATT
  265: 	/* we don't know about portchange yet,
  266: 	   look for non-esp marker instead */
  267: 	if (x.non_esp[0] == 0 && x.non_esp[1] != 0)
  268: 		extralen = NON_ESP_MARKER_LEN;
  269: #endif
  270: 
  271: 	/* now we know if there is an extra non-esp
  272: 	   marker at the beginning or not */
  273: 	memcpy ((char *)&isakmp, x.buf + extralen, sizeof (isakmp));
  274: 
  275: 	/* check isakmp header length, as well as sanity of header length */
  276: 	if (len < sizeof(isakmp) || ntohl(isakmp.len) < sizeof(isakmp)) {
  277: 		plog(LLV_ERROR, LOCATION, (struct sockaddr *)&remote,
  278: 			"packet shorter than isakmp header size (%u, %u, %zu)\n",
  279: 			len, ntohl(isakmp.len), sizeof(isakmp));
  280: 		/* dummy receive */
  281: 		if ((len = recvfrom(so_isakmp, (char *)&isakmp, sizeof(isakmp),
  282: 			    0, (struct sockaddr *)&remote, &remote_len)) < 0) {
  283: 			plog(LLV_ERROR, LOCATION, NULL,
  284: 				"failed to receive isakmp packet: %s\n",
  285: 				strerror (errno));
  286: 		}
  287: 		goto end;
  288: 	}
  289: 
  290: 	/* reject it if the size is tooooo big. */
  291: 	if (ntohl(isakmp.len) > 0xffff) {
  292: 		plog(LLV_ERROR, LOCATION, NULL,
  293: 			"the length in the isakmp header is too big.\n");
  294: 		if ((len = recvfrom(so_isakmp, (char *)&isakmp, sizeof(isakmp),
  295: 			    0, (struct sockaddr *)&remote, &remote_len)) < 0) {
  296: 			plog(LLV_ERROR, LOCATION, NULL,
  297: 				"failed to receive isakmp packet: %s\n",
  298: 				strerror (errno));
  299: 		}
  300: 		goto end;
  301: 	}
  302: 
  303: 	/* read real message */
  304: 	if ((tmpbuf = vmalloc(ntohl(isakmp.len) + extralen)) == NULL) {
  305: 		plog(LLV_ERROR, LOCATION, NULL,
  306: 			"failed to allocate reading buffer (%u Bytes)\n",
  307: 			ntohl(isakmp.len) + extralen);
  308: 		/* dummy receive */
  309: 		if ((len = recvfrom(so_isakmp, (char *)&isakmp, sizeof(isakmp),
  310: 			    0, (struct sockaddr *)&remote, &remote_len)) < 0) {
  311: 			plog(LLV_ERROR, LOCATION, NULL,
  312: 				"failed to receive isakmp packet: %s\n",
  313: 				strerror (errno));
  314: 		}
  315: 		goto end;
  316: 	}
  317: 
  318: 	while ((len = recvfromto(so_isakmp, (char *)tmpbuf->v, tmpbuf->l,
  319: 	                    0, (struct sockaddr *)&remote, &remote_len,
  320: 	                    (struct sockaddr *)&local, &local_len)) < 0) {
  321: 		if (errno == EINTR)
  322: 			continue;
  323: 		plog(LLV_ERROR, LOCATION, NULL,
  324: 			"failed to receive isakmp packet: %s\n",
  325: 			strerror (errno));
  326: 		goto end;
  327: 	}
  328: 
  329: 	if ((buf = vmalloc(len - extralen)) == NULL) {
  330: 		plog(LLV_ERROR, LOCATION, NULL,
  331: 			"failed to allocate reading buffer (%u Bytes)\n",
  332: 			(len - extralen));
  333: 		goto end;
  334: 	}
  335: 
  336: 	memcpy (buf->v, tmpbuf->v + extralen, buf->l);
  337: 
  338: 	len -= extralen;
  339: 
  340: 	if (len != buf->l) {
  341: 		plog(LLV_ERROR, LOCATION, (struct sockaddr *)&remote,
  342: 			"received invalid length (%d != %zu), why ?\n",
  343: 			len, buf->l);
  344: 		goto end;
  345: 	}
  346: 
  347: 	plog(LLV_DEBUG, LOCATION, NULL, "===\n");
  348: 	plog(LLV_DEBUG, LOCATION, NULL,
  349: 		"%d bytes message received %s\n",
  350: 		len, saddr2str_fromto("from %s to %s",
  351: 			(struct sockaddr *)&remote,
  352: 			(struct sockaddr *)&local));
  353: 	plogdump(LLV_DEBUG, buf->v, buf->l);
  354: 
  355: 	/* avoid packets with malicious port/address */
  356: 	if (extract_port((struct sockaddr *)&remote) == 0) {
  357: 		plog(LLV_ERROR, LOCATION, (struct sockaddr *)&remote,
  358: 			"src port == 0 (valid as UDP but not with IKE)\n");
  359: 		goto end;
  360: 	}
  361: 
  362: 	/* XXX: check sender whether to be allowed or not to accept */
  363: 
  364: 	/* XXX: I don't know how to check isakmp half connection attack. */
  365: 
  366: 	/* simply reply if the packet was processed. */
  367: 	res=check_recvdpkt((struct sockaddr *)&remote,(struct sockaddr *)&local, buf);
  368: 	if (res) {
  369: 		plog(LLV_NOTIFY, LOCATION, NULL,
  370: 			"the packet is retransmitted by %s (%d).\n",
  371: 			 saddr2str((struct sockaddr *)&remote), res);
  372: 		error = 0;
  373: 		goto end;
  374: 	}
  375: 
  376: 	/* isakmp main routine */
  377: 	if (isakmp_main(buf, (struct sockaddr *)&remote,
  378: 			(struct sockaddr *)&local) != 0) goto end;
  379: 
  380: 	error = 0;
  381: 
  382: end:
  383: 	if (tmpbuf != NULL)
  384: 		vfree(tmpbuf);
  385: 	if (buf != NULL)
  386: 		vfree(buf);
  387: 	return error;
  388: }
  389: 
  390: /*
  391:  * main processing to handle isakmp payload
  392:  */
  393: static int
  394: isakmp_main(msg, remote, local)
  395: 	vchar_t *msg;
  396: 	struct sockaddr *remote, *local;
  397: {
  398: 	struct isakmp *isakmp = (struct isakmp *)msg->v;
  399: 	isakmp_index *index = (isakmp_index *)isakmp;
  400: 	u_int32_t msgid = isakmp->msgid;
  401: 	struct ph1handle *iph1;
  402: 
  403: #ifdef HAVE_PRINT_ISAKMP_C
  404: 	isakmp_printpacket(msg, remote, local, 0);
  405: #endif
  406: 
  407: 	/* the initiator's cookie must not be zero */
  408: 	if (memcmp(&isakmp->i_ck, r_ck0, sizeof(cookie_t)) == 0) {
  409: 		plog(LLV_ERROR, LOCATION, remote,
  410: 			"malformed cookie received.\n");
  411: 		return -1;
  412: 	}
  413: 
  414: 	/* Check the Major and Minor Version fields. */
  415: 	/*
  416: 	 * XXX Is is right to check version here ?
  417: 	 * I think it may no be here because the version depends
  418: 	 * on exchange status.
  419: 	 */
  420: 	if (isakmp->v < ISAKMP_VERSION_NUMBER) {
  421: 		if (ISAKMP_GETMAJORV(isakmp->v) < ISAKMP_MAJOR_VERSION) {
  422: 			plog(LLV_ERROR, LOCATION, remote,
  423: 				"invalid major version %d.\n",
  424: 				ISAKMP_GETMAJORV(isakmp->v));
  425: 			return -1;
  426: 		}
  427: #if ISAKMP_MINOR_VERSION > 0
  428: 		if (ISAKMP_GETMINORV(isakmp->v) < ISAKMP_MINOR_VERSION) {
  429: 			plog(LLV_ERROR, LOCATION, remote,
  430: 				"invalid minor version %d.\n",
  431: 				ISAKMP_GETMINORV(isakmp->v));
  432: 			return -1;
  433: 		}
  434: #endif
  435: 	}
  436: 
  437: 	/* check the Flags field. */
  438: 	/* XXX How is the exclusive check, E and A ? */
  439: 	if (isakmp->flags & ~(ISAKMP_FLAG_E | ISAKMP_FLAG_C | ISAKMP_FLAG_A)) {
  440: 		plog(LLV_ERROR, LOCATION, remote,
  441: 			"invalid flag 0x%02x.\n", isakmp->flags);
  442: 		return -1;
  443: 	}
  444: 
  445: 	/* ignore commit bit. */
  446: 	if (ISSET(isakmp->flags, ISAKMP_FLAG_C)) {
  447: 		if (isakmp->msgid == 0) {
  448: 			isakmp_info_send_nx(isakmp, remote, local,
  449: 				ISAKMP_NTYPE_INVALID_FLAGS, NULL);
  450: 			plog(LLV_ERROR, LOCATION, remote,
  451: 				"Commit bit on phase1 forbidden.\n");
  452: 			return -1;
  453: 		}
  454: 	}
  455: 
  456: 	iph1 = getph1byindex(index);
  457: 	if (iph1 != NULL) {
  458: 		/* validity check */
  459: 		if (memcmp(&isakmp->r_ck, r_ck0, sizeof(cookie_t)) == 0 &&
  460: 		    iph1->side == INITIATOR) {
  461: 			plog(LLV_DEBUG, LOCATION, remote,
  462: 				"malformed cookie received or "
  463: 				"the initiator's cookies collide.\n");
  464: 			return -1;
  465: 		}
  466: 
  467: #ifdef ENABLE_NATT
  468: 		/* Floating ports for NAT-T */
  469: 		if (NATT_AVAILABLE(iph1) &&
  470: 		    ! (iph1->natt_flags & NAT_PORTS_CHANGED) &&
  471: 		    ((cmpsaddr(iph1->remote, remote) != CMPSADDR_MATCH) ||
  472: 		     (cmpsaddr(iph1->local, local) != CMPSADDR_MATCH)))
  473: 		{
  474: 			/* prevent memory leak */
  475: 			racoon_free(iph1->remote);
  476: 			racoon_free(iph1->local);
  477: 			iph1->remote = NULL;
  478: 			iph1->local = NULL;
  479: 
  480: 			/* copy-in new addresses */
  481: 			iph1->remote = dupsaddr(remote);
  482: 			if (iph1->remote == NULL) {
  483:            			plog(LLV_ERROR, LOCATION, iph1->remote,
  484: 				   "phase1 failed: dupsaddr failed.\n");
  485: 				remph1(iph1);
  486: 				delph1(iph1);
  487: 				return -1;
  488: 			}
  489: 			iph1->local = dupsaddr(local);
  490: 			if (iph1->local == NULL) {
  491:            			plog(LLV_ERROR, LOCATION, iph1->remote,
  492: 				   "phase1 failed: dupsaddr failed.\n");
  493: 				remph1(iph1);
  494: 				delph1(iph1);
  495: 				return -1;
  496: 			}
  497: 
  498: 			/* set the flag to prevent further port floating
  499: 			   (FIXME: should we allow it? E.g. when the NAT gw
  500: 			    is rebooted?) */
  501: 			iph1->natt_flags |= NAT_PORTS_CHANGED | NAT_ADD_NON_ESP_MARKER;
  502: 
  503: 			/* print some neat info */
  504: 			plog (LLV_INFO, LOCATION, NULL,
  505: 			      "NAT-T: ports changed to: %s\n",
  506: 			      saddr2str_fromto ("%s<->%s", iph1->remote, iph1->local));
  507: 
  508: 			natt_keepalive_add_ph1 (iph1);
  509: 		}
  510: #endif
  511: 
  512: 		/* must be same addresses in one stream of a phase at least. */
  513: 		if (cmpsaddr(iph1->remote, remote) != CMPSADDR_MATCH) {
  514: 			char *saddr_db, *saddr_act;
  515: 
  516: 			saddr_db = racoon_strdup(saddr2str(iph1->remote));
  517: 			saddr_act = racoon_strdup(saddr2str(remote));
  518: 			STRDUP_FATAL(saddr_db);
  519: 			STRDUP_FATAL(saddr_act);
  520: 
  521: 			plog(LLV_WARNING, LOCATION, remote,
  522: 				"remote address mismatched. db=%s, act=%s\n",
  523: 				saddr_db, saddr_act);
  524: 
  525: 			racoon_free(saddr_db);
  526: 			racoon_free(saddr_act);
  527: 		}
  528: 
  529: 		/*
  530: 		 * don't check of exchange type here because other type will be
  531: 		 * with same index, for example, informational exchange.
  532: 		 */
  533: 
  534: 		/* XXX more acceptable check */
  535: 	}
  536: 
  537: 	switch (isakmp->etype) {
  538: 	case ISAKMP_ETYPE_IDENT:
  539: 	case ISAKMP_ETYPE_AGG:
  540: 	case ISAKMP_ETYPE_BASE:
  541: 		/* phase 1 validity check */
  542: 		if (isakmp->msgid != 0) {
  543: 			plog(LLV_ERROR, LOCATION, remote,
  544: 				"message id should be zero in phase1.\n");
  545: 			return -1;
  546: 		}
  547: 
  548: 		/* search for isakmp status record of phase 1 */
  549: 		if (iph1 == NULL) {
  550: 			/*
  551: 			 * the packet must be the 1st message from a initiator
  552: 			 * or the 2nd message from the responder.
  553: 			 */
  554: 
  555: 			/* search for phase1 handle by index without r_ck */
  556: 			iph1 = getph1byindex0(index);
  557: 			if (iph1 == NULL) {
  558: 				/*it must be the 1st message from a initiator.*/
  559: 				if (memcmp(&isakmp->r_ck, r_ck0,
  560: 					sizeof(cookie_t)) != 0) {
  561: 
  562: 					plog(LLV_DEBUG, LOCATION, remote,
  563: 						"malformed cookie received "
  564: 						"or the spi expired.\n");
  565: 					return -1;
  566: 				}
  567: 
  568: 				/* it must be responder's 1st exchange. */
  569: 				if (isakmp_ph1begin_r(msg, remote, local,
  570: 					isakmp->etype) < 0)
  571: 					return -1;
  572: 				break;
  573: 
  574: 				/*NOTREACHED*/
  575: 			}
  576: 
  577: 			/* it must be the 2nd message from the responder. */
  578: 			if (iph1->side != INITIATOR) {
  579: 				plog(LLV_DEBUG, LOCATION, remote,
  580: 					"malformed cookie received. "
  581: 					"it has to be as the initiator.  %s\n",
  582: 					isakmp_pindex(&iph1->index, 0));
  583: 				return -1;
  584: 			}
  585: 		}
  586: 
  587: 		/*
  588: 		 * Don't delete phase 1 handler when the exchange type
  589: 		 * in handler is not equal to packet's one because of no
  590: 		 * authencication completed.
  591: 		 */
  592: 		if (iph1->etype != isakmp->etype) {
  593: 			plog(LLV_ERROR, LOCATION, iph1->remote,
  594: 				"exchange type is mismatched: "
  595: 				"db=%s packet=%s, ignore it.\n",
  596: 				s_isakmp_etype(iph1->etype),
  597: 				s_isakmp_etype(isakmp->etype));
  598: 			return -1;
  599: 		}
  600: 
  601: #ifdef ENABLE_FRAG
  602: 		if (isakmp->np == ISAKMP_NPTYPE_FRAG)
  603: 			return frag_handler(iph1, msg, remote, local);
  604: #endif
  605: 
  606: 		/* call main process of phase 1 */
  607: 		if (ph1_main(iph1, msg) < 0) {
  608: 			plog(LLV_ERROR, LOCATION, iph1->remote,
  609: 				"phase1 negotiation failed.\n");
  610: 			remph1(iph1);
  611: 			delph1(iph1);
  612: 			return -1;
  613: 		}
  614: 		break;
  615: 
  616: 	case ISAKMP_ETYPE_AUTH:
  617: 		plog(LLV_INFO, LOCATION, remote,
  618: 			"unsupported exchange %d received.\n",
  619: 			isakmp->etype);
  620: 		break;
  621: 
  622: 	case ISAKMP_ETYPE_INFO:
  623: 	case ISAKMP_ETYPE_ACKINFO:
  624: 		/*
  625: 		 * iph1 must be present for Information message.
  626: 		 * if iph1 is null then trying to get the phase1 status
  627: 		 * as the packet from responder againt initiator's 1st
  628: 		 * exchange in phase 1.
  629: 		 * NOTE: We think such informational exchange should be ignored.
  630: 		 */
  631: 		if (iph1 == NULL) {
  632: 			iph1 = getph1byindex0(index);
  633: 			if (iph1 == NULL) {
  634: 				plog(LLV_ERROR, LOCATION, remote,
  635: 					"unknown Informational "
  636: 					"exchange received.\n");
  637: 				return -1;
  638: 			}
  639: 			if (cmpsaddr(iph1->remote, remote) != CMPSADDR_MATCH) {
  640: 				plog(LLV_WARNING, LOCATION, remote,
  641: 					"remote address mismatched. "
  642: 					"db=%s\n",
  643: 					saddr2str(iph1->remote));
  644: 			}
  645: 		}
  646: 
  647: #ifdef ENABLE_FRAG
  648: 		if (isakmp->np == ISAKMP_NPTYPE_FRAG)
  649: 			return frag_handler(iph1, msg, remote, local);
  650: #endif
  651: 
  652: 		if (isakmp_info_recv(iph1, msg) < 0)
  653: 			return -1;
  654: 		break;
  655: 
  656: 	case ISAKMP_ETYPE_QUICK:
  657: 	{
  658: 		struct ph2handle *iph2;
  659: 
  660: 		if (iph1 == NULL) {
  661: 			isakmp_info_send_nx(isakmp, remote, local,
  662: 				ISAKMP_NTYPE_INVALID_COOKIE, NULL);
  663: 			plog(LLV_ERROR, LOCATION, remote,
  664: 				"can't start the quick mode, "
  665: 				"there is no ISAKMP-SA, %s\n",
  666: 				isakmp_pindex((isakmp_index *)&isakmp->i_ck,
  667: 					isakmp->msgid));
  668: 			return -1;
  669: 		}
  670: #ifdef ENABLE_HYBRID
  671: 		/* Reinit the IVM if it's still there */
  672: 		if (iph1->mode_cfg && iph1->mode_cfg->ivm) {
  673: 			oakley_delivm(iph1->mode_cfg->ivm);
  674: 			iph1->mode_cfg->ivm = NULL;
  675: 		}
  676: #endif
  677: #ifdef ENABLE_FRAG
  678: 		if (isakmp->np == ISAKMP_NPTYPE_FRAG)
  679: 			return frag_handler(iph1, msg, remote, local);
  680: #endif
  681: 
  682: 		/* check status of phase 1 whether negotiated or not. */
  683: 		if (iph1->status != PHASE1ST_ESTABLISHED &&
  684: 		    iph1->status != PHASE1ST_DYING) {
  685: 			plog(LLV_ERROR, LOCATION, remote,
  686: 				"can't start the quick mode, "
  687: 				"there is no valid ISAKMP-SA, %s\n",
  688: 				isakmp_pindex(&iph1->index, iph1->msgid));
  689: 			return -1;
  690: 		}
  691: 
  692: 		/* search isakmp phase 2 stauts record. */
  693: 		iph2 = getph2bymsgid(iph1, msgid);
  694: 		if (iph2 == NULL) {
  695: 			/* it must be new negotiation as responder */
  696: 			if (isakmp_ph2begin_r(iph1, msg) < 0)
  697: 				return -1;
  698: 			return 0;
  699: 			/*NOTREACHED*/
  700: 		}
  701: 
  702: 		/* commit bit. */
  703: 		/* XXX
  704: 		 * we keep to set commit bit during negotiation.
  705: 		 * When SA is configured, bit will be reset.
  706: 		 * XXX
  707: 		 * don't initiate commit bit.  should be fixed in the future.
  708: 		 */
  709: 		if (ISSET(isakmp->flags, ISAKMP_FLAG_C))
  710: 			iph2->flags |= ISAKMP_FLAG_C;
  711: 
  712: 		/* call main process of quick mode */
  713: 		if (quick_main(iph2, msg) < 0) {
  714: 			plog(LLV_ERROR, LOCATION, iph1->remote,
  715: 				"phase2 negotiation failed.\n");
  716: 			remph2(iph2);
  717: 			delph2(iph2);
  718: 			return -1;
  719: 		}
  720: 	}
  721: 		break;
  722: 
  723: 	case ISAKMP_ETYPE_NEWGRP:
  724: 		if (iph1 == NULL) {
  725: 			plog(LLV_ERROR, LOCATION, remote,
  726: 				"Unknown new group mode exchange, "
  727: 				"there is no ISAKMP-SA.\n");
  728: 			return -1;
  729: 		}
  730: 
  731: #ifdef ENABLE_FRAG
  732: 		if (isakmp->np == ISAKMP_NPTYPE_FRAG)
  733: 			return frag_handler(iph1, msg, remote, local);
  734: #endif
  735: 
  736: 		isakmp_newgroup_r(iph1, msg);
  737: 		break;
  738: 
  739: #ifdef ENABLE_HYBRID
  740: 	case ISAKMP_ETYPE_CFG:
  741: 		if (iph1 == NULL) {
  742: 			plog(LLV_ERROR, LOCATION, NULL,
  743: 			     "mode config %d from %s, "
  744: 			     "but we have no ISAKMP-SA.\n",
  745: 			     isakmp->etype, saddr2str(remote));
  746: 			return -1;
  747: 		}
  748: 
  749: #ifdef ENABLE_FRAG
  750: 		if (isakmp->np == ISAKMP_NPTYPE_FRAG)
  751: 			return frag_handler(iph1, msg, remote, local);
  752: #endif
  753: 
  754: 		isakmp_cfg_r(iph1, msg);
  755: 		break;
  756: #endif
  757: 
  758: 	case ISAKMP_ETYPE_NONE:
  759: 	default:
  760: 		plog(LLV_ERROR, LOCATION, NULL,
  761: 			"Invalid exchange type %d from %s.\n",
  762: 			isakmp->etype, saddr2str(remote));
  763: 		return -1;
  764: 	}
  765: 
  766: 	return 0;
  767: }
  768: 
  769: /*
  770:  * main function of phase 1.
  771:  */
  772: static int
  773: ph1_main(iph1, msg)
  774: 	struct ph1handle *iph1;
  775: 	vchar_t *msg;
  776: {
  777: 	int error;
  778: #ifdef ENABLE_STATS
  779: 	struct timeval start, end;
  780: #endif
  781: 
  782: 	/* ignore a packet */
  783: 	if (iph1->status >= PHASE1ST_ESTABLISHED)
  784: 		return 0;
  785: 
  786: #ifdef ENABLE_STATS
  787: 	gettimeofday(&start, NULL);
  788: #endif
  789: 	/* receive */
  790: 	if (ph1exchange[etypesw1(iph1->etype)]
  791: 		       [iph1->side]
  792: 		       [iph1->status] == NULL) {
  793: 		plog(LLV_ERROR, LOCATION, iph1->remote,
  794: 			"why isn't the function defined.\n");
  795: 		return -1;
  796: 	}
  797: 	error = (ph1exchange[etypesw1(iph1->etype)]
  798: 			    [iph1->side]
  799: 			    [iph1->status])(iph1, msg);
  800: 	if (error != 0) {
  801: 
  802: 		/* XXX
  803: 		 * When an invalid packet is received on phase1, it should
  804: 		 * be selected to process this packet.  That is to respond
  805: 		 * with a notify and delete phase 1 handler, OR not to respond
  806: 		 * and keep phase 1 handler. However, in PHASE1ST_START when
  807: 		 * acting as RESPONDER we must not keep phase 1 handler or else
  808: 		 * it will stay forever.
  809: 		 */
  810: 
  811: 		if (iph1->side == RESPONDER && iph1->status == PHASE1ST_START) {
  812: 			plog(LLV_ERROR, LOCATION, iph1->remote,
  813: 				"failed to pre-process ph1 packet (side: %d, status %d).\n",
  814: 				iph1->side, iph1->status);
  815: 			return -1;
  816: 		} else {
  817: 			/* ignore the error and keep phase 1 handler */
  818: 			return 0;
  819: 		}
  820: 	}
  821: 
  822: #ifndef ENABLE_FRAG
  823: 	/* free resend buffer */
  824: 	if (iph1->sendbuf == NULL) {
  825: 		plog(LLV_ERROR, LOCATION, NULL,
  826: 			"no buffer found as sendbuf\n");
  827: 		return -1;
  828: 	}
  829: #endif
  830: 
  831: 	VPTRINIT(iph1->sendbuf);
  832: 
  833: 	/* turn off schedule */
  834: 	sched_cancel(&iph1->scr);
  835: 
  836: 	/* send */
  837: 	plog(LLV_DEBUG, LOCATION, NULL, "===\n");
  838: 	if ((ph1exchange[etypesw1(iph1->etype)]
  839: 			[iph1->side]
  840: 			[iph1->status])(iph1, msg) != 0) {
  841: 		plog(LLV_ERROR, LOCATION, iph1->remote,
  842: 			"failed to process ph1 packet (side: %d, status: %d).\n",
  843: 			iph1->side, iph1->status);
  844: 		return -1;
  845: 	}
  846: 
  847: #ifdef ENABLE_STATS
  848: 	gettimeofday(&end, NULL);
  849: 	syslog(LOG_NOTICE, "%s(%s): %8.6f",
  850: 		"phase1", s_isakmp_state(iph1->etype, iph1->side, iph1->status),
  851: 		timedelta(&start, &end));
  852: #endif
  853: 	if (iph1->status == PHASE1ST_ESTABLISHED) {
  854: 
  855: #ifdef ENABLE_STATS
  856: 		gettimeofday(&iph1->end, NULL);
  857: 		syslog(LOG_NOTICE, "%s(%s): %8.6f",
  858: 			"phase1", s_isakmp_etype(iph1->etype),
  859: 			timedelta(&iph1->start, &iph1->end));
  860: #endif
  861: 
  862: 		/* save created date. */
  863: 		(void)time(&iph1->created);
  864: 
  865: 		/* migrate ph2s from dying ph1s */
  866: 		migrate_dying_ph12(iph1);
  867: 
  868: 		/* add to the schedule to expire, and seve back pointer. */
  869: 		if (ph1_rekey_enabled(iph1)) {
  870: 			sched_schedule(&iph1->sce,
  871: 				       iph1->approval->lifetime *
  872: 				       PFKEY_SOFT_LIFETIME_RATE / 100,
  873: 				       isakmp_ph1dying_stub);
  874: 		} else {
  875: 			sched_schedule(&iph1->sce, iph1->approval->lifetime,
  876: 				       isakmp_ph1expire_stub);
  877: 		}
  878: 
  879: #ifdef ENABLE_HYBRID
  880: 		if (iph1->mode_cfg->flags & ISAKMP_CFG_VENDORID_XAUTH) {
  881: 			switch (iph1->approval->authmethod) {
  882: 			case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_R:
  883: 			case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_R:
  884: 			case OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_R:
  885: 			case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_R:
  886: 			case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_R:
  887: 			case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_R:
  888: 			case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_R:
  889: 				xauth_sendreq(iph1);
  890: 				/* XXX Don't process INITIAL_CONTACT */
  891: 				iph1->rmconf->ini_contact = 0;
  892: 				break;
  893: 			default:
  894: 				break;
  895: 			}
  896: 		}
  897: #endif
  898: #ifdef ENABLE_DPD
  899: 		/* Schedule the r_u_there.... */
  900: 		if(iph1->dpd_support && iph1->rmconf->dpd_interval)
  901: 			isakmp_sched_r_u(iph1, 0);
  902: #endif
  903: 
  904: 		/* INITIAL-CONTACT processing */
  905: 		/* don't anything if local test mode. */
  906: 		if (!f_local
  907: 		 && iph1->rmconf->ini_contact && !getcontacted(iph1->remote)) {
  908: 			/* send INITIAL-CONTACT */
  909: 			isakmp_info_send_n1(iph1,
  910: 					ISAKMP_NTYPE_INITIAL_CONTACT, NULL);
  911: 			/* insert a node into contacted list. */
  912: 			if (inscontacted(iph1->remote) == -1) {
  913: 				plog(LLV_ERROR, LOCATION, iph1->remote,
  914: 					"failed to add contacted list.\n");
  915: 				/* ignore */
  916: 			}
  917: 		}
  918: 		if (iph1->initial_contact_received)
  919: 			isakmp_info_recv_initialcontact(iph1, NULL);
  920: 
  921: 		log_ph1established(iph1);
  922: 		plog(LLV_DEBUG, LOCATION, NULL, "===\n");
  923: 
  924: 		/*
  925: 		 * SA up shell script hook: do it now,except if
  926: 		 * ISAKMP mode config was requested. In the later
  927: 		 * case it is done when we receive the configuration.
  928: 		 */
  929: 		if ((iph1->status == PHASE1ST_ESTABLISHED) &&
  930: 		    !iph1->rmconf->mode_cfg) {
  931: 			switch (iph1->approval->authmethod) {
  932: #ifdef ENABLE_HYBRID
  933: 			case OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_R:
  934: 			case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_R:
  935: 			case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_R:
  936: 			/* Unimplemeted... */
  937: 			case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_R:
  938: 			case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_R:
  939: 			case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_R:
  940: 			case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_R:
  941: 				break;
  942: #endif
  943: 			default:
  944: 				script_hook(iph1, SCRIPT_PHASE1_UP);
  945: 				break;
  946: 			}
  947: 		}
  948: 	}
  949: 
  950: 	return 0;
  951: }
  952: 
  953: /*
  954:  * main function of quick mode.
  955:  */
  956: static int
  957: quick_main(iph2, msg)
  958: 	struct ph2handle *iph2;
  959: 	vchar_t *msg;
  960: {
  961: 	struct isakmp *isakmp = (struct isakmp *)msg->v;
  962: 	int error;
  963: #ifdef ENABLE_STATS
  964: 	struct timeval start, end;
  965: #endif
  966: 
  967: 	/* ignore a packet */
  968: 	if (iph2->status == PHASE2ST_ESTABLISHED
  969: 	 || iph2->status == PHASE2ST_GETSPISENT)
  970: 		return 0;
  971: 
  972: #ifdef ENABLE_STATS
  973: 	gettimeofday(&start, NULL);
  974: #endif
  975: 
  976: 	/* receive */
  977: 	if (ph2exchange[etypesw2(isakmp->etype)]
  978: 		       [iph2->side]
  979: 		       [iph2->status] == NULL) {
  980: 		plog(LLV_ERROR, LOCATION, iph2->ph1->remote,
  981: 			"why isn't the function defined.\n");
  982: 		return -1;
  983: 	}
  984: 	error = (ph2exchange[etypesw2(isakmp->etype)]
  985: 			    [iph2->side]
  986: 			    [iph2->status])(iph2, msg);
  987: 	if (error != 0) {
  988: 		plog(LLV_ERROR, LOCATION, iph2->ph1->remote,
  989: 			"failed to pre-process ph2 packet (side: %d, status %d).\n",
  990: 			iph2->side, iph2->status);
  991: 		if (error == ISAKMP_INTERNAL_ERROR)
  992: 			return 0;
  993: 		isakmp_info_send_n1(iph2->ph1, error, NULL);
  994: 		return -1;
  995: 	}
  996: 
  997: 	/* when using commit bit, status will be reached here. */
  998: 	if (iph2->status == PHASE2ST_ADDSA)
  999: 		return 0;
 1000: 
 1001: 	/* free resend buffer */
 1002: 	if (iph2->sendbuf == NULL) {
 1003: 		plog(LLV_ERROR, LOCATION, NULL,
 1004: 			"no buffer found as sendbuf\n");
 1005: 		return -1;
 1006: 	}
 1007: 	VPTRINIT(iph2->sendbuf);
 1008: 
 1009: 	/* turn off schedule */
 1010: 	sched_cancel(&iph2->scr);
 1011: 
 1012: 	/* send */
 1013: 	plog(LLV_DEBUG, LOCATION, NULL, "===\n");
 1014: 	if ((ph2exchange[etypesw2(isakmp->etype)]
 1015: 			[iph2->side]
 1016: 			[iph2->status])(iph2, msg) != 0) {
 1017: 		plog(LLV_ERROR, LOCATION, iph2->ph1->remote,
 1018: 			"failed to process ph2 packet (side: %d, status: %d).\n",
 1019: 			iph2->side, iph2->status);
 1020: 		return -1;
 1021: 	}
 1022: 
 1023: #ifdef ENABLE_STATS
 1024: 	gettimeofday(&end, NULL);
 1025: 	syslog(LOG_NOTICE, "%s(%s): %8.6f",
 1026: 		"phase2",
 1027: 		s_isakmp_state(ISAKMP_ETYPE_QUICK, iph2->side, iph2->status),
 1028: 		timedelta(&start, &end));
 1029: #endif
 1030: 
 1031: 	return 0;
 1032: }
 1033: 
 1034: /* new negotiation of phase 1 for initiator */
 1035: struct ph1handle *
 1036: isakmp_ph1begin_i(rmconf, remote, local)
 1037: 	struct remoteconf *rmconf;
 1038: 	struct sockaddr *remote, *local;
 1039: {
 1040: 	struct ph1handle *iph1;
 1041: #ifdef ENABLE_STATS
 1042: 	struct timeval start, end;
 1043: #endif
 1044: 
 1045: 	/* get new entry to isakmp status table. */
 1046: 	iph1 = newph1();
 1047: 	if (iph1 == NULL)
 1048: 		return NULL;
 1049: 
 1050: 	iph1->status = PHASE1ST_START;
 1051: 	iph1->rmconf = rmconf;
 1052: 	iph1->side = INITIATOR;
 1053: 	iph1->version = ISAKMP_VERSION_NUMBER;
 1054: 	iph1->msgid = 0;
 1055: 	iph1->flags = 0;
 1056: 	iph1->ph2cnt = 0;
 1057: #ifdef HAVE_GSSAPI
 1058: 	iph1->gssapi_state = NULL;
 1059: #endif
 1060: #ifdef ENABLE_HYBRID
 1061: 	if ((iph1->mode_cfg = isakmp_cfg_mkstate()) == NULL) {
 1062: 		delph1(iph1);
 1063: 		return NULL;
 1064: 	}
 1065: #endif
 1066: #ifdef ENABLE_FRAG
 1067: 
 1068: 	if(rmconf->ike_frag == ISAKMP_FRAG_FORCE)
 1069: 		iph1->frag = 1;
 1070: 	else
 1071: 		iph1->frag = 0;
 1072: 	iph1->frag_chain = NULL;
 1073: #endif
 1074: 	iph1->approval = NULL;
 1075: 
 1076: 	/* XXX copy remote address */
 1077: 	if (copy_ph1addresses(iph1, rmconf, remote, local) < 0) {
 1078: 		delph1(iph1);
 1079: 		return NULL;
 1080: 	}
 1081: 
 1082: 	(void)insph1(iph1);
 1083: 
 1084: 	/* start phase 1 exchange */
 1085: 	iph1->etype = rmconf->etypes->type;
 1086: 
 1087: 	plog(LLV_DEBUG, LOCATION, NULL, "===\n");
 1088:     {
 1089: 	char *a;
 1090: 
 1091: 	a = racoon_strdup(saddr2str(iph1->local));
 1092: 	STRDUP_FATAL(a);
 1093: 
 1094: 	plog(LLV_INFO, LOCATION, NULL,
 1095: 		"initiate new phase 1 negotiation: %s<=>%s\n",
 1096: 		a, saddr2str(iph1->remote));
 1097: 	racoon_free(a);
 1098:     }
 1099: 	plog(LLV_INFO, LOCATION, NULL,
 1100: 		"begin %s mode.\n",
 1101: 		s_isakmp_etype(iph1->etype));
 1102: 
 1103: #ifdef ENABLE_STATS
 1104: 	gettimeofday(&iph1->start, NULL);
 1105: 	gettimeofday(&start, NULL);
 1106: #endif
 1107: 	/* start exchange */
 1108: 	if ((ph1exchange[etypesw1(iph1->etype)]
 1109: 			[iph1->side]
 1110: 			[iph1->status])(iph1, NULL) != 0) {
 1111: 		/* failed to start phase 1 negotiation */
 1112: 		remph1(iph1);
 1113: 		delph1(iph1);
 1114: 
 1115: 		return NULL;
 1116: 	}
 1117: 
 1118: #ifdef ENABLE_STATS
 1119: 	gettimeofday(&end, NULL);
 1120: 	syslog(LOG_NOTICE, "%s(%s): %8.6f",
 1121: 		"phase1",
 1122: 		s_isakmp_state(iph1->etype, iph1->side, iph1->status),
 1123: 		timedelta(&start, &end));
 1124: #endif
 1125: 
 1126: 	return iph1;
 1127: }
 1128: 
 1129: /* new negotiation of phase 1 for responder */
 1130: static int
 1131: isakmp_ph1begin_r(msg, remote, local, etype)
 1132: 	vchar_t *msg;
 1133: 	struct sockaddr *remote, *local;
 1134: 	u_int8_t etype;
 1135: {
 1136: 	struct isakmp *isakmp = (struct isakmp *)msg->v;
 1137: 	struct ph1handle *iph1;
 1138: 	struct rmconfselector rmsel;
 1139: #ifdef ENABLE_STATS
 1140: 	struct timeval start, end;
 1141: #endif
 1142: 
 1143: 	/* check if this etype is allowed */
 1144: 	memset(&rmsel, 0, sizeof(rmsel));
 1145: 	rmsel.remote = remote;
 1146: 	if (enumrmconf(&rmsel, check_etypeok, (void *) (intptr_t) etype) == 0) {
 1147: 		plog(LLV_ERROR, LOCATION, remote,
 1148: 		     "exchange %s not allowed in any applicable rmconf.\n",
 1149: 		     s_isakmp_etype(etype));
 1150: 		return -1;
 1151: 	}
 1152: 
 1153: 	/* get new entry to isakmp status table. */
 1154: 	iph1 = newph1();
 1155: 	if (iph1 == NULL)
 1156: 		return -1;
 1157: 
 1158: 	memcpy(&iph1->index.i_ck, &isakmp->i_ck, sizeof(iph1->index.i_ck));
 1159: 	iph1->status = PHASE1ST_START;
 1160: 	iph1->flags = 0;
 1161: 	iph1->side = RESPONDER;
 1162: 	iph1->etype = etype;
 1163: 	iph1->version = isakmp->v;
 1164: 	iph1->msgid = 0;
 1165: #ifdef HAVE_GSSAPI
 1166: 	iph1->gssapi_state = NULL;
 1167: #endif
 1168: #ifdef ENABLE_HYBRID
 1169: 	if ((iph1->mode_cfg = isakmp_cfg_mkstate()) == NULL) {
 1170: 		delph1(iph1);
 1171: 		return -1;
 1172: 	}
 1173: #endif
 1174: #ifdef ENABLE_FRAG
 1175: 	iph1->frag = 0;
 1176: 	iph1->frag_chain = NULL;
 1177: #endif
 1178: 	iph1->approval = NULL;
 1179: 
 1180: #ifdef ENABLE_NATT
 1181: 	/* RFC3947 says that we MUST accept new phases1 on NAT-T floated port.
 1182: 	 * We have to setup this flag now to correctly generate the first reply.
 1183: 	 * Don't know if a better check could be done for that ?
 1184: 	 */
 1185: 	if(extract_port(local) == lcconf->port_isakmp_natt)
 1186: 		iph1->natt_flags |= (NAT_PORTS_CHANGED);
 1187: #endif
 1188: 
 1189: 	/* copy remote address; remote and local always contain
 1190: 	 * port numbers so rmconf is not needed */
 1191: 	if (copy_ph1addresses(iph1, NULL, remote, local) < 0) {
 1192: 		delph1(iph1);
 1193: 		return -1;
 1194: 	}
 1195: 	(void)insph1(iph1);
 1196: 
 1197: 	plog(LLV_DEBUG, LOCATION, NULL, "===\n");
 1198:     {
 1199: 	char *a;
 1200: 
 1201: 	a = racoon_strdup(saddr2str(iph1->local));
 1202: 	STRDUP_FATAL(a);
 1203: 
 1204: 	plog(LLV_INFO, LOCATION, NULL,
 1205: 		"respond new phase 1 negotiation: %s<=>%s\n",
 1206: 		a, saddr2str(iph1->remote));
 1207: 	racoon_free(a);
 1208:     }
 1209: 	plog(LLV_INFO, LOCATION, NULL,
 1210: 		"begin %s mode.\n", s_isakmp_etype(etype));
 1211: 
 1212: #ifdef ENABLE_STATS
 1213: 	gettimeofday(&iph1->start, NULL);
 1214: 	gettimeofday(&start, NULL);
 1215: #endif
 1216: 
 1217: #ifndef ENABLE_FRAG
 1218: 
 1219: 	/* start exchange */
 1220: 	if ((ph1exchange[etypesw1(iph1->etype)]
 1221: 	                [iph1->side]
 1222: 	                [iph1->status])(iph1, msg) < 0
 1223: 	 || (ph1exchange[etypesw1(iph1->etype)]
 1224: 			[iph1->side]
 1225: 			[iph1->status])(iph1, msg) < 0) {
 1226: 		plog(LLV_ERROR, LOCATION, remote,
 1227: 			"failed to process ph1 packet (side: %d, status: %d).\n",
 1228: 			iph1->side, iph1->status);
 1229: 		remph1(iph1);
 1230: 		delph1(iph1);
 1231: 		return -1;
 1232: 	}
 1233: 
 1234: #ifdef ENABLE_STATS
 1235: 	gettimeofday(&end, NULL);
 1236: 	syslog(LOG_NOTICE, "%s(%s): %8.6f",
 1237: 		"phase1",
 1238: 		s_isakmp_state(iph1->etype, iph1->side, iph1->status),
 1239: 		timedelta(&start, &end));
 1240: #endif
 1241: 
 1242: 	return 0;
 1243: 
 1244: #else /* ENABLE_FRAG */
 1245: 
 1246: 	/* now that we have a phase1 handle, feed back into our
 1247: 	 * main receive function to catch fragmented packets
 1248: 	 */
 1249: 
 1250: 	return isakmp_main(msg, remote, local);
 1251: 
 1252: #endif /* ENABLE_FRAG */
 1253: 
 1254: }
 1255: 
 1256: /* new negotiation of phase 2 for initiator */
 1257: static int
 1258: isakmp_ph2begin_i(iph1, iph2)
 1259: 	struct ph1handle *iph1;
 1260: 	struct ph2handle *iph2;
 1261: {
 1262: #ifdef ENABLE_HYBRID
 1263: 	if (xauth_check(iph1) != 0) {
 1264: 		plog(LLV_ERROR, LOCATION, NULL,
 1265: 		    "Attempt to start phase 2 whereas Xauth failed\n");
 1266: 		return -1;
 1267: 	}
 1268: #endif
 1269: 
 1270: 	/* fixup ph2 ports for this ph1 */
 1271: 	if (extract_port(iph2->src) == 0)
 1272: 		set_port(iph2->src, extract_port(iph1->local));
 1273: 	if (extract_port(iph2->dst) == 0)
 1274: 		set_port(iph2->dst, extract_port(iph1->remote));
 1275: 
 1276: 	/* found ISAKMP-SA. */
 1277: 	plog(LLV_DEBUG, LOCATION, NULL, "===\n");
 1278: 	plog(LLV_DEBUG, LOCATION, NULL, "begin QUICK mode.\n");
 1279:     {
 1280: 	char *a;
 1281: 	a = racoon_strdup(saddr2str(iph2->src));
 1282: 	STRDUP_FATAL(a);
 1283: 
 1284: 	plog(LLV_INFO, LOCATION, NULL,
 1285: 		"initiate new phase 2 negotiation: %s<=>%s\n",
 1286: 		a, saddr2str(iph2->dst));
 1287: 	racoon_free(a);
 1288:     }
 1289: 
 1290: #ifdef ENABLE_STATS
 1291: 	gettimeofday(&iph2->start, NULL);
 1292: #endif
 1293: 	if (iph2->status != PHASE2ST_EXPIRED) /* Phase 1 is already bound (ongoing rekeying) */
 1294: 		bindph12(iph1, iph2);
 1295: 	iph2->status = PHASE2ST_STATUS2;
 1296: 
 1297: 	if ((ph2exchange[etypesw2(ISAKMP_ETYPE_QUICK)]
 1298: 			 [iph2->side]
 1299: 			 [iph2->status])(iph2, NULL) < 0) {
 1300: 		/* release ipsecsa handler due to internal error. */
 1301: 		remph2(iph2);
 1302: 		return -1;
 1303: 	}
 1304: 	return 0;
 1305: }
 1306: 
 1307: /* new negotiation of phase 2 for responder */
 1308: static int
 1309: isakmp_ph2begin_r(iph1, msg)
 1310: 	struct ph1handle *iph1;
 1311: 	vchar_t *msg;
 1312: {
 1313: 	struct isakmp *isakmp = (struct isakmp *)msg->v;
 1314: 	struct ph2handle *iph2 = 0;
 1315: 	int error;
 1316: #ifdef ENABLE_STATS
 1317: 	struct timeval start, end;
 1318: #endif
 1319: #ifdef ENABLE_HYBRID
 1320: 	if (xauth_check(iph1) != 0) {
 1321: 		plog(LLV_ERROR, LOCATION, NULL,
 1322: 		    "Attempt to start phase 2 whereas Xauth failed\n");
 1323: 		return -1;
 1324: 	}
 1325: #endif
 1326: 
 1327: 	iph2 = newph2();
 1328: 	if (iph2 == NULL) {
 1329: 		plog(LLV_ERROR, LOCATION, NULL,
 1330: 			"failed to allocate phase2 entry.\n");
 1331: 		return -1;
 1332: 	}
 1333: 
 1334: 	iph2->side = RESPONDER;
 1335: 	iph2->status = PHASE2ST_START;
 1336: 	iph2->flags = isakmp->flags;
 1337: 	iph2->msgid = isakmp->msgid;
 1338: 	iph2->seq = pk_getseq();
 1339: 	iph2->ivm = oakley_newiv2(iph1, iph2->msgid);
 1340: 	if (iph2->ivm == NULL) {
 1341: 		delph2(iph2);
 1342: 		return -1;
 1343: 	}
 1344: 	iph2->dst = dupsaddr(iph1->remote);	/* XXX should be considered */
 1345: 	if (iph2->dst == NULL) {
 1346: 		delph2(iph2);
 1347: 		return -1;
 1348: 	}
 1349: 	iph2->src = dupsaddr(iph1->local);	/* XXX should be considered */
 1350: 	if (iph2->src == NULL) {
 1351: 		delph2(iph2);
 1352: 		return -1;
 1353: 	}
 1354: 
 1355: 	/* add new entry to isakmp status table */
 1356: 	insph2(iph2);
 1357: 	bindph12(iph1, iph2);
 1358: 
 1359: 	plog(LLV_DEBUG, LOCATION, NULL, "===\n");
 1360:     {
 1361: 	char *a;
 1362: 
 1363: 	a = racoon_strdup(saddr2str(iph2->src));
 1364: 	STRDUP_FATAL(a);
 1365: 
 1366: 	plog(LLV_INFO, LOCATION, NULL,
 1367: 		"respond new phase 2 negotiation: %s<=>%s\n",
 1368: 		a, saddr2str(iph2->dst));
 1369: 	racoon_free(a);
 1370:     }
 1371: 
 1372: #ifdef ENABLE_STATS
 1373: 	gettimeofday(&start, NULL);
 1374: #endif
 1375: 
 1376: 	error = (ph2exchange[etypesw2(ISAKMP_ETYPE_QUICK)]
 1377: 	                   [iph2->side]
 1378: 	                   [iph2->status])(iph2, msg);
 1379: 	if (error != 0) {
 1380: 		plog(LLV_ERROR, LOCATION, iph1->remote,
 1381: 			"failed to pre-process ph2 packet (side: %d, status: %d).\n",
 1382: 			iph2->side, iph2->status);
 1383: 		if (error != ISAKMP_INTERNAL_ERROR)
 1384: 			isakmp_info_send_n1(iph2->ph1, error, NULL);
 1385: 		/*
 1386: 		 * release handler because it's wrong that ph2handle is kept
 1387: 		 * after failed to check message for responder's.
 1388: 		 */
 1389: 		remph2(iph2);
 1390: 		delph2(iph2);
 1391: 		return -1;
 1392: 	}
 1393: 
 1394: 	/* send */
 1395: 	plog(LLV_DEBUG, LOCATION, NULL, "===\n");
 1396: 	if ((ph2exchange[etypesw2(isakmp->etype)]
 1397: 			[iph2->side]
 1398: 			[iph2->status])(iph2, msg) < 0) {
 1399: 		plog(LLV_ERROR, LOCATION, iph2->ph1->remote,
 1400: 			"failed to process ph2 packet (side: %d, status: %d).\n",
 1401: 			iph2->side, iph2->status);
 1402: 		/* don't release handler */
 1403: 		return -1;
 1404: 	}
 1405: #ifdef ENABLE_STATS
 1406: 	gettimeofday(&end, NULL);
 1407: 	syslog(LOG_NOTICE, "%s(%s): %8.6f",
 1408: 		"phase2",
 1409: 		s_isakmp_state(ISAKMP_ETYPE_QUICK, iph2->side, iph2->status),
 1410: 		timedelta(&start, &end));
 1411: #endif
 1412: 
 1413: 	return 0;
 1414: }
 1415: 
 1416: /*
 1417:  * parse ISAKMP payloads, without ISAKMP base header.
 1418:  */
 1419: vchar_t *
 1420: isakmp_parsewoh(np0, gen, len)
 1421: 	int np0;
 1422: 	struct isakmp_gen *gen;
 1423: 	int len;
 1424: {
 1425: 	u_char np = np0 & 0xff;
 1426: 	int tlen, plen;
 1427: 	vchar_t *result;
 1428: 	struct isakmp_parse_t *p, *ep;
 1429: 
 1430: 	plog(LLV_DEBUG, LOCATION, NULL, "begin.\n");
 1431: 
 1432: 	/*
 1433: 	 * 5 is a magic number, but any value larger than 2 should be fine
 1434: 	 * as we do vrealloc() in the following loop.
 1435: 	 */
 1436: 	result = vmalloc(sizeof(struct isakmp_parse_t) * 5);
 1437: 	if (result == NULL) {
 1438: 		plog(LLV_ERROR, LOCATION, NULL,
 1439: 			"failed to get buffer.\n");
 1440: 		return NULL;
 1441: 	}
 1442: 	p = (struct isakmp_parse_t *)result->v;
 1443: 	ep = (struct isakmp_parse_t *)(result->v + result->l - sizeof(*ep));
 1444: 
 1445: 	tlen = len;
 1446: 
 1447: 	/* parse through general headers */
 1448: 	while (0 < tlen && np != ISAKMP_NPTYPE_NONE) {
 1449: 		if (tlen <= sizeof(struct isakmp_gen)) {
 1450: 			/* don't send information, see isakmp_ident_r1() */
 1451: 			plog(LLV_ERROR, LOCATION, NULL,
 1452: 				"invalid length of payload\n");
 1453: 			vfree(result);
 1454: 			return NULL;
 1455: 		}
 1456: 
 1457: 		plog(LLV_DEBUG, LOCATION, NULL,
 1458: 			"seen nptype=%u(%s)\n", np, s_isakmp_nptype(np));
 1459: 
 1460: 		p->type = np;
 1461: 		p->len = ntohs(gen->len);
 1462: 		if (p->len < sizeof(struct isakmp_gen) || p->len > tlen) {
 1463: 			plog(LLV_DEBUG, LOCATION, NULL,
 1464: 				"invalid length of payload\n");
 1465: 			vfree(result);
 1466: 			return NULL;
 1467: 		}
 1468: 		p->ptr = gen;
 1469: 		p++;
 1470: 		if (ep <= p) {
 1471: 			int off;
 1472: 
 1473: 			off = p - (struct isakmp_parse_t *)result->v;
 1474: 			result = vrealloc(result, result->l * 2);
 1475: 			if (result == NULL) {
 1476: 				plog(LLV_DEBUG, LOCATION, NULL,
 1477: 					"failed to realloc buffer.\n");
 1478: 				vfree(result);
 1479: 				return NULL;
 1480: 			}
 1481: 			ep = (struct isakmp_parse_t *)
 1482: 				(result->v + result->l - sizeof(*ep));
 1483: 			p = (struct isakmp_parse_t *)result->v;
 1484: 			p += off;
 1485: 		}
 1486: 
 1487: 		np = gen->np;
 1488: 		plen = ntohs(gen->len);
 1489: 		gen = (struct isakmp_gen *)((caddr_t)gen + plen);
 1490: 		tlen -= plen;
 1491: 	}
 1492: 	p->type = ISAKMP_NPTYPE_NONE;
 1493: 	p->len = 0;
 1494: 	p->ptr = NULL;
 1495: 
 1496: 	plog(LLV_DEBUG, LOCATION, NULL, "succeed.\n");
 1497: 
 1498: 	return result;
 1499: }
 1500: 
 1501: /*
 1502:  * parse ISAKMP payloads, including ISAKMP base header.
 1503:  */
 1504: vchar_t *
 1505: isakmp_parse(buf)
 1506: 	vchar_t *buf;
 1507: {
 1508: 	struct isakmp *isakmp = (struct isakmp *)buf->v;
 1509: 	struct isakmp_gen *gen;
 1510: 	int tlen;
 1511: 	vchar_t *result;
 1512: 	u_char np;
 1513: 
 1514: 	np = isakmp->np;
 1515: 	gen = (struct isakmp_gen *)(buf->v + sizeof(*isakmp));
 1516: 	tlen = buf->l - sizeof(struct isakmp);
 1517: 	result = isakmp_parsewoh(np, gen, tlen);
 1518: 
 1519: 	return result;
 1520: }
 1521: 
 1522: /* %%% */
 1523: int
 1524: isakmp_init()
 1525: {
 1526: 	/* initialize a isakmp status table */
 1527: 	initph1tree();
 1528: 	initph2tree();
 1529: 	initctdtree();
 1530: 	init_recvdpkt();
 1531: 
 1532: 	return 0;
 1533: }
 1534: 
 1535: /*
 1536:  * make strings containing i_cookie + r_cookie + msgid
 1537:  */
 1538: const char *
 1539: isakmp_pindex(index, msgid)
 1540: 	const isakmp_index *index;
 1541: 	const u_int32_t msgid;
 1542: {
 1543: 	static char buf[64];
 1544: 	const u_char *p;
 1545: 	int i, j;
 1546: 
 1547: 	memset(buf, 0, sizeof(buf));
 1548: 
 1549: 	/* copy index */
 1550: 	p = (const u_char *)index;
 1551: 	for (j = 0, i = 0; i < sizeof(isakmp_index); i++) {
 1552: 		snprintf((char *)&buf[j], sizeof(buf) - j, "%02x", p[i]);
 1553: 		j += 2;
 1554: 		switch (i) {
 1555: 		case 7:
 1556: 			buf[j++] = ':';
 1557: 		}
 1558: 	}
 1559: 
 1560: 	if (msgid == 0)
 1561: 		return buf;
 1562: 
 1563: 	/* copy msgid */
 1564: 	snprintf((char *)&buf[j], sizeof(buf) - j, ":%08x", ntohs(msgid));
 1565: 
 1566: 	return buf;
 1567: }
 1568: 
 1569: /* open ISAKMP sockets. */
 1570: int
 1571: isakmp_open(struct sockaddr *addr, int udp_encap)
 1572: {
 1573: 	const int yes = 1;
 1574: 	int ifnum = 0, encap_ifnum = 0, fd;
 1575: 	struct sockaddr_in *sin = (struct sockaddr_in *) addr;
 1576: #ifdef INET6
 1577: 	struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) addr;
 1578: 	int pktinfo;
 1579: #endif
 1580: #ifdef ENABLE_NATT
 1581: 	int option = -1;
 1582: #endif
 1583: 
 1584: 	/* warn if wildcard address - should we forbid this? */
 1585: 	switch (addr->sa_family) {
 1586: 	case AF_INET:
 1587: 		if (sin->sin_addr.s_addr == 0)
 1588: 			plog(LLV_WARNING, LOCATION, NULL,
 1589: 			     "listening to wildcard address,"
 1590: 			     "broadcast IKE packet may kill you\n");
 1591: 		break;
 1592: #ifdef INET6
 1593: 	case AF_INET6:
 1594: 		if (IN6_IS_ADDR_MULTICAST(&sin6->sin6_addr)) {
 1595: 			plog(LLV_DEBUG, LOCATION, NULL,
 1596: 			     "ignoring multicast address %s\n",
 1597: 			     saddr2str(addr));
 1598: 			return -1;
 1599: 		}
 1600: 
 1601: 		if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr))
 1602: 			plog(LLV_WARNING, LOCATION, NULL,
 1603: 			     "listening to wildcard address, "
 1604: 			     "broadcast IKE packet may kill you\n");
 1605: 		break;
 1606: #endif
 1607: 	default:
 1608: 		plog(LLV_ERROR, LOCATION, NULL,
 1609: 		     "unsupported address family %d\n",
 1610: 		     addr->sa_family);
 1611: 		return -1;
 1612: 	}
 1613: 
 1614: 	if ((fd = privsep_socket(addr->sa_family, SOCK_DGRAM, 0)) < 0) {
 1615: 		plog(LLV_ERROR, LOCATION, NULL,
 1616: 		     "socket(%s)\n", strerror(errno));
 1617: 		return -1;
 1618: 	}
 1619: 	close_on_exec(fd);
 1620: 	if (fcntl(fd, F_SETFL, O_NONBLOCK) == -1)
 1621: 		plog(LLV_WARNING, LOCATION, NULL,
 1622: 		     "failed to put socket in non-blocking mode\n");
 1623: 
 1624: 	/* receive my interface address on inbound packets. */
 1625: 	switch (addr->sa_family) {
 1626: 	case AF_INET:
 1627: 		if (setsockopt(fd, IPPROTO_IP,
 1628: #ifdef __linux__
 1629: 			       IP_PKTINFO,
 1630: #else
 1631: 			       IP_RECVDSTADDR,
 1632: #endif
 1633: 			       (const void *) &yes, sizeof(yes)) < 0) {
 1634: 			plog(LLV_ERROR, LOCATION, NULL,
 1635: 			     "setsockopt IP_RECVDSTADDR (%s)\n",
 1636: 			     strerror(errno));
 1637: 			goto err;
 1638: 		}
 1639: 
 1640: #ifdef ENABLE_NATT
 1641: 		if (udp_encap)
 1642: 			option = UDP_ENCAP_ESPINUDP;
 1643: #if defined(ENABLE_NATT_00) || defined(ENABLE_NATT_01)
 1644: 		else
 1645: 			option = UDP_ENCAP_ESPINUDP_NON_IKE;
 1646: #endif
 1647: 		if (option == -1)
 1648: 			break;
 1649: 
 1650: 		if (setsockopt(fd, SOL_UDP,
 1651: 			       UDP_ENCAP, &option,
 1652: 			       sizeof(option)) < 0) {
 1653: 			plog(LLV_WARNING, LOCATION, NULL,
 1654: 			     "setsockopt(%s): UDP_ENCAP %s\n",
 1655: 			     option == UDP_ENCAP_ESPINUDP ? "UDP_ENCAP_ESPINUDP" : "UDP_ENCAP_ESPINUDP_NON_IKE",
 1656: 			     strerror(errno));
 1657: 		} else {
 1658: 			plog(LLV_INFO, LOCATION, NULL,
 1659: 			     "%s used for NAT-T\n",
 1660: 			     saddr2str(addr));
 1661: 		}
 1662: #endif
 1663: 		break;
 1664: 
 1665: #ifdef INET6
 1666: 	case AF_INET6:
 1667: #if defined(INET6_ADVAPI)
 1668: #ifdef IPV6_RECVPKTINFO
 1669: 		pktinfo = IPV6_RECVPKTINFO;
 1670: #else  /* old adv. API */
 1671: 		pktinfo = IPV6_PKTINFO;
 1672: #endif /* IPV6_RECVPKTINFO */
 1673: #else
 1674: 		pktinfo = IPV6_RECVDSTADDR;
 1675: #endif
 1676: 		if (setsockopt(fd, IPPROTO_IPV6, pktinfo,
 1677: 			       (const void *) &yes, sizeof(yes)) < 0) {
 1678: 			plog(LLV_ERROR, LOCATION, NULL,
 1679: 			     "setsockopt IPV6_RECVDSTADDR (%d):%s\n",
 1680: 			     pktinfo, strerror(errno));
 1681: 			goto err;
 1682: 		}
 1683: 
 1684: #ifdef IPV6_USE_MIN_MTU
 1685: 		if (setsockopt(fd, IPPROTO_IPV6, IPV6_USE_MIN_MTU,
 1686: 			       (void *) &yes, sizeof(yes)) < 0) {
 1687: 			plog(LLV_ERROR, LOCATION, NULL,
 1688: 			     "setsockopt IPV6_USE_MIN_MTU (%s)\n",
 1689: 			     strerror(errno));
 1690: 			goto err;
 1691: 		}
 1692: #endif
 1693: 		break;
 1694: #endif
 1695: 	}
 1696: 
 1697: 	if (setsockopt(fd, SOL_SOCKET,
 1698: #ifdef __linux__
 1699: 		       SO_REUSEADDR,
 1700: #else
 1701: 		       SO_REUSEPORT,
 1702: #endif
 1703: 		       (void *) &yes, sizeof(yes)) < 0) {
 1704: 		plog(LLV_ERROR, LOCATION, NULL,
 1705: 		     "failed to set REUSE flag on %s (%s).\n",
 1706: 		     saddr2str(addr), strerror(errno));
 1707: 		goto err;
 1708: 	}
 1709: 
 1710: 	if (setsockopt_bypass(fd, addr->sa_family) < 0)
 1711: 		goto err;
 1712: 
 1713: 	if (privsep_bind(fd, addr, sysdep_sa_len(addr)) < 0) {
 1714: 		plog(LLV_ERROR, LOCATION, addr,
 1715: 		     "failed to bind to address %s (%s).\n",
 1716: 		     saddr2str(addr), strerror(errno));
 1717: 		goto err;
 1718: 	}
 1719: 
 1720: 	plog(LLV_INFO, LOCATION, NULL,
 1721: 	     "%s used as isakmp port (fd=%d)\n",
 1722: 	     saddr2str(addr), fd);
 1723: 
 1724: 	monitor_fd(fd, isakmp_handler, NULL, 1);
 1725: 	return fd;
 1726: 
 1727: err:
 1728: 	close(fd);
 1729: 	return -1;
 1730: }
 1731: 
 1732: void
 1733: isakmp_close(int fd)
 1734: {
 1735: 	unmonitor_fd(fd);
 1736: 	close(fd);
 1737: }
 1738: 
 1739: int
 1740: isakmp_send(iph1, sbuf)
 1741: 	struct ph1handle *iph1;
 1742: 	vchar_t *sbuf;
 1743: {
 1744: 	int len = 0;
 1745: 	int s;
 1746: 	vchar_t *vbuf = NULL, swap;
 1747: 
 1748: #ifdef ENABLE_NATT
 1749: 	size_t extralen = NON_ESP_MARKER_USE(iph1) ? NON_ESP_MARKER_LEN : 0;
 1750: 
 1751: 	/* Check if NON_ESP_MARKER_LEN is already there (happens when resending packets)
 1752: 	 */
 1753: 	if(extralen == NON_ESP_MARKER_LEN &&
 1754: 	   *(u_int32_t *)sbuf->v == 0)
 1755: 		extralen = 0;
 1756: 
 1757: #ifdef ENABLE_FRAG
 1758: 	/*
 1759: 	 * Do not add the non ESP marker for a packet that will
 1760: 	 * be fragmented. The non ESP marker should appear in
 1761: 	 * all fragment's packets, but not in the fragmented packet
 1762: 	 */
 1763: 	if (iph1->frag && sbuf->l > ISAKMP_FRAG_MAXLEN)
 1764: 		extralen = 0;
 1765: #endif
 1766: 	if (extralen)
 1767: 		plog (LLV_DEBUG, LOCATION, NULL, "Adding NON-ESP marker\n");
 1768: 
 1769: 	/* If NAT-T port floating is in use, 4 zero bytes (non-ESP marker)
 1770: 	   must added just before the packet itself. For this we must
 1771: 	   allocate a new buffer and release it at the end. */
 1772: 	if (extralen) {
 1773: 		if ((vbuf = vmalloc (sbuf->l + extralen)) == NULL) {
 1774: 			plog(LLV_ERROR, LOCATION, NULL,
 1775: 			    "vbuf allocation failed\n");
 1776: 			return -1;
 1777: 		}
 1778: 		*(u_int32_t *)vbuf->v = 0;
 1779: 		memcpy (vbuf->v + extralen, sbuf->v, sbuf->l);
 1780: 		/* ensures that the modified buffer will be sent back to the caller, so
 1781: 		 * add_recvdpkt() will add the correct buffer
 1782: 		 */
 1783: 		swap = *sbuf;
 1784: 		*sbuf = *vbuf;
 1785: 		*vbuf = swap;
 1786: 		vfree(vbuf);
 1787: 	}
 1788: #endif
 1789: 
 1790: 	/* select the socket to be sent */
 1791: 	s = myaddr_getfd(iph1->local);
 1792: 	if (s == -1)
 1793: 		return -1;
 1794: 
 1795: 	plog (LLV_DEBUG, LOCATION, NULL, "%zu bytes %s\n", sbuf->l,
 1796: 	      saddr2str_fromto("from %s to %s", iph1->local, iph1->remote));
 1797: 
 1798: #ifdef ENABLE_FRAG
 1799: 	if (iph1->frag && sbuf->l > ISAKMP_FRAG_MAXLEN) {
 1800: 		if (isakmp_sendfrags(iph1, sbuf) == -1) {
 1801: 			plog(LLV_ERROR, LOCATION, NULL,
 1802: 			    "isakmp_sendfrags failed\n");
 1803: 			return -1;
 1804: 		}
 1805: 	} else
 1806: #endif
 1807: 	{
 1808: 		len = sendfromto(s, sbuf->v, sbuf->l,
 1809: 		    iph1->local, iph1->remote, lcconf->count_persend);
 1810: 
 1811: 		if (len == -1) {
 1812: 			plog(LLV_ERROR, LOCATION, NULL, "sendfromto failed\n");
 1813: 			return -1;
 1814: 		}
 1815: 	}
 1816: 
 1817: 	return 0;
 1818: }
 1819: 
 1820: /* called from scheduler */
 1821: static void
 1822: isakmp_ph1resend_stub(p)
 1823: 	struct sched *p;
 1824: {
 1825: 	struct ph1handle *iph1 = container_of(p, struct ph1handle, scr);
 1826: 
 1827: 	if (isakmp_ph1resend(iph1) < 0) {
 1828: 		remph1(iph1);
 1829: 		delph1(iph1);
 1830: 	}
 1831: }
 1832: 
 1833: static int
 1834: isakmp_ph1resend(iph1)
 1835: 	struct ph1handle *iph1;
 1836: {
 1837: 	/* Note: NEVER do the rem/del here, it will be done by the caller or by the _stub function
 1838: 	 */
 1839: 	if (iph1->retry_counter <= 0) {
 1840: 		plog(LLV_ERROR, LOCATION, NULL,
 1841: 			"phase1 negotiation failed due to time up. %s\n",
 1842: 			isakmp_pindex(&iph1->index, iph1->msgid));
 1843: 		/* XXX is the peer really "dead" here ??? */
 1844: 		script_hook(iph1, SCRIPT_PHASE1_DEAD);
 1845: 		evt_phase1(iph1, EVT_PHASE1_NO_RESPONSE, NULL);
 1846: 
 1847: 		return -1;
 1848: 	}
 1849: 
 1850: 	if (isakmp_send(iph1, iph1->sendbuf) < 0){
 1851: 		plog(LLV_ERROR, LOCATION, NULL,
 1852: 			 "phase1 negotiation failed due to send error. %s\n",
 1853: 			 isakmp_pindex(&iph1->index, iph1->msgid));
 1854: 		evt_phase1(iph1, EVT_PHASE1_NO_RESPONSE, NULL);
 1855: 		return -1;
 1856: 	}
 1857: 
 1858: 	plog(LLV_DEBUG, LOCATION, NULL,
 1859: 		"resend phase1 packet %s\n",
 1860: 		isakmp_pindex(&iph1->index, iph1->msgid));
 1861: 
 1862: 	iph1->retry_counter--;
 1863: 
 1864: 	sched_schedule(&iph1->scr, lcconf->retry_interval,
 1865: 		       isakmp_ph1resend_stub);
 1866: 
 1867: 	return 0;
 1868: }
 1869: 
 1870: int
 1871: isakmp_ph1send(iph1)
 1872: 	struct ph1handle *iph1;
 1873: {
 1874: 	iph1->retry_counter = lcconf->retry_counter;
 1875: 	return isakmp_ph1resend(iph1);
 1876: }
 1877: 
 1878: /* called from scheduler */
 1879: static void
 1880: isakmp_ph2resend_stub(p)
 1881: 	struct sched *p;
 1882: {
 1883: 	struct ph2handle *iph2 = container_of(p, struct ph2handle, scr);
 1884: 
 1885: 	if (isakmp_ph2resend(iph2) < 0) {
 1886: 		remph2(iph2);
 1887: 		delph2(iph2);
 1888: 	}
 1889: }
 1890: 
 1891: static int
 1892: isakmp_ph2resend(iph2)
 1893: 	struct ph2handle *iph2;
 1894: {
 1895: 	/* Note: NEVER do the unbind/rem/del here, it will be done by the caller or by the _stub function
 1896: 	 */
 1897: 	if (iph2->ph1->status >= PHASE1ST_EXPIRED) {
 1898: 		plog(LLV_ERROR, LOCATION, NULL,
 1899: 			"phase2 negotiation failed due to phase1 expired. %s\n",
 1900: 				isakmp_pindex(&iph2->ph1->index, iph2->msgid));
 1901: 		return -1;
 1902: 	}
 1903: 
 1904: 	if (iph2->retry_counter <= 0) {
 1905: 		plog(LLV_ERROR, LOCATION, NULL,
 1906: 			"phase2 negotiation failed due to time up. %s\n",
 1907: 				isakmp_pindex(&iph2->ph1->index, iph2->msgid));
 1908: 		evt_phase2(iph2, EVT_PHASE2_NO_RESPONSE, NULL);
 1909: 		unbindph12(iph2);
 1910: 		return -1;
 1911: 	}
 1912: 
 1913: 	if (isakmp_send(iph2->ph1, iph2->sendbuf) < 0){
 1914: 		plog(LLV_ERROR, LOCATION, NULL,
 1915: 			"phase2 negotiation failed due to send error. %s\n",
 1916: 				isakmp_pindex(&iph2->ph1->index, iph2->msgid));
 1917: 		evt_phase2(iph2, EVT_PHASE2_NO_RESPONSE, NULL);
 1918: 		return -1;
 1919: 	}
 1920: 
 1921: 	plog(LLV_DEBUG, LOCATION, NULL,
 1922: 		"resend phase2 packet %s\n",
 1923: 		isakmp_pindex(&iph2->ph1->index, iph2->msgid));
 1924: 
 1925: 	iph2->retry_counter--;
 1926: 
 1927: 	sched_schedule(&iph2->scr, lcconf->retry_interval,
 1928: 		       isakmp_ph2resend_stub);
 1929: 
 1930: 	return 0;
 1931: }
 1932: 
 1933: int
 1934: isakmp_ph2send(iph2)
 1935: 	struct ph2handle *iph2;
 1936: {
 1937: 	iph2->retry_counter = lcconf->retry_counter;
 1938: 	return isakmp_ph2resend(iph2);
 1939: }
 1940: 
 1941: /* called from scheduler */
 1942: void
 1943: isakmp_ph1dying_stub(p)
 1944: 	struct sched *p;
 1945: {
 1946: 
 1947: 	isakmp_ph1dying(container_of(p, struct ph1handle, sce));
 1948: }
 1949: 
 1950: void
 1951: isakmp_ph1dying(iph1)
 1952: 	struct ph1handle *iph1;
 1953: {
 1954: 	struct ph1handle *new_iph1;
 1955: 	struct ph2handle *p;
 1956: 	struct remoteconf *rmconf;
 1957: 
 1958: 	if (iph1->status >= PHASE1ST_DYING)
 1959: 		return;
 1960: 
 1961: 	/* Going away in after a while... */
 1962: 	iph1->status = PHASE1ST_DYING;
 1963: 
 1964: 	/* Any fresh phase1s? */
 1965: 	new_iph1 = getph1(iph1, iph1->local, iph1->remote, 1);
 1966: 	if (new_iph1 == NULL) {
 1967: 		LIST_FOREACH(p, &iph1->ph2tree, ph1bind) {
 1968: 			if (p->status != PHASE2ST_ESTABLISHED)
 1969: 				continue;
 1970: 
 1971: 			plog(LLV_INFO, LOCATION, NULL,
 1972: 			     "renegotiating phase1 to %s due to "
 1973: 			     "active phase2\n",
 1974: 			     saddrwop2str(iph1->remote));
 1975: 
 1976: 			if (iph1->side == INITIATOR)
 1977: 				isakmp_ph1begin_i(iph1->rmconf, iph1->remote,
 1978: 						  iph1->local);
 1979: 
 1980: 			break;
 1981: 		}
 1982: 	} else {
 1983: 		migrate_ph12(iph1, new_iph1);
 1984: 	}
 1985: 
 1986: 	/* Schedule for expiration */
 1987: 	sched_schedule(&iph1->sce, iph1->approval->lifetime *
 1988: 		       (100 - PFKEY_SOFT_LIFETIME_RATE) / 100,
 1989: 		       isakmp_ph1expire_stub);
 1990: }
 1991: 
 1992: /* called from scheduler */
 1993: void
 1994: isakmp_ph1expire_stub(p)
 1995: 	struct sched *p;
 1996: {
 1997: 	isakmp_ph1expire(container_of(p, struct ph1handle, sce));
 1998: }
 1999: 
 2000: void
 2001: isakmp_ph1expire(iph1)
 2002: 	struct ph1handle *iph1;
 2003: {
 2004: 	char *src, *dst;
 2005: 
 2006: 	if (iph1->status < PHASE1ST_EXPIRED) {
 2007: 		src = racoon_strdup(saddr2str(iph1->local));
 2008: 		dst = racoon_strdup(saddr2str(iph1->remote));
 2009: 		STRDUP_FATAL(src);
 2010: 		STRDUP_FATAL(dst);
 2011: 
 2012: 		plog(LLV_INFO, LOCATION, NULL,
 2013: 			 "ISAKMP-SA expired %s-%s spi:%s\n",
 2014: 			 src, dst,
 2015: 			 isakmp_pindex(&iph1->index, 0));
 2016: 		racoon_free(src);
 2017: 		racoon_free(dst);
 2018: 		iph1->status = PHASE1ST_EXPIRED;
 2019: 	}
 2020: 
 2021: 	isakmp_ph1delete(iph1);
 2022: }
 2023: 
 2024: /* called from scheduler */
 2025: void
 2026: isakmp_ph1delete_stub(p)
 2027: 	struct sched *p;
 2028: {
 2029: 
 2030: 	isakmp_ph1delete(container_of(p, struct ph1handle, sce));
 2031: }
 2032: 
 2033: void
 2034: isakmp_ph1delete(iph1)
 2035: 	struct ph1handle *iph1;
 2036: {
 2037: 	struct ph2handle *p, *next;
 2038: 	struct ph1handle *new_iph1;
 2039: 	char *src, *dst;
 2040: 
 2041: 	/* Migrate established phase2s. Any fresh phase1s? */
 2042: 	new_iph1 = getph1(iph1, iph1->local, iph1->remote, 1);
 2043: 	if (new_iph1 != NULL)
 2044: 		migrate_ph12(iph1, new_iph1);
 2045: 
 2046: 	/* Discard any left phase2s */
 2047: 	for (p = LIST_FIRST(&iph1->ph2tree); p; p = next) {
 2048: 		next = LIST_NEXT(p, ph1bind);
 2049: 		if (p->status == PHASE2ST_ESTABLISHED)
 2050: 			isakmp_info_send_d2(p);
 2051: 		/* remove all ph2 handles,
 2052: 		 * as ph1handle will be expired soon
 2053: 		 */
 2054: 		delete_spd(p, 1);
 2055: 		remph2(p);
 2056: 		delph2(p);
 2057: 	}
 2058: 
 2059: 	src = racoon_strdup(saddr2str(iph1->local));
 2060: 	dst = racoon_strdup(saddr2str(iph1->remote));
 2061: 	STRDUP_FATAL(src);
 2062: 	STRDUP_FATAL(dst);
 2063: 
 2064: 	plog(LLV_INFO, LOCATION, NULL,
 2065: 		"ISAKMP-SA deleted %s-%s spi:%s\n",
 2066: 		src, dst, isakmp_pindex(&iph1->index, 0));
 2067: 
 2068: 	evt_phase1(iph1, EVT_PHASE1_DOWN, NULL);
 2069: 	if (new_iph1 == NULL && ph1_rekey_enabled(iph1))
 2070: 		script_hook(iph1, SCRIPT_PHASE1_DEAD);
 2071: 
 2072: 	racoon_free(src);
 2073: 	racoon_free(dst);
 2074: 
 2075: 	remph1(iph1);
 2076: 	delph1(iph1);
 2077: }
 2078: 
 2079: /* called from scheduler.
 2080:  * this function will call only isakmp_ph2delete().
 2081:  * phase 2 handler remain forever if kernel doesn't cry a expire of phase 2 SA
 2082:  * by something cause.  That's why this function is called after phase 2 SA
 2083:  * expires in the userland.
 2084:  */
 2085: void
 2086: isakmp_ph2expire_stub(p)
 2087: 	struct sched *p;
 2088: {
 2089: 
 2090: 	isakmp_ph2expire(container_of(p, struct ph2handle, sce));
 2091: }
 2092: 
 2093: void
 2094: isakmp_ph2expire(iph2)
 2095: 	struct ph2handle *iph2;
 2096: {
 2097: 	char *src, *dst;
 2098: 
 2099: 	src = racoon_strdup(saddrwop2str(iph2->src));
 2100: 	dst = racoon_strdup(saddrwop2str(iph2->dst));
 2101: 	STRDUP_FATAL(src);
 2102: 	STRDUP_FATAL(dst);
 2103: 
 2104: 	plog(LLV_INFO, LOCATION, NULL,
 2105: 		"phase2 sa expired %s-%s\n", src, dst);
 2106: 	racoon_free(src);
 2107: 	racoon_free(dst);
 2108: 
 2109: 	iph2->status = PHASE2ST_EXPIRED;
 2110: 	sched_schedule(&iph2->sce, 1, isakmp_ph2delete_stub);
 2111: }
 2112: 
 2113: /* called from scheduler */
 2114: void
 2115: isakmp_ph2delete_stub(p)
 2116: 	struct sched *p;
 2117: {
 2118: 
 2119: 	isakmp_ph2delete(container_of(p, struct ph2handle, sce));
 2120: }
 2121: 
 2122: void
 2123: isakmp_ph2delete(iph2)
 2124: 	struct ph2handle *iph2;
 2125: {
 2126: 	char *src, *dst;
 2127: 
 2128: 	src = racoon_strdup(saddrwop2str(iph2->src));
 2129: 	dst = racoon_strdup(saddrwop2str(iph2->dst));
 2130: 	STRDUP_FATAL(src);
 2131: 	STRDUP_FATAL(dst);
 2132: 
 2133: 	plog(LLV_INFO, LOCATION, NULL,
 2134: 		"phase2 sa deleted %s-%s\n", src, dst);
 2135: 	racoon_free(src);
 2136: 	racoon_free(dst);
 2137: 
 2138: 	remph2(iph2);
 2139: 	delph2(iph2);
 2140: 
 2141: 	return;
 2142: }
 2143: 
 2144: /* %%%
 2145:  * Interface between PF_KEYv2 and ISAKMP
 2146:  */
 2147: /*
 2148:  * receive ACQUIRE from kernel, and begin either phase1 or phase2.
 2149:  * if phase1 has been finished, begin phase2.
 2150:  */
 2151: int
 2152: isakmp_post_acquire(iph2, iph1hint, nopassive)
 2153: 	struct ph2handle *iph2;
 2154: 	struct ph1handle *iph1hint;
 2155: 	int nopassive;
 2156: {
 2157: 	struct remoteconf *rmconf;
 2158: 	struct ph1handle *iph1 = NULL;
 2159: 
 2160: 	plog(LLV_DEBUG, LOCATION, NULL, "in post_acquire\n");
 2161: 
 2162: 	/* Search appropriate configuration with masking port. Note that
 2163: 	 * we always use iph2->dst, and not iph2->sa_dst.
 2164: 	 *
 2165: 	 * XXX One possible need for using iph2->sa_dst if not NULL would
 2166: 	 * be for selecting a remote configuration based on a stable
 2167: 	 * address of a mobile node (not a CoA provided by MIGRATE/KMADDRESS
 2168: 	 * as iph2->dst hint). This scenario would require additional changes,
 2169: 	 * so no need to bother yet. --arno */
 2170: 
 2171: 	if (iph1hint == NULL || iph1hint->rmconf == NULL) {
 2172: 		rmconf = getrmconf(iph2->dst, nopassive ? GETRMCONF_F_NO_PASSIVE : 0);
 2173: 		if (rmconf == NULL) {
 2174: 			plog(LLV_ERROR, LOCATION, NULL,
 2175: 				"no configuration found for %s.\n",
 2176: 				saddrwop2str(iph2->dst));
 2177: 			return -1;
 2178: 		}
 2179: 	} else {
 2180: 		rmconf = iph1hint->rmconf;
 2181: 	}
 2182: 
 2183: 	/* if passive mode, ignore the acquire message */
 2184: 	if (nopassive && rmconf->passive) {
 2185: 		plog(LLV_DEBUG, LOCATION, NULL,
 2186: 			"because of passive mode, "
 2187: 			"ignore the acquire message for %s.\n",
 2188: 			saddrwop2str(iph2->dst));
 2189: 		return -1;
 2190: 	}
 2191: 
 2192: 	/*
 2193: 	 * XXX Searching by IP addresses + ports might fail on
 2194: 	 * some cases, we should use the ISAKMP identity to search
 2195: 	 * matching ISAKMP.
 2196: 	 */
 2197: 	iph1 = getph1(iph1hint, iph2->src, iph2->dst, 0);
 2198: 
 2199: 	/* no ISAKMP-SA found. */
 2200: 	if (iph1 == NULL) {
 2201: 		iph2->retry_checkph1 = lcconf->retry_checkph1;
 2202: 		sched_schedule(&iph2->sce, 1, isakmp_chkph1there_stub);
 2203: 		plog(LLV_INFO, LOCATION, NULL,
 2204: 			"IPsec-SA request for %s queued "
 2205: 			"due to no phase1 found.\n",
 2206: 			saddrwop2str(iph2->dst));
 2207: 
 2208: 		/* start phase 1 negotiation as a initiator. */
 2209: 		if (isakmp_ph1begin_i(rmconf, iph2->dst, iph2->src) == NULL) {
 2210: 			sched_cancel(&iph2->sce);
 2211: 			return -1;
 2212: 		}
 2213: 
 2214: 		return 0;
 2215: 		/*NOTREACHED*/
 2216: 	}
 2217: 
 2218: 	/* found ISAKMP-SA, but on negotiation. */
 2219: 	if (iph1->status < PHASE1ST_ESTABLISHED) {
 2220: 		iph2->retry_checkph1 = lcconf->retry_checkph1;
 2221: 		sched_schedule(&iph2->sce, 1, isakmp_chkph1there_stub);
 2222: 		plog(LLV_INFO, LOCATION, iph2->dst,
 2223: 			"request for establishing IPsec-SA was queued "
 2224: 			"due to no phase1 found.\n");
 2225: 		return 0;
 2226: 		/*NOTREACHED*/
 2227: 	}
 2228: 
 2229: 	/* found established ISAKMP-SA */
 2230: 	/* i.e. iph1->status == PHASE1ST_ESTABLISHED */
 2231: 
 2232: 	/* found ISAKMP-SA. */
 2233: 	plog(LLV_DEBUG, LOCATION, NULL, "begin QUICK mode.\n");
 2234: 
 2235: 	/* begin quick mode */
 2236: 	if (isakmp_ph2begin_i(iph1, iph2))
 2237: 		return -1;
 2238: 
 2239: 	return 0;
 2240: }
 2241: 
 2242: int
 2243: isakmp_get_sainfo(iph2, sp_out, sp_in)
 2244: 	struct ph2handle *iph2;
 2245: 	struct secpolicy *sp_out, *sp_in;
 2246: {
 2247: 	struct remoteconf *conf;
 2248: 	uint32_t remoteid = 0;
 2249: 
 2250: 	plog(LLV_DEBUG, LOCATION, NULL,
 2251: 		"new acquire %s\n", spidx2str(&sp_out->spidx));
 2252: 
 2253: 	/* get sainfo */
 2254: 	{
 2255: 		vchar_t *idsrc, *iddst;
 2256: 
 2257: 		idsrc = ipsecdoi_sockaddr2id((struct sockaddr *)&sp_out->spidx.src,
 2258: 			sp_out->spidx.prefs, sp_out->spidx.ul_proto);
 2259: 		if (idsrc == NULL) {
 2260: 			plog(LLV_ERROR, LOCATION, NULL,
 2261: 				"failed to get ID for %s\n",
 2262: 				spidx2str(&sp_out->spidx));
 2263: 			return -1;
 2264: 		}
 2265: 		iddst = ipsecdoi_sockaddr2id((struct sockaddr *)&sp_out->spidx.dst,
 2266: 			sp_out->spidx.prefd, sp_out->spidx.ul_proto);
 2267: 		if (iddst == NULL) {
 2268: 			plog(LLV_ERROR, LOCATION, NULL,
 2269: 				"failed to get ID for %s\n",
 2270: 				spidx2str(&sp_out->spidx));
 2271: 			vfree(idsrc);
 2272: 			return -1;
 2273: 		}
 2274: 
 2275: 		conf = getrmconf(iph2->dst, 0);
 2276: 		if (conf != NULL)
 2277: 			remoteid = conf->ph1id;
 2278: 		else
 2279: 			plog(LLV_DEBUG, LOCATION, NULL, "Warning: no valid rmconf !\n");
 2280: 
 2281: 		iph2->sainfo = getsainfo(idsrc, iddst, NULL, NULL, remoteid);
 2282: 		vfree(idsrc);
 2283: 		vfree(iddst);
 2284: 		if (iph2->sainfo == NULL) {
 2285: 			plog(LLV_ERROR, LOCATION, NULL,
 2286: 				"failed to get sainfo.\n");
 2287: 			return -1;
 2288: 			/* XXX should use the algorithm list from register message */
 2289: 		}
 2290: 
 2291: 		plog(LLV_DEBUG, LOCATION, NULL,
 2292: 			"selected sainfo: %s\n", sainfo2str(iph2->sainfo));
 2293: 	}
 2294: 
 2295: 	if (set_proposal_from_policy(iph2, sp_out, sp_in) < 0) {
 2296: 		plog(LLV_ERROR, LOCATION, NULL,
 2297: 			"failed to create saprop.\n");
 2298: 		return -1;
 2299: 	}
 2300: 
 2301: 	return 0;
 2302: }
 2303: 
 2304: 
 2305: /*
 2306:  * receive GETSPI from kernel.
 2307:  */
 2308: int
 2309: isakmp_post_getspi(iph2)
 2310: 	struct ph2handle *iph2;
 2311: {
 2312: #ifdef ENABLE_STATS
 2313: 	struct timeval start, end;
 2314: #endif
 2315: 
 2316: 	/* don't process it because there is no suitable phase1-sa. */
 2317: 	if (iph2->ph1->status >= PHASE1ST_EXPIRED) {
 2318: 		plog(LLV_ERROR, LOCATION, iph2->ph1->remote,
 2319: 			"the negotiation is stopped, "
 2320: 			"because there is no suitable ISAKMP-SA.\n");
 2321: 		return -1;
 2322: 	}
 2323: 
 2324: #ifdef ENABLE_STATS
 2325: 	gettimeofday(&start, NULL);
 2326: #endif
 2327: 	if ((ph2exchange[etypesw2(ISAKMP_ETYPE_QUICK)]
 2328: 	                [iph2->side]
 2329: 	                [iph2->status])(iph2, NULL) != 0)
 2330: 		return -1;
 2331: #ifdef ENABLE_STATS
 2332: 	gettimeofday(&end, NULL);
 2333: 	syslog(LOG_NOTICE, "%s(%s): %8.6f",
 2334: 		"phase2",
 2335: 		s_isakmp_state(ISAKMP_ETYPE_QUICK, iph2->side, iph2->status),
 2336: 		timedelta(&start, &end));
 2337: #endif
 2338: 
 2339: 	return 0;
 2340: }
 2341: 
 2342: /* called by scheduler */
 2343: void
 2344: isakmp_chkph1there_stub(p)
 2345: 	struct sched *p;
 2346: {
 2347: 	isakmp_chkph1there(container_of(p, struct ph2handle, sce));
 2348: }
 2349: 
 2350: void
 2351: isakmp_chkph1there(iph2)
 2352: 	struct ph2handle *iph2;
 2353: {
 2354: 	struct ph1handle *iph1;
 2355: 
 2356: 	iph2->retry_checkph1--;
 2357: 	if (iph2->retry_checkph1 < 0) {
 2358: 		plog(LLV_ERROR, LOCATION, iph2->dst,
 2359: 			"phase2 negotiation failed "
 2360: 			"due to time up waiting for phase1. %s\n",
 2361: 			sadbsecas2str(iph2->dst, iph2->src,
 2362: 				iph2->satype, 0, 0));
 2363: 		plog(LLV_INFO, LOCATION, NULL,
 2364: 			"delete phase 2 handler.\n");
 2365: 
 2366: 		/* send acquire to kernel as error */
 2367: 		pk_sendeacquire(iph2);
 2368: 
 2369: 		remph2(iph2);
 2370: 		delph2(iph2);
 2371: 
 2372: 		return;
 2373: 	}
 2374: 
 2375: 	/* Search isakmp status table by address and port */
 2376: 	iph1 = getph1byaddr(iph2->src, iph2->dst, 0);
 2377: 
 2378: 	/* XXX Even if ph1 as responder is there, should we not start
 2379: 	 * phase 2 negotiation ? */
 2380: 	if (iph1 != NULL
 2381: 	 && iph1->status == PHASE1ST_ESTABLISHED) {
 2382: 		/* found isakmp-sa */
 2383: 
 2384: 		plog(LLV_DEBUG2, LOCATION, NULL, "CHKPH1THERE: got a ph1 handler, setting ports.\n");
 2385: 		plog(LLV_DEBUG2, LOCATION, NULL, "iph1->local: %s\n", saddr2str(iph1->local));
 2386: 		plog(LLV_DEBUG2, LOCATION, NULL, "iph1->remote: %s\n", saddr2str(iph1->remote));
 2387: 		plog(LLV_DEBUG2, LOCATION, NULL, "before:\n");
 2388: 		plog(LLV_DEBUG2, LOCATION, NULL, "src: %s\n", saddr2str(iph2->src));
 2389: 		plog(LLV_DEBUG2, LOCATION, NULL, "dst: %s\n", saddr2str(iph2->dst));
 2390: 		set_port(iph2->src, extract_port(iph1->local));
 2391: 		set_port(iph2->dst, extract_port(iph1->remote));
 2392: 		plog(LLV_DEBUG2, LOCATION, NULL, "After:\n");
 2393: 		plog(LLV_DEBUG2, LOCATION, NULL, "src: %s\n", saddr2str(iph2->src));
 2394: 		plog(LLV_DEBUG2, LOCATION, NULL, "dst: %s\n", saddr2str(iph2->dst));
 2395: 
 2396: 		/* begin quick mode */
 2397: 		(void)isakmp_ph2begin_i(iph1, iph2);
 2398: 		return;
 2399: 	}
 2400: 
 2401: 	plog(LLV_DEBUG2, LOCATION, NULL, "CHKPH1THERE: no established ph1 handler found\n");
 2402: 
 2403: 	/* no isakmp-sa found */
 2404: 	sched_schedule(&iph2->sce, 1, isakmp_chkph1there_stub);
 2405: 
 2406: 	return;
 2407: }
 2408: 
 2409: /* copy variable data into ALLOCATED buffer. */
 2410: caddr_t
 2411: isakmp_set_attr_v(buf, type, val, len)
 2412: 	caddr_t buf;
 2413: 	int type;
 2414: 	caddr_t val;
 2415: 	int len;
 2416: {
 2417: 	struct isakmp_data *data;
 2418: 
 2419: 	data = (struct isakmp_data *)buf;
 2420: 	data->type = htons((u_int16_t)type | ISAKMP_GEN_TLV);
 2421: 	data->lorv = htons((u_int16_t)len);
 2422: 	memcpy(data + 1, val, len);
 2423: 
 2424: 	return buf + sizeof(*data) + len;
 2425: }
 2426: 
 2427: /* copy fixed length data into ALLOCATED buffer. */
 2428: caddr_t
 2429: isakmp_set_attr_l(buf, type, val)
 2430: 	caddr_t buf;
 2431: 	int type;
 2432: 	u_int32_t val;
 2433: {
 2434: 	struct isakmp_data *data;
 2435: 
 2436: 	data = (struct isakmp_data *)buf;
 2437: 	data->type = htons((u_int16_t)type | ISAKMP_GEN_TV);
 2438: 	data->lorv = htons((u_int16_t)val);
 2439: 
 2440: 	return buf + sizeof(*data);
 2441: }
 2442: 
 2443: /* add a variable data attribute to the buffer by reallocating it. */
 2444: vchar_t *
 2445: isakmp_add_attr_v(buf0, type, val, len)
 2446: 	vchar_t *buf0;
 2447: 	int type;
 2448: 	caddr_t val;
 2449: 	int len;
 2450: {
 2451: 	vchar_t *buf = NULL;
 2452: 	struct isakmp_data *data;
 2453: 	int tlen;
 2454: 	int oldlen = 0;
 2455: 
 2456: 	tlen = sizeof(*data) + len;
 2457: 
 2458: 	if (buf0) {
 2459: 		oldlen = buf0->l;
 2460: 		buf = vrealloc(buf0, oldlen + tlen);
 2461: 	} else
 2462: 		buf = vmalloc(tlen);
 2463: 	if (!buf) {
 2464: 		plog(LLV_ERROR, LOCATION, NULL,
 2465: 			"failed to get a attribute buffer.\n");
 2466: 		return NULL;
 2467: 	}
 2468: 
 2469: 	data = (struct isakmp_data *)(buf->v + oldlen);
 2470: 	data->type = htons((u_int16_t)type | ISAKMP_GEN_TLV);
 2471: 	data->lorv = htons((u_int16_t)len);
 2472: 	memcpy(data + 1, val, len);
 2473: 
 2474: 	return buf;
 2475: }
 2476: 
 2477: /* add a fixed data attribute to the buffer by reallocating it. */
 2478: vchar_t *
 2479: isakmp_add_attr_l(buf0, type, val)
 2480: 	vchar_t *buf0;
 2481: 	int type;
 2482: 	u_int32_t val;
 2483: {
 2484: 	vchar_t *buf = NULL;
 2485: 	struct isakmp_data *data;
 2486: 	int tlen;
 2487: 	int oldlen = 0;
 2488: 
 2489: 	tlen = sizeof(*data);
 2490: 
 2491: 	if (buf0) {
 2492: 		oldlen = buf0->l;
 2493: 		buf = vrealloc(buf0, oldlen + tlen);
 2494: 	} else
 2495: 		buf = vmalloc(tlen);
 2496: 	if (!buf) {
 2497: 		plog(LLV_ERROR, LOCATION, NULL,
 2498: 			"failed to get a attribute buffer.\n");
 2499: 		return NULL;
 2500: 	}
 2501: 
 2502: 	data = (struct isakmp_data *)(buf->v + oldlen);
 2503: 	data->type = htons((u_int16_t)type | ISAKMP_GEN_TV);
 2504: 	data->lorv = htons((u_int16_t)val);
 2505: 
 2506: 	return buf;
 2507: }
 2508: 
 2509: /*
 2510:  * calculate cookie and set.
 2511:  */
 2512: int
 2513: isakmp_newcookie(place, remote, local)
 2514: 	caddr_t place;
 2515: 	struct sockaddr *remote;
 2516: 	struct sockaddr *local;
 2517: {
 2518: 	vchar_t *buf = NULL, *buf2 = NULL;
 2519: 	char *p;
 2520: 	int blen;
 2521: 	int alen;
 2522: 	caddr_t sa1, sa2;
 2523: 	time_t t;
 2524: 	int error = -1;
 2525: 	u_short port;
 2526: 
 2527: 
 2528: 	if (remote->sa_family != local->sa_family) {
 2529: 		plog(LLV_ERROR, LOCATION, NULL,
 2530: 			"address family mismatch, remote:%d local:%d\n",
 2531: 			remote->sa_family, local->sa_family);
 2532: 		goto end;
 2533: 	}
 2534: 	switch (remote->sa_family) {
 2535: 	case AF_INET:
 2536: 		alen = sizeof(struct in_addr);
 2537: 		sa1 = (caddr_t)&((struct sockaddr_in *)remote)->sin_addr;
 2538: 		sa2 = (caddr_t)&((struct sockaddr_in *)local)->sin_addr;
 2539: 		break;
 2540: #ifdef INET6
 2541: 	case AF_INET6:
 2542: 		alen = sizeof(struct in6_addr);
 2543: 		sa1 = (caddr_t)&((struct sockaddr_in6 *)remote)->sin6_addr;
 2544: 		sa2 = (caddr_t)&((struct sockaddr_in6 *)local)->sin6_addr;
 2545: 		break;
 2546: #endif
 2547: 	default:
 2548: 		plog(LLV_ERROR, LOCATION, NULL,
 2549: 			"invalid family: %d\n", remote->sa_family);
 2550: 		goto end;
 2551: 	}
 2552: 	blen = (alen + sizeof(u_short)) * 2
 2553: 		+ sizeof(time_t) + lcconf->secret_size;
 2554: 	buf = vmalloc(blen);
 2555: 	if (buf == NULL) {
 2556: 		plog(LLV_ERROR, LOCATION, NULL,
 2557: 			"failed to get a cookie.\n");
 2558: 		goto end;
 2559: 	}
 2560: 	p = buf->v;
 2561: 
 2562: 	/* copy my address */
 2563: 	memcpy(p, sa1, alen);
 2564: 	p += alen;
 2565: 	port = ((struct sockaddr_in *)remote)->sin_port;
 2566: 	memcpy(p, &port, sizeof(u_short));
 2567: 	p += sizeof(u_short);
 2568: 
 2569: 	/* copy target address */
 2570: 	memcpy(p, sa2, alen);
 2571: 	p += alen;
 2572: 	port = ((struct sockaddr_in *)local)->sin_port;
 2573: 	memcpy(p, &port, sizeof(u_short));
 2574: 	p += sizeof(u_short);
 2575: 
 2576: 	/* copy time */
 2577: 	t = time(0);
 2578: 	memcpy(p, (caddr_t)&t, sizeof(t));
 2579: 	p += sizeof(t);
 2580: 
 2581: 	/* copy random value */
 2582: 	buf2 = eay_set_random(lcconf->secret_size);
 2583: 	if (buf2 == NULL)
 2584: 		goto end;
 2585: 	memcpy(p, buf2->v, lcconf->secret_size);
 2586: 	p += lcconf->secret_size;
 2587: 	vfree(buf2);
 2588: 
 2589: 	buf2 = eay_sha1_one(buf);
 2590: 	memcpy(place, buf2->v, sizeof(cookie_t));
 2591: 
 2592: 	sa1 = val2str(place, sizeof (cookie_t));
 2593: 	plog(LLV_DEBUG, LOCATION, NULL, "new cookie:\n%s\n", sa1);
 2594: 	racoon_free(sa1);
 2595: 
 2596: 	error = 0;
 2597: end:
 2598: 	if (buf != NULL)
 2599: 		vfree(buf);
 2600: 	if (buf2 != NULL)
 2601: 		vfree(buf2);
 2602: 	return error;
 2603: }
 2604: 
 2605: /*
 2606:  * save partner's(payload) data into phhandle.
 2607:  */
 2608: int
 2609: isakmp_p2ph(buf, gen)
 2610: 	vchar_t **buf;
 2611: 	struct isakmp_gen *gen;
 2612: {
 2613: 	/* XXX to be checked in each functions for logging. */
 2614: 	if (*buf) {
 2615: 		plog(LLV_WARNING, LOCATION, NULL,
 2616: 			"ignore this payload, same payload type exist.\n");
 2617: 		return -1;
 2618: 	}
 2619: 
 2620: 	*buf = vmalloc(ntohs(gen->len) - sizeof(*gen));
 2621: 	if (*buf == NULL) {
 2622: 		plog(LLV_ERROR, LOCATION, NULL,
 2623: 			"failed to get buffer.\n");
 2624: 		return -1;
 2625: 	}
 2626: 	memcpy((*buf)->v, gen + 1, (*buf)->l);
 2627: 
 2628: 	return 0;
 2629: }
 2630: 
 2631: u_int32_t
 2632: isakmp_newmsgid2(iph1)
 2633: 	struct ph1handle *iph1;
 2634: {
 2635: 	u_int32_t msgid2;
 2636: 
 2637: 	do {
 2638: 		msgid2 = eay_random();
 2639: 	} while (getph2bymsgid(iph1, msgid2));
 2640: 
 2641: 	return msgid2;
 2642: }
 2643: 
 2644: /*
 2645:  * set values into allocated buffer of isakmp header for phase 1
 2646:  */
 2647: static caddr_t
 2648: set_isakmp_header(vbuf, iph1, nptype, etype, flags, msgid)
 2649: 	vchar_t *vbuf;
 2650: 	struct ph1handle *iph1;
 2651: 	int nptype;
 2652: 	u_int8_t etype;
 2653: 	u_int8_t flags;
 2654: 	u_int32_t msgid;
 2655: {
 2656: 	struct isakmp *isakmp;
 2657: 
 2658: 	if (vbuf->l < sizeof(*isakmp))
 2659: 		return NULL;
 2660: 
 2661: 	isakmp = (struct isakmp *)vbuf->v;
 2662: 
 2663: 	memcpy(&isakmp->i_ck, &iph1->index.i_ck, sizeof(cookie_t));
 2664: 	memcpy(&isakmp->r_ck, &iph1->index.r_ck, sizeof(cookie_t));
 2665: 	isakmp->np = nptype;
 2666: 	isakmp->v = iph1->version;
 2667: 	isakmp->etype = etype;
 2668: 	isakmp->flags = flags;
 2669: 	isakmp->msgid = msgid;
 2670: 	isakmp->len = htonl(vbuf->l);
 2671: 
 2672: 	return vbuf->v + sizeof(*isakmp);
 2673: }
 2674: 
 2675: /*
 2676:  * set values into allocated buffer of isakmp header for phase 1
 2677:  */
 2678: caddr_t
 2679: set_isakmp_header1(vbuf, iph1, nptype)
 2680: 	vchar_t *vbuf;
 2681: 	struct ph1handle *iph1;
 2682: 	int nptype;
 2683: {
 2684: 	return set_isakmp_header (vbuf, iph1, nptype, iph1->etype, iph1->flags, iph1->msgid);
 2685: }
 2686: 
 2687: /*
 2688:  * set values into allocated buffer of isakmp header for phase 2
 2689:  */
 2690: caddr_t
 2691: set_isakmp_header2(vbuf, iph2, nptype)
 2692: 	vchar_t *vbuf;
 2693: 	struct ph2handle *iph2;
 2694: 	int nptype;
 2695: {
 2696: 	return set_isakmp_header (vbuf, iph2->ph1, nptype, ISAKMP_ETYPE_QUICK, iph2->flags, iph2->msgid);
 2697: }
 2698: 
 2699: /*
 2700:  * set values into allocated buffer of isakmp payload.
 2701:  */
 2702: caddr_t
 2703: set_isakmp_payload(buf, src, nptype)
 2704: 	caddr_t buf;
 2705: 	vchar_t *src;
 2706: 	int nptype;
 2707: {
 2708: 	struct isakmp_gen *gen;
 2709: 	caddr_t p = buf;
 2710: 
 2711: 	plog(LLV_DEBUG, LOCATION, NULL, "add payload of len %zu, next type %d\n",
 2712: 	    src->l, nptype);
 2713: 
 2714: 	gen = (struct isakmp_gen *)p;
 2715: 	gen->np = nptype;
 2716: 	gen->len = htons(sizeof(*gen) + src->l);
 2717: 	p += sizeof(*gen);
 2718: 	memcpy(p, src->v, src->l);
 2719: 	p += src->l;
 2720: 
 2721: 	return p;
 2722: }
 2723: 
 2724: static int
 2725: etypesw1(etype)
 2726: 	int etype;
 2727: {
 2728: 	switch (etype) {
 2729: 	case ISAKMP_ETYPE_IDENT:
 2730: 		return 1;
 2731: 	case ISAKMP_ETYPE_AGG:
 2732: 		return 2;
 2733: 	case ISAKMP_ETYPE_BASE:
 2734: 		return 3;
 2735: 	default:
 2736: 		return 0;
 2737: 	}
 2738: 	/*NOTREACHED*/
 2739: }
 2740: 
 2741: static int
 2742: etypesw2(etype)
 2743: 	int etype;
 2744: {
 2745: 	switch (etype) {
 2746: 	case ISAKMP_ETYPE_QUICK:
 2747: 		return 1;
 2748: 	default:
 2749: 		return 0;
 2750: 	}
 2751: 	/*NOTREACHED*/
 2752: }
 2753: 
 2754: #ifdef HAVE_PRINT_ISAKMP_C
 2755: /* for print-isakmp.c */
 2756: char *snapend;
 2757: extern void isakmp_print __P((const u_char *, u_int, const u_char *));
 2758: 
 2759: char *getname __P((const u_char *));
 2760: #ifdef INET6
 2761: char *getname6 __P((const u_char *));
 2762: #endif
 2763: int safeputchar __P((int));
 2764: 
 2765: /*
 2766:  * Return a name for the IP address pointed to by ap.  This address
 2767:  * is assumed to be in network byte order.
 2768:  */
 2769: char *
 2770: getname(ap)
 2771: 	const u_char *ap;
 2772: {
 2773: 	struct sockaddr_in addr;
 2774: 	static char ntop_buf[NI_MAXHOST];
 2775: 
 2776: 	memset(&addr, 0, sizeof(addr));
 2777: #ifndef __linux__
 2778: 	addr.sin_len = sizeof(struct sockaddr_in);
 2779: #endif
 2780: 	addr.sin_family = AF_INET;
 2781: 	memcpy(&addr.sin_addr, ap, sizeof(addr.sin_addr));
 2782: 	if (getnameinfo((struct sockaddr *)&addr, sizeof(addr),
 2783: 			ntop_buf, sizeof(ntop_buf), NULL, 0,
 2784: 			NI_NUMERICHOST | niflags))
 2785: 		strlcpy(ntop_buf, "?", sizeof(ntop_buf));
 2786: 
 2787: 	return ntop_buf;
 2788: }
 2789: 
 2790: #ifdef INET6
 2791: /*
 2792:  * Return a name for the IP6 address pointed to by ap.  This address
 2793:  * is assumed to be in network byte order.
 2794:  */
 2795: char *
 2796: getname6(ap)
 2797: 	const u_char *ap;
 2798: {
 2799: 	struct sockaddr_in6 addr;
 2800: 	static char ntop_buf[NI_MAXHOST];
 2801: 
 2802: 	memset(&addr, 0, sizeof(addr));
 2803: 	addr.sin6_len = sizeof(struct sockaddr_in6);
 2804: 	addr.sin6_family = AF_INET6;
 2805: 	memcpy(&addr.sin6_addr, ap, sizeof(addr.sin6_addr));
 2806: 	if (getnameinfo((struct sockaddr *)&addr, addr.sin6_len,
 2807: 			ntop_buf, sizeof(ntop_buf), NULL, 0,
 2808: 			NI_NUMERICHOST | niflags))
 2809: 		strlcpy(ntop_buf, "?", sizeof(ntop_buf));
 2810: 
 2811: 	return ntop_buf;
 2812: }
 2813: #endif /* INET6 */
 2814: 
 2815: int
 2816: safeputchar(c)
 2817: 	int c;
 2818: {
 2819: 	unsigned char ch;
 2820: 
 2821: 	ch = (unsigned char)(c & 0xff);
 2822: 	if (c < 0x80 && isprint(c))
 2823: 		return printf("%c", c & 0xff);
 2824: 	else
 2825: 		return printf("\\%03o", c & 0xff);
 2826: }
 2827: 
 2828: void
 2829: isakmp_printpacket(msg, from, my, decoded)
 2830: 	vchar_t *msg;
 2831: 	struct sockaddr *from;
 2832: 	struct sockaddr *my;
 2833: 	int decoded;
 2834: {
 2835: #ifdef YIPS_DEBUG
 2836: 	struct timeval tv;
 2837: 	int s;
 2838: 	char hostbuf[NI_MAXHOST];
 2839: 	char portbuf[NI_MAXSERV];
 2840: 	struct isakmp *isakmp;
 2841: 	vchar_t *buf;
 2842: #endif
 2843: 
 2844: 	if (loglevel < LLV_DEBUG)
 2845: 		return;
 2846: 
 2847: #ifdef YIPS_DEBUG
 2848: 	plog(LLV_DEBUG, LOCATION, NULL, "begin.\n");
 2849: 
 2850: 	gettimeofday(&tv, NULL);
 2851: 	s = tv.tv_sec % 3600;
 2852: 	printf("%02d:%02d.%06u ", s / 60, s % 60, (u_int32_t)tv.tv_usec);
 2853: 
 2854: 	if (from) {
 2855: 		if (getnameinfo(from, sysdep_sa_len(from), hostbuf, sizeof(hostbuf),
 2856: 				portbuf, sizeof(portbuf),
 2857: 				NI_NUMERICHOST | NI_NUMERICSERV | niflags)) {
 2858: 			strlcpy(hostbuf, "?", sizeof(hostbuf));
 2859: 			strlcpy(portbuf, "?", sizeof(portbuf));
 2860: 		}
 2861: 		printf("%s:%s", hostbuf, portbuf);
 2862: 	} else
 2863: 		printf("?");
 2864: 	printf(" -> ");
 2865: 	if (my) {
 2866: 		if (getnameinfo(my, sysdep_sa_len(my), hostbuf, sizeof(hostbuf),
 2867: 				portbuf, sizeof(portbuf),
 2868: 				NI_NUMERICHOST | NI_NUMERICSERV | niflags)) {
 2869: 			strlcpy(hostbuf, "?", sizeof(hostbuf));
 2870: 			strlcpy(portbuf, "?", sizeof(portbuf));
 2871: 		}
 2872: 		printf("%s:%s", hostbuf, portbuf);
 2873: 	} else
 2874: 		printf("?");
 2875: 	printf(": ");
 2876: 
 2877: 	buf = vdup(msg);
 2878: 	if (!buf) {
 2879: 		printf("(malloc fail)\n");
 2880: 		return;
 2881: 	}
 2882: 	if (decoded) {
 2883: 		isakmp = (struct isakmp *)buf->v;
 2884: 		if (isakmp->flags & ISAKMP_FLAG_E) {
 2885: #if 0
 2886: 			int pad;
 2887: 			pad = *(u_char *)(buf->v + buf->l - 1);
 2888: 			if (buf->l < pad && 2 < vflag)
 2889: 				printf("(wrong padding)");
 2890: #endif
 2891: 			isakmp->flags &= ~ISAKMP_FLAG_E;
 2892: 		}
 2893: 	}
 2894: 
 2895: 	snapend = buf->v + buf->l;
 2896: 	isakmp_print(buf->v, buf->l, NULL);
 2897: 	vfree(buf);
 2898: 	printf("\n");
 2899: 	fflush(stdout);
 2900: 
 2901: 	return;
 2902: #endif
 2903: }
 2904: #endif /*HAVE_PRINT_ISAKMP_C*/
 2905: 
 2906: int
 2907: copy_ph1addresses(iph1, rmconf, remote, local)
 2908: 	struct ph1handle *iph1;
 2909: 	struct remoteconf *rmconf;
 2910: 	struct sockaddr *remote, *local;
 2911: {
 2912: 	u_int16_t port;
 2913: 
 2914: 	/* address portion must be grabbed from real remote address "remote" */
 2915: 	iph1->remote = dupsaddr(remote);
 2916: 	if (iph1->remote == NULL)
 2917: 		return -1;
 2918: 
 2919: 	/*
 2920: 	 * if remote has no port # (in case of initiator - from ACQUIRE msg)
 2921: 	 * - if remote.conf specifies port #, use that
 2922: 	 * - if remote.conf does not, use 500
 2923: 	 * if remote has port # (in case of responder - from recvfrom(2))
 2924: 	 * respect content of "remote".
 2925: 	 */
 2926: 	if (extract_port(iph1->remote) == 0) {
 2927: 		port = 0;
 2928: 		if (rmconf != NULL)
 2929: 			port = extract_port(rmconf->remote);
 2930: 		if (port == 0)
 2931: 			port = PORT_ISAKMP;
 2932: 		set_port(iph1->remote, port);
 2933: 	}
 2934: 
 2935: 	if (local == NULL)
 2936: 		iph1->local = getlocaladdr(iph1->remote);
 2937: 	else
 2938: 		iph1->local = dupsaddr(local);
 2939: 	if (iph1->local == NULL)
 2940: 		return -1;
 2941: 
 2942: 	if (extract_port(iph1->local) == 0) {
 2943: 		port = myaddr_getsport(iph1->local);
 2944: 		if (port == 0)
 2945: 			port = PORT_ISAKMP;
 2946: 		set_port(iph1->local, port);
 2947: 	}
 2948: 
 2949: #ifdef ENABLE_NATT
 2950: 	if (extract_port(iph1->local) == lcconf->port_isakmp_natt) {
 2951: 		plog(LLV_DEBUG, LOCATION, NULL, "Marking ports as changed\n");
 2952: 		iph1->natt_flags |= NAT_ADD_NON_ESP_MARKER;
 2953: 	}
 2954: #endif
 2955: 
 2956: 	return 0;
 2957: }
 2958: 
 2959: static int
 2960: nostate1(iph1, msg)
 2961: 	struct ph1handle *iph1;
 2962: 	vchar_t *msg;
 2963: {
 2964: 	plog(LLV_ERROR, LOCATION, iph1->remote, "wrong state %u.\n",
 2965: 			iph1->status);
 2966: 	return -1;
 2967: }
 2968: 
 2969: static int
 2970: nostate2(iph2, msg)
 2971: 	struct ph2handle *iph2;
 2972: 	vchar_t *msg;
 2973: {
 2974: 	plog(LLV_ERROR, LOCATION, iph2->ph1->remote, "wrong state %u.\n",
 2975: 		iph2->status);
 2976: 	return -1;
 2977: }
 2978: 
 2979: void
 2980: log_ph1established(iph1)
 2981: 	const struct ph1handle *iph1;
 2982: {
 2983: 	char *src, *dst;
 2984: 
 2985: 	src = racoon_strdup(saddr2str(iph1->local));
 2986: 	dst = racoon_strdup(saddr2str(iph1->remote));
 2987: 	STRDUP_FATAL(src);
 2988: 	STRDUP_FATAL(dst);
 2989: 
 2990: 	plog(LLV_INFO, LOCATION, NULL,
 2991: 		"ISAKMP-SA established %s-%s spi:%s\n",
 2992: 		src, dst,
 2993: 		isakmp_pindex(&iph1->index, 0));
 2994: 
 2995: 	evt_phase1(iph1, EVT_PHASE1_UP, NULL);
 2996: 	if(!iph1->rmconf->mode_cfg)
 2997: 		evt_phase1(iph1, EVT_PHASE1_MODE_CFG, NULL);
 2998: 
 2999: 	racoon_free(src);
 3000: 	racoon_free(dst);
 3001: 
 3002: 	return;
 3003: }
 3004: 
 3005: struct payload_list *
 3006: isakmp_plist_append_full (struct payload_list *plist, vchar_t *payload,
 3007: 			  u_int8_t payload_type, u_int8_t free_payload)
 3008: {
 3009: 	if (! plist) {
 3010: 		plist = racoon_malloc (sizeof (struct payload_list));
 3011: 		plist->prev = NULL;
 3012: 	}
 3013: 	else {
 3014: 		plist->next = racoon_malloc (sizeof (struct payload_list));
 3015: 		plist->next->prev = plist;
 3016: 		plist = plist->next;
 3017: 	}
 3018: 
 3019: 	plist->next = NULL;
 3020: 	plist->payload = payload;
 3021: 	plist->payload_type = payload_type;
 3022: 	plist->free_payload = free_payload;
 3023: 
 3024: 	return plist;
 3025: }
 3026: 
 3027: vchar_t *
 3028: isakmp_plist_set_all (struct payload_list **plist, struct ph1handle *iph1)
 3029: {
 3030: 	struct payload_list *ptr = *plist, *first;
 3031: 	size_t tlen = sizeof (struct isakmp), n = 0;
 3032: 	vchar_t *buf = NULL;
 3033: 	char *p;
 3034: 
 3035: 	/* Seek to the first item.  */
 3036: 	while (ptr->prev) ptr = ptr->prev;
 3037: 	first = ptr;
 3038: 
 3039: 	/* Compute the whole length.  */
 3040: 	while (ptr) {
 3041: 		tlen += ptr->payload->l + sizeof (struct isakmp_gen);
 3042: 		ptr = ptr->next;
 3043: 	}
 3044: 
 3045: 	buf = vmalloc(tlen);
 3046: 	if (buf == NULL) {
 3047: 		plog(LLV_ERROR, LOCATION, NULL,
 3048: 			"failed to get buffer to send.\n");
 3049: 		goto end;
 3050: 	}
 3051: 
 3052: 	ptr = first;
 3053: 
 3054: 	p = set_isakmp_header1(buf, iph1, ptr->payload_type);
 3055: 	if (p == NULL)
 3056: 		goto end;
 3057: 
 3058: 	while (ptr)
 3059: 	{
 3060: 		p = set_isakmp_payload (p, ptr->payload, ptr->next ? ptr->next->payload_type : ISAKMP_NPTYPE_NONE);
 3061: 		first = ptr;
 3062: 		ptr = ptr->next;
 3063: 		if (first->free_payload)
 3064: 			vfree(first->payload);
 3065: 		racoon_free (first);
 3066: 		/* ptr->prev = NULL; first = NULL; ... omitted.  */
 3067: 		n++;
 3068: 	}
 3069: 
 3070: 	*plist = NULL;
 3071: 
 3072: 	return buf;
 3073: end:
 3074: 	if (buf != NULL)
 3075: 		vfree(buf);
 3076: 	return NULL;
 3077: }
 3078: 
 3079: #ifdef ENABLE_FRAG
 3080: int
 3081: frag_handler(iph1, msg, remote, local)
 3082: 	struct ph1handle *iph1;
 3083: 	vchar_t *msg;
 3084: 	struct sockaddr *remote;
 3085: 	struct sockaddr *local;
 3086: {
 3087: 	vchar_t *newmsg;
 3088: 
 3089: 	if (isakmp_frag_extract(iph1, msg) == 1) {
 3090: 		if ((newmsg = isakmp_frag_reassembly(iph1)) == NULL) {
 3091: 			plog(LLV_ERROR, LOCATION, remote,
 3092: 			    "Packet reassembly failed\n");
 3093: 			return -1;
 3094: 		}
 3095: 		return isakmp_main(newmsg, remote, local);
 3096: 	}
 3097: 
 3098: 	return 0;
 3099: }
 3100: #endif
 3101: 
 3102: void
 3103: script_hook(iph1, script)
 3104: 	struct ph1handle *iph1;
 3105: 	int script;
 3106: {
 3107: #define IP_MAX 40
 3108: #define PORT_MAX 6
 3109: 	char addrstr[IP_MAX];
 3110: 	char portstr[PORT_MAX];
 3111: 	char **envp = NULL;
 3112: 	int envc = 1;
 3113: 	char **c;
 3114: 
 3115: 	if (iph1 == NULL ||
 3116: 		iph1->rmconf == NULL ||
 3117: 		iph1->rmconf->script[script] == NULL)
 3118: 		return;
 3119: 
 3120: #ifdef ENABLE_HYBRID
 3121: 	(void)isakmp_cfg_setenv(iph1, &envp, &envc);
 3122: #endif
 3123: 
 3124: 	/* local address */
 3125: 	GETNAMEINFO(iph1->local, addrstr, portstr);
 3126: 
 3127: 	if (script_env_append(&envp, &envc, "LOCAL_ADDR", addrstr) != 0) {
 3128: 		plog(LLV_ERROR, LOCATION, NULL, "Cannot set LOCAL_ADDR\n");
 3129: 		goto out;
 3130: 	}
 3131: 
 3132: 	if (script_env_append(&envp, &envc, "LOCAL_PORT", portstr) != 0) {
 3133: 		plog(LLV_ERROR, LOCATION, NULL, "Cannot set LOCAL_PORT\n");
 3134: 		goto out;
 3135: 	}
 3136: 
 3137: 	/* Peer address */
 3138: 	if (iph1->remote != NULL) {
 3139: 		GETNAMEINFO(iph1->remote, addrstr, portstr);
 3140: 
 3141: 		if (script_env_append(&envp, &envc, 
 3142: 		    "REMOTE_ADDR", addrstr) != 0) {
 3143: 			plog(LLV_ERROR, LOCATION, NULL, 
 3144: 			    "Cannot set REMOTE_ADDR\n");
 3145: 			goto out;
 3146: 		}
 3147: 
 3148: 		if (script_env_append(&envp, &envc, 
 3149: 		    "REMOTE_PORT", portstr) != 0) {
 3150: 			plog(LLV_ERROR, LOCATION, NULL, 
 3151: 			    "Cannot set REMOTEL_PORT\n");
 3152: 			goto out;
 3153: 		}
 3154: 	}
 3155: 
 3156: 	/* Peer identity. */
 3157: 	if (iph1->id_p != NULL) {
 3158: 		if (script_env_append(&envp, &envc, "REMOTE_ID",
 3159: 				      ipsecdoi_id2str(iph1->id_p)) != 0) {
 3160: 			plog(LLV_ERROR, LOCATION, NULL,
 3161: 			     "Cannot set REMOTE_ID\n");
 3162: 			goto out;
 3163: 		}
 3164: 	}
 3165: 
 3166: 	if (privsep_script_exec(iph1->rmconf->script[script]->v, 
 3167: 	    script, envp) != 0) 
 3168: 		plog(LLV_ERROR, LOCATION, NULL, 
 3169: 		    "Script %s execution failed\n", script_names[script]);
 3170: 
 3171: out:
 3172: 	for (c = envp; *c; c++)
 3173: 		racoon_free(*c);
 3174: 
 3175: 	racoon_free(envp);
 3176: 
 3177: 	return;
 3178: }
 3179: 
 3180: int
 3181: script_env_append(envp, envc, name, value)
 3182: 	char ***envp;
 3183: 	int *envc;
 3184: 	char *name;
 3185: 	char *value;
 3186: {
 3187: 	char *envitem;
 3188: 	char **newenvp;
 3189: 	int newenvc;
 3190: 
 3191: 	envitem = racoon_malloc(strlen(name) + 1 + strlen(value) + 1);
 3192: 	if (envitem == NULL) {
 3193: 		plog(LLV_ERROR, LOCATION, NULL,
 3194: 		    "Cannot allocate memory: %s\n", strerror(errno));
 3195: 		return -1;
 3196: 	}
 3197: 	sprintf(envitem, "%s=%s", name, value);
 3198: 
 3199: 	newenvc = (*envc) + 1;
 3200: 	newenvp = racoon_realloc(*envp, newenvc * sizeof(char *));
 3201: 	if (newenvp == NULL) {
 3202: 		plog(LLV_ERROR, LOCATION, NULL,
 3203: 		    "Cannot allocate memory: %s\n", strerror(errno));
 3204: 		racoon_free(envitem);
 3205: 		return -1;
 3206: 	}
 3207: 
 3208: 	newenvp[newenvc - 2] = envitem;
 3209: 	newenvp[newenvc - 1] = NULL;
 3210: 
 3211: 	*envp = newenvp;
 3212: 	*envc = newenvc;
 3213: 	return 0;
 3214: }
 3215: 
 3216: int
 3217: script_exec(script, name, envp)
 3218: 	char *script;
 3219: 	int name;
 3220: 	char *const envp[];
 3221: {
 3222: 	char *argv[] = { NULL, NULL, NULL };
 3223: 
 3224: 	argv[0] = script;
 3225: 	argv[1] = script_names[name];
 3226: 	argv[2] = NULL;
 3227: 
 3228: 	switch (fork()) {
 3229: 	case 0:
 3230: 		execve(argv[0], argv, envp);
 3231: 		plog(LLV_ERROR, LOCATION, NULL,
 3232: 		    "execve(\"%s\") failed: %s\n",
 3233: 		    argv[0], strerror(errno));
 3234: 		_exit(1);
 3235: 		break;
 3236: 	case -1:
 3237: 		plog(LLV_ERROR, LOCATION, NULL,
 3238: 		    "Cannot fork: %s\n", strerror(errno));
 3239: 		return -1;
 3240: 		break;
 3241: 	default:
 3242: 		break;
 3243: 	}
 3244: 	return 0;
 3245: 
 3246: }
 3247: 
 3248: void
 3249: purge_remote(iph1)
 3250: 	struct ph1handle *iph1;
 3251: {
 3252: 	vchar_t *buf = NULL;
 3253: 	struct sadb_msg *msg, *next, *end;
 3254: 	struct sadb_sa *sa;
 3255: 	struct sockaddr *src, *dst;
 3256: 	caddr_t mhp[SADB_EXT_MAX + 1];
 3257: 	u_int proto_id;
 3258: 	struct ph2handle *iph2;
 3259: 	struct ph1handle *new_iph1;
 3260: 
 3261: 	plog(LLV_INFO, LOCATION, NULL,
 3262: 		 "purging ISAKMP-SA spi=%s.\n",
 3263: 		 isakmp_pindex(&(iph1->index), iph1->msgid));
 3264: 
 3265: 	/* Mark as expired. */
 3266: 	iph1->status = PHASE1ST_EXPIRED;
 3267: 
 3268: 	/* Check if we have another, still valid, phase1 SA. */
 3269: 	new_iph1 = getph1(iph1, iph1->local, iph1->remote, GETPH1_F_ESTABLISHED);
 3270: 
 3271: 	/*
 3272: 	 * Delete all orphaned or binded to the deleting ph1handle phase2 SAs.
 3273: 	 * Keep all others phase2 SAs.
 3274: 	 */
 3275: 	buf = pfkey_dump_sadb(SADB_SATYPE_UNSPEC);
 3276: 	if (buf == NULL) {
 3277: 		plog(LLV_DEBUG, LOCATION, NULL,
 3278: 			"pfkey_dump_sadb returned nothing.\n");
 3279: 		return;
 3280: 	}
 3281: 
 3282: 	msg = (struct sadb_msg *)buf->v;
 3283: 	end = (struct sadb_msg *)(buf->v + buf->l);
 3284: 
 3285: 	while (msg < end) {
 3286: 		if ((msg->sadb_msg_len << 3) < sizeof(*msg))
 3287: 			break;
 3288: 		next = (struct sadb_msg *)((caddr_t)msg + (msg->sadb_msg_len << 3));
 3289: 		if (msg->sadb_msg_type != SADB_DUMP) {
 3290: 			msg = next;
 3291: 			continue;
 3292: 		}
 3293: 
 3294: 		if (pfkey_align(msg, mhp) || pfkey_check(mhp)) {
 3295: 			plog(LLV_ERROR, LOCATION, NULL,
 3296: 				"pfkey_check (%s)\n", ipsec_strerror());
 3297: 			msg = next;
 3298: 			continue;
 3299: 		}
 3300: 
 3301: 		sa = (struct sadb_sa *)(mhp[SADB_EXT_SA]);
 3302: 		if (!sa ||
 3303: 		    !mhp[SADB_EXT_ADDRESS_SRC] ||
 3304: 		    !mhp[SADB_EXT_ADDRESS_DST]) {
 3305: 			msg = next;
 3306: 			continue;
 3307: 		}
 3308: 		pk_fixup_sa_addresses(mhp);
 3309: 		src = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_SRC]);
 3310: 		dst = PFKEY_ADDR_SADDR(mhp[SADB_EXT_ADDRESS_DST]);
 3311: 
 3312: 		if (sa->sadb_sa_state != SADB_SASTATE_LARVAL &&
 3313: 		    sa->sadb_sa_state != SADB_SASTATE_MATURE &&
 3314: 		    sa->sadb_sa_state != SADB_SASTATE_DYING) {
 3315: 			msg = next;
 3316: 			continue;
 3317: 		}
 3318: 
 3319: 		/*
 3320: 		 * check in/outbound SAs.
 3321: 		 * Select only SAs where src == local and dst == remote (outgoing)
 3322: 		 * or src == remote and dst == local (incoming).
 3323: 		 */
 3324: 		if ((cmpsaddr(iph1->local, src) != CMPSADDR_MATCH ||
 3325: 		     cmpsaddr(iph1->remote, dst) != CMPSADDR_MATCH) &&
 3326: 		    (cmpsaddr(iph1->local, dst) != CMPSADDR_MATCH ||
 3327: 		     cmpsaddr(iph1->remote, src) != CMPSADDR_MATCH)) {
 3328: 			msg = next;
 3329: 			continue;
 3330: 		}
 3331: 
 3332: 		proto_id = pfkey2ipsecdoi_proto(msg->sadb_msg_satype);
 3333: 		iph2 = getph2bysaidx(src, dst, proto_id, sa->sadb_sa_spi);
 3334: 
 3335: 		/* Check if there is another valid ISAKMP-SA */
 3336: 		if (new_iph1 != NULL) {
 3337: 
 3338: 			if (iph2 == NULL) {
 3339: 				/* No handler... still send a pfkey_delete message, but log this !*/
 3340: 				plog(LLV_INFO, LOCATION, NULL,
 3341: 					"Unknown IPsec-SA spi=%u, hmmmm?\n",
 3342: 					ntohl(sa->sadb_sa_spi));
 3343: 			}else{
 3344: 
 3345: 				/*
 3346: 				 * If we have a new ph1, do not purge IPsec-SAs binded
 3347: 				 *  to a different ISAKMP-SA
 3348: 				 */
 3349: 				if (iph2->ph1 != NULL && iph2->ph1 != iph1){
 3350: 					msg = next;
 3351: 					continue;
 3352: 				}
 3353: 
 3354: 				/* If the ph2handle is established, do not purge IPsec-SA */
 3355: 				if (iph2->status == PHASE2ST_ESTABLISHED ||
 3356: 					iph2->status == PHASE2ST_EXPIRED) {
 3357: 
 3358: 					plog(LLV_INFO, LOCATION, NULL,
 3359: 						 "keeping IPsec-SA spi=%u - found valid ISAKMP-SA spi=%s.\n",
 3360: 						 ntohl(sa->sadb_sa_spi),
 3361: 						 isakmp_pindex(&(new_iph1->index), new_iph1->msgid));
 3362: 					msg = next;
 3363: 					continue;
 3364: 				}
 3365: 			}
 3366: 		}
 3367: 
 3368: 
 3369: 		pfkey_send_delete(lcconf->sock_pfkey,
 3370: 				  msg->sadb_msg_satype,
 3371: 				  IPSEC_MODE_ANY,
 3372: 				  src, dst, sa->sadb_sa_spi);
 3373: 
 3374: 		/* delete a relative phase 2 handle. */
 3375: 		if (iph2 != NULL) {
 3376: 			delete_spd(iph2, 0);
 3377: 			remph2(iph2);
 3378: 			delph2(iph2);
 3379: 		}
 3380: 
 3381: 		plog(LLV_INFO, LOCATION, NULL,
 3382: 			 "purged IPsec-SA spi=%u.\n",
 3383: 			 ntohl(sa->sadb_sa_spi));
 3384: 
 3385: 		msg = next;
 3386: 	}
 3387: 
 3388: 	if (buf)
 3389: 		vfree(buf);
 3390: 
 3391: 	/* Mark the phase1 handler as EXPIRED */
 3392: 	plog(LLV_INFO, LOCATION, NULL,
 3393: 		 "purged ISAKMP-SA spi=%s.\n",
 3394: 		 isakmp_pindex(&(iph1->index), iph1->msgid));
 3395: 
 3396: 	isakmp_ph1delete(iph1);
 3397: }
 3398: 
 3399: void
 3400: delete_spd(iph2, created)
 3401: 	struct ph2handle *iph2;
 3402:  	u_int64_t created;
 3403: {
 3404: 	struct policyindex spidx;
 3405: 	struct sockaddr_storage addr;
 3406: 	u_int8_t pref;
 3407: 	struct sockaddr *src;
 3408: 	struct sockaddr *dst;
 3409: 	int error;
 3410: 	int idi2type = 0;/* switch whether copy IDs into id[src,dst]. */
 3411: 
 3412: 	if (iph2 == NULL)
 3413: 		return;
 3414: 
 3415: 	/* Delete the SPD entry if we generated it
 3416: 	 */
 3417: 	if (! iph2->generated_spidx )
 3418: 		return;
 3419: 
 3420: 	src = iph2->src;
 3421: 	dst = iph2->dst;
 3422: 
 3423: 	plog(LLV_INFO, LOCATION, NULL,
 3424: 		 "deleting a generated policy.\n");
 3425: 
 3426: 	memset(&spidx, 0, sizeof(spidx));
 3427: 	iph2->spidx_gen = (caddr_t )&spidx;
 3428: 
 3429: 	/* make inbound policy */
 3430: 	iph2->src = dst;
 3431: 	iph2->dst = src;
 3432: 	spidx.dir = IPSEC_DIR_INBOUND;
 3433: 	spidx.ul_proto = 0;
 3434: 
 3435: 	/*
 3436: 	 * Note: code from get_proposal_r
 3437: 	 */
 3438: 
 3439: #define _XIDT(d) ((struct ipsecdoi_id_b *)(d)->v)->type
 3440: 
 3441: 	/*
 3442: 	 * make destination address in spidx from either ID payload
 3443: 	 * or phase 1 address into a address in spidx.
 3444: 	 */
 3445: 	if (iph2->id != NULL
 3446: 		&& (_XIDT(iph2->id) == IPSECDOI_ID_IPV4_ADDR
 3447: 			|| _XIDT(iph2->id) == IPSECDOI_ID_IPV6_ADDR
 3448: 			|| _XIDT(iph2->id) == IPSECDOI_ID_IPV4_ADDR_SUBNET
 3449: 			|| _XIDT(iph2->id) == IPSECDOI_ID_IPV6_ADDR_SUBNET)) {
 3450: 		/* get a destination address of a policy */
 3451: 		error = ipsecdoi_id2sockaddr(iph2->id,
 3452: 									 (struct sockaddr *)&spidx.dst,
 3453: 									 &spidx.prefd, &spidx.ul_proto);
 3454: 		if (error)
 3455: 			goto purge;
 3456: 
 3457: #ifdef INET6
 3458: 		/*
 3459: 		 * get scopeid from the SA address.
 3460: 		 * note that the phase 1 source address is used as
 3461: 		 * a destination address to search for a inbound
 3462: 		 * policy entry because rcoon is responder.
 3463: 		 */
 3464: 		if (_XIDT(iph2->id) == IPSECDOI_ID_IPV6_ADDR) {
 3465: 			if ((error =
 3466: 				 setscopeid((struct sockaddr *)&spidx.dst,
 3467: 							iph2->src)) != 0)
 3468: 				goto purge;
 3469: 		}
 3470: #endif
 3471: 
 3472: 		if (_XIDT(iph2->id) == IPSECDOI_ID_IPV4_ADDR
 3473: 			|| _XIDT(iph2->id) == IPSECDOI_ID_IPV6_ADDR)
 3474: 			idi2type = _XIDT(iph2->id);
 3475: 
 3476: 	} else {
 3477: 
 3478: 		plog(LLV_DEBUG, LOCATION, NULL,
 3479: 			 "get a destination address of SP index "
 3480: 			 "from phase1 address "
 3481: 			 "due to no ID payloads found "
 3482: 			 "OR because ID type is not address.\n");
 3483: 
 3484: 		/*
 3485: 		 * copy the SOURCE address of IKE into the
 3486: 		 * DESTINATION address of the key to search the
 3487: 		 * SPD because the direction of policy is inbound.
 3488: 		 */
 3489: 		memcpy(&spidx.dst, iph2->src, sysdep_sa_len(iph2->src));
 3490: 		switch (spidx.dst.ss_family) {
 3491: 		case AF_INET:
 3492: 			spidx.prefd =
 3493: 				sizeof(struct in_addr) << 3;
 3494: 			break;
 3495: #ifdef INET6
 3496: 		case AF_INET6:
 3497: 			spidx.prefd =
 3498: 				sizeof(struct in6_addr) << 3;
 3499: 			break;
 3500: #endif
 3501: 		default:
 3502: 			spidx.prefd = 0;
 3503: 			break;
 3504: 		}
 3505: 	}
 3506: 
 3507: 		/* make source address in spidx */
 3508: 	if (iph2->id_p != NULL
 3509: 		&& (_XIDT(iph2->id_p) == IPSECDOI_ID_IPV4_ADDR
 3510: 			|| _XIDT(iph2->id_p) == IPSECDOI_ID_IPV6_ADDR
 3511: 			|| _XIDT(iph2->id_p) == IPSECDOI_ID_IPV4_ADDR_SUBNET
 3512: 			|| _XIDT(iph2->id_p) == IPSECDOI_ID_IPV6_ADDR_SUBNET)) {
 3513: 		/* get a source address of inbound SA */
 3514: 		error = ipsecdoi_id2sockaddr(iph2->id_p,
 3515: 					     (struct sockaddr *)&spidx.src,
 3516: 					     &spidx.prefs, &spidx.ul_proto);
 3517: 		if (error)
 3518: 			goto purge;
 3519: 
 3520: #ifdef INET6
 3521: 		/*
 3522: 		 * get scopeid from the SA address.
 3523: 		 * for more detail, see above of this function.
 3524: 		 */
 3525: 		if (_XIDT(iph2->id_p) == IPSECDOI_ID_IPV6_ADDR) {
 3526: 			error =
 3527: 				setscopeid((struct sockaddr *)&spidx.src,
 3528: 						   iph2->dst);
 3529: 			if (error)
 3530: 				goto purge;
 3531: 		}
 3532: #endif
 3533: 
 3534: 		/* make sa_[src,dst] if both ID types are IP address and same */
 3535: 		if (_XIDT(iph2->id_p) == idi2type
 3536: 			&& spidx.dst.ss_family == spidx.src.ss_family) {
 3537: 			iph2->sa_src =
 3538: 				dupsaddr((struct sockaddr *)&spidx.dst);
 3539: 			if (iph2->sa_src == NULL) {
 3540: 				plog(LLV_ERROR, LOCATION, NULL,
 3541: 					 "allocation failed\n");
 3542: 				goto purge;
 3543: 			}
 3544: 			iph2->sa_dst =
 3545: 				dupsaddr((struct sockaddr *)&spidx.src);
 3546: 			if (iph2->sa_dst == NULL) {
 3547: 				plog(LLV_ERROR, LOCATION, NULL,
 3548: 					 "allocation failed\n");
 3549: 				goto purge;
 3550: 			}
 3551: 		}
 3552: 
 3553: 	} else {
 3554: 		plog(LLV_DEBUG, LOCATION, NULL,
 3555: 			 "get a source address of SP index "
 3556: 			 "from phase1 address "
 3557: 			 "due to no ID payloads found "
 3558: 			 "OR because ID type is not address.\n");
 3559: 
 3560: 		/* see above comment. */
 3561: 		memcpy(&spidx.src, iph2->dst, sysdep_sa_len(iph2->dst));
 3562: 		switch (spidx.src.ss_family) {
 3563: 		case AF_INET:
 3564: 			spidx.prefs =
 3565: 				sizeof(struct in_addr) << 3;
 3566: 			break;
 3567: #ifdef INET6
 3568: 		case AF_INET6:
 3569: 			spidx.prefs =
 3570: 				sizeof(struct in6_addr) << 3;
 3571: 			break;
 3572: #endif
 3573: 		default:
 3574: 			spidx.prefs = 0;
 3575: 			break;
 3576: 		}
 3577: 	}
 3578: 
 3579: #undef _XIDT
 3580: 
 3581: 	plog(LLV_DEBUG, LOCATION, NULL,
 3582: 		 "get a src address from ID payload "
 3583: 		 "%s prefixlen=%u ul_proto=%u\n",
 3584: 		 saddr2str((struct sockaddr *)&spidx.src),
 3585: 		 spidx.prefs, spidx.ul_proto);
 3586: 	plog(LLV_DEBUG, LOCATION, NULL,
 3587: 		 "get dst address from ID payload "
 3588: 		 "%s prefixlen=%u ul_proto=%u\n",
 3589: 		 saddr2str((struct sockaddr *)&spidx.dst),
 3590: 		 spidx.prefd, spidx.ul_proto);
 3591: 
 3592: 	/*
 3593: 	 * convert the ul_proto if it is 0
 3594: 	 * because 0 in ID payload means a wild card.
 3595: 	 */
 3596: 	if (spidx.ul_proto == 0)
 3597: 		spidx.ul_proto = IPSEC_ULPROTO_ANY;
 3598: 
 3599: #undef _XIDT
 3600: 
 3601: 	/* Check if the generated SPD has the same timestamp as the SA.
 3602: 	 * If timestamps are different, this means that the SPD entry has been
 3603: 	 * refreshed by another SA, and should NOT be deleted with the current SA.
 3604: 	 */
 3605: 	if( created ){
 3606: 		struct secpolicy *p;
 3607: 
 3608: 		p = getsp(&spidx);
 3609: 		if(p != NULL){
 3610: 			/* just do no test if p is NULL, because this probably just means
 3611: 			 * that the policy has already be deleted for some reason.
 3612: 			 */
 3613: 			if(p->spidx.created != created)
 3614: 				goto purge;
 3615: 		}
 3616: 	}
 3617: 
 3618: 	/* End of code from get_proposal_r
 3619: 	 */
 3620: 
 3621: 	if (pk_sendspddelete(iph2) < 0) {
 3622: 		plog(LLV_ERROR, LOCATION, NULL,
 3623: 			 "pfkey spddelete(inbound) failed.\n");
 3624: 	}else{
 3625: 		plog(LLV_DEBUG, LOCATION, NULL,
 3626: 			 "pfkey spddelete(inbound) sent.\n");
 3627: 	}
 3628: 
 3629: #ifdef HAVE_POLICY_FWD
 3630: 	/* make forward policy if required */
 3631: 	if (tunnel_mode_prop(iph2->approval)) {
 3632: 		spidx.dir = IPSEC_DIR_FWD;
 3633: 		if (pk_sendspddelete(iph2) < 0) {
 3634: 			plog(LLV_ERROR, LOCATION, NULL,
 3635: 				 "pfkey spddelete(forward) failed.\n");
 3636: 		}else{
 3637: 			plog(LLV_DEBUG, LOCATION, NULL,
 3638: 				 "pfkey spddelete(forward) sent.\n");
 3639: 		}
 3640: 	}
 3641: #endif
 3642: 
 3643: 	/* make outbound policy */
 3644: 	iph2->src = src;
 3645: 	iph2->dst = dst;
 3646: 	spidx.dir = IPSEC_DIR_OUTBOUND;
 3647: 	addr = spidx.src;
 3648: 	spidx.src = spidx.dst;
 3649: 	spidx.dst = addr;
 3650: 	pref = spidx.prefs;
 3651: 	spidx.prefs = spidx.prefd;
 3652: 	spidx.prefd = pref;
 3653: 
 3654: 	if (pk_sendspddelete(iph2) < 0) {
 3655: 		plog(LLV_ERROR, LOCATION, NULL,
 3656: 			 "pfkey spddelete(outbound) failed.\n");
 3657: 	}else{
 3658: 		plog(LLV_DEBUG, LOCATION, NULL,
 3659: 			 "pfkey spddelete(outbound) sent.\n");
 3660: 	}
 3661: purge:
 3662: 	iph2->spidx_gen=NULL;
 3663: }
 3664: 
 3665: 
 3666: #ifdef INET6
 3667: u_int32_t
 3668: setscopeid(sp_addr0, sa_addr0)
 3669: 	struct sockaddr *sp_addr0, *sa_addr0;
 3670: {
 3671: 	struct sockaddr_in6 *sp_addr, *sa_addr;
 3672: 
 3673: 	sp_addr = (struct sockaddr_in6 *)sp_addr0;
 3674: 	sa_addr = (struct sockaddr_in6 *)sa_addr0;
 3675: 
 3676: 	if (!IN6_IS_ADDR_LINKLOCAL(&sp_addr->sin6_addr)
 3677: 	 && !IN6_IS_ADDR_SITELOCAL(&sp_addr->sin6_addr)
 3678: 	 && !IN6_IS_ADDR_MULTICAST(&sp_addr->sin6_addr))
 3679: 		return 0;
 3680: 
 3681: 	/* this check should not be here ? */
 3682: 	if (sa_addr->sin6_family != AF_INET6) {
 3683: 		plog(LLV_ERROR, LOCATION, NULL,
 3684: 			"can't get scope ID: family mismatch\n");
 3685: 		return -1;
 3686: 	}
 3687: 
 3688: 	if (!IN6_IS_ADDR_LINKLOCAL(&sa_addr->sin6_addr)) {
 3689: 		plog(LLV_ERROR, LOCATION, NULL,
 3690: 			"scope ID is not supported except of lladdr.\n");
 3691: 		return -1;
 3692: 	}
 3693: 
 3694: 	sp_addr->sin6_scope_id = sa_addr->sin6_scope_id;
 3695: 
 3696: 	return 0;
 3697: }
 3698: #endif

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