1 /* $KAME: isakmp_agg.c,v 1.55 2001/12/12 15:29:13 sakane Exp $ */
4 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. Neither the name of the project nor the names of its contributors
16 * may be used to endorse or promote products derived from this software
17 * without specific prior written permission.
19 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 /* Aggressive Exchange (Aggressive Mode) */
34 #include <sys/types.h>
35 #include <sys/param.h>
41 #if TIME_WITH_SYS_TIME
42 # include <sys/time.h>
46 # include <sys/time.h>
51 #include <netinet/in.h>
61 #include "localconf.h"
62 #include "remoteconf.h"
63 #include "isakmp_var.h"
67 #include "ipsec_doi.h"
68 #include "crypto_openssl.h"
70 #include "isakmp_agg.h"
71 #include "isakmp_inf.h"
72 #include "isakmp_natd.h"
81 * begin Aggressive Mode as initiator.
85 * psk: HDR, SA, KE, Ni, IDi1
86 * sig: HDR, SA, KE, Ni, IDi1 [, CR ]
87 * gssapi: HDR, SA, KE, Ni, IDi1, GSSi
88 * rsa: HDR, SA, [ HASH(1),] KE, <IDi1_b>Pubkey_r, <Ni_b>Pubkey_r
89 * rev: HDR, SA, [ HASH(1),] <Ni_b>Pubkey_r, <KE_b>Ke_i,
90 * <IDii_b>Ke_i [, <Cert-I_b>Ke_i ]
94 struct ph1handle
*iph1
;
95 vchar_t
*msg
; /* must be null */
97 struct isakmp_gen
*gen
;
101 vchar_t
*cr
= NULL
, *gsstoken
= NULL
;
102 vchar_t
*vid_natt_rfc
= NULL
;
103 vchar_t
*vid_natt_apple
= NULL
;
104 vchar_t
*vid_natt_02
= NULL
;
105 vchar_t
*vid_natt_02N
= NULL
;
114 plog(LLV_ERROR
, LOCATION
, NULL
,
115 "msg has to be NULL in this function.\n");
118 if (iph1
->status
!= PHASE1ST_START
) {
119 plog(LLV_ERROR
, LOCATION
, NULL
,
120 "status mismatched %d.\n", iph1
->status
);
124 /* create isakmp index */
125 memset(&iph1
->index
, 0, sizeof(iph1
->index
));
126 isakmp_newcookie((caddr_t
)&iph1
->index
, iph1
->remote
, iph1
->local
);
128 /* make ID payload into isakmp status */
129 if (ipsecdoi_setid1(iph1
) < 0)
132 /* create SA payload for my proposal */
133 iph1
->sa
= ipsecdoi_setph1proposal(iph1
->rmconf
->proposal
);
134 if (iph1
->sa
== NULL
)
137 /* consistency check of proposals */
138 if (iph1
->rmconf
->dhgrp
== NULL
) {
139 plog(LLV_ERROR
, LOCATION
, NULL
,
140 "configuration failure about DH group.\n");
144 /* generate DH public value */
145 if (oakley_dh_generate(iph1
->rmconf
->dhgrp
,
146 &iph1
->dhpub
, &iph1
->dhpriv
) < 0)
149 /* generate NONCE value */
150 iph1
->nonce
= eay_set_random(iph1
->rmconf
->nonce_size
);
151 if (iph1
->nonce
== NULL
)
155 vid_natt_rfc
= set_vendorid(VENDORID_NATT_RFC
);
156 vid_natt_apple
= set_vendorid(VENDORID_NATT_APPLE
);
157 vid_natt_02
= set_vendorid(VENDORID_NATT_02
);
158 vid_natt_02N
= set_vendorid(VENDORID_NATT_02N
);
160 if (vid_natt_rfc
== NULL
||
161 vid_natt_apple
== NULL
||
162 vid_natt_02
== NULL
||
163 vid_natt_02N
== NULL
) {
164 plog(LLV_ERROR
, LOCATION
, NULL
,
165 "failed to get vendor ID buffer.\n");
171 #ifdef HAVE_SIGNING_C
172 /* create CR if need */
173 if (iph1
->rmconf
->send_cr
174 && oakley_needcr(iph1
->rmconf
->proposal
->authmethod
)
175 && iph1
->rmconf
->peerscertfile
== NULL
) {
177 cr
= oakley_getcr(iph1
);
179 plog(LLV_ERROR
, LOCATION
, NULL
,
180 "failed to get cr buffer.\n");
185 plog(LLV_DEBUG
, LOCATION
, NULL
, "authmethod is %s\n",
186 s_oakley_attr_method(iph1
->rmconf
->proposal
->authmethod
));
187 /* create buffer to send isakmp payload */
188 tlen
= sizeof(struct isakmp
)
189 + sizeof(*gen
) + iph1
->sa
->l
190 + sizeof(*gen
) + iph1
->dhpub
->l
191 + sizeof(*gen
) + iph1
->nonce
->l
192 + sizeof(*gen
) + iph1
->id
->l
;
194 tlen
+= sizeof(*gen
) + cr
->l
;
196 if (iph1
->rmconf
->proposal
->authmethod
==
197 OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB
) {
198 gssapi_get_itoken(iph1
, &len
);
199 tlen
+= sizeof (*gen
) + len
;
203 tlen
+= sizeof(*gen
) + vid_natt_rfc
->l
;
204 tlen
+= sizeof(*gen
) + vid_natt_apple
->l
;
205 tlen
+= sizeof(*gen
) + vid_natt_02
->l
;
206 tlen
+= sizeof(*gen
) + vid_natt_02N
->l
;
209 iph1
->sendbuf
= vmalloc(tlen
);
210 if (iph1
->sendbuf
== NULL
) {
211 plog(LLV_ERROR
, LOCATION
, NULL
,
212 "failed to get buffer to send.\n");
216 /* set isakmp header */
217 p
= set_isakmp_header(iph1
->sendbuf
, iph1
, ISAKMP_NPTYPE_SA
);
221 /* set SA payload to propose */
222 p
= set_isakmp_payload(p
, iph1
->sa
, ISAKMP_NPTYPE_KE
);
224 /* create isakmp KE payload */
225 p
= set_isakmp_payload(p
, iph1
->dhpub
, ISAKMP_NPTYPE_NONCE
);
227 /* create isakmp NONCE payload */
228 p
= set_isakmp_payload(p
, iph1
->nonce
, ISAKMP_NPTYPE_ID
);
230 /* create isakmp ID payload */
232 if (iph1
->rmconf
->proposal
->authmethod
==
233 OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB
)
234 nptype
= ISAKMP_NPTYPE_GSS
;
238 nptype
= ISAKMP_NPTYPE_CR
;
240 nptype
= vid_natt_rfc
? ISAKMP_NPTYPE_VID
: ISAKMP_NPTYPE_NONE
;
242 p
= set_isakmp_payload(p
, iph1
->id
, nptype
);
245 if (iph1
->rmconf
->proposal
->authmethod
==
246 OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB
) {
247 gssapi_get_token_to_send(iph1
, &gsstoken
);
248 p
= set_isakmp_payload(p
, gsstoken
, vid_natt_rfc
? ISAKMP_NPTYPE_VID
: ISAKMP_NPTYPE_NONE
);
252 /* create isakmp CR payload */
253 p
= set_isakmp_payload(p
, cr
, vid_natt_rfc
? ISAKMP_NPTYPE_VID
: ISAKMP_NPTYPE_NONE
);
256 p
= set_isakmp_payload(p
, vid_natt_rfc
, ISAKMP_NPTYPE_VID
);
257 p
= set_isakmp_payload(p
, vid_natt_apple
, ISAKMP_NPTYPE_VID
);
258 p
= set_isakmp_payload(p
, vid_natt_02
, ISAKMP_NPTYPE_VID
);
259 p
= set_isakmp_payload(p
, vid_natt_02N
, ISAKMP_NPTYPE_NONE
);
262 #ifdef HAVE_PRINT_ISAKMP_C
263 isakmp_printpacket(iph1
->sendbuf
, iph1
->local
, iph1
->remote
, 0);
266 /* send the packet, add to the schedule to resend */
267 iph1
->retry_counter
= iph1
->rmconf
->retry_counter
;
268 if (isakmp_ph1resend(iph1
) == -1)
271 iph1
->status
= PHASE1ST_MSG1SENT
;
283 vfree(vid_natt_apple
);
293 * receive from responder
294 * psk: HDR, SA, KE, Nr, IDr1, HASH_R
295 * sig: HDR, SA, KE, Nr, IDr1, [ CR, ] [ CERT, ] SIG_R
296 * gssapi: HDR, SA, KE, Nr, IDr1, GSSr, HASH_R
297 * rsa: HDR, SA, KE, <IDr1_b>PubKey_i, <Nr_b>PubKey_i, HASH_R
298 * rev: HDR, SA, <Nr_b>PubKey_i, <KE_b>Ke_r, <IDir_b>Ke_r, HASH_R
301 agg_i2recv(iph1
, msg
)
302 struct ph1handle
*iph1
;
305 vchar_t
*pbuf
= NULL
;
306 struct isakmp_parse_t
*pa
;
307 vchar_t
*satmp
= NULL
;
310 vchar_t
*gsstoken
= NULL
;
314 if (iph1
->status
!= PHASE1ST_MSG1SENT
) {
315 plog(LLV_ERROR
, LOCATION
, NULL
,
316 "status mismatched %d.\n", iph1
->status
);
320 /* validate the type of next payload */
321 pbuf
= isakmp_parse(msg
);
324 pa
= (struct isakmp_parse_t
*)pbuf
->v
;
326 iph1
->pl_hash
= NULL
;
328 /* SA payload is fixed postion */
329 if (pa
->type
!= ISAKMP_NPTYPE_SA
) {
330 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
331 "received invalid next payload type %d, "
333 pa
->type
, ISAKMP_NPTYPE_SA
);
336 if (isakmp_p2ph(&satmp
, pa
->ptr
) < 0)
341 pa
->type
!= ISAKMP_NPTYPE_NONE
;
345 case ISAKMP_NPTYPE_KE
:
346 if (isakmp_p2ph(&iph1
->dhpub_p
, pa
->ptr
) < 0)
349 case ISAKMP_NPTYPE_NONCE
:
350 if (isakmp_p2ph(&iph1
->nonce_p
, pa
->ptr
) < 0)
353 case ISAKMP_NPTYPE_ID
:
354 if (isakmp_p2ph(&iph1
->id_p
, pa
->ptr
) < 0)
357 case ISAKMP_NPTYPE_HASH
:
358 iph1
->pl_hash
= (struct isakmp_pl_hash
*)pa
->ptr
;
360 #ifdef HAVE_SIGNING_C
361 case ISAKMP_NPTYPE_CR
:
362 if (oakley_savecr(iph1
, pa
->ptr
) < 0)
365 case ISAKMP_NPTYPE_CERT
:
366 if (oakley_savecert(iph1
, pa
->ptr
) < 0)
369 case ISAKMP_NPTYPE_SIG
:
370 if (isakmp_p2ph(&iph1
->sig_p
, pa
->ptr
) < 0)
374 case ISAKMP_NPTYPE_VID
:
377 int vid
= check_vendorid(pa
->ptr
);
379 if (vid
== VENDORID_NATT_RFC
)
380 iph1
->natt_flags
|= natt_type_rfc
;
381 else if (vid
== VENDORID_NATT_APPLE
)
382 iph1
->natt_flags
|= natt_type_apple
;
383 else if (vid
== VENDORID_NATT_02
)
384 iph1
->natt_flags
|= natt_type_02
;
385 else if (vid
== VENDORID_NATT_02N
)
386 iph1
->natt_flags
|= natt_type_02N
;
390 case ISAKMP_NPTYPE_N
:
391 isakmp_check_notify(pa
->ptr
, iph1
);
394 case ISAKMP_NPTYPE_GSS
:
395 if (isakmp_p2ph(&gsstoken
, pa
->ptr
) < 0)
397 gssapi_save_received_token(iph1
, gsstoken
);
400 case ISAKMP_NPTYPE_NATD_RFC
:
401 case ISAKMP_NPTYPE_NATD_DRAFT
:
402 case ISAKMP_NPTYPE_NATD_BADDRAFT
:
404 * ignored for now, we need to know the hash
405 * algorithm before we can evaluate the natd
410 /* don't send information, see isakmp_ident_r1() */
411 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
412 "ignore the packet, "
413 "received unexpecting payload type %d.\n",
419 /* if natt vid(s) received - select type to use */
420 natt_select_type(iph1
);
422 /* payload existency check */
423 if (iph1
->dhpub_p
== NULL
|| iph1
->nonce_p
== NULL
) {
424 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
425 "required payloads missing from isakmp message.\n");
429 /* verify identifier */
430 if (ipsecdoi_checkid1(iph1
) != 0) {
431 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
432 "invalid ID payload.\n");
436 /* check SA payload and set approval SA for use */
437 if (ipsecdoi_checkph1proposal(satmp
, iph1
) < 0) {
438 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
439 "failed to get valid proposal.\n");
440 /* XXX send information */
448 /* fix isakmp index */
449 memcpy(&iph1
->index
.r_ck
, &((struct isakmp
*)msg
->v
)->r_ck
,
455 /* check natd payloads */
456 for (pa
= (struct isakmp_parse_t
*)pbuf
->v
;
457 pa
->type
!= ISAKMP_NPTYPE_NONE
;
460 if (pa
->type
== ISAKMP_NPTYPE_NATD_RFC
||
461 pa
->type
== ISAKMP_NPTYPE_NATD_DRAFT
||
462 pa
->type
== ISAKMP_NPTYPE_NATD_BADDRAFT
)
464 if (pa
->type
!= iph1
->natd_payload_type
) {
465 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
466 "ignore the packet, "
467 "received unexpected natd payload type %d.\n",
472 natd_match_t match
= natd_matches(iph1
, pa
->ptr
);
473 iph1
->natt_flags
|= natt_natd_received
;
474 if ((match
& natd_match_local
) != 0)
475 iph1
->natt_flags
|= natt_no_local_nat
;
476 if ((match
& natd_match_remote
) != 0)
477 iph1
->natt_flags
|= natt_no_remote_nat
;
482 /* compute sharing secret of DH */
483 if (oakley_dh_compute(iph1
->rmconf
->dhgrp
, iph1
->dhpub
,
484 iph1
->dhpriv
, iph1
->dhpub_p
, &iph1
->dhgxy
) < 0)
487 /* generate SKEYIDs & IV & final cipher key */
488 if (oakley_skeyid(iph1
) < 0)
490 if (oakley_skeyid_dae(iph1
) < 0)
492 if (oakley_compute_enckey(iph1
) < 0)
494 if (oakley_newiv(iph1
) < 0)
498 /* Determine if we need to switch to port 4500 */
499 if (natd_hasnat(iph1
))
501 /* There is a NAT between us! Switch to port 4500. */
502 if (iph1
->remote
->sa_family
== AF_INET
)
504 struct sockaddr_in
*sin
= (struct sockaddr_in
*)iph1
->remote
;
505 plog(LLV_INFO
, LOCATION
, NULL
,
506 "detected NAT, switching to port %d for %s",
507 PORT_ISAKMP_NATT
, saddr2str(iph1
->remote
));
508 sin
->sin_port
= htons(PORT_ISAKMP_NATT
);
509 sin
= (struct sockaddr_in
*)iph1
->local
;
510 sin
->sin_port
= htons(PORT_ISAKMP_NATT
);
515 /* validate authentication value */
518 type
= oakley_validate_auth(iph1
);
521 /* message printed inner oakley_validate_auth() */
524 isakmp_info_send_n1(iph1
, type
, NULL
);
529 #ifdef HAVE_SIGNING_C
530 if (oakley_checkcr(iph1
) < 0) {
531 /* Ignore this error in order to be interoperability. */
536 /* change status of isakmp status entry */
537 iph1
->status
= PHASE1ST_MSG2RECEIVED
;
547 VPTRINIT(iph1
->dhpub_p
);
548 VPTRINIT(iph1
->nonce_p
);
549 VPTRINIT(iph1
->id_p
);
550 oakley_delcert(iph1
->cert_p
);
552 oakley_delcert(iph1
->crl_p
);
554 VPTRINIT(iph1
->sig_p
);
555 oakley_delcert(iph1
->cr_p
);
565 * gssapi: HDR, HASH_I
566 * sig: HDR, [ CERT, ] SIG_I
571 agg_i2send(iph1
, msg
)
572 struct ph1handle
*iph1
;
575 struct isakmp_gen
*gen
;
580 vchar_t
*gsshash
= NULL
;
584 if (iph1
->status
!= PHASE1ST_MSG2RECEIVED
) {
585 plog(LLV_ERROR
, LOCATION
, NULL
,
586 "status mismatched %d.\n", iph1
->status
);
590 /* generate HASH to send */
591 plog(LLV_DEBUG
, LOCATION
, NULL
, "generate HASH_I\n");
592 iph1
->hash
= oakley_ph1hash_common(iph1
, GENERATE
);
593 if (iph1
->hash
== NULL
) {
595 if (gssapi_more_tokens(iph1
))
596 isakmp_info_send_n1(iph1
,
597 ISAKMP_NTYPE_INVALID_EXCHANGE_TYPE
, NULL
);
602 tlen
= sizeof(struct isakmp
);
605 if ((iph1
->natt_flags
& NATT_TYPE_MASK
) != 0) {
606 natd_type
= iph1
->natd_payload_type
;
608 if (iph1
->local_natd
)
609 tlen
+= sizeof(*gen
) + iph1
->local_natd
->l
;
610 if (iph1
->remote_natd
)
611 tlen
+= sizeof(*gen
) + iph1
->remote_natd
->l
;
615 switch (iph1
->approval
->authmethod
) {
616 case OAKLEY_ATTR_AUTH_METHOD_PSKEY
:
617 tlen
+= sizeof(*gen
) + iph1
->hash
->l
;
619 iph1
->sendbuf
= vmalloc(tlen
);
620 if (iph1
->sendbuf
== NULL
) {
621 plog(LLV_ERROR
, LOCATION
, NULL
,
622 "failed to get buffer to send.\n");
626 /* set isakmp header */
627 p
= set_isakmp_header(iph1
->sendbuf
, iph1
, ISAKMP_NPTYPE_HASH
);
631 /* set HASH payload */
632 p
= set_isakmp_payload(p
, iph1
->hash
,
633 natd_type
? natd_type
634 : ISAKMP_NPTYPE_NONE
);
636 #ifdef HAVE_SIGNING_C
637 case OAKLEY_ATTR_AUTH_METHOD_DSSSIG
:
638 case OAKLEY_ATTR_AUTH_METHOD_RSASIG
:
639 /* XXX if there is CR or not ? */
641 if (oakley_getmycert(iph1
) < 0)
644 if (oakley_getsign(iph1
) < 0)
647 if (iph1
->cert
!= NULL
&& iph1
->rmconf
->send_cert
)
650 tlen
+= sizeof(*gen
) + iph1
->sig
->l
;
652 tlen
+= sizeof(*gen
) + iph1
->cert
->pl
->l
;
654 iph1
->sendbuf
= vmalloc(tlen
);
655 if (iph1
->sendbuf
== NULL
) {
656 plog(LLV_ERROR
, LOCATION
, NULL
,
657 "failed to get buffer to send.\n");
661 /* set isakmp header */
662 p
= set_isakmp_header(iph1
->sendbuf
, iph1
, need_cert
664 : ISAKMP_NPTYPE_SIG
);
668 /* add CERT payload if there */
670 p
= set_isakmp_payload(p
, iph1
->cert
->pl
, ISAKMP_NPTYPE_SIG
);
671 /* add SIG payload */
672 p
= set_isakmp_payload(p
, iph1
->sig
,
673 natd_type
? natd_type
674 : ISAKMP_NPTYPE_NONE
);
677 case OAKLEY_ATTR_AUTH_METHOD_RSAENC
:
678 case OAKLEY_ATTR_AUTH_METHOD_RSAREV
:
679 tlen
+= sizeof(*gen
) + iph1
->hash
->l
;
682 case OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB
:
683 gsshash
= gssapi_wraphash(iph1
);
684 if (gsshash
== NULL
) {
685 plog(LLV_ERROR
, LOCATION
, NULL
,
686 "failed to wrap hash\n");
687 isakmp_info_send_n1(iph1
,
688 ISAKMP_NTYPE_INVALID_EXCHANGE_TYPE
, NULL
);
691 tlen
+= sizeof(*gen
) + gsshash
->l
;
693 iph1
->sendbuf
= vmalloc(tlen
);
694 if (iph1
->sendbuf
== NULL
) {
695 plog(LLV_ERROR
, LOCATION
, NULL
,
696 "failed to get buffer to send.\n");
699 /* set isakmp header */
700 p
= set_isakmp_header(iph1
->sendbuf
, iph1
, ISAKMP_NPTYPE_HASH
);
703 p
= set_isakmp_payload(p
, gsshash
,
704 natd_type
? natd_type
705 : ISAKMP_NPTYPE_NONE
);
712 if ((iph1
->natt_flags
& NATT_TYPE_MASK
) == natt_type_apple
) {
713 if (iph1
->local_natd
)
714 p
= set_isakmp_payload(p
, iph1
->local_natd
, natd_type
);
715 if (iph1
->remote_natd
)
716 p
= set_isakmp_payload(p
, iph1
->remote_natd
, ISAKMP_NPTYPE_NONE
);
718 if (iph1
->remote_natd
)
719 p
= set_isakmp_payload(p
, iph1
->remote_natd
, natd_type
);
720 if (iph1
->local_natd
)
721 p
= set_isakmp_payload(p
, iph1
->local_natd
, ISAKMP_NPTYPE_NONE
);
726 #ifdef HAVE_PRINT_ISAKMP_C
727 isakmp_printpacket(iph1
->sendbuf
, iph1
->local
, iph1
->remote
, 0);
730 /* send to responder */
731 if (isakmp_send(iph1
, iph1
->sendbuf
) < 0)
734 /* the sending message is added to the received-list. */
735 if (add_recvdpkt(iph1
->remote
, iph1
->local
, iph1
->sendbuf
, msg
) == -1) {
736 plog(LLV_ERROR
, LOCATION
, NULL
,
737 "failed to add a response packet to the tree.\n");
741 /* set encryption flag */
742 iph1
->flags
|= ISAKMP_FLAG_E
;
744 iph1
->status
= PHASE1ST_ESTABLISHED
;
755 * receive from initiator
756 * psk: HDR, SA, KE, Ni, IDi1
757 * sig: HDR, SA, KE, Ni, IDi1 [, CR ]
758 * gssapi: HDR, SA, KE, Ni, IDi1 , GSSi
759 * rsa: HDR, SA, [ HASH(1),] KE, <IDi1_b>Pubkey_r, <Ni_b>Pubkey_r
760 * rev: HDR, SA, [ HASH(1),] <Ni_b>Pubkey_r, <KE_b>Ke_i,
761 * <IDii_b>Ke_i [, <Cert-I_b>Ke_i ]
764 agg_r1recv(iph1
, msg
)
765 struct ph1handle
*iph1
;
769 vchar_t
*pbuf
= NULL
;
770 struct isakmp_parse_t
*pa
;
772 vchar_t
*gsstoken
= NULL
;
776 if (iph1
->status
!= PHASE1ST_START
) {
777 plog(LLV_ERROR
, LOCATION
, NULL
,
778 "status mismatched %d.\n", iph1
->status
);
782 /* validate the type of next payload */
783 pbuf
= isakmp_parse(msg
);
786 pa
= (struct isakmp_parse_t
*)pbuf
->v
;
788 /* SA payload is fixed postion */
789 if (pa
->type
!= ISAKMP_NPTYPE_SA
) {
790 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
791 "received invalid next payload type %d, "
793 pa
->type
, ISAKMP_NPTYPE_SA
);
796 if (isakmp_p2ph(&iph1
->sa
, pa
->ptr
) < 0)
801 pa
->type
!= ISAKMP_NPTYPE_NONE
;
804 plog(LLV_DEBUG
, LOCATION
, NULL
,
805 "received payload of type %s\n",
806 s_isakmp_nptype(pa
->type
));
809 case ISAKMP_NPTYPE_KE
:
810 if (isakmp_p2ph(&iph1
->dhpub_p
, pa
->ptr
) < 0)
813 case ISAKMP_NPTYPE_NONCE
:
814 if (isakmp_p2ph(&iph1
->nonce_p
, pa
->ptr
) < 0)
817 case ISAKMP_NPTYPE_ID
:
818 if (isakmp_p2ph(&iph1
->id_p
, pa
->ptr
) < 0)
821 case ISAKMP_NPTYPE_VID
:
824 int vid
= check_vendorid(pa
->ptr
);
826 if (vid
== VENDORID_NATT_RFC
)
827 iph1
->natt_flags
|= natt_type_rfc
;
828 else if (vid
== VENDORID_NATT_APPLE
)
829 iph1
->natt_flags
|= natt_type_apple
;
830 else if (vid
== VENDORID_NATT_02
)
831 iph1
->natt_flags
|= natt_type_02
;
832 else if (vid
== VENDORID_NATT_02N
)
833 iph1
->natt_flags
|= natt_type_02N
;
837 #ifdef HAVE_SIGNING_C
838 case ISAKMP_NPTYPE_CR
:
839 if (oakley_savecr(iph1
, pa
->ptr
) < 0)
844 case ISAKMP_NPTYPE_GSS
:
845 if (isakmp_p2ph(&gsstoken
, pa
->ptr
) < 0)
847 gssapi_save_received_token(iph1
, gsstoken
);
851 /* don't send information, see isakmp_ident_r1() */
852 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
853 "ignore the packet, "
854 "received unexpecting payload type %d.\n",
860 /* payload existency check */
861 if (iph1
->dhpub_p
== NULL
|| iph1
->nonce_p
== NULL
) {
862 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
863 "required payloads missing from isakmp message.\n");
867 /* verify identifier */
868 if (ipsecdoi_checkid1(iph1
) != 0) {
869 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
870 "invalid ID payload.\n");
874 /* check SA payload and set approval SA for use */
875 if (ipsecdoi_checkph1proposal(iph1
->sa
, iph1
) < 0) {
876 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
877 "failed to get valid proposal.\n");
878 /* XXX send information */
883 /* if natt vid(s) received - select type to use */
884 natt_select_type(iph1
);
887 #ifdef HAVE_SIGNING_C
888 if (oakley_checkcr(iph1
) < 0) {
889 /* Ignore this error in order to be interoperability. */
894 iph1
->status
= PHASE1ST_MSG1RECEIVED
;
903 VPTRINIT(iph1
->dhpub_p
);
904 VPTRINIT(iph1
->nonce_p
);
905 VPTRINIT(iph1
->id_p
);
906 oakley_delcert(iph1
->cr_p
);
915 * psk: HDR, SA, KE, Nr, IDr1, HASH_R
916 * sig: HDR, SA, KE, Nr, IDr1, [ CR, ] [ CERT, ] SIG_R
917 * gssapi: HDR, SA, KE, Nr, IDr1, GSSr, HASH_R
918 * rsa: HDR, SA, KE, <IDr1_b>PubKey_i, <Nr_b>PubKey_i, HASH_R
919 * rev: HDR, SA, <Nr_b>PubKey_i, <KE_b>Ke_r, <IDir_b>Ke_r, HASH_R
922 agg_r1send(iph1
, msg
)
923 struct ph1handle
*iph1
;
926 struct isakmp_gen
*gen
;
936 vchar_t
*gsstoken
= NULL
, *gsshash
= NULL
;
937 vchar_t
*gss_sa
= NULL
;
939 vchar_t
*nattvid
= NULL
;
942 if (iph1
->status
!= PHASE1ST_MSG1RECEIVED
) {
943 plog(LLV_ERROR
, LOCATION
, NULL
,
944 "status mismatched %d.\n", iph1
->status
);
948 /* set responder's cookie */
949 isakmp_newcookie((caddr_t
)&iph1
->index
.r_ck
, iph1
->remote
, iph1
->local
);
951 /* make ID payload into isakmp status */
952 if (ipsecdoi_setid1(iph1
) < 0)
955 /* generate DH public value */
956 if (oakley_dh_generate(iph1
->rmconf
->dhgrp
,
957 &iph1
->dhpub
, &iph1
->dhpriv
) < 0)
960 /* generate NONCE value */
961 iph1
->nonce
= eay_set_random(iph1
->rmconf
->nonce_size
);
962 if (iph1
->nonce
== NULL
)
965 /* compute sharing secret of DH */
966 if (oakley_dh_compute(iph1
->approval
->dhgrp
, iph1
->dhpub
,
967 iph1
->dhpriv
, iph1
->dhpub_p
, &iph1
->dhgxy
) < 0)
970 /* generate SKEYIDs & IV & final cipher key */
971 if (oakley_skeyid(iph1
) < 0)
973 if (oakley_skeyid_dae(iph1
) < 0)
975 if (oakley_compute_enckey(iph1
) < 0)
977 if (oakley_newiv(iph1
) < 0)
981 if (iph1
->rmconf
->proposal
->authmethod
==
982 OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB
)
983 gssapi_get_rtoken(iph1
, &gsslen
);
986 /* generate HASH to send */
987 plog(LLV_DEBUG
, LOCATION
, NULL
, "generate HASH_R\n");
988 iph1
->hash
= oakley_ph1hash_common(iph1
, GENERATE
);
989 if (iph1
->hash
== NULL
) {
991 if (gssapi_more_tokens(iph1
))
992 isakmp_info_send_n1(iph1
,
993 ISAKMP_NTYPE_INVALID_EXCHANGE_TYPE
, NULL
);
998 #ifdef HAVE_SIGNING_C
999 /* create CR if need */
1000 if (iph1
->rmconf
->send_cr
1001 && oakley_needcr(iph1
->approval
->authmethod
)
1002 && iph1
->rmconf
->peerscertfile
== NULL
) {
1004 cr
= oakley_getcr(iph1
);
1006 plog(LLV_ERROR
, LOCATION
, NULL
,
1007 "failed to get cr buffer.\n");
1013 tlen
= sizeof(struct isakmp
);
1016 if ((iph1
->natt_flags
& NATT_TYPE_MASK
) != 0) {
1018 int natt_type
= iph1
->natt_flags
& NATT_TYPE_MASK
;
1019 if (natt_type
== natt_type_rfc
)
1020 vid_type
= VENDORID_NATT_RFC
;
1021 else if (natt_type
== natt_type_apple
)
1022 vid_type
= VENDORID_NATT_APPLE
;
1023 else if (natt_type
== natt_type_02
)
1024 vid_type
= VENDORID_NATT_02
;
1026 vid_type
= VENDORID_NATT_02N
;
1027 nattvid
= set_vendorid(vid_type
);
1030 tlen
+= sizeof(*gen
) + nattvid
->l
;
1031 if (iph1
->local_natd
)
1032 tlen
+= sizeof(*gen
) + iph1
->local_natd
->l
;
1033 if (iph1
->remote_natd
)
1034 tlen
+= sizeof(*gen
) + iph1
->remote_natd
->l
;
1039 switch (iph1
->approval
->authmethod
) {
1040 case OAKLEY_ATTR_AUTH_METHOD_PSKEY
:
1041 /* create buffer to send isakmp payload */
1042 tlen
+= sizeof(*gen
) + iph1
->sa_ret
->l
1043 + sizeof(*gen
) + iph1
->dhpub
->l
1044 + sizeof(*gen
) + iph1
->nonce
->l
1045 + sizeof(*gen
) + iph1
->id
->l
1046 + sizeof(*gen
) + iph1
->hash
->l
;
1047 if ((vid
= set_vendorid(iph1
->approval
->vendorid
)) != NULL
)
1048 tlen
+= sizeof(*gen
) + vid
->l
;
1050 tlen
+= sizeof(*gen
) + cr
->l
;
1052 iph1
->sendbuf
= vmalloc(tlen
);
1053 if (iph1
->sendbuf
== NULL
) {
1054 plog(LLV_ERROR
, LOCATION
, NULL
,
1055 "failed to get buffer to send\n");
1059 /* set isakmp header */
1060 p
= set_isakmp_header(iph1
->sendbuf
, iph1
, ISAKMP_NPTYPE_SA
);
1064 /* set SA payload to reply */
1065 p
= set_isakmp_payload(p
, iph1
->sa_ret
, ISAKMP_NPTYPE_KE
);
1067 /* create isakmp KE payload */
1068 p
= set_isakmp_payload(p
, iph1
->dhpub
, ISAKMP_NPTYPE_NONCE
);
1070 /* create isakmp NONCE payload */
1071 p
= set_isakmp_payload(p
, iph1
->nonce
, ISAKMP_NPTYPE_ID
);
1073 /* create isakmp ID payload */
1074 p
= set_isakmp_payload(p
, iph1
->id
, ISAKMP_NPTYPE_HASH
);
1076 /* create isakmp HASH payload */
1077 p
= set_isakmp_payload(p
, iph1
->hash
,
1078 vid
? ISAKMP_NPTYPE_VID
1079 : (need_cr
? ISAKMP_NPTYPE_CR
1080 : (nattvid
? ISAKMP_NPTYPE_VID
1081 : ISAKMP_NPTYPE_NONE
)));
1083 /* append vendor id, if needed */
1085 p
= set_isakmp_payload(p
, vid
,
1086 need_cr
? ISAKMP_NPTYPE_CR
1087 : (nattvid
? ISAKMP_NPTYPE_VID
1088 : ISAKMP_NPTYPE_NONE
));
1090 /* create isakmp CR payload if needed */
1092 p
= set_isakmp_payload(p
, cr
,
1093 nattvid
? ISAKMP_NPTYPE_VID
1094 : ISAKMP_NPTYPE_NONE
);
1096 #ifdef HAVE_SIGNING_C
1097 case OAKLEY_ATTR_AUTH_METHOD_DSSSIG
:
1098 case OAKLEY_ATTR_AUTH_METHOD_RSASIG
:
1099 /* XXX if there is CR or not ? */
1101 if (oakley_getmycert(iph1
) < 0)
1104 if (oakley_getsign(iph1
) < 0)
1107 if (iph1
->cert
!= NULL
&& iph1
->rmconf
->send_cert
)
1110 tlen
+= sizeof(*gen
) + iph1
->sa_ret
->l
1111 + sizeof(*gen
) + iph1
->dhpub
->l
1112 + sizeof(*gen
) + iph1
->nonce
->l
1113 + sizeof(*gen
) + iph1
->id
->l
1114 + sizeof(*gen
) + iph1
->sig
->l
;
1116 tlen
+= sizeof(*gen
) + iph1
->cert
->pl
->l
;
1117 if ((vid
= set_vendorid(iph1
->approval
->vendorid
)) != NULL
)
1118 tlen
+= sizeof(*gen
) + vid
->l
;
1120 tlen
+= sizeof(*gen
) + cr
->l
;
1122 iph1
->sendbuf
= vmalloc(tlen
);
1123 if (iph1
->sendbuf
== NULL
) {
1124 plog(LLV_ERROR
, LOCATION
, NULL
,
1125 "failed to get buffer to send.\n");
1129 /* set isakmp header */
1130 p
= set_isakmp_header(iph1
->sendbuf
, iph1
, ISAKMP_NPTYPE_SA
);
1134 /* set SA payload to reply */
1135 p
= set_isakmp_payload(p
, iph1
->sa_ret
, ISAKMP_NPTYPE_KE
);
1137 /* create isakmp KE payload */
1138 p
= set_isakmp_payload(p
, iph1
->dhpub
, ISAKMP_NPTYPE_NONCE
);
1140 /* create isakmp NONCE payload */
1141 p
= set_isakmp_payload(p
, iph1
->nonce
, ISAKMP_NPTYPE_ID
);
1143 /* add ID payload */
1144 p
= set_isakmp_payload(p
, iph1
->id
, need_cert
1145 ? ISAKMP_NPTYPE_CERT
1146 : ISAKMP_NPTYPE_SIG
);
1148 /* add CERT payload if there */
1150 p
= set_isakmp_payload(p
, iph1
->cert
->pl
, ISAKMP_NPTYPE_SIG
);
1151 /* add SIG payload */
1152 p
= set_isakmp_payload(p
, iph1
->sig
,
1153 vid
? ISAKMP_NPTYPE_VID
1154 : (need_cr
? ISAKMP_NPTYPE_CR
1155 : ISAKMP_NPTYPE_NONE
));
1157 /* append vendor id, if needed */
1159 p
= set_isakmp_payload(p
, vid
,
1160 need_cr
? ISAKMP_NPTYPE_CR
1161 : (nattvid
? ISAKMP_NPTYPE_VID
1162 : ISAKMP_NPTYPE_NONE
));
1164 /* create isakmp CR payload if needed */
1166 p
= set_isakmp_payload(p
, cr
,
1167 nattvid
? ISAKMP_NPTYPE_VID
1168 : ISAKMP_NPTYPE_NONE
);
1172 p
= set_isakmp_payload(p
, nattvid
, iph1
->natd_payload_type
);
1173 if ((iph1
->natt_flags
& NATT_TYPE_MASK
) == natt_type_apple
) {
1174 if (iph1
->local_natd
)
1175 p
= set_isakmp_payload(p
, iph1
->local_natd
, iph1
->natd_payload_type
);
1176 if (iph1
->remote_natd
)
1177 p
= set_isakmp_payload(p
, iph1
->remote_natd
, ISAKMP_NPTYPE_NONE
);
1179 if (iph1
->remote_natd
)
1180 p
= set_isakmp_payload(p
, iph1
->remote_natd
, iph1
->natd_payload_type
);
1181 if (iph1
->local_natd
)
1182 p
= set_isakmp_payload(p
, iph1
->local_natd
, ISAKMP_NPTYPE_NONE
);
1188 case OAKLEY_ATTR_AUTH_METHOD_RSAENC
:
1189 case OAKLEY_ATTR_AUTH_METHOD_RSAREV
:
1190 tlen
+= sizeof(*gen
) + iph1
->hash
->l
;
1193 case OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB
:
1194 /* create buffer to send isakmp payload */
1195 gsshash
= gssapi_wraphash(iph1
);
1196 if (gsshash
== NULL
) {
1197 plog(LLV_ERROR
, LOCATION
, NULL
,
1198 "failed to wrap hash\n");
1200 * This is probably due to the GSS roundtrips not
1201 * being finished yet. Return this error in
1202 * the hope that a fallback to main mode will
1205 isakmp_info_send_n1(iph1
,
1206 ISAKMP_NTYPE_INVALID_EXCHANGE_TYPE
, NULL
);
1209 if (iph1
->approval
->gssid
!= NULL
)
1210 gss_sa
= ipsecdoi_setph1proposal(iph1
->approval
);
1212 gss_sa
= iph1
->sa_ret
;
1214 tlen
+= sizeof(*gen
) + gss_sa
->l
1215 + sizeof(*gen
) + iph1
->dhpub
->l
1216 + sizeof(*gen
) + iph1
->nonce
->l
1217 + sizeof(*gen
) + iph1
->id
->l
1218 + sizeof(*gen
) + gsslen
1219 + sizeof(*gen
) + gsshash
->l
;
1220 if ((vid
= set_vendorid(iph1
->approval
->vendorid
)) != NULL
)
1221 tlen
+= sizeof(*gen
) + vid
->l
;
1222 iph1
->sendbuf
= vmalloc(tlen
);
1223 if (iph1
->sendbuf
== NULL
) {
1224 plog(LLV_ERROR
, LOCATION
, NULL
,
1225 "failed to get buffer to send\n");
1229 /* set isakmp header */
1230 p
= set_isakmp_header(iph1
->sendbuf
, iph1
, ISAKMP_NPTYPE_SA
);
1234 /* set SA payload to reply */
1235 p
= set_isakmp_payload(p
, gss_sa
, ISAKMP_NPTYPE_KE
);
1237 /* create isakmp KE payload */
1238 p
= set_isakmp_payload(p
, iph1
->dhpub
, ISAKMP_NPTYPE_NONCE
);
1240 /* create isakmp NONCE payload */
1241 p
= set_isakmp_payload(p
, iph1
->nonce
, ISAKMP_NPTYPE_ID
);
1243 /* create isakmp ID payload */
1244 p
= set_isakmp_payload(p
, iph1
->id
, ISAKMP_NPTYPE_GSS
);
1246 /* create GSS payload */
1247 gssapi_get_token_to_send(iph1
, &gsstoken
);
1248 p
= set_isakmp_payload(p
, gsstoken
, ISAKMP_NPTYPE_HASH
);
1250 /* create isakmp HASH payload */
1251 p
= set_isakmp_payload(p
, gsshash
,
1252 vid
!= NULL
|| nattvid
!= NULL
? ISAKMP_NPTYPE_VID
1253 : ISAKMP_NPTYPE_NONE
);
1255 /* append vendor id, if needed */
1257 p
= set_isakmp_payload(p
, vid
,
1258 nattvid
!= NULL
? ISAKMP_NPTYPE_VID
1259 : ISAKMP_NPTYPE_NONE
);
1266 p
= set_isakmp_payload(p
, nattvid
, iph1
->natd_payload_type
);
1267 if ((iph1
->natt_flags
& NATT_TYPE_MASK
) == natt_type_apple
) {
1268 if (iph1
->local_natd
)
1269 p
= set_isakmp_payload(p
, iph1
->local_natd
, iph1
->natd_payload_type
);
1270 if (iph1
->remote_natd
)
1271 p
= set_isakmp_payload(p
, iph1
->remote_natd
, ISAKMP_NPTYPE_NONE
);
1273 if (iph1
->remote_natd
)
1274 p
= set_isakmp_payload(p
, iph1
->remote_natd
, iph1
->natd_payload_type
);
1275 if (iph1
->local_natd
)
1276 p
= set_isakmp_payload(p
, iph1
->local_natd
, ISAKMP_NPTYPE_NONE
);
1282 #ifdef HAVE_PRINT_ISAKMP_C
1283 isakmp_printpacket(iph1
->sendbuf
, iph1
->local
, iph1
->remote
, 1);
1286 /* send the packet, add to the schedule to resend */
1287 iph1
->retry_counter
= iph1
->rmconf
->retry_counter
;
1288 if (isakmp_ph1resend(iph1
) == -1)
1291 /* the sending message is added to the received-list. */
1292 if (add_recvdpkt(iph1
->remote
, iph1
->local
, iph1
->sendbuf
, msg
) == -1) {
1293 plog(LLV_ERROR
, LOCATION
, NULL
,
1294 "failed to add a response packet to the tree.\n");
1298 iph1
->status
= PHASE1ST_MSG1SENT
;
1314 if (gss_sa
!= iph1
->sa_ret
)
1322 * receive from initiator
1324 * gssapi: HDR, HASH_I
1325 * sig: HDR, [ CERT, ] SIG_I
1330 agg_r2recv(iph1
, msg0
)
1331 struct ph1handle
*iph1
;
1334 vchar_t
*msg
= NULL
;
1335 vchar_t
*pbuf
= NULL
;
1336 struct isakmp_parse_t
*pa
;
1339 /* validity check */
1340 if (iph1
->status
!= PHASE1ST_MSG1SENT
) {
1341 plog(LLV_ERROR
, LOCATION
, NULL
,
1342 "status mismatched %d.\n", iph1
->status
);
1346 /* decrypting if need. */
1347 /* XXX configurable ? */
1348 if (ISSET(((struct isakmp
*)msg0
->v
)->flags
, ISAKMP_FLAG_E
)) {
1349 msg
= oakley_do_decrypt(iph1
, msg0
,
1350 iph1
->ivm
->iv
, iph1
->ivm
->ive
);
1356 /* validate the type of next payload */
1357 pbuf
= isakmp_parse(msg
);
1361 iph1
->pl_hash
= NULL
;
1363 for (pa
= (struct isakmp_parse_t
*)pbuf
->v
;
1364 pa
->type
!= ISAKMP_NPTYPE_NONE
;
1368 case ISAKMP_NPTYPE_HASH
:
1369 iph1
->pl_hash
= (struct isakmp_pl_hash
*)pa
->ptr
;
1371 case ISAKMP_NPTYPE_VID
:
1372 (void)check_vendorid(pa
->ptr
);
1374 #ifdef HAVE_SIGNING_C
1375 case ISAKMP_NPTYPE_CERT
:
1376 if (oakley_savecert(iph1
, pa
->ptr
) < 0)
1379 case ISAKMP_NPTYPE_SIG
:
1380 if (isakmp_p2ph(&iph1
->sig_p
, pa
->ptr
) < 0)
1384 case ISAKMP_NPTYPE_N
:
1385 isakmp_check_notify(pa
->ptr
, iph1
);
1387 case ISAKMP_NPTYPE_NATD_RFC
:
1388 case ISAKMP_NPTYPE_NATD_DRAFT
:
1389 case ISAKMP_NPTYPE_NATD_BADDRAFT
:
1391 if (pa
->type
!= iph1
->natd_payload_type
) {
1392 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
1393 "ignore the packet, "
1394 "received unexpected natd payload type %d.\n",
1400 natd_match_t match
= natd_matches(iph1
, pa
->ptr
);
1401 iph1
->natt_flags
|= natt_natd_received
;
1402 if ((match
& natd_match_local
) != 0)
1403 iph1
->natt_flags
|= natt_no_local_nat
;
1404 if ((match
& natd_match_remote
) != 0)
1405 iph1
->natt_flags
|= natt_no_remote_nat
;
1410 /* don't send information, see isakmp_ident_r1() */
1411 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
1412 "ignore the packet, "
1413 "received unexpecting payload type %d.\n",
1419 /* validate authentication value */
1422 type
= oakley_validate_auth(iph1
);
1425 /* message printed inner oakley_validate_auth() */
1428 isakmp_info_send_n1(iph1
, type
, NULL
);
1433 iph1
->status
= PHASE1ST_MSG2RECEIVED
;
1443 oakley_delcert(iph1
->cert_p
);
1444 iph1
->cert_p
= NULL
;
1445 oakley_delcert(iph1
->crl_p
);
1447 VPTRINIT(iph1
->sig_p
);
1454 * status update and establish isakmp sa.
1457 agg_r2send(iph1
, msg
)
1458 struct ph1handle
*iph1
;
1463 /* validity check */
1464 if (iph1
->status
!= PHASE1ST_MSG2RECEIVED
) {
1465 plog(LLV_ERROR
, LOCATION
, NULL
,
1466 "status mismatched %d.\n", iph1
->status
);
1470 /* IV synchronized when packet encrypted. */
1471 /* see handler.h about IV synchronization. */
1472 if (ISSET(((struct isakmp
*)msg
->v
)->flags
, ISAKMP_FLAG_E
))
1473 memcpy(iph1
->ivm
->iv
->v
, iph1
->ivm
->ive
->v
, iph1
->ivm
->iv
->l
);
1475 /* set encryption flag */
1476 iph1
->flags
|= ISAKMP_FLAG_E
;
1478 iph1
->status
= PHASE1ST_ESTABLISHED
;