1 /* $NetBSD: isakmp_agg.c,v 1.9 2006/09/30 21:49:37 manu Exp $ */
3 /* Id: isakmp_agg.c,v 1.28 2006/04/06 16:46:08 manubsd Exp */
6 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
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.
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
34 /* Aggressive Exchange (Aggressive Mode) */
38 #include <sys/types.h>
39 #include <sys/param.h>
45 #if TIME_WITH_SYS_TIME
46 # include <sys/time.h>
50 # include <sys/time.h>
68 #include "localconf.h"
69 #include "remoteconf.h"
70 #include "isakmp_var.h"
75 #include "ipsec_doi.h"
76 #include "crypto_openssl.h"
78 #include "isakmp_agg.h"
79 #include "isakmp_inf.h"
81 #include "isakmp_xauth.h"
82 #include "isakmp_cfg.h"
85 #include "isakmp_frag.h"
91 #include "nattraversal.h"
98 #include "vpn_control.h"
99 #include "vpn_control_var.h"
100 #include "ipsecSessionTracer.h"
101 #include "ipsecMessageTracer.h"
104 * begin Aggressive Mode as initiator.
108 * psk: HDR, SA, KE, Ni, IDi1
109 * sig: HDR, SA, KE, Ni, IDi1 [, CR ]
110 * gssapi: HDR, SA, KE, Ni, IDi1, GSSi
111 * rsa: HDR, SA, [ HASH(1),] KE, <IDi1_b>Pubkey_r, <Ni_b>Pubkey_r
112 * rev: HDR, SA, [ HASH(1),] <Ni_b>Pubkey_r, <KE_b>Ke_i,
113 * <IDii_b>Ke_i [, <Cert-I_b>Ke_i ]
116 agg_i1send(iph1
, msg
)
117 struct ph1handle
*iph1
;
118 vchar_t
*msg
; /* must be null */
120 struct payload_list
*plist
= NULL
;
125 vchar_t
*vid_natt
[MAX_NATT_VID_COUNT
] = { NULL
};
129 vchar_t
*vid_xauth
= NULL
;
130 vchar_t
*vid_unity
= NULL
;
133 vchar_t
*vid_frag
= NULL
;
136 vchar_t
*gsstoken
= NULL
;
140 vchar_t
*vid_dpd
= NULL
;
146 plog(LLV_ERROR
, LOCATION
, NULL
,
147 "msg has to be NULL in this function.\n");
150 if (iph1
->status
!= PHASE1ST_START
) {
151 plog(LLV_ERROR
, LOCATION
, NULL
,
152 "status mismatched %d.\n", iph1
->status
);
156 /* create isakmp index */
157 memset(&iph1
->index
, 0, sizeof(iph1
->index
));
158 isakmp_newcookie((caddr_t
)&iph1
->index
, iph1
->remote
, iph1
->local
);
160 /* make ID payload into isakmp status */
161 if (ipsecdoi_setid1(iph1
) < 0) {
162 plog(LLV_ERROR
, LOCATION
, NULL
,
167 /* create SA payload for my proposal */
168 iph1
->sa
= ipsecdoi_setph1proposal(iph1
->rmconf
->proposal
);
169 if (iph1
->sa
== NULL
) {
170 plog(LLV_ERROR
, LOCATION
, NULL
,
171 "failed to set proposal");
175 /* consistency check of proposals */
176 if (iph1
->rmconf
->dhgrp
== NULL
) {
177 plog(LLV_ERROR
, LOCATION
, NULL
,
178 "configuration failure about DH group.\n");
182 /* generate DH public value */
183 if (oakley_dh_generate(iph1
->rmconf
->dhgrp
,
184 &iph1
->dhpub
, &iph1
->dhpriv
) < 0) {
185 plog(LLV_ERROR
, LOCATION
, NULL
,
186 "failed to generate DH");
190 /* generate NONCE value */
191 iph1
->nonce
= eay_set_random(iph1
->rmconf
->nonce_size
);
192 if (iph1
->nonce
== NULL
) {
193 plog(LLV_ERROR
, LOCATION
, NULL
,
194 "failed to generate NONCE");
199 /* Do we need Xauth VID? */
200 switch (RMAUTHMETHOD(iph1
)) {
201 case FICTIVE_AUTH_METHOD_XAUTH_PSKEY_I
:
202 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_I
:
203 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_I
:
204 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_I
:
205 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_I
:
206 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_I
:
207 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_I
:
208 if ((vid_xauth
= set_vendorid(VENDORID_XAUTH
)) == NULL
)
209 plog(LLV_ERROR
, LOCATION
, NULL
,
210 "Xauth vendor ID generation failed\n");
211 if ((vid_unity
= set_vendorid(VENDORID_UNITY
)) == NULL
)
212 plog(LLV_ERROR
, LOCATION
, NULL
,
213 "Unity vendor ID generation failed\n");
221 if (iph1
->rmconf
->ike_frag
) {
222 vid_frag
= set_vendorid(VENDORID_FRAG
);
223 if (vid_frag
!= NULL
)
224 vid_frag
= isakmp_frag_addcap(vid_frag
,
226 if (vid_frag
== NULL
)
227 plog(LLV_ERROR
, LOCATION
, NULL
,
228 "Frag vendorID construction failed\n");
232 /* create CR if need */
233 if (iph1
->rmconf
->send_cr
234 && oakley_needcr(iph1
->rmconf
->proposal
->authmethod
)
235 && iph1
->rmconf
->peerscertfile
== NULL
) {
237 cr
= oakley_getcr(iph1
);
239 plog(LLV_ERROR
, LOCATION
, NULL
,
245 plog(LLV_DEBUG
, LOCATION
, NULL
, "authmethod is %s\n",
246 s_oakley_attr_method(iph1
->rmconf
->proposal
->authmethod
));
248 if (RMAUTHMETHOD(iph1
) == OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB
)
249 gssapi_get_itoken(iph1
, &len
);
252 /* set SA payload to propose */
253 plist
= isakmp_plist_append(plist
, iph1
->sa
, ISAKMP_NPTYPE_SA
);
255 /* create isakmp KE payload */
256 plist
= isakmp_plist_append(plist
, iph1
->dhpub
, ISAKMP_NPTYPE_KE
);
258 /* create isakmp NONCE payload */
259 plist
= isakmp_plist_append(plist
, iph1
->nonce
, ISAKMP_NPTYPE_NONCE
);
261 /* create isakmp ID payload */
262 plist
= isakmp_plist_append(plist
, iph1
->id
, ISAKMP_NPTYPE_ID
);
265 if (RMAUTHMETHOD(iph1
) == OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB
) {
266 gssapi_get_token_to_send(iph1
, &gsstoken
);
267 plist
= isakmp_plist_append(plist
, gsstoken
, ISAKMP_NPTYPE_GSS
);
270 /* create isakmp CR payload */
272 plist
= isakmp_plist_append(plist
, cr
, ISAKMP_NPTYPE_CR
);
276 plist
= isakmp_plist_append(plist
, vid_frag
, ISAKMP_NPTYPE_VID
);
280 * set VID payload for NAT-T if NAT-T
281 * support allowed in the config file
283 if (iph1
->rmconf
->nat_traversal
)
284 plist
= isakmp_plist_append_natt_vids(plist
, vid_natt
);
288 plist
= isakmp_plist_append(plist
,
289 vid_xauth
, ISAKMP_NPTYPE_VID
);
291 plist
= isakmp_plist_append(plist
,
292 vid_unity
, ISAKMP_NPTYPE_VID
);
295 if(iph1
->rmconf
->dpd
){
296 vid_dpd
= set_vendorid(VENDORID_DPD
);
298 plist
= isakmp_plist_append(plist
, vid_dpd
, ISAKMP_NPTYPE_VID
);
302 iph1
->sendbuf
= isakmp_plist_set_all (&plist
, iph1
);
304 #ifdef HAVE_PRINT_ISAKMP_C
305 isakmp_printpacket(iph1
->sendbuf
, iph1
->local
, iph1
->remote
, 0);
308 /* send the packet, add to the schedule to resend */
309 iph1
->retry_counter
= iph1
->rmconf
->retry_counter
;
310 if (isakmp_ph1resend(iph1
) == -1) {
311 plog(LLV_ERROR
, LOCATION
, NULL
,
312 "failed to send packet");
316 iph1
->status
= PHASE1ST_MSG1SENT
;
320 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
321 IPSECSESSIONEVENTCODE_IKE_PACKET_TX_SUCC
,
322 CONSTSTR("Initiator, Aggressive-Mode message 1"),
327 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
328 IPSECSESSIONEVENTCODE_IKE_PACKET_TX_FAIL
,
329 CONSTSTR("Initiator, Aggressive-Mode Message 1"),
330 CONSTSTR("Failed to transmit Aggressive-Mode Message 1"));
343 for (i
= 0; i
< MAX_NATT_VID_COUNT
&& vid_natt
[i
] != NULL
; i
++)
347 if (vid_xauth
!= NULL
)
349 if (vid_unity
!= NULL
)
361 * receive from responder
362 * psk: HDR, SA, KE, Nr, IDr1, HASH_R
363 * sig: HDR, SA, KE, Nr, IDr1, [ CR, ] [ CERT, ] SIG_R
364 * gssapi: HDR, SA, KE, Nr, IDr1, GSSr, HASH_R
365 * rsa: HDR, SA, KE, <IDr1_b>PubKey_i, <Nr_b>PubKey_i, HASH_R
366 * rev: HDR, SA, <Nr_b>PubKey_i, <KE_b>Ke_r, <IDir_b>Ke_r, HASH_R
369 agg_i2recv(iph1
, msg
)
370 struct ph1handle
*iph1
;
373 vchar_t
*pbuf
= NULL
;
374 struct isakmp_parse_t
*pa
;
375 vchar_t
*satmp
= NULL
;
384 vchar_t
*gsstoken
= NULL
;
389 struct natd_payload
{
392 TAILQ_ENTRY(natd_payload
) chain
;
394 TAILQ_HEAD(_natd_payload
, natd_payload
) natd_tree
;
395 TAILQ_INIT(&natd_tree
);
399 if (iph1
->status
!= PHASE1ST_MSG1SENT
) {
400 plog(LLV_ERROR
, LOCATION
, NULL
,
401 "status mismatched %d.\n", iph1
->status
);
405 /* validate the type of next payload */
406 pbuf
= isakmp_parse(msg
);
408 plog(LLV_ERROR
, LOCATION
, NULL
,
409 "failed to parse msg");
412 pa
= (struct isakmp_parse_t
*)pbuf
->v
;
414 iph1
->pl_hash
= NULL
;
416 /* SA payload is fixed postion */
417 if (pa
->type
!= ISAKMP_NPTYPE_SA
) {
418 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
419 "received invalid next payload type %d, "
421 pa
->type
, ISAKMP_NPTYPE_SA
);
425 if (isakmp_p2ph(&satmp
, pa
->ptr
) < 0) {
426 plog(LLV_ERROR
, LOCATION
, NULL
,
427 "failed to process SA payload");
433 pa
->type
!= ISAKMP_NPTYPE_NONE
;
437 case ISAKMP_NPTYPE_KE
:
438 if (isakmp_p2ph(&iph1
->dhpub_p
, pa
->ptr
) < 0) {
439 plog(LLV_ERROR
, LOCATION
, NULL
,
440 "failed to process KE payload");
444 case ISAKMP_NPTYPE_NONCE
:
445 if (isakmp_p2ph(&iph1
->nonce_p
, pa
->ptr
) < 0) {
446 plog(LLV_ERROR
, LOCATION
, NULL
,
447 "failed to process NONCE payload");
451 case ISAKMP_NPTYPE_ID
:
452 if (isakmp_p2ph(&iph1
->id_p
, pa
->ptr
) < 0) {
453 plog(LLV_ERROR
, LOCATION
, NULL
,
454 "failed to process ID payload");
458 case ISAKMP_NPTYPE_HASH
:
459 iph1
->pl_hash
= (struct isakmp_pl_hash
*)pa
->ptr
;
461 case ISAKMP_NPTYPE_CR
:
462 if (oakley_savecr(iph1
, pa
->ptr
) < 0) {
463 plog(LLV_ERROR
, LOCATION
, NULL
,
464 "failed to process CR payload");
468 case ISAKMP_NPTYPE_CERT
:
469 if (oakley_savecert(iph1
, pa
->ptr
) < 0) {
470 plog(LLV_ERROR
, LOCATION
, NULL
,
471 "failed to process CERT payload");
475 case ISAKMP_NPTYPE_SIG
:
476 if (isakmp_p2ph(&iph1
->sig_p
, pa
->ptr
) < 0) {
477 plog(LLV_ERROR
, LOCATION
, NULL
,
478 "failed to process SIG payload");
482 case ISAKMP_NPTYPE_VID
:
483 vid_numeric
= check_vendorid(pa
->ptr
);
485 if (iph1
->rmconf
->nat_traversal
&&
486 natt_vendorid(vid_numeric
))
487 natt_handle_vendorid(iph1
, vid_numeric
);
490 switch (vid_numeric
) {
492 iph1
->mode_cfg
->flags
|=
493 ISAKMP_CFG_VENDORID_XAUTH
;
497 iph1
->mode_cfg
->flags
|=
498 ISAKMP_CFG_VENDORID_UNITY
;
505 if (vid_numeric
== VENDORID_DPD
&& iph1
->rmconf
->dpd
) {
507 plog(LLV_DEBUG
, LOCATION
, NULL
,
508 "remote supports DPD\n");
512 case ISAKMP_NPTYPE_N
:
513 isakmp_check_notify(pa
->ptr
, iph1
);
516 case ISAKMP_NPTYPE_GSS
:
517 if (isakmp_p2ph(&gsstoken
, pa
->ptr
) < 0) {
518 plog(LLV_ERROR
, LOCATION
, NULL
,
519 "failed to process GSS payload");
522 gssapi_save_received_token(iph1
, gsstoken
);
527 case ISAKMP_NPTYPE_NATD_DRAFT
:
528 case ISAKMP_NPTYPE_NATD_RFC
:
530 case ISAKMP_NPTYPE_NATD_BADDRAFT
:
532 if (NATT_AVAILABLE(iph1
) && iph1
->natt_options
!= NULL
&&
533 pa
->type
== iph1
->natt_options
->payload_nat_d
) {
534 struct natd_payload
*natd
;
535 natd
= (struct natd_payload
*)racoon_malloc(sizeof(*natd
));
537 plog(LLV_ERROR
, LOCATION
, NULL
,
538 "failed to pre-process NATD payload");
542 natd
->payload
= NULL
;
544 if (isakmp_p2ph (&natd
->payload
, pa
->ptr
) < 0) {
545 plog(LLV_ERROR
, LOCATION
, NULL
,
546 "failed to process NATD payload");
550 natd
->seq
= natd_seq
++;
552 TAILQ_INSERT_TAIL(&natd_tree
, natd
, chain
);
555 /* %%% Be lenient here - some servers send natd payloads */
556 /* when nat not detected */
561 /* don't send information, see isakmp_ident_r1() */
562 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
563 "ignore the packet, "
564 "received unexpecting payload type %d.\n",
570 /* payload existency check */
571 if (iph1
->dhpub_p
== NULL
|| iph1
->nonce_p
== NULL
) {
572 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
573 "few isakmp message received.\n");
577 /* verify identifier */
578 if (ipsecdoi_checkid1(iph1
) != 0) {
579 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
580 "invalid ID payload.\n");
584 /* check SA payload and set approval SA for use */
585 if (ipsecdoi_checkph1proposal(satmp
, iph1
) < 0) {
586 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
587 "failed to get valid proposal.\n");
588 /* XXX send information */
591 VPTRINIT(iph1
->sa_ret
);
593 /* fix isakmp index */
594 memcpy(&iph1
->index
.r_ck
, &((struct isakmp
*)msg
->v
)->r_ck
,
598 if (NATT_AVAILABLE(iph1
)) {
599 struct natd_payload
*natd
= NULL
;
602 plog(LLV_INFO
, LOCATION
, iph1
->remote
,
603 "Selected NAT-T version: %s\n",
604 vid_string_by_id(iph1
->natt_options
->version
));
606 /* set both bits first so that we can clear them
607 upon verifying hashes */
608 iph1
->natt_flags
|= NAT_DETECTED
;
610 while ((natd
= TAILQ_FIRST(&natd_tree
)) != NULL
) {
611 /* this function will clear appropriate bits bits
612 from iph1->natt_flags */
613 natd_verified
= natt_compare_addr_hash (iph1
,
614 natd
->payload
, natd
->seq
);
616 plog (LLV_INFO
, LOCATION
, NULL
, "NAT-D payload #%d %s\n",
618 natd_verified
? "verified" : "doesn't match");
620 vfree (natd
->payload
);
622 TAILQ_REMOVE(&natd_tree
, natd
, chain
);
626 plog (LLV_INFO
, LOCATION
, NULL
, "NAT %s %s%s\n",
627 iph1
->natt_flags
& NAT_DETECTED
?
628 "detected:" : "not detected",
629 iph1
->natt_flags
& NAT_DETECTED_ME
? "ME " : "",
630 iph1
->natt_flags
& NAT_DETECTED_PEER
? "PEER" : "");
632 if (iph1
->natt_flags
& NAT_DETECTED
)
633 natt_float_ports (iph1
);
634 ike_session_update_natt_version(iph1
);
638 /* compute sharing secret of DH */
639 if (oakley_dh_compute(iph1
->rmconf
->dhgrp
, iph1
->dhpub
,
640 iph1
->dhpriv
, iph1
->dhpub_p
, &iph1
->dhgxy
) < 0) {
641 plog(LLV_ERROR
, LOCATION
, NULL
,
642 "failed to compute DH");
646 /* generate SKEYIDs & IV & final cipher key */
647 if (oakley_skeyid(iph1
) < 0) {
648 plog(LLV_ERROR
, LOCATION
, NULL
,
649 "failed to generate SKEYID");
652 if (oakley_skeyid_dae(iph1
) < 0) {
653 plog(LLV_ERROR
, LOCATION
, NULL
,
654 "failed to generate SKEYID-DAE");
657 if (oakley_compute_enckey(iph1
) < 0) {
658 plog(LLV_ERROR
, LOCATION
, NULL
,
659 "failed to generate ENCKEY");
662 if (oakley_newiv(iph1
) < 0) {
663 plog(LLV_ERROR
, LOCATION
, NULL
,
664 "failed to generate IV");
668 /* validate authentication value */
669 ptype
= oakley_validate_auth(iph1
);
671 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
672 IPSECSESSIONEVENTCODE_IKEV1_PH1_AUTH_FAIL
,
673 CONSTSTR("Initiator, Aggressive-Mode Message 2"),
674 CONSTSTR("Failed to authenticate, Aggressive-Mode Message 2"));
676 /* message printed inner oakley_validate_auth() */
679 EVT_PUSH(iph1
->local
, iph1
->remote
,
680 EVTT_PEERPH1AUTH_FAILED
, NULL
);
681 isakmp_info_send_n1(iph1
, ptype
, NULL
);
684 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
685 IPSECSESSIONEVENTCODE_IKEV1_PH1_AUTH_SUCC
,
686 CONSTSTR("Initiator, Aggressive-Mode Message 2"),
689 if (oakley_checkcr(iph1
) < 0) {
690 /* Ignore this error in order to be interoperability. */
694 /* change status of isakmp status entry */
695 iph1
->status
= PHASE1ST_MSG2RECEIVED
;
697 #ifdef ENABLE_VPNCONTROL_PORT
698 vpncontrol_notify_phase_change(1, FROM_REMOTE
, iph1
, NULL
);
703 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
704 IPSECSESSIONEVENTCODE_IKE_PACKET_RX_SUCC
,
705 CONSTSTR("Initiator, Aggressive-Mode message 2"),
710 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
711 IPSECSESSIONEVENTCODE_IKE_PACKET_RX_FAIL
,
712 CONSTSTR("Initiator, Aggressive-Mode Message 2"),
713 CONSTSTR("Failure processing Aggressive-Mode Message 2"));
724 VPTRINIT(iph1
->dhpub_p
);
725 VPTRINIT(iph1
->nonce_p
);
726 VPTRINIT(iph1
->id_p
);
727 oakley_delcert(iph1
->cert_p
);
729 oakley_delcert(iph1
->crl_p
);
731 VPTRINIT(iph1
->sig_p
);
732 oakley_delcert(iph1
->cr_p
);
742 * gssapi: HDR, HASH_I
743 * sig: HDR, [ CERT, ] SIG_I
748 agg_i2send(iph1
, msg
)
749 struct ph1handle
*iph1
;
752 struct payload_list
*plist
= NULL
;
755 vchar_t
*gsshash
= NULL
;
757 vchar_t
*natd
[2] = { NULL
, NULL
};
759 vchar_t
*notp_unity
= NULL
;
760 vchar_t
*notp_ini
= NULL
;
763 if (iph1
->status
!= PHASE1ST_MSG2RECEIVED
) {
764 plog(LLV_ERROR
, LOCATION
, NULL
,
765 "status mismatched %d.\n", iph1
->status
);
769 /* generate HASH to send */
770 plog(LLV_DEBUG
, LOCATION
, NULL
, "generate HASH_I\n");
771 iph1
->hash
= oakley_ph1hash_common(iph1
, GENERATE
);
772 if (iph1
->hash
== NULL
) {
774 if (gssapi_more_tokens(iph1
) &&
776 !iph1
->rmconf
->xauth
&&
779 isakmp_info_send_n1(iph1
,
780 ISAKMP_NTYPE_INVALID_EXCHANGE_TYPE
, NULL
);
782 plog(LLV_ERROR
, LOCATION
, NULL
,
783 "failed to generate HASH");
787 switch (AUTHMETHOD(iph1
)) {
788 case OAKLEY_ATTR_AUTH_METHOD_PSKEY
:
790 case FICTIVE_AUTH_METHOD_XAUTH_PSKEY_I
:
791 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_I
:
792 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_I
:
794 /* set HASH payload */
795 plist
= isakmp_plist_append(plist
,
796 iph1
->hash
, ISAKMP_NPTYPE_HASH
);
799 case OAKLEY_ATTR_AUTH_METHOD_DSSSIG
:
800 case OAKLEY_ATTR_AUTH_METHOD_RSASIG
:
802 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_I
:
803 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_I
:
805 /* XXX if there is CR or not ? */
807 if (oakley_getmycert(iph1
) < 0) {
808 plog(LLV_ERROR
, LOCATION
, NULL
,
809 "failed to get mycert");
813 if (oakley_getsign(iph1
) < 0) {
814 plog(LLV_ERROR
, LOCATION
, NULL
,
815 "failed to get sign");
819 if (iph1
->cert
!= NULL
&& iph1
->rmconf
->send_cert
)
822 /* add CERT payload if there */
824 plist
= isakmp_plist_append(plist
, iph1
->cert
->pl
, ISAKMP_NPTYPE_CERT
);
826 /* add SIG payload */
827 plist
= isakmp_plist_append(plist
, iph1
->sig
, ISAKMP_NPTYPE_SIG
);
830 case OAKLEY_ATTR_AUTH_METHOD_RSAENC
:
831 case OAKLEY_ATTR_AUTH_METHOD_RSAREV
:
833 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_I
:
834 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_I
:
838 case OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB
:
839 gsshash
= gssapi_wraphash(iph1
);
840 if (gsshash
== NULL
) {
841 plog(LLV_ERROR
, LOCATION
, NULL
,
842 "failed to get GSS hash\n");
843 isakmp_info_send_n1(iph1
,
844 ISAKMP_NTYPE_INVALID_EXCHANGE_TYPE
, NULL
);
848 plist
= isakmp_plist_append(plist
, gsshash
, ISAKMP_NPTYPE_HASH
);
854 /* generate NAT-D payloads */
855 if (NATT_AVAILABLE(iph1
)) {
856 plog (LLV_INFO
, LOCATION
, NULL
, "Adding remote and local NAT-D payloads.\n");
857 if ((natd
[0] = natt_hash_addr (iph1
, iph1
->remote
)) == NULL
) {
858 plog(LLV_ERROR
, LOCATION
, NULL
,
859 "NAT-D hashing failed for %s\n", saddr2str(iph1
->remote
));
863 if ((natd
[1] = natt_hash_addr (iph1
, iph1
->local
)) == NULL
) {
864 plog(LLV_ERROR
, LOCATION
, NULL
,
865 "NAT-D hashing failed for %s\n", saddr2str(iph1
->local
));
870 /* old Apple version sends natd payloads in the wrong order */
871 if (iph1
->natt_options
->version
== VENDORID_NATT_APPLE
) {
872 plist
= isakmp_plist_append(plist
, natd
[1], iph1
->natt_options
->payload_nat_d
);
873 plist
= isakmp_plist_append(plist
, natd
[0], iph1
->natt_options
->payload_nat_d
);
877 plist
= isakmp_plist_append(plist
, natd
[0], iph1
->natt_options
->payload_nat_d
);
878 plist
= isakmp_plist_append(plist
, natd
[1], iph1
->natt_options
->payload_nat_d
);
884 iph1
->sendbuf
= isakmp_plist_set_all (&plist
, iph1
);
886 #ifdef HAVE_PRINT_ISAKMP_C
887 isakmp_printpacket(iph1
->sendbuf
, iph1
->local
, iph1
->remote
, 0);
891 /* send to responder */
892 if (isakmp_send(iph1
, iph1
->sendbuf
) < 0) {
893 plog(LLV_ERROR
, LOCATION
, NULL
,
894 "failed to send packet");
898 /* the sending message is added to the received-list. */
899 if (add_recvdpkt(iph1
->remote
, iph1
->local
, iph1
->sendbuf
, msg
,
900 PH1_NON_ESP_EXTRA_LEN(iph1
)) == -1) {
901 plog(LLV_ERROR
, LOCATION
, NULL
,
902 "failed to add a response packet to the tree.\n");
906 /* set encryption flag */
907 iph1
->flags
|= ISAKMP_FLAG_E
;
909 iph1
->status
= PHASE1ST_ESTABLISHED
;
911 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
912 IPSECSESSIONEVENTCODE_IKEV1_PH1_INIT_SUCC
,
913 CONSTSTR("Initiator, Aggressive-Mode"),
918 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
919 IPSECSESSIONEVENTCODE_IKE_PACKET_TX_SUCC
,
920 CONSTSTR("Initiator, Aggressive-Mode message 3"),
925 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
926 IPSECSESSIONEVENTCODE_IKE_PACKET_TX_FAIL
,
927 CONSTSTR("Initiator, Aggressive-Mode Message 3"),
928 CONSTSTR("Failed to transmit Aggressive-Mode Message 3"));
946 * receive from initiator
947 * psk: HDR, SA, KE, Ni, IDi1
948 * sig: HDR, SA, KE, Ni, IDi1 [, CR ]
949 * gssapi: HDR, SA, KE, Ni, IDi1 , GSSi
950 * rsa: HDR, SA, [ HASH(1),] KE, <IDi1_b>Pubkey_r, <Ni_b>Pubkey_r
951 * rev: HDR, SA, [ HASH(1),] <Ni_b>Pubkey_r, <KE_b>Ke_i,
952 * <IDii_b>Ke_i [, <Cert-I_b>Ke_i ]
955 agg_r1recv(iph1
, msg
)
956 struct ph1handle
*iph1
;
960 vchar_t
*pbuf
= NULL
;
961 struct isakmp_parse_t
*pa
;
964 vchar_t
*gsstoken
= NULL
;
968 if (iph1
->status
!= PHASE1ST_START
) {
969 plog(LLV_ERROR
, LOCATION
, NULL
,
970 "status mismatched %d.\n", iph1
->status
);
974 /* validate the type of next payload */
975 pbuf
= isakmp_parse(msg
);
977 plog(LLV_ERROR
, LOCATION
, NULL
,
978 "failed to parse msg");
981 pa
= (struct isakmp_parse_t
*)pbuf
->v
;
983 /* SA payload is fixed postion */
984 if (pa
->type
!= ISAKMP_NPTYPE_SA
) {
985 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
986 "received invalid next payload type %d, "
988 pa
->type
, ISAKMP_NPTYPE_SA
);
991 if (isakmp_p2ph(&iph1
->sa
, pa
->ptr
) < 0) {
992 plog(LLV_ERROR
, LOCATION
, NULL
,
993 "failed to process SA payload");
999 pa
->type
!= ISAKMP_NPTYPE_NONE
;
1002 plog(LLV_DEBUG
, LOCATION
, NULL
,
1003 "received payload of type %s\n",
1004 s_isakmp_nptype(pa
->type
));
1007 case ISAKMP_NPTYPE_KE
:
1008 if (isakmp_p2ph(&iph1
->dhpub_p
, pa
->ptr
) < 0) {
1009 plog(LLV_ERROR
, LOCATION
, NULL
,
1010 "failed to process KE payload");
1014 case ISAKMP_NPTYPE_NONCE
:
1015 if (isakmp_p2ph(&iph1
->nonce_p
, pa
->ptr
) < 0) {
1016 plog(LLV_ERROR
, LOCATION
, NULL
,
1017 "failed to process NONCE payload");
1021 case ISAKMP_NPTYPE_ID
:
1022 if (isakmp_p2ph(&iph1
->id_p
, pa
->ptr
) < 0) {
1023 plog(LLV_ERROR
, LOCATION
, NULL
,
1024 "failed to process ID payload");
1028 case ISAKMP_NPTYPE_VID
:
1029 vid_numeric
= check_vendorid(pa
->ptr
);
1032 if (iph1
->rmconf
->nat_traversal
&&
1033 natt_vendorid(vid_numeric
)) {
1034 natt_handle_vendorid(iph1
, vid_numeric
);
1038 #ifdef ENABLE_HYBRID
1039 switch (vid_numeric
) {
1040 case VENDORID_XAUTH
:
1041 iph1
->mode_cfg
->flags
|=
1042 ISAKMP_CFG_VENDORID_XAUTH
;
1045 case VENDORID_UNITY
:
1046 iph1
->mode_cfg
->flags
|=
1047 ISAKMP_CFG_VENDORID_UNITY
;
1054 if (vid_numeric
== VENDORID_DPD
&& iph1
->rmconf
->dpd
) {
1055 iph1
->dpd_support
=1;
1056 plog(LLV_DEBUG
, LOCATION
, NULL
,
1057 "remote supports DPD\n");
1061 if ((vid_numeric
== VENDORID_FRAG
) &&
1062 (vendorid_frag_cap(pa
->ptr
) & VENDORID_FRAG_AGG
))
1067 case ISAKMP_NPTYPE_CR
:
1068 if (oakley_savecr(iph1
, pa
->ptr
) < 0) {
1069 plog(LLV_ERROR
, LOCATION
, NULL
,
1070 "failed to process CR payload");
1076 case ISAKMP_NPTYPE_GSS
:
1077 if (isakmp_p2ph(&gsstoken
, pa
->ptr
) < 0) {
1078 plog(LLV_ERROR
, LOCATION
, NULL
,
1079 "failed to process GSS payload");
1082 gssapi_save_received_token(iph1
, gsstoken
);
1086 /* don't send information, see isakmp_ident_r1() */
1087 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
1088 "ignore the packet, "
1089 "received unexpecting payload type %d.\n",
1095 /* payload existency check */
1096 if (iph1
->dhpub_p
== NULL
|| iph1
->nonce_p
== NULL
) {
1097 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
1098 "few isakmp message received.\n");
1102 /* verify identifier */
1103 if (ipsecdoi_checkid1(iph1
) != 0) {
1104 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
1105 "invalid ID payload.\n");
1110 if (NATT_AVAILABLE(iph1
)) {
1111 plog(LLV_INFO
, LOCATION
, iph1
->remote
,
1112 "Selected NAT-T version: %s\n",
1113 vid_string_by_id(iph1
->natt_options
->version
));
1114 ike_session_update_natt_version(iph1
);
1118 /* check SA payload and set approval SA for use */
1119 if (ipsecdoi_checkph1proposal(iph1
->sa
, iph1
) < 0) {
1120 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
1121 "failed to get valid proposal.\n");
1122 /* XXX send information */
1126 if (oakley_checkcr(iph1
) < 0) {
1127 /* Ignore this error in order to be interoperability. */
1131 iph1
->status
= PHASE1ST_MSG1RECEIVED
;
1135 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
1136 IPSECSESSIONEVENTCODE_IKE_PACKET_RX_SUCC
,
1137 CONSTSTR("Responder, Aggressive-Mode message 1"),
1142 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
1143 IPSECSESSIONEVENTCODE_IKE_PACKET_RX_FAIL
,
1144 CONSTSTR("Responder, Aggressive-Mode Message 1"),
1145 CONSTSTR("Failed to process Aggressive-Mode Message 1"));
1155 VPTRINIT(iph1
->dhpub_p
);
1156 VPTRINIT(iph1
->nonce_p
);
1157 VPTRINIT(iph1
->id_p
);
1158 oakley_delcert(iph1
->cr_p
);
1167 * psk: HDR, SA, KE, Nr, IDr1, HASH_R
1168 * sig: HDR, SA, KE, Nr, IDr1, [ CR, ] [ CERT, ] SIG_R
1169 * gssapi: HDR, SA, KE, Nr, IDr1, GSSr, HASH_R
1170 * rsa: HDR, SA, KE, <IDr1_b>PubKey_i, <Nr_b>PubKey_i, HASH_R
1171 * rev: HDR, SA, <Nr_b>PubKey_i, <KE_b>Ke_r, <IDir_b>Ke_r, HASH_R
1174 agg_r1send(iph1
, msg
)
1175 struct ph1handle
*iph1
;
1178 struct payload_list
*plist
= NULL
;
1183 #ifdef ENABLE_HYBRID
1184 vchar_t
*xauth_vid
= NULL
;
1185 vchar_t
*unity_vid
= NULL
;
1188 vchar_t
*vid_natt
= NULL
;
1189 vchar_t
*natd
[2] = { NULL
, NULL
};
1192 vchar_t
*vid_dpd
= NULL
;
1195 vchar_t
*vid_frag
= NULL
;
1200 vchar_t
*gsstoken
= NULL
, *gsshash
= NULL
;
1201 vchar_t
*gss_sa
= NULL
;
1202 int free_gss_sa
= 0;
1205 /* validity check */
1206 if (iph1
->status
!= PHASE1ST_MSG1RECEIVED
) {
1207 plog(LLV_ERROR
, LOCATION
, NULL
,
1208 "status mismatched %d.\n", iph1
->status
);
1212 /* set responder's cookie */
1213 isakmp_newcookie((caddr_t
)&iph1
->index
.r_ck
, iph1
->remote
, iph1
->local
);
1215 /* make ID payload into isakmp status */
1216 if (ipsecdoi_setid1(iph1
) < 0) {
1217 plog(LLV_ERROR
, LOCATION
, NULL
,
1218 "failed to set ID");
1222 /* generate DH public value */
1223 if (oakley_dh_generate(iph1
->rmconf
->dhgrp
,
1224 &iph1
->dhpub
, &iph1
->dhpriv
) < 0) {
1225 plog(LLV_ERROR
, LOCATION
, NULL
,
1226 "failed to generate DH");
1230 /* generate NONCE value */
1231 iph1
->nonce
= eay_set_random(iph1
->rmconf
->nonce_size
);
1232 if (iph1
->nonce
== NULL
) {
1233 plog(LLV_ERROR
, LOCATION
, NULL
,
1234 "failed to generate NONCE");
1238 /* compute sharing secret of DH */
1239 if (oakley_dh_compute(iph1
->approval
->dhgrp
, iph1
->dhpub
,
1240 iph1
->dhpriv
, iph1
->dhpub_p
, &iph1
->dhgxy
) < 0) {
1241 plog(LLV_ERROR
, LOCATION
, NULL
,
1242 "failed to compute DH");
1246 /* generate SKEYIDs & IV & final cipher key */
1247 if (oakley_skeyid(iph1
) < 0) {
1248 plog(LLV_ERROR
, LOCATION
, NULL
,
1249 "failed to generate SKEYID");
1252 if (oakley_skeyid_dae(iph1
) < 0) {
1253 plog(LLV_ERROR
, LOCATION
, NULL
,
1254 "failed to generate SKEYID-DAE");
1257 if (oakley_compute_enckey(iph1
) < 0) {
1258 plog(LLV_ERROR
, LOCATION
, NULL
,
1259 "failed to generate ENCKEY");
1262 if (oakley_newiv(iph1
) < 0) {
1263 plog(LLV_ERROR
, LOCATION
, NULL
,
1264 "failed to generate IV");
1269 if (RMAUTHMETHOD(iph1
) == OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB
)
1270 gssapi_get_rtoken(iph1
, &gsslen
);
1273 /* generate HASH to send */
1274 plog(LLV_DEBUG
, LOCATION
, NULL
, "generate HASH_R\n");
1275 iph1
->hash
= oakley_ph1hash_common(iph1
, GENERATE
);
1276 if (iph1
->hash
== NULL
) {
1278 if (gssapi_more_tokens(iph1
))
1279 isakmp_info_send_n1(iph1
,
1280 ISAKMP_NTYPE_INVALID_EXCHANGE_TYPE
, NULL
);
1282 plog(LLV_ERROR
, LOCATION
, NULL
,
1283 "failed to generate GSS HASH");
1287 /* create CR if need */
1288 if (iph1
->rmconf
->send_cr
1289 && oakley_needcr(iph1
->approval
->authmethod
)
1290 && iph1
->rmconf
->peerscertfile
== NULL
) {
1292 cr
= oakley_getcr(iph1
);
1294 plog(LLV_ERROR
, LOCATION
, NULL
,
1295 "failed to get CR.\n");
1301 /* Has the peer announced NAT-T? */
1302 if (NATT_AVAILABLE(iph1
)) {
1303 /* set chosen VID */
1304 vid_natt
= set_vendorid(iph1
->natt_options
->version
);
1306 /* generate NAT-D payloads */
1307 plog (LLV_INFO
, LOCATION
, NULL
, "Adding remote and local NAT-D payloads.\n");
1308 if ((natd
[0] = natt_hash_addr (iph1
, iph1
->remote
)) == NULL
) {
1309 plog(LLV_ERROR
, LOCATION
, NULL
,
1310 "NAT-D hashing failed for %s\n", saddr2str(iph1
->remote
));
1314 if ((natd
[1] = natt_hash_addr (iph1
, iph1
->local
)) == NULL
) {
1315 plog(LLV_ERROR
, LOCATION
, NULL
,
1316 "NAT-D hashing failed for %s\n", saddr2str(iph1
->local
));
1322 /* Only send DPD support if remote announced DPD and if DPD support is active */
1323 if (iph1
->dpd_support
&& iph1
->rmconf
->dpd
)
1324 vid_dpd
= set_vendorid(VENDORID_DPD
);
1328 vid_frag
= set_vendorid(VENDORID_FRAG
);
1329 if (vid_frag
!= NULL
)
1330 vid_frag
= isakmp_frag_addcap(vid_frag
,
1332 if (vid_frag
== NULL
)
1333 plog(LLV_ERROR
, LOCATION
, NULL
,
1334 "Frag vendorID construction failed\n");
1338 switch (AUTHMETHOD(iph1
)) {
1339 case OAKLEY_ATTR_AUTH_METHOD_PSKEY
:
1340 #ifdef ENABLE_HYBRID
1341 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_R
:
1343 /* set SA payload to reply */
1344 plist
= isakmp_plist_append(plist
, iph1
->sa_ret
, ISAKMP_NPTYPE_SA
);
1346 /* create isakmp KE payload */
1347 plist
= isakmp_plist_append(plist
, iph1
->dhpub
, ISAKMP_NPTYPE_KE
);
1349 /* create isakmp NONCE payload */
1350 plist
= isakmp_plist_append(plist
, iph1
->nonce
, ISAKMP_NPTYPE_NONCE
);
1352 /* create isakmp ID payload */
1353 plist
= isakmp_plist_append(plist
, iph1
->id
, ISAKMP_NPTYPE_ID
);
1355 /* create isakmp HASH payload */
1356 plist
= isakmp_plist_append(plist
,
1357 iph1
->hash
, ISAKMP_NPTYPE_HASH
);
1359 /* create isakmp CR payload if needed */
1361 plist
= isakmp_plist_append(plist
, cr
, ISAKMP_NPTYPE_CR
);
1363 case OAKLEY_ATTR_AUTH_METHOD_DSSSIG
:
1364 case OAKLEY_ATTR_AUTH_METHOD_RSASIG
:
1365 #ifdef ENABLE_HYBRID
1366 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_R
:
1367 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_R
:
1368 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_R
:
1369 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_R
:
1371 /* XXX if there is CR or not ? */
1373 if (oakley_getmycert(iph1
) < 0) {
1374 plog(LLV_ERROR
, LOCATION
, NULL
,
1375 "failed to get mycert");
1379 if (oakley_getsign(iph1
) < 0) {
1380 plog(LLV_ERROR
, LOCATION
, NULL
,
1381 "failed to get sign");
1385 if (iph1
->cert
!= NULL
&& iph1
->rmconf
->send_cert
)
1388 /* set SA payload to reply */
1389 plist
= isakmp_plist_append(plist
, iph1
->sa_ret
, ISAKMP_NPTYPE_SA
);
1391 /* create isakmp KE payload */
1392 plist
= isakmp_plist_append(plist
, iph1
->dhpub
, ISAKMP_NPTYPE_KE
);
1394 /* create isakmp NONCE payload */
1395 plist
= isakmp_plist_append(plist
, iph1
->nonce
, ISAKMP_NPTYPE_NONCE
);
1397 /* add ID payload */
1398 plist
= isakmp_plist_append(plist
, iph1
->id
, ISAKMP_NPTYPE_ID
);
1400 /* add CERT payload if there */
1402 plist
= isakmp_plist_append(plist
, iph1
->cert
->pl
, ISAKMP_NPTYPE_CERT
);
1404 /* add SIG payload */
1405 plist
= isakmp_plist_append(plist
, iph1
->sig
, ISAKMP_NPTYPE_SIG
);
1407 /* create isakmp CR payload if needed */
1409 plist
= isakmp_plist_append(plist
,
1410 cr
, ISAKMP_NPTYPE_CR
);
1413 case OAKLEY_ATTR_AUTH_METHOD_RSAENC
:
1414 case OAKLEY_ATTR_AUTH_METHOD_RSAREV
:
1415 #ifdef ENABLE_HYBRID
1416 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_R
:
1417 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_R
:
1421 case OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB
:
1422 /* create buffer to send isakmp payload */
1423 gsshash
= gssapi_wraphash(iph1
);
1424 if (gsshash
== NULL
) {
1425 plog(LLV_ERROR
, LOCATION
, NULL
,
1426 "failed to generate GSS HASH\n");
1428 * This is probably due to the GSS
1429 * roundtrips not being finished yet.
1430 * Return this error in the hope that
1431 * a fallback to main mode will be done.
1433 isakmp_info_send_n1(iph1
,
1434 ISAKMP_NTYPE_INVALID_EXCHANGE_TYPE
, NULL
);
1437 if (iph1
->approval
->gssid
!= NULL
)
1439 ipsecdoi_setph1proposal(iph1
->approval
);
1441 gss_sa
= iph1
->sa_ret
;
1443 if (gss_sa
!= iph1
->sa_ret
)
1446 /* set SA payload to reply */
1447 plist
= isakmp_plist_append(plist
,
1448 gss_sa
, ISAKMP_NPTYPE_SA
);
1450 /* create isakmp KE payload */
1451 plist
= isakmp_plist_append(plist
,
1452 iph1
->dhpub
, ISAKMP_NPTYPE_KE
);
1454 /* create isakmp NONCE payload */
1455 plist
= isakmp_plist_append(plist
,
1456 iph1
->nonce
, ISAKMP_NPTYPE_NONCE
);
1458 /* create isakmp ID payload */
1459 plist
= isakmp_plist_append(plist
,
1460 iph1
->id
, ISAKMP_NPTYPE_ID
);
1462 /* create GSS payload */
1463 gssapi_get_token_to_send(iph1
, &gsstoken
);
1464 plist
= isakmp_plist_append(plist
,
1465 gsstoken
, ISAKMP_NPTYPE_GSS
);
1467 /* create isakmp HASH payload */
1468 plist
= isakmp_plist_append(plist
,
1469 gsshash
, ISAKMP_NPTYPE_HASH
);
1471 /* append vendor id, if needed */
1476 #ifdef ENABLE_HYBRID
1477 if (iph1
->mode_cfg
->flags
& ISAKMP_CFG_VENDORID_XAUTH
) {
1478 plog (LLV_INFO
, LOCATION
, NULL
, "Adding xauth VID payload.\n");
1479 if ((xauth_vid
= set_vendorid(VENDORID_XAUTH
)) == NULL
) {
1480 plog(LLV_ERROR
, LOCATION
, NULL
,
1481 "Cannot create Xauth vendor ID\n");
1484 plist
= isakmp_plist_append(plist
,
1485 xauth_vid
, ISAKMP_NPTYPE_VID
);
1488 if (iph1
->mode_cfg
->flags
& ISAKMP_CFG_VENDORID_UNITY
) {
1489 if ((unity_vid
= set_vendorid(VENDORID_UNITY
)) == NULL
) {
1490 plog(LLV_ERROR
, LOCATION
, NULL
,
1491 "Cannot create Unity vendor ID\n");
1494 plist
= isakmp_plist_append(plist
,
1495 unity_vid
, ISAKMP_NPTYPE_VID
);
1500 /* append NAT-T payloads */
1503 plist
= isakmp_plist_append(plist
, vid_natt
, ISAKMP_NPTYPE_VID
);
1506 /* old Apple version sends natd payloads in the wrong order */
1507 if (iph1
->natt_options
->version
== VENDORID_NATT_APPLE
) {
1508 plist
= isakmp_plist_append(plist
, natd
[1], iph1
->natt_options
->payload_nat_d
);
1509 plist
= isakmp_plist_append(plist
, natd
[0], iph1
->natt_options
->payload_nat_d
);
1513 plist
= isakmp_plist_append(plist
, natd
[0], iph1
->natt_options
->payload_nat_d
);
1514 plist
= isakmp_plist_append(plist
, natd
[1], iph1
->natt_options
->payload_nat_d
);
1521 plist
= isakmp_plist_append(plist
, vid_frag
, ISAKMP_NPTYPE_VID
);
1526 plist
= isakmp_plist_append(plist
, vid_dpd
, ISAKMP_NPTYPE_VID
);
1529 iph1
->sendbuf
= isakmp_plist_set_all (&plist
, iph1
);
1531 #ifdef HAVE_PRINT_ISAKMP_C
1532 isakmp_printpacket(iph1
->sendbuf
, iph1
->local
, iph1
->remote
, 1);
1535 /* send the packet, add to the schedule to resend */
1536 iph1
->retry_counter
= iph1
->rmconf
->retry_counter
;
1537 if (isakmp_ph1resend(iph1
) == -1) {
1538 plog(LLV_ERROR
, LOCATION
, NULL
,
1539 "failed to send packet");
1543 /* the sending message is added to the received-list. */
1544 if (add_recvdpkt(iph1
->remote
, iph1
->local
, iph1
->sendbuf
, msg
,
1545 PH1_NON_ESP_EXTRA_LEN(iph1
)) == -1) {
1546 plog(LLV_ERROR
, LOCATION
, NULL
,
1547 "failed to add a response packet to the tree.\n");
1551 iph1
->status
= PHASE1ST_MSG1SENT
;
1553 #ifdef ENABLE_VPNCONTROL_PORT
1554 vpncontrol_notify_phase_change(1, FROM_LOCAL
, iph1
, NULL
);
1559 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
1560 IPSECSESSIONEVENTCODE_IKE_PACKET_TX_SUCC
,
1561 CONSTSTR("Responder, Aggressive-Mode message 2"),
1566 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
1567 IPSECSESSIONEVENTCODE_IKE_PACKET_TX_FAIL
,
1568 CONSTSTR("Responder, Aggressive-Mode Message 2"),
1569 CONSTSTR("Failed to process Aggressive-Mode Message 2"));
1573 #ifdef ENABLE_HYBRID
1608 * receive from initiator
1610 * gssapi: HDR, HASH_I
1611 * sig: HDR, [ CERT, ] SIG_I
1616 agg_r2recv(iph1
, msg0
)
1617 struct ph1handle
*iph1
;
1620 vchar_t
*msg
= NULL
;
1621 vchar_t
*pbuf
= NULL
;
1622 struct isakmp_parse_t
*pa
;
1630 /* validity check */
1631 if (iph1
->status
!= PHASE1ST_MSG1SENT
) {
1632 plog(LLV_ERROR
, LOCATION
, NULL
,
1633 "status mismatched %d.\n", iph1
->status
);
1637 /* decrypting if need. */
1638 /* XXX configurable ? */
1639 if (ISSET(((struct isakmp
*)msg0
->v
)->flags
, ISAKMP_FLAG_E
)) {
1640 msg
= oakley_do_decrypt(iph1
, msg0
,
1641 iph1
->ivm
->iv
, iph1
->ivm
->ive
);
1643 plog(LLV_ERROR
, LOCATION
, NULL
,
1644 "failed to decrypt msg");
1650 /* validate the type of next payload */
1651 pbuf
= isakmp_parse(msg
);
1653 plog(LLV_ERROR
, LOCATION
, NULL
,
1654 "failed to parse msg");
1658 iph1
->pl_hash
= NULL
;
1660 for (pa
= (struct isakmp_parse_t
*)pbuf
->v
;
1661 pa
->type
!= ISAKMP_NPTYPE_NONE
;
1665 case ISAKMP_NPTYPE_HASH
:
1666 iph1
->pl_hash
= (struct isakmp_pl_hash
*)pa
->ptr
;
1668 case ISAKMP_NPTYPE_VID
:
1669 (void)check_vendorid(pa
->ptr
);
1671 case ISAKMP_NPTYPE_CERT
:
1672 if (oakley_savecert(iph1
, pa
->ptr
) < 0) {
1673 plog(LLV_ERROR
, LOCATION
, NULL
,
1674 "failed to process CERT payload");
1678 case ISAKMP_NPTYPE_SIG
:
1679 if (isakmp_p2ph(&iph1
->sig_p
, pa
->ptr
) < 0) {
1680 plog(LLV_ERROR
, LOCATION
, NULL
,
1681 "failed to process SIG payload");
1685 case ISAKMP_NPTYPE_N
:
1686 isakmp_check_notify(pa
->ptr
, iph1
);
1690 case ISAKMP_NPTYPE_NATD_DRAFT
:
1691 case ISAKMP_NPTYPE_NATD_RFC
:
1692 if (NATT_AVAILABLE(iph1
) && iph1
->natt_options
!= NULL
&&
1693 pa
->type
== iph1
->natt_options
->payload_nat_d
)
1695 vchar_t
*natd_received
= NULL
;
1698 if (isakmp_p2ph (&natd_received
, pa
->ptr
) < 0) {
1699 plog(LLV_ERROR
, LOCATION
, NULL
,
1700 "failed to process NATD payload");
1705 iph1
->natt_flags
|= NAT_DETECTED
;
1707 natd_verified
= natt_compare_addr_hash (iph1
,
1708 natd_received
, natd_seq
++);
1710 plog (LLV_INFO
, LOCATION
, NULL
, "NAT-D payload #%d %s\n",
1712 natd_verified
? "verified" : "doesn't match");
1714 vfree (natd_received
);
1717 /* %%%% Be lenient here - some servers send natd payloads */
1718 /* when no nat is detected */
1723 /* don't send information, see isakmp_ident_r1() */
1724 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
1725 "ignore the packet, "
1726 "received unexpecting payload type %d.\n",
1733 if (NATT_AVAILABLE(iph1
))
1734 plog (LLV_INFO
, LOCATION
, NULL
, "NAT %s %s%s\n",
1735 iph1
->natt_flags
& NAT_DETECTED
?
1736 "detected:" : "not detected",
1737 iph1
->natt_flags
& NAT_DETECTED_ME
? "ME " : "",
1738 iph1
->natt_flags
& NAT_DETECTED_PEER
? "PEER" : "");
1741 /* validate authentication value */
1742 ptype
= oakley_validate_auth(iph1
);
1744 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
1745 IPSECSESSIONEVENTCODE_IKEV1_PH1_AUTH_FAIL
,
1746 CONSTSTR("Responder, Aggressive-Mode Message 3"),
1747 CONSTSTR("Failed to authenticate Aggressive-Mode Message 3"));
1749 /* message printed inner oakley_validate_auth() */
1752 EVT_PUSH(iph1
->local
, iph1
->remote
,
1753 EVTT_PEERPH1AUTH_FAILED
, NULL
);
1754 isakmp_info_send_n1(iph1
, ptype
, NULL
);
1757 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
1758 IPSECSESSIONEVENTCODE_IKEV1_PH1_AUTH_SUCC
,
1759 CONSTSTR("Responder, Aggressive-Mode Message 3"),
1762 iph1
->status
= PHASE1ST_MSG2RECEIVED
;
1766 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
1767 IPSECSESSIONEVENTCODE_IKE_PACKET_RX_SUCC
,
1768 CONSTSTR("Responder, Aggressive-Mode message 3"),
1773 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
1774 IPSECSESSIONEVENTCODE_IKE_PACKET_RX_FAIL
,
1775 CONSTSTR("Responder, Aggressive-Mode Message 3"),
1776 CONSTSTR("Failed to process Aggressive-Mode Message 3"));
1783 oakley_delcert(iph1
->cert_p
);
1784 iph1
->cert_p
= NULL
;
1785 oakley_delcert(iph1
->crl_p
);
1787 VPTRINIT(iph1
->sig_p
);
1794 * status update and establish isakmp sa.
1797 agg_r2send(iph1
, msg
)
1798 struct ph1handle
*iph1
;
1803 /* validity check */
1804 if (iph1
->status
!= PHASE1ST_MSG2RECEIVED
) {
1805 plog(LLV_ERROR
, LOCATION
, NULL
,
1806 "status mismatched %d.\n", iph1
->status
);
1810 /* IV synchronized when packet encrypted. */
1811 /* see handler.h about IV synchronization. */
1812 if (ISSET(((struct isakmp
*)msg
->v
)->flags
, ISAKMP_FLAG_E
))
1813 memcpy(iph1
->ivm
->iv
->v
, iph1
->ivm
->ive
->v
, iph1
->ivm
->iv
->l
);
1815 /* set encryption flag */
1816 iph1
->flags
|= ISAKMP_FLAG_E
;
1818 iph1
->status
= PHASE1ST_ESTABLISHED
;
1820 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
1821 IPSECSESSIONEVENTCODE_IKEV1_PH1_RESP_SUCC
,
1822 CONSTSTR("Responder, Aggressive-Mode"),