2 * Copyright (c) 2008-2020 Apple Inc. All rights reserved.
4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. The rights granted to you under the License
10 * may not be used to create, or enable the creation or redistribution of,
11 * unlawful or unlicensed copies of an Apple operating system, or to
12 * circumvent, violate, or enable the circumvention or violation of, any
13 * terms of an Apple operating system software license agreement.
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
18 * The Original Code and all software distributed under the License are
19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23 * Please see the License for the specific language governing rights and
24 * limitations under the License.
26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
29 /* $FreeBSD: src/sys/netkey/key.c,v 1.16.2.13 2002/07/24 18:17:40 ume Exp $ */
30 /* $KAME: key.c,v 1.191 2001/06/27 10:46:49 sakane Exp $ */
33 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
34 * All rights reserved.
36 * Redistribution and use in source and binary forms, with or without
37 * modification, are permitted provided that the following conditions
39 * 1. Redistributions of source code must retain the above copyright
40 * notice, this list of conditions and the following disclaimer.
41 * 2. Redistributions in binary form must reproduce the above copyright
42 * notice, this list of conditions and the following disclaimer in the
43 * documentation and/or other materials provided with the distribution.
44 * 3. Neither the name of the project nor the names of its contributors
45 * may be used to endorse or promote products derived from this software
46 * without specific prior written permission.
48 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
49 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
50 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
51 * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
52 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
53 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
54 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
55 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
56 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
57 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
62 * This code is referd to RFC 2367
65 #include <machine/endian.h>
66 #include <sys/types.h>
67 #include <sys/param.h>
68 #include <sys/systm.h>
69 #include <sys/kernel.h>
71 #include <sys/domain.h>
72 #include <sys/protosw.h>
73 #include <sys/malloc.h>
74 #include <sys/socket.h>
75 #include <sys/socketvar.h>
76 #include <sys/sysctl.h>
77 #include <sys/errno.h>
79 #include <sys/queue.h>
80 #include <sys/syslog.h>
81 #include <sys/mcache.h>
83 #include <kern/locks.h>
86 #include <net/route.h>
87 #include <net/raw_cb.h>
89 #include <netinet/in.h>
90 #include <netinet/in_systm.h>
91 #include <netinet/ip.h>
92 #include <netinet/in_var.h>
94 #include <netinet/ip6.h>
95 #include <netinet6/in6_var.h>
96 #include <netinet6/ip6_var.h>
98 #include <net/pfkeyv2.h>
99 #include <netkey/keydb.h>
100 #include <netkey/key.h>
101 #include <netkey/keysock.h>
102 #include <netkey/key_debug.h>
104 #include <libkern/crypto/rand.h>
106 #include <netinet6/ipsec.h>
107 #include <netinet6/ipsec6.h>
108 #include <netinet6/ah.h>
109 #include <netinet6/ah6.h>
111 #include <netinet6/esp.h>
112 #include <netinet6/esp6.h>
117 #include <sys/random.h>
119 #include <net/net_osdep.h>
121 #define FULLMASK 0xff
123 lck_grp_t
*sadb_mutex_grp
;
124 lck_grp_attr_t
*sadb_mutex_grp_attr
;
125 lck_attr_t
*sadb_mutex_attr
;
126 decl_lck_mtx_data(, sadb_mutex_data
);
127 lck_mtx_t
*sadb_mutex
= &sadb_mutex_data
;
129 lck_grp_t
*pfkey_stat_mutex_grp
;
130 lck_grp_attr_t
*pfkey_stat_mutex_grp_attr
;
131 lck_attr_t
*pfkey_stat_mutex_attr
;
132 decl_lck_mtx_data(, pfkey_stat_mutex_data
);
133 lck_mtx_t
*pfkey_stat_mutex
= &pfkey_stat_mutex_data
;
136 * Note on SA reference counting:
137 * - SAs that are not in DEAD state will have (total external reference + 1)
138 * following value in reference count field. they cannot be freed and are
139 * referenced from SA header.
140 * - SAs that are in DEAD state will have (total external reference)
141 * in reference count field. they are ready to be freed. reference from
142 * SA header will be removed in key_delsav(), when the reference count
143 * field hits 0 (= no external reference other than from SA header.
146 u_int32_t key_debug_level
= 0; //### our sysctl is not dynamic
147 static int key_timehandler_running
= 0;
148 static u_int key_spi_trycnt
= 1000;
149 static u_int32_t key_spi_minval
= 0x100;
150 static u_int32_t key_spi_maxval
= 0x0fffffff; /* XXX */
151 static u_int32_t policy_id
= 0;
152 static u_int key_int_random
= 60; /*interval to initialize randseed,1(m)*/
153 static u_int key_larval_lifetime
= 30; /* interval to expire acquiring, 30(s)*/
154 static int key_blockacq_count
= 10; /* counter for blocking SADB_ACQUIRE.*/
155 static int key_blockacq_lifetime
= 20; /* lifetime for blocking SADB_ACQUIRE.*/
156 static int key_preferred_oldsa
= 0; /* preferred old sa rather than new sa.*/
157 __private_extern__
int natt_keepalive_interval
= 20; /* interval between natt keepalives.*/
158 static u_int32_t ipsec_policy_count
= 0;
159 static u_int32_t ipsec_sav_count
= 0;
161 static u_int32_t acq_seq
= 0;
162 static int key_tick_init_random
= 0;
163 static u_int64_t up_time
= 0;
164 __private_extern__ u_int64_t natt_now
= 0;
166 static LIST_HEAD(_sptree
, secpolicy
) sptree
[IPSEC_DIR_MAX
]; /* SPD */
167 static LIST_HEAD(_sahtree
, secashead
) sahtree
; /* SAD */
168 static LIST_HEAD(_regtree
, secreg
) regtree
[SADB_SATYPE_MAX
+ 1];
169 static LIST_HEAD(_custom_sahtree
, secashead
) custom_sahtree
;
172 #define SPIHASHSIZE 128
173 #define SPIHASH(x) (((x) ^ ((x) >> 16)) % SPIHASHSIZE)
174 static LIST_HEAD(_spihash
, secasvar
) spihash
[SPIHASHSIZE
];
176 #ifndef IPSEC_NONBLOCK_ACQUIRE
177 static LIST_HEAD(_acqtree
, secacq
) acqtree
; /* acquiring list */
179 static LIST_HEAD(_spacqtree
, secspacq
) spacqtree
; /* SP acquiring list */
181 struct key_cb key_cb
;
183 /* search order for SAs */
184 static const u_int saorder_state_valid_prefer_old
[] = {
185 SADB_SASTATE_DYING
, SADB_SASTATE_MATURE
,
187 static const u_int saorder_state_valid_prefer_new
[] = {
188 SADB_SASTATE_MATURE
, SADB_SASTATE_DYING
,
190 static const u_int saorder_state_alive
[] = {
192 SADB_SASTATE_MATURE
, SADB_SASTATE_DYING
, SADB_SASTATE_LARVAL
194 static const u_int saorder_state_any
[] = {
195 SADB_SASTATE_MATURE
, SADB_SASTATE_DYING
,
196 SADB_SASTATE_LARVAL
, SADB_SASTATE_DEAD
199 static const int minsize
[] = {
200 sizeof(struct sadb_msg
), /* SADB_EXT_RESERVED */
201 sizeof(struct sadb_sa
), /* SADB_EXT_SA */
202 sizeof(struct sadb_lifetime
), /* SADB_EXT_LIFETIME_CURRENT */
203 sizeof(struct sadb_lifetime
), /* SADB_EXT_LIFETIME_HARD */
204 sizeof(struct sadb_lifetime
), /* SADB_EXT_LIFETIME_SOFT */
205 sizeof(struct sadb_address
), /* SADB_EXT_ADDRESS_SRC */
206 sizeof(struct sadb_address
), /* SADB_EXT_ADDRESS_DST */
207 sizeof(struct sadb_address
), /* SADB_EXT_ADDRESS_PROXY */
208 sizeof(struct sadb_key
), /* SADB_EXT_KEY_AUTH */
209 sizeof(struct sadb_key
), /* SADB_EXT_KEY_ENCRYPT */
210 sizeof(struct sadb_ident
), /* SADB_EXT_IDENTITY_SRC */
211 sizeof(struct sadb_ident
), /* SADB_EXT_IDENTITY_DST */
212 sizeof(struct sadb_sens
), /* SADB_EXT_SENSITIVITY */
213 sizeof(struct sadb_prop
), /* SADB_EXT_PROPOSAL */
214 sizeof(struct sadb_supported
), /* SADB_EXT_SUPPORTED_AUTH */
215 sizeof(struct sadb_supported
), /* SADB_EXT_SUPPORTED_ENCRYPT */
216 sizeof(struct sadb_spirange
), /* SADB_EXT_SPIRANGE */
217 0, /* SADB_X_EXT_KMPRIVATE */
218 sizeof(struct sadb_x_policy
), /* SADB_X_EXT_POLICY */
219 sizeof(struct sadb_x_sa2
), /* SADB_X_SA2 */
220 sizeof(struct sadb_session_id
), /* SADB_EXT_SESSION_ID */
221 sizeof(struct sadb_sastat
), /* SADB_EXT_SASTAT */
222 sizeof(struct sadb_x_ipsecif
), /* SADB_X_EXT_IPSECIF */
223 sizeof(struct sadb_address
), /* SADB_X_EXT_ADDR_RANGE_SRC_START */
224 sizeof(struct sadb_address
), /* SADB_X_EXT_ADDR_RANGE_SRC_END */
225 sizeof(struct sadb_address
), /* SADB_X_EXT_ADDR_RANGE_DST_START */
226 sizeof(struct sadb_address
), /* SADB_X_EXT_ADDR_RANGE_DST_END */
227 sizeof(struct sadb_address
), /* SADB_EXT_MIGRATE_ADDRESS_SRC */
228 sizeof(struct sadb_address
), /* SADB_EXT_MIGRATE_ADDRESS_DST */
229 sizeof(struct sadb_x_ipsecif
), /* SADB_X_EXT_MIGRATE_IPSECIF */
231 static const int maxsize
[] = {
232 sizeof(struct sadb_msg
), /* SADB_EXT_RESERVED */
233 sizeof(struct sadb_sa_2
), /* SADB_EXT_SA */
234 sizeof(struct sadb_lifetime
), /* SADB_EXT_LIFETIME_CURRENT */
235 sizeof(struct sadb_lifetime
), /* SADB_EXT_LIFETIME_HARD */
236 sizeof(struct sadb_lifetime
), /* SADB_EXT_LIFETIME_SOFT */
237 0, /* SADB_EXT_ADDRESS_SRC */
238 0, /* SADB_EXT_ADDRESS_DST */
239 0, /* SADB_EXT_ADDRESS_PROXY */
240 0, /* SADB_EXT_KEY_AUTH */
241 0, /* SADB_EXT_KEY_ENCRYPT */
242 0, /* SADB_EXT_IDENTITY_SRC */
243 0, /* SADB_EXT_IDENTITY_DST */
244 0, /* SADB_EXT_SENSITIVITY */
245 0, /* SADB_EXT_PROPOSAL */
246 0, /* SADB_EXT_SUPPORTED_AUTH */
247 0, /* SADB_EXT_SUPPORTED_ENCRYPT */
248 sizeof(struct sadb_spirange
), /* SADB_EXT_SPIRANGE */
249 0, /* SADB_X_EXT_KMPRIVATE */
250 0, /* SADB_X_EXT_POLICY */
251 sizeof(struct sadb_x_sa2
), /* SADB_X_SA2 */
252 0, /* SADB_EXT_SESSION_ID */
253 0, /* SADB_EXT_SASTAT */
254 sizeof(struct sadb_x_ipsecif
), /* SADB_X_EXT_IPSECIF */
255 0, /* SADB_X_EXT_ADDR_RANGE_SRC_START */
256 0, /* SADB_X_EXT_ADDR_RANGE_SRC_END */
257 0, /* SADB_X_EXT_ADDR_RANGE_DST_START */
258 0, /* SADB_X_EXT_ADDR_RANGE_DST_END */
259 0, /* SADB_EXT_MIGRATE_ADDRESS_SRC */
260 0, /* SADB_EXT_MIGRATE_ADDRESS_DST */
261 sizeof(struct sadb_x_ipsecif
), /* SADB_X_EXT_MIGRATE_IPSECIF */
264 static int ipsec_esp_keymin
= 256;
265 static int ipsec_esp_auth
= 0;
266 static int ipsec_ah_keymin
= 128;
268 SYSCTL_DECL(_net_key
);
269 /* Thread safe: no accumulated state */
270 SYSCTL_INT(_net_key
, KEYCTL_DEBUG_LEVEL
, debug
, CTLFLAG_RW
| CTLFLAG_LOCKED
, \
271 &key_debug_level
, 0, "");
274 /* max count of trial for the decision of spi value */
275 SYSCTL_INT(_net_key
, KEYCTL_SPI_TRY
, spi_trycnt
, CTLFLAG_RW
| CTLFLAG_LOCKED
, \
276 &key_spi_trycnt
, 0, "");
278 /* minimum spi value to allocate automatically. */
279 SYSCTL_INT(_net_key
, KEYCTL_SPI_MIN_VALUE
, spi_minval
, CTLFLAG_RW
| CTLFLAG_LOCKED
, \
280 &key_spi_minval
, 0, "");
282 /* maximun spi value to allocate automatically. */
283 SYSCTL_INT(_net_key
, KEYCTL_SPI_MAX_VALUE
, spi_maxval
, CTLFLAG_RW
| CTLFLAG_LOCKED
, \
284 &key_spi_maxval
, 0, "");
286 /* interval to initialize randseed */
287 SYSCTL_INT(_net_key
, KEYCTL_RANDOM_INT
, int_random
, CTLFLAG_RW
| CTLFLAG_LOCKED
, \
288 &key_int_random
, 0, "");
290 /* lifetime for larval SA; thread safe due to > compare */
291 SYSCTL_INT(_net_key
, KEYCTL_LARVAL_LIFETIME
, larval_lifetime
, CTLFLAG_RW
| CTLFLAG_LOCKED
, \
292 &key_larval_lifetime
, 0, "");
294 /* counter for blocking to send SADB_ACQUIRE to IKEd */
295 SYSCTL_INT(_net_key
, KEYCTL_BLOCKACQ_COUNT
, blockacq_count
, CTLFLAG_RW
| CTLFLAG_LOCKED
, \
296 &key_blockacq_count
, 0, "");
298 /* lifetime for blocking to send SADB_ACQUIRE to IKEd: Thread safe, > compare */
299 SYSCTL_INT(_net_key
, KEYCTL_BLOCKACQ_LIFETIME
, blockacq_lifetime
, CTLFLAG_RW
| CTLFLAG_LOCKED
, \
300 &key_blockacq_lifetime
, 0, "");
303 SYSCTL_INT(_net_key
, KEYCTL_ESP_AUTH
, esp_auth
, CTLFLAG_RW
| CTLFLAG_LOCKED
, \
304 &ipsec_esp_auth
, 0, "");
306 /* minimum ESP key length */
307 SYSCTL_INT(_net_key
, KEYCTL_ESP_KEYMIN
, esp_keymin
, CTLFLAG_RW
| CTLFLAG_LOCKED
, \
308 &ipsec_esp_keymin
, 0, "");
310 /* minimum AH key length */
311 SYSCTL_INT(_net_key
, KEYCTL_AH_KEYMIN
, ah_keymin
, CTLFLAG_RW
| CTLFLAG_LOCKED
, \
312 &ipsec_ah_keymin
, 0, "");
314 /* perfered old SA rather than new SA */
315 SYSCTL_INT(_net_key
, KEYCTL_PREFERED_OLDSA
, prefered_oldsa
, CTLFLAG_RW
| CTLFLAG_LOCKED
, \
316 &key_preferred_oldsa
, 0, "");
318 /* time between NATT keepalives in seconds, 0 disabled */
319 SYSCTL_INT(_net_key
, KEYCTL_NATT_KEEPALIVE_INTERVAL
, natt_keepalive_interval
, CTLFLAG_RW
| CTLFLAG_LOCKED
, \
320 &natt_keepalive_interval
, 0, "");
322 /* PF_KEY statistics */
323 SYSCTL_STRUCT(_net_key
, KEYCTL_PFKEYSTAT
, pfkeystat
, CTLFLAG_RD
| CTLFLAG_LOCKED
, \
324 &pfkeystat
, pfkeystat
, "");
327 #define LIST_FOREACH(elm, head, field) \
328 for (elm = LIST_FIRST(head); elm; elm = LIST_NEXT(elm, field))
330 #define __LIST_CHAINED(elm) \
331 (!((elm)->chain.le_next == NULL && (elm)->chain.le_prev == NULL))
332 #define LIST_INSERT_TAIL(head, elm, type, field) \
334 struct type *curelm = LIST_FIRST(head); \
335 if (curelm == NULL) {\
336 LIST_INSERT_HEAD(head, elm, field); \
338 while (LIST_NEXT(curelm, field)) \
339 curelm = LIST_NEXT(curelm, field);\
340 LIST_INSERT_AFTER(curelm, elm, field);\
344 #define KEY_CHKSASTATE(head, sav, name) \
346 if ((head) != (sav)) { \
347 ipseclog((LOG_DEBUG, "%s: state mismatched (TREE=%d SA=%d)\n", \
348 (name), (head), (sav))); \
353 #define KEY_CHKSPDIR(head, sp, name) \
355 if ((head) != (sp)) { \
356 ipseclog((LOG_DEBUG, "%s: direction mismatched (TREE=%d SP=%d), " \
357 "anyway continue.\n", \
358 (name), (head), (sp))); \
363 #define KMALLOC_WAIT(p, t, n) \
364 ((p) = (t) _MALLOC((n), M_SECA, M_WAITOK))
365 #define KMALLOC_NOWAIT(p, t, n) \
366 ((p) = (t) _MALLOC((n), M_SECA, M_NOWAIT))
368 _FREE((caddr_t)(p), M_SECA);
370 #define KMALLOC_WAIT(p, t, n) \
372 ((p) = (t)_MALLOC((u_int32_t)(n), M_SECA, M_WAITOK)); \
373 printf("%s %d: %p <- KMALLOC_WAIT(%s, %d)\n", \
374 __FILE__, __LINE__, (p), #t, n); \
376 #define KMALLOC_NOWAIT(p, t, n) \
378 ((p) = (t)_MALLOC((u_int32_t)(n), M_SECA, M_NOWAIT)); \
379 printf("%s %d: %p <- KMALLOC_NOWAIT(%s, %d)\n", \
380 __FILE__, __LINE__, (p), #t, n); \
385 printf("%s %d: %p -> KFREE()\n", __FILE__, __LINE__, (p)); \
386 _FREE((caddr_t)(p), M_SECA); \
391 * set parameters into secpolicyindex buffer.
392 * Must allocate secpolicyindex buffer passed to this function.
394 #define KEY_SETSECSPIDX(_dir, s, d, ps, pd, ulp, ifp, s_s, s_e, d_s, d_e, idx) \
396 bzero((idx), sizeof(struct secpolicyindex)); \
397 (idx)->dir = (_dir); \
398 (idx)->prefs = (ps); \
399 (idx)->prefd = (pd); \
400 (idx)->ul_proto = (ulp); \
401 (idx)->internal_if = (ifp); \
402 if (s) bcopy((s), &(idx)->src, ((struct sockaddr *)(s))->sa_len); \
403 if (d) bcopy((d), &(idx)->dst, ((struct sockaddr *)(d))->sa_len); \
404 if (s_s) bcopy((s_s), &(idx)->src_range.start, ((struct sockaddr *)(s_s))->sa_len); \
405 if (s_e) bcopy((s_e), &(idx)->src_range.end, ((struct sockaddr *)(s_e))->sa_len); \
406 if (d_s) bcopy((d_s), &(idx)->dst_range.start, ((struct sockaddr *)(d_s))->sa_len); \
407 if (d_e) bcopy((d_e), &(idx)->dst_range.end, ((struct sockaddr *)(d_e))->sa_len); \
411 * set parameters into secasindex buffer.
412 * Must allocate secasindex buffer before calling this function.
414 #define KEY_SETSECASIDX(p, m, r, s, d, ifi, idx) \
416 bzero((idx), sizeof(struct secasindex)); \
417 (idx)->proto = (p); \
419 (idx)->reqid = (r); \
420 bcopy((s), &(idx)->src, ((const struct sockaddr *)(s))->sa_len); \
421 bcopy((d), &(idx)->dst, ((const struct sockaddr *)(d))->sa_len); \
422 (idx)->ipsec_ifindex = (ifi); \
427 u_int32_t getspi_count
; /* the avarage of count to try to get new SPI */
431 struct sadb_msg
*msg
;
432 struct sadb_ext
*ext
[SADB_EXT_MAX
+ 1];
433 int extoff
[SADB_EXT_MAX
+ 1];
434 int extlen
[SADB_EXT_MAX
+ 1];
437 static struct secpolicy
*__key_getspbyid(u_int32_t id
);
438 static struct secasvar
*key_do_allocsa_policy(struct secashead
*, u_int
, u_int16_t
);
439 static int key_do_get_translated_port(struct secashead
*, struct secasvar
*, u_int
);
440 static void key_delsp(struct secpolicy
*);
441 static struct secpolicy
*key_getsp(struct secpolicyindex
*);
442 static u_int16_t
key_newreqid(void);
443 static struct mbuf
*key_gather_mbuf(struct mbuf
*,
444 const struct sadb_msghdr
*, int, int, int *);
445 static int key_spdadd(struct socket
*, struct mbuf
*,
446 const struct sadb_msghdr
*);
447 static u_int32_t
key_getnewspid(void);
448 static int key_spddelete(struct socket
*, struct mbuf
*,
449 const struct sadb_msghdr
*);
450 static int key_spddelete2(struct socket
*, struct mbuf
*,
451 const struct sadb_msghdr
*);
452 static int key_spdenable(struct socket
*, struct mbuf
*,
453 const struct sadb_msghdr
*);
454 static int key_spddisable(struct socket
*, struct mbuf
*,
455 const struct sadb_msghdr
*);
456 static int key_spdget(struct socket
*, struct mbuf
*,
457 const struct sadb_msghdr
*);
458 static int key_spdflush(struct socket
*, struct mbuf
*,
459 const struct sadb_msghdr
*);
460 static int key_spddump(struct socket
*, struct mbuf
*,
461 const struct sadb_msghdr
*);
462 static struct mbuf
*key_setdumpsp(struct secpolicy
*,
463 u_int8_t
, u_int32_t
, u_int32_t
);
464 static u_int
key_getspreqmsglen(struct secpolicy
*);
465 static int key_spdexpire(struct secpolicy
*);
466 static struct secashead
*key_newsah(struct secasindex
*, ifnet_t
, u_int
, u_int8_t
, u_int16_t
);
467 static struct secasvar
*key_newsav(struct mbuf
*,
468 const struct sadb_msghdr
*, struct secashead
*, int *,
470 static struct secashead
*key_getsah(struct secasindex
*, u_int16_t
);
471 static struct secasvar
*key_checkspidup(struct secasindex
*, u_int32_t
);
472 static void key_setspi
__P((struct secasvar
*, u_int32_t
));
473 static struct secasvar
*key_getsavbyspi(struct secashead
*, u_int32_t
);
474 static int key_setsaval(struct secasvar
*, struct mbuf
*,
475 const struct sadb_msghdr
*);
476 static int key_mature(struct secasvar
*);
477 static struct mbuf
*key_setdumpsa(struct secasvar
*, u_int8_t
,
478 u_int8_t
, u_int32_t
, u_int32_t
);
479 static struct mbuf
*key_setsadbmsg(u_int8_t
, u_int16_t
, u_int8_t
,
480 u_int32_t
, pid_t
, u_int16_t
);
481 static struct mbuf
*key_setsadbsa(struct secasvar
*);
482 static struct mbuf
*key_setsadbaddr(u_int16_t
,
483 struct sockaddr
*, size_t, u_int8_t
);
484 static struct mbuf
*key_setsadbipsecif(ifnet_t
, ifnet_t
, ifnet_t
, u_int8_t
);
485 static struct mbuf
*key_setsadbxsa2(u_int8_t
, u_int32_t
, u_int32_t
, u_int16_t
);
486 static struct mbuf
*key_setsadbxpolicy(u_int16_t
, u_int8_t
,
488 static void *key_newbuf(const void *, u_int
);
489 static int key_ismyaddr6(struct sockaddr_in6
*);
490 static void key_update_natt_keepalive_timestamp(struct secasvar
*, struct secasvar
*);
492 /* flags for key_cmpsaidx() */
493 #define CMP_HEAD 0x1 /* protocol, addresses. */
494 #define CMP_PORT 0x2 /* additionally HEAD, reqid, mode. */
495 #define CMP_REQID 0x4 /* additionally HEAD, reqid. */
496 #define CMP_MODE 0x8 /* additionally mode. */
497 #define CMP_EXACTLY 0xF /* all elements. */
498 static int key_cmpsaidx(struct secasindex
*, struct secasindex
*, int);
500 static int key_cmpspidx_exactly(struct secpolicyindex
*,
501 struct secpolicyindex
*);
502 static int key_cmpspidx_withmask(struct secpolicyindex
*,
503 struct secpolicyindex
*);
504 static int key_sockaddrcmp(struct sockaddr
*, struct sockaddr
*, int);
505 static int key_is_addr_in_range(struct sockaddr_storage
*, struct secpolicyaddrrange
*);
506 static int key_bbcmp(caddr_t
, caddr_t
, u_int
);
507 static void key_srandom(void);
508 static u_int8_t
key_satype2proto(u_int8_t
);
509 static u_int8_t
key_proto2satype(u_int16_t
);
511 static int key_getspi(struct socket
*, struct mbuf
*,
512 const struct sadb_msghdr
*);
513 static u_int32_t
key_do_getnewspi(struct sadb_spirange
*, struct secasindex
*);
514 static int key_update(struct socket
*, struct mbuf
*,
515 const struct sadb_msghdr
*);
516 static int key_add(struct socket
*, struct mbuf
*, const struct sadb_msghdr
*);
517 static struct mbuf
*key_getmsgbuf_x1(struct mbuf
*, const struct sadb_msghdr
*);
518 static int key_delete(struct socket
*, struct mbuf
*,
519 const struct sadb_msghdr
*);
520 static int key_get(struct socket
*, struct mbuf
*, const struct sadb_msghdr
*);
522 static void key_getcomb_setlifetime(struct sadb_comb
*);
524 static struct mbuf
*key_getcomb_esp(void);
526 static struct mbuf
*key_getcomb_ah(void);
527 static struct mbuf
*key_getprop(const struct secasindex
*);
529 static int key_acquire(struct secasindex
*, struct secpolicy
*);
530 #ifndef IPSEC_NONBLOCK_ACQUIRE
531 static struct secacq
*key_newacq(struct secasindex
*);
532 static struct secacq
*key_getacq(struct secasindex
*);
533 static struct secacq
*key_getacqbyseq(u_int32_t
);
535 static struct secspacq
*key_newspacq(struct secpolicyindex
*);
536 static struct secspacq
*key_getspacq(struct secpolicyindex
*);
537 static int key_acquire2(struct socket
*, struct mbuf
*,
538 const struct sadb_msghdr
*);
539 static int key_register(struct socket
*, struct mbuf
*,
540 const struct sadb_msghdr
*);
541 static int key_expire(struct secasvar
*);
542 static int key_flush(struct socket
*, struct mbuf
*,
543 const struct sadb_msghdr
*);
544 static int key_dump(struct socket
*, struct mbuf
*, const struct sadb_msghdr
*);
545 static int key_promisc(struct socket
*, struct mbuf
*,
546 const struct sadb_msghdr
*);
547 static int key_senderror(struct socket
*, struct mbuf
*, int);
548 static int key_validate_ext(const struct sadb_ext
*, int);
549 static int key_align(struct mbuf
*, struct sadb_msghdr
*);
550 static struct mbuf
*key_alloc_mbuf(int);
551 static int key_getsastat(struct socket
*, struct mbuf
*, const struct sadb_msghdr
*);
552 static int key_migrate(struct socket
*, struct mbuf
*, const struct sadb_msghdr
*);
553 static void bzero_keys(const struct sadb_msghdr
*);
555 extern int ipsec_bypass
;
556 extern int esp_udp_encap_port
;
557 int ipsec_send_natt_keepalive(struct secasvar
*sav
);
558 bool ipsec_fill_offload_frame(ifnet_t ifp
, struct secasvar
*sav
, struct ifnet_keepalive_offload_frame
*frame
, size_t frame_data_offset
);
560 void key_init(struct protosw
*, struct domain
*);
564 * setup locks, call raw_init(), and then init timer and associated data
568 key_init(struct protosw
*pp
, struct domain
*dp
)
570 static int key_initialized
= 0;
573 VERIFY((pp
->pr_flags
& (PR_INITIALIZED
| PR_ATTACHED
)) == PR_ATTACHED
);
575 _CASSERT(PFKEY_ALIGN8(sizeof(struct sadb_msg
)) <= _MHLEN
);
576 _CASSERT(MAX_REPLAY_WINDOWS
== MBUF_TC_MAX
);
578 if (key_initialized
) {
583 sadb_mutex_grp_attr
= lck_grp_attr_alloc_init();
584 sadb_mutex_grp
= lck_grp_alloc_init("sadb", sadb_mutex_grp_attr
);
585 sadb_mutex_attr
= lck_attr_alloc_init();
587 lck_mtx_init(sadb_mutex
, sadb_mutex_grp
, sadb_mutex_attr
);
589 pfkey_stat_mutex_grp_attr
= lck_grp_attr_alloc_init();
590 pfkey_stat_mutex_grp
= lck_grp_alloc_init("pfkey_stat", pfkey_stat_mutex_grp_attr
);
591 pfkey_stat_mutex_attr
= lck_attr_alloc_init();
593 lck_mtx_init(pfkey_stat_mutex
, pfkey_stat_mutex_grp
, pfkey_stat_mutex_attr
);
595 for (i
= 0; i
< SPIHASHSIZE
; i
++) {
596 LIST_INIT(&spihash
[i
]);
601 bzero((caddr_t
)&key_cb
, sizeof(key_cb
));
603 for (i
= 0; i
< IPSEC_DIR_MAX
; i
++) {
604 LIST_INIT(&sptree
[i
]);
606 ipsec_policy_count
= 0;
609 LIST_INIT(&custom_sahtree
);
611 for (i
= 0; i
<= SADB_SATYPE_MAX
; i
++) {
612 LIST_INIT(®tree
[i
]);
616 #ifndef IPSEC_NONBLOCK_ACQUIRE
619 LIST_INIT(&spacqtree
);
623 ip4_def_policy
.policy
= IPSEC_POLICY_NONE
;
624 ip4_def_policy
.refcnt
++; /*never reclaim this*/
626 ip6_def_policy
.policy
= IPSEC_POLICY_NONE
;
627 ip6_def_policy
.refcnt
++; /*never reclaim this*/
629 key_timehandler_running
= 0;
631 /* initialize key statistics */
632 keystat
.getspi_count
= 1;
636 printf("IPsec: Initialized Security Association Processing.\n");
641 key_start_timehandler(void)
643 /* must be called while locked */
644 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_OWNED
);
645 if (key_timehandler_running
== 0) {
646 key_timehandler_running
= 1;
647 (void)timeout((void *)key_timehandler
, (void *)0, hz
);
650 /* Turn off the ipsec bypass */
651 if (ipsec_bypass
!= 0) {
656 /* %%% IPsec policy management */
658 * allocating a SP for OUTBOUND or INBOUND packet.
659 * Must call key_freesp() later.
660 * OUT: NULL: not found
661 * others: found and return the pointer.
665 struct secpolicyindex
*spidx
,
668 struct secpolicy
*sp
;
671 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_NOTOWNED
);
674 panic("key_allocsp: NULL pointer is passed.\n");
677 /* check direction */
679 case IPSEC_DIR_INBOUND
:
680 case IPSEC_DIR_OUTBOUND
:
683 panic("key_allocsp: Invalid direction is passed.\n");
687 KEYDEBUG(KEYDEBUG_IPSEC_DATA
,
688 printf("*** objects\n");
689 kdebug_secpolicyindex(spidx
));
691 lck_mtx_lock(sadb_mutex
);
692 LIST_FOREACH(sp
, &sptree
[dir
], chain
) {
693 KEYDEBUG(KEYDEBUG_IPSEC_DATA
,
694 printf("*** in SPD\n");
695 kdebug_secpolicyindex(&sp
->spidx
));
697 if (sp
->state
== IPSEC_SPSTATE_DEAD
) {
701 /* If the policy is disabled, skip */
702 if (sp
->disabled
> 0) {
706 /* If the incoming spidx specifies bound if,
707 * ignore unbound policies*/
708 if (spidx
->internal_if
!= NULL
709 && (sp
->spidx
.internal_if
== NULL
|| sp
->ipsec_if
== NULL
)) {
713 if (key_cmpspidx_withmask(&sp
->spidx
, spidx
)) {
717 lck_mtx_unlock(sadb_mutex
);
722 /* found a SPD entry */
724 sp
->lastused
= tv
.tv_sec
;
726 lck_mtx_unlock(sadb_mutex
);
729 KEY_CHKSPDIR(sp
->spidx
.dir
, dir
, "key_allocsp");
730 KEYDEBUG(KEYDEBUG_IPSEC_STAMP
,
731 printf("DP key_allocsp cause refcnt++:%d SP:0x%llx\n",
732 sp
->refcnt
, (uint64_t)VM_KERNEL_ADDRPERM(sp
)));
737 * return a policy that matches this particular inbound packet.
742 struct sockaddr
*osrc
,
743 struct sockaddr
*odst
,
744 struct sockaddr
*isrc
,
745 struct sockaddr
*idst
)
747 struct secpolicy
*sp
;
748 const int dir
= IPSEC_DIR_INBOUND
;
750 struct ipsecrequest
*r1
, *r2
, *p
;
751 struct sockaddr
*os
, *od
, *is
, *id
;
752 struct secpolicyindex spidx
;
754 if (isrc
->sa_family
!= idst
->sa_family
) {
755 ipseclog((LOG_ERR
, "protocol family mismatched %d != %d\n.",
756 isrc
->sa_family
, idst
->sa_family
));
760 lck_mtx_lock(sadb_mutex
);
761 LIST_FOREACH(sp
, &sptree
[dir
], chain
) {
762 if (sp
->state
== IPSEC_SPSTATE_DEAD
) {
767 for (p
= sp
->req
; p
; p
= p
->next
) {
768 if (p
->saidx
.mode
!= IPSEC_MODE_TUNNEL
) {
776 /* here we look at address matches only */
778 if (isrc
->sa_len
> sizeof(spidx
.src
) ||
779 idst
->sa_len
> sizeof(spidx
.dst
)) {
782 bcopy(isrc
, &spidx
.src
, isrc
->sa_len
);
783 bcopy(idst
, &spidx
.dst
, idst
->sa_len
);
784 if (!key_cmpspidx_withmask(&sp
->spidx
, &spidx
)) {
788 is
= (struct sockaddr
*)&r1
->saidx
.src
;
789 id
= (struct sockaddr
*)&r1
->saidx
.dst
;
790 if (key_sockaddrcmp(is
, isrc
, 0) ||
791 key_sockaddrcmp(id
, idst
, 0)) {
796 os
= (struct sockaddr
*)&r2
->saidx
.src
;
797 od
= (struct sockaddr
*)&r2
->saidx
.dst
;
798 if (key_sockaddrcmp(os
, osrc
, 0) ||
799 key_sockaddrcmp(od
, odst
, 0)) {
806 lck_mtx_unlock(sadb_mutex
);
811 sp
->lastused
= tv
.tv_sec
;
813 lck_mtx_unlock(sadb_mutex
);
818 key_alloc_outbound_sav_for_interface(ifnet_t interface
, int family
,
819 struct sockaddr
*src
,
820 struct sockaddr
*dst
)
822 struct secashead
*sah
;
823 struct secasvar
*sav
;
826 const u_int
*saorder_state_valid
;
828 struct sockaddr_in
*sin
;
832 if (interface
== NULL
) {
836 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_NOTOWNED
);
838 lck_mtx_lock(sadb_mutex
);
841 LIST_FOREACH(sah
, &sahtree
, chain
) {
842 if (sah
->state
== SADB_SASTATE_DEAD
) {
845 if (sah
->ipsec_if
== interface
&&
846 (family
== AF_INET6
|| family
== AF_INET
) &&
847 sah
->dir
== IPSEC_DIR_OUTBOUND
) {
849 sah
->saidx
.mode
== IPSEC_MODE_TRANSPORT
&&
850 src
!= NULL
&& dst
!= NULL
) {
851 // Validate addresses for transport mode
852 if (key_sockaddrcmp((struct sockaddr
*)&sah
->saidx
.src
, src
, 0) != 0) {
853 // Source doesn't match
857 if (key_sockaddrcmp((struct sockaddr
*)&sah
->saidx
.dst
, dst
, 0) != 0) {
858 // Destination doesn't match
863 /* This SAH is linked to the IPsec interface, and the right family. We found it! */
864 if (key_preferred_oldsa
) {
865 saorder_state_valid
= saorder_state_valid_prefer_old
;
866 arraysize
= _ARRAYLEN(saorder_state_valid_prefer_old
);
868 saorder_state_valid
= saorder_state_valid_prefer_new
;
869 arraysize
= _ARRAYLEN(saorder_state_valid_prefer_new
);
872 sin
= (struct sockaddr_in
*)&sah
->saidx
.dst
;
873 dstport
= sin
->sin_port
;
874 if (sah
->saidx
.mode
== IPSEC_MODE_TRANSPORT
) {
875 sin
->sin_port
= IPSEC_PORT_ANY
;
878 for (stateidx
= 0; stateidx
< arraysize
; stateidx
++) {
879 state
= saorder_state_valid
[stateidx
];
880 sav
= key_do_allocsa_policy(sah
, state
, dstport
);
882 lck_mtx_unlock(sadb_mutex
);
891 // If we didn't find anything, try again without strict
894 // We already were on the second try, bail
899 lck_mtx_unlock(sadb_mutex
);
904 * allocating an SA entry for an *OUTBOUND* packet.
905 * checking each request entries in SP, and acquire an SA if need.
906 * OUT: 0: there are valid requests.
907 * ENOENT: policy may be valid, but SA with REQUIRE is on acquiring.
911 struct ipsecrequest
*isr
,
912 struct secasindex
*saidx
,
913 struct secasvar
**sav
)
917 struct sockaddr_in
*sin
;
919 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_NOTOWNED
);
924 if (isr
== NULL
|| saidx
== NULL
) {
925 panic("key_checkrequest: NULL pointer is passed.\n");
929 switch (saidx
->mode
) {
930 case IPSEC_MODE_TRANSPORT
:
931 case IPSEC_MODE_TUNNEL
:
935 panic("key_checkrequest: Invalid policy defined.\n");
938 /* get current level */
939 level
= ipsec_get_reqlevel(isr
);
943 * key_allocsa_policy should allocate the oldest SA available.
944 * See key_do_allocsa_policy(), and draft-jenkins-ipsec-rekeying-03.txt.
947 *sav
= key_allocsa_policy(saidx
);
950 /* When there is SA. */
957 * Remove dst port - used for special natt support - don't call
958 * key_acquire with it.
960 if (saidx
->mode
== IPSEC_MODE_TRANSPORT
) {
961 sin
= (struct sockaddr_in
*)&saidx
->dst
;
962 sin
->sin_port
= IPSEC_PORT_ANY
;
964 if ((error
= key_acquire(saidx
, isr
->sp
)) != 0) {
965 /* XXX What should I do ? */
966 ipseclog((LOG_DEBUG
, "key_checkrequest: error %d returned "
967 "from key_acquire.\n", error
));
971 return level
== IPSEC_LEVEL_REQUIRE
? ENOENT
: 0;
975 * allocating a SA for policy entry from SAD.
976 * NOTE: searching SAD of aliving state.
977 * OUT: NULL: not found.
978 * others: found and return the pointer.
980 u_int32_t sah_search_calls
= 0;
981 u_int32_t sah_search_count
= 0;
984 struct secasindex
*saidx
)
986 struct secashead
*sah
;
987 struct secasvar
*sav
;
988 u_int stateidx
, state
;
989 const u_int
*saorder_state_valid
;
991 struct sockaddr_in
*sin
;
994 lck_mtx_lock(sadb_mutex
);
996 LIST_FOREACH(sah
, &sahtree
, chain
) {
998 if (sah
->state
== SADB_SASTATE_DEAD
) {
1001 if (key_cmpsaidx(&sah
->saidx
, saidx
, CMP_MODE
| CMP_REQID
)) {
1005 lck_mtx_unlock(sadb_mutex
);
1011 * search a valid state list for outbound packet.
1012 * This search order is important.
1014 if (key_preferred_oldsa
) {
1015 saorder_state_valid
= saorder_state_valid_prefer_old
;
1016 arraysize
= _ARRAYLEN(saorder_state_valid_prefer_old
);
1018 saorder_state_valid
= saorder_state_valid_prefer_new
;
1019 arraysize
= _ARRAYLEN(saorder_state_valid_prefer_new
);
1023 sin
= (struct sockaddr_in
*)&saidx
->dst
;
1024 dstport
= sin
->sin_port
;
1025 if (saidx
->mode
== IPSEC_MODE_TRANSPORT
) {
1026 sin
->sin_port
= IPSEC_PORT_ANY
;
1029 for (stateidx
= 0; stateidx
< arraysize
; stateidx
++) {
1030 state
= saorder_state_valid
[stateidx
];
1032 sav
= key_do_allocsa_policy(sah
, state
, dstport
);
1034 lck_mtx_unlock(sadb_mutex
);
1038 lck_mtx_unlock(sadb_mutex
);
1043 key_send_delete(struct secasvar
*sav
)
1045 struct mbuf
*m
, *result
;
1048 key_sa_chgstate(sav
, SADB_SASTATE_DEAD
);
1050 if ((satype
= key_proto2satype(sav
->sah
->saidx
.proto
)) == 0) {
1051 panic("key_do_allocsa_policy: invalid proto is passed.\n");
1054 m
= key_setsadbmsg(SADB_DELETE
, 0,
1055 satype
, 0, 0, (u_int16_t
)(sav
->refcnt
- 1));
1061 /* set sadb_address for saidx's. */
1062 m
= key_setsadbaddr(SADB_EXT_ADDRESS_SRC
,
1063 (struct sockaddr
*)&sav
->sah
->saidx
.src
,
1064 sav
->sah
->saidx
.src
.ss_len
<< 3,
1071 /* set sadb_address for saidx's. */
1072 m
= key_setsadbaddr(SADB_EXT_ADDRESS_DST
,
1073 (struct sockaddr
*)&sav
->sah
->saidx
.dst
,
1074 sav
->sah
->saidx
.src
.ss_len
<< 3,
1081 /* create SA extension */
1082 m
= key_setsadbsa(sav
);
1088 if (result
->m_len
< sizeof(struct sadb_msg
)) {
1089 result
= m_pullup(result
,
1090 sizeof(struct sadb_msg
));
1091 if (result
== NULL
) {
1096 result
->m_pkthdr
.len
= 0;
1097 for (m
= result
; m
; m
= m
->m_next
) {
1098 result
->m_pkthdr
.len
+= m
->m_len
;
1101 VERIFY(PFKEY_UNIT64(result
->m_pkthdr
.len
) <= UINT16_MAX
);
1102 mtod(result
, struct sadb_msg
*)->sadb_msg_len
=
1103 (u_int16_t
)PFKEY_UNIT64(result
->m_pkthdr
.len
);
1105 if (key_sendup_mbuf(NULL
, result
,
1106 KEY_SENDUP_REGISTERED
)) {
1110 key_freesav(sav
, KEY_SADB_LOCKED
);
1114 * searching SAD with direction, protocol, mode and state.
1115 * called by key_allocsa_policy().
1118 * others : found, pointer to a SA.
1120 static struct secasvar
*
1121 key_do_allocsa_policy(
1122 struct secashead
*sah
,
1126 struct secasvar
*sav
, *nextsav
, *candidate
, *natt_candidate
, *no_natt_candidate
, *d
;
1128 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_OWNED
);
1132 natt_candidate
= NULL
;
1133 no_natt_candidate
= NULL
;
1135 for (sav
= LIST_FIRST(&sah
->savtree
[state
]);
1138 nextsav
= LIST_NEXT(sav
, chain
);
1141 KEY_CHKSASTATE(sav
->state
, state
, "key_do_allocsa_policy");
1143 if (sah
->saidx
.mode
== IPSEC_MODE_TUNNEL
&& dstport
&&
1144 ((sav
->flags
& SADB_X_EXT_NATT
) != 0) &&
1145 ntohs(dstport
) != sav
->remote_ike_port
) {
1149 if (sah
->saidx
.mode
== IPSEC_MODE_TRANSPORT
&&
1150 ((sav
->flags
& SADB_X_EXT_NATT_MULTIPLEUSERS
) != 0) &&
1151 ntohs(dstport
) != sav
->remote_ike_port
) {
1152 continue; /* skip this one - not a match - or not UDP */
1154 if ((sah
->saidx
.mode
== IPSEC_MODE_TUNNEL
&&
1155 ((sav
->flags
& SADB_X_EXT_NATT
) != 0)) ||
1156 (sah
->saidx
.mode
== IPSEC_MODE_TRANSPORT
&&
1157 ((sav
->flags
& SADB_X_EXT_NATT_MULTIPLEUSERS
) != 0))) {
1158 if (natt_candidate
== NULL
) {
1159 natt_candidate
= sav
;
1162 candidate
= natt_candidate
;
1165 if (no_natt_candidate
== NULL
) {
1166 no_natt_candidate
= sav
;
1169 candidate
= no_natt_candidate
;
1173 /* Which SA is the better ? */
1175 /* sanity check 2 */
1176 if (candidate
->lft_c
== NULL
|| sav
->lft_c
== NULL
) {
1177 panic("key_do_allocsa_policy: "
1178 "lifetime_current is NULL.\n");
1181 /* What the best method is to compare ? */
1182 if (key_preferred_oldsa
) {
1183 if (candidate
->lft_c
->sadb_lifetime_addtime
>
1184 sav
->lft_c
->sadb_lifetime_addtime
) {
1185 if ((sav
->flags
& SADB_X_EXT_NATT_MULTIPLEUSERS
) != 0) {
1186 natt_candidate
= sav
;
1188 no_natt_candidate
= sav
;
1195 /* prefered new sa rather than old sa */
1196 if (candidate
->lft_c
->sadb_lifetime_addtime
<
1197 sav
->lft_c
->sadb_lifetime_addtime
) {
1199 if ((sah
->saidx
.mode
== IPSEC_MODE_TUNNEL
&&
1200 ((sav
->flags
& SADB_X_EXT_NATT
) != 0)) ||
1201 (sah
->saidx
.mode
== IPSEC_MODE_TRANSPORT
&&
1202 ((sav
->flags
& SADB_X_EXT_NATT_MULTIPLEUSERS
) != 0))) {
1203 natt_candidate
= sav
;
1205 no_natt_candidate
= sav
;
1212 * prepared to delete the SA when there is more
1213 * suitable candidate and the lifetime of the SA is not
1216 if (d
->lft_c
->sadb_lifetime_addtime
!= 0) {
1221 /* choose latest if both types present */
1222 if (natt_candidate
== NULL
) {
1223 candidate
= no_natt_candidate
;
1224 } else if (no_natt_candidate
== NULL
) {
1225 candidate
= natt_candidate
;
1226 } else if (sah
->saidx
.mode
== IPSEC_MODE_TUNNEL
&& dstport
) {
1227 candidate
= natt_candidate
;
1228 } else if (natt_candidate
->lft_c
->sadb_lifetime_addtime
>
1229 no_natt_candidate
->lft_c
->sadb_lifetime_addtime
) {
1230 candidate
= natt_candidate
;
1232 candidate
= no_natt_candidate
;
1236 candidate
->refcnt
++;
1237 KEYDEBUG(KEYDEBUG_IPSEC_STAMP
,
1238 printf("DP allocsa_policy cause "
1239 "refcnt++:%d SA:0x%llx\n", candidate
->refcnt
,
1240 (uint64_t)VM_KERNEL_ADDRPERM(candidate
)));
1246 * allocating a SA entry for a *INBOUND* packet.
1247 * Must call key_freesav() later.
1248 * OUT: positive: pointer to a sav.
1249 * NULL: not found, or error occurred.
1251 * In the comparison, source address will be ignored for RFC2401 conformance.
1252 * To quote, from section 4.1:
1253 * A security association is uniquely identified by a triple consisting
1254 * of a Security Parameter Index (SPI), an IP Destination Address, and a
1255 * security protocol (AH or ESP) identifier.
1256 * Note that, however, we do need to keep source address in IPsec SA.
1257 * IKE specification and PF_KEY specification do assume that we
1258 * keep source address in IPsec SA. We see a tricky situation here.
1268 return key_allocsa_extended(family
, src
, dst
, proto
, spi
, NULL
);
1272 key_allocsa_extended(u_int family
,
1279 struct secasvar
*sav
, *match
;
1280 u_int stateidx
, state
, tmpidx
, matchidx
;
1281 struct sockaddr_in sin
;
1282 struct sockaddr_in6 sin6
;
1283 const u_int
*saorder_state_valid
;
1286 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_NOTOWNED
);
1289 if (src
== NULL
|| dst
== NULL
) {
1290 panic("key_allocsa: NULL pointer is passed.\n");
1294 * when both systems employ similar strategy to use a SA.
1295 * the search order is important even in the inbound case.
1297 if (key_preferred_oldsa
) {
1298 saorder_state_valid
= saorder_state_valid_prefer_old
;
1299 arraysize
= _ARRAYLEN(saorder_state_valid_prefer_old
);
1301 saorder_state_valid
= saorder_state_valid_prefer_new
;
1302 arraysize
= _ARRAYLEN(saorder_state_valid_prefer_new
);
1307 * XXX: to be checked internal IP header somewhere. Also when
1308 * IPsec tunnel packet is received. But ESP tunnel mode is
1309 * encrypted so we can't check internal IP header.
1312 * search a valid state list for inbound packet.
1313 * the search order is not important.
1316 matchidx
= arraysize
;
1317 lck_mtx_lock(sadb_mutex
);
1318 LIST_FOREACH(sav
, &spihash
[SPIHASH(spi
)], spihash
) {
1319 if (sav
->spi
!= spi
) {
1322 if (interface
!= NULL
&&
1323 sav
->sah
->ipsec_if
!= interface
) {
1326 if (proto
!= sav
->sah
->saidx
.proto
) {
1329 if (family
!= sav
->sah
->saidx
.src
.ss_family
||
1330 family
!= sav
->sah
->saidx
.dst
.ss_family
) {
1334 for (stateidx
= 0; stateidx
< matchidx
; stateidx
++) {
1335 state
= saorder_state_valid
[stateidx
];
1336 if (sav
->state
== state
) {
1341 if (tmpidx
>= matchidx
) {
1345 /* check dst address */
1348 bzero(&sin
, sizeof(sin
));
1349 sin
.sin_family
= AF_INET
;
1350 sin
.sin_len
= sizeof(sin
);
1351 bcopy(dst
, &sin
.sin_addr
,
1352 sizeof(sin
.sin_addr
));
1353 if (key_sockaddrcmp((struct sockaddr
*)&sin
,
1354 (struct sockaddr
*)&sav
->sah
->saidx
.dst
, 0) != 0) {
1360 bzero(&sin6
, sizeof(sin6
));
1361 sin6
.sin6_family
= AF_INET6
;
1362 sin6
.sin6_len
= sizeof(sin6
);
1363 bcopy(dst
, &sin6
.sin6_addr
,
1364 sizeof(sin6
.sin6_addr
));
1365 if (IN6_IS_SCOPE_LINKLOCAL(&sin6
.sin6_addr
)) {
1366 /* kame fake scopeid */
1367 sin6
.sin6_scope_id
=
1368 ntohs(sin6
.sin6_addr
.s6_addr16
[1]);
1369 sin6
.sin6_addr
.s6_addr16
[1] = 0;
1371 if (key_sockaddrcmp((struct sockaddr
*)&sin6
,
1372 (struct sockaddr
*)&sav
->sah
->saidx
.dst
, 0) != 0) {
1377 ipseclog((LOG_DEBUG
, "key_allocsa: "
1378 "unknown address family=%d.\n", family
));
1390 lck_mtx_unlock(sadb_mutex
);
1395 lck_mtx_unlock(sadb_mutex
);
1396 KEYDEBUG(KEYDEBUG_IPSEC_STAMP
,
1397 printf("DP allocsa cause refcnt++:%d SA:0x%llx\n",
1398 match
->refcnt
, (uint64_t)VM_KERNEL_ADDRPERM(match
)));
1403 * This function checks whether a UDP packet with a random local port
1404 * and a remote port of 4500 matches an SA in the kernel. If does match,
1405 * send the packet to the ESP engine. If not, send the packet to the UDP protocol.
1408 key_checksa_present(u_int family
,
1410 caddr_t remote_addr
,
1411 u_int16_t local_port
,
1412 u_int16_t remote_port
)
1414 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_NOTOWNED
);
1417 if (local_addr
== NULL
|| remote_addr
== NULL
) {
1418 panic("key_allocsa: NULL pointer is passed.\n");
1423 * XXX: to be checked internal IP header somewhere. Also when
1424 * IPsec tunnel packet is received. But ESP tunnel mode is
1425 * encrypted so we can't check internal IP header.
1428 * search a valid state list for inbound packet.
1429 * the search order is not important.
1431 struct secashead
*sah
= NULL
;
1432 bool found_sa
= false;
1434 lck_mtx_lock(sadb_mutex
);
1435 LIST_FOREACH(sah
, &sahtree
, chain
) {
1436 if (sah
->state
== SADB_SASTATE_DEAD
) {
1440 if (sah
->dir
!= IPSEC_DIR_OUTBOUND
) {
1444 if (family
!= sah
->saidx
.src
.ss_family
) {
1448 struct sockaddr_in src_in
= {};
1449 struct sockaddr_in6 src_in6
= {};
1451 /* check src address */
1454 src_in
.sin_family
= AF_INET
;
1455 src_in
.sin_len
= sizeof(src_in
);
1456 memcpy(&src_in
.sin_addr
, local_addr
, sizeof(src_in
.sin_addr
));
1457 if (key_sockaddrcmp((struct sockaddr
*)&src_in
,
1458 (struct sockaddr
*)&sah
->saidx
.src
, 0) != 0) {
1463 src_in6
.sin6_family
= AF_INET6
;
1464 src_in6
.sin6_len
= sizeof(src_in6
);
1465 memcpy(&src_in6
.sin6_addr
, local_addr
, sizeof(src_in6
.sin6_addr
));
1466 if (IN6_IS_SCOPE_LINKLOCAL(&src_in6
.sin6_addr
)) {
1467 /* kame fake scopeid */
1468 src_in6
.sin6_scope_id
=
1469 ntohs(src_in6
.sin6_addr
.s6_addr16
[1]);
1470 src_in6
.sin6_addr
.s6_addr16
[1] = 0;
1472 if (key_sockaddrcmp((struct sockaddr
*)&src_in6
,
1473 (struct sockaddr
*)&sah
->saidx
.src
, 0) != 0) {
1478 ipseclog((LOG_DEBUG
, "key_checksa_present: "
1479 "unknown address family=%d.\n",
1484 struct sockaddr_in dest_in
= {};
1485 struct sockaddr_in6 dest_in6
= {};
1487 /* check dst address */
1490 dest_in
.sin_family
= AF_INET
;
1491 dest_in
.sin_len
= sizeof(dest_in
);
1492 memcpy(&dest_in
.sin_addr
, remote_addr
, sizeof(dest_in
.sin_addr
));
1493 if (key_sockaddrcmp((struct sockaddr
*)&dest_in
,
1494 (struct sockaddr
*)&sah
->saidx
.dst
, 0) != 0) {
1500 dest_in6
.sin6_family
= AF_INET6
;
1501 dest_in6
.sin6_len
= sizeof(dest_in6
);
1502 memcpy(&dest_in6
.sin6_addr
, remote_addr
, sizeof(dest_in6
.sin6_addr
));
1503 if (IN6_IS_SCOPE_LINKLOCAL(&dest_in6
.sin6_addr
)) {
1504 /* kame fake scopeid */
1505 dest_in6
.sin6_scope_id
=
1506 ntohs(dest_in6
.sin6_addr
.s6_addr16
[1]);
1507 dest_in6
.sin6_addr
.s6_addr16
[1] = 0;
1509 if (key_sockaddrcmp((struct sockaddr
*)&dest_in6
,
1510 (struct sockaddr
*)&sah
->saidx
.dst
, 0) != 0) {
1516 ipseclog((LOG_DEBUG
, "key_checksa_present: "
1517 "unknown address family=%d.\n", family
));
1521 struct secasvar
*nextsav
= NULL
;
1522 for (u_int stateidx
= 0; stateidx
< _ARRAYLEN(saorder_state_alive
); stateidx
++) {
1523 u_int state
= saorder_state_alive
[stateidx
];
1524 for (struct secasvar
*sav
= LIST_FIRST(&sah
->savtree
[state
]); sav
!= NULL
; sav
= nextsav
) {
1525 nextsav
= LIST_NEXT(sav
, chain
);
1527 if (sav
->state
!= state
) {
1528 ipseclog((LOG_DEBUG
, "key_checksa_present: "
1529 "invalid sav->state "
1530 "(state: %d SA: %d)\n",
1531 state
, sav
->state
));
1535 if (sav
->remote_ike_port
!= ntohs(remote_port
)) {
1539 if (sav
->natt_encapsulated_src_port
!= local_port
) {
1549 lck_mtx_unlock(sadb_mutex
);
1554 key_natt_get_translated_port(
1555 struct secasvar
*outsav
)
1557 struct secasindex saidx
;
1558 struct secashead
*sah
;
1559 u_int stateidx
, state
;
1560 const u_int
*saorder_state_valid
;
1563 /* get sa for incoming */
1564 saidx
.mode
= outsav
->sah
->saidx
.mode
;
1566 saidx
.proto
= outsav
->sah
->saidx
.proto
;
1567 bcopy(&outsav
->sah
->saidx
.src
, &saidx
.dst
, sizeof(struct sockaddr_in
));
1568 bcopy(&outsav
->sah
->saidx
.dst
, &saidx
.src
, sizeof(struct sockaddr_in
));
1570 lck_mtx_lock(sadb_mutex
);
1571 LIST_FOREACH(sah
, &sahtree
, chain
) {
1572 if (sah
->state
== SADB_SASTATE_DEAD
) {
1575 if (key_cmpsaidx(&sah
->saidx
, &saidx
, CMP_MODE
)) {
1579 lck_mtx_unlock(sadb_mutex
);
1584 * Found sah - now go thru list of SAs and find
1585 * matching remote ike port. If found - set
1586 * sav->natt_encapsulated_src_port and return the port.
1589 * search a valid state list for outbound packet.
1590 * This search order is important.
1592 if (key_preferred_oldsa
) {
1593 saorder_state_valid
= saorder_state_valid_prefer_old
;
1594 arraysize
= _ARRAYLEN(saorder_state_valid_prefer_old
);
1596 saorder_state_valid
= saorder_state_valid_prefer_new
;
1597 arraysize
= _ARRAYLEN(saorder_state_valid_prefer_new
);
1600 for (stateidx
= 0; stateidx
< arraysize
; stateidx
++) {
1601 state
= saorder_state_valid
[stateidx
];
1602 if (key_do_get_translated_port(sah
, outsav
, state
)) {
1603 lck_mtx_unlock(sadb_mutex
);
1604 return outsav
->natt_encapsulated_src_port
;
1607 lck_mtx_unlock(sadb_mutex
);
1612 key_do_get_translated_port(
1613 struct secashead
*sah
,
1614 struct secasvar
*outsav
,
1617 struct secasvar
*currsav
, *nextsav
, *candidate
;
1620 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_OWNED
);
1625 for (currsav
= LIST_FIRST(&sah
->savtree
[state
]);
1627 currsav
= nextsav
) {
1628 nextsav
= LIST_NEXT(currsav
, chain
);
1631 KEY_CHKSASTATE(currsav
->state
, state
, "key_do_get_translated_port");
1633 if ((currsav
->flags
& SADB_X_EXT_NATT_MULTIPLEUSERS
) == 0 ||
1634 currsav
->remote_ike_port
!= outsav
->remote_ike_port
) {
1638 if (candidate
== NULL
) {
1639 candidate
= currsav
;
1643 /* Which SA is the better ? */
1645 /* sanity check 2 */
1646 if (candidate
->lft_c
== NULL
|| currsav
->lft_c
== NULL
) {
1647 panic("key_do_get_translated_port: "
1648 "lifetime_current is NULL.\n");
1651 /* What the best method is to compare ? */
1652 if (key_preferred_oldsa
) {
1653 if (candidate
->lft_c
->sadb_lifetime_addtime
>
1654 currsav
->lft_c
->sadb_lifetime_addtime
) {
1655 candidate
= currsav
;
1661 /* prefered new sa rather than old sa */
1662 if (candidate
->lft_c
->sadb_lifetime_addtime
<
1663 currsav
->lft_c
->sadb_lifetime_addtime
) {
1664 candidate
= currsav
;
1669 outsav
->natt_encapsulated_src_port
= candidate
->natt_encapsulated_src_port
;
1677 * Must be called after calling key_allocsp().
1681 struct secpolicy
*sp
,
1686 panic("key_freesp: NULL pointer is passed.\n");
1690 lck_mtx_lock(sadb_mutex
);
1692 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_OWNED
);
1695 KEYDEBUG(KEYDEBUG_IPSEC_STAMP
,
1696 printf("DP freesp cause refcnt--:%d SP:0x%llx\n",
1697 sp
->refcnt
, (uint64_t)VM_KERNEL_ADDRPERM(sp
)));
1699 if (sp
->refcnt
== 0) {
1703 lck_mtx_unlock(sadb_mutex
);
1709 * Must be called after calling key_allocsa().
1710 * This function is called by key_freesp() to free some SA allocated
1715 struct secasvar
*sav
,
1720 panic("key_freesav: NULL pointer is passed.\n");
1724 lck_mtx_lock(sadb_mutex
);
1726 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_OWNED
);
1729 KEYDEBUG(KEYDEBUG_IPSEC_STAMP
,
1730 printf("DP freesav cause refcnt--:%d SA:0x%llx SPI %u\n",
1731 sav
->refcnt
, (uint64_t)VM_KERNEL_ADDRPERM(sav
),
1732 (u_int32_t
)ntohl(sav
->spi
)));
1734 if (sav
->refcnt
== 0) {
1738 lck_mtx_unlock(sadb_mutex
);
1743 /* %%% SPD management */
1745 * free security policy entry.
1749 struct secpolicy
*sp
)
1753 panic("key_delsp: NULL pointer is passed.\n");
1756 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_OWNED
);
1757 sp
->state
= IPSEC_SPSTATE_DEAD
;
1759 if (sp
->refcnt
> 0) {
1760 return; /* can't free */
1762 /* remove from SP index */
1763 if (__LIST_CHAINED(sp
)) {
1764 LIST_REMOVE(sp
, chain
);
1765 ipsec_policy_count
--;
1768 if (sp
->spidx
.internal_if
) {
1769 ifnet_release(sp
->spidx
.internal_if
);
1770 sp
->spidx
.internal_if
= NULL
;
1774 ifnet_release(sp
->ipsec_if
);
1775 sp
->ipsec_if
= NULL
;
1778 if (sp
->outgoing_if
) {
1779 ifnet_release(sp
->outgoing_if
);
1780 sp
->outgoing_if
= NULL
;
1784 struct ipsecrequest
*isr
= sp
->req
, *nextisr
;
1786 while (isr
!= NULL
) {
1787 nextisr
= isr
->next
;
1792 keydb_delsecpolicy(sp
);
1799 * OUT: NULL : not found
1800 * others : found, pointer to a SP.
1802 static struct secpolicy
*
1804 struct secpolicyindex
*spidx
)
1806 struct secpolicy
*sp
;
1808 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_OWNED
);
1811 if (spidx
== NULL
) {
1812 panic("key_getsp: NULL pointer is passed.\n");
1815 LIST_FOREACH(sp
, &sptree
[spidx
->dir
], chain
) {
1816 if (sp
->state
== IPSEC_SPSTATE_DEAD
) {
1819 if (key_cmpspidx_exactly(spidx
, &sp
->spidx
)) {
1830 * OUT: NULL : not found
1831 * others : found, pointer to a SP.
1837 struct secpolicy
*sp
;
1839 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_NOTOWNED
);
1841 lck_mtx_lock(sadb_mutex
);
1842 sp
= __key_getspbyid(id
);
1843 lck_mtx_unlock(sadb_mutex
);
1848 static struct secpolicy
*
1849 __key_getspbyid(u_int32_t id
)
1851 struct secpolicy
*sp
;
1853 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_OWNED
);
1855 LIST_FOREACH(sp
, &sptree
[IPSEC_DIR_INBOUND
], chain
) {
1856 if (sp
->state
== IPSEC_SPSTATE_DEAD
) {
1865 LIST_FOREACH(sp
, &sptree
[IPSEC_DIR_OUTBOUND
], chain
) {
1866 if (sp
->state
== IPSEC_SPSTATE_DEAD
) {
1881 struct secpolicy
*newsp
= NULL
;
1883 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_NOTOWNED
);
1884 newsp
= keydb_newsecpolicy();
1896 * create secpolicy structure from sadb_x_policy structure.
1897 * NOTE: `state', `secpolicyindex' in secpolicy structure are not set,
1898 * so must be set properly later.
1902 struct sadb_x_policy
*xpl0
,
1906 struct secpolicy
*newsp
;
1908 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_NOTOWNED
);
1912 panic("key_msg2sp: NULL pointer was passed.\n");
1914 if (len
< sizeof(*xpl0
)) {
1915 panic("key_msg2sp: invalid length.\n");
1917 if (len
!= PFKEY_EXTLEN(xpl0
)) {
1918 ipseclog((LOG_DEBUG
, "key_msg2sp: Invalid msg length.\n"));
1923 if ((newsp
= key_newsp()) == NULL
) {
1928 newsp
->spidx
.dir
= xpl0
->sadb_x_policy_dir
;
1929 newsp
->policy
= xpl0
->sadb_x_policy_type
;
1932 switch (xpl0
->sadb_x_policy_type
) {
1933 case IPSEC_POLICY_DISCARD
:
1934 case IPSEC_POLICY_GENERATE
:
1935 case IPSEC_POLICY_NONE
:
1936 case IPSEC_POLICY_ENTRUST
:
1937 case IPSEC_POLICY_BYPASS
:
1941 case IPSEC_POLICY_IPSEC
:
1944 struct sadb_x_ipsecrequest
*xisr
;
1945 struct ipsecrequest
**p_isr
= &newsp
->req
;
1947 /* validity check */
1948 if (PFKEY_EXTLEN(xpl0
) < sizeof(*xpl0
)) {
1949 ipseclog((LOG_DEBUG
,
1950 "key_msg2sp: Invalid msg length.\n"));
1951 key_freesp(newsp
, KEY_SADB_UNLOCKED
);
1956 tlen
= PFKEY_EXTLEN(xpl0
) - sizeof(*xpl0
);
1957 xisr
= (struct sadb_x_ipsecrequest
*)(xpl0
+ 1);
1960 if (tlen
< sizeof(*xisr
)) {
1961 ipseclog((LOG_DEBUG
, "key_msg2sp: "
1962 "invalid ipsecrequest.\n"));
1963 key_freesp(newsp
, KEY_SADB_UNLOCKED
);
1969 if (xisr
->sadb_x_ipsecrequest_len
< sizeof(*xisr
)) {
1970 ipseclog((LOG_DEBUG
, "key_msg2sp: "
1971 "invalid ipsecrequest length.\n"));
1972 key_freesp(newsp
, KEY_SADB_UNLOCKED
);
1977 /* allocate request buffer */
1978 KMALLOC_WAIT(*p_isr
, struct ipsecrequest
*, sizeof(**p_isr
));
1979 if ((*p_isr
) == NULL
) {
1980 ipseclog((LOG_DEBUG
,
1981 "key_msg2sp: No more memory.\n"));
1982 key_freesp(newsp
, KEY_SADB_UNLOCKED
);
1986 bzero(*p_isr
, sizeof(**p_isr
));
1989 (*p_isr
)->next
= NULL
;
1991 switch (xisr
->sadb_x_ipsecrequest_proto
) {
1996 ipseclog((LOG_DEBUG
,
1997 "key_msg2sp: invalid proto type=%u\n",
1998 xisr
->sadb_x_ipsecrequest_proto
));
1999 key_freesp(newsp
, KEY_SADB_UNLOCKED
);
2000 *error
= EPROTONOSUPPORT
;
2003 (*p_isr
)->saidx
.proto
= xisr
->sadb_x_ipsecrequest_proto
;
2005 switch (xisr
->sadb_x_ipsecrequest_mode
) {
2006 case IPSEC_MODE_TRANSPORT
:
2007 case IPSEC_MODE_TUNNEL
:
2009 case IPSEC_MODE_ANY
:
2011 ipseclog((LOG_DEBUG
,
2012 "key_msg2sp: invalid mode=%u\n",
2013 xisr
->sadb_x_ipsecrequest_mode
));
2014 key_freesp(newsp
, KEY_SADB_UNLOCKED
);
2018 (*p_isr
)->saidx
.mode
= xisr
->sadb_x_ipsecrequest_mode
;
2020 switch (xisr
->sadb_x_ipsecrequest_level
) {
2021 case IPSEC_LEVEL_DEFAULT
:
2022 case IPSEC_LEVEL_USE
:
2023 case IPSEC_LEVEL_REQUIRE
:
2025 case IPSEC_LEVEL_UNIQUE
:
2026 /* validity check */
2028 * If range violation of reqid, kernel will
2029 * update it, don't refuse it.
2031 if (xisr
->sadb_x_ipsecrequest_reqid
2032 > IPSEC_MANUAL_REQID_MAX
) {
2033 ipseclog((LOG_DEBUG
,
2034 "key_msg2sp: reqid=%d range "
2035 "violation, updated by kernel.\n",
2036 xisr
->sadb_x_ipsecrequest_reqid
));
2037 xisr
->sadb_x_ipsecrequest_reqid
= 0;
2040 /* allocate new reqid id if reqid is zero. */
2041 if (xisr
->sadb_x_ipsecrequest_reqid
== 0) {
2043 if ((reqid
= key_newreqid()) == 0) {
2044 key_freesp(newsp
, KEY_SADB_UNLOCKED
);
2048 (*p_isr
)->saidx
.reqid
= reqid
;
2049 xisr
->sadb_x_ipsecrequest_reqid
= reqid
;
2051 /* set it for manual keying. */
2052 (*p_isr
)->saidx
.reqid
=
2053 xisr
->sadb_x_ipsecrequest_reqid
;
2058 ipseclog((LOG_DEBUG
, "key_msg2sp: invalid level=%u\n",
2059 xisr
->sadb_x_ipsecrequest_level
));
2060 key_freesp(newsp
, KEY_SADB_UNLOCKED
);
2064 (*p_isr
)->level
= xisr
->sadb_x_ipsecrequest_level
;
2066 /* set IP addresses if there */
2067 if (xisr
->sadb_x_ipsecrequest_len
> sizeof(*xisr
)) {
2068 struct sockaddr
*paddr
;
2070 if (tlen
< xisr
->sadb_x_ipsecrequest_len
) {
2071 ipseclog((LOG_DEBUG
, "key_msg2sp: invalid request "
2072 "address length.\n"));
2073 key_freesp(newsp
, KEY_SADB_UNLOCKED
);
2078 paddr
= (struct sockaddr
*)(xisr
+ 1);
2079 uint8_t src_len
= paddr
->sa_len
;
2081 /* +sizeof(uint8_t) for dst_len below */
2082 if (xisr
->sadb_x_ipsecrequest_len
< sizeof(*xisr
) + src_len
+ sizeof(uint8_t)) {
2083 ipseclog((LOG_DEBUG
, "key_msg2sp: invalid request "
2084 "invalid source address length.\n"));
2085 key_freesp(newsp
, KEY_SADB_UNLOCKED
);
2090 /* validity check */
2092 > sizeof((*p_isr
)->saidx
.src
)) {
2093 ipseclog((LOG_DEBUG
, "key_msg2sp: invalid request "
2094 "address length.\n"));
2095 key_freesp(newsp
, KEY_SADB_UNLOCKED
);
2100 bcopy(paddr
, &(*p_isr
)->saidx
.src
,
2101 MIN(paddr
->sa_len
, sizeof((*p_isr
)->saidx
.src
)));
2103 paddr
= (struct sockaddr
*)((caddr_t
)paddr
+ paddr
->sa_len
);
2104 uint8_t dst_len
= paddr
->sa_len
;
2106 if (xisr
->sadb_x_ipsecrequest_len
< sizeof(*xisr
) + src_len
+ dst_len
) {
2107 ipseclog((LOG_DEBUG
, "key_msg2sp: invalid request "
2108 "invalid dest address length.\n"));
2109 key_freesp(newsp
, KEY_SADB_UNLOCKED
);
2114 /* validity check */
2116 > sizeof((*p_isr
)->saidx
.dst
)) {
2117 ipseclog((LOG_DEBUG
, "key_msg2sp: invalid request "
2118 "address length.\n"));
2119 key_freesp(newsp
, KEY_SADB_UNLOCKED
);
2124 bcopy(paddr
, &(*p_isr
)->saidx
.dst
,
2125 MIN(paddr
->sa_len
, sizeof((*p_isr
)->saidx
.dst
)));
2128 (*p_isr
)->sp
= newsp
;
2130 /* initialization for the next. */
2131 p_isr
= &(*p_isr
)->next
;
2132 tlen
-= xisr
->sadb_x_ipsecrequest_len
;
2134 /* validity check */
2136 ipseclog((LOG_DEBUG
, "key_msg2sp: becoming tlen < 0.\n"));
2137 key_freesp(newsp
, KEY_SADB_UNLOCKED
);
2142 xisr
= (struct sadb_x_ipsecrequest
*)(void *)
2143 ((caddr_t
)xisr
+ xisr
->sadb_x_ipsecrequest_len
);
2148 ipseclog((LOG_DEBUG
, "key_msg2sp: invalid policy type.\n"));
2149 key_freesp(newsp
, KEY_SADB_UNLOCKED
);
2161 lck_mtx_lock(sadb_mutex
);
2162 static u_int16_t auto_reqid
= IPSEC_MANUAL_REQID_MAX
+ 1;
2165 /* The reqid must be limited to 16 bits because the PF_KEY message format only uses
2166 * 16 bits for this field. Once it becomes larger than 16 bits - ipsec fails to
2167 * work anymore. Changing the PF_KEY message format would introduce compatibility
2168 * issues. This code now tests to see if the tentative reqid is in use */
2171 struct secpolicy
*sp
;
2172 struct ipsecrequest
*isr
;
2175 auto_reqid
= (auto_reqid
== 0xFFFF
2176 ? IPSEC_MANUAL_REQID_MAX
+ 1 : auto_reqid
+ 1);
2178 /* check for uniqueness */
2180 for (dir
= 0; dir
< IPSEC_DIR_MAX
; dir
++) {
2181 LIST_FOREACH(sp
, &sptree
[dir
], chain
) {
2182 for (isr
= sp
->req
; isr
!= NULL
; isr
= isr
->next
) {
2183 if (isr
->saidx
.reqid
== auto_reqid
) {
2198 lck_mtx_unlock(sadb_mutex
);
2203 * copy secpolicy struct to sadb_x_policy structure indicated.
2207 struct secpolicy
*sp
)
2209 struct sadb_x_policy
*xpl
;
2216 panic("key_sp2msg: NULL pointer was passed.\n");
2219 tlen
= key_getspreqmsglen(sp
);
2220 if (PFKEY_UNIT64(tlen
) > UINT16_MAX
) {
2221 ipseclog((LOG_ERR
, "key_getspreqmsglen returned length %u\n",
2226 m
= key_alloc_mbuf(tlen
);
2227 if (!m
|| m
->m_next
) { /*XXX*/
2236 xpl
= mtod(m
, struct sadb_x_policy
*);
2239 xpl
->sadb_x_policy_len
= (u_int16_t
)PFKEY_UNIT64(tlen
);
2240 xpl
->sadb_x_policy_exttype
= SADB_X_EXT_POLICY
;
2241 xpl
->sadb_x_policy_type
= (u_int16_t
)sp
->policy
;
2242 xpl
->sadb_x_policy_dir
= sp
->spidx
.dir
;
2243 xpl
->sadb_x_policy_id
= sp
->id
;
2244 p
= (caddr_t
)xpl
+ sizeof(*xpl
);
2246 /* if is the policy for ipsec ? */
2247 if (sp
->policy
== IPSEC_POLICY_IPSEC
) {
2248 struct sadb_x_ipsecrequest
*xisr
;
2249 struct ipsecrequest
*isr
;
2251 for (isr
= sp
->req
; isr
!= NULL
; isr
= isr
->next
) {
2252 xisr
= (struct sadb_x_ipsecrequest
*)(void *)p
;
2254 xisr
->sadb_x_ipsecrequest_proto
= isr
->saidx
.proto
;
2255 xisr
->sadb_x_ipsecrequest_mode
= isr
->saidx
.mode
;
2256 xisr
->sadb_x_ipsecrequest_level
= (u_int8_t
)isr
->level
;
2257 xisr
->sadb_x_ipsecrequest_reqid
= (u_int16_t
)isr
->saidx
.reqid
;
2260 bcopy(&isr
->saidx
.src
, p
, isr
->saidx
.src
.ss_len
);
2261 p
+= isr
->saidx
.src
.ss_len
;
2262 bcopy(&isr
->saidx
.dst
, p
, isr
->saidx
.dst
.ss_len
);
2263 p
+= isr
->saidx
.src
.ss_len
;
2265 xisr
->sadb_x_ipsecrequest_len
=
2266 PFKEY_ALIGN8(sizeof(*xisr
)
2267 + isr
->saidx
.src
.ss_len
2268 + isr
->saidx
.dst
.ss_len
);
2275 /* m will not be freed nor modified */
2276 static struct mbuf
*
2277 key_gather_mbuf(struct mbuf
*m
, const struct sadb_msghdr
*mhp
,
2278 int ndeep
, int nitem
, int *items
)
2282 struct mbuf
*result
= NULL
, *n
;
2285 if (m
== NULL
|| mhp
== NULL
) {
2286 panic("null pointer passed to key_gather");
2289 for (i
= 0; i
< nitem
; i
++) {
2291 if (idx
< 0 || idx
> SADB_EXT_MAX
) {
2294 /* don't attempt to pull empty extension */
2295 if (idx
== SADB_EXT_RESERVED
&& mhp
->msg
== NULL
) {
2298 if (idx
!= SADB_EXT_RESERVED
&&
2299 (mhp
->ext
[idx
] == NULL
|| mhp
->extlen
[idx
] == 0)) {
2303 if (idx
== SADB_EXT_RESERVED
) {
2304 len
= PFKEY_ALIGN8(sizeof(struct sadb_msg
));
2305 MGETHDR(n
, M_WAITOK
, MT_DATA
); // sadb_msg len < MHLEN - enforced by _CASSERT
2311 m_copydata(m
, 0, sizeof(struct sadb_msg
),
2313 } else if (i
< ndeep
) {
2314 len
= mhp
->extlen
[idx
];
2315 n
= key_alloc_mbuf(len
);
2316 if (!n
|| n
->m_next
) { /*XXX*/
2322 m_copydata(m
, mhp
->extoff
[idx
], mhp
->extlen
[idx
],
2325 n
= m_copym(m
, mhp
->extoff
[idx
], mhp
->extlen
[idx
],
2339 if ((result
->m_flags
& M_PKTHDR
) != 0) {
2340 result
->m_pkthdr
.len
= 0;
2341 for (n
= result
; n
; n
= n
->m_next
) {
2342 result
->m_pkthdr
.len
+= n
->m_len
;
2354 * SADB_X_SPDADD, SADB_X_SPDSETIDX or SADB_X_SPDUPDATE processing
2355 * add a entry to SP database, when received
2356 * <base, address(SD), (lifetime(H),) policy>
2358 * Adding to SP database,
2360 * <base, address(SD), (lifetime(H),) policy>
2361 * to the socket which was send.
2363 * SPDADD set a unique policy entry.
2364 * SPDSETIDX like SPDADD without a part of policy requests.
2365 * SPDUPDATE replace a unique policy entry.
2367 * m will always be freed.
2373 const struct sadb_msghdr
*mhp
)
2375 struct sadb_address
*src0
, *dst0
, *src1
= NULL
, *dst1
= NULL
;
2376 struct sadb_x_policy
*xpl0
, *xpl
;
2377 struct sadb_lifetime
*lft
= NULL
;
2378 struct secpolicyindex spidx
;
2379 struct secpolicy
*newsp
;
2381 ifnet_t internal_if
= NULL
;
2382 char *outgoing_if
= NULL
;
2383 char *ipsec_if
= NULL
;
2384 struct sadb_x_ipsecif
*ipsecifopts
= NULL
;
2386 int use_src_range
= 0;
2387 int use_dst_range
= 0;
2388 int init_disabled
= 0;
2389 int address_family
, address_len
;
2391 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_NOTOWNED
);
2394 if (so
== NULL
|| m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
) {
2395 panic("key_spdadd: NULL pointer is passed.\n");
2398 if (mhp
->ext
[SADB_X_EXT_ADDR_RANGE_SRC_START
] != NULL
&& mhp
->ext
[SADB_X_EXT_ADDR_RANGE_SRC_END
] != NULL
) {
2401 if (mhp
->ext
[SADB_X_EXT_ADDR_RANGE_DST_START
] != NULL
&& mhp
->ext
[SADB_X_EXT_ADDR_RANGE_DST_END
] != NULL
) {
2405 if ((!use_src_range
&& mhp
->ext
[SADB_EXT_ADDRESS_SRC
] == NULL
) ||
2406 (!use_dst_range
&& mhp
->ext
[SADB_EXT_ADDRESS_DST
] == NULL
) ||
2407 mhp
->ext
[SADB_X_EXT_POLICY
] == NULL
) {
2408 ipseclog((LOG_DEBUG
, "key_spdadd: invalid message is passed.\n"));
2409 return key_senderror(so
, m
, EINVAL
);
2411 if ((use_src_range
&& (mhp
->extlen
[SADB_X_EXT_ADDR_RANGE_SRC_START
] < sizeof(struct sadb_address
)
2412 || mhp
->extlen
[SADB_X_EXT_ADDR_RANGE_SRC_END
] < sizeof(struct sadb_address
))) ||
2413 (!use_src_range
&& mhp
->extlen
[SADB_EXT_ADDRESS_SRC
] < sizeof(struct sadb_address
)) ||
2414 (use_dst_range
&& (mhp
->extlen
[SADB_X_EXT_ADDR_RANGE_DST_START
] < sizeof(struct sadb_address
)
2415 || mhp
->extlen
[SADB_X_EXT_ADDR_RANGE_DST_END
] < sizeof(struct sadb_address
))) ||
2416 (!use_dst_range
&& mhp
->extlen
[SADB_EXT_ADDRESS_DST
] < sizeof(struct sadb_address
)) ||
2417 mhp
->extlen
[SADB_X_EXT_POLICY
] < sizeof(struct sadb_x_policy
)) {
2418 ipseclog((LOG_DEBUG
, "key_spdadd: invalid message is passed.\n"));
2419 return key_senderror(so
, m
, EINVAL
);
2421 if (mhp
->ext
[SADB_EXT_LIFETIME_HARD
] != NULL
) {
2422 if (mhp
->extlen
[SADB_EXT_LIFETIME_HARD
]
2423 < sizeof(struct sadb_lifetime
)) {
2424 ipseclog((LOG_DEBUG
, "key_spdadd: invalid message is passed.\n"));
2425 return key_senderror(so
, m
, EINVAL
);
2427 lft
= (struct sadb_lifetime
*)
2428 (void *)mhp
->ext
[SADB_EXT_LIFETIME_HARD
];
2430 if (mhp
->ext
[SADB_X_EXT_IPSECIF
] != NULL
) {
2431 if (mhp
->extlen
[SADB_X_EXT_IPSECIF
] < sizeof(struct sadb_x_ipsecif
)) {
2432 ipseclog((LOG_DEBUG
, "key_spdadd: invalid message is passed.\n"));
2433 return key_senderror(so
, m
, EINVAL
);
2437 if (use_src_range
) {
2438 src0
= (struct sadb_address
*)mhp
->ext
[SADB_X_EXT_ADDR_RANGE_SRC_START
];
2439 src1
= (struct sadb_address
*)mhp
->ext
[SADB_X_EXT_ADDR_RANGE_SRC_END
];
2441 src0
= (struct sadb_address
*)mhp
->ext
[SADB_EXT_ADDRESS_SRC
];
2443 if (use_dst_range
) {
2444 dst0
= (struct sadb_address
*)mhp
->ext
[SADB_X_EXT_ADDR_RANGE_DST_START
];
2445 dst1
= (struct sadb_address
*)mhp
->ext
[SADB_X_EXT_ADDR_RANGE_DST_END
];
2447 dst0
= (struct sadb_address
*)mhp
->ext
[SADB_EXT_ADDRESS_DST
];
2449 xpl0
= (struct sadb_x_policy
*)(void *)mhp
->ext
[SADB_X_EXT_POLICY
];
2450 ipsecifopts
= (struct sadb_x_ipsecif
*)(void *)mhp
->ext
[SADB_X_EXT_IPSECIF
];
2452 /* check addresses */
2453 address_family
= ((struct sockaddr
*)(src0
+ 1))->sa_family
;
2454 address_len
= ((struct sockaddr
*)(src0
+ 1))->sa_len
;
2455 if (use_src_range
) {
2456 if (((struct sockaddr
*)(src1
+ 1))->sa_family
!= address_family
||
2457 ((struct sockaddr
*)(src1
+ 1))->sa_len
!= address_len
) {
2458 return key_senderror(so
, m
, EINVAL
);
2461 if (((struct sockaddr
*)(dst0
+ 1))->sa_family
!= address_family
||
2462 ((struct sockaddr
*)(dst0
+ 1))->sa_len
!= address_len
) {
2463 return key_senderror(so
, m
, EINVAL
);
2465 if (use_dst_range
) {
2466 if (((struct sockaddr
*)(dst1
+ 1))->sa_family
!= address_family
||
2467 ((struct sockaddr
*)(dst1
+ 1))->sa_len
!= address_len
) {
2468 return key_senderror(so
, m
, EINVAL
);
2472 /* checking the direction. */
2473 switch (xpl0
->sadb_x_policy_dir
) {
2474 case IPSEC_DIR_INBOUND
:
2475 case IPSEC_DIR_OUTBOUND
:
2478 ipseclog((LOG_DEBUG
, "key_spdadd: Invalid SP direction.\n"));
2479 mhp
->msg
->sadb_msg_errno
= EINVAL
;
2484 /* key_spdadd() accepts DISCARD, NONE and IPSEC. */
2485 if (xpl0
->sadb_x_policy_type
== IPSEC_POLICY_ENTRUST
2486 || xpl0
->sadb_x_policy_type
== IPSEC_POLICY_BYPASS
) {
2487 ipseclog((LOG_DEBUG
, "key_spdadd: Invalid policy type.\n"));
2488 return key_senderror(so
, m
, EINVAL
);
2491 /* policy requests are mandatory when action is ipsec. */
2492 if (mhp
->msg
->sadb_msg_type
!= SADB_X_SPDSETIDX
2493 && xpl0
->sadb_x_policy_type
== IPSEC_POLICY_IPSEC
2494 && mhp
->extlen
[SADB_X_EXT_POLICY
] <= sizeof(*xpl0
)) {
2495 ipseclog((LOG_DEBUG
, "key_spdadd: some policy requests part required.\n"));
2496 return key_senderror(so
, m
, EINVAL
);
2499 /* Process interfaces */
2500 if (ipsecifopts
!= NULL
) {
2501 if (ipsecifopts
->sadb_x_ipsecif_internal_if
[0]) {
2502 ifnet_find_by_name(ipsecifopts
->sadb_x_ipsecif_internal_if
, &internal_if
);
2504 if (ipsecifopts
->sadb_x_ipsecif_outgoing_if
[0]) {
2505 outgoing_if
= ipsecifopts
->sadb_x_ipsecif_outgoing_if
;
2507 if (ipsecifopts
->sadb_x_ipsecif_ipsec_if
[0]) {
2508 ipsec_if
= ipsecifopts
->sadb_x_ipsecif_ipsec_if
;
2510 init_disabled
= ipsecifopts
->sadb_x_ipsecif_init_disabled
;
2514 /* XXX boundary check against sa_len */
2515 KEY_SETSECSPIDX(xpl0
->sadb_x_policy_dir
,
2518 src0
->sadb_address_prefixlen
,
2519 dst0
->sadb_address_prefixlen
,
2520 src0
->sadb_address_proto
,
2522 use_src_range
? src0
+ 1 : NULL
,
2523 use_src_range
? src1
+ 1 : NULL
,
2524 use_dst_range
? dst0
+ 1 : NULL
,
2525 use_dst_range
? dst1
+ 1 : NULL
,
2529 * checking there is SP already or not.
2530 * SPDUPDATE doesn't depend on whether there is a SP or not.
2531 * If the type is either SPDADD or SPDSETIDX AND a SP is found,
2534 lck_mtx_lock(sadb_mutex
);
2535 newsp
= key_getsp(&spidx
);
2536 if (mhp
->msg
->sadb_msg_type
== SADB_X_SPDUPDATE
) {
2538 newsp
->state
= IPSEC_SPSTATE_DEAD
;
2539 key_freesp(newsp
, KEY_SADB_LOCKED
);
2542 if (newsp
!= NULL
) {
2543 key_freesp(newsp
, KEY_SADB_LOCKED
);
2544 ipseclog((LOG_DEBUG
, "key_spdadd: a SP entry exists already.\n"));
2545 lck_mtx_unlock(sadb_mutex
);
2547 ifnet_release(internal_if
);
2550 return key_senderror(so
, m
, EEXIST
);
2553 lck_mtx_unlock(sadb_mutex
);
2555 /* allocation new SP entry */
2556 if ((newsp
= key_msg2sp(xpl0
, PFKEY_EXTLEN(xpl0
), &error
)) == NULL
) {
2558 ifnet_release(internal_if
);
2561 return key_senderror(so
, m
, error
);
2564 if ((newsp
->id
= key_getnewspid()) == 0) {
2565 keydb_delsecpolicy(newsp
);
2567 ifnet_release(internal_if
);
2570 return key_senderror(so
, m
, ENOBUFS
);
2573 /* XXX boundary check against sa_len */
2574 KEY_SETSECSPIDX(xpl0
->sadb_x_policy_dir
,
2577 src0
->sadb_address_prefixlen
,
2578 dst0
->sadb_address_prefixlen
,
2579 src0
->sadb_address_proto
,
2581 use_src_range
? src0
+ 1 : NULL
,
2582 use_src_range
? src1
+ 1 : NULL
,
2583 use_dst_range
? dst0
+ 1 : NULL
,
2584 use_dst_range
? dst1
+ 1 : NULL
,
2589 * allow IPv6 over IPv4 or IPv4 over IPv6 tunnels using ESP -
2590 * otherwise reject if inner and outer address families not equal
2592 if (newsp
->req
&& newsp
->req
->saidx
.src
.ss_family
) {
2593 struct sockaddr
*sa
;
2594 sa
= (struct sockaddr
*)(src0
+ 1);
2595 if (sa
->sa_family
!= newsp
->req
->saidx
.src
.ss_family
) {
2596 if (newsp
->req
->saidx
.mode
!= IPSEC_MODE_TUNNEL
|| newsp
->req
->saidx
.proto
!= IPPROTO_ESP
) {
2597 keydb_delsecpolicy(newsp
);
2599 ifnet_release(internal_if
);
2602 return key_senderror(so
, m
, EINVAL
);
2606 if (newsp
->req
&& newsp
->req
->saidx
.dst
.ss_family
) {
2607 struct sockaddr
*sa
;
2608 sa
= (struct sockaddr
*)(dst0
+ 1);
2609 if (sa
->sa_family
!= newsp
->req
->saidx
.dst
.ss_family
) {
2610 if (newsp
->req
->saidx
.mode
!= IPSEC_MODE_TUNNEL
|| newsp
->req
->saidx
.proto
!= IPPROTO_ESP
) {
2611 keydb_delsecpolicy(newsp
);
2613 ifnet_release(internal_if
);
2616 return key_senderror(so
, m
, EINVAL
);
2623 newsp
->created
= tv
.tv_sec
;
2624 newsp
->lastused
= tv
.tv_sec
;
2625 newsp
->lifetime
= (long)(lft
? lft
->sadb_lifetime_addtime
: 0);
2626 newsp
->validtime
= (long)(lft
? lft
->sadb_lifetime_usetime
: 0);
2628 if (outgoing_if
!= NULL
) {
2629 ifnet_find_by_name(outgoing_if
, &newsp
->outgoing_if
);
2631 if (ipsec_if
!= NULL
) {
2632 ifnet_find_by_name(ipsec_if
, &newsp
->ipsec_if
);
2634 if (init_disabled
> 0) {
2635 newsp
->disabled
= 1;
2638 newsp
->refcnt
= 1; /* do not reclaim until I say I do */
2639 newsp
->state
= IPSEC_SPSTATE_ALIVE
;
2640 lck_mtx_lock(sadb_mutex
);
2642 * policies of type generate should be at the end of the SPD
2643 * because they function as default discard policies
2644 * Don't start timehandler for generate policies
2646 if (newsp
->policy
== IPSEC_POLICY_GENERATE
) {
2647 LIST_INSERT_TAIL(&sptree
[newsp
->spidx
.dir
], newsp
, secpolicy
, chain
);
2648 } else { /* XXX until we have policy ordering in the kernel */
2649 struct secpolicy
*tmpsp
;
2651 LIST_FOREACH(tmpsp
, &sptree
[newsp
->spidx
.dir
], chain
)
2652 if (tmpsp
->policy
== IPSEC_POLICY_GENERATE
) {
2656 LIST_INSERT_BEFORE(tmpsp
, newsp
, chain
);
2658 LIST_INSERT_TAIL(&sptree
[newsp
->spidx
.dir
], newsp
, secpolicy
, chain
);
2660 key_start_timehandler();
2663 ipsec_policy_count
++;
2664 /* Turn off the ipsec bypass */
2665 if (ipsec_bypass
!= 0) {
2669 /* delete the entry in spacqtree */
2670 if (mhp
->msg
->sadb_msg_type
== SADB_X_SPDUPDATE
) {
2671 struct secspacq
*spacq
;
2672 if ((spacq
= key_getspacq(&spidx
)) != NULL
) {
2673 /* reset counter in order to deletion by timehandler. */
2675 spacq
->created
= tv
.tv_sec
;
2679 lck_mtx_unlock(sadb_mutex
);
2682 struct mbuf
*n
, *mpolicy
;
2683 struct sadb_msg
*newmsg
;
2686 /* create new sadb_msg to reply. */
2688 int mbufItems
[] = {SADB_EXT_RESERVED
, SADB_X_EXT_POLICY
,
2689 SADB_EXT_LIFETIME_HARD
, SADB_EXT_ADDRESS_SRC
,
2690 SADB_EXT_ADDRESS_DST
, SADB_X_EXT_ADDR_RANGE_SRC_START
, SADB_X_EXT_ADDR_RANGE_SRC_END
,
2691 SADB_X_EXT_ADDR_RANGE_DST_START
, SADB_X_EXT_ADDR_RANGE_DST_END
};
2692 n
= key_gather_mbuf(m
, mhp
, 2, sizeof(mbufItems
) / sizeof(int), mbufItems
);
2694 int mbufItems
[] = {SADB_EXT_RESERVED
, SADB_X_EXT_POLICY
,
2695 SADB_EXT_ADDRESS_SRC
, SADB_EXT_ADDRESS_DST
,
2696 SADB_X_EXT_ADDR_RANGE_SRC_START
, SADB_X_EXT_ADDR_RANGE_SRC_END
,
2697 SADB_X_EXT_ADDR_RANGE_DST_START
, SADB_X_EXT_ADDR_RANGE_DST_END
};
2698 n
= key_gather_mbuf(m
, mhp
, 2, sizeof(mbufItems
) / sizeof(int), mbufItems
);
2701 return key_senderror(so
, m
, ENOBUFS
);
2704 if (n
->m_len
< sizeof(*newmsg
)) {
2705 n
= m_pullup(n
, sizeof(*newmsg
));
2707 return key_senderror(so
, m
, ENOBUFS
);
2710 newmsg
= mtod(n
, struct sadb_msg
*);
2711 newmsg
->sadb_msg_errno
= 0;
2713 VERIFY(PFKEY_UNIT64(n
->m_pkthdr
.len
) <= UINT16_MAX
);
2714 newmsg
->sadb_msg_len
= (u_int16_t
)PFKEY_UNIT64(n
->m_pkthdr
.len
);
2717 mpolicy
= m_pulldown(n
, PFKEY_ALIGN8(sizeof(struct sadb_msg
)),
2718 sizeof(*xpl
), &off
);
2719 if (mpolicy
== NULL
) {
2720 /* n is already freed */
2721 return key_senderror(so
, m
, ENOBUFS
);
2723 xpl
= (struct sadb_x_policy
*)(void *)(mtod(mpolicy
, caddr_t
) + off
);
2724 if (xpl
->sadb_x_policy_exttype
!= SADB_X_EXT_POLICY
) {
2726 return key_senderror(so
, m
, EINVAL
);
2728 xpl
->sadb_x_policy_id
= newsp
->id
;
2731 return key_sendup_mbuf(so
, n
, KEY_SENDUP_ALL
);
2736 * get new policy id.
2742 key_getnewspid(void)
2744 u_int32_t newid
= 0;
2745 int count
= key_spi_trycnt
; /* XXX */
2746 struct secpolicy
*sp
;
2748 /* when requesting to allocate spi ranged */
2749 lck_mtx_lock(sadb_mutex
);
2751 newid
= (policy_id
= (policy_id
== ~0 ? 1 : policy_id
+ 1));
2753 if ((sp
= __key_getspbyid(newid
)) == NULL
) {
2757 key_freesp(sp
, KEY_SADB_LOCKED
);
2759 lck_mtx_unlock(sadb_mutex
);
2760 if (count
== 0 || newid
== 0) {
2761 ipseclog((LOG_DEBUG
, "key_getnewspid: to allocate policy id is failed.\n"));
2769 * SADB_SPDDELETE processing
2771 * <base, address(SD), policy(*)>
2772 * from the user(?), and set SADB_SASTATE_DEAD,
2774 * <base, address(SD), policy(*)>
2776 * policy(*) including direction of policy.
2778 * m will always be freed.
2784 const struct sadb_msghdr
*mhp
)
2786 struct sadb_address
*src0
, *dst0
, *src1
= NULL
, *dst1
= NULL
;
2787 struct sadb_x_policy
*xpl0
;
2788 struct secpolicyindex spidx
;
2789 struct secpolicy
*sp
;
2790 ifnet_t internal_if
= NULL
;
2791 struct sadb_x_ipsecif
*ipsecifopts
= NULL
;
2792 int use_src_range
= 0;
2793 int use_dst_range
= 0;
2795 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_NOTOWNED
);
2798 if (so
== NULL
|| m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
) {
2799 panic("key_spddelete: NULL pointer is passed.\n");
2802 if (mhp
->ext
[SADB_X_EXT_ADDR_RANGE_SRC_START
] != NULL
&& mhp
->ext
[SADB_X_EXT_ADDR_RANGE_SRC_END
] != NULL
) {
2805 if (mhp
->ext
[SADB_X_EXT_ADDR_RANGE_DST_START
] != NULL
&& mhp
->ext
[SADB_X_EXT_ADDR_RANGE_DST_END
] != NULL
) {
2809 if ((!use_src_range
&& mhp
->ext
[SADB_EXT_ADDRESS_SRC
] == NULL
) ||
2810 (!use_dst_range
&& mhp
->ext
[SADB_EXT_ADDRESS_DST
] == NULL
) ||
2811 mhp
->ext
[SADB_X_EXT_POLICY
] == NULL
) {
2812 ipseclog((LOG_DEBUG
, "key_spddelete: invalid message is passed.\n"));
2813 return key_senderror(so
, m
, EINVAL
);
2815 if ((use_src_range
&& (mhp
->extlen
[SADB_X_EXT_ADDR_RANGE_SRC_START
] < sizeof(struct sadb_address
)
2816 || mhp
->extlen
[SADB_X_EXT_ADDR_RANGE_SRC_END
] < sizeof(struct sadb_address
))) ||
2817 (!use_src_range
&& mhp
->extlen
[SADB_EXT_ADDRESS_SRC
] < sizeof(struct sadb_address
)) ||
2818 (use_dst_range
&& (mhp
->extlen
[SADB_X_EXT_ADDR_RANGE_DST_START
] < sizeof(struct sadb_address
)
2819 || mhp
->extlen
[SADB_X_EXT_ADDR_RANGE_DST_END
] < sizeof(struct sadb_address
))) ||
2820 (!use_dst_range
&& mhp
->extlen
[SADB_EXT_ADDRESS_DST
] < sizeof(struct sadb_address
)) ||
2821 mhp
->extlen
[SADB_X_EXT_POLICY
] < sizeof(struct sadb_x_policy
)) {
2822 ipseclog((LOG_DEBUG
, "key_spddelete: invalid message is passed.\n"));
2823 return key_senderror(so
, m
, EINVAL
);
2826 if (use_src_range
) {
2827 src0
= (struct sadb_address
*)mhp
->ext
[SADB_X_EXT_ADDR_RANGE_SRC_START
];
2828 src1
= (struct sadb_address
*)mhp
->ext
[SADB_X_EXT_ADDR_RANGE_SRC_END
];
2830 src0
= (struct sadb_address
*)mhp
->ext
[SADB_EXT_ADDRESS_SRC
];
2832 if (use_dst_range
) {
2833 dst0
= (struct sadb_address
*)mhp
->ext
[SADB_X_EXT_ADDR_RANGE_DST_START
];
2834 dst1
= (struct sadb_address
*)mhp
->ext
[SADB_X_EXT_ADDR_RANGE_DST_END
];
2836 dst0
= (struct sadb_address
*)mhp
->ext
[SADB_EXT_ADDRESS_DST
];
2838 xpl0
= (struct sadb_x_policy
*)(void *)mhp
->ext
[SADB_X_EXT_POLICY
];
2839 ipsecifopts
= (struct sadb_x_ipsecif
*)(void *)mhp
->ext
[SADB_X_EXT_IPSECIF
];
2841 /* checking the direction. */
2842 switch (xpl0
->sadb_x_policy_dir
) {
2843 case IPSEC_DIR_INBOUND
:
2844 case IPSEC_DIR_OUTBOUND
:
2847 ipseclog((LOG_DEBUG
, "key_spddelete: Invalid SP direction.\n"));
2848 return key_senderror(so
, m
, EINVAL
);
2851 /* Process interfaces */
2852 if (ipsecifopts
!= NULL
) {
2853 if (ipsecifopts
->sadb_x_ipsecif_internal_if
[0]) {
2854 ifnet_find_by_name(ipsecifopts
->sadb_x_ipsecif_internal_if
, &internal_if
);
2859 /* XXX boundary check against sa_len */
2860 KEY_SETSECSPIDX(xpl0
->sadb_x_policy_dir
,
2863 src0
->sadb_address_prefixlen
,
2864 dst0
->sadb_address_prefixlen
,
2865 src0
->sadb_address_proto
,
2867 use_src_range
? src0
+ 1 : NULL
,
2868 use_src_range
? src1
+ 1 : NULL
,
2869 use_dst_range
? dst0
+ 1 : NULL
,
2870 use_dst_range
? dst1
+ 1 : NULL
,
2873 /* Is there SP in SPD ? */
2874 lck_mtx_lock(sadb_mutex
);
2875 if ((sp
= key_getsp(&spidx
)) == NULL
) {
2876 ipseclog((LOG_DEBUG
, "key_spddelete: no SP found.\n"));
2877 lck_mtx_unlock(sadb_mutex
);
2879 ifnet_release(internal_if
);
2882 return key_senderror(so
, m
, EINVAL
);
2886 ifnet_release(internal_if
);
2890 /* save policy id to buffer to be returned. */
2891 xpl0
->sadb_x_policy_id
= sp
->id
;
2893 sp
->state
= IPSEC_SPSTATE_DEAD
;
2894 key_freesp(sp
, KEY_SADB_LOCKED
);
2895 lck_mtx_unlock(sadb_mutex
);
2900 struct sadb_msg
*newmsg
;
2901 int mbufItems
[] = {SADB_EXT_RESERVED
, SADB_X_EXT_POLICY
,
2902 SADB_EXT_ADDRESS_SRC
, SADB_EXT_ADDRESS_DST
,
2903 SADB_X_EXT_ADDR_RANGE_SRC_START
, SADB_X_EXT_ADDR_RANGE_SRC_END
,
2904 SADB_X_EXT_ADDR_RANGE_DST_START
, SADB_X_EXT_ADDR_RANGE_DST_END
};
2906 /* create new sadb_msg to reply. */
2907 n
= key_gather_mbuf(m
, mhp
, 1, sizeof(mbufItems
) / sizeof(int), mbufItems
);
2909 return key_senderror(so
, m
, ENOBUFS
);
2912 newmsg
= mtod(n
, struct sadb_msg
*);
2913 newmsg
->sadb_msg_errno
= 0;
2914 VERIFY(PFKEY_UNIT64(n
->m_pkthdr
.len
) <= UINT16_MAX
);
2915 newmsg
->sadb_msg_len
= (u_int16_t
)PFKEY_UNIT64(n
->m_pkthdr
.len
);
2918 return key_sendup_mbuf(so
, n
, KEY_SENDUP_ALL
);
2923 * SADB_SPDDELETE2 processing
2926 * from the user(?), and set SADB_SASTATE_DEAD,
2930 * policy(*) including direction of policy.
2932 * m will always be freed.
2938 const struct sadb_msghdr
*mhp
)
2941 struct secpolicy
*sp
;
2943 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_NOTOWNED
);
2946 if (so
== NULL
|| m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
) {
2947 panic("key_spddelete2: NULL pointer is passed.\n");
2950 if (mhp
->ext
[SADB_X_EXT_POLICY
] == NULL
||
2951 mhp
->extlen
[SADB_X_EXT_POLICY
] < sizeof(struct sadb_x_policy
)) {
2952 ipseclog((LOG_DEBUG
, "key_spddelete2: invalid message is passed.\n"));
2953 key_senderror(so
, m
, EINVAL
);
2957 id
= ((struct sadb_x_policy
*)
2958 (void *)mhp
->ext
[SADB_X_EXT_POLICY
])->sadb_x_policy_id
;
2960 /* Is there SP in SPD ? */
2961 lck_mtx_lock(sadb_mutex
);
2962 if ((sp
= __key_getspbyid(id
)) == NULL
) {
2963 lck_mtx_unlock(sadb_mutex
);
2964 ipseclog((LOG_DEBUG
, "key_spddelete2: no SP found id:%u.\n", id
));
2965 return key_senderror(so
, m
, EINVAL
);
2968 sp
->state
= IPSEC_SPSTATE_DEAD
;
2969 key_freesp(sp
, KEY_SADB_LOCKED
);
2970 lck_mtx_unlock(sadb_mutex
);
2973 struct mbuf
*n
, *nn
;
2974 struct sadb_msg
*newmsg
;
2977 /* create new sadb_msg to reply. */
2978 len
= PFKEY_ALIGN8(sizeof(struct sadb_msg
));
2980 if (len
> MCLBYTES
) {
2981 return key_senderror(so
, m
, ENOBUFS
);
2983 MGETHDR(n
, M_WAITOK
, MT_DATA
);
2984 if (n
&& len
> MHLEN
) {
2985 MCLGET(n
, M_WAITOK
);
2986 if ((n
->m_flags
& M_EXT
) == 0) {
2992 return key_senderror(so
, m
, ENOBUFS
);
2999 m_copydata(m
, 0, sizeof(struct sadb_msg
), mtod(n
, caddr_t
) + off
);
3000 off
+= PFKEY_ALIGN8(sizeof(struct sadb_msg
));
3004 panic("length inconsistency in key_spddelete2");
3008 n
->m_next
= m_copym(m
, mhp
->extoff
[SADB_X_EXT_POLICY
],
3009 mhp
->extlen
[SADB_X_EXT_POLICY
], M_WAITOK
);
3012 return key_senderror(so
, m
, ENOBUFS
);
3015 n
->m_pkthdr
.len
= 0;
3016 for (nn
= n
; nn
; nn
= nn
->m_next
) {
3017 n
->m_pkthdr
.len
+= nn
->m_len
;
3020 newmsg
= mtod(n
, struct sadb_msg
*);
3021 newmsg
->sadb_msg_errno
= 0;
3022 VERIFY(PFKEY_UNIT64(n
->m_pkthdr
.len
) <= UINT16_MAX
);
3023 newmsg
->sadb_msg_len
= (u_int16_t
)PFKEY_UNIT64(n
->m_pkthdr
.len
);
3026 return key_sendup_mbuf(so
, n
, KEY_SENDUP_ALL
);
3034 const struct sadb_msghdr
*mhp
)
3037 struct secpolicy
*sp
;
3039 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_NOTOWNED
);
3042 if (so
== NULL
|| m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
) {
3043 panic("key_spdenable: NULL pointer is passed.\n");
3046 if (mhp
->ext
[SADB_X_EXT_POLICY
] == NULL
||
3047 mhp
->extlen
[SADB_X_EXT_POLICY
] < sizeof(struct sadb_x_policy
)) {
3048 ipseclog((LOG_DEBUG
, "key_spdenable: invalid message is passed.\n"));
3049 key_senderror(so
, m
, EINVAL
);
3053 id
= ((struct sadb_x_policy
*)
3054 (void *)mhp
->ext
[SADB_X_EXT_POLICY
])->sadb_x_policy_id
;
3056 /* Is there SP in SPD ? */
3057 lck_mtx_lock(sadb_mutex
);
3058 if ((sp
= __key_getspbyid(id
)) == NULL
) {
3059 lck_mtx_unlock(sadb_mutex
);
3060 ipseclog((LOG_DEBUG
, "key_spdenable: no SP found id:%u.\n", id
));
3061 return key_senderror(so
, m
, EINVAL
);
3065 key_freesp(sp
, KEY_SADB_LOCKED
);
3066 lck_mtx_unlock(sadb_mutex
);
3070 struct sadb_msg
*newmsg
;
3071 int mbufItems
[] = {SADB_EXT_RESERVED
, SADB_X_EXT_POLICY
};
3073 /* create new sadb_msg to reply. */
3074 n
= key_gather_mbuf(m
, mhp
, 1, sizeof(mbufItems
) / sizeof(int), mbufItems
);
3076 return key_senderror(so
, m
, ENOBUFS
);
3079 if (n
->m_len
< sizeof(struct sadb_msg
)) {
3080 n
= m_pullup(n
, sizeof(struct sadb_msg
));
3082 return key_senderror(so
, m
, ENOBUFS
);
3085 newmsg
= mtod(n
, struct sadb_msg
*);
3086 newmsg
->sadb_msg_errno
= 0;
3087 VERIFY(PFKEY_UNIT64(n
->m_pkthdr
.len
) <= UINT16_MAX
);
3088 newmsg
->sadb_msg_len
= (u_int16_t
)PFKEY_UNIT64(n
->m_pkthdr
.len
);
3091 return key_sendup_mbuf(so
, n
, KEY_SENDUP_ALL
);
3099 const struct sadb_msghdr
*mhp
)
3102 struct secpolicy
*sp
;
3104 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_NOTOWNED
);
3107 if (so
== NULL
|| m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
) {
3108 panic("key_spddisable: NULL pointer is passed.\n");
3111 if (mhp
->ext
[SADB_X_EXT_POLICY
] == NULL
||
3112 mhp
->extlen
[SADB_X_EXT_POLICY
] < sizeof(struct sadb_x_policy
)) {
3113 ipseclog((LOG_DEBUG
, "key_spddisable: invalid message is passed.\n"));
3114 key_senderror(so
, m
, EINVAL
);
3118 id
= ((struct sadb_x_policy
*)
3119 (void *)mhp
->ext
[SADB_X_EXT_POLICY
])->sadb_x_policy_id
;
3121 /* Is there SP in SPD ? */
3122 lck_mtx_lock(sadb_mutex
);
3123 if ((sp
= __key_getspbyid(id
)) == NULL
) {
3124 lck_mtx_unlock(sadb_mutex
);
3125 ipseclog((LOG_DEBUG
, "key_spddisable: no SP found id:%u.\n", id
));
3126 return key_senderror(so
, m
, EINVAL
);
3130 key_freesp(sp
, KEY_SADB_LOCKED
);
3131 lck_mtx_unlock(sadb_mutex
);
3135 struct sadb_msg
*newmsg
;
3136 int mbufItems
[] = {SADB_EXT_RESERVED
, SADB_X_EXT_POLICY
};
3138 /* create new sadb_msg to reply. */
3139 n
= key_gather_mbuf(m
, mhp
, 1, sizeof(mbufItems
) / sizeof(int), mbufItems
);
3141 return key_senderror(so
, m
, ENOBUFS
);
3144 if (n
->m_len
< sizeof(struct sadb_msg
)) {
3145 n
= m_pullup(n
, sizeof(struct sadb_msg
));
3147 return key_senderror(so
, m
, ENOBUFS
);
3150 newmsg
= mtod(n
, struct sadb_msg
*);
3151 newmsg
->sadb_msg_errno
= 0;
3152 VERIFY(PFKEY_UNIT64(n
->m_pkthdr
.len
) <= UINT16_MAX
);
3153 newmsg
->sadb_msg_len
= (u_int16_t
)PFKEY_UNIT64(n
->m_pkthdr
.len
);
3156 return key_sendup_mbuf(so
, n
, KEY_SENDUP_ALL
);
3161 * SADB_X_GET processing
3166 * <base, address(SD), policy>
3168 * policy(*) including direction of policy.
3170 * m will always be freed.
3176 const struct sadb_msghdr
*mhp
)
3179 struct secpolicy
*sp
;
3182 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_NOTOWNED
);
3185 if (so
== NULL
|| m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
) {
3186 panic("key_spdget: NULL pointer is passed.\n");
3189 if (mhp
->ext
[SADB_X_EXT_POLICY
] == NULL
||
3190 mhp
->extlen
[SADB_X_EXT_POLICY
] < sizeof(struct sadb_x_policy
)) {
3191 ipseclog((LOG_DEBUG
, "key_spdget: invalid message is passed.\n"));
3192 return key_senderror(so
, m
, EINVAL
);
3195 id
= ((struct sadb_x_policy
*)
3196 (void *)mhp
->ext
[SADB_X_EXT_POLICY
])->sadb_x_policy_id
;
3198 /* Is there SP in SPD ? */
3199 lck_mtx_lock(sadb_mutex
);
3200 if ((sp
= __key_getspbyid(id
)) == NULL
) {
3201 ipseclog((LOG_DEBUG
, "key_spdget: no SP found id:%u.\n", id
));
3202 lck_mtx_unlock(sadb_mutex
);
3203 return key_senderror(so
, m
, ENOENT
);
3205 lck_mtx_unlock(sadb_mutex
);
3206 n
= key_setdumpsp(sp
, SADB_X_SPDGET
, 0, mhp
->msg
->sadb_msg_pid
);
3207 key_freesp(sp
, KEY_SADB_UNLOCKED
);
3210 return key_sendup_mbuf(so
, n
, KEY_SENDUP_ONE
);
3212 return key_senderror(so
, m
, ENOBUFS
);
3217 * SADB_X_SPDACQUIRE processing.
3218 * Acquire policy and SA(s) for a *OUTBOUND* packet.
3221 * to KMD, and expect to receive
3222 * <base> with SADB_X_SPDACQUIRE if error occurred,
3225 * with SADB_X_SPDUPDATE from KMD by PF_KEY.
3226 * policy(*) is without policy requests.
3229 * others: error number
3233 struct secpolicy
*sp
)
3235 struct mbuf
*result
= NULL
, *m
;
3236 struct secspacq
*newspacq
;
3239 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_NOTOWNED
);
3243 panic("key_spdacquire: NULL pointer is passed.\n");
3245 if (sp
->req
!= NULL
) {
3246 panic("key_spdacquire: called but there is request.\n");
3248 if (sp
->policy
!= IPSEC_POLICY_IPSEC
) {
3249 panic("key_spdacquire: policy mismathed. IPsec is expected.\n");
3252 /* get a entry to check whether sent message or not. */
3253 lck_mtx_lock(sadb_mutex
);
3255 if ((newspacq
= key_getspacq(&sp
->spidx
)) != NULL
) {
3256 key_freesp(sp
, KEY_SADB_LOCKED
);
3257 if (key_blockacq_count
< newspacq
->count
) {
3258 /* reset counter and do send message. */
3259 newspacq
->count
= 0;
3261 /* increment counter and do nothing. */
3263 lck_mtx_unlock(sadb_mutex
);
3267 /* make new entry for blocking to send SADB_ACQUIRE. */
3268 if ((newspacq
= key_newspacq(&sp
->spidx
)) == NULL
) {
3269 key_freesp(sp
, KEY_SADB_LOCKED
);
3270 lck_mtx_unlock(sadb_mutex
);
3273 key_freesp(sp
, KEY_SADB_LOCKED
);
3274 /* add to acqtree */
3275 LIST_INSERT_HEAD(&spacqtree
, newspacq
, chain
);
3276 key_start_timehandler();
3278 lck_mtx_unlock(sadb_mutex
);
3279 /* create new sadb_msg to reply. */
3280 m
= key_setsadbmsg(SADB_X_SPDACQUIRE
, 0, 0, 0, 0, 0);
3287 result
->m_pkthdr
.len
= 0;
3288 for (m
= result
; m
; m
= m
->m_next
) {
3289 result
->m_pkthdr
.len
+= m
->m_len
;
3292 VERIFY(PFKEY_UNIT64(result
->m_pkthdr
.len
) <= UINT16_MAX
);
3293 mtod(result
, struct sadb_msg
*)->sadb_msg_len
=
3294 (u_int16_t
)PFKEY_UNIT64(result
->m_pkthdr
.len
);
3296 return key_sendup_mbuf(NULL
, m
, KEY_SENDUP_REGISTERED
);
3306 * SADB_SPDFLUSH processing
3309 * from the user, and free all entries in secpctree.
3313 * NOTE: what to do is only marking SADB_SASTATE_DEAD.
3315 * m will always be freed.
3321 const struct sadb_msghdr
*mhp
)
3323 struct sadb_msg
*newmsg
;
3324 struct secpolicy
*sp
;
3328 if (so
== NULL
|| m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
) {
3329 panic("key_spdflush: NULL pointer is passed.\n");
3332 if (m
->m_len
!= PFKEY_ALIGN8(sizeof(struct sadb_msg
))) {
3333 return key_senderror(so
, m
, EINVAL
);
3336 lck_mtx_lock(sadb_mutex
);
3337 for (dir
= 0; dir
< IPSEC_DIR_MAX
; dir
++) {
3338 LIST_FOREACH(sp
, &sptree
[dir
], chain
) {
3339 sp
->state
= IPSEC_SPSTATE_DEAD
;
3342 lck_mtx_unlock(sadb_mutex
);
3344 if (sizeof(struct sadb_msg
) > m
->m_len
+ M_TRAILINGSPACE(m
)) {
3345 ipseclog((LOG_DEBUG
, "key_spdflush: No more memory.\n"));
3346 return key_senderror(so
, m
, ENOBUFS
);
3353 m
->m_pkthdr
.len
= m
->m_len
= PFKEY_ALIGN8(sizeof(struct sadb_msg
));
3354 newmsg
= mtod(m
, struct sadb_msg
*);
3355 newmsg
->sadb_msg_errno
= 0;
3356 newmsg
->sadb_msg_len
= (u_int16_t
)PFKEY_UNIT64(m
->m_pkthdr
.len
);
3358 return key_sendup_mbuf(so
, m
, KEY_SENDUP_ALL
);
3362 * SADB_SPDDUMP processing
3365 * from the user, and dump all SP leaves
3370 * m will always be freed.
3377 const struct sadb_msghdr
*mhp
)
3379 struct secpolicy
*sp
, **spbuf
= NULL
, **sp_ptr
;
3380 u_int32_t cnt
= 0, bufcount
= 0;
3381 size_t total_req_size
= 0;
3387 if (so
== NULL
|| m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
) {
3388 panic("key_spddump: NULL pointer is passed.\n");
3391 if ((bufcount
= ipsec_policy_count
) == 0) {
3396 if (os_add_overflow(bufcount
, 256, &bufcount
)) {
3397 ipseclog((LOG_DEBUG
, "key_spddump: bufcount overflow, ipsec policy count %u.\n", ipsec_policy_count
));
3398 bufcount
= ipsec_policy_count
;
3401 if (os_mul_overflow(bufcount
, sizeof(struct secpolicy
*), &total_req_size
)) {
3402 panic("key_spddump spbuf requested memory overflow %u\n", bufcount
);
3405 KMALLOC_WAIT(spbuf
, struct secpolicy
**, total_req_size
);
3406 if (spbuf
== NULL
) {
3407 ipseclog((LOG_DEBUG
, "key_spddump: No more memory.\n"));
3411 lck_mtx_lock(sadb_mutex
);
3412 /* search SPD entry, make list. */
3414 for (dir
= 0; dir
< IPSEC_DIR_MAX
; dir
++) {
3415 LIST_FOREACH(sp
, &sptree
[dir
], chain
) {
3416 if (cnt
== bufcount
) {
3417 break; /* buffer full */
3424 lck_mtx_unlock(sadb_mutex
);
3434 n
= key_setdumpsp(*sp_ptr
++, SADB_X_SPDDUMP
, cnt
,
3435 mhp
->msg
->sadb_msg_pid
);
3438 key_sendup_mbuf(so
, n
, KEY_SENDUP_ONE
);
3442 lck_mtx_lock(sadb_mutex
);
3443 while (sp_ptr
> spbuf
) {
3444 key_freesp(*(--sp_ptr
), KEY_SADB_LOCKED
);
3446 lck_mtx_unlock(sadb_mutex
);
3453 return key_senderror(so
, m
, error
);
3460 static struct mbuf
*
3462 struct secpolicy
*sp
,
3467 struct mbuf
*result
= NULL
, *m
;
3469 m
= key_setsadbmsg(msg_type
, 0, SADB_SATYPE_UNSPEC
, seq
, pid
, (u_int16_t
)sp
->refcnt
);
3475 if (sp
->spidx
.src_range
.start
.ss_len
> 0) {
3476 m
= key_setsadbaddr(SADB_X_EXT_ADDR_RANGE_SRC_START
,
3477 (struct sockaddr
*)&sp
->spidx
.src_range
.start
, sp
->spidx
.prefs
,
3478 sp
->spidx
.ul_proto
);
3484 m
= key_setsadbaddr(SADB_X_EXT_ADDR_RANGE_SRC_END
,
3485 (struct sockaddr
*)&sp
->spidx
.src_range
.end
, sp
->spidx
.prefs
,
3486 sp
->spidx
.ul_proto
);
3492 m
= key_setsadbaddr(SADB_EXT_ADDRESS_SRC
,
3493 (struct sockaddr
*)&sp
->spidx
.src
, sp
->spidx
.prefs
,
3494 sp
->spidx
.ul_proto
);
3501 if (sp
->spidx
.dst_range
.start
.ss_len
> 0) {
3502 m
= key_setsadbaddr(SADB_X_EXT_ADDR_RANGE_DST_START
,
3503 (struct sockaddr
*)&sp
->spidx
.dst_range
.start
, sp
->spidx
.prefd
,
3504 sp
->spidx
.ul_proto
);
3510 m
= key_setsadbaddr(SADB_X_EXT_ADDR_RANGE_DST_END
,
3511 (struct sockaddr
*)&sp
->spidx
.dst_range
.end
, sp
->spidx
.prefd
,
3512 sp
->spidx
.ul_proto
);
3518 m
= key_setsadbaddr(SADB_EXT_ADDRESS_DST
,
3519 (struct sockaddr
*)&sp
->spidx
.dst
, sp
->spidx
.prefd
,
3520 sp
->spidx
.ul_proto
);
3527 if (sp
->spidx
.internal_if
|| sp
->outgoing_if
|| sp
->ipsec_if
|| sp
->disabled
) {
3528 m
= key_setsadbipsecif(sp
->spidx
.internal_if
, sp
->outgoing_if
, sp
->ipsec_if
, sp
->disabled
);
3541 if ((result
->m_flags
& M_PKTHDR
) == 0) {
3545 if (result
->m_len
< sizeof(struct sadb_msg
)) {
3546 result
= m_pullup(result
, sizeof(struct sadb_msg
));
3547 if (result
== NULL
) {
3552 result
->m_pkthdr
.len
= 0;
3553 for (m
= result
; m
; m
= m
->m_next
) {
3554 result
->m_pkthdr
.len
+= m
->m_len
;
3557 if (PFKEY_UNIT64(result
->m_pkthdr
.len
) >= UINT16_MAX
) {
3558 ipseclog((LOG_DEBUG
, "key_setdumpsp: packet header length > UINT16_MAX\n"));
3562 mtod(result
, struct sadb_msg
*)->sadb_msg_len
=
3563 (u_int16_t
)PFKEY_UNIT64(result
->m_pkthdr
.len
);
3573 * get PFKEY message length for security policy and request.
3577 struct secpolicy
*sp
)
3581 tlen
= sizeof(struct sadb_x_policy
);
3583 /* if is the policy for ipsec ? */
3584 if (sp
->policy
!= IPSEC_POLICY_IPSEC
) {
3588 /* get length of ipsec requests */
3590 struct ipsecrequest
*isr
;
3593 for (isr
= sp
->req
; isr
!= NULL
; isr
= isr
->next
) {
3594 len
= sizeof(struct sadb_x_ipsecrequest
)
3595 + isr
->saidx
.src
.ss_len
3596 + isr
->saidx
.dst
.ss_len
;
3598 tlen
+= PFKEY_ALIGN8(len
);
3606 * SADB_SPDEXPIRE processing
3608 * <base, address(SD), lifetime(CH), policy>
3612 * others : error number
3616 struct secpolicy
*sp
)
3618 struct mbuf
*result
= NULL
, *m
;
3621 struct sadb_lifetime
*lt
;
3623 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_NOTOWNED
);
3627 panic("key_spdexpire: NULL pointer is passed.\n");
3630 /* set msg header */
3631 m
= key_setsadbmsg(SADB_X_SPDEXPIRE
, 0, 0, 0, 0, 0);
3638 /* create lifetime extension (current and hard) */
3639 len
= PFKEY_ALIGN8(sizeof(*lt
)) * 2;
3640 m
= key_alloc_mbuf(len
);
3641 if (!m
|| m
->m_next
) { /*XXX*/
3648 bzero(mtod(m
, caddr_t
), len
);
3649 lt
= mtod(m
, struct sadb_lifetime
*);
3650 lt
->sadb_lifetime_len
= PFKEY_UNIT64(sizeof(struct sadb_lifetime
));
3651 lt
->sadb_lifetime_exttype
= SADB_EXT_LIFETIME_CURRENT
;
3652 lt
->sadb_lifetime_allocations
= 0;
3653 lt
->sadb_lifetime_bytes
= 0;
3654 lt
->sadb_lifetime_addtime
= sp
->created
;
3655 lt
->sadb_lifetime_usetime
= sp
->lastused
;
3656 lt
= (struct sadb_lifetime
*)(void *)(mtod(m
, caddr_t
) + len
/ 2);
3657 lt
->sadb_lifetime_len
= PFKEY_UNIT64(sizeof(struct sadb_lifetime
));
3658 lt
->sadb_lifetime_exttype
= SADB_EXT_LIFETIME_HARD
;
3659 lt
->sadb_lifetime_allocations
= 0;
3660 lt
->sadb_lifetime_bytes
= 0;
3661 lt
->sadb_lifetime_addtime
= sp
->lifetime
;
3662 lt
->sadb_lifetime_usetime
= sp
->validtime
;
3665 /* set sadb_address(es) for source */
3666 if (sp
->spidx
.src_range
.start
.ss_len
> 0) {
3667 m
= key_setsadbaddr(SADB_X_EXT_ADDR_RANGE_SRC_START
,
3668 (struct sockaddr
*)&sp
->spidx
.src_range
.start
, sp
->spidx
.prefs
,
3669 sp
->spidx
.ul_proto
);
3676 m
= key_setsadbaddr(SADB_X_EXT_ADDR_RANGE_SRC_END
,
3677 (struct sockaddr
*)&sp
->spidx
.src_range
.end
, sp
->spidx
.prefs
,
3678 sp
->spidx
.ul_proto
);
3685 m
= key_setsadbaddr(SADB_EXT_ADDRESS_SRC
,
3686 (struct sockaddr
*)&sp
->spidx
.src
, sp
->spidx
.prefs
,
3687 sp
->spidx
.ul_proto
);
3695 /* set sadb_address(es) for dest */
3696 if (sp
->spidx
.dst_range
.start
.ss_len
> 0) {
3697 m
= key_setsadbaddr(SADB_X_EXT_ADDR_RANGE_DST_START
,
3698 (struct sockaddr
*)&sp
->spidx
.dst_range
.start
, sp
->spidx
.prefd
,
3699 sp
->spidx
.ul_proto
);
3706 m
= key_setsadbaddr(SADB_X_EXT_ADDR_RANGE_DST_END
,
3707 (struct sockaddr
*)&sp
->spidx
.dst_range
.end
, sp
->spidx
.prefd
,
3708 sp
->spidx
.ul_proto
);
3715 m
= key_setsadbaddr(SADB_EXT_ADDRESS_DST
,
3716 (struct sockaddr
*)&sp
->spidx
.dst
, sp
->spidx
.prefd
,
3717 sp
->spidx
.ul_proto
);
3733 if ((result
->m_flags
& M_PKTHDR
) == 0) {
3738 if (result
->m_len
< sizeof(struct sadb_msg
)) {
3739 result
= m_pullup(result
, sizeof(struct sadb_msg
));
3740 if (result
== NULL
) {
3746 result
->m_pkthdr
.len
= 0;
3747 for (m
= result
; m
; m
= m
->m_next
) {
3748 result
->m_pkthdr
.len
+= m
->m_len
;
3751 if (PFKEY_UNIT64(result
->m_pkthdr
.len
) >= UINT16_MAX
) {
3752 ipseclog((LOG_DEBUG
, "key_setdumpsp: packet header length > UINT16_MAX\n"));
3756 mtod(result
, struct sadb_msg
*)->sadb_msg_len
=
3757 (u_int16_t
)PFKEY_UNIT64(result
->m_pkthdr
.len
);
3759 return key_sendup_mbuf(NULL
, result
, KEY_SENDUP_REGISTERED
);
3768 /* %%% SAD management */
3770 * allocating a memory for new SA head, and copy from the values of mhp.
3771 * OUT: NULL : failure due to the lack of memory.
3772 * others : pointer to new SA head.
3774 static struct secashead
*
3775 key_newsah(struct secasindex
*saidx
,
3781 struct secashead
*newsah
;
3784 if (saidx
== NULL
) {
3785 panic("key_newsaidx: NULL pointer is passed.\n");
3788 VERIFY(flags
== SECURITY_ASSOCIATION_PFKEY
|| flags
== SECURITY_ASSOCIATION_CUSTOM_IPSEC
);
3790 newsah
= keydb_newsecashead();
3791 if (newsah
== NULL
) {
3795 bcopy(saidx
, &newsah
->saidx
, sizeof(newsah
->saidx
));
3797 /* remove the ports */
3798 switch (saidx
->src
.ss_family
) {
3800 ((struct sockaddr_in
*)(&newsah
->saidx
.src
))->sin_port
= IPSEC_PORT_ANY
;
3803 ((struct sockaddr_in6
*)(&newsah
->saidx
.src
))->sin6_port
= IPSEC_PORT_ANY
;
3808 switch (saidx
->dst
.ss_family
) {
3810 ((struct sockaddr_in
*)(&newsah
->saidx
.dst
))->sin_port
= IPSEC_PORT_ANY
;
3813 ((struct sockaddr_in6
*)(&newsah
->saidx
.dst
))->sin6_port
= IPSEC_PORT_ANY
;
3819 newsah
->outgoing_if
= outgoing_if
;
3821 ifnet_reference(ipsec_if
);
3822 newsah
->ipsec_if
= ipsec_if
;
3825 /* add to saidxtree */
3826 newsah
->state
= SADB_SASTATE_MATURE
;
3827 newsah
->flags
= flags
;
3829 if (flags
== SECURITY_ASSOCIATION_PFKEY
) {
3830 LIST_INSERT_HEAD(&sahtree
, newsah
, chain
);
3832 LIST_INSERT_HEAD(&custom_sahtree
, newsah
, chain
);
3834 key_start_timehandler();
3840 * delete SA index and all SA registerd.
3844 struct secashead
*sah
)
3846 struct secasvar
*sav
, *nextsav
;
3847 u_int stateidx
, state
;
3850 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_OWNED
);
3854 panic("key_delsah: NULL pointer is passed.\n");
3857 if (sah
->use_count
> 0) {
3861 /* searching all SA registerd in the secindex. */
3863 stateidx
< _ARRAYLEN(saorder_state_any
);
3865 state
= saorder_state_any
[stateidx
];
3866 for (sav
= (struct secasvar
*)LIST_FIRST(&sah
->savtree
[state
]);
3869 nextsav
= LIST_NEXT(sav
, chain
);
3871 if (sav
->refcnt
> 0) {
3872 /* give up to delete this sa */
3878 KEY_CHKSASTATE(state
, sav
->state
, "key_delsah");
3880 key_freesav(sav
, KEY_SADB_LOCKED
);
3882 /* remove back pointer */
3888 /* don't delete sah only if there are savs. */
3893 ROUTE_RELEASE(&sah
->sa_route
);
3895 if (sah
->ipsec_if
) {
3896 ifnet_release(sah
->ipsec_if
);
3897 sah
->ipsec_if
= NULL
;
3900 /* remove from tree of SA index */
3901 if (__LIST_CHAINED(sah
)) {
3902 LIST_REMOVE(sah
, chain
);
3911 * allocating a new SA with LARVAL state. key_add() and key_getspi() call,
3912 * and copy the values of mhp into new buffer.
3913 * When SAD message type is GETSPI:
3914 * to set sequence number from acq_seq++,
3915 * to set zero to SPI.
3916 * not to call key_setsava().
3918 * others : pointer to new secasvar.
3920 * does not modify mbuf. does not free mbuf on error.
3922 static struct secasvar
*
3925 const struct sadb_msghdr
*mhp
,
3926 struct secashead
*sah
,
3930 struct secasvar
*newsav
;
3931 const struct sadb_sa
*xsa
;
3933 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_OWNED
);
3936 if (m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
|| sah
== NULL
) {
3937 panic("key_newsa: NULL pointer is passed.\n");
3940 KMALLOC_NOWAIT(newsav
, struct secasvar
*, sizeof(struct secasvar
));
3941 if (newsav
== NULL
) {
3942 lck_mtx_unlock(sadb_mutex
);
3943 KMALLOC_WAIT(newsav
, struct secasvar
*, sizeof(struct secasvar
));
3944 lck_mtx_lock(sadb_mutex
);
3945 if (newsav
== NULL
) {
3946 ipseclog((LOG_DEBUG
, "key_newsa: No more memory.\n"));
3951 bzero((caddr_t
)newsav
, sizeof(struct secasvar
));
3953 switch (mhp
->msg
->sadb_msg_type
) {
3955 key_setspi(newsav
, 0);
3956 newsav
->seq
= mhp
->msg
->sadb_msg_seq
;
3961 if (mhp
->ext
[SADB_EXT_SA
] == NULL
) {
3963 ipseclog((LOG_DEBUG
, "key_newsa: invalid message is passed.\n"));
3967 xsa
= (struct sadb_sa
*)(void *)mhp
->ext
[SADB_EXT_SA
];
3968 key_setspi(newsav
, xsa
->sadb_sa_spi
);
3969 newsav
->seq
= mhp
->msg
->sadb_msg_seq
;
3977 if (mhp
->ext
[SADB_X_EXT_SA2
] != NULL
) {
3978 if (((struct sadb_x_sa2
*)(void *)mhp
->ext
[SADB_X_EXT_SA2
])->sadb_x_sa2_alwaysexpire
) {
3979 newsav
->always_expire
= 1;
3981 newsav
->flags2
= ((struct sadb_x_sa2
*)(void *)mhp
->ext
[SADB_X_EXT_SA2
])->sadb_x_sa2_flags
;
3982 if (newsav
->flags2
& SADB_X_EXT_SA2_DELETE_ON_DETACH
) {
3987 /* copy sav values */
3988 if (mhp
->msg
->sadb_msg_type
!= SADB_GETSPI
) {
3989 *errp
= key_setsaval(newsav
, m
, mhp
);
3995 /* For get SPI, if has a hard lifetime, apply */
3996 const struct sadb_lifetime
*lft0
;
3999 lft0
= (struct sadb_lifetime
*)(void *)mhp
->ext
[SADB_EXT_LIFETIME_HARD
];
4001 /* make lifetime for CURRENT */
4002 KMALLOC_NOWAIT(newsav
->lft_c
, struct sadb_lifetime
*,
4003 sizeof(struct sadb_lifetime
));
4004 if (newsav
->lft_c
== NULL
) {
4005 lck_mtx_unlock(sadb_mutex
);
4006 KMALLOC_WAIT(newsav
->lft_c
, struct sadb_lifetime
*,
4007 sizeof(struct sadb_lifetime
));
4008 lck_mtx_lock(sadb_mutex
);
4009 if (newsav
->lft_c
== NULL
) {
4010 ipseclog((LOG_DEBUG
, "key_newsa: No more memory.\n"));
4019 newsav
->lft_c
->sadb_lifetime_len
= PFKEY_UNIT64(sizeof(struct sadb_lifetime
));
4020 newsav
->lft_c
->sadb_lifetime_exttype
= SADB_EXT_LIFETIME_CURRENT
;
4021 newsav
->lft_c
->sadb_lifetime_allocations
= 0;
4022 newsav
->lft_c
->sadb_lifetime_bytes
= 0;
4023 newsav
->lft_c
->sadb_lifetime_addtime
= tv
.tv_sec
;
4024 newsav
->lft_c
->sadb_lifetime_usetime
= 0;
4026 if (mhp
->extlen
[SADB_EXT_LIFETIME_HARD
] < sizeof(*lft0
)) {
4027 ipseclog((LOG_DEBUG
, "key_newsa: invalid hard lifetime ext len.\n"));
4032 newsav
->lft_h
= (struct sadb_lifetime
*)key_newbuf(lft0
, sizeof(*lft0
));
4033 if (newsav
->lft_h
== NULL
) {
4034 ipseclog((LOG_DEBUG
, "key_newsa: No more memory.\n"));
4046 newsav
->created
= tv
.tv_sec
;
4049 newsav
->pid
= mhp
->msg
->sadb_msg_pid
;
4054 newsav
->state
= SADB_SASTATE_LARVAL
;
4055 LIST_INSERT_TAIL(&sah
->savtree
[SADB_SASTATE_LARVAL
], newsav
,
4058 ipsec_monitor_sleep_wake();
4064 key_migratesav(struct secasvar
*sav
,
4065 struct secashead
*newsah
)
4067 if (sav
== NULL
|| newsah
== NULL
|| sav
->state
!= SADB_SASTATE_MATURE
) {
4071 /* remove from SA header */
4072 if (__LIST_CHAINED(sav
)) {
4073 LIST_REMOVE(sav
, chain
);
4077 LIST_INSERT_TAIL(&newsah
->savtree
[SADB_SASTATE_MATURE
], sav
, secasvar
, chain
);
4082 key_reset_sav(struct secasvar
*sav
)
4084 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_OWNED
);
4088 panic("key_delsav: NULL pointer is passed.\n");
4091 sav
->remote_ike_port
= 0;
4092 sav
->natt_encapsulated_src_port
= 0;
4094 if (sav
->key_auth
!= NULL
) {
4095 bzero(_KEYBUF(sav
->key_auth
), _KEYLEN(sav
->key_auth
));
4096 KFREE(sav
->key_auth
);
4097 sav
->key_auth
= NULL
;
4099 if (sav
->key_enc
!= NULL
) {
4100 bzero(_KEYBUF(sav
->key_enc
), _KEYLEN(sav
->key_enc
));
4101 KFREE(sav
->key_enc
);
4102 sav
->key_enc
= NULL
;
4105 bzero(sav
->sched
, sav
->schedlen
);
4111 for (int i
= 0; i
< MAX_REPLAY_WINDOWS
; i
++) {
4112 if (sav
->replay
[i
] != NULL
) {
4113 keydb_delsecreplay(sav
->replay
[i
]);
4114 sav
->replay
[i
] = NULL
;
4117 if (sav
->lft_c
!= NULL
) {
4121 if (sav
->lft_h
!= NULL
) {
4125 if (sav
->lft_s
!= NULL
) {
4129 if (sav
->iv
!= NULL
) {
4138 * free() SA variable entry.
4142 struct secasvar
*sav
)
4144 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_OWNED
);
4148 panic("key_delsav: NULL pointer is passed.\n");
4151 if (sav
->refcnt
> 0) {
4152 return; /* can't free */
4154 /* remove from SA header */
4155 if (__LIST_CHAINED(sav
)) {
4156 LIST_REMOVE(sav
, chain
);
4160 if (sav
->spihash
.le_prev
|| sav
->spihash
.le_next
) {
4161 LIST_REMOVE(sav
, spihash
);
4175 * others : found, pointer to a SA.
4177 static struct secashead
*
4178 key_getsah(struct secasindex
*saidx
, u_int16_t flags
)
4180 struct secashead
*sah
;
4182 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_OWNED
);
4184 if ((flags
& SECURITY_ASSOCIATION_ANY
) == SECURITY_ASSOCIATION_ANY
||
4185 (flags
& SECURITY_ASSOCIATION_PFKEY
) == SECURITY_ASSOCIATION_PFKEY
) {
4186 LIST_FOREACH(sah
, &sahtree
, chain
) {
4187 if (sah
->state
== SADB_SASTATE_DEAD
) {
4190 if (key_cmpsaidx(&sah
->saidx
, saidx
, CMP_REQID
)) {
4196 if ((flags
& SECURITY_ASSOCIATION_ANY
) == SECURITY_ASSOCIATION_ANY
||
4197 (flags
& SECURITY_ASSOCIATION_PFKEY
) == SECURITY_ASSOCIATION_CUSTOM_IPSEC
) {
4198 LIST_FOREACH(sah
, &custom_sahtree
, chain
) {
4199 if (sah
->state
== SADB_SASTATE_DEAD
) {
4202 if (key_cmpsaidx(&sah
->saidx
, saidx
, 0)) {
4212 key_newsah2(struct secasindex
*saidx
,
4215 struct secashead
*sah
;
4217 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_OWNED
);
4219 sah
= key_getsah(saidx
, SECURITY_ASSOCIATION_ANY
);
4221 return key_newsah(saidx
, NULL
, 0, dir
, SECURITY_ASSOCIATION_PFKEY
);
4227 * check not to be duplicated SPI.
4228 * NOTE: this function is too slow due to searching all SAD.
4231 * others : found, pointer to a SA.
4233 static struct secasvar
*
4235 struct secasindex
*saidx
,
4238 struct secasvar
*sav
;
4239 u_int stateidx
, state
;
4241 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_OWNED
);
4243 /* check address family */
4244 if (saidx
->src
.ss_family
!= saidx
->dst
.ss_family
) {
4245 ipseclog((LOG_DEBUG
, "key_checkspidup: address family mismatched.\n"));
4250 LIST_FOREACH(sav
, &spihash
[SPIHASH(spi
)], spihash
) {
4251 if (sav
->spi
!= spi
) {
4255 stateidx
< _ARRAYLEN(saorder_state_alive
);
4257 state
= saorder_state_alive
[stateidx
];
4258 if (sav
->state
== state
&&
4259 key_ismyaddr((struct sockaddr
*)&sav
->sah
->saidx
.dst
)) {
4270 struct secasvar
*sav
,
4273 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_OWNED
);
4275 if (sav
->spihash
.le_prev
|| sav
->spihash
.le_next
) {
4276 LIST_REMOVE(sav
, spihash
);
4278 LIST_INSERT_HEAD(&spihash
[SPIHASH(spi
)], sav
, spihash
);
4283 * search SAD litmited alive SA, protocol, SPI.
4286 * others : found, pointer to a SA.
4288 static struct secasvar
*
4290 struct secashead
*sah
,
4293 struct secasvar
*sav
, *match
;
4294 u_int stateidx
, state
, matchidx
;
4296 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_OWNED
);
4298 matchidx
= _ARRAYLEN(saorder_state_alive
);
4299 LIST_FOREACH(sav
, &spihash
[SPIHASH(spi
)], spihash
) {
4300 if (sav
->spi
!= spi
) {
4303 if (sav
->sah
!= sah
) {
4306 for (stateidx
= 0; stateidx
< matchidx
; stateidx
++) {
4307 state
= saorder_state_alive
[stateidx
];
4308 if (sav
->state
== state
) {
4310 matchidx
= stateidx
;
4320 * copy SA values from PF_KEY message except *SPI, SEQ, PID, STATE and TYPE*.
4321 * You must update these if need.
4325 * does not modify mbuf. does not free mbuf on error.
4329 struct secasvar
*sav
,
4331 const struct sadb_msghdr
*mhp
)
4334 const struct esp_algorithm
*algo
;
4339 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_OWNED
);
4342 if (m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
) {
4343 panic("key_setsaval: NULL pointer is passed.\n");
4346 /* initialization */
4348 sav
->natt_last_activity
= natt_now
;
4351 if (mhp
->ext
[SADB_EXT_SA
] != NULL
) {
4352 const struct sadb_sa
*sa0
;
4354 sa0
= (struct sadb_sa
*)(void *)mhp
->ext
[SADB_EXT_SA
];
4355 if (mhp
->extlen
[SADB_EXT_SA
] < sizeof(*sa0
)) {
4356 ipseclog((LOG_DEBUG
, "key_setsaval: invalid message size.\n"));
4361 sav
->alg_auth
= sa0
->sadb_sa_auth
;
4362 sav
->alg_enc
= sa0
->sadb_sa_encrypt
;
4363 sav
->flags
= sa0
->sadb_sa_flags
;
4366 * Verify that a nat-traversal port was specified if
4367 * the nat-traversal flag is set.
4369 if ((sav
->flags
& SADB_X_EXT_NATT
) != 0) {
4370 if (mhp
->extlen
[SADB_EXT_SA
] < sizeof(struct sadb_sa_2
) ||
4371 ((const struct sadb_sa_2
*)(sa0
))->sadb_sa_natt_port
== 0) {
4372 ipseclog((LOG_DEBUG
, "key_setsaval: natt port not set.\n"));
4376 sav
->natt_encapsulated_src_port
= ((const struct sadb_sa_2
*)(sa0
))->sadb_sa_natt_src_port
;
4377 sav
->remote_ike_port
= ((const struct sadb_sa_2
*)(sa0
))->sadb_sa_natt_port
;
4378 sav
->natt_interval
= ((const struct sadb_sa_2
*)(sa0
))->sadb_sa_natt_interval
;
4379 sav
->natt_offload_interval
= ((const struct sadb_sa_2
*)(sa0
))->sadb_sa_natt_offload_interval
;
4383 * Verify if SADB_X_EXT_NATT_MULTIPLEUSERS flag is set that
4384 * SADB_X_EXT_NATT is set and SADB_X_EXT_NATT_KEEPALIVE is not
4385 * set (we're not behind nat) - otherwise clear it.
4387 if ((sav
->flags
& SADB_X_EXT_NATT_MULTIPLEUSERS
) != 0) {
4388 if ((sav
->flags
& SADB_X_EXT_NATT
) == 0 ||
4389 (sav
->flags
& SADB_X_EXT_NATT_KEEPALIVE
) != 0) {
4390 sav
->flags
&= ~SADB_X_EXT_NATT_MULTIPLEUSERS
;
4395 if ((sa0
->sadb_sa_flags
& SADB_X_EXT_OLD
) == 0) {
4396 if ((sav
->flags2
& SADB_X_EXT_SA2_SEQ_PER_TRAFFIC_CLASS
) ==
4397 SADB_X_EXT_SA2_SEQ_PER_TRAFFIC_CLASS
) {
4398 uint32_t range
= (1ULL << (sizeof(((struct secreplay
*)0)->count
) * 8)) / MAX_REPLAY_WINDOWS
;
4399 for (int i
= 0; i
< MAX_REPLAY_WINDOWS
; i
++) {
4400 sav
->replay
[i
] = keydb_newsecreplay(sa0
->sadb_sa_replay
);
4401 if (sav
->replay
[i
] == NULL
) {
4402 ipseclog((LOG_DEBUG
, "key_setsaval: No more memory.\n"));
4406 /* Allowed range for sequence per traffic class */
4407 sav
->replay
[i
]->count
= i
* range
;
4408 sav
->replay
[i
]->lastseq
= ((i
+ 1) * range
) - 1;
4411 sav
->replay
[0] = keydb_newsecreplay(sa0
->sadb_sa_replay
);
4412 if (sav
->replay
[0] == NULL
) {
4413 ipseclog((LOG_DEBUG
, "key_setsaval: No more memory.\n"));
4417 sav
->replay
[0]->lastseq
= ~0;
4422 /* Authentication keys */
4423 if (mhp
->ext
[SADB_EXT_KEY_AUTH
] != NULL
) {
4424 const struct sadb_key
*key0
;
4427 key0
= (const struct sadb_key
*)mhp
->ext
[SADB_EXT_KEY_AUTH
];
4428 len
= mhp
->extlen
[SADB_EXT_KEY_AUTH
];
4431 if (len
< sizeof(*key0
)) {
4432 ipseclog((LOG_DEBUG
, "key_setsaval: invalid auth key ext len. len = %d\n", len
));
4436 switch (mhp
->msg
->sadb_msg_satype
) {
4437 case SADB_SATYPE_AH
:
4438 case SADB_SATYPE_ESP
:
4439 if (len
== PFKEY_ALIGN8(sizeof(struct sadb_key
)) &&
4440 sav
->alg_auth
!= SADB_X_AALG_NULL
) {
4449 ipseclog((LOG_DEBUG
, "key_setsaval: invalid key_auth values.\n"));
4453 sav
->key_auth
= (struct sadb_key
*)key_newbuf(key0
, len
);
4454 if (sav
->key_auth
== NULL
) {
4455 ipseclog((LOG_DEBUG
, "key_setsaval: No more memory.\n"));
4461 /* Encryption key */
4462 if (mhp
->ext
[SADB_EXT_KEY_ENCRYPT
] != NULL
) {
4463 const struct sadb_key
*key0
;
4466 key0
= (const struct sadb_key
*)mhp
->ext
[SADB_EXT_KEY_ENCRYPT
];
4467 len
= mhp
->extlen
[SADB_EXT_KEY_ENCRYPT
];
4470 if (len
< sizeof(*key0
)) {
4471 ipseclog((LOG_DEBUG
, "key_setsaval: invalid encryption key ext len. len = %d\n", len
));
4475 switch (mhp
->msg
->sadb_msg_satype
) {
4476 case SADB_SATYPE_ESP
:
4477 if (len
== PFKEY_ALIGN8(sizeof(struct sadb_key
)) &&
4478 sav
->alg_enc
!= SADB_EALG_NULL
) {
4479 ipseclog((LOG_DEBUG
, "key_setsaval: invalid ESP algorithm.\n"));
4483 sav
->key_enc
= (struct sadb_key
*)key_newbuf(key0
, len
);
4484 if (sav
->key_enc
== NULL
) {
4485 ipseclog((LOG_DEBUG
, "key_setsaval: No more memory.\n"));
4490 case SADB_SATYPE_AH
:
4496 ipseclog((LOG_DEBUG
, "key_setsaval: invalid key_enc value.\n"));
4504 switch (mhp
->msg
->sadb_msg_satype
) {
4505 case SADB_SATYPE_ESP
:
4507 algo
= esp_algorithm_lookup(sav
->alg_enc
);
4508 if (algo
&& algo
->ivlen
) {
4509 sav
->ivlen
= (*algo
->ivlen
)(algo
, sav
);
4511 if (sav
->ivlen
== 0) {
4514 KMALLOC_NOWAIT(sav
->iv
, caddr_t
, sav
->ivlen
);
4516 lck_mtx_unlock(sadb_mutex
);
4517 KMALLOC_WAIT(sav
->iv
, caddr_t
, sav
->ivlen
);
4518 lck_mtx_lock(sadb_mutex
);
4520 ipseclog((LOG_DEBUG
, "key_setsaval: No more memory.\n"));
4527 if (sav
->alg_enc
== SADB_X_EALG_AES_GCM
) {
4528 bzero(sav
->iv
, sav
->ivlen
);
4530 key_randomfill(sav
->iv
, sav
->ivlen
);
4534 case SADB_SATYPE_AH
:
4537 ipseclog((LOG_DEBUG
, "key_setsaval: invalid SA type.\n"));
4544 sav
->created
= tv
.tv_sec
;
4546 /* make lifetime for CURRENT */
4547 KMALLOC_NOWAIT(sav
->lft_c
, struct sadb_lifetime
*,
4548 sizeof(struct sadb_lifetime
));
4549 if (sav
->lft_c
== NULL
) {
4550 lck_mtx_unlock(sadb_mutex
);
4551 KMALLOC_WAIT(sav
->lft_c
, struct sadb_lifetime
*,
4552 sizeof(struct sadb_lifetime
));
4553 lck_mtx_lock(sadb_mutex
);
4554 if (sav
->lft_c
== NULL
) {
4555 ipseclog((LOG_DEBUG
, "key_setsaval: No more memory.\n"));
4563 sav
->lft_c
->sadb_lifetime_len
=
4564 PFKEY_UNIT64(sizeof(struct sadb_lifetime
));
4565 sav
->lft_c
->sadb_lifetime_exttype
= SADB_EXT_LIFETIME_CURRENT
;
4566 sav
->lft_c
->sadb_lifetime_allocations
= 0;
4567 sav
->lft_c
->sadb_lifetime_bytes
= 0;
4568 sav
->lft_c
->sadb_lifetime_addtime
= tv
.tv_sec
;
4569 sav
->lft_c
->sadb_lifetime_usetime
= 0;
4571 /* lifetimes for HARD and SOFT */
4573 const struct sadb_lifetime
*lft0
;
4575 lft0
= (struct sadb_lifetime
*)
4576 (void *)mhp
->ext
[SADB_EXT_LIFETIME_HARD
];
4578 if (mhp
->extlen
[SADB_EXT_LIFETIME_HARD
] < sizeof(*lft0
)) {
4579 ipseclog((LOG_DEBUG
, "key_setsaval: invalid hard lifetime ext len.\n"));
4583 sav
->lft_h
= (struct sadb_lifetime
*)key_newbuf(lft0
,
4585 if (sav
->lft_h
== NULL
) {
4586 ipseclog((LOG_DEBUG
, "key_setsaval: No more memory.\n"));
4590 /* to be initialize ? */
4593 lft0
= (struct sadb_lifetime
*)
4594 (void *)mhp
->ext
[SADB_EXT_LIFETIME_SOFT
];
4596 if (mhp
->extlen
[SADB_EXT_LIFETIME_SOFT
] < sizeof(*lft0
)) {
4597 ipseclog((LOG_DEBUG
, "key_setsaval: invalid soft lifetime ext len.\n"));
4601 sav
->lft_s
= (struct sadb_lifetime
*)key_newbuf(lft0
,
4603 if (sav
->lft_s
== NULL
) {
4604 ipseclog((LOG_DEBUG
, "key_setsaval: No more memory.\n"));
4608 /* to be initialize ? */
4620 * validation with a secasvar entry, and set SADB_SATYPE_MATURE.
4626 struct secasvar
*sav
)
4629 int checkmask
= 0; /* 2^0: ealg 2^1: aalg 2^2: calg */
4630 int mustmask
= 0; /* 2^0: ealg 2^1: aalg 2^2: calg */
4634 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_OWNED
);
4636 /* check SPI value */
4637 switch (sav
->sah
->saidx
.proto
) {
4641 /* No reason to test if this is >= 0, because ntohl(sav->spi) is unsigned. */
4642 if (ntohl(sav
->spi
) <= 255) {
4643 ipseclog((LOG_DEBUG
,
4644 "key_mature: illegal range of SPI %u.\n",
4645 (u_int32_t
)ntohl(sav
->spi
)));
4652 switch (sav
->sah
->saidx
.proto
) {
4655 if ((sav
->flags
& SADB_X_EXT_OLD
)
4656 && (sav
->flags
& SADB_X_EXT_DERIV
)) {
4657 ipseclog((LOG_DEBUG
, "key_mature: "
4658 "invalid flag (derived) given to old-esp.\n"));
4661 if (sav
->alg_auth
== SADB_AALG_NONE
) {
4670 if (sav
->flags
& SADB_X_EXT_DERIV
) {
4671 ipseclog((LOG_DEBUG
, "key_mature: "
4672 "invalid flag (derived) given to AH SA.\n"));
4675 if (sav
->alg_enc
!= SADB_EALG_NONE
) {
4676 ipseclog((LOG_DEBUG
, "key_mature: "
4677 "protocol and algorithm mismated.\n"));
4684 ipseclog((LOG_DEBUG
, "key_mature: Invalid satype.\n"));
4685 return EPROTONOSUPPORT
;
4688 /* check authentication algorithm */
4689 if ((checkmask
& 2) != 0) {
4690 const struct ah_algorithm
*algo
;
4693 algo
= ah_algorithm_lookup(sav
->alg_auth
);
4695 ipseclog((LOG_DEBUG
, "key_mature: "
4696 "unknown authentication algorithm.\n"));
4700 /* algorithm-dependent check */
4701 if (sav
->key_auth
) {
4702 keylen
= sav
->key_auth
->sadb_key_bits
;
4706 if (keylen
< algo
->keymin
|| algo
->keymax
< keylen
) {
4707 ipseclog((LOG_DEBUG
,
4708 "key_mature: invalid AH key length %d "
4709 "(%d-%d allowed)\n",
4710 keylen
, algo
->keymin
, algo
->keymax
));
4715 if ((*algo
->mature
)(sav
)) {
4716 /* message generated in per-algorithm function*/
4719 mature
= SADB_SATYPE_AH
;
4723 if ((mustmask
& 2) != 0 && mature
!= SADB_SATYPE_AH
) {
4724 ipseclog((LOG_DEBUG
, "key_mature: no satisfy algorithm for AH\n"));
4729 /* check encryption algorithm */
4730 if ((checkmask
& 1) != 0) {
4732 const struct esp_algorithm
*algo
;
4735 algo
= esp_algorithm_lookup(sav
->alg_enc
);
4737 ipseclog((LOG_DEBUG
, "key_mature: unknown encryption algorithm.\n"));
4741 /* algorithm-dependent check */
4743 keylen
= sav
->key_enc
->sadb_key_bits
;
4747 if (keylen
< algo
->keymin
|| algo
->keymax
< keylen
) {
4748 ipseclog((LOG_DEBUG
,
4749 "key_mature: invalid ESP key length %d "
4750 "(%d-%d allowed)\n",
4751 keylen
, algo
->keymin
, algo
->keymax
));
4756 if ((*algo
->mature
)(sav
)) {
4757 /* message generated in per-algorithm function*/
4760 mature
= SADB_SATYPE_ESP
;
4764 if ((mustmask
& 1) != 0 && mature
!= SADB_SATYPE_ESP
) {
4765 ipseclog((LOG_DEBUG
, "key_mature: no satisfy algorithm for ESP\n"));
4769 ipseclog((LOG_DEBUG
, "key_mature: ESP not supported in this configuration\n"));
4774 key_sa_chgstate(sav
, SADB_SASTATE_MATURE
);
4780 * subroutine for SADB_GET and SADB_DUMP.
4782 static struct mbuf
*
4784 struct secasvar
*sav
,
4790 struct mbuf
*result
= NULL
, *tres
= NULL
, *m
;
4795 SADB_EXT_SA
, SADB_X_EXT_SA2
,
4796 SADB_EXT_LIFETIME_HARD
, SADB_EXT_LIFETIME_SOFT
,
4797 SADB_EXT_LIFETIME_CURRENT
, SADB_EXT_ADDRESS_SRC
,
4798 SADB_EXT_ADDRESS_DST
, SADB_EXT_ADDRESS_PROXY
, SADB_EXT_KEY_AUTH
,
4799 SADB_EXT_KEY_ENCRYPT
, SADB_EXT_IDENTITY_SRC
,
4800 SADB_EXT_IDENTITY_DST
, SADB_EXT_SENSITIVITY
,
4803 m
= key_setsadbmsg(type
, 0, satype
, seq
, pid
, (u_int16_t
)sav
->refcnt
);
4809 for (i
= sizeof(dumporder
) / sizeof(dumporder
[0]) - 1; i
>= 0; i
--) {
4812 switch (dumporder
[i
]) {
4814 m
= key_setsadbsa(sav
);
4820 case SADB_X_EXT_SA2
:
4821 m
= key_setsadbxsa2(sav
->sah
->saidx
.mode
,
4822 sav
->replay
[0] ? sav
->replay
[0]->count
: 0,
4823 sav
->sah
->saidx
.reqid
,
4830 case SADB_EXT_ADDRESS_SRC
:
4831 m
= key_setsadbaddr(SADB_EXT_ADDRESS_SRC
,
4832 (struct sockaddr
*)&sav
->sah
->saidx
.src
,
4833 FULLMASK
, IPSEC_ULPROTO_ANY
);
4839 case SADB_EXT_ADDRESS_DST
:
4840 m
= key_setsadbaddr(SADB_EXT_ADDRESS_DST
,
4841 (struct sockaddr
*)&sav
->sah
->saidx
.dst
,
4842 FULLMASK
, IPSEC_ULPROTO_ANY
);
4848 case SADB_EXT_KEY_AUTH
:
4849 if (!sav
->key_auth
) {
4852 l
= PFKEY_UNUNIT64(sav
->key_auth
->sadb_key_len
);
4856 case SADB_EXT_KEY_ENCRYPT
:
4857 if (!sav
->key_enc
) {
4860 l
= PFKEY_UNUNIT64(sav
->key_enc
->sadb_key_len
);
4864 case SADB_EXT_LIFETIME_CURRENT
:
4868 l
= PFKEY_UNUNIT64(((struct sadb_ext
*)sav
->lft_c
)->sadb_ext_len
);
4872 case SADB_EXT_LIFETIME_HARD
:
4876 l
= PFKEY_UNUNIT64(((struct sadb_ext
*)sav
->lft_h
)->sadb_ext_len
);
4880 case SADB_EXT_LIFETIME_SOFT
:
4884 l
= PFKEY_UNUNIT64(((struct sadb_ext
*)sav
->lft_s
)->sadb_ext_len
);
4888 case SADB_EXT_ADDRESS_PROXY
:
4889 case SADB_EXT_IDENTITY_SRC
:
4890 case SADB_EXT_IDENTITY_DST
:
4891 /* XXX: should we brought from SPD ? */
4892 case SADB_EXT_SENSITIVITY
:
4897 if ((!m
&& !p
) || (m
&& p
)) {
4901 M_PREPEND(tres
, l
, M_WAITOK
, 1);
4905 bcopy(p
, mtod(tres
, caddr_t
), l
);
4909 m
= key_alloc_mbuf(l
);
4913 m_copyback(m
, 0, l
, p
);
4922 m_cat(result
, tres
);
4924 if (sav
->sah
&& (sav
->sah
->outgoing_if
|| sav
->sah
->ipsec_if
)) {
4925 m
= key_setsadbipsecif(NULL
, ifindex2ifnet
[sav
->sah
->outgoing_if
], sav
->sah
->ipsec_if
, 0);
4932 if (result
->m_len
< sizeof(struct sadb_msg
)) {
4933 result
= m_pullup(result
, sizeof(struct sadb_msg
));
4934 if (result
== NULL
) {
4939 result
->m_pkthdr
.len
= 0;
4940 for (m
= result
; m
; m
= m
->m_next
) {
4941 result
->m_pkthdr
.len
+= m
->m_len
;
4944 VERIFY(PFKEY_UNIT64(result
->m_pkthdr
.len
) <= UINT16_MAX
);
4945 mtod(result
, struct sadb_msg
*)->sadb_msg_len
=
4946 (u_int16_t
)PFKEY_UNIT64(result
->m_pkthdr
.len
);
4957 * set data into sadb_msg.
4959 static struct mbuf
*
4972 len
= PFKEY_ALIGN8(sizeof(struct sadb_msg
));
4973 if (len
> MCLBYTES
) {
4976 MGETHDR(m
, M_DONTWAIT
, MT_DATA
);
4977 if (m
&& len
> MHLEN
) {
4978 MCLGET(m
, M_DONTWAIT
);
4979 if ((m
->m_flags
& M_EXT
) == 0) {
4987 m
->m_pkthdr
.len
= m
->m_len
= len
;
4990 p
= mtod(m
, struct sadb_msg
*);
4993 p
->sadb_msg_version
= PF_KEY_V2
;
4994 p
->sadb_msg_type
= type
;
4995 p
->sadb_msg_errno
= 0;
4996 p
->sadb_msg_satype
= satype
;
4997 p
->sadb_msg_len
= PFKEY_UNIT64(tlen
);
4998 p
->sadb_msg_reserved
= reserved
;
4999 p
->sadb_msg_seq
= seq
;
5000 p
->sadb_msg_pid
= (u_int32_t
)pid
;
5006 * copy secasvar data into sadb_address.
5008 static struct mbuf
*
5010 struct secasvar
*sav
)
5016 len
= PFKEY_ALIGN8(sizeof(struct sadb_sa
));
5017 m
= key_alloc_mbuf(len
);
5018 if (!m
|| m
->m_next
) { /*XXX*/
5025 p
= mtod(m
, struct sadb_sa
*);
5028 p
->sadb_sa_len
= PFKEY_UNIT64(len
);
5029 p
->sadb_sa_exttype
= SADB_EXT_SA
;
5030 p
->sadb_sa_spi
= sav
->spi
;
5031 p
->sadb_sa_replay
= (sav
->replay
[0] != NULL
? sav
->replay
[0]->wsize
: 0);
5032 p
->sadb_sa_state
= sav
->state
;
5033 p
->sadb_sa_auth
= sav
->alg_auth
;
5034 p
->sadb_sa_encrypt
= sav
->alg_enc
;
5035 p
->sadb_sa_flags
= sav
->flags
;
5041 * set data into sadb_address.
5043 static struct mbuf
*
5046 struct sockaddr
*saddr
,
5051 struct sadb_address
*p
;
5054 len
= PFKEY_ALIGN8(sizeof(struct sadb_address
)) +
5055 PFKEY_ALIGN8(saddr
->sa_len
);
5056 m
= key_alloc_mbuf(len
);
5057 if (!m
|| m
->m_next
) { /*XXX*/
5064 p
= mtod(m
, struct sadb_address
*);
5067 p
->sadb_address_len
= PFKEY_UNIT64(len
);
5068 p
->sadb_address_exttype
= exttype
;
5069 p
->sadb_address_proto
= ul_proto
;
5070 if (prefixlen
== FULLMASK
) {
5071 switch (saddr
->sa_family
) {
5073 prefixlen
= sizeof(struct in_addr
) << 3;
5076 prefixlen
= sizeof(struct in6_addr
) << 3;
5082 if (prefixlen
>= UINT8_MAX
) {
5083 ipseclog((LOG_ERR
, "key_setsadbaddr: bad prefix length %zu", prefixlen
));
5087 p
->sadb_address_prefixlen
= (u_int8_t
)prefixlen
;
5088 p
->sadb_address_reserved
= 0;
5091 mtod(m
, caddr_t
) + PFKEY_ALIGN8(sizeof(struct sadb_address
)),
5097 static struct mbuf
*
5098 key_setsadbipsecif(ifnet_t internal_if
,
5099 ifnet_t outgoing_if
,
5101 u_int8_t init_disabled
)
5104 struct sadb_x_ipsecif
*p
;
5107 len
= PFKEY_ALIGN8(sizeof(struct sadb_x_ipsecif
));
5108 m
= key_alloc_mbuf(len
);
5109 if (!m
|| m
->m_next
) { /*XXX*/
5116 p
= mtod(m
, struct sadb_x_ipsecif
*);
5119 p
->sadb_x_ipsecif_len
= PFKEY_UNIT64(len
);
5120 p
->sadb_x_ipsecif_exttype
= SADB_X_EXT_IPSECIF
;
5122 if (internal_if
&& internal_if
->if_xname
) {
5123 strlcpy(p
->sadb_x_ipsecif_internal_if
, internal_if
->if_xname
, IFXNAMSIZ
);
5125 if (outgoing_if
&& outgoing_if
->if_xname
) {
5126 strlcpy(p
->sadb_x_ipsecif_outgoing_if
, outgoing_if
->if_xname
, IFXNAMSIZ
);
5128 if (ipsec_if
&& ipsec_if
->if_xname
) {
5129 strlcpy(p
->sadb_x_ipsecif_ipsec_if
, ipsec_if
->if_xname
, IFXNAMSIZ
);
5132 p
->sadb_x_ipsecif_init_disabled
= init_disabled
;
5138 * set data into sadb_session_id
5140 static struct mbuf
*
5141 key_setsadbsession_id(u_int64_t session_ids
[])
5144 struct sadb_session_id
*p
;
5147 len
= PFKEY_ALIGN8(sizeof(*p
));
5148 m
= key_alloc_mbuf(len
);
5149 if (!m
|| m
->m_next
) { /*XXX*/
5156 p
= mtod(m
, __typeof__(p
));
5159 p
->sadb_session_id_len
= PFKEY_UNIT64(len
);
5160 p
->sadb_session_id_exttype
= SADB_EXT_SESSION_ID
;
5161 p
->sadb_session_id_v
[0] = session_ids
[0];
5162 p
->sadb_session_id_v
[1] = session_ids
[1];
5168 * copy stats data into sadb_sastat type.
5170 static struct mbuf
*
5171 key_setsadbsastat(u_int32_t dir
,
5172 struct sastat
*stats
,
5173 u_int32_t max_stats
)
5176 struct sadb_sastat
*p
;
5177 size_t list_len
, len
;
5183 list_len
= sizeof(*stats
) * max_stats
;
5184 len
= PFKEY_ALIGN8(sizeof(*p
)) + PFKEY_ALIGN8(list_len
);
5185 if (PFKEY_UNIT64(len
) >= UINT16_MAX
) {
5186 ipseclog((LOG_ERR
, "key_setsadbsastat: length is too big: %zu\n", len
));
5190 m
= key_alloc_mbuf((int)len
);
5191 if (!m
|| m
->m_next
) { /*XXX*/
5198 p
= mtod(m
, __typeof__(p
));
5201 p
->sadb_sastat_len
= (u_int16_t
)PFKEY_UNIT64(len
);
5202 p
->sadb_sastat_exttype
= SADB_EXT_SASTAT
;
5203 p
->sadb_sastat_dir
= dir
;
5204 p
->sadb_sastat_list_len
= max_stats
;
5207 mtod(m
, caddr_t
) + PFKEY_ALIGN8(sizeof(*p
)),
5215 * set data into sadb_x_sa2.
5217 static struct mbuf
*
5225 struct sadb_x_sa2
*p
;
5228 len
= PFKEY_ALIGN8(sizeof(struct sadb_x_sa2
));
5229 m
= key_alloc_mbuf(len
);
5230 if (!m
|| m
->m_next
) { /*XXX*/
5237 p
= mtod(m
, struct sadb_x_sa2
*);
5240 p
->sadb_x_sa2_len
= PFKEY_UNIT64(len
);
5241 p
->sadb_x_sa2_exttype
= SADB_X_EXT_SA2
;
5242 p
->sadb_x_sa2_mode
= mode
;
5243 p
->sadb_x_sa2_reserved1
= 0;
5244 p
->sadb_x_sa2_reserved2
= 0;
5245 p
->sadb_x_sa2_sequence
= seq
;
5246 p
->sadb_x_sa2_reqid
= reqid
;
5247 p
->sadb_x_sa2_flags
= flags
;
5253 * set data into sadb_x_policy
5255 static struct mbuf
*
5262 struct sadb_x_policy
*p
;
5265 len
= PFKEY_ALIGN8(sizeof(struct sadb_x_policy
));
5266 m
= key_alloc_mbuf(len
);
5267 if (!m
|| m
->m_next
) { /*XXX*/
5274 p
= mtod(m
, struct sadb_x_policy
*);
5277 p
->sadb_x_policy_len
= PFKEY_UNIT64(len
);
5278 p
->sadb_x_policy_exttype
= SADB_X_EXT_POLICY
;
5279 p
->sadb_x_policy_type
= type
;
5280 p
->sadb_x_policy_dir
= dir
;
5281 p
->sadb_x_policy_id
= id
;
5288 * copy a buffer into the new buffer allocated.
5297 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_OWNED
);
5298 KMALLOC_NOWAIT(new, caddr_t
, len
);
5300 lck_mtx_unlock(sadb_mutex
);
5301 KMALLOC_WAIT(new, caddr_t
, len
);
5302 lck_mtx_lock(sadb_mutex
);
5304 ipseclog((LOG_DEBUG
, "key_newbuf: No more memory.\n"));
5308 bcopy(src
, new, len
);
5313 /* compare my own address
5314 * OUT: 1: true, i.e. my address.
5319 struct sockaddr
*sa
)
5322 struct sockaddr_in
*sin
;
5323 struct in_ifaddr
*ia
;
5328 panic("key_ismyaddr: NULL pointer is passed.\n");
5331 switch (sa
->sa_family
) {
5334 lck_rw_lock_shared(in_ifaddr_rwlock
);
5335 sin
= (struct sockaddr_in
*)(void *)sa
;
5336 for (ia
= in_ifaddrhead
.tqh_first
; ia
;
5337 ia
= ia
->ia_link
.tqe_next
) {
5338 IFA_LOCK_SPIN(&ia
->ia_ifa
);
5339 if (sin
->sin_family
== ia
->ia_addr
.sin_family
&&
5340 sin
->sin_len
== ia
->ia_addr
.sin_len
&&
5341 sin
->sin_addr
.s_addr
== ia
->ia_addr
.sin_addr
.s_addr
) {
5342 IFA_UNLOCK(&ia
->ia_ifa
);
5343 lck_rw_done(in_ifaddr_rwlock
);
5346 IFA_UNLOCK(&ia
->ia_ifa
);
5348 lck_rw_done(in_ifaddr_rwlock
);
5352 return key_ismyaddr6((struct sockaddr_in6
*)(void *)sa
);
5359 * compare my own address for IPv6.
5362 * NOTE: derived ip6_input() in KAME. This is necessary to modify more.
5364 #include <netinet6/in6_var.h>
5368 struct sockaddr_in6
*sin6
)
5370 struct in6_ifaddr
*ia
;
5371 struct in6_multi
*in6m
;
5373 lck_rw_lock_shared(&in6_ifaddr_rwlock
);
5374 TAILQ_FOREACH(ia
, &in6_ifaddrhead
, ia6_link
) {
5375 IFA_LOCK(&ia
->ia_ifa
);
5376 if (key_sockaddrcmp((struct sockaddr
*)&sin6
,
5377 (struct sockaddr
*)&ia
->ia_addr
, 0) == 0) {
5378 IFA_UNLOCK(&ia
->ia_ifa
);
5379 lck_rw_done(&in6_ifaddr_rwlock
);
5382 IFA_UNLOCK(&ia
->ia_ifa
);
5386 * XXX why do we care about multlicast here while we don't care
5387 * about IPv4 multicast??
5391 in6_multihead_lock_shared();
5392 IN6_LOOKUP_MULTI(&sin6
->sin6_addr
, ia
->ia_ifp
, in6m
);
5393 in6_multihead_lock_done();
5395 lck_rw_done(&in6_ifaddr_rwlock
);
5400 lck_rw_done(&in6_ifaddr_rwlock
);
5402 /* loopback, just for safety */
5403 if (IN6_IS_ADDR_LOOPBACK(&sin6
->sin6_addr
)) {
5411 * compare two secasindex structure.
5412 * flag can specify to compare 2 saidxes.
5413 * compare two secasindex structure without both mode and reqid.
5414 * don't compare port.
5416 * saidx0: source, it can be in SAD.
5424 struct secasindex
*saidx0
,
5425 struct secasindex
*saidx1
,
5429 if (saidx0
== NULL
&& saidx1
== NULL
) {
5433 if (saidx0
== NULL
|| saidx1
== NULL
) {
5437 if (saidx0
->ipsec_ifindex
!= 0 && saidx0
->ipsec_ifindex
!= saidx1
->ipsec_ifindex
) {
5441 if (saidx0
->proto
!= saidx1
->proto
) {
5445 if (flag
== CMP_EXACTLY
) {
5446 if (saidx0
->mode
!= saidx1
->mode
) {
5449 if (saidx0
->reqid
!= saidx1
->reqid
) {
5452 if (bcmp(&saidx0
->src
, &saidx1
->src
, saidx0
->src
.ss_len
) != 0 ||
5453 bcmp(&saidx0
->dst
, &saidx1
->dst
, saidx0
->dst
.ss_len
) != 0) {
5457 /* CMP_MODE_REQID, CMP_REQID, CMP_HEAD */
5458 if (flag
& CMP_REQID
) {
5460 * If reqid of SPD is non-zero, unique SA is required.
5461 * The result must be of same reqid in this case.
5463 if (saidx1
->reqid
!= 0 && saidx0
->reqid
!= saidx1
->reqid
) {
5468 if (flag
& CMP_MODE
) {
5469 if (saidx0
->mode
!= IPSEC_MODE_ANY
5470 && saidx0
->mode
!= saidx1
->mode
) {
5475 if (key_sockaddrcmp((struct sockaddr
*)&saidx0
->src
,
5476 (struct sockaddr
*)&saidx1
->src
, flag
& CMP_PORT
? 1 : 0) != 0) {
5479 if (key_sockaddrcmp((struct sockaddr
*)&saidx0
->dst
,
5480 (struct sockaddr
*)&saidx1
->dst
, flag
& CMP_PORT
? 1 : 0) != 0) {
5489 * compare two secindex structure exactly.
5491 * spidx0: source, it is often in SPD.
5492 * spidx1: object, it is often from PFKEY message.
5498 key_cmpspidx_exactly(
5499 struct secpolicyindex
*spidx0
,
5500 struct secpolicyindex
*spidx1
)
5503 if (spidx0
== NULL
&& spidx1
== NULL
) {
5507 if (spidx0
== NULL
|| spidx1
== NULL
) {
5511 if (spidx0
->prefs
!= spidx1
->prefs
5512 || spidx0
->prefd
!= spidx1
->prefd
5513 || spidx0
->ul_proto
!= spidx1
->ul_proto
5514 || spidx0
->internal_if
!= spidx1
->internal_if
) {
5518 if (key_sockaddrcmp((struct sockaddr
*)&spidx0
->src
,
5519 (struct sockaddr
*)&spidx1
->src
, 1) != 0) {
5522 if (key_sockaddrcmp((struct sockaddr
*)&spidx0
->dst
,
5523 (struct sockaddr
*)&spidx1
->dst
, 1) != 0) {
5527 if (key_sockaddrcmp((struct sockaddr
*)&spidx0
->src_range
.start
,
5528 (struct sockaddr
*)&spidx1
->src_range
.start
, 1) != 0) {
5531 if (key_sockaddrcmp((struct sockaddr
*)&spidx0
->src_range
.end
,
5532 (struct sockaddr
*)&spidx1
->src_range
.end
, 1) != 0) {
5535 if (key_sockaddrcmp((struct sockaddr
*)&spidx0
->dst_range
.start
,
5536 (struct sockaddr
*)&spidx1
->dst_range
.start
, 1) != 0) {
5539 if (key_sockaddrcmp((struct sockaddr
*)&spidx0
->dst_range
.end
,
5540 (struct sockaddr
*)&spidx1
->dst_range
.end
, 1) != 0) {
5548 * compare two secindex structure with mask.
5550 * spidx0: source, it is often in SPD.
5551 * spidx1: object, it is often from IP header.
5557 key_cmpspidx_withmask(
5558 struct secpolicyindex
*spidx0
,
5559 struct secpolicyindex
*spidx1
)
5561 int spidx0_src_is_range
= 0;
5562 int spidx0_dst_is_range
= 0;
5565 if (spidx0
== NULL
&& spidx1
== NULL
) {
5569 if (spidx0
== NULL
|| spidx1
== NULL
) {
5573 if (spidx0
->src_range
.start
.ss_len
> 0) {
5574 spidx0_src_is_range
= 1;
5577 if (spidx0
->dst_range
.start
.ss_len
> 0) {
5578 spidx0_dst_is_range
= 1;
5581 if ((spidx0_src_is_range
? spidx0
->src_range
.start
.ss_family
: spidx0
->src
.ss_family
) != spidx1
->src
.ss_family
||
5582 (spidx0_dst_is_range
? spidx0
->dst_range
.start
.ss_family
: spidx0
->dst
.ss_family
) != spidx1
->dst
.ss_family
||
5583 (spidx0_src_is_range
? spidx0
->src_range
.start
.ss_len
: spidx0
->src
.ss_len
) != spidx1
->src
.ss_len
||
5584 (spidx0_dst_is_range
? spidx0
->dst_range
.start
.ss_len
: spidx0
->dst
.ss_len
) != spidx1
->dst
.ss_len
) {
5588 /* if spidx.ul_proto == IPSEC_ULPROTO_ANY, ignore. */
5589 if (spidx0
->ul_proto
!= (u_int16_t
)IPSEC_ULPROTO_ANY
5590 && spidx0
->ul_proto
!= spidx1
->ul_proto
) {
5594 /* If spidx1 specifies interface, ignore src addr */
5595 if (spidx1
->internal_if
!= NULL
) {
5596 if (spidx0
->internal_if
== NULL
5597 || spidx0
->internal_if
!= spidx1
->internal_if
) {
5601 /* Still check ports */
5602 switch (spidx0
->src
.ss_family
) {
5604 if (spidx0_src_is_range
&&
5605 (satosin(&spidx1
->src
)->sin_port
< satosin(&spidx0
->src_range
.start
)->sin_port
5606 || satosin(&spidx1
->src
)->sin_port
> satosin(&spidx0
->src_range
.end
)->sin_port
)) {
5608 } else if (satosin(&spidx0
->src
)->sin_port
!= IPSEC_PORT_ANY
5609 && satosin(&spidx0
->src
)->sin_port
!=
5610 satosin(&spidx1
->src
)->sin_port
) {
5615 if (spidx0_src_is_range
&&
5616 (satosin6(&spidx1
->src
)->sin6_port
< satosin6(&spidx0
->src_range
.start
)->sin6_port
5617 || satosin6(&spidx1
->src
)->sin6_port
> satosin6(&spidx0
->src_range
.end
)->sin6_port
)) {
5619 } else if (satosin6(&spidx0
->src
)->sin6_port
!= IPSEC_PORT_ANY
5620 && satosin6(&spidx0
->src
)->sin6_port
!=
5621 satosin6(&spidx1
->src
)->sin6_port
) {
5628 } else if (spidx0_src_is_range
) {
5629 if (!key_is_addr_in_range(&spidx1
->src
, &spidx0
->src_range
)) {
5633 switch (spidx0
->src
.ss_family
) {
5635 if (satosin(&spidx0
->src
)->sin_port
!= IPSEC_PORT_ANY
5636 && satosin(&spidx0
->src
)->sin_port
!=
5637 satosin(&spidx1
->src
)->sin_port
) {
5640 if (!key_bbcmp((caddr_t
)&satosin(&spidx0
->src
)->sin_addr
,
5641 (caddr_t
)&satosin(&spidx1
->src
)->sin_addr
, spidx0
->prefs
)) {
5646 if (satosin6(&spidx0
->src
)->sin6_port
!= IPSEC_PORT_ANY
5647 && satosin6(&spidx0
->src
)->sin6_port
!=
5648 satosin6(&spidx1
->src
)->sin6_port
) {
5652 * scope_id check. if sin6_scope_id is 0, we regard it
5653 * as a wildcard scope, which matches any scope zone ID.
5655 if (satosin6(&spidx0
->src
)->sin6_scope_id
&&
5656 satosin6(&spidx1
->src
)->sin6_scope_id
&&
5657 satosin6(&spidx0
->src
)->sin6_scope_id
!=
5658 satosin6(&spidx1
->src
)->sin6_scope_id
) {
5661 if (!key_bbcmp((caddr_t
)&satosin6(&spidx0
->src
)->sin6_addr
,
5662 (caddr_t
)&satosin6(&spidx1
->src
)->sin6_addr
, spidx0
->prefs
)) {
5668 if (bcmp(&spidx0
->src
, &spidx1
->src
, spidx0
->src
.ss_len
) != 0) {
5675 if (spidx0_dst_is_range
) {
5676 if (!key_is_addr_in_range(&spidx1
->dst
, &spidx0
->dst_range
)) {
5680 switch (spidx0
->dst
.ss_family
) {
5682 if (satosin(&spidx0
->dst
)->sin_port
!= IPSEC_PORT_ANY
5683 && satosin(&spidx0
->dst
)->sin_port
!=
5684 satosin(&spidx1
->dst
)->sin_port
) {
5687 if (!key_bbcmp((caddr_t
)&satosin(&spidx0
->dst
)->sin_addr
,
5688 (caddr_t
)&satosin(&spidx1
->dst
)->sin_addr
, spidx0
->prefd
)) {
5693 if (satosin6(&spidx0
->dst
)->sin6_port
!= IPSEC_PORT_ANY
5694 && satosin6(&spidx0
->dst
)->sin6_port
!=
5695 satosin6(&spidx1
->dst
)->sin6_port
) {
5699 * scope_id check. if sin6_scope_id is 0, we regard it
5700 * as a wildcard scope, which matches any scope zone ID.
5702 if (satosin6(&spidx0
->src
)->sin6_scope_id
&&
5703 satosin6(&spidx1
->src
)->sin6_scope_id
&&
5704 satosin6(&spidx0
->dst
)->sin6_scope_id
!=
5705 satosin6(&spidx1
->dst
)->sin6_scope_id
) {
5708 if (!key_bbcmp((caddr_t
)&satosin6(&spidx0
->dst
)->sin6_addr
,
5709 (caddr_t
)&satosin6(&spidx1
->dst
)->sin6_addr
, spidx0
->prefd
)) {
5715 if (bcmp(&spidx0
->dst
, &spidx1
->dst
, spidx0
->dst
.ss_len
) != 0) {
5722 /* XXX Do we check other field ? e.g. flowinfo */
5728 key_is_addr_in_range(struct sockaddr_storage
*addr
, struct secpolicyaddrrange
*addr_range
)
5732 if (addr
== NULL
|| addr_range
== NULL
) {
5736 /* Must be greater than or equal to start */
5737 cmp
= key_sockaddrcmp((struct sockaddr
*)addr
, (struct sockaddr
*)&addr_range
->start
, 1);
5738 if (cmp
!= 0 && cmp
!= 1) {
5742 /* Must be less than or equal to end */
5743 cmp
= key_sockaddrcmp((struct sockaddr
*)addr
, (struct sockaddr
*)&addr_range
->end
, 1);
5744 if (cmp
!= 0 && cmp
!= -1) {
5756 * 2: Not comparable or error
5760 struct sockaddr
*sa1
,
5761 struct sockaddr
*sa2
,
5765 int port_result
= 0;
5767 if (sa1
->sa_family
!= sa2
->sa_family
|| sa1
->sa_len
!= sa2
->sa_len
) {
5771 if (sa1
->sa_len
== 0) {
5775 switch (sa1
->sa_family
) {
5777 if (sa1
->sa_len
!= sizeof(struct sockaddr_in
)) {
5781 result
= memcmp(&satosin(sa1
)->sin_addr
.s_addr
, &satosin(sa2
)->sin_addr
.s_addr
, sizeof(satosin(sa1
)->sin_addr
.s_addr
));
5784 if (satosin(sa1
)->sin_port
< satosin(sa2
)->sin_port
) {
5786 } else if (satosin(sa1
)->sin_port
> satosin(sa2
)->sin_port
) {
5791 result
= port_result
;
5792 } else if ((result
> 0 && port_result
< 0) || (result
< 0 && port_result
> 0)) {
5799 if (sa1
->sa_len
!= sizeof(struct sockaddr_in6
)) {
5800 return 2; /*EINVAL*/
5802 if (satosin6(sa1
)->sin6_scope_id
!=
5803 satosin6(sa2
)->sin6_scope_id
) {
5807 result
= memcmp(&satosin6(sa1
)->sin6_addr
.s6_addr
[0], &satosin6(sa2
)->sin6_addr
.s6_addr
[0], sizeof(struct in6_addr
));
5810 if (satosin6(sa1
)->sin6_port
< satosin6(sa2
)->sin6_port
) {
5812 } else if (satosin6(sa1
)->sin6_port
> satosin6(sa2
)->sin6_port
) {
5817 result
= port_result
;
5818 } else if ((result
> 0 && port_result
< 0) || (result
< 0 && port_result
> 0)) {
5825 result
= memcmp(sa1
, sa2
, sa1
->sa_len
);
5831 } else if (result
> 0) {
5839 * compare two buffers with mask.
5843 * bits: Number of bits to compare
5856 /* XXX: This could be considerably faster if we compare a word
5857 * at a time, but it is complicated on LSB Endian machines */
5859 /* Handle null pointers */
5860 if (p1
== NULL
|| p2
== NULL
) {
5865 if (*p1
++ != *p2
++) {
5872 mask
= (u_int8_t
)(~((1 << (8 - bits
)) - 1));
5873 if ((*p1
& mask
) != (*p2
& mask
)) {
5877 return 1; /* Match! */
5882 * scanning SPD and SAD to check status for each entries,
5883 * and do to remove or to expire.
5884 * XXX: year 2038 problem may remain.
5886 int key_timehandler_debug
= 0;
5887 u_int32_t spd_count
= 0, sah_count
= 0, dead_sah_count
= 0, empty_sah_count
= 0, larval_sav_count
= 0, mature_sav_count
= 0, dying_sav_count
= 0, dead_sav_count
= 0;
5888 u_int64_t total_sav_count
= 0;
5890 key_timehandler(void)
5894 struct secpolicy
**spbuf
= NULL
, **spptr
= NULL
;
5895 struct secasvar
**savexbuf
= NULL
, **savexptr
= NULL
;
5896 struct secasvar
**savkabuf
= NULL
, **savkaptr
= NULL
;
5897 size_t total_req_size
= 0;
5898 u_int32_t spbufcount
= 0, savbufcount
= 0, spcount
= 0, savexcount
= 0, savkacount
= 0, cnt
;
5899 int stop_handler
= 1; /* stop the timehandler */
5903 /* pre-allocate buffers before taking the lock */
5904 /* if allocation failures occur - portions of the processing will be skipped */
5905 if ((spbufcount
= ipsec_policy_count
) != 0) {
5906 if (os_add_overflow(spbufcount
, 256, &spbufcount
)) {
5907 ipseclog((LOG_DEBUG
, "key_timehandler: spbufcount overflow, ipsec policy count %u.\n", ipsec_policy_count
));
5908 spbufcount
= ipsec_policy_count
;
5911 if (os_mul_overflow(spbufcount
, sizeof(struct secpolicy
*), &total_req_size
)) {
5912 panic("key_timehandler spbuf requested memory overflow %u\n", spbufcount
);
5914 KMALLOC_WAIT(spbuf
, struct secpolicy
**, total_req_size
);
5919 if ((savbufcount
= ipsec_sav_count
) != 0) {
5920 if (os_add_overflow(savbufcount
, 512, &savbufcount
)) {
5921 ipseclog((LOG_DEBUG
, "key_timehandler: savbufcount overflow, ipsec sa count %u.\n", ipsec_sav_count
));
5922 savbufcount
= ipsec_sav_count
;
5924 if (os_mul_overflow(savbufcount
, sizeof(struct secasvar
*), &total_req_size
)) {
5925 panic("key_timehandler savexbuf requested memory overflow %u\n", savbufcount
);
5927 KMALLOC_WAIT(savexbuf
, struct secasvar
**, total_req_size
);
5929 savexptr
= savexbuf
;
5931 KMALLOC_WAIT(savkabuf
, struct secasvar
**, total_req_size
);
5933 savkaptr
= savkabuf
;
5936 lck_mtx_lock(sadb_mutex
);
5939 struct secpolicy
*sp
, *nextsp
;
5941 for (dir
= 0; dir
< IPSEC_DIR_MAX
; dir
++) {
5942 for (sp
= LIST_FIRST(&sptree
[dir
]);
5945 /* don't prevent timehandler from stopping for generate policy */
5946 if (sp
->policy
!= IPSEC_POLICY_GENERATE
) {
5950 nextsp
= LIST_NEXT(sp
, chain
);
5952 if (sp
->state
== IPSEC_SPSTATE_DEAD
) {
5953 key_freesp(sp
, KEY_SADB_LOCKED
);
5957 if (sp
->lifetime
== 0 && sp
->validtime
== 0) {
5960 if (spbuf
&& spcount
< spbufcount
) {
5961 /* the deletion will occur next time */
5963 && tv
.tv_sec
- sp
->created
> sp
->lifetime
)
5965 && tv
.tv_sec
- sp
->lastused
> sp
->validtime
)) {
5966 //key_spdexpire(sp);
5967 sp
->state
= IPSEC_SPSTATE_DEAD
;
5979 struct secashead
*sah
, *nextsah
;
5980 struct secasvar
*sav
, *nextsav
;
5982 for (sah
= LIST_FIRST(&sahtree
);
5986 nextsah
= LIST_NEXT(sah
, chain
);
5988 /* if sah has been dead, then delete it and process next sah. */
5989 if (sah
->state
== SADB_SASTATE_DEAD
) {
5995 if (LIST_FIRST(&sah
->savtree
[SADB_SASTATE_LARVAL
]) == NULL
&&
5996 LIST_FIRST(&sah
->savtree
[SADB_SASTATE_MATURE
]) == NULL
&&
5997 LIST_FIRST(&sah
->savtree
[SADB_SASTATE_DYING
]) == NULL
&&
5998 LIST_FIRST(&sah
->savtree
[SADB_SASTATE_DEAD
]) == NULL
) {
6004 if (savbufcount
== 0) {
6010 /* if LARVAL entry doesn't become MATURE, delete it. */
6011 for (sav
= LIST_FIRST(&sah
->savtree
[SADB_SASTATE_LARVAL
]);
6016 nextsav
= LIST_NEXT(sav
, chain
);
6018 if (sav
->lft_h
!= NULL
) {
6019 /* If a hard lifetime is defined for the LARVAL SA, use it */
6020 if (sav
->lft_h
->sadb_lifetime_addtime
!= 0
6021 && tv
.tv_sec
- sav
->created
> sav
->lft_h
->sadb_lifetime_addtime
) {
6022 if (sav
->always_expire
) {
6023 key_send_delete(sav
);
6026 key_sa_chgstate(sav
, SADB_SASTATE_DEAD
);
6027 key_freesav(sav
, KEY_SADB_LOCKED
);
6032 if (tv
.tv_sec
- sav
->created
> key_larval_lifetime
) {
6033 key_freesav(sav
, KEY_SADB_LOCKED
);
6039 * If this is a NAT traversal SA with no activity,
6040 * we need to send a keep alive.
6042 * Performed outside of the loop before so we will
6043 * only ever send one keepalive. The first SA on
6044 * the list is the one that will be used for sending
6045 * traffic, so this is the one we use for determining
6046 * when to send the keepalive.
6048 if (savkabuf
&& savkacount
< savbufcount
) {
6049 sav
= LIST_FIRST(&sah
->savtree
[SADB_SASTATE_MATURE
]); //%%% should we check dying list if this is empty???
6050 if (sav
&& (natt_keepalive_interval
|| sav
->natt_interval
) &&
6051 (sav
->flags
& (SADB_X_EXT_NATT_KEEPALIVE
| SADB_X_EXT_ESP_KEEPALIVE
)) != 0) {
6059 * check MATURE entry to start to send expire message
6062 for (sav
= LIST_FIRST(&sah
->savtree
[SADB_SASTATE_MATURE
]);
6067 nextsav
= LIST_NEXT(sav
, chain
);
6069 /* we don't need to check. */
6070 if (sav
->lft_s
== NULL
) {
6075 if (sav
->lft_c
== NULL
) {
6076 ipseclog((LOG_DEBUG
, "key_timehandler: "
6077 "There is no CURRENT time, why?\n"));
6081 /* check SOFT lifetime */
6082 if (sav
->lft_s
->sadb_lifetime_addtime
!= 0
6083 && tv
.tv_sec
- sav
->created
> sav
->lft_s
->sadb_lifetime_addtime
) {
6085 * If always_expire is set, expire. Otherwise,
6086 * if the SA has not been used, delete immediately.
6088 if (sav
->lft_c
->sadb_lifetime_usetime
== 0
6089 && sav
->always_expire
== 0) {
6090 key_sa_chgstate(sav
, SADB_SASTATE_DEAD
);
6091 key_freesav(sav
, KEY_SADB_LOCKED
);
6093 } else if (savexbuf
&& savexcount
< savbufcount
) {
6094 key_sa_chgstate(sav
, SADB_SASTATE_DYING
);
6100 /* check SOFT lifetime by bytes */
6102 * XXX I don't know the way to delete this SA
6103 * when new SA is installed. Caution when it's
6104 * installed too big lifetime by time.
6106 else if (savexbuf
&& savexcount
< savbufcount
6107 && sav
->lft_s
->sadb_lifetime_bytes
!= 0
6108 && sav
->lft_s
->sadb_lifetime_bytes
< sav
->lft_c
->sadb_lifetime_bytes
) {
6110 * XXX If we keep to send expire
6111 * message in the status of
6112 * DYING. Do remove below code.
6115 key_sa_chgstate(sav
, SADB_SASTATE_DYING
);
6122 /* check DYING entry to change status to DEAD. */
6123 for (sav
= LIST_FIRST(&sah
->savtree
[SADB_SASTATE_DYING
]);
6128 nextsav
= LIST_NEXT(sav
, chain
);
6130 /* we don't need to check. */
6131 if (sav
->lft_h
== NULL
) {
6136 if (sav
->lft_c
== NULL
) {
6137 ipseclog((LOG_DEBUG
, "key_timehandler: "
6138 "There is no CURRENT time, why?\n"));
6142 if (sav
->lft_h
->sadb_lifetime_addtime
!= 0
6143 && tv
.tv_sec
- sav
->created
> sav
->lft_h
->sadb_lifetime_addtime
) {
6144 if (sav
->always_expire
) {
6145 key_send_delete(sav
);
6148 key_sa_chgstate(sav
, SADB_SASTATE_DEAD
);
6149 key_freesav(sav
, KEY_SADB_LOCKED
);
6153 /* check HARD lifetime by bytes */
6154 else if (sav
->lft_h
->sadb_lifetime_bytes
!= 0
6155 && sav
->lft_h
->sadb_lifetime_bytes
< sav
->lft_c
->sadb_lifetime_bytes
) {
6156 key_sa_chgstate(sav
, SADB_SASTATE_DEAD
);
6157 key_freesav(sav
, KEY_SADB_LOCKED
);
6162 /* delete entry in DEAD */
6163 for (sav
= LIST_FIRST(&sah
->savtree
[SADB_SASTATE_DEAD
]);
6168 nextsav
= LIST_NEXT(sav
, chain
);
6171 if (sav
->state
!= SADB_SASTATE_DEAD
) {
6172 ipseclog((LOG_DEBUG
, "key_timehandler: "
6173 "invalid sav->state "
6174 "(queue: %d SA: %d): "
6176 SADB_SASTATE_DEAD
, sav
->state
));
6180 * do not call key_freesav() here.
6181 * sav should already be freed, and sav->refcnt
6182 * shows other references to sav
6183 * (such as from SPD).
6189 if (++key_timehandler_debug
>= 300) {
6190 if (key_debug_level
) {
6191 printf("%s: total stats for %u calls\n", __FUNCTION__
, key_timehandler_debug
);
6192 printf("%s: walked %u SPDs\n", __FUNCTION__
, spd_count
);
6193 printf("%s: walked %llu SAs: LARVAL SAs %u, MATURE SAs %u, DYING SAs %u, DEAD SAs %u\n", __FUNCTION__
,
6194 total_sav_count
, larval_sav_count
, mature_sav_count
, dying_sav_count
, dead_sav_count
);
6195 printf("%s: walked %u SAHs: DEAD SAHs %u, EMPTY SAHs %u\n", __FUNCTION__
,
6196 sah_count
, dead_sah_count
, empty_sah_count
);
6197 if (sah_search_calls
) {
6198 printf("%s: SAH search cost %d iters per call\n", __FUNCTION__
,
6199 (sah_search_count
/ sah_search_calls
));
6205 empty_sah_count
= 0;
6206 larval_sav_count
= 0;
6207 mature_sav_count
= 0;
6208 dying_sav_count
= 0;
6210 total_sav_count
= 0;
6211 sah_search_count
= 0;
6212 sah_search_calls
= 0;
6213 key_timehandler_debug
= 0;
6215 #ifndef IPSEC_NONBLOCK_ACQUIRE
6218 struct secacq
*acq
, *nextacq
;
6220 for (acq
= LIST_FIRST(&acqtree
);
6224 nextacq
= LIST_NEXT(acq
, chain
);
6226 if (tv
.tv_sec
- acq
->created
> key_blockacq_lifetime
6227 && __LIST_CHAINED(acq
)) {
6228 LIST_REMOVE(acq
, chain
);
6237 struct secspacq
*acq
, *nextacq
;
6239 for (acq
= LIST_FIRST(&spacqtree
);
6243 nextacq
= LIST_NEXT(acq
, chain
);
6245 if (tv
.tv_sec
- acq
->created
> key_blockacq_lifetime
6246 && __LIST_CHAINED(acq
)) {
6247 LIST_REMOVE(acq
, chain
);
6253 /* initialize random seed */
6254 if (key_tick_init_random
++ > key_int_random
) {
6255 key_tick_init_random
= 0;
6259 uint64_t acc_sleep_time
= 0;
6260 absolutetime_to_nanoseconds(mach_absolutetime_asleep
, &acc_sleep_time
);
6261 natt_now
= ++up_time
+ (acc_sleep_time
/ NSEC_PER_SEC
);
6263 lck_mtx_unlock(sadb_mutex
);
6265 /* send messages outside of sadb_mutex */
6266 if (spbuf
&& spcount
> 0) {
6269 key_spdexpire(*(--spptr
));
6272 if (savkabuf
&& savkacount
> 0) {
6273 struct secasvar
**savkaptr_sav
= savkaptr
;
6274 u_int32_t cnt_send
= savkacount
;
6276 while (cnt_send
--) {
6277 if (ipsec_send_natt_keepalive(*(--savkaptr
))) {
6278 // <rdar://6768487> iterate (all over again) and update timestamps
6279 struct secasvar
**savkaptr_update
= savkaptr_sav
;
6280 u_int32_t cnt_update
= savkacount
;
6281 while (cnt_update
--) {
6282 key_update_natt_keepalive_timestamp(*savkaptr
,
6283 *(--savkaptr_update
));
6288 if (savexbuf
&& savexcount
> 0) {
6291 key_expire(*(--savexptr
));
6295 /* decrement ref counts and free buffers */
6296 lck_mtx_lock(sadb_mutex
);
6299 key_freesp(*spptr
++, KEY_SADB_LOCKED
);
6304 while (savkacount
--) {
6305 key_freesav(*savkaptr
++, KEY_SADB_LOCKED
);
6310 while (savexcount
--) {
6311 key_freesav(*savexptr
++, KEY_SADB_LOCKED
);
6317 key_timehandler_running
= 0;
6318 /* Turn on the ipsec bypass */
6321 /* do exchange to tick time !! */
6322 (void)timeout((void *)key_timehandler
, (void *)0, hz
);
6325 lck_mtx_unlock(sadb_mutex
);
6330 * to initialize a seed for random()
6336 /* Our PRNG is based on Yarrow and doesn't need to be seeded */
6343 srandom(tv
.tv_usec
);
6354 key_randomfill(&value
, sizeof(value
));
6364 cc_rand_generate(p
, l
);
6368 static int warn
= 1;
6371 n
= (size_t)read_random(p
, (u_int
)l
);
6375 bcopy(&v
, (u_int8_t
*)p
+ n
,
6376 l
- n
< sizeof(v
) ? l
- n
: sizeof(v
));
6380 printf("WARNING: pseudo-random number generator "
6381 "used for IPsec processing\n");
6389 * map SADB_SATYPE_* to IPPROTO_*.
6390 * if satype == SADB_SATYPE then satype is mapped to ~0.
6392 * 0: invalid satype.
6399 case SADB_SATYPE_UNSPEC
:
6400 return IPSEC_PROTO_ANY
;
6401 case SADB_SATYPE_AH
:
6403 case SADB_SATYPE_ESP
:
6412 * map IPPROTO_* to SADB_SATYPE_*
6414 * 0: invalid protocol type.
6422 return SADB_SATYPE_AH
;
6424 return SADB_SATYPE_ESP
;
6432 key_get_ipsec_if_from_message(const struct sadb_msghdr
*mhp
, int message_type
)
6434 struct sadb_x_ipsecif
*ipsecifopts
= NULL
;
6435 ifnet_t ipsec_if
= NULL
;
6437 ipsecifopts
= (struct sadb_x_ipsecif
*)(void *)mhp
->ext
[message_type
];
6438 if (ipsecifopts
!= NULL
) {
6439 if (ipsecifopts
->sadb_x_ipsecif_ipsec_if
[0]) {
6440 ipsecifopts
->sadb_x_ipsecif_ipsec_if
[IFXNAMSIZ
- 1] = '\0';
6441 ifnet_find_by_name(ipsecifopts
->sadb_x_ipsecif_ipsec_if
, &ipsec_if
);
6449 key_get_outgoing_ifindex_from_message(const struct sadb_msghdr
*mhp
, int message_type
)
6451 struct sadb_x_ipsecif
*ipsecifopts
= NULL
;
6452 ifnet_t outgoing_if
= NULL
;
6454 ipsecifopts
= (struct sadb_x_ipsecif
*)(void *)mhp
->ext
[message_type
];
6455 if (ipsecifopts
!= NULL
) {
6456 if (ipsecifopts
->sadb_x_ipsecif_outgoing_if
[0]) {
6457 ipsecifopts
->sadb_x_ipsecif_outgoing_if
[IFXNAMSIZ
- 1] = '\0';
6458 ifnet_find_by_name(ipsecifopts
->sadb_x_ipsecif_outgoing_if
, &outgoing_if
);
6462 u_int outgoing_if_index
= 0;
6463 if (outgoing_if
!= NULL
) {
6464 outgoing_if_index
= outgoing_if
->if_index
;
6465 ifnet_release(outgoing_if
);
6468 return outgoing_if_index
;
6473 * SADB_GETSPI processing is to receive
6474 * <base, (SA2), src address, dst address, (SPI range)>
6475 * from the IKMPd, to assign a unique spi value, to hang on the INBOUND
6476 * tree with the status of LARVAL, and send
6477 * <base, SA(*), address(SD)>
6480 * IN: mhp: pointer to the pointer to each header.
6481 * OUT: NULL if fail.
6482 * other if success, return pointer to the message to send.
6488 const struct sadb_msghdr
*mhp
)
6490 struct sadb_address
*src0
, *dst0
;
6491 struct secasindex saidx
;
6492 struct secashead
*newsah
;
6493 struct secasvar
*newsav
;
6494 ifnet_t ipsec_if
= NULL
;
6501 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_NOTOWNED
);
6504 if (so
== NULL
|| m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
) {
6505 panic("key_getspi: NULL pointer is passed.\n");
6508 if (mhp
->ext
[SADB_EXT_ADDRESS_SRC
] == NULL
||
6509 mhp
->ext
[SADB_EXT_ADDRESS_DST
] == NULL
) {
6510 ipseclog((LOG_DEBUG
, "key_getspi: invalid message is passed.\n"));
6511 return key_senderror(so
, m
, EINVAL
);
6513 if (mhp
->extlen
[SADB_EXT_ADDRESS_SRC
] < sizeof(struct sadb_address
) ||
6514 mhp
->extlen
[SADB_EXT_ADDRESS_DST
] < sizeof(struct sadb_address
)) {
6515 ipseclog((LOG_DEBUG
, "key_getspi: invalid message is passed.\n"));
6516 return key_senderror(so
, m
, EINVAL
);
6518 if (mhp
->ext
[SADB_X_EXT_SA2
] != NULL
) {
6519 mode
= ((struct sadb_x_sa2
*)
6520 (void *)mhp
->ext
[SADB_X_EXT_SA2
])->sadb_x_sa2_mode
;
6521 reqid
= ((struct sadb_x_sa2
*)
6522 (void *)mhp
->ext
[SADB_X_EXT_SA2
])->sadb_x_sa2_reqid
;
6524 mode
= IPSEC_MODE_ANY
;
6528 src0
= (struct sadb_address
*)(mhp
->ext
[SADB_EXT_ADDRESS_SRC
]);
6529 dst0
= (struct sadb_address
*)(mhp
->ext
[SADB_EXT_ADDRESS_DST
]);
6531 /* map satype to proto */
6532 if ((proto
= key_satype2proto(mhp
->msg
->sadb_msg_satype
)) == 0) {
6533 ipseclog((LOG_DEBUG
, "key_getspi: invalid satype is passed.\n"));
6534 return key_senderror(so
, m
, EINVAL
);
6537 /* make sure if port number is zero. */
6538 switch (((struct sockaddr
*)(src0
+ 1))->sa_family
) {
6540 if (((struct sockaddr
*)(src0
+ 1))->sa_len
!=
6541 sizeof(struct sockaddr_in
)) {
6542 return key_senderror(so
, m
, EINVAL
);
6544 ((struct sockaddr_in
*)(void *)(src0
+ 1))->sin_port
= 0;
6547 if (((struct sockaddr
*)(src0
+ 1))->sa_len
!=
6548 sizeof(struct sockaddr_in6
)) {
6549 return key_senderror(so
, m
, EINVAL
);
6551 ((struct sockaddr_in6
*)(void *)(src0
+ 1))->sin6_port
= 0;
6556 switch (((struct sockaddr
*)(dst0
+ 1))->sa_family
) {
6558 if (((struct sockaddr
*)(dst0
+ 1))->sa_len
!=
6559 sizeof(struct sockaddr_in
)) {
6560 return key_senderror(so
, m
, EINVAL
);
6562 ((struct sockaddr_in
*)(void *)(dst0
+ 1))->sin_port
= 0;
6565 if (((struct sockaddr
*)(dst0
+ 1))->sa_len
!=
6566 sizeof(struct sockaddr_in6
)) {
6567 return key_senderror(so
, m
, EINVAL
);
6569 ((struct sockaddr_in6
*)(void *)(dst0
+ 1))->sin6_port
= 0;
6575 ipsec_if
= key_get_ipsec_if_from_message(mhp
, SADB_X_EXT_IPSECIF
);
6577 /* XXX boundary check against sa_len */
6578 KEY_SETSECASIDX(proto
, mode
, reqid
, src0
+ 1, dst0
+ 1, ipsec_if
? ipsec_if
->if_index
: 0, &saidx
);
6580 lck_mtx_lock(sadb_mutex
);
6582 /* SPI allocation */
6583 spi
= key_do_getnewspi((struct sadb_spirange
*)
6584 (void *)mhp
->ext
[SADB_EXT_SPIRANGE
], &saidx
);
6586 lck_mtx_unlock(sadb_mutex
);
6587 if (ipsec_if
!= NULL
) {
6588 ifnet_release(ipsec_if
);
6590 return key_senderror(so
, m
, EINVAL
);
6593 /* get a SA index */
6594 if ((newsah
= key_getsah(&saidx
, SECURITY_ASSOCIATION_ANY
)) == NULL
) {
6595 /* create a new SA index: key_addspi is always used for inbound spi */
6596 if ((newsah
= key_newsah(&saidx
, ipsec_if
, key_get_outgoing_ifindex_from_message(mhp
, SADB_X_EXT_IPSECIF
), IPSEC_DIR_INBOUND
, SECURITY_ASSOCIATION_PFKEY
)) == NULL
) {
6597 lck_mtx_unlock(sadb_mutex
);
6598 if (ipsec_if
!= NULL
) {
6599 ifnet_release(ipsec_if
);
6601 ipseclog((LOG_DEBUG
, "key_getspi: No more memory.\n"));
6602 return key_senderror(so
, m
, ENOBUFS
);
6606 if (ipsec_if
!= NULL
) {
6607 ifnet_release(ipsec_if
);
6611 // Increment use count, since key_newsav() could release sadb_mutex lock
6612 newsah
->use_count
++;
6614 if ((newsah
->flags
& SECURITY_ASSOCIATION_CUSTOM_IPSEC
) == SECURITY_ASSOCIATION_CUSTOM_IPSEC
) {
6615 newsah
->use_count
--;
6616 lck_mtx_unlock(sadb_mutex
);
6617 ipseclog((LOG_ERR
, "key_getspi: custom ipsec exists\n"));
6618 return key_senderror(so
, m
, EEXIST
);
6623 newsav
= key_newsav(m
, mhp
, newsah
, &error
, so
);
6624 if (newsav
== NULL
) {
6625 /* XXX don't free new SA index allocated in above. */
6626 newsah
->use_count
--;
6627 lck_mtx_unlock(sadb_mutex
);
6628 return key_senderror(so
, m
, error
);
6631 if (newsah
->state
== SADB_SASTATE_DEAD
) {
6632 newsah
->use_count
--;
6633 key_sa_chgstate(newsav
, SADB_SASTATE_DEAD
);
6634 key_freesav(newsav
, KEY_SADB_LOCKED
);
6635 lck_mtx_unlock(sadb_mutex
);
6636 ipseclog((LOG_ERR
, "key_getspi: security association head is dead\n"));
6637 return key_senderror(so
, m
, EINVAL
);
6641 key_setspi(newsav
, htonl(spi
));
6643 #ifndef IPSEC_NONBLOCK_ACQUIRE
6644 /* delete the entry in acqtree */
6645 if (mhp
->msg
->sadb_msg_seq
!= 0) {
6647 if ((acq
= key_getacqbyseq(mhp
->msg
->sadb_msg_seq
)) != NULL
) {
6648 /* reset counter in order to deletion by timehandler. */
6651 acq
->created
= tv
.tv_sec
;
6656 newsah
->use_count
--;
6657 lck_mtx_unlock(sadb_mutex
);
6660 struct mbuf
*n
, *nn
;
6661 struct sadb_sa
*m_sa
;
6662 struct sadb_msg
*newmsg
;
6665 /* create new sadb_msg to reply. */
6666 len
= PFKEY_ALIGN8(sizeof(struct sadb_msg
)) +
6667 PFKEY_ALIGN8(sizeof(struct sadb_sa
));
6668 if (len
> MCLBYTES
) {
6669 return key_senderror(so
, m
, ENOBUFS
);
6672 MGETHDR(n
, M_WAITOK
, MT_DATA
);
6673 if (n
&& len
> MHLEN
) {
6674 MCLGET(n
, M_WAITOK
);
6675 if ((n
->m_flags
& M_EXT
) == 0) {
6681 return key_senderror(so
, m
, ENOBUFS
);
6688 m_copydata(m
, 0, sizeof(struct sadb_msg
), mtod(n
, caddr_t
) + off
);
6689 off
+= PFKEY_ALIGN8(sizeof(struct sadb_msg
));
6691 m_sa
= (struct sadb_sa
*)(void *)(mtod(n
, caddr_t
) + off
);
6692 memset(m_sa
, 0, PFKEY_ALIGN8(sizeof(struct sadb_sa
)));
6693 m_sa
->sadb_sa_len
= PFKEY_UNIT64(sizeof(struct sadb_sa
));
6694 m_sa
->sadb_sa_exttype
= SADB_EXT_SA
;
6695 m_sa
->sadb_sa_spi
= htonl(spi
);
6696 off
+= PFKEY_ALIGN8(sizeof(struct sadb_sa
));
6700 panic("length inconsistency in key_getspi");
6704 int mbufItems
[] = {SADB_EXT_ADDRESS_SRC
, SADB_EXT_ADDRESS_DST
};
6705 n
->m_next
= key_gather_mbuf(m
, mhp
, 0, sizeof(mbufItems
) / sizeof(int), mbufItems
);
6708 return key_senderror(so
, m
, ENOBUFS
);
6712 if (n
->m_len
< sizeof(struct sadb_msg
)) {
6713 n
= m_pullup(n
, sizeof(struct sadb_msg
));
6715 return key_sendup_mbuf(so
, m
, KEY_SENDUP_ONE
);
6719 n
->m_pkthdr
.len
= 0;
6720 for (nn
= n
; nn
; nn
= nn
->m_next
) {
6721 n
->m_pkthdr
.len
+= nn
->m_len
;
6724 newmsg
= mtod(n
, struct sadb_msg
*);
6725 newmsg
->sadb_msg_seq
= newsav
->seq
;
6726 newmsg
->sadb_msg_errno
= 0;
6727 VERIFY(PFKEY_UNIT64(n
->m_pkthdr
.len
) <= UINT16_MAX
);
6728 newmsg
->sadb_msg_len
= (u_int16_t
)PFKEY_UNIT64(n
->m_pkthdr
.len
);
6731 return key_sendup_mbuf(so
, n
, KEY_SENDUP_ONE
);
6736 * allocating new SPI
6737 * called by key_getspi().
6744 struct sadb_spirange
*spirange
,
6745 struct secasindex
*saidx
)
6748 u_int32_t keymin
, keymax
;
6749 int count
= key_spi_trycnt
;
6751 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_OWNED
);
6753 /* set spi range to allocate */
6754 if (spirange
!= NULL
) {
6755 keymin
= spirange
->sadb_spirange_min
;
6756 keymax
= spirange
->sadb_spirange_max
;
6758 keymin
= key_spi_minval
;
6759 keymax
= key_spi_maxval
;
6761 if (keymin
== keymax
) {
6762 if (key_checkspidup(saidx
, keymin
) != NULL
) {
6763 ipseclog((LOG_DEBUG
, "key_do_getnewspi: SPI %u exists already.\n", keymin
));
6767 count
--; /* taking one cost. */
6770 u_int32_t range
= keymax
- keymin
+ 1; /* overflow value of zero means full range */
6775 /* when requesting to allocate spi ranged */
6777 u_int32_t rand_val
= key_random();
6779 /* generate pseudo-random SPI value ranged. */
6780 newspi
= (range
== 0 ? rand_val
: keymin
+ (rand_val
% range
));
6782 if (key_checkspidup(saidx
, newspi
) == NULL
) {
6787 if (count
== 0 || newspi
== 0) {
6788 ipseclog((LOG_DEBUG
, "key_do_getnewspi: to allocate spi is failed.\n"));
6794 keystat
.getspi_count
=
6795 (keystat
.getspi_count
+ key_spi_trycnt
- count
) / 2;
6801 * SADB_UPDATE processing
6803 * <base, SA, (SA2), (lifetime(HSC),) address(SD), (address(P),)
6804 * key(AE), (identity(SD),) (sensitivity)>
6805 * from the ikmpd, and update a secasvar entry whose status is SADB_SASTATE_LARVAL.
6807 * <base, SA, (SA2), (lifetime(HSC),) address(SD), (address(P),)
6808 * (identity(SD),) (sensitivity)>
6811 * m will always be freed.
6817 const struct sadb_msghdr
*mhp
)
6819 struct sadb_sa
*sa0
= NULL
;
6820 struct sadb_address
*src0
= NULL
, *dst0
= NULL
;
6821 ifnet_t ipsec_if
= NULL
;
6822 struct secasindex saidx
;
6823 struct secashead
*sah
= NULL
;
6824 struct secasvar
*sav
= NULL
;
6831 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_NOTOWNED
);
6834 if (so
== NULL
|| m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
) {
6835 panic("key_update: NULL pointer is passed.\n");
6838 /* map satype to proto */
6839 if ((proto
= key_satype2proto(mhp
->msg
->sadb_msg_satype
)) == 0) {
6840 ipseclog((LOG_DEBUG
, "key_update: invalid satype is passed.\n"));
6842 return key_senderror(so
, m
, EINVAL
);
6845 if (mhp
->ext
[SADB_EXT_SA
] == NULL
||
6846 mhp
->ext
[SADB_EXT_ADDRESS_SRC
] == NULL
||
6847 mhp
->ext
[SADB_EXT_ADDRESS_DST
] == NULL
||
6848 (mhp
->msg
->sadb_msg_satype
== SADB_SATYPE_ESP
&&
6849 mhp
->ext
[SADB_EXT_KEY_ENCRYPT
] == NULL
) ||
6850 (mhp
->msg
->sadb_msg_satype
== SADB_SATYPE_AH
&&
6851 mhp
->ext
[SADB_EXT_KEY_AUTH
] == NULL
) ||
6852 (mhp
->ext
[SADB_EXT_LIFETIME_HARD
] != NULL
&&
6853 mhp
->ext
[SADB_EXT_LIFETIME_SOFT
] == NULL
) ||
6854 (mhp
->ext
[SADB_EXT_LIFETIME_HARD
] == NULL
&&
6855 mhp
->ext
[SADB_EXT_LIFETIME_SOFT
] != NULL
)) {
6856 ipseclog((LOG_DEBUG
, "key_update: invalid message is passed.\n"));
6858 return key_senderror(so
, m
, EINVAL
);
6860 if (mhp
->extlen
[SADB_EXT_SA
] < sizeof(struct sadb_sa
) ||
6861 mhp
->extlen
[SADB_EXT_ADDRESS_SRC
] < sizeof(struct sadb_address
) ||
6862 mhp
->extlen
[SADB_EXT_ADDRESS_DST
] < sizeof(struct sadb_address
)) {
6863 ipseclog((LOG_DEBUG
, "key_update: invalid message is passed.\n"));
6865 return key_senderror(so
, m
, EINVAL
);
6867 if (mhp
->ext
[SADB_X_EXT_SA2
] != NULL
) {
6868 mode
= ((struct sadb_x_sa2
*)
6869 (void *)mhp
->ext
[SADB_X_EXT_SA2
])->sadb_x_sa2_mode
;
6870 reqid
= ((struct sadb_x_sa2
*)
6871 (void *)mhp
->ext
[SADB_X_EXT_SA2
])->sadb_x_sa2_reqid
;
6872 flags2
= ((struct sadb_x_sa2
*)(void *)mhp
->ext
[SADB_X_EXT_SA2
])->sadb_x_sa2_flags
;
6874 mode
= IPSEC_MODE_ANY
;
6878 /* XXX boundary checking for other extensions */
6880 sa0
= (struct sadb_sa
*)(void *)mhp
->ext
[SADB_EXT_SA
];
6881 src0
= (struct sadb_address
*)(mhp
->ext
[SADB_EXT_ADDRESS_SRC
]);
6882 dst0
= (struct sadb_address
*)(mhp
->ext
[SADB_EXT_ADDRESS_DST
]);
6883 ipsec_if
= key_get_ipsec_if_from_message(mhp
, SADB_X_EXT_IPSECIF
);
6885 u_int ipsec_if_index
= 0;
6886 if (ipsec_if
!= NULL
) {
6887 ipsec_if_index
= ipsec_if
->if_index
;
6888 ifnet_release(ipsec_if
);
6892 /* XXX boundary check against sa_len */
6893 KEY_SETSECASIDX(proto
, mode
, reqid
, src0
+ 1, dst0
+ 1, ipsec_if_index
, &saidx
);
6895 lck_mtx_lock(sadb_mutex
);
6897 /* get a SA header */
6898 if ((sah
= key_getsah(&saidx
, SECURITY_ASSOCIATION_PFKEY
)) == NULL
) {
6899 lck_mtx_unlock(sadb_mutex
);
6900 ipseclog((LOG_DEBUG
, "key_update: no SA index found.\n"));
6902 return key_senderror(so
, m
, ENOENT
);
6905 // Increment use count, since key_setsaval() could release sadb_mutex lock
6908 if ((sav
= key_getsavbyspi(sah
, sa0
->sadb_sa_spi
)) == NULL
) {
6909 ipseclog((LOG_DEBUG
,
6910 "key_update: no such a SA found (spi:%u)\n",
6911 (u_int32_t
)ntohl(sa0
->sadb_sa_spi
)));
6916 // Increment reference count, since key_setsaval() could release sadb_mutex lock
6919 /* validity check */
6920 if (sav
->sah
->saidx
.proto
!= proto
) {
6921 ipseclog((LOG_DEBUG
,
6922 "key_update: protocol mismatched (DB=%u param=%u)\n",
6923 sav
->sah
->saidx
.proto
, proto
));
6928 if (sav
->pid
!= mhp
->msg
->sadb_msg_pid
) {
6929 ipseclog((LOG_DEBUG
,
6930 "key_update: pid mismatched (DB:%u param:%u)\n",
6931 sav
->pid
, mhp
->msg
->sadb_msg_pid
));
6936 /* copy sav values */
6937 error
= key_setsaval(sav
, m
, mhp
);
6942 if (sah
->state
== SADB_SASTATE_DEAD
) {
6944 "key_update: security association head is dead\n"));
6949 sav
->flags2
= flags2
;
6950 if (flags2
& SADB_X_EXT_SA2_DELETE_ON_DETACH
) {
6955 * Verify if SADB_X_EXT_NATT_MULTIPLEUSERS flag is set that
6956 * this SA is for transport mode - otherwise clear it.
6958 if ((sav
->flags
& SADB_X_EXT_NATT_MULTIPLEUSERS
) != 0 &&
6959 (sav
->sah
->saidx
.mode
!= IPSEC_MODE_TRANSPORT
||
6960 sav
->sah
->saidx
.src
.ss_family
!= AF_INET
)) {
6961 sav
->flags
&= ~SADB_X_EXT_NATT_MULTIPLEUSERS
;
6964 /* check SA values to be mature. */
6965 if ((error
= key_mature(sav
)) != 0) {
6969 key_freesav(sav
, KEY_SADB_LOCKED
);
6971 lck_mtx_unlock(sadb_mutex
);
6976 /* set msg buf from mhp */
6977 n
= key_getmsgbuf_x1(m
, mhp
);
6979 ipseclog((LOG_DEBUG
, "key_update: No more memory.\n"));
6980 return key_senderror(so
, m
, ENOBUFS
);
6985 return key_sendup_mbuf(so
, n
, KEY_SENDUP_ALL
);
6989 key_freesav(sav
, KEY_SADB_LOCKED
);
6995 lck_mtx_unlock(sadb_mutex
);
6997 return key_senderror(so
, m
, error
);
7001 key_migrate(struct socket
*so
,
7003 const struct sadb_msghdr
*mhp
)
7005 struct sadb_sa
*sa0
= NULL
;
7006 struct sadb_address
*src0
= NULL
;
7007 struct sadb_address
*dst0
= NULL
;
7008 struct sadb_address
*src1
= NULL
;
7009 struct sadb_address
*dst1
= NULL
;
7010 ifnet_t ipsec_if0
= NULL
;
7011 ifnet_t ipsec_if1
= NULL
;
7012 struct secasindex saidx0
;
7013 struct secasindex saidx1
;
7014 struct secashead
*sah
= NULL
;
7015 struct secashead
*newsah
= NULL
;
7016 struct secasvar
*sav
= NULL
;
7019 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_NOTOWNED
);
7022 if (so
== NULL
|| m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
) {
7023 panic("key_migrate: NULL pointer is passed.\n");
7026 /* map satype to proto */
7027 if ((proto
= key_satype2proto(mhp
->msg
->sadb_msg_satype
)) == 0) {
7028 ipseclog((LOG_DEBUG
, "key_migrate: invalid satype is passed.\n"));
7029 return key_senderror(so
, m
, EINVAL
);
7032 if (mhp
->ext
[SADB_EXT_SA
] == NULL
||
7033 mhp
->ext
[SADB_EXT_ADDRESS_SRC
] == NULL
||
7034 mhp
->ext
[SADB_EXT_ADDRESS_DST
] == NULL
||
7035 mhp
->ext
[SADB_EXT_MIGRATE_ADDRESS_SRC
] == NULL
||
7036 mhp
->ext
[SADB_EXT_MIGRATE_ADDRESS_DST
] == NULL
) {
7037 ipseclog((LOG_DEBUG
, "key_migrate: invalid message is passed.\n"));
7038 return key_senderror(so
, m
, EINVAL
);
7041 if (mhp
->extlen
[SADB_EXT_SA
] < sizeof(struct sadb_sa
) ||
7042 mhp
->extlen
[SADB_EXT_ADDRESS_SRC
] < sizeof(struct sadb_address
) ||
7043 mhp
->extlen
[SADB_EXT_ADDRESS_DST
] < sizeof(struct sadb_address
) ||
7044 mhp
->extlen
[SADB_EXT_MIGRATE_ADDRESS_SRC
] < sizeof(struct sadb_address
) ||
7045 mhp
->extlen
[SADB_EXT_MIGRATE_ADDRESS_DST
] < sizeof(struct sadb_address
)) {
7046 ipseclog((LOG_DEBUG
, "key_migrate: invalid message is passed.\n"));
7047 return key_senderror(so
, m
, EINVAL
);
7050 lck_mtx_lock(sadb_mutex
);
7052 sa0
= (struct sadb_sa
*)(void *)mhp
->ext
[SADB_EXT_SA
];
7053 src0
= (struct sadb_address
*)(mhp
->ext
[SADB_EXT_ADDRESS_SRC
]);
7054 dst0
= (struct sadb_address
*)(mhp
->ext
[SADB_EXT_ADDRESS_DST
]);
7055 src1
= (struct sadb_address
*)(mhp
->ext
[SADB_EXT_MIGRATE_ADDRESS_SRC
]);
7056 dst1
= (struct sadb_address
*)(mhp
->ext
[SADB_EXT_MIGRATE_ADDRESS_DST
]);
7057 ipsec_if0
= key_get_ipsec_if_from_message(mhp
, SADB_X_EXT_IPSECIF
);
7058 ipsec_if1
= key_get_ipsec_if_from_message(mhp
, SADB_X_EXT_MIGRATE_IPSECIF
);
7060 u_int ipsec_if0_index
= 0;
7061 if (ipsec_if0
!= NULL
) {
7062 ipsec_if0_index
= ipsec_if0
->if_index
;
7063 ifnet_release(ipsec_if0
);
7067 /* Find existing SAH and SAV */
7068 KEY_SETSECASIDX(proto
, IPSEC_MODE_ANY
, 0, src0
+ 1, dst0
+ 1, ipsec_if0_index
, &saidx0
);
7070 LIST_FOREACH(sah
, &sahtree
, chain
) {
7071 if (sah
->state
!= SADB_SASTATE_MATURE
) {
7074 if (key_cmpsaidx(&sah
->saidx
, &saidx0
, CMP_HEAD
) == 0) {
7078 sav
= key_getsavbyspi(sah
, sa0
->sadb_sa_spi
);
7079 if (sav
&& sav
->state
== SADB_SASTATE_MATURE
) {
7084 lck_mtx_unlock(sadb_mutex
);
7085 if (ipsec_if1
!= NULL
) {
7086 ifnet_release(ipsec_if1
);
7088 ipseclog((LOG_DEBUG
, "key_migrate: no mature SAH found.\n"));
7089 return key_senderror(so
, m
, ENOENT
);
7093 lck_mtx_unlock(sadb_mutex
);
7094 if (ipsec_if1
!= NULL
) {
7095 ifnet_release(ipsec_if1
);
7097 ipseclog((LOG_DEBUG
, "key_migrate: no SA found.\n"));
7098 return key_senderror(so
, m
, ENOENT
);
7101 /* Find or create new SAH */
7102 KEY_SETSECASIDX(proto
, sah
->saidx
.mode
, sah
->saidx
.reqid
, src1
+ 1, dst1
+ 1, ipsec_if1
? ipsec_if1
->if_index
: 0, &saidx1
);
7104 if ((newsah
= key_getsah(&saidx1
, SECURITY_ASSOCIATION_ANY
)) == NULL
) {
7105 if ((newsah
= key_newsah(&saidx1
, ipsec_if1
, key_get_outgoing_ifindex_from_message(mhp
, SADB_X_EXT_MIGRATE_IPSECIF
), sah
->dir
, SECURITY_ASSOCIATION_PFKEY
)) == NULL
) {
7106 lck_mtx_unlock(sadb_mutex
);
7107 if (ipsec_if1
!= NULL
) {
7108 ifnet_release(ipsec_if1
);
7110 ipseclog((LOG_DEBUG
, "key_migrate: No more memory.\n"));
7111 return key_senderror(so
, m
, ENOBUFS
);
7115 if (ipsec_if1
!= NULL
) {
7116 ifnet_release(ipsec_if1
);
7120 if ((newsah
->flags
& SECURITY_ASSOCIATION_CUSTOM_IPSEC
) == SECURITY_ASSOCIATION_CUSTOM_IPSEC
) {
7121 lck_mtx_unlock(sadb_mutex
);
7122 ipseclog((LOG_ERR
, "key_migrate: custom ipsec exists\n"));
7123 return key_senderror(so
, m
, EEXIST
);
7126 /* Migrate SAV in to new SAH */
7127 if (key_migratesav(sav
, newsah
) != 0) {
7128 lck_mtx_unlock(sadb_mutex
);
7129 ipseclog((LOG_DEBUG
, "key_migrate: Failed to migrate SA to new SAH.\n"));
7130 return key_senderror(so
, m
, EINVAL
);
7133 /* Reset NAT values */
7134 sav
->flags
= sa0
->sadb_sa_flags
;
7135 sav
->natt_encapsulated_src_port
= ((const struct sadb_sa_2
*)(sa0
))->sadb_sa_natt_src_port
;
7136 sav
->remote_ike_port
= ((const struct sadb_sa_2
*)(sa0
))->sadb_sa_natt_port
;
7137 sav
->natt_interval
= ((const struct sadb_sa_2
*)(sa0
))->sadb_sa_natt_interval
;
7138 sav
->natt_offload_interval
= ((const struct sadb_sa_2
*)(sa0
))->sadb_sa_natt_offload_interval
;
7139 sav
->natt_last_activity
= natt_now
;
7142 * Verify if SADB_X_EXT_NATT_MULTIPLEUSERS flag is set that
7143 * SADB_X_EXT_NATT is set and SADB_X_EXT_NATT_KEEPALIVE is not
7144 * set (we're not behind nat) - otherwise clear it.
7146 if ((sav
->flags
& SADB_X_EXT_NATT_MULTIPLEUSERS
) != 0) {
7147 if ((sav
->flags
& SADB_X_EXT_NATT
) == 0 ||
7148 (sav
->flags
& SADB_X_EXT_NATT_KEEPALIVE
) != 0) {
7149 sav
->flags
&= ~SADB_X_EXT_NATT_MULTIPLEUSERS
;
7153 lck_mtx_unlock(sadb_mutex
);
7156 struct sadb_msg
*newmsg
;
7157 int mbufItems
[] = {SADB_EXT_RESERVED
, SADB_EXT_SA
,
7158 SADB_EXT_ADDRESS_SRC
, SADB_EXT_ADDRESS_DST
, SADB_X_EXT_IPSECIF
,
7159 SADB_EXT_MIGRATE_ADDRESS_SRC
, SADB_EXT_MIGRATE_ADDRESS_DST
, SADB_X_EXT_MIGRATE_IPSECIF
};
7161 /* create new sadb_msg to reply. */
7162 n
= key_gather_mbuf(m
, mhp
, 1, sizeof(mbufItems
) / sizeof(int), mbufItems
);
7164 return key_senderror(so
, m
, ENOBUFS
);
7167 if (n
->m_len
< sizeof(struct sadb_msg
)) {
7168 n
= m_pullup(n
, sizeof(struct sadb_msg
));
7170 return key_senderror(so
, m
, ENOBUFS
);
7173 newmsg
= mtod(n
, struct sadb_msg
*);
7174 newmsg
->sadb_msg_errno
= 0;
7175 VERIFY(PFKEY_UNIT64(n
->m_pkthdr
.len
) <= UINT16_MAX
);
7176 newmsg
->sadb_msg_len
= (u_int16_t
)PFKEY_UNIT64(n
->m_pkthdr
.len
);
7179 return key_sendup_mbuf(so
, n
, KEY_SENDUP_ALL
);
7184 * SADB_ADD processing
7185 * add a entry to SA database, when received
7186 * <base, SA, (SA2), (lifetime(HSC),) address(SD), (address(P),)
7187 * key(AE), (identity(SD),) (sensitivity)>
7190 * <base, SA, (SA2), (lifetime(HSC),) address(SD), (address(P),)
7191 * (identity(SD),) (sensitivity)>
7194 * IGNORE identity and sensitivity messages.
7196 * m will always be freed.
7202 const struct sadb_msghdr
*mhp
)
7204 struct sadb_sa
*sa0
= NULL
;
7205 struct sadb_address
*src0
= NULL
, *dst0
= NULL
;
7206 ifnet_t ipsec_if
= NULL
;
7207 struct secasindex saidx
;
7208 struct secashead
*newsah
= NULL
;
7209 struct secasvar
*newsav
= NULL
;
7215 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_NOTOWNED
);
7218 if (so
== NULL
|| m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
) {
7219 panic("key_add: NULL pointer is passed.\n");
7222 /* map satype to proto */
7223 if ((proto
= key_satype2proto(mhp
->msg
->sadb_msg_satype
)) == 0) {
7224 ipseclog((LOG_DEBUG
, "key_add: invalid satype is passed.\n"));
7226 return key_senderror(so
, m
, EINVAL
);
7229 if (mhp
->ext
[SADB_EXT_SA
] == NULL
||
7230 mhp
->ext
[SADB_EXT_ADDRESS_SRC
] == NULL
||
7231 mhp
->ext
[SADB_EXT_ADDRESS_DST
] == NULL
||
7232 (mhp
->msg
->sadb_msg_satype
== SADB_SATYPE_ESP
&&
7233 mhp
->ext
[SADB_EXT_KEY_ENCRYPT
] == NULL
) ||
7234 (mhp
->msg
->sadb_msg_satype
== SADB_SATYPE_AH
&&
7235 mhp
->ext
[SADB_EXT_KEY_AUTH
] == NULL
) ||
7236 (mhp
->ext
[SADB_EXT_LIFETIME_HARD
] != NULL
&&
7237 mhp
->ext
[SADB_EXT_LIFETIME_SOFT
] == NULL
) ||
7238 (mhp
->ext
[SADB_EXT_LIFETIME_HARD
] == NULL
&&
7239 mhp
->ext
[SADB_EXT_LIFETIME_SOFT
] != NULL
)) {
7240 ipseclog((LOG_DEBUG
, "key_add: invalid message is passed.\n"));
7242 return key_senderror(so
, m
, EINVAL
);
7244 if (mhp
->extlen
[SADB_EXT_SA
] < sizeof(struct sadb_sa
) ||
7245 mhp
->extlen
[SADB_EXT_ADDRESS_SRC
] < sizeof(struct sadb_address
) ||
7246 mhp
->extlen
[SADB_EXT_ADDRESS_DST
] < sizeof(struct sadb_address
)) {
7248 ipseclog((LOG_DEBUG
, "key_add: invalid message is passed.\n"));
7250 return key_senderror(so
, m
, EINVAL
);
7252 if (mhp
->ext
[SADB_X_EXT_SA2
] != NULL
) {
7253 mode
= ((struct sadb_x_sa2
*)
7254 (void *)mhp
->ext
[SADB_X_EXT_SA2
])->sadb_x_sa2_mode
;
7255 reqid
= ((struct sadb_x_sa2
*)
7256 (void *)mhp
->ext
[SADB_X_EXT_SA2
])->sadb_x_sa2_reqid
;
7258 mode
= IPSEC_MODE_ANY
;
7262 sa0
= (struct sadb_sa
*)(void *)mhp
->ext
[SADB_EXT_SA
];
7263 src0
= (struct sadb_address
*)mhp
->ext
[SADB_EXT_ADDRESS_SRC
];
7264 dst0
= (struct sadb_address
*)mhp
->ext
[SADB_EXT_ADDRESS_DST
];
7265 ipsec_if
= key_get_ipsec_if_from_message(mhp
, SADB_X_EXT_IPSECIF
);
7267 /* XXX boundary check against sa_len */
7268 KEY_SETSECASIDX(proto
, mode
, reqid
, src0
+ 1, dst0
+ 1, ipsec_if
? ipsec_if
->if_index
: 0, &saidx
);
7270 lck_mtx_lock(sadb_mutex
);
7272 /* get a SA header */
7273 if ((newsah
= key_getsah(&saidx
, SECURITY_ASSOCIATION_ANY
)) == NULL
) {
7274 /* create a new SA header: key_addspi is always used for outbound spi */
7275 if ((newsah
= key_newsah(&saidx
, ipsec_if
, key_get_outgoing_ifindex_from_message(mhp
, SADB_X_EXT_IPSECIF
), IPSEC_DIR_OUTBOUND
, SECURITY_ASSOCIATION_PFKEY
)) == NULL
) {
7276 ipseclog((LOG_DEBUG
, "key_add: No more memory.\n"));
7282 if (ipsec_if
!= NULL
) {
7283 ifnet_release(ipsec_if
);
7287 // Increment use count, since key_newsav() could release sadb_mutex lock
7288 newsah
->use_count
++;
7290 if ((newsah
->flags
& SECURITY_ASSOCIATION_CUSTOM_IPSEC
) == SECURITY_ASSOCIATION_CUSTOM_IPSEC
) {
7291 ipseclog((LOG_ERR
, "key_add: custom ipsec exists\n"));
7296 /* create new SA entry. */
7297 /* We can create new SA only if SPI is different. */
7298 if (key_getsavbyspi(newsah
, sa0
->sadb_sa_spi
)) {
7299 ipseclog((LOG_DEBUG
, "key_add: SA already exists.\n"));
7303 newsav
= key_newsav(m
, mhp
, newsah
, &error
, so
);
7304 if (newsav
== NULL
) {
7308 if (newsah
->state
== SADB_SASTATE_DEAD
) {
7309 ipseclog((LOG_ERR
, "key_add: security association head is dead\n"));
7315 * Verify if SADB_X_EXT_NATT_MULTIPLEUSERS flag is set that
7316 * this SA is for transport mode - otherwise clear it.
7318 if ((newsav
->flags
& SADB_X_EXT_NATT_MULTIPLEUSERS
) != 0 &&
7319 (newsah
->saidx
.mode
!= IPSEC_MODE_TRANSPORT
||
7320 newsah
->saidx
.dst
.ss_family
!= AF_INET
)) {
7321 newsav
->flags
&= ~SADB_X_EXT_NATT_MULTIPLEUSERS
;
7324 /* check SA values to be mature. */
7325 if ((error
= key_mature(newsav
)) != 0) {
7329 newsah
->use_count
--;
7330 lck_mtx_unlock(sadb_mutex
);
7333 * don't call key_freesav() here, as we would like to keep the SA
7334 * in the database on success.
7340 /* set msg buf from mhp */
7341 n
= key_getmsgbuf_x1(m
, mhp
);
7343 ipseclog((LOG_DEBUG
, "key_update: No more memory.\n"));
7345 return key_senderror(so
, m
, ENOBUFS
);
7348 // mh.ext points to the mbuf content.
7349 // Zero out Encryption and Integrity keys if present.
7352 return key_sendup_mbuf(so
, n
, KEY_SENDUP_ALL
);
7355 if (newsav
!= NULL
) {
7356 key_sa_chgstate(newsav
, SADB_SASTATE_DEAD
);
7357 key_freesav(newsav
, KEY_SADB_LOCKED
);
7359 if (newsah
!= NULL
) {
7360 newsah
->use_count
--;
7362 lck_mtx_unlock(sadb_mutex
);
7363 if (ipsec_if
!= NULL
) {
7364 ifnet_release(ipsec_if
);
7367 return key_senderror(so
, m
, error
);
7371 * m will not be freed on return.
7372 * it is caller's responsibility to free the result.
7374 static struct mbuf
*
7377 const struct sadb_msghdr
*mhp
)
7380 int mbufItems
[] = {SADB_EXT_RESERVED
, SADB_EXT_SA
,
7381 SADB_X_EXT_SA2
, SADB_EXT_ADDRESS_SRC
,
7382 SADB_EXT_ADDRESS_DST
, SADB_EXT_LIFETIME_HARD
,
7383 SADB_EXT_LIFETIME_SOFT
, SADB_EXT_IDENTITY_SRC
,
7384 SADB_EXT_IDENTITY_DST
};
7387 if (m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
) {
7388 panic("key_getmsgbuf_x1: NULL pointer is passed.\n");
7391 /* create new sadb_msg to reply. */
7392 n
= key_gather_mbuf(m
, mhp
, 1, sizeof(mbufItems
) / sizeof(int), mbufItems
);
7397 if (n
->m_len
< sizeof(struct sadb_msg
)) {
7398 n
= m_pullup(n
, sizeof(struct sadb_msg
));
7403 mtod(n
, struct sadb_msg
*)->sadb_msg_errno
= 0;
7404 VERIFY(PFKEY_UNIT64(n
->m_pkthdr
.len
) <= UINT16_MAX
);
7405 mtod(n
, struct sadb_msg
*)->sadb_msg_len
=
7406 (u_int16_t
)PFKEY_UNIT64(n
->m_pkthdr
.len
);
7411 static int key_delete_all(struct socket
*, struct mbuf
*,
7412 const struct sadb_msghdr
*, u_int16_t
);
7415 * SADB_DELETE processing
7417 * <base, SA(*), address(SD)>
7418 * from the ikmpd, and set SADB_SASTATE_DEAD,
7420 * <base, SA(*), address(SD)>
7423 * m will always be freed.
7429 const struct sadb_msghdr
*mhp
)
7431 struct sadb_sa
*sa0
;
7432 struct sadb_address
*src0
, *dst0
;
7433 ifnet_t ipsec_if
= NULL
;
7434 struct secasindex saidx
;
7435 struct secashead
*sah
;
7436 struct secasvar
*sav
= NULL
;
7439 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_NOTOWNED
);
7442 if (so
== NULL
|| m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
) {
7443 panic("key_delete: NULL pointer is passed.\n");
7446 /* map satype to proto */
7447 if ((proto
= key_satype2proto(mhp
->msg
->sadb_msg_satype
)) == 0) {
7448 ipseclog((LOG_DEBUG
, "key_delete: invalid satype is passed.\n"));
7449 return key_senderror(so
, m
, EINVAL
);
7452 if (mhp
->ext
[SADB_EXT_ADDRESS_SRC
] == NULL
||
7453 mhp
->ext
[SADB_EXT_ADDRESS_DST
] == NULL
) {
7454 ipseclog((LOG_DEBUG
, "key_delete: invalid message is passed.\n"));
7455 return key_senderror(so
, m
, EINVAL
);
7458 if (mhp
->extlen
[SADB_EXT_ADDRESS_SRC
] < sizeof(struct sadb_address
) ||
7459 mhp
->extlen
[SADB_EXT_ADDRESS_DST
] < sizeof(struct sadb_address
)) {
7460 ipseclog((LOG_DEBUG
, "key_delete: invalid message is passed.\n"));
7461 return key_senderror(so
, m
, EINVAL
);
7464 lck_mtx_lock(sadb_mutex
);
7466 if (mhp
->ext
[SADB_EXT_SA
] == NULL
) {
7468 * Caller wants us to delete all non-LARVAL SAs
7469 * that match the src/dst. This is used during
7470 * IKE INITIAL-CONTACT.
7472 ipseclog((LOG_DEBUG
, "key_delete: doing delete all.\n"));
7473 /* key_delete_all will unlock sadb_mutex */
7474 return key_delete_all(so
, m
, mhp
, proto
);
7475 } else if (mhp
->extlen
[SADB_EXT_SA
] < sizeof(struct sadb_sa
)) {
7476 lck_mtx_unlock(sadb_mutex
);
7477 ipseclog((LOG_DEBUG
, "key_delete: invalid message is passed.\n"));
7478 return key_senderror(so
, m
, EINVAL
);
7481 sa0
= (struct sadb_sa
*)(void *)mhp
->ext
[SADB_EXT_SA
];
7482 src0
= (struct sadb_address
*)(mhp
->ext
[SADB_EXT_ADDRESS_SRC
]);
7483 dst0
= (struct sadb_address
*)(mhp
->ext
[SADB_EXT_ADDRESS_DST
]);
7484 ipsec_if
= key_get_ipsec_if_from_message(mhp
, SADB_X_EXT_IPSECIF
);
7486 u_int ipsec_if_index
= 0;
7487 if (ipsec_if
!= NULL
) {
7488 ipsec_if_index
= ipsec_if
->if_index
;
7489 ifnet_release(ipsec_if
);
7493 /* XXX boundary check against sa_len */
7494 KEY_SETSECASIDX(proto
, IPSEC_MODE_ANY
, 0, src0
+ 1, dst0
+ 1, ipsec_if_index
, &saidx
);
7497 /* get a SA header */
7498 LIST_FOREACH(sah
, &sahtree
, chain
) {
7499 if (sah
->state
== SADB_SASTATE_DEAD
) {
7502 if (key_cmpsaidx(&sah
->saidx
, &saidx
, CMP_HEAD
) == 0) {
7506 /* get a SA with SPI. */
7507 sav
= key_getsavbyspi(sah
, sa0
->sadb_sa_spi
);
7513 lck_mtx_unlock(sadb_mutex
);
7514 ipseclog((LOG_DEBUG
, "key_delete: no SA found.\n"));
7515 return key_senderror(so
, m
, ENOENT
);
7518 key_sa_chgstate(sav
, SADB_SASTATE_DEAD
);
7519 key_freesav(sav
, KEY_SADB_LOCKED
);
7521 lck_mtx_unlock(sadb_mutex
);
7526 struct sadb_msg
*newmsg
;
7527 int mbufItems
[] = {SADB_EXT_RESERVED
, SADB_EXT_SA
,
7528 SADB_EXT_ADDRESS_SRC
, SADB_EXT_ADDRESS_DST
};
7530 /* create new sadb_msg to reply. */
7531 n
= key_gather_mbuf(m
, mhp
, 1, sizeof(mbufItems
) / sizeof(int), mbufItems
);
7533 return key_senderror(so
, m
, ENOBUFS
);
7536 if (n
->m_len
< sizeof(struct sadb_msg
)) {
7537 n
= m_pullup(n
, sizeof(struct sadb_msg
));
7539 return key_senderror(so
, m
, ENOBUFS
);
7542 newmsg
= mtod(n
, struct sadb_msg
*);
7543 newmsg
->sadb_msg_errno
= 0;
7544 VERIFY(PFKEY_UNIT64(n
->m_pkthdr
.len
) <= UINT16_MAX
);
7545 newmsg
->sadb_msg_len
= (u_int16_t
)PFKEY_UNIT64(n
->m_pkthdr
.len
);
7548 return key_sendup_mbuf(so
, n
, KEY_SENDUP_ALL
);
7553 * delete all SAs for src/dst. Called from key_delete().
7559 const struct sadb_msghdr
*mhp
,
7562 struct sadb_address
*src0
, *dst0
;
7563 ifnet_t ipsec_if
= NULL
;
7564 struct secasindex saidx
;
7565 struct secashead
*sah
;
7566 struct secasvar
*sav
, *nextsav
;
7567 u_int stateidx
, state
;
7569 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_OWNED
);
7571 src0
= (struct sadb_address
*)(mhp
->ext
[SADB_EXT_ADDRESS_SRC
]);
7572 dst0
= (struct sadb_address
*)(mhp
->ext
[SADB_EXT_ADDRESS_DST
]);
7573 ipsec_if
= key_get_ipsec_if_from_message(mhp
, SADB_X_EXT_IPSECIF
);
7575 u_int ipsec_if_index
= 0;
7576 if (ipsec_if
!= NULL
) {
7577 ipsec_if_index
= ipsec_if
->if_index
;
7578 ifnet_release(ipsec_if
);
7582 /* XXX boundary check against sa_len */
7583 KEY_SETSECASIDX(proto
, IPSEC_MODE_ANY
, 0, src0
+ 1, dst0
+ 1, ipsec_if_index
, &saidx
);
7585 LIST_FOREACH(sah
, &sahtree
, chain
) {
7586 if (sah
->state
== SADB_SASTATE_DEAD
) {
7589 if (key_cmpsaidx(&sah
->saidx
, &saidx
, CMP_HEAD
) == 0) {
7593 /* Delete all non-LARVAL SAs. */
7595 stateidx
< _ARRAYLEN(saorder_state_alive
);
7597 state
= saorder_state_alive
[stateidx
];
7598 if (state
== SADB_SASTATE_LARVAL
) {
7601 for (sav
= LIST_FIRST(&sah
->savtree
[state
]);
7602 sav
!= NULL
; sav
= nextsav
) {
7603 nextsav
= LIST_NEXT(sav
, chain
);
7605 if (sav
->state
!= state
) {
7606 ipseclog((LOG_DEBUG
, "key_delete_all: "
7607 "invalid sav->state "
7608 "(queue: %d SA: %d)\n",
7609 state
, sav
->state
));
7613 key_sa_chgstate(sav
, SADB_SASTATE_DEAD
);
7614 key_freesav(sav
, KEY_SADB_LOCKED
);
7618 lck_mtx_unlock(sadb_mutex
);
7622 struct sadb_msg
*newmsg
;
7623 int mbufItems
[] = {SADB_EXT_RESERVED
, SADB_EXT_ADDRESS_SRC
,
7624 SADB_EXT_ADDRESS_DST
};
7626 /* create new sadb_msg to reply. */
7627 n
= key_gather_mbuf(m
, mhp
, 1, sizeof(mbufItems
) / sizeof(int), mbufItems
);
7629 return key_senderror(so
, m
, ENOBUFS
);
7632 if (n
->m_len
< sizeof(struct sadb_msg
)) {
7633 n
= m_pullup(n
, sizeof(struct sadb_msg
));
7635 return key_senderror(so
, m
, ENOBUFS
);
7638 newmsg
= mtod(n
, struct sadb_msg
*);
7639 newmsg
->sadb_msg_errno
= 0;
7640 VERIFY(PFKEY_UNIT64(n
->m_pkthdr
.len
) <= UINT16_MAX
);
7641 newmsg
->sadb_msg_len
= (u_int16_t
)PFKEY_UNIT64(n
->m_pkthdr
.len
);
7644 return key_sendup_mbuf(so
, n
, KEY_SENDUP_ALL
);
7649 * SADB_GET processing
7651 * <base, SA(*), address(SD)>
7652 * from the ikmpd, and get a SP and a SA to respond,
7654 * <base, SA, (lifetime(HSC),) address(SD), (address(P),) key(AE),
7655 * (identity(SD),) (sensitivity)>
7658 * m will always be freed.
7664 const struct sadb_msghdr
*mhp
)
7666 struct sadb_sa
*sa0
;
7667 struct sadb_address
*src0
, *dst0
;
7668 ifnet_t ipsec_if
= NULL
;
7669 struct secasindex saidx
;
7670 struct secashead
*sah
;
7671 struct secasvar
*sav
= NULL
;
7674 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_NOTOWNED
);
7677 if (so
== NULL
|| m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
) {
7678 panic("key_get: NULL pointer is passed.\n");
7681 /* map satype to proto */
7682 if ((proto
= key_satype2proto(mhp
->msg
->sadb_msg_satype
)) == 0) {
7683 ipseclog((LOG_DEBUG
, "key_get: invalid satype is passed.\n"));
7684 return key_senderror(so
, m
, EINVAL
);
7687 if (mhp
->ext
[SADB_EXT_SA
] == NULL
||
7688 mhp
->ext
[SADB_EXT_ADDRESS_SRC
] == NULL
||
7689 mhp
->ext
[SADB_EXT_ADDRESS_DST
] == NULL
) {
7690 ipseclog((LOG_DEBUG
, "key_get: invalid message is passed.\n"));
7691 return key_senderror(so
, m
, EINVAL
);
7693 if (mhp
->extlen
[SADB_EXT_SA
] < sizeof(struct sadb_sa
) ||
7694 mhp
->extlen
[SADB_EXT_ADDRESS_SRC
] < sizeof(struct sadb_address
) ||
7695 mhp
->extlen
[SADB_EXT_ADDRESS_DST
] < sizeof(struct sadb_address
)) {
7696 ipseclog((LOG_DEBUG
, "key_get: invalid message is passed.\n"));
7697 return key_senderror(so
, m
, EINVAL
);
7700 sa0
= (struct sadb_sa
*)(void *)mhp
->ext
[SADB_EXT_SA
];
7701 src0
= (struct sadb_address
*)mhp
->ext
[SADB_EXT_ADDRESS_SRC
];
7702 dst0
= (struct sadb_address
*)mhp
->ext
[SADB_EXT_ADDRESS_DST
];
7703 ipsec_if
= key_get_ipsec_if_from_message(mhp
, SADB_X_EXT_IPSECIF
);
7705 u_int ipsec_if_index
= 0;
7706 if (ipsec_if
!= NULL
) {
7707 ipsec_if_index
= ipsec_if
->if_index
;
7708 ifnet_release(ipsec_if
);
7712 /* XXX boundary check against sa_len */
7713 KEY_SETSECASIDX(proto
, IPSEC_MODE_ANY
, 0, src0
+ 1, dst0
+ 1, ipsec_if_index
, &saidx
);
7715 lck_mtx_lock(sadb_mutex
);
7717 /* get a SA header */
7718 LIST_FOREACH(sah
, &sahtree
, chain
) {
7719 if (sah
->state
== SADB_SASTATE_DEAD
) {
7722 if (key_cmpsaidx(&sah
->saidx
, &saidx
, CMP_HEAD
) == 0) {
7726 /* get a SA with SPI. */
7727 sav
= key_getsavbyspi(sah
, sa0
->sadb_sa_spi
);
7733 lck_mtx_unlock(sadb_mutex
);
7734 ipseclog((LOG_DEBUG
, "key_get: no SA found.\n"));
7735 return key_senderror(so
, m
, ENOENT
);
7742 /* map proto to satype */
7743 if ((satype
= key_proto2satype(sah
->saidx
.proto
)) == 0) {
7744 lck_mtx_unlock(sadb_mutex
);
7745 ipseclog((LOG_DEBUG
, "key_get: there was invalid proto in SAD.\n"));
7746 return key_senderror(so
, m
, EINVAL
);
7748 lck_mtx_unlock(sadb_mutex
);
7750 /* create new sadb_msg to reply. */
7751 n
= key_setdumpsa(sav
, SADB_GET
, satype
, mhp
->msg
->sadb_msg_seq
,
7752 mhp
->msg
->sadb_msg_pid
);
7757 return key_senderror(so
, m
, ENOBUFS
);
7761 return key_sendup_mbuf(so
, n
, KEY_SENDUP_ONE
);
7766 * get SA stats by spi.
7767 * OUT: -1 : not found
7768 * 0 : found, arg pointer to a SA stats is updated.
7771 key_getsastatbyspi_one(u_int32_t spi
,
7772 struct sastat
*stat
)
7774 struct secashead
*sah
;
7775 struct secasvar
*sav
= NULL
;
7777 if ((void *)stat
== NULL
) {
7781 lck_mtx_lock(sadb_mutex
);
7783 /* get a SA header */
7784 LIST_FOREACH(sah
, &sahtree
, chain
) {
7785 if (sah
->state
== SADB_SASTATE_DEAD
) {
7789 /* get a SA with SPI. */
7790 sav
= key_getsavbyspi(sah
, spi
);
7792 stat
->spi
= sav
->spi
;
7793 stat
->created
= (u_int32_t
)sav
->created
;
7795 bcopy(sav
->lft_c
, &stat
->lft_c
, sizeof(stat
->lft_c
));
7797 bzero(&stat
->lft_c
, sizeof(stat
->lft_c
));
7799 lck_mtx_unlock(sadb_mutex
);
7804 lck_mtx_unlock(sadb_mutex
);
7810 * get SA stats collection by indices.
7811 * OUT: -1 : not found
7812 * 0 : found, arg pointers to a SA stats and 'maximum stats' are updated.
7815 key_getsastatbyspi(struct sastat
*stat_arg
,
7816 u_int32_t max_stat_arg
,
7817 struct sastat
*stat_res
,
7818 u_int64_t stat_res_size
,
7819 u_int32_t
*max_stat_res
)
7821 u_int32_t cur
, found
= 0;
7823 if (stat_arg
== NULL
||
7825 max_stat_res
== NULL
) {
7829 u_int64_t max_stats
= stat_res_size
/ (sizeof(struct sastat
));
7830 max_stats
= ((max_stat_arg
<= max_stats
) ? max_stat_arg
: max_stats
);
7832 for (cur
= 0; cur
< max_stats
; cur
++) {
7833 if (key_getsastatbyspi_one(stat_arg
[cur
].spi
,
7834 &stat_res
[found
]) == 0) {
7838 *max_stat_res
= found
;
7846 /* XXX make it sysctl-configurable? */
7848 key_getcomb_setlifetime(
7849 struct sadb_comb
*comb
)
7851 comb
->sadb_comb_soft_allocations
= 1;
7852 comb
->sadb_comb_hard_allocations
= 1;
7853 comb
->sadb_comb_soft_bytes
= 0;
7854 comb
->sadb_comb_hard_bytes
= 0;
7855 comb
->sadb_comb_hard_addtime
= 86400; /* 1 day */
7856 comb
->sadb_comb_soft_addtime
= comb
->sadb_comb_soft_addtime
* 80 / 100;
7857 comb
->sadb_comb_soft_usetime
= 28800; /* 8 hours */
7858 comb
->sadb_comb_hard_usetime
= comb
->sadb_comb_hard_usetime
* 80 / 100;
7863 * XXX reorder combinations by preference
7864 * XXX no idea if the user wants ESP authentication or not
7866 static struct mbuf
*
7867 key_getcomb_esp(void)
7869 struct sadb_comb
*comb
;
7870 const struct esp_algorithm
*algo
;
7871 struct mbuf
*result
= NULL
, *m
, *n
;
7876 const int l
= PFKEY_ALIGN8(sizeof(struct sadb_comb
));
7879 for (i
= 1; i
<= SADB_EALG_MAX
; i
++) {
7880 algo
= esp_algorithm_lookup(i
);
7885 if (algo
->keymax
< ipsec_esp_keymin
) {
7888 if (algo
->keymin
< ipsec_esp_keymin
) {
7889 encmin
= (u_int16_t
)ipsec_esp_keymin
;
7891 encmin
= algo
->keymin
;
7894 if (ipsec_esp_auth
) {
7895 m
= key_getcomb_ah();
7899 panic("assumption failed in key_getcomb_esp");
7902 MGET(m
, M_WAITOK
, MT_DATA
);
7907 bzero(mtod(m
, caddr_t
), m
->m_len
);
7915 for (n
= m
; n
; n
= n
->m_next
) {
7920 panic("assumption failed in key_getcomb_esp");
7924 for (off
= 0; off
< totlen
; off
+= l
) {
7925 n
= m_pulldown(m
, off
, l
, &o
);
7927 /* m is already freed */
7930 comb
= (struct sadb_comb
*)
7931 (void *)(mtod(n
, caddr_t
) + o
);
7932 bzero(comb
, sizeof(*comb
));
7933 key_getcomb_setlifetime(comb
);
7934 comb
->sadb_comb_encrypt
= i
;
7935 comb
->sadb_comb_encrypt_minbits
= encmin
;
7936 comb
->sadb_comb_encrypt_maxbits
= algo
->keymax
;
7957 * XXX reorder combinations by preference
7959 static struct mbuf
*
7960 key_getcomb_ah(void)
7962 struct sadb_comb
*comb
;
7963 const struct ah_algorithm
*algo
;
7967 const int l
= PFKEY_ALIGN8(sizeof(struct sadb_comb
));
7970 for (i
= 1; i
<= SADB_AALG_MAX
; i
++) {
7972 /* we prefer HMAC algorithms, not old algorithms */
7973 if (i
!= SADB_AALG_SHA1HMAC
&& i
!= SADB_AALG_MD5HMAC
) {
7977 algo
= ah_algorithm_lookup(i
);
7982 if (algo
->keymax
< ipsec_ah_keymin
) {
7985 if (algo
->keymin
< ipsec_ah_keymin
) {
7986 keymin
= (u_int16_t
)ipsec_ah_keymin
;
7988 keymin
= algo
->keymin
;
7994 panic("assumption failed in key_getcomb_ah");
7997 MGET(m
, M_WAITOK
, MT_DATA
);
8004 M_PREPEND(m
, l
, M_WAITOK
, 1);
8010 comb
= mtod(m
, struct sadb_comb
*);
8011 bzero(comb
, sizeof(*comb
));
8012 key_getcomb_setlifetime(comb
);
8013 comb
->sadb_comb_auth
= i
;
8014 comb
->sadb_comb_auth_minbits
= keymin
;
8015 comb
->sadb_comb_auth_maxbits
= algo
->keymax
;
8022 * XXX no way to pass mode (transport/tunnel) to userland
8023 * XXX replay checking?
8024 * XXX sysctl interface to ipsec_{ah,esp}_keymin
8026 static struct mbuf
*
8028 const struct secasindex
*saidx
)
8030 struct sadb_prop
*prop
;
8032 const int l
= PFKEY_ALIGN8(sizeof(struct sadb_prop
));
8035 switch (saidx
->proto
) {
8038 m
= key_getcomb_esp();
8042 m
= key_getcomb_ah();
8051 M_PREPEND(m
, l
, M_WAITOK
, 1);
8057 for (n
= m
; n
; n
= n
->m_next
) {
8061 prop
= mtod(m
, struct sadb_prop
*);
8062 bzero(prop
, sizeof(*prop
));
8063 VERIFY(totlen
<= UINT16_MAX
);
8064 prop
->sadb_prop_len
= (u_int16_t
)PFKEY_UNIT64(totlen
);
8065 prop
->sadb_prop_exttype
= SADB_EXT_PROPOSAL
;
8066 prop
->sadb_prop_replay
= 32; /* XXX */
8072 * SADB_ACQUIRE processing called by key_checkrequest() and key_acquire2().
8074 * <base, SA, address(SD), (address(P)), x_policy,
8075 * (identity(SD),) (sensitivity,) proposal>
8076 * to KMD, and expect to receive
8077 * <base> with SADB_ACQUIRE if error occurred,
8079 * <base, src address, dst address, (SPI range)> with SADB_GETSPI
8080 * from KMD by PF_KEY.
8082 * XXX x_policy is outside of RFC2367 (KAME extension).
8083 * XXX sensitivity is not supported.
8087 * others: error number
8091 struct secasindex
*saidx
,
8092 struct secpolicy
*sp
)
8094 struct mbuf
*result
= NULL
, *m
;
8095 #ifndef IPSEC_NONBLOCK_ACQUIRE
8096 struct secacq
*newacq
;
8102 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_NOTOWNED
);
8105 if (saidx
== NULL
) {
8106 panic("key_acquire: NULL pointer is passed.\n");
8108 if ((satype
= key_proto2satype(saidx
->proto
)) == 0) {
8109 panic("key_acquire: invalid proto is passed.\n");
8112 #ifndef IPSEC_NONBLOCK_ACQUIRE
8114 * We never do anything about acquirng SA. There is anather
8115 * solution that kernel blocks to send SADB_ACQUIRE message until
8116 * getting something message from IKEd. In later case, to be
8117 * managed with ACQUIRING list.
8119 /* get a entry to check whether sending message or not. */
8120 lck_mtx_lock(sadb_mutex
);
8121 if ((newacq
= key_getacq(saidx
)) != NULL
) {
8122 if (key_blockacq_count
< newacq
->count
) {
8123 /* reset counter and do send message. */
8126 /* increment counter and do nothing. */
8128 lck_mtx_unlock(sadb_mutex
);
8132 /* make new entry for blocking to send SADB_ACQUIRE. */
8133 if ((newacq
= key_newacq(saidx
)) == NULL
) {
8134 lck_mtx_unlock(sadb_mutex
);
8138 /* add to acqtree */
8139 LIST_INSERT_HEAD(&acqtree
, newacq
, chain
);
8140 key_start_timehandler();
8143 lck_mtx_unlock(sadb_mutex
);
8146 seq
= (acq_seq
= (acq_seq
== ~0 ? 1 : ++acq_seq
));
8148 m
= key_setsadbmsg(SADB_ACQUIRE
, 0, satype
, seq
, 0, 0);
8155 /* set sadb_address for saidx's. */
8156 m
= key_setsadbaddr(SADB_EXT_ADDRESS_SRC
,
8157 (struct sockaddr
*)&saidx
->src
, FULLMASK
, IPSEC_ULPROTO_ANY
);
8164 m
= key_setsadbaddr(SADB_EXT_ADDRESS_DST
,
8165 (struct sockaddr
*)&saidx
->dst
, FULLMASK
, IPSEC_ULPROTO_ANY
);
8172 /* XXX proxy address (optional) */
8174 /* set sadb_x_policy */
8176 m
= key_setsadbxpolicy((u_int16_t
)sp
->policy
, sp
->spidx
.dir
, sp
->id
);
8184 /* XXX sensitivity (optional) */
8186 /* create proposal/combination extension */
8187 m
= key_getprop(saidx
);
8189 * outside of spec; make proposal/combination extension optional.
8195 if ((result
->m_flags
& M_PKTHDR
) == 0) {
8200 if (result
->m_len
< sizeof(struct sadb_msg
)) {
8201 result
= m_pullup(result
, sizeof(struct sadb_msg
));
8202 if (result
== NULL
) {
8208 result
->m_pkthdr
.len
= 0;
8209 for (m
= result
; m
; m
= m
->m_next
) {
8210 result
->m_pkthdr
.len
+= m
->m_len
;
8213 VERIFY(PFKEY_UNIT64(result
->m_pkthdr
.len
) <= UINT16_MAX
);
8214 mtod(result
, struct sadb_msg
*)->sadb_msg_len
=
8215 (u_int16_t
)PFKEY_UNIT64(result
->m_pkthdr
.len
);
8217 return key_sendup_mbuf(NULL
, result
, KEY_SENDUP_REGISTERED
);
8226 #ifndef IPSEC_NONBLOCK_ACQUIRE
8227 static struct secacq
*
8229 struct secasindex
*saidx
)
8231 struct secacq
*newacq
;
8235 KMALLOC_NOWAIT(newacq
, struct secacq
*, sizeof(struct secacq
));
8236 if (newacq
== NULL
) {
8237 lck_mtx_unlock(sadb_mutex
);
8238 KMALLOC_WAIT(newacq
, struct secacq
*, sizeof(struct secacq
));
8239 lck_mtx_lock(sadb_mutex
);
8240 if (newacq
== NULL
) {
8241 ipseclog((LOG_DEBUG
, "key_newacq: No more memory.\n"));
8245 bzero(newacq
, sizeof(*newacq
));
8248 bcopy(saidx
, &newacq
->saidx
, sizeof(newacq
->saidx
));
8249 newacq
->seq
= (acq_seq
== ~0 ? 1 : ++acq_seq
);
8251 newacq
->created
= tv
.tv_sec
;
8257 static struct secacq
*
8259 struct secasindex
*saidx
)
8263 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_OWNED
);
8265 LIST_FOREACH(acq
, &acqtree
, chain
) {
8266 if (key_cmpsaidx(saidx
, &acq
->saidx
, CMP_EXACTLY
)) {
8274 static struct secacq
*
8280 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_OWNED
);
8282 LIST_FOREACH(acq
, &acqtree
, chain
) {
8283 if (acq
->seq
== seq
) {
8292 static struct secspacq
*
8294 struct secpolicyindex
*spidx
)
8296 struct secspacq
*acq
;
8300 KMALLOC_NOWAIT(acq
, struct secspacq
*, sizeof(struct secspacq
));
8302 lck_mtx_unlock(sadb_mutex
);
8303 KMALLOC_WAIT(acq
, struct secspacq
*, sizeof(struct secspacq
));
8304 lck_mtx_lock(sadb_mutex
);
8306 ipseclog((LOG_DEBUG
, "key_newspacq: No more memory.\n"));
8310 bzero(acq
, sizeof(*acq
));
8313 bcopy(spidx
, &acq
->spidx
, sizeof(acq
->spidx
));
8315 acq
->created
= tv
.tv_sec
;
8321 static struct secspacq
*
8323 struct secpolicyindex
*spidx
)
8325 struct secspacq
*acq
;
8327 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_OWNED
);
8329 LIST_FOREACH(acq
, &spacqtree
, chain
) {
8330 if (key_cmpspidx_exactly(spidx
, &acq
->spidx
)) {
8339 * SADB_ACQUIRE processing,
8340 * in first situation, is receiving
8342 * from the ikmpd, and clear sequence of its secasvar entry.
8344 * In second situation, is receiving
8345 * <base, address(SD), (address(P),) (identity(SD),) (sensitivity,) proposal>
8346 * from a user land process, and return
8347 * <base, address(SD), (address(P),) (identity(SD),) (sensitivity,) proposal>
8350 * m will always be freed.
8356 const struct sadb_msghdr
*mhp
)
8358 const struct sadb_address
*src0
, *dst0
;
8359 ifnet_t ipsec_if
= NULL
;
8360 struct secasindex saidx
;
8361 struct secashead
*sah
;
8367 if (so
== NULL
|| m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
) {
8368 panic("key_acquire2: NULL pointer is passed.\n");
8372 * Error message from KMd.
8373 * We assume that if error was occurred in IKEd, the length of PFKEY
8374 * message is equal to the size of sadb_msg structure.
8375 * We do not raise error even if error occurred in this function.
8377 lck_mtx_lock(sadb_mutex
);
8379 if (mhp
->msg
->sadb_msg_len
== PFKEY_UNIT64(sizeof(struct sadb_msg
))) {
8380 #ifndef IPSEC_NONBLOCK_ACQUIRE
8384 /* check sequence number */
8385 if (mhp
->msg
->sadb_msg_seq
== 0) {
8386 lck_mtx_unlock(sadb_mutex
);
8387 ipseclog((LOG_DEBUG
, "key_acquire2: must specify sequence number.\n"));
8392 if ((acq
= key_getacqbyseq(mhp
->msg
->sadb_msg_seq
)) == NULL
) {
8394 * the specified larval SA is already gone, or we got
8395 * a bogus sequence number. we can silently ignore it.
8397 lck_mtx_unlock(sadb_mutex
);
8402 /* reset acq counter in order to deletion by timehander. */
8404 acq
->created
= tv
.tv_sec
;
8407 lck_mtx_unlock(sadb_mutex
);
8413 * This message is from user land.
8416 /* map satype to proto */
8417 if ((proto
= key_satype2proto(mhp
->msg
->sadb_msg_satype
)) == 0) {
8418 lck_mtx_unlock(sadb_mutex
);
8419 ipseclog((LOG_DEBUG
, "key_acquire2: invalid satype is passed.\n"));
8420 return key_senderror(so
, m
, EINVAL
);
8423 if (mhp
->ext
[SADB_EXT_ADDRESS_SRC
] == NULL
||
8424 mhp
->ext
[SADB_EXT_ADDRESS_DST
] == NULL
||
8425 mhp
->ext
[SADB_EXT_PROPOSAL
] == NULL
) {
8427 lck_mtx_unlock(sadb_mutex
);
8428 ipseclog((LOG_DEBUG
, "key_acquire2: invalid message is passed.\n"));
8429 return key_senderror(so
, m
, EINVAL
);
8431 if (mhp
->extlen
[SADB_EXT_ADDRESS_SRC
] < sizeof(struct sadb_address
) ||
8432 mhp
->extlen
[SADB_EXT_ADDRESS_DST
] < sizeof(struct sadb_address
) ||
8433 mhp
->extlen
[SADB_EXT_PROPOSAL
] < sizeof(struct sadb_prop
)) {
8435 lck_mtx_unlock(sadb_mutex
);
8436 ipseclog((LOG_DEBUG
, "key_acquire2: invalid message is passed.\n"));
8437 return key_senderror(so
, m
, EINVAL
);
8440 src0
= (const struct sadb_address
*)mhp
->ext
[SADB_EXT_ADDRESS_SRC
];
8441 dst0
= (const struct sadb_address
*)mhp
->ext
[SADB_EXT_ADDRESS_DST
];
8442 ipsec_if
= key_get_ipsec_if_from_message(mhp
, SADB_X_EXT_IPSECIF
);
8444 u_int ipsec_if_index
= 0;
8445 if (ipsec_if
!= NULL
) {
8446 ipsec_if_index
= ipsec_if
->if_index
;
8447 ifnet_release(ipsec_if
);
8451 /* XXX boundary check against sa_len */
8453 KEY_SETSECASIDX(proto
, IPSEC_MODE_ANY
, 0, src0
+ 1, dst0
+ 1, ipsec_if_index
, &saidx
);
8455 /* get a SA index */
8456 LIST_FOREACH(sah
, &sahtree
, chain
) {
8457 if (sah
->state
== SADB_SASTATE_DEAD
) {
8460 if (key_cmpsaidx(&sah
->saidx
, &saidx
, CMP_MODE
| CMP_REQID
)) {
8465 lck_mtx_unlock(sadb_mutex
);
8466 ipseclog((LOG_DEBUG
, "key_acquire2: a SA exists already.\n"));
8467 return key_senderror(so
, m
, EEXIST
);
8469 lck_mtx_unlock(sadb_mutex
);
8470 error
= key_acquire(&saidx
, NULL
);
8472 ipseclog((LOG_DEBUG
, "key_acquire2: error %d returned "
8473 "from key_acquire.\n", mhp
->msg
->sadb_msg_errno
));
8474 return key_senderror(so
, m
, error
);
8477 return key_sendup_mbuf(so
, m
, KEY_SENDUP_REGISTERED
);
8481 * SADB_REGISTER processing.
8482 * If SATYPE_UNSPEC has been passed as satype, only return sadb_supported.
8485 * from the ikmpd, and register a socket to send PF_KEY messages,
8489 * If socket is detached, must free from regnode.
8491 * m will always be freed.
8497 const struct sadb_msghdr
*mhp
)
8499 struct secreg
*reg
, *newreg
= 0;
8502 if (so
== NULL
|| m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
) {
8503 panic("key_register: NULL pointer is passed.\n");
8506 /* check for invalid register message */
8507 if (mhp
->msg
->sadb_msg_satype
>= sizeof(regtree
) / sizeof(regtree
[0])) {
8508 return key_senderror(so
, m
, EINVAL
);
8511 /* When SATYPE_UNSPEC is specified, only return sadb_supported. */
8512 if (mhp
->msg
->sadb_msg_satype
== SADB_SATYPE_UNSPEC
) {
8516 /* create regnode */
8517 KMALLOC_WAIT(newreg
, struct secreg
*, sizeof(*newreg
));
8518 if (newreg
== NULL
) {
8519 ipseclog((LOG_DEBUG
, "key_register: No more memory.\n"));
8520 return key_senderror(so
, m
, ENOBUFS
);
8522 bzero((caddr_t
)newreg
, sizeof(*newreg
));
8524 lck_mtx_lock(sadb_mutex
);
8525 /* check whether existing or not */
8526 LIST_FOREACH(reg
, ®tree
[mhp
->msg
->sadb_msg_satype
], chain
) {
8527 if (reg
->so
== so
) {
8528 lck_mtx_unlock(sadb_mutex
);
8529 ipseclog((LOG_DEBUG
, "key_register: socket exists already.\n"));
8531 return key_senderror(so
, m
, EEXIST
);
8537 ((struct keycb
*)sotorawcb(so
))->kp_registered
++;
8538 socket_unlock(so
, 1);
8540 /* add regnode to regtree. */
8541 LIST_INSERT_HEAD(®tree
[mhp
->msg
->sadb_msg_satype
], newreg
, chain
);
8542 lck_mtx_unlock(sadb_mutex
);
8546 struct sadb_msg
*newmsg
;
8547 struct sadb_supported
*sup
;
8548 u_int16_t len
, alen
, elen
;
8551 struct sadb_alg
*alg
;
8553 /* create new sadb_msg to reply. */
8555 for (i
= 1; i
<= SADB_AALG_MAX
; i
++) {
8556 if (ah_algorithm_lookup(i
)) {
8557 alen
+= sizeof(struct sadb_alg
);
8561 alen
+= sizeof(struct sadb_supported
);
8565 for (i
= 1; i
<= SADB_EALG_MAX
; i
++) {
8566 if (esp_algorithm_lookup(i
)) {
8567 elen
+= sizeof(struct sadb_alg
);
8571 elen
+= sizeof(struct sadb_supported
);
8575 len
= sizeof(struct sadb_msg
) + alen
+ elen
;
8577 if (len
> MCLBYTES
) {
8578 return key_senderror(so
, m
, ENOBUFS
);
8581 MGETHDR(n
, M_WAITOK
, MT_DATA
);
8582 if (n
&& len
> MHLEN
) {
8583 MCLGET(n
, M_WAITOK
);
8584 if ((n
->m_flags
& M_EXT
) == 0) {
8590 return key_senderror(so
, m
, ENOBUFS
);
8593 n
->m_pkthdr
.len
= n
->m_len
= len
;
8597 m_copydata(m
, 0, sizeof(struct sadb_msg
), mtod(n
, caddr_t
) + off
);
8598 newmsg
= mtod(n
, struct sadb_msg
*);
8599 newmsg
->sadb_msg_errno
= 0;
8600 VERIFY(PFKEY_UNIT64(len
) <= UINT16_MAX
);
8601 newmsg
->sadb_msg_len
= (u_int16_t
)PFKEY_UNIT64(len
);
8602 off
+= PFKEY_ALIGN8(sizeof(struct sadb_msg
));
8604 /* for authentication algorithm */
8606 sup
= (struct sadb_supported
*)(void *)(mtod(n
, caddr_t
) + off
);
8607 sup
->sadb_supported_len
= (u_int16_t
)PFKEY_UNIT64(alen
);
8608 sup
->sadb_supported_exttype
= SADB_EXT_SUPPORTED_AUTH
;
8609 off
+= PFKEY_ALIGN8(sizeof(*sup
));
8611 for (i
= 1; i
<= SADB_AALG_MAX
; i
++) {
8612 const struct ah_algorithm
*aalgo
;
8614 aalgo
= ah_algorithm_lookup(i
);
8618 alg
= (struct sadb_alg
*)
8619 (void *)(mtod(n
, caddr_t
) + off
);
8620 alg
->sadb_alg_id
= i
;
8621 alg
->sadb_alg_ivlen
= 0;
8622 alg
->sadb_alg_minbits
= aalgo
->keymin
;
8623 alg
->sadb_alg_maxbits
= aalgo
->keymax
;
8624 off
+= PFKEY_ALIGN8(sizeof(*alg
));
8629 /* for encryption algorithm */
8631 sup
= (struct sadb_supported
*)(void *)(mtod(n
, caddr_t
) + off
);
8632 sup
->sadb_supported_len
= PFKEY_UNIT64(elen
);
8633 sup
->sadb_supported_exttype
= SADB_EXT_SUPPORTED_ENCRYPT
;
8634 off
+= PFKEY_ALIGN8(sizeof(*sup
));
8636 for (i
= 1; i
<= SADB_EALG_MAX
; i
++) {
8637 const struct esp_algorithm
*ealgo
;
8639 ealgo
= esp_algorithm_lookup(i
);
8643 alg
= (struct sadb_alg
*)
8644 (void *)(mtod(n
, caddr_t
) + off
);
8645 alg
->sadb_alg_id
= i
;
8646 if (ealgo
&& ealgo
->ivlen
) {
8648 * give NULL to get the value preferred by
8649 * algorithm XXX SADB_X_EXT_DERIV ?
8651 VERIFY((*ealgo
->ivlen
)(ealgo
, NULL
) <= UINT8_MAX
);
8652 alg
->sadb_alg_ivlen
=
8653 (u_int8_t
)((*ealgo
->ivlen
)(ealgo
, NULL
));
8655 alg
->sadb_alg_ivlen
= 0;
8657 alg
->sadb_alg_minbits
= ealgo
->keymin
;
8658 alg
->sadb_alg_maxbits
= ealgo
->keymax
;
8659 off
+= PFKEY_ALIGN8(sizeof(struct sadb_alg
));
8666 panic("length assumption failed in key_register");
8671 return key_sendup_mbuf(so
, n
, KEY_SENDUP_REGISTERED
);
8676 key_delete_all_for_socket(struct socket
*so
)
8678 struct secashead
*sah
, *nextsah
;
8679 struct secasvar
*sav
, *nextsav
;
8683 for (sah
= LIST_FIRST(&sahtree
);
8686 nextsah
= LIST_NEXT(sah
, chain
);
8687 for (stateidx
= 0; stateidx
< _ARRAYLEN(saorder_state_alive
); stateidx
++) {
8688 state
= saorder_state_any
[stateidx
];
8689 for (sav
= LIST_FIRST(&sah
->savtree
[state
]); sav
!= NULL
; sav
= nextsav
) {
8690 nextsav
= LIST_NEXT(sav
, chain
);
8691 if (sav
->flags2
& SADB_X_EXT_SA2_DELETE_ON_DETACH
&&
8693 key_sa_chgstate(sav
, SADB_SASTATE_DEAD
);
8694 key_freesav(sav
, KEY_SADB_LOCKED
);
8702 * free secreg entry registered.
8703 * XXX: I want to do free a socket marked done SADB_RESIGER to socket.
8714 panic("key_freereg: NULL pointer is passed.\n");
8718 * check whether existing or not.
8719 * check all type of SA, because there is a potential that
8720 * one socket is registered to multiple type of SA.
8722 lck_mtx_lock(sadb_mutex
);
8723 key_delete_all_for_socket(so
);
8724 for (i
= 0; i
<= SADB_SATYPE_MAX
; i
++) {
8725 LIST_FOREACH(reg
, ®tree
[i
], chain
) {
8727 && __LIST_CHAINED(reg
)) {
8728 LIST_REMOVE(reg
, chain
);
8734 lck_mtx_unlock(sadb_mutex
);
8739 * SADB_EXPIRE processing
8741 * <base, SA, SA2, lifetime(C and one of HS), address(SD)>
8743 * NOTE: We send only soft lifetime extension.
8746 * others : error number
8750 struct secasvar
*sav
)
8753 struct mbuf
*result
= NULL
, *m
;
8756 struct sadb_lifetime
*lt
;
8758 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_NOTOWNED
);
8762 panic("key_expire: NULL pointer is passed.\n");
8764 if (sav
->sah
== NULL
) {
8765 panic("key_expire: Why was SA index in SA NULL.\n");
8767 if ((satype
= key_proto2satype(sav
->sah
->saidx
.proto
)) == 0) {
8768 panic("key_expire: invalid proto is passed.\n");
8771 /* set msg header */
8772 m
= key_setsadbmsg(SADB_EXPIRE
, 0, satype
, sav
->seq
, 0, (u_int16_t
)sav
->refcnt
);
8779 /* create SA extension */
8780 m
= key_setsadbsa(sav
);
8787 /* create SA extension */
8788 m
= key_setsadbxsa2(sav
->sah
->saidx
.mode
,
8789 sav
->replay
[0] ? sav
->replay
[0]->count
: 0,
8790 sav
->sah
->saidx
.reqid
,
8798 /* create lifetime extension (current and soft) */
8799 len
= PFKEY_ALIGN8(sizeof(*lt
)) * 2;
8800 m
= key_alloc_mbuf(len
);
8801 if (!m
|| m
->m_next
) { /*XXX*/
8808 bzero(mtod(m
, caddr_t
), len
);
8809 lt
= mtod(m
, struct sadb_lifetime
*);
8810 lt
->sadb_lifetime_len
= PFKEY_UNIT64(sizeof(struct sadb_lifetime
));
8811 lt
->sadb_lifetime_exttype
= SADB_EXT_LIFETIME_CURRENT
;
8812 lt
->sadb_lifetime_allocations
= sav
->lft_c
->sadb_lifetime_allocations
;
8813 lt
->sadb_lifetime_bytes
= sav
->lft_c
->sadb_lifetime_bytes
;
8814 lt
->sadb_lifetime_addtime
= sav
->lft_c
->sadb_lifetime_addtime
;
8815 lt
->sadb_lifetime_usetime
= sav
->lft_c
->sadb_lifetime_usetime
;
8816 lt
= (struct sadb_lifetime
*)(void *)(mtod(m
, caddr_t
) + len
/ 2);
8817 bcopy(sav
->lft_s
, lt
, sizeof(*lt
));
8820 /* set sadb_address for source */
8821 m
= key_setsadbaddr(SADB_EXT_ADDRESS_SRC
,
8822 (struct sockaddr
*)&sav
->sah
->saidx
.src
,
8823 FULLMASK
, IPSEC_ULPROTO_ANY
);
8830 /* set sadb_address for destination */
8831 m
= key_setsadbaddr(SADB_EXT_ADDRESS_DST
,
8832 (struct sockaddr
*)&sav
->sah
->saidx
.dst
,
8833 FULLMASK
, IPSEC_ULPROTO_ANY
);
8840 if ((result
->m_flags
& M_PKTHDR
) == 0) {
8845 if (result
->m_len
< sizeof(struct sadb_msg
)) {
8846 result
= m_pullup(result
, sizeof(struct sadb_msg
));
8847 if (result
== NULL
) {
8853 result
->m_pkthdr
.len
= 0;
8854 for (m
= result
; m
; m
= m
->m_next
) {
8855 result
->m_pkthdr
.len
+= m
->m_len
;
8858 VERIFY(PFKEY_UNIT64(result
->m_pkthdr
.len
) <= UINT16_MAX
);
8859 mtod(result
, struct sadb_msg
*)->sadb_msg_len
=
8860 (u_int16_t
)PFKEY_UNIT64(result
->m_pkthdr
.len
);
8862 return key_sendup_mbuf(NULL
, result
, KEY_SENDUP_REGISTERED
);
8872 * SADB_FLUSH processing
8875 * from the ikmpd, and free all entries in secastree.
8879 * NOTE: to do is only marking SADB_SASTATE_DEAD.
8881 * m will always be freed.
8887 const struct sadb_msghdr
*mhp
)
8889 struct sadb_msg
*newmsg
;
8890 struct secashead
*sah
, *nextsah
;
8891 struct secasvar
*sav
, *nextsav
;
8897 if (so
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
) {
8898 panic("key_flush: NULL pointer is passed.\n");
8901 /* map satype to proto */
8902 if ((proto
= key_satype2proto(mhp
->msg
->sadb_msg_satype
)) == 0) {
8903 ipseclog((LOG_DEBUG
, "key_flush: invalid satype is passed.\n"));
8904 return key_senderror(so
, m
, EINVAL
);
8907 lck_mtx_lock(sadb_mutex
);
8909 /* no SATYPE specified, i.e. flushing all SA. */
8910 for (sah
= LIST_FIRST(&sahtree
);
8913 nextsah
= LIST_NEXT(sah
, chain
);
8915 if (mhp
->msg
->sadb_msg_satype
!= SADB_SATYPE_UNSPEC
8916 && proto
!= sah
->saidx
.proto
) {
8921 stateidx
< _ARRAYLEN(saorder_state_alive
);
8923 state
= saorder_state_any
[stateidx
];
8924 for (sav
= LIST_FIRST(&sah
->savtree
[state
]);
8927 nextsav
= LIST_NEXT(sav
, chain
);
8929 key_sa_chgstate(sav
, SADB_SASTATE_DEAD
);
8930 key_freesav(sav
, KEY_SADB_LOCKED
);
8934 sah
->state
= SADB_SASTATE_DEAD
;
8936 lck_mtx_unlock(sadb_mutex
);
8938 if (m
->m_len
< sizeof(struct sadb_msg
) ||
8939 sizeof(struct sadb_msg
) > m
->m_len
+ M_TRAILINGSPACE(m
)) {
8940 ipseclog((LOG_DEBUG
, "key_flush: No more memory.\n"));
8941 return key_senderror(so
, m
, ENOBUFS
);
8948 m
->m_pkthdr
.len
= m
->m_len
= sizeof(struct sadb_msg
);
8949 newmsg
= mtod(m
, struct sadb_msg
*);
8950 newmsg
->sadb_msg_errno
= 0;
8951 VERIFY(PFKEY_UNIT64(m
->m_pkthdr
.len
) <= UINT16_MAX
);
8952 newmsg
->sadb_msg_len
= (uint16_t)PFKEY_UNIT64(m
->m_pkthdr
.len
);
8954 return key_sendup_mbuf(so
, m
, KEY_SENDUP_ALL
);
8958 * SADB_DUMP processing
8959 * dump all entries including status of DEAD in SAD.
8962 * from the ikmpd, and dump all secasvar leaves
8967 * m will always be freed.
8970 struct sav_dump_elem
{
8971 struct secasvar
*sav
;
8979 const struct sadb_msghdr
*mhp
)
8981 struct secashead
*sah
;
8982 struct secasvar
*sav
;
8983 struct sav_dump_elem
*savbuf
= NULL
, *elem_ptr
;
8984 size_t total_req_size
= 0;
8985 u_int32_t bufcount
= 0, cnt
= 0, cnt2
= 0;
8993 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_NOTOWNED
);
8996 if (so
== NULL
|| m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
) {
8997 panic("key_dump: NULL pointer is passed.\n");
9000 /* map satype to proto */
9001 if ((proto
= key_satype2proto(mhp
->msg
->sadb_msg_satype
)) == 0) {
9002 ipseclog((LOG_DEBUG
, "key_dump: invalid satype is passed.\n"));
9003 return key_senderror(so
, m
, EINVAL
);
9006 if ((bufcount
= ipsec_sav_count
) == 0) {
9011 if (os_add_overflow(bufcount
, 512, &bufcount
)) {
9012 ipseclog((LOG_DEBUG
, "key_dump: bufcount overflow, ipsec sa count %u.\n", ipsec_sav_count
));
9013 bufcount
= ipsec_sav_count
;
9016 if (os_mul_overflow(bufcount
, sizeof(struct sav_dump_elem
), &total_req_size
)) {
9017 panic("key_dump savbuf requested memory overflow %u\n", bufcount
);
9020 KMALLOC_WAIT(savbuf
, struct sav_dump_elem
*, total_req_size
);
9021 if (savbuf
== NULL
) {
9022 ipseclog((LOG_DEBUG
, "key_dump: No more memory.\n"));
9027 /* count sav entries to be sent to the userland. */
9028 lck_mtx_lock(sadb_mutex
);
9030 LIST_FOREACH(sah
, &sahtree
, chain
) {
9031 if (mhp
->msg
->sadb_msg_satype
!= SADB_SATYPE_UNSPEC
9032 && proto
!= sah
->saidx
.proto
) {
9036 /* map proto to satype */
9037 if ((satype
= key_proto2satype(sah
->saidx
.proto
)) == 0) {
9038 lck_mtx_unlock(sadb_mutex
);
9039 ipseclog((LOG_DEBUG
, "key_dump: there was invalid proto in SAD.\n"));
9045 stateidx
< _ARRAYLEN(saorder_state_any
);
9047 state
= saorder_state_any
[stateidx
];
9048 LIST_FOREACH(sav
, &sah
->savtree
[state
], chain
) {
9049 if (cnt
== bufcount
) {
9050 break; /* out of buffer space */
9052 elem_ptr
->sav
= sav
;
9053 elem_ptr
->satype
= satype
;
9060 lck_mtx_unlock(sadb_mutex
);
9067 /* send this to the userland, one at a time. */
9071 n
= key_setdumpsa(elem_ptr
->sav
, SADB_DUMP
, elem_ptr
->satype
,
9072 --cnt2
, mhp
->msg
->sadb_msg_pid
);
9079 key_sendup_mbuf(so
, n
, KEY_SENDUP_ONE
);
9087 lck_mtx_lock(sadb_mutex
);
9089 key_freesav((elem_ptr
++)->sav
, KEY_SADB_LOCKED
);
9091 lck_mtx_unlock(sadb_mutex
);
9097 return key_senderror(so
, m
, error
);
9105 * SADB_X_PROMISC processing
9107 * m will always be freed.
9113 const struct sadb_msghdr
*mhp
)
9118 if (so
== NULL
|| m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
) {
9119 panic("key_promisc: NULL pointer is passed.\n");
9122 olen
= PFKEY_UNUNIT64(mhp
->msg
->sadb_msg_len
);
9124 if (olen
< sizeof(struct sadb_msg
)) {
9126 return key_senderror(so
, m
, EINVAL
);
9131 } else if (olen
== sizeof(struct sadb_msg
)) {
9132 /* enable/disable promisc mode */
9136 if ((kp
= (struct keycb
*)sotorawcb(so
)) == NULL
) {
9137 return key_senderror(so
, m
, EINVAL
);
9139 mhp
->msg
->sadb_msg_errno
= 0;
9140 switch (mhp
->msg
->sadb_msg_satype
) {
9143 kp
->kp_promisc
= mhp
->msg
->sadb_msg_satype
;
9146 socket_unlock(so
, 1);
9147 return key_senderror(so
, m
, EINVAL
);
9149 socket_unlock(so
, 1);
9151 /* send the original message back to everyone */
9152 mhp
->msg
->sadb_msg_errno
= 0;
9153 return key_sendup_mbuf(so
, m
, KEY_SENDUP_ALL
);
9155 /* send packet as is */
9157 m_adj(m
, PFKEY_ALIGN8(sizeof(struct sadb_msg
)));
9159 /* TODO: if sadb_msg_seq is specified, send to specific pid */
9160 return key_sendup_mbuf(so
, m
, KEY_SENDUP_ALL
);
9164 static int(*const key_typesw
[])(struct socket
*, struct mbuf
*,
9165 const struct sadb_msghdr
*) = {
9166 NULL
, /* SADB_RESERVED */
9167 key_getspi
, /* SADB_GETSPI */
9168 key_update
, /* SADB_UPDATE */
9169 key_add
, /* SADB_ADD */
9170 key_delete
, /* SADB_DELETE */
9171 key_get
, /* SADB_GET */
9172 key_acquire2
, /* SADB_ACQUIRE */
9173 key_register
, /* SADB_REGISTER */
9174 NULL
, /* SADB_EXPIRE */
9175 key_flush
, /* SADB_FLUSH */
9176 key_dump
, /* SADB_DUMP */
9177 key_promisc
, /* SADB_X_PROMISC */
9178 NULL
, /* SADB_X_PCHANGE */
9179 key_spdadd
, /* SADB_X_SPDUPDATE */
9180 key_spdadd
, /* SADB_X_SPDADD */
9181 key_spddelete
, /* SADB_X_SPDDELETE */
9182 key_spdget
, /* SADB_X_SPDGET */
9183 NULL
, /* SADB_X_SPDACQUIRE */
9184 key_spddump
, /* SADB_X_SPDDUMP */
9185 key_spdflush
, /* SADB_X_SPDFLUSH */
9186 key_spdadd
, /* SADB_X_SPDSETIDX */
9187 NULL
, /* SADB_X_SPDEXPIRE */
9188 key_spddelete2
, /* SADB_X_SPDDELETE2 */
9189 key_getsastat
, /* SADB_GETSASTAT */
9190 key_spdenable
, /* SADB_X_SPDENABLE */
9191 key_spddisable
, /* SADB_X_SPDDISABLE */
9192 key_migrate
, /* SADB_MIGRATE */
9196 bzero_mbuf(struct mbuf
*m
)
9198 struct mbuf
*mptr
= m
;
9199 struct sadb_msg
*msg
= NULL
;
9206 if (mptr
->m_len
>= sizeof(struct sadb_msg
)) {
9207 msg
= mtod(mptr
, struct sadb_msg
*);
9208 if (msg
->sadb_msg_type
!= SADB_ADD
&&
9209 msg
->sadb_msg_type
!= SADB_UPDATE
) {
9212 offset
= sizeof(struct sadb_msg
);
9214 bzero(mptr
->m_data
+ offset
, mptr
->m_len
- offset
);
9215 mptr
= mptr
->m_next
;
9216 while (mptr
!= NULL
) {
9217 bzero(mptr
->m_data
, mptr
->m_len
);
9218 mptr
= mptr
->m_next
;
9223 bzero_keys(const struct sadb_msghdr
*mh
)
9231 offset
= sizeof(struct sadb_key
);
9233 if (mh
->ext
[SADB_EXT_KEY_ENCRYPT
]) {
9234 struct sadb_key
*key
= (struct sadb_key
*)mh
->ext
[SADB_EXT_KEY_ENCRYPT
];
9235 extlen
= key
->sadb_key_bits
>> 3;
9237 if (mh
->extlen
[SADB_EXT_KEY_ENCRYPT
] >= offset
+ extlen
) {
9238 bzero((uint8_t *)mh
->ext
[SADB_EXT_KEY_ENCRYPT
] + offset
, extlen
);
9240 bzero(mh
->ext
[SADB_EXT_KEY_ENCRYPT
], mh
->extlen
[SADB_EXT_KEY_ENCRYPT
]);
9243 if (mh
->ext
[SADB_EXT_KEY_AUTH
]) {
9244 struct sadb_key
*key
= (struct sadb_key
*)mh
->ext
[SADB_EXT_KEY_AUTH
];
9245 extlen
= key
->sadb_key_bits
>> 3;
9247 if (mh
->extlen
[SADB_EXT_KEY_AUTH
] >= offset
+ extlen
) {
9248 bzero((uint8_t *)mh
->ext
[SADB_EXT_KEY_AUTH
] + offset
, extlen
);
9250 bzero(mh
->ext
[SADB_EXT_KEY_AUTH
], mh
->extlen
[SADB_EXT_KEY_AUTH
]);
9256 key_validate_address_pair(struct sadb_address
*src0
,
9257 struct sadb_address
*dst0
)
9261 /* check upper layer protocol */
9262 if (src0
->sadb_address_proto
!= dst0
->sadb_address_proto
) {
9263 ipseclog((LOG_DEBUG
, "key_parse: upper layer protocol mismatched.\n"));
9264 PFKEY_STAT_INCREMENT(pfkeystat
.out_invaddr
);
9269 if (PFKEY_ADDR_SADDR(src0
)->sa_family
!=
9270 PFKEY_ADDR_SADDR(dst0
)->sa_family
) {
9271 ipseclog((LOG_DEBUG
, "key_parse: address family mismatched.\n"));
9272 PFKEY_STAT_INCREMENT(pfkeystat
.out_invaddr
);
9275 if (PFKEY_ADDR_SADDR(src0
)->sa_len
!=
9276 PFKEY_ADDR_SADDR(dst0
)->sa_len
) {
9277 ipseclog((LOG_DEBUG
,
9278 "key_parse: address struct size mismatched.\n"));
9279 PFKEY_STAT_INCREMENT(pfkeystat
.out_invaddr
);
9283 switch (PFKEY_ADDR_SADDR(src0
)->sa_family
) {
9285 if (PFKEY_ADDR_SADDR(src0
)->sa_len
!= sizeof(struct sockaddr_in
)) {
9286 PFKEY_STAT_INCREMENT(pfkeystat
.out_invaddr
);
9291 if (PFKEY_ADDR_SADDR(src0
)->sa_len
!= sizeof(struct sockaddr_in6
)) {
9292 PFKEY_STAT_INCREMENT(pfkeystat
.out_invaddr
);
9297 ipseclog((LOG_DEBUG
,
9298 "key_parse: unsupported address family.\n"));
9299 PFKEY_STAT_INCREMENT(pfkeystat
.out_invaddr
);
9300 return EAFNOSUPPORT
;
9303 switch (PFKEY_ADDR_SADDR(src0
)->sa_family
) {
9305 plen
= sizeof(struct in_addr
) << 3;
9308 plen
= sizeof(struct in6_addr
) << 3;
9311 plen
= 0; /*fool gcc*/
9315 /* check max prefix length */
9316 if (src0
->sadb_address_prefixlen
> plen
||
9317 dst0
->sadb_address_prefixlen
> plen
) {
9318 ipseclog((LOG_DEBUG
,
9319 "key_parse: illegal prefixlen.\n"));
9320 PFKEY_STAT_INCREMENT(pfkeystat
.out_invaddr
);
9325 * prefixlen == 0 is valid because there can be a case when
9326 * all addresses are matched.
9332 * parse sadb_msg buffer to process PFKEYv2,
9333 * and create a data to response if needed.
9334 * I think to be dealed with mbuf directly.
9336 * msgp : pointer to pointer to a received buffer pulluped.
9337 * This is rewrited to response.
9338 * so : pointer to socket.
9340 * length for buffer to send to user process.
9347 struct sadb_msg
*msg
;
9348 struct sadb_msghdr mh
;
9352 Boolean keyAligned
= FALSE
;
9354 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_NOTOWNED
);
9357 if (m
== NULL
|| so
== NULL
) {
9358 panic("key_parse: NULL pointer is passed.\n");
9361 #if 0 /*kdebug_sadb assumes msg in linear buffer*/
9362 KEYDEBUG(KEYDEBUG_KEY_DUMP
,
9363 ipseclog((LOG_DEBUG
, "key_parse: passed sadb_msg\n"));
9367 if (m
->m_len
< sizeof(struct sadb_msg
)) {
9368 m
= m_pullup(m
, sizeof(struct sadb_msg
));
9373 msg
= mtod(m
, struct sadb_msg
*);
9374 orglen
= PFKEY_UNUNIT64(msg
->sadb_msg_len
);
9375 target
= KEY_SENDUP_ONE
;
9377 if ((m
->m_flags
& M_PKTHDR
) == 0 ||
9378 m
->m_pkthdr
.len
!= orglen
) {
9379 ipseclog((LOG_DEBUG
, "key_parse: invalid message length.\n"));
9380 PFKEY_STAT_INCREMENT(pfkeystat
.out_invlen
);
9385 if (msg
->sadb_msg_version
!= PF_KEY_V2
) {
9386 ipseclog((LOG_DEBUG
,
9387 "key_parse: PF_KEY version %u is mismatched.\n",
9388 msg
->sadb_msg_version
));
9389 PFKEY_STAT_INCREMENT(pfkeystat
.out_invver
);
9394 if (msg
->sadb_msg_type
> SADB_MAX
) {
9395 ipseclog((LOG_DEBUG
, "key_parse: invalid type %u is passed.\n",
9396 msg
->sadb_msg_type
));
9397 PFKEY_STAT_INCREMENT(pfkeystat
.out_invmsgtype
);
9402 /* for old-fashioned code - should be nuked */
9403 if (m
->m_pkthdr
.len
> MCLBYTES
) {
9410 MGETHDR(n
, M_WAITOK
, MT_DATA
);
9411 if (n
&& m
->m_pkthdr
.len
> MHLEN
) {
9412 MCLGET(n
, M_WAITOK
);
9413 if ((n
->m_flags
& M_EXT
) == 0) {
9423 m_copydata(m
, 0, m
->m_pkthdr
.len
, mtod(n
, caddr_t
));
9424 n
->m_pkthdr
.len
= n
->m_len
= m
->m_pkthdr
.len
;
9431 /* align the mbuf chain so that extensions are in contiguous region. */
9432 error
= key_align(m
, &mh
);
9437 if (m
->m_next
) { /*XXX*/
9447 switch (msg
->sadb_msg_satype
) {
9448 case SADB_SATYPE_UNSPEC
:
9449 switch (msg
->sadb_msg_type
) {
9457 ipseclog((LOG_DEBUG
, "key_parse: must specify satype "
9458 "when msg type=%u.\n", msg
->sadb_msg_type
));
9459 PFKEY_STAT_INCREMENT(pfkeystat
.out_invsatype
);
9464 case SADB_SATYPE_AH
:
9465 case SADB_SATYPE_ESP
:
9466 switch (msg
->sadb_msg_type
) {
9468 case SADB_X_SPDDELETE
:
9470 case SADB_X_SPDDUMP
:
9471 case SADB_X_SPDFLUSH
:
9472 case SADB_X_SPDSETIDX
:
9473 case SADB_X_SPDUPDATE
:
9474 case SADB_X_SPDDELETE2
:
9475 case SADB_X_SPDENABLE
:
9476 case SADB_X_SPDDISABLE
:
9477 ipseclog((LOG_DEBUG
, "key_parse: illegal satype=%u\n",
9478 msg
->sadb_msg_type
));
9479 PFKEY_STAT_INCREMENT(pfkeystat
.out_invsatype
);
9484 case SADB_SATYPE_RSVP
:
9485 case SADB_SATYPE_OSPFV2
:
9486 case SADB_SATYPE_RIPV2
:
9487 case SADB_SATYPE_MIP
:
9488 ipseclog((LOG_DEBUG
, "key_parse: type %u isn't supported.\n",
9489 msg
->sadb_msg_satype
));
9490 PFKEY_STAT_INCREMENT(pfkeystat
.out_invsatype
);
9493 case 1: /* XXX: What does it do? */
9494 if (msg
->sadb_msg_type
== SADB_X_PROMISC
) {
9499 ipseclog((LOG_DEBUG
, "key_parse: invalid type %u is passed.\n",
9500 msg
->sadb_msg_satype
));
9501 PFKEY_STAT_INCREMENT(pfkeystat
.out_invsatype
);
9506 /* Validate address fields for matching families, lengths, etc. */
9507 void *src0
= mh
.ext
[SADB_EXT_ADDRESS_SRC
];
9508 void *dst0
= mh
.ext
[SADB_EXT_ADDRESS_DST
];
9509 if (mh
.ext
[SADB_X_EXT_ADDR_RANGE_SRC_START
] != NULL
&&
9510 mh
.ext
[SADB_X_EXT_ADDR_RANGE_SRC_END
] != NULL
) {
9511 error
= key_validate_address_pair((struct sadb_address
*)(mh
.ext
[SADB_X_EXT_ADDR_RANGE_SRC_START
]),
9512 (struct sadb_address
*)(mh
.ext
[SADB_X_EXT_ADDR_RANGE_SRC_END
]));
9518 src0
= mh
.ext
[SADB_X_EXT_ADDR_RANGE_SRC_START
];
9521 if (mh
.ext
[SADB_X_EXT_ADDR_RANGE_DST_START
] != NULL
&&
9522 mh
.ext
[SADB_X_EXT_ADDR_RANGE_DST_END
] != NULL
) {
9523 error
= key_validate_address_pair((struct sadb_address
*)(mh
.ext
[SADB_X_EXT_ADDR_RANGE_DST_START
]),
9524 (struct sadb_address
*)(mh
.ext
[SADB_X_EXT_ADDR_RANGE_DST_END
]));
9530 dst0
= mh
.ext
[SADB_X_EXT_ADDR_RANGE_DST_START
];
9533 if (src0
!= NULL
&& dst0
!= NULL
) {
9534 error
= key_validate_address_pair((struct sadb_address
*)(src0
),
9535 (struct sadb_address
*)(dst0
));
9541 void *migrate_src
= mh
.ext
[SADB_EXT_MIGRATE_ADDRESS_SRC
];
9542 void *migrate_dst
= mh
.ext
[SADB_EXT_MIGRATE_ADDRESS_DST
];
9543 if (migrate_src
!= NULL
&& migrate_dst
!= NULL
) {
9544 error
= key_validate_address_pair((struct sadb_address
*)(migrate_src
),
9545 (struct sadb_address
*)(migrate_dst
));
9551 if (msg
->sadb_msg_type
>= sizeof(key_typesw
) / sizeof(key_typesw
[0]) ||
9552 key_typesw
[msg
->sadb_msg_type
] == NULL
) {
9553 PFKEY_STAT_INCREMENT(pfkeystat
.out_invmsgtype
);
9558 error
= (*key_typesw
[msg
->sadb_msg_type
])(so
, m
, &mh
);
9568 msg
->sadb_msg_errno
= (u_int8_t
)error
;
9569 return key_sendup_mbuf(so
, m
, target
);
9578 struct sadb_msg
*msg
;
9580 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_NOTOWNED
);
9582 if (m
->m_len
< sizeof(struct sadb_msg
)) {
9583 panic("invalid mbuf passed to key_senderror");
9586 msg
= mtod(m
, struct sadb_msg
*);
9587 msg
->sadb_msg_errno
= (u_int8_t
)code
;
9588 return key_sendup_mbuf(so
, m
, KEY_SENDUP_ONE
);
9592 * set the pointer to each header into message buffer.
9593 * m will be freed on error.
9594 * XXX larger-than-MCLBYTES extension?
9599 struct sadb_msghdr
*mhp
)
9602 struct sadb_ext
*ext
;
9608 if (m
== NULL
|| mhp
== NULL
) {
9609 panic("key_align: NULL pointer is passed.\n");
9611 if (m
->m_len
< sizeof(struct sadb_msg
)) {
9612 panic("invalid mbuf passed to key_align");
9616 bzero(mhp
, sizeof(*mhp
));
9618 mhp
->msg
= mtod(m
, struct sadb_msg
*);
9619 mhp
->ext
[0] = (struct sadb_ext
*)mhp
->msg
; /*XXX backward compat */
9621 end
= PFKEY_UNUNIT64(mhp
->msg
->sadb_msg_len
);
9622 extlen
= (int)end
; /*just in case extlen is not updated*/
9623 for (off
= sizeof(struct sadb_msg
); off
< end
; off
+= extlen
) {
9624 n
= m_pulldown(m
, off
, sizeof(struct sadb_ext
), &toff
);
9626 /* m is already freed */
9629 ext
= (struct sadb_ext
*)(void *)(mtod(n
, caddr_t
) + toff
);
9632 switch (ext
->sadb_ext_type
) {
9634 case SADB_EXT_ADDRESS_SRC
:
9635 case SADB_EXT_ADDRESS_DST
:
9636 case SADB_EXT_ADDRESS_PROXY
:
9637 case SADB_EXT_LIFETIME_CURRENT
:
9638 case SADB_EXT_LIFETIME_HARD
:
9639 case SADB_EXT_LIFETIME_SOFT
:
9640 case SADB_EXT_KEY_AUTH
:
9641 case SADB_EXT_KEY_ENCRYPT
:
9642 case SADB_EXT_IDENTITY_SRC
:
9643 case SADB_EXT_IDENTITY_DST
:
9644 case SADB_EXT_SENSITIVITY
:
9645 case SADB_EXT_PROPOSAL
:
9646 case SADB_EXT_SUPPORTED_AUTH
:
9647 case SADB_EXT_SUPPORTED_ENCRYPT
:
9648 case SADB_EXT_SPIRANGE
:
9649 case SADB_X_EXT_POLICY
:
9650 case SADB_X_EXT_SA2
:
9651 case SADB_EXT_SESSION_ID
:
9652 case SADB_EXT_SASTAT
:
9653 case SADB_X_EXT_IPSECIF
:
9654 case SADB_X_EXT_ADDR_RANGE_SRC_START
:
9655 case SADB_X_EXT_ADDR_RANGE_SRC_END
:
9656 case SADB_X_EXT_ADDR_RANGE_DST_START
:
9657 case SADB_X_EXT_ADDR_RANGE_DST_END
:
9658 case SADB_EXT_MIGRATE_ADDRESS_SRC
:
9659 case SADB_EXT_MIGRATE_ADDRESS_DST
:
9660 case SADB_X_EXT_MIGRATE_IPSECIF
:
9661 /* duplicate check */
9663 * XXX Are there duplication payloads of either
9664 * KEY_AUTH or KEY_ENCRYPT ?
9666 if (mhp
->ext
[ext
->sadb_ext_type
] != NULL
) {
9667 ipseclog((LOG_DEBUG
,
9668 "key_align: duplicate ext_type %u "
9669 "is passed.\n", ext
->sadb_ext_type
));
9672 PFKEY_STAT_INCREMENT(pfkeystat
.out_dupext
);
9677 ipseclog((LOG_DEBUG
,
9678 "key_align: invalid ext_type %u is passed.\n",
9679 ext
->sadb_ext_type
));
9682 PFKEY_STAT_INCREMENT(pfkeystat
.out_invexttype
);
9686 extlen
= PFKEY_UNUNIT64(ext
->sadb_ext_len
);
9687 if (off
+ extlen
> end
) {
9688 ipseclog((LOG_DEBUG
,
9689 "key_align: ext type %u invalid ext length %d "
9690 "offset %d sadb message total len %zu is passed.\n",
9691 ext
->sadb_ext_type
, extlen
, off
, end
));
9694 PFKEY_STAT_INCREMENT(pfkeystat
.out_invlen
);
9698 if (key_validate_ext(ext
, extlen
)) {
9701 PFKEY_STAT_INCREMENT(pfkeystat
.out_invlen
);
9705 n
= m_pulldown(m
, off
, extlen
, &toff
);
9707 /* m is already freed */
9710 ext
= (struct sadb_ext
*)(void *)(mtod(n
, caddr_t
) + toff
);
9712 mhp
->ext
[ext
->sadb_ext_type
] = ext
;
9713 mhp
->extoff
[ext
->sadb_ext_type
] = off
;
9714 mhp
->extlen
[ext
->sadb_ext_type
] = extlen
;
9720 PFKEY_STAT_INCREMENT(pfkeystat
.out_invlen
);
9729 const struct sadb_ext
*ext
,
9732 struct sockaddr
*sa
;
9733 enum { NONE
, ADDR
} checktype
= NONE
;
9735 const int sal
= offsetof(struct sockaddr
, sa_len
) + sizeof(sa
->sa_len
);
9737 if (len
!= PFKEY_UNUNIT64(ext
->sadb_ext_len
)) {
9741 /* if it does not match minimum/maximum length, bail */
9742 if (ext
->sadb_ext_type
>= sizeof(minsize
) / sizeof(minsize
[0]) ||
9743 ext
->sadb_ext_type
>= sizeof(maxsize
) / sizeof(maxsize
[0])) {
9746 if (!minsize
[ext
->sadb_ext_type
] || len
< minsize
[ext
->sadb_ext_type
]) {
9749 if (maxsize
[ext
->sadb_ext_type
] && len
> maxsize
[ext
->sadb_ext_type
]) {
9753 /* more checks based on sadb_ext_type XXX need more */
9754 switch (ext
->sadb_ext_type
) {
9755 case SADB_EXT_ADDRESS_SRC
:
9756 case SADB_EXT_ADDRESS_DST
:
9757 case SADB_EXT_ADDRESS_PROXY
:
9758 case SADB_X_EXT_ADDR_RANGE_SRC_START
:
9759 case SADB_X_EXT_ADDR_RANGE_SRC_END
:
9760 case SADB_X_EXT_ADDR_RANGE_DST_START
:
9761 case SADB_X_EXT_ADDR_RANGE_DST_END
:
9762 case SADB_EXT_MIGRATE_ADDRESS_SRC
:
9763 case SADB_EXT_MIGRATE_ADDRESS_DST
:
9764 baselen
= PFKEY_ALIGN8(sizeof(struct sadb_address
));
9767 case SADB_EXT_IDENTITY_SRC
:
9768 case SADB_EXT_IDENTITY_DST
:
9769 if (((struct sadb_ident
*)(uintptr_t)(size_t)ext
)->
9770 sadb_ident_type
== SADB_X_IDENTTYPE_ADDR
) {
9771 baselen
= PFKEY_ALIGN8(sizeof(struct sadb_ident
));
9782 switch (checktype
) {
9786 sa
= (struct sockaddr
*)((caddr_t
)(uintptr_t)ext
+ baselen
);
9788 if (len
< baselen
+ sal
) {
9791 if (baselen
+ PFKEY_ALIGN8(sa
->sa_len
) != len
) {
9797 /* check key bits length */
9798 if (ext
->sadb_ext_type
== SADB_EXT_KEY_AUTH
||
9799 ext
->sadb_ext_type
== SADB_EXT_KEY_ENCRYPT
) {
9800 struct sadb_key
*key
= (struct sadb_key
*)(uintptr_t)ext
;
9801 if (len
< (sizeof(struct sadb_key
) + _KEYLEN(key
))) {
9810 * XXX: maybe This function is called after INBOUND IPsec processing.
9812 * Special check for tunnel-mode packets.
9813 * We must make some checks for consistency between inner and outer IP header.
9815 * xxx more checks to be provided
9818 key_checktunnelsanity(
9819 struct secasvar
*sav
,
9820 __unused u_int family
,
9821 __unused caddr_t src
,
9822 __unused caddr_t dst
)
9825 if (sav
->sah
== NULL
) {
9826 panic("sav->sah == NULL at key_checktunnelsanity");
9829 /* XXX: check inner IP header */
9834 /* record data transfer on SA, and update timestamps */
9837 struct secasvar
*sav
,
9841 panic("key_sa_recordxfer called with sav == NULL");
9844 panic("key_sa_recordxfer called with m == NULL");
9850 lck_mtx_lock(sadb_mutex
);
9852 * XXX Currently, there is a difference of bytes size
9853 * between inbound and outbound processing.
9855 sav
->lft_c
->sadb_lifetime_bytes
+= m
->m_pkthdr
.len
;
9856 /* to check bytes lifetime is done in key_timehandler(). */
9859 * We use the number of packets as the unit of
9860 * sadb_lifetime_allocations. We increment the variable
9861 * whenever {esp,ah}_{in,out}put is called.
9863 sav
->lft_c
->sadb_lifetime_allocations
++;
9864 /* XXX check for expires? */
9867 * NOTE: We record CURRENT sadb_lifetime_usetime by using wall clock,
9868 * in seconds. HARD and SOFT lifetime are measured by the time
9869 * difference (again in seconds) from sadb_lifetime_usetime.
9873 * -----+-----+--------+---> t
9874 * <--------------> HARD
9880 sav
->lft_c
->sadb_lifetime_usetime
= tv
.tv_sec
;
9881 /* XXX check for expires? */
9883 lck_mtx_unlock(sadb_mutex
);
9891 struct sockaddr
*dst
)
9893 struct secashead
*sah
;
9896 lck_mtx_lock(sadb_mutex
);
9897 LIST_FOREACH(sah
, &sahtree
, chain
) {
9898 ro
= (struct route
*)&sah
->sa_route
;
9899 if (ro
->ro_rt
&& dst
->sa_len
== ro
->ro_dst
.sa_len
9900 && bcmp(dst
, &ro
->ro_dst
, dst
->sa_len
) == 0) {
9904 lck_mtx_unlock(sadb_mutex
);
9911 struct secasvar
*sav
,
9915 panic("key_sa_chgstate called with sav == NULL");
9918 if (sav
->state
== state
) {
9922 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_OWNED
);
9924 if (__LIST_CHAINED(sav
)) {
9925 LIST_REMOVE(sav
, chain
);
9929 LIST_INSERT_HEAD(&sav
->sah
->savtree
[state
], sav
, chain
);
9934 struct secasvar
*sav
)
9936 lck_mtx_lock(sadb_mutex
);
9938 panic("key_sa_stir_iv called with sav == NULL");
9940 key_randomfill(sav
->iv
, sav
->ivlen
);
9941 lck_mtx_unlock(sadb_mutex
);
9945 static struct mbuf
*
9949 struct mbuf
*m
= NULL
, *n
;
9954 MGET(n
, M_DONTWAIT
, MT_DATA
);
9955 if (n
&& len
> MLEN
) {
9956 MCLGET(n
, M_DONTWAIT
);
9965 n
->m_len
= (int)M_TRAILINGSPACE(n
);
9966 /* use the bottom of mbuf, hoping we can prepend afterwards */
9967 if (n
->m_len
> len
) {
9968 t
= (n
->m_len
- len
) & ~(sizeof(long) - 1);
9985 static struct mbuf
*
9986 key_setdumpsastats(u_int32_t dir
,
9987 struct sastat
*stats
,
9988 u_int32_t max_stats
,
9989 u_int64_t session_ids
[],
9993 struct mbuf
*result
= NULL
, *m
= NULL
;
9995 m
= key_setsadbmsg(SADB_GETSASTAT
, 0, 0, seq
, pid
, 0);
10001 m
= key_setsadbsession_id(session_ids
);
10007 m
= key_setsadbsastat(dir
,
10015 if ((result
->m_flags
& M_PKTHDR
) == 0) {
10019 if (result
->m_len
< sizeof(struct sadb_msg
)) {
10020 result
= m_pullup(result
, sizeof(struct sadb_msg
));
10021 if (result
== NULL
) {
10026 result
->m_pkthdr
.len
= 0;
10027 for (m
= result
; m
; m
= m
->m_next
) {
10028 result
->m_pkthdr
.len
+= m
->m_len
;
10031 if (PFKEY_UNIT64(result
->m_pkthdr
.len
) > UINT16_MAX
) {
10032 ipseclog((LOG_ERR
, "key_setdumpsastats: length too nbug: %u", result
->m_pkthdr
.len
));
10036 mtod(result
, struct sadb_msg
*)->sadb_msg_len
=
10037 (u_int16_t
)PFKEY_UNIT64(result
->m_pkthdr
.len
);
10049 * SADB_GETSASTAT processing
10050 * dump all stats for matching entries in SAD.
10052 * m will always be freed.
10056 key_getsastat(struct socket
*so
,
10058 const struct sadb_msghdr
*mhp
)
10060 struct sadb_session_id
*session_id
;
10061 size_t bufsize
= 0;
10062 u_int32_t arg_count
, res_count
;
10063 struct sadb_sastat
*sa_stats_arg
;
10064 struct sastat
*sa_stats_sav
= NULL
;
10069 if (so
== NULL
|| m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
) {
10070 panic("%s: NULL pointer is passed.\n", __FUNCTION__
);
10073 if (mhp
->ext
[SADB_EXT_SESSION_ID
] == NULL
) {
10074 printf("%s: invalid message is passed. missing session-id.\n", __FUNCTION__
);
10075 return key_senderror(so
, m
, EINVAL
);
10077 if (mhp
->extlen
[SADB_EXT_SESSION_ID
] < sizeof(struct sadb_session_id
)) {
10078 printf("%s: invalid message is passed. short session-id.\n", __FUNCTION__
);
10079 return key_senderror(so
, m
, EINVAL
);
10081 if (mhp
->ext
[SADB_EXT_SASTAT
] == NULL
) {
10082 printf("%s: invalid message is passed. missing stat args.\n", __FUNCTION__
);
10083 return key_senderror(so
, m
, EINVAL
);
10085 if (mhp
->extlen
[SADB_EXT_SASTAT
] < sizeof(*sa_stats_arg
)) {
10086 printf("%s: invalid message is passed. short stat args.\n", __FUNCTION__
);
10087 return key_senderror(so
, m
, EINVAL
);
10090 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_NOTOWNED
);
10092 // exit early if there are no active SAs
10093 if (ipsec_sav_count
== 0) {
10094 printf("%s: No active SAs.\n", __FUNCTION__
);
10099 if (os_mul_overflow(ipsec_sav_count
+ 1, sizeof(*sa_stats_sav
), &bufsize
)) {
10100 panic("key_getsastat bufsize requested memory overflow %u\n", ipsec_sav_count
);
10103 KMALLOC_WAIT(sa_stats_sav
, __typeof__(sa_stats_sav
), bufsize
);
10104 if (sa_stats_sav
== NULL
) {
10105 printf("%s: No more memory.\n", __FUNCTION__
);
10109 bzero(sa_stats_sav
, bufsize
);
10111 sa_stats_arg
= (__typeof__(sa_stats_arg
))
10112 (void *)mhp
->ext
[SADB_EXT_SASTAT
];
10113 arg_count
= sa_stats_arg
->sadb_sastat_list_len
;
10114 // exit early if there are no requested SAs
10115 if (arg_count
== 0) {
10116 printf("%s: No SAs requested.\n", __FUNCTION__
);
10120 if (PFKEY_UNUNIT64(sa_stats_arg
->sadb_sastat_len
) < (sizeof(*sa_stats_arg
) +
10121 (arg_count
* sizeof(struct sastat
)))) {
10122 printf("%s: invalid message is passed. sa stat extlen shorter than requested stat length.\n", __FUNCTION__
);
10129 if (key_getsastatbyspi((struct sastat
*)(sa_stats_arg
+ 1),
10134 printf("%s: Error finding SAs.\n", __FUNCTION__
);
10139 printf("%s: No SAs found.\n", __FUNCTION__
);
10144 session_id
= (__typeof__(session_id
))
10145 (void *)mhp
->ext
[SADB_EXT_SESSION_ID
];
10147 /* send this to the userland. */
10148 n
= key_setdumpsastats(sa_stats_arg
->sadb_sastat_dir
,
10151 session_id
->sadb_session_id_v
,
10152 mhp
->msg
->sadb_msg_seq
,
10153 mhp
->msg
->sadb_msg_pid
);
10155 printf("%s: No bufs to dump stats.\n", __FUNCTION__
);
10160 key_sendup_mbuf(so
, n
, KEY_SENDUP_ALL
);
10162 if (sa_stats_sav
) {
10163 KFREE(sa_stats_sav
);
10167 return key_senderror(so
, m
, error
);
10175 key_update_natt_keepalive_timestamp(struct secasvar
*sav_sent
,
10176 struct secasvar
*sav_update
)
10178 struct secasindex saidx_swap_sent_addr
;
10180 // exit early if two SAs are identical, or if sav_update is current
10181 if (sav_sent
== sav_update
||
10182 sav_update
->natt_last_activity
== natt_now
) {
10186 // assuming that (sav_update->remote_ike_port != 0 && (esp_udp_encap_port & 0xFFFF) != 0)
10188 bzero(&saidx_swap_sent_addr
, sizeof(saidx_swap_sent_addr
));
10189 memcpy(&saidx_swap_sent_addr
.src
, &sav_sent
->sah
->saidx
.dst
, sizeof(saidx_swap_sent_addr
.src
));
10190 memcpy(&saidx_swap_sent_addr
.dst
, &sav_sent
->sah
->saidx
.src
, sizeof(saidx_swap_sent_addr
.dst
));
10191 saidx_swap_sent_addr
.proto
= sav_sent
->sah
->saidx
.proto
;
10192 saidx_swap_sent_addr
.mode
= sav_sent
->sah
->saidx
.mode
;
10193 // we ignore reqid for split-tunnel setups
10195 if (key_cmpsaidx(&sav_sent
->sah
->saidx
, &sav_update
->sah
->saidx
, CMP_MODE
| CMP_PORT
) ||
10196 key_cmpsaidx(&saidx_swap_sent_addr
, &sav_update
->sah
->saidx
, CMP_MODE
| CMP_PORT
)) {
10197 sav_update
->natt_last_activity
= natt_now
;
10202 key_send_delsp(struct secpolicy
*sp
)
10204 struct mbuf
*result
= NULL
, *m
;
10210 /* set msg header */
10211 m
= key_setsadbmsg(SADB_X_SPDDELETE
, 0, 0, 0, 0, 0);
10217 /* set sadb_address(es) for source */
10218 if (sp
->spidx
.src_range
.start
.ss_len
> 0) {
10219 m
= key_setsadbaddr(SADB_X_EXT_ADDR_RANGE_SRC_START
,
10220 (struct sockaddr
*)&sp
->spidx
.src_range
.start
, sp
->spidx
.prefs
,
10221 sp
->spidx
.ul_proto
);
10227 m
= key_setsadbaddr(SADB_X_EXT_ADDR_RANGE_SRC_END
,
10228 (struct sockaddr
*)&sp
->spidx
.src_range
.end
, sp
->spidx
.prefs
,
10229 sp
->spidx
.ul_proto
);
10235 m
= key_setsadbaddr(SADB_EXT_ADDRESS_SRC
,
10236 (struct sockaddr
*)&sp
->spidx
.src
, sp
->spidx
.prefs
,
10237 sp
->spidx
.ul_proto
);
10244 /* set sadb_address(es) for destination */
10245 if (sp
->spidx
.dst_range
.start
.ss_len
> 0) {
10246 m
= key_setsadbaddr(SADB_X_EXT_ADDR_RANGE_DST_START
,
10247 (struct sockaddr
*)&sp
->spidx
.dst_range
.start
, sp
->spidx
.prefd
,
10248 sp
->spidx
.ul_proto
);
10254 m
= key_setsadbaddr(SADB_X_EXT_ADDR_RANGE_DST_END
,
10255 (struct sockaddr
*)&sp
->spidx
.dst_range
.end
, sp
->spidx
.prefd
,
10256 sp
->spidx
.ul_proto
);
10262 m
= key_setsadbaddr(SADB_EXT_ADDRESS_DST
,
10263 (struct sockaddr
*)&sp
->spidx
.dst
, sp
->spidx
.prefd
,
10264 sp
->spidx
.ul_proto
);
10271 /* set secpolicy */
10272 m
= key_sp2msg(sp
);
10278 if ((result
->m_flags
& M_PKTHDR
) == 0) {
10282 if (result
->m_len
< sizeof(struct sadb_msg
)) {
10283 result
= m_pullup(result
, sizeof(struct sadb_msg
));
10284 if (result
== NULL
) {
10289 result
->m_pkthdr
.len
= 0;
10290 for (m
= result
; m
; m
= m
->m_next
) {
10291 result
->m_pkthdr
.len
+= m
->m_len
;
10294 if (PFKEY_UNIT64(result
->m_pkthdr
.len
) >= UINT16_MAX
) {
10295 ipseclog((LOG_ERR
, "key_send_delsp: length too big: %d", result
->m_pkthdr
.len
));
10299 mtod(result
, struct sadb_msg
*)->sadb_msg_len
= (u_int16_t
)PFKEY_UNIT64(result
->m_pkthdr
.len
);
10301 return key_sendup_mbuf(NULL
, result
, KEY_SENDUP_REGISTERED
);
10311 key_delsp_for_ipsec_if(ifnet_t ipsec_if
)
10313 struct secashead
*sah
;
10314 struct secasvar
*sav
, *nextsav
;
10317 struct secpolicy
*sp
, *nextsp
;
10320 if (ipsec_if
== NULL
) {
10324 LCK_MTX_ASSERT(sadb_mutex
, LCK_MTX_ASSERT_NOTOWNED
);
10326 lck_mtx_lock(sadb_mutex
);
10328 for (dir
= 0; dir
< IPSEC_DIR_MAX
; dir
++) {
10329 for (sp
= LIST_FIRST(&sptree
[dir
]);
10332 nextsp
= LIST_NEXT(sp
, chain
);
10334 if (sp
->ipsec_if
== ipsec_if
) {
10335 ifnet_release(sp
->ipsec_if
);
10336 sp
->ipsec_if
= NULL
;
10338 key_send_delsp(sp
);
10340 sp
->state
= IPSEC_SPSTATE_DEAD
;
10341 key_freesp(sp
, KEY_SADB_LOCKED
);
10346 LIST_FOREACH(sah
, &sahtree
, chain
) {
10347 if (sah
->ipsec_if
== ipsec_if
) {
10348 /* This SAH is linked to the IPsec interface. It now needs to close. */
10349 ifnet_release(sah
->ipsec_if
);
10350 sah
->ipsec_if
= NULL
;
10352 for (stateidx
= 0; stateidx
< _ARRAYLEN(saorder_state_alive
); stateidx
++) {
10353 state
= saorder_state_any
[stateidx
];
10354 for (sav
= LIST_FIRST(&sah
->savtree
[state
]); sav
!= NULL
; sav
= nextsav
) {
10355 nextsav
= LIST_NEXT(sav
, chain
);
10357 key_sa_chgstate(sav
, SADB_SASTATE_DEAD
);
10358 key_freesav(sav
, KEY_SADB_LOCKED
);
10362 sah
->state
= SADB_SASTATE_DEAD
;
10366 lck_mtx_unlock(sadb_mutex
);
10369 __private_extern__ u_int32_t
10370 key_fill_offload_frames_for_savs(ifnet_t ifp
,
10371 struct ifnet_keepalive_offload_frame
*frames_array
,
10372 u_int32_t frames_array_count
,
10373 size_t frame_data_offset
)
10375 struct secashead
*sah
= NULL
;
10376 struct secasvar
*sav
= NULL
;
10377 struct ifnet_keepalive_offload_frame
*frame
= frames_array
;
10378 u_int32_t frame_index
= 0;
10380 if (frame
== NULL
|| frames_array_count
== 0) {
10381 return frame_index
;
10384 lck_mtx_lock(sadb_mutex
);
10385 LIST_FOREACH(sah
, &sahtree
, chain
) {
10386 LIST_FOREACH(sav
, &sah
->savtree
[SADB_SASTATE_MATURE
], chain
) {
10387 if (ipsec_fill_offload_frame(ifp
, sav
, frame
, frame_data_offset
)) {
10389 if (frame_index
>= frames_array_count
) {
10390 lck_mtx_unlock(sadb_mutex
);
10391 return frame_index
;
10393 frame
= &(frames_array
[frame_index
]);
10397 lck_mtx_unlock(sadb_mutex
);
10399 return frame_index
;
10402 #pragma mark Custom IPsec
10404 __private_extern__
bool
10405 key_custom_ipsec_token_is_valid(void *ipsec_token
)
10407 if (ipsec_token
== NULL
) {
10411 struct secashead
*sah
= (struct secashead
*)ipsec_token
;
10413 return (sah
->flags
& SECURITY_ASSOCIATION_CUSTOM_IPSEC
) == SECURITY_ASSOCIATION_CUSTOM_IPSEC
;
10416 __private_extern__
int
10417 key_reserve_custom_ipsec(void **ipsec_token
, union sockaddr_in_4_6
*src
, union sockaddr_in_4_6
*dst
,
10420 if (src
== NULL
|| dst
== NULL
) {
10421 ipseclog((LOG_ERR
, "register custom ipsec: invalid address\n"));
10425 if (src
->sa
.sa_family
!= dst
->sa
.sa_family
) {
10426 ipseclog((LOG_ERR
, "register custom ipsec: address family mismatched\n"));
10430 if (src
->sa
.sa_len
!= dst
->sa
.sa_len
) {
10431 ipseclog((LOG_ERR
, "register custom ipsec: address struct size mismatched\n"));
10435 if (ipsec_token
== NULL
) {
10436 ipseclog((LOG_ERR
, "register custom ipsec: invalid ipsec token\n"));
10440 switch (src
->sa
.sa_family
) {
10442 if (src
->sa
.sa_len
!= sizeof(struct sockaddr_in
)) {
10443 ipseclog((LOG_ERR
, "register custom esp: invalid address length\n"));
10448 if (src
->sa
.sa_len
!= sizeof(struct sockaddr_in6
)) {
10449 ipseclog((LOG_ERR
, "register custom esp: invalid address length\n"));
10454 ipseclog((LOG_ERR
, "register custom esp: invalid address length\n"));
10455 return EAFNOSUPPORT
;
10458 if (proto
!= IPPROTO_ESP
&& proto
!= IPPROTO_AH
) {
10459 ipseclog((LOG_ERR
, "register custom esp: invalid proto %u\n", proto
));
10463 struct secasindex saidx
= {};
10464 KEY_SETSECASIDX(proto
, IPSEC_MODE_ANY
, 0, &src
->sa
, &dst
->sa
, 0, &saidx
);
10466 lck_mtx_lock(sadb_mutex
);
10468 struct secashead
*sah
= NULL
;
10469 if ((sah
= key_getsah(&saidx
, SECURITY_ASSOCIATION_ANY
)) != NULL
) {
10470 lck_mtx_unlock(sadb_mutex
);
10471 ipseclog((LOG_ERR
, "register custom esp: SA exists\n"));
10475 if ((sah
= key_newsah(&saidx
, NULL
, 0, IPSEC_DIR_ANY
, SECURITY_ASSOCIATION_CUSTOM_IPSEC
)) == NULL
) {
10476 lck_mtx_unlock(sadb_mutex
);
10477 ipseclog((LOG_DEBUG
, "register custom esp: No more memory.\n"));
10481 *ipsec_token
= (void *)sah
;
10483 lck_mtx_unlock(sadb_mutex
);
10487 __private_extern__
void
10488 key_release_custom_ipsec(void **ipsec_token
)
10490 struct secashead
*sah
= *ipsec_token
;
10491 VERIFY(sah
!= NULL
);
10493 lck_mtx_lock(sadb_mutex
);
10495 VERIFY((sah
->flags
& SECURITY_ASSOCIATION_CUSTOM_IPSEC
) == SECURITY_ASSOCIATION_CUSTOM_IPSEC
);
10497 bool sa_present
= true;
10498 if (LIST_FIRST(&sah
->savtree
[SADB_SASTATE_LARVAL
]) == NULL
&&
10499 LIST_FIRST(&sah
->savtree
[SADB_SASTATE_MATURE
]) == NULL
&&
10500 LIST_FIRST(&sah
->savtree
[SADB_SASTATE_DYING
]) == NULL
&&
10501 LIST_FIRST(&sah
->savtree
[SADB_SASTATE_DEAD
]) == NULL
) {
10502 sa_present
= false;
10504 VERIFY(sa_present
== false);
10508 lck_mtx_unlock(sadb_mutex
);
10510 *ipsec_token
= NULL
;