1 /* $NetBSD: isakmp_ident.c,v 1.6 2006/10/02 21:41:59 manu Exp $ */
3 /* Id: isakmp_ident.c,v 1.21 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 /* Identity Protecion Exchange (Main 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>
64 #include "localconf.h"
65 #include "remoteconf.h"
66 #include "isakmp_var.h"
71 #include "ipsec_doi.h"
72 #include "crypto_openssl.h"
74 #include "isakmp_ident.h"
75 #include "isakmp_inf.h"
79 #include "nattraversal.h"
86 #include "isakmp_xauth.h"
87 #include "isakmp_cfg.h"
90 #include "isakmp_frag.h"
93 #include "vpn_control.h"
94 #include "vpn_control_var.h"
95 #include "ipsecSessionTracer.h"
96 #include "ipsecMessageTracer.h"
98 static vchar_t
*ident_ir2mx
__P((struct ph1handle
*));
99 static vchar_t
*ident_ir3mx
__P((struct ph1handle
*));
102 * begin Identity Protection Mode as initiator.
112 ident_i1send(iph1
, msg
)
113 struct ph1handle
*iph1
;
114 vchar_t
*msg
; /* must be null */
116 struct payload_list
*plist
= NULL
;
119 vchar_t
*vid_natt
[MAX_NATT_VID_COUNT
] = { NULL
};
123 vchar_t
*vid_xauth
= NULL
;
124 vchar_t
*vid_unity
= NULL
;
127 vchar_t
*vid_frag
= NULL
;
130 vchar_t
*vid_dpd
= NULL
;
134 plog(LLV_ERROR
, LOCATION
, NULL
,
135 "msg has to be NULL in this function.\n");
138 if (iph1
->status
!= PHASE1ST_START
) {
139 plog(LLV_ERROR
, LOCATION
, NULL
,
140 "status mismatched %d.\n", iph1
->status
);
144 /* create isakmp index */
145 memset(&iph1
->index
, 0, sizeof(iph1
->index
));
146 isakmp_newcookie((caddr_t
)&iph1
->index
, iph1
->remote
, iph1
->local
);
148 /* create SA payload for my proposal */
149 iph1
->sa
= ipsecdoi_setph1proposal(iph1
->rmconf
->proposal
);
150 if (iph1
->sa
== NULL
) {
151 plog(LLV_ERROR
, LOCATION
, NULL
,
152 "failed to set proposal");
156 /* set SA payload to propose */
157 plist
= isakmp_plist_append(plist
, iph1
->sa
, ISAKMP_NPTYPE_SA
);
160 /* set VID payload for NAT-T if NAT-T support allowed in the config file */
161 if (iph1
->rmconf
->nat_traversal
)
162 plist
= isakmp_plist_append_natt_vids(plist
, vid_natt
);
165 /* Do we need Xauth VID? */
166 switch (RMAUTHMETHOD(iph1
)) {
167 case FICTIVE_AUTH_METHOD_XAUTH_PSKEY_I
:
168 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_I
:
169 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_I
:
170 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_I
:
171 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_I
:
172 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_I
:
173 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_I
:
174 if ((vid_xauth
= set_vendorid(VENDORID_XAUTH
)) == NULL
)
175 plog(LLV_ERROR
, LOCATION
, NULL
,
176 "Xauth vendor ID generation failed\n");
178 plist
= isakmp_plist_append(plist
,
179 vid_xauth
, ISAKMP_NPTYPE_VID
);
181 if ((vid_unity
= set_vendorid(VENDORID_UNITY
)) == NULL
)
182 plog(LLV_ERROR
, LOCATION
, NULL
,
183 "Unity vendor ID generation failed\n");
185 plist
= isakmp_plist_append(plist
,
186 vid_unity
, ISAKMP_NPTYPE_VID
);
193 if (iph1
->rmconf
->ike_frag
) {
194 if ((vid_frag
= set_vendorid(VENDORID_FRAG
)) == NULL
) {
195 plog(LLV_ERROR
, LOCATION
, NULL
,
196 "Frag vendorID construction failed\n");
198 vid_frag
= isakmp_frag_addcap(vid_frag
,
199 VENDORID_FRAG_IDENT
);
200 plist
= isakmp_plist_append(plist
,
201 vid_frag
, ISAKMP_NPTYPE_VID
);
206 if(iph1
->rmconf
->dpd
){
207 vid_dpd
= set_vendorid(VENDORID_DPD
);
209 plist
= isakmp_plist_append(plist
, vid_dpd
,
214 iph1
->sendbuf
= isakmp_plist_set_all (&plist
, iph1
);
216 #ifdef HAVE_PRINT_ISAKMP_C
217 isakmp_printpacket(iph1
->sendbuf
, iph1
->local
, iph1
->remote
, 0);
220 /* send the packet, add to the schedule to resend */
221 iph1
->retry_counter
= iph1
->rmconf
->retry_counter
;
222 if (isakmp_ph1resend(iph1
) == -1) {
223 plog(LLV_ERROR
, LOCATION
, NULL
,
224 "failed to send packet");
228 iph1
->status
= PHASE1ST_MSG1SENT
;
232 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
233 IPSECSESSIONEVENTCODE_IKE_PACKET_TX_SUCC
,
234 CONSTSTR("Initiator, Main-Mode message 1"),
239 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
240 IPSECSESSIONEVENTCODE_IKE_PACKET_TX_FAIL
,
241 CONSTSTR("Initiator, Main-Mode Message 1"),
242 CONSTSTR("Failed to transmit Main-Mode Message 1"));
249 for (i
= 0; i
< MAX_NATT_VID_COUNT
&& vid_natt
[i
] != NULL
; i
++)
253 if (vid_xauth
!= NULL
)
255 if (vid_unity
!= NULL
)
267 * receive from responder
274 ident_i2recv(iph1
, msg
)
275 struct ph1handle
*iph1
;
278 vchar_t
*pbuf
= NULL
;
279 struct isakmp_parse_t
*pa
;
280 vchar_t
*satmp
= NULL
;
285 if (iph1
->status
!= PHASE1ST_MSG1SENT
) {
286 plog(LLV_ERROR
, LOCATION
, NULL
,
287 "status mismatched %d.\n", iph1
->status
);
291 /* validate the type of next payload */
293 * NOTE: RedCreek(as responder) attaches N[responder-lifetime] here,
294 * if proposal-lifetime > lifetime-redcreek-wants.
296 * => According to the seciton 4.6.3 in RFC 2407, This is illegal.
297 * NOTE: we do not really care about ordering of VID and N.
299 * NOTE: even if there's multiple VID/N, we'll ignore them.
301 pbuf
= isakmp_parse(msg
);
303 plog(LLV_ERROR
, LOCATION
, NULL
,
304 "failed to parse msg");
307 pa
= (struct isakmp_parse_t
*)pbuf
->v
;
309 /* SA payload is fixed postion */
310 if (pa
->type
!= ISAKMP_NPTYPE_SA
) {
311 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
312 "received invalid next payload type %d, "
314 pa
->type
, ISAKMP_NPTYPE_SA
);
317 if (isakmp_p2ph(&satmp
, pa
->ptr
) < 0) {
318 plog(LLV_ERROR
, LOCATION
, NULL
,
319 "failed to process SA payload");
325 pa
->type
!= ISAKMP_NPTYPE_NONE
;
329 case ISAKMP_NPTYPE_VID
:
330 vid_numeric
= check_vendorid(pa
->ptr
);
332 if (iph1
->rmconf
->nat_traversal
&& natt_vendorid(vid_numeric
))
333 natt_handle_vendorid(iph1
, vid_numeric
);
336 switch (vid_numeric
) {
338 iph1
->mode_cfg
->flags
|=
339 ISAKMP_CFG_VENDORID_XAUTH
;
343 iph1
->mode_cfg
->flags
|=
344 ISAKMP_CFG_VENDORID_UNITY
;
352 if (vid_numeric
== VENDORID_DPD
&& iph1
->rmconf
->dpd
)
357 /* don't send information, see ident_r1recv() */
358 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
359 "ignore the packet, "
360 "received unexpecting payload type %d.\n",
367 if (NATT_AVAILABLE(iph1
))
368 plog(LLV_INFO
, LOCATION
, iph1
->remote
,
369 "Selected NAT-T version: %s\n",
370 vid_string_by_id(iph1
->natt_options
->version
));
373 /* check SA payload and set approval SA for use */
374 if (ipsecdoi_checkph1proposal(satmp
, iph1
) < 0) {
375 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
376 "failed to get valid proposal.\n");
377 /* XXX send information */
380 VPTRINIT(iph1
->sa_ret
);
382 iph1
->status
= PHASE1ST_MSG2RECEIVED
;
384 #ifdef ENABLE_VPNCONTROL_PORT
385 vpncontrol_notify_phase_change(1, FROM_REMOTE
, iph1
, NULL
);
390 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
391 IPSECSESSIONEVENTCODE_IKE_PACKET_RX_SUCC
,
392 CONSTSTR("Initiator, Main-Mode message 2"),
397 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
398 IPSECSESSIONEVENTCODE_IKE_PACKET_RX_FAIL
,
399 CONSTSTR("Initiator, Main-Mode Message 2"),
400 CONSTSTR("Failed to process Main-Mode Message 2"));
413 * gssapi: HDR, KE, Ni, GSSi
414 * rsa: HDR, KE, [ HASH(1), ] <IDi1_b>PubKey_r, <Ni_b>PubKey_r
415 * rev: HDR, [ HASH(1), ] <Ni_b>Pubkey_r, <KE_b>Ke_i,
416 * <IDi1_b>Ke_i, [<<Cert-I_b>Ke_i]
419 ident_i2send(iph1
, msg
)
420 struct ph1handle
*iph1
;
426 if (iph1
->status
!= PHASE1ST_MSG2RECEIVED
) {
427 plog(LLV_ERROR
, LOCATION
, NULL
,
428 "status mismatched %d.\n", iph1
->status
);
432 /* fix isakmp index */
433 memcpy(&iph1
->index
.r_ck
, &((struct isakmp
*)msg
->v
)->r_ck
,
436 /* generate DH public value */
437 if (oakley_dh_generate(iph1
->approval
->dhgrp
,
438 &iph1
->dhpub
, &iph1
->dhpriv
) < 0) {
439 plog(LLV_ERROR
, LOCATION
, NULL
,
440 "failed to generate DH");
444 /* generate NONCE value */
445 iph1
->nonce
= eay_set_random(iph1
->rmconf
->nonce_size
);
446 if (iph1
->nonce
== NULL
) {
447 plog(LLV_ERROR
, LOCATION
, NULL
,
448 "failed to generate NONCE");
453 if (AUTHMETHOD(iph1
) == OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB
&&
454 gssapi_get_itoken(iph1
, NULL
) < 0) {
455 plog(LLV_ERROR
, LOCATION
, NULL
,
456 "failed to get GSS token");
461 /* create buffer to send isakmp payload */
462 iph1
->sendbuf
= ident_ir2mx(iph1
);
463 if (iph1
->sendbuf
== NULL
) {
464 plog(LLV_ERROR
, LOCATION
, NULL
,
465 "failed to create send buffer");
469 #ifdef HAVE_PRINT_ISAKMP_C
470 isakmp_printpacket(iph1
->sendbuf
, iph1
->local
, iph1
->remote
, 0);
473 /* send the packet, add to the schedule to resend */
474 iph1
->retry_counter
= iph1
->rmconf
->retry_counter
;
475 if (isakmp_ph1resend(iph1
) == -1) {
476 plog(LLV_ERROR
, LOCATION
, NULL
,
477 "failed to send packet");
481 /* the sending message is added to the received-list. */
482 if (add_recvdpkt(iph1
->remote
, iph1
->local
, iph1
->sendbuf
, msg
,
483 PH1_NON_ESP_EXTRA_LEN(iph1
)) == -1) {
484 plog(LLV_ERROR
, LOCATION
, NULL
,
485 "failed to add a response packet to the tree.\n");
489 iph1
->status
= PHASE1ST_MSG2SENT
;
493 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
494 IPSECSESSIONEVENTCODE_IKE_PACKET_TX_SUCC
,
495 CONSTSTR("Initiator, Main-Mode message 3"),
500 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
501 IPSECSESSIONEVENTCODE_IKE_PACKET_TX_FAIL
,
502 CONSTSTR("Initiator, Main-Mode Message 3"),
503 CONSTSTR("Failed to transmit Main-Mode Message 3"));
509 * receive from responder
511 * sig: HDR, KE, Nr [, CR ]
512 * gssapi: HDR, KE, Nr, GSSr
513 * rsa: HDR, KE, <IDr1_b>PubKey_i, <Nr_b>PubKey_i
514 * rev: HDR, <Nr_b>PubKey_i, <KE_b>Ke_r, <IDr1_b>Ke_r,
517 ident_i3recv(iph1
, msg
)
518 struct ph1handle
*iph1
;
521 vchar_t
*pbuf
= NULL
;
522 struct isakmp_parse_t
*pa
;
526 vchar_t
*gsstoken
= NULL
;
529 vchar_t
*natd_received
;
530 int natd_seq
= 0, natd_verified
;
534 if (iph1
->status
!= PHASE1ST_MSG2SENT
) {
535 plog(LLV_ERROR
, LOCATION
, NULL
,
536 "status mismatched %d.\n", iph1
->status
);
540 /* validate the type of next payload */
541 pbuf
= isakmp_parse(msg
);
543 plog(LLV_ERROR
, LOCATION
, NULL
,
544 "failed to parse msg");
548 for (pa
= (struct isakmp_parse_t
*)pbuf
->v
;
549 pa
->type
!= ISAKMP_NPTYPE_NONE
;
553 case ISAKMP_NPTYPE_KE
:
554 if (isakmp_p2ph(&iph1
->dhpub_p
, pa
->ptr
) < 0) {
555 plog(LLV_ERROR
, LOCATION
, NULL
,
556 "failed to process KE payload");
560 case ISAKMP_NPTYPE_NONCE
:
561 if (isakmp_p2ph(&iph1
->nonce_p
, pa
->ptr
) < 0) {
562 plog(LLV_ERROR
, LOCATION
, NULL
,
563 "failed to process NONCE payload");
567 case ISAKMP_NPTYPE_VID
:
568 vid_numeric
= check_vendorid(pa
->ptr
);
570 switch (vid_numeric
) {
572 iph1
->mode_cfg
->flags
|=
573 ISAKMP_CFG_VENDORID_XAUTH
;
577 iph1
->mode_cfg
->flags
|=
578 ISAKMP_CFG_VENDORID_UNITY
;
586 if (vid_numeric
== VENDORID_DPD
&& iph1
->rmconf
->dpd
)
591 case ISAKMP_NPTYPE_CR
:
592 if (oakley_savecr(iph1
, pa
->ptr
) < 0) {
593 plog(LLV_ERROR
, LOCATION
, NULL
,
594 "failed to process CR payload");
599 case ISAKMP_NPTYPE_GSS
:
600 if (isakmp_p2ph(&gsstoken
, pa
->ptr
) < 0) {
601 plog(LLV_ERROR
, LOCATION
, NULL
,
602 "failed to process GSS payload");
605 gssapi_save_received_token(iph1
, gsstoken
);
610 case ISAKMP_NPTYPE_NATD_DRAFT
:
611 case ISAKMP_NPTYPE_NATD_RFC
:
613 case ISAKMP_NPTYPE_NATD_BADDRAFT
:
615 if (NATT_AVAILABLE(iph1
) && iph1
->natt_options
!= NULL
&&
616 pa
->type
== iph1
->natt_options
->payload_nat_d
) {
617 natd_received
= NULL
;
618 if (isakmp_p2ph (&natd_received
, pa
->ptr
) < 0) {
619 plog(LLV_ERROR
, LOCATION
, NULL
,
620 "failed to process NATD payload");
624 /* set both bits first so that we can clear them
625 upon verifying hashes */
627 iph1
->natt_flags
|= NAT_DETECTED
;
629 /* this function will clear appropriate bits bits
630 from iph1->natt_flags */
631 natd_verified
= natt_compare_addr_hash (iph1
,
632 natd_received
, natd_seq
++);
634 plog (LLV_INFO
, LOCATION
, NULL
, "NAT-D payload #%d %s\n",
636 natd_verified
? "verified" : "doesn't match");
638 vfree (natd_received
);
641 /* %%%% Be lenient here - some servers send natd payloads */
642 /* when no nat is detected */
647 /* don't send information, see ident_r1recv() */
648 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
649 "ignore the packet, "
650 "received unexpecting payload type %d.\n",
657 if (NATT_AVAILABLE(iph1
)) {
658 plog (LLV_INFO
, LOCATION
, NULL
, "NAT %s %s%s\n",
659 iph1
->natt_flags
& NAT_DETECTED
?
660 "detected:" : "not detected",
661 iph1
->natt_flags
& NAT_DETECTED_ME
? "ME " : "",
662 iph1
->natt_flags
& NAT_DETECTED_PEER
? "PEER" : "");
663 if (iph1
->natt_flags
& NAT_DETECTED
)
664 natt_float_ports (iph1
);
668 /* payload existency check */
669 if (iph1
->dhpub_p
== NULL
|| iph1
->nonce_p
== NULL
) {
670 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
671 "few isakmp message received.\n");
675 if (oakley_checkcr(iph1
) < 0) {
676 /* Ignore this error in order to be interoperability. */
680 iph1
->status
= PHASE1ST_MSG3RECEIVED
;
684 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
685 IPSECSESSIONEVENTCODE_IKE_PACKET_RX_SUCC
,
686 CONSTSTR("Initiator, Main-Mode message 4"),
691 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
692 IPSECSESSIONEVENTCODE_IKE_PACKET_RX_FAIL
,
693 CONSTSTR("Initiator, Main-Mode Message 4"),
694 CONSTSTR("Failed to process Main-Mode Message 4"));
703 VPTRINIT(iph1
->dhpub_p
);
704 VPTRINIT(iph1
->nonce_p
);
705 VPTRINIT(iph1
->id_p
);
706 oakley_delcert(iph1
->cr_p
);
715 * psk: HDR*, IDi1, HASH_I
716 * sig: HDR*, IDi1, [ CR, ] [ CERT, ] SIG_I
717 * gssapi: HDR*, IDi1, < Gssi(n) | HASH_I >
722 ident_i3send(iph1
, msg0
)
723 struct ph1handle
*iph1
;
733 if (iph1
->status
!= PHASE1ST_MSG3RECEIVED
) {
734 plog(LLV_ERROR
, LOCATION
, NULL
,
735 "status mismatched %d.\n", iph1
->status
);
739 /* compute sharing secret of DH */
740 if (oakley_dh_compute(iph1
->approval
->dhgrp
, iph1
->dhpub
,
741 iph1
->dhpriv
, iph1
->dhpub_p
, &iph1
->dhgxy
) < 0) {
742 plog(LLV_ERROR
, LOCATION
, NULL
,
743 "failed to compute DH");
747 /* generate SKEYIDs & IV & final cipher key */
748 if (oakley_skeyid(iph1
) < 0) {
749 plog(LLV_ERROR
, LOCATION
, NULL
,
750 "failed to generate SKEYID");
753 if (oakley_skeyid_dae(iph1
) < 0) {
754 plog(LLV_ERROR
, LOCATION
, NULL
,
755 "failed to generate SKEYID-DAE");
758 if (oakley_compute_enckey(iph1
) < 0) {
759 plog(LLV_ERROR
, LOCATION
, NULL
,
760 "failed to generate ENCKEY");
763 if (oakley_newiv(iph1
) < 0) {
764 plog(LLV_ERROR
, LOCATION
, NULL
,
765 "failed to generate IV");
769 /* make ID payload into isakmp status */
770 if (ipsecdoi_setid1(iph1
) < 0) {
771 plog(LLV_ERROR
, LOCATION
, NULL
,
777 if (AUTHMETHOD(iph1
) == OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB
&&
778 gssapi_more_tokens(iph1
)) {
779 plog(LLV_DEBUG
, LOCATION
, NULL
, "calling get_itoken\n");
780 if (gssapi_get_itoken(iph1
, &len
) < 0) {
781 plog(LLV_ERROR
, LOCATION
, NULL
,
782 "failed to get GSSAPI token");
790 /* generate HASH to send */
792 iph1
->hash
= oakley_ph1hash_common(iph1
, GENERATE
);
793 if (iph1
->hash
== NULL
) {
794 plog(LLV_ERROR
, LOCATION
, NULL
,
795 "failed to generate HASH");
801 /* set encryption flag */
802 iph1
->flags
|= ISAKMP_FLAG_E
;
804 /* create HDR;ID;HASH payload */
805 iph1
->sendbuf
= ident_ir3mx(iph1
);
806 if (iph1
->sendbuf
== NULL
) {
807 plog(LLV_ERROR
, LOCATION
, NULL
,
808 "failed to allocate send buffer");
812 /* send the packet, add to the schedule to resend */
813 iph1
->retry_counter
= iph1
->rmconf
->retry_counter
;
814 if (isakmp_ph1resend(iph1
) == -1) {
815 plog(LLV_ERROR
, LOCATION
, NULL
,
816 "failed to send packet");
820 /* the sending message is added to the received-list. */
821 if (add_recvdpkt(iph1
->remote
, iph1
->local
, iph1
->sendbuf
, msg0
,
822 PH1_NON_ESP_EXTRA_LEN(iph1
)) == -1) {
823 plog(LLV_ERROR
, LOCATION
, NULL
,
824 "failed to add a response packet to the tree.\n");
828 /* see handler.h about IV synchronization. */
829 memcpy(iph1
->ivm
->ive
->v
, iph1
->ivm
->iv
->v
, iph1
->ivm
->iv
->l
);
831 iph1
->status
= PHASE1ST_MSG3SENT
;
835 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
836 IPSECSESSIONEVENTCODE_IKE_PACKET_TX_SUCC
,
837 CONSTSTR("Initiator, Main-Mode message 5"),
842 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
843 IPSECSESSIONEVENTCODE_IKE_PACKET_TX_FAIL
,
844 CONSTSTR("Initiator, Main-Mode Message 5"),
845 CONSTSTR("Failed to transmit Main-Mode Message 5"));
851 * receive from responder
852 * psk: HDR*, IDr1, HASH_R
853 * sig: HDR*, IDr1, [ CERT, ] SIG_R
854 * gssapi: HDR*, IDr1, < GSSr(n) | HASH_R >
859 ident_i4recv(iph1
, msg0
)
860 struct ph1handle
*iph1
;
863 vchar_t
*pbuf
= NULL
;
864 struct isakmp_parse_t
*pa
;
870 vchar_t
*gsstoken
= NULL
;
874 if (iph1
->status
!= PHASE1ST_MSG3SENT
) {
875 plog(LLV_ERROR
, LOCATION
, NULL
,
876 "status mismatched %d.\n", iph1
->status
);
881 if (!ISSET(((struct isakmp
*)msg0
->v
)->flags
, ISAKMP_FLAG_E
)) {
882 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
883 "ignore the packet, "
884 "expecting the packet encrypted.\n");
887 msg
= oakley_do_decrypt(iph1
, msg0
, iph1
->ivm
->iv
, iph1
->ivm
->ive
);
889 plog(LLV_ERROR
, LOCATION
, NULL
,
890 "failed to decrypt");
894 /* validate the type of next payload */
895 pbuf
= isakmp_parse(msg
);
897 plog(LLV_ERROR
, LOCATION
, NULL
,
898 "failed to parse msg");
902 iph1
->pl_hash
= NULL
;
904 for (pa
= (struct isakmp_parse_t
*)pbuf
->v
;
905 pa
->type
!= ISAKMP_NPTYPE_NONE
;
909 case ISAKMP_NPTYPE_ID
:
910 if (isakmp_p2ph(&iph1
->id_p
, pa
->ptr
) < 0) {
911 plog(LLV_ERROR
, LOCATION
, NULL
,
912 "failed to process ID payload");
916 case ISAKMP_NPTYPE_HASH
:
917 iph1
->pl_hash
= (struct isakmp_pl_hash
*)pa
->ptr
;
919 case ISAKMP_NPTYPE_CERT
:
920 if (oakley_savecert(iph1
, pa
->ptr
) < 0) {
921 plog(LLV_ERROR
, LOCATION
, NULL
,
922 "failed to process CERT payload");
926 case ISAKMP_NPTYPE_SIG
:
927 if (isakmp_p2ph(&iph1
->sig_p
, pa
->ptr
) < 0) {
928 plog(LLV_ERROR
, LOCATION
, NULL
,
929 "failed to process SIG payload");
934 case ISAKMP_NPTYPE_GSS
:
935 if (isakmp_p2ph(&gsstoken
, pa
->ptr
) < 0) {
936 plog(LLV_ERROR
, LOCATION
, NULL
,
937 "failed to process GSS payload");
940 gssapi_save_received_token(iph1
, gsstoken
);
943 case ISAKMP_NPTYPE_VID
:
944 vid_numeric
= check_vendorid(pa
->ptr
);
946 if (vid_numeric
== VENDORID_DPD
&& iph1
->rmconf
->dpd
)
950 case ISAKMP_NPTYPE_N
:
951 isakmp_check_notify(pa
->ptr
, iph1
);
954 /* don't send information, see ident_r1recv() */
955 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
956 "ignore the packet, "
957 "received unexpecting payload type %d.\n",
963 /* payload existency check */
965 /* verify identifier */
966 if (ipsecdoi_checkid1(iph1
) != 0) {
967 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
968 "invalid ID payload.\n");
972 /* validate authentication value */
974 if (gsstoken
== NULL
) {
976 type
= oakley_validate_auth(iph1
);
978 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
979 IPSECSESSIONEVENTCODE_IKEV1_PH1_AUTH_FAIL
,
980 CONSTSTR("Initiator, Main-Mode Message 6"),
981 CONSTSTR("Failed to authenticate Main-Mode Message 6"));
983 /* msg printed inner oakley_validate_auth() */
986 EVT_PUSH(iph1
->local
, iph1
->remote
,
987 EVTT_PEERPH1AUTH_FAILED
, NULL
);
988 isakmp_info_send_n1(iph1
, type
, NULL
);
991 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
992 IPSECSESSIONEVENTCODE_IKEV1_PH1_AUTH_SUCC
,
993 CONSTSTR("Initiator, Main-Mode Message 6"),
1000 * XXX: Should we do compare two addresses, ph1handle's and ID
1004 plog(LLV_DEBUG
, LOCATION
, iph1
->remote
, "peer's ID:");
1005 plogdump(LLV_DEBUG
, iph1
->id_p
->v
, iph1
->id_p
->l
);
1007 /* see handler.h about IV synchronization. */
1008 memcpy(iph1
->ivm
->iv
->v
, iph1
->ivm
->ive
->v
, iph1
->ivm
->ive
->l
);
1011 * If we got a GSS token, we need to this roundtrip again.
1014 iph1
->status
= gsstoken
!= 0 ? PHASE1ST_MSG3RECEIVED
:
1015 PHASE1ST_MSG4RECEIVED
;
1017 iph1
->status
= PHASE1ST_MSG4RECEIVED
;
1022 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
1023 IPSECSESSIONEVENTCODE_IKE_PACKET_RX_SUCC
,
1024 CONSTSTR("Initiator, Main-Mode message 6"),
1029 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
1030 IPSECSESSIONEVENTCODE_IKE_PACKET_RX_FAIL
,
1031 CONSTSTR("Initiator, Main-Mode Message 6"),
1032 CONSTSTR("Failed to transmit Main-Mode Message 6"));
1044 VPTRINIT(iph1
->id_p
);
1045 oakley_delcert(iph1
->cert_p
);
1046 iph1
->cert_p
= NULL
;
1047 oakley_delcert(iph1
->crl_p
);
1049 VPTRINIT(iph1
->sig_p
);
1056 * status update and establish isakmp sa.
1059 ident_i4send(iph1
, msg
)
1060 struct ph1handle
*iph1
;
1065 /* validity check */
1066 if (iph1
->status
!= PHASE1ST_MSG4RECEIVED
) {
1067 plog(LLV_ERROR
, LOCATION
, NULL
,
1068 "status mismatched %d.\n", iph1
->status
);
1072 /* see handler.h about IV synchronization. */
1073 memcpy(iph1
->ivm
->iv
->v
, iph1
->ivm
->ive
->v
, iph1
->ivm
->iv
->l
);
1075 iph1
->status
= PHASE1ST_ESTABLISHED
;
1077 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
1078 IPSECSESSIONEVENTCODE_IKEV1_PH1_INIT_SUCC
,
1079 CONSTSTR("Initiator, Main-Mode"),
1089 * receive from initiator
1096 ident_r1recv(iph1
, msg
)
1097 struct ph1handle
*iph1
;
1100 vchar_t
*pbuf
= NULL
;
1101 struct isakmp_parse_t
*pa
;
1105 /* validity check */
1106 if (iph1
->status
!= PHASE1ST_START
) {
1107 plog(LLV_ERROR
, LOCATION
, NULL
,
1108 "status mismatched %d.\n", iph1
->status
);
1112 /* validate the type of next payload */
1114 * NOTE: XXX even if multiple VID, we'll silently ignore those.
1116 pbuf
= isakmp_parse(msg
);
1118 plog(LLV_ERROR
, LOCATION
, NULL
,
1119 "failed to parse msg");
1122 pa
= (struct isakmp_parse_t
*)pbuf
->v
;
1124 /* check the position of SA payload */
1125 if (pa
->type
!= ISAKMP_NPTYPE_SA
) {
1126 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
1127 "received invalid next payload type %d, "
1129 pa
->type
, ISAKMP_NPTYPE_SA
);
1132 if (isakmp_p2ph(&iph1
->sa
, pa
->ptr
) < 0) {
1133 plog(LLV_ERROR
, LOCATION
, NULL
,
1134 "failed to process SA payload");
1140 pa
->type
!= ISAKMP_NPTYPE_NONE
;
1144 case ISAKMP_NPTYPE_VID
:
1145 vid_numeric
= check_vendorid(pa
->ptr
);
1147 if (iph1
->rmconf
->nat_traversal
&& natt_vendorid(vid_numeric
))
1148 natt_handle_vendorid(iph1
, vid_numeric
);
1151 if ((vid_numeric
== VENDORID_FRAG
) &&
1152 (vendorid_frag_cap(pa
->ptr
) & VENDORID_FRAG_IDENT
))
1155 #ifdef ENABLE_HYBRID
1156 switch (vid_numeric
) {
1157 case VENDORID_XAUTH
:
1158 iph1
->mode_cfg
->flags
|=
1159 ISAKMP_CFG_VENDORID_XAUTH
;
1162 case VENDORID_UNITY
:
1163 iph1
->mode_cfg
->flags
|=
1164 ISAKMP_CFG_VENDORID_UNITY
;
1172 if (vid_numeric
== VENDORID_DPD
&& iph1
->rmconf
->dpd
)
1173 iph1
->dpd_support
=1;
1178 * We don't send information to the peer even
1179 * if we received malformed packet. Because we
1180 * can't distinguish the malformed packet and
1181 * the re-sent packet. And we do same behavior
1182 * when we expect encrypted packet.
1184 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
1185 "ignore the packet, "
1186 "received unexpecting payload type %d.\n",
1193 if (NATT_AVAILABLE(iph1
))
1194 plog(LLV_INFO
, LOCATION
, iph1
->remote
,
1195 "Selected NAT-T version: %s\n",
1196 vid_string_by_id(iph1
->natt_options
->version
));
1199 /* check SA payload and set approval SA for use */
1200 if (ipsecdoi_checkph1proposal(iph1
->sa
, iph1
) < 0) {
1201 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
1202 "failed to get valid proposal.\n");
1203 /* XXX send information */
1207 iph1
->status
= PHASE1ST_MSG1RECEIVED
;
1211 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
1212 IPSECSESSIONEVENTCODE_IKE_PACKET_RX_SUCC
,
1213 CONSTSTR("Responder, Main-Mode message 1"),
1218 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
1219 IPSECSESSIONEVENTCODE_IKE_PACKET_RX_FAIL
,
1220 CONSTSTR("Responder, Main-Mode Message 1"),
1221 CONSTSTR("Failed to process Main-Mode Message 1"));
1240 ident_r1send(iph1
, msg
)
1241 struct ph1handle
*iph1
;
1244 struct payload_list
*plist
= NULL
;
1246 vchar_t
*gss_sa
= NULL
;
1248 int free_gss_sa
= 0;
1251 vchar_t
*vid_natt
= NULL
;
1253 #ifdef ENABLE_HYBRID
1254 vchar_t
*vid_xauth
= NULL
;
1255 vchar_t
*vid_unity
= NULL
;
1258 vchar_t
*vid_dpd
= NULL
;
1261 vchar_t
*vid_frag
= NULL
;
1264 /* validity check */
1265 if (iph1
->status
!= PHASE1ST_MSG1RECEIVED
) {
1266 plog(LLV_ERROR
, LOCATION
, NULL
,
1267 "status mismatched %d.\n", iph1
->status
);
1271 /* set responder's cookie */
1272 isakmp_newcookie((caddr_t
)&iph1
->index
.r_ck
, iph1
->remote
, iph1
->local
);
1275 if (iph1
->approval
->gssid
!= NULL
) {
1276 gss_sa
= ipsecdoi_setph1proposal(iph1
->approval
);
1277 if (gss_sa
!= iph1
->sa_ret
)
1281 gss_sa
= iph1
->sa_ret
;
1283 /* set SA payload to reply */
1284 plist
= isakmp_plist_append(plist
, gss_sa
, ISAKMP_NPTYPE_SA
);
1286 #ifdef ENABLE_HYBRID
1287 if (iph1
->mode_cfg
->flags
& ISAKMP_CFG_VENDORID_XAUTH
) {
1288 plog (LLV_INFO
, LOCATION
, NULL
, "Adding xauth VID payload.\n");
1289 if ((vid_xauth
= set_vendorid(VENDORID_XAUTH
)) == NULL
) {
1290 plog(LLV_ERROR
, LOCATION
, NULL
,
1291 "Cannot create Xauth vendor ID\n");
1294 plist
= isakmp_plist_append(plist
,
1295 vid_xauth
, ISAKMP_NPTYPE_VID
);
1298 if (iph1
->mode_cfg
->flags
& ISAKMP_CFG_VENDORID_UNITY
) {
1299 if ((vid_unity
= set_vendorid(VENDORID_UNITY
)) == NULL
) {
1300 plog(LLV_ERROR
, LOCATION
, NULL
,
1301 "Cannot create Unity vendor ID\n");
1304 plist
= isakmp_plist_append(plist
,
1305 vid_unity
, ISAKMP_NPTYPE_VID
);
1309 /* Has the peer announced NAT-T? */
1310 if (NATT_AVAILABLE(iph1
))
1311 vid_natt
= set_vendorid(iph1
->natt_options
->version
);
1314 plist
= isakmp_plist_append(plist
, vid_natt
, ISAKMP_NPTYPE_VID
);
1317 /* XXX only send DPD VID if remote sent it ? */
1318 if(iph1
->rmconf
->dpd
){
1319 vid_dpd
= set_vendorid(VENDORID_DPD
);
1320 if (vid_dpd
!= NULL
)
1321 plist
= isakmp_plist_append(plist
, vid_dpd
, ISAKMP_NPTYPE_VID
);
1326 vid_frag
= set_vendorid(VENDORID_FRAG
);
1327 if (vid_frag
!= NULL
)
1328 vid_frag
= isakmp_frag_addcap(vid_frag
,
1329 VENDORID_FRAG_IDENT
);
1330 if (vid_frag
== NULL
)
1331 plog(LLV_ERROR
, LOCATION
, NULL
,
1332 "Frag vendorID construction failed\n");
1334 plist
= isakmp_plist_append(plist
,
1335 vid_frag
, ISAKMP_NPTYPE_VID
);
1339 iph1
->sendbuf
= isakmp_plist_set_all (&plist
, iph1
);
1341 #ifdef HAVE_PRINT_ISAKMP_C
1342 isakmp_printpacket(iph1
->sendbuf
, iph1
->local
, iph1
->remote
, 0);
1345 /* send the packet, add to the schedule to resend */
1346 iph1
->retry_counter
= iph1
->rmconf
->retry_counter
;
1347 if (isakmp_ph1resend(iph1
) == -1) {
1348 plog(LLV_ERROR
, LOCATION
, NULL
,
1349 "failed to send packet");
1353 /* the sending message is added to the received-list. */
1354 if (add_recvdpkt(iph1
->remote
, iph1
->local
, iph1
->sendbuf
, msg
,
1355 PH1_NON_ESP_EXTRA_LEN(iph1
)) == -1) {
1356 plog(LLV_ERROR
, LOCATION
, NULL
,
1357 "failed to add a response packet to the tree.\n");
1361 iph1
->status
= PHASE1ST_MSG1SENT
;
1363 #ifdef ENABLE_VPNCONTROL_PORT
1364 vpncontrol_notify_phase_change(1, FROM_LOCAL
, iph1
, NULL
);
1369 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
1370 IPSECSESSIONEVENTCODE_IKE_PACKET_TX_SUCC
,
1371 CONSTSTR("Responder, Main-Mode message 2"),
1376 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
1377 IPSECSESSIONEVENTCODE_IKE_PACKET_TX_FAIL
,
1378 CONSTSTR("Responder, Main-Mode Message 2"),
1379 CONSTSTR("Failed to transmit Main-Mode Message 2"));
1389 #ifdef ENABLE_HYBRID
1390 if (vid_xauth
!= NULL
)
1392 if (vid_unity
!= NULL
)
1396 if (vid_dpd
!= NULL
)
1400 if (vid_frag
!= NULL
)
1408 * receive from initiator
1411 * gssapi: HDR, KE, Ni, GSSi
1412 * rsa: HDR, KE, [ HASH(1), ] <IDi1_b>PubKey_r, <Ni_b>PubKey_r
1413 * rev: HDR, [ HASH(1), ] <Ni_b>Pubkey_r, <KE_b>Ke_i,
1414 * <IDi1_b>Ke_i, [<<Cert-I_b>Ke_i]
1417 ident_r2recv(iph1
, msg
)
1418 struct ph1handle
*iph1
;
1421 vchar_t
*pbuf
= NULL
;
1422 struct isakmp_parse_t
*pa
;
1425 vchar_t
*gsstoken
= NULL
;
1431 /* validity check */
1432 if (iph1
->status
!= PHASE1ST_MSG1SENT
) {
1433 plog(LLV_ERROR
, LOCATION
, NULL
,
1434 "status mismatched %d.\n", iph1
->status
);
1438 /* validate the type of next payload */
1439 pbuf
= isakmp_parse(msg
);
1441 plog(LLV_ERROR
, LOCATION
, NULL
,
1442 "failed to parse msg");
1446 for (pa
= (struct isakmp_parse_t
*)pbuf
->v
;
1447 pa
->type
!= ISAKMP_NPTYPE_NONE
;
1450 case ISAKMP_NPTYPE_KE
:
1451 if (isakmp_p2ph(&iph1
->dhpub_p
, pa
->ptr
) < 0) {
1452 plog(LLV_ERROR
, LOCATION
, NULL
,
1453 "failed to process KE payload");
1457 case ISAKMP_NPTYPE_NONCE
:
1458 if (isakmp_p2ph(&iph1
->nonce_p
, pa
->ptr
) < 0) {
1459 plog(LLV_ERROR
, LOCATION
, NULL
,
1460 "failed to process NONCE payload");
1464 case ISAKMP_NPTYPE_VID
:
1465 (void)check_vendorid(pa
->ptr
);
1467 case ISAKMP_NPTYPE_CR
:
1468 plog(LLV_WARNING
, LOCATION
, iph1
->remote
,
1469 "CR received, ignore it. "
1470 "It should be in other exchange.\n");
1473 case ISAKMP_NPTYPE_GSS
:
1474 if (isakmp_p2ph(&gsstoken
, pa
->ptr
) < 0) {
1475 plog(LLV_ERROR
, LOCATION
, NULL
,
1476 "failed to process GSS payload");
1479 gssapi_save_received_token(iph1
, gsstoken
);
1484 case ISAKMP_NPTYPE_NATD_DRAFT
:
1485 case ISAKMP_NPTYPE_NATD_RFC
:
1487 case ISAKMP_NPTYPE_NATD_BADDRAFT
:
1489 if (NATT_AVAILABLE(iph1
) && iph1
->natt_options
!= NULL
&&
1490 pa
->type
== iph1
->natt_options
->payload_nat_d
)
1492 vchar_t
*natd_received
= NULL
;
1495 if (isakmp_p2ph (&natd_received
, pa
->ptr
) < 0) {
1496 plog(LLV_ERROR
, LOCATION
, NULL
,
1497 "failed to process NATD payload");
1502 iph1
->natt_flags
|= NAT_DETECTED
;
1504 natd_verified
= natt_compare_addr_hash (iph1
,
1505 natd_received
, natd_seq
++);
1507 plog (LLV_INFO
, LOCATION
, NULL
, "NAT-D payload #%d %s\n",
1509 natd_verified
? "verified" : "doesn't match");
1511 vfree (natd_received
);
1514 /* %%%% Be lenient here - some servers send natd payloads */
1515 /* when no nat is detected */
1520 /* don't send information, see ident_r1recv() */
1521 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
1522 "ignore the packet, "
1523 "received unexpecting payload type %d.\n",
1530 if (NATT_AVAILABLE(iph1
))
1531 plog (LLV_INFO
, LOCATION
, NULL
, "NAT %s %s%s\n",
1532 iph1
->natt_flags
& NAT_DETECTED
?
1533 "detected:" : "not detected",
1534 iph1
->natt_flags
& NAT_DETECTED_ME
? "ME " : "",
1535 iph1
->natt_flags
& NAT_DETECTED_PEER
? "PEER" : "");
1538 /* payload existency check */
1539 if (iph1
->dhpub_p
== NULL
|| iph1
->nonce_p
== NULL
) {
1540 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
1541 "few isakmp message received.\n");
1545 iph1
->status
= PHASE1ST_MSG2RECEIVED
;
1549 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
1550 IPSECSESSIONEVENTCODE_IKE_PACKET_RX_SUCC
,
1551 CONSTSTR("Responder, Main-Mode message 3"),
1556 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
1557 IPSECSESSIONEVENTCODE_IKE_PACKET_RX_FAIL
,
1558 CONSTSTR("Responder, Main-Mode Message 3"),
1559 CONSTSTR("Failed to process Main-Mode Message 3"));
1569 VPTRINIT(iph1
->dhpub_p
);
1570 VPTRINIT(iph1
->nonce_p
);
1571 VPTRINIT(iph1
->id_p
);
1580 * sig: HDR, KE, Nr [, CR ]
1581 * gssapi: HDR, KE, Nr, GSSr
1582 * rsa: HDR, KE, <IDr1_b>PubKey_i, <Nr_b>PubKey_i
1583 * rev: HDR, <Nr_b>PubKey_i, <KE_b>Ke_r, <IDr1_b>Ke_r,
1586 ident_r2send(iph1
, msg
)
1587 struct ph1handle
*iph1
;
1592 /* validity check */
1593 if (iph1
->status
!= PHASE1ST_MSG2RECEIVED
) {
1594 plog(LLV_ERROR
, LOCATION
, NULL
,
1595 "status mismatched %d.\n", iph1
->status
);
1599 /* generate DH public value */
1600 if (oakley_dh_generate(iph1
->approval
->dhgrp
,
1601 &iph1
->dhpub
, &iph1
->dhpriv
) < 0) {
1602 plog(LLV_ERROR
, LOCATION
, NULL
,
1603 "failed to generate DH");
1607 /* generate NONCE value */
1608 iph1
->nonce
= eay_set_random(iph1
->rmconf
->nonce_size
);
1609 if (iph1
->nonce
== NULL
) {
1610 plog(LLV_ERROR
, LOCATION
, NULL
,
1611 "failed to generate NONCE");
1616 if (AUTHMETHOD(iph1
) == OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB
)
1617 gssapi_get_rtoken(iph1
, NULL
);
1620 /* create HDR;KE;NONCE payload */
1621 iph1
->sendbuf
= ident_ir2mx(iph1
);
1622 if (iph1
->sendbuf
== NULL
) {
1623 plog(LLV_ERROR
, LOCATION
, NULL
,
1624 "failed to allocate send buffer");
1628 #ifdef HAVE_PRINT_ISAKMP_C
1629 isakmp_printpacket(iph1
->sendbuf
, iph1
->local
, iph1
->remote
, 0);
1632 /* send the packet, add to the schedule to resend */
1633 iph1
->retry_counter
= iph1
->rmconf
->retry_counter
;
1634 if (isakmp_ph1resend(iph1
) == -1) {
1635 plog(LLV_ERROR
, LOCATION
, NULL
,
1636 "failed to send packet");
1640 /* the sending message is added to the received-list. */
1641 if (add_recvdpkt(iph1
->remote
, iph1
->local
, iph1
->sendbuf
, msg
,
1642 PH1_NON_ESP_EXTRA_LEN(iph1
)) == -1) {
1643 plog(LLV_ERROR
, LOCATION
, NULL
,
1644 "failed to add a response packet to the tree.\n");
1648 /* compute sharing secret of DH */
1649 if (oakley_dh_compute(iph1
->approval
->dhgrp
, iph1
->dhpub
,
1650 iph1
->dhpriv
, iph1
->dhpub_p
, &iph1
->dhgxy
) < 0) {
1651 plog(LLV_ERROR
, LOCATION
, NULL
,
1652 "failed to compute DH");
1656 /* generate SKEYIDs & IV & final cipher key */
1657 if (oakley_skeyid(iph1
) < 0) {
1658 plog(LLV_ERROR
, LOCATION
, NULL
,
1659 "failed to generate SKEYID");
1662 if (oakley_skeyid_dae(iph1
) < 0) {
1663 plog(LLV_ERROR
, LOCATION
, NULL
,
1664 "failed to generate SKEYID-DAE");
1667 if (oakley_compute_enckey(iph1
) < 0) {
1668 plog(LLV_ERROR
, LOCATION
, NULL
,
1669 "failed to generate ENCKEY");
1672 if (oakley_newiv(iph1
) < 0) {
1673 plog(LLV_ERROR
, LOCATION
, NULL
,
1674 "failed to generate IV");
1678 iph1
->status
= PHASE1ST_MSG2SENT
;
1682 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
1683 IPSECSESSIONEVENTCODE_IKE_PACKET_TX_SUCC
,
1684 CONSTSTR("Responder, Main-Mode message 4"),
1689 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
1690 IPSECSESSIONEVENTCODE_IKE_PACKET_TX_FAIL
,
1691 CONSTSTR("Responder, Main-Mode Message 4"),
1692 CONSTSTR("Failed to transmit Main-Mode Message 4"));
1698 * receive from initiator
1699 * psk: HDR*, IDi1, HASH_I
1700 * sig: HDR*, IDi1, [ CR, ] [ CERT, ] SIG_I
1701 * gssapi: HDR*, [ IDi1, ] < GSSi(n) | HASH_I >
1706 ident_r3recv(iph1
, msg0
)
1707 struct ph1handle
*iph1
;
1710 vchar_t
*msg
= NULL
;
1711 vchar_t
*pbuf
= NULL
;
1712 struct isakmp_parse_t
*pa
;
1716 vchar_t
*gsstoken
= NULL
;
1719 /* validity check */
1720 if (iph1
->status
!= PHASE1ST_MSG2SENT
) {
1721 plog(LLV_ERROR
, LOCATION
, NULL
,
1722 "status mismatched %d.\n", iph1
->status
);
1727 if (!ISSET(((struct isakmp
*)msg0
->v
)->flags
, ISAKMP_FLAG_E
)) {
1728 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
1729 "reject the packet, "
1730 "expecting the packet encrypted.\n");
1733 msg
= oakley_do_decrypt(iph1
, msg0
, iph1
->ivm
->iv
, iph1
->ivm
->ive
);
1735 plog(LLV_ERROR
, LOCATION
, NULL
,
1736 "failed to decrypt");
1740 /* validate the type of next payload */
1741 pbuf
= isakmp_parse(msg
);
1743 plog(LLV_ERROR
, LOCATION
, NULL
,
1744 "failed to parse msg");
1748 iph1
->pl_hash
= NULL
;
1750 for (pa
= (struct isakmp_parse_t
*)pbuf
->v
;
1751 pa
->type
!= ISAKMP_NPTYPE_NONE
;
1755 case ISAKMP_NPTYPE_ID
:
1756 if (isakmp_p2ph(&iph1
->id_p
, pa
->ptr
) < 0) {
1757 plog(LLV_ERROR
, LOCATION
, NULL
,
1758 "failed to process ID payload");
1762 case ISAKMP_NPTYPE_HASH
:
1763 iph1
->pl_hash
= (struct isakmp_pl_hash
*)pa
->ptr
;
1765 case ISAKMP_NPTYPE_CR
:
1766 if (oakley_savecr(iph1
, pa
->ptr
) < 0) {
1767 plog(LLV_ERROR
, LOCATION
, NULL
,
1768 "failed to process CR payload");
1772 case ISAKMP_NPTYPE_CERT
:
1773 if (oakley_savecert(iph1
, pa
->ptr
) < 0) {
1774 plog(LLV_ERROR
, LOCATION
, NULL
,
1775 "failed to process CERT payload");
1779 case ISAKMP_NPTYPE_SIG
:
1780 if (isakmp_p2ph(&iph1
->sig_p
, pa
->ptr
) < 0) {
1781 plog(LLV_ERROR
, LOCATION
, NULL
,
1782 "failed to process SIG payload");
1787 case ISAKMP_NPTYPE_GSS
:
1788 if (isakmp_p2ph(&gsstoken
, pa
->ptr
) < 0) {
1789 plog(LLV_ERROR
, LOCATION
, NULL
,
1790 "failed to process GSS payload");
1793 gssapi_save_received_token(iph1
, gsstoken
);
1796 case ISAKMP_NPTYPE_VID
:
1797 (void)check_vendorid(pa
->ptr
);
1799 case ISAKMP_NPTYPE_N
:
1800 isakmp_check_notify(pa
->ptr
, iph1
);
1803 /* don't send information, see ident_r1recv() */
1804 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
1805 "ignore the packet, "
1806 "received unexpecting payload type %d.\n",
1812 /* payload existency check */
1813 /* XXX same as ident_i4recv(), should be merged. */
1817 switch (AUTHMETHOD(iph1
)) {
1818 case OAKLEY_ATTR_AUTH_METHOD_PSKEY
:
1819 #ifdef ENABLE_HYBRID
1820 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_R
:
1821 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_R
:
1822 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_R
:
1824 if (iph1
->id_p
== NULL
|| iph1
->pl_hash
== NULL
)
1827 case OAKLEY_ATTR_AUTH_METHOD_DSSSIG
:
1828 case OAKLEY_ATTR_AUTH_METHOD_RSASIG
:
1829 #ifdef ENABLE_HYBRID
1830 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_R
:
1831 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_R
:
1833 if (iph1
->id_p
== NULL
|| iph1
->sig_p
== NULL
)
1836 case OAKLEY_ATTR_AUTH_METHOD_RSAENC
:
1837 case OAKLEY_ATTR_AUTH_METHOD_RSAREV
:
1838 #ifdef ENABLE_HYBRID
1839 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_R
:
1840 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_R
:
1842 if (iph1
->pl_hash
== NULL
)
1846 case OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB
:
1847 if (gsstoken
== NULL
&& iph1
->pl_hash
== NULL
)
1852 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
1853 "invalid authmethod %d why ?\n",
1854 iph1
->approval
->authmethod
);
1858 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
1859 "few isakmp message received.\n");
1864 /* verify identifier */
1865 if (ipsecdoi_checkid1(iph1
) != 0) {
1866 plog(LLV_ERROR
, LOCATION
, iph1
->remote
,
1867 "invalid ID payload.\n");
1871 /* validate authentication value */
1873 if (gsstoken
== NULL
) {
1875 type
= oakley_validate_auth(iph1
);
1877 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
1878 IPSECSESSIONEVENTCODE_IKEV1_PH1_AUTH_FAIL
,
1879 CONSTSTR("Responder, Main-Mode Message 5"),
1880 CONSTSTR("Failed to authenticate Main-Mode Message 5"));
1882 /* msg printed inner oakley_validate_auth() */
1885 EVT_PUSH(iph1
->local
, iph1
->remote
,
1886 EVTT_PEERPH1AUTH_FAILED
, NULL
);
1887 isakmp_info_send_n1(iph1
, type
, NULL
);
1890 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
1891 IPSECSESSIONEVENTCODE_IKEV1_PH1_AUTH_SUCC
,
1892 CONSTSTR("Responder, Main-Mode Message 5"),
1898 if (oakley_checkcr(iph1
) < 0) {
1899 /* Ignore this error in order to be interoperability. */
1904 * XXX: Should we do compare two addresses, ph1handle's and ID
1908 plog(LLV_DEBUG
, LOCATION
, iph1
->remote
, "peer's ID\n");
1909 plogdump(LLV_DEBUG
, iph1
->id_p
->v
, iph1
->id_p
->l
);
1911 /* see handler.h about IV synchronization. */
1912 memcpy(iph1
->ivm
->iv
->v
, iph1
->ivm
->ive
->v
, iph1
->ivm
->ive
->l
);
1915 iph1
->status
= gsstoken
!= NULL
? PHASE1ST_MSG2RECEIVED
:
1916 PHASE1ST_MSG3RECEIVED
;
1918 iph1
->status
= PHASE1ST_MSG3RECEIVED
;
1923 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
1924 IPSECSESSIONEVENTCODE_IKE_PACKET_RX_SUCC
,
1925 CONSTSTR("Responder, Main-Mode message 5"),
1930 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
1931 IPSECSESSIONEVENTCODE_IKE_PACKET_RX_FAIL
,
1932 CONSTSTR("Responder, Main-Mode Message 5"),
1933 CONSTSTR("Failed to process Main-Mode Message 5"));
1945 VPTRINIT(iph1
->id_p
);
1946 oakley_delcert(iph1
->cert_p
);
1947 iph1
->cert_p
= NULL
;
1948 oakley_delcert(iph1
->crl_p
);
1950 VPTRINIT(iph1
->sig_p
);
1951 oakley_delcert(iph1
->cr_p
);
1960 * psk: HDR*, IDr1, HASH_R
1961 * sig: HDR*, IDr1, [ CERT, ] SIG_R
1962 * gssapi: HDR*, IDr1, < GSSr(n) | HASH_R >
1967 ident_r3send(iph1
, msg
)
1968 struct ph1handle
*iph1
;
1977 /* validity check */
1978 if (iph1
->status
!= PHASE1ST_MSG3RECEIVED
) {
1979 plog(LLV_ERROR
, LOCATION
, NULL
,
1980 "status mismatched %d.\n", iph1
->status
);
1984 /* make ID payload into isakmp status */
1985 if (ipsecdoi_setid1(iph1
) < 0) {
1986 plog(LLV_ERROR
, LOCATION
, NULL
,
1987 "failed to set ID");
1992 if (AUTHMETHOD(iph1
) == OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB
&&
1993 gssapi_more_tokens(iph1
)) {
1994 gssapi_get_rtoken(iph1
, &len
);
2001 /* generate HASH to send */
2002 plog(LLV_DEBUG
, LOCATION
, NULL
, "generate HASH_R\n");
2003 iph1
->hash
= oakley_ph1hash_common(iph1
, GENERATE
);
2004 if (iph1
->hash
== NULL
) {
2005 plog(LLV_ERROR
, LOCATION
, NULL
,
2006 "failed to generate HASH");
2012 /* set encryption flag */
2013 iph1
->flags
|= ISAKMP_FLAG_E
;
2015 /* create HDR;ID;HASH payload */
2016 iph1
->sendbuf
= ident_ir3mx(iph1
);
2017 if (iph1
->sendbuf
== NULL
) {
2018 plog(LLV_ERROR
, LOCATION
, NULL
,
2019 "failed to create send buffer");
2023 /* send HDR;ID;HASH to responder */
2024 if (isakmp_send(iph1
, iph1
->sendbuf
) < 0) {
2025 plog(LLV_ERROR
, LOCATION
, NULL
,
2026 "failed to send packet");
2030 /* the sending message is added to the received-list. */
2031 if (add_recvdpkt(iph1
->remote
, iph1
->local
, iph1
->sendbuf
, msg
,
2032 PH1_NON_ESP_EXTRA_LEN(iph1
)) == -1) {
2033 plog(LLV_ERROR
, LOCATION
, NULL
,
2034 "failed to add a response packet to the tree.\n");
2038 /* see handler.h about IV synchronization. */
2039 memcpy(iph1
->ivm
->ive
->v
, iph1
->ivm
->iv
->v
, iph1
->ivm
->iv
->l
);
2041 iph1
->status
= PHASE1ST_ESTABLISHED
;
2043 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
2044 IPSECSESSIONEVENTCODE_IKEV1_PH1_RESP_SUCC
,
2045 CONSTSTR("Responder, Main-Mode"),
2050 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
2051 IPSECSESSIONEVENTCODE_IKE_PACKET_TX_SUCC
,
2052 CONSTSTR("Responder, Main-Mode message 6"),
2057 IPSECSESSIONTRACEREVENT(iph1
->parent_session
,
2058 IPSECSESSIONEVENTCODE_IKE_PACKET_TX_FAIL
,
2059 CONSTSTR("Responder, Main-Mode Message 6"),
2060 CONSTSTR("Failed to process Main-Mode Message 6"));
2067 * This is used in main mode for:
2068 * initiator's 3rd exchange send to responder
2071 * rsa: HDR, KE, [ HASH(1), ] <IDi1_b>PubKey_r, <Ni_b>PubKey_r
2072 * rev: HDR, [ HASH(1), ] <Ni_b>Pubkey_r, <KE_b>Ke_i,
2073 * <IDi1_b>Ke_i, [<<Cert-I_b>Ke_i]
2074 * responders 2nd exchnage send to initiator
2076 * sig: HDR, KE, Nr [, CR ]
2077 * rsa: HDR, KE, <IDr1_b>PubKey_i, <Nr_b>PubKey_i
2078 * rev: HDR, <Nr_b>PubKey_i, <KE_b>Ke_r, <IDr1_b>Ke_r,
2082 struct ph1handle
*iph1
;
2085 struct payload_list
*plist
= NULL
;
2088 vchar_t
*vid
= NULL
;
2091 vchar_t
*gsstoken
= NULL
;
2094 vchar_t
*natd
[2] = { NULL
, NULL
};
2097 /* create CR if need */
2098 if (iph1
->side
== RESPONDER
2099 && iph1
->rmconf
->send_cr
2100 && oakley_needcr(iph1
->approval
->authmethod
)
2101 && iph1
->rmconf
->peerscertfile
== NULL
) {
2103 cr
= oakley_getcr(iph1
);
2105 plog(LLV_ERROR
, LOCATION
, NULL
,
2106 "failed to get cr buffer.\n");
2112 if (AUTHMETHOD(iph1
) == OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB
)
2113 gssapi_get_token_to_send(iph1
, &gsstoken
);
2116 /* create isakmp KE payload */
2117 plist
= isakmp_plist_append(plist
, iph1
->dhpub
, ISAKMP_NPTYPE_KE
);
2119 /* create isakmp NONCE payload */
2120 plist
= isakmp_plist_append(plist
, iph1
->nonce
, ISAKMP_NPTYPE_NONCE
);
2123 if (AUTHMETHOD(iph1
) == OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB
)
2124 plist
= isakmp_plist_append(plist
, gsstoken
, ISAKMP_NPTYPE_GSS
);
2127 /* append vendor id, if needed */
2129 plist
= isakmp_plist_append(plist
, vid
, ISAKMP_NPTYPE_VID
);
2131 /* create isakmp CR payload if needed */
2133 plist
= isakmp_plist_append(plist
, cr
, ISAKMP_NPTYPE_CR
);
2136 /* generate and append NAT-D payloads */
2137 if (NATT_AVAILABLE(iph1
) && iph1
->status
== PHASE1ST_MSG2RECEIVED
)
2139 if ((natd
[0] = natt_hash_addr (iph1
, iph1
->remote
)) == NULL
) {
2140 plog(LLV_ERROR
, LOCATION
, NULL
,
2141 "NAT-D hashing failed for %s\n", saddr2str(iph1
->remote
));
2145 if ((natd
[1] = natt_hash_addr (iph1
, iph1
->local
)) == NULL
) {
2146 plog(LLV_ERROR
, LOCATION
, NULL
,
2147 "NAT-D hashing failed for %s\n", saddr2str(iph1
->local
));
2151 plog (LLV_INFO
, LOCATION
, NULL
, "Adding remote and local NAT-D payloads.\n");
2153 /* old Apple version sends natd payloads in the wrong order */
2154 if (iph1
->natt_options
->version
== VENDORID_NATT_APPLE
) {
2155 plist
= isakmp_plist_append(plist
, natd
[1], iph1
->natt_options
->payload_nat_d
);
2156 plist
= isakmp_plist_append(plist
, natd
[0], iph1
->natt_options
->payload_nat_d
);
2160 plist
= isakmp_plist_append(plist
, natd
[0], iph1
->natt_options
->payload_nat_d
);
2161 plist
= isakmp_plist_append(plist
, natd
[1], iph1
->natt_options
->payload_nat_d
);
2166 buf
= isakmp_plist_set_all (&plist
, iph1
);
2171 if (error
&& buf
!= NULL
) {
2195 * This is used in main mode for:
2196 * initiator's 4th exchange send to responder
2197 * psk: HDR*, IDi1, HASH_I
2198 * sig: HDR*, IDi1, [ CR, ] [ CERT, ] SIG_I
2199 * gssapi: HDR*, [ IDi1, ] < GSSi(n) | HASH_I >
2202 * responders 3rd exchnage send to initiator
2203 * psk: HDR*, IDr1, HASH_R
2204 * sig: HDR*, IDr1, [ CERT, ] SIG_R
2205 * gssapi: HDR*, [ IDr1, ] < GSSr(n) | HASH_R >
2211 struct ph1handle
*iph1
;
2213 struct payload_list
*plist
= NULL
;
2214 vchar_t
*buf
= NULL
, *new = NULL
;
2221 vchar_t
*gsstoken
= NULL
;
2222 vchar_t
*gsshash
= NULL
;
2225 switch (AUTHMETHOD(iph1
)) {
2226 case OAKLEY_ATTR_AUTH_METHOD_PSKEY
:
2227 #ifdef ENABLE_HYBRID
2228 case FICTIVE_AUTH_METHOD_XAUTH_PSKEY_I
:
2229 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_R
:
2230 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_I
:
2231 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_I
:
2233 /* create isakmp ID payload */
2234 plist
= isakmp_plist_append(plist
, iph1
->id
, ISAKMP_NPTYPE_ID
);
2236 /* create isakmp HASH payload */
2237 plist
= isakmp_plist_append(plist
, iph1
->hash
, ISAKMP_NPTYPE_HASH
);
2239 case OAKLEY_ATTR_AUTH_METHOD_DSSSIG
:
2240 case OAKLEY_ATTR_AUTH_METHOD_RSASIG
:
2241 #ifdef ENABLE_HYBRID
2242 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_R
:
2243 case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_R
:
2244 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_I
:
2245 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_R
:
2246 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_I
:
2247 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_R
:
2249 if (oakley_getmycert(iph1
) < 0) {
2250 plog(LLV_ERROR
, LOCATION
, NULL
,
2251 "failed to get mycert");
2255 if (oakley_getsign(iph1
) < 0) {
2256 plog(LLV_ERROR
, LOCATION
, NULL
,
2257 "failed to get sign");
2261 /* create CR if need */
2262 if (iph1
->side
== INITIATOR
2263 && iph1
->rmconf
->send_cr
2264 && oakley_needcr(iph1
->approval
->authmethod
)
2265 && iph1
->rmconf
->peerscertfile
== NULL
) {
2267 cr
= oakley_getcr(iph1
);
2269 plog(LLV_ERROR
, LOCATION
, NULL
,
2270 "failed to get CR");
2275 if (iph1
->cert
!= NULL
&& iph1
->rmconf
->send_cert
)
2278 /* add ID payload */
2279 plist
= isakmp_plist_append(plist
, iph1
->id
, ISAKMP_NPTYPE_ID
);
2281 /* add CERT payload if there */
2283 plist
= isakmp_plist_append(plist
, iph1
->cert
->pl
, ISAKMP_NPTYPE_CERT
);
2284 /* add SIG payload */
2285 plist
= isakmp_plist_append(plist
, iph1
->sig
, ISAKMP_NPTYPE_SIG
);
2287 /* create isakmp CR payload */
2289 plist
= isakmp_plist_append(plist
, cr
, ISAKMP_NPTYPE_CR
);
2292 case OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB
:
2293 if (iph1
->hash
!= NULL
) {
2294 gsshash
= gssapi_wraphash(iph1
);
2295 if (gsshash
== NULL
) {
2296 plog(LLV_ERROR
, LOCATION
, NULL
,
2297 "failed to generate GSSAPI HASH");
2301 gssapi_get_token_to_send(iph1
, &gsstoken
);
2304 if (!gssapi_id_sent(iph1
)) {
2305 /* create isakmp ID payload */
2306 plist
= isakmp_plist_append(plist
, iph1
->id
, ISAKMP_NPTYPE_ID
);
2307 gssapi_set_id_sent(iph1
);
2310 if (iph1
->hash
!= NULL
)
2311 /* create isakmp HASH payload */
2312 plist
= isakmp_plist_append(plist
, gsshash
, ISAKMP_NPTYPE_HASH
);
2314 plist
= isakmp_plist_append(plist
, gsstoken
, ISAKMP_NPTYPE_GSS
);
2317 case OAKLEY_ATTR_AUTH_METHOD_RSAENC
:
2318 case OAKLEY_ATTR_AUTH_METHOD_RSAREV
:
2319 #ifdef ENABLE_HYBRID
2320 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_I
:
2321 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_R
:
2322 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_I
:
2323 case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_R
:
2325 plog(LLV_ERROR
, LOCATION
, NULL
,
2326 "not supported authentication type %d\n",
2327 iph1
->approval
->authmethod
);
2330 plog(LLV_ERROR
, LOCATION
, NULL
,
2331 "invalid authentication type %d\n",
2332 iph1
->approval
->authmethod
);
2336 buf
= isakmp_plist_set_all (&plist
, iph1
);
2338 #ifdef HAVE_PRINT_ISAKMP_C
2339 isakmp_printpacket(buf
, iph1
->local
, iph1
->remote
, 1);
2343 new = oakley_do_encrypt(iph1
, buf
, iph1
->ivm
->ive
, iph1
->ivm
->iv
);
2345 plog(LLV_ERROR
, LOCATION
, NULL
,
2346 "failed to encrypt");
2363 if (error
&& buf
!= NULL
) {