File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / ipsec-tools / src / racoon / isakmp_newg.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 22:39:10 2012 UTC (12 years, 4 months ago) by misho
Branches: ipsec-tools, MAIN
CVS tags: v0_8_2p2, v0_8_1p0, v0_8_1, v0_8_0p0, v0_8_0, HEAD
ipsec-tools

    1: /*	$NetBSD: isakmp_newg.c,v 1.4 2006/09/09 16:22:09 manu Exp $	*/
    2: 
    3: /*	$KAME: isakmp_newg.c,v 1.10 2002/09/27 05:55:52 itojun 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: 
   39: #include <stdlib.h>
   40: #include <stdio.h>
   41: #include <string.h>
   42: #include <errno.h>
   43: 
   44: #include "var.h"
   45: #include "misc.h"
   46: #include "vmbuf.h"
   47: #include "plog.h"
   48: #include "sockmisc.h"
   49: #include "debug.h"
   50: 
   51: #include "schedule.h"
   52: #include "cfparse_proto.h"
   53: #include "isakmp_var.h"
   54: #include "isakmp.h"
   55: #include "isakmp_newg.h"
   56: #include "oakley.h"
   57: #include "ipsec_doi.h"
   58: #include "crypto_openssl.h"
   59: #include "handler.h"
   60: #include "pfkey.h"
   61: #include "admin.h"
   62: #include "str2val.h"
   63: #include "vendorid.h"
   64: 
   65: /*
   66:  * New group mode as responder
   67:  */
   68: int
   69: isakmp_newgroup_r(iph1, msg)
   70: 	struct ph1handle *iph1;
   71: 	vchar_t *msg;
   72: {
   73: #if 0
   74: 	struct isakmp *isakmp = (struct isakmp *)msg->v;
   75: 	struct isakmp_pl_hash *hash = NULL;
   76: 	struct isakmp_pl_sa *sa = NULL;
   77: 	int error = -1;
   78: 	vchar_t *buf;
   79: 	struct oakley_sa *osa;
   80: 	int len;
   81: 
   82: 	/* validate the type of next payload */
   83: 	/*
   84: 	 * ISAKMP_ETYPE_NEWGRP,
   85: 	 * ISAKMP_NPTYPE_HASH, (ISAKMP_NPTYPE_VID), ISAKMP_NPTYPE_SA,
   86: 	 * ISAKMP_NPTYPE_NONE
   87: 	 */
   88:     {
   89: 	vchar_t *pbuf = NULL;
   90: 	struct isakmp_parse_t *pa;
   91: 
   92: 	if ((pbuf = isakmp_parse(msg)) == NULL)
   93: 		goto end;
   94: 
   95: 	for (pa = (struct isakmp_parse_t *)pbuf->v;
   96: 	     pa->type != ISAKMP_NPTYPE_NONE;
   97: 	     pa++) {
   98: 
   99: 		switch (pa->type) {
  100: 		case ISAKMP_NPTYPE_HASH:
  101: 			if (hash) {
  102: 				isakmp_info_send_n1(iph1, ISAKMP_NTYPE_INVALID_PAYLOAD_TYPE, NULL);
  103: 				plog(LLV_ERROR, LOCATION, iph1->remote,
  104: 					"received multiple payload type %d.\n",
  105: 					pa->type);
  106: 				vfree(pbuf);
  107: 				goto end;
  108: 			}
  109: 			hash = (struct isakmp_pl_hash *)pa->ptr;
  110: 			break;
  111: 		case ISAKMP_NPTYPE_SA:
  112: 			if (sa) {
  113: 				isakmp_info_send_n1(iph1, ISAKMP_NTYPE_INVALID_PAYLOAD_TYPE, NULL);
  114: 				plog(LLV_ERROR, LOCATION, iph1->remote,
  115: 					"received multiple payload type %d.\n",
  116: 					pa->type);
  117: 				vfree(pbuf);
  118: 				goto end;
  119: 			}
  120: 			sa = (struct isakmp_pl_sa *)pa->ptr;
  121: 			break;
  122: 		case ISAKMP_NPTYPE_VID:
  123: 			(void)check_vendorid(pa->ptr);
  124: 			break;
  125: 		default:
  126: 			isakmp_info_send_n1(iph1, ISAKMP_NTYPE_INVALID_PAYLOAD_TYPE, NULL);
  127: 			plog(LLV_ERROR, LOCATION, iph1->remote,
  128: 				"ignore the packet, "
  129: 				"received unexpecting payload type %d.\n",
  130: 				pa->type);
  131: 			vfree(pbuf);
  132: 			goto end;
  133: 		}
  134: 	}
  135: 	vfree(pbuf);
  136: 
  137: 	if (!hash || !sa) {
  138: 		isakmp_info_send_n1(iph1, ISAKMP_NTYPE_INVALID_PAYLOAD_TYPE, NULL);
  139: 		plog(LLV_ERROR, LOCATION, iph1->remote,
  140: 			"no HASH, or no SA payload.\n");
  141: 		goto end;
  142: 	}
  143:     }
  144: 
  145: 	/* validate HASH */
  146:     {
  147: 	char *r_hash;
  148: 	vchar_t *my_hash = NULL;
  149: 	int result;
  150: 
  151: 	plog(LLV_DEBUG, LOCATION, NULL, "validate HASH\n");
  152: 
  153: 	len = sizeof(isakmp->msgid) + ntohs(sa->h.len);
  154: 	buf = vmalloc(len);
  155: 	if (buf == NULL) {
  156: 		plog(LLV_ERROR, LOCATION, NULL,
  157: 			"failed to get buffer to send.\n");
  158: 		goto end;
  159: 	}
  160: 	memcpy(buf->v, &isakmp->msgid, sizeof(isakmp->msgid));
  161: 	memcpy(buf->v + sizeof(isakmp->msgid), sa, ntohs(sa->h.len));
  162: 
  163: 	plog(LLV_DEBUG, LOCATION, NULL, "hash source\n");
  164: 	plogdump(LLV_DEBUG, buf->v, buf->l);
  165: 
  166: 	my_hash = isakmp_prf(iph1->skeyid_a, buf, iph1);
  167: 	vfree(buf);
  168: 	if (my_hash == NULL)
  169: 		goto end;
  170: 
  171: 	plog(LLV_DEBUG, LOCATION, NULL, "hash result\n");
  172: 	plogdump(LLV_DEBUG, my_hash->v, my_hash->l);
  173: 
  174: 	r_hash = (char *)hash + sizeof(*hash);
  175: 
  176: 	plog(LLV_DEBUG, LOCATION, NULL, "original hash\n"));
  177: 	plogdump(LLV_DEBUG, r_hash, ntohs(hash->h.len) - sizeof(*hash)));
  178: 
  179: 	result = memcmp(my_hash->v, r_hash, my_hash->l);
  180: 	vfree(my_hash);
  181: 
  182: 	if (result) {
  183: 		plog(LLV_ERROR, LOCATION, iph1->remote,
  184: 			"HASH mismatch.\n");
  185: 		isakmp_info_send_n1(iph1, ISAKMP_NTYPE_INVALID_HASH_INFORMATION, NULL);
  186: 		goto end;
  187: 	}
  188:     }
  189: 
  190: 	/* check SA payload and get new one for use */
  191: 	buf = ipsecdoi_get_proposal((struct ipsecdoi_sa *)sa,
  192: 					OAKLEY_NEWGROUP_MODE);
  193: 	if (buf == NULL) {
  194: 		isakmp_info_send_n1(iph1, ISAKMP_NTYPE_ATTRIBUTES_NOT_SUPPORTED, NULL);
  195: 		goto end;
  196: 	}
  197: 
  198: 	/* save sa parameters */
  199: 	osa = ipsecdoi_get_oakley(buf);
  200: 	if (osa == NULL) {
  201: 		isakmp_info_send_n1(iph1, ISAKMP_NTYPE_ATTRIBUTES_NOT_SUPPORTED, NULL);
  202: 		goto end;
  203: 	}
  204: 	vfree(buf);
  205: 
  206: 	switch (osa->dhgrp) {
  207: 	case OAKLEY_ATTR_GRP_DESC_MODP768:
  208: 	case OAKLEY_ATTR_GRP_DESC_MODP1024:
  209: 	case OAKLEY_ATTR_GRP_DESC_MODP1536:
  210: 		/*XXX*/
  211: 	default:
  212: 		isakmp_info_send_n1(iph1, ISAKMP_NTYPE_ATTRIBUTES_NOT_SUPPORTED, NULL);
  213: 		plog(LLV_ERROR, LOCATION, NULL,
  214: 			"dh group %d isn't supported.\n", osa->dhgrp);
  215: 		goto end;
  216: 	}
  217: 
  218: 	plog(LLV_INFO, LOCATION, iph1->remote,
  219: 		"got new dh group %s.\n", isakmp_pindex(&iph1->index, 0));
  220: 
  221: 	error = 0;
  222: 
  223: end:
  224: 	if (error) {
  225: 		if (iph1 != NULL)
  226: 			(void)isakmp_free_ph1(iph1);
  227: 	}
  228: 	return error;
  229: #endif
  230: 	return 0;
  231: }
  232: 

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