1/*	$NetBSD: isakmp_agg.c,v 1.9 2006/09/30 21:49:37 manu Exp $	*/
2
3/* Id: isakmp_agg.c,v 1.28 2006/04/06 16:46:08 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/* Aggressive Exchange (Aggressive Mode) */
35
36#include "config.h"
37
38#include <sys/types.h>
39#include <sys/param.h>
40
41#include <stdlib.h>
42#include <stdio.h>
43#include <string.h>
44#include <errno.h>
45#if TIME_WITH_SYS_TIME
46# include <sys/time.h>
47# include <time.h>
48#else
49# if HAVE_SYS_TIME_H
50#  include <sys/time.h>
51# else
52#  include <time.h>
53# endif
54#endif
55
56#include "var.h"
57#include "misc.h"
58#include "vmbuf.h"
59#include "plog.h"
60#include "sockmisc.h"
61#include "schedule.h"
62#include "debug.h"
63
64#ifdef ENABLE_HYBRID
65#include <resolv.h>
66#endif
67
68#include "fsm.h"
69#include "localconf.h"
70#include "remoteconf.h"
71#include "isakmp_var.h"
72#include "isakmp.h"
73#include "oakley.h"
74#include "handler.h"
75#include "ipsec_doi.h"
76#include "crypto_openssl.h"
77#include "pfkey.h"
78#include "isakmp_agg.h"
79#include "isakmp_inf.h"
80#ifdef ENABLE_HYBRID
81#include "isakmp_xauth.h"
82#include "isakmp_cfg.h"
83#endif
84#ifdef ENABLE_FRAG
85#include "isakmp_frag.h"
86#endif
87#include "vendorid.h"
88#include "strnames.h"
89
90#ifdef ENABLE_NATT
91#include "nattraversal.h"
92#endif
93
94#include "vpn_control.h"
95#include "vpn_control_var.h"
96#include "ipsecSessionTracer.h"
97#include "ipsecMessageTracer.h"
98#ifndef HAVE_OPENSSL
99#include <Security/SecDH.h>
100#endif
101
102/*
103 * begin Aggressive Mode as initiator.
104 */
105/*
106 * send to responder
107 * 	psk: HDR, SA, KE, Ni, IDi1
108 * 	sig: HDR, SA, KE, Ni, IDi1 [, CR ]
109 *   gssapi: HDR, SA, KE, Ni, IDi1, GSSi
110 * 	rsa: HDR, SA, [ HASH(1),] KE, <IDi1_b>Pubkey_r, <Ni_b>Pubkey_r
111 * 	rev: HDR, SA, [ HASH(1),] <Ni_b>Pubkey_r, <KE_b>Ke_i,
112 * 	     <IDii_b>Ke_i [, <Cert-I_b>Ke_i ]
113 */
114int
115agg_i1send(iph1, msg)
116	phase1_handle_t *iph1;
117	vchar_t *msg; /* must be null */
118{
119	struct payload_list *plist = NULL;
120	int need_cr = 0;
121	vchar_t *cr = NULL;
122	int error = -1;
123#ifdef ENABLE_NATT
124	vchar_t *vid_natt[MAX_NATT_VID_COUNT] = { NULL };
125	int i;
126#endif
127#ifdef ENABLE_HYBRID
128	vchar_t *vid_xauth = NULL;
129	vchar_t *vid_unity = NULL;
130#endif
131#ifdef ENABLE_FRAG
132	vchar_t *vid_frag = NULL;
133#endif
134#ifdef ENABLE_DPD
135	vchar_t *vid_dpd = NULL;
136#endif
137
138    /* validity check */
139	if (iph1->status != IKEV1_STATE_AGG_I_START) {
140		plog(ASL_LEVEL_ERR,
141             "status mismatched %d.\n", iph1->status);
142		goto end;
143	}
144
145	/* validity check */
146	if (msg != NULL) {
147		plog(ASL_LEVEL_ERR,
148			"msg has to be NULL in this function.\n");
149		goto end;
150	}
151
152	/* create isakmp index */
153	memset(&iph1->index, 0, sizeof(iph1->index));
154	isakmp_newcookie((caddr_t)&iph1->index, iph1->remote, iph1->local);
155
156	/* make ID payload into isakmp status */
157	if (ipsecdoi_setid1(iph1) < 0) {
158		plog(ASL_LEVEL_ERR,
159			 "failed to set ID");
160		goto end;
161	}
162
163	/* create SA payload for my proposal */
164	iph1->sa = ipsecdoi_setph1proposal(iph1);
165	if (iph1->sa == NULL) {
166		plog(ASL_LEVEL_ERR,
167			 "failed to set proposal");
168		goto end;
169	}
170
171	/* consistency check of proposals */
172	if (iph1->rmconf->dhgrp == NULL) {
173		plog(ASL_LEVEL_ERR,
174			"configuration failure about DH group.\n");
175		goto end;
176	}
177
178	/* generate DH public value */
179#ifdef HAVE_OPENSSL
180	if (oakley_dh_generate(iph1->rmconf->dhgrp,
181						   &iph1->dhpub, &iph1->dhpriv) < 0) {
182#else
183	if (oakley_dh_generate(iph1->rmconf->dhgrp,
184						   &iph1->dhpub, &iph1->publicKeySize, &iph1->dhC) < 0) {
185#endif
186		plog(ASL_LEVEL_ERR,
187			 "failed to generate DH");
188		goto end;
189	}
190
191	/* generate NONCE value */
192	iph1->nonce = eay_set_random(iph1->rmconf->nonce_size);
193	if (iph1->nonce == NULL) {
194		plog(ASL_LEVEL_ERR,
195			 "failed to generate NONCE");
196		goto end;
197	}
198
199#ifdef ENABLE_HYBRID
200	/* Do we need Xauth VID? */
201	switch (RMAUTHMETHOD(iph1)) {
202	case FICTIVE_AUTH_METHOD_XAUTH_PSKEY_I:
203	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_I:
204	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_I:
205	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_I:
206	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_I:
207		if ((vid_xauth = set_vendorid(VENDORID_XAUTH)) == NULL)
208			plog(ASL_LEVEL_ERR,
209			     "Xauth vendor ID generation failed\n");
210		if ((vid_unity = set_vendorid(VENDORID_UNITY)) == NULL)
211			plog(ASL_LEVEL_ERR,
212			     "Unity vendor ID generation failed\n");
213		break;
214	default:
215		break;
216	}
217#endif
218
219#ifdef ENABLE_FRAG
220	if (iph1->rmconf->ike_frag) {
221		vid_frag = set_vendorid(VENDORID_FRAG);
222		if (vid_frag != NULL)
223			vid_frag = isakmp_frag_addcap(vid_frag,
224			    VENDORID_FRAG_AGG);
225		if (vid_frag == NULL)
226			plog(ASL_LEVEL_ERR,
227			    "Frag vendorID construction failed\n");
228	}
229#endif
230
231	/* create CR if need */
232	if (iph1->rmconf->send_cr
233	 && oakley_needcr(iph1->rmconf->proposal->authmethod)) {
234		need_cr = 1;
235		cr = oakley_getcr(iph1);
236		if (cr == NULL) {
237			plog(ASL_LEVEL_ERR,
238				"failed to get CR");
239			goto end;
240		}
241	}
242
243	plog(ASL_LEVEL_DEBUG, "authmethod is %s\n",
244		s_oakley_attr_method(iph1->rmconf->proposal->authmethod));
245
246	/* set SA payload to propose */
247	plist = isakmp_plist_append(plist, iph1->sa, ISAKMP_NPTYPE_SA);
248
249	/* create isakmp KE payload */
250	plist = isakmp_plist_append(plist, iph1->dhpub, ISAKMP_NPTYPE_KE);
251
252	/* create isakmp NONCE payload */
253	plist = isakmp_plist_append(plist, iph1->nonce, ISAKMP_NPTYPE_NONCE);
254
255	/* create isakmp ID payload */
256	plist = isakmp_plist_append(plist, iph1->id, ISAKMP_NPTYPE_ID);
257
258	/* create isakmp CR payload */
259	if (need_cr)
260		plist = isakmp_plist_append(plist, cr, ISAKMP_NPTYPE_CR);
261
262#ifdef ENABLE_FRAG
263	if (vid_frag)
264		plist = isakmp_plist_append(plist, vid_frag, ISAKMP_NPTYPE_VID);
265#endif
266#ifdef ENABLE_NATT
267	/*
268	 * set VID payload for NAT-T if NAT-T
269	 * support allowed in the config file
270	 */
271	if (iph1->rmconf->nat_traversal)
272		plist = isakmp_plist_append_natt_vids(plist, vid_natt);
273#endif
274#ifdef ENABLE_HYBRID
275	if (vid_xauth)
276		plist = isakmp_plist_append(plist,
277		    vid_xauth, ISAKMP_NPTYPE_VID);
278	if (vid_unity)
279		plist = isakmp_plist_append(plist,
280		    vid_unity, ISAKMP_NPTYPE_VID);
281#endif
282#ifdef ENABLE_DPD
283	if(iph1->rmconf->dpd){
284		vid_dpd = set_vendorid(VENDORID_DPD);
285		if (vid_dpd != NULL)
286			plist = isakmp_plist_append(plist, vid_dpd, ISAKMP_NPTYPE_VID);
287	}
288#endif
289
290	iph1->sendbuf = isakmp_plist_set_all (&plist, iph1);
291
292#ifdef HAVE_PRINT_ISAKMP_C
293	isakmp_printpacket(iph1->sendbuf, iph1->local, iph1->remote, 0);
294#endif
295
296	/* send the packet, add to the schedule to resend */
297	iph1->retry_counter = iph1->rmconf->retry_counter;
298	if (isakmp_ph1resend(iph1) == -1) {
299		plog(ASL_LEVEL_ERR,
300			 "failed to send packet");
301		goto end;
302	}
303
304	fsm_set_state(&iph1->status, IKEV1_STATE_AGG_I_MSG1SENT);
305
306	error = 0;
307
308	IPSECSESSIONTRACEREVENT(iph1->parent_session,
309							IPSECSESSIONEVENTCODE_IKE_PACKET_TX_SUCC,
310							CONSTSTR("Initiator, Aggressive-Mode message 1"),
311							CONSTSTR(NULL));
312
313end:
314	if (error) {
315		IPSECSESSIONTRACEREVENT(iph1->parent_session,
316								IPSECSESSIONEVENTCODE_IKE_PACKET_TX_FAIL,
317								CONSTSTR("Initiator, Aggressive-Mode Message 1"),
318								CONSTSTR("Failed to transmit Aggressive-Mode Message 1"));
319	}
320	if (cr)
321		vfree(cr);
322#ifdef ENABLE_FRAG
323	if (vid_frag)
324		vfree(vid_frag);
325#endif
326#ifdef ENABLE_NATT
327	for (i = 0; i < MAX_NATT_VID_COUNT && vid_natt[i] != NULL; i++)
328		vfree(vid_natt[i]);
329#endif
330#ifdef ENABLE_HYBRID
331	if (vid_xauth != NULL)
332		vfree(vid_xauth);
333	if (vid_unity != NULL)
334		vfree(vid_unity);
335#endif
336#ifdef ENABLE_DPD
337	if (vid_dpd != NULL)
338		vfree(vid_dpd);
339#endif
340
341	return error;
342}
343
344/*
345 * receive from responder
346 * 	psk: HDR, SA, KE, Nr, IDr1, HASH_R
347 * 	sig: HDR, SA, KE, Nr, IDr1, [ CR, ] [ CERT, ] SIG_R
348 *   gssapi: HDR, SA, KE, Nr, IDr1, GSSr, HASH_R
349 * 	rsa: HDR, SA, KE, <IDr1_b>PubKey_i, <Nr_b>PubKey_i, HASH_R
350 * 	rev: HDR, SA, <Nr_b>PubKey_i, <KE_b>Ke_r, <IDir_b>Ke_r, HASH_R
351 */
352int
353agg_i2recv(iph1, msg)
354	phase1_handle_t *iph1;
355	vchar_t *msg;
356{
357	vchar_t *pbuf = NULL;
358	struct isakmp_parse_t *pa;
359	vchar_t *satmp = NULL;
360	int error = -1;
361	int vid_numeric;
362	int ptype;
363	int received_cert = 0;
364
365#ifdef ENABLE_NATT
366	int natd_seq = 0;
367	struct natd_payload {
368		int seq;
369		vchar_t *payload;
370		TAILQ_ENTRY(natd_payload) chain;
371	};
372	TAILQ_HEAD(_natd_payload, natd_payload) natd_tree;
373	TAILQ_INIT(&natd_tree);
374#endif
375
376    /* validity check */
377	if (iph1->status != IKEV1_STATE_AGG_I_MSG1SENT) {
378		plog(ASL_LEVEL_ERR,
379             "status mismatched %d.\n", iph1->status);
380		goto end;
381	}
382
383	/* validate the type of next payload */
384	pbuf = isakmp_parse(msg);
385	if (pbuf == NULL) {
386		plog(ASL_LEVEL_ERR,
387			 "failed to parse msg");
388		goto end;
389	}
390	pa = ALIGNED_CAST(struct isakmp_parse_t *)pbuf->v;
391
392	iph1->pl_hash = NULL;
393
394	/* SA payload is fixed postion */
395	if (pa->type != ISAKMP_NPTYPE_SA) {
396		plog(ASL_LEVEL_ERR,
397			"received invalid next payload type %d, "
398			"expecting %d.\n",
399			pa->type, ISAKMP_NPTYPE_SA);
400		goto end;
401	}
402
403	if (isakmp_p2ph(&satmp, pa->ptr) < 0) {
404		plog(ASL_LEVEL_ERR,
405			 "failed to process SA payload");
406		goto end;
407	}
408	pa++;
409
410	for (/*nothing*/;
411	     pa->type != ISAKMP_NPTYPE_NONE;
412	     pa++) {
413
414		switch (pa->type) {
415		case ISAKMP_NPTYPE_KE:
416			if (isakmp_p2ph(&iph1->dhpub_p, pa->ptr) < 0) {
417				plog(ASL_LEVEL_ERR,
418					 "failed to process KE payload");
419				goto end;
420			}
421			break;
422		case ISAKMP_NPTYPE_NONCE:
423			if (isakmp_p2ph(&iph1->nonce_p, pa->ptr) < 0) {
424				plog(ASL_LEVEL_ERR,
425					 "failed to process NONCE payload");
426				goto end;
427			}
428			break;
429		case ISAKMP_NPTYPE_ID:
430			if (isakmp_p2ph(&iph1->id_p, pa->ptr) < 0) {
431				plog(ASL_LEVEL_ERR,
432					 "failed to process ID payload");
433				goto end;
434			}
435			break;
436		case ISAKMP_NPTYPE_HASH:
437			iph1->pl_hash = (struct isakmp_pl_hash *)pa->ptr;
438			break;
439		case ISAKMP_NPTYPE_CR:
440			if (oakley_savecr(iph1, pa->ptr) < 0) {
441				plog(ASL_LEVEL_ERR,
442					 "failed to process CR payload");
443				goto end;
444			}
445			break;
446		case ISAKMP_NPTYPE_CERT:
447			if (oakley_savecert(iph1, pa->ptr) < 0) {
448				plog(ASL_LEVEL_ERR,
449					 "failed to process CERT payload");
450				goto end;
451			}
452			received_cert = 1;
453			break;
454		case ISAKMP_NPTYPE_SIG:
455			if (isakmp_p2ph(&iph1->sig_p, pa->ptr) < 0) {
456				plog(ASL_LEVEL_ERR,
457					 "failed to process SIG payload");
458				goto end;
459			}
460			break;
461		case ISAKMP_NPTYPE_VID:
462			vid_numeric = check_vendorid(pa->ptr);
463#ifdef ENABLE_NATT
464			if (iph1->rmconf->nat_traversal &&
465			    natt_vendorid(vid_numeric))
466				natt_handle_vendorid(iph1, vid_numeric);
467#endif
468#ifdef ENABLE_HYBRID
469			switch (vid_numeric) {
470			case VENDORID_XAUTH:
471				iph1->mode_cfg->flags |=
472				    ISAKMP_CFG_VENDORID_XAUTH;
473				break;
474
475			case VENDORID_UNITY:
476				iph1->mode_cfg->flags |=
477				    ISAKMP_CFG_VENDORID_UNITY;
478				break;
479			default:
480				break;
481			}
482#endif
483#ifdef ENABLE_DPD
484			if (vid_numeric == VENDORID_DPD && iph1->rmconf->dpd) {
485				iph1->dpd_support=1;
486				plog(ASL_LEVEL_DEBUG,
487					 "remote supports DPD\n");
488			}
489#endif
490#ifdef ENABLE_FRAG
491			if ((vid_numeric == VENDORID_FRAG) &&
492				(vendorid_frag_cap(pa->ptr) & VENDORID_FRAG_AGG)) {
493				plog(ASL_LEVEL_DEBUG,
494					 "remote supports FRAGMENTATION\n");
495				iph1->frag = 1;
496			}
497#endif
498			break;
499		case ISAKMP_NPTYPE_N:
500			isakmp_check_notify(pa->ptr, iph1);
501			break;
502
503#ifdef ENABLE_NATT
504		case ISAKMP_NPTYPE_NATD_DRAFT:
505		case ISAKMP_NPTYPE_NATD_RFC:
506		case ISAKMP_NPTYPE_NATD_BADDRAFT:
507			if (NATT_AVAILABLE(iph1) && iph1->natt_options != NULL &&
508			    pa->type == iph1->natt_options->payload_nat_d) {
509				struct natd_payload *natd;
510				natd = (struct natd_payload *)racoon_malloc(sizeof(*natd));
511				if (!natd) {
512					plog(ASL_LEVEL_ERR,
513						 "failed to pre-process NATD payload");
514					goto end;
515				}
516
517				natd->payload = NULL;
518
519				if (isakmp_p2ph (&natd->payload, pa->ptr) < 0) {
520					plog(ASL_LEVEL_ERR,
521						 "failed to process NATD payload");
522					goto end;
523				}
524
525				natd->seq = natd_seq++;
526
527				TAILQ_INSERT_TAIL(&natd_tree, natd, chain);
528				break;
529			}
530			/* %%% Be lenient here - some servers send natd payloads */
531			/* when nat not detected								 */
532			break;
533#endif
534
535		default:
536			/* don't send information, see isakmp_ident_r1() */
537			plog(ASL_LEVEL_ERR,
538				"ignore the packet, "
539				"received unexpecting payload type %d.\n",
540				pa->type);
541			goto end;
542		}
543	}
544
545	if (received_cert) {
546		oakley_verify_certid(iph1);
547	}
548
549	/* payload existency check */
550	if (iph1->dhpub_p == NULL || iph1->nonce_p == NULL) {
551		plog(ASL_LEVEL_ERR,
552			"few isakmp message received.\n");
553		goto end;
554	}
555
556	/* verify identifier */
557	if (ipsecdoi_checkid1(iph1) != 0) {
558		plog(ASL_LEVEL_ERR,
559			"invalid ID payload.\n");
560		goto end;
561	}
562
563	/* check SA payload and set approval SA for use */
564	if (ipsecdoi_checkph1proposal(satmp, iph1) < 0) {
565		plog(ASL_LEVEL_ERR,
566			"failed to get valid proposal.\n");
567		/* XXX send information */
568		goto end;
569	}
570	VPTRINIT(iph1->sa_ret);
571
572	/* fix isakmp index */
573	memcpy(&iph1->index.r_ck, &((struct isakmp *)msg->v)->r_ck,
574		sizeof(cookie_t));
575
576#ifdef ENABLE_NATT
577	if (NATT_AVAILABLE(iph1)) {
578		struct natd_payload *natd = NULL;
579		int natd_verified;
580
581		plog(ASL_LEVEL_INFO,
582		     "Selected NAT-T version: %s\n",
583		     vid_string_by_id(iph1->natt_options->version));
584
585		/* set both bits first so that we can clear them
586		   upon verifying hashes */
587		iph1->natt_flags |= NAT_DETECTED;
588
589		while ((natd = TAILQ_FIRST(&natd_tree)) != NULL) {
590			/* this function will clear appropriate bits bits
591			   from iph1->natt_flags */
592			natd_verified = natt_compare_addr_hash (iph1,
593				natd->payload, natd->seq);
594
595			plog (ASL_LEVEL_INFO, "NAT-D payload #%d %s\n",
596				natd->seq - 1,
597				natd_verified ? "verified" : "doesn't match");
598
599			vfree (natd->payload);
600
601			TAILQ_REMOVE(&natd_tree, natd, chain);
602			racoon_free (natd);
603		}
604
605		plog (ASL_LEVEL_INFO, "NAT %s %s%s\n",
606		      iph1->natt_flags & NAT_DETECTED ?
607		      		"detected:" : "not detected",
608		      iph1->natt_flags & NAT_DETECTED_ME ? "ME " : "",
609		      iph1->natt_flags & NAT_DETECTED_PEER ? "PEER" : "");
610
611		if (iph1->natt_flags & NAT_DETECTED)
612			natt_float_ports (iph1);
613		ike_session_update_natt_version(iph1);
614	}
615#endif
616
617	/* compute sharing secret of DH */
618#ifdef HAVE_OPENSSL
619	if (oakley_dh_compute(iph1->rmconf->dhgrp, iph1->dhpub,
620						  iph1->dhpriv, iph1->dhpub_p, &iph1->dhgxy) < 0) {
621#else
622		if (oakley_dh_compute(iph1->rmconf->dhgrp, iph1->dhpub_p, iph1->publicKeySize, &iph1->dhgxy, &iph1->dhC) < 0) {
623#endif
624		plog(ASL_LEVEL_ERR,
625			 "failed to compute DH");
626		goto end;
627	}
628
629	/* generate SKEYIDs & IV & final cipher key */
630	if (oakley_skeyid(iph1) < 0) {
631		plog(ASL_LEVEL_ERR,
632			 "failed to generate SKEYID");
633		goto end;
634	}
635	if (oakley_skeyid_dae(iph1) < 0) {
636		plog(ASL_LEVEL_ERR,
637			 "failed to generate SKEYID-DAE");
638		goto end;
639	}
640	if (oakley_compute_enckey(iph1) < 0) {
641		plog(ASL_LEVEL_ERR,
642			 "failed to generate ENCKEY");
643		goto end;
644	}
645	if (oakley_newiv(iph1) < 0) {
646		plog(ASL_LEVEL_ERR,
647			 "failed to generate IV");
648		goto end;
649	}
650
651	/* validate authentication value */
652	ptype = oakley_validate_auth(iph1);
653	if (ptype != 0) {
654		IPSECSESSIONTRACEREVENT(iph1->parent_session,
655								IPSECSESSIONEVENTCODE_IKEV1_PH1_AUTH_FAIL,
656								CONSTSTR("Initiator, Aggressive-Mode Message 2"),
657								CONSTSTR("Failed to authenticate, Aggressive-Mode Message 2"));
658		if (ptype == -1) {
659			/* message printed inner oakley_validate_auth() */
660			goto end;
661		}
662		isakmp_info_send_n1(iph1, ptype, NULL);
663		goto end;
664	}
665	IPSECSESSIONTRACEREVENT(iph1->parent_session,
666							IPSECSESSIONEVENTCODE_IKEV1_PH1_AUTH_SUCC,
667							CONSTSTR("Initiator, Aggressive-Mode Message 2"),
668							CONSTSTR(NULL));
669
670	if (oakley_checkcr(iph1) < 0) {
671		/* Ignore this error in order to be interoperability. */
672		;
673	}
674
675	/* change status of isakmp status entry */
676	fsm_set_state(&iph1->status, IKEV1_STATE_AGG_I_MSG2RCVD);
677
678#ifdef ENABLE_VPNCONTROL_PORT
679	vpncontrol_notify_phase_change(1, FROM_REMOTE, iph1, NULL);
680#endif
681
682	error = 0;
683
684	IPSECSESSIONTRACEREVENT(iph1->parent_session,
685							IPSECSESSIONEVENTCODE_IKE_PACKET_RX_SUCC,
686							CONSTSTR("Initiator, Aggressive-Mode message 2"),
687							CONSTSTR(NULL));
688
689end:
690	if (error) {
691		IPSECSESSIONTRACEREVENT(iph1->parent_session,
692								IPSECSESSIONEVENTCODE_IKE_PACKET_RX_FAIL,
693								CONSTSTR("Initiator, Aggressive-Mode Message 2"),
694								CONSTSTR("Failure processing Aggressive-Mode Message 2"));
695	}
696
697	if (pbuf)
698		vfree(pbuf);
699	if (satmp)
700		vfree(satmp);
701	if (error) {
702		VPTRINIT(iph1->dhpub_p);
703		VPTRINIT(iph1->nonce_p);
704		VPTRINIT(iph1->id_p);
705		oakley_delcert(iph1->cert_p);
706		iph1->cert_p = NULL;
707		oakley_delcert(iph1->crl_p);
708		iph1->crl_p = NULL;
709		VPTRINIT(iph1->sig_p);
710		oakley_delcert(iph1->cr_p);
711		iph1->cr_p = NULL;
712	}
713
714	return error;
715}
716
717/*
718 * send to responder
719 * 	psk: HDR, HASH_I
720 *   gssapi: HDR, HASH_I
721 * 	sig: HDR, [ CERT, ] SIG_I
722 * 	rsa: HDR, HASH_I
723 * 	rev: HDR, HASH_I
724 */
725int
726agg_i3send(iph1, msg)
727	phase1_handle_t *iph1;
728	vchar_t *msg;
729{
730	struct payload_list *plist = NULL;
731	int need_cert = 0;
732	int error = -1;
733	vchar_t *gsshash = NULL;
734#ifdef ENABLE_NATT
735	vchar_t *natd[2] = { NULL, NULL };
736#endif
737    vchar_t *notp_unity = NULL;
738    vchar_t *notp_ini = NULL;
739
740    /* validity check */
741	if (iph1->status != IKEV1_STATE_AGG_I_MSG2RCVD) {
742		plog(ASL_LEVEL_ERR,
743             "status mismatched %d.\n", iph1->status);
744		goto end;
745	}
746
747	/* generate HASH to send */
748	plog(ASL_LEVEL_DEBUG, "generate HASH_I\n");
749	iph1->hash = oakley_ph1hash_common(iph1, GENERATE);
750	if (iph1->hash == NULL) {
751		plog(ASL_LEVEL_ERR,
752			 "failed to generate HASH");
753		goto end;
754	}
755
756	switch (AUTHMETHOD(iph1)) {
757	case OAKLEY_ATTR_AUTH_METHOD_PSKEY:
758#ifdef ENABLE_HYBRID
759	case FICTIVE_AUTH_METHOD_XAUTH_PSKEY_I:
760	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_I:
761#endif
762		/* set HASH payload */
763		plist = isakmp_plist_append(plist,
764		    iph1->hash, ISAKMP_NPTYPE_HASH);
765		break;
766
767	case OAKLEY_ATTR_AUTH_METHOD_RSASIG:
768#ifdef ENABLE_HYBRID
769	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_I:
770#endif
771		/* XXX if there is CR or not ? */
772
773		if (oakley_getmycert(iph1) < 0) {
774			plog(ASL_LEVEL_ERR,
775				 "failed to get mycert");
776			goto end;
777		}
778
779		if (oakley_getsign(iph1) < 0) {
780			plog(ASL_LEVEL_ERR,
781				 "failed to get sign");
782			goto end;
783		}
784
785		if (iph1->cert != NULL && iph1->rmconf->send_cert)
786			need_cert = 1;
787
788		/* add CERT payload if there */
789		// we don't support sending of certchains
790		if (need_cert)
791			plist = isakmp_plist_append(plist, iph1->cert->pl, ISAKMP_NPTYPE_CERT);
792
793		/* add SIG payload */
794		plist = isakmp_plist_append(plist, iph1->sig, ISAKMP_NPTYPE_SIG);
795		break;
796
797	case OAKLEY_ATTR_AUTH_METHOD_RSAENC:
798	case OAKLEY_ATTR_AUTH_METHOD_RSAREV:
799#ifdef ENABLE_HYBRID
800	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_I:
801	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_I:
802#endif
803		break;
804	}
805
806#ifdef ENABLE_NATT
807	/* generate NAT-D payloads */
808	if (NATT_AVAILABLE(iph1)) {
809		plog (ASL_LEVEL_INFO, "Adding remote and local NAT-D payloads.\n");
810		if ((natd[0] = natt_hash_addr (iph1, iph1->remote)) == NULL) {
811			plog(ASL_LEVEL_ERR,
812				"NAT-D hashing failed for %s\n", saddr2str((struct sockaddr *)iph1->remote));
813			goto end;
814		}
815
816		if ((natd[1] = natt_hash_addr (iph1, iph1->local)) == NULL) {
817			plog(ASL_LEVEL_ERR,
818				"NAT-D hashing failed for %s\n", saddr2str((struct sockaddr *)iph1->local));
819			goto end;
820		}
821		/* old Apple version sends natd payloads in the wrong order */
822		if (iph1->natt_options->version == VENDORID_NATT_APPLE) {
823			plist = isakmp_plist_append(plist, natd[1], iph1->natt_options->payload_nat_d);
824			plist = isakmp_plist_append(plist, natd[0], iph1->natt_options->payload_nat_d);
825		} else
826		{
827			plist = isakmp_plist_append(plist, natd[0], iph1->natt_options->payload_nat_d);
828			plist = isakmp_plist_append(plist, natd[1], iph1->natt_options->payload_nat_d);
829		}
830	}
831#endif
832
833
834	iph1->sendbuf = isakmp_plist_set_all (&plist, iph1);
835
836#ifdef HAVE_PRINT_ISAKMP_C
837	isakmp_printpacket(iph1->sendbuf, iph1->local, iph1->remote, 0);
838#endif
839
840
841	/* send to responder */
842	if (isakmp_send(iph1, iph1->sendbuf) < 0) {
843		plog(ASL_LEVEL_ERR,
844			 "failed to send packet");
845		goto end;
846	}
847
848	/* the sending message is added to the received-list. */
849	if (ike_session_add_recvdpkt(iph1->remote, iph1->local, iph1->sendbuf, msg,
850                     PH1_NON_ESP_EXTRA_LEN(iph1, iph1->sendbuf), PH1_FRAG_FLAGS(iph1)) == -1) {
851		plog(ASL_LEVEL_ERR ,
852			"failed to add a response packet to the tree.\n");
853		goto end;
854	}
855
856	/* set encryption flag */
857	iph1->flags |= ISAKMP_FLAG_E;
858
859	fsm_set_state(&iph1->status, IKEV1_STATE_PHASE1_ESTABLISHED);
860
861	IPSECSESSIONTRACEREVENT(iph1->parent_session,
862							IPSECSESSIONEVENTCODE_IKEV1_PH1_INIT_SUCC,
863							CONSTSTR("Initiator, Aggressive-Mode"),
864							CONSTSTR(NULL));
865
866	error = 0;
867
868	IPSECSESSIONTRACEREVENT(iph1->parent_session,
869							IPSECSESSIONEVENTCODE_IKE_PACKET_TX_SUCC,
870							CONSTSTR("Initiator, Aggressive-Mode message 3"),
871							CONSTSTR(NULL));
872
873end:
874	if (error) {
875		IPSECSESSIONTRACEREVENT(iph1->parent_session,
876								IPSECSESSIONEVENTCODE_IKE_PACKET_TX_FAIL,
877								CONSTSTR("Initiator, Aggressive-Mode Message 3"),
878								CONSTSTR("Failed to transmit Aggressive-Mode Message 3"));
879	}
880#ifdef ENABLE_NATT
881	if (natd[0])
882		vfree(natd[0]);
883	if (natd[1])
884		vfree(natd[1]);
885#endif
886	if (notp_unity)
887		vfree(notp_unity);
888	if (notp_ini)
889		vfree(notp_ini);
890	if (gsshash)
891		vfree(gsshash);
892	return error;
893}
894
895/*
896 * receive from initiator
897 * 	psk: HDR, SA, KE, Ni, IDi1
898 * 	sig: HDR, SA, KE, Ni, IDi1 [, CR ]
899 *   gssapi: HDR, SA, KE, Ni, IDi1 , GSSi
900 * 	rsa: HDR, SA, [ HASH(1),] KE, <IDi1_b>Pubkey_r, <Ni_b>Pubkey_r
901 * 	rev: HDR, SA, [ HASH(1),] <Ni_b>Pubkey_r, <KE_b>Ke_i,
902 * 	     <IDii_b>Ke_i [, <Cert-I_b>Ke_i ]
903 */
904int
905agg_r1recv(iph1, msg)
906	phase1_handle_t *iph1;
907	vchar_t *msg;
908{
909	int error = -1;
910	vchar_t *pbuf = NULL;
911	struct isakmp_parse_t *pa;
912	int vid_numeric;
913
914    /* validity check */
915	if (iph1->status != IKEV1_STATE_AGG_R_START) {
916		plog(ASL_LEVEL_ERR,
917             "status mismatched %d.\n", iph1->status);
918		goto end;
919	}
920
921	/* validate the type of next payload */
922	pbuf = isakmp_parse(msg);
923	if (pbuf == NULL) {
924		plog(ASL_LEVEL_ERR,
925			 "failed to parse msg");
926		goto end;
927	}
928	pa = ALIGNED_CAST(struct isakmp_parse_t *)pbuf->v;
929
930	/* SA payload is fixed postion */
931	if (pa->type != ISAKMP_NPTYPE_SA) {
932		plog(ASL_LEVEL_ERR,
933			"received invalid next payload type %d, "
934			"expecting %d.\n",
935			pa->type, ISAKMP_NPTYPE_SA);
936		goto end;
937	}
938	if (isakmp_p2ph(&iph1->sa, pa->ptr) < 0) {
939		plog(ASL_LEVEL_ERR,
940			 "failed to process SA payload");
941		goto end;
942	}
943	pa++;
944
945	for (/*nothing*/;
946	     pa->type != ISAKMP_NPTYPE_NONE;
947	     pa++) {
948
949		plog(ASL_LEVEL_DEBUG,
950			"received payload of type %s\n",
951			s_isakmp_nptype(pa->type));
952
953		switch (pa->type) {
954		case ISAKMP_NPTYPE_KE:
955			if (isakmp_p2ph(&iph1->dhpub_p, pa->ptr) < 0) {
956				plog(ASL_LEVEL_ERR,
957					 "failed to process KE payload");
958				goto end;
959			}
960			break;
961		case ISAKMP_NPTYPE_NONCE:
962			if (isakmp_p2ph(&iph1->nonce_p, pa->ptr) < 0) {
963				plog(ASL_LEVEL_ERR,
964					 "failed to process NONCE payload");
965				goto end;
966			}
967			break;
968		case ISAKMP_NPTYPE_ID:
969			if (isakmp_p2ph(&iph1->id_p, pa->ptr) < 0) {
970				plog(ASL_LEVEL_ERR,
971					 "failed to process ID payload");
972				goto end;
973			}
974			break;
975		case ISAKMP_NPTYPE_VID:
976			vid_numeric = check_vendorid(pa->ptr);
977
978#ifdef ENABLE_NATT
979			if (iph1->rmconf->nat_traversal &&
980			    natt_vendorid(vid_numeric)) {
981				natt_handle_vendorid(iph1, vid_numeric);
982				break;
983			}
984#endif
985#ifdef ENABLE_HYBRID
986			switch (vid_numeric) {
987			case VENDORID_XAUTH:
988				iph1->mode_cfg->flags |=
989				    ISAKMP_CFG_VENDORID_XAUTH;
990				break;
991
992			case VENDORID_UNITY:
993				iph1->mode_cfg->flags |=
994				    ISAKMP_CFG_VENDORID_UNITY;
995				break;
996			default:
997				break;
998			}
999#endif
1000#ifdef ENABLE_DPD
1001			if (vid_numeric == VENDORID_DPD && iph1->rmconf->dpd) {
1002				iph1->dpd_support=1;
1003				plog(ASL_LEVEL_DEBUG,
1004					 "remote supports DPD\n");
1005			}
1006#endif
1007#ifdef ENABLE_FRAG
1008			if ((vid_numeric == VENDORID_FRAG) &&
1009				(vendorid_frag_cap(pa->ptr) & VENDORID_FRAG_AGG)) {
1010				plog(ASL_LEVEL_DEBUG,
1011					 "remote supports FRAGMENTATION\n");
1012				iph1->frag = 1;
1013			}
1014#endif
1015			break;
1016
1017		case ISAKMP_NPTYPE_CR:
1018			if (oakley_savecr(iph1, pa->ptr) < 0) {
1019				plog(ASL_LEVEL_ERR,
1020					 "failed to process CR payload");
1021				goto end;
1022			}
1023			break;
1024
1025		default:
1026			/* don't send information, see isakmp_ident_r1() */
1027			plog(ASL_LEVEL_ERR,
1028				"ignore the packet, "
1029				"received unexpecting payload type %d.\n",
1030				pa->type);
1031			goto end;
1032		}
1033	}
1034
1035	/* payload existency check */
1036	if (iph1->dhpub_p == NULL || iph1->nonce_p == NULL) {
1037		plog(ASL_LEVEL_ERR,
1038			"few isakmp message received.\n");
1039		goto end;
1040	}
1041
1042	/* verify identifier */
1043	if (ipsecdoi_checkid1(iph1) != 0) {
1044		plog(ASL_LEVEL_ERR,
1045			"invalid ID payload.\n");
1046		goto end;
1047	}
1048
1049#ifdef ENABLE_NATT
1050	if (NATT_AVAILABLE(iph1)) {
1051		plog(ASL_LEVEL_INFO,
1052		     "Selected NAT-T version: %s\n",
1053		     vid_string_by_id(iph1->natt_options->version));
1054		ike_session_update_natt_version(iph1);
1055	}
1056#endif
1057
1058	/* check SA payload and set approval SA for use */
1059	if (ipsecdoi_checkph1proposal(iph1->sa, iph1) < 0) {
1060		plog(ASL_LEVEL_ERR,
1061			"failed to get valid proposal.\n");
1062		/* XXX send information */
1063		goto end;
1064	}
1065
1066	if (oakley_checkcr(iph1) < 0) {
1067		/* Ignore this error in order to be interoperability. */
1068		;
1069	}
1070
1071	fsm_set_state(&iph1->status, IKEV1_STATE_AGG_R_MSG1RCVD);
1072
1073	error = 0;
1074
1075	IPSECSESSIONTRACEREVENT(iph1->parent_session,
1076							IPSECSESSIONEVENTCODE_IKE_PACKET_RX_SUCC,
1077							CONSTSTR("Responder, Aggressive-Mode message 1"),
1078							CONSTSTR(NULL));
1079
1080end:
1081	if (error) {
1082		IPSECSESSIONTRACEREVENT(iph1->parent_session,
1083								IPSECSESSIONEVENTCODE_IKE_PACKET_RX_FAIL,
1084								CONSTSTR("Responder, Aggressive-Mode Message 1"),
1085								CONSTSTR("Failed to process Aggressive-Mode Message 1"));
1086	}
1087
1088	if (pbuf)
1089		vfree(pbuf);
1090	if (error) {
1091		VPTRINIT(iph1->sa);
1092		VPTRINIT(iph1->dhpub_p);
1093		VPTRINIT(iph1->nonce_p);
1094		VPTRINIT(iph1->id_p);
1095		oakley_delcert(iph1->cr_p);
1096		iph1->cr_p = NULL;
1097	}
1098
1099	return error;
1100}
1101
1102/*
1103 * send to initiator
1104 * 	psk: HDR, SA, KE, Nr, IDr1, HASH_R
1105 * 	sig: HDR, SA, KE, Nr, IDr1, [ CR, ] [ CERT, ] SIG_R
1106 *   gssapi: HDR, SA, KE, Nr, IDr1, GSSr, HASH_R
1107 * 	rsa: HDR, SA, KE, <IDr1_b>PubKey_i, <Nr_b>PubKey_i, HASH_R
1108 * 	rev: HDR, SA, <Nr_b>PubKey_i, <KE_b>Ke_r, <IDir_b>Ke_r, HASH_R
1109 */
1110int
1111agg_r2send(iph1, msg)
1112	phase1_handle_t *iph1;
1113	vchar_t *msg;
1114{
1115	struct payload_list *plist = NULL;
1116	int need_cr = 0;
1117	int need_cert = 0;
1118	vchar_t *cr = NULL;
1119	int error = -1;
1120#ifdef ENABLE_HYBRID
1121	vchar_t *xauth_vid = NULL;
1122	vchar_t *unity_vid = NULL;
1123#endif
1124#ifdef ENABLE_NATT
1125	vchar_t *vid_natt = NULL;
1126	vchar_t *natd[2] = { NULL, NULL };
1127#endif
1128#ifdef ENABLE_DPD
1129	vchar_t *vid_dpd = NULL;
1130#endif
1131#ifdef ENABLE_FRAG
1132	vchar_t *vid_frag = NULL;
1133#endif
1134
1135    /* validity check */
1136	if (iph1->status != IKEV1_STATE_AGG_R_MSG1RCVD) {
1137		plog(ASL_LEVEL_ERR,
1138             "status mismatched %d.\n", iph1->status);
1139		goto end;
1140	}
1141
1142	/* set responder's cookie */
1143	isakmp_newcookie((caddr_t)&iph1->index.r_ck, iph1->remote, iph1->local);
1144
1145	/* make ID payload into isakmp status */
1146	if (ipsecdoi_setid1(iph1) < 0) {
1147		plog(ASL_LEVEL_ERR,
1148			 "failed to set ID");
1149		goto end;
1150	}
1151
1152	/* generate DH public value */
1153#ifdef HAVE_OPENSSL
1154	if (oakley_dh_generate(iph1->rmconf->dhgrp,
1155						   &iph1->dhpub, &iph1->dhpriv) < 0) {
1156#else
1157	if (oakley_dh_generate(iph1->rmconf->dhgrp,
1158						   &iph1->dhpub, &iph1->publicKeySize, &iph1->dhC) < 0) {
1159#endif
1160		plog(ASL_LEVEL_ERR,
1161			 "failed to generate DH");
1162		goto end;
1163	}
1164
1165	/* generate NONCE value */
1166	iph1->nonce = eay_set_random(iph1->rmconf->nonce_size);
1167	if (iph1->nonce == NULL) {
1168		plog(ASL_LEVEL_ERR,
1169			 "failed to generate NONCE");
1170		goto end;
1171	}
1172
1173	/* compute sharing secret of DH */
1174#ifdef HAVE_OPENSSL
1175		if (oakley_dh_compute(iph1->approval->dhgrp, iph1->dhpub,
1176							  iph1->dhpriv, iph1->dhpub_p, &iph1->dhgxy) < 0) {
1177#else
1178	if (oakley_dh_compute(iph1->approval->dhgrp, iph1->dhpub_p, iph1->publicKeySize, &iph1->dhgxy, &iph1->dhC) < 0) {
1179#endif
1180		plog(ASL_LEVEL_ERR,
1181			 "failed to compute DH");
1182		goto end;
1183	}
1184
1185	/* generate SKEYIDs & IV & final cipher key */
1186	if (oakley_skeyid(iph1) < 0) {
1187		plog(ASL_LEVEL_ERR,
1188			 "failed to generate SKEYID");
1189		goto end;
1190	}
1191	if (oakley_skeyid_dae(iph1) < 0) {
1192		plog(ASL_LEVEL_ERR,
1193			 "failed to generate SKEYID-DAE");
1194		goto end;
1195	}
1196	if (oakley_compute_enckey(iph1) < 0) {
1197		plog(ASL_LEVEL_ERR,
1198			 "failed to generate ENCKEY");
1199		goto end;
1200	}
1201	if (oakley_newiv(iph1) < 0) {
1202		plog(ASL_LEVEL_ERR,
1203			 "failed to generate IV");
1204		goto end;
1205	}
1206
1207	/* generate HASH to send */
1208	plog(ASL_LEVEL_DEBUG, "generate HASH_R\n");
1209	iph1->hash = oakley_ph1hash_common(iph1, GENERATE);
1210	if (iph1->hash == NULL) {
1211		plog(ASL_LEVEL_ERR,
1212			 "failed to generate GSS HASH");
1213		goto end;
1214	}
1215
1216	/* create CR if need */
1217	if (iph1->rmconf->send_cr
1218	 && oakley_needcr(iph1->approval->authmethod)) {
1219		need_cr = 1;
1220		cr = oakley_getcr(iph1);
1221		if (cr == NULL) {
1222			plog(ASL_LEVEL_ERR,
1223				"failed to get CR.\n");
1224			goto end;
1225		}
1226	}
1227
1228#ifdef ENABLE_NATT
1229	/* Has the peer announced NAT-T? */
1230	if (NATT_AVAILABLE(iph1)) {
1231	  	/* set chosen VID */
1232		vid_natt = set_vendorid(iph1->natt_options->version);
1233
1234		/* generate NAT-D payloads */
1235		plog (ASL_LEVEL_INFO, "Adding remote and local NAT-D payloads.\n");
1236		if ((natd[0] = natt_hash_addr (iph1, iph1->remote)) == NULL) {
1237			plog(ASL_LEVEL_ERR,
1238				"NAT-D hashing failed for %s\n", saddr2str((struct sockaddr *)iph1->remote));
1239			goto end;
1240		}
1241
1242		if ((natd[1] = natt_hash_addr (iph1, iph1->local)) == NULL) {
1243			plog(ASL_LEVEL_ERR,
1244				"NAT-D hashing failed for %s\n", saddr2str((struct sockaddr *)iph1->local));
1245			goto end;
1246		}
1247	}
1248#endif
1249#ifdef ENABLE_DPD
1250	/* Only send DPD support if remote announced DPD and if DPD support is active */
1251	if (iph1->dpd_support && iph1->rmconf->dpd)
1252		vid_dpd = set_vendorid(VENDORID_DPD);
1253#endif
1254#ifdef ENABLE_FRAG
1255	if (iph1->frag) {
1256		vid_frag = set_vendorid(VENDORID_FRAG);
1257		if (vid_frag != NULL)
1258			vid_frag = isakmp_frag_addcap(vid_frag,
1259			    VENDORID_FRAG_AGG);
1260		if (vid_frag == NULL)
1261			plog(ASL_LEVEL_ERR,
1262			    "Frag vendorID construction failed\n");
1263	}
1264#endif
1265
1266	switch (AUTHMETHOD(iph1)) {
1267	case OAKLEY_ATTR_AUTH_METHOD_PSKEY:
1268#ifdef ENABLE_HYBRID
1269	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_R:
1270#endif
1271		/* set SA payload to reply */
1272		plist = isakmp_plist_append(plist, iph1->sa_ret, ISAKMP_NPTYPE_SA);
1273
1274		/* create isakmp KE payload */
1275		plist = isakmp_plist_append(plist, iph1->dhpub, ISAKMP_NPTYPE_KE);
1276
1277		/* create isakmp NONCE payload */
1278		plist = isakmp_plist_append(plist, iph1->nonce, ISAKMP_NPTYPE_NONCE);
1279
1280		/* create isakmp ID payload */
1281		plist = isakmp_plist_append(plist, iph1->id, ISAKMP_NPTYPE_ID);
1282
1283		/* create isakmp HASH payload */
1284		plist = isakmp_plist_append(plist,
1285		    iph1->hash, ISAKMP_NPTYPE_HASH);
1286
1287		/* create isakmp CR payload if needed */
1288		if (need_cr)
1289			plist = isakmp_plist_append(plist, cr, ISAKMP_NPTYPE_CR);
1290		break;
1291	case OAKLEY_ATTR_AUTH_METHOD_RSASIG:
1292#ifdef ENABLE_HYBRID
1293	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_R:
1294	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_R:
1295#endif
1296		/* XXX if there is CR or not ? */
1297
1298		if (oakley_getmycert(iph1) < 0) {
1299			plog(ASL_LEVEL_ERR,
1300				 "failed to get mycert");
1301			goto end;
1302		}
1303
1304		if (oakley_getsign(iph1) < 0) {
1305			plog(ASL_LEVEL_ERR,
1306				 "failed to get sign");
1307			goto end;
1308		}
1309
1310		if (iph1->cert != NULL && iph1->rmconf->send_cert)
1311			need_cert = 1;
1312
1313		/* set SA payload to reply */
1314		plist = isakmp_plist_append(plist, iph1->sa_ret, ISAKMP_NPTYPE_SA);
1315
1316		/* create isakmp KE payload */
1317		plist = isakmp_plist_append(plist, iph1->dhpub, ISAKMP_NPTYPE_KE);
1318
1319		/* create isakmp NONCE payload */
1320		plist = isakmp_plist_append(plist, iph1->nonce, ISAKMP_NPTYPE_NONCE);
1321
1322		/* add ID payload */
1323		plist = isakmp_plist_append(plist, iph1->id, ISAKMP_NPTYPE_ID);
1324
1325		/* add CERT payload if there */
1326		if (need_cert)
1327			plist = isakmp_plist_append(plist, iph1->cert->pl, ISAKMP_NPTYPE_CERT);
1328
1329		/* add SIG payload */
1330		plist = isakmp_plist_append(plist, iph1->sig, ISAKMP_NPTYPE_SIG);
1331
1332		/* create isakmp CR payload if needed */
1333		if (need_cr)
1334			plist = isakmp_plist_append(plist,
1335			    cr, ISAKMP_NPTYPE_CR);
1336		break;
1337
1338	case OAKLEY_ATTR_AUTH_METHOD_RSAENC:
1339	case OAKLEY_ATTR_AUTH_METHOD_RSAREV:
1340#ifdef ENABLE_HYBRID
1341	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_R:
1342	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_R:
1343#endif
1344		break;
1345	}
1346
1347#ifdef ENABLE_HYBRID
1348	if (iph1->mode_cfg->flags & ISAKMP_CFG_VENDORID_XAUTH) {
1349		plog (ASL_LEVEL_INFO, "Adding xauth VID payload.\n");
1350		if ((xauth_vid = set_vendorid(VENDORID_XAUTH)) == NULL) {
1351			plog(ASL_LEVEL_ERR,
1352			    "Cannot create Xauth vendor ID\n");
1353			goto end;
1354		}
1355		plist = isakmp_plist_append(plist,
1356		    xauth_vid, ISAKMP_NPTYPE_VID);
1357	}
1358
1359	if (iph1->mode_cfg->flags & ISAKMP_CFG_VENDORID_UNITY) {
1360		if ((unity_vid = set_vendorid(VENDORID_UNITY)) == NULL) {
1361			plog(ASL_LEVEL_ERR,
1362			    "Cannot create Unity vendor ID\n");
1363			goto end;
1364		}
1365		plist = isakmp_plist_append(plist,
1366		    unity_vid, ISAKMP_NPTYPE_VID);
1367	}
1368#endif
1369
1370#ifdef ENABLE_NATT
1371	/* append NAT-T payloads */
1372	if (vid_natt) {
1373		/* chosen VID */
1374		plist = isakmp_plist_append(plist, vid_natt, ISAKMP_NPTYPE_VID);
1375		/* NAT-D */
1376		/* old Apple version sends natd payloads in the wrong order */
1377		if (iph1->natt_options->version == VENDORID_NATT_APPLE) {
1378			plist = isakmp_plist_append(plist, natd[1], iph1->natt_options->payload_nat_d);
1379			plist = isakmp_plist_append(plist, natd[0], iph1->natt_options->payload_nat_d);
1380		} else
1381		{
1382			plist = isakmp_plist_append(plist, natd[0], iph1->natt_options->payload_nat_d);
1383			plist = isakmp_plist_append(plist, natd[1], iph1->natt_options->payload_nat_d);
1384		}
1385	}
1386#endif
1387
1388#ifdef ENABLE_FRAG
1389	if (vid_frag)
1390		plist = isakmp_plist_append(plist, vid_frag, ISAKMP_NPTYPE_VID);
1391#endif
1392
1393#ifdef ENABLE_DPD
1394	if (vid_dpd)
1395		plist = isakmp_plist_append(plist, vid_dpd, ISAKMP_NPTYPE_VID);
1396#endif
1397
1398	iph1->sendbuf = isakmp_plist_set_all (&plist, iph1);
1399
1400#ifdef HAVE_PRINT_ISAKMP_C
1401	isakmp_printpacket(iph1->sendbuf, iph1->local, iph1->remote, 1);
1402#endif
1403
1404	/* send the packet, add to the schedule to resend */
1405	iph1->retry_counter = iph1->rmconf->retry_counter;
1406	if (isakmp_ph1resend(iph1) == -1) {
1407		plog(ASL_LEVEL_ERR ,
1408			 "failed to send packet");
1409		goto end;
1410	}
1411
1412	/* the sending message is added to the received-list. */
1413	if (ike_session_add_recvdpkt(iph1->remote, iph1->local, iph1->sendbuf, msg,
1414                     PH1_NON_ESP_EXTRA_LEN(iph1, iph1->sendbuf), PH1_FRAG_FLAGS(iph1)) == -1) {
1415		plog(ASL_LEVEL_ERR ,
1416			"failed to add a response packet to the tree.\n");
1417		goto end;
1418	}
1419
1420	fsm_set_state(&iph1->status, IKEV1_STATE_AGG_R_MSG2SENT);
1421
1422#ifdef ENABLE_VPNCONTROL_PORT
1423	vpncontrol_notify_phase_change(1, FROM_LOCAL, iph1, NULL);
1424#endif
1425
1426	error = 0;
1427
1428	IPSECSESSIONTRACEREVENT(iph1->parent_session,
1429							IPSECSESSIONEVENTCODE_IKE_PACKET_TX_SUCC,
1430							CONSTSTR("Responder, Aggressive-Mode message 2"),
1431							CONSTSTR(NULL));
1432
1433end:
1434	if (error) {
1435		IPSECSESSIONTRACEREVENT(iph1->parent_session,
1436								IPSECSESSIONEVENTCODE_IKE_PACKET_TX_FAIL,
1437								CONSTSTR("Responder, Aggressive-Mode Message 2"),
1438								CONSTSTR("Failed to process Aggressive-Mode Message 2"));
1439	}
1440	if (cr)
1441		vfree(cr);
1442#ifdef ENABLE_HYBRID
1443	if (xauth_vid)
1444		vfree(xauth_vid);
1445	if (unity_vid)
1446		vfree(unity_vid);
1447#endif
1448#ifdef ENABLE_NATT
1449	if (vid_natt)
1450		vfree(vid_natt);
1451	if (natd[0])
1452		vfree(natd[0]);
1453	if (natd[1])
1454		vfree(natd[1]);
1455#endif
1456#ifdef ENABLE_DPD
1457	if (vid_dpd)
1458		vfree(vid_dpd);
1459#endif
1460#ifdef ENABLE_FRAG
1461	if (vid_frag)
1462		vfree(vid_frag);
1463#endif
1464
1465	return error;
1466}
1467
1468/*
1469 * receive from initiator
1470 * 	psk: HDR, HASH_I
1471 *   gssapi: HDR, HASH_I
1472 * 	sig: HDR, [ CERT, ] SIG_I
1473 * 	rsa: HDR, HASH_I
1474 * 	rev: HDR, HASH_I
1475 */
1476int
1477agg_r3recv(iph1, msg0)
1478	phase1_handle_t *iph1;
1479	vchar_t *msg0;
1480{
1481	vchar_t *msg = NULL;
1482	vchar_t *pbuf = NULL;
1483	struct isakmp_parse_t *pa;
1484	int error = -1;
1485	int ptype;
1486
1487#ifdef ENABLE_NATT
1488	int natd_seq = 0;
1489#endif
1490	int received_cert = 0;
1491
1492    /* validity check */
1493	if (iph1->status != IKEV1_STATE_AGG_R_MSG2SENT) {
1494		plog(ASL_LEVEL_ERR,
1495             "status mismatched %d.\n", iph1->status);
1496		goto end;
1497	}
1498
1499	/* decrypting if need. */
1500	/* XXX configurable ? */
1501	if (ISSET(((struct isakmp *)msg0->v)->flags, ISAKMP_FLAG_E)) {
1502		msg = oakley_do_decrypt(iph1, msg0,
1503					iph1->ivm->iv, iph1->ivm->ive);
1504		if (msg == NULL) {
1505			plog(ASL_LEVEL_ERR,
1506				 "failed to decrypt msg");
1507			goto end;
1508		}
1509	} else
1510		msg = vdup(msg0);
1511
1512	/* validate the type of next payload */
1513	pbuf = isakmp_parse(msg);
1514	if (pbuf == NULL) {
1515		plog(ASL_LEVEL_ERR,
1516			 "failed to parse msg");
1517		goto end;
1518	}
1519
1520	iph1->pl_hash = NULL;
1521
1522	for (pa = ALIGNED_CAST(struct isakmp_parse_t *)pbuf->v;
1523	     pa->type != ISAKMP_NPTYPE_NONE;
1524	     pa++) {
1525
1526		switch (pa->type) {
1527		case ISAKMP_NPTYPE_HASH:
1528			iph1->pl_hash = (struct isakmp_pl_hash *)pa->ptr;
1529			break;
1530		case ISAKMP_NPTYPE_VID:
1531			(void)check_vendorid(pa->ptr);
1532			break;
1533		case ISAKMP_NPTYPE_CERT:
1534			if (oakley_savecert(iph1, pa->ptr) < 0) {
1535				plog(ASL_LEVEL_ERR,
1536					 "failed to process CERT payload");
1537				goto end;
1538			}
1539			received_cert = 1;
1540			break;
1541		case ISAKMP_NPTYPE_SIG:
1542			if (isakmp_p2ph(&iph1->sig_p, pa->ptr) < 0) {
1543				plog(ASL_LEVEL_ERR,
1544					 "failed to process SIG payload");
1545				goto end;
1546			}
1547			break;
1548		case ISAKMP_NPTYPE_N:
1549			isakmp_check_notify(pa->ptr, iph1);
1550			break;
1551
1552#ifdef ENABLE_NATT
1553		case ISAKMP_NPTYPE_NATD_DRAFT:
1554		case ISAKMP_NPTYPE_NATD_RFC:
1555			if (NATT_AVAILABLE(iph1) && iph1->natt_options != NULL &&
1556				pa->type == iph1->natt_options->payload_nat_d)
1557			{
1558				vchar_t *natd_received = NULL;
1559				int natd_verified;
1560
1561				if (isakmp_p2ph (&natd_received, pa->ptr) < 0) {
1562					plog(ASL_LEVEL_ERR,
1563						 "failed to process NATD payload");
1564					goto end;
1565				}
1566
1567				if (natd_seq == 0)
1568					iph1->natt_flags |= NAT_DETECTED;
1569
1570				natd_verified = natt_compare_addr_hash (iph1,
1571					natd_received, natd_seq++);
1572
1573				plog (ASL_LEVEL_INFO, "NAT-D payload #%d %s\n",
1574					natd_seq - 1,
1575					natd_verified ? "verified" : "doesn't match");
1576
1577				vfree (natd_received);
1578				break;
1579			}
1580			/* %%%% Be lenient here - some servers send natd payloads */
1581			/* when no nat is detected								  */
1582			break;
1583#endif
1584
1585		default:
1586			/* don't send information, see isakmp_ident_r1() */
1587			plog(ASL_LEVEL_ERR,
1588				"ignore the packet, "
1589				"received unexpecting payload type %d.\n",
1590				pa->type);
1591			goto end;
1592		}
1593	}
1594
1595#ifdef ENABLE_NATT
1596	if (NATT_AVAILABLE(iph1))
1597		plog (ASL_LEVEL_INFO, "NAT %s %s%s\n",
1598		      iph1->natt_flags & NAT_DETECTED ?
1599		      		"detected:" : "not detected",
1600		      iph1->natt_flags & NAT_DETECTED_ME ? "ME " : "",
1601		      iph1->natt_flags & NAT_DETECTED_PEER ? "PEER" : "");
1602#endif
1603
1604	if (received_cert) {
1605		oakley_verify_certid(iph1);
1606	}
1607
1608	/* validate authentication value */
1609	ptype = oakley_validate_auth(iph1);
1610	if (ptype != 0) {
1611		IPSECSESSIONTRACEREVENT(iph1->parent_session,
1612								IPSECSESSIONEVENTCODE_IKEV1_PH1_AUTH_FAIL,
1613								CONSTSTR("Responder, Aggressive-Mode Message 3"),
1614								CONSTSTR("Failed to authenticate Aggressive-Mode Message 3"));
1615		if (ptype == -1) {
1616			/* message printed inner oakley_validate_auth() */
1617			goto end;
1618		}
1619		isakmp_info_send_n1(iph1, ptype, NULL);
1620		goto end;
1621	}
1622	IPSECSESSIONTRACEREVENT(iph1->parent_session,
1623							IPSECSESSIONEVENTCODE_IKEV1_PH1_AUTH_SUCC,
1624							CONSTSTR("Responder, Aggressive-Mode Message 3"),
1625							CONSTSTR(NULL));
1626
1627	fsm_set_state(&iph1->status, IKEV1_STATE_AGG_R_MSG3RCVD);
1628
1629	error = 0;
1630
1631	IPSECSESSIONTRACEREVENT(iph1->parent_session,
1632							IPSECSESSIONEVENTCODE_IKE_PACKET_RX_SUCC,
1633							CONSTSTR("Responder, Aggressive-Mode message 3"),
1634							CONSTSTR(NULL));
1635
1636end:
1637	if (error) {
1638		IPSECSESSIONTRACEREVENT(iph1->parent_session,
1639								IPSECSESSIONEVENTCODE_IKE_PACKET_RX_FAIL,
1640								CONSTSTR("Responder, Aggressive-Mode Message 3"),
1641								CONSTSTR("Failed to process Aggressive-Mode Message 3"));
1642	}
1643	if (pbuf)
1644		vfree(pbuf);
1645	if (msg)
1646		vfree(msg);
1647	if (error) {
1648		oakley_delcert(iph1->cert_p);
1649		iph1->cert_p = NULL;
1650		oakley_delcert(iph1->crl_p);
1651		iph1->crl_p = NULL;
1652		VPTRINIT(iph1->sig_p);
1653	}
1654
1655	return error;
1656}
1657
1658/*
1659 * status update and establish isakmp sa.
1660 */
1661int
1662agg_rfinalize(iph1, msg)
1663	phase1_handle_t *iph1;
1664	vchar_t *msg;
1665{
1666	int error = -1;
1667
1668    /* validity check */
1669	if (iph1->status != IKEV1_STATE_AGG_R_MSG3RCVD) {
1670		plog(ASL_LEVEL_ERR,
1671             "status mismatched %d.\n", iph1->status);
1672		goto end;
1673	}
1674
1675	/* IV synchronized when packet encrypted. */
1676	/* see handler.h about IV synchronization. */
1677	if (ISSET(((struct isakmp *)msg->v)->flags, ISAKMP_FLAG_E))
1678		memcpy(iph1->ivm->iv->v, iph1->ivm->ive->v, iph1->ivm->iv->l);
1679
1680	/* set encryption flag */
1681	iph1->flags |= ISAKMP_FLAG_E;
1682
1683	fsm_set_state(&iph1->status, IKEV1_STATE_PHASE1_ESTABLISHED);
1684
1685	IPSECSESSIONTRACEREVENT(iph1->parent_session,
1686							IPSECSESSIONEVENTCODE_IKEV1_PH1_RESP_SUCC,
1687							CONSTSTR("Responder, Aggressive-Mode"),
1688							CONSTSTR(NULL));
1689
1690	error = 0;
1691
1692end:
1693	return error;
1694}
1695