1 /* $Id: pfkey.c,v 1.31.2.10 2005/10/03 14:52:19 manubsd 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
33 #include "racoon_types.h"
44 #include <netinet/in.h>
45 #include <arpa/inet.h>
48 #include <netinet/udp.h>
51 #include <sys/types.h>
52 #include <sys/param.h>
53 #include <sys/socket.h>
54 #include <sys/queue.h>
55 #include <sys/sysctl.h>
57 #include <net/route.h>
58 #include <net/pfkeyv2.h>
60 #include <netinet/in.h>
61 #ifndef HAVE_NETINET6_IPSEC
62 #include <netinet/ipsec.h>
64 #include <netinet6/ipsec.h>
76 #include "ike_session.h"
79 #include "localconf.h"
80 #include "remoteconf.h"
81 #include "isakmp_var.h"
83 #include "isakmp_inf.h"
84 #include "ipsec_doi.h"
89 #include "algorithm.h"
94 #include "nattraversal.h"
95 #include "crypto_openssl.h"
96 #include "grabmyaddr.h"
97 #include "vpn_control.h"
98 #include "vpn_control_var.h"
99 #include "ike_session.h"
100 #include "power_mgmt.h"
103 #if defined(SADB_X_EALG_RIJNDAELCBC) && !defined(SADB_X_EALG_AESCBC)
104 #define SADB_X_EALG_AESCBC SADB_X_EALG_RIJNDAELCBC
108 static u_int
ipsecdoi2pfkey_aalg (u_int
);
109 static u_int
ipsecdoi2pfkey_ealg (u_int
);
110 static u_int
ipsecdoi2pfkey_calg (u_int
);
111 static u_int
ipsecdoi2pfkey_alg (u_int
, u_int
);
112 static u_int
keylen_aalg (u_int
);
113 static u_int
keylen_ealg (u_int
, int);
115 static int pk_recvgetspi (caddr_t
*);
116 static int pk_recvupdate (caddr_t
*);
117 static int pk_recvadd (caddr_t
*);
118 static int pk_recvdelete (caddr_t
*);
119 static int pk_recvacquire (caddr_t
*);
120 static int pk_recvexpire (caddr_t
*);
121 static int pk_recvflush (caddr_t
*);
122 static int getsadbpolicy (caddr_t
*, int *, int, phase2_handle_t
*);
123 static int pk_recvspdupdate (caddr_t
*);
124 static int pk_recvspdadd (caddr_t
*);
125 static int pk_recvspddelete (caddr_t
*);
126 static int pk_recvspdexpire (caddr_t
*);
127 static int pk_recvspdget (caddr_t
*);
128 static int pk_recvspddump (caddr_t
*);
129 static int pk_recvspdflush (caddr_t
*);
130 static int pk_recvgetsastat (caddr_t
*);
131 static struct sadb_msg
*pk_recv (int, ssize_t
*);
133 static int (*pkrecvf
[]) (caddr_t
*) = {
141 NULL
, /* SABD_REGISTER */
144 NULL
, /* SADB_DUMP */
145 NULL
, /* SADB_X_PROMISC */
146 NULL
, /* SADB_X_PCHANGE */
151 NULL
, /* SADB_X_SPDACQUIRE */
154 NULL
, /* SADB_X_SPDSETIDX */
156 NULL
, /* SADB_X_SPDDELETE2 */
157 pk_recvgetsastat
, /* SADB_GETSASTAT */
158 NULL
, /* SADB_X_SPDENABLE */
159 NULL
, /* SADB_X_SPDDISNABLE */
160 NULL
, /* SADB_MIGRATE */
162 #warning "SADB extra message?"
166 /* cope with old kame headers - ugly */
167 #ifndef SADB_X_AALG_MD5
168 #define SADB_X_AALG_MD5 SADB_AALG_MD5
170 #ifndef SADB_X_AALG_SHA
171 #define SADB_X_AALG_SHA SADB_AALG_SHA
173 #ifndef SADB_X_AALG_NULL
174 #define SADB_X_AALG_NULL SADB_AALG_NULL
177 #ifndef SADB_X_EALG_BLOWFISHCBC
178 #define SADB_X_EALG_BLOWFISHCBC SADB_EALG_BLOWFISHCBC
180 #ifndef SADB_X_EALG_CAST128CBC
181 #define SADB_X_EALG_CAST128CBC SADB_EALG_CAST128CBC
183 #ifndef SADB_X_EALG_RC5CBC
184 #ifdef SADB_EALG_RC5CBC
185 #define SADB_X_EALG_RC5CBC SADB_EALG_RC5CBC
191 struct sadb_msg
*msg
;
193 caddr_t mhp
[SADB_EXT_MAX
+ 1];
196 // Special debug use only - creates large logs
197 // plogdump(ASL_LEVEL_DEBUG, msg, msg->sadb_msg_len << 3, "get pfkey %s message\n",
198 // s_pfkey_type(msg->sadb_msg_type));
201 /* check pfkey message. */
202 if (pfkey_align(msg
, mhp
)) {
204 "libipsec failed pfkey align (%s)\n",
208 if (pfkey_check(mhp
)) {
210 "libipsec failed pfkey check (%s)\n",
214 msg
= ALIGNED_CAST(struct sadb_msg
*)mhp
[0]; // Wcast-align fix (void*) - mhp contains pointers to aligned structs in malloc'd msg buffer
216 if (msg
->sadb_msg_errno
) {
219 /* when SPD is empty, treat the state as no error. */
220 if (msg
->sadb_msg_type
== SADB_X_SPDDUMP
&&
221 msg
->sadb_msg_errno
== ENOENT
)
222 pri
= ASL_LEVEL_NOTICE
;
227 "pfkey %s failed: %s\n",
228 s_pfkey_type(msg
->sadb_msg_type
),
229 strerror(msg
->sadb_msg_errno
));
234 if (msg
->sadb_msg_type
>= ARRAYLEN(pkrecvf
)) {
236 "unknown PF_KEY message type=%u\n",
241 if (pkrecvf
[msg
->sadb_msg_type
] == NULL
) {
242 plog(ASL_LEVEL_NOTICE
,
243 "unsupported PF_KEY message %s\n",
244 s_pfkey_type(msg
->sadb_msg_type
));
248 if ((pkrecvf
[msg
->sadb_msg_type
])(mhp
) < 0)
259 * PF_KEY packet handler
264 //%%%%%%%%%%%%%%%%%% need to handle errors encountered here - this no longer returns a result
266 pfkey_handler(void *unused
)
268 struct sadb_msg
*msg
;
271 if (slept_at
|| woke_at
) {
272 plog(ASL_LEVEL_DEBUG
,
273 "ignoring pfkey port until power-mgmt event is handled.\n");
277 /* receive pfkey message. */
279 msg
= (struct sadb_msg
*)pk_recv(lcconf
->sock_pfkey
, &len
);
284 "failed to recv from pfkey (%s)\n",
288 /* short message - msg not ready */
289 plog(ASL_LEVEL_NOTICE
, "recv short message from pfkey\n");
299 struct saved_msg_elem
*elem
;
300 struct saved_msg_elem
*elem_tmp
= NULL
;
302 if (slept_at
|| woke_at
) {
303 plog(ASL_LEVEL_NOTICE
,
304 "ignoring (saved) pfkey messages until power-mgmt event is handled.\n");
308 TAILQ_FOREACH_SAFE(elem
, &lcconf
->saved_msg_queue
, chain
, elem_tmp
) {
309 pfkey_process((struct sadb_msg
*)elem
->msg
);
310 TAILQ_REMOVE(&lcconf
->saved_msg_queue
, elem
, chain
);
318 struct sadb_msg
*msg
;
320 struct saved_msg_elem
*elem
;
322 elem
= (struct saved_msg_elem
*)racoon_calloc(sizeof(struct saved_msg_elem
), 1);
326 TAILQ_INSERT_TAIL(&lcconf
->saved_msg_queue
, elem
, chain
);
334 pfkey_dump_sadb(satype
)
339 pid_t pid
= getpid();
340 struct sadb_msg
*msg
= NULL
;
344 if ((s
= pfkey_open()) < 0) {
346 "libipsec failed pfkey open: %s\n",
351 plog(ASL_LEVEL_DEBUG
, "call pfkey_send_dump\n");
352 if (pfkey_send_dump(s
, satype
) < 0) {
354 "libipsec failed dump: %s\n", ipsec_strerror());
361 msg
= pk_recv(s
, &len
);
370 * for multi-processor system this had to be added because the messages can
371 * be interleaved - they won't all be dump messages
373 if (msg
->sadb_msg_type
!= SADB_DUMP
) { /* save for later processing */
379 // ignore dump messages that aren't racoon's
380 if (msg
->sadb_msg_pid
!= pid
)
383 ml
= msg
->sadb_msg_len
<< 3;
384 bl
= buf
? buf
->l
: 0;
385 buf
= vrealloc(buf
, bl
+ ml
);
388 "failed to reallocate buffer to dump.\n");
391 memcpy(buf
->v
+ bl
, msg
, ml
);
393 if (msg
->sadb_msg_seq
== 0)
412 * These are the SATYPEs that we manage. We register to get
413 * PF_KEY messages related to these SATYPEs, and we also use
414 * this list to determine which SATYPEs to delete SAs for when
415 * we receive an INITIAL-CONTACT.
417 const struct pfkey_satype pfkey_satypes
[] = {
418 { SADB_SATYPE_AH
, "AH" },
419 { SADB_SATYPE_ESP
, "ESP" },
420 { SADB_X_SATYPE_IPCOMP
, "IPCOMP" },
422 const int pfkey_nsatypes
=
423 sizeof(pfkey_satypes
) / sizeof(pfkey_satypes
[0]);
426 * PF_KEY initialization
431 int i
, reg_fail
, sock
;
433 if ((lcconf
->sock_pfkey
= pfkey_open()) < 0) {
435 "libipsec failed pfkey open (%s)\n", ipsec_strerror());
439 for (i
= 0, reg_fail
= 0; i
< pfkey_nsatypes
; i
++) {
440 plog(ASL_LEVEL_DEBUG
,
441 "call pfkey_send_register for %s\n",
442 pfkey_satypes
[i
].ps_name
);
443 if (pfkey_send_register(lcconf
->sock_pfkey
,
444 pfkey_satypes
[i
].ps_satype
) < 0 ||
445 pfkey_recv_register(lcconf
->sock_pfkey
) < 0) {
446 plog(ASL_LEVEL_WARNING
,
447 "failed to register %s (%s)\n",
448 pfkey_satypes
[i
].ps_name
,
454 if (reg_fail
== pfkey_nsatypes
) {
456 "failed to regist any protocol.\n");
457 close(lcconf
->sock_pfkey
);
462 lcconf
->pfkey_source
= dispatch_source_create(DISPATCH_SOURCE_TYPE_READ
, lcconf
->sock_pfkey
, 0, dispatch_get_main_queue());
463 if (lcconf
->pfkey_source
== NULL
) {
464 plog(ASL_LEVEL_ERR
, "could not create pfkey socket source.");
467 dispatch_source_set_event_handler_f(lcconf
->pfkey_source
, pfkey_handler
);
468 sock
= lcconf
->sock_pfkey
;
469 dispatch_source_set_cancel_handler(lcconf
->pfkey_source
,
471 pfkey_close_sock(sock
);
473 dispatch_resume(lcconf
->pfkey_source
);
475 if (pfkey_send_spddump(lcconf
->sock_pfkey
) < 0) {
477 "libipsec sending spddump failed: %s\n",
483 if (pfkey_promisc_toggle(1) < 0) {
495 dispatch_source_cancel(lcconf
->pfkey_source
);
496 lcconf
->pfkey_source
= NULL
;
499 /* %%% for conversion */
500 /* IPSECDOI_ATTR_AUTH -> SADB_AALG */
502 ipsecdoi2pfkey_aalg(hashtype
)
506 case IPSECDOI_ATTR_AUTH_HMAC_MD5
:
507 case IPSECDOI_ATTR_AUTH_HMAC_MD5_96
:
508 return SADB_AALG_MD5HMAC
;
509 case IPSECDOI_ATTR_AUTH_HMAC_SHA1
:
510 case IPSECDOI_ATTR_AUTH_HMAC_SHA1_96
:
511 return SADB_AALG_SHA1HMAC
;
512 case IPSECDOI_ATTR_AUTH_HMAC_SHA2_256
:
513 #if (defined SADB_X_AALG_SHA2_256) && !defined(SADB_X_AALG_SHA2_256HMAC)
514 return SADB_X_AALG_SHA2_256
;
516 return SADB_X_AALG_SHA2_256HMAC
;
518 case IPSECDOI_ATTR_AUTH_HMAC_SHA2_384
:
519 #if (defined SADB_X_AALG_SHA2_384) && !defined(SADB_X_AALG_SHA2_384HMAC)
520 return SADB_X_AALG_SHA2_384
;
522 return SADB_X_AALG_SHA2_384HMAC
;
524 case IPSECDOI_ATTR_AUTH_HMAC_SHA2_512
:
525 #if (defined SADB_X_AALG_SHA2_512) && !defined(SADB_X_AALG_SHA2_512HMAC)
526 return SADB_X_AALG_SHA2_512
;
528 return SADB_X_AALG_SHA2_512HMAC
;
530 case IPSECDOI_ATTR_AUTH_KPDK
: /* need special care */
531 return SADB_AALG_NONE
;
534 case IPSECDOI_ATTR_AUTH_DES_MAC
:
536 "Not supported hash type: %u\n", hashtype
);
539 case 0: /* reserved */
541 return SADB_AALG_NONE
;
544 "Invalid hash type: %u\n", hashtype
);
550 /* IPSECDOI_ESP -> SADB_EALG */
552 ipsecdoi2pfkey_ealg(t_id
)
556 case IPSECDOI_ESP_DES_IV64
: /* sa_flags |= SADB_X_EXT_OLD */
557 return SADB_EALG_DESCBC
;
558 case IPSECDOI_ESP_DES
:
559 return SADB_EALG_DESCBC
;
560 case IPSECDOI_ESP_3DES
:
561 return SADB_EALG_3DESCBC
;
562 #ifdef SADB_X_EALG_RC5CBC
563 case IPSECDOI_ESP_RC5
:
564 return SADB_X_EALG_RC5CBC
;
566 case IPSECDOI_ESP_CAST
:
567 return SADB_X_EALG_CAST128CBC
;
568 case IPSECDOI_ESP_BLOWFISH
:
569 return SADB_X_EALG_BLOWFISHCBC
;
570 case IPSECDOI_ESP_DES_IV32
: /* flags |= (SADB_X_EXT_OLD|
572 return SADB_EALG_DESCBC
;
573 case IPSECDOI_ESP_NULL
:
574 return SADB_EALG_NULL
;
575 #ifdef SADB_X_EALG_AESCBC
576 case IPSECDOI_ESP_AES
:
577 return SADB_X_EALG_AESCBC
;
579 #ifdef SADB_X_EALG_TWOFISHCBC
580 case IPSECDOI_ESP_TWOFISH
:
581 return SADB_X_EALG_TWOFISHCBC
;
585 case IPSECDOI_ESP_3IDEA
:
586 case IPSECDOI_ESP_IDEA
:
587 case IPSECDOI_ESP_RC4
:
589 "Not supported transform: %u\n", t_id
);
592 case 0: /* reserved */
595 "Invalid transform id: %u\n", t_id
);
601 /* IPCOMP -> SADB_CALG */
603 ipsecdoi2pfkey_calg(t_id
)
607 case IPSECDOI_IPCOMP_OUI
:
608 return SADB_X_CALG_OUI
;
609 case IPSECDOI_IPCOMP_DEFLATE
:
610 return SADB_X_CALG_DEFLATE
;
611 case IPSECDOI_IPCOMP_LZS
:
612 return SADB_X_CALG_LZS
;
614 case 0: /* reserved */
617 "Invalid transform id: %u\n", t_id
);
623 /* IPSECDOI_PROTO -> SADB_SATYPE */
625 ipsecdoi2pfkey_proto(proto
)
629 case IPSECDOI_PROTO_IPSEC_AH
:
630 return SADB_SATYPE_AH
;
631 case IPSECDOI_PROTO_IPSEC_ESP
:
632 return SADB_SATYPE_ESP
;
633 case IPSECDOI_PROTO_IPCOMP
:
634 return SADB_X_SATYPE_IPCOMP
;
638 "Invalid ipsec_doi proto: %u\n", proto
);
645 ipsecdoi2pfkey_alg(algclass
, type
)
646 u_int algclass
, type
;
649 case IPSECDOI_ATTR_AUTH
:
650 return ipsecdoi2pfkey_aalg(type
);
651 case IPSECDOI_PROTO_IPSEC_ESP
:
652 return ipsecdoi2pfkey_ealg(type
);
653 case IPSECDOI_PROTO_IPCOMP
:
654 return ipsecdoi2pfkey_calg(type
);
657 "Invalid ipsec_doi algclass: %u\n", algclass
);
663 /* SADB_SATYPE -> IPSECDOI_PROTO */
665 pfkey2ipsecdoi_proto(satype
)
670 return IPSECDOI_PROTO_IPSEC_AH
;
671 case SADB_SATYPE_ESP
:
672 return IPSECDOI_PROTO_IPSEC_ESP
;
673 case SADB_X_SATYPE_IPCOMP
:
674 return IPSECDOI_PROTO_IPCOMP
;
678 "Invalid pfkey proto: %u\n", satype
);
684 /* IPSECDOI_ATTR_ENC_MODE -> IPSEC_MODE */
686 ipsecdoi2pfkey_mode(mode
)
690 case IPSECDOI_ATTR_ENC_MODE_TUNNEL
:
692 case IPSECDOI_ATTR_ENC_MODE_UDPTUNNEL_RFC
:
693 case IPSECDOI_ATTR_ENC_MODE_UDPTUNNEL_DRAFT
:
695 return IPSEC_MODE_TUNNEL
;
696 case IPSECDOI_ATTR_ENC_MODE_TRNS
:
698 case IPSECDOI_ATTR_ENC_MODE_UDPTRNS_RFC
:
699 case IPSECDOI_ATTR_ENC_MODE_UDPTRNS_DRAFT
:
701 return IPSEC_MODE_TRANSPORT
;
703 plog(ASL_LEVEL_ERR
, "Invalid mode type: %u\n", mode
);
709 /* IPSECDOI_ATTR_ENC_MODE -> IPSEC_MODE */
711 pfkey2ipsecdoi_mode(mode
)
715 case IPSEC_MODE_TUNNEL
:
716 return IPSECDOI_ATTR_ENC_MODE_TUNNEL
;
717 case IPSEC_MODE_TRANSPORT
:
718 return IPSECDOI_ATTR_ENC_MODE_TRNS
;
720 return IPSECDOI_ATTR_ENC_MODE_ANY
;
722 plog(ASL_LEVEL_ERR
, "Invalid mode type: %u\n", mode
);
728 /* default key length for encryption algorithm */
730 keylen_aalg(hashtype
)
736 return SADB_AALG_NONE
;
738 res
= alg_ipsec_hmacdef_hashlen(hashtype
);
741 "invalid hmac algorithm %u.\n", hashtype
);
747 /* default key length for encryption algorithm */
749 keylen_ealg(enctype
, encklen
)
755 res
= alg_ipsec_encdef_keylen(enctype
, encklen
);
758 "invalid encryption algorithm %u.\n", enctype
);
765 pfkey_convertfromipsecdoi(iph2
, proto_id
, t_id
, hashtype
,
766 e_type
, e_keylen
, a_type
, a_keylen
, flags
)
767 phase2_handle_t
*iph2
;
779 case IPSECDOI_PROTO_IPSEC_ESP
:
780 if ((*e_type
= ipsecdoi2pfkey_ealg(t_id
)) == ~0)
782 if ((*e_keylen
= keylen_ealg(t_id
, *e_keylen
)) == ~0)
786 if ((*a_type
= ipsecdoi2pfkey_aalg(hashtype
)) == ~0)
788 if ((*a_keylen
= keylen_aalg(hashtype
)) == ~0)
792 if (*e_type
== SADB_EALG_NONE
) {
793 plog(ASL_LEVEL_ERR
, "no ESP algorithm.\n");
798 case IPSECDOI_PROTO_IPSEC_AH
:
799 if ((*a_type
= ipsecdoi2pfkey_aalg(hashtype
)) == ~0)
801 if ((*a_keylen
= keylen_aalg(hashtype
)) == ~0)
805 if (t_id
== IPSECDOI_ATTR_AUTH_HMAC_MD5
806 && hashtype
== IPSECDOI_ATTR_AUTH_KPDK
) {
807 /* AH_MD5 + Auth(KPDK) = RFC1826 keyed-MD5 */
808 *a_type
= SADB_X_AALG_MD5
;
809 *flags
|= SADB_X_EXT_OLD
;
811 *e_type
= SADB_EALG_NONE
;
813 if (*a_type
== SADB_AALG_NONE
) {
814 plog(ASL_LEVEL_ERR
, "no AH algorithm.\n");
819 case IPSECDOI_PROTO_IPCOMP
:
820 if ((*e_type
= ipsecdoi2pfkey_calg(t_id
)) == ~0)
824 *flags
= SADB_X_EXT_RAWCPI
;
826 *a_type
= SADB_AALG_NONE
;
828 if (*e_type
== SADB_X_CALG_NONE
) {
829 plog(ASL_LEVEL_ERR
, "no IPCOMP algorithm.\n");
835 plog(ASL_LEVEL_ERR
, "unknown IPsec protocol.\n");
846 /* called from scheduler */
848 pfkey_timeover_stub(p
)
852 pfkey_timeover((phase2_handle_t
*)p
);
857 phase2_handle_t
*iph2
;
860 "%s give up to get IPsec-SA due to time up to wait.\n",
861 saddrwop2str((struct sockaddr
*)iph2
->dst
));
862 SCHED_KILL(iph2
->sce
);
864 /* If initiator side, send error to kernel by SADB_ACQUIRE. */
865 if (iph2
->side
== INITIATOR
)
866 pk_sendeacquire(iph2
);
868 ike_session_unlink_phase2(iph2
);
874 /* send getspi message per ipsec protocol per remote address */
876 * the local address and remote address in ph1handle are dealed
877 * with destination address and source address respectively.
878 * Because SPI is decided by responder.
882 phase2_handle_t
*iph2
;
884 struct sockaddr_storage
*src
= NULL
, *dst
= NULL
;
888 u_int32_t minspi
, maxspi
;
891 if (iph2
->side
== INITIATOR
) {
893 proxy
= iph2
->ph1
->rmconf
->support_proxy
;
896 if (iph2
->sainfo
&& iph2
->sainfo
->id_i
)
900 /* for mobile IPv6 */
901 if (proxy
&& iph2
->src_id
&& iph2
->dst_id
&&
902 ipsecdoi_transportmode(pp
)) {
910 for (pr
= pp
->head
; pr
!= NULL
; pr
= pr
->next
) {
913 satype
= ipsecdoi2pfkey_proto(pr
->proto_id
);
916 "invalid proto_id %d\n", pr
->proto_id
);
919 /* this works around a bug in Linux kernel where it allocates 4 byte
921 else if (satype
== SADB_X_SATYPE_IPCOMP
) {
929 mode
= ipsecdoi2pfkey_mode(pr
->encmode
);
932 "invalid encmode %d\n", pr
->encmode
);
936 plog(ASL_LEVEL_DEBUG
, "call pfkey_send_getspi\n");
937 if (pfkey_send_getspi(
944 pr
->reqid_in
, 0, 0, iph2
->seq
, 0) < 0) {
946 "ipseclib failed send getspi (%s)\n",
951 plog(ASL_LEVEL_DEBUG
,
952 "pfkey GETSPI sent: %s\n",
953 sadbsecas2str(dst
, src
, satype
, 0, mode
));
960 * receive GETSPI from kernel.
966 struct sadb_msg
*msg
;
968 phase2_handle_t
*iph2
;
969 struct sockaddr_storage
*dst
;
971 int allspiok
, notfound
;
976 if (mhp
[SADB_EXT_SA
] == NULL
977 || mhp
[SADB_EXT_ADDRESS_DST
] == NULL
) {
979 "Inappropriate sadb getspi message passed.\n");
982 msg
= ALIGNED_CAST(struct sadb_msg
*)mhp
[0]; // Wcast-align fix (void*) - mhp contains pointers to aligned structs in malloc'd msg buffer
983 sa
= ALIGNED_CAST(struct sadb_sa
*)mhp
[SADB_EXT_SA
];
984 dst
= ALIGNED_CAST(struct sockaddr_storage
*)PFKEY_ADDR_SADDR(mhp
[SADB_EXT_ADDRESS_SRC
]); /* note SA dir */
986 /* the message has to be processed or not ? */
987 if (msg
->sadb_msg_pid
!= getpid()) {
988 plog(ASL_LEVEL_DEBUG
,
989 "%s message is not interesting "
990 "because pid %d is not mine.\n",
991 s_pfkey_type(msg
->sadb_msg_type
),
996 iph2
= ike_session_getph2byseq(msg
->sadb_msg_seq
);
998 plog(ASL_LEVEL_DEBUG
,
999 "Seq %d of %s message not interesting.\n",
1001 s_pfkey_type(msg
->sadb_msg_type
));
1005 if (iph2
->is_dying
) {
1007 "Status mismatch Phase 2 dying (db:%d)\n",
1012 switch (iph2
->version
) {
1013 case ISAKMP_VERSION_NUMBER_IKEV1
:
1014 if (iph2
->status
!= IKEV1_STATE_QUICK_I_GETSPISENT
&&
1015 iph2
->status
!= IKEV1_STATE_QUICK_R_GETSPISENT
) {
1016 plog(ASL_LEVEL_ERR
, "Status mismatch (db:%d)\n", iph2
->status
);
1019 // check the underlying iph2->ph1
1021 if (!ike_session_update_ph2_ph1bind(iph2
)) {
1023 "Can't proceed with getspi for %s. no suitable ISAKMP-SA found \n",
1024 saddrwop2str((struct sockaddr
*)iph2
->dst
));
1025 ike_session_unlink_phase2(iph2
);
1031 plog(ASL_LEVEL_ERR
, "Internal error: invalid IKE major version %d\n", iph2
->version
);
1035 /* set SPI, and check to get all spi whether or not */
1038 proto_id
= pfkey2ipsecdoi_proto(msg
->sadb_msg_satype
);
1039 pp
= iph2
->side
== INITIATOR
? iph2
->proposal
: iph2
->approval
;
1041 for (pr
= pp
->head
; pr
!= NULL
; pr
= pr
->next
) {
1042 if (pr
->proto_id
== proto_id
&& pr
->spi
== 0) {
1043 pr
->spi
= sa
->sadb_sa_spi
;
1045 plog(ASL_LEVEL_DEBUG
,
1046 "pfkey GETSPI succeeded: %s\n",
1047 sadbsecas2str(iph2
->dst
, iph2
->src
,
1048 msg
->sadb_msg_satype
,
1050 ipsecdoi2pfkey_mode(pr
->encmode
)));
1053 allspiok
= 0; /* not get all spi */
1058 "Get spi for unknown address %s\n",
1059 saddrwop2str((struct sockaddr
*)iph2
->dst
));
1060 ike_session_unlink_phase2(iph2
);
1065 switch (iph2
->version
) {
1066 case ISAKMP_VERSION_NUMBER_IKEV1
:
1067 if (isakmp_post_getspi(iph2
) < 0) {
1068 plog(ASL_LEVEL_ERR
, "IKEv1 post getspi failed.\n");
1069 ike_session_unlink_phase2(iph2
);
1084 phase2_handle_t
*iph2
;
1087 struct sockaddr_storage
*src
= NULL
, *dst
= NULL
;
1088 u_int e_type
, e_keylen
, a_type
, a_keylen
, flags
;
1090 u_int64_t lifebyte
= 0;
1091 u_int wsize
= 4; /* XXX static size of window */
1093 struct ph2natt natt
;
1097 if (iph2
->approval
== NULL
) {
1099 "No approved SAs found.\n");
1102 if (iph2
->side
== INITIATOR
)
1103 proxy
= iph2
->ph1
->rmconf
->support_proxy
;
1104 else if (iph2
->sainfo
&& iph2
->sainfo
->id_i
)
1107 /* for mobile IPv6 */
1108 if (proxy
&& iph2
->src_id
&& iph2
->dst_id
&&
1109 ipsecdoi_transportmode(iph2
->approval
)) {
1117 for (pr
= iph2
->approval
->head
; pr
!= NULL
; pr
= pr
->next
) {
1118 /* validity check */
1119 satype
= ipsecdoi2pfkey_proto(pr
->proto_id
);
1122 "Invalid proto_id %d\n", pr
->proto_id
);
1125 else if (satype
== SADB_X_SATYPE_IPCOMP
) {
1126 /* IPCOMP has no replay window */
1129 #ifdef ENABLE_SAMODE_UNSPECIFIED
1130 mode
= IPSEC_MODE_ANY
;
1132 mode
= ipsecdoi2pfkey_mode(pr
->encmode
);
1135 "Invalid encmode %d\n", pr
->encmode
);
1140 /* set algorithm type and key length */
1141 e_keylen
= pr
->head
->encklen
;
1142 authtype
= pr
->head
->authtype
;
1144 if (pfkey_convertfromipsecdoi(
1150 &a_type
, &a_keylen
, &flags
) < 0)
1154 lifebyte
= iph2
->approval
->lifebyte
* 1024,
1160 //plog(ASL_LEVEL_DEBUG, "call pfkey_send_update\n");
1161 plog(ASL_LEVEL_DEBUG
, "call pfkey_send_update: e_type %d, e_klen %d, a_type %d, a_klen %d\n",
1162 e_type
, e_keylen
, a_type
, a_keylen
);
1163 if (pr
->udp_encap
) {
1164 memset (&natt
, 0, sizeof (natt
));
1165 natt
.sport
= extract_port (iph2
->ph1
->remote
);
1166 flags
|= SADB_X_EXT_NATT
;
1167 if (iph2
->ph1
->rmconf
->natt_multiple_user
== TRUE
&&
1168 mode
== IPSEC_MODE_TRANSPORT
&&
1169 src
->ss_family
== AF_INET
) {
1170 flags
|= SADB_X_EXT_NATT_MULTIPLEUSERS
;
1171 if (iph2
->ph1
->natt_flags
& NAT_DETECTED_PEER
) {
1172 // is mutually exclusive with SADB_X_EXT_NATT_KEEPALIVE
1173 flags
|= SADB_X_EXT_NATT_DETECTED_PEER
;
1175 } else if (iph2
->ph1
->natt_flags
& NAT_DETECTED_ME
) {
1176 if (iph2
->ph1
->rmconf
->natt_keepalive
== TRUE
)
1177 flags
|= SADB_X_EXT_NATT_KEEPALIVE
;
1179 if (iph2
->ph1
->natt_flags
& NAT_DETECTED_PEER
) {
1180 // is mutually exclusive with SADB_X_EXT_NATT_KEEPALIVE
1181 flags
|= SADB_X_EXT_NATT_DETECTED_PEER
;
1185 memset (&natt
, 0, sizeof (natt
));
1188 if (pfkey_send_update(
1198 e_type
, e_keylen
, a_type
, a_keylen
, flags
,
1199 0, lifebyte
, iph2
->approval
->lifetime
, 0,
1200 iph2
->seq
, natt
.sport
, 0) < 0) {
1202 "libipsec failed send update (%s)\n",
1207 plog(ASL_LEVEL_DEBUG
, "call pfkey_send_update\n");
1208 if (pfkey_send_update(
1218 e_type
, e_keylen
, a_type
, a_keylen
, flags
,
1219 0, lifebyte
, iph2
->approval
->lifetime
, 0,
1220 iph2
->seq
, 0, 0) < 0) {
1222 "libipsec failed send update (%s)\n",
1226 #endif /* ENABLE_NATT */
1238 struct sadb_msg
*msg
;
1240 struct sockaddr_storage
*src
, *dst
;
1241 phase2_handle_t
*iph2
;
1242 u_int proto_id
, encmode
, sa_mode
;
1246 /* ignore this message because of local test mode. */
1252 || mhp
[SADB_EXT_SA
] == NULL
1253 || mhp
[SADB_EXT_ADDRESS_SRC
] == NULL
1254 || mhp
[SADB_EXT_ADDRESS_DST
] == NULL
) {
1256 "inappropriate sadb update message passed.\n");
1259 msg
= ALIGNED_CAST(struct sadb_msg
*)mhp
[0]; // Wcast-align fix (void*) - mhp contains pointers to aligned structs in malloc'd msg buffer
1260 src
= ALIGNED_CAST(struct sockaddr_storage
*)PFKEY_ADDR_SADDR(mhp
[SADB_EXT_ADDRESS_SRC
]);
1261 dst
= ALIGNED_CAST(struct sockaddr_storage
*)PFKEY_ADDR_SADDR(mhp
[SADB_EXT_ADDRESS_DST
]);
1262 sa
= ALIGNED_CAST(struct sadb_sa
*)mhp
[SADB_EXT_SA
];
1264 sa_mode
= mhp
[SADB_X_EXT_SA2
] == NULL
1266 : (ALIGNED_CAST(struct sadb_x_sa2
*)mhp
[SADB_X_EXT_SA2
])->sadb_x_sa2_mode
;
1268 /* the message has to be processed or not ? */
1269 if (msg
->sadb_msg_pid
!= getpid()) {
1270 plog(ASL_LEVEL_DEBUG
,
1271 "%s message is not interesting "
1272 "because pid %d is not mine.\n",
1273 s_pfkey_type(msg
->sadb_msg_type
),
1278 iph2
= ike_session_getph2byseq(msg
->sadb_msg_seq
);
1280 plog(ASL_LEVEL_DEBUG
,
1281 "Seq %d of %s message not interesting.\n",
1283 s_pfkey_type(msg
->sadb_msg_type
));
1287 if (iph2
->is_dying
) {
1289 "Status mismatch Phase 2 dying (db:%d)\n",
1293 if (iph2
->status
!= IKEV1_STATE_QUICK_I_ADDSA
&&
1294 iph2
->status
!= IKEV1_STATE_QUICK_R_ADDSA
) {
1296 "Status mismatch (db:%d)\n",
1301 /* check to complete all keys ? */
1302 for (pr
= iph2
->approval
->head
; pr
!= NULL
; pr
= pr
->next
) {
1303 proto_id
= pfkey2ipsecdoi_proto(msg
->sadb_msg_satype
);
1304 if (proto_id
== ~0) {
1306 "invalid proto_id %d\n", msg
->sadb_msg_satype
);
1309 encmode
= pfkey2ipsecdoi_mode(sa_mode
);
1310 if (encmode
== ~0) {
1312 "invalid encmode %d\n", sa_mode
);
1316 if (pr
->proto_id
== proto_id
1317 && pr
->spi
== sa
->sadb_sa_spi
) {
1319 plog(ASL_LEVEL_DEBUG
,
1320 "pfkey UPDATE succeeded: %s\n",
1321 sadbsecas2str(iph2
->dst
, iph2
->src
,
1322 msg
->sadb_msg_satype
,
1326 plog(ASL_LEVEL_NOTICE
,
1327 "IPsec-SA established (update): satype=%u spi=%#x mode=%u\n",
1328 msg
->sadb_msg_satype
, ntohl(sa
->sadb_sa_spi
), sa_mode
);
1329 plog(ASL_LEVEL_DEBUG
,
1330 "IPsec-SA established (update): %s\n",
1331 sadbsecas2str(iph2
->dst
, iph2
->src
,
1332 msg
->sadb_msg_satype
, sa
->sadb_sa_spi
,
1343 /* turn off the timer for calling pfkey_timeover() */
1344 SCHED_KILL(iph2
->sce
);
1347 fsm_set_state(&iph2
->status
, IKEV1_STATE_PHASE2_ESTABLISHED
);
1349 ike_session_ph2_established(iph2
);
1351 IPSECLOGASLMSG("IPSec Phase 2 established (Initiated by %s).\n",
1352 (iph2
->side
== INITIATOR
)? "me" : "peer");
1355 gettimeofday(&iph2
->end
, NULL
);
1356 plog(ASL_LEVEL_NOTICE
, "%s(%s): %8.6f",
1357 "Phase 2", "quick", timedelta(&iph2
->start
, &iph2
->end
));
1362 iph2
->ph1
->ph2cnt
++;
1364 /* turn off schedule */
1366 SCHED_KILL(iph2
->scr
);
1369 * since we are going to reuse the phase2 handler, we need to
1370 * remain it and refresh all the references between ph1 and ph2 to use.
1372 ike_session_unbindph12(iph2
); //%%%%% fix this
1374 iph2
->sce
= sched_new(iph2
->approval
->lifetime
,
1375 isakmp_ph2expire_stub
, iph2
);
1377 plog(ASL_LEVEL_DEBUG
, "===\n");
1386 phase2_handle_t
*iph2
;
1389 struct sockaddr_storage
*src
= NULL
, *dst
= NULL
;
1390 u_int e_type
, e_keylen
, a_type
, a_keylen
, flags
;
1392 u_int64_t lifebyte
= 0;
1393 u_int wsize
= 4; /* XXX static size of window */
1395 struct ph2natt natt
;
1399 if (iph2
->approval
== NULL
) {
1401 "no approvaled SAs found.\n");
1404 if (iph2
->side
== INITIATOR
)
1405 proxy
= iph2
->ph1
->rmconf
->support_proxy
;
1406 else if (iph2
->sainfo
&& iph2
->sainfo
->id_i
)
1409 /* for mobile IPv6 */
1410 if (proxy
&& iph2
->src_id
&& iph2
->dst_id
&&
1411 ipsecdoi_transportmode(iph2
->approval
)) {
1419 for (pr
= iph2
->approval
->head
; pr
!= NULL
; pr
= pr
->next
) {
1420 /* validity check */
1421 satype
= ipsecdoi2pfkey_proto(pr
->proto_id
);
1424 "invalid proto_id %d\n", pr
->proto_id
);
1427 else if (satype
== SADB_X_SATYPE_IPCOMP
) {
1428 /* no replay window for IPCOMP */
1431 #ifdef ENABLE_SAMODE_UNSPECIFIED
1432 mode
= IPSEC_MODE_ANY
;
1434 mode
= ipsecdoi2pfkey_mode(pr
->encmode
);
1437 "invalid encmode %d\n", pr
->encmode
);
1442 /* set algorithm type and key length */
1443 e_keylen
= pr
->head
->encklen
;
1444 authtype
= pr
->head
->authtype
;
1446 if (pfkey_convertfromipsecdoi(
1452 &a_type
, &a_keylen
, &flags
) < 0)
1456 lifebyte
= iph2
->approval
->lifebyte
* 1024,
1462 //plog(ASL_LEVEL_DEBUG, "call pfkey_send_add\n");
1463 plog(ASL_LEVEL_DEBUG
, "call pfkey_send_add: e_type %d, e_klen %d, a_type %d, a_klen %d\n",
1464 e_type
, e_keylen
, a_type
, a_keylen
);
1466 if (pr
->udp_encap
) {
1467 memset (&natt
, 0, sizeof (natt
));
1468 natt
.dport
= extract_port (iph2
->ph1
->remote
);
1469 flags
|= SADB_X_EXT_NATT
;
1470 if (iph2
->ph1
->rmconf
->natt_multiple_user
== TRUE
&&
1471 mode
== IPSEC_MODE_TRANSPORT
&&
1472 src
->ss_family
== AF_INET
) {
1473 flags
|= SADB_X_EXT_NATT_MULTIPLEUSERS
;
1474 if (iph2
->ph1
->natt_flags
& NAT_DETECTED_PEER
) {
1475 // is mutually exclusive with SADB_X_EXT_NATT_KEEPALIVE
1476 flags
|= SADB_X_EXT_NATT_DETECTED_PEER
;
1478 } else if (iph2
->ph1
->natt_flags
& NAT_DETECTED_ME
) {
1479 if (iph2
->ph1
->rmconf
->natt_keepalive
== TRUE
)
1480 flags
|= SADB_X_EXT_NATT_KEEPALIVE
;
1482 if (iph2
->ph1
->natt_flags
& NAT_DETECTED_PEER
) {
1483 // is mutually exclusive with SADB_X_EXT_NATT_KEEPALIVE
1484 flags
|= SADB_X_EXT_NATT_DETECTED_PEER
;
1488 memset (&natt
, 0, sizeof (natt
));
1490 /* Remove port information, that SA doesn't use it */
1505 e_type
, e_keylen
, a_type
, a_keylen
, flags
,
1506 0, lifebyte
, iph2
->approval
->lifetime
, 0,
1507 iph2
->seq
,natt
.dport
, 0) < 0) {
1509 "libipsec failed send add (%s)\n",
1514 plog(ASL_LEVEL_DEBUG
, "call pfkey_send_add\n");
1516 /* Remove port information, it is not used without NAT-T */
1530 e_type
, e_keylen
, a_type
, a_keylen
, flags
,
1531 0, lifebyte
, iph2
->approval
->lifetime
, 0,
1532 iph2
->seq
, 0, 0) < 0) {
1534 "libipsec failed send add (%s)\n",
1538 #endif /* ENABLE_NATT */
1548 struct sadb_msg
*msg
;
1550 struct sockaddr_storage
*src
, *dst
;
1551 phase2_handle_t
*iph2
;
1554 /* ignore this message because of local test mode. */
1560 || mhp
[SADB_EXT_SA
] == NULL
1561 || mhp
[SADB_EXT_ADDRESS_SRC
] == NULL
1562 || mhp
[SADB_EXT_ADDRESS_DST
] == NULL
) {
1564 "inappropriate sadb add message passed.\n");
1567 msg
= ALIGNED_CAST(struct sadb_msg
*)mhp
[0]; // Wcast-align fix (void*) - mhp contains pointers to aligned structs in malloc'd msg buffer
1568 src
= ALIGNED_CAST(struct sockaddr_storage
*)PFKEY_ADDR_SADDR(mhp
[SADB_EXT_ADDRESS_SRC
]);
1569 dst
= ALIGNED_CAST(struct sockaddr_storage
*)PFKEY_ADDR_SADDR(mhp
[SADB_EXT_ADDRESS_DST
]);
1570 sa
= ALIGNED_CAST(struct sadb_sa
*)mhp
[SADB_EXT_SA
];
1572 sa_mode
= mhp
[SADB_X_EXT_SA2
] == NULL
1574 : (ALIGNED_CAST(struct sadb_x_sa2
*)mhp
[SADB_X_EXT_SA2
])->sadb_x_sa2_mode
;
1576 /* the message has to be processed or not ? */
1577 if (msg
->sadb_msg_pid
!= getpid()) {
1578 plog(ASL_LEVEL_DEBUG
,
1579 "%s message is not interesting "
1580 "because pid %d is not mine.\n",
1581 s_pfkey_type(msg
->sadb_msg_type
),
1586 iph2
= ike_session_getph2byseq(msg
->sadb_msg_seq
);
1588 plog(ASL_LEVEL_DEBUG
,
1589 "seq %d of %s message not interesting.\n",
1591 s_pfkey_type(msg
->sadb_msg_type
));
1595 * NOTE don't update any status of phase2 handle
1596 * because they must be updated by SADB_UPDATE message
1599 plog(ASL_LEVEL_NOTICE
,
1600 "IPsec-SA established (add): satype=%u spi=%#x mode=%u\n",
1601 msg
->sadb_msg_satype
, ntohl(sa
->sadb_sa_spi
), sa_mode
);
1602 plog(ASL_LEVEL_DEBUG
,
1603 "IPsec-SA established (add): %s\n",
1604 sadbsecas2str(iph2
->src
, iph2
->dst
,
1605 msg
->sadb_msg_satype
, sa
->sadb_sa_spi
, sa_mode
));
1607 ike_session_cleanup_other_established_ph2s(iph2
->parent_session
, iph2
);
1609 #ifdef ENABLE_VPNCONTROL_PORT
1611 vpncontrol_notify_phase_change(0, FROM_LOCAL
, NULL
, iph2
);
1615 plog(ASL_LEVEL_DEBUG
, "===\n");
1623 struct sadb_msg
*msg
;
1625 struct sockaddr_storage
*src
, *dst
;
1626 phase2_handle_t
*iph2
;
1627 u_int proto_id
, sa_mode
;
1631 || mhp
[SADB_EXT_SA
] == NULL
1632 || mhp
[SADB_EXT_ADDRESS_SRC
] == NULL
1633 || mhp
[SADB_EXT_ADDRESS_DST
] == NULL
1634 || (mhp
[SADB_EXT_LIFETIME_HARD
] != NULL
1635 && mhp
[SADB_EXT_LIFETIME_SOFT
] != NULL
)) {
1637 "inappropriate sadb expire message passed.\n");
1640 msg
= ALIGNED_CAST(struct sadb_msg
*)mhp
[0]; // Wcast-align fix (void*) - mhp contains pointers to aligned structs in malloc'd msg buffer
1641 sa
= ALIGNED_CAST(struct sadb_sa
*)mhp
[SADB_EXT_SA
];
1642 src
= ALIGNED_CAST(struct sockaddr_storage
*)PFKEY_ADDR_SADDR(mhp
[SADB_EXT_ADDRESS_SRC
]);
1643 dst
= ALIGNED_CAST(struct sockaddr_storage
*)PFKEY_ADDR_SADDR(mhp
[SADB_EXT_ADDRESS_DST
]);
1645 sa_mode
= mhp
[SADB_X_EXT_SA2
] == NULL
1647 : (ALIGNED_CAST(struct sadb_x_sa2
*)mhp
[SADB_X_EXT_SA2
])->sadb_x_sa2_mode
;
1649 proto_id
= pfkey2ipsecdoi_proto(msg
->sadb_msg_satype
);
1650 if (proto_id
== ~0) {
1652 "invalid proto_id %d\n", msg
->sadb_msg_satype
);
1656 plog(ASL_LEVEL_NOTICE
,
1657 "IPsec-SA expired: satype=%u spi=%#x mode=%u\n",
1658 msg
->sadb_msg_satype
, ntohl(sa
->sadb_sa_spi
), sa_mode
);
1659 plog(ASL_LEVEL_DEBUG
,
1660 "IPsec-SA expired: %s\n",
1661 sadbsecas2str(src
, dst
,
1662 msg
->sadb_msg_satype
, sa
->sadb_sa_spi
, sa_mode
));
1664 iph2
= ike_session_getph2bysaidx(src
, dst
, proto_id
, sa
->sadb_sa_spi
);
1667 * Ignore it because two expire messages are come up.
1668 * phase2 handler has been deleted already when 2nd message
1671 plog(ASL_LEVEL_DEBUG
,
1672 "no such a SA found: %s\n",
1673 sadbsecas2str(src
, dst
,
1674 msg
->sadb_msg_satype
, sa
->sadb_sa_spi
,
1678 if (iph2
->is_dying
|| !FSM_STATE_IS_ESTABLISHED(iph2
->status
)) {
1680 * If the status is not equal to PHASE2ST_ESTABLISHED,
1681 * racoon ignores this expire message. There are two reason.
1682 * One is that the phase 2 probably starts because there is
1683 * a potential that racoon receives the acquire message
1684 * without receiving a expire message. Another is that racoon
1685 * may receive the multiple expire messages from the kernel.
1687 plog(ASL_LEVEL_WARNING
,
1688 "The expire message is received but the handler %s (status = 0x%x).\n",
1689 iph2
->is_dying
? "is dying" : "has not been established", iph2
->status
);
1693 /* turn off the timer for calling isakmp_ph2expire() */
1694 SCHED_KILL(iph2
->sce
);
1696 fsm_set_state(&iph2
->status
, IKEV1_STATE_PHASE2_EXPIRED
);
1698 /* INITIATOR, begin phase 2 exchange only if there's no other established ph2. */
1699 /* allocate buffer for status management of pfkey message */
1700 if (iph2
->side
== INITIATOR
&&
1701 !ike_session_has_other_established_ph2(iph2
->parent_session
, iph2
) &&
1702 !ike_session_drop_rekey(iph2
->parent_session
, IKE_SESSION_REKEY_TYPE_PH2
)) {
1704 ike_session_initph2(iph2
);
1706 /* start isakmp initiation by using ident exchange */
1707 if (isakmp_post_acquire(iph2
) < 0) {
1709 "failed to begin ipsec sa "
1710 "re-negotiation.\n");
1711 ike_session_unlink_phase2(iph2
);
1720 /* If not received SADB_EXPIRE, INITIATOR delete ph2handle. */
1721 /* RESPONDER always delete ph2handle, keep silent. RESPONDER doesn't
1722 * manage IPsec SA, so delete the list */
1723 ike_session_unlink_phase2(iph2
);
1732 struct sadb_msg
*msg
;
1733 struct sadb_x_policy
*xpl
;
1734 struct secpolicy
*sp_out
= NULL
, *sp_in
= NULL
;
1735 phase2_handle_t
*iph2
;
1736 struct sockaddr_storage
*src
, *dst
;
1737 ike_session_t
*session
= NULL
;
1738 struct remoteconf
*rmconf
;
1740 /* ignore this message because of local test mode. */
1746 || mhp
[SADB_EXT_ADDRESS_SRC
] == NULL
1747 || mhp
[SADB_EXT_ADDRESS_DST
] == NULL
1748 || mhp
[SADB_X_EXT_POLICY
] == NULL
) {
1750 "inappropriate sadb acquire message passed.\n");
1753 msg
= ALIGNED_CAST(struct sadb_msg
*)mhp
[0]; // Wcast-align fix (void*) - mhp contains pointers to aligned structs in malloc'd msg buffer
1754 xpl
= ALIGNED_CAST(struct sadb_x_policy
*)mhp
[SADB_X_EXT_POLICY
];
1755 src
= ALIGNED_CAST(struct sockaddr_storage
*)PFKEY_ADDR_SADDR(mhp
[SADB_EXT_ADDRESS_SRC
]);
1756 dst
= ALIGNED_CAST(struct sockaddr_storage
*)PFKEY_ADDR_SADDR(mhp
[SADB_EXT_ADDRESS_DST
]);
1758 /* ignore if type is not IPSEC_POLICY_IPSEC */
1759 if (xpl
->sadb_x_policy_type
!= IPSEC_POLICY_IPSEC
) {
1760 plog(ASL_LEVEL_DEBUG
,
1761 "ignore ACQUIRE message. type is not IPsec.\n");
1765 /* ignore it if src is multicast address */
1767 struct sockaddr_storage
*sa
= ALIGNED_CAST(struct sockaddr_storage
*)PFKEY_ADDR_SADDR(mhp
[SADB_EXT_ADDRESS_DST
]);
1769 if ((sa
->ss_family
== AF_INET
1770 && IN_MULTICAST(ntohl(((struct sockaddr_in
*)sa
)->sin_addr
.s_addr
)))
1772 || (sa
->ss_family
== AF_INET6
1773 && IN6_IS_ADDR_MULTICAST(&((struct sockaddr_in6
*)sa
)->sin6_addr
))
1776 plog(ASL_LEVEL_DEBUG
,
1777 "ignore due to multicast address: %s.\n",
1778 saddrwop2str((struct sockaddr
*)sa
));
1783 /* ignore, if we do not listen on source address */
1786 * - if we'll contact peer from address we do not listen -
1787 * we will be unable to complete negotiation;
1788 * - if we'll negotiate using address we're listening -
1789 * remote peer will send packets to address different
1790 * than one in the policy, so kernel will drop them;
1791 * => therefore this acquire is not for us! --Aidas
1793 // Wcast-align fix (void*) - mhp contains pointers to aligned structs in malloc'd msg buffer
1794 struct sockaddr_storage
*sa
= ALIGNED_CAST(struct sockaddr_storage
*)PFKEY_ADDR_SADDR(mhp
[SADB_EXT_ADDRESS_SRC
]);
1798 for (p
= lcconf
->myaddrs
; p
; p
= p
->next
) {
1799 str
= saddr2str((struct sockaddr
*)p
->addr
);
1800 plog(ASL_LEVEL_DEBUG
,
1801 "checking listen addrs: %s", str
);
1803 if (!cmpsaddrwop(p
->addr
, sa
)) {
1810 plog(ASL_LEVEL_DEBUG
,
1811 "ignore because do not listen on source address : %s.\n",
1812 saddrwop2str((struct sockaddr
*)sa
));
1818 * If there is a phase 2 handler against the policy identifier in
1819 * the acquire message, and if
1820 * 1. its state is less than PHASE2ST_ESTABLISHED, then racoon
1821 * should ignore such a acquire message because the phase 2
1822 * is just negotiating.
1823 * 2. its state is equal to PHASE2ST_ESTABLISHED, then racoon
1824 * has to process such a acquire message because racoon may
1825 * have lost the expire message.
1827 iph2
= ike_session_getph2byid(src
, dst
, xpl
->sadb_x_policy_id
);
1829 session
= iph2
->parent_session
;
1830 if (!FSM_STATE_IS_ESTABLISHED(iph2
->status
)) {
1831 plog(ASL_LEVEL_DEBUG
,
1832 "ignore the acquire because ph2 found\n");
1835 if (FSM_STATE_IS_EXPIRED(iph2
->status
))
1840 /* search for proper policyindex */
1841 sp_out
= getspbyspid(xpl
->sadb_x_policy_id
);
1842 if (sp_out
== NULL
) {
1843 plog(ASL_LEVEL_ERR
, "no policy found: id:%d.\n",
1844 xpl
->sadb_x_policy_id
);
1847 plog(ASL_LEVEL_DEBUG
,
1848 "suitable outbound SP found: %s.\n", spidx2str(&sp_out
->spidx
));
1850 /* get inbound policy */
1852 struct policyindex spidx
;
1854 spidx
.dir
= IPSEC_DIR_INBOUND
;
1855 memcpy(&spidx
.src
, &sp_out
->spidx
.dst
, sizeof(spidx
.src
));
1856 memcpy(&spidx
.dst
, &sp_out
->spidx
.src
, sizeof(spidx
.dst
));
1857 spidx
.prefs
= sp_out
->spidx
.prefd
;
1858 spidx
.prefd
= sp_out
->spidx
.prefs
;
1859 spidx
.ul_proto
= sp_out
->spidx
.ul_proto
;
1861 sp_in
= getsp(&spidx
);
1863 plog(ASL_LEVEL_DEBUG
,
1864 "Suitable inbound SP found: %s.\n",
1865 spidx2str(&sp_in
->spidx
));
1867 plog(ASL_LEVEL_NOTICE
,
1868 "No in-bound policy found: %s\n",
1873 /* allocate a phase 2 */
1874 rmconf
= getrmconf(dst
);
1875 if (rmconf
== NULL
) {
1876 plog(ASL_LEVEL_ERR
, "No configuration found for %s.\n",
1877 saddrwop2str((struct sockaddr
*)dst
));
1881 iph2
= ike_session_newph2(rmconf
->ike_version
, PHASE2_TYPE_SA
);
1884 "Failed to allocate Phase 2 entry.\n");
1887 plog(ASL_LEVEL_DEBUG
, "Got new Phase 2 version %d\n", iph2
->version
);
1888 iph2
->version
= rmconf
->ike_version
;
1889 iph2
->side
= INITIATOR
;
1890 iph2
->spid
= xpl
->sadb_x_policy_id
;
1892 iph2
->satype
= msg
->sadb_msg_satype
;
1893 iph2
->seq
= msg
->sadb_msg_seq
;
1894 vpncontrol_set_nat64_prefix(&iph2
->nat64_prefix
);
1895 /* set end addresses of SA */
1896 // Wcast_align fix (void*) - mhp contains pointers to aligned structs in malloc'd msg buffer
1897 iph2
->src
= dupsaddr(ALIGNED_CAST(struct sockaddr_storage
*)PFKEY_ADDR_SADDR(mhp
[SADB_EXT_ADDRESS_SRC
]));
1898 if (iph2
->src
== NULL
) {
1899 ike_session_delph2(iph2
);
1902 iph2
->dst
= dupsaddr(ALIGNED_CAST(struct sockaddr_storage
*)PFKEY_ADDR_SADDR(mhp
[SADB_EXT_ADDRESS_DST
]));
1903 if (iph2
->dst
== NULL
) {
1904 ike_session_delph2(iph2
);
1908 if (iph2
->version
== ISAKMP_VERSION_NUMBER_IKEV1
) {
1909 fsm_set_state(&iph2
->status
, IKEV1_STATE_QUICK_I_START
);
1912 plog(ASL_LEVEL_DEBUG
,
1913 "new acquire %s\n", spidx2str(&sp_out
->spidx
));
1917 vchar_t
*idsrc
, *iddst
;
1919 idsrc
= ipsecdoi_sockaddr2id(&sp_out
->spidx
.src
,
1920 sp_out
->spidx
.prefs
, sp_out
->spidx
.ul_proto
);
1921 if (idsrc
== NULL
) {
1923 "failed to get ID for %s\n",
1924 spidx2str(&sp_out
->spidx
));
1925 ike_session_delph2(iph2
);
1928 iddst
= ipsecdoi_sockaddr2id(&sp_out
->spidx
.dst
,
1929 sp_out
->spidx
.prefd
, sp_out
->spidx
.ul_proto
);
1930 if (iddst
== NULL
) {
1932 "failed to get ID for %s\n",
1933 spidx2str(&sp_out
->spidx
));
1935 ike_session_delph2(iph2
);
1938 iph2
->sainfo
= getsainfo(idsrc
, iddst
, NULL
, 0);
1941 if (iph2
->sainfo
== NULL
) {
1943 "failed to get sainfo.\n");
1944 ike_session_delph2(iph2
);
1946 /* XXX should use the algorithm list from register message */
1949 retain_sainfo(iph2
->sainfo
);
1951 if (set_proposal_from_policy(iph2
, sp_out
, sp_in
) < 0) {
1953 "failed to create saprop.\n");
1954 ike_session_delph2(iph2
);
1958 if (session
== NULL
)
1959 session
= ike_session_get_session(iph2
->src
, iph2
->dst
, 1, NULL
);
1960 if (session
== NULL
)
1963 if (ike_session_link_phase2(session
, iph2
))
1964 fatal_error(-1); //????? fix ???
1966 /* start isakmp initiation by using ident exchange */
1967 /* XXX should be looped if there are multiple phase 2 handler. */
1968 if (isakmp_post_acquire(iph2
) < 0) {
1970 "failed to begin ipsec sa negotiation.\n");
1974 #if !(TARGET_OS_IPHONE && !TARGET_OS_SIMULATOR)
1975 if ( lcconf
->vt
== NULL
){
1976 if (!(lcconf
->vt
= vproc_transaction_begin(NULL
)))
1978 "vproc_transaction_begin returns NULL.\n");
1980 #endif // !(TARGET_OS_IPHONE && !TARGET_OS_SIMULATOR)
1986 ike_session_unlink_phase2(iph2
);
1994 struct sadb_msg
*msg
;
1996 struct sockaddr_storage
*src
, *dst
;
1997 phase2_handle_t
*iph2
= NULL
;
2000 /* ignore this message because of local test mode. */
2006 || mhp
[SADB_EXT_ADDRESS_SRC
] == NULL
2007 || mhp
[SADB_EXT_ADDRESS_DST
] == NULL
) {
2009 "inappropriate sadb delete message passed.\n");
2012 msg
= ALIGNED_CAST(struct sadb_msg
*)mhp
[0]; // Wcast-align fix (void*) - mhp contains pointers to aligned structs in malloc'd msg buffer
2013 sa
= ALIGNED_CAST(struct sadb_sa
*)mhp
[SADB_EXT_SA
];
2014 src
= ALIGNED_CAST(struct sockaddr_storage
*)PFKEY_ADDR_SADDR(mhp
[SADB_EXT_ADDRESS_SRC
]);
2015 dst
= ALIGNED_CAST(struct sockaddr_storage
*)PFKEY_ADDR_SADDR(mhp
[SADB_EXT_ADDRESS_DST
]);
2017 /* the message has to be processed or not ? */
2018 if (msg
->sadb_msg_pid
== getpid()) {
2019 plog(ASL_LEVEL_DEBUG
,
2020 "%s message is not interesting "
2021 "because the message was originated by me.\n",
2022 s_pfkey_type(msg
->sadb_msg_type
));
2026 proto_id
= pfkey2ipsecdoi_proto(msg
->sadb_msg_satype
);
2027 if (proto_id
== ~0) {
2029 "invalid proto_id %d\n", msg
->sadb_msg_satype
);
2033 plog(ASL_LEVEL_DEBUG
, "SADB delete message: proto-id %d\n", proto_id
);
2034 plog(ASL_LEVEL_DEBUG
, "src: %s\n", saddr2str((struct sockaddr
*)src
));
2035 plog(ASL_LEVEL_DEBUG
, "dst: %s\n", saddr2str((struct sockaddr
*)dst
));
2038 ike_session_deleteallph2(src
, dst
, proto_id
);
2039 ike_session_deleteallph1(src
, dst
);
2043 iph2
= ike_session_getph2bysaidx(src
, dst
, proto_id
, sa
->sadb_sa_spi
);
2047 "no iph2 found: %s\n",
2048 sadbsecas2str(src
, dst
, msg
->sadb_msg_satype
,
2049 sa
->sadb_sa_spi
, IPSEC_MODE_ANY
));
2054 "pfkey DELETE received: %s\n",
2055 sadbsecas2str(iph2
->src
, iph2
->dst
,
2056 msg
->sadb_msg_satype
, sa
->sadb_sa_spi
, IPSEC_MODE_ANY
));
2058 /* send delete information */
2060 /* TODO: Look into handling this properly. Currently, if we get here, we can end up sending delete messages to the server for their own SAs, which is rejected. */
2061 /*if (FSM_STATE_IS_ESTABLISHED(iph2->status))
2062 isakmp_info_send_d2(iph2);
2064 ike_session_cleanup_ph1s_by_ph2(iph2);
2065 ike_session_unlink_phase2(iph2);*/
2075 if (mhp
[0] == NULL
) {
2077 "inappropriate sadb flush message passed.\n");
2081 ike_session_flush_all_phase2(false);
2082 ike_session_flush_all_phase1(false);
2088 getsadbpolicy(policy0
, policylen0
, type
, iph2
)
2090 int *policylen0
, type
;
2091 phase2_handle_t
*iph2
;
2093 struct policyindex
*spidx
= iph2
->spidx_gen
;
2094 struct sadb_x_policy
*xpl
;
2095 struct sadb_x_ipsecrequest
*xisr
;
2102 /* get policy buffer size */
2103 policylen
= sizeof(struct sadb_x_policy
);
2104 if (type
!= SADB_X_SPDDELETE
) {
2105 for (pr
= iph2
->approval
->head
; pr
; pr
= pr
->next
) {
2106 xisrlen
= sizeof(*xisr
);
2107 if (pr
->encmode
== IPSECDOI_ATTR_ENC_MODE_TUNNEL
) {
2108 xisrlen
+= (sysdep_sa_len((struct sockaddr
*)iph2
->src
)
2109 + sysdep_sa_len((struct sockaddr
*)iph2
->dst
));
2112 policylen
+= PFKEY_ALIGN8(xisrlen
);
2116 /* make policy structure */
2117 policy
= racoon_malloc(policylen
);
2120 "buffer allocation failed.\n");
2124 xpl
= ALIGNED_CAST(struct sadb_x_policy
*)policy
;
2125 xpl
->sadb_x_policy_len
= PFKEY_UNIT64(policylen
);
2126 xpl
->sadb_x_policy_exttype
= SADB_X_EXT_POLICY
;
2127 xpl
->sadb_x_policy_type
= IPSEC_POLICY_IPSEC
;
2128 xpl
->sadb_x_policy_dir
= spidx
->dir
;
2129 xpl
->sadb_x_policy_id
= 0;
2130 #ifdef HAVE_PFKEY_POLICY_PRIORITY
2131 xpl
->sadb_x_policy_priority
= PRIORITY_DEFAULT
;
2134 /* no need to append policy information any more if type is SPDDELETE */
2135 if (type
== SADB_X_SPDDELETE
)
2138 xisr
= (struct sadb_x_ipsecrequest
*)(xpl
+ 1);
2140 for (pr
= iph2
->approval
->head
; pr
; pr
= pr
->next
) {
2142 satype
= doi2ipproto(pr
->proto_id
);
2145 "invalid proto_id %d\n", pr
->proto_id
);
2148 mode
= ipsecdoi2pfkey_mode(pr
->encmode
);
2151 "invalid encmode %d\n", pr
->encmode
);
2156 * the policy level cannot be unique because the policy
2157 * is defined later than SA, so req_id cannot be bound to SA.
2159 xisr
->sadb_x_ipsecrequest_proto
= satype
;
2160 xisr
->sadb_x_ipsecrequest_mode
= mode
;
2161 xisr
->sadb_x_ipsecrequest_level
= IPSEC_LEVEL_REQUIRE
;
2162 xisr
->sadb_x_ipsecrequest_reqid
= 0;
2163 p
= (caddr_t
)(xisr
+ 1);
2165 xisrlen
= sizeof(*xisr
);
2167 if (pr
->encmode
== IPSECDOI_ATTR_ENC_MODE_TUNNEL
) {
2168 int src_len
, dst_len
;
2170 src_len
= sysdep_sa_len((struct sockaddr
*)iph2
->src
);
2171 dst_len
= sysdep_sa_len((struct sockaddr
*)iph2
->dst
);
2172 xisrlen
+= src_len
+ dst_len
;
2174 memcpy(p
, iph2
->src
, src_len
);
2177 memcpy(p
, iph2
->dst
, dst_len
);
2181 xisr
->sadb_x_ipsecrequest_len
= PFKEY_ALIGN8(xisrlen
);
2186 *policylen0
= policylen
;
2192 racoon_free(policy
);
2198 pk_sendspdupdate2(iph2
)
2199 phase2_handle_t
*iph2
;
2201 struct policyindex
*spidx
= iph2
->spidx_gen
;
2202 caddr_t policy
= NULL
;
2204 u_int64_t ltime
, vtime
;
2206 ltime
= iph2
->approval
->lifetime
;
2209 if (getsadbpolicy(&policy
, &policylen
, SADB_X_SPDUPDATE
, iph2
)) {
2211 "getting sadb policy failed.\n");
2215 if (pfkey_send_spdupdate2(
2223 policy
, policylen
, 0) < 0) {
2225 "libipsec failed send spdupdate2 (%s)\n",
2229 plog(ASL_LEVEL_DEBUG
, "call pfkey_send_spdupdate2\n");
2233 racoon_free(policy
);
2239 pk_recvspdupdate(mhp
)
2242 struct sadb_address
*saddr
, *daddr
;
2243 struct sadb_x_policy
*xpl
;
2244 struct policyindex spidx
;
2245 struct secpolicy
*sp
;
2249 || mhp
[SADB_EXT_ADDRESS_SRC
] == NULL
2250 || mhp
[SADB_EXT_ADDRESS_DST
] == NULL
2251 || mhp
[SADB_X_EXT_POLICY
] == NULL
) {
2253 "inappropriate sadb spdupdate message passed.\n");
2256 saddr
= ALIGNED_CAST(struct sadb_address
*)mhp
[SADB_EXT_ADDRESS_SRC
]; // Wcast-align fix (void*) - mhp contains pointers to aligned structs in malloc'd msg buffer
2257 daddr
= ALIGNED_CAST(struct sadb_address
*)mhp
[SADB_EXT_ADDRESS_DST
];
2258 xpl
= ALIGNED_CAST(struct sadb_x_policy
*)mhp
[SADB_X_EXT_POLICY
];
2260 #ifdef HAVE_PFKEY_POLICY_PRIORITY
2261 KEY_SETSECSPIDX(xpl
->sadb_x_policy_dir
,
2264 saddr
->sadb_address_prefixlen
,
2265 daddr
->sadb_address_prefixlen
,
2266 saddr
->sadb_address_proto
,
2267 xpl
->sadb_x_policy_priority
,
2270 KEY_SETSECSPIDX(xpl
->sadb_x_policy_dir
,
2273 saddr
->sadb_address_prefixlen
,
2274 daddr
->sadb_address_prefixlen
,
2275 saddr
->sadb_address_proto
,
2282 "such policy does not already exist: \"%s\"\n",
2289 if (addnewsp(mhp
) < 0)
2296 * this function has to be used by responder side.
2299 pk_sendspdadd2(iph2
)
2300 phase2_handle_t
*iph2
;
2302 struct policyindex
*spidx
= iph2
->spidx_gen
;
2303 caddr_t policy
= NULL
;
2305 u_int64_t ltime
, vtime
;
2307 ltime
= iph2
->approval
->lifetime
;
2310 if (getsadbpolicy(&policy
, &policylen
, SADB_X_SPDADD
, iph2
)) {
2312 "getting sadb policy failed.\n");
2316 if (pfkey_send_spdadd2(
2324 policy
, policylen
, 0) < 0) {
2326 "libipsec failed send spdadd2 (%s)\n",
2330 plog(ASL_LEVEL_DEBUG
, "call pfkey_send_spdadd2\n");
2334 racoon_free(policy
);
2343 struct sadb_address
*saddr
, *daddr
;
2344 struct sadb_x_policy
*xpl
;
2345 struct policyindex spidx
;
2346 struct secpolicy
*sp
;
2350 || mhp
[SADB_EXT_ADDRESS_SRC
] == NULL
2351 || mhp
[SADB_EXT_ADDRESS_DST
] == NULL
2352 || mhp
[SADB_X_EXT_POLICY
] == NULL
) {
2354 "inappropriate sadb spdadd message passed.\n");
2357 saddr
= ALIGNED_CAST(struct sadb_address
*)mhp
[SADB_EXT_ADDRESS_SRC
]; // Wcast-align fix (void*) - mhp contains pointers to aligned structs in malloc'd msg buffer
2358 daddr
= ALIGNED_CAST(struct sadb_address
*)mhp
[SADB_EXT_ADDRESS_DST
];
2359 xpl
= ALIGNED_CAST(struct sadb_x_policy
*)mhp
[SADB_X_EXT_POLICY
];
2361 #ifdef HAVE_PFKEY_POLICY_PRIORITY
2362 KEY_SETSECSPIDX(xpl
->sadb_x_policy_dir
,
2365 saddr
->sadb_address_prefixlen
,
2366 daddr
->sadb_address_prefixlen
,
2367 saddr
->sadb_address_proto
,
2368 xpl
->sadb_x_policy_priority
,
2371 KEY_SETSECSPIDX(xpl
->sadb_x_policy_dir
,
2374 saddr
->sadb_address_prefixlen
,
2375 daddr
->sadb_address_prefixlen
,
2376 saddr
->sadb_address_proto
,
2383 "such policy already exists. "
2384 "anyway replace it: %s\n",
2390 if (addnewsp(mhp
) < 0)
2397 * this function has to be used by responder side.
2400 pk_sendspddelete(iph2
)
2401 phase2_handle_t
*iph2
;
2403 struct policyindex
*spidx
= iph2
->spidx_gen
;
2404 caddr_t policy
= NULL
;
2407 if (getsadbpolicy(&policy
, &policylen
, SADB_X_SPDDELETE
, iph2
)) {
2409 "getting sadb policy failed.\n");
2413 if (pfkey_send_spddelete(
2420 policy
, policylen
, 0) < 0) {
2422 "libipsec failed send spddelete (%s)\n",
2426 plog(ASL_LEVEL_DEBUG
, "call pfkey_send_spddelete\n");
2430 racoon_free(policy
);
2436 pk_recvspddelete(mhp
)
2439 struct sadb_address
*saddr
, *daddr
;
2440 struct sadb_x_policy
*xpl
;
2441 struct policyindex spidx
;
2442 struct secpolicy
*sp
;
2446 || mhp
[SADB_EXT_ADDRESS_SRC
] == NULL
2447 || mhp
[SADB_EXT_ADDRESS_DST
] == NULL
2448 || mhp
[SADB_X_EXT_POLICY
] == NULL
) {
2450 "inappropriate sadb spddelete message passed.\n");
2453 saddr
= ALIGNED_CAST(struct sadb_address
*)mhp
[SADB_EXT_ADDRESS_SRC
]; // Wcast-align fix (void*) - mhp contains pointers to aligned structs in malloc'd msg buffer
2454 daddr
= ALIGNED_CAST(struct sadb_address
*)mhp
[SADB_EXT_ADDRESS_DST
];
2455 xpl
= ALIGNED_CAST(struct sadb_x_policy
*)mhp
[SADB_X_EXT_POLICY
];
2457 #ifdef HAVE_PFKEY_POLICY_PRIORITY
2458 KEY_SETSECSPIDX(xpl
->sadb_x_policy_dir
,
2461 saddr
->sadb_address_prefixlen
,
2462 daddr
->sadb_address_prefixlen
,
2463 saddr
->sadb_address_proto
,
2464 xpl
->sadb_x_policy_priority
,
2467 KEY_SETSECSPIDX(xpl
->sadb_x_policy_dir
,
2470 saddr
->sadb_address_prefixlen
,
2471 daddr
->sadb_address_prefixlen
,
2472 saddr
->sadb_address_proto
,
2479 "no policy found: %s\n",
2484 ike_session_purgephXbyspid(xpl
->sadb_x_policy_id
, true);
2493 pk_recvspdexpire(mhp
)
2496 struct sadb_address
*saddr
, *daddr
;
2497 struct sadb_x_policy
*xpl
;
2498 struct policyindex spidx
;
2499 struct secpolicy
*sp
;
2503 || mhp
[SADB_EXT_ADDRESS_SRC
] == NULL
2504 || mhp
[SADB_EXT_ADDRESS_DST
] == NULL
2505 || mhp
[SADB_X_EXT_POLICY
] == NULL
) {
2507 "inappropriate sadb spdexpire message passed.\n");
2510 saddr
= ALIGNED_CAST(struct sadb_address
*)mhp
[SADB_EXT_ADDRESS_SRC
]; // Wcast-align fix (void*) - mhp contains pointers to aligned structs in malloc'd msg buffer
2511 daddr
= ALIGNED_CAST(struct sadb_address
*)mhp
[SADB_EXT_ADDRESS_DST
];
2512 xpl
= ALIGNED_CAST(struct sadb_x_policy
*)mhp
[SADB_X_EXT_POLICY
];
2514 #ifdef HAVE_PFKEY_POLICY_PRIORITY
2515 KEY_SETSECSPIDX(xpl
->sadb_x_policy_dir
,
2518 saddr
->sadb_address_prefixlen
,
2519 daddr
->sadb_address_prefixlen
,
2520 saddr
->sadb_address_proto
,
2521 xpl
->sadb_x_policy_priority
,
2524 KEY_SETSECSPIDX(xpl
->sadb_x_policy_dir
,
2527 saddr
->sadb_address_prefixlen
,
2528 daddr
->sadb_address_prefixlen
,
2529 saddr
->sadb_address_proto
,
2536 "no policy found: %s\n",
2541 ike_session_purgephXbyspid(xpl
->sadb_x_policy_id
, false);
2554 if (mhp
[0] == NULL
) {
2556 "inappropriate sadb spdget message passed.\n");
2567 struct sadb_msg
*msg
;
2568 struct sadb_address
*saddr
, *daddr
;
2569 struct sadb_x_policy
*xpl
;
2570 struct policyindex spidx
;
2571 struct secpolicy
*sp
;
2574 if (mhp
[0] == NULL
) {
2576 "inappropriate sadb spddump message passed.\n");
2579 msg
= ALIGNED_CAST(struct sadb_msg
*)mhp
[0]; // Wcast-align fix (void*) - mhp contains pointers to aligned structs in malloc'd msg buffer
2581 saddr
= ALIGNED_CAST(struct sadb_address
*)mhp
[SADB_EXT_ADDRESS_SRC
];
2582 daddr
= ALIGNED_CAST(struct sadb_address
*)mhp
[SADB_EXT_ADDRESS_DST
];
2583 xpl
= ALIGNED_CAST(struct sadb_x_policy
*)mhp
[SADB_X_EXT_POLICY
];
2585 if (saddr
== NULL
|| daddr
== NULL
|| xpl
== NULL
) {
2587 "inappropriate sadb spddump message passed.\n");
2591 #ifdef HAVE_PFKEY_POLICY_PRIORITY
2592 KEY_SETSECSPIDX(xpl
->sadb_x_policy_dir
,
2595 saddr
->sadb_address_prefixlen
,
2596 daddr
->sadb_address_prefixlen
,
2597 saddr
->sadb_address_proto
,
2598 xpl
->sadb_x_policy_priority
,
2601 KEY_SETSECSPIDX(xpl
->sadb_x_policy_dir
,
2604 saddr
->sadb_address_prefixlen
,
2605 daddr
->sadb_address_prefixlen
,
2606 saddr
->sadb_address_proto
,
2613 "such policy already exists. "
2614 "anyway replace it: %s\n",
2620 if (addnewsp(mhp
) < 0)
2627 pk_recvspdflush(mhp
)
2631 if (mhp
[0] == NULL
) {
2633 "inappropriate sadb spdflush message passed.\n");
2637 ike_session_flush_all_phase2(false);
2638 ike_session_flush_all_phase1(false);
2645 * send error against acquire message to kenrel.
2648 pk_sendeacquire(iph2
)
2649 phase2_handle_t
*iph2
;
2651 struct sadb_msg
*newmsg
;
2654 len
= sizeof(struct sadb_msg
);
2655 newmsg
= racoon_calloc(1, len
);
2656 if (newmsg
== NULL
) {
2658 "failed to get buffer to send acquire.\n");
2662 memset(newmsg
, 0, len
);
2663 newmsg
->sadb_msg_version
= PF_KEY_V2
;
2664 newmsg
->sadb_msg_type
= SADB_ACQUIRE
;
2665 newmsg
->sadb_msg_errno
= ENOENT
; /* XXX */
2666 newmsg
->sadb_msg_satype
= iph2
->satype
;
2667 newmsg
->sadb_msg_len
= PFKEY_UNIT64(len
);
2668 newmsg
->sadb_msg_reserved
= 0;
2669 newmsg
->sadb_msg_seq
= iph2
->seq
;
2670 newmsg
->sadb_msg_pid
= (u_int32_t
)getpid();
2673 len
= pfkey_send(lcconf
->sock_pfkey
, newmsg
, len
);
2675 racoon_free(newmsg
);
2681 pk_sendget_inbound_sastats(ike_session_t
*session
)
2683 u_int32_t max_stats
;
2687 plog(ASL_LEVEL_DEBUG
, "invalid args in %s \n", __FUNCTION__
);
2691 session
->traffic_monitor
.num_in_curr_req
= 0;
2692 bzero(session
->traffic_monitor
.in_curr_req
, sizeof(session
->traffic_monitor
.in_curr_req
));
2693 max_stats
= (sizeof(session
->traffic_monitor
.in_curr_req
) / sizeof(session
->traffic_monitor
.in_curr_req
[0]));
2696 if ((session
->traffic_monitor
.num_in_curr_req
= ike_session_get_sas_for_stats(session
,
2699 session
->traffic_monitor
.in_curr_req
,
2701 u_int64_t session_ids
[] = {(u_int64_t
)session
, 0};
2703 //plog(ASL_LEVEL_DEBUG, "about to call %s\n", __FUNCTION__);
2705 if (pfkey_send_getsastats(lcconf
->sock_pfkey
,
2710 session
->traffic_monitor
.in_curr_req
,
2711 session
->traffic_monitor
.num_in_curr_req
) < 0) {
2714 //plog(ASL_LEVEL_DEBUG, "%s successful\n", __FUNCTION__);
2716 return session
->traffic_monitor
.num_in_curr_req
;
2722 pk_sendget_outbound_sastats(ike_session_t
*session
)
2724 u_int32_t max_stats
;
2728 plog(ASL_LEVEL_DEBUG
, "invalid args in %s \n", __FUNCTION__
);
2732 session
->traffic_monitor
.num_out_curr_req
= 0;
2733 bzero(session
->traffic_monitor
.out_curr_req
, sizeof(session
->traffic_monitor
.out_curr_req
));
2734 max_stats
= (sizeof(session
->traffic_monitor
.out_curr_req
) / sizeof(session
->traffic_monitor
.out_curr_req
[0]));
2737 if ((session
->traffic_monitor
.num_out_curr_req
= ike_session_get_sas_for_stats(session
,
2740 session
->traffic_monitor
.out_curr_req
,
2742 u_int64_t session_ids
[] = {(u_int64_t
)session
, 0};
2744 //plog(ASL_LEVEL_DEBUG, "about to call %s\n", __FUNCTION__);
2746 if (pfkey_send_getsastats(lcconf
->sock_pfkey
,
2751 session
->traffic_monitor
.out_curr_req
,
2752 session
->traffic_monitor
.num_out_curr_req
) < 0) {
2755 //plog(ASL_LEVEL_DEBUG, "%s successful\n", __FUNCTION__);
2757 return session
->traffic_monitor
.num_out_curr_req
;
2763 * receive GETSPDSTAT from kernel.
2766 pk_recvgetsastat(mhp
)
2769 struct sadb_msg
*msg
;
2770 struct sadb_session_id
*session_id
;
2771 struct sadb_sastat
*stat_resp
;
2772 ike_session_t
*session
;
2774 /* validity check */
2775 if (mhp
[0] == NULL
||
2776 mhp
[SADB_EXT_SESSION_ID
] == NULL
||
2777 mhp
[SADB_EXT_SASTAT
] == NULL
) {
2779 "inappropriate sadb getsastat response.\n");
2782 msg
= ALIGNED_CAST(struct sadb_msg
*)mhp
[0]; // Wcast-align fix (void*) - mhp contains pointers to structs in an aligned buffer
2783 session_id
= ALIGNED_CAST(struct sadb_session_id
*)mhp
[SADB_EXT_SESSION_ID
];
2784 stat_resp
= ALIGNED_CAST(struct sadb_sastat
*)mhp
[SADB_EXT_SASTAT
];
2786 /* the message has to be processed or not ? */
2787 if (msg
->sadb_msg_pid
!= getpid()) {
2788 plog(ASL_LEVEL_DEBUG
,
2789 "%s message is not interesting "
2790 "because pid %d is not mine.\n",
2791 s_pfkey_type(msg
->sadb_msg_type
),
2795 if (!session_id
->sadb_session_id_v
[0]) {
2796 plog(ASL_LEVEL_DEBUG
,
2797 "%s message is bad "
2798 "because session-id[0] is invalid.\n",
2799 s_pfkey_type(msg
->sadb_msg_type
));
2802 session
= ALIGNED_CAST(__typeof__(session
))session_id
->sadb_session_id_v
[0];
2804 if (!stat_resp
->sadb_sastat_list_len
) {
2805 plog(ASL_LEVEL_DEBUG
,
2806 "%s message is bad "
2807 "because it has no sastats.\n",
2808 s_pfkey_type(msg
->sadb_msg_type
));
2812 ike_session_update_traffic_idle_status(session
,
2813 stat_resp
->sadb_sastat_dir
,
2814 (struct sastat
*)(stat_resp
+ 1),
2815 stat_resp
->sadb_sastat_list_len
);
2820 * check if the algorithm is supported or not.
2825 pk_checkalg(class, calg
, keylen
)
2826 int class, calg
, keylen
;
2830 struct sadb_alg alg0
;
2832 switch (algclass2doi(class)) {
2833 case IPSECDOI_PROTO_IPSEC_ESP
:
2834 sup
= SADB_EXT_SUPPORTED_ENCRYPT
;
2836 case IPSECDOI_ATTR_AUTH
:
2837 sup
= SADB_EXT_SUPPORTED_AUTH
;
2839 case IPSECDOI_PROTO_IPCOMP
:
2843 "invalid algorithm class.\n");
2846 alg
= ipsecdoi2pfkey_alg(algclass2doi(class), algtype2doi(class, calg
));
2851 if (ipsec_get_keylen(sup
, alg
, &alg0
)) {
2853 "%s.\n", ipsec_strerror());
2856 keylen
= alg0
.sadb_alg_minbits
;
2859 error
= ipsec_check_keylen(sup
, alg
, keylen
);
2862 "%s.\n", ipsec_strerror());
2868 * differences with pfkey_recv() in libipsec/pfkey.c:
2869 * - never performs busy wait loop.
2870 * - returns NULL and set *lenp to negative on fatal failures
2871 * - returns NULL and set *lenp to non-negative on non-fatal failures
2872 * - returns non-NULL on success
2874 static struct sadb_msg
*
2879 struct sadb_msg
*newmsg
;
2881 socklen_t optlen
= sizeof(reallen
);
2883 if (getsockopt(so
, SOL_SOCKET
, SO_NREAD
, &reallen
, &optlen
) < 0)
2884 return NULL
; /*fatal*/
2889 if ((newmsg
= racoon_calloc(1, reallen
)) == NULL
)
2892 while ((*lenp
= recv(so
, (caddr_t
)newmsg
, reallen
, 0)) < 0) {
2895 plog(ASL_LEVEL_ERR
, "failed to recv pfkey message: %s\n", strerror(errno
));
2899 racoon_free(newmsg
);
2900 return NULL
; /*fatal*/
2901 } else if (*lenp
!= reallen
|| *lenp
< sizeof(struct sadb_msg
)) {
2902 racoon_free(newmsg
);
2913 return eay_random();
2920 struct secpolicy
*new;
2921 struct sadb_address
*saddr
, *daddr
;
2922 struct sadb_x_policy
*xpl
;
2923 struct sadb_ext
*ext
;
2926 if (mhp
[SADB_EXT_ADDRESS_SRC
] == NULL
2927 || mhp
[SADB_EXT_ADDRESS_DST
] == NULL
2928 || mhp
[SADB_X_EXT_POLICY
] == NULL
) {
2930 "inappropriate sadb spd management message passed.\n");
2934 saddr
= ALIGNED_CAST(struct sadb_address
*)mhp
[SADB_EXT_ADDRESS_SRC
]; // Wcast-align fix (void*) - mhp contains pointers to aligned structs in malloc'd msg buffer
2935 daddr
= ALIGNED_CAST(struct sadb_address
*)mhp
[SADB_EXT_ADDRESS_DST
];
2937 xpl
= ALIGNED_CAST(struct sadb_x_policy
*)mhp
[SADB_X_EXT_POLICY
];
2938 /* validity check */
2939 if (PFKEY_EXTLEN(xpl
) < sizeof(*xpl
)) {
2941 "invalid msg length.\n");
2948 "failed to allocate buffer\n");
2952 new->spidx
.dir
= xpl
->sadb_x_policy_dir
;
2953 new->id
= xpl
->sadb_x_policy_id
;
2954 new->policy
= xpl
->sadb_x_policy_type
;
2958 switch (xpl
->sadb_x_policy_type
) {
2959 case IPSEC_POLICY_DISCARD
:
2960 case IPSEC_POLICY_GENERATE
:
2961 case IPSEC_POLICY_NONE
:
2962 case IPSEC_POLICY_ENTRUST
:
2963 case IPSEC_POLICY_BYPASS
:
2966 case IPSEC_POLICY_IPSEC
:
2969 struct sadb_x_ipsecrequest
*xisr
;
2970 struct ipsecrequest
**p_isr
= &new->req
;
2972 tlen
= PFKEY_EXTLEN(xpl
) - sizeof(*xpl
);
2973 xisr
= (struct sadb_x_ipsecrequest
*)(xpl
+ 1);
2976 if (tlen
< sizeof(*xisr
) ||
2977 tlen
< xisr
->sadb_x_ipsecrequest_len
) {
2979 "invalid msg length for ipsec request.\n");
2984 if (xisr
->sadb_x_ipsecrequest_len
< sizeof(*xisr
)) {
2986 "invalid msg length.\n");
2990 /* allocate request buffer */
2991 *p_isr
= newipsecreq();
2992 if (*p_isr
== NULL
) {
2994 "failed to get new ipsecreq.\n");
2999 (*p_isr
)->next
= NULL
;
3001 switch (xisr
->sadb_x_ipsecrequest_proto
) {
3004 case IPPROTO_IPCOMP
:
3008 "invalid proto type: %u\n",
3009 xisr
->sadb_x_ipsecrequest_proto
);
3012 (*p_isr
)->saidx
.proto
= xisr
->sadb_x_ipsecrequest_proto
;
3014 switch (xisr
->sadb_x_ipsecrequest_mode
) {
3015 case IPSEC_MODE_TRANSPORT
:
3016 case IPSEC_MODE_TUNNEL
:
3018 case IPSEC_MODE_ANY
:
3021 "invalid mode: %u\n",
3022 xisr
->sadb_x_ipsecrequest_mode
);
3025 (*p_isr
)->saidx
.mode
= xisr
->sadb_x_ipsecrequest_mode
;
3027 switch (xisr
->sadb_x_ipsecrequest_level
) {
3028 case IPSEC_LEVEL_DEFAULT
:
3029 case IPSEC_LEVEL_USE
:
3030 case IPSEC_LEVEL_REQUIRE
:
3032 case IPSEC_LEVEL_UNIQUE
:
3033 (*p_isr
)->saidx
.reqid
=
3034 xisr
->sadb_x_ipsecrequest_reqid
;
3039 "invalid level: %u\n",
3040 xisr
->sadb_x_ipsecrequest_level
);
3043 (*p_isr
)->level
= xisr
->sadb_x_ipsecrequest_level
;
3045 /* set IP addresses if there */
3046 if (xisr
->sadb_x_ipsecrequest_len
> sizeof(*xisr
)) {
3047 struct sockaddr
*paddr
;
3048 int rem_buf_len
= xisr
->sadb_x_ipsecrequest_len
- sizeof(*xisr
);
3050 paddr
= (struct sockaddr
*)(xisr
+ 1);
3051 if (rem_buf_len
< sizeof(*paddr
) ||
3052 rem_buf_len
< sysdep_sa_len(paddr
)) {
3054 "invalid msg length for src ip address.\n");
3057 bcopy(paddr
, &(*p_isr
)->saidx
.src
,
3058 sysdep_sa_len(paddr
));
3060 rem_buf_len
-= sysdep_sa_len(paddr
);
3062 paddr
= (struct sockaddr
*)((caddr_t
)paddr
3063 + sysdep_sa_len(paddr
));
3064 if (rem_buf_len
< sizeof(*paddr
) ||
3065 rem_buf_len
< sysdep_sa_len(paddr
)) {
3067 "invalid msg length for dst ip address.\n");
3070 bcopy(paddr
, &(*p_isr
)->saidx
.dst
,
3071 sysdep_sa_len(paddr
));
3076 /* initialization for the next. */
3077 p_isr
= &(*p_isr
)->next
;
3078 tlen
-= xisr
->sadb_x_ipsecrequest_len
;
3080 /* validity check */
3083 "becoming tlen < 0\n");
3086 xisr
= ALIGNED_CAST(struct sadb_x_ipsecrequest
*)((caddr_t
)xisr
3087 + xisr
->sadb_x_ipsecrequest_len
);
3093 "invalid policy type.\n");
3098 #ifdef HAVE_PFKEY_POLICY_PRIORITY
3099 KEY_SETSECSPIDX(xpl
->sadb_x_policy_dir
,
3102 saddr
->sadb_address_prefixlen
,
3103 daddr
->sadb_address_prefixlen
,
3104 saddr
->sadb_address_proto
,
3105 xpl
->sadb_x_policy_priority
,
3108 KEY_SETSECSPIDX(xpl
->sadb_x_policy_dir
,
3111 saddr
->sadb_address_prefixlen
,
3112 daddr
->sadb_address_prefixlen
,
3113 saddr
->sadb_address_proto
,
3122 /* proto/mode/src->dst spi */
3124 sadbsecas2str(src
, dst
, proto
, spi
, mode
)
3125 struct sockaddr_storage
*src
, *dst
;
3130 static char buf
[256];
3131 u_int doi_proto
, doi_mode
= 0;
3135 doi_proto
= pfkey2ipsecdoi_proto(proto
);
3136 if (doi_proto
== ~0)
3139 doi_mode
= pfkey2ipsecdoi_mode(mode
);
3144 blen
= sizeof(buf
) - 1;
3147 i
= snprintf(p
, blen
, "%s%s%s ",
3148 s_ipsecdoi_proto(doi_proto
),
3150 mode
? s_ipsecdoi_encmode(doi_mode
) : "");
3151 if (i
< 0 || i
>= blen
)
3156 i
= snprintf(p
, blen
, "%s->", saddr2str((struct sockaddr
*)src
));
3157 if (i
< 0 || i
>= blen
)
3162 i
= snprintf(p
, blen
, "%s ", saddr2str((struct sockaddr
*)dst
));
3163 if (i
< 0 || i
>= blen
)
3169 snprintf(p
, blen
, "spi=%lu(0x%lx)", (unsigned long)ntohl(spi
),
3170 (unsigned long)ntohl(spi
));