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
43 #include <netinet/in.h>
44 #include <arpa/inet.h>
48 # include <linux/udp.h>
50 # if defined(__NetBSD__) || defined(__FreeBSD__)
51 # include <netinet/udp.h>
55 #include <sys/types.h>
56 #include <sys/param.h>
57 #include <sys/socket.h>
58 #include <sys/queue.h>
59 #include <sys/sysctl.h>
61 #include <net/route.h>
63 #include <System/net/pfkeyv2.h>
65 #include <net/pfkeyv2.h>
68 #include <netinet/in.h>
69 #ifndef HAVE_NETINET6_IPSEC
70 #include <netinet/ipsec.h>
72 #include <netinet6/ipsec.h>
85 #include "localconf.h"
86 #include "remoteconf.h"
87 #include "isakmp_var.h"
89 #include "isakmp_inf.h"
90 #include "ipsec_doi.h"
95 #include "algorithm.h"
100 #include "strnames.h"
101 #include "backupsa.h"
102 #include "gcmalloc.h"
103 #include "nattraversal.h"
104 #include "crypto_openssl.h"
105 #include "grabmyaddr.h"
106 #include "vpn_control.h"
107 #include "vpn_control_var.h"
109 #if defined(SADB_X_EALG_RIJNDAELCBC) && !defined(SADB_X_EALG_AESCBC)
110 #define SADB_X_EALG_AESCBC SADB_X_EALG_RIJNDAELCBC
114 static u_int ipsecdoi2pfkey_aalg
__P((u_int
));
115 static u_int ipsecdoi2pfkey_ealg
__P((u_int
));
116 static u_int ipsecdoi2pfkey_calg
__P((u_int
));
117 static u_int ipsecdoi2pfkey_alg
__P((u_int
, u_int
));
118 static u_int keylen_aalg
__P((u_int
));
119 static u_int keylen_ealg
__P((u_int
, int));
121 static int pk_recvgetspi
__P((caddr_t
*));
122 static int pk_recvupdate
__P((caddr_t
*));
123 static int pk_recvadd
__P((caddr_t
*));
124 static int pk_recvdelete
__P((caddr_t
*));
125 static int pk_recvacquire
__P((caddr_t
*));
126 static int pk_recvexpire
__P((caddr_t
*));
127 static int pk_recvflush
__P((caddr_t
*));
128 static int getsadbpolicy
__P((caddr_t
*, int *, int, struct ph2handle
*));
129 static int pk_recvspdupdate
__P((caddr_t
*));
130 static int pk_recvspdadd
__P((caddr_t
*));
131 static int pk_recvspddelete
__P((caddr_t
*));
132 static int pk_recvspdexpire
__P((caddr_t
*));
133 static int pk_recvspdget
__P((caddr_t
*));
134 static int pk_recvspddump
__P((caddr_t
*));
135 static int pk_recvspdflush
__P((caddr_t
*));
136 static struct sadb_msg
*pk_recv
__P((int, int *));
138 static int (*pkrecvf
[]) __P((caddr_t
*)) = {
146 NULL
, /* SABD_REGISTER */
149 NULL
, /* SADB_DUMP */
150 NULL
, /* SADB_X_PROMISC */
151 NULL
, /* SADB_X_PCHANGE */
156 NULL
, /* SADB_X_SPDACQUIRE */
159 NULL
, /* SADB_X_SPDSETIDX */
161 NULL
, /* SADB_X_SPDDELETE2 */
162 NULL
, /* SADB_X_NAT_T_NEW_MAPPING */
163 NULL
, /* SADB_X_MIGRATE */
165 #error "SADB extra message?"
169 static int addnewsp
__P((caddr_t
*));
171 /* cope with old kame headers - ugly */
172 #ifndef SADB_X_AALG_MD5
173 #define SADB_X_AALG_MD5 SADB_AALG_MD5
175 #ifndef SADB_X_AALG_SHA
176 #define SADB_X_AALG_SHA SADB_AALG_SHA
178 #ifndef SADB_X_AALG_NULL
179 #define SADB_X_AALG_NULL SADB_AALG_NULL
182 #ifndef SADB_X_EALG_BLOWFISHCBC
183 #define SADB_X_EALG_BLOWFISHCBC SADB_EALG_BLOWFISHCBC
185 #ifndef SADB_X_EALG_CAST128CBC
186 #define SADB_X_EALG_CAST128CBC SADB_EALG_CAST128CBC
188 #ifndef SADB_X_EALG_RC5CBC
189 #ifdef SADB_EALG_RC5CBC
190 #define SADB_X_EALG_RC5CBC SADB_EALG_RC5CBC
197 struct sadb_msg
*msg
;
199 caddr_t mhp
[SADB_EXT_MAX
+ 1];
202 plog(LLV_DEBUG
, LOCATION
, NULL
, "get pfkey %s message\n",
203 s_pfkey_type(msg
->sadb_msg_type
));
204 plogdump(LLV_DEBUG2
, msg
, msg
->sadb_msg_len
<< 3);
207 if (msg
->sadb_msg_errno
) {
210 /* when SPD is empty, treat the state as no error. */
211 if (msg
->sadb_msg_type
== SADB_X_SPDDUMP
&&
212 msg
->sadb_msg_errno
== ENOENT
)
217 plog(pri
, LOCATION
, NULL
,
218 "pfkey %s failed: %s\n",
219 s_pfkey_type(msg
->sadb_msg_type
),
220 strerror(msg
->sadb_msg_errno
));
225 /* check pfkey message. */
226 if (pfkey_align(msg
, mhp
)) {
227 plog(LLV_ERROR
, LOCATION
, NULL
,
228 "libipsec failed pfkey align (%s)\n",
232 if (pfkey_check(mhp
)) {
233 plog(LLV_ERROR
, LOCATION
, NULL
,
234 "libipsec failed pfkey check (%s)\n",
238 msg
= (struct sadb_msg
*)mhp
[0];
241 if (msg
->sadb_msg_type
>= ARRAYLEN(pkrecvf
)) {
242 plog(LLV_ERROR
, LOCATION
, NULL
,
243 "unknown PF_KEY message type=%u\n",
248 if (pkrecvf
[msg
->sadb_msg_type
] == NULL
) {
249 plog(LLV_INFO
, LOCATION
, NULL
,
250 "unsupported PF_KEY message %s\n",
251 s_pfkey_type(msg
->sadb_msg_type
));
255 if ((pkrecvf
[msg
->sadb_msg_type
])(mhp
) < 0)
266 * PF_KEY packet handler
273 struct sadb_msg
*msg
;
276 /* receive pfkey message. */
278 msg
= (struct sadb_msg
*)pk_recv(lcconf
->sock_pfkey
, &len
);
281 plog(LLV_ERROR
, LOCATION
, NULL
,
282 "failed to recv from pfkey (%s)\n",
286 /* short message - msg not ready */
290 return pfkey_process(msg
);
296 struct saved_msg_elem
*elem
;
297 struct saved_msg_elem
*elem_tmp
= NULL
;
299 TAILQ_FOREACH_SAFE(elem
, &lcconf
->saved_msg_queue
, chain
, elem_tmp
) {
300 pfkey_process((struct sadb_msg
*)elem
->msg
);
301 TAILQ_REMOVE(&lcconf
->saved_msg_queue
, elem
, chain
);
309 struct sadb_msg
*msg
;
311 struct saved_msg_elem
*elem
;
313 elem
= (struct saved_msg_elem
*)racoon_calloc(sizeof(struct saved_msg_elem
), 1);
317 TAILQ_INSERT_TAIL(&lcconf
->saved_msg_queue
, elem
, chain
);
325 pfkey_dump_sadb(satype
)
330 pid_t pid
= getpid();
331 struct sadb_msg
*msg
= NULL
;
335 if ((s
= privsep_pfkey_open()) < 0) {
336 plog(LLV_ERROR
, LOCATION
, NULL
,
337 "libipsec failed pfkey open: %s\n",
342 plog(LLV_DEBUG
, LOCATION
, NULL
, "call pfkey_send_dump\n");
343 if (pfkey_send_dump(s
, satype
) < 0) {
344 plog(LLV_ERROR
, LOCATION
, NULL
,
345 "libipsec failed dump: %s\n", ipsec_strerror());
352 msg
= pk_recv(s
, &len
);
360 if (msg
->sadb_msg_pid
!= pid
)
364 * for multi-processor system this had to be added because the messages can
365 * be interleaved - they won't all be dump messages
367 if (msg
->sadb_msg_type
!= SADB_DUMP
) { /* save for later processing */
373 ml
= msg
->sadb_msg_len
<< 3;
374 bl
= buf
? buf
->l
: 0;
375 buf
= vrealloc(buf
, bl
+ ml
);
377 plog(LLV_ERROR
, LOCATION
, NULL
,
378 "failed to reallocate buffer to dump.\n");
381 memcpy(buf
->v
+ bl
, msg
, ml
);
383 if (msg
->sadb_msg_seq
== 0)
396 privsep_pfkey_close(s
);
400 #ifdef ENABLE_ADMINPORT
405 pfkey_flush_sadb(proto
)
410 /* convert to SADB_SATYPE */
411 if ((satype
= admin2pfkey_proto(proto
)) < 0)
414 plog(LLV_DEBUG
, LOCATION
, NULL
, "call pfkey_send_flush\n");
415 if (pfkey_send_flush(lcconf
->sock_pfkey
, satype
) < 0) {
416 plog(LLV_ERROR
, LOCATION
, NULL
,
417 "libipsec failed send flush (%s)\n", ipsec_strerror());
426 * These are the SATYPEs that we manage. We register to get
427 * PF_KEY messages related to these SATYPEs, and we also use
428 * this list to determine which SATYPEs to delete SAs for when
429 * we receive an INITIAL-CONTACT.
431 const struct pfkey_satype pfkey_satypes
[] = {
432 { SADB_SATYPE_AH
, "AH" },
433 { SADB_SATYPE_ESP
, "ESP" },
434 { SADB_X_SATYPE_IPCOMP
, "IPCOMP" },
436 const int pfkey_nsatypes
=
437 sizeof(pfkey_satypes
) / sizeof(pfkey_satypes
[0]);
440 * PF_KEY initialization
447 if ((lcconf
->sock_pfkey
= privsep_pfkey_open()) < 0) {
448 plog(LLV_ERROR
, LOCATION
, NULL
,
449 "libipsec failed pfkey open (%s)\n", ipsec_strerror());
453 for (i
= 0, reg_fail
= 0; i
< pfkey_nsatypes
; i
++) {
454 plog(LLV_DEBUG
, LOCATION
, NULL
,
455 "call pfkey_send_register for %s\n",
456 pfkey_satypes
[i
].ps_name
);
457 if (pfkey_send_register(lcconf
->sock_pfkey
,
458 pfkey_satypes
[i
].ps_satype
) < 0 ||
459 pfkey_recv_register(lcconf
->sock_pfkey
) < 0) {
460 plog(LLV_WARNING
, LOCATION
, NULL
,
461 "failed to register %s (%s)\n",
462 pfkey_satypes
[i
].ps_name
,
468 if (reg_fail
== pfkey_nsatypes
) {
469 plog(LLV_ERROR
, LOCATION
, NULL
,
470 "failed to regist any protocol.\n");
471 pfkey_close(lcconf
->sock_pfkey
);
477 if (pfkey_send_spddump(lcconf
->sock_pfkey
) < 0) {
478 plog(LLV_ERROR
, LOCATION
, NULL
,
479 "libipsec sending spddump failed: %s\n",
481 pfkey_close(lcconf
->sock_pfkey
);
485 if (pfkey_promisc_toggle(1) < 0) {
486 pfkey_close(lcconf
->sock_pfkey
);
493 /* %%% for conversion */
494 /* IPSECDOI_ATTR_AUTH -> SADB_AALG */
496 ipsecdoi2pfkey_aalg(hashtype
)
500 case IPSECDOI_ATTR_AUTH_HMAC_MD5
:
501 return SADB_AALG_MD5HMAC
;
502 case IPSECDOI_ATTR_AUTH_HMAC_SHA1
:
503 return SADB_AALG_SHA1HMAC
;
504 case IPSECDOI_ATTR_AUTH_HMAC_SHA2_256
:
505 #if (defined SADB_X_AALG_SHA2_256) && !defined(SADB_X_AALG_SHA2_256HMAC)
506 return SADB_X_AALG_SHA2_256
;
508 return SADB_X_AALG_SHA2_256HMAC
;
510 case IPSECDOI_ATTR_AUTH_HMAC_SHA2_384
:
511 #if (defined SADB_X_AALG_SHA2_384) && !defined(SADB_X_AALG_SHA2_384HMAC)
512 return SADB_X_AALG_SHA2_384
;
514 return SADB_X_AALG_SHA2_384HMAC
;
516 case IPSECDOI_ATTR_AUTH_HMAC_SHA2_512
:
517 #if (defined SADB_X_AALG_SHA2_512) && !defined(SADB_X_AALG_SHA2_512HMAC)
518 return SADB_X_AALG_SHA2_512
;
520 return SADB_X_AALG_SHA2_512HMAC
;
522 case IPSECDOI_ATTR_AUTH_KPDK
: /* need special care */
523 return SADB_AALG_NONE
;
526 case IPSECDOI_ATTR_AUTH_DES_MAC
:
527 plog(LLV_ERROR
, LOCATION
, NULL
,
528 "Not supported hash type: %u\n", hashtype
);
531 case 0: /* reserved */
533 return SADB_AALG_NONE
;
535 plog(LLV_ERROR
, LOCATION
, NULL
,
536 "Invalid hash type: %u\n", hashtype
);
542 /* IPSECDOI_ESP -> SADB_EALG */
544 ipsecdoi2pfkey_ealg(t_id
)
548 case IPSECDOI_ESP_DES_IV64
: /* sa_flags |= SADB_X_EXT_OLD */
549 return SADB_EALG_DESCBC
;
550 case IPSECDOI_ESP_DES
:
551 return SADB_EALG_DESCBC
;
552 case IPSECDOI_ESP_3DES
:
553 return SADB_EALG_3DESCBC
;
554 #ifdef SADB_X_EALG_RC5CBC
555 case IPSECDOI_ESP_RC5
:
556 return SADB_X_EALG_RC5CBC
;
558 case IPSECDOI_ESP_CAST
:
559 return SADB_X_EALG_CAST128CBC
;
560 case IPSECDOI_ESP_BLOWFISH
:
561 return SADB_X_EALG_BLOWFISHCBC
;
562 case IPSECDOI_ESP_DES_IV32
: /* flags |= (SADB_X_EXT_OLD|
564 return SADB_EALG_DESCBC
;
565 case IPSECDOI_ESP_NULL
:
566 return SADB_EALG_NULL
;
567 #ifdef SADB_X_EALG_AESCBC
568 case IPSECDOI_ESP_AES
:
569 return SADB_X_EALG_AESCBC
;
571 #ifdef SADB_X_EALG_TWOFISHCBC
572 case IPSECDOI_ESP_TWOFISH
:
573 return SADB_X_EALG_TWOFISHCBC
;
577 case IPSECDOI_ESP_3IDEA
:
578 case IPSECDOI_ESP_IDEA
:
579 case IPSECDOI_ESP_RC4
:
580 plog(LLV_ERROR
, LOCATION
, NULL
,
581 "Not supported transform: %u\n", t_id
);
584 case 0: /* reserved */
586 plog(LLV_ERROR
, LOCATION
, NULL
,
587 "Invalid transform id: %u\n", t_id
);
593 /* IPCOMP -> SADB_CALG */
595 ipsecdoi2pfkey_calg(t_id
)
599 case IPSECDOI_IPCOMP_OUI
:
600 return SADB_X_CALG_OUI
;
601 case IPSECDOI_IPCOMP_DEFLATE
:
602 return SADB_X_CALG_DEFLATE
;
603 case IPSECDOI_IPCOMP_LZS
:
604 return SADB_X_CALG_LZS
;
606 case 0: /* reserved */
608 plog(LLV_ERROR
, LOCATION
, NULL
,
609 "Invalid transform id: %u\n", t_id
);
615 /* IPSECDOI_PROTO -> SADB_SATYPE */
617 ipsecdoi2pfkey_proto(proto
)
621 case IPSECDOI_PROTO_IPSEC_AH
:
622 return SADB_SATYPE_AH
;
623 case IPSECDOI_PROTO_IPSEC_ESP
:
624 return SADB_SATYPE_ESP
;
625 case IPSECDOI_PROTO_IPCOMP
:
626 return SADB_X_SATYPE_IPCOMP
;
629 plog(LLV_ERROR
, LOCATION
, NULL
,
630 "Invalid ipsec_doi proto: %u\n", proto
);
637 ipsecdoi2pfkey_alg(algclass
, type
)
638 u_int algclass
, type
;
641 case IPSECDOI_ATTR_AUTH
:
642 return ipsecdoi2pfkey_aalg(type
);
643 case IPSECDOI_PROTO_IPSEC_ESP
:
644 return ipsecdoi2pfkey_ealg(type
);
645 case IPSECDOI_PROTO_IPCOMP
:
646 return ipsecdoi2pfkey_calg(type
);
648 plog(LLV_ERROR
, LOCATION
, NULL
,
649 "Invalid ipsec_doi algclass: %u\n", algclass
);
655 /* SADB_SATYPE -> IPSECDOI_PROTO */
657 pfkey2ipsecdoi_proto(satype
)
662 return IPSECDOI_PROTO_IPSEC_AH
;
663 case SADB_SATYPE_ESP
:
664 return IPSECDOI_PROTO_IPSEC_ESP
;
665 case SADB_X_SATYPE_IPCOMP
:
666 return IPSECDOI_PROTO_IPCOMP
;
669 plog(LLV_ERROR
, LOCATION
, NULL
,
670 "Invalid pfkey proto: %u\n", satype
);
676 /* IPSECDOI_ATTR_ENC_MODE -> IPSEC_MODE */
678 ipsecdoi2pfkey_mode(mode
)
682 case IPSECDOI_ATTR_ENC_MODE_TUNNEL
:
684 case IPSECDOI_ATTR_ENC_MODE_UDPTUNNEL_RFC
:
685 case IPSECDOI_ATTR_ENC_MODE_UDPTUNNEL_DRAFT
:
687 return IPSEC_MODE_TUNNEL
;
688 case IPSECDOI_ATTR_ENC_MODE_TRNS
:
690 case IPSECDOI_ATTR_ENC_MODE_UDPTRNS_RFC
:
691 case IPSECDOI_ATTR_ENC_MODE_UDPTRNS_DRAFT
:
693 return IPSEC_MODE_TRANSPORT
;
695 plog(LLV_ERROR
, LOCATION
, NULL
, "Invalid mode type: %u\n", mode
);
701 /* IPSECDOI_ATTR_ENC_MODE -> IPSEC_MODE */
703 pfkey2ipsecdoi_mode(mode
)
707 case IPSEC_MODE_TUNNEL
:
708 return IPSECDOI_ATTR_ENC_MODE_TUNNEL
;
709 case IPSEC_MODE_TRANSPORT
:
710 return IPSECDOI_ATTR_ENC_MODE_TRNS
;
712 return IPSECDOI_ATTR_ENC_MODE_ANY
;
714 plog(LLV_ERROR
, LOCATION
, NULL
, "Invalid mode type: %u\n", mode
);
720 /* default key length for encryption algorithm */
722 keylen_aalg(hashtype
)
728 return SADB_AALG_NONE
;
730 res
= alg_ipsec_hmacdef_hashlen(hashtype
);
732 plog(LLV_ERROR
, LOCATION
, NULL
,
733 "invalid hmac algorithm %u.\n", hashtype
);
739 /* default key length for encryption algorithm */
741 keylen_ealg(enctype
, encklen
)
747 res
= alg_ipsec_encdef_keylen(enctype
, encklen
);
749 plog(LLV_ERROR
, LOCATION
, NULL
,
750 "invalid encryption algorithm %u.\n", enctype
);
757 pfkey_convertfromipsecdoi(proto_id
, t_id
, hashtype
,
758 e_type
, e_keylen
, a_type
, a_keylen
, flags
)
770 case IPSECDOI_PROTO_IPSEC_ESP
:
771 if ((*e_type
= ipsecdoi2pfkey_ealg(t_id
)) == ~0)
773 if ((*e_keylen
= keylen_ealg(t_id
, *e_keylen
)) == ~0)
777 if ((*a_type
= ipsecdoi2pfkey_aalg(hashtype
)) == ~0)
779 if ((*a_keylen
= keylen_aalg(hashtype
)) == ~0)
783 if (*e_type
== SADB_EALG_NONE
) {
784 plog(LLV_ERROR
, LOCATION
, NULL
, "no ESP algorithm.\n");
789 case IPSECDOI_PROTO_IPSEC_AH
:
790 if ((*a_type
= ipsecdoi2pfkey_aalg(hashtype
)) == ~0)
792 if ((*a_keylen
= keylen_aalg(hashtype
)) == ~0)
796 if (t_id
== IPSECDOI_ATTR_AUTH_HMAC_MD5
797 && hashtype
== IPSECDOI_ATTR_AUTH_KPDK
) {
798 /* AH_MD5 + Auth(KPDK) = RFC1826 keyed-MD5 */
799 *a_type
= SADB_X_AALG_MD5
;
800 *flags
|= SADB_X_EXT_OLD
;
802 *e_type
= SADB_EALG_NONE
;
804 if (*a_type
== SADB_AALG_NONE
) {
805 plog(LLV_ERROR
, LOCATION
, NULL
, "no AH algorithm.\n");
810 case IPSECDOI_PROTO_IPCOMP
:
811 if ((*e_type
= ipsecdoi2pfkey_calg(t_id
)) == ~0)
815 *flags
= SADB_X_EXT_RAWCPI
;
817 *a_type
= SADB_AALG_NONE
;
819 if (*e_type
== SADB_X_CALG_NONE
) {
820 plog(LLV_ERROR
, LOCATION
, NULL
, "no IPCOMP algorithm.\n");
826 plog(LLV_ERROR
, LOCATION
, NULL
, "unknown IPsec protocol.\n");
837 /* called from scheduler */
839 pfkey_timeover_stub(p
)
843 pfkey_timeover((struct ph2handle
*)p
);
848 struct ph2handle
*iph2
;
850 plog(LLV_ERROR
, LOCATION
, NULL
,
851 "%s give up to get IPsec-SA due to time up to wait.\n",
852 saddrwop2str(iph2
->dst
));
853 SCHED_KILL(iph2
->sce
);
855 /* If initiator side, send error to kernel by SADB_ACQUIRE. */
856 if (iph2
->side
== INITIATOR
)
857 pk_sendeacquire(iph2
);
867 /* send getspi message per ipsec protocol per remote address */
869 * the local address and remote address in ph1handle are dealed
870 * with destination address and source address respectively.
871 * Because SPI is decided by responder.
875 struct ph2handle
*iph2
;
877 struct sockaddr
*src
= NULL
, *dst
= NULL
;
881 u_int32_t minspi
, maxspi
;
884 if (iph2
->side
== INITIATOR
) {
886 proxy
= iph2
->ph1
->rmconf
->support_proxy
;
889 if (iph2
->sainfo
&& iph2
->sainfo
->id_i
)
893 /* for mobile IPv6 */
894 if (proxy
&& iph2
->src_id
&& iph2
->dst_id
&&
895 ipsecdoi_transportmode(pp
)) {
903 for (pr
= pp
->head
; pr
!= NULL
; pr
= pr
->next
) {
906 satype
= ipsecdoi2pfkey_proto(pr
->proto_id
);
908 plog(LLV_ERROR
, LOCATION
, NULL
,
909 "invalid proto_id %d\n", pr
->proto_id
);
912 /* this works around a bug in Linux kernel where it allocates 4 byte
914 else if (satype
== SADB_X_SATYPE_IPCOMP
) {
922 mode
= ipsecdoi2pfkey_mode(pr
->encmode
);
924 plog(LLV_ERROR
, LOCATION
, NULL
,
925 "invalid encmode %d\n", pr
->encmode
);
929 plog(LLV_DEBUG
, LOCATION
, NULL
, "call pfkey_send_getspi\n");
930 if (pfkey_send_getspi(
937 pr
->reqid_in
, iph2
->seq
) < 0) {
938 plog(LLV_ERROR
, LOCATION
, NULL
,
939 "ipseclib failed send getspi (%s)\n",
943 plog(LLV_DEBUG
, LOCATION
, NULL
,
944 "pfkey GETSPI sent: %s\n",
945 sadbsecas2str(dst
, src
, satype
, 0, mode
));
952 * receive GETSPI from kernel.
958 struct sadb_msg
*msg
;
960 struct ph2handle
*iph2
;
961 struct sockaddr
*dst
;
963 int allspiok
, notfound
;
968 if (mhp
[SADB_EXT_SA
] == NULL
969 || mhp
[SADB_EXT_ADDRESS_DST
] == NULL
) {
970 plog(LLV_ERROR
, LOCATION
, NULL
,
971 "inappropriate sadb getspi message passed.\n");
974 msg
= (struct sadb_msg
*)mhp
[0];
975 sa
= (struct sadb_sa
*)mhp
[SADB_EXT_SA
];
976 dst
= PFKEY_ADDR_SADDR(mhp
[SADB_EXT_ADDRESS_SRC
]); /* note SA dir */
978 /* the message has to be processed or not ? */
979 if (msg
->sadb_msg_pid
!= getpid()) {
980 plog(LLV_DEBUG
, LOCATION
, NULL
,
981 "%s message is not interesting "
982 "because pid %d is not mine.\n",
983 s_pfkey_type(msg
->sadb_msg_type
),
988 iph2
= getph2byseq(msg
->sadb_msg_seq
);
990 plog(LLV_DEBUG
, LOCATION
, NULL
,
991 "seq %d of %s message not interesting.\n",
993 s_pfkey_type(msg
->sadb_msg_type
));
997 if (iph2
->status
!= PHASE2ST_GETSPISENT
) {
998 plog(LLV_ERROR
, LOCATION
, NULL
,
999 "status mismatch (db:%d msg:%d)\n",
1000 iph2
->status
, PHASE2ST_GETSPISENT
);
1004 /* set SPI, and check to get all spi whether or not */
1007 proto_id
= pfkey2ipsecdoi_proto(msg
->sadb_msg_satype
);
1008 pp
= iph2
->side
== INITIATOR
? iph2
->proposal
: iph2
->approval
;
1010 for (pr
= pp
->head
; pr
!= NULL
; pr
= pr
->next
) {
1011 if (pr
->proto_id
== proto_id
&& pr
->spi
== 0) {
1012 pr
->spi
= sa
->sadb_sa_spi
;
1014 plog(LLV_DEBUG
, LOCATION
, NULL
,
1015 "pfkey GETSPI succeeded: %s\n",
1016 sadbsecas2str(iph2
->dst
, iph2
->src
,
1017 msg
->sadb_msg_satype
,
1019 ipsecdoi2pfkey_mode(pr
->encmode
)));
1022 allspiok
= 0; /* not get all spi */
1026 plog(LLV_ERROR
, LOCATION
, NULL
,
1027 "get spi for unknown address %s\n",
1028 saddrwop2str(iph2
->dst
));
1034 iph2
->status
= PHASE2ST_GETSPIDONE
;
1035 if (isakmp_post_getspi(iph2
) < 0) {
1036 plog(LLV_ERROR
, LOCATION
, NULL
,
1037 "failed to start post getspi.\n");
1054 struct ph2handle
*iph2
;
1057 struct sockaddr
*src
= NULL
, *dst
= NULL
;
1058 u_int e_type
, e_keylen
, a_type
, a_keylen
, flags
;
1060 u_int64_t lifebyte
= 0;
1061 u_int wsize
= 4; /* XXX static size of window */
1063 struct ph2natt natt
;
1066 if (iph2
->approval
== NULL
) {
1067 plog(LLV_ERROR
, LOCATION
, NULL
,
1068 "no approvaled SAs found.\n");
1071 if (iph2
->side
== INITIATOR
)
1072 proxy
= iph2
->ph1
->rmconf
->support_proxy
;
1073 else if (iph2
->sainfo
&& iph2
->sainfo
->id_i
)
1076 /* for mobile IPv6 */
1077 if (proxy
&& iph2
->src_id
&& iph2
->dst_id
&&
1078 ipsecdoi_transportmode(iph2
->approval
)) {
1086 for (pr
= iph2
->approval
->head
; pr
!= NULL
; pr
= pr
->next
) {
1087 /* validity check */
1088 satype
= ipsecdoi2pfkey_proto(pr
->proto_id
);
1090 plog(LLV_ERROR
, LOCATION
, NULL
,
1091 "invalid proto_id %d\n", pr
->proto_id
);
1094 else if (satype
== SADB_X_SATYPE_IPCOMP
) {
1095 /* IPCOMP has no replay window */
1098 #ifdef ENABLE_SAMODE_UNSPECIFIED
1099 mode
= IPSEC_MODE_ANY
;
1101 mode
= ipsecdoi2pfkey_mode(pr
->encmode
);
1103 plog(LLV_ERROR
, LOCATION
, NULL
,
1104 "invalid encmode %d\n", pr
->encmode
);
1109 /* set algorithm type and key length */
1110 e_keylen
= pr
->head
->encklen
;
1111 if (pfkey_convertfromipsecdoi(
1116 &a_type
, &a_keylen
, &flags
) < 0)
1120 lifebyte
= iph2
->approval
->lifebyte
* 1024,
1127 plog(LLV_DEBUG
, LOCATION
, NULL
, "call pfkey_send_update\n");
1128 if (pr
->udp_encap
) {
1129 memset (&natt
, 0, sizeof (natt
));
1130 natt
.sport
= extract_port (iph2
->ph1
->remote
);
1131 flags
|= SADB_X_EXT_NATT
;
1132 if (iph2
->ph1
->natt_flags
& NAT_DETECTED_ME
)
1133 flags
|= SADB_X_EXT_NATT_KEEPALIVE
;
1134 else if (iph2
->ph1
->rmconf
->natt_multiple_user
== TRUE
&&
1135 mode
== IPSEC_MODE_TRANSPORT
&&
1136 src
->sa_family
== AF_INET
)
1137 flags
|= SADB_X_EXT_NATT_MULTIPLEUSERS
;
1139 memset (&natt
, 0, sizeof (natt
));
1142 if (pfkey_send_update(
1152 e_type
, e_keylen
, a_type
, a_keylen
, flags
,
1153 0, lifebyte
, iph2
->approval
->lifetime
, 0,
1154 iph2
->seq
, natt
.sport
) < 0) {
1155 plog(LLV_ERROR
, LOCATION
, NULL
,
1156 "libipsec failed send update (%s)\n",
1161 plog(LLV_DEBUG
, LOCATION
, NULL
, "call pfkey_send_update\n");
1162 if (pfkey_send_update(
1172 e_type
, e_keylen
, a_type
, a_keylen
, flags
,
1173 0, lifebyte
, iph2
->approval
->lifetime
, 0,
1174 iph2
->seq
, 0) < 0) {
1175 plog(LLV_ERROR
, LOCATION
, NULL
,
1176 "libipsec failed send update (%s)\n",
1180 #endif /* ENABLE_NATT */
1183 plog(LLV_DEBUG
, LOCATION
, NULL
, "call pfkey_send_update_nat\n");
1184 if (pr
->udp_encap
) {
1185 memset (&natt
, 0, sizeof (natt
));
1186 natt
.type
= iph2
->ph1
->natt_options
->encaps_type
;
1187 natt
.sport
= extract_port (iph2
->ph1
->remote
);
1188 natt
.dport
= extract_port (iph2
->ph1
->local
);
1189 natt
.oa
= NULL
; // FIXME: Here comes OA!!!
1190 natt
.frag
= iph2
->ph1
->rmconf
->esp_frag
;
1192 memset (&natt
, 0, sizeof (natt
));
1195 if (pfkey_send_update_nat(
1205 e_type
, e_keylen
, a_type
, a_keylen
, flags
,
1206 0, lifebyte
, iph2
->approval
->lifetime
, 0,
1208 natt
.type
, natt
.sport
, natt
.dport
, natt
.oa
,
1210 plog(LLV_ERROR
, LOCATION
, NULL
,
1211 "libipsec failed send update_nat (%s)\n",
1216 plog(LLV_DEBUG
, LOCATION
, NULL
, "call pfkey_send_update\n");
1217 if (pfkey_send_update(
1227 e_type
, e_keylen
, a_type
, a_keylen
, flags
,
1228 0, lifebyte
, iph2
->approval
->lifetime
, 0,
1230 plog(LLV_ERROR
, LOCATION
, NULL
,
1231 "libipsec failed send update (%s)\n",
1235 #endif /* ENABLE_NATT */
1236 #endif /* __APPLE__ */
1238 if (!lcconf
->pathinfo
[LC_PATHTYPE_BACKUPSA
])
1242 * It maybe good idea to call backupsa_to_file() after
1243 * racoon will receive the sadb_update messages.
1244 * But it is impossible because there is not key in the
1245 * information from the kernel.
1247 if (backupsa_to_file(satype
, mode
, dst
, src
,
1248 pr
->spi
, pr
->reqid_in
, 4,
1250 e_type
, e_keylen
, a_type
, a_keylen
, flags
,
1251 0, iph2
->approval
->lifebyte
* 1024,
1252 iph2
->approval
->lifetime
, 0,
1254 plog(LLV_ERROR
, LOCATION
, NULL
,
1255 "backuped SA failed: %s\n",
1256 sadbsecas2str(dst
, src
,
1257 satype
, pr
->spi
, mode
));
1259 plog(LLV_DEBUG
, LOCATION
, NULL
,
1260 "backuped SA: %s\n",
1261 sadbsecas2str(dst
, src
,
1262 satype
, pr
->spi
, mode
));
1272 struct sadb_msg
*msg
;
1274 struct sockaddr
*src
, *dst
;
1275 struct ph2handle
*iph2
;
1276 u_int proto_id
, encmode
, sa_mode
;
1280 /* ignore this message because of local test mode. */
1286 || mhp
[SADB_EXT_SA
] == NULL
1287 || mhp
[SADB_EXT_ADDRESS_SRC
] == NULL
1288 || mhp
[SADB_EXT_ADDRESS_DST
] == NULL
) {
1289 plog(LLV_ERROR
, LOCATION
, NULL
,
1290 "inappropriate sadb update message passed.\n");
1293 msg
= (struct sadb_msg
*)mhp
[0];
1294 src
= PFKEY_ADDR_SADDR(mhp
[SADB_EXT_ADDRESS_SRC
]);
1295 dst
= PFKEY_ADDR_SADDR(mhp
[SADB_EXT_ADDRESS_DST
]);
1296 sa
= (struct sadb_sa
*)mhp
[SADB_EXT_SA
];
1298 sa_mode
= mhp
[SADB_X_EXT_SA2
] == NULL
1300 : ((struct sadb_x_sa2
*)mhp
[SADB_X_EXT_SA2
])->sadb_x_sa2_mode
;
1302 /* the message has to be processed or not ? */
1303 if (msg
->sadb_msg_pid
!= getpid()) {
1304 plog(LLV_DEBUG
, LOCATION
, NULL
,
1305 "%s message is not interesting "
1306 "because pid %d is not mine.\n",
1307 s_pfkey_type(msg
->sadb_msg_type
),
1312 iph2
= getph2byseq(msg
->sadb_msg_seq
);
1314 plog(LLV_DEBUG
, LOCATION
, NULL
,
1315 "seq %d of %s message not interesting.\n",
1317 s_pfkey_type(msg
->sadb_msg_type
));
1321 if (iph2
->status
!= PHASE2ST_ADDSA
) {
1322 plog(LLV_ERROR
, LOCATION
, NULL
,
1323 "status mismatch (db:%d msg:%d)\n",
1324 iph2
->status
, PHASE2ST_ADDSA
);
1328 /* check to complete all keys ? */
1329 for (pr
= iph2
->approval
->head
; pr
!= NULL
; pr
= pr
->next
) {
1330 proto_id
= pfkey2ipsecdoi_proto(msg
->sadb_msg_satype
);
1331 if (proto_id
== ~0) {
1332 plog(LLV_ERROR
, LOCATION
, NULL
,
1333 "invalid proto_id %d\n", msg
->sadb_msg_satype
);
1336 encmode
= pfkey2ipsecdoi_mode(sa_mode
);
1337 if (encmode
== ~0) {
1338 plog(LLV_ERROR
, LOCATION
, NULL
,
1339 "invalid encmode %d\n", sa_mode
);
1343 if (pr
->proto_id
== proto_id
1344 && pr
->spi
== sa
->sadb_sa_spi
) {
1346 plog(LLV_DEBUG
, LOCATION
, NULL
,
1347 "pfkey UPDATE succeeded: %s\n",
1348 sadbsecas2str(iph2
->dst
, iph2
->src
,
1349 msg
->sadb_msg_satype
,
1353 plog(LLV_INFO
, LOCATION
, NULL
,
1354 "IPsec-SA established: %s\n",
1355 sadbsecas2str(iph2
->dst
, iph2
->src
,
1356 msg
->sadb_msg_satype
, sa
->sadb_sa_spi
,
1367 /* turn off the timer for calling pfkey_timeover() */
1368 SCHED_KILL(iph2
->sce
);
1371 iph2
->status
= PHASE2ST_ESTABLISHED
;
1374 gettimeofday(&iph2
->end
, NULL
);
1375 syslog(LOG_NOTICE
, "%s(%s): %8.6f",
1376 "phase2", "quick", timedelta(&iph2
->start
, &iph2
->end
));
1380 iph2
->ph1
->ph2cnt
++;
1382 /* turn off schedule */
1384 SCHED_KILL(iph2
->scr
);
1387 * since we are going to reuse the phase2 handler, we need to
1388 * remain it and refresh all the references between ph1 and ph2 to use.
1392 iph2
->sce
= sched_new(iph2
->approval
->lifetime
,
1393 isakmp_ph2expire_stub
, iph2
);
1395 plog(LLV_DEBUG
, LOCATION
, NULL
, "===\n");
1404 struct ph2handle
*iph2
;
1407 struct sockaddr
*src
= NULL
, *dst
= NULL
;
1408 u_int e_type
, e_keylen
, a_type
, a_keylen
, flags
;
1410 u_int64_t lifebyte
= 0;
1411 u_int wsize
= 4; /* XXX static size of window */
1413 struct ph2natt natt
;
1416 if (iph2
->approval
== NULL
) {
1417 plog(LLV_ERROR
, LOCATION
, NULL
,
1418 "no approvaled SAs found.\n");
1421 if (iph2
->side
== INITIATOR
)
1422 proxy
= iph2
->ph1
->rmconf
->support_proxy
;
1423 else if (iph2
->sainfo
&& iph2
->sainfo
->id_i
)
1426 /* for mobile IPv6 */
1427 if (proxy
&& iph2
->src_id
&& iph2
->dst_id
&&
1428 ipsecdoi_transportmode(iph2
->approval
)) {
1436 for (pr
= iph2
->approval
->head
; pr
!= NULL
; pr
= pr
->next
) {
1437 /* validity check */
1438 satype
= ipsecdoi2pfkey_proto(pr
->proto_id
);
1440 plog(LLV_ERROR
, LOCATION
, NULL
,
1441 "invalid proto_id %d\n", pr
->proto_id
);
1444 else if (satype
== SADB_X_SATYPE_IPCOMP
) {
1445 /* no replay window for IPCOMP */
1448 #ifdef ENABLE_SAMODE_UNSPECIFIED
1449 mode
= IPSEC_MODE_ANY
;
1451 mode
= ipsecdoi2pfkey_mode(pr
->encmode
);
1453 plog(LLV_ERROR
, LOCATION
, NULL
,
1454 "invalid encmode %d\n", pr
->encmode
);
1459 /* set algorithm type and key length */
1460 e_keylen
= pr
->head
->encklen
;
1461 if (pfkey_convertfromipsecdoi(
1466 &a_type
, &a_keylen
, &flags
) < 0)
1470 lifebyte
= iph2
->approval
->lifebyte
* 1024,
1477 plog(LLV_DEBUG
, LOCATION
, NULL
, "call pfkey_send_add\n");
1479 if (pr
->udp_encap
) {
1480 memset (&natt
, 0, sizeof (natt
));
1481 natt
.dport
= extract_port (iph2
->ph1
->remote
);
1482 flags
|= SADB_X_EXT_NATT
;
1483 if (iph2
->ph1
->natt_flags
& NAT_DETECTED_ME
)
1484 flags
|= SADB_X_EXT_NATT_KEEPALIVE
;
1485 else if (iph2
->ph1
->rmconf
->natt_multiple_user
== TRUE
&&
1486 mode
== IPSEC_MODE_TRANSPORT
&&
1487 dst
->sa_family
== AF_INET
)
1488 flags
|= SADB_X_EXT_NATT_MULTIPLEUSERS
;
1490 memset (&natt
, 0, sizeof (natt
));
1492 /* Remove port information, that SA doesn't use it */
1507 e_type
, e_keylen
, a_type
, a_keylen
, flags
,
1508 0, lifebyte
, iph2
->approval
->lifetime
, 0,
1509 iph2
->seq
,natt
.dport
) < 0) {
1510 plog(LLV_ERROR
, LOCATION
, NULL
,
1511 "libipsec failed send add (%s)\n",
1516 plog(LLV_DEBUG
, LOCATION
, NULL
, "call pfkey_send_add\n");
1518 /* Remove port information, it is not used without NAT-T */
1532 e_type
, e_keylen
, a_type
, a_keylen
, flags
,
1533 0, lifebyte
, iph2
->approval
->lifetime
, 0,
1534 iph2
->seq
, 0) < 0) {
1535 plog(LLV_ERROR
, LOCATION
, NULL
,
1536 "libipsec failed send add (%s)\n",
1540 #endif /* ENABLE_NATT */
1541 #else /* __APPLE__ */
1543 plog(LLV_DEBUG
, LOCATION
, NULL
, "call pfkey_send_add_nat\n");
1545 if (pr
->udp_encap
) {
1546 memset (&natt
, 0, sizeof (natt
));
1547 natt
.type
= UDP_ENCAP_ESPINUDP
;
1548 natt
.sport
= extract_port (iph2
->ph1
->local
);
1549 natt
.dport
= extract_port (iph2
->ph1
->remote
);
1550 natt
.oa
= NULL
; // FIXME: Here comes OA!!!
1551 natt
.frag
= iph2
->ph1
->rmconf
->esp_frag
;
1553 memset (&natt
, 0, sizeof (natt
));
1555 /* Remove port information, that SA doesn't use it */
1560 if (pfkey_send_add_nat(
1570 e_type
, e_keylen
, a_type
, a_keylen
, flags
,
1571 0, lifebyte
, iph2
->approval
->lifetime
, 0,
1573 natt
.type
, natt
.sport
, natt
.dport
, natt
.oa
,
1575 plog(LLV_ERROR
, LOCATION
, NULL
,
1576 "libipsec failed send add_nat (%s)\n",
1581 plog(LLV_DEBUG
, LOCATION
, NULL
, "call pfkey_send_add\n");
1583 /* Remove port information, it is not used without NAT-T */
1597 e_type
, e_keylen
, a_type
, a_keylen
, flags
,
1598 0, lifebyte
, iph2
->approval
->lifetime
, 0,
1600 plog(LLV_ERROR
, LOCATION
, NULL
,
1601 "libipsec failed send add (%s)\n",
1605 #endif /* ENABLE_NATT */
1606 #endif /* __APPLE__ */
1608 if (!lcconf
->pathinfo
[LC_PATHTYPE_BACKUPSA
])
1612 * It maybe good idea to call backupsa_to_file() after
1613 * racoon will receive the sadb_update messages.
1614 * But it is impossible because there is not key in the
1615 * information from the kernel.
1617 if (backupsa_to_file(satype
, mode
, src
, dst
,
1618 pr
->spi_p
, pr
->reqid_out
, 4,
1620 e_type
, e_keylen
, a_type
, a_keylen
, flags
,
1621 0, iph2
->approval
->lifebyte
* 1024,
1622 iph2
->approval
->lifetime
, 0,
1624 plog(LLV_ERROR
, LOCATION
, NULL
,
1625 "backuped SA failed: %s\n",
1626 sadbsecas2str(src
, dst
,
1627 satype
, pr
->spi_p
, mode
));
1629 plog(LLV_DEBUG
, LOCATION
, NULL
,
1630 "backuped SA: %s\n",
1631 sadbsecas2str(src
, dst
,
1632 satype
, pr
->spi_p
, mode
));
1642 struct sadb_msg
*msg
;
1644 struct sockaddr
*src
, *dst
;
1645 struct ph2handle
*iph2
;
1648 /* ignore this message because of local test mode. */
1654 || mhp
[SADB_EXT_SA
] == NULL
1655 || mhp
[SADB_EXT_ADDRESS_SRC
] == NULL
1656 || mhp
[SADB_EXT_ADDRESS_DST
] == NULL
) {
1657 plog(LLV_ERROR
, LOCATION
, NULL
,
1658 "inappropriate sadb add message passed.\n");
1661 msg
= (struct sadb_msg
*)mhp
[0];
1662 src
= PFKEY_ADDR_SADDR(mhp
[SADB_EXT_ADDRESS_SRC
]);
1663 dst
= PFKEY_ADDR_SADDR(mhp
[SADB_EXT_ADDRESS_DST
]);
1664 sa
= (struct sadb_sa
*)mhp
[SADB_EXT_SA
];
1666 sa_mode
= mhp
[SADB_X_EXT_SA2
] == NULL
1668 : ((struct sadb_x_sa2
*)mhp
[SADB_X_EXT_SA2
])->sadb_x_sa2_mode
;
1670 /* the message has to be processed or not ? */
1671 if (msg
->sadb_msg_pid
!= getpid()) {
1672 plog(LLV_DEBUG
, LOCATION
, NULL
,
1673 "%s message is not interesting "
1674 "because pid %d is not mine.\n",
1675 s_pfkey_type(msg
->sadb_msg_type
),
1680 iph2
= getph2byseq(msg
->sadb_msg_seq
);
1682 plog(LLV_DEBUG
, LOCATION
, NULL
,
1683 "seq %d of %s message not interesting.\n",
1685 s_pfkey_type(msg
->sadb_msg_type
));
1690 * NOTE don't update any status of phase2 handle
1691 * because they must be updated by SADB_UPDATE message
1694 plog(LLV_INFO
, LOCATION
, NULL
,
1695 "IPsec-SA established: %s\n",
1696 sadbsecas2str(iph2
->src
, iph2
->dst
,
1697 msg
->sadb_msg_satype
, sa
->sadb_sa_spi
, sa_mode
));
1699 #ifdef ENABLE_VPNCONTROL_PORT
1703 if (iph2
->dst
->sa_family
== AF_INET
)
1704 address
= ((struct sockaddr_in
*)iph2
->dst
)->sin_addr
.s_addr
;
1707 vpncontrol_notify_phase_change(0, FROM_LOCAL
, NULL
, iph2
);
1711 plog(LLV_DEBUG
, LOCATION
, NULL
, "===\n");
1719 struct sadb_msg
*msg
;
1721 struct sockaddr
*src
, *dst
;
1722 struct ph2handle
*iph2
;
1723 u_int proto_id
, sa_mode
;
1727 || mhp
[SADB_EXT_SA
] == NULL
1728 || mhp
[SADB_EXT_ADDRESS_SRC
] == NULL
1729 || mhp
[SADB_EXT_ADDRESS_DST
] == NULL
1730 || (mhp
[SADB_EXT_LIFETIME_HARD
] != NULL
1731 && mhp
[SADB_EXT_LIFETIME_SOFT
] != NULL
)) {
1732 plog(LLV_ERROR
, LOCATION
, NULL
,
1733 "inappropriate sadb expire message passed.\n");
1736 msg
= (struct sadb_msg
*)mhp
[0];
1737 sa
= (struct sadb_sa
*)mhp
[SADB_EXT_SA
];
1738 src
= PFKEY_ADDR_SADDR(mhp
[SADB_EXT_ADDRESS_SRC
]);
1739 dst
= PFKEY_ADDR_SADDR(mhp
[SADB_EXT_ADDRESS_DST
]);
1741 sa_mode
= mhp
[SADB_X_EXT_SA2
] == NULL
1743 : ((struct sadb_x_sa2
*)mhp
[SADB_X_EXT_SA2
])->sadb_x_sa2_mode
;
1745 proto_id
= pfkey2ipsecdoi_proto(msg
->sadb_msg_satype
);
1746 if (proto_id
== ~0) {
1747 plog(LLV_ERROR
, LOCATION
, NULL
,
1748 "invalid proto_id %d\n", msg
->sadb_msg_satype
);
1752 plog(LLV_INFO
, LOCATION
, NULL
,
1753 "IPsec-SA expired: %s\n",
1754 sadbsecas2str(src
, dst
,
1755 msg
->sadb_msg_satype
, sa
->sadb_sa_spi
, sa_mode
));
1757 iph2
= getph2bysaidx(src
, dst
, proto_id
, sa
->sadb_sa_spi
);
1760 * Ignore it because two expire messages are come up.
1761 * phase2 handler has been deleted already when 2nd message
1764 plog(LLV_DEBUG
, LOCATION
, NULL
,
1765 "no such a SA found: %s\n",
1766 sadbsecas2str(src
, dst
,
1767 msg
->sadb_msg_satype
, sa
->sadb_sa_spi
,
1771 if (iph2
->status
!= PHASE2ST_ESTABLISHED
) {
1773 * If the status is not equal to PHASE2ST_ESTABLISHED,
1774 * racoon ignores this expire message. There are two reason.
1775 * One is that the phase 2 probably starts because there is
1776 * a potential that racoon receives the acquire message
1777 * without receiving a expire message. Another is that racoon
1778 * may receive the multiple expire messages from the kernel.
1780 plog(LLV_WARNING
, LOCATION
, NULL
,
1781 "the expire message is received "
1782 "but the handler has not been established.\n");
1786 /* turn off the timer for calling isakmp_ph2expire() */
1787 SCHED_KILL(iph2
->sce
);
1789 iph2
->status
= PHASE2ST_EXPIRED
;
1791 /* INITIATOR, begin phase 2 exchange. */
1792 /* allocate buffer for status management of pfkey message */
1793 if (iph2
->side
== INITIATOR
) {
1797 /* update status for re-use */
1798 iph2
->status
= PHASE2ST_STATUS2
;
1800 /* start isakmp initiation by using ident exchange */
1801 if (isakmp_post_acquire(iph2
) < 0) {
1802 plog(LLV_ERROR
, LOCATION
, iph2
->dst
,
1803 "failed to begin ipsec sa "
1804 "re-negotication.\n");
1815 /* If not received SADB_EXPIRE, INITIATOR delete ph2handle. */
1816 /* RESPONDER always delete ph2handle, keep silent. RESPONDER doesn't
1817 * manage IPsec SA, so delete the list */
1829 struct sadb_msg
*msg
;
1830 struct sadb_x_policy
*xpl
;
1831 struct secpolicy
*sp_out
= NULL
, *sp_in
= NULL
;
1832 #define MAXNESTEDSA 5 /* XXX */
1833 struct ph2handle
*iph2
[MAXNESTEDSA
];
1834 struct sockaddr
*src
, *dst
;
1835 int n
; /* # of phase 2 handler */
1837 /* ignore this message because of local test mode. */
1843 || mhp
[SADB_EXT_ADDRESS_SRC
] == NULL
1844 || mhp
[SADB_EXT_ADDRESS_DST
] == NULL
1845 || mhp
[SADB_X_EXT_POLICY
] == NULL
) {
1846 plog(LLV_ERROR
, LOCATION
, NULL
,
1847 "inappropriate sadb acquire message passed.\n");
1850 msg
= (struct sadb_msg
*)mhp
[0];
1851 xpl
= (struct sadb_x_policy
*)mhp
[SADB_X_EXT_POLICY
];
1852 src
= PFKEY_ADDR_SADDR(mhp
[SADB_EXT_ADDRESS_SRC
]);
1853 dst
= PFKEY_ADDR_SADDR(mhp
[SADB_EXT_ADDRESS_DST
]);
1855 /* ignore if type is not IPSEC_POLICY_IPSEC */
1856 if (xpl
->sadb_x_policy_type
!= IPSEC_POLICY_IPSEC
) {
1857 plog(LLV_DEBUG
, LOCATION
, NULL
,
1858 "ignore ACQUIRE message. type is not IPsec.\n");
1862 /* ignore it if src is multicast address */
1864 struct sockaddr
*sa
= PFKEY_ADDR_SADDR(mhp
[SADB_EXT_ADDRESS_DST
]);
1866 if ((sa
->sa_family
== AF_INET
1867 && IN_MULTICAST(ntohl(((struct sockaddr_in
*)sa
)->sin_addr
.s_addr
)))
1869 || (sa
->sa_family
== AF_INET6
1870 && IN6_IS_ADDR_MULTICAST(&((struct sockaddr_in6
*)sa
)->sin6_addr
))
1873 plog(LLV_DEBUG
, LOCATION
, NULL
,
1874 "ignore due to multicast address: %s.\n",
1880 /* ignore, if we do not listen on source address */
1883 * - if we'll contact peer from address we do not listen -
1884 * we will be unable to complete negotiation;
1885 * - if we'll negotiate using address we're listening -
1886 * remote peer will send packets to address different
1887 * than one in the policy, so kernel will drop them;
1888 * => therefore this acquire is not for us! --Aidas
1890 struct sockaddr
*sa
= PFKEY_ADDR_SADDR(mhp
[SADB_EXT_ADDRESS_SRC
]);
1893 for (p
= lcconf
->myaddrs
; p
; p
= p
->next
) {
1894 if (!cmpsaddrwop(p
->addr
, sa
)) {
1901 plog(LLV_DEBUG
, LOCATION
, NULL
,
1902 "ignore because do not listen on source address : %s.\n",
1909 * If there is a phase 2 handler against the policy identifier in
1910 * the acquire message, and if
1911 * 1. its state is less than PHASE2ST_ESTABLISHED, then racoon
1912 * should ignore such a acquire message because the phase 2
1913 * is just negotiating.
1914 * 2. its state is equal to PHASE2ST_ESTABLISHED, then racoon
1915 * has to prcesss such a acquire message because racoon may
1916 * lost the expire message.
1918 iph2
[0] = getph2byid(src
, dst
, xpl
->sadb_x_policy_id
);
1919 if (iph2
[0] != NULL
) {
1920 if (iph2
[0]->status
< PHASE2ST_ESTABLISHED
) {
1921 plog(LLV_DEBUG
, LOCATION
, NULL
,
1922 "ignore the acquire because ph2 found\n");
1925 if (iph2
[0]->status
== PHASE2ST_EXPIRED
)
1930 /* search for proper policyindex */
1931 sp_out
= getspbyspid(xpl
->sadb_x_policy_id
);
1932 if (sp_out
== NULL
) {
1933 plog(LLV_ERROR
, LOCATION
, NULL
, "no policy found: id:%d.\n",
1934 xpl
->sadb_x_policy_id
);
1937 plog(LLV_DEBUG
, LOCATION
, NULL
,
1938 "suitable outbound SP found: %s.\n", spidx2str(&sp_out
->spidx
));
1940 /* get inbound policy */
1942 struct policyindex spidx
;
1944 spidx
.dir
= IPSEC_DIR_INBOUND
;
1945 memcpy(&spidx
.src
, &sp_out
->spidx
.dst
, sizeof(spidx
.src
));
1946 memcpy(&spidx
.dst
, &sp_out
->spidx
.src
, sizeof(spidx
.dst
));
1947 spidx
.prefs
= sp_out
->spidx
.prefd
;
1948 spidx
.prefd
= sp_out
->spidx
.prefs
;
1949 spidx
.ul_proto
= sp_out
->spidx
.ul_proto
;
1951 sp_in
= getsp(&spidx
);
1953 plog(LLV_DEBUG
, LOCATION
, NULL
,
1954 "suitable inbound SP found: %s.\n",
1955 spidx2str(&sp_in
->spidx
));
1957 plog(LLV_NOTIFY
, LOCATION
, NULL
,
1958 "no in-bound policy found: %s\n",
1963 memset(iph2
, 0, MAXNESTEDSA
);
1967 /* allocate a phase 2 */
1969 if (iph2
[n
] == NULL
) {
1970 plog(LLV_ERROR
, LOCATION
, NULL
,
1971 "failed to allocate phase2 entry.\n");
1974 iph2
[n
]->side
= INITIATOR
;
1975 iph2
[n
]->spid
= xpl
->sadb_x_policy_id
;
1976 iph2
[n
]->satype
= msg
->sadb_msg_satype
;
1977 iph2
[n
]->seq
= msg
->sadb_msg_seq
;
1978 iph2
[n
]->status
= PHASE2ST_STATUS2
;
1980 /* set end addresses of SA */
1981 iph2
[n
]->dst
= dupsaddr(PFKEY_ADDR_SADDR(mhp
[SADB_EXT_ADDRESS_DST
]));
1982 if (iph2
[n
]->dst
== NULL
) {
1986 iph2
[n
]->src
= dupsaddr(PFKEY_ADDR_SADDR(mhp
[SADB_EXT_ADDRESS_SRC
]));
1987 if (iph2
[n
]->src
== NULL
) {
1992 plog(LLV_DEBUG
, LOCATION
, NULL
,
1993 "new acquire %s\n", spidx2str(&sp_out
->spidx
));
1997 vchar_t
*idsrc
, *iddst
;
1999 idsrc
= ipsecdoi_sockaddr2id((struct sockaddr
*)&sp_out
->spidx
.src
,
2000 sp_out
->spidx
.prefs
, sp_out
->spidx
.ul_proto
);
2001 if (idsrc
== NULL
) {
2002 plog(LLV_ERROR
, LOCATION
, NULL
,
2003 "failed to get ID for %s\n",
2004 spidx2str(&sp_out
->spidx
));
2008 iddst
= ipsecdoi_sockaddr2id((struct sockaddr
*)&sp_out
->spidx
.dst
,
2009 sp_out
->spidx
.prefd
, sp_out
->spidx
.ul_proto
);
2010 if (iddst
== NULL
) {
2011 plog(LLV_ERROR
, LOCATION
, NULL
,
2012 "failed to get ID for %s\n",
2013 spidx2str(&sp_out
->spidx
));
2018 iph2
[n
]->sainfo
= getsainfo(idsrc
, iddst
, NULL
, 0);
2021 if (iph2
[n
]->sainfo
== NULL
) {
2022 plog(LLV_ERROR
, LOCATION
, NULL
,
2023 "failed to get sainfo.\n");
2026 /* XXX should use the algorithm list from register message */
2030 if (set_proposal_from_policy(iph2
[n
], sp_out
, sp_in
) < 0) {
2031 plog(LLV_ERROR
, LOCATION
, NULL
,
2032 "failed to create saprop.\n");
2038 /* start isakmp initiation by using ident exchange */
2039 /* XXX should be looped if there are multiple phase 2 handler. */
2040 if (isakmp_post_acquire(iph2
[n
]) < 0) {
2041 plog(LLV_ERROR
, LOCATION
, NULL
,
2042 "failed to begin ipsec sa negotication.\n");
2050 unbindph12(iph2
[n
]);
2063 struct sadb_msg
*msg
;
2065 struct sockaddr
*src
, *dst
;
2066 struct ph2handle
*iph2
= NULL
;
2069 /* ignore this message because of local test mode. */
2075 || mhp
[SADB_EXT_SA
] == NULL
2076 || mhp
[SADB_EXT_ADDRESS_SRC
] == NULL
2077 || mhp
[SADB_EXT_ADDRESS_DST
] == NULL
) {
2078 plog(LLV_ERROR
, LOCATION
, NULL
,
2079 "inappropriate sadb delete message passed.\n");
2082 msg
= (struct sadb_msg
*)mhp
[0];
2083 sa
= (struct sadb_sa
*)mhp
[SADB_EXT_SA
];
2084 src
= PFKEY_ADDR_SADDR(mhp
[SADB_EXT_ADDRESS_SRC
]);
2085 dst
= PFKEY_ADDR_SADDR(mhp
[SADB_EXT_ADDRESS_DST
]);
2087 /* the message has to be processed or not ? */
2088 if (msg
->sadb_msg_pid
== getpid()) {
2089 plog(LLV_DEBUG
, LOCATION
, NULL
,
2090 "%s message is not interesting "
2091 "because the message was originated by me.\n",
2092 s_pfkey_type(msg
->sadb_msg_type
));
2096 proto_id
= pfkey2ipsecdoi_proto(msg
->sadb_msg_satype
);
2097 if (proto_id
== ~0) {
2098 plog(LLV_ERROR
, LOCATION
, NULL
,
2099 "invalid proto_id %d\n", msg
->sadb_msg_satype
);
2103 iph2
= getph2bysaidx(src
, dst
, proto_id
, sa
->sadb_sa_spi
);
2106 plog(LLV_ERROR
, LOCATION
, NULL
,
2107 "no iph2 found: %s\n",
2108 sadbsecas2str(src
, dst
, msg
->sadb_msg_satype
,
2109 sa
->sadb_sa_spi
, IPSEC_MODE_ANY
));
2113 plog(LLV_ERROR
, LOCATION
, NULL
,
2114 "pfkey DELETE received: %s\n",
2115 sadbsecas2str(iph2
->src
, iph2
->dst
,
2116 msg
->sadb_msg_satype
, sa
->sadb_sa_spi
, IPSEC_MODE_ANY
));
2118 /* send delete information */
2119 if (iph2
->status
== PHASE2ST_ESTABLISHED
)
2120 isakmp_info_send_d2(iph2
);
2133 /* ignore this message because of local test mode. */
2138 if (mhp
[0] == NULL
) {
2139 plog(LLV_ERROR
, LOCATION
, NULL
,
2140 "inappropriate sadb flush message passed.\n");
2150 getsadbpolicy(policy0
, policylen0
, type
, iph2
)
2152 int *policylen0
, type
;
2153 struct ph2handle
*iph2
;
2155 struct policyindex
*spidx
= (struct policyindex
*)iph2
->spidx_gen
;
2156 struct sadb_x_policy
*xpl
;
2157 struct sadb_x_ipsecrequest
*xisr
;
2164 /* get policy buffer size */
2165 policylen
= sizeof(struct sadb_x_policy
);
2166 if (type
!= SADB_X_SPDDELETE
) {
2167 for (pr
= iph2
->approval
->head
; pr
; pr
= pr
->next
) {
2168 xisrlen
= sizeof(*xisr
);
2169 if (pr
->encmode
== IPSECDOI_ATTR_ENC_MODE_TUNNEL
) {
2170 xisrlen
+= (sysdep_sa_len(iph2
->src
)
2171 + sysdep_sa_len(iph2
->dst
));
2174 policylen
+= PFKEY_ALIGN8(xisrlen
);
2178 /* make policy structure */
2179 policy
= racoon_malloc(policylen
);
2181 plog(LLV_ERROR
, LOCATION
, NULL
,
2182 "buffer allocation failed.\n");
2186 xpl
= (struct sadb_x_policy
*)policy
;
2187 xpl
->sadb_x_policy_len
= PFKEY_UNIT64(policylen
);
2188 xpl
->sadb_x_policy_exttype
= SADB_X_EXT_POLICY
;
2189 xpl
->sadb_x_policy_type
= IPSEC_POLICY_IPSEC
;
2190 xpl
->sadb_x_policy_dir
= spidx
->dir
;
2191 xpl
->sadb_x_policy_id
= 0;
2192 #ifdef HAVE_PFKEY_POLICY_PRIORITY
2193 xpl
->sadb_x_policy_priority
= PRIORITY_DEFAULT
;
2196 /* no need to append policy information any more if type is SPDDELETE */
2197 if (type
== SADB_X_SPDDELETE
)
2200 xisr
= (struct sadb_x_ipsecrequest
*)(xpl
+ 1);
2202 for (pr
= iph2
->approval
->head
; pr
; pr
= pr
->next
) {
2204 satype
= doi2ipproto(pr
->proto_id
);
2206 plog(LLV_ERROR
, LOCATION
, NULL
,
2207 "invalid proto_id %d\n", pr
->proto_id
);
2210 mode
= ipsecdoi2pfkey_mode(pr
->encmode
);
2212 plog(LLV_ERROR
, LOCATION
, NULL
,
2213 "invalid encmode %d\n", pr
->encmode
);
2218 * the policy level cannot be unique because the policy
2219 * is defined later than SA, so req_id cannot be bound to SA.
2221 xisr
->sadb_x_ipsecrequest_proto
= satype
;
2222 xisr
->sadb_x_ipsecrequest_mode
= mode
;
2223 xisr
->sadb_x_ipsecrequest_level
= IPSEC_LEVEL_REQUIRE
;
2224 xisr
->sadb_x_ipsecrequest_reqid
= 0;
2225 p
= (caddr_t
)(xisr
+ 1);
2227 xisrlen
= sizeof(*xisr
);
2229 if (pr
->encmode
== IPSECDOI_ATTR_ENC_MODE_TUNNEL
) {
2230 int src_len
, dst_len
;
2232 src_len
= sysdep_sa_len(iph2
->src
);
2233 dst_len
= sysdep_sa_len(iph2
->dst
);
2234 xisrlen
+= src_len
+ dst_len
;
2236 memcpy(p
, iph2
->src
, src_len
);
2239 memcpy(p
, iph2
->dst
, dst_len
);
2243 xisr
->sadb_x_ipsecrequest_len
= PFKEY_ALIGN8(xisrlen
);
2248 *policylen0
= policylen
;
2254 racoon_free(policy
);
2260 pk_sendspdupdate2(iph2
)
2261 struct ph2handle
*iph2
;
2263 struct policyindex
*spidx
= (struct policyindex
*)iph2
->spidx_gen
;
2264 caddr_t policy
= NULL
;
2266 u_int64_t ltime
, vtime
;
2268 ltime
= iph2
->approval
->lifetime
;
2271 if (getsadbpolicy(&policy
, &policylen
, SADB_X_SPDUPDATE
, iph2
)) {
2272 plog(LLV_ERROR
, LOCATION
, NULL
,
2273 "getting sadb policy failed.\n");
2277 if (pfkey_send_spdupdate2(
2279 (struct sockaddr
*)&spidx
->src
,
2281 (struct sockaddr
*)&spidx
->dst
,
2285 policy
, policylen
, 0) < 0) {
2286 plog(LLV_ERROR
, LOCATION
, NULL
,
2287 "libipsec failed send spdupdate2 (%s)\n",
2291 plog(LLV_DEBUG
, LOCATION
, NULL
, "call pfkey_send_spdupdate2\n");
2295 racoon_free(policy
);
2301 pk_recvspdupdate(mhp
)
2304 struct sadb_address
*saddr
, *daddr
;
2305 struct sadb_x_policy
*xpl
;
2306 struct policyindex spidx
;
2307 struct secpolicy
*sp
;
2311 || mhp
[SADB_EXT_ADDRESS_SRC
] == NULL
2312 || mhp
[SADB_EXT_ADDRESS_DST
] == NULL
2313 || mhp
[SADB_X_EXT_POLICY
] == NULL
) {
2314 plog(LLV_ERROR
, LOCATION
, NULL
,
2315 "inappropriate sadb spdupdate message passed.\n");
2318 saddr
= (struct sadb_address
*)mhp
[SADB_EXT_ADDRESS_SRC
];
2319 daddr
= (struct sadb_address
*)mhp
[SADB_EXT_ADDRESS_DST
];
2320 xpl
= (struct sadb_x_policy
*)mhp
[SADB_X_EXT_POLICY
];
2322 #ifdef HAVE_PFKEY_POLICY_PRIORITY
2323 KEY_SETSECSPIDX(xpl
->sadb_x_policy_dir
,
2326 saddr
->sadb_address_prefixlen
,
2327 daddr
->sadb_address_prefixlen
,
2328 saddr
->sadb_address_proto
,
2329 xpl
->sadb_x_policy_priority
,
2332 KEY_SETSECSPIDX(xpl
->sadb_x_policy_dir
,
2335 saddr
->sadb_address_prefixlen
,
2336 daddr
->sadb_address_prefixlen
,
2337 saddr
->sadb_address_proto
,
2343 plog(LLV_ERROR
, LOCATION
, NULL
,
2344 "such policy does not already exist: \"%s\"\n",
2351 if (addnewsp(mhp
) < 0)
2358 * this function has to be used by responder side.
2361 pk_sendspdadd2(iph2
)
2362 struct ph2handle
*iph2
;
2364 struct policyindex
*spidx
= (struct policyindex
*)iph2
->spidx_gen
;
2365 caddr_t policy
= NULL
;
2367 u_int64_t ltime
, vtime
;
2369 ltime
= iph2
->approval
->lifetime
;
2372 if (getsadbpolicy(&policy
, &policylen
, SADB_X_SPDADD
, iph2
)) {
2373 plog(LLV_ERROR
, LOCATION
, NULL
,
2374 "getting sadb policy failed.\n");
2378 if (pfkey_send_spdadd2(
2380 (struct sockaddr
*)&spidx
->src
,
2382 (struct sockaddr
*)&spidx
->dst
,
2386 policy
, policylen
, 0) < 0) {
2387 plog(LLV_ERROR
, LOCATION
, NULL
,
2388 "libipsec failed send spdadd2 (%s)\n",
2392 plog(LLV_DEBUG
, LOCATION
, NULL
, "call pfkey_send_spdadd2\n");
2396 racoon_free(policy
);
2405 struct sadb_address
*saddr
, *daddr
;
2406 struct sadb_x_policy
*xpl
;
2407 struct policyindex spidx
;
2408 struct secpolicy
*sp
;
2412 || mhp
[SADB_EXT_ADDRESS_SRC
] == NULL
2413 || mhp
[SADB_EXT_ADDRESS_DST
] == NULL
2414 || mhp
[SADB_X_EXT_POLICY
] == NULL
) {
2415 plog(LLV_ERROR
, LOCATION
, NULL
,
2416 "inappropriate sadb spdadd message passed.\n");
2419 saddr
= (struct sadb_address
*)mhp
[SADB_EXT_ADDRESS_SRC
];
2420 daddr
= (struct sadb_address
*)mhp
[SADB_EXT_ADDRESS_DST
];
2421 xpl
= (struct sadb_x_policy
*)mhp
[SADB_X_EXT_POLICY
];
2423 #ifdef HAVE_PFKEY_POLICY_PRIORITY
2424 KEY_SETSECSPIDX(xpl
->sadb_x_policy_dir
,
2427 saddr
->sadb_address_prefixlen
,
2428 daddr
->sadb_address_prefixlen
,
2429 saddr
->sadb_address_proto
,
2430 xpl
->sadb_x_policy_priority
,
2433 KEY_SETSECSPIDX(xpl
->sadb_x_policy_dir
,
2436 saddr
->sadb_address_prefixlen
,
2437 daddr
->sadb_address_prefixlen
,
2438 saddr
->sadb_address_proto
,
2444 plog(LLV_ERROR
, LOCATION
, NULL
,
2445 "such policy already exists. "
2446 "anyway replace it: %s\n",
2452 if (addnewsp(mhp
) < 0)
2459 * this function has to be used by responder side.
2462 pk_sendspddelete(iph2
)
2463 struct ph2handle
*iph2
;
2465 struct policyindex
*spidx
= (struct policyindex
*)iph2
->spidx_gen
;
2466 caddr_t policy
= NULL
;
2469 if (getsadbpolicy(&policy
, &policylen
, SADB_X_SPDDELETE
, iph2
)) {
2470 plog(LLV_ERROR
, LOCATION
, NULL
,
2471 "getting sadb policy failed.\n");
2475 if (pfkey_send_spddelete(
2477 (struct sockaddr
*)&spidx
->src
,
2479 (struct sockaddr
*)&spidx
->dst
,
2482 policy
, policylen
, 0) < 0) {
2483 plog(LLV_ERROR
, LOCATION
, NULL
,
2484 "libipsec failed send spddelete (%s)\n",
2488 plog(LLV_DEBUG
, LOCATION
, NULL
, "call pfkey_send_spddelete\n");
2492 racoon_free(policy
);
2498 pk_recvspddelete(mhp
)
2501 struct sadb_address
*saddr
, *daddr
;
2502 struct sadb_x_policy
*xpl
;
2503 struct policyindex spidx
;
2504 struct secpolicy
*sp
;
2508 || mhp
[SADB_EXT_ADDRESS_SRC
] == NULL
2509 || mhp
[SADB_EXT_ADDRESS_DST
] == NULL
2510 || mhp
[SADB_X_EXT_POLICY
] == NULL
) {
2511 plog(LLV_ERROR
, LOCATION
, NULL
,
2512 "inappropriate sadb spddelete message passed.\n");
2515 saddr
= (struct sadb_address
*)mhp
[SADB_EXT_ADDRESS_SRC
];
2516 daddr
= (struct sadb_address
*)mhp
[SADB_EXT_ADDRESS_DST
];
2517 xpl
= (struct sadb_x_policy
*)mhp
[SADB_X_EXT_POLICY
];
2519 #ifdef HAVE_PFKEY_POLICY_PRIORITY
2520 KEY_SETSECSPIDX(xpl
->sadb_x_policy_dir
,
2523 saddr
->sadb_address_prefixlen
,
2524 daddr
->sadb_address_prefixlen
,
2525 saddr
->sadb_address_proto
,
2526 xpl
->sadb_x_policy_priority
,
2529 KEY_SETSECSPIDX(xpl
->sadb_x_policy_dir
,
2532 saddr
->sadb_address_prefixlen
,
2533 daddr
->sadb_address_prefixlen
,
2534 saddr
->sadb_address_proto
,
2540 plog(LLV_ERROR
, LOCATION
, NULL
,
2541 "no policy found: %s\n",
2553 pk_recvspdexpire(mhp
)
2556 struct sadb_address
*saddr
, *daddr
;
2557 struct sadb_x_policy
*xpl
;
2558 struct policyindex spidx
;
2559 struct secpolicy
*sp
;
2563 || mhp
[SADB_EXT_ADDRESS_SRC
] == NULL
2564 || mhp
[SADB_EXT_ADDRESS_DST
] == NULL
2565 || mhp
[SADB_X_EXT_POLICY
] == NULL
) {
2566 plog(LLV_ERROR
, LOCATION
, NULL
,
2567 "inappropriate sadb spdexpire message passed.\n");
2570 saddr
= (struct sadb_address
*)mhp
[SADB_EXT_ADDRESS_SRC
];
2571 daddr
= (struct sadb_address
*)mhp
[SADB_EXT_ADDRESS_DST
];
2572 xpl
= (struct sadb_x_policy
*)mhp
[SADB_X_EXT_POLICY
];
2574 #ifdef HAVE_PFKEY_POLICY_PRIORITY
2575 KEY_SETSECSPIDX(xpl
->sadb_x_policy_dir
,
2578 saddr
->sadb_address_prefixlen
,
2579 daddr
->sadb_address_prefixlen
,
2580 saddr
->sadb_address_proto
,
2581 xpl
->sadb_x_policy_priority
,
2584 KEY_SETSECSPIDX(xpl
->sadb_x_policy_dir
,
2587 saddr
->sadb_address_prefixlen
,
2588 daddr
->sadb_address_prefixlen
,
2589 saddr
->sadb_address_proto
,
2595 plog(LLV_ERROR
, LOCATION
, NULL
,
2596 "no policy found: %s\n",
2612 if (mhp
[0] == NULL
) {
2613 plog(LLV_ERROR
, LOCATION
, NULL
,
2614 "inappropriate sadb spdget message passed.\n");
2625 struct sadb_msg
*msg
;
2626 struct sadb_address
*saddr
, *daddr
;
2627 struct sadb_x_policy
*xpl
;
2628 struct policyindex spidx
;
2629 struct secpolicy
*sp
;
2632 if (mhp
[0] == NULL
) {
2633 plog(LLV_ERROR
, LOCATION
, NULL
,
2634 "inappropriate sadb spddump message passed.\n");
2637 msg
= (struct sadb_msg
*)mhp
[0];
2639 saddr
= (struct sadb_address
*)mhp
[SADB_EXT_ADDRESS_SRC
];
2640 daddr
= (struct sadb_address
*)mhp
[SADB_EXT_ADDRESS_DST
];
2641 xpl
= (struct sadb_x_policy
*)mhp
[SADB_X_EXT_POLICY
];
2643 if (saddr
== NULL
|| daddr
== NULL
|| xpl
== NULL
) {
2644 plog(LLV_ERROR
, LOCATION
, NULL
,
2645 "inappropriate sadb spddump message passed.\n");
2649 #ifdef HAVE_PFKEY_POLICY_PRIORITY
2650 KEY_SETSECSPIDX(xpl
->sadb_x_policy_dir
,
2653 saddr
->sadb_address_prefixlen
,
2654 daddr
->sadb_address_prefixlen
,
2655 saddr
->sadb_address_proto
,
2656 xpl
->sadb_x_policy_priority
,
2659 KEY_SETSECSPIDX(xpl
->sadb_x_policy_dir
,
2662 saddr
->sadb_address_prefixlen
,
2663 daddr
->sadb_address_prefixlen
,
2664 saddr
->sadb_address_proto
,
2670 plog(LLV_ERROR
, LOCATION
, NULL
,
2671 "such policy already exists. "
2672 "anyway replace it: %s\n",
2678 if (addnewsp(mhp
) < 0)
2685 pk_recvspdflush(mhp
)
2689 if (mhp
[0] == NULL
) {
2690 plog(LLV_ERROR
, LOCATION
, NULL
,
2691 "inappropriate sadb spdflush message passed.\n");
2701 * send error against acquire message to kenrel.
2704 pk_sendeacquire(iph2
)
2705 struct ph2handle
*iph2
;
2707 struct sadb_msg
*newmsg
;
2710 len
= sizeof(struct sadb_msg
);
2711 newmsg
= racoon_calloc(1, len
);
2712 if (newmsg
== NULL
) {
2713 plog(LLV_ERROR
, LOCATION
, NULL
,
2714 "failed to get buffer to send acquire.\n");
2718 memset(newmsg
, 0, len
);
2719 newmsg
->sadb_msg_version
= PF_KEY_V2
;
2720 newmsg
->sadb_msg_type
= SADB_ACQUIRE
;
2721 newmsg
->sadb_msg_errno
= ENOENT
; /* XXX */
2722 newmsg
->sadb_msg_satype
= iph2
->satype
;
2723 newmsg
->sadb_msg_len
= PFKEY_UNIT64(len
);
2724 newmsg
->sadb_msg_reserved
= 0;
2725 newmsg
->sadb_msg_seq
= iph2
->seq
;
2726 newmsg
->sadb_msg_pid
= (u_int32_t
)getpid();
2729 len
= pfkey_send(lcconf
->sock_pfkey
, newmsg
, len
);
2731 racoon_free(newmsg
);
2737 * check if the algorithm is supported or not.
2742 pk_checkalg(class, calg
, keylen
)
2743 int class, calg
, keylen
;
2747 struct sadb_alg alg0
;
2749 switch (algclass2doi(class)) {
2750 case IPSECDOI_PROTO_IPSEC_ESP
:
2751 sup
= SADB_EXT_SUPPORTED_ENCRYPT
;
2753 case IPSECDOI_ATTR_AUTH
:
2754 sup
= SADB_EXT_SUPPORTED_AUTH
;
2756 case IPSECDOI_PROTO_IPCOMP
:
2757 plog(LLV_DEBUG
, LOCATION
, NULL
,
2758 "compression algorithm can not be checked "
2759 "because sadb message doesn't support it.\n");
2762 plog(LLV_ERROR
, LOCATION
, NULL
,
2763 "invalid algorithm class.\n");
2766 alg
= ipsecdoi2pfkey_alg(algclass2doi(class), algtype2doi(class, calg
));
2771 if (ipsec_get_keylen(sup
, alg
, &alg0
)) {
2772 plog(LLV_ERROR
, LOCATION
, NULL
,
2773 "%s.\n", ipsec_strerror());
2776 keylen
= alg0
.sadb_alg_minbits
;
2779 error
= ipsec_check_keylen(sup
, alg
, keylen
);
2781 plog(LLV_ERROR
, LOCATION
, NULL
,
2782 "%s.\n", ipsec_strerror());
2788 * differences with pfkey_recv() in libipsec/pfkey.c:
2789 * - never performs busy wait loop.
2790 * - returns NULL and set *lenp to negative on fatal failures
2791 * - returns NULL and set *lenp to non-negative on non-fatal failures
2792 * - returns non-NULL on success
2794 static struct sadb_msg
*
2799 struct sadb_msg
*newmsg
;
2801 socklen_t optlen
= sizeof(reallen
);
2803 if (getsockopt(so
, SOL_SOCKET
, SO_NREAD
, &reallen
, &optlen
) < 0)
2804 return NULL
; /*fatal*/
2809 if ((newmsg
= racoon_calloc(1, reallen
)) == NULL
)
2812 *lenp
= recv(so
, (caddr_t
)newmsg
, reallen
, 0);
2814 racoon_free(newmsg
);
2815 return NULL
; /*fatal*/
2816 } else if (*lenp
!= reallen
|| *lenp
< sizeof(struct sadb_msg
)) {
2817 racoon_free(newmsg
);
2830 return eay_random();
2837 struct secpolicy
*new;
2838 struct sadb_address
*saddr
, *daddr
;
2839 struct sadb_x_policy
*xpl
;
2842 if (mhp
[SADB_EXT_ADDRESS_SRC
] == NULL
2843 || mhp
[SADB_EXT_ADDRESS_DST
] == NULL
2844 || mhp
[SADB_X_EXT_POLICY
] == NULL
) {
2845 plog(LLV_ERROR
, LOCATION
, NULL
,
2846 "inappropriate sadb spd management message passed.\n");
2850 saddr
= (struct sadb_address
*)mhp
[SADB_EXT_ADDRESS_SRC
];
2851 daddr
= (struct sadb_address
*)mhp
[SADB_EXT_ADDRESS_DST
];
2852 xpl
= (struct sadb_x_policy
*)mhp
[SADB_X_EXT_POLICY
];
2855 /* bsd skips over per-socket policies because there will be no
2856 * src and dst extensions in spddump messages. On Linux the only
2857 * way to achieve the same is check for policy id.
2859 if (xpl
->sadb_x_policy_id
% 8 >= 3) return 0;
2864 plog(LLV_ERROR
, LOCATION
, NULL
,
2865 "failed to allocate buffer\n");
2869 new->spidx
.dir
= xpl
->sadb_x_policy_dir
;
2870 new->id
= xpl
->sadb_x_policy_id
;
2871 new->policy
= xpl
->sadb_x_policy_type
;
2875 switch (xpl
->sadb_x_policy_type
) {
2876 case IPSEC_POLICY_DISCARD
:
2877 case IPSEC_POLICY_GENERATE
:
2878 case IPSEC_POLICY_NONE
:
2879 case IPSEC_POLICY_ENTRUST
:
2880 case IPSEC_POLICY_BYPASS
:
2883 case IPSEC_POLICY_IPSEC
:
2886 struct sadb_x_ipsecrequest
*xisr
;
2887 struct ipsecrequest
**p_isr
= &new->req
;
2889 /* validity check */
2890 if (PFKEY_EXTLEN(xpl
) < sizeof(*xpl
)) {
2891 plog(LLV_ERROR
, LOCATION
, NULL
,
2892 "invalid msg length.\n");
2896 tlen
= PFKEY_EXTLEN(xpl
) - sizeof(*xpl
);
2897 xisr
= (struct sadb_x_ipsecrequest
*)(xpl
+ 1);
2902 if (xisr
->sadb_x_ipsecrequest_len
< sizeof(*xisr
)) {
2903 plog(LLV_ERROR
, LOCATION
, NULL
,
2904 "invalid msg length.\n");
2908 /* allocate request buffer */
2909 *p_isr
= newipsecreq();
2910 if (*p_isr
== NULL
) {
2911 plog(LLV_ERROR
, LOCATION
, NULL
,
2912 "failed to get new ipsecreq.\n");
2917 (*p_isr
)->next
= NULL
;
2919 switch (xisr
->sadb_x_ipsecrequest_proto
) {
2922 case IPPROTO_IPCOMP
:
2925 plog(LLV_ERROR
, LOCATION
, NULL
,
2926 "invalid proto type: %u\n",
2927 xisr
->sadb_x_ipsecrequest_proto
);
2930 (*p_isr
)->saidx
.proto
= xisr
->sadb_x_ipsecrequest_proto
;
2932 switch (xisr
->sadb_x_ipsecrequest_mode
) {
2933 case IPSEC_MODE_TRANSPORT
:
2934 case IPSEC_MODE_TUNNEL
:
2936 case IPSEC_MODE_ANY
:
2938 plog(LLV_ERROR
, LOCATION
, NULL
,
2939 "invalid mode: %u\n",
2940 xisr
->sadb_x_ipsecrequest_mode
);
2943 (*p_isr
)->saidx
.mode
= xisr
->sadb_x_ipsecrequest_mode
;
2945 switch (xisr
->sadb_x_ipsecrequest_level
) {
2946 case IPSEC_LEVEL_DEFAULT
:
2947 case IPSEC_LEVEL_USE
:
2948 case IPSEC_LEVEL_REQUIRE
:
2950 case IPSEC_LEVEL_UNIQUE
:
2951 (*p_isr
)->saidx
.reqid
=
2952 xisr
->sadb_x_ipsecrequest_reqid
;
2956 plog(LLV_ERROR
, LOCATION
, NULL
,
2957 "invalid level: %u\n",
2958 xisr
->sadb_x_ipsecrequest_level
);
2961 (*p_isr
)->level
= xisr
->sadb_x_ipsecrequest_level
;
2963 /* set IP addresses if there */
2964 if (xisr
->sadb_x_ipsecrequest_len
> sizeof(*xisr
)) {
2965 struct sockaddr
*paddr
;
2967 paddr
= (struct sockaddr
*)(xisr
+ 1);
2968 bcopy(paddr
, &(*p_isr
)->saidx
.src
,
2969 sysdep_sa_len(paddr
));
2971 paddr
= (struct sockaddr
*)((caddr_t
)paddr
2972 + sysdep_sa_len(paddr
));
2973 bcopy(paddr
, &(*p_isr
)->saidx
.dst
,
2974 sysdep_sa_len(paddr
));
2979 /* initialization for the next. */
2980 p_isr
= &(*p_isr
)->next
;
2981 tlen
-= xisr
->sadb_x_ipsecrequest_len
;
2983 /* validity check */
2985 plog(LLV_ERROR
, LOCATION
, NULL
,
2986 "becoming tlen < 0\n");
2989 xisr
= (struct sadb_x_ipsecrequest
*)((caddr_t
)xisr
2990 + xisr
->sadb_x_ipsecrequest_len
);
2995 plog(LLV_ERROR
, LOCATION
, NULL
,
2996 "invalid policy type.\n");
3000 #ifdef HAVE_PFKEY_POLICY_PRIORITY
3001 KEY_SETSECSPIDX(xpl
->sadb_x_policy_dir
,
3004 saddr
->sadb_address_prefixlen
,
3005 daddr
->sadb_address_prefixlen
,
3006 saddr
->sadb_address_proto
,
3007 xpl
->sadb_x_policy_priority
,
3010 KEY_SETSECSPIDX(xpl
->sadb_x_policy_dir
,
3013 saddr
->sadb_address_prefixlen
,
3014 daddr
->sadb_address_prefixlen
,
3015 saddr
->sadb_address_proto
,
3024 /* proto/mode/src->dst spi */
3026 sadbsecas2str(src
, dst
, proto
, spi
, mode
)
3027 struct sockaddr
*src
, *dst
;
3032 static char buf
[256];
3033 u_int doi_proto
, doi_mode
= 0;
3037 doi_proto
= pfkey2ipsecdoi_proto(proto
);
3038 if (doi_proto
== ~0)
3041 doi_mode
= pfkey2ipsecdoi_mode(mode
);
3046 blen
= sizeof(buf
) - 1;
3049 i
= snprintf(p
, blen
, "%s%s%s ",
3050 s_ipsecdoi_proto(doi_proto
),
3052 mode
? s_ipsecdoi_encmode(doi_mode
) : "");
3053 if (i
< 0 || i
>= blen
)
3058 i
= snprintf(p
, blen
, "%s->", saddr2str(src
));
3059 if (i
< 0 || i
>= blen
)
3064 i
= snprintf(p
, blen
, "%s ", saddr2str(dst
));
3065 if (i
< 0 || i
>= blen
)
3071 snprintf(p
, blen
, "spi=%lu(0x%lx)", (unsigned long)ntohl(spi
),
3072 (unsigned long)ntohl(spi
));