1 /* $NetBSD: isakmp_base.c,v 1.7 2006/10/02 21:51:33 manu Exp $ */
3 /* $KAME: isakmp_base.c,v 1.49 2003/11/13 02:30:20 sakane 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 /* Base Exchange (Base 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_base.h"
79 #include "isakmp_inf.h"
82 #include "nattraversal.h"
85 #include "isakmp_frag.h"
88 #include "isakmp_xauth.h"
89 #include "isakmp_cfg.h"
91 #include "vpn_control.h"
92 #include "vpn_control_var.h"
94 #include <Security/SecDH.h>
98 * begin Identity Protection Mode as initiator.
102 * psk: HDR, SA, Idii, Ni_b
103 * sig: HDR, SA, Idii, Ni_b
104 * rsa: HDR, SA, [HASH(1),] <IDii_b>Pubkey_r, <Ni_b>Pubkey_r
105 * rev: HDR, SA, [HASH(1),] <Ni_b>Pubkey_r, <IDii_b>Ke_i
108 base_i1send(iph1
, msg
)
109 struct ph1handle
*iph1
;
110 vchar_t
*msg
; /* must be null */
112 struct payload_list
*plist
= NULL
;
115 vchar_t
*vid_natt
[MAX_NATT_VID_COUNT
] = { NULL
};
116 int i
, vid_natt_i
= 0;
119 vchar_t
*vid_frag
= NULL
;
122 vchar_t
*vid_xauth
= NULL
;
123 vchar_t
*vid_unity
= NULL
;
126 vchar_t
*vid_dpd
= NULL
;
132 plog(LLV_ERROR
, LOCATION
, NULL
,
133 "msg has to be NULL in this function.\n");
136 if (iph1
->status
!= PHASE1ST_START
) {
137 plog(LLV_ERROR
, LOCATION
, NULL
,
138 "status mismatched %d.\n", iph1
->status
);
142 /* create isakmp index */
143 memset(&iph1
->index
, 0, sizeof(iph1
->index
));
144 isakmp_newcookie((caddr_t
)&iph1
->index
, iph1
->remote
, iph1
->local
);
146 /* make ID payload into isakmp status */
147 if (ipsecdoi_setid1(iph1
) < 0)
150 /* create SA payload for my proposal */
151 iph1
->sa
= ipsecdoi_setph1proposal(iph1
->rmconf
->proposal
);
152 if (iph1
->sa
== NULL
)
155 /* generate NONCE value */
156 iph1
->nonce
= eay_set_random(iph1
->rmconf
->nonce_size
);
157 if (iph1
->nonce
== NULL
)
161 /* Do we need Xauth VID? */
162 switch (RMAUTHMETHOD(iph1
)) {
163 case FICTIVE_AUTH_METHOD_XAUTH_PSKEY_I
:
164 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_I
:
165 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_I
:
166 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_I
:
167 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_I
:
168 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_I
:
169 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_I
:
170 if ((vid_xauth
= set_vendorid(VENDORID_XAUTH
)) == NULL
)
171 plog(LLV_ERROR
, LOCATION
, NULL
,
172 "Xauth vendor ID generation failed\n");
174 if ((vid_unity
= set_vendorid(VENDORID_UNITY
)) == NULL
)
175 plog(LLV_ERROR
, LOCATION
, NULL
,
176 "Unity vendor ID generation failed\n");
183 if (iph1
->rmconf
->ike_frag
) {
184 vid_frag
= set_vendorid(VENDORID_FRAG
);
185 if (vid_frag
!= NULL
)
186 vid_frag
= isakmp_frag_addcap(vid_frag
,
188 if (vid_frag
== NULL
)
189 plog(LLV_ERROR
, LOCATION
, NULL
,
190 "Frag vendorID construction failed\n");
194 /* Is NAT-T support allowed in the config file? */
195 if (iph1
->rmconf
->nat_traversal
) {
196 /* Advertise NAT-T capability */
197 memset (vid_natt
, 0, sizeof (vid_natt
));
198 #ifdef VENDORID_NATT_00
199 if ((vid_natt
[vid_natt_i
] = set_vendorid(VENDORID_NATT_00
)) != NULL
)
202 #ifdef VENDORID_NATT_02
203 if ((vid_natt
[vid_natt_i
] = set_vendorid(VENDORID_NATT_02
)) != NULL
)
206 #ifdef VENDORID_NATT_02_N
207 if ((vid_natt
[vid_natt_i
] = set_vendorid(VENDORID_NATT_02_N
)) != NULL
)
210 #ifdef VENDORID_NATT_RFC
211 if ((vid_natt
[vid_natt_i
] = set_vendorid(VENDORID_NATT_RFC
)) != NULL
)
217 /* set SA payload to propose */
218 plist
= isakmp_plist_append(plist
, iph1
->sa
, ISAKMP_NPTYPE_SA
);
220 /* create isakmp ID payload */
221 plist
= isakmp_plist_append(plist
, iph1
->id
, ISAKMP_NPTYPE_ID
);
223 /* create isakmp NONCE payload */
224 plist
= isakmp_plist_append(plist
, iph1
->nonce
, ISAKMP_NPTYPE_NONCE
);
228 plist
= isakmp_plist_append(plist
, vid_frag
, ISAKMP_NPTYPE_VID
);
232 plist
= isakmp_plist_append(plist
,
233 vid_xauth
, ISAKMP_NPTYPE_VID
);
235 plist
= isakmp_plist_append(plist
,
236 vid_unity
, ISAKMP_NPTYPE_VID
);
239 if (iph1
->rmconf
->dpd
) {
240 vid_dpd
= set_vendorid(VENDORID_DPD
);
242 plist
= isakmp_plist_append(plist
, vid_dpd
, ISAKMP_NPTYPE_VID
);
246 /* set VID payload for NAT-T */
247 for (i
= 0; i
< vid_natt_i
; i
++)
248 plist
= isakmp_plist_append(plist
, vid_natt
[i
], ISAKMP_NPTYPE_VID
);
250 iph1
->sendbuf
= isakmp_plist_set_all (&plist
, iph1
);
253 #ifdef HAVE_PRINT_ISAKMP_C
254 isakmp_printpacket(iph1
->sendbuf
, iph1
->local
, iph1
->remote
, 0);
257 /* send the packet, add to the schedule to resend */
258 iph1
->retry_counter
= iph1
->rmconf
->retry_counter
;
259 if (isakmp_ph1resend(iph1
) == -1)
262 iph1
->status
= PHASE1ST_MSG1SENT
;
272 for (i
= 0; i
< vid_natt_i
; i
++)
276 if (vid_xauth
!= NULL
)
278 if (vid_unity
!= NULL
)
290 * receive from responder
291 * psk: HDR, SA, Idir, Nr_b
292 * sig: HDR, SA, Idir, Nr_b, [ CR ]
293 * rsa: HDR, SA, <IDir_b>PubKey_i, <Nr_b>PubKey_i
294 * rev: HDR, SA, <Nr_b>PubKey_i, <IDir_b>Ke_r
297 base_i2recv(iph1
, msg
)
298 struct ph1handle
*iph1
;
301 vchar_t
*pbuf
= NULL
;
302 struct isakmp_parse_t
*pa
;
303 vchar_t
*satmp
= NULL
;
312 if (iph1
->status
!= PHASE1ST_MSG1SENT
) {
313 plog(LLV_ERROR
, LOCATION
, NULL
,
314 "status mismatched %d.\n", iph1
->status
);
318 /* validate the type of next payload */
319 pbuf
= isakmp_parse(msg
);
322 pa
= (struct isakmp_parse_t
*)pbuf
->v
;
324 /* SA payload is fixed postion */
325 if (pa
->type
!= ISAKMP_NPTYPE_SA
) {
326 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
327 "received invalid next payload type %d, "
329 pa
->type
, ISAKMP_NPTYPE_SA
);
332 if (isakmp_p2ph(&satmp
, pa
->ptr
) < 0)
337 pa
->type
!= ISAKMP_NPTYPE_NONE
;
341 case ISAKMP_NPTYPE_NONCE
:
342 if (isakmp_p2ph(&iph1
->nonce_p
, pa
->ptr
) < 0)
345 case ISAKMP_NPTYPE_ID
:
346 if (isakmp_p2ph(&iph1
->id_p
, pa
->ptr
) < 0)
349 case ISAKMP_NPTYPE_VID
:
350 vid_numeric
= check_vendorid(pa
->ptr
);
352 if (iph1
->rmconf
->nat_traversal
&& natt_vendorid(vid_numeric
))
353 natt_handle_vendorid(iph1
, vid_numeric
);
356 switch (vid_numeric
) {
358 iph1
->mode_cfg
->flags
|=
359 ISAKMP_CFG_VENDORID_XAUTH
;
363 iph1
->mode_cfg
->flags
|=
364 ISAKMP_CFG_VENDORID_UNITY
;
372 if (vid_numeric
== VENDORID_DPD
&& iph1
->rmconf
->dpd
) {
374 plog(LLV_DEBUG
, LOCATION
, NULL
,
375 "remote supports DPD\n");
379 if ((vid_numeric
== VENDORID_FRAG
) &&
380 (vendorid_frag_cap(pa
->ptr
) & VENDORID_FRAG_BASE
)) {
381 plog(LLV_DEBUG
, LOCATION
, NULL
,
382 "remote supports FRAGMENTATION\n");
388 /* don't send information, see ident_r1recv() */
389 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
390 "ignore the packet, "
391 "received unexpecting payload type %d.\n",
397 if (iph1
->nonce_p
== NULL
|| iph1
->id_p
== NULL
) {
398 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
399 "few isakmp message received.\n");
403 /* verify identifier */
404 if (ipsecdoi_checkid1(iph1
) != 0) {
405 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
406 "invalid ID payload.\n");
411 if (NATT_AVAILABLE(iph1
)) {
412 plog(LLV_INFO
, LOCATION
, iph1
->remote
,
413 "Selected NAT-T version: %s\n",
414 vid_string_by_id(iph1
->natt_options
->version
));
415 ike_session_update_natt_version(iph1
);
419 /* check SA payload and set approval SA for use */
420 if (ipsecdoi_checkph1proposal(satmp
, iph1
) < 0) {
421 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
422 "failed to get valid proposal.\n");
423 /* XXX send information */
426 VPTRINIT(iph1
->sa_ret
);
428 iph1
->status
= PHASE1ST_MSG2RECEIVED
;
430 #ifdef ENABLE_VPNCONTROL_PORT
431 vpncontrol_notify_phase_change(1, FROM_REMOTE
, iph1
, NULL
);
443 VPTRINIT(iph1
->nonce_p
);
444 VPTRINIT(iph1
->id_p
);
452 * psk: HDR, KE, HASH_I
453 * sig: HDR, KE, [ CR, ] [CERT,] SIG_I
454 * rsa: HDR, KE, HASH_I
455 * rev: HDR, <KE>Ke_i, HASH_I
458 base_i2send(iph1
, msg
)
459 struct ph1handle
*iph1
;
462 struct payload_list
*plist
= NULL
;
468 if (iph1
->status
!= PHASE1ST_MSG2RECEIVED
) {
469 plog(LLV_ERROR
, LOCATION
, NULL
,
470 "status mismatched %d.\n", iph1
->status
);
474 /* fix isakmp index */
475 memcpy(&iph1
->index
.r_ck
, &((struct isakmp
*)msg
->v
)->r_ck
,
478 /* generate DH public value */
480 if (oakley_dh_generate(iph1
->approval
->dhgrp
,
481 &iph1
->dhpub
, &iph1
->dhpriv
) < 0)
483 if (oakley_dh_generate(iph1
->approval
->dhgrp
,
484 &iph1
->dhpub
, &iph1
->publicKeySize
, &iph1
->dhC
) < 0)
488 /* generate SKEYID to compute hash if not signature mode */
489 switch (AUTHMETHOD(iph1
)) {
490 case OAKLEY_ATTR_AUTH_METHOD_RSASIG
:
491 case OAKLEY_ATTR_AUTH_METHOD_DSSSIG
:
493 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_I
:
494 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_I
:
495 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_I
:
496 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_I
:
497 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_I
:
501 if (oakley_skeyid(iph1
) < 0)
506 /* generate HASH to send */
507 plog(LLV_DEBUG
, LOCATION
, NULL
, "generate HASH_I\n");
508 iph1
->hash
= oakley_ph1hash_base_i(iph1
, GENERATE
);
509 if (iph1
->hash
== NULL
)
511 switch (AUTHMETHOD(iph1
)) {
512 case OAKLEY_ATTR_AUTH_METHOD_PSKEY
:
514 case FICTIVE_AUTH_METHOD_XAUTH_PSKEY_I
:
515 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_I
:
516 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_I
:
518 vid
= set_vendorid(iph1
->approval
->vendorid
);
520 /* create isakmp KE payload */
521 plist
= isakmp_plist_append(plist
, iph1
->dhpub
, ISAKMP_NPTYPE_KE
);
523 /* create isakmp HASH payload */
524 plist
= isakmp_plist_append(plist
, iph1
->hash
, ISAKMP_NPTYPE_HASH
);
526 /* append vendor id, if needed */
528 plist
= isakmp_plist_append(plist
, vid
, ISAKMP_NPTYPE_VID
);
530 case OAKLEY_ATTR_AUTH_METHOD_DSSSIG
:
531 case OAKLEY_ATTR_AUTH_METHOD_RSASIG
:
533 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_I
:
534 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_I
:
536 /* XXX if there is CR or not ? */
538 if (oakley_getmycert(iph1
) < 0)
541 if (oakley_getsign(iph1
) < 0)
544 if (iph1
->cert
&& iph1
->rmconf
->send_cert
)
547 /* create isakmp KE payload */
548 plist
= isakmp_plist_append(plist
, iph1
->dhpub
, ISAKMP_NPTYPE_KE
);
550 /* add CERT payload if there */
552 plist
= isakmp_plist_append(plist
, iph1
->cert
->pl
, ISAKMP_NPTYPE_CERT
);
554 /* add SIG payload */
555 plist
= isakmp_plist_append(plist
, iph1
->sig
, ISAKMP_NPTYPE_SIG
);
558 case OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB
:
562 case OAKLEY_ATTR_AUTH_METHOD_RSAENC
:
563 case OAKLEY_ATTR_AUTH_METHOD_RSAREV
:
565 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_I
:
566 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_I
:
572 /* generate NAT-D payloads */
573 if (NATT_AVAILABLE(iph1
))
575 vchar_t
*natd
[2] = { NULL
, NULL
};
577 plog (LLV_INFO
, LOCATION
, NULL
, "Adding remote and local NAT-D payloads.\n");
578 if ((natd
[0] = natt_hash_addr (iph1
, iph1
->remote
)) == NULL
) {
579 plog(LLV_ERROR
, LOCATION
, NULL
,
580 "NAT-D hashing failed for %s\n", saddr2str(iph1
->remote
));
584 if ((natd
[1] = natt_hash_addr (iph1
, iph1
->local
)) == NULL
) {
585 plog(LLV_ERROR
, LOCATION
, NULL
,
586 "NAT-D hashing failed for %s\n", saddr2str(iph1
->local
));
590 /* old Apple version sends natd payloads in the wrong order */
591 if (iph1
->natt_options
->version
== VENDORID_NATT_APPLE
) {
592 plist
= isakmp_plist_append(plist
, natd
[1], iph1
->natt_options
->payload_nat_d
);
593 plist
= isakmp_plist_append(plist
, natd
[0], iph1
->natt_options
->payload_nat_d
);
596 plist
= isakmp_plist_append(plist
, natd
[0], iph1
->natt_options
->payload_nat_d
);
597 plist
= isakmp_plist_append(plist
, natd
[1], iph1
->natt_options
->payload_nat_d
);
602 iph1
->sendbuf
= isakmp_plist_set_all (&plist
, iph1
);
604 #ifdef HAVE_PRINT_ISAKMP_C
605 isakmp_printpacket(iph1
->sendbuf
, iph1
->local
, iph1
->remote
, 0);
608 /* send the packet, add to the schedule to resend */
609 iph1
->retry_counter
= iph1
->rmconf
->retry_counter
;
610 if (isakmp_ph1resend(iph1
) == -1)
613 /* the sending message is added to the received-list. */
614 if (add_recvdpkt(iph1
->remote
, iph1
->local
, iph1
->sendbuf
, msg
,
615 PH1_NON_ESP_EXTRA_LEN(iph1
), PH1_FRAG_FLAGS(iph1
)) == -1) {
616 plog(LLV_ERROR
, LOCATION
, NULL
,
617 "failed to add a response packet to the tree.\n");
621 iph1
->status
= PHASE1ST_MSG2SENT
;
632 * receive from responder
633 * psk: HDR, KE, HASH_R
634 * sig: HDR, KE, [CERT,] SIG_R
635 * rsa: HDR, KE, HASH_R
636 * rev: HDR, <KE>_Ke_r, HASH_R
639 base_i3recv(iph1
, msg
)
640 struct ph1handle
*iph1
;
643 vchar_t
*pbuf
= NULL
;
644 struct isakmp_parse_t
*pa
;
648 vchar_t
*natd_received
;
649 int natd_seq
= 0, natd_verified
;
651 int received_cert
= 0;
654 if (iph1
->status
!= PHASE1ST_MSG2SENT
) {
655 plog(LLV_ERROR
, LOCATION
, NULL
,
656 "status mismatched %d.\n", iph1
->status
);
660 /* validate the type of next payload */
661 pbuf
= isakmp_parse(msg
);
665 for (pa
= (struct isakmp_parse_t
*)pbuf
->v
;
666 pa
->type
!= ISAKMP_NPTYPE_NONE
;
670 case ISAKMP_NPTYPE_KE
:
671 if (isakmp_p2ph(&iph1
->dhpub_p
, pa
->ptr
) < 0)
674 case ISAKMP_NPTYPE_HASH
:
675 iph1
->pl_hash
= (struct isakmp_pl_hash
*)pa
->ptr
;
677 case ISAKMP_NPTYPE_CERT
:
678 if (oakley_savecert(iph1
, pa
->ptr
) < 0)
682 case ISAKMP_NPTYPE_SIG
:
683 if (isakmp_p2ph(&iph1
->sig_p
, pa
->ptr
) < 0)
686 case ISAKMP_NPTYPE_VID
:
687 (void)check_vendorid(pa
->ptr
);
691 case ISAKMP_NPTYPE_NATD_DRAFT
:
692 case ISAKMP_NPTYPE_NATD_RFC
:
693 case ISAKMP_NPTYPE_NATD_BADDRAFT
:
694 if (NATT_AVAILABLE(iph1
) && iph1
->natt_options
&&
695 pa
->type
== iph1
->natt_options
->payload_nat_d
) {
696 natd_received
= NULL
;
697 if (isakmp_p2ph (&natd_received
, pa
->ptr
) < 0)
700 /* set both bits first so that we can clear them
701 upon verifying hashes */
703 iph1
->natt_flags
|= NAT_DETECTED
;
705 /* this function will clear appropriate bits bits
706 from iph1->natt_flags */
707 natd_verified
= natt_compare_addr_hash (iph1
,
708 natd_received
, natd_seq
++);
710 plog (LLV_INFO
, LOCATION
, NULL
, "NAT-D payload #%d %s\n",
712 natd_verified
? "verified" : "doesn't match");
714 vfree (natd_received
);
717 /* %%%% Be lenient here - some servers send natd payloads */
718 /* when no nat is detected */
723 /* don't send information, see ident_r1recv() */
724 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
725 "ignore the packet, "
726 "received unexpecting payload type %d.\n",
733 if (NATT_AVAILABLE(iph1
)) {
734 plog (LLV_INFO
, LOCATION
, NULL
, "NAT %s %s%s\n",
735 iph1
->natt_flags
& NAT_DETECTED
?
736 "detected:" : "not detected",
737 iph1
->natt_flags
& NAT_DETECTED_ME
? "ME " : "",
738 iph1
->natt_flags
& NAT_DETECTED_PEER
? "PEER" : "");
739 if (iph1
->natt_flags
& NAT_DETECTED
)
740 natt_float_ports (iph1
);
745 oakley_verify_certid(iph1
);
748 /* payload existency check */
749 /* validate authentication value */
750 ptype
= oakley_validate_auth(iph1
);
753 /* message printed inner oakley_validate_auth() */
756 EVT_PUSH(iph1
->local
, iph1
->remote
,
757 EVTT_PEERPH1AUTH_FAILED
, NULL
);
758 isakmp_info_send_n1(iph1
, ptype
, NULL
);
762 /* compute sharing secret of DH */
764 if (oakley_dh_compute(iph1
->approval
->dhgrp
, iph1
->dhpub
,
765 iph1
->dhpriv
, iph1
->dhpub_p
, &iph1
->dhgxy
) < 0)
767 if (oakley_dh_compute(iph1
->approval
->dhgrp
, iph1
->dhpub_p
, iph1
->publicKeySize
, &iph1
->dhgxy
, iph1
->dhC
) < 0)
771 /* generate SKEYID to compute hash if signature mode */
772 switch (AUTHMETHOD(iph1
)) {
773 case OAKLEY_ATTR_AUTH_METHOD_RSASIG
:
774 case OAKLEY_ATTR_AUTH_METHOD_DSSSIG
:
776 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_I
:
777 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_I
:
778 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_I
:
779 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_I
:
780 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_I
:
782 if (oakley_skeyid(iph1
) < 0)
789 /* generate SKEYIDs & IV & final cipher key */
790 if (oakley_skeyid_dae(iph1
) < 0)
792 if (oakley_compute_enckey(iph1
) < 0)
794 if (oakley_newiv(iph1
) < 0)
797 /* see handler.h about IV synchronization. */
798 memcpy(iph1
->ivm
->iv
->v
, iph1
->ivm
->ive
->v
, iph1
->ivm
->iv
->l
);
800 /* set encryption flag */
801 iph1
->flags
|= ISAKMP_FLAG_E
;
803 iph1
->status
= PHASE1ST_MSG3RECEIVED
;
812 VPTRINIT(iph1
->dhpub_p
);
813 oakley_delcert(iph1
->cert_p
);
815 oakley_delcert(iph1
->crl_p
);
817 VPTRINIT(iph1
->sig_p
);
824 * status update and establish isakmp sa.
827 base_i3send(iph1
, msg
)
828 struct ph1handle
*iph1
;
834 if (iph1
->status
!= PHASE1ST_MSG3RECEIVED
) {
835 plog(LLV_ERROR
, LOCATION
, NULL
,
836 "status mismatched %d.\n", iph1
->status
);
840 iph1
->status
= PHASE1ST_ESTABLISHED
;
849 * receive from initiator
850 * psk: HDR, SA, Idii, Ni_b
851 * sig: HDR, SA, Idii, Ni_b
852 * rsa: HDR, SA, [HASH(1),] <IDii_b>Pubkey_r, <Ni_b>Pubkey_r
853 * rev: HDR, SA, [HASH(1),] <Ni_b>Pubkey_r, <IDii_b>Ke_i
856 base_r1recv(iph1
, msg
)
857 struct ph1handle
*iph1
;
860 vchar_t
*pbuf
= NULL
;
861 struct isakmp_parse_t
*pa
;
866 if (iph1
->status
!= PHASE1ST_START
) {
867 plog(LLV_ERROR
, LOCATION
, NULL
,
868 "status mismatched %d.\n", iph1
->status
);
872 /* validate the type of next payload */
874 * NOTE: XXX even if multiple VID, we'll silently ignore those.
876 pbuf
= isakmp_parse(msg
);
879 pa
= (struct isakmp_parse_t
*)pbuf
->v
;
881 /* check the position of SA payload */
882 if (pa
->type
!= ISAKMP_NPTYPE_SA
) {
883 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
884 "received invalid next payload type %d, "
886 pa
->type
, ISAKMP_NPTYPE_SA
);
889 if (isakmp_p2ph(&iph1
->sa
, pa
->ptr
) < 0)
894 pa
->type
!= ISAKMP_NPTYPE_NONE
;
898 case ISAKMP_NPTYPE_NONCE
:
899 if (isakmp_p2ph(&iph1
->nonce_p
, pa
->ptr
) < 0)
902 case ISAKMP_NPTYPE_ID
:
903 if (isakmp_p2ph(&iph1
->id_p
, pa
->ptr
) < 0)
906 case ISAKMP_NPTYPE_VID
:
907 vid_numeric
= check_vendorid(pa
->ptr
);
909 if (iph1
->rmconf
->nat_traversal
&& natt_vendorid(vid_numeric
))
910 natt_handle_vendorid(iph1
, vid_numeric
);
913 switch (vid_numeric
) {
915 iph1
->mode_cfg
->flags
|=
916 ISAKMP_CFG_VENDORID_XAUTH
;
920 iph1
->mode_cfg
->flags
|=
921 ISAKMP_CFG_VENDORID_UNITY
;
929 if (vid_numeric
== VENDORID_DPD
&& iph1
->rmconf
->dpd
) {
931 plog(LLV_DEBUG
, LOCATION
, NULL
,
932 "remote supports DPD\n");
936 if ((vid_numeric
== VENDORID_FRAG
) &&
937 (vendorid_frag_cap(pa
->ptr
) & VENDORID_FRAG_BASE
)) {
938 plog(LLV_DEBUG
, LOCATION
, NULL
,
939 "remote supports FRAGMENTATION\n");
945 /* don't send information, see ident_r1recv() */
946 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
947 "ignore the packet, "
948 "received unexpecting payload type %d.\n",
954 if (iph1
->nonce_p
== NULL
|| iph1
->id_p
== NULL
) {
955 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
956 "few isakmp message received.\n");
960 /* verify identifier */
961 if (ipsecdoi_checkid1(iph1
) != 0) {
962 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
963 "invalid ID payload.\n");
968 if (NATT_AVAILABLE(iph1
)) {
969 plog(LLV_INFO
, LOCATION
, iph1
->remote
,
970 "Selected NAT-T version: %s\n",
971 vid_string_by_id(iph1
->natt_options
->version
));
972 ike_session_update_natt_version(iph1
);
976 /* check SA payload and set approval SA for use */
977 if (ipsecdoi_checkph1proposal(iph1
->sa
, iph1
) < 0) {
978 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
979 "failed to get valid proposal.\n");
980 /* XXX send information */
984 iph1
->status
= PHASE1ST_MSG1RECEIVED
;
994 VPTRINIT(iph1
->nonce_p
);
995 VPTRINIT(iph1
->id_p
);
1003 * psk: HDR, SA, Idir, Nr_b
1004 * sig: HDR, SA, Idir, Nr_b, [ CR ]
1005 * rsa: HDR, SA, <IDir_b>PubKey_i, <Nr_b>PubKey_i
1006 * rev: HDR, SA, <Nr_b>PubKey_i, <IDir_b>Ke_r
1009 base_r1send(iph1
, msg
)
1010 struct ph1handle
*iph1
;
1013 struct payload_list
*plist
= NULL
;
1016 vchar_t
*vid_natt
= NULL
;
1018 #ifdef ENABLE_HYBRID
1019 vchar_t
*vid_xauth
= NULL
;
1020 vchar_t
*vid_unity
= NULL
;
1023 vchar_t
*vid_frag
= NULL
;
1026 vchar_t
*vid_dpd
= NULL
;
1029 /* validity check */
1030 if (iph1
->status
!= PHASE1ST_MSG1RECEIVED
) {
1031 plog(LLV_ERROR
, LOCATION
, NULL
,
1032 "status mismatched %d.\n", iph1
->status
);
1036 /* set responder's cookie */
1037 isakmp_newcookie((caddr_t
)&iph1
->index
.r_ck
, iph1
->remote
, iph1
->local
);
1039 /* make ID payload into isakmp status */
1040 if (ipsecdoi_setid1(iph1
) < 0)
1043 /* generate NONCE value */
1044 iph1
->nonce
= eay_set_random(iph1
->rmconf
->nonce_size
);
1045 if (iph1
->nonce
== NULL
)
1048 /* set SA payload to reply */
1049 plist
= isakmp_plist_append(plist
, iph1
->sa_ret
, ISAKMP_NPTYPE_SA
);
1051 /* create isakmp ID payload */
1052 plist
= isakmp_plist_append(plist
, iph1
->id
, ISAKMP_NPTYPE_ID
);
1054 /* create isakmp NONCE payload */
1055 plist
= isakmp_plist_append(plist
, iph1
->nonce
, ISAKMP_NPTYPE_NONCE
);
1058 /* has the peer announced nat-t? */
1059 if (NATT_AVAILABLE(iph1
))
1060 vid_natt
= set_vendorid(iph1
->natt_options
->version
);
1062 plist
= isakmp_plist_append(plist
, vid_natt
, ISAKMP_NPTYPE_VID
);
1064 #ifdef ENABLE_HYBRID
1065 if (iph1
->mode_cfg
->flags
& ISAKMP_CFG_VENDORID_XAUTH
) {
1066 plog (LLV_INFO
, LOCATION
, NULL
, "Adding xauth VID payload.\n");
1067 if ((vid_xauth
= set_vendorid(VENDORID_XAUTH
)) == NULL
) {
1068 plog(LLV_ERROR
, LOCATION
, NULL
,
1069 "Cannot create Xauth vendor ID\n");
1072 plist
= isakmp_plist_append(plist
,
1073 vid_xauth
, ISAKMP_NPTYPE_VID
);
1076 if (iph1
->mode_cfg
->flags
& ISAKMP_CFG_VENDORID_UNITY
) {
1077 if ((vid_unity
= set_vendorid(VENDORID_UNITY
)) == NULL
) {
1078 plog(LLV_ERROR
, LOCATION
, NULL
,
1079 "Cannot create Unity vendor ID\n");
1082 plist
= isakmp_plist_append(plist
,
1083 vid_unity
, ISAKMP_NPTYPE_VID
);
1088 * Only send DPD support if remote announced DPD
1089 * and if DPD support is active
1091 if (iph1
->dpd_support
&& iph1
->rmconf
->dpd
) {
1092 if ((vid_dpd
= set_vendorid(VENDORID_DPD
)) == NULL
) {
1093 plog(LLV_ERROR
, LOCATION
, NULL
,
1094 "DPD vendorID construction failed\n");
1096 plist
= isakmp_plist_append(plist
, vid_dpd
,
1102 if (iph1
->rmconf
->ike_frag
) {
1103 if ((vid_frag
= set_vendorid(VENDORID_FRAG
)) == NULL
) {
1104 plog(LLV_ERROR
, LOCATION
, NULL
,
1105 "Frag vendorID construction failed\n");
1107 vid_frag
= isakmp_frag_addcap(vid_frag
,
1108 VENDORID_FRAG_BASE
);
1109 plist
= isakmp_plist_append(plist
,
1110 vid_frag
, ISAKMP_NPTYPE_VID
);
1115 iph1
->sendbuf
= isakmp_plist_set_all (&plist
, iph1
);
1117 #ifdef HAVE_PRINT_ISAKMP_C
1118 isakmp_printpacket(iph1
->sendbuf
, iph1
->local
, iph1
->remote
, 0);
1121 /* send the packet, add to the schedule to resend */
1122 iph1
->retry_counter
= iph1
->rmconf
->retry_counter
;
1123 if (isakmp_ph1resend(iph1
) == -1) {
1128 /* the sending message is added to the received-list. */
1129 if (add_recvdpkt(iph1
->remote
, iph1
->local
, iph1
->sendbuf
, msg
,
1130 PH1_NON_ESP_EXTRA_LEN(iph1
), PH1_FRAG_FLAGS(iph1
)) == -1) {
1131 plog(LLV_ERROR
, LOCATION
, NULL
,
1132 "failed to add a response packet to the tree.\n");
1136 iph1
->status
= PHASE1ST_MSG1SENT
;
1138 #ifdef ENABLE_VPNCONTROL_PORT
1139 vpncontrol_notify_phase_change(1, FROM_LOCAL
, iph1
, NULL
);
1149 #ifdef ENABLE_HYBRID
1150 if (vid_xauth
!= NULL
)
1152 if (vid_unity
!= NULL
)
1165 VPTRINIT(iph1
->sa_ret
);
1171 * receive from initiator
1172 * psk: HDR, KE, HASH_I
1173 * sig: HDR, KE, [ CR, ] [CERT,] SIG_I
1174 * rsa: HDR, KE, HASH_I
1175 * rev: HDR, <KE>Ke_i, HASH_I
1178 base_r2recv(iph1
, msg
)
1179 struct ph1handle
*iph1
;
1182 vchar_t
*pbuf
= NULL
;
1183 struct isakmp_parse_t
*pa
;
1189 int received_cert
= 0;
1191 /* validity check */
1192 if (iph1
->status
!= PHASE1ST_MSG1SENT
) {
1193 plog(LLV_ERROR
, LOCATION
, NULL
,
1194 "status mismatched %d.\n", iph1
->status
);
1198 /* validate the type of next payload */
1199 pbuf
= isakmp_parse(msg
);
1203 iph1
->pl_hash
= NULL
;
1205 for (pa
= (struct isakmp_parse_t
*)pbuf
->v
;
1206 pa
->type
!= ISAKMP_NPTYPE_NONE
;
1210 case ISAKMP_NPTYPE_KE
:
1211 if (isakmp_p2ph(&iph1
->dhpub_p
, pa
->ptr
) < 0)
1214 case ISAKMP_NPTYPE_HASH
:
1215 iph1
->pl_hash
= (struct isakmp_pl_hash
*)pa
->ptr
;
1217 case ISAKMP_NPTYPE_CERT
:
1218 if (oakley_savecert(iph1
, pa
->ptr
) < 0)
1222 case ISAKMP_NPTYPE_SIG
:
1223 if (isakmp_p2ph(&iph1
->sig_p
, pa
->ptr
) < 0)
1226 case ISAKMP_NPTYPE_VID
:
1227 (void)check_vendorid(pa
->ptr
);
1231 case ISAKMP_NPTYPE_NATD_DRAFT
:
1232 case ISAKMP_NPTYPE_NATD_RFC
:
1233 case ISAKMP_NPTYPE_NATD_BADDRAFT
:
1234 if (pa
->type
== iph1
->natt_options
->payload_nat_d
)
1236 vchar_t
*natd_received
= NULL
;
1239 if (isakmp_p2ph (&natd_received
, pa
->ptr
) < 0)
1243 iph1
->natt_flags
|= NAT_DETECTED
;
1245 natd_verified
= natt_compare_addr_hash (iph1
,
1246 natd_received
, natd_seq
++);
1248 plog (LLV_INFO
, LOCATION
, NULL
, "NAT-D payload #%d %s\n",
1250 natd_verified
? "verified" : "doesn't match");
1252 vfree (natd_received
);
1255 /* %%%% Be lenient here - some servers send natd payloads */
1256 /* when no nat is detected */
1261 /* don't send information, see ident_r1recv() */
1262 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
1263 "ignore the packet, "
1264 "received unexpecting payload type %d.\n",
1270 if (received_cert
) {
1271 oakley_verify_certid(iph1
);
1274 /* generate DH public value */
1276 if (oakley_dh_generate(iph1
->approval
->dhgrp
,
1277 &iph1
->dhpub
, &iph1
->dhpriv
) < 0)
1279 if (oakley_dh_generate(iph1
->approval
->dhgrp
,
1280 &iph1
->dhpub
, &iph1
->publicKeySize
, &iph1
->dhC
) < 0)
1284 /* compute sharing secret of DH */
1286 if (oakley_dh_compute(iph1
->approval
->dhgrp
, iph1
->dhpub
,
1287 iph1
->dhpriv
, iph1
->dhpub_p
, &iph1
->dhgxy
) < 0)
1289 if (oakley_dh_compute(iph1
->approval
->dhgrp
, iph1
->dhpub_p
, iph1
->publicKeySize
, &iph1
->dhgxy
, iph1
->dhC
) < 0)
1293 /* generate SKEYID */
1294 if (oakley_skeyid(iph1
) < 0)
1298 if (NATT_AVAILABLE(iph1
))
1299 plog (LLV_INFO
, LOCATION
, NULL
, "NAT %s %s%s\n",
1300 iph1
->natt_flags
& NAT_DETECTED
?
1301 "detected:" : "not detected",
1302 iph1
->natt_flags
& NAT_DETECTED_ME
? "ME " : "",
1303 iph1
->natt_flags
& NAT_DETECTED_PEER
? "PEER" : "");
1306 /* payload existency check */
1307 /* validate authentication value */
1308 ptype
= oakley_validate_auth(iph1
);
1311 /* message printed inner oakley_validate_auth() */
1314 EVT_PUSH(iph1
->local
, iph1
->remote
,
1315 EVTT_PEERPH1AUTH_FAILED
, NULL
);
1316 isakmp_info_send_n1(iph1
, ptype
, NULL
);
1320 iph1
->status
= PHASE1ST_MSG2RECEIVED
;
1329 VPTRINIT(iph1
->dhpub_p
);
1330 oakley_delcert(iph1
->cert_p
);
1331 iph1
->cert_p
= NULL
;
1332 oakley_delcert(iph1
->crl_p
);
1334 VPTRINIT(iph1
->sig_p
);
1342 * psk: HDR, KE, HASH_R
1343 * sig: HDR, KE, [CERT,] SIG_R
1344 * rsa: HDR, KE, HASH_R
1345 * rev: HDR, <KE>_Ke_r, HASH_R
1348 base_r2send(iph1
, msg
)
1349 struct ph1handle
*iph1
;
1352 struct payload_list
*plist
= NULL
;
1353 vchar_t
*vid
= NULL
;
1357 /* validity check */
1358 if (iph1
->status
!= PHASE1ST_MSG2RECEIVED
) {
1359 plog(LLV_ERROR
, LOCATION
, NULL
,
1360 "status mismatched %d.\n", iph1
->status
);
1364 /* generate HASH to send */
1365 plog(LLV_DEBUG
, LOCATION
, NULL
, "generate HASH_I\n");
1366 switch (AUTHMETHOD(iph1
)) {
1367 case OAKLEY_ATTR_AUTH_METHOD_PSKEY
:
1368 #ifdef ENABLE_HYBRID
1369 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_R
:
1371 case OAKLEY_ATTR_AUTH_METHOD_RSAENC
:
1372 case OAKLEY_ATTR_AUTH_METHOD_RSAREV
:
1373 #ifdef ENABLE_HYBRID
1374 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_R
:
1375 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_R
:
1377 iph1
->hash
= oakley_ph1hash_common(iph1
, GENERATE
);
1379 case OAKLEY_ATTR_AUTH_METHOD_DSSSIG
:
1380 case OAKLEY_ATTR_AUTH_METHOD_RSASIG
:
1381 #ifdef ENABLE_HYBRID
1382 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_R
:
1383 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_R
:
1384 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_R
:
1385 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_R
:
1388 case OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB
:
1390 iph1
->hash
= oakley_ph1hash_base_r(iph1
, GENERATE
);
1393 plog(LLV_ERROR
, LOCATION
, NULL
,
1394 "invalid authentication method %d\n",
1395 iph1
->approval
->authmethod
);
1398 if (iph1
->hash
== NULL
)
1401 switch (AUTHMETHOD(iph1
)) {
1402 case OAKLEY_ATTR_AUTH_METHOD_PSKEY
:
1403 #ifdef ENABLE_HYBRID
1404 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_R
:
1406 vid
= set_vendorid(iph1
->approval
->vendorid
);
1408 /* create isakmp KE payload */
1409 plist
= isakmp_plist_append(plist
, iph1
->dhpub
, ISAKMP_NPTYPE_KE
);
1411 /* create isakmp HASH payload */
1412 plist
= isakmp_plist_append(plist
, iph1
->hash
, ISAKMP_NPTYPE_HASH
);
1414 /* append vendor id, if needed */
1416 plist
= isakmp_plist_append(plist
, vid
, ISAKMP_NPTYPE_VID
);
1418 case OAKLEY_ATTR_AUTH_METHOD_DSSSIG
:
1419 case OAKLEY_ATTR_AUTH_METHOD_RSASIG
:
1420 #ifdef ENABLE_HYBRID
1421 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_R
:
1422 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_R
:
1423 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_R
:
1424 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_R
:
1426 /* XXX if there is CR or not ? */
1428 if (oakley_getmycert(iph1
) < 0)
1431 if (oakley_getsign(iph1
) < 0)
1434 if (iph1
->cert
&& iph1
->rmconf
->send_cert
)
1437 /* create isakmp KE payload */
1438 plist
= isakmp_plist_append(plist
, iph1
->dhpub
, ISAKMP_NPTYPE_KE
);
1440 /* add CERT payload if there */
1442 plist
= isakmp_plist_append(plist
, iph1
->cert
->pl
, ISAKMP_NPTYPE_CERT
);
1443 /* add SIG payload */
1444 plist
= isakmp_plist_append(plist
, iph1
->sig
, ISAKMP_NPTYPE_SIG
);
1447 case OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB
:
1451 case OAKLEY_ATTR_AUTH_METHOD_RSAENC
:
1452 case OAKLEY_ATTR_AUTH_METHOD_RSAREV
:
1453 #ifdef ENABLE_HYBRID
1454 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_R
:
1455 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_R
:
1461 /* generate NAT-D payloads */
1462 if (NATT_AVAILABLE(iph1
)) {
1463 vchar_t
*natd
[2] = { NULL
, NULL
};
1465 plog (LLV_INFO
, LOCATION
, NULL
, "Adding remote and local NAT-D payloads.\n");
1466 if ((natd
[0] = natt_hash_addr (iph1
, iph1
->remote
)) == NULL
) {
1467 plog(LLV_ERROR
, LOCATION
, NULL
,
1468 "NAT-D hashing failed for %s\n", saddr2str(iph1
->remote
));
1472 if ((natd
[1] = natt_hash_addr (iph1
, iph1
->local
)) == NULL
) {
1473 plog(LLV_ERROR
, LOCATION
, NULL
,
1474 "NAT-D hashing failed for %s\n", saddr2str(iph1
->local
));
1478 /* old Apple version sends natd payloads in the wrong order */
1479 if (iph1
->natt_options
->version
== VENDORID_NATT_APPLE
) {
1480 plist
= isakmp_plist_append(plist
, natd
[1], iph1
->natt_options
->payload_nat_d
);
1481 plist
= isakmp_plist_append(plist
, natd
[0], iph1
->natt_options
->payload_nat_d
);
1484 plist
= isakmp_plist_append(plist
, natd
[0], iph1
->natt_options
->payload_nat_d
);
1485 plist
= isakmp_plist_append(plist
, natd
[1], iph1
->natt_options
->payload_nat_d
);
1490 iph1
->sendbuf
= isakmp_plist_set_all(&plist
, iph1
);
1492 #ifdef HAVE_PRINT_ISAKMP_C
1493 isakmp_printpacket(iph1
->sendbuf
, iph1
->local
, iph1
->remote
, 0);
1496 /* send HDR;KE;NONCE to responder */
1497 if (isakmp_send(iph1
, iph1
->sendbuf
) < 0)
1500 /* the sending message is added to the received-list. */
1501 if (add_recvdpkt(iph1
->remote
, iph1
->local
, iph1
->sendbuf
, msg
,
1502 PH1_NON_ESP_EXTRA_LEN(iph1
), PH1_FRAG_FLAGS(iph1
)) == -1) {
1503 plog(LLV_ERROR
, LOCATION
, NULL
,
1504 "failed to add a response packet to the tree.\n");
1508 /* generate SKEYIDs & IV & final cipher key */
1509 if (oakley_skeyid_dae(iph1
) < 0)
1511 if (oakley_compute_enckey(iph1
) < 0)
1513 if (oakley_newiv(iph1
) < 0)
1516 /* set encryption flag */
1517 iph1
->flags
|= ISAKMP_FLAG_E
;
1519 iph1
->status
= PHASE1ST_ESTABLISHED
;