key.c revision 1.266 1 /* $NetBSD: key.c,v 1.266 2019/08/04 14:30:36 maxv Exp $ */
2 /* $FreeBSD: key.c,v 1.3.2.3 2004/02/14 22:23:23 bms Exp $ */
3 /* $KAME: key.c,v 1.191 2001/06/27 10:46:49 sakane Exp $ */
4
5 /*
6 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
7 * All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in the
16 * documentation and/or other materials provided with the distribution.
17 * 3. Neither the name of the project nor the names of its contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 */
33
34 #include <sys/cdefs.h>
35 __KERNEL_RCSID(0, "$NetBSD: key.c,v 1.266 2019/08/04 14:30:36 maxv Exp $");
36
37 /*
38 * This code is referred to RFC 2367
39 */
40
41 #if defined(_KERNEL_OPT)
42 #include "opt_inet.h"
43 #include "opt_ipsec.h"
44 #include "opt_gateway.h"
45 #include "opt_net_mpsafe.h"
46 #endif
47
48 #include <sys/types.h>
49 #include <sys/param.h>
50 #include <sys/systm.h>
51 #include <sys/callout.h>
52 #include <sys/kernel.h>
53 #include <sys/mbuf.h>
54 #include <sys/domain.h>
55 #include <sys/socket.h>
56 #include <sys/socketvar.h>
57 #include <sys/sysctl.h>
58 #include <sys/errno.h>
59 #include <sys/proc.h>
60 #include <sys/queue.h>
61 #include <sys/syslog.h>
62 #include <sys/once.h>
63 #include <sys/cprng.h>
64 #include <sys/psref.h>
65 #include <sys/lwp.h>
66 #include <sys/workqueue.h>
67 #include <sys/kmem.h>
68 #include <sys/cpu.h>
69 #include <sys/atomic.h>
70 #include <sys/pslist.h>
71 #include <sys/mutex.h>
72 #include <sys/condvar.h>
73 #include <sys/localcount.h>
74 #include <sys/pserialize.h>
75 #include <sys/hash.h>
76
77 #include <net/if.h>
78 #include <net/route.h>
79
80 #include <netinet/in.h>
81 #include <netinet/in_systm.h>
82 #include <netinet/ip.h>
83 #include <netinet/in_var.h>
84 #ifdef INET
85 #include <netinet/ip_var.h>
86 #endif
87
88 #ifdef INET6
89 #include <netinet/ip6.h>
90 #include <netinet6/in6_var.h>
91 #include <netinet6/ip6_var.h>
92 #endif /* INET6 */
93
94 #ifdef INET
95 #include <netinet/in_pcb.h>
96 #endif
97 #ifdef INET6
98 #include <netinet6/in6_pcb.h>
99 #endif /* INET6 */
100
101 #include <net/pfkeyv2.h>
102 #include <netipsec/keydb.h>
103 #include <netipsec/key.h>
104 #include <netipsec/keysock.h>
105 #include <netipsec/key_debug.h>
106
107 #include <netipsec/ipsec.h>
108 #ifdef INET6
109 #include <netipsec/ipsec6.h>
110 #endif
111 #include <netipsec/ipsec_private.h>
112
113 #include <netipsec/xform.h>
114 #include <netipsec/ipcomp.h>
115
116 #define FULLMASK 0xffu
117 #define _BITS(bytes) ((bytes) << 3)
118
119 #define PORT_NONE 0
120 #define PORT_LOOSE 1
121 #define PORT_STRICT 2
122
123 #ifndef SAHHASH_NHASH
124 #define SAHHASH_NHASH 128
125 #endif
126
127 #ifndef SAVLUT_NHASH
128 #define SAVLUT_NHASH 128
129 #endif
130
131 percpu_t *pfkeystat_percpu;
132
133 /*
134 * Note on SA reference counting:
135 * - SAs that are not in DEAD state will have (total external reference + 1)
136 * following value in reference count field. they cannot be freed and are
137 * referenced from SA header.
138 * - SAs that are in DEAD state will have (total external reference)
139 * in reference count field. they are ready to be freed. reference from
140 * SA header will be removed in key_delsav(), when the reference count
141 * field hits 0 (= no external reference other than from SA header.
142 */
143
144 u_int32_t key_debug_level = 0;
145 static u_int key_spi_trycnt = 1000;
146 static u_int32_t key_spi_minval = 0x100;
147 static u_int32_t key_spi_maxval = 0x0fffffff; /* XXX */
148 static u_int32_t policy_id = 0;
149 static u_int key_int_random = 60; /*interval to initialize randseed,1(m)*/
150 static u_int key_larval_lifetime = 30; /* interval to expire acquiring, 30(s)*/
151 static int key_blockacq_count = 10; /* counter for blocking SADB_ACQUIRE.*/
152 static int key_blockacq_lifetime = 20; /* lifetime for blocking SADB_ACQUIRE.*/
153 static int key_prefered_oldsa = 0; /* prefered old sa rather than new sa.*/
154
155 static u_int32_t acq_seq = 0;
156
157 /*
158 * Locking order: there is no order for now; it means that any locks aren't
159 * overlapped.
160 */
161 /*
162 * Locking notes on SPD:
163 * - Modifications to the key_spd.splist must be done with holding key_spd.lock
164 * which is a adaptive mutex
165 * - Read accesses to the key_spd.splist must be in pserialize(9) read sections
166 * - SP's lifetime is managed by localcount(9)
167 * - An SP that has been inserted to the key_spd.splist is initially referenced
168 * by none, i.e., a reference from the key_spd.splist isn't counted
169 * - When an SP is being destroyed, we change its state as DEAD, wait for
170 * references to the SP to be released, and then deallocate the SP
171 * (see key_unlink_sp)
172 * - Getting an SP
173 * - Normally we get an SP from the key_spd.splist (see key_lookup_sp_byspidx)
174 * - Must iterate the list and increment the reference count of a found SP
175 * (by key_sp_ref) in a pserialize read section
176 * - We can gain another reference from a held SP only if we check its state
177 * and take its reference in a pserialize read section
178 * (see esp_output for example)
179 * - We may get an SP from an SP cache. See below
180 * - A gotten SP must be released after use by KEY_SP_UNREF (key_sp_unref)
181 * - Updating member variables of an SP
182 * - Most member variables of an SP are immutable
183 * - Only sp->state and sp->lastused can be changed
184 * - sp->state of an SP is updated only when destroying it under key_spd.lock
185 * - SP caches
186 * - SPs can be cached in PCBs
187 * - The lifetime of the caches is controlled by the global generation counter
188 * (ipsec_spdgen)
189 * - The global counter value is stored when an SP is cached
190 * - If the stored value is different from the global counter then the cache
191 * is considered invalidated
192 * - The counter is incremented when an SP is being destroyed
193 * - So checking the generation and taking a reference to an SP should be
194 * in a pserialize read section
195 * - Note that caching doesn't increment the reference counter of an SP
196 * - SPs in sockets
197 * - Userland programs can set a policy to a socket by
198 * setsockopt(IP_IPSEC_POLICY)
199 * - Such policies (SPs) are set to a socket (PCB) and also inserted to
200 * the key_spd.socksplist list (not the key_spd.splist)
201 * - Such a policy is destroyed when a corresponding socket is destroed,
202 * however, a socket can be destroyed in softint so we cannot destroy
203 * it directly instead we just mark it DEAD and delay the destruction
204 * until GC by the timer
205 * - SP origin
206 * - SPs can be created by both userland programs and kernel components.
207 * The SPs created in kernel must not be removed by userland programs,
208 * although the SPs can be read by userland programs.
209 */
210 /*
211 * Locking notes on SAD:
212 * - Data structures
213 * - SAs are managed by the list called key_sad.sahlists and sav lists of
214 * sah entries
215 * - An sav is supposed to be an SA from a viewpoint of users
216 * - A sah has sav lists for each SA state
217 * - Multiple saves with the same saidx can exist
218 * - Only one entry has MATURE state and others should be DEAD
219 * - DEAD entries are just ignored from searching
220 * - All sav whose state is MATURE or DYING are registered to the lookup
221 * table called key_sad.savlut in addition to the savlists.
222 * - The table is used to search an sav without use of saidx.
223 * - Modifications to the key_sad.sahlists, sah.savlist and key_sad.savlut
224 * must be done with holding key_sad.lock which is a adaptive mutex
225 * - Read accesses to the key_sad.sahlists, sah.savlist and key_sad.savlut
226 * must be in pserialize(9) read sections
227 * - sah's lifetime is managed by localcount(9)
228 * - Getting an sah entry
229 * - We get an sah from the key_sad.sahlists
230 * - Must iterate the list and increment the reference count of a found sah
231 * (by key_sah_ref) in a pserialize read section
232 * - A gotten sah must be released after use by key_sah_unref
233 * - An sah is destroyed when its state become DEAD and no sav is
234 * listed to the sah
235 * - The destruction is done only in the timer (see key_timehandler_sad)
236 * - sav's lifetime is managed by localcount(9)
237 * - Getting an sav entry
238 * - First get an sah by saidx and get an sav from either of sah's savlists
239 * - Must iterate the list and increment the reference count of a found sav
240 * (by key_sa_ref) in a pserialize read section
241 * - We can gain another reference from a held SA only if we check its state
242 * and take its reference in a pserialize read section
243 * (see esp_output for example)
244 * - A gotten sav must be released after use by key_sa_unref
245 * - An sav is destroyed when its state become DEAD
246 */
247 /*
248 * Locking notes on misc data:
249 * - All lists of key_misc are protected by key_misc.lock
250 * - key_misc.lock must be held even for read accesses
251 */
252
253 /* SPD */
254 static struct {
255 kmutex_t lock;
256 kcondvar_t cv_lc;
257 struct pslist_head splist[IPSEC_DIR_MAX];
258 /*
259 * The list has SPs that are set to a socket via
260 * setsockopt(IP_IPSEC_POLICY) from userland. See ipsec_set_policy.
261 */
262 struct pslist_head socksplist;
263
264 pserialize_t psz;
265 kcondvar_t cv_psz;
266 bool psz_performing;
267 } key_spd __cacheline_aligned;
268
269 /* SAD */
270 static struct {
271 kmutex_t lock;
272 kcondvar_t cv_lc;
273 struct pslist_head *sahlists;
274 u_long sahlistmask;
275 struct pslist_head *savlut;
276 u_long savlutmask;
277
278 pserialize_t psz;
279 kcondvar_t cv_psz;
280 bool psz_performing;
281 } key_sad __cacheline_aligned;
282
283 /* Misc data */
284 static struct {
285 kmutex_t lock;
286 /* registed list */
287 LIST_HEAD(_reglist, secreg) reglist[SADB_SATYPE_MAX + 1];
288 #ifndef IPSEC_NONBLOCK_ACQUIRE
289 /* acquiring list */
290 LIST_HEAD(_acqlist, secacq) acqlist;
291 #endif
292 #ifdef notyet
293 /* SP acquiring list */
294 LIST_HEAD(_spacqlist, secspacq) spacqlist;
295 #endif
296 } key_misc __cacheline_aligned;
297
298 /* Macros for key_spd.splist */
299 #define SPLIST_ENTRY_INIT(sp) \
300 PSLIST_ENTRY_INIT((sp), pslist_entry)
301 #define SPLIST_ENTRY_DESTROY(sp) \
302 PSLIST_ENTRY_DESTROY((sp), pslist_entry)
303 #define SPLIST_WRITER_REMOVE(sp) \
304 PSLIST_WRITER_REMOVE((sp), pslist_entry)
305 #define SPLIST_READER_EMPTY(dir) \
306 (PSLIST_READER_FIRST(&key_spd.splist[(dir)], struct secpolicy, \
307 pslist_entry) == NULL)
308 #define SPLIST_READER_FOREACH(sp, dir) \
309 PSLIST_READER_FOREACH((sp), &key_spd.splist[(dir)], \
310 struct secpolicy, pslist_entry)
311 #define SPLIST_WRITER_FOREACH(sp, dir) \
312 PSLIST_WRITER_FOREACH((sp), &key_spd.splist[(dir)], \
313 struct secpolicy, pslist_entry)
314 #define SPLIST_WRITER_INSERT_AFTER(sp, new) \
315 PSLIST_WRITER_INSERT_AFTER((sp), (new), pslist_entry)
316 #define SPLIST_WRITER_EMPTY(dir) \
317 (PSLIST_WRITER_FIRST(&key_spd.splist[(dir)], struct secpolicy, \
318 pslist_entry) == NULL)
319 #define SPLIST_WRITER_INSERT_HEAD(dir, sp) \
320 PSLIST_WRITER_INSERT_HEAD(&key_spd.splist[(dir)], (sp), \
321 pslist_entry)
322 #define SPLIST_WRITER_NEXT(sp) \
323 PSLIST_WRITER_NEXT((sp), struct secpolicy, pslist_entry)
324 #define SPLIST_WRITER_INSERT_TAIL(dir, new) \
325 do { \
326 if (SPLIST_WRITER_EMPTY((dir))) { \
327 SPLIST_WRITER_INSERT_HEAD((dir), (new)); \
328 } else { \
329 struct secpolicy *__sp; \
330 SPLIST_WRITER_FOREACH(__sp, (dir)) { \
331 if (SPLIST_WRITER_NEXT(__sp) == NULL) { \
332 SPLIST_WRITER_INSERT_AFTER(__sp,\
333 (new)); \
334 break; \
335 } \
336 } \
337 } \
338 } while (0)
339
340 /* Macros for key_spd.socksplist */
341 #define SOCKSPLIST_WRITER_FOREACH(sp) \
342 PSLIST_WRITER_FOREACH((sp), &key_spd.socksplist, \
343 struct secpolicy, pslist_entry)
344 #define SOCKSPLIST_READER_EMPTY() \
345 (PSLIST_READER_FIRST(&key_spd.socksplist, struct secpolicy, \
346 pslist_entry) == NULL)
347
348 /* Macros for key_sad.sahlist */
349 #define SAHLIST_ENTRY_INIT(sah) \
350 PSLIST_ENTRY_INIT((sah), pslist_entry)
351 #define SAHLIST_ENTRY_DESTROY(sah) \
352 PSLIST_ENTRY_DESTROY((sah), pslist_entry)
353 #define SAHLIST_WRITER_REMOVE(sah) \
354 PSLIST_WRITER_REMOVE((sah), pslist_entry)
355 #define SAHLIST_READER_FOREACH(sah) \
356 for(int _i_sah = 0; _i_sah <= key_sad.sahlistmask; _i_sah++) \
357 PSLIST_READER_FOREACH((sah), &key_sad.sahlists[_i_sah], \
358 struct secashead, pslist_entry)
359 #define SAHLIST_READER_FOREACH_SAIDX(sah, saidx) \
360 PSLIST_READER_FOREACH((sah), \
361 &key_sad.sahlists[key_saidxhash((saidx), \
362 key_sad.sahlistmask)], \
363 struct secashead, pslist_entry)
364 #define SAHLIST_WRITER_FOREACH(sah) \
365 for(int _i_sah = 0; _i_sah <= key_sad.sahlistmask; _i_sah++) \
366 PSLIST_WRITER_FOREACH((sah), &key_sad.sahlists[_i_sah], \
367 struct secashead, pslist_entry)
368 #define SAHLIST_WRITER_INSERT_HEAD(sah) \
369 PSLIST_WRITER_INSERT_HEAD( \
370 &key_sad.sahlists[key_saidxhash(&(sah)->saidx, \
371 key_sad.sahlistmask)], \
372 (sah), pslist_entry)
373
374 /* Macros for key_sad.sahlist#savlist */
375 #define SAVLIST_ENTRY_INIT(sav) \
376 PSLIST_ENTRY_INIT((sav), pslist_entry)
377 #define SAVLIST_ENTRY_DESTROY(sav) \
378 PSLIST_ENTRY_DESTROY((sav), pslist_entry)
379 #define SAVLIST_READER_FIRST(sah, state) \
380 PSLIST_READER_FIRST(&(sah)->savlist[(state)], struct secasvar, \
381 pslist_entry)
382 #define SAVLIST_WRITER_REMOVE(sav) \
383 PSLIST_WRITER_REMOVE((sav), pslist_entry)
384 #define SAVLIST_READER_FOREACH(sav, sah, state) \
385 PSLIST_READER_FOREACH((sav), &(sah)->savlist[(state)], \
386 struct secasvar, pslist_entry)
387 #define SAVLIST_WRITER_FOREACH(sav, sah, state) \
388 PSLIST_WRITER_FOREACH((sav), &(sah)->savlist[(state)], \
389 struct secasvar, pslist_entry)
390 #define SAVLIST_WRITER_INSERT_BEFORE(sav, new) \
391 PSLIST_WRITER_INSERT_BEFORE((sav), (new), pslist_entry)
392 #define SAVLIST_WRITER_INSERT_AFTER(sav, new) \
393 PSLIST_WRITER_INSERT_AFTER((sav), (new), pslist_entry)
394 #define SAVLIST_WRITER_EMPTY(sah, state) \
395 (PSLIST_WRITER_FIRST(&(sah)->savlist[(state)], struct secasvar, \
396 pslist_entry) == NULL)
397 #define SAVLIST_WRITER_INSERT_HEAD(sah, state, sav) \
398 PSLIST_WRITER_INSERT_HEAD(&(sah)->savlist[(state)], (sav), \
399 pslist_entry)
400 #define SAVLIST_WRITER_NEXT(sav) \
401 PSLIST_WRITER_NEXT((sav), struct secasvar, pslist_entry)
402 #define SAVLIST_WRITER_INSERT_TAIL(sah, state, new) \
403 do { \
404 if (SAVLIST_WRITER_EMPTY((sah), (state))) { \
405 SAVLIST_WRITER_INSERT_HEAD((sah), (state), (new));\
406 } else { \
407 struct secasvar *__sav; \
408 SAVLIST_WRITER_FOREACH(__sav, (sah), (state)) { \
409 if (SAVLIST_WRITER_NEXT(__sav) == NULL) {\
410 SAVLIST_WRITER_INSERT_AFTER(__sav,\
411 (new)); \
412 break; \
413 } \
414 } \
415 } \
416 } while (0)
417 #define SAVLIST_READER_NEXT(sav) \
418 PSLIST_READER_NEXT((sav), struct secasvar, pslist_entry)
419
420 /* Macros for key_sad.savlut */
421 #define SAVLUT_ENTRY_INIT(sav) \
422 PSLIST_ENTRY_INIT((sav), pslist_entry_savlut)
423 #define SAVLUT_READER_FOREACH(sav, dst, proto, hash_key) \
424 PSLIST_READER_FOREACH((sav), \
425 &key_sad.savlut[key_savluthash(dst, proto, hash_key, \
426 key_sad.savlutmask)], \
427 struct secasvar, pslist_entry_savlut)
428 #define SAVLUT_WRITER_INSERT_HEAD(sav) \
429 key_savlut_writer_insert_head((sav))
430 #define SAVLUT_WRITER_REMOVE(sav) \
431 do { \
432 if (!(sav)->savlut_added) \
433 break; \
434 PSLIST_WRITER_REMOVE((sav), pslist_entry_savlut); \
435 (sav)->savlut_added = false; \
436 } while(0)
437
438 /* search order for SAs */
439 /*
440 * This order is important because we must select the oldest SA
441 * for outbound processing. For inbound, This is not important.
442 */
443 static const u_int saorder_state_valid_prefer_old[] = {
444 SADB_SASTATE_DYING, SADB_SASTATE_MATURE,
445 };
446 static const u_int saorder_state_valid_prefer_new[] = {
447 SADB_SASTATE_MATURE, SADB_SASTATE_DYING,
448 };
449
450 static const u_int saorder_state_alive[] = {
451 /* except DEAD */
452 SADB_SASTATE_MATURE, SADB_SASTATE_DYING, SADB_SASTATE_LARVAL
453 };
454 static const u_int saorder_state_any[] = {
455 SADB_SASTATE_MATURE, SADB_SASTATE_DYING,
456 SADB_SASTATE_LARVAL, SADB_SASTATE_DEAD
457 };
458
459 #define SASTATE_ALIVE_FOREACH(s) \
460 for (int _i = 0; \
461 _i < __arraycount(saorder_state_alive) ? \
462 (s) = saorder_state_alive[_i], true : false; \
463 _i++)
464 #define SASTATE_ANY_FOREACH(s) \
465 for (int _i = 0; \
466 _i < __arraycount(saorder_state_any) ? \
467 (s) = saorder_state_any[_i], true : false; \
468 _i++)
469 #define SASTATE_USABLE_FOREACH(s) \
470 for (int _i = 0; \
471 _i < __arraycount(saorder_state_valid_prefer_new) ? \
472 (s) = saorder_state_valid_prefer_new[_i], \
473 true : false; \
474 _i++)
475
476 static const int minsize[] = {
477 sizeof(struct sadb_msg), /* SADB_EXT_RESERVED */
478 sizeof(struct sadb_sa), /* SADB_EXT_SA */
479 sizeof(struct sadb_lifetime), /* SADB_EXT_LIFETIME_CURRENT */
480 sizeof(struct sadb_lifetime), /* SADB_EXT_LIFETIME_HARD */
481 sizeof(struct sadb_lifetime), /* SADB_EXT_LIFETIME_SOFT */
482 sizeof(struct sadb_address), /* SADB_EXT_ADDRESS_SRC */
483 sizeof(struct sadb_address), /* SADB_EXT_ADDRESS_DST */
484 sizeof(struct sadb_address), /* SADB_EXT_ADDRESS_PROXY */
485 sizeof(struct sadb_key), /* SADB_EXT_KEY_AUTH */
486 sizeof(struct sadb_key), /* SADB_EXT_KEY_ENCRYPT */
487 sizeof(struct sadb_ident), /* SADB_EXT_IDENTITY_SRC */
488 sizeof(struct sadb_ident), /* SADB_EXT_IDENTITY_DST */
489 sizeof(struct sadb_sens), /* SADB_EXT_SENSITIVITY */
490 sizeof(struct sadb_prop), /* SADB_EXT_PROPOSAL */
491 sizeof(struct sadb_supported), /* SADB_EXT_SUPPORTED_AUTH */
492 sizeof(struct sadb_supported), /* SADB_EXT_SUPPORTED_ENCRYPT */
493 sizeof(struct sadb_spirange), /* SADB_EXT_SPIRANGE */
494 0, /* SADB_X_EXT_KMPRIVATE */
495 sizeof(struct sadb_x_policy), /* SADB_X_EXT_POLICY */
496 sizeof(struct sadb_x_sa2), /* SADB_X_SA2 */
497 sizeof(struct sadb_x_nat_t_type), /* SADB_X_EXT_NAT_T_TYPE */
498 sizeof(struct sadb_x_nat_t_port), /* SADB_X_EXT_NAT_T_SPORT */
499 sizeof(struct sadb_x_nat_t_port), /* SADB_X_EXT_NAT_T_DPORT */
500 sizeof(struct sadb_address), /* SADB_X_EXT_NAT_T_OAI */
501 sizeof(struct sadb_address), /* SADB_X_EXT_NAT_T_OAR */
502 sizeof(struct sadb_x_nat_t_frag), /* SADB_X_EXT_NAT_T_FRAG */
503 };
504 static const int maxsize[] = {
505 sizeof(struct sadb_msg), /* SADB_EXT_RESERVED */
506 sizeof(struct sadb_sa), /* SADB_EXT_SA */
507 sizeof(struct sadb_lifetime), /* SADB_EXT_LIFETIME_CURRENT */
508 sizeof(struct sadb_lifetime), /* SADB_EXT_LIFETIME_HARD */
509 sizeof(struct sadb_lifetime), /* SADB_EXT_LIFETIME_SOFT */
510 0, /* SADB_EXT_ADDRESS_SRC */
511 0, /* SADB_EXT_ADDRESS_DST */
512 0, /* SADB_EXT_ADDRESS_PROXY */
513 0, /* SADB_EXT_KEY_AUTH */
514 0, /* SADB_EXT_KEY_ENCRYPT */
515 0, /* SADB_EXT_IDENTITY_SRC */
516 0, /* SADB_EXT_IDENTITY_DST */
517 0, /* SADB_EXT_SENSITIVITY */
518 0, /* SADB_EXT_PROPOSAL */
519 0, /* SADB_EXT_SUPPORTED_AUTH */
520 0, /* SADB_EXT_SUPPORTED_ENCRYPT */
521 sizeof(struct sadb_spirange), /* SADB_EXT_SPIRANGE */
522 0, /* SADB_X_EXT_KMPRIVATE */
523 0, /* SADB_X_EXT_POLICY */
524 sizeof(struct sadb_x_sa2), /* SADB_X_SA2 */
525 sizeof(struct sadb_x_nat_t_type), /* SADB_X_EXT_NAT_T_TYPE */
526 sizeof(struct sadb_x_nat_t_port), /* SADB_X_EXT_NAT_T_SPORT */
527 sizeof(struct sadb_x_nat_t_port), /* SADB_X_EXT_NAT_T_DPORT */
528 0, /* SADB_X_EXT_NAT_T_OAI */
529 0, /* SADB_X_EXT_NAT_T_OAR */
530 sizeof(struct sadb_x_nat_t_frag), /* SADB_X_EXT_NAT_T_FRAG */
531 };
532
533 static int ipsec_esp_keymin = 256;
534 static int ipsec_esp_auth = 0;
535 static int ipsec_ah_keymin = 128;
536
537 #ifdef SYSCTL_DECL
538 SYSCTL_DECL(_net_key);
539 #endif
540
541 #ifdef SYSCTL_INT
542 SYSCTL_INT(_net_key, KEYCTL_DEBUG_LEVEL, debug, CTLFLAG_RW, \
543 &key_debug_level, 0, "");
544
545 /* max count of trial for the decision of spi value */
546 SYSCTL_INT(_net_key, KEYCTL_SPI_TRY, spi_trycnt, CTLFLAG_RW, \
547 &key_spi_trycnt, 0, "");
548
549 /* minimum spi value to allocate automatically. */
550 SYSCTL_INT(_net_key, KEYCTL_SPI_MIN_VALUE, spi_minval, CTLFLAG_RW, \
551 &key_spi_minval, 0, "");
552
553 /* maximun spi value to allocate automatically. */
554 SYSCTL_INT(_net_key, KEYCTL_SPI_MAX_VALUE, spi_maxval, CTLFLAG_RW, \
555 &key_spi_maxval, 0, "");
556
557 /* interval to initialize randseed */
558 SYSCTL_INT(_net_key, KEYCTL_RANDOM_INT, int_random, CTLFLAG_RW, \
559 &key_int_random, 0, "");
560
561 /* lifetime for larval SA */
562 SYSCTL_INT(_net_key, KEYCTL_LARVAL_LIFETIME, larval_lifetime, CTLFLAG_RW, \
563 &key_larval_lifetime, 0, "");
564
565 /* counter for blocking to send SADB_ACQUIRE to IKEd */
566 SYSCTL_INT(_net_key, KEYCTL_BLOCKACQ_COUNT, blockacq_count, CTLFLAG_RW, \
567 &key_blockacq_count, 0, "");
568
569 /* lifetime for blocking to send SADB_ACQUIRE to IKEd */
570 SYSCTL_INT(_net_key, KEYCTL_BLOCKACQ_LIFETIME, blockacq_lifetime, CTLFLAG_RW, \
571 &key_blockacq_lifetime, 0, "");
572
573 /* ESP auth */
574 SYSCTL_INT(_net_key, KEYCTL_ESP_AUTH, esp_auth, CTLFLAG_RW, \
575 &ipsec_esp_auth, 0, "");
576
577 /* minimum ESP key length */
578 SYSCTL_INT(_net_key, KEYCTL_ESP_KEYMIN, esp_keymin, CTLFLAG_RW, \
579 &ipsec_esp_keymin, 0, "");
580
581 /* minimum AH key length */
582 SYSCTL_INT(_net_key, KEYCTL_AH_KEYMIN, ah_keymin, CTLFLAG_RW, \
583 &ipsec_ah_keymin, 0, "");
584
585 /* perfered old SA rather than new SA */
586 SYSCTL_INT(_net_key, KEYCTL_PREFERED_OLDSA, prefered_oldsa, CTLFLAG_RW,\
587 &key_prefered_oldsa, 0, "");
588 #endif /* SYSCTL_INT */
589
590 #define __LIST_CHAINED(elm) \
591 (!((elm)->chain.le_next == NULL && (elm)->chain.le_prev == NULL))
592 #define LIST_INSERT_TAIL(head, elm, type, field) \
593 do {\
594 struct type *curelm = LIST_FIRST(head); \
595 if (curelm == NULL) {\
596 LIST_INSERT_HEAD(head, elm, field); \
597 } else { \
598 while (LIST_NEXT(curelm, field)) \
599 curelm = LIST_NEXT(curelm, field);\
600 LIST_INSERT_AFTER(curelm, elm, field);\
601 }\
602 } while (0)
603
604 #define KEY_CHKSASTATE(head, sav) \
605 /* do */ { \
606 if ((head) != (sav)) { \
607 IPSECLOG(LOG_DEBUG, \
608 "state mismatched (TREE=%d SA=%d)\n", \
609 (head), (sav)); \
610 continue; \
611 } \
612 } /* while (0) */
613
614 #define KEY_CHKSPDIR(head, sp) \
615 do { \
616 if ((head) != (sp)) { \
617 IPSECLOG(LOG_DEBUG, \
618 "direction mismatched (TREE=%d SP=%d), anyway continue.\n",\
619 (head), (sp)); \
620 } \
621 } while (0)
622
623 /*
624 * set parameters into secasindex buffer.
625 * Must allocate secasindex buffer before calling this function.
626 */
627 static int
628 key_setsecasidx(int, int, int, const struct sockaddr *,
629 const struct sockaddr *, struct secasindex *);
630
631 /* key statistics */
632 struct _keystat {
633 u_long getspi_count; /* the avarage of count to try to get new SPI */
634 } keystat;
635
636 static void
637 key_init_spidx_bymsghdr(struct secpolicyindex *, const struct sadb_msghdr *);
638
639 static const struct sockaddr *
640 key_msghdr_get_sockaddr(const struct sadb_msghdr *mhp, int idx)
641 {
642
643 return PFKEY_ADDR_SADDR(mhp->ext[idx]);
644 }
645
646 static void
647 key_fill_replymsg(struct mbuf *m, int seq)
648 {
649 struct sadb_msg *msg;
650
651 KASSERT(m->m_len >= sizeof(*msg));
652
653 msg = mtod(m, struct sadb_msg *);
654 msg->sadb_msg_errno = 0;
655 msg->sadb_msg_len = PFKEY_UNIT64(m->m_pkthdr.len);
656 if (seq != 0)
657 msg->sadb_msg_seq = seq;
658 }
659
660 #if 0
661 static void key_freeso(struct socket *);
662 static void key_freesp_so(struct secpolicy **);
663 #endif
664 static struct secpolicy *key_getsp (const struct secpolicyindex *);
665 static struct secpolicy *key_getspbyid (u_int32_t);
666 static struct secpolicy *key_lookup_and_remove_sp(const struct secpolicyindex *, bool);
667 static struct secpolicy *key_lookupbyid_and_remove_sp(u_int32_t, bool);
668 static void key_destroy_sp(struct secpolicy *);
669 static struct mbuf *key_gather_mbuf (struct mbuf *,
670 const struct sadb_msghdr *, int, int, ...);
671 static int key_api_spdadd(struct socket *, struct mbuf *,
672 const struct sadb_msghdr *);
673 static u_int32_t key_getnewspid (void);
674 static int key_api_spddelete(struct socket *, struct mbuf *,
675 const struct sadb_msghdr *);
676 static int key_api_spddelete2(struct socket *, struct mbuf *,
677 const struct sadb_msghdr *);
678 static int key_api_spdget(struct socket *, struct mbuf *,
679 const struct sadb_msghdr *);
680 static int key_api_spdflush(struct socket *, struct mbuf *,
681 const struct sadb_msghdr *);
682 static int key_api_spddump(struct socket *, struct mbuf *,
683 const struct sadb_msghdr *);
684 static struct mbuf * key_setspddump (int *errorp, pid_t);
685 static struct mbuf * key_setspddump_chain (int *errorp, int *lenp, pid_t pid);
686 static int key_api_nat_map(struct socket *, struct mbuf *,
687 const struct sadb_msghdr *);
688 static struct mbuf *key_setdumpsp (struct secpolicy *,
689 u_int8_t, u_int32_t, pid_t);
690 static u_int key_getspreqmsglen (const struct secpolicy *);
691 static int key_spdexpire (struct secpolicy *);
692 static struct secashead *key_newsah (const struct secasindex *);
693 static void key_unlink_sah(struct secashead *);
694 static void key_destroy_sah(struct secashead *);
695 static bool key_sah_has_sav(struct secashead *);
696 static void key_sah_ref(struct secashead *);
697 static void key_sah_unref(struct secashead *);
698 static void key_init_sav(struct secasvar *);
699 static void key_wait_sav(struct secasvar *);
700 static void key_destroy_sav(struct secasvar *);
701 static struct secasvar *key_newsav(struct mbuf *,
702 const struct sadb_msghdr *, int *, const char*, int);
703 #define KEY_NEWSAV(m, sadb, e) \
704 key_newsav(m, sadb, e, __func__, __LINE__)
705 static void key_delsav (struct secasvar *);
706 static struct secashead *key_getsah(const struct secasindex *, int);
707 static struct secashead *key_getsah_ref(const struct secasindex *, int);
708 static bool key_checkspidup(const struct secasindex *, u_int32_t);
709 static struct secasvar *key_getsavbyspi (struct secashead *, u_int32_t);
710 static int key_setsaval (struct secasvar *, struct mbuf *,
711 const struct sadb_msghdr *);
712 static void key_freesaval(struct secasvar *);
713 static int key_init_xform(struct secasvar *);
714 static void key_clear_xform(struct secasvar *);
715 static struct mbuf *key_setdumpsa (struct secasvar *, u_int8_t,
716 u_int8_t, u_int32_t, u_int32_t);
717 static struct mbuf *key_setsadbxport (u_int16_t, u_int16_t);
718 static struct mbuf *key_setsadbxtype (u_int16_t);
719 static struct mbuf *key_setsadbxfrag (u_int16_t);
720 static void key_porttosaddr (union sockaddr_union *, u_int16_t);
721 static int key_checksalen (const union sockaddr_union *);
722 static struct mbuf *key_setsadbmsg (u_int8_t, u_int16_t, u_int8_t,
723 u_int32_t, pid_t, u_int16_t, int);
724 static struct mbuf *key_setsadbsa (struct secasvar *);
725 static struct mbuf *key_setsadbaddr(u_int16_t,
726 const struct sockaddr *, u_int8_t, u_int16_t, int);
727 #if 0
728 static struct mbuf *key_setsadbident (u_int16_t, u_int16_t, void *,
729 int, u_int64_t);
730 #endif
731 static struct mbuf *key_setsadbxsa2 (u_int8_t, u_int32_t, u_int16_t);
732 static struct mbuf *key_setsadbxpolicy (u_int16_t, u_int8_t,
733 u_int32_t, int);
734 static void *key_newbuf (const void *, u_int);
735 #ifdef INET6
736 static int key_ismyaddr6 (const struct sockaddr_in6 *);
737 #endif
738
739 static void sysctl_net_keyv2_setup(struct sysctllog **);
740 static void sysctl_net_key_compat_setup(struct sysctllog **);
741
742 /* flags for key_saidx_match() */
743 #define CMP_HEAD 1 /* protocol, addresses. */
744 #define CMP_MODE_REQID 2 /* additionally HEAD, reqid, mode. */
745 #define CMP_REQID 3 /* additionally HEAD, reaid. */
746 #define CMP_EXACTLY 4 /* all elements. */
747 static int key_saidx_match(const struct secasindex *,
748 const struct secasindex *, int);
749
750 static int key_sockaddr_match(const struct sockaddr *,
751 const struct sockaddr *, int);
752 static int key_bb_match_withmask(const void *, const void *, u_int);
753 static u_int16_t key_satype2proto (u_int8_t);
754 static u_int8_t key_proto2satype (u_int16_t);
755
756 static int key_spidx_match_exactly(const struct secpolicyindex *,
757 const struct secpolicyindex *);
758 static int key_spidx_match_withmask(const struct secpolicyindex *,
759 const struct secpolicyindex *);
760
761 static int key_api_getspi(struct socket *, struct mbuf *,
762 const struct sadb_msghdr *);
763 static u_int32_t key_do_getnewspi (const struct sadb_spirange *,
764 const struct secasindex *);
765 static int key_handle_natt_info (struct secasvar *,
766 const struct sadb_msghdr *);
767 static int key_set_natt_ports (union sockaddr_union *,
768 union sockaddr_union *,
769 const struct sadb_msghdr *);
770 static int key_api_update(struct socket *, struct mbuf *,
771 const struct sadb_msghdr *);
772 #ifdef IPSEC_DOSEQCHECK
773 static struct secasvar *key_getsavbyseq (struct secashead *, u_int32_t);
774 #endif
775 static int key_api_add(struct socket *, struct mbuf *,
776 const struct sadb_msghdr *);
777 static int key_setident (struct secashead *, struct mbuf *,
778 const struct sadb_msghdr *);
779 static struct mbuf *key_getmsgbuf_x1 (struct mbuf *,
780 const struct sadb_msghdr *);
781 static int key_api_delete(struct socket *, struct mbuf *,
782 const struct sadb_msghdr *);
783 static int key_api_get(struct socket *, struct mbuf *,
784 const struct sadb_msghdr *);
785
786 static void key_getcomb_setlifetime (struct sadb_comb *);
787 static struct mbuf *key_getcomb_esp(int);
788 static struct mbuf *key_getcomb_ah(int);
789 static struct mbuf *key_getcomb_ipcomp(int);
790 static struct mbuf *key_getprop(const struct secasindex *, int);
791
792 static int key_acquire(const struct secasindex *, const struct secpolicy *,
793 int);
794 static int key_acquire_sendup_mbuf_later(struct mbuf *);
795 static void key_acquire_sendup_pending_mbuf(void);
796 #ifndef IPSEC_NONBLOCK_ACQUIRE
797 static struct secacq *key_newacq (const struct secasindex *);
798 static struct secacq *key_getacq (const struct secasindex *);
799 static struct secacq *key_getacqbyseq (u_int32_t);
800 #endif
801 #ifdef notyet
802 static struct secspacq *key_newspacq (const struct secpolicyindex *);
803 static struct secspacq *key_getspacq (const struct secpolicyindex *);
804 #endif
805 static int key_api_acquire(struct socket *, struct mbuf *,
806 const struct sadb_msghdr *);
807 static int key_api_register(struct socket *, struct mbuf *,
808 const struct sadb_msghdr *);
809 static int key_expire (struct secasvar *);
810 static int key_api_flush(struct socket *, struct mbuf *,
811 const struct sadb_msghdr *);
812 static struct mbuf *key_setdump_chain (u_int8_t req_satype, int *errorp,
813 int *lenp, pid_t pid);
814 static int key_api_dump(struct socket *, struct mbuf *,
815 const struct sadb_msghdr *);
816 static int key_api_promisc(struct socket *, struct mbuf *,
817 const struct sadb_msghdr *);
818 static int key_senderror (struct socket *, struct mbuf *, int);
819 static int key_validate_ext (const struct sadb_ext *, int);
820 static int key_align (struct mbuf *, struct sadb_msghdr *);
821 #if 0
822 static const char *key_getfqdn (void);
823 static const char *key_getuserfqdn (void);
824 #endif
825 static void key_sa_chgstate (struct secasvar *, u_int8_t);
826
827 static struct mbuf *key_alloc_mbuf(int, int);
828 static struct mbuf *key_alloc_mbuf_simple(int, int);
829
830 static void key_timehandler(void *);
831 static void key_timehandler_work(struct work *, void *);
832 static struct callout key_timehandler_ch;
833 static struct workqueue *key_timehandler_wq;
834 static struct work key_timehandler_wk;
835
836 static inline void
837 key_savlut_writer_insert_head(struct secasvar *sav);
838 static inline uint32_t
839 key_saidxhash(const struct secasindex *, u_long);
840 static inline uint32_t
841 key_savluthash(const struct sockaddr *,
842 uint32_t, uint32_t, u_long);
843
844 /*
845 * Utilities for percpu counters for sadb_lifetime_allocations and
846 * sadb_lifetime_bytes.
847 */
848 #define LIFETIME_COUNTER_ALLOCATIONS 0
849 #define LIFETIME_COUNTER_BYTES 1
850 #define LIFETIME_COUNTER_SIZE 2
851
852 typedef uint64_t lifetime_counters_t[LIFETIME_COUNTER_SIZE];
853
854 static void
855 key_sum_lifetime_counters(void *p, void *arg, struct cpu_info *ci __unused)
856 {
857 lifetime_counters_t *one = p;
858 lifetime_counters_t *sum = arg;
859
860 (*sum)[LIFETIME_COUNTER_ALLOCATIONS] += (*one)[LIFETIME_COUNTER_ALLOCATIONS];
861 (*sum)[LIFETIME_COUNTER_BYTES] += (*one)[LIFETIME_COUNTER_BYTES];
862 }
863
864 u_int
865 key_sp_refcnt(const struct secpolicy *sp)
866 {
867
868 /* FIXME */
869 return 0;
870 }
871
872 static void
873 key_spd_pserialize_perform(void)
874 {
875
876 KASSERT(mutex_owned(&key_spd.lock));
877
878 while (key_spd.psz_performing)
879 cv_wait(&key_spd.cv_psz, &key_spd.lock);
880 key_spd.psz_performing = true;
881 mutex_exit(&key_spd.lock);
882
883 pserialize_perform(key_spd.psz);
884
885 mutex_enter(&key_spd.lock);
886 key_spd.psz_performing = false;
887 cv_broadcast(&key_spd.cv_psz);
888 }
889
890 /*
891 * Remove the sp from the key_spd.splist and wait for references to the sp
892 * to be released. key_spd.lock must be held.
893 */
894 static void
895 key_unlink_sp(struct secpolicy *sp)
896 {
897
898 KASSERT(mutex_owned(&key_spd.lock));
899
900 sp->state = IPSEC_SPSTATE_DEAD;
901 SPLIST_WRITER_REMOVE(sp);
902
903 /* Invalidate all cached SPD pointers in the PCBs. */
904 ipsec_invalpcbcacheall();
905
906 KDASSERT(mutex_ownable(softnet_lock));
907 key_spd_pserialize_perform();
908
909 localcount_drain(&sp->localcount, &key_spd.cv_lc, &key_spd.lock);
910 }
911
912 /*
913 * Return 0 when there are known to be no SP's for the specified
914 * direction. Otherwise return 1. This is used by IPsec code
915 * to optimize performance.
916 */
917 int
918 key_havesp(u_int dir)
919 {
920 return (dir == IPSEC_DIR_INBOUND || dir == IPSEC_DIR_OUTBOUND ?
921 !SPLIST_READER_EMPTY(dir) : 1);
922 }
923
924 /* %%% IPsec policy management */
925 /*
926 * allocating a SP for OUTBOUND or INBOUND packet.
927 * Must call key_freesp() later.
928 * OUT: NULL: not found
929 * others: found and return the pointer.
930 */
931 struct secpolicy *
932 key_lookup_sp_byspidx(const struct secpolicyindex *spidx,
933 u_int dir, const char* where, int tag)
934 {
935 struct secpolicy *sp;
936 int s;
937
938 KASSERT(spidx != NULL);
939 KASSERTMSG(IPSEC_DIR_IS_INOROUT(dir), "invalid direction %u", dir);
940
941 KEYDEBUG_PRINTF(KEYDEBUG_IPSEC_STAMP, "DP from %s:%u\n", where, tag);
942
943 /* get a SP entry */
944 if (KEYDEBUG_ON(KEYDEBUG_IPSEC_DATA)) {
945 kdebug_secpolicyindex("objects", spidx);
946 }
947
948 s = pserialize_read_enter();
949 SPLIST_READER_FOREACH(sp, dir) {
950 if (KEYDEBUG_ON(KEYDEBUG_IPSEC_DATA)) {
951 kdebug_secpolicyindex("in SPD", &sp->spidx);
952 }
953
954 if (sp->state == IPSEC_SPSTATE_DEAD)
955 continue;
956 if (key_spidx_match_withmask(&sp->spidx, spidx))
957 goto found;
958 }
959 sp = NULL;
960 found:
961 if (sp) {
962 /* sanity check */
963 KEY_CHKSPDIR(sp->spidx.dir, dir);
964
965 /* found a SPD entry */
966 sp->lastused = time_uptime;
967 key_sp_ref(sp, where, tag);
968 }
969 pserialize_read_exit(s);
970
971 KEYDEBUG_PRINTF(KEYDEBUG_IPSEC_STAMP,
972 "DP return SP:%p (ID=%u) refcnt %u\n",
973 sp, sp ? sp->id : 0, key_sp_refcnt(sp));
974 return sp;
975 }
976
977 /*
978 * return a policy that matches this particular inbound packet.
979 * XXX slow
980 */
981 struct secpolicy *
982 key_gettunnel(const struct sockaddr *osrc,
983 const struct sockaddr *odst,
984 const struct sockaddr *isrc,
985 const struct sockaddr *idst,
986 const char* where, int tag)
987 {
988 struct secpolicy *sp;
989 const int dir = IPSEC_DIR_INBOUND;
990 int s;
991 struct ipsecrequest *r1, *r2, *p;
992 struct secpolicyindex spidx;
993
994 KEYDEBUG_PRINTF(KEYDEBUG_IPSEC_STAMP, "DP from %s:%u\n", where, tag);
995
996 if (isrc->sa_family != idst->sa_family) {
997 IPSECLOG(LOG_ERR,
998 "address family mismatched src %u, dst %u.\n",
999 isrc->sa_family, idst->sa_family);
1000 sp = NULL;
1001 goto done;
1002 }
1003
1004 s = pserialize_read_enter();
1005 SPLIST_READER_FOREACH(sp, dir) {
1006 if (sp->state == IPSEC_SPSTATE_DEAD)
1007 continue;
1008
1009 r1 = r2 = NULL;
1010 for (p = sp->req; p; p = p->next) {
1011 if (p->saidx.mode != IPSEC_MODE_TUNNEL)
1012 continue;
1013
1014 r1 = r2;
1015 r2 = p;
1016
1017 if (!r1) {
1018 /* here we look at address matches only */
1019 spidx = sp->spidx;
1020 if (isrc->sa_len > sizeof(spidx.src) ||
1021 idst->sa_len > sizeof(spidx.dst))
1022 continue;
1023 memcpy(&spidx.src, isrc, isrc->sa_len);
1024 memcpy(&spidx.dst, idst, idst->sa_len);
1025 if (!key_spidx_match_withmask(&sp->spidx, &spidx))
1026 continue;
1027 } else {
1028 if (!key_sockaddr_match(&r1->saidx.src.sa, isrc, PORT_NONE) ||
1029 !key_sockaddr_match(&r1->saidx.dst.sa, idst, PORT_NONE))
1030 continue;
1031 }
1032
1033 if (!key_sockaddr_match(&r2->saidx.src.sa, osrc, PORT_NONE) ||
1034 !key_sockaddr_match(&r2->saidx.dst.sa, odst, PORT_NONE))
1035 continue;
1036
1037 goto found;
1038 }
1039 }
1040 sp = NULL;
1041 found:
1042 if (sp) {
1043 sp->lastused = time_uptime;
1044 key_sp_ref(sp, where, tag);
1045 }
1046 pserialize_read_exit(s);
1047 done:
1048 KEYDEBUG_PRINTF(KEYDEBUG_IPSEC_STAMP,
1049 "DP return SP:%p (ID=%u) refcnt %u\n",
1050 sp, sp ? sp->id : 0, key_sp_refcnt(sp));
1051 return sp;
1052 }
1053
1054 /*
1055 * allocating an SA entry for an *OUTBOUND* packet.
1056 * checking each request entries in SP, and acquire an SA if need.
1057 * OUT: 0: there are valid requests.
1058 * ENOENT: policy may be valid, but SA with REQUIRE is on acquiring.
1059 */
1060 int
1061 key_checkrequest(const struct ipsecrequest *isr, const struct secasindex *saidx,
1062 struct secasvar **ret)
1063 {
1064 u_int level;
1065 int error;
1066 struct secasvar *sav;
1067
1068 KASSERT(isr != NULL);
1069 KASSERTMSG(saidx->mode == IPSEC_MODE_TRANSPORT ||
1070 saidx->mode == IPSEC_MODE_TUNNEL,
1071 "unexpected policy %u", saidx->mode);
1072
1073 /* get current level */
1074 level = ipsec_get_reqlevel(isr);
1075
1076 /*
1077 * XXX guard against protocol callbacks from the crypto
1078 * thread as they reference ipsecrequest.sav which we
1079 * temporarily null out below. Need to rethink how we
1080 * handle bundled SA's in the callback thread.
1081 */
1082
1083 sav = key_lookup_sa_bysaidx(saidx);
1084 if (sav != NULL) {
1085 *ret = sav;
1086 return 0;
1087 }
1088
1089 /* there is no SA */
1090 error = key_acquire(saidx, isr->sp, M_NOWAIT);
1091 if (error != 0) {
1092 /* XXX What should I do ? */
1093 IPSECLOG(LOG_DEBUG, "error %d returned from key_acquire.\n",
1094 error);
1095 return error;
1096 }
1097
1098 if (level != IPSEC_LEVEL_REQUIRE) {
1099 /* XXX sigh, the interface to this routine is botched */
1100 *ret = NULL;
1101 return 0;
1102 } else {
1103 return ENOENT;
1104 }
1105 }
1106
1107 /*
1108 * looking up a SA for policy entry from SAD.
1109 * NOTE: searching SAD of aliving state.
1110 * OUT: NULL: not found.
1111 * others: found and return the pointer.
1112 */
1113 struct secasvar *
1114 key_lookup_sa_bysaidx(const struct secasindex *saidx)
1115 {
1116 struct secashead *sah;
1117 struct secasvar *sav = NULL;
1118 u_int stateidx, state;
1119 const u_int *saorder_state_valid;
1120 int arraysize;
1121 int s;
1122
1123 s = pserialize_read_enter();
1124 sah = key_getsah(saidx, CMP_MODE_REQID);
1125 if (sah == NULL)
1126 goto out;
1127
1128 /*
1129 * search a valid state list for outbound packet.
1130 * This search order is important.
1131 */
1132 if (key_prefered_oldsa) {
1133 saorder_state_valid = saorder_state_valid_prefer_old;
1134 arraysize = _ARRAYLEN(saorder_state_valid_prefer_old);
1135 } else {
1136 saorder_state_valid = saorder_state_valid_prefer_new;
1137 arraysize = _ARRAYLEN(saorder_state_valid_prefer_new);
1138 }
1139
1140 /* search valid state */
1141 for (stateidx = 0;
1142 stateidx < arraysize;
1143 stateidx++) {
1144
1145 state = saorder_state_valid[stateidx];
1146
1147 if (key_prefered_oldsa)
1148 sav = SAVLIST_READER_FIRST(sah, state);
1149 else {
1150 /* XXX need O(1) lookup */
1151 struct secasvar *last = NULL;
1152
1153 SAVLIST_READER_FOREACH(sav, sah, state)
1154 last = sav;
1155 sav = last;
1156 }
1157 if (sav != NULL) {
1158 KEY_SA_REF(sav);
1159 KEYDEBUG_PRINTF(KEYDEBUG_IPSEC_STAMP,
1160 "DP cause refcnt++:%d SA:%p\n",
1161 key_sa_refcnt(sav), sav);
1162 break;
1163 }
1164 }
1165 out:
1166 pserialize_read_exit(s);
1167
1168 return sav;
1169 }
1170
1171 #if 0
1172 static void
1173 key_sendup_message_delete(struct secasvar *sav)
1174 {
1175 struct mbuf *m, *result = 0;
1176 uint8_t satype;
1177
1178 satype = key_proto2satype(sav->sah->saidx.proto);
1179 if (satype == 0)
1180 goto msgfail;
1181
1182 m = key_setsadbmsg(SADB_DELETE, 0, satype, 0, 0, key_sa_refcnt(sav) - 1);
1183 if (m == NULL)
1184 goto msgfail;
1185 result = m;
1186
1187 /* set sadb_address for saidx's. */
1188 m = key_setsadbaddr(SADB_EXT_ADDRESS_SRC, &sav->sah->saidx.src.sa,
1189 _BITS(sav->sah->saidx.src.sa.sa_len), IPSEC_ULPROTO_ANY);
1190 if (m == NULL)
1191 goto msgfail;
1192 m_cat(result, m);
1193
1194 /* set sadb_address for saidx's. */
1195 m = key_setsadbaddr(SADB_EXT_ADDRESS_DST, &sav->sah->saidx.src.sa,
1196 _BITS(sav->sah->saidx.src.sa.sa_len), IPSEC_ULPROTO_ANY);
1197 if (m == NULL)
1198 goto msgfail;
1199 m_cat(result, m);
1200
1201 /* create SA extension */
1202 m = key_setsadbsa(sav);
1203 if (m == NULL)
1204 goto msgfail;
1205 m_cat(result, m);
1206
1207 if (result->m_len < sizeof(struct sadb_msg)) {
1208 result = m_pullup(result, sizeof(struct sadb_msg));
1209 if (result == NULL)
1210 goto msgfail;
1211 }
1212
1213 result->m_pkthdr.len = 0;
1214 for (m = result; m; m = m->m_next)
1215 result->m_pkthdr.len += m->m_len;
1216 mtod(result, struct sadb_msg *)->sadb_msg_len =
1217 PFKEY_UNIT64(result->m_pkthdr.len);
1218
1219 key_sendup_mbuf(NULL, result, KEY_SENDUP_REGISTERED);
1220 result = NULL;
1221 msgfail:
1222 if (result)
1223 m_freem(result);
1224 }
1225 #endif
1226
1227 /*
1228 * allocating a usable SA entry for a *INBOUND* packet.
1229 * Must call key_freesav() later.
1230 * OUT: positive: pointer to a usable sav (i.e. MATURE or DYING state).
1231 * NULL: not found, or error occurred.
1232 *
1233 * In the comparison, no source address is used--for RFC2401 conformance.
1234 * To quote, from section 4.1:
1235 * A security association is uniquely identified by a triple consisting
1236 * of a Security Parameter Index (SPI), an IP Destination Address, and a
1237 * security protocol (AH or ESP) identifier.
1238 * Note that, however, we do need to keep source address in IPsec SA.
1239 * IKE specification and PF_KEY specification do assume that we
1240 * keep source address in IPsec SA. We see a tricky situation here.
1241 *
1242 * sport and dport are used for NAT-T. network order is always used.
1243 */
1244 struct secasvar *
1245 key_lookup_sa(
1246 const union sockaddr_union *dst,
1247 u_int proto,
1248 u_int32_t spi,
1249 u_int16_t sport,
1250 u_int16_t dport,
1251 const char* where, int tag)
1252 {
1253 struct secasvar *sav;
1254 int chkport;
1255 int s;
1256
1257 int must_check_spi = 1;
1258 int must_check_alg = 0;
1259 u_int16_t cpi = 0;
1260 u_int8_t algo = 0;
1261 uint32_t hash_key = spi;
1262
1263 if ((sport != 0) && (dport != 0))
1264 chkport = PORT_STRICT;
1265 else
1266 chkport = PORT_NONE;
1267
1268 KASSERT(dst != NULL);
1269
1270 /*
1271 * XXX IPCOMP case
1272 * We use cpi to define spi here. In the case where cpi <=
1273 * IPCOMP_CPI_NEGOTIATE_MIN, cpi just define the algorithm used, not
1274 * the real spi. In this case, don't check the spi but check the
1275 * algorithm
1276 */
1277
1278 if (proto == IPPROTO_IPCOMP) {
1279 u_int32_t tmp;
1280 tmp = ntohl(spi);
1281 cpi = (u_int16_t) tmp;
1282 if (cpi < IPCOMP_CPI_NEGOTIATE_MIN) {
1283 algo = (u_int8_t) cpi;
1284 hash_key = algo;
1285 must_check_spi = 0;
1286 must_check_alg = 1;
1287 }
1288 }
1289 KEYDEBUG_PRINTF(KEYDEBUG_IPSEC_STAMP,
1290 "DP from %s:%u check_spi=%d, check_alg=%d\n",
1291 where, tag, must_check_spi, must_check_alg);
1292
1293
1294 /*
1295 * searching SAD.
1296 * XXX: to be checked internal IP header somewhere. Also when
1297 * IPsec tunnel packet is received. But ESP tunnel mode is
1298 * encrypted so we can't check internal IP header.
1299 */
1300 s = pserialize_read_enter();
1301 SAVLUT_READER_FOREACH(sav, &dst->sa, proto, hash_key) {
1302 KEYDEBUG_PRINTF(KEYDEBUG_MATCH,
1303 "try match spi %#x, %#x\n",
1304 ntohl(spi), ntohl(sav->spi));
1305
1306 /* do not return entries w/ unusable state */
1307 if (!SADB_SASTATE_USABLE_P(sav)) {
1308 KEYDEBUG_PRINTF(KEYDEBUG_MATCH,
1309 "bad state %d\n", sav->state);
1310 continue;
1311 }
1312 if (proto != sav->sah->saidx.proto) {
1313 KEYDEBUG_PRINTF(KEYDEBUG_MATCH,
1314 "proto fail %d != %d\n",
1315 proto, sav->sah->saidx.proto);
1316 continue;
1317 }
1318 if (must_check_spi && spi != sav->spi) {
1319 KEYDEBUG_PRINTF(KEYDEBUG_MATCH,
1320 "spi fail %#x != %#x\n",
1321 ntohl(spi), ntohl(sav->spi));
1322 continue;
1323 }
1324 /* XXX only on the ipcomp case */
1325 if (must_check_alg && algo != sav->alg_comp) {
1326 KEYDEBUG_PRINTF(KEYDEBUG_MATCH,
1327 "algo fail %d != %d\n",
1328 algo, sav->alg_comp);
1329 continue;
1330 }
1331
1332 #if 0 /* don't check src */
1333 /* Fix port in src->sa */
1334
1335 /* check src address */
1336 if (!key_sockaddr_match(&src->sa, &sav->sah->saidx.src.sa, PORT_NONE))
1337 continue;
1338 #endif
1339 /* fix port of dst address XXX*/
1340 key_porttosaddr(__UNCONST(dst), dport);
1341 /* check dst address */
1342 if (!key_sockaddr_match(&dst->sa, &sav->sah->saidx.dst.sa, chkport))
1343 continue;
1344 key_sa_ref(sav, where, tag);
1345 goto done;
1346 }
1347 sav = NULL;
1348 done:
1349 pserialize_read_exit(s);
1350
1351 KEYDEBUG_PRINTF(KEYDEBUG_IPSEC_STAMP,
1352 "DP return SA:%p; refcnt %u\n", sav, key_sa_refcnt(sav));
1353 return sav;
1354 }
1355
1356 static void
1357 key_validate_savlist(const struct secashead *sah, const u_int state)
1358 {
1359 #ifdef DEBUG
1360 struct secasvar *sav, *next;
1361 int s;
1362
1363 /*
1364 * The list should be sorted by lft_c->sadb_lifetime_addtime
1365 * in ascending order.
1366 */
1367 s = pserialize_read_enter();
1368 SAVLIST_READER_FOREACH(sav, sah, state) {
1369 next = SAVLIST_READER_NEXT(sav);
1370 if (next != NULL &&
1371 sav->lft_c != NULL && next->lft_c != NULL) {
1372 KDASSERTMSG(sav->lft_c->sadb_lifetime_addtime <=
1373 next->lft_c->sadb_lifetime_addtime,
1374 "savlist is not sorted: sah=%p, state=%d, "
1375 "sav=%" PRIu64 ", next=%" PRIu64, sah, state,
1376 sav->lft_c->sadb_lifetime_addtime,
1377 next->lft_c->sadb_lifetime_addtime);
1378 }
1379 }
1380 pserialize_read_exit(s);
1381 #endif
1382 }
1383
1384 void
1385 key_init_sp(struct secpolicy *sp)
1386 {
1387
1388 ASSERT_SLEEPABLE();
1389
1390 sp->state = IPSEC_SPSTATE_ALIVE;
1391 if (sp->policy == IPSEC_POLICY_IPSEC)
1392 KASSERT(sp->req != NULL);
1393 localcount_init(&sp->localcount);
1394 SPLIST_ENTRY_INIT(sp);
1395 }
1396
1397 /*
1398 * Must be called in a pserialize read section. A held SP
1399 * must be released by key_sp_unref after use.
1400 */
1401 void
1402 key_sp_ref(struct secpolicy *sp, const char* where, int tag)
1403 {
1404
1405 localcount_acquire(&sp->localcount);
1406
1407 KEYDEBUG_PRINTF(KEYDEBUG_IPSEC_STAMP,
1408 "DP SP:%p (ID=%u) from %s:%u; refcnt++ now %u\n",
1409 sp, sp->id, where, tag, key_sp_refcnt(sp));
1410 }
1411
1412 /*
1413 * Must be called without holding key_spd.lock because the lock
1414 * would be held in localcount_release.
1415 */
1416 void
1417 key_sp_unref(struct secpolicy *sp, const char* where, int tag)
1418 {
1419
1420 KDASSERT(mutex_ownable(&key_spd.lock));
1421
1422 KEYDEBUG_PRINTF(KEYDEBUG_IPSEC_STAMP,
1423 "DP SP:%p (ID=%u) from %s:%u; refcnt-- now %u\n",
1424 sp, sp->id, where, tag, key_sp_refcnt(sp));
1425
1426 localcount_release(&sp->localcount, &key_spd.cv_lc, &key_spd.lock);
1427 }
1428
1429 static void
1430 key_init_sav(struct secasvar *sav)
1431 {
1432
1433 ASSERT_SLEEPABLE();
1434
1435 localcount_init(&sav->localcount);
1436 SAVLIST_ENTRY_INIT(sav);
1437 SAVLUT_ENTRY_INIT(sav);
1438 }
1439
1440 u_int
1441 key_sa_refcnt(const struct secasvar *sav)
1442 {
1443
1444 /* FIXME */
1445 return 0;
1446 }
1447
1448 void
1449 key_sa_ref(struct secasvar *sav, const char* where, int tag)
1450 {
1451
1452 localcount_acquire(&sav->localcount);
1453
1454 KEYDEBUG_PRINTF(KEYDEBUG_IPSEC_STAMP,
1455 "DP cause refcnt++: SA:%p from %s:%u\n",
1456 sav, where, tag);
1457 }
1458
1459 void
1460 key_sa_unref(struct secasvar *sav, const char* where, int tag)
1461 {
1462
1463 KDASSERT(mutex_ownable(&key_sad.lock));
1464
1465 KEYDEBUG_PRINTF(KEYDEBUG_IPSEC_STAMP,
1466 "DP cause refcnt--: SA:%p from %s:%u\n",
1467 sav, where, tag);
1468
1469 localcount_release(&sav->localcount, &key_sad.cv_lc, &key_sad.lock);
1470 }
1471
1472 #if 0
1473 /*
1474 * Must be called after calling key_lookup_sp*().
1475 * For the packet with socket.
1476 */
1477 static void
1478 key_freeso(struct socket *so)
1479 {
1480 /* sanity check */
1481 KASSERT(so != NULL);
1482
1483 switch (so->so_proto->pr_domain->dom_family) {
1484 #ifdef INET
1485 case PF_INET:
1486 {
1487 struct inpcb *pcb = sotoinpcb(so);
1488
1489 /* Does it have a PCB ? */
1490 if (pcb == NULL)
1491 return;
1492
1493 struct inpcbpolicy *sp = pcb->inp_sp;
1494 key_freesp_so(&sp->sp_in);
1495 key_freesp_so(&sp->sp_out);
1496 }
1497 break;
1498 #endif
1499 #ifdef INET6
1500 case PF_INET6:
1501 {
1502 #ifdef HAVE_NRL_INPCB
1503 struct inpcb *pcb = sotoinpcb(so);
1504 struct inpcbpolicy *sp = pcb->inp_sp;
1505
1506 /* Does it have a PCB ? */
1507 if (pcb == NULL)
1508 return;
1509 key_freesp_so(&sp->sp_in);
1510 key_freesp_so(&sp->sp_out);
1511 #else
1512 struct in6pcb *pcb = sotoin6pcb(so);
1513
1514 /* Does it have a PCB ? */
1515 if (pcb == NULL)
1516 return;
1517 key_freesp_so(&pcb->in6p_sp->sp_in);
1518 key_freesp_so(&pcb->in6p_sp->sp_out);
1519 #endif
1520 }
1521 break;
1522 #endif /* INET6 */
1523 default:
1524 IPSECLOG(LOG_DEBUG, "unknown address family=%d.\n",
1525 so->so_proto->pr_domain->dom_family);
1526 return;
1527 }
1528 }
1529
1530 static void
1531 key_freesp_so(struct secpolicy **sp)
1532 {
1533
1534 KASSERT(sp != NULL);
1535 KASSERT(*sp != NULL);
1536
1537 if ((*sp)->policy == IPSEC_POLICY_ENTRUST ||
1538 (*sp)->policy == IPSEC_POLICY_BYPASS)
1539 return;
1540
1541 KASSERTMSG((*sp)->policy == IPSEC_POLICY_IPSEC,
1542 "invalid policy %u", (*sp)->policy);
1543 KEY_SP_UNREF(&sp);
1544 }
1545 #endif
1546
1547 static void
1548 key_sad_pserialize_perform(void)
1549 {
1550
1551 KASSERT(mutex_owned(&key_sad.lock));
1552
1553 while (key_sad.psz_performing)
1554 cv_wait(&key_sad.cv_psz, &key_sad.lock);
1555 key_sad.psz_performing = true;
1556 mutex_exit(&key_sad.lock);
1557
1558 pserialize_perform(key_sad.psz);
1559
1560 mutex_enter(&key_sad.lock);
1561 key_sad.psz_performing = false;
1562 cv_broadcast(&key_sad.cv_psz);
1563 }
1564
1565 /*
1566 * Remove the sav from the savlist of its sah and wait for references to the sav
1567 * to be released. key_sad.lock must be held.
1568 */
1569 static void
1570 key_unlink_sav(struct secasvar *sav)
1571 {
1572
1573 KASSERT(mutex_owned(&key_sad.lock));
1574
1575 SAVLIST_WRITER_REMOVE(sav);
1576 SAVLUT_WRITER_REMOVE(sav);
1577
1578 KDASSERT(mutex_ownable(softnet_lock));
1579 key_sad_pserialize_perform();
1580
1581 localcount_drain(&sav->localcount, &key_sad.cv_lc, &key_sad.lock);
1582 }
1583
1584 /*
1585 * Destroy an sav where the sav must be unlinked from an sah
1586 * by say key_unlink_sav.
1587 */
1588 static void
1589 key_destroy_sav(struct secasvar *sav)
1590 {
1591
1592 ASSERT_SLEEPABLE();
1593
1594 localcount_fini(&sav->localcount);
1595 SAVLIST_ENTRY_DESTROY(sav);
1596
1597 key_delsav(sav);
1598 }
1599
1600 /*
1601 * Wait for references of a passed sav to go away.
1602 */
1603 static void
1604 key_wait_sav(struct secasvar *sav)
1605 {
1606
1607 ASSERT_SLEEPABLE();
1608
1609 mutex_enter(&key_sad.lock);
1610 KASSERT(sav->state == SADB_SASTATE_DEAD);
1611 KDASSERT(mutex_ownable(softnet_lock));
1612 key_sad_pserialize_perform();
1613 localcount_drain(&sav->localcount, &key_sad.cv_lc, &key_sad.lock);
1614 mutex_exit(&key_sad.lock);
1615 }
1616
1617 /* %%% SPD management */
1618 /*
1619 * free security policy entry.
1620 */
1621 static void
1622 key_destroy_sp(struct secpolicy *sp)
1623 {
1624
1625 SPLIST_ENTRY_DESTROY(sp);
1626 localcount_fini(&sp->localcount);
1627
1628 key_free_sp(sp);
1629
1630 key_update_used();
1631 }
1632
1633 void
1634 key_free_sp(struct secpolicy *sp)
1635 {
1636 struct ipsecrequest *isr = sp->req, *nextisr;
1637
1638 while (isr != NULL) {
1639 nextisr = isr->next;
1640 kmem_free(isr, sizeof(*isr));
1641 isr = nextisr;
1642 }
1643
1644 kmem_free(sp, sizeof(*sp));
1645 }
1646
1647 void
1648 key_socksplist_add(struct secpolicy *sp)
1649 {
1650
1651 mutex_enter(&key_spd.lock);
1652 PSLIST_WRITER_INSERT_HEAD(&key_spd.socksplist, sp, pslist_entry);
1653 mutex_exit(&key_spd.lock);
1654
1655 key_update_used();
1656 }
1657
1658 /*
1659 * search SPD
1660 * OUT: NULL : not found
1661 * others : found, pointer to a SP.
1662 */
1663 static struct secpolicy *
1664 key_getsp(const struct secpolicyindex *spidx)
1665 {
1666 struct secpolicy *sp;
1667 int s;
1668
1669 KASSERT(spidx != NULL);
1670
1671 s = pserialize_read_enter();
1672 SPLIST_READER_FOREACH(sp, spidx->dir) {
1673 if (sp->state == IPSEC_SPSTATE_DEAD)
1674 continue;
1675 if (key_spidx_match_exactly(spidx, &sp->spidx)) {
1676 KEY_SP_REF(sp);
1677 pserialize_read_exit(s);
1678 return sp;
1679 }
1680 }
1681 pserialize_read_exit(s);
1682
1683 return NULL;
1684 }
1685
1686 /*
1687 * search SPD and remove found SP
1688 * OUT: NULL : not found
1689 * others : found, pointer to a SP.
1690 */
1691 static struct secpolicy *
1692 key_lookup_and_remove_sp(const struct secpolicyindex *spidx, bool from_kernel)
1693 {
1694 struct secpolicy *sp = NULL;
1695
1696 mutex_enter(&key_spd.lock);
1697 SPLIST_WRITER_FOREACH(sp, spidx->dir) {
1698 KASSERT(sp->state != IPSEC_SPSTATE_DEAD);
1699 /*
1700 * SPs created in kernel(e.g. ipsec(4) I/F) must not be
1701 * removed by userland programs.
1702 */
1703 if (!from_kernel && sp->origin == IPSEC_SPORIGIN_KERNEL)
1704 continue;
1705 if (key_spidx_match_exactly(spidx, &sp->spidx)) {
1706 key_unlink_sp(sp);
1707 goto out;
1708 }
1709 }
1710 sp = NULL;
1711 out:
1712 mutex_exit(&key_spd.lock);
1713
1714 return sp;
1715 }
1716
1717 /*
1718 * get SP by index.
1719 * OUT: NULL : not found
1720 * others : found, pointer to a SP.
1721 */
1722 static struct secpolicy *
1723 key_getspbyid(u_int32_t id)
1724 {
1725 struct secpolicy *sp;
1726 int s;
1727
1728 s = pserialize_read_enter();
1729 SPLIST_READER_FOREACH(sp, IPSEC_DIR_INBOUND) {
1730 if (sp->state == IPSEC_SPSTATE_DEAD)
1731 continue;
1732 if (sp->id == id) {
1733 KEY_SP_REF(sp);
1734 goto out;
1735 }
1736 }
1737
1738 SPLIST_READER_FOREACH(sp, IPSEC_DIR_OUTBOUND) {
1739 if (sp->state == IPSEC_SPSTATE_DEAD)
1740 continue;
1741 if (sp->id == id) {
1742 KEY_SP_REF(sp);
1743 goto out;
1744 }
1745 }
1746 out:
1747 pserialize_read_exit(s);
1748 return sp;
1749 }
1750
1751 /*
1752 * get SP by index, remove and return it.
1753 * OUT: NULL : not found
1754 * others : found, pointer to a SP.
1755 */
1756 static struct secpolicy *
1757 key_lookupbyid_and_remove_sp(u_int32_t id, bool from_kernel)
1758 {
1759 struct secpolicy *sp;
1760
1761 mutex_enter(&key_spd.lock);
1762 SPLIST_READER_FOREACH(sp, IPSEC_DIR_INBOUND) {
1763 KASSERT(sp->state != IPSEC_SPSTATE_DEAD);
1764 /*
1765 * SPs created in kernel(e.g. ipsec(4) I/F) must not be
1766 * removed by userland programs.
1767 */
1768 if (!from_kernel && sp->origin == IPSEC_SPORIGIN_KERNEL)
1769 continue;
1770 if (sp->id == id)
1771 goto out;
1772 }
1773
1774 SPLIST_READER_FOREACH(sp, IPSEC_DIR_OUTBOUND) {
1775 KASSERT(sp->state != IPSEC_SPSTATE_DEAD);
1776 /*
1777 * SPs created in kernel(e.g. ipsec(4) I/F) must not be
1778 * removed by userland programs.
1779 */
1780 if (!from_kernel && sp->origin == IPSEC_SPORIGIN_KERNEL)
1781 continue;
1782 if (sp->id == id)
1783 goto out;
1784 }
1785 out:
1786 if (sp != NULL)
1787 key_unlink_sp(sp);
1788 mutex_exit(&key_spd.lock);
1789 return sp;
1790 }
1791
1792 struct secpolicy *
1793 key_newsp(const char* where, int tag)
1794 {
1795 struct secpolicy *newsp = NULL;
1796
1797 newsp = kmem_zalloc(sizeof(struct secpolicy), KM_SLEEP);
1798
1799 KEYDEBUG_PRINTF(KEYDEBUG_IPSEC_STAMP,
1800 "DP from %s:%u return SP:%p\n", where, tag, newsp);
1801 return newsp;
1802 }
1803
1804 /*
1805 * create secpolicy structure from sadb_x_policy structure.
1806 * NOTE: `state', `secpolicyindex' in secpolicy structure are not set,
1807 * so must be set properly later.
1808 */
1809 static struct secpolicy *
1810 _key_msg2sp(const struct sadb_x_policy *xpl0, size_t len, int *error,
1811 bool from_kernel)
1812 {
1813 struct secpolicy *newsp;
1814
1815 KASSERT(!cpu_softintr_p());
1816 KASSERT(xpl0 != NULL);
1817 KASSERT(len >= sizeof(*xpl0));
1818
1819 if (len != PFKEY_EXTLEN(xpl0)) {
1820 IPSECLOG(LOG_DEBUG, "Invalid msg length.\n");
1821 *error = EINVAL;
1822 return NULL;
1823 }
1824
1825 newsp = KEY_NEWSP();
1826 if (newsp == NULL) {
1827 *error = ENOBUFS;
1828 return NULL;
1829 }
1830
1831 newsp->spidx.dir = xpl0->sadb_x_policy_dir;
1832 newsp->policy = xpl0->sadb_x_policy_type;
1833
1834 /* check policy */
1835 switch (xpl0->sadb_x_policy_type) {
1836 case IPSEC_POLICY_DISCARD:
1837 case IPSEC_POLICY_NONE:
1838 case IPSEC_POLICY_ENTRUST:
1839 case IPSEC_POLICY_BYPASS:
1840 newsp->req = NULL;
1841 *error = 0;
1842 return newsp;
1843
1844 case IPSEC_POLICY_IPSEC:
1845 /* Continued */
1846 break;
1847 default:
1848 IPSECLOG(LOG_DEBUG, "invalid policy type.\n");
1849 key_free_sp(newsp);
1850 *error = EINVAL;
1851 return NULL;
1852 }
1853
1854 /* IPSEC_POLICY_IPSEC */
1855 {
1856 int tlen;
1857 const struct sadb_x_ipsecrequest *xisr;
1858 uint16_t xisr_reqid;
1859 struct ipsecrequest **p_isr = &newsp->req;
1860
1861 /* validity check */
1862 if (PFKEY_EXTLEN(xpl0) < sizeof(*xpl0)) {
1863 IPSECLOG(LOG_DEBUG, "Invalid msg length.\n");
1864 *error = EINVAL;
1865 goto free_exit;
1866 }
1867
1868 tlen = PFKEY_EXTLEN(xpl0) - sizeof(*xpl0);
1869 xisr = (const struct sadb_x_ipsecrequest *)(xpl0 + 1);
1870
1871 while (tlen > 0) {
1872 /* length check */
1873 if (xisr->sadb_x_ipsecrequest_len < sizeof(*xisr)) {
1874 IPSECLOG(LOG_DEBUG, "invalid ipsecrequest length.\n");
1875 *error = EINVAL;
1876 goto free_exit;
1877 }
1878
1879 /* allocate request buffer */
1880 *p_isr = kmem_zalloc(sizeof(**p_isr), KM_SLEEP);
1881
1882 /* set values */
1883 (*p_isr)->next = NULL;
1884
1885 switch (xisr->sadb_x_ipsecrequest_proto) {
1886 case IPPROTO_ESP:
1887 case IPPROTO_AH:
1888 case IPPROTO_IPCOMP:
1889 break;
1890 default:
1891 IPSECLOG(LOG_DEBUG, "invalid proto type=%u\n",
1892 xisr->sadb_x_ipsecrequest_proto);
1893 *error = EPROTONOSUPPORT;
1894 goto free_exit;
1895 }
1896 (*p_isr)->saidx.proto = xisr->sadb_x_ipsecrequest_proto;
1897
1898 switch (xisr->sadb_x_ipsecrequest_mode) {
1899 case IPSEC_MODE_TRANSPORT:
1900 case IPSEC_MODE_TUNNEL:
1901 break;
1902 case IPSEC_MODE_ANY:
1903 default:
1904 IPSECLOG(LOG_DEBUG, "invalid mode=%u\n",
1905 xisr->sadb_x_ipsecrequest_mode);
1906 *error = EINVAL;
1907 goto free_exit;
1908 }
1909 (*p_isr)->saidx.mode = xisr->sadb_x_ipsecrequest_mode;
1910
1911 switch (xisr->sadb_x_ipsecrequest_level) {
1912 case IPSEC_LEVEL_DEFAULT:
1913 case IPSEC_LEVEL_USE:
1914 case IPSEC_LEVEL_REQUIRE:
1915 break;
1916 case IPSEC_LEVEL_UNIQUE:
1917 xisr_reqid = xisr->sadb_x_ipsecrequest_reqid;
1918 /* validity check */
1919 /*
1920 * case 1) from_kernel == false
1921 * That means the request comes from userland.
1922 * If range violation of reqid, kernel will
1923 * update it, don't refuse it.
1924 *
1925 * case 2) from_kernel == true
1926 * That means the request comes from kernel
1927 * (e.g. ipsec(4) I/F).
1928 * Use thre requested reqid to avoid inconsistency
1929 * between kernel's reqid and the reqid in pf_key
1930 * message sent to userland. The pf_key message is
1931 * built by diverting request mbuf.
1932 */
1933 if (!from_kernel &&
1934 xisr_reqid > IPSEC_MANUAL_REQID_MAX) {
1935 IPSECLOG(LOG_DEBUG,
1936 "reqid=%d range "
1937 "violation, updated by kernel.\n",
1938 xisr_reqid);
1939 xisr_reqid = 0;
1940 }
1941
1942 /* allocate new reqid id if reqid is zero. */
1943 if (xisr_reqid == 0) {
1944 u_int16_t reqid = key_newreqid();
1945 if (reqid == 0) {
1946 *error = ENOBUFS;
1947 goto free_exit;
1948 }
1949 (*p_isr)->saidx.reqid = reqid;
1950 } else {
1951 /* set it for manual keying. */
1952 (*p_isr)->saidx.reqid = xisr_reqid;
1953 }
1954 break;
1955
1956 default:
1957 IPSECLOG(LOG_DEBUG, "invalid level=%u\n",
1958 xisr->sadb_x_ipsecrequest_level);
1959 *error = EINVAL;
1960 goto free_exit;
1961 }
1962 (*p_isr)->level = xisr->sadb_x_ipsecrequest_level;
1963
1964 /* set IP addresses if there */
1965 /*
1966 * NOTE:
1967 * MOBIKE Extensions for PF_KEY draft says:
1968 * If tunnel mode is specified, the sadb_x_ipsecrequest
1969 * structure is followed by two sockaddr structures that
1970 * define the tunnel endpoint addresses. In the case that
1971 * transport mode is used, no additional addresses are
1972 * specified.
1973 * see: https://tools.ietf.org/html/draft-schilcher-mobike-pfkey-extension-01
1974 *
1975 * And then, the IP addresses will be set by
1976 * ipsec_fill_saidx_bymbuf() from packet in transport mode.
1977 * This behavior is used by NAT-T enabled ipsecif(4).
1978 */
1979 if (xisr->sadb_x_ipsecrequest_len > sizeof(*xisr)) {
1980 const struct sockaddr *paddr;
1981
1982 paddr = (const struct sockaddr *)(xisr + 1);
1983
1984 /* validity check */
1985 if (paddr->sa_len > sizeof((*p_isr)->saidx.src)) {
1986 IPSECLOG(LOG_DEBUG, "invalid request "
1987 "address length.\n");
1988 *error = EINVAL;
1989 goto free_exit;
1990 }
1991 memcpy(&(*p_isr)->saidx.src, paddr, paddr->sa_len);
1992
1993 paddr = (const struct sockaddr *)((const char *)paddr
1994 + paddr->sa_len);
1995
1996 /* validity check */
1997 if (paddr->sa_len > sizeof((*p_isr)->saidx.dst)) {
1998 IPSECLOG(LOG_DEBUG, "invalid request "
1999 "address length.\n");
2000 *error = EINVAL;
2001 goto free_exit;
2002 }
2003 memcpy(&(*p_isr)->saidx.dst, paddr, paddr->sa_len);
2004 }
2005
2006 (*p_isr)->sp = newsp;
2007
2008 /* initialization for the next. */
2009 p_isr = &(*p_isr)->next;
2010 tlen -= xisr->sadb_x_ipsecrequest_len;
2011
2012 /* validity check */
2013 if (tlen < 0) {
2014 IPSECLOG(LOG_DEBUG, "becoming tlen < 0.\n");
2015 *error = EINVAL;
2016 goto free_exit;
2017 }
2018
2019 xisr = (const struct sadb_x_ipsecrequest *)((const char *)xisr +
2020 xisr->sadb_x_ipsecrequest_len);
2021 }
2022 }
2023
2024 *error = 0;
2025 return newsp;
2026
2027 free_exit:
2028 key_free_sp(newsp);
2029 return NULL;
2030 }
2031
2032 struct secpolicy *
2033 key_msg2sp(const struct sadb_x_policy *xpl0, size_t len, int *error)
2034 {
2035
2036 return _key_msg2sp(xpl0, len, error, false);
2037 }
2038
2039 u_int16_t
2040 key_newreqid(void)
2041 {
2042 static u_int16_t auto_reqid = IPSEC_MANUAL_REQID_MAX + 1;
2043
2044 auto_reqid = (auto_reqid == 0xffff ?
2045 IPSEC_MANUAL_REQID_MAX + 1 : auto_reqid + 1);
2046
2047 /* XXX should be unique check */
2048
2049 return auto_reqid;
2050 }
2051
2052 /*
2053 * copy secpolicy struct to sadb_x_policy structure indicated.
2054 */
2055 struct mbuf *
2056 key_sp2msg(const struct secpolicy *sp, int mflag)
2057 {
2058 struct sadb_x_policy *xpl;
2059 int tlen;
2060 char *p;
2061 struct mbuf *m;
2062
2063 KASSERT(sp != NULL);
2064
2065 tlen = key_getspreqmsglen(sp);
2066
2067 m = key_alloc_mbuf(tlen, mflag);
2068 if (!m || m->m_next) { /*XXX*/
2069 if (m)
2070 m_freem(m);
2071 return NULL;
2072 }
2073
2074 m->m_len = tlen;
2075 m->m_next = NULL;
2076 xpl = mtod(m, struct sadb_x_policy *);
2077 memset(xpl, 0, tlen);
2078
2079 xpl->sadb_x_policy_len = PFKEY_UNIT64(tlen);
2080 xpl->sadb_x_policy_exttype = SADB_X_EXT_POLICY;
2081 xpl->sadb_x_policy_type = sp->policy;
2082 xpl->sadb_x_policy_dir = sp->spidx.dir;
2083 xpl->sadb_x_policy_id = sp->id;
2084 p = (char *)xpl + sizeof(*xpl);
2085
2086 /* if is the policy for ipsec ? */
2087 if (sp->policy == IPSEC_POLICY_IPSEC) {
2088 struct sadb_x_ipsecrequest *xisr;
2089 struct ipsecrequest *isr;
2090
2091 for (isr = sp->req; isr != NULL; isr = isr->next) {
2092
2093 xisr = (struct sadb_x_ipsecrequest *)p;
2094
2095 xisr->sadb_x_ipsecrequest_proto = isr->saidx.proto;
2096 xisr->sadb_x_ipsecrequest_mode = isr->saidx.mode;
2097 xisr->sadb_x_ipsecrequest_level = isr->level;
2098 xisr->sadb_x_ipsecrequest_reqid = isr->saidx.reqid;
2099
2100 p += sizeof(*xisr);
2101 memcpy(p, &isr->saidx.src, isr->saidx.src.sa.sa_len);
2102 p += isr->saidx.src.sa.sa_len;
2103 memcpy(p, &isr->saidx.dst, isr->saidx.dst.sa.sa_len);
2104 p += isr->saidx.src.sa.sa_len;
2105
2106 xisr->sadb_x_ipsecrequest_len =
2107 PFKEY_ALIGN8(sizeof(*xisr)
2108 + isr->saidx.src.sa.sa_len
2109 + isr->saidx.dst.sa.sa_len);
2110 }
2111 }
2112
2113 return m;
2114 }
2115
2116 /*
2117 * m will not be freed nor modified. It never return NULL.
2118 * If it returns a mbuf of M_PKTHDR, the mbuf ensures to have
2119 * contiguous length at least sizeof(struct sadb_msg).
2120 */
2121 static struct mbuf *
2122 key_gather_mbuf(struct mbuf *m, const struct sadb_msghdr *mhp,
2123 int ndeep, int nitem, ...)
2124 {
2125 va_list ap;
2126 int idx;
2127 int i;
2128 struct mbuf *result = NULL, *n;
2129 int len;
2130
2131 KASSERT(m != NULL);
2132 KASSERT(mhp != NULL);
2133 KASSERT(!cpu_softintr_p());
2134
2135 va_start(ap, nitem);
2136 for (i = 0; i < nitem; i++) {
2137 idx = va_arg(ap, int);
2138 KASSERT(idx >= 0);
2139 KASSERT(idx <= SADB_EXT_MAX);
2140 /* don't attempt to pull empty extension */
2141 if (idx == SADB_EXT_RESERVED && mhp->msg == NULL)
2142 continue;
2143 if (idx != SADB_EXT_RESERVED &&
2144 (mhp->ext[idx] == NULL || mhp->extlen[idx] == 0))
2145 continue;
2146
2147 if (idx == SADB_EXT_RESERVED) {
2148 CTASSERT(PFKEY_ALIGN8(sizeof(struct sadb_msg)) <= MHLEN);
2149 len = PFKEY_ALIGN8(sizeof(struct sadb_msg));
2150 MGETHDR(n, M_WAITOK, MT_DATA);
2151 n->m_len = len;
2152 n->m_next = NULL;
2153 m_copydata(m, 0, sizeof(struct sadb_msg),
2154 mtod(n, void *));
2155 } else if (i < ndeep) {
2156 len = mhp->extlen[idx];
2157 n = key_alloc_mbuf(len, M_WAITOK);
2158 KASSERT(n->m_next == NULL);
2159 m_copydata(m, mhp->extoff[idx], mhp->extlen[idx],
2160 mtod(n, void *));
2161 } else {
2162 n = m_copym(m, mhp->extoff[idx], mhp->extlen[idx],
2163 M_WAITOK);
2164 }
2165 KASSERT(n != NULL);
2166
2167 if (result)
2168 m_cat(result, n);
2169 else
2170 result = n;
2171 }
2172 va_end(ap);
2173
2174 KASSERT(result != NULL);
2175 if ((result->m_flags & M_PKTHDR) != 0) {
2176 result->m_pkthdr.len = 0;
2177 for (n = result; n; n = n->m_next)
2178 result->m_pkthdr.len += n->m_len;
2179 KASSERT(result->m_len >= sizeof(struct sadb_msg));
2180 }
2181
2182 return result;
2183 }
2184
2185 /*
2186 * The argument _sp must not overwrite until SP is created and registered
2187 * successfully.
2188 */
2189 static int
2190 key_spdadd(struct socket *so, struct mbuf *m,
2191 const struct sadb_msghdr *mhp, struct secpolicy **_sp,
2192 bool from_kernel)
2193 {
2194 const struct sockaddr *src, *dst;
2195 const struct sadb_x_policy *xpl0;
2196 struct sadb_x_policy *xpl;
2197 const struct sadb_lifetime *lft = NULL;
2198 struct secpolicyindex spidx;
2199 struct secpolicy *newsp;
2200 int error;
2201 uint32_t sadb_x_policy_id;
2202
2203 if (mhp->ext[SADB_EXT_ADDRESS_SRC] == NULL ||
2204 mhp->ext[SADB_EXT_ADDRESS_DST] == NULL ||
2205 mhp->ext[SADB_X_EXT_POLICY] == NULL) {
2206 IPSECLOG(LOG_DEBUG, "invalid message is passed.\n");
2207 return key_senderror(so, m, EINVAL);
2208 }
2209 if (mhp->extlen[SADB_EXT_ADDRESS_SRC] < sizeof(struct sadb_address) ||
2210 mhp->extlen[SADB_EXT_ADDRESS_DST] < sizeof(struct sadb_address) ||
2211 mhp->extlen[SADB_X_EXT_POLICY] < sizeof(struct sadb_x_policy)) {
2212 IPSECLOG(LOG_DEBUG, "invalid message is passed.\n");
2213 return key_senderror(so, m, EINVAL);
2214 }
2215 if (mhp->ext[SADB_EXT_LIFETIME_HARD] != NULL) {
2216 if (mhp->extlen[SADB_EXT_LIFETIME_HARD] <
2217 sizeof(struct sadb_lifetime)) {
2218 IPSECLOG(LOG_DEBUG, "invalid message is passed.\n");
2219 return key_senderror(so, m, EINVAL);
2220 }
2221 lft = mhp->ext[SADB_EXT_LIFETIME_HARD];
2222 }
2223
2224 xpl0 = mhp->ext[SADB_X_EXT_POLICY];
2225
2226 /* checking the direciton. */
2227 switch (xpl0->sadb_x_policy_dir) {
2228 case IPSEC_DIR_INBOUND:
2229 case IPSEC_DIR_OUTBOUND:
2230 break;
2231 default:
2232 IPSECLOG(LOG_DEBUG, "Invalid SP direction.\n");
2233 return key_senderror(so, m, EINVAL);
2234 }
2235
2236 /* check policy */
2237 /* key_api_spdadd() accepts DISCARD, NONE and IPSEC. */
2238 if (xpl0->sadb_x_policy_type == IPSEC_POLICY_ENTRUST ||
2239 xpl0->sadb_x_policy_type == IPSEC_POLICY_BYPASS) {
2240 IPSECLOG(LOG_DEBUG, "Invalid policy type.\n");
2241 return key_senderror(so, m, EINVAL);
2242 }
2243
2244 /* policy requests are mandatory when action is ipsec. */
2245 if (mhp->msg->sadb_msg_type != SADB_X_SPDSETIDX &&
2246 xpl0->sadb_x_policy_type == IPSEC_POLICY_IPSEC &&
2247 mhp->extlen[SADB_X_EXT_POLICY] <= sizeof(*xpl0)) {
2248 IPSECLOG(LOG_DEBUG, "some policy requests part required.\n");
2249 return key_senderror(so, m, EINVAL);
2250 }
2251
2252 src = key_msghdr_get_sockaddr(mhp, SADB_EXT_ADDRESS_SRC);
2253 dst = key_msghdr_get_sockaddr(mhp, SADB_EXT_ADDRESS_DST);
2254
2255 /* sanity check on addr pair */
2256 if (src->sa_family != dst->sa_family)
2257 return key_senderror(so, m, EINVAL);
2258 if (src->sa_len != dst->sa_len)
2259 return key_senderror(so, m, EINVAL);
2260
2261 key_init_spidx_bymsghdr(&spidx, mhp);
2262
2263 /*
2264 * checking there is SP already or not.
2265 * SPDUPDATE doesn't depend on whether there is a SP or not.
2266 * If the type is either SPDADD or SPDSETIDX AND a SP is found,
2267 * then error.
2268 */
2269 {
2270 struct secpolicy *sp;
2271
2272 if (mhp->msg->sadb_msg_type == SADB_X_SPDUPDATE) {
2273 sp = key_lookup_and_remove_sp(&spidx, from_kernel);
2274 if (sp != NULL)
2275 key_destroy_sp(sp);
2276 } else {
2277 sp = key_getsp(&spidx);
2278 if (sp != NULL) {
2279 KEY_SP_UNREF(&sp);
2280 IPSECLOG(LOG_DEBUG, "a SP entry exists already.\n");
2281 return key_senderror(so, m, EEXIST);
2282 }
2283 }
2284 }
2285
2286 /* allocation new SP entry */
2287 newsp = _key_msg2sp(xpl0, PFKEY_EXTLEN(xpl0), &error, from_kernel);
2288 if (newsp == NULL) {
2289 return key_senderror(so, m, error);
2290 }
2291
2292 newsp->id = key_getnewspid();
2293 if (newsp->id == 0) {
2294 kmem_free(newsp, sizeof(*newsp));
2295 return key_senderror(so, m, ENOBUFS);
2296 }
2297
2298 newsp->spidx = spidx;
2299 newsp->created = time_uptime;
2300 newsp->lastused = newsp->created;
2301 newsp->lifetime = lft ? lft->sadb_lifetime_addtime : 0;
2302 newsp->validtime = lft ? lft->sadb_lifetime_usetime : 0;
2303 if (from_kernel)
2304 newsp->origin = IPSEC_SPORIGIN_KERNEL;
2305 else
2306 newsp->origin = IPSEC_SPORIGIN_USER;
2307
2308 key_init_sp(newsp);
2309 if (from_kernel)
2310 KEY_SP_REF(newsp);
2311
2312 sadb_x_policy_id = newsp->id;
2313
2314 if (_sp != NULL)
2315 *_sp = newsp;
2316
2317 mutex_enter(&key_spd.lock);
2318 SPLIST_WRITER_INSERT_TAIL(newsp->spidx.dir, newsp);
2319 mutex_exit(&key_spd.lock);
2320 /*
2321 * We don't have a reference to newsp, so we must not touch newsp from
2322 * now on. If you want to do, you must take a reference beforehand.
2323 */
2324 newsp = NULL;
2325
2326 #ifdef notyet
2327 /* delete the entry in key_misc.spacqlist */
2328 if (mhp->msg->sadb_msg_type == SADB_X_SPDUPDATE) {
2329 struct secspacq *spacq = key_getspacq(&spidx);
2330 if (spacq != NULL) {
2331 /* reset counter in order to deletion by timehandler. */
2332 spacq->created = time_uptime;
2333 spacq->count = 0;
2334 }
2335 }
2336 #endif
2337
2338 /* Invalidate all cached SPD pointers in the PCBs. */
2339 ipsec_invalpcbcacheall();
2340
2341 #if defined(GATEWAY)
2342 /* Invalidate the ipflow cache, as well. */
2343 ipflow_invalidate_all(0);
2344 #ifdef INET6
2345 if (in6_present)
2346 ip6flow_invalidate_all(0);
2347 #endif /* INET6 */
2348 #endif /* GATEWAY */
2349
2350 key_update_used();
2351
2352 {
2353 struct mbuf *n, *mpolicy;
2354 int off;
2355
2356 /* create new sadb_msg to reply. */
2357 if (lft) {
2358 n = key_gather_mbuf(m, mhp, 2, 5, SADB_EXT_RESERVED,
2359 SADB_X_EXT_POLICY, SADB_EXT_LIFETIME_HARD,
2360 SADB_EXT_ADDRESS_SRC, SADB_EXT_ADDRESS_DST);
2361 } else {
2362 n = key_gather_mbuf(m, mhp, 2, 4, SADB_EXT_RESERVED,
2363 SADB_X_EXT_POLICY,
2364 SADB_EXT_ADDRESS_SRC, SADB_EXT_ADDRESS_DST);
2365 }
2366
2367 key_fill_replymsg(n, 0);
2368 off = 0;
2369 mpolicy = m_pulldown(n, PFKEY_ALIGN8(sizeof(struct sadb_msg)),
2370 sizeof(*xpl), &off);
2371 if (mpolicy == NULL) {
2372 /* n is already freed */
2373 /*
2374 * valid sp has been created, so we does not overwrite _sp
2375 * NULL here. let caller decide to use the sp or not.
2376 */
2377 return key_senderror(so, m, ENOBUFS);
2378 }
2379 xpl = (struct sadb_x_policy *)(mtod(mpolicy, char *) + off);
2380 if (xpl->sadb_x_policy_exttype != SADB_X_EXT_POLICY) {
2381 m_freem(n);
2382 /* ditto */
2383 return key_senderror(so, m, EINVAL);
2384 }
2385
2386 xpl->sadb_x_policy_id = sadb_x_policy_id;
2387
2388 m_freem(m);
2389 return key_sendup_mbuf(so, n, KEY_SENDUP_ALL);
2390 }
2391 }
2392
2393 /*
2394 * SADB_X_SPDADD, SADB_X_SPDSETIDX or SADB_X_SPDUPDATE processing
2395 * add an entry to SP database, when received
2396 * <base, address(SD), (lifetime(H),) policy>
2397 * from the user(?).
2398 * Adding to SP database,
2399 * and send
2400 * <base, address(SD), (lifetime(H),) policy>
2401 * to the socket which was send.
2402 *
2403 * SPDADD set a unique policy entry.
2404 * SPDSETIDX like SPDADD without a part of policy requests.
2405 * SPDUPDATE replace a unique policy entry.
2406 *
2407 * m will always be freed.
2408 */
2409 static int
2410 key_api_spdadd(struct socket *so, struct mbuf *m,
2411 const struct sadb_msghdr *mhp)
2412 {
2413
2414 return key_spdadd(so, m, mhp, NULL, false);
2415 }
2416
2417 struct secpolicy *
2418 key_kpi_spdadd(struct mbuf *m)
2419 {
2420 struct sadb_msghdr mh;
2421 int error;
2422 struct secpolicy *sp = NULL;
2423
2424 error = key_align(m, &mh);
2425 if (error)
2426 return NULL;
2427
2428 error = key_spdadd(NULL, m, &mh, &sp, true);
2429 if (error) {
2430 /*
2431 * Currently, when key_spdadd() cannot send a PFKEY message
2432 * which means SP has been created, key_spdadd() returns error
2433 * although SP is created successfully.
2434 * Kernel components would not care PFKEY messages, so return
2435 * the "sp" regardless of error code. key_spdadd() overwrites
2436 * the argument only if SP is created successfully.
2437 */
2438 }
2439 return sp;
2440 }
2441
2442 /*
2443 * get new policy id.
2444 * OUT:
2445 * 0: failure.
2446 * others: success.
2447 */
2448 static u_int32_t
2449 key_getnewspid(void)
2450 {
2451 u_int32_t newid = 0;
2452 int count = key_spi_trycnt; /* XXX */
2453 struct secpolicy *sp;
2454
2455 /* when requesting to allocate spi ranged */
2456 while (count--) {
2457 newid = (policy_id = (policy_id == ~0 ? 1 : policy_id + 1));
2458
2459 sp = key_getspbyid(newid);
2460 if (sp == NULL)
2461 break;
2462
2463 KEY_SP_UNREF(&sp);
2464 }
2465
2466 if (count == 0 || newid == 0) {
2467 IPSECLOG(LOG_DEBUG, "to allocate policy id is failed.\n");
2468 return 0;
2469 }
2470
2471 return newid;
2472 }
2473
2474 /*
2475 * SADB_SPDDELETE processing
2476 * receive
2477 * <base, address(SD), policy(*)>
2478 * from the user(?), and set SADB_SASTATE_DEAD,
2479 * and send,
2480 * <base, address(SD), policy(*)>
2481 * to the ikmpd.
2482 * policy(*) including direction of policy.
2483 *
2484 * m will always be freed.
2485 */
2486 static int
2487 key_api_spddelete(struct socket *so, struct mbuf *m,
2488 const struct sadb_msghdr *mhp)
2489 {
2490 struct sadb_x_policy *xpl0;
2491 struct secpolicyindex spidx;
2492 struct secpolicy *sp;
2493
2494 if (mhp->ext[SADB_EXT_ADDRESS_SRC] == NULL ||
2495 mhp->ext[SADB_EXT_ADDRESS_DST] == NULL ||
2496 mhp->ext[SADB_X_EXT_POLICY] == NULL) {
2497 IPSECLOG(LOG_DEBUG, "invalid message is passed.\n");
2498 return key_senderror(so, m, EINVAL);
2499 }
2500 if (mhp->extlen[SADB_EXT_ADDRESS_SRC] < sizeof(struct sadb_address) ||
2501 mhp->extlen[SADB_EXT_ADDRESS_DST] < sizeof(struct sadb_address) ||
2502 mhp->extlen[SADB_X_EXT_POLICY] < sizeof(struct sadb_x_policy)) {
2503 IPSECLOG(LOG_DEBUG, "invalid message is passed.\n");
2504 return key_senderror(so, m, EINVAL);
2505 }
2506
2507 xpl0 = mhp->ext[SADB_X_EXT_POLICY];
2508
2509 /* checking the directon. */
2510 switch (xpl0->sadb_x_policy_dir) {
2511 case IPSEC_DIR_INBOUND:
2512 case IPSEC_DIR_OUTBOUND:
2513 break;
2514 default:
2515 IPSECLOG(LOG_DEBUG, "Invalid SP direction.\n");
2516 return key_senderror(so, m, EINVAL);
2517 }
2518
2519 /* make secindex */
2520 key_init_spidx_bymsghdr(&spidx, mhp);
2521
2522 /* Is there SP in SPD ? */
2523 sp = key_lookup_and_remove_sp(&spidx, false);
2524 if (sp == NULL) {
2525 IPSECLOG(LOG_DEBUG, "no SP found.\n");
2526 return key_senderror(so, m, EINVAL);
2527 }
2528
2529 /* save policy id to buffer to be returned. */
2530 xpl0->sadb_x_policy_id = sp->id;
2531
2532 key_destroy_sp(sp);
2533
2534 /* We're deleting policy; no need to invalidate the ipflow cache. */
2535
2536 {
2537 struct mbuf *n;
2538
2539 /* create new sadb_msg to reply. */
2540 n = key_gather_mbuf(m, mhp, 1, 4, SADB_EXT_RESERVED,
2541 SADB_X_EXT_POLICY, SADB_EXT_ADDRESS_SRC, SADB_EXT_ADDRESS_DST);
2542 key_fill_replymsg(n, 0);
2543 m_freem(m);
2544 return key_sendup_mbuf(so, n, KEY_SENDUP_ALL);
2545 }
2546 }
2547
2548 static struct mbuf *
2549 key_alloc_mbuf_simple(int len, int mflag)
2550 {
2551 struct mbuf *n;
2552
2553 KASSERT(mflag == M_NOWAIT || (mflag == M_WAITOK && !cpu_softintr_p()));
2554
2555 MGETHDR(n, mflag, MT_DATA);
2556 if (n && len > MHLEN) {
2557 MCLGET(n, mflag);
2558 if ((n->m_flags & M_EXT) == 0) {
2559 m_freem(n);
2560 n = NULL;
2561 }
2562 }
2563 return n;
2564 }
2565
2566 /*
2567 * SADB_SPDDELETE2 processing
2568 * receive
2569 * <base, policy(*)>
2570 * from the user(?), and set SADB_SASTATE_DEAD,
2571 * and send,
2572 * <base, policy(*)>
2573 * to the ikmpd.
2574 * policy(*) including direction of policy.
2575 *
2576 * m will always be freed.
2577 */
2578 static int
2579 key_spddelete2(struct socket *so, struct mbuf *m,
2580 const struct sadb_msghdr *mhp, bool from_kernel)
2581 {
2582 u_int32_t id;
2583 struct secpolicy *sp;
2584 const struct sadb_x_policy *xpl;
2585
2586 if (mhp->ext[SADB_X_EXT_POLICY] == NULL ||
2587 mhp->extlen[SADB_X_EXT_POLICY] < sizeof(struct sadb_x_policy)) {
2588 IPSECLOG(LOG_DEBUG, "invalid message is passed.\n");
2589 return key_senderror(so, m, EINVAL);
2590 }
2591
2592 xpl = mhp->ext[SADB_X_EXT_POLICY];
2593 id = xpl->sadb_x_policy_id;
2594
2595 /* Is there SP in SPD ? */
2596 sp = key_lookupbyid_and_remove_sp(id, from_kernel);
2597 if (sp == NULL) {
2598 IPSECLOG(LOG_DEBUG, "no SP found id:%u.\n", id);
2599 return key_senderror(so, m, EINVAL);
2600 }
2601
2602 key_destroy_sp(sp);
2603
2604 /* We're deleting policy; no need to invalidate the ipflow cache. */
2605
2606 {
2607 struct mbuf *n, *nn;
2608 int off, len;
2609
2610 CTASSERT(PFKEY_ALIGN8(sizeof(struct sadb_msg)) <= MCLBYTES);
2611
2612 /* create new sadb_msg to reply. */
2613 len = PFKEY_ALIGN8(sizeof(struct sadb_msg));
2614
2615 n = key_alloc_mbuf_simple(len, M_WAITOK);
2616 n->m_len = len;
2617 n->m_next = NULL;
2618 off = 0;
2619
2620 m_copydata(m, 0, sizeof(struct sadb_msg), mtod(n, char *) + off);
2621 off += PFKEY_ALIGN8(sizeof(struct sadb_msg));
2622
2623 KASSERTMSG(off == len, "length inconsistency");
2624
2625 n->m_next = m_copym(m, mhp->extoff[SADB_X_EXT_POLICY],
2626 mhp->extlen[SADB_X_EXT_POLICY], M_WAITOK);
2627
2628 n->m_pkthdr.len = 0;
2629 for (nn = n; nn; nn = nn->m_next)
2630 n->m_pkthdr.len += nn->m_len;
2631
2632 key_fill_replymsg(n, 0);
2633 m_freem(m);
2634 return key_sendup_mbuf(so, n, KEY_SENDUP_ALL);
2635 }
2636 }
2637
2638 /*
2639 * SADB_SPDDELETE2 processing
2640 * receive
2641 * <base, policy(*)>
2642 * from the user(?), and set SADB_SASTATE_DEAD,
2643 * and send,
2644 * <base, policy(*)>
2645 * to the ikmpd.
2646 * policy(*) including direction of policy.
2647 *
2648 * m will always be freed.
2649 */
2650 static int
2651 key_api_spddelete2(struct socket *so, struct mbuf *m,
2652 const struct sadb_msghdr *mhp)
2653 {
2654
2655 return key_spddelete2(so, m, mhp, false);
2656 }
2657
2658 int
2659 key_kpi_spddelete2(struct mbuf *m)
2660 {
2661 struct sadb_msghdr mh;
2662 int error;
2663
2664 error = key_align(m, &mh);
2665 if (error)
2666 return EINVAL;
2667
2668 return key_spddelete2(NULL, m, &mh, true);
2669 }
2670
2671 /*
2672 * SADB_X_GET processing
2673 * receive
2674 * <base, policy(*)>
2675 * from the user(?),
2676 * and send,
2677 * <base, address(SD), policy>
2678 * to the ikmpd.
2679 * policy(*) including direction of policy.
2680 *
2681 * m will always be freed.
2682 */
2683 static int
2684 key_api_spdget(struct socket *so, struct mbuf *m,
2685 const struct sadb_msghdr *mhp)
2686 {
2687 u_int32_t id;
2688 struct secpolicy *sp;
2689 struct mbuf *n;
2690 const struct sadb_x_policy *xpl;
2691
2692 if (mhp->ext[SADB_X_EXT_POLICY] == NULL ||
2693 mhp->extlen[SADB_X_EXT_POLICY] < sizeof(struct sadb_x_policy)) {
2694 IPSECLOG(LOG_DEBUG, "invalid message is passed.\n");
2695 return key_senderror(so, m, EINVAL);
2696 }
2697
2698 xpl = mhp->ext[SADB_X_EXT_POLICY];
2699 id = xpl->sadb_x_policy_id;
2700
2701 /* Is there SP in SPD ? */
2702 sp = key_getspbyid(id);
2703 if (sp == NULL) {
2704 IPSECLOG(LOG_DEBUG, "no SP found id:%u.\n", id);
2705 return key_senderror(so, m, ENOENT);
2706 }
2707
2708 n = key_setdumpsp(sp, SADB_X_SPDGET, mhp->msg->sadb_msg_seq,
2709 mhp->msg->sadb_msg_pid);
2710 KEY_SP_UNREF(&sp); /* ref gained by key_getspbyid */
2711 m_freem(m);
2712 return key_sendup_mbuf(so, n, KEY_SENDUP_ONE);
2713 }
2714
2715 #ifdef notyet
2716 /*
2717 * SADB_X_SPDACQUIRE processing.
2718 * Acquire policy and SA(s) for a *OUTBOUND* packet.
2719 * send
2720 * <base, policy(*)>
2721 * to KMD, and expect to receive
2722 * <base> with SADB_X_SPDACQUIRE if error occurred,
2723 * or
2724 * <base, policy>
2725 * with SADB_X_SPDUPDATE from KMD by PF_KEY.
2726 * policy(*) is without policy requests.
2727 *
2728 * 0 : succeed
2729 * others: error number
2730 */
2731 int
2732 key_spdacquire(const struct secpolicy *sp)
2733 {
2734 struct mbuf *result = NULL, *m;
2735 struct secspacq *newspacq;
2736 int error;
2737
2738 KASSERT(sp != NULL);
2739 KASSERTMSG(sp->req == NULL, "called but there is request");
2740 KASSERTMSG(sp->policy == IPSEC_POLICY_IPSEC,
2741 "policy mismathed. IPsec is expected");
2742
2743 /* Get an entry to check whether sent message or not. */
2744 newspacq = key_getspacq(&sp->spidx);
2745 if (newspacq != NULL) {
2746 if (key_blockacq_count < newspacq->count) {
2747 /* reset counter and do send message. */
2748 newspacq->count = 0;
2749 } else {
2750 /* increment counter and do nothing. */
2751 newspacq->count++;
2752 return 0;
2753 }
2754 } else {
2755 /* make new entry for blocking to send SADB_ACQUIRE. */
2756 newspacq = key_newspacq(&sp->spidx);
2757 if (newspacq == NULL)
2758 return ENOBUFS;
2759
2760 /* add to key_misc.acqlist */
2761 LIST_INSERT_HEAD(&key_misc.spacqlist, newspacq, chain);
2762 }
2763
2764 /* create new sadb_msg to reply. */
2765 m = key_setsadbmsg(SADB_X_SPDACQUIRE, 0, 0, 0, 0, 0);
2766 if (!m) {
2767 error = ENOBUFS;
2768 goto fail;
2769 }
2770 result = m;
2771
2772 result->m_pkthdr.len = 0;
2773 for (m = result; m; m = m->m_next)
2774 result->m_pkthdr.len += m->m_len;
2775
2776 mtod(result, struct sadb_msg *)->sadb_msg_len =
2777 PFKEY_UNIT64(result->m_pkthdr.len);
2778
2779 return key_sendup_mbuf(NULL, m, KEY_SENDUP_REGISTERED);
2780
2781 fail:
2782 if (result)
2783 m_freem(result);
2784 return error;
2785 }
2786 #endif /* notyet */
2787
2788 /*
2789 * SADB_SPDFLUSH processing
2790 * receive
2791 * <base>
2792 * from the user, and free all entries in secpctree.
2793 * and send,
2794 * <base>
2795 * to the user.
2796 * NOTE: what to do is only marking SADB_SASTATE_DEAD.
2797 *
2798 * m will always be freed.
2799 */
2800 static int
2801 key_api_spdflush(struct socket *so, struct mbuf *m,
2802 const struct sadb_msghdr *mhp)
2803 {
2804 struct sadb_msg *newmsg;
2805 struct secpolicy *sp;
2806 u_int dir;
2807
2808 if (m->m_len != PFKEY_ALIGN8(sizeof(struct sadb_msg)))
2809 return key_senderror(so, m, EINVAL);
2810
2811 for (dir = 0; dir < IPSEC_DIR_MAX; dir++) {
2812 retry:
2813 mutex_enter(&key_spd.lock);
2814 SPLIST_WRITER_FOREACH(sp, dir) {
2815 KASSERT(sp->state != IPSEC_SPSTATE_DEAD);
2816 /*
2817 * Userlang programs can remove SPs created by userland
2818 * probrams only, that is, they cannot remove SPs
2819 * created in kernel(e.g. ipsec(4) I/F).
2820 */
2821 if (sp->origin == IPSEC_SPORIGIN_USER) {
2822 key_unlink_sp(sp);
2823 mutex_exit(&key_spd.lock);
2824 key_destroy_sp(sp);
2825 goto retry;
2826 }
2827 }
2828 mutex_exit(&key_spd.lock);
2829 }
2830
2831 /* We're deleting policy; no need to invalidate the ipflow cache. */
2832
2833 if (sizeof(struct sadb_msg) > m->m_len + M_TRAILINGSPACE(m)) {
2834 IPSECLOG(LOG_DEBUG, "No more memory.\n");
2835 return key_senderror(so, m, ENOBUFS);
2836 }
2837
2838 if (m->m_next)
2839 m_freem(m->m_next);
2840 m->m_next = NULL;
2841 m->m_pkthdr.len = m->m_len = PFKEY_ALIGN8(sizeof(struct sadb_msg));
2842 newmsg = mtod(m, struct sadb_msg *);
2843 newmsg->sadb_msg_errno = 0;
2844 newmsg->sadb_msg_len = PFKEY_UNIT64(m->m_pkthdr.len);
2845
2846 return key_sendup_mbuf(so, m, KEY_SENDUP_ALL);
2847 }
2848
2849 static struct sockaddr key_src = {
2850 .sa_len = 2,
2851 .sa_family = PF_KEY,
2852 };
2853
2854 static struct mbuf *
2855 key_setspddump_chain(int *errorp, int *lenp, pid_t pid)
2856 {
2857 struct secpolicy *sp;
2858 int cnt;
2859 u_int dir;
2860 struct mbuf *m, *n, *prev;
2861 int totlen;
2862
2863 KASSERT(mutex_owned(&key_spd.lock));
2864
2865 *lenp = 0;
2866
2867 /* search SPD entry and get buffer size. */
2868 cnt = 0;
2869 for (dir = 0; dir < IPSEC_DIR_MAX; dir++) {
2870 SPLIST_WRITER_FOREACH(sp, dir) {
2871 cnt++;
2872 }
2873 }
2874
2875 if (cnt == 0) {
2876 *errorp = ENOENT;
2877 return (NULL);
2878 }
2879
2880 m = NULL;
2881 prev = m;
2882 totlen = 0;
2883 for (dir = 0; dir < IPSEC_DIR_MAX; dir++) {
2884 SPLIST_WRITER_FOREACH(sp, dir) {
2885 --cnt;
2886 n = key_setdumpsp(sp, SADB_X_SPDDUMP, cnt, pid);
2887
2888 totlen += n->m_pkthdr.len;
2889 if (!m) {
2890 m = n;
2891 } else {
2892 prev->m_nextpkt = n;
2893 }
2894 prev = n;
2895 }
2896 }
2897
2898 *lenp = totlen;
2899 *errorp = 0;
2900 return (m);
2901 }
2902
2903 /*
2904 * SADB_SPDDUMP processing
2905 * receive
2906 * <base>
2907 * from the user, and dump all SP leaves
2908 * and send,
2909 * <base> .....
2910 * to the ikmpd.
2911 *
2912 * m will always be freed.
2913 */
2914 static int
2915 key_api_spddump(struct socket *so, struct mbuf *m0,
2916 const struct sadb_msghdr *mhp)
2917 {
2918 struct mbuf *n;
2919 int error, len;
2920 int ok;
2921 pid_t pid;
2922
2923 pid = mhp->msg->sadb_msg_pid;
2924 /*
2925 * If the requestor has insufficient socket-buffer space
2926 * for the entire chain, nobody gets any response to the DUMP.
2927 * XXX For now, only the requestor ever gets anything.
2928 * Moreover, if the requestor has any space at all, they receive
2929 * the entire chain, otherwise the request is refused with ENOBUFS.
2930 */
2931 if (sbspace(&so->so_rcv) <= 0) {
2932 return key_senderror(so, m0, ENOBUFS);
2933 }
2934
2935 mutex_enter(&key_spd.lock);
2936 n = key_setspddump_chain(&error, &len, pid);
2937 mutex_exit(&key_spd.lock);
2938
2939 if (n == NULL) {
2940 return key_senderror(so, m0, ENOENT);
2941 }
2942 {
2943 uint64_t *ps = PFKEY_STAT_GETREF();
2944 ps[PFKEY_STAT_IN_TOTAL]++;
2945 ps[PFKEY_STAT_IN_BYTES] += len;
2946 PFKEY_STAT_PUTREF();
2947 }
2948
2949 /*
2950 * PF_KEY DUMP responses are no longer broadcast to all PF_KEY sockets.
2951 * The requestor receives either the entire chain, or an
2952 * error message with ENOBUFS.
2953 */
2954
2955 /*
2956 * sbappendchainwith record takes the chain of entries, one
2957 * packet-record per SPD entry, prepends the key_src sockaddr
2958 * to each packet-record, links the sockaddr mbufs into a new
2959 * list of records, then appends the entire resulting
2960 * list to the requesting socket.
2961 */
2962 ok = sbappendaddrchain(&so->so_rcv, (struct sockaddr *)&key_src, n,
2963 SB_PRIO_ONESHOT_OVERFLOW);
2964
2965 if (!ok) {
2966 PFKEY_STATINC(PFKEY_STAT_IN_NOMEM);
2967 m_freem(n);
2968 return key_senderror(so, m0, ENOBUFS);
2969 }
2970
2971 m_freem(m0);
2972 return error;
2973 }
2974
2975 /*
2976 * SADB_X_NAT_T_NEW_MAPPING. Unused by racoon as of 2005/04/23
2977 */
2978 static int
2979 key_api_nat_map(struct socket *so, struct mbuf *m,
2980 const struct sadb_msghdr *mhp)
2981 {
2982 struct sadb_x_nat_t_type *type;
2983 struct sadb_x_nat_t_port *sport;
2984 struct sadb_x_nat_t_port *dport;
2985 struct sadb_address *iaddr, *raddr;
2986 struct sadb_x_nat_t_frag *frag;
2987
2988 if (mhp->ext[SADB_X_EXT_NAT_T_TYPE] == NULL ||
2989 mhp->ext[SADB_X_EXT_NAT_T_SPORT] == NULL ||
2990 mhp->ext[SADB_X_EXT_NAT_T_DPORT] == NULL) {
2991 IPSECLOG(LOG_DEBUG, "invalid message.\n");
2992 return key_senderror(so, m, EINVAL);
2993 }
2994 if ((mhp->extlen[SADB_X_EXT_NAT_T_TYPE] < sizeof(*type)) ||
2995 (mhp->extlen[SADB_X_EXT_NAT_T_SPORT] < sizeof(*sport)) ||
2996 (mhp->extlen[SADB_X_EXT_NAT_T_DPORT] < sizeof(*dport))) {
2997 IPSECLOG(LOG_DEBUG, "invalid message.\n");
2998 return key_senderror(so, m, EINVAL);
2999 }
3000
3001 if ((mhp->ext[SADB_X_EXT_NAT_T_OAI] != NULL) &&
3002 (mhp->extlen[SADB_X_EXT_NAT_T_OAI] < sizeof(*iaddr))) {
3003 IPSECLOG(LOG_DEBUG, "invalid message\n");
3004 return key_senderror(so, m, EINVAL);
3005 }
3006
3007 if ((mhp->ext[SADB_X_EXT_NAT_T_OAR] != NULL) &&
3008 (mhp->extlen[SADB_X_EXT_NAT_T_OAR] < sizeof(*raddr))) {
3009 IPSECLOG(LOG_DEBUG, "invalid message\n");
3010 return key_senderror(so, m, EINVAL);
3011 }
3012
3013 if ((mhp->ext[SADB_X_EXT_NAT_T_FRAG] != NULL) &&
3014 (mhp->extlen[SADB_X_EXT_NAT_T_FRAG] < sizeof(*frag))) {
3015 IPSECLOG(LOG_DEBUG, "invalid message\n");
3016 return key_senderror(so, m, EINVAL);
3017 }
3018
3019 type = mhp->ext[SADB_X_EXT_NAT_T_TYPE];
3020 sport = mhp->ext[SADB_X_EXT_NAT_T_SPORT];
3021 dport = mhp->ext[SADB_X_EXT_NAT_T_DPORT];
3022 iaddr = mhp->ext[SADB_X_EXT_NAT_T_OAI];
3023 raddr = mhp->ext[SADB_X_EXT_NAT_T_OAR];
3024 frag = mhp->ext[SADB_X_EXT_NAT_T_FRAG];
3025
3026 /*
3027 * XXX handle that, it should also contain a SA, or anything
3028 * that enable to update the SA information.
3029 */
3030
3031 return 0;
3032 }
3033
3034 /*
3035 * Never return NULL.
3036 */
3037 static struct mbuf *
3038 key_setdumpsp(struct secpolicy *sp, u_int8_t type, u_int32_t seq, pid_t pid)
3039 {
3040 struct mbuf *result = NULL, *m;
3041
3042 KASSERT(!cpu_softintr_p());
3043
3044 m = key_setsadbmsg(type, 0, SADB_SATYPE_UNSPEC, seq, pid,
3045 key_sp_refcnt(sp), M_WAITOK);
3046 result = m;
3047
3048 m = key_setsadbaddr(SADB_EXT_ADDRESS_SRC,
3049 &sp->spidx.src.sa, sp->spidx.prefs, sp->spidx.ul_proto, M_WAITOK);
3050 m_cat(result, m);
3051
3052 m = key_setsadbaddr(SADB_EXT_ADDRESS_DST,
3053 &sp->spidx.dst.sa, sp->spidx.prefd, sp->spidx.ul_proto, M_WAITOK);
3054 m_cat(result, m);
3055
3056 m = key_sp2msg(sp, M_WAITOK);
3057 m_cat(result, m);
3058
3059 KASSERT(result->m_flags & M_PKTHDR);
3060 KASSERT(result->m_len >= sizeof(struct sadb_msg));
3061
3062 result->m_pkthdr.len = 0;
3063 for (m = result; m; m = m->m_next)
3064 result->m_pkthdr.len += m->m_len;
3065
3066 mtod(result, struct sadb_msg *)->sadb_msg_len =
3067 PFKEY_UNIT64(result->m_pkthdr.len);
3068
3069 return result;
3070 }
3071
3072 /*
3073 * get PFKEY message length for security policy and request.
3074 */
3075 static u_int
3076 key_getspreqmsglen(const struct secpolicy *sp)
3077 {
3078 u_int tlen;
3079
3080 tlen = sizeof(struct sadb_x_policy);
3081
3082 /* if is the policy for ipsec ? */
3083 if (sp->policy != IPSEC_POLICY_IPSEC)
3084 return tlen;
3085
3086 /* get length of ipsec requests */
3087 {
3088 const struct ipsecrequest *isr;
3089 int len;
3090
3091 for (isr = sp->req; isr != NULL; isr = isr->next) {
3092 len = sizeof(struct sadb_x_ipsecrequest)
3093 + isr->saidx.src.sa.sa_len + isr->saidx.dst.sa.sa_len;
3094
3095 tlen += PFKEY_ALIGN8(len);
3096 }
3097 }
3098
3099 return tlen;
3100 }
3101
3102 /*
3103 * SADB_SPDEXPIRE processing
3104 * send
3105 * <base, address(SD), lifetime(CH), policy>
3106 * to KMD by PF_KEY.
3107 *
3108 * OUT: 0 : succeed
3109 * others : error number
3110 */
3111 static int
3112 key_spdexpire(struct secpolicy *sp)
3113 {
3114 int s;
3115 struct mbuf *result = NULL, *m;
3116 int len;
3117 int error = -1;
3118 struct sadb_lifetime *lt;
3119
3120 /* XXX: Why do we lock ? */
3121 s = splsoftnet(); /*called from softclock()*/
3122
3123 KASSERT(sp != NULL);
3124
3125 /* set msg header */
3126 m = key_setsadbmsg(SADB_X_SPDEXPIRE, 0, 0, 0, 0, 0, M_WAITOK);
3127 result = m;
3128
3129 /* create lifetime extension (current and hard) */
3130 len = PFKEY_ALIGN8(sizeof(*lt)) * 2;
3131 m = key_alloc_mbuf(len, M_WAITOK);
3132 KASSERT(m->m_next == NULL);
3133
3134 memset(mtod(m, void *), 0, len);
3135 lt = mtod(m, struct sadb_lifetime *);
3136 lt->sadb_lifetime_len = PFKEY_UNIT64(sizeof(struct sadb_lifetime));
3137 lt->sadb_lifetime_exttype = SADB_EXT_LIFETIME_CURRENT;
3138 lt->sadb_lifetime_allocations = 0;
3139 lt->sadb_lifetime_bytes = 0;
3140 lt->sadb_lifetime_addtime = time_mono_to_wall(sp->created);
3141 lt->sadb_lifetime_usetime = time_mono_to_wall(sp->lastused);
3142 lt = (struct sadb_lifetime *)(mtod(m, char *) + len / 2);
3143 lt->sadb_lifetime_len = PFKEY_UNIT64(sizeof(struct sadb_lifetime));
3144 lt->sadb_lifetime_exttype = SADB_EXT_LIFETIME_HARD;
3145 lt->sadb_lifetime_allocations = 0;
3146 lt->sadb_lifetime_bytes = 0;
3147 lt->sadb_lifetime_addtime = sp->lifetime;
3148 lt->sadb_lifetime_usetime = sp->validtime;
3149 m_cat(result, m);
3150
3151 /* set sadb_address for source */
3152 m = key_setsadbaddr(SADB_EXT_ADDRESS_SRC, &sp->spidx.src.sa,
3153 sp->spidx.prefs, sp->spidx.ul_proto, M_WAITOK);
3154 m_cat(result, m);
3155
3156 /* set sadb_address for destination */
3157 m = key_setsadbaddr(SADB_EXT_ADDRESS_DST, &sp->spidx.dst.sa,
3158 sp->spidx.prefd, sp->spidx.ul_proto, M_WAITOK);
3159 m_cat(result, m);
3160
3161 /* set secpolicy */
3162 m = key_sp2msg(sp, M_WAITOK);
3163 m_cat(result, m);
3164
3165 KASSERT(result->m_flags & M_PKTHDR);
3166 KASSERT(result->m_len >= sizeof(struct sadb_msg));
3167
3168 result->m_pkthdr.len = 0;
3169 for (m = result; m; m = m->m_next)
3170 result->m_pkthdr.len += m->m_len;
3171
3172 mtod(result, struct sadb_msg *)->sadb_msg_len =
3173 PFKEY_UNIT64(result->m_pkthdr.len);
3174
3175 error = key_sendup_mbuf(NULL, result, KEY_SENDUP_REGISTERED);
3176 splx(s);
3177 return error;
3178 }
3179
3180 /* %%% SAD management */
3181 /*
3182 * allocating a memory for new SA head, and copy from the values of mhp.
3183 * OUT: NULL : failure due to the lack of memory.
3184 * others : pointer to new SA head.
3185 */
3186 static struct secashead *
3187 key_newsah(const struct secasindex *saidx)
3188 {
3189 struct secashead *newsah;
3190 int i;
3191
3192 KASSERT(saidx != NULL);
3193
3194 newsah = kmem_zalloc(sizeof(struct secashead), KM_SLEEP);
3195 for (i = 0; i < __arraycount(newsah->savlist); i++)
3196 PSLIST_INIT(&newsah->savlist[i]);
3197 newsah->saidx = *saidx;
3198
3199 localcount_init(&newsah->localcount);
3200 /* Take a reference for the caller */
3201 localcount_acquire(&newsah->localcount);
3202
3203 /* Add to the sah list */
3204 SAHLIST_ENTRY_INIT(newsah);
3205 newsah->state = SADB_SASTATE_MATURE;
3206 mutex_enter(&key_sad.lock);
3207 SAHLIST_WRITER_INSERT_HEAD(newsah);
3208 mutex_exit(&key_sad.lock);
3209
3210 return newsah;
3211 }
3212
3213 static bool
3214 key_sah_has_sav(struct secashead *sah)
3215 {
3216 u_int state;
3217
3218 KASSERT(mutex_owned(&key_sad.lock));
3219
3220 SASTATE_ANY_FOREACH(state) {
3221 if (!SAVLIST_WRITER_EMPTY(sah, state))
3222 return true;
3223 }
3224
3225 return false;
3226 }
3227
3228 static void
3229 key_unlink_sah(struct secashead *sah)
3230 {
3231
3232 KASSERT(!cpu_softintr_p());
3233 KASSERT(mutex_owned(&key_sad.lock));
3234 KASSERT(sah->state == SADB_SASTATE_DEAD);
3235
3236 /* Remove from the sah list */
3237 SAHLIST_WRITER_REMOVE(sah);
3238
3239 KDASSERT(mutex_ownable(softnet_lock));
3240 key_sad_pserialize_perform();
3241
3242 localcount_drain(&sah->localcount, &key_sad.cv_lc, &key_sad.lock);
3243 }
3244
3245 static void
3246 key_destroy_sah(struct secashead *sah)
3247 {
3248
3249 rtcache_free(&sah->sa_route);
3250
3251 SAHLIST_ENTRY_DESTROY(sah);
3252 localcount_fini(&sah->localcount);
3253
3254 if (sah->idents != NULL)
3255 kmem_free(sah->idents, sah->idents_len);
3256 if (sah->identd != NULL)
3257 kmem_free(sah->identd, sah->identd_len);
3258
3259 kmem_free(sah, sizeof(*sah));
3260 }
3261
3262 /*
3263 * allocating a new SA with LARVAL state.
3264 * key_api_add() and key_api_getspi() call,
3265 * and copy the values of mhp into new buffer.
3266 * When SAD message type is GETSPI:
3267 * to set sequence number from acq_seq++,
3268 * to set zero to SPI.
3269 * not to call key_setsaval().
3270 * OUT: NULL : fail
3271 * others : pointer to new secasvar.
3272 *
3273 * does not modify mbuf. does not free mbuf on error.
3274 */
3275 static struct secasvar *
3276 key_newsav(struct mbuf *m, const struct sadb_msghdr *mhp,
3277 int *errp, const char* where, int tag)
3278 {
3279 struct secasvar *newsav;
3280 const struct sadb_sa *xsa;
3281
3282 KASSERT(!cpu_softintr_p());
3283 KASSERT(m != NULL);
3284 KASSERT(mhp != NULL);
3285 KASSERT(mhp->msg != NULL);
3286
3287 newsav = kmem_zalloc(sizeof(struct secasvar), KM_SLEEP);
3288
3289 switch (mhp->msg->sadb_msg_type) {
3290 case SADB_GETSPI:
3291 newsav->spi = 0;
3292
3293 #ifdef IPSEC_DOSEQCHECK
3294 /* sync sequence number */
3295 if (mhp->msg->sadb_msg_seq == 0)
3296 newsav->seq =
3297 (acq_seq = (acq_seq == ~0 ? 1 : ++acq_seq));
3298 else
3299 #endif
3300 newsav->seq = mhp->msg->sadb_msg_seq;
3301 break;
3302
3303 case SADB_ADD:
3304 /* sanity check */
3305 if (mhp->ext[SADB_EXT_SA] == NULL) {
3306 IPSECLOG(LOG_DEBUG, "invalid message is passed.\n");
3307 *errp = EINVAL;
3308 goto error;
3309 }
3310 xsa = mhp->ext[SADB_EXT_SA];
3311 newsav->spi = xsa->sadb_sa_spi;
3312 newsav->seq = mhp->msg->sadb_msg_seq;
3313 break;
3314 default:
3315 *errp = EINVAL;
3316 goto error;
3317 }
3318
3319 /* copy sav values */
3320 if (mhp->msg->sadb_msg_type != SADB_GETSPI) {
3321 *errp = key_setsaval(newsav, m, mhp);
3322 if (*errp)
3323 goto error;
3324 } else {
3325 /* We don't allow lft_c to be NULL */
3326 newsav->lft_c = kmem_zalloc(sizeof(struct sadb_lifetime),
3327 KM_SLEEP);
3328 newsav->lft_c_counters_percpu =
3329 percpu_alloc(sizeof(lifetime_counters_t));
3330 }
3331
3332 /* reset created */
3333 newsav->created = time_uptime;
3334 newsav->pid = mhp->msg->sadb_msg_pid;
3335
3336 KEYDEBUG_PRINTF(KEYDEBUG_IPSEC_STAMP,
3337 "DP from %s:%u return SA:%p\n", where, tag, newsav);
3338 return newsav;
3339
3340 error:
3341 KASSERT(*errp != 0);
3342 kmem_free(newsav, sizeof(*newsav));
3343 KEYDEBUG_PRINTF(KEYDEBUG_IPSEC_STAMP,
3344 "DP from %s:%u return SA:NULL\n", where, tag);
3345 return NULL;
3346 }
3347
3348
3349 static void
3350 key_clear_xform(struct secasvar *sav)
3351 {
3352
3353 /*
3354 * Cleanup xform state. Note that zeroize'ing causes the
3355 * keys to be cleared; otherwise we must do it ourself.
3356 */
3357 if (sav->tdb_xform != NULL) {
3358 sav->tdb_xform->xf_zeroize(sav);
3359 sav->tdb_xform = NULL;
3360 } else {
3361 if (sav->key_auth != NULL)
3362 explicit_memset(_KEYBUF(sav->key_auth), 0,
3363 _KEYLEN(sav->key_auth));
3364 if (sav->key_enc != NULL)
3365 explicit_memset(_KEYBUF(sav->key_enc), 0,
3366 _KEYLEN(sav->key_enc));
3367 }
3368 }
3369
3370 /*
3371 * free() SA variable entry.
3372 */
3373 static void
3374 key_delsav(struct secasvar *sav)
3375 {
3376
3377 key_clear_xform(sav);
3378 key_freesaval(sav);
3379 kmem_free(sav, sizeof(*sav));
3380 }
3381
3382 /*
3383 * Must be called in a pserialize read section. A held sah
3384 * must be released by key_sah_unref after use.
3385 */
3386 static void
3387 key_sah_ref(struct secashead *sah)
3388 {
3389
3390 localcount_acquire(&sah->localcount);
3391 }
3392
3393 /*
3394 * Must be called without holding key_sad.lock because the lock
3395 * would be held in localcount_release.
3396 */
3397 static void
3398 key_sah_unref(struct secashead *sah)
3399 {
3400
3401 KDASSERT(mutex_ownable(&key_sad.lock));
3402
3403 localcount_release(&sah->localcount, &key_sad.cv_lc, &key_sad.lock);
3404 }
3405
3406 /*
3407 * Search SAD and return sah. Must be called in a pserialize
3408 * read section.
3409 * OUT:
3410 * NULL : not found
3411 * others : found, pointer to a SA.
3412 */
3413 static struct secashead *
3414 key_getsah(const struct secasindex *saidx, int flag)
3415 {
3416 struct secashead *sah;
3417
3418 SAHLIST_READER_FOREACH_SAIDX(sah, saidx) {
3419 if (sah->state == SADB_SASTATE_DEAD)
3420 continue;
3421 if (key_saidx_match(&sah->saidx, saidx, flag))
3422 return sah;
3423 }
3424
3425 return NULL;
3426 }
3427
3428 /*
3429 * Search SAD and return sah. If sah is returned, the caller must call
3430 * key_sah_unref to releaset a reference.
3431 * OUT:
3432 * NULL : not found
3433 * others : found, pointer to a SA.
3434 */
3435 static struct secashead *
3436 key_getsah_ref(const struct secasindex *saidx, int flag)
3437 {
3438 struct secashead *sah;
3439 int s;
3440
3441 s = pserialize_read_enter();
3442 sah = key_getsah(saidx, flag);
3443 if (sah != NULL)
3444 key_sah_ref(sah);
3445 pserialize_read_exit(s);
3446
3447 return sah;
3448 }
3449
3450 /*
3451 * check not to be duplicated SPI.
3452 * NOTE: this function is too slow due to searching all SAD.
3453 * OUT:
3454 * NULL : not found
3455 * others : found, pointer to a SA.
3456 */
3457 static bool
3458 key_checkspidup(const struct secasindex *saidx, u_int32_t spi)
3459 {
3460 struct secashead *sah;
3461 struct secasvar *sav;
3462
3463 /* check address family */
3464 if (saidx->src.sa.sa_family != saidx->dst.sa.sa_family) {
3465 IPSECLOG(LOG_DEBUG,
3466 "address family mismatched src %u, dst %u.\n",
3467 saidx->src.sa.sa_family, saidx->dst.sa.sa_family);
3468 return false;
3469 }
3470
3471 /* check all SAD */
3472 /* key_ismyaddr may sleep, so use mutex, not pserialize, here. */
3473 mutex_enter(&key_sad.lock);
3474 SAHLIST_WRITER_FOREACH(sah) {
3475 if (!key_ismyaddr((struct sockaddr *)&sah->saidx.dst))
3476 continue;
3477 sav = key_getsavbyspi(sah, spi);
3478 if (sav != NULL) {
3479 KEY_SA_UNREF(&sav);
3480 mutex_exit(&key_sad.lock);
3481 return true;
3482 }
3483 }
3484 mutex_exit(&key_sad.lock);
3485
3486 return false;
3487 }
3488
3489 /*
3490 * search SAD litmited alive SA, protocol, SPI.
3491 * OUT:
3492 * NULL : not found
3493 * others : found, pointer to a SA.
3494 */
3495 static struct secasvar *
3496 key_getsavbyspi(struct secashead *sah, u_int32_t spi)
3497 {
3498 struct secasvar *sav = NULL;
3499 u_int state;
3500 int s;
3501
3502 /* search all status */
3503 s = pserialize_read_enter();
3504 SASTATE_ALIVE_FOREACH(state) {
3505 SAVLIST_READER_FOREACH(sav, sah, state) {
3506 /* sanity check */
3507 if (sav->state != state) {
3508 IPSECLOG(LOG_DEBUG,
3509 "invalid sav->state (queue: %d SA: %d)\n",
3510 state, sav->state);
3511 continue;
3512 }
3513
3514 if (sav->spi == spi) {
3515 KEY_SA_REF(sav);
3516 goto out;
3517 }
3518 }
3519 }
3520 out:
3521 pserialize_read_exit(s);
3522
3523 return sav;
3524 }
3525
3526 /*
3527 * Search SAD litmited alive SA by an SPI and remove it from a list.
3528 * OUT:
3529 * NULL : not found
3530 * others : found, pointer to a SA.
3531 */
3532 static struct secasvar *
3533 key_lookup_and_remove_sav(struct secashead *sah, u_int32_t spi,
3534 const struct secasvar *hint)
3535 {
3536 struct secasvar *sav = NULL;
3537 u_int state;
3538
3539 /* search all status */
3540 mutex_enter(&key_sad.lock);
3541 SASTATE_ALIVE_FOREACH(state) {
3542 SAVLIST_WRITER_FOREACH(sav, sah, state) {
3543 KASSERT(sav->state == state);
3544
3545 if (sav->spi == spi) {
3546 if (hint != NULL && hint != sav)
3547 continue;
3548 sav->state = SADB_SASTATE_DEAD;
3549 SAVLIST_WRITER_REMOVE(sav);
3550 SAVLUT_WRITER_REMOVE(sav);
3551 goto out;
3552 }
3553 }
3554 }
3555 out:
3556 mutex_exit(&key_sad.lock);
3557
3558 return sav;
3559 }
3560
3561 /*
3562 * Free allocated data to member variables of sav:
3563 * sav->replay, sav->key_* and sav->lft_*.
3564 */
3565 static void
3566 key_freesaval(struct secasvar *sav)
3567 {
3568
3569 KASSERT(key_sa_refcnt(sav) == 0);
3570
3571 if (sav->replay != NULL)
3572 kmem_intr_free(sav->replay, sav->replay_len);
3573 if (sav->key_auth != NULL)
3574 kmem_intr_free(sav->key_auth, sav->key_auth_len);
3575 if (sav->key_enc != NULL)
3576 kmem_intr_free(sav->key_enc, sav->key_enc_len);
3577 if (sav->lft_c_counters_percpu != NULL) {
3578 percpu_free(sav->lft_c_counters_percpu,
3579 sizeof(lifetime_counters_t));
3580 }
3581 if (sav->lft_c != NULL)
3582 kmem_intr_free(sav->lft_c, sizeof(*(sav->lft_c)));
3583 if (sav->lft_h != NULL)
3584 kmem_intr_free(sav->lft_h, sizeof(*(sav->lft_h)));
3585 if (sav->lft_s != NULL)
3586 kmem_intr_free(sav->lft_s, sizeof(*(sav->lft_s)));
3587 }
3588
3589 /*
3590 * copy SA values from PF_KEY message except *SPI, SEQ, PID, STATE and TYPE*.
3591 * You must update these if need.
3592 * OUT: 0: success.
3593 * !0: failure.
3594 *
3595 * does not modify mbuf. does not free mbuf on error.
3596 */
3597 static int
3598 key_setsaval(struct secasvar *sav, struct mbuf *m,
3599 const struct sadb_msghdr *mhp)
3600 {
3601 int error = 0;
3602
3603 KASSERT(!cpu_softintr_p());
3604 KASSERT(m != NULL);
3605 KASSERT(mhp != NULL);
3606 KASSERT(mhp->msg != NULL);
3607
3608 /* We shouldn't initialize sav variables while someone uses it. */
3609 KASSERT(key_sa_refcnt(sav) == 0);
3610
3611 /* SA */
3612 if (mhp->ext[SADB_EXT_SA] != NULL) {
3613 const struct sadb_sa *sa0;
3614
3615 sa0 = mhp->ext[SADB_EXT_SA];
3616 if (mhp->extlen[SADB_EXT_SA] < sizeof(*sa0)) {
3617 error = EINVAL;
3618 goto fail;
3619 }
3620
3621 sav->alg_auth = sa0->sadb_sa_auth;
3622 sav->alg_enc = sa0->sadb_sa_encrypt;
3623 sav->flags = sa0->sadb_sa_flags;
3624
3625 /* replay window */
3626 if ((sa0->sadb_sa_flags & SADB_X_EXT_OLD) == 0) {
3627 size_t len = sizeof(struct secreplay) +
3628 sa0->sadb_sa_replay;
3629 sav->replay = kmem_zalloc(len, KM_SLEEP);
3630 sav->replay_len = len;
3631 if (sa0->sadb_sa_replay != 0)
3632 sav->replay->bitmap = (char*)(sav->replay+1);
3633 sav->replay->wsize = sa0->sadb_sa_replay;
3634 }
3635 }
3636
3637 /* Authentication keys */
3638 if (mhp->ext[SADB_EXT_KEY_AUTH] != NULL) {
3639 const struct sadb_key *key0;
3640 int len;
3641
3642 key0 = mhp->ext[SADB_EXT_KEY_AUTH];
3643 len = mhp->extlen[SADB_EXT_KEY_AUTH];
3644
3645 error = 0;
3646 if (len < sizeof(*key0)) {
3647 error = EINVAL;
3648 goto fail;
3649 }
3650 switch (mhp->msg->sadb_msg_satype) {
3651 case SADB_SATYPE_AH:
3652 case SADB_SATYPE_ESP:
3653 case SADB_X_SATYPE_TCPSIGNATURE:
3654 if (len == PFKEY_ALIGN8(sizeof(struct sadb_key)) &&
3655 sav->alg_auth != SADB_X_AALG_NULL)
3656 error = EINVAL;
3657 break;
3658 case SADB_X_SATYPE_IPCOMP:
3659 default:
3660 error = EINVAL;
3661 break;
3662 }
3663 if (error) {
3664 IPSECLOG(LOG_DEBUG, "invalid key_auth values.\n");
3665 goto fail;
3666 }
3667
3668 sav->key_auth = key_newbuf(key0, len);
3669 sav->key_auth_len = len;
3670 }
3671
3672 /* Encryption key */
3673 if (mhp->ext[SADB_EXT_KEY_ENCRYPT] != NULL) {
3674 const struct sadb_key *key0;
3675 int len;
3676
3677 key0 = mhp->ext[SADB_EXT_KEY_ENCRYPT];
3678 len = mhp->extlen[SADB_EXT_KEY_ENCRYPT];
3679
3680 error = 0;
3681 if (len < sizeof(*key0)) {
3682 error = EINVAL;
3683 goto fail;
3684 }
3685 switch (mhp->msg->sadb_msg_satype) {
3686 case SADB_SATYPE_ESP:
3687 if (len == PFKEY_ALIGN8(sizeof(struct sadb_key)) &&
3688 sav->alg_enc != SADB_EALG_NULL) {
3689 error = EINVAL;
3690 break;
3691 }
3692 sav->key_enc = key_newbuf(key0, len);
3693 sav->key_enc_len = len;
3694 break;
3695 case SADB_X_SATYPE_IPCOMP:
3696 if (len != PFKEY_ALIGN8(sizeof(struct sadb_key)))
3697 error = EINVAL;
3698 sav->key_enc = NULL; /*just in case*/
3699 break;
3700 case SADB_SATYPE_AH:
3701 case SADB_X_SATYPE_TCPSIGNATURE:
3702 default:
3703 error = EINVAL;
3704 break;
3705 }
3706 if (error) {
3707 IPSECLOG(LOG_DEBUG, "invalid key_enc value.\n");
3708 goto fail;
3709 }
3710 }
3711
3712 /* set iv */
3713 sav->ivlen = 0;
3714
3715 switch (mhp->msg->sadb_msg_satype) {
3716 case SADB_SATYPE_AH:
3717 error = xform_init(sav, XF_AH);
3718 break;
3719 case SADB_SATYPE_ESP:
3720 error = xform_init(sav, XF_ESP);
3721 break;
3722 case SADB_X_SATYPE_IPCOMP:
3723 error = xform_init(sav, XF_IPCOMP);
3724 break;
3725 case SADB_X_SATYPE_TCPSIGNATURE:
3726 error = xform_init(sav, XF_TCPSIGNATURE);
3727 break;
3728 default:
3729 error = EOPNOTSUPP;
3730 break;
3731 }
3732 if (error) {
3733 IPSECLOG(LOG_DEBUG, "unable to initialize SA type %u (%d)\n",
3734 mhp->msg->sadb_msg_satype, error);
3735 goto fail;
3736 }
3737
3738 /* reset created */
3739 sav->created = time_uptime;
3740
3741 /* make lifetime for CURRENT */
3742 sav->lft_c = kmem_alloc(sizeof(struct sadb_lifetime), KM_SLEEP);
3743
3744 sav->lft_c->sadb_lifetime_len =
3745 PFKEY_UNIT64(sizeof(struct sadb_lifetime));
3746 sav->lft_c->sadb_lifetime_exttype = SADB_EXT_LIFETIME_CURRENT;
3747 sav->lft_c->sadb_lifetime_allocations = 0;
3748 sav->lft_c->sadb_lifetime_bytes = 0;
3749 sav->lft_c->sadb_lifetime_addtime = time_uptime;
3750 sav->lft_c->sadb_lifetime_usetime = 0;
3751
3752 sav->lft_c_counters_percpu = percpu_alloc(sizeof(lifetime_counters_t));
3753
3754 /* lifetimes for HARD and SOFT */
3755 {
3756 const struct sadb_lifetime *lft0;
3757
3758 lft0 = mhp->ext[SADB_EXT_LIFETIME_HARD];
3759 if (lft0 != NULL) {
3760 if (mhp->extlen[SADB_EXT_LIFETIME_HARD] < sizeof(*lft0)) {
3761 error = EINVAL;
3762 goto fail;
3763 }
3764 sav->lft_h = key_newbuf(lft0, sizeof(*lft0));
3765 }
3766
3767 lft0 = mhp->ext[SADB_EXT_LIFETIME_SOFT];
3768 if (lft0 != NULL) {
3769 if (mhp->extlen[SADB_EXT_LIFETIME_SOFT] < sizeof(*lft0)) {
3770 error = EINVAL;
3771 goto fail;
3772 }
3773 sav->lft_s = key_newbuf(lft0, sizeof(*lft0));
3774 /* to be initialize ? */
3775 }
3776 }
3777
3778 return 0;
3779
3780 fail:
3781 key_clear_xform(sav);
3782 key_freesaval(sav);
3783
3784 return error;
3785 }
3786
3787 /*
3788 * validation with a secasvar entry, and set SADB_SATYPE_MATURE.
3789 * OUT: 0: valid
3790 * other: errno
3791 */
3792 static int
3793 key_init_xform(struct secasvar *sav)
3794 {
3795 int error;
3796
3797 /* We shouldn't initialize sav variables while someone uses it. */
3798 KASSERT(key_sa_refcnt(sav) == 0);
3799
3800 /* check SPI value */
3801 switch (sav->sah->saidx.proto) {
3802 case IPPROTO_ESP:
3803 case IPPROTO_AH:
3804 if (ntohl(sav->spi) <= 255) {
3805 IPSECLOG(LOG_DEBUG, "illegal range of SPI %u.\n",
3806 (u_int32_t)ntohl(sav->spi));
3807 return EINVAL;
3808 }
3809 break;
3810 }
3811
3812 /* check algo */
3813 switch (sav->sah->saidx.proto) {
3814 case IPPROTO_AH:
3815 case IPPROTO_TCP:
3816 if (sav->alg_enc != SADB_EALG_NONE) {
3817 IPSECLOG(LOG_DEBUG,
3818 "protocol %u and algorithm mismatched %u != %u.\n",
3819 sav->sah->saidx.proto,
3820 sav->alg_enc, SADB_EALG_NONE);
3821 return EINVAL;
3822 }
3823 break;
3824 case IPPROTO_IPCOMP:
3825 if (sav->alg_auth != SADB_AALG_NONE) {
3826 IPSECLOG(LOG_DEBUG,
3827 "protocol %u and algorithm mismatched %d != %d.\n",
3828 sav->sah->saidx.proto,
3829 sav->alg_auth, SADB_AALG_NONE);
3830 return(EINVAL);
3831 }
3832 break;
3833 default:
3834 break;
3835 }
3836
3837 /* check satype */
3838 switch (sav->sah->saidx.proto) {
3839 case IPPROTO_ESP:
3840 /* check flags */
3841 if ((sav->flags & (SADB_X_EXT_OLD|SADB_X_EXT_DERIV)) ==
3842 (SADB_X_EXT_OLD|SADB_X_EXT_DERIV)) {
3843 IPSECLOG(LOG_DEBUG,
3844 "invalid flag (derived) given to old-esp.\n");
3845 return EINVAL;
3846 }
3847 error = xform_init(sav, XF_ESP);
3848 break;
3849 case IPPROTO_AH:
3850 /* check flags */
3851 if (sav->flags & SADB_X_EXT_DERIV) {
3852 IPSECLOG(LOG_DEBUG,
3853 "invalid flag (derived) given to AH SA.\n");
3854 return EINVAL;
3855 }
3856 error = xform_init(sav, XF_AH);
3857 break;
3858 case IPPROTO_IPCOMP:
3859 if ((sav->flags & SADB_X_EXT_RAWCPI) == 0
3860 && ntohl(sav->spi) >= 0x10000) {
3861 IPSECLOG(LOG_DEBUG, "invalid cpi for IPComp.\n");
3862 return(EINVAL);
3863 }
3864 error = xform_init(sav, XF_IPCOMP);
3865 break;
3866 case IPPROTO_TCP:
3867 error = xform_init(sav, XF_TCPSIGNATURE);
3868 break;
3869 default:
3870 IPSECLOG(LOG_DEBUG, "Invalid satype.\n");
3871 error = EPROTONOSUPPORT;
3872 break;
3873 }
3874
3875 return error;
3876 }
3877
3878 /*
3879 * subroutine for SADB_GET and SADB_DUMP. It never return NULL.
3880 */
3881 static struct mbuf *
3882 key_setdumpsa(struct secasvar *sav, u_int8_t type, u_int8_t satype,
3883 u_int32_t seq, u_int32_t pid)
3884 {
3885 struct mbuf *result = NULL, *tres = NULL, *m;
3886 int l = 0;
3887 int i;
3888 void *p;
3889 struct sadb_lifetime lt;
3890 int dumporder[] = {
3891 SADB_EXT_SA, SADB_X_EXT_SA2,
3892 SADB_EXT_LIFETIME_HARD, SADB_EXT_LIFETIME_SOFT,
3893 SADB_EXT_LIFETIME_CURRENT, SADB_EXT_ADDRESS_SRC,
3894 SADB_EXT_ADDRESS_DST, SADB_EXT_ADDRESS_PROXY, SADB_EXT_KEY_AUTH,
3895 SADB_EXT_KEY_ENCRYPT, SADB_EXT_IDENTITY_SRC,
3896 SADB_EXT_IDENTITY_DST, SADB_EXT_SENSITIVITY,
3897 SADB_X_EXT_NAT_T_TYPE,
3898 SADB_X_EXT_NAT_T_SPORT, SADB_X_EXT_NAT_T_DPORT,
3899 SADB_X_EXT_NAT_T_OAI, SADB_X_EXT_NAT_T_OAR,
3900 SADB_X_EXT_NAT_T_FRAG,
3901
3902 };
3903
3904 m = key_setsadbmsg(type, 0, satype, seq, pid, key_sa_refcnt(sav), M_WAITOK);
3905 result = m;
3906
3907 for (i = __arraycount(dumporder) - 1; i >= 0; i--) {
3908 m = NULL;
3909 p = NULL;
3910 switch (dumporder[i]) {
3911 case SADB_EXT_SA:
3912 m = key_setsadbsa(sav);
3913 break;
3914
3915 case SADB_X_EXT_SA2:
3916 m = key_setsadbxsa2(sav->sah->saidx.mode,
3917 sav->replay ? sav->replay->count : 0,
3918 sav->sah->saidx.reqid);
3919 break;
3920
3921 case SADB_EXT_ADDRESS_SRC:
3922 m = key_setsadbaddr(SADB_EXT_ADDRESS_SRC,
3923 &sav->sah->saidx.src.sa,
3924 FULLMASK, IPSEC_ULPROTO_ANY, M_WAITOK);
3925 break;
3926
3927 case SADB_EXT_ADDRESS_DST:
3928 m = key_setsadbaddr(SADB_EXT_ADDRESS_DST,
3929 &sav->sah->saidx.dst.sa,
3930 FULLMASK, IPSEC_ULPROTO_ANY, M_WAITOK);
3931 break;
3932
3933 case SADB_EXT_KEY_AUTH:
3934 if (!sav->key_auth)
3935 continue;
3936 l = PFKEY_UNUNIT64(sav->key_auth->sadb_key_len);
3937 p = sav->key_auth;
3938 break;
3939
3940 case SADB_EXT_KEY_ENCRYPT:
3941 if (!sav->key_enc)
3942 continue;
3943 l = PFKEY_UNUNIT64(sav->key_enc->sadb_key_len);
3944 p = sav->key_enc;
3945 break;
3946
3947 case SADB_EXT_LIFETIME_CURRENT: {
3948 lifetime_counters_t sum = {0};
3949
3950 KASSERT(sav->lft_c != NULL);
3951 l = PFKEY_UNUNIT64(((struct sadb_ext *)sav->lft_c)->sadb_ext_len);
3952 memcpy(<, sav->lft_c, sizeof(struct sadb_lifetime));
3953 lt.sadb_lifetime_addtime =
3954 time_mono_to_wall(lt.sadb_lifetime_addtime);
3955 lt.sadb_lifetime_usetime =
3956 time_mono_to_wall(lt.sadb_lifetime_usetime);
3957 percpu_foreach(sav->lft_c_counters_percpu,
3958 key_sum_lifetime_counters, sum);
3959 lt.sadb_lifetime_allocations =
3960 sum[LIFETIME_COUNTER_ALLOCATIONS];
3961 lt.sadb_lifetime_bytes =
3962 sum[LIFETIME_COUNTER_BYTES];
3963 p = <
3964 break;
3965 }
3966
3967 case SADB_EXT_LIFETIME_HARD:
3968 if (!sav->lft_h)
3969 continue;
3970 l = PFKEY_UNUNIT64(((struct sadb_ext *)sav->lft_h)->sadb_ext_len);
3971 p = sav->lft_h;
3972 break;
3973
3974 case SADB_EXT_LIFETIME_SOFT:
3975 if (!sav->lft_s)
3976 continue;
3977 l = PFKEY_UNUNIT64(((struct sadb_ext *)sav->lft_s)->sadb_ext_len);
3978 p = sav->lft_s;
3979 break;
3980
3981 case SADB_X_EXT_NAT_T_TYPE:
3982 m = key_setsadbxtype(sav->natt_type);
3983 break;
3984
3985 case SADB_X_EXT_NAT_T_DPORT:
3986 if (sav->natt_type == 0)
3987 continue;
3988 m = key_setsadbxport(
3989 key_portfromsaddr(&sav->sah->saidx.dst),
3990 SADB_X_EXT_NAT_T_DPORT);
3991 break;
3992
3993 case SADB_X_EXT_NAT_T_SPORT:
3994 if (sav->natt_type == 0)
3995 continue;
3996 m = key_setsadbxport(
3997 key_portfromsaddr(&sav->sah->saidx.src),
3998 SADB_X_EXT_NAT_T_SPORT);
3999 break;
4000
4001 case SADB_X_EXT_NAT_T_FRAG:
4002 /* don't send frag info if not set */
4003 if (sav->natt_type == 0 || sav->esp_frag == IP_MAXPACKET)
4004 continue;
4005 m = key_setsadbxfrag(sav->esp_frag);
4006 break;
4007
4008 case SADB_X_EXT_NAT_T_OAI:
4009 case SADB_X_EXT_NAT_T_OAR:
4010 continue;
4011
4012 case SADB_EXT_ADDRESS_PROXY:
4013 case SADB_EXT_IDENTITY_SRC:
4014 case SADB_EXT_IDENTITY_DST:
4015 /* XXX: should we brought from SPD ? */
4016 case SADB_EXT_SENSITIVITY:
4017 default:
4018 continue;
4019 }
4020
4021 KASSERT(!(m && p));
4022 KASSERT(m != NULL || p != NULL);
4023 if (p && tres) {
4024 M_PREPEND(tres, l, M_WAITOK);
4025 memcpy(mtod(tres, void *), p, l);
4026 continue;
4027 }
4028 if (p) {
4029 m = key_alloc_mbuf(l, M_WAITOK);
4030 m_copyback(m, 0, l, p);
4031 }
4032
4033 if (tres)
4034 m_cat(m, tres);
4035 tres = m;
4036 }
4037
4038 m_cat(result, tres);
4039 tres = NULL; /* avoid free on error below */
4040
4041 KASSERT(result->m_len >= sizeof(struct sadb_msg));
4042
4043 result->m_pkthdr.len = 0;
4044 for (m = result; m; m = m->m_next)
4045 result->m_pkthdr.len += m->m_len;
4046
4047 mtod(result, struct sadb_msg *)->sadb_msg_len =
4048 PFKEY_UNIT64(result->m_pkthdr.len);
4049
4050 return result;
4051 }
4052
4053
4054 /*
4055 * set a type in sadb_x_nat_t_type
4056 */
4057 static struct mbuf *
4058 key_setsadbxtype(u_int16_t type)
4059 {
4060 struct mbuf *m;
4061 size_t len;
4062 struct sadb_x_nat_t_type *p;
4063
4064 len = PFKEY_ALIGN8(sizeof(struct sadb_x_nat_t_type));
4065
4066 m = key_alloc_mbuf(len, M_WAITOK);
4067 KASSERT(m->m_next == NULL);
4068
4069 p = mtod(m, struct sadb_x_nat_t_type *);
4070
4071 memset(p, 0, len);
4072 p->sadb_x_nat_t_type_len = PFKEY_UNIT64(len);
4073 p->sadb_x_nat_t_type_exttype = SADB_X_EXT_NAT_T_TYPE;
4074 p->sadb_x_nat_t_type_type = type;
4075
4076 return m;
4077 }
4078 /*
4079 * set a port in sadb_x_nat_t_port. port is in network order
4080 */
4081 static struct mbuf *
4082 key_setsadbxport(u_int16_t port, u_int16_t type)
4083 {
4084 struct mbuf *m;
4085 size_t len;
4086 struct sadb_x_nat_t_port *p;
4087
4088 len = PFKEY_ALIGN8(sizeof(struct sadb_x_nat_t_port));
4089
4090 m = key_alloc_mbuf(len, M_WAITOK);
4091 KASSERT(m->m_next == NULL);
4092
4093 p = mtod(m, struct sadb_x_nat_t_port *);
4094
4095 memset(p, 0, len);
4096 p->sadb_x_nat_t_port_len = PFKEY_UNIT64(len);
4097 p->sadb_x_nat_t_port_exttype = type;
4098 p->sadb_x_nat_t_port_port = port;
4099
4100 return m;
4101 }
4102
4103 /*
4104 * set fragmentation info in sadb_x_nat_t_frag
4105 */
4106 static struct mbuf *
4107 key_setsadbxfrag(u_int16_t flen)
4108 {
4109 struct mbuf *m;
4110 size_t len;
4111 struct sadb_x_nat_t_frag *p;
4112
4113 len = PFKEY_ALIGN8(sizeof(struct sadb_x_nat_t_frag));
4114
4115 m = key_alloc_mbuf(len, M_WAITOK);
4116 KASSERT(m->m_next == NULL);
4117
4118 p = mtod(m, struct sadb_x_nat_t_frag *);
4119
4120 memset(p, 0, len);
4121 p->sadb_x_nat_t_frag_len = PFKEY_UNIT64(len);
4122 p->sadb_x_nat_t_frag_exttype = SADB_X_EXT_NAT_T_FRAG;
4123 p->sadb_x_nat_t_frag_fraglen = flen;
4124
4125 return m;
4126 }
4127
4128 /*
4129 * Get port from sockaddr, port is in network order
4130 */
4131 u_int16_t
4132 key_portfromsaddr(const union sockaddr_union *saddr)
4133 {
4134 u_int16_t port;
4135
4136 switch (saddr->sa.sa_family) {
4137 case AF_INET: {
4138 port = saddr->sin.sin_port;
4139 break;
4140 }
4141 #ifdef INET6
4142 case AF_INET6: {
4143 port = saddr->sin6.sin6_port;
4144 break;
4145 }
4146 #endif
4147 default:
4148 printf("%s: unexpected address family\n", __func__);
4149 port = 0;
4150 break;
4151 }
4152
4153 return port;
4154 }
4155
4156
4157 /*
4158 * Set port is struct sockaddr. port is in network order
4159 */
4160 static void
4161 key_porttosaddr(union sockaddr_union *saddr, u_int16_t port)
4162 {
4163 switch (saddr->sa.sa_family) {
4164 case AF_INET: {
4165 saddr->sin.sin_port = port;
4166 break;
4167 }
4168 #ifdef INET6
4169 case AF_INET6: {
4170 saddr->sin6.sin6_port = port;
4171 break;
4172 }
4173 #endif
4174 default:
4175 printf("%s: unexpected address family %d\n", __func__,
4176 saddr->sa.sa_family);
4177 break;
4178 }
4179
4180 return;
4181 }
4182
4183 /*
4184 * Safety check sa_len
4185 */
4186 static int
4187 key_checksalen(const union sockaddr_union *saddr)
4188 {
4189 switch (saddr->sa.sa_family) {
4190 case AF_INET:
4191 if (saddr->sa.sa_len != sizeof(struct sockaddr_in))
4192 return -1;
4193 break;
4194 #ifdef INET6
4195 case AF_INET6:
4196 if (saddr->sa.sa_len != sizeof(struct sockaddr_in6))
4197 return -1;
4198 break;
4199 #endif
4200 default:
4201 printf("%s: unexpected sa_family %d\n", __func__,
4202 saddr->sa.sa_family);
4203 return -1;
4204 break;
4205 }
4206 return 0;
4207 }
4208
4209
4210 /*
4211 * set data into sadb_msg.
4212 */
4213 static struct mbuf *
4214 key_setsadbmsg(u_int8_t type, u_int16_t tlen, u_int8_t satype,
4215 u_int32_t seq, pid_t pid, u_int16_t reserved, int mflag)
4216 {
4217 struct mbuf *m;
4218 struct sadb_msg *p;
4219 int len;
4220
4221 CTASSERT(PFKEY_ALIGN8(sizeof(struct sadb_msg)) <= MCLBYTES);
4222
4223 len = PFKEY_ALIGN8(sizeof(struct sadb_msg));
4224
4225 m = key_alloc_mbuf_simple(len, mflag);
4226 if (!m)
4227 return NULL;
4228 m->m_pkthdr.len = m->m_len = len;
4229 m->m_next = NULL;
4230
4231 p = mtod(m, struct sadb_msg *);
4232
4233 memset(p, 0, len);
4234 p->sadb_msg_version = PF_KEY_V2;
4235 p->sadb_msg_type = type;
4236 p->sadb_msg_errno = 0;
4237 p->sadb_msg_satype = satype;
4238 p->sadb_msg_len = PFKEY_UNIT64(tlen);
4239 p->sadb_msg_reserved = reserved;
4240 p->sadb_msg_seq = seq;
4241 p->sadb_msg_pid = (u_int32_t)pid;
4242
4243 return m;
4244 }
4245
4246 /*
4247 * copy secasvar data into sadb_address.
4248 */
4249 static struct mbuf *
4250 key_setsadbsa(struct secasvar *sav)
4251 {
4252 struct mbuf *m;
4253 struct sadb_sa *p;
4254 int len;
4255
4256 len = PFKEY_ALIGN8(sizeof(struct sadb_sa));
4257 m = key_alloc_mbuf(len, M_WAITOK);
4258 KASSERT(m->m_next == NULL);
4259
4260 p = mtod(m, struct sadb_sa *);
4261
4262 memset(p, 0, len);
4263 p->sadb_sa_len = PFKEY_UNIT64(len);
4264 p->sadb_sa_exttype = SADB_EXT_SA;
4265 p->sadb_sa_spi = sav->spi;
4266 p->sadb_sa_replay = (sav->replay != NULL ? sav->replay->wsize : 0);
4267 p->sadb_sa_state = sav->state;
4268 p->sadb_sa_auth = sav->alg_auth;
4269 p->sadb_sa_encrypt = sav->alg_enc;
4270 p->sadb_sa_flags = sav->flags;
4271
4272 return m;
4273 }
4274
4275 static uint8_t
4276 key_sabits(const struct sockaddr *saddr)
4277 {
4278 switch (saddr->sa_family) {
4279 case AF_INET:
4280 return _BITS(sizeof(struct in_addr));
4281 case AF_INET6:
4282 return _BITS(sizeof(struct in6_addr));
4283 default:
4284 return FULLMASK;
4285 }
4286 }
4287
4288 /*
4289 * set data into sadb_address.
4290 */
4291 static struct mbuf *
4292 key_setsadbaddr(u_int16_t exttype, const struct sockaddr *saddr,
4293 u_int8_t prefixlen, u_int16_t ul_proto, int mflag)
4294 {
4295 struct mbuf *m;
4296 struct sadb_address *p;
4297 size_t len;
4298
4299 len = PFKEY_ALIGN8(sizeof(struct sadb_address)) +
4300 PFKEY_ALIGN8(saddr->sa_len);
4301 m = key_alloc_mbuf(len, mflag);
4302 if (!m || m->m_next) { /*XXX*/
4303 if (m)
4304 m_freem(m);
4305 return NULL;
4306 }
4307
4308 p = mtod(m, struct sadb_address *);
4309
4310 memset(p, 0, len);
4311 p->sadb_address_len = PFKEY_UNIT64(len);
4312 p->sadb_address_exttype = exttype;
4313 p->sadb_address_proto = ul_proto;
4314 if (prefixlen == FULLMASK) {
4315 prefixlen = key_sabits(saddr);
4316 }
4317 p->sadb_address_prefixlen = prefixlen;
4318 p->sadb_address_reserved = 0;
4319
4320 memcpy(mtod(m, char *) + PFKEY_ALIGN8(sizeof(struct sadb_address)),
4321 saddr, saddr->sa_len);
4322
4323 return m;
4324 }
4325
4326 #if 0
4327 /*
4328 * set data into sadb_ident.
4329 */
4330 static struct mbuf *
4331 key_setsadbident(u_int16_t exttype, u_int16_t idtype,
4332 void *string, int stringlen, u_int64_t id)
4333 {
4334 struct mbuf *m;
4335 struct sadb_ident *p;
4336 size_t len;
4337
4338 len = PFKEY_ALIGN8(sizeof(struct sadb_ident)) + PFKEY_ALIGN8(stringlen);
4339 m = key_alloc_mbuf(len);
4340 if (!m || m->m_next) { /*XXX*/
4341 if (m)
4342 m_freem(m);
4343 return NULL;
4344 }
4345
4346 p = mtod(m, struct sadb_ident *);
4347
4348 memset(p, 0, len);
4349 p->sadb_ident_len = PFKEY_UNIT64(len);
4350 p->sadb_ident_exttype = exttype;
4351 p->sadb_ident_type = idtype;
4352 p->sadb_ident_reserved = 0;
4353 p->sadb_ident_id = id;
4354
4355 memcpy(mtod(m, void *) + PFKEY_ALIGN8(sizeof(struct sadb_ident)),
4356 string, stringlen);
4357
4358 return m;
4359 }
4360 #endif
4361
4362 /*
4363 * set data into sadb_x_sa2.
4364 */
4365 static struct mbuf *
4366 key_setsadbxsa2(u_int8_t mode, u_int32_t seq, u_int16_t reqid)
4367 {
4368 struct mbuf *m;
4369 struct sadb_x_sa2 *p;
4370 size_t len;
4371
4372 len = PFKEY_ALIGN8(sizeof(struct sadb_x_sa2));
4373 m = key_alloc_mbuf(len, M_WAITOK);
4374 KASSERT(m->m_next == NULL);
4375
4376 p = mtod(m, struct sadb_x_sa2 *);
4377
4378 memset(p, 0, len);
4379 p->sadb_x_sa2_len = PFKEY_UNIT64(len);
4380 p->sadb_x_sa2_exttype = SADB_X_EXT_SA2;
4381 p->sadb_x_sa2_mode = mode;
4382 p->sadb_x_sa2_reserved1 = 0;
4383 p->sadb_x_sa2_reserved2 = 0;
4384 p->sadb_x_sa2_sequence = seq;
4385 p->sadb_x_sa2_reqid = reqid;
4386
4387 return m;
4388 }
4389
4390 /*
4391 * set data into sadb_x_policy
4392 */
4393 static struct mbuf *
4394 key_setsadbxpolicy(const u_int16_t type, const u_int8_t dir, const u_int32_t id,
4395 int mflag)
4396 {
4397 struct mbuf *m;
4398 struct sadb_x_policy *p;
4399 size_t len;
4400
4401 len = PFKEY_ALIGN8(sizeof(struct sadb_x_policy));
4402 m = key_alloc_mbuf(len, mflag);
4403 if (!m || m->m_next) { /*XXX*/
4404 if (m)
4405 m_freem(m);
4406 return NULL;
4407 }
4408
4409 p = mtod(m, struct sadb_x_policy *);
4410
4411 memset(p, 0, len);
4412 p->sadb_x_policy_len = PFKEY_UNIT64(len);
4413 p->sadb_x_policy_exttype = SADB_X_EXT_POLICY;
4414 p->sadb_x_policy_type = type;
4415 p->sadb_x_policy_dir = dir;
4416 p->sadb_x_policy_id = id;
4417
4418 return m;
4419 }
4420
4421 /* %%% utilities */
4422 /*
4423 * copy a buffer into the new buffer allocated.
4424 */
4425 static void *
4426 key_newbuf(const void *src, u_int len)
4427 {
4428 void *new;
4429
4430 new = kmem_alloc(len, KM_SLEEP);
4431 memcpy(new, src, len);
4432
4433 return new;
4434 }
4435
4436 /* compare my own address
4437 * OUT: 1: true, i.e. my address.
4438 * 0: false
4439 */
4440 int
4441 key_ismyaddr(const struct sockaddr *sa)
4442 {
4443 #ifdef INET
4444 const struct sockaddr_in *sin;
4445 const struct in_ifaddr *ia;
4446 int s;
4447 #endif
4448
4449 KASSERT(sa != NULL);
4450
4451 switch (sa->sa_family) {
4452 #ifdef INET
4453 case AF_INET:
4454 sin = (const struct sockaddr_in *)sa;
4455 s = pserialize_read_enter();
4456 IN_ADDRLIST_READER_FOREACH(ia) {
4457 if (sin->sin_family == ia->ia_addr.sin_family &&
4458 sin->sin_len == ia->ia_addr.sin_len &&
4459 sin->sin_addr.s_addr == ia->ia_addr.sin_addr.s_addr)
4460 {
4461 pserialize_read_exit(s);
4462 return 1;
4463 }
4464 }
4465 pserialize_read_exit(s);
4466 break;
4467 #endif
4468 #ifdef INET6
4469 case AF_INET6:
4470 return key_ismyaddr6((const struct sockaddr_in6 *)sa);
4471 #endif
4472 }
4473
4474 return 0;
4475 }
4476
4477 #ifdef INET6
4478 /*
4479 * compare my own address for IPv6.
4480 * 1: ours
4481 * 0: other
4482 * NOTE: derived ip6_input() in KAME. This is necessary to modify more.
4483 */
4484 #include <netinet6/in6_var.h>
4485
4486 static int
4487 key_ismyaddr6(const struct sockaddr_in6 *sin6)
4488 {
4489 struct in6_ifaddr *ia;
4490 int s;
4491 struct psref psref;
4492 int bound;
4493 int ours = 1;
4494
4495 bound = curlwp_bind();
4496 s = pserialize_read_enter();
4497 IN6_ADDRLIST_READER_FOREACH(ia) {
4498 bool ingroup;
4499
4500 if (key_sockaddr_match((const struct sockaddr *)&sin6,
4501 (const struct sockaddr *)&ia->ia_addr, 0)) {
4502 pserialize_read_exit(s);
4503 goto ours;
4504 }
4505 ia6_acquire(ia, &psref);
4506 pserialize_read_exit(s);
4507
4508 /*
4509 * XXX Multicast
4510 * XXX why do we care about multlicast here while we don't care
4511 * about IPv4 multicast??
4512 * XXX scope
4513 */
4514 ingroup = in6_multi_group(&sin6->sin6_addr, ia->ia_ifp);
4515 if (ingroup) {
4516 ia6_release(ia, &psref);
4517 goto ours;
4518 }
4519
4520 s = pserialize_read_enter();
4521 ia6_release(ia, &psref);
4522 }
4523 pserialize_read_exit(s);
4524
4525 /* loopback, just for safety */
4526 if (IN6_IS_ADDR_LOOPBACK(&sin6->sin6_addr))
4527 goto ours;
4528
4529 ours = 0;
4530 ours:
4531 curlwp_bindx(bound);
4532
4533 return ours;
4534 }
4535 #endif /*INET6*/
4536
4537 /*
4538 * compare two secasindex structure.
4539 * flag can specify to compare 2 saidxes.
4540 * compare two secasindex structure without both mode and reqid.
4541 * don't compare port.
4542 * IN:
4543 * saidx0: source, it can be in SAD.
4544 * saidx1: object.
4545 * OUT:
4546 * 1 : equal
4547 * 0 : not equal
4548 */
4549 static int
4550 key_saidx_match(
4551 const struct secasindex *saidx0,
4552 const struct secasindex *saidx1,
4553 int flag)
4554 {
4555 int chkport;
4556 const struct sockaddr *sa0src, *sa0dst, *sa1src, *sa1dst;
4557
4558 KASSERT(saidx0 != NULL);
4559 KASSERT(saidx1 != NULL);
4560
4561 /* sanity */
4562 if (saidx0->proto != saidx1->proto)
4563 return 0;
4564
4565 if (flag == CMP_EXACTLY) {
4566 if (saidx0->mode != saidx1->mode)
4567 return 0;
4568 if (saidx0->reqid != saidx1->reqid)
4569 return 0;
4570 if (memcmp(&saidx0->src, &saidx1->src, saidx0->src.sa.sa_len) != 0 ||
4571 memcmp(&saidx0->dst, &saidx1->dst, saidx0->dst.sa.sa_len) != 0)
4572 return 0;
4573 } else {
4574
4575 /* CMP_MODE_REQID, CMP_REQID, CMP_HEAD */
4576 if (flag == CMP_MODE_REQID ||flag == CMP_REQID) {
4577 /*
4578 * If reqid of SPD is non-zero, unique SA is required.
4579 * The result must be of same reqid in this case.
4580 */
4581 if (saidx1->reqid != 0 && saidx0->reqid != saidx1->reqid)
4582 return 0;
4583 }
4584
4585 if (flag == CMP_MODE_REQID) {
4586 if (saidx0->mode != IPSEC_MODE_ANY &&
4587 saidx0->mode != saidx1->mode)
4588 return 0;
4589 }
4590
4591
4592 sa0src = &saidx0->src.sa;
4593 sa0dst = &saidx0->dst.sa;
4594 sa1src = &saidx1->src.sa;
4595 sa1dst = &saidx1->dst.sa;
4596 /*
4597 * If NAT-T is enabled, check ports for tunnel mode.
4598 * For ipsecif(4), check ports for transport mode, too.
4599 * Don't check ports if they are set to zero
4600 * in the SPD: This means we have a non-generated
4601 * SPD which can't know UDP ports.
4602 */
4603 if (saidx1->mode == IPSEC_MODE_TUNNEL ||
4604 saidx1->mode == IPSEC_MODE_TRANSPORT)
4605 chkport = PORT_LOOSE;
4606 else
4607 chkport = PORT_NONE;
4608
4609 if (!key_sockaddr_match(sa0src, sa1src, chkport)) {
4610 return 0;
4611 }
4612 if (!key_sockaddr_match(sa0dst, sa1dst, chkport)) {
4613 return 0;
4614 }
4615 }
4616
4617 return 1;
4618 }
4619
4620 /*
4621 * compare two secindex structure exactly.
4622 * IN:
4623 * spidx0: source, it is often in SPD.
4624 * spidx1: object, it is often from PFKEY message.
4625 * OUT:
4626 * 1 : equal
4627 * 0 : not equal
4628 */
4629 static int
4630 key_spidx_match_exactly(
4631 const struct secpolicyindex *spidx0,
4632 const struct secpolicyindex *spidx1)
4633 {
4634
4635 KASSERT(spidx0 != NULL);
4636 KASSERT(spidx1 != NULL);
4637
4638 /* sanity */
4639 if (spidx0->prefs != spidx1->prefs ||
4640 spidx0->prefd != spidx1->prefd ||
4641 spidx0->ul_proto != spidx1->ul_proto)
4642 return 0;
4643
4644 return key_sockaddr_match(&spidx0->src.sa, &spidx1->src.sa, PORT_STRICT) &&
4645 key_sockaddr_match(&spidx0->dst.sa, &spidx1->dst.sa, PORT_STRICT);
4646 }
4647
4648 /*
4649 * compare two secindex structure with mask.
4650 * IN:
4651 * spidx0: source, it is often in SPD.
4652 * spidx1: object, it is often from IP header.
4653 * OUT:
4654 * 1 : equal
4655 * 0 : not equal
4656 */
4657 static int
4658 key_spidx_match_withmask(
4659 const struct secpolicyindex *spidx0,
4660 const struct secpolicyindex *spidx1)
4661 {
4662
4663 KASSERT(spidx0 != NULL);
4664 KASSERT(spidx1 != NULL);
4665
4666 if (spidx0->src.sa.sa_family != spidx1->src.sa.sa_family ||
4667 spidx0->dst.sa.sa_family != spidx1->dst.sa.sa_family ||
4668 spidx0->src.sa.sa_len != spidx1->src.sa.sa_len ||
4669 spidx0->dst.sa.sa_len != spidx1->dst.sa.sa_len)
4670 return 0;
4671
4672 /* if spidx.ul_proto == IPSEC_ULPROTO_ANY, ignore. */
4673 if (spidx0->ul_proto != (u_int16_t)IPSEC_ULPROTO_ANY &&
4674 spidx0->ul_proto != spidx1->ul_proto)
4675 return 0;
4676
4677 switch (spidx0->src.sa.sa_family) {
4678 case AF_INET:
4679 if (spidx0->src.sin.sin_port != IPSEC_PORT_ANY &&
4680 spidx0->src.sin.sin_port != spidx1->src.sin.sin_port)
4681 return 0;
4682 if (!key_bb_match_withmask(&spidx0->src.sin.sin_addr,
4683 &spidx1->src.sin.sin_addr, spidx0->prefs))
4684 return 0;
4685 break;
4686 case AF_INET6:
4687 if (spidx0->src.sin6.sin6_port != IPSEC_PORT_ANY &&
4688 spidx0->src.sin6.sin6_port != spidx1->src.sin6.sin6_port)
4689 return 0;
4690 /*
4691 * scope_id check. if sin6_scope_id is 0, we regard it
4692 * as a wildcard scope, which matches any scope zone ID.
4693 */
4694 if (spidx0->src.sin6.sin6_scope_id &&
4695 spidx1->src.sin6.sin6_scope_id &&
4696 spidx0->src.sin6.sin6_scope_id != spidx1->src.sin6.sin6_scope_id)
4697 return 0;
4698 if (!key_bb_match_withmask(&spidx0->src.sin6.sin6_addr,
4699 &spidx1->src.sin6.sin6_addr, spidx0->prefs))
4700 return 0;
4701 break;
4702 default:
4703 /* XXX */
4704 if (memcmp(&spidx0->src, &spidx1->src, spidx0->src.sa.sa_len) != 0)
4705 return 0;
4706 break;
4707 }
4708
4709 switch (spidx0->dst.sa.sa_family) {
4710 case AF_INET:
4711 if (spidx0->dst.sin.sin_port != IPSEC_PORT_ANY &&
4712 spidx0->dst.sin.sin_port != spidx1->dst.sin.sin_port)
4713 return 0;
4714 if (!key_bb_match_withmask(&spidx0->dst.sin.sin_addr,
4715 &spidx1->dst.sin.sin_addr, spidx0->prefd))
4716 return 0;
4717 break;
4718 case AF_INET6:
4719 if (spidx0->dst.sin6.sin6_port != IPSEC_PORT_ANY &&
4720 spidx0->dst.sin6.sin6_port != spidx1->dst.sin6.sin6_port)
4721 return 0;
4722 /*
4723 * scope_id check. if sin6_scope_id is 0, we regard it
4724 * as a wildcard scope, which matches any scope zone ID.
4725 */
4726 if (spidx0->src.sin6.sin6_scope_id &&
4727 spidx1->src.sin6.sin6_scope_id &&
4728 spidx0->dst.sin6.sin6_scope_id != spidx1->dst.sin6.sin6_scope_id)
4729 return 0;
4730 if (!key_bb_match_withmask(&spidx0->dst.sin6.sin6_addr,
4731 &spidx1->dst.sin6.sin6_addr, spidx0->prefd))
4732 return 0;
4733 break;
4734 default:
4735 /* XXX */
4736 if (memcmp(&spidx0->dst, &spidx1->dst, spidx0->dst.sa.sa_len) != 0)
4737 return 0;
4738 break;
4739 }
4740
4741 /* XXX Do we check other field ? e.g. flowinfo */
4742
4743 return 1;
4744 }
4745
4746 /* returns 0 on match */
4747 static int
4748 key_portcomp(in_port_t port1, in_port_t port2, int howport)
4749 {
4750 switch (howport) {
4751 case PORT_NONE:
4752 return 0;
4753 case PORT_LOOSE:
4754 if (port1 == 0 || port2 == 0)
4755 return 0;
4756 /*FALLTHROUGH*/
4757 case PORT_STRICT:
4758 if (port1 != port2) {
4759 KEYDEBUG_PRINTF(KEYDEBUG_MATCH,
4760 "port fail %d != %d\n", port1, port2);
4761 return 1;
4762 }
4763 return 0;
4764 default:
4765 KASSERT(0);
4766 return 1;
4767 }
4768 }
4769
4770 /* returns 1 on match */
4771 static int
4772 key_sockaddr_match(
4773 const struct sockaddr *sa1,
4774 const struct sockaddr *sa2,
4775 int howport)
4776 {
4777 const struct sockaddr_in *sin1, *sin2;
4778 const struct sockaddr_in6 *sin61, *sin62;
4779 char s1[IPSEC_ADDRSTRLEN], s2[IPSEC_ADDRSTRLEN];
4780
4781 if (sa1->sa_family != sa2->sa_family || sa1->sa_len != sa2->sa_len) {
4782 KEYDEBUG_PRINTF(KEYDEBUG_MATCH,
4783 "fam/len fail %d != %d || %d != %d\n",
4784 sa1->sa_family, sa2->sa_family, sa1->sa_len,
4785 sa2->sa_len);
4786 return 0;
4787 }
4788
4789 switch (sa1->sa_family) {
4790 case AF_INET:
4791 if (sa1->sa_len != sizeof(struct sockaddr_in)) {
4792 KEYDEBUG_PRINTF(KEYDEBUG_MATCH,
4793 "len fail %d != %zu\n",
4794 sa1->sa_len, sizeof(struct sockaddr_in));
4795 return 0;
4796 }
4797 sin1 = (const struct sockaddr_in *)sa1;
4798 sin2 = (const struct sockaddr_in *)sa2;
4799 if (sin1->sin_addr.s_addr != sin2->sin_addr.s_addr) {
4800 KEYDEBUG_PRINTF(KEYDEBUG_MATCH,
4801 "addr fail %s != %s\n",
4802 (in_print(s1, sizeof(s1), &sin1->sin_addr), s1),
4803 (in_print(s2, sizeof(s2), &sin2->sin_addr), s2));
4804 return 0;
4805 }
4806 if (key_portcomp(sin1->sin_port, sin2->sin_port, howport)) {
4807 return 0;
4808 }
4809 KEYDEBUG_PRINTF(KEYDEBUG_MATCH,
4810 "addr success %s[%d] == %s[%d]\n",
4811 (in_print(s1, sizeof(s1), &sin1->sin_addr), s1),
4812 sin1->sin_port,
4813 (in_print(s2, sizeof(s2), &sin2->sin_addr), s2),
4814 sin2->sin_port);
4815 break;
4816 case AF_INET6:
4817 sin61 = (const struct sockaddr_in6 *)sa1;
4818 sin62 = (const struct sockaddr_in6 *)sa2;
4819 if (sa1->sa_len != sizeof(struct sockaddr_in6))
4820 return 0; /*EINVAL*/
4821
4822 if (sin61->sin6_scope_id != sin62->sin6_scope_id) {
4823 return 0;
4824 }
4825 if (!IN6_ARE_ADDR_EQUAL(&sin61->sin6_addr, &sin62->sin6_addr)) {
4826 return 0;
4827 }
4828 if (key_portcomp(sin61->sin6_port, sin62->sin6_port, howport)) {
4829 return 0;
4830 }
4831 break;
4832 default:
4833 if (memcmp(sa1, sa2, sa1->sa_len) != 0)
4834 return 0;
4835 break;
4836 }
4837
4838 return 1;
4839 }
4840
4841 /*
4842 * compare two buffers with mask.
4843 * IN:
4844 * addr1: source
4845 * addr2: object
4846 * bits: Number of bits to compare
4847 * OUT:
4848 * 1 : equal
4849 * 0 : not equal
4850 */
4851 static int
4852 key_bb_match_withmask(const void *a1, const void *a2, u_int bits)
4853 {
4854 const unsigned char *p1 = a1;
4855 const unsigned char *p2 = a2;
4856
4857 /* XXX: This could be considerably faster if we compare a word
4858 * at a time, but it is complicated on LSB Endian machines */
4859
4860 /* Handle null pointers */
4861 if (p1 == NULL || p2 == NULL)
4862 return (p1 == p2);
4863
4864 while (bits >= 8) {
4865 if (*p1++ != *p2++)
4866 return 0;
4867 bits -= 8;
4868 }
4869
4870 if (bits > 0) {
4871 u_int8_t mask = ~((1<<(8-bits))-1);
4872 if ((*p1 & mask) != (*p2 & mask))
4873 return 0;
4874 }
4875 return 1; /* Match! */
4876 }
4877
4878 static void
4879 key_timehandler_spd(time_t now)
4880 {
4881 u_int dir;
4882 struct secpolicy *sp;
4883
4884 for (dir = 0; dir < IPSEC_DIR_MAX; dir++) {
4885 retry:
4886 mutex_enter(&key_spd.lock);
4887 SPLIST_WRITER_FOREACH(sp, dir) {
4888 KASSERT(sp->state != IPSEC_SPSTATE_DEAD);
4889
4890 if (sp->lifetime == 0 && sp->validtime == 0)
4891 continue;
4892
4893 if ((sp->lifetime && now - sp->created > sp->lifetime) ||
4894 (sp->validtime && now - sp->lastused > sp->validtime)) {
4895 key_unlink_sp(sp);
4896 mutex_exit(&key_spd.lock);
4897 key_spdexpire(sp);
4898 key_destroy_sp(sp);
4899 goto retry;
4900 }
4901 }
4902 mutex_exit(&key_spd.lock);
4903 }
4904
4905 retry_socksplist:
4906 mutex_enter(&key_spd.lock);
4907 SOCKSPLIST_WRITER_FOREACH(sp) {
4908 if (sp->state != IPSEC_SPSTATE_DEAD)
4909 continue;
4910
4911 key_unlink_sp(sp);
4912 mutex_exit(&key_spd.lock);
4913 key_destroy_sp(sp);
4914 goto retry_socksplist;
4915 }
4916 mutex_exit(&key_spd.lock);
4917 }
4918
4919 static void
4920 key_timehandler_sad(time_t now)
4921 {
4922 struct secashead *sah;
4923 int s;
4924
4925 restart:
4926 mutex_enter(&key_sad.lock);
4927 SAHLIST_WRITER_FOREACH(sah) {
4928 /* If sah has been dead and has no sav, then delete it */
4929 if (sah->state == SADB_SASTATE_DEAD &&
4930 !key_sah_has_sav(sah)) {
4931 key_unlink_sah(sah);
4932 mutex_exit(&key_sad.lock);
4933 key_destroy_sah(sah);
4934 goto restart;
4935 }
4936 }
4937 mutex_exit(&key_sad.lock);
4938
4939 s = pserialize_read_enter();
4940 SAHLIST_READER_FOREACH(sah) {
4941 struct secasvar *sav;
4942
4943 key_sah_ref(sah);
4944 pserialize_read_exit(s);
4945
4946 /* if LARVAL entry doesn't become MATURE, delete it. */
4947 mutex_enter(&key_sad.lock);
4948 restart_sav_LARVAL:
4949 SAVLIST_WRITER_FOREACH(sav, sah, SADB_SASTATE_LARVAL) {
4950 if (now - sav->created > key_larval_lifetime) {
4951 key_sa_chgstate(sav, SADB_SASTATE_DEAD);
4952 goto restart_sav_LARVAL;
4953 }
4954 }
4955 mutex_exit(&key_sad.lock);
4956
4957 /*
4958 * check MATURE entry to start to send expire message
4959 * whether or not.
4960 */
4961 restart_sav_MATURE:
4962 mutex_enter(&key_sad.lock);
4963 SAVLIST_WRITER_FOREACH(sav, sah, SADB_SASTATE_MATURE) {
4964 /* we don't need to check. */
4965 if (sav->lft_s == NULL)
4966 continue;
4967
4968 /* sanity check */
4969 KASSERT(sav->lft_c != NULL);
4970
4971 /* check SOFT lifetime */
4972 if (sav->lft_s->sadb_lifetime_addtime != 0 &&
4973 now - sav->created > sav->lft_s->sadb_lifetime_addtime) {
4974 /*
4975 * check SA to be used whether or not.
4976 * when SA hasn't been used, delete it.
4977 */
4978 if (sav->lft_c->sadb_lifetime_usetime == 0) {
4979 key_sa_chgstate(sav, SADB_SASTATE_DEAD);
4980 mutex_exit(&key_sad.lock);
4981 } else {
4982 key_sa_chgstate(sav, SADB_SASTATE_DYING);
4983 mutex_exit(&key_sad.lock);
4984 /*
4985 * XXX If we keep to send expire
4986 * message in the status of
4987 * DYING. Do remove below code.
4988 */
4989 key_expire(sav);
4990 }
4991 goto restart_sav_MATURE;
4992 }
4993 /* check SOFT lifetime by bytes */
4994 /*
4995 * XXX I don't know the way to delete this SA
4996 * when new SA is installed. Caution when it's
4997 * installed too big lifetime by time.
4998 */
4999 else {
5000 uint64_t lft_c_bytes = 0;
5001 lifetime_counters_t sum = {0};
5002
5003 percpu_foreach(sav->lft_c_counters_percpu,
5004 key_sum_lifetime_counters, sum);
5005 lft_c_bytes = sum[LIFETIME_COUNTER_BYTES];
5006
5007 if (sav->lft_s->sadb_lifetime_bytes == 0 ||
5008 sav->lft_s->sadb_lifetime_bytes >= lft_c_bytes)
5009 continue;
5010
5011 key_sa_chgstate(sav, SADB_SASTATE_DYING);
5012 mutex_exit(&key_sad.lock);
5013 /*
5014 * XXX If we keep to send expire
5015 * message in the status of
5016 * DYING. Do remove below code.
5017 */
5018 key_expire(sav);
5019 goto restart_sav_MATURE;
5020 }
5021 }
5022 mutex_exit(&key_sad.lock);
5023
5024 /* check DYING entry to change status to DEAD. */
5025 mutex_enter(&key_sad.lock);
5026 restart_sav_DYING:
5027 SAVLIST_WRITER_FOREACH(sav, sah, SADB_SASTATE_DYING) {
5028 /* we don't need to check. */
5029 if (sav->lft_h == NULL)
5030 continue;
5031
5032 /* sanity check */
5033 KASSERT(sav->lft_c != NULL);
5034
5035 if (sav->lft_h->sadb_lifetime_addtime != 0 &&
5036 now - sav->created > sav->lft_h->sadb_lifetime_addtime) {
5037 key_sa_chgstate(sav, SADB_SASTATE_DEAD);
5038 goto restart_sav_DYING;
5039 }
5040 #if 0 /* XXX Should we keep to send expire message until HARD lifetime ? */
5041 else if (sav->lft_s != NULL
5042 && sav->lft_s->sadb_lifetime_addtime != 0
5043 && now - sav->created > sav->lft_s->sadb_lifetime_addtime) {
5044 /*
5045 * XXX: should be checked to be
5046 * installed the valid SA.
5047 */
5048
5049 /*
5050 * If there is no SA then sending
5051 * expire message.
5052 */
5053 key_expire(sav);
5054 }
5055 #endif
5056 /* check HARD lifetime by bytes */
5057 else {
5058 uint64_t lft_c_bytes = 0;
5059 lifetime_counters_t sum = {0};
5060
5061 percpu_foreach(sav->lft_c_counters_percpu,
5062 key_sum_lifetime_counters, sum);
5063 lft_c_bytes = sum[LIFETIME_COUNTER_BYTES];
5064
5065 if (sav->lft_h->sadb_lifetime_bytes == 0 ||
5066 sav->lft_h->sadb_lifetime_bytes >= lft_c_bytes)
5067 continue;
5068
5069 key_sa_chgstate(sav, SADB_SASTATE_DEAD);
5070 goto restart_sav_DYING;
5071 }
5072 }
5073 mutex_exit(&key_sad.lock);
5074
5075 /* delete entry in DEAD */
5076 restart_sav_DEAD:
5077 mutex_enter(&key_sad.lock);
5078 SAVLIST_WRITER_FOREACH(sav, sah, SADB_SASTATE_DEAD) {
5079 key_unlink_sav(sav);
5080 mutex_exit(&key_sad.lock);
5081 key_destroy_sav(sav);
5082 goto restart_sav_DEAD;
5083 }
5084 mutex_exit(&key_sad.lock);
5085
5086 s = pserialize_read_enter();
5087 key_sah_unref(sah);
5088 }
5089 pserialize_read_exit(s);
5090 }
5091
5092 static void
5093 key_timehandler_acq(time_t now)
5094 {
5095 #ifndef IPSEC_NONBLOCK_ACQUIRE
5096 struct secacq *acq, *nextacq;
5097
5098 restart:
5099 mutex_enter(&key_misc.lock);
5100 LIST_FOREACH_SAFE(acq, &key_misc.acqlist, chain, nextacq) {
5101 if (now - acq->created > key_blockacq_lifetime) {
5102 LIST_REMOVE(acq, chain);
5103 mutex_exit(&key_misc.lock);
5104 kmem_free(acq, sizeof(*acq));
5105 goto restart;
5106 }
5107 }
5108 mutex_exit(&key_misc.lock);
5109 #endif
5110 }
5111
5112 static void
5113 key_timehandler_spacq(time_t now)
5114 {
5115 #ifdef notyet
5116 struct secspacq *acq, *nextacq;
5117
5118 LIST_FOREACH_SAFE(acq, &key_misc.spacqlist, chain, nextacq) {
5119 if (now - acq->created > key_blockacq_lifetime) {
5120 KASSERT(__LIST_CHAINED(acq));
5121 LIST_REMOVE(acq, chain);
5122 kmem_free(acq, sizeof(*acq));
5123 }
5124 }
5125 #endif
5126 }
5127
5128 static unsigned int key_timehandler_work_enqueued = 0;
5129
5130 /*
5131 * time handler.
5132 * scanning SPD and SAD to check status for each entries,
5133 * and do to remove or to expire.
5134 */
5135 static void
5136 key_timehandler_work(struct work *wk, void *arg)
5137 {
5138 time_t now = time_uptime;
5139
5140 /* We can allow enqueuing another work at this point */
5141 atomic_swap_uint(&key_timehandler_work_enqueued, 0);
5142
5143 key_timehandler_spd(now);
5144 key_timehandler_sad(now);
5145 key_timehandler_acq(now);
5146 key_timehandler_spacq(now);
5147
5148 key_acquire_sendup_pending_mbuf();
5149
5150 /* do exchange to tick time !! */
5151 callout_reset(&key_timehandler_ch, hz, key_timehandler, NULL);
5152
5153 return;
5154 }
5155
5156 static void
5157 key_timehandler(void *arg)
5158 {
5159
5160 /* Avoid enqueuing another work when one is already enqueued */
5161 if (atomic_swap_uint(&key_timehandler_work_enqueued, 1) == 1)
5162 return;
5163
5164 workqueue_enqueue(key_timehandler_wq, &key_timehandler_wk, NULL);
5165 }
5166
5167 u_long
5168 key_random(void)
5169 {
5170 u_long value;
5171
5172 key_randomfill(&value, sizeof(value));
5173 return value;
5174 }
5175
5176 void
5177 key_randomfill(void *p, size_t l)
5178 {
5179
5180 cprng_fast(p, l);
5181 }
5182
5183 /*
5184 * map SADB_SATYPE_* to IPPROTO_*.
5185 * if satype == SADB_SATYPE then satype is mapped to ~0.
5186 * OUT:
5187 * 0: invalid satype.
5188 */
5189 static u_int16_t
5190 key_satype2proto(u_int8_t satype)
5191 {
5192 switch (satype) {
5193 case SADB_SATYPE_UNSPEC:
5194 return IPSEC_PROTO_ANY;
5195 case SADB_SATYPE_AH:
5196 return IPPROTO_AH;
5197 case SADB_SATYPE_ESP:
5198 return IPPROTO_ESP;
5199 case SADB_X_SATYPE_IPCOMP:
5200 return IPPROTO_IPCOMP;
5201 case SADB_X_SATYPE_TCPSIGNATURE:
5202 return IPPROTO_TCP;
5203 default:
5204 return 0;
5205 }
5206 /* NOTREACHED */
5207 }
5208
5209 /*
5210 * map IPPROTO_* to SADB_SATYPE_*
5211 * OUT:
5212 * 0: invalid protocol type.
5213 */
5214 static u_int8_t
5215 key_proto2satype(u_int16_t proto)
5216 {
5217 switch (proto) {
5218 case IPPROTO_AH:
5219 return SADB_SATYPE_AH;
5220 case IPPROTO_ESP:
5221 return SADB_SATYPE_ESP;
5222 case IPPROTO_IPCOMP:
5223 return SADB_X_SATYPE_IPCOMP;
5224 case IPPROTO_TCP:
5225 return SADB_X_SATYPE_TCPSIGNATURE;
5226 default:
5227 return 0;
5228 }
5229 /* NOTREACHED */
5230 }
5231
5232 static int
5233 key_setsecasidx(int proto, int mode, int reqid,
5234 const struct sockaddr *src, const struct sockaddr *dst,
5235 struct secasindex * saidx)
5236 {
5237 const union sockaddr_union *src_u = (const union sockaddr_union *)src;
5238 const union sockaddr_union *dst_u = (const union sockaddr_union *)dst;
5239
5240 /* sa len safety check */
5241 if (key_checksalen(src_u) != 0)
5242 return -1;
5243 if (key_checksalen(dst_u) != 0)
5244 return -1;
5245
5246 memset(saidx, 0, sizeof(*saidx));
5247 saidx->proto = proto;
5248 saidx->mode = mode;
5249 saidx->reqid = reqid;
5250 memcpy(&saidx->src, src_u, src_u->sa.sa_len);
5251 memcpy(&saidx->dst, dst_u, dst_u->sa.sa_len);
5252
5253 key_porttosaddr(&((saidx)->src), 0);
5254 key_porttosaddr(&((saidx)->dst), 0);
5255 return 0;
5256 }
5257
5258 static void
5259 key_init_spidx_bymsghdr(struct secpolicyindex *spidx,
5260 const struct sadb_msghdr *mhp)
5261 {
5262 const struct sadb_address *src0, *dst0;
5263 const struct sockaddr *src, *dst;
5264 const struct sadb_x_policy *xpl0;
5265
5266 src0 = mhp->ext[SADB_EXT_ADDRESS_SRC];
5267 dst0 = mhp->ext[SADB_EXT_ADDRESS_DST];
5268 src = key_msghdr_get_sockaddr(mhp, SADB_EXT_ADDRESS_SRC);
5269 dst = key_msghdr_get_sockaddr(mhp, SADB_EXT_ADDRESS_DST);
5270 xpl0 = mhp->ext[SADB_X_EXT_POLICY];
5271
5272 memset(spidx, 0, sizeof(*spidx));
5273 spidx->dir = xpl0->sadb_x_policy_dir;
5274 spidx->prefs = src0->sadb_address_prefixlen;
5275 spidx->prefd = dst0->sadb_address_prefixlen;
5276 spidx->ul_proto = src0->sadb_address_proto;
5277 /* XXX boundary check against sa_len */
5278 memcpy(&spidx->src, src, src->sa_len);
5279 memcpy(&spidx->dst, dst, dst->sa_len);
5280 }
5281
5282 /* %%% PF_KEY */
5283 /*
5284 * SADB_GETSPI processing is to receive
5285 * <base, (SA2), src address, dst address, (SPI range)>
5286 * from the IKMPd, to assign a unique spi value, to hang on the INBOUND
5287 * tree with the status of LARVAL, and send
5288 * <base, SA(*), address(SD)>
5289 * to the IKMPd.
5290 *
5291 * IN: mhp: pointer to the pointer to each header.
5292 * OUT: NULL if fail.
5293 * other if success, return pointer to the message to send.
5294 */
5295 static int
5296 key_api_getspi(struct socket *so, struct mbuf *m,
5297 const struct sadb_msghdr *mhp)
5298 {
5299 const struct sockaddr *src, *dst;
5300 struct secasindex saidx;
5301 struct secashead *sah;
5302 struct secasvar *newsav;
5303 u_int8_t proto;
5304 u_int32_t spi;
5305 u_int8_t mode;
5306 u_int16_t reqid;
5307 int error;
5308
5309 if (mhp->ext[SADB_EXT_ADDRESS_SRC] == NULL ||
5310 mhp->ext[SADB_EXT_ADDRESS_DST] == NULL) {
5311 IPSECLOG(LOG_DEBUG, "invalid message is passed.\n");
5312 return key_senderror(so, m, EINVAL);
5313 }
5314 if (mhp->extlen[SADB_EXT_ADDRESS_SRC] < sizeof(struct sadb_address) ||
5315 mhp->extlen[SADB_EXT_ADDRESS_DST] < sizeof(struct sadb_address)) {
5316 IPSECLOG(LOG_DEBUG, "invalid message is passed.\n");
5317 return key_senderror(so, m, EINVAL);
5318 }
5319 if (mhp->ext[SADB_X_EXT_SA2] != NULL) {
5320 const struct sadb_x_sa2 *sa2 = mhp->ext[SADB_X_EXT_SA2];
5321 mode = sa2->sadb_x_sa2_mode;
5322 reqid = sa2->sadb_x_sa2_reqid;
5323 } else {
5324 mode = IPSEC_MODE_ANY;
5325 reqid = 0;
5326 }
5327
5328 src = key_msghdr_get_sockaddr(mhp, SADB_EXT_ADDRESS_SRC);
5329 dst = key_msghdr_get_sockaddr(mhp, SADB_EXT_ADDRESS_DST);
5330
5331 /* map satype to proto */
5332 proto = key_satype2proto(mhp->msg->sadb_msg_satype);
5333 if (proto == 0) {
5334 IPSECLOG(LOG_DEBUG, "invalid satype is passed.\n");
5335 return key_senderror(so, m, EINVAL);
5336 }
5337
5338
5339 error = key_setsecasidx(proto, mode, reqid, src, dst, &saidx);
5340 if (error != 0)
5341 return key_senderror(so, m, EINVAL);
5342
5343 error = key_set_natt_ports(&saidx.src, &saidx.dst, mhp);
5344 if (error != 0)
5345 return key_senderror(so, m, EINVAL);
5346
5347 /* SPI allocation */
5348 spi = key_do_getnewspi(mhp->ext[SADB_EXT_SPIRANGE], &saidx);
5349 if (spi == 0)
5350 return key_senderror(so, m, EINVAL);
5351
5352 /* get a SA index */
5353 sah = key_getsah_ref(&saidx, CMP_REQID);
5354 if (sah == NULL) {
5355 /* create a new SA index */
5356 sah = key_newsah(&saidx);
5357 if (sah == NULL) {
5358 IPSECLOG(LOG_DEBUG, "No more memory.\n");
5359 return key_senderror(so, m, ENOBUFS);
5360 }
5361 }
5362
5363 /* get a new SA */
5364 /* XXX rewrite */
5365 newsav = KEY_NEWSAV(m, mhp, &error);
5366 if (newsav == NULL) {
5367 key_sah_unref(sah);
5368 /* XXX don't free new SA index allocated in above. */
5369 return key_senderror(so, m, error);
5370 }
5371
5372 /* set spi */
5373 newsav->spi = htonl(spi);
5374
5375 /* Add to sah#savlist */
5376 key_init_sav(newsav);
5377 newsav->sah = sah;
5378 newsav->state = SADB_SASTATE_LARVAL;
5379 mutex_enter(&key_sad.lock);
5380 SAVLIST_WRITER_INSERT_TAIL(sah, SADB_SASTATE_LARVAL, newsav);
5381 mutex_exit(&key_sad.lock);
5382 key_validate_savlist(sah, SADB_SASTATE_LARVAL);
5383
5384 key_sah_unref(sah);
5385
5386 #ifndef IPSEC_NONBLOCK_ACQUIRE
5387 /* delete the entry in key_misc.acqlist */
5388 if (mhp->msg->sadb_msg_seq != 0) {
5389 struct secacq *acq;
5390 mutex_enter(&key_misc.lock);
5391 acq = key_getacqbyseq(mhp->msg->sadb_msg_seq);
5392 if (acq != NULL) {
5393 /* reset counter in order to deletion by timehandler. */
5394 acq->created = time_uptime;
5395 acq->count = 0;
5396 }
5397 mutex_exit(&key_misc.lock);
5398 }
5399 #endif
5400
5401 {
5402 struct mbuf *n, *nn;
5403 struct sadb_sa *m_sa;
5404 int off, len;
5405
5406 CTASSERT(PFKEY_ALIGN8(sizeof(struct sadb_msg)) +
5407 PFKEY_ALIGN8(sizeof(struct sadb_sa)) <= MCLBYTES);
5408
5409 /* create new sadb_msg to reply. */
5410 len = PFKEY_ALIGN8(sizeof(struct sadb_msg)) +
5411 PFKEY_ALIGN8(sizeof(struct sadb_sa));
5412
5413 n = key_alloc_mbuf_simple(len, M_WAITOK);
5414 n->m_len = len;
5415 n->m_next = NULL;
5416 off = 0;
5417
5418 m_copydata(m, 0, sizeof(struct sadb_msg), mtod(n, char *) + off);
5419 off += PFKEY_ALIGN8(sizeof(struct sadb_msg));
5420
5421 m_sa = (struct sadb_sa *)(mtod(n, char *) + off);
5422 m_sa->sadb_sa_len = PFKEY_UNIT64(sizeof(struct sadb_sa));
5423 m_sa->sadb_sa_exttype = SADB_EXT_SA;
5424 m_sa->sadb_sa_spi = htonl(spi);
5425 off += PFKEY_ALIGN8(sizeof(struct sadb_sa));
5426
5427 KASSERTMSG(off == len, "length inconsistency");
5428
5429 n->m_next = key_gather_mbuf(m, mhp, 0, 2, SADB_EXT_ADDRESS_SRC,
5430 SADB_EXT_ADDRESS_DST);
5431
5432 KASSERT(n->m_len >= sizeof(struct sadb_msg));
5433
5434 n->m_pkthdr.len = 0;
5435 for (nn = n; nn; nn = nn->m_next)
5436 n->m_pkthdr.len += nn->m_len;
5437
5438 key_fill_replymsg(n, newsav->seq);
5439 m_freem(m);
5440 return key_sendup_mbuf(so, n, KEY_SENDUP_ONE);
5441 }
5442 }
5443
5444 /*
5445 * allocating new SPI
5446 * called by key_api_getspi().
5447 * OUT:
5448 * 0: failure.
5449 * others: success.
5450 */
5451 static u_int32_t
5452 key_do_getnewspi(const struct sadb_spirange *spirange,
5453 const struct secasindex *saidx)
5454 {
5455 u_int32_t newspi;
5456 u_int32_t spmin, spmax;
5457 int count = key_spi_trycnt;
5458
5459 /* set spi range to allocate */
5460 if (spirange != NULL) {
5461 spmin = spirange->sadb_spirange_min;
5462 spmax = spirange->sadb_spirange_max;
5463 } else {
5464 spmin = key_spi_minval;
5465 spmax = key_spi_maxval;
5466 }
5467 /* IPCOMP needs 2-byte SPI */
5468 if (saidx->proto == IPPROTO_IPCOMP) {
5469 u_int32_t t;
5470 if (spmin >= 0x10000)
5471 spmin = 0xffff;
5472 if (spmax >= 0x10000)
5473 spmax = 0xffff;
5474 if (spmin > spmax) {
5475 t = spmin; spmin = spmax; spmax = t;
5476 }
5477 }
5478
5479 if (spmin == spmax) {
5480 if (key_checkspidup(saidx, htonl(spmin))) {
5481 IPSECLOG(LOG_DEBUG, "SPI %u exists already.\n", spmin);
5482 return 0;
5483 }
5484
5485 count--; /* taking one cost. */
5486 newspi = spmin;
5487
5488 } else {
5489
5490 /* init SPI */
5491 newspi = 0;
5492
5493 /* when requesting to allocate spi ranged */
5494 while (count--) {
5495 /* generate pseudo-random SPI value ranged. */
5496 newspi = spmin + (key_random() % (spmax - spmin + 1));
5497
5498 if (!key_checkspidup(saidx, htonl(newspi)))
5499 break;
5500 }
5501
5502 if (count == 0 || newspi == 0) {
5503 IPSECLOG(LOG_DEBUG, "to allocate spi is failed.\n");
5504 return 0;
5505 }
5506 }
5507
5508 /* statistics */
5509 keystat.getspi_count =
5510 (keystat.getspi_count + key_spi_trycnt - count) / 2;
5511
5512 return newspi;
5513 }
5514
5515 static int
5516 key_handle_natt_info(struct secasvar *sav,
5517 const struct sadb_msghdr *mhp)
5518 {
5519 const char *msg = "?" ;
5520 struct sadb_x_nat_t_type *type;
5521 struct sadb_x_nat_t_port *sport, *dport;
5522 struct sadb_address *iaddr, *raddr;
5523 struct sadb_x_nat_t_frag *frag;
5524
5525 if (mhp->ext[SADB_X_EXT_NAT_T_TYPE] == NULL ||
5526 mhp->ext[SADB_X_EXT_NAT_T_SPORT] == NULL ||
5527 mhp->ext[SADB_X_EXT_NAT_T_DPORT] == NULL)
5528 return 0;
5529
5530 if (mhp->extlen[SADB_X_EXT_NAT_T_TYPE] < sizeof(*type)) {
5531 msg = "TYPE";
5532 goto bad;
5533 }
5534
5535 if (mhp->extlen[SADB_X_EXT_NAT_T_SPORT] < sizeof(*sport)) {
5536 msg = "SPORT";
5537 goto bad;
5538 }
5539
5540 if (mhp->extlen[SADB_X_EXT_NAT_T_DPORT] < sizeof(*dport)) {
5541 msg = "DPORT";
5542 goto bad;
5543 }
5544
5545 if (mhp->ext[SADB_X_EXT_NAT_T_OAI] != NULL) {
5546 IPSECLOG(LOG_DEBUG, "NAT-T OAi present\n");
5547 if (mhp->extlen[SADB_X_EXT_NAT_T_OAI] < sizeof(*iaddr)) {
5548 msg = "OAI";
5549 goto bad;
5550 }
5551 }
5552
5553 if (mhp->ext[SADB_X_EXT_NAT_T_OAR] != NULL) {
5554 IPSECLOG(LOG_DEBUG, "NAT-T OAr present\n");
5555 if (mhp->extlen[SADB_X_EXT_NAT_T_OAR] < sizeof(*raddr)) {
5556 msg = "OAR";
5557 goto bad;
5558 }
5559 }
5560
5561 if (mhp->ext[SADB_X_EXT_NAT_T_FRAG] != NULL) {
5562 if (mhp->extlen[SADB_X_EXT_NAT_T_FRAG] < sizeof(*frag)) {
5563 msg = "FRAG";
5564 goto bad;
5565 }
5566 }
5567
5568 type = mhp->ext[SADB_X_EXT_NAT_T_TYPE];
5569 sport = mhp->ext[SADB_X_EXT_NAT_T_SPORT];
5570 dport = mhp->ext[SADB_X_EXT_NAT_T_DPORT];
5571 iaddr = mhp->ext[SADB_X_EXT_NAT_T_OAI];
5572 raddr = mhp->ext[SADB_X_EXT_NAT_T_OAR];
5573 frag = mhp->ext[SADB_X_EXT_NAT_T_FRAG];
5574
5575 IPSECLOG(LOG_DEBUG, "type %d, sport = %d, dport = %d\n",
5576 type->sadb_x_nat_t_type_type,
5577 ntohs(sport->sadb_x_nat_t_port_port),
5578 ntohs(dport->sadb_x_nat_t_port_port));
5579
5580 sav->natt_type = type->sadb_x_nat_t_type_type;
5581 key_porttosaddr(&sav->sah->saidx.src, sport->sadb_x_nat_t_port_port);
5582 key_porttosaddr(&sav->sah->saidx.dst, dport->sadb_x_nat_t_port_port);
5583 if (frag)
5584 sav->esp_frag = frag->sadb_x_nat_t_frag_fraglen;
5585 else
5586 sav->esp_frag = IP_MAXPACKET;
5587
5588 return 0;
5589 bad:
5590 IPSECLOG(LOG_DEBUG, "invalid message %s\n", msg);
5591 __USE(msg);
5592 return -1;
5593 }
5594
5595 /* Just update the IPSEC_NAT_T ports if present */
5596 static int
5597 key_set_natt_ports(union sockaddr_union *src, union sockaddr_union *dst,
5598 const struct sadb_msghdr *mhp)
5599 {
5600 if (mhp->ext[SADB_X_EXT_NAT_T_OAI] != NULL)
5601 IPSECLOG(LOG_DEBUG, "NAT-T OAi present\n");
5602 if (mhp->ext[SADB_X_EXT_NAT_T_OAR] != NULL)
5603 IPSECLOG(LOG_DEBUG, "NAT-T OAr present\n");
5604
5605 if ((mhp->ext[SADB_X_EXT_NAT_T_TYPE] != NULL) &&
5606 (mhp->ext[SADB_X_EXT_NAT_T_SPORT] != NULL) &&
5607 (mhp->ext[SADB_X_EXT_NAT_T_DPORT] != NULL)) {
5608 struct sadb_x_nat_t_type *type;
5609 struct sadb_x_nat_t_port *sport;
5610 struct sadb_x_nat_t_port *dport;
5611
5612 if ((mhp->extlen[SADB_X_EXT_NAT_T_TYPE] < sizeof(*type)) ||
5613 (mhp->extlen[SADB_X_EXT_NAT_T_SPORT] < sizeof(*sport)) ||
5614 (mhp->extlen[SADB_X_EXT_NAT_T_DPORT] < sizeof(*dport))) {
5615 IPSECLOG(LOG_DEBUG, "invalid message\n");
5616 return -1;
5617 }
5618
5619 type = mhp->ext[SADB_X_EXT_NAT_T_TYPE];
5620 sport = mhp->ext[SADB_X_EXT_NAT_T_SPORT];
5621 dport = mhp->ext[SADB_X_EXT_NAT_T_DPORT];
5622
5623 key_porttosaddr(src, sport->sadb_x_nat_t_port_port);
5624 key_porttosaddr(dst, dport->sadb_x_nat_t_port_port);
5625
5626 IPSECLOG(LOG_DEBUG, "type %d, sport = %d, dport = %d\n",
5627 type->sadb_x_nat_t_type_type,
5628 ntohs(sport->sadb_x_nat_t_port_port),
5629 ntohs(dport->sadb_x_nat_t_port_port));
5630 }
5631
5632 return 0;
5633 }
5634
5635
5636 /*
5637 * SADB_UPDATE processing
5638 * receive
5639 * <base, SA, (SA2), (lifetime(HSC),) address(SD), (address(P),)
5640 * key(AE), (identity(SD),) (sensitivity)>
5641 * from the ikmpd, and update a secasvar entry whose status is SADB_SASTATE_LARVAL.
5642 * and send
5643 * <base, SA, (SA2), (lifetime(HSC),) address(SD), (address(P),)
5644 * (identity(SD),) (sensitivity)>
5645 * to the ikmpd.
5646 *
5647 * m will always be freed.
5648 */
5649 static int
5650 key_api_update(struct socket *so, struct mbuf *m, const struct sadb_msghdr *mhp)
5651 {
5652 struct sadb_sa *sa0;
5653 const struct sockaddr *src, *dst;
5654 struct secasindex saidx;
5655 struct secashead *sah;
5656 struct secasvar *sav, *newsav, *oldsav;
5657 u_int16_t proto;
5658 u_int8_t mode;
5659 u_int16_t reqid;
5660 int error;
5661
5662 /* map satype to proto */
5663 proto = key_satype2proto(mhp->msg->sadb_msg_satype);
5664 if (proto == 0) {
5665 IPSECLOG(LOG_DEBUG, "invalid satype is passed.\n");
5666 return key_senderror(so, m, EINVAL);
5667 }
5668
5669 if (mhp->ext[SADB_EXT_SA] == NULL ||
5670 mhp->ext[SADB_EXT_ADDRESS_SRC] == NULL ||
5671 mhp->ext[SADB_EXT_ADDRESS_DST] == NULL ||
5672 (mhp->msg->sadb_msg_satype == SADB_SATYPE_ESP &&
5673 mhp->ext[SADB_EXT_KEY_ENCRYPT] == NULL) ||
5674 (mhp->msg->sadb_msg_satype == SADB_SATYPE_AH &&
5675 mhp->ext[SADB_EXT_KEY_AUTH] == NULL) ||
5676 (mhp->ext[SADB_EXT_LIFETIME_HARD] != NULL &&
5677 mhp->ext[SADB_EXT_LIFETIME_SOFT] == NULL) ||
5678 (mhp->ext[SADB_EXT_LIFETIME_HARD] == NULL &&
5679 mhp->ext[SADB_EXT_LIFETIME_SOFT] != NULL)) {
5680 IPSECLOG(LOG_DEBUG, "invalid message is passed.\n");
5681 return key_senderror(so, m, EINVAL);
5682 }
5683 if (mhp->extlen[SADB_EXT_SA] < sizeof(struct sadb_sa) ||
5684 mhp->extlen[SADB_EXT_ADDRESS_SRC] < sizeof(struct sadb_address) ||
5685 mhp->extlen[SADB_EXT_ADDRESS_DST] < sizeof(struct sadb_address)) {
5686 IPSECLOG(LOG_DEBUG, "invalid message is passed.\n");
5687 return key_senderror(so, m, EINVAL);
5688 }
5689 if (mhp->ext[SADB_X_EXT_SA2] != NULL) {
5690 const struct sadb_x_sa2 *sa2 = mhp->ext[SADB_X_EXT_SA2];
5691 mode = sa2->sadb_x_sa2_mode;
5692 reqid = sa2->sadb_x_sa2_reqid;
5693 } else {
5694 mode = IPSEC_MODE_ANY;
5695 reqid = 0;
5696 }
5697 /* XXX boundary checking for other extensions */
5698
5699 sa0 = mhp->ext[SADB_EXT_SA];
5700 src = key_msghdr_get_sockaddr(mhp, SADB_EXT_ADDRESS_SRC);
5701 dst = key_msghdr_get_sockaddr(mhp, SADB_EXT_ADDRESS_DST);
5702
5703 error = key_setsecasidx(proto, mode, reqid, src, dst, &saidx);
5704 if (error != 0)
5705 return key_senderror(so, m, EINVAL);
5706
5707 error = key_set_natt_ports(&saidx.src, &saidx.dst, mhp);
5708 if (error != 0)
5709 return key_senderror(so, m, EINVAL);
5710
5711 /* get a SA header */
5712 sah = key_getsah_ref(&saidx, CMP_REQID);
5713 if (sah == NULL) {
5714 IPSECLOG(LOG_DEBUG, "no SA index found.\n");
5715 return key_senderror(so, m, ENOENT);
5716 }
5717
5718 /* set spidx if there */
5719 /* XXX rewrite */
5720 error = key_setident(sah, m, mhp);
5721 if (error)
5722 goto error_sah;
5723
5724 /* find a SA with sequence number. */
5725 #ifdef IPSEC_DOSEQCHECK
5726 if (mhp->msg->sadb_msg_seq != 0) {
5727 sav = key_getsavbyseq(sah, mhp->msg->sadb_msg_seq);
5728 if (sav == NULL) {
5729 IPSECLOG(LOG_DEBUG,
5730 "no larval SA with sequence %u exists.\n",
5731 mhp->msg->sadb_msg_seq);
5732 error = ENOENT;
5733 goto error_sah;
5734 }
5735 }
5736 #else
5737 sav = key_getsavbyspi(sah, sa0->sadb_sa_spi);
5738 if (sav == NULL) {
5739 IPSECLOG(LOG_DEBUG, "no such a SA found (spi:%u)\n",
5740 (u_int32_t)ntohl(sa0->sadb_sa_spi));
5741 error = EINVAL;
5742 goto error_sah;
5743 }
5744 #endif
5745
5746 /* validity check */
5747 if (sav->sah->saidx.proto != proto) {
5748 IPSECLOG(LOG_DEBUG, "protocol mismatched (DB=%u param=%u)\n",
5749 sav->sah->saidx.proto, proto);
5750 error = EINVAL;
5751 goto error;
5752 }
5753 #ifdef IPSEC_DOSEQCHECK
5754 if (sav->spi != sa0->sadb_sa_spi) {
5755 IPSECLOG(LOG_DEBUG, "SPI mismatched (DB:%u param:%u)\n",
5756 (u_int32_t)ntohl(sav->spi),
5757 (u_int32_t)ntohl(sa0->sadb_sa_spi));
5758 error = EINVAL;
5759 goto error;
5760 }
5761 #endif
5762 if (sav->pid != mhp->msg->sadb_msg_pid) {
5763 IPSECLOG(LOG_DEBUG, "pid mismatched (DB:%u param:%u)\n",
5764 sav->pid, mhp->msg->sadb_msg_pid);
5765 error = EINVAL;
5766 goto error;
5767 }
5768
5769 /*
5770 * Allocate a new SA instead of modifying the existing SA directly
5771 * to avoid race conditions.
5772 */
5773 newsav = kmem_zalloc(sizeof(struct secasvar), KM_SLEEP);
5774
5775 /* copy sav values */
5776 newsav->spi = sav->spi;
5777 newsav->seq = sav->seq;
5778 newsav->created = sav->created;
5779 newsav->pid = sav->pid;
5780 newsav->sah = sav->sah;
5781
5782 error = key_setsaval(newsav, m, mhp);
5783 if (error) {
5784 kmem_free(newsav, sizeof(*newsav));
5785 goto error;
5786 }
5787
5788 error = key_handle_natt_info(newsav, mhp);
5789 if (error != 0) {
5790 key_delsav(newsav);
5791 goto error;
5792 }
5793
5794 error = key_init_xform(newsav);
5795 if (error != 0) {
5796 key_delsav(newsav);
5797 goto error;
5798 }
5799
5800 /* Add to sah#savlist */
5801 key_init_sav(newsav);
5802 newsav->state = SADB_SASTATE_MATURE;
5803 mutex_enter(&key_sad.lock);
5804 SAVLIST_WRITER_INSERT_TAIL(sah, SADB_SASTATE_MATURE, newsav);
5805 SAVLUT_WRITER_INSERT_HEAD(newsav);
5806 mutex_exit(&key_sad.lock);
5807 key_validate_savlist(sah, SADB_SASTATE_MATURE);
5808
5809 /*
5810 * We need to lookup and remove the sav atomically, so get it again
5811 * here by a special API while we have a reference to it.
5812 */
5813 oldsav = key_lookup_and_remove_sav(sah, sa0->sadb_sa_spi, sav);
5814 KASSERT(oldsav == NULL || oldsav == sav);
5815 /* We can release the reference because of oldsav */
5816 KEY_SA_UNREF(&sav);
5817 if (oldsav == NULL) {
5818 /* Someone has already removed the sav. Nothing to do. */
5819 } else {
5820 key_wait_sav(oldsav);
5821 key_destroy_sav(oldsav);
5822 oldsav = NULL;
5823 }
5824 sav = NULL;
5825
5826 key_sah_unref(sah);
5827 sah = NULL;
5828
5829 {
5830 struct mbuf *n;
5831
5832 /* set msg buf from mhp */
5833 n = key_getmsgbuf_x1(m, mhp);
5834 if (n == NULL) {
5835 IPSECLOG(LOG_DEBUG, "No more memory.\n");
5836 return key_senderror(so, m, ENOBUFS);
5837 }
5838
5839 m_freem(m);
5840 return key_sendup_mbuf(so, n, KEY_SENDUP_ALL);
5841 }
5842 error:
5843 KEY_SA_UNREF(&sav);
5844 error_sah:
5845 key_sah_unref(sah);
5846 return key_senderror(so, m, error);
5847 }
5848
5849 /*
5850 * search SAD with sequence for a SA which state is SADB_SASTATE_LARVAL.
5851 * only called by key_api_update().
5852 * OUT:
5853 * NULL : not found
5854 * others : found, pointer to a SA.
5855 */
5856 #ifdef IPSEC_DOSEQCHECK
5857 static struct secasvar *
5858 key_getsavbyseq(struct secashead *sah, u_int32_t seq)
5859 {
5860 struct secasvar *sav;
5861 u_int state;
5862 int s;
5863
5864 state = SADB_SASTATE_LARVAL;
5865
5866 /* search SAD with sequence number ? */
5867 s = pserialize_read_enter();
5868 SAVLIST_READER_FOREACH(sav, sah, state) {
5869 KEY_CHKSASTATE(state, sav->state);
5870
5871 if (sav->seq == seq) {
5872 SA_ADDREF(sav);
5873 KEYDEBUG_PRINTF(KEYDEBUG_IPSEC_STAMP,
5874 "DP cause refcnt++:%d SA:%p\n",
5875 key_sa_refcnt(sav), sav);
5876 break;
5877 }
5878 }
5879 pserialize_read_exit(s);
5880
5881 return sav;
5882 }
5883 #endif
5884
5885 /*
5886 * SADB_ADD processing
5887 * add an entry to SA database, when received
5888 * <base, SA, (SA2), (lifetime(HSC),) address(SD), (address(P),)
5889 * key(AE), (identity(SD),) (sensitivity)>
5890 * from the ikmpd,
5891 * and send
5892 * <base, SA, (SA2), (lifetime(HSC),) address(SD), (address(P),)
5893 * (identity(SD),) (sensitivity)>
5894 * to the ikmpd.
5895 *
5896 * IGNORE identity and sensitivity messages.
5897 *
5898 * m will always be freed.
5899 */
5900 static int
5901 key_api_add(struct socket *so, struct mbuf *m,
5902 const struct sadb_msghdr *mhp)
5903 {
5904 struct sadb_sa *sa0;
5905 const struct sockaddr *src, *dst;
5906 struct secasindex saidx;
5907 struct secashead *sah;
5908 struct secasvar *newsav;
5909 u_int16_t proto;
5910 u_int8_t mode;
5911 u_int16_t reqid;
5912 int error;
5913
5914 /* map satype to proto */
5915 proto = key_satype2proto(mhp->msg->sadb_msg_satype);
5916 if (proto == 0) {
5917 IPSECLOG(LOG_DEBUG, "invalid satype is passed.\n");
5918 return key_senderror(so, m, EINVAL);
5919 }
5920
5921 if (mhp->ext[SADB_EXT_SA] == NULL ||
5922 mhp->ext[SADB_EXT_ADDRESS_SRC] == NULL ||
5923 mhp->ext[SADB_EXT_ADDRESS_DST] == NULL ||
5924 (mhp->msg->sadb_msg_satype == SADB_SATYPE_ESP &&
5925 mhp->ext[SADB_EXT_KEY_ENCRYPT] == NULL) ||
5926 (mhp->msg->sadb_msg_satype == SADB_SATYPE_AH &&
5927 mhp->ext[SADB_EXT_KEY_AUTH] == NULL) ||
5928 (mhp->ext[SADB_EXT_LIFETIME_HARD] != NULL &&
5929 mhp->ext[SADB_EXT_LIFETIME_SOFT] == NULL) ||
5930 (mhp->ext[SADB_EXT_LIFETIME_HARD] == NULL &&
5931 mhp->ext[SADB_EXT_LIFETIME_SOFT] != NULL)) {
5932 IPSECLOG(LOG_DEBUG, "invalid message is passed.\n");
5933 return key_senderror(so, m, EINVAL);
5934 }
5935 if (mhp->extlen[SADB_EXT_SA] < sizeof(struct sadb_sa) ||
5936 mhp->extlen[SADB_EXT_ADDRESS_SRC] < sizeof(struct sadb_address) ||
5937 mhp->extlen[SADB_EXT_ADDRESS_DST] < sizeof(struct sadb_address)) {
5938 /* XXX need more */
5939 IPSECLOG(LOG_DEBUG, "invalid message is passed.\n");
5940 return key_senderror(so, m, EINVAL);
5941 }
5942 if (mhp->ext[SADB_X_EXT_SA2] != NULL) {
5943 const struct sadb_x_sa2 *sa2 = mhp->ext[SADB_X_EXT_SA2];
5944 mode = sa2->sadb_x_sa2_mode;
5945 reqid = sa2->sadb_x_sa2_reqid;
5946 } else {
5947 mode = IPSEC_MODE_ANY;
5948 reqid = 0;
5949 }
5950
5951 sa0 = mhp->ext[SADB_EXT_SA];
5952 src = key_msghdr_get_sockaddr(mhp, SADB_EXT_ADDRESS_SRC);
5953 dst = key_msghdr_get_sockaddr(mhp, SADB_EXT_ADDRESS_DST);
5954
5955 error = key_setsecasidx(proto, mode, reqid, src, dst, &saidx);
5956 if (error != 0)
5957 return key_senderror(so, m, EINVAL);
5958
5959 error = key_set_natt_ports(&saidx.src, &saidx.dst, mhp);
5960 if (error != 0)
5961 return key_senderror(so, m, EINVAL);
5962
5963 /* get a SA header */
5964 sah = key_getsah_ref(&saidx, CMP_REQID);
5965 if (sah == NULL) {
5966 /* create a new SA header */
5967 sah = key_newsah(&saidx);
5968 if (sah == NULL) {
5969 IPSECLOG(LOG_DEBUG, "No more memory.\n");
5970 return key_senderror(so, m, ENOBUFS);
5971 }
5972 }
5973
5974 /* set spidx if there */
5975 /* XXX rewrite */
5976 error = key_setident(sah, m, mhp);
5977 if (error)
5978 goto error;
5979
5980 {
5981 struct secasvar *sav;
5982
5983 /* We can create new SA only if SPI is differenct. */
5984 sav = key_getsavbyspi(sah, sa0->sadb_sa_spi);
5985 if (sav != NULL) {
5986 KEY_SA_UNREF(&sav);
5987 IPSECLOG(LOG_DEBUG, "SA already exists.\n");
5988 error = EEXIST;
5989 goto error;
5990 }
5991 }
5992
5993 /* create new SA entry. */
5994 newsav = KEY_NEWSAV(m, mhp, &error);
5995 if (newsav == NULL)
5996 goto error;
5997 newsav->sah = sah;
5998
5999 error = key_handle_natt_info(newsav, mhp);
6000 if (error != 0) {
6001 key_delsav(newsav);
6002 error = EINVAL;
6003 goto error;
6004 }
6005
6006 error = key_init_xform(newsav);
6007 if (error != 0) {
6008 key_delsav(newsav);
6009 goto error;
6010 }
6011
6012 /* Add to sah#savlist */
6013 key_init_sav(newsav);
6014 newsav->state = SADB_SASTATE_MATURE;
6015 mutex_enter(&key_sad.lock);
6016 SAVLIST_WRITER_INSERT_TAIL(sah, SADB_SASTATE_MATURE, newsav);
6017 SAVLUT_WRITER_INSERT_HEAD(newsav);
6018 mutex_exit(&key_sad.lock);
6019 key_validate_savlist(sah, SADB_SASTATE_MATURE);
6020
6021 key_sah_unref(sah);
6022 sah = NULL;
6023
6024 /*
6025 * don't call key_freesav() here, as we would like to keep the SA
6026 * in the database on success.
6027 */
6028
6029 {
6030 struct mbuf *n;
6031
6032 /* set msg buf from mhp */
6033 n = key_getmsgbuf_x1(m, mhp);
6034 if (n == NULL) {
6035 IPSECLOG(LOG_DEBUG, "No more memory.\n");
6036 return key_senderror(so, m, ENOBUFS);
6037 }
6038
6039 m_freem(m);
6040 return key_sendup_mbuf(so, n, KEY_SENDUP_ALL);
6041 }
6042 error:
6043 key_sah_unref(sah);
6044 return key_senderror(so, m, error);
6045 }
6046
6047 /* m is retained */
6048 static int
6049 key_setident(struct secashead *sah, struct mbuf *m,
6050 const struct sadb_msghdr *mhp)
6051 {
6052 const struct sadb_ident *idsrc, *iddst;
6053 int idsrclen, iddstlen;
6054
6055 KASSERT(!cpu_softintr_p());
6056 KASSERT(sah != NULL);
6057 KASSERT(m != NULL);
6058 KASSERT(mhp != NULL);
6059 KASSERT(mhp->msg != NULL);
6060
6061 /*
6062 * Can be called with an existing sah from key_api_update().
6063 */
6064 if (sah->idents != NULL) {
6065 kmem_free(sah->idents, sah->idents_len);
6066 sah->idents = NULL;
6067 sah->idents_len = 0;
6068 }
6069 if (sah->identd != NULL) {
6070 kmem_free(sah->identd, sah->identd_len);
6071 sah->identd = NULL;
6072 sah->identd_len = 0;
6073 }
6074
6075 /* don't make buffer if not there */
6076 if (mhp->ext[SADB_EXT_IDENTITY_SRC] == NULL &&
6077 mhp->ext[SADB_EXT_IDENTITY_DST] == NULL) {
6078 sah->idents = NULL;
6079 sah->identd = NULL;
6080 return 0;
6081 }
6082
6083 if (mhp->ext[SADB_EXT_IDENTITY_SRC] == NULL ||
6084 mhp->ext[SADB_EXT_IDENTITY_DST] == NULL) {
6085 IPSECLOG(LOG_DEBUG, "invalid identity.\n");
6086 return EINVAL;
6087 }
6088
6089 idsrc = mhp->ext[SADB_EXT_IDENTITY_SRC];
6090 iddst = mhp->ext[SADB_EXT_IDENTITY_DST];
6091 idsrclen = mhp->extlen[SADB_EXT_IDENTITY_SRC];
6092 iddstlen = mhp->extlen[SADB_EXT_IDENTITY_DST];
6093
6094 /* validity check */
6095 if (idsrc->sadb_ident_type != iddst->sadb_ident_type) {
6096 IPSECLOG(LOG_DEBUG, "ident type mismatched src %u, dst %u.\n",
6097 idsrc->sadb_ident_type, iddst->sadb_ident_type);
6098 return EINVAL;
6099 }
6100
6101 switch (idsrc->sadb_ident_type) {
6102 case SADB_IDENTTYPE_PREFIX:
6103 case SADB_IDENTTYPE_FQDN:
6104 case SADB_IDENTTYPE_USERFQDN:
6105 default:
6106 /* XXX do nothing */
6107 sah->idents = NULL;
6108 sah->identd = NULL;
6109 return 0;
6110 }
6111
6112 /* make structure */
6113 sah->idents = kmem_alloc(idsrclen, KM_SLEEP);
6114 sah->idents_len = idsrclen;
6115 sah->identd = kmem_alloc(iddstlen, KM_SLEEP);
6116 sah->identd_len = iddstlen;
6117 memcpy(sah->idents, idsrc, idsrclen);
6118 memcpy(sah->identd, iddst, iddstlen);
6119
6120 return 0;
6121 }
6122
6123 /*
6124 * m will not be freed on return. It never return NULL.
6125 * it is caller's responsibility to free the result.
6126 */
6127 static struct mbuf *
6128 key_getmsgbuf_x1(struct mbuf *m, const struct sadb_msghdr *mhp)
6129 {
6130 struct mbuf *n;
6131
6132 KASSERT(m != NULL);
6133 KASSERT(mhp != NULL);
6134 KASSERT(mhp->msg != NULL);
6135
6136 /* create new sadb_msg to reply. */
6137 n = key_gather_mbuf(m, mhp, 1, 15, SADB_EXT_RESERVED,
6138 SADB_EXT_SA, SADB_X_EXT_SA2,
6139 SADB_EXT_ADDRESS_SRC, SADB_EXT_ADDRESS_DST,
6140 SADB_EXT_LIFETIME_HARD, SADB_EXT_LIFETIME_SOFT,
6141 SADB_EXT_IDENTITY_SRC, SADB_EXT_IDENTITY_DST,
6142 SADB_X_EXT_NAT_T_TYPE, SADB_X_EXT_NAT_T_SPORT,
6143 SADB_X_EXT_NAT_T_DPORT, SADB_X_EXT_NAT_T_OAI,
6144 SADB_X_EXT_NAT_T_OAR, SADB_X_EXT_NAT_T_FRAG);
6145
6146 KASSERT(n->m_len >= sizeof(struct sadb_msg));
6147
6148 mtod(n, struct sadb_msg *)->sadb_msg_errno = 0;
6149 mtod(n, struct sadb_msg *)->sadb_msg_len =
6150 PFKEY_UNIT64(n->m_pkthdr.len);
6151
6152 return n;
6153 }
6154
6155 static int key_delete_all (struct socket *, struct mbuf *,
6156 const struct sadb_msghdr *, u_int16_t);
6157
6158 /*
6159 * SADB_DELETE processing
6160 * receive
6161 * <base, SA(*), address(SD)>
6162 * from the ikmpd, and set SADB_SASTATE_DEAD,
6163 * and send,
6164 * <base, SA(*), address(SD)>
6165 * to the ikmpd.
6166 *
6167 * m will always be freed.
6168 */
6169 static int
6170 key_api_delete(struct socket *so, struct mbuf *m,
6171 const struct sadb_msghdr *mhp)
6172 {
6173 struct sadb_sa *sa0;
6174 const struct sockaddr *src, *dst;
6175 struct secasindex saidx;
6176 struct secashead *sah;
6177 struct secasvar *sav = NULL;
6178 u_int16_t proto;
6179 int error;
6180
6181 /* map satype to proto */
6182 proto = key_satype2proto(mhp->msg->sadb_msg_satype);
6183 if (proto == 0) {
6184 IPSECLOG(LOG_DEBUG, "invalid satype is passed.\n");
6185 return key_senderror(so, m, EINVAL);
6186 }
6187
6188 if (mhp->ext[SADB_EXT_ADDRESS_SRC] == NULL ||
6189 mhp->ext[SADB_EXT_ADDRESS_DST] == NULL) {
6190 IPSECLOG(LOG_DEBUG, "invalid message is passed.\n");
6191 return key_senderror(so, m, EINVAL);
6192 }
6193
6194 if (mhp->extlen[SADB_EXT_ADDRESS_SRC] < sizeof(struct sadb_address) ||
6195 mhp->extlen[SADB_EXT_ADDRESS_DST] < sizeof(struct sadb_address)) {
6196 IPSECLOG(LOG_DEBUG, "invalid message is passed.\n");
6197 return key_senderror(so, m, EINVAL);
6198 }
6199
6200 if (mhp->ext[SADB_EXT_SA] == NULL) {
6201 /*
6202 * Caller wants us to delete all non-LARVAL SAs
6203 * that match the src/dst. This is used during
6204 * IKE INITIAL-CONTACT.
6205 */
6206 IPSECLOG(LOG_DEBUG, "doing delete all.\n");
6207 return key_delete_all(so, m, mhp, proto);
6208 } else if (mhp->extlen[SADB_EXT_SA] < sizeof(struct sadb_sa)) {
6209 IPSECLOG(LOG_DEBUG, "invalid message is passed.\n");
6210 return key_senderror(so, m, EINVAL);
6211 }
6212
6213 sa0 = mhp->ext[SADB_EXT_SA];
6214 src = key_msghdr_get_sockaddr(mhp, SADB_EXT_ADDRESS_SRC);
6215 dst = key_msghdr_get_sockaddr(mhp, SADB_EXT_ADDRESS_DST);
6216
6217 error = key_setsecasidx(proto, IPSEC_MODE_ANY, 0, src, dst, &saidx);
6218 if (error != 0)
6219 return key_senderror(so, m, EINVAL);
6220
6221 error = key_set_natt_ports(&saidx.src, &saidx.dst, mhp);
6222 if (error != 0)
6223 return key_senderror(so, m, EINVAL);
6224
6225 /* get a SA header */
6226 sah = key_getsah_ref(&saidx, CMP_HEAD);
6227 if (sah != NULL) {
6228 /* get a SA with SPI. */
6229 sav = key_lookup_and_remove_sav(sah, sa0->sadb_sa_spi, NULL);
6230 key_sah_unref(sah);
6231 }
6232
6233 if (sav == NULL) {
6234 IPSECLOG(LOG_DEBUG, "no SA found.\n");
6235 return key_senderror(so, m, ENOENT);
6236 }
6237
6238 key_wait_sav(sav);
6239 key_destroy_sav(sav);
6240 sav = NULL;
6241
6242 {
6243 struct mbuf *n;
6244
6245 /* create new sadb_msg to reply. */
6246 n = key_gather_mbuf(m, mhp, 1, 4, SADB_EXT_RESERVED,
6247 SADB_EXT_SA, SADB_EXT_ADDRESS_SRC, SADB_EXT_ADDRESS_DST);
6248
6249 key_fill_replymsg(n, 0);
6250 m_freem(m);
6251 return key_sendup_mbuf(so, n, KEY_SENDUP_ALL);
6252 }
6253 }
6254
6255 /*
6256 * delete all SAs for src/dst. Called from key_api_delete().
6257 */
6258 static int
6259 key_delete_all(struct socket *so, struct mbuf *m,
6260 const struct sadb_msghdr *mhp, u_int16_t proto)
6261 {
6262 const struct sockaddr *src, *dst;
6263 struct secasindex saidx;
6264 struct secashead *sah;
6265 struct secasvar *sav;
6266 u_int state;
6267 int error;
6268
6269 src = key_msghdr_get_sockaddr(mhp, SADB_EXT_ADDRESS_SRC);
6270 dst = key_msghdr_get_sockaddr(mhp, SADB_EXT_ADDRESS_DST);
6271
6272 error = key_setsecasidx(proto, IPSEC_MODE_ANY, 0, src, dst, &saidx);
6273 if (error != 0)
6274 return key_senderror(so, m, EINVAL);
6275
6276 error = key_set_natt_ports(&saidx.src, &saidx.dst, mhp);
6277 if (error != 0)
6278 return key_senderror(so, m, EINVAL);
6279
6280 sah = key_getsah_ref(&saidx, CMP_HEAD);
6281 if (sah != NULL) {
6282 /* Delete all non-LARVAL SAs. */
6283 SASTATE_ALIVE_FOREACH(state) {
6284 if (state == SADB_SASTATE_LARVAL)
6285 continue;
6286 restart:
6287 mutex_enter(&key_sad.lock);
6288 SAVLIST_WRITER_FOREACH(sav, sah, state) {
6289 sav->state = SADB_SASTATE_DEAD;
6290 key_unlink_sav(sav);
6291 mutex_exit(&key_sad.lock);
6292 key_destroy_sav(sav);
6293 goto restart;
6294 }
6295 mutex_exit(&key_sad.lock);
6296 }
6297 key_sah_unref(sah);
6298 }
6299 {
6300 struct mbuf *n;
6301
6302 /* create new sadb_msg to reply. */
6303 n = key_gather_mbuf(m, mhp, 1, 3, SADB_EXT_RESERVED,
6304 SADB_EXT_ADDRESS_SRC, SADB_EXT_ADDRESS_DST);
6305
6306 key_fill_replymsg(n, 0);
6307 m_freem(m);
6308 return key_sendup_mbuf(so, n, KEY_SENDUP_ALL);
6309 }
6310 }
6311
6312 /*
6313 * SADB_GET processing
6314 * receive
6315 * <base, SA(*), address(SD)>
6316 * from the ikmpd, and get a SP and a SA to respond,
6317 * and send,
6318 * <base, SA, (lifetime(HSC),) address(SD), (address(P),) key(AE),
6319 * (identity(SD),) (sensitivity)>
6320 * to the ikmpd.
6321 *
6322 * m will always be freed.
6323 */
6324 static int
6325 key_api_get(struct socket *so, struct mbuf *m,
6326 const struct sadb_msghdr *mhp)
6327 {
6328 struct sadb_sa *sa0;
6329 const struct sockaddr *src, *dst;
6330 struct secasindex saidx;
6331 struct secasvar *sav = NULL;
6332 u_int16_t proto;
6333 int error;
6334
6335 /* map satype to proto */
6336 if ((proto = key_satype2proto(mhp->msg->sadb_msg_satype)) == 0) {
6337 IPSECLOG(LOG_DEBUG, "invalid satype is passed.\n");
6338 return key_senderror(so, m, EINVAL);
6339 }
6340
6341 if (mhp->ext[SADB_EXT_SA] == NULL ||
6342 mhp->ext[SADB_EXT_ADDRESS_SRC] == NULL ||
6343 mhp->ext[SADB_EXT_ADDRESS_DST] == NULL) {
6344 IPSECLOG(LOG_DEBUG, "invalid message is passed.\n");
6345 return key_senderror(so, m, EINVAL);
6346 }
6347 if (mhp->extlen[SADB_EXT_SA] < sizeof(struct sadb_sa) ||
6348 mhp->extlen[SADB_EXT_ADDRESS_SRC] < sizeof(struct sadb_address) ||
6349 mhp->extlen[SADB_EXT_ADDRESS_DST] < sizeof(struct sadb_address)) {
6350 IPSECLOG(LOG_DEBUG, "invalid message is passed.\n");
6351 return key_senderror(so, m, EINVAL);
6352 }
6353
6354 sa0 = mhp->ext[SADB_EXT_SA];
6355 src = key_msghdr_get_sockaddr(mhp, SADB_EXT_ADDRESS_SRC);
6356 dst = key_msghdr_get_sockaddr(mhp, SADB_EXT_ADDRESS_DST);
6357
6358 error = key_setsecasidx(proto, IPSEC_MODE_ANY, 0, src, dst, &saidx);
6359 if (error != 0)
6360 return key_senderror(so, m, EINVAL);
6361
6362 error = key_set_natt_ports(&saidx.src, &saidx.dst, mhp);
6363 if (error != 0)
6364 return key_senderror(so, m, EINVAL);
6365
6366 /* get a SA header */
6367 {
6368 struct secashead *sah;
6369 int s = pserialize_read_enter();
6370
6371 sah = key_getsah(&saidx, CMP_HEAD);
6372 if (sah != NULL) {
6373 /* get a SA with SPI. */
6374 sav = key_getsavbyspi(sah, sa0->sadb_sa_spi);
6375 }
6376 pserialize_read_exit(s);
6377 }
6378 if (sav == NULL) {
6379 IPSECLOG(LOG_DEBUG, "no SA found.\n");
6380 return key_senderror(so, m, ENOENT);
6381 }
6382
6383 {
6384 struct mbuf *n;
6385 u_int8_t satype;
6386
6387 /* map proto to satype */
6388 satype = key_proto2satype(sav->sah->saidx.proto);
6389 if (satype == 0) {
6390 KEY_SA_UNREF(&sav);
6391 IPSECLOG(LOG_DEBUG, "there was invalid proto in SAD.\n");
6392 return key_senderror(so, m, EINVAL);
6393 }
6394
6395 /* create new sadb_msg to reply. */
6396 n = key_setdumpsa(sav, SADB_GET, satype, mhp->msg->sadb_msg_seq,
6397 mhp->msg->sadb_msg_pid);
6398 KEY_SA_UNREF(&sav);
6399 m_freem(m);
6400 return key_sendup_mbuf(so, n, KEY_SENDUP_ONE);
6401 }
6402 }
6403
6404 /* XXX make it sysctl-configurable? */
6405 static void
6406 key_getcomb_setlifetime(struct sadb_comb *comb)
6407 {
6408
6409 comb->sadb_comb_soft_allocations = 1;
6410 comb->sadb_comb_hard_allocations = 1;
6411 comb->sadb_comb_soft_bytes = 0;
6412 comb->sadb_comb_hard_bytes = 0;
6413 comb->sadb_comb_hard_addtime = 86400; /* 1 day */
6414 comb->sadb_comb_soft_addtime = comb->sadb_comb_hard_addtime * 80 / 100;
6415 comb->sadb_comb_hard_usetime = 28800; /* 8 hours */
6416 comb->sadb_comb_soft_usetime = comb->sadb_comb_hard_usetime * 80 / 100;
6417 }
6418
6419 /*
6420 * XXX reorder combinations by preference
6421 * XXX no idea if the user wants ESP authentication or not
6422 */
6423 static struct mbuf *
6424 key_getcomb_esp(int mflag)
6425 {
6426 struct sadb_comb *comb;
6427 const struct enc_xform *algo;
6428 struct mbuf *result = NULL, *m, *n;
6429 int encmin;
6430 int i, off, o;
6431 int totlen;
6432 const int l = PFKEY_ALIGN8(sizeof(struct sadb_comb));
6433
6434 m = NULL;
6435 for (i = 1; i <= SADB_EALG_MAX; i++) {
6436 algo = esp_algorithm_lookup(i);
6437 if (algo == NULL)
6438 continue;
6439
6440 /* discard algorithms with key size smaller than system min */
6441 if (_BITS(algo->maxkey) < ipsec_esp_keymin)
6442 continue;
6443 if (_BITS(algo->minkey) < ipsec_esp_keymin)
6444 encmin = ipsec_esp_keymin;
6445 else
6446 encmin = _BITS(algo->minkey);
6447
6448 if (ipsec_esp_auth)
6449 m = key_getcomb_ah(mflag);
6450 else {
6451 KASSERTMSG(l <= MLEN,
6452 "l=%u > MLEN=%lu", l, (u_long) MLEN);
6453 MGET(m, mflag, MT_DATA);
6454 if (m) {
6455 m_align(m, l);
6456 m->m_len = l;
6457 m->m_next = NULL;
6458 memset(mtod(m, void *), 0, m->m_len);
6459 }
6460 }
6461 if (!m)
6462 goto fail;
6463
6464 totlen = 0;
6465 for (n = m; n; n = n->m_next)
6466 totlen += n->m_len;
6467 KASSERTMSG((totlen % l) == 0, "totlen=%u, l=%u", totlen, l);
6468
6469 for (off = 0; off < totlen; off += l) {
6470 n = m_pulldown(m, off, l, &o);
6471 if (!n) {
6472 /* m is already freed */
6473 goto fail;
6474 }
6475 comb = (struct sadb_comb *)(mtod(n, char *) + o);
6476 memset(comb, 0, sizeof(*comb));
6477 key_getcomb_setlifetime(comb);
6478 comb->sadb_comb_encrypt = i;
6479 comb->sadb_comb_encrypt_minbits = encmin;
6480 comb->sadb_comb_encrypt_maxbits = _BITS(algo->maxkey);
6481 }
6482
6483 if (!result)
6484 result = m;
6485 else
6486 m_cat(result, m);
6487 }
6488
6489 return result;
6490
6491 fail:
6492 if (result)
6493 m_freem(result);
6494 return NULL;
6495 }
6496
6497 static void
6498 key_getsizes_ah(const struct auth_hash *ah, int alg,
6499 u_int16_t* ksmin, u_int16_t* ksmax)
6500 {
6501 *ksmin = *ksmax = ah->keysize;
6502 if (ah->keysize == 0) {
6503 /*
6504 * Transform takes arbitrary key size but algorithm
6505 * key size is restricted. Enforce this here.
6506 */
6507 switch (alg) {
6508 case SADB_X_AALG_MD5: *ksmin = *ksmax = 16; break;
6509 case SADB_X_AALG_SHA: *ksmin = *ksmax = 20; break;
6510 case SADB_X_AALG_NULL: *ksmin = 0; *ksmax = 256; break;
6511 default:
6512 IPSECLOG(LOG_DEBUG, "unknown AH algorithm %u\n", alg);
6513 break;
6514 }
6515 }
6516 }
6517
6518 /*
6519 * XXX reorder combinations by preference
6520 */
6521 static struct mbuf *
6522 key_getcomb_ah(int mflag)
6523 {
6524 struct sadb_comb *comb;
6525 const struct auth_hash *algo;
6526 struct mbuf *m;
6527 u_int16_t minkeysize, maxkeysize;
6528 int i;
6529 const int l = PFKEY_ALIGN8(sizeof(struct sadb_comb));
6530
6531 m = NULL;
6532 for (i = 1; i <= SADB_AALG_MAX; i++) {
6533 #if 1
6534 /* we prefer HMAC algorithms, not old algorithms */
6535 if (i != SADB_AALG_SHA1HMAC &&
6536 i != SADB_AALG_MD5HMAC &&
6537 i != SADB_X_AALG_SHA2_256 &&
6538 i != SADB_X_AALG_SHA2_384 &&
6539 i != SADB_X_AALG_SHA2_512)
6540 continue;
6541 #endif
6542 algo = ah_algorithm_lookup(i);
6543 if (!algo)
6544 continue;
6545 key_getsizes_ah(algo, i, &minkeysize, &maxkeysize);
6546 /* discard algorithms with key size smaller than system min */
6547 if (_BITS(minkeysize) < ipsec_ah_keymin)
6548 continue;
6549
6550 if (!m) {
6551 KASSERTMSG(l <= MLEN,
6552 "l=%u > MLEN=%lu", l, (u_long) MLEN);
6553 MGET(m, mflag, MT_DATA);
6554 if (m) {
6555 m_align(m, l);
6556 m->m_len = l;
6557 m->m_next = NULL;
6558 }
6559 } else
6560 M_PREPEND(m, l, mflag);
6561 if (!m)
6562 return NULL;
6563
6564 if (m->m_len < sizeof(struct sadb_comb)) {
6565 m = m_pullup(m, sizeof(struct sadb_comb));
6566 if (m == NULL)
6567 return NULL;
6568 }
6569
6570 comb = mtod(m, struct sadb_comb *);
6571 memset(comb, 0, sizeof(*comb));
6572 key_getcomb_setlifetime(comb);
6573 comb->sadb_comb_auth = i;
6574 comb->sadb_comb_auth_minbits = _BITS(minkeysize);
6575 comb->sadb_comb_auth_maxbits = _BITS(maxkeysize);
6576 }
6577
6578 return m;
6579 }
6580
6581 /*
6582 * not really an official behavior. discussed in pf_key (at) inner.net in Sep2000.
6583 * XXX reorder combinations by preference
6584 */
6585 static struct mbuf *
6586 key_getcomb_ipcomp(int mflag)
6587 {
6588 struct sadb_comb *comb;
6589 const struct comp_algo *algo;
6590 struct mbuf *m;
6591 int i;
6592 const int l = PFKEY_ALIGN8(sizeof(struct sadb_comb));
6593
6594 m = NULL;
6595 for (i = 1; i <= SADB_X_CALG_MAX; i++) {
6596 algo = ipcomp_algorithm_lookup(i);
6597 if (!algo)
6598 continue;
6599
6600 if (!m) {
6601 KASSERTMSG(l <= MLEN,
6602 "l=%u > MLEN=%lu", l, (u_long) MLEN);
6603 MGET(m, mflag, MT_DATA);
6604 if (m) {
6605 m_align(m, l);
6606 m->m_len = l;
6607 m->m_next = NULL;
6608 }
6609 } else
6610 M_PREPEND(m, l, mflag);
6611 if (!m)
6612 return NULL;
6613
6614 if (m->m_len < sizeof(struct sadb_comb)) {
6615 m = m_pullup(m, sizeof(struct sadb_comb));
6616 if (m == NULL)
6617 return NULL;
6618 }
6619
6620 comb = mtod(m, struct sadb_comb *);
6621 memset(comb, 0, sizeof(*comb));
6622 key_getcomb_setlifetime(comb);
6623 comb->sadb_comb_encrypt = i;
6624 /* what should we set into sadb_comb_*_{min,max}bits? */
6625 }
6626
6627 return m;
6628 }
6629
6630 /*
6631 * XXX no way to pass mode (transport/tunnel) to userland
6632 * XXX replay checking?
6633 * XXX sysctl interface to ipsec_{ah,esp}_keymin
6634 */
6635 static struct mbuf *
6636 key_getprop(const struct secasindex *saidx, int mflag)
6637 {
6638 struct sadb_prop *prop;
6639 struct mbuf *m, *n;
6640 const int l = PFKEY_ALIGN8(sizeof(struct sadb_prop));
6641 int totlen;
6642
6643 switch (saidx->proto) {
6644 case IPPROTO_ESP:
6645 m = key_getcomb_esp(mflag);
6646 break;
6647 case IPPROTO_AH:
6648 m = key_getcomb_ah(mflag);
6649 break;
6650 case IPPROTO_IPCOMP:
6651 m = key_getcomb_ipcomp(mflag);
6652 break;
6653 default:
6654 return NULL;
6655 }
6656
6657 if (!m)
6658 return NULL;
6659 M_PREPEND(m, l, mflag);
6660 if (!m)
6661 return NULL;
6662
6663 totlen = 0;
6664 for (n = m; n; n = n->m_next)
6665 totlen += n->m_len;
6666
6667 prop = mtod(m, struct sadb_prop *);
6668 memset(prop, 0, sizeof(*prop));
6669 prop->sadb_prop_len = PFKEY_UNIT64(totlen);
6670 prop->sadb_prop_exttype = SADB_EXT_PROPOSAL;
6671 prop->sadb_prop_replay = 32; /* XXX */
6672
6673 return m;
6674 }
6675
6676 /*
6677 * SADB_ACQUIRE processing called by key_checkrequest() and key_api_acquire().
6678 * send
6679 * <base, SA, address(SD), (address(P)), x_policy,
6680 * (identity(SD),) (sensitivity,) proposal>
6681 * to KMD, and expect to receive
6682 * <base> with SADB_ACQUIRE if error occurred,
6683 * or
6684 * <base, src address, dst address, (SPI range)> with SADB_GETSPI
6685 * from KMD by PF_KEY.
6686 *
6687 * XXX x_policy is outside of RFC2367 (KAME extension).
6688 * XXX sensitivity is not supported.
6689 * XXX for ipcomp, RFC2367 does not define how to fill in proposal.
6690 * see comment for key_getcomb_ipcomp().
6691 *
6692 * OUT:
6693 * 0 : succeed
6694 * others: error number
6695 */
6696 static int
6697 key_acquire(const struct secasindex *saidx, const struct secpolicy *sp, int mflag)
6698 {
6699 struct mbuf *result = NULL, *m;
6700 #ifndef IPSEC_NONBLOCK_ACQUIRE
6701 struct secacq *newacq;
6702 #endif
6703 u_int8_t satype;
6704 int error = -1;
6705 u_int32_t seq;
6706
6707 /* sanity check */
6708 KASSERT(saidx != NULL);
6709 satype = key_proto2satype(saidx->proto);
6710 KASSERTMSG(satype != 0, "null satype, protocol %u", saidx->proto);
6711
6712 #ifndef IPSEC_NONBLOCK_ACQUIRE
6713 /*
6714 * We never do anything about acquirng SA. There is anather
6715 * solution that kernel blocks to send SADB_ACQUIRE message until
6716 * getting something message from IKEd. In later case, to be
6717 * managed with ACQUIRING list.
6718 */
6719 /* Get an entry to check whether sending message or not. */
6720 mutex_enter(&key_misc.lock);
6721 newacq = key_getacq(saidx);
6722 if (newacq != NULL) {
6723 if (key_blockacq_count < newacq->count) {
6724 /* reset counter and do send message. */
6725 newacq->count = 0;
6726 } else {
6727 /* increment counter and do nothing. */
6728 newacq->count++;
6729 mutex_exit(&key_misc.lock);
6730 return 0;
6731 }
6732 } else {
6733 /* make new entry for blocking to send SADB_ACQUIRE. */
6734 newacq = key_newacq(saidx);
6735 if (newacq == NULL) {
6736 mutex_exit(&key_misc.lock);
6737 return ENOBUFS;
6738 }
6739
6740 /* add to key_misc.acqlist */
6741 LIST_INSERT_HEAD(&key_misc.acqlist, newacq, chain);
6742 }
6743
6744 seq = newacq->seq;
6745 mutex_exit(&key_misc.lock);
6746 #else
6747 seq = (acq_seq = (acq_seq == ~0 ? 1 : ++acq_seq));
6748 #endif
6749 m = key_setsadbmsg(SADB_ACQUIRE, 0, satype, seq, 0, 0, mflag);
6750 if (!m) {
6751 error = ENOBUFS;
6752 goto fail;
6753 }
6754 result = m;
6755
6756 /* set sadb_address for saidx's. */
6757 m = key_setsadbaddr(SADB_EXT_ADDRESS_SRC, &saidx->src.sa, FULLMASK,
6758 IPSEC_ULPROTO_ANY, mflag);
6759 if (!m) {
6760 error = ENOBUFS;
6761 goto fail;
6762 }
6763 m_cat(result, m);
6764
6765 m = key_setsadbaddr(SADB_EXT_ADDRESS_DST, &saidx->dst.sa, FULLMASK,
6766 IPSEC_ULPROTO_ANY, mflag);
6767 if (!m) {
6768 error = ENOBUFS;
6769 goto fail;
6770 }
6771 m_cat(result, m);
6772
6773 /* XXX proxy address (optional) */
6774
6775 /* set sadb_x_policy */
6776 if (sp) {
6777 m = key_setsadbxpolicy(sp->policy, sp->spidx.dir, sp->id,
6778 mflag);
6779 if (!m) {
6780 error = ENOBUFS;
6781 goto fail;
6782 }
6783 m_cat(result, m);
6784 }
6785
6786 /* XXX identity (optional) */
6787 #if 0
6788 if (idexttype && fqdn) {
6789 /* create identity extension (FQDN) */
6790 struct sadb_ident *id;
6791 int fqdnlen;
6792
6793 fqdnlen = strlen(fqdn) + 1; /* +1 for terminating-NUL */
6794 id = (struct sadb_ident *)p;
6795 memset(id, 0, sizeof(*id) + PFKEY_ALIGN8(fqdnlen));
6796 id->sadb_ident_len = PFKEY_UNIT64(sizeof(*id) + PFKEY_ALIGN8(fqdnlen));
6797 id->sadb_ident_exttype = idexttype;
6798 id->sadb_ident_type = SADB_IDENTTYPE_FQDN;
6799 memcpy(id + 1, fqdn, fqdnlen);
6800 p += sizeof(struct sadb_ident) + PFKEY_ALIGN8(fqdnlen);
6801 }
6802
6803 if (idexttype) {
6804 /* create identity extension (USERFQDN) */
6805 struct sadb_ident *id;
6806 int userfqdnlen;
6807
6808 if (userfqdn) {
6809 /* +1 for terminating-NUL */
6810 userfqdnlen = strlen(userfqdn) + 1;
6811 } else
6812 userfqdnlen = 0;
6813 id = (struct sadb_ident *)p;
6814 memset(id, 0, sizeof(*id) + PFKEY_ALIGN8(userfqdnlen));
6815 id->sadb_ident_len = PFKEY_UNIT64(sizeof(*id) + PFKEY_ALIGN8(userfqdnlen));
6816 id->sadb_ident_exttype = idexttype;
6817 id->sadb_ident_type = SADB_IDENTTYPE_USERFQDN;
6818 /* XXX is it correct? */
6819 if (curlwp)
6820 id->sadb_ident_id = kauth_cred_getuid(curlwp->l_cred);
6821 if (userfqdn && userfqdnlen)
6822 memcpy(id + 1, userfqdn, userfqdnlen);
6823 p += sizeof(struct sadb_ident) + PFKEY_ALIGN8(userfqdnlen);
6824 }
6825 #endif
6826
6827 /* XXX sensitivity (optional) */
6828
6829 /* create proposal/combination extension */
6830 m = key_getprop(saidx, mflag);
6831 #if 0
6832 /*
6833 * spec conformant: always attach proposal/combination extension,
6834 * the problem is that we have no way to attach it for ipcomp,
6835 * due to the way sadb_comb is declared in RFC2367.
6836 */
6837 if (!m) {
6838 error = ENOBUFS;
6839 goto fail;
6840 }
6841 m_cat(result, m);
6842 #else
6843 /*
6844 * outside of spec; make proposal/combination extension optional.
6845 */
6846 if (m)
6847 m_cat(result, m);
6848 #endif
6849
6850 KASSERT(result->m_flags & M_PKTHDR);
6851 KASSERT(result->m_len >= sizeof(struct sadb_msg));
6852
6853 result->m_pkthdr.len = 0;
6854 for (m = result; m; m = m->m_next)
6855 result->m_pkthdr.len += m->m_len;
6856
6857 mtod(result, struct sadb_msg *)->sadb_msg_len =
6858 PFKEY_UNIT64(result->m_pkthdr.len);
6859
6860 /*
6861 * Called from key_api_acquire that must come from userland, so
6862 * we can call key_sendup_mbuf immediately.
6863 */
6864 if (mflag == M_WAITOK)
6865 return key_sendup_mbuf(NULL, result, KEY_SENDUP_REGISTERED);
6866 /*
6867 * XXX we cannot call key_sendup_mbuf directly here because
6868 * it can cause a deadlock:
6869 * - We have a reference to an SP (and an SA) here
6870 * - key_sendup_mbuf will try to take key_so_mtx
6871 * - Some other thread may try to localcount_drain to the SP with
6872 * holding key_so_mtx in say key_api_spdflush
6873 * - In this case localcount_drain never return because key_sendup_mbuf
6874 * that has stuck on key_so_mtx never release a reference to the SP
6875 *
6876 * So defer key_sendup_mbuf to the timer.
6877 */
6878 return key_acquire_sendup_mbuf_later(result);
6879
6880 fail:
6881 if (result)
6882 m_freem(result);
6883 return error;
6884 }
6885
6886 static struct mbuf *key_acquire_mbuf_head = NULL;
6887 static unsigned key_acquire_mbuf_count = 0;
6888 #define KEY_ACQUIRE_MBUF_MAX 10
6889
6890 static void
6891 key_acquire_sendup_pending_mbuf(void)
6892 {
6893 struct mbuf *m, *prev;
6894 int error;
6895
6896 again:
6897 prev = NULL;
6898 mutex_enter(&key_misc.lock);
6899 m = key_acquire_mbuf_head;
6900 /* Get an earliest mbuf (one at the tail of the list) */
6901 while (m != NULL) {
6902 if (m->m_nextpkt == NULL) {
6903 if (prev != NULL)
6904 prev->m_nextpkt = NULL;
6905 if (m == key_acquire_mbuf_head)
6906 key_acquire_mbuf_head = NULL;
6907 key_acquire_mbuf_count--;
6908 break;
6909 }
6910 prev = m;
6911 m = m->m_nextpkt;
6912 }
6913 mutex_exit(&key_misc.lock);
6914
6915 if (m == NULL)
6916 return;
6917
6918 m->m_nextpkt = NULL;
6919 error = key_sendup_mbuf(NULL, m, KEY_SENDUP_REGISTERED);
6920 if (error != 0)
6921 IPSECLOG(LOG_WARNING, "key_sendup_mbuf failed (error=%d)\n",
6922 error);
6923
6924 if (prev != NULL)
6925 goto again;
6926 }
6927
6928 static int
6929 key_acquire_sendup_mbuf_later(struct mbuf *m)
6930 {
6931
6932 mutex_enter(&key_misc.lock);
6933 /* Avoid queuing too much mbufs */
6934 if (key_acquire_mbuf_count >= KEY_ACQUIRE_MBUF_MAX) {
6935 mutex_exit(&key_misc.lock);
6936 m_freem(m);
6937 return ENOBUFS; /* XXX */
6938 }
6939 /* Enqueue mbuf at the head of the list */
6940 m->m_nextpkt = key_acquire_mbuf_head;
6941 key_acquire_mbuf_head = m;
6942 key_acquire_mbuf_count++;
6943 mutex_exit(&key_misc.lock);
6944
6945 /* Kick the timer */
6946 key_timehandler(NULL);
6947
6948 return 0;
6949 }
6950
6951 #ifndef IPSEC_NONBLOCK_ACQUIRE
6952 static struct secacq *
6953 key_newacq(const struct secasindex *saidx)
6954 {
6955 struct secacq *newacq;
6956
6957 /* get new entry */
6958 newacq = kmem_intr_zalloc(sizeof(struct secacq), KM_NOSLEEP);
6959 if (newacq == NULL) {
6960 IPSECLOG(LOG_DEBUG, "No more memory.\n");
6961 return NULL;
6962 }
6963
6964 /* copy secindex */
6965 memcpy(&newacq->saidx, saidx, sizeof(newacq->saidx));
6966 newacq->seq = (acq_seq == ~0 ? 1 : ++acq_seq);
6967 newacq->created = time_uptime;
6968 newacq->count = 0;
6969
6970 return newacq;
6971 }
6972
6973 static struct secacq *
6974 key_getacq(const struct secasindex *saidx)
6975 {
6976 struct secacq *acq;
6977
6978 KASSERT(mutex_owned(&key_misc.lock));
6979
6980 LIST_FOREACH(acq, &key_misc.acqlist, chain) {
6981 if (key_saidx_match(saidx, &acq->saidx, CMP_EXACTLY))
6982 return acq;
6983 }
6984
6985 return NULL;
6986 }
6987
6988 static struct secacq *
6989 key_getacqbyseq(u_int32_t seq)
6990 {
6991 struct secacq *acq;
6992
6993 KASSERT(mutex_owned(&key_misc.lock));
6994
6995 LIST_FOREACH(acq, &key_misc.acqlist, chain) {
6996 if (acq->seq == seq)
6997 return acq;
6998 }
6999
7000 return NULL;
7001 }
7002 #endif
7003
7004 #ifdef notyet
7005 static struct secspacq *
7006 key_newspacq(const struct secpolicyindex *spidx)
7007 {
7008 struct secspacq *acq;
7009
7010 /* get new entry */
7011 acq = kmem_intr_zalloc(sizeof(struct secspacq), KM_NOSLEEP);
7012 if (acq == NULL) {
7013 IPSECLOG(LOG_DEBUG, "No more memory.\n");
7014 return NULL;
7015 }
7016
7017 /* copy secindex */
7018 memcpy(&acq->spidx, spidx, sizeof(acq->spidx));
7019 acq->created = time_uptime;
7020 acq->count = 0;
7021
7022 return acq;
7023 }
7024
7025 static struct secspacq *
7026 key_getspacq(const struct secpolicyindex *spidx)
7027 {
7028 struct secspacq *acq;
7029
7030 LIST_FOREACH(acq, &key_misc.spacqlist, chain) {
7031 if (key_spidx_match_exactly(spidx, &acq->spidx))
7032 return acq;
7033 }
7034
7035 return NULL;
7036 }
7037 #endif /* notyet */
7038
7039 /*
7040 * SADB_ACQUIRE processing,
7041 * in first situation, is receiving
7042 * <base>
7043 * from the ikmpd, and clear sequence of its secasvar entry.
7044 *
7045 * In second situation, is receiving
7046 * <base, address(SD), (address(P),) (identity(SD),) (sensitivity,) proposal>
7047 * from a user land process, and return
7048 * <base, address(SD), (address(P),) (identity(SD),) (sensitivity,) proposal>
7049 * to the socket.
7050 *
7051 * m will always be freed.
7052 */
7053 static int
7054 key_api_acquire(struct socket *so, struct mbuf *m,
7055 const struct sadb_msghdr *mhp)
7056 {
7057 const struct sockaddr *src, *dst;
7058 struct secasindex saidx;
7059 u_int16_t proto;
7060 int error;
7061
7062 /*
7063 * Error message from KMd.
7064 * We assume that if error was occurred in IKEd, the length of PFKEY
7065 * message is equal to the size of sadb_msg structure.
7066 * We do not raise error even if error occurred in this function.
7067 */
7068 if (mhp->msg->sadb_msg_len == PFKEY_UNIT64(sizeof(struct sadb_msg))) {
7069 #ifndef IPSEC_NONBLOCK_ACQUIRE
7070 struct secacq *acq;
7071
7072 /* check sequence number */
7073 if (mhp->msg->sadb_msg_seq == 0) {
7074 IPSECLOG(LOG_DEBUG, "must specify sequence number.\n");
7075 m_freem(m);
7076 return 0;
7077 }
7078
7079 mutex_enter(&key_misc.lock);
7080 acq = key_getacqbyseq(mhp->msg->sadb_msg_seq);
7081 if (acq == NULL) {
7082 mutex_exit(&key_misc.lock);
7083 /*
7084 * the specified larval SA is already gone, or we got
7085 * a bogus sequence number. we can silently ignore it.
7086 */
7087 m_freem(m);
7088 return 0;
7089 }
7090
7091 /* reset acq counter in order to deletion by timehander. */
7092 acq->created = time_uptime;
7093 acq->count = 0;
7094 mutex_exit(&key_misc.lock);
7095 #endif
7096 m_freem(m);
7097 return 0;
7098 }
7099
7100 /*
7101 * This message is from user land.
7102 */
7103
7104 /* map satype to proto */
7105 proto = key_satype2proto(mhp->msg->sadb_msg_satype);
7106 if (proto == 0) {
7107 IPSECLOG(LOG_DEBUG, "invalid satype is passed.\n");
7108 return key_senderror(so, m, EINVAL);
7109 }
7110
7111 if (mhp->ext[SADB_EXT_ADDRESS_SRC] == NULL ||
7112 mhp->ext[SADB_EXT_ADDRESS_DST] == NULL ||
7113 mhp->ext[SADB_EXT_PROPOSAL] == NULL) {
7114 /* error */
7115 IPSECLOG(LOG_DEBUG, "invalid message is passed.\n");
7116 return key_senderror(so, m, EINVAL);
7117 }
7118 if (mhp->extlen[SADB_EXT_ADDRESS_SRC] < sizeof(struct sadb_address) ||
7119 mhp->extlen[SADB_EXT_ADDRESS_DST] < sizeof(struct sadb_address) ||
7120 mhp->extlen[SADB_EXT_PROPOSAL] < sizeof(struct sadb_prop)) {
7121 /* error */
7122 IPSECLOG(LOG_DEBUG, "invalid message is passed.\n");
7123 return key_senderror(so, m, EINVAL);
7124 }
7125
7126 src = key_msghdr_get_sockaddr(mhp, SADB_EXT_ADDRESS_SRC);
7127 dst = key_msghdr_get_sockaddr(mhp, SADB_EXT_ADDRESS_DST);
7128
7129 error = key_setsecasidx(proto, IPSEC_MODE_ANY, 0, src, dst, &saidx);
7130 if (error != 0)
7131 return key_senderror(so, m, EINVAL);
7132
7133 error = key_set_natt_ports(&saidx.src, &saidx.dst, mhp);
7134 if (error != 0)
7135 return key_senderror(so, m, EINVAL);
7136
7137 /* get a SA index */
7138 {
7139 struct secashead *sah;
7140 int s = pserialize_read_enter();
7141
7142 sah = key_getsah(&saidx, CMP_MODE_REQID);
7143 if (sah != NULL) {
7144 pserialize_read_exit(s);
7145 IPSECLOG(LOG_DEBUG, "a SA exists already.\n");
7146 return key_senderror(so, m, EEXIST);
7147 }
7148 pserialize_read_exit(s);
7149 }
7150
7151 error = key_acquire(&saidx, NULL, M_WAITOK);
7152 if (error != 0) {
7153 IPSECLOG(LOG_DEBUG, "error %d returned from key_acquire.\n",
7154 error);
7155 return key_senderror(so, m, error);
7156 }
7157
7158 return key_sendup_mbuf(so, m, KEY_SENDUP_REGISTERED);
7159 }
7160
7161 /*
7162 * SADB_REGISTER processing.
7163 * If SATYPE_UNSPEC has been passed as satype, only return sabd_supported.
7164 * receive
7165 * <base>
7166 * from the ikmpd, and register a socket to send PF_KEY messages,
7167 * and send
7168 * <base, supported>
7169 * to KMD by PF_KEY.
7170 * If socket is detached, must free from regnode.
7171 *
7172 * m will always be freed.
7173 */
7174 static int
7175 key_api_register(struct socket *so, struct mbuf *m,
7176 const struct sadb_msghdr *mhp)
7177 {
7178 struct secreg *reg, *newreg = 0;
7179
7180 /* check for invalid register message */
7181 if (mhp->msg->sadb_msg_satype >= __arraycount(key_misc.reglist))
7182 return key_senderror(so, m, EINVAL);
7183
7184 /* When SATYPE_UNSPEC is specified, only return sabd_supported. */
7185 if (mhp->msg->sadb_msg_satype == SADB_SATYPE_UNSPEC)
7186 goto setmsg;
7187
7188 /* Allocate regnode in advance, out of mutex */
7189 newreg = kmem_zalloc(sizeof(*newreg), KM_SLEEP);
7190
7191 /* check whether existing or not */
7192 mutex_enter(&key_misc.lock);
7193 LIST_FOREACH(reg, &key_misc.reglist[mhp->msg->sadb_msg_satype], chain) {
7194 if (reg->so == so) {
7195 IPSECLOG(LOG_DEBUG, "socket exists already.\n");
7196 mutex_exit(&key_misc.lock);
7197 kmem_free(newreg, sizeof(*newreg));
7198 return key_senderror(so, m, EEXIST);
7199 }
7200 }
7201
7202 newreg->so = so;
7203 ((struct keycb *)sotorawcb(so))->kp_registered++;
7204
7205 /* add regnode to key_misc.reglist. */
7206 LIST_INSERT_HEAD(&key_misc.reglist[mhp->msg->sadb_msg_satype], newreg, chain);
7207 mutex_exit(&key_misc.lock);
7208
7209 setmsg:
7210 {
7211 struct mbuf *n;
7212 struct sadb_supported *sup;
7213 u_int len, alen, elen;
7214 int off;
7215 int i;
7216 struct sadb_alg *alg;
7217
7218 /* create new sadb_msg to reply. */
7219 alen = 0;
7220 for (i = 1; i <= SADB_AALG_MAX; i++) {
7221 if (ah_algorithm_lookup(i))
7222 alen += sizeof(struct sadb_alg);
7223 }
7224 if (alen)
7225 alen += sizeof(struct sadb_supported);
7226 elen = 0;
7227 for (i = 1; i <= SADB_EALG_MAX; i++) {
7228 if (esp_algorithm_lookup(i))
7229 elen += sizeof(struct sadb_alg);
7230 }
7231 if (elen)
7232 elen += sizeof(struct sadb_supported);
7233
7234 len = sizeof(struct sadb_msg) + alen + elen;
7235
7236 if (len > MCLBYTES)
7237 return key_senderror(so, m, ENOBUFS);
7238
7239 n = key_alloc_mbuf_simple(len, M_WAITOK);
7240 n->m_pkthdr.len = n->m_len = len;
7241 n->m_next = NULL;
7242 off = 0;
7243
7244 m_copydata(m, 0, sizeof(struct sadb_msg), mtod(n, char *) + off);
7245 key_fill_replymsg(n, 0);
7246
7247 off += PFKEY_ALIGN8(sizeof(struct sadb_msg));
7248
7249 /* for authentication algorithm */
7250 if (alen) {
7251 sup = (struct sadb_supported *)(mtod(n, char *) + off);
7252 sup->sadb_supported_len = PFKEY_UNIT64(alen);
7253 sup->sadb_supported_exttype = SADB_EXT_SUPPORTED_AUTH;
7254 sup->sadb_supported_reserved = 0;
7255 off += PFKEY_ALIGN8(sizeof(*sup));
7256
7257 for (i = 1; i <= SADB_AALG_MAX; i++) {
7258 const struct auth_hash *aalgo;
7259 u_int16_t minkeysize, maxkeysize;
7260
7261 aalgo = ah_algorithm_lookup(i);
7262 if (!aalgo)
7263 continue;
7264 alg = (struct sadb_alg *)(mtod(n, char *) + off);
7265 alg->sadb_alg_id = i;
7266 alg->sadb_alg_ivlen = 0;
7267 key_getsizes_ah(aalgo, i, &minkeysize, &maxkeysize);
7268 alg->sadb_alg_minbits = _BITS(minkeysize);
7269 alg->sadb_alg_maxbits = _BITS(maxkeysize);
7270 alg->sadb_alg_reserved = 0;
7271 off += PFKEY_ALIGN8(sizeof(*alg));
7272 }
7273 }
7274
7275 /* for encryption algorithm */
7276 if (elen) {
7277 sup = (struct sadb_supported *)(mtod(n, char *) + off);
7278 sup->sadb_supported_len = PFKEY_UNIT64(elen);
7279 sup->sadb_supported_exttype = SADB_EXT_SUPPORTED_ENCRYPT;
7280 sup->sadb_supported_reserved = 0;
7281 off += PFKEY_ALIGN8(sizeof(*sup));
7282
7283 for (i = 1; i <= SADB_EALG_MAX; i++) {
7284 const struct enc_xform *ealgo;
7285
7286 ealgo = esp_algorithm_lookup(i);
7287 if (!ealgo)
7288 continue;
7289 alg = (struct sadb_alg *)(mtod(n, char *) + off);
7290 alg->sadb_alg_id = i;
7291 alg->sadb_alg_ivlen = ealgo->blocksize;
7292 alg->sadb_alg_minbits = _BITS(ealgo->minkey);
7293 alg->sadb_alg_maxbits = _BITS(ealgo->maxkey);
7294 alg->sadb_alg_reserved = 0;
7295 off += PFKEY_ALIGN8(sizeof(struct sadb_alg));
7296 }
7297 }
7298
7299 KASSERTMSG(off == len, "length inconsistency");
7300
7301 m_freem(m);
7302 return key_sendup_mbuf(so, n, KEY_SENDUP_REGISTERED);
7303 }
7304 }
7305
7306 /*
7307 * free secreg entry registered.
7308 * XXX: I want to do free a socket marked done SADB_RESIGER to socket.
7309 */
7310 void
7311 key_freereg(struct socket *so)
7312 {
7313 struct secreg *reg;
7314 int i;
7315
7316 KASSERT(!cpu_softintr_p());
7317 KASSERT(so != NULL);
7318
7319 /*
7320 * check whether existing or not.
7321 * check all type of SA, because there is a potential that
7322 * one socket is registered to multiple type of SA.
7323 */
7324 for (i = 0; i <= SADB_SATYPE_MAX; i++) {
7325 mutex_enter(&key_misc.lock);
7326 LIST_FOREACH(reg, &key_misc.reglist[i], chain) {
7327 if (reg->so == so) {
7328 LIST_REMOVE(reg, chain);
7329 break;
7330 }
7331 }
7332 mutex_exit(&key_misc.lock);
7333 if (reg != NULL)
7334 kmem_free(reg, sizeof(*reg));
7335 }
7336
7337 return;
7338 }
7339
7340 /*
7341 * SADB_EXPIRE processing
7342 * send
7343 * <base, SA, SA2, lifetime(C and one of HS), address(SD)>
7344 * to KMD by PF_KEY.
7345 * NOTE: We send only soft lifetime extension.
7346 *
7347 * OUT: 0 : succeed
7348 * others : error number
7349 */
7350 static int
7351 key_expire(struct secasvar *sav)
7352 {
7353 int s;
7354 int satype;
7355 struct mbuf *result = NULL, *m;
7356 int len;
7357 int error = -1;
7358 struct sadb_lifetime *lt;
7359 lifetime_counters_t sum = {0};
7360
7361 /* XXX: Why do we lock ? */
7362 s = splsoftnet(); /*called from softclock()*/
7363
7364 KASSERT(sav != NULL);
7365
7366 satype = key_proto2satype(sav->sah->saidx.proto);
7367 KASSERTMSG(satype != 0, "invalid proto is passed");
7368
7369 /* set msg header */
7370 m = key_setsadbmsg(SADB_EXPIRE, 0, satype, sav->seq, 0, key_sa_refcnt(sav),
7371 M_WAITOK);
7372 result = m;
7373
7374 /* create SA extension */
7375 m = key_setsadbsa(sav);
7376 m_cat(result, m);
7377
7378 /* create SA extension */
7379 m = key_setsadbxsa2(sav->sah->saidx.mode,
7380 sav->replay ? sav->replay->count : 0, sav->sah->saidx.reqid);
7381 m_cat(result, m);
7382
7383 /* create lifetime extension (current and soft) */
7384 len = PFKEY_ALIGN8(sizeof(*lt)) * 2;
7385 m = key_alloc_mbuf(len, M_WAITOK);
7386 KASSERT(m->m_next == NULL);
7387
7388 memset(mtod(m, void *), 0, len);
7389 lt = mtod(m, struct sadb_lifetime *);
7390 lt->sadb_lifetime_len = PFKEY_UNIT64(sizeof(struct sadb_lifetime));
7391 lt->sadb_lifetime_exttype = SADB_EXT_LIFETIME_CURRENT;
7392 percpu_foreach(sav->lft_c_counters_percpu,
7393 key_sum_lifetime_counters, sum);
7394 lt->sadb_lifetime_allocations = sum[LIFETIME_COUNTER_ALLOCATIONS];
7395 lt->sadb_lifetime_bytes = sum[LIFETIME_COUNTER_BYTES];
7396 lt->sadb_lifetime_addtime =
7397 time_mono_to_wall(sav->lft_c->sadb_lifetime_addtime);
7398 lt->sadb_lifetime_usetime =
7399 time_mono_to_wall(sav->lft_c->sadb_lifetime_usetime);
7400 lt = (struct sadb_lifetime *)(mtod(m, char *) + len / 2);
7401 memcpy(lt, sav->lft_s, sizeof(*lt));
7402 m_cat(result, m);
7403
7404 /* set sadb_address for source */
7405 m = key_setsadbaddr(SADB_EXT_ADDRESS_SRC, &sav->sah->saidx.src.sa,
7406 FULLMASK, IPSEC_ULPROTO_ANY, M_WAITOK);
7407 m_cat(result, m);
7408
7409 /* set sadb_address for destination */
7410 m = key_setsadbaddr(SADB_EXT_ADDRESS_DST, &sav->sah->saidx.dst.sa,
7411 FULLMASK, IPSEC_ULPROTO_ANY, M_WAITOK);
7412 m_cat(result, m);
7413
7414 if ((result->m_flags & M_PKTHDR) == 0) {
7415 error = EINVAL;
7416 goto fail;
7417 }
7418
7419 if (result->m_len < sizeof(struct sadb_msg)) {
7420 result = m_pullup(result, sizeof(struct sadb_msg));
7421 if (result == NULL) {
7422 error = ENOBUFS;
7423 goto fail;
7424 }
7425 }
7426
7427 result->m_pkthdr.len = 0;
7428 for (m = result; m; m = m->m_next)
7429 result->m_pkthdr.len += m->m_len;
7430
7431 mtod(result, struct sadb_msg *)->sadb_msg_len =
7432 PFKEY_UNIT64(result->m_pkthdr.len);
7433
7434 splx(s);
7435 return key_sendup_mbuf(NULL, result, KEY_SENDUP_REGISTERED);
7436
7437 fail:
7438 if (result)
7439 m_freem(result);
7440 splx(s);
7441 return error;
7442 }
7443
7444 /*
7445 * SADB_FLUSH processing
7446 * receive
7447 * <base>
7448 * from the ikmpd, and free all entries in secastree.
7449 * and send,
7450 * <base>
7451 * to the ikmpd.
7452 * NOTE: to do is only marking SADB_SASTATE_DEAD.
7453 *
7454 * m will always be freed.
7455 */
7456 static int
7457 key_api_flush(struct socket *so, struct mbuf *m,
7458 const struct sadb_msghdr *mhp)
7459 {
7460 struct sadb_msg *newmsg;
7461 struct secashead *sah;
7462 struct secasvar *sav;
7463 u_int16_t proto;
7464 u_int8_t state;
7465 int s;
7466
7467 /* map satype to proto */
7468 proto = key_satype2proto(mhp->msg->sadb_msg_satype);
7469 if (proto == 0) {
7470 IPSECLOG(LOG_DEBUG, "invalid satype is passed.\n");
7471 return key_senderror(so, m, EINVAL);
7472 }
7473
7474 /* no SATYPE specified, i.e. flushing all SA. */
7475 s = pserialize_read_enter();
7476 SAHLIST_READER_FOREACH(sah) {
7477 if (mhp->msg->sadb_msg_satype != SADB_SATYPE_UNSPEC &&
7478 proto != sah->saidx.proto)
7479 continue;
7480
7481 key_sah_ref(sah);
7482 pserialize_read_exit(s);
7483
7484 SASTATE_ALIVE_FOREACH(state) {
7485 restart:
7486 mutex_enter(&key_sad.lock);
7487 SAVLIST_WRITER_FOREACH(sav, sah, state) {
7488 sav->state = SADB_SASTATE_DEAD;
7489 key_unlink_sav(sav);
7490 mutex_exit(&key_sad.lock);
7491 key_destroy_sav(sav);
7492 goto restart;
7493 }
7494 mutex_exit(&key_sad.lock);
7495 }
7496
7497 s = pserialize_read_enter();
7498 sah->state = SADB_SASTATE_DEAD;
7499 key_sah_unref(sah);
7500 }
7501 pserialize_read_exit(s);
7502
7503 if (m->m_len < sizeof(struct sadb_msg) ||
7504 sizeof(struct sadb_msg) > m->m_len + M_TRAILINGSPACE(m)) {
7505 IPSECLOG(LOG_DEBUG, "No more memory.\n");
7506 return key_senderror(so, m, ENOBUFS);
7507 }
7508
7509 if (m->m_next)
7510 m_freem(m->m_next);
7511 m->m_next = NULL;
7512 m->m_pkthdr.len = m->m_len = sizeof(struct sadb_msg);
7513 newmsg = mtod(m, struct sadb_msg *);
7514 newmsg->sadb_msg_errno = 0;
7515 newmsg->sadb_msg_len = PFKEY_UNIT64(m->m_pkthdr.len);
7516
7517 return key_sendup_mbuf(so, m, KEY_SENDUP_ALL);
7518 }
7519
7520
7521 static struct mbuf *
7522 key_setdump_chain(u_int8_t req_satype, int *errorp, int *lenp, pid_t pid)
7523 {
7524 struct secashead *sah;
7525 struct secasvar *sav;
7526 u_int16_t proto;
7527 u_int8_t satype;
7528 u_int8_t state;
7529 int cnt;
7530 struct mbuf *m, *n, *prev;
7531
7532 KASSERT(mutex_owned(&key_sad.lock));
7533
7534 *lenp = 0;
7535
7536 /* map satype to proto */
7537 proto = key_satype2proto(req_satype);
7538 if (proto == 0) {
7539 *errorp = EINVAL;
7540 return (NULL);
7541 }
7542
7543 /* count sav entries to be sent to userland. */
7544 cnt = 0;
7545 SAHLIST_WRITER_FOREACH(sah) {
7546 if (req_satype != SADB_SATYPE_UNSPEC &&
7547 proto != sah->saidx.proto)
7548 continue;
7549
7550 SASTATE_ANY_FOREACH(state) {
7551 SAVLIST_WRITER_FOREACH(sav, sah, state) {
7552 cnt++;
7553 }
7554 }
7555 }
7556
7557 if (cnt == 0) {
7558 *errorp = ENOENT;
7559 return (NULL);
7560 }
7561
7562 /* send this to the userland, one at a time. */
7563 m = NULL;
7564 prev = m;
7565 SAHLIST_WRITER_FOREACH(sah) {
7566 if (req_satype != SADB_SATYPE_UNSPEC &&
7567 proto != sah->saidx.proto)
7568 continue;
7569
7570 /* map proto to satype */
7571 satype = key_proto2satype(sah->saidx.proto);
7572 if (satype == 0) {
7573 m_freem(m);
7574 *errorp = EINVAL;
7575 return (NULL);
7576 }
7577
7578 SASTATE_ANY_FOREACH(state) {
7579 SAVLIST_WRITER_FOREACH(sav, sah, state) {
7580 n = key_setdumpsa(sav, SADB_DUMP, satype,
7581 --cnt, pid);
7582 if (!m)
7583 m = n;
7584 else
7585 prev->m_nextpkt = n;
7586 prev = n;
7587 }
7588 }
7589 }
7590
7591 if (!m) {
7592 *errorp = EINVAL;
7593 return (NULL);
7594 }
7595
7596 if ((m->m_flags & M_PKTHDR) != 0) {
7597 m->m_pkthdr.len = 0;
7598 for (n = m; n; n = n->m_next)
7599 m->m_pkthdr.len += n->m_len;
7600 }
7601
7602 *errorp = 0;
7603 return (m);
7604 }
7605
7606 /*
7607 * SADB_DUMP processing
7608 * dump all entries including status of DEAD in SAD.
7609 * receive
7610 * <base>
7611 * from the ikmpd, and dump all secasvar leaves
7612 * and send,
7613 * <base> .....
7614 * to the ikmpd.
7615 *
7616 * m will always be freed.
7617 */
7618 static int
7619 key_api_dump(struct socket *so, struct mbuf *m0,
7620 const struct sadb_msghdr *mhp)
7621 {
7622 u_int16_t proto;
7623 u_int8_t satype;
7624 struct mbuf *n;
7625 int error, len, ok;
7626
7627 /* map satype to proto */
7628 satype = mhp->msg->sadb_msg_satype;
7629 proto = key_satype2proto(satype);
7630 if (proto == 0) {
7631 IPSECLOG(LOG_DEBUG, "invalid satype is passed.\n");
7632 return key_senderror(so, m0, EINVAL);
7633 }
7634
7635 /*
7636 * If the requestor has insufficient socket-buffer space
7637 * for the entire chain, nobody gets any response to the DUMP.
7638 * XXX For now, only the requestor ever gets anything.
7639 * Moreover, if the requestor has any space at all, they receive
7640 * the entire chain, otherwise the request is refused with ENOBUFS.
7641 */
7642 if (sbspace(&so->so_rcv) <= 0) {
7643 return key_senderror(so, m0, ENOBUFS);
7644 }
7645
7646 mutex_enter(&key_sad.lock);
7647 n = key_setdump_chain(satype, &error, &len, mhp->msg->sadb_msg_pid);
7648 mutex_exit(&key_sad.lock);
7649
7650 if (n == NULL) {
7651 return key_senderror(so, m0, ENOENT);
7652 }
7653 {
7654 uint64_t *ps = PFKEY_STAT_GETREF();
7655 ps[PFKEY_STAT_IN_TOTAL]++;
7656 ps[PFKEY_STAT_IN_BYTES] += len;
7657 PFKEY_STAT_PUTREF();
7658 }
7659
7660 /*
7661 * PF_KEY DUMP responses are no longer broadcast to all PF_KEY sockets.
7662 * The requestor receives either the entire chain, or an
7663 * error message with ENOBUFS.
7664 *
7665 * sbappendaddrchain() takes the chain of entries, one
7666 * packet-record per SPD entry, prepends the key_src sockaddr
7667 * to each packet-record, links the sockaddr mbufs into a new
7668 * list of records, then appends the entire resulting
7669 * list to the requesting socket.
7670 */
7671 ok = sbappendaddrchain(&so->so_rcv, (struct sockaddr *)&key_src, n,
7672 SB_PRIO_ONESHOT_OVERFLOW);
7673
7674 if (!ok) {
7675 PFKEY_STATINC(PFKEY_STAT_IN_NOMEM);
7676 m_freem(n);
7677 return key_senderror(so, m0, ENOBUFS);
7678 }
7679
7680 m_freem(m0);
7681 return 0;
7682 }
7683
7684 /*
7685 * SADB_X_PROMISC processing
7686 *
7687 * m will always be freed.
7688 */
7689 static int
7690 key_api_promisc(struct socket *so, struct mbuf *m,
7691 const struct sadb_msghdr *mhp)
7692 {
7693 int olen;
7694
7695 olen = PFKEY_UNUNIT64(mhp->msg->sadb_msg_len);
7696
7697 if (olen < sizeof(struct sadb_msg)) {
7698 #if 1
7699 return key_senderror(so, m, EINVAL);
7700 #else
7701 m_freem(m);
7702 return 0;
7703 #endif
7704 } else if (olen == sizeof(struct sadb_msg)) {
7705 /* enable/disable promisc mode */
7706 struct keycb *kp = (struct keycb *)sotorawcb(so);
7707 if (kp == NULL)
7708 return key_senderror(so, m, EINVAL);
7709 mhp->msg->sadb_msg_errno = 0;
7710 switch (mhp->msg->sadb_msg_satype) {
7711 case 0:
7712 case 1:
7713 kp->kp_promisc = mhp->msg->sadb_msg_satype;
7714 break;
7715 default:
7716 return key_senderror(so, m, EINVAL);
7717 }
7718
7719 /* send the original message back to everyone */
7720 mhp->msg->sadb_msg_errno = 0;
7721 return key_sendup_mbuf(so, m, KEY_SENDUP_ALL);
7722 } else {
7723 /* send packet as is */
7724
7725 m_adj(m, PFKEY_ALIGN8(sizeof(struct sadb_msg)));
7726
7727 /* TODO: if sadb_msg_seq is specified, send to specific pid */
7728 return key_sendup_mbuf(so, m, KEY_SENDUP_ALL);
7729 }
7730 }
7731
7732 static int (*key_api_typesw[]) (struct socket *, struct mbuf *,
7733 const struct sadb_msghdr *) = {
7734 NULL, /* SADB_RESERVED */
7735 key_api_getspi, /* SADB_GETSPI */
7736 key_api_update, /* SADB_UPDATE */
7737 key_api_add, /* SADB_ADD */
7738 key_api_delete, /* SADB_DELETE */
7739 key_api_get, /* SADB_GET */
7740 key_api_acquire, /* SADB_ACQUIRE */
7741 key_api_register, /* SADB_REGISTER */
7742 NULL, /* SADB_EXPIRE */
7743 key_api_flush, /* SADB_FLUSH */
7744 key_api_dump, /* SADB_DUMP */
7745 key_api_promisc, /* SADB_X_PROMISC */
7746 NULL, /* SADB_X_PCHANGE */
7747 key_api_spdadd, /* SADB_X_SPDUPDATE */
7748 key_api_spdadd, /* SADB_X_SPDADD */
7749 key_api_spddelete, /* SADB_X_SPDDELETE */
7750 key_api_spdget, /* SADB_X_SPDGET */
7751 NULL, /* SADB_X_SPDACQUIRE */
7752 key_api_spddump, /* SADB_X_SPDDUMP */
7753 key_api_spdflush, /* SADB_X_SPDFLUSH */
7754 key_api_spdadd, /* SADB_X_SPDSETIDX */
7755 NULL, /* SADB_X_SPDEXPIRE */
7756 key_api_spddelete2, /* SADB_X_SPDDELETE2 */
7757 key_api_nat_map, /* SADB_X_NAT_T_NEW_MAPPING */
7758 };
7759
7760 /*
7761 * parse sadb_msg buffer to process PFKEYv2,
7762 * and create a data to response if needed.
7763 * I think to be dealed with mbuf directly.
7764 * IN:
7765 * msgp : pointer to pointer to a received buffer pulluped.
7766 * This is rewrited to response.
7767 * so : pointer to socket.
7768 * OUT:
7769 * length for buffer to send to user process.
7770 */
7771 int
7772 key_parse(struct mbuf *m, struct socket *so)
7773 {
7774 struct sadb_msg *msg;
7775 struct sadb_msghdr mh;
7776 u_int orglen;
7777 int error;
7778
7779 KASSERT(m != NULL);
7780 KASSERT(so != NULL);
7781
7782 #if 0 /*kdebug_sadb assumes msg in linear buffer*/
7783 if (KEYDEBUG_ON(KEYDEBUG_KEY_DUMP)) {
7784 kdebug_sadb("passed sadb_msg", msg);
7785 }
7786 #endif
7787
7788 if (m->m_len < sizeof(struct sadb_msg)) {
7789 m = m_pullup(m, sizeof(struct sadb_msg));
7790 if (!m)
7791 return ENOBUFS;
7792 }
7793 msg = mtod(m, struct sadb_msg *);
7794 orglen = PFKEY_UNUNIT64(msg->sadb_msg_len);
7795
7796 if ((m->m_flags & M_PKTHDR) == 0 ||
7797 m->m_pkthdr.len != orglen) {
7798 IPSECLOG(LOG_DEBUG, "invalid message length.\n");
7799 PFKEY_STATINC(PFKEY_STAT_OUT_INVLEN);
7800 error = EINVAL;
7801 goto senderror;
7802 }
7803
7804 if (msg->sadb_msg_version != PF_KEY_V2) {
7805 IPSECLOG(LOG_DEBUG, "PF_KEY version %u is mismatched.\n",
7806 msg->sadb_msg_version);
7807 PFKEY_STATINC(PFKEY_STAT_OUT_INVVER);
7808 error = EINVAL;
7809 goto senderror;
7810 }
7811
7812 if (msg->sadb_msg_type > SADB_MAX) {
7813 IPSECLOG(LOG_DEBUG, "invalid type %u is passed.\n",
7814 msg->sadb_msg_type);
7815 PFKEY_STATINC(PFKEY_STAT_OUT_INVMSGTYPE);
7816 error = EINVAL;
7817 goto senderror;
7818 }
7819
7820 /* for old-fashioned code - should be nuked */
7821 if (m->m_pkthdr.len > MCLBYTES) {
7822 m_freem(m);
7823 return ENOBUFS;
7824 }
7825 if (m->m_next) {
7826 struct mbuf *n;
7827
7828 n = key_alloc_mbuf_simple(m->m_pkthdr.len, M_WAITOK);
7829
7830 m_copydata(m, 0, m->m_pkthdr.len, mtod(n, void *));
7831 n->m_pkthdr.len = n->m_len = m->m_pkthdr.len;
7832 n->m_next = NULL;
7833 m_freem(m);
7834 m = n;
7835 }
7836
7837 /* align the mbuf chain so that extensions are in contiguous region. */
7838 error = key_align(m, &mh);
7839 if (error)
7840 return error;
7841
7842 if (m->m_next) { /*XXX*/
7843 m_freem(m);
7844 return ENOBUFS;
7845 }
7846
7847 msg = mh.msg;
7848
7849 /* check SA type */
7850 switch (msg->sadb_msg_satype) {
7851 case SADB_SATYPE_UNSPEC:
7852 switch (msg->sadb_msg_type) {
7853 case SADB_GETSPI:
7854 case SADB_UPDATE:
7855 case SADB_ADD:
7856 case SADB_DELETE:
7857 case SADB_GET:
7858 case SADB_ACQUIRE:
7859 case SADB_EXPIRE:
7860 IPSECLOG(LOG_DEBUG,
7861 "must specify satype when msg type=%u.\n",
7862 msg->sadb_msg_type);
7863 PFKEY_STATINC(PFKEY_STAT_OUT_INVSATYPE);
7864 error = EINVAL;
7865 goto senderror;
7866 }
7867 break;
7868 case SADB_SATYPE_AH:
7869 case SADB_SATYPE_ESP:
7870 case SADB_X_SATYPE_IPCOMP:
7871 case SADB_X_SATYPE_TCPSIGNATURE:
7872 switch (msg->sadb_msg_type) {
7873 case SADB_X_SPDADD:
7874 case SADB_X_SPDDELETE:
7875 case SADB_X_SPDGET:
7876 case SADB_X_SPDDUMP:
7877 case SADB_X_SPDFLUSH:
7878 case SADB_X_SPDSETIDX:
7879 case SADB_X_SPDUPDATE:
7880 case SADB_X_SPDDELETE2:
7881 IPSECLOG(LOG_DEBUG, "illegal satype=%u\n",
7882 msg->sadb_msg_type);
7883 PFKEY_STATINC(PFKEY_STAT_OUT_INVSATYPE);
7884 error = EINVAL;
7885 goto senderror;
7886 }
7887 break;
7888 case SADB_SATYPE_RSVP:
7889 case SADB_SATYPE_OSPFV2:
7890 case SADB_SATYPE_RIPV2:
7891 case SADB_SATYPE_MIP:
7892 IPSECLOG(LOG_DEBUG, "type %u isn't supported.\n",
7893 msg->sadb_msg_satype);
7894 PFKEY_STATINC(PFKEY_STAT_OUT_INVSATYPE);
7895 error = EOPNOTSUPP;
7896 goto senderror;
7897 case 1: /* XXX: What does it do? */
7898 if (msg->sadb_msg_type == SADB_X_PROMISC)
7899 break;
7900 /*FALLTHROUGH*/
7901 default:
7902 IPSECLOG(LOG_DEBUG, "invalid type %u is passed.\n",
7903 msg->sadb_msg_satype);
7904 PFKEY_STATINC(PFKEY_STAT_OUT_INVSATYPE);
7905 error = EINVAL;
7906 goto senderror;
7907 }
7908
7909 /* check field of upper layer protocol and address family */
7910 if (mh.ext[SADB_EXT_ADDRESS_SRC] != NULL &&
7911 mh.ext[SADB_EXT_ADDRESS_DST] != NULL) {
7912 const struct sadb_address *src0, *dst0;
7913 const struct sockaddr *sa0, *da0;
7914 u_int plen;
7915
7916 src0 = mh.ext[SADB_EXT_ADDRESS_SRC];
7917 dst0 = mh.ext[SADB_EXT_ADDRESS_DST];
7918 sa0 = key_msghdr_get_sockaddr(&mh, SADB_EXT_ADDRESS_SRC);
7919 da0 = key_msghdr_get_sockaddr(&mh, SADB_EXT_ADDRESS_DST);
7920
7921 /* check upper layer protocol */
7922 if (src0->sadb_address_proto != dst0->sadb_address_proto) {
7923 IPSECLOG(LOG_DEBUG,
7924 "upper layer protocol mismatched src %u, dst %u.\n",
7925 src0->sadb_address_proto, dst0->sadb_address_proto);
7926
7927 goto invaddr;
7928 }
7929
7930 /* check family */
7931 if (sa0->sa_family != da0->sa_family) {
7932 IPSECLOG(LOG_DEBUG,
7933 "address family mismatched src %u, dst %u.\n",
7934 sa0->sa_family, da0->sa_family);
7935 goto invaddr;
7936 }
7937 if (sa0->sa_len != da0->sa_len) {
7938 IPSECLOG(LOG_DEBUG,
7939 "address size mismatched src %u, dst %u.\n",
7940 sa0->sa_len, da0->sa_len);
7941 goto invaddr;
7942 }
7943
7944 switch (sa0->sa_family) {
7945 case AF_INET:
7946 if (sa0->sa_len != sizeof(struct sockaddr_in)) {
7947 IPSECLOG(LOG_DEBUG,
7948 "address size mismatched %u != %zu.\n",
7949 sa0->sa_len, sizeof(struct sockaddr_in));
7950 goto invaddr;
7951 }
7952 break;
7953 case AF_INET6:
7954 if (sa0->sa_len != sizeof(struct sockaddr_in6)) {
7955 IPSECLOG(LOG_DEBUG,
7956 "address size mismatched %u != %zu.\n",
7957 sa0->sa_len, sizeof(struct sockaddr_in6));
7958 goto invaddr;
7959 }
7960 break;
7961 default:
7962 IPSECLOG(LOG_DEBUG, "unsupported address family %u.\n",
7963 sa0->sa_family);
7964 error = EAFNOSUPPORT;
7965 goto senderror;
7966 }
7967 plen = key_sabits(sa0);
7968
7969 /* check max prefix length */
7970 if (src0->sadb_address_prefixlen > plen ||
7971 dst0->sadb_address_prefixlen > plen) {
7972 IPSECLOG(LOG_DEBUG, "illegal prefixlen.\n");
7973 goto invaddr;
7974 }
7975
7976 /*
7977 * prefixlen == 0 is valid because there can be a case when
7978 * all addresses are matched.
7979 */
7980 }
7981
7982 if (msg->sadb_msg_type >= __arraycount(key_api_typesw) ||
7983 key_api_typesw[msg->sadb_msg_type] == NULL) {
7984 PFKEY_STATINC(PFKEY_STAT_OUT_INVMSGTYPE);
7985 error = EINVAL;
7986 goto senderror;
7987 }
7988
7989 return (*key_api_typesw[msg->sadb_msg_type])(so, m, &mh);
7990
7991 invaddr:
7992 error = EINVAL;
7993 senderror:
7994 PFKEY_STATINC(PFKEY_STAT_OUT_INVADDR);
7995 return key_senderror(so, m, error);
7996 }
7997
7998 static int
7999 key_senderror(struct socket *so, struct mbuf *m, int code)
8000 {
8001 struct sadb_msg *msg;
8002
8003 KASSERT(m->m_len >= sizeof(struct sadb_msg));
8004
8005 if (so == NULL) {
8006 /*
8007 * This means the request comes from kernel.
8008 * As the request comes from kernel, it is unnecessary to
8009 * send message to userland. Just return errcode directly.
8010 */
8011 m_freem(m);
8012 return code;
8013 }
8014
8015 msg = mtod(m, struct sadb_msg *);
8016 msg->sadb_msg_errno = code;
8017 return key_sendup_mbuf(so, m, KEY_SENDUP_ONE);
8018 }
8019
8020 /*
8021 * set the pointer to each header into message buffer.
8022 * m will be freed on error.
8023 * XXX larger-than-MCLBYTES extension?
8024 */
8025 static int
8026 key_align(struct mbuf *m, struct sadb_msghdr *mhp)
8027 {
8028 struct mbuf *n;
8029 struct sadb_ext *ext;
8030 size_t off, end;
8031 int extlen;
8032 int toff;
8033
8034 KASSERT(m != NULL);
8035 KASSERT(mhp != NULL);
8036 KASSERT(m->m_len >= sizeof(struct sadb_msg));
8037
8038 /* initialize */
8039 memset(mhp, 0, sizeof(*mhp));
8040
8041 mhp->msg = mtod(m, struct sadb_msg *);
8042 mhp->ext[0] = mhp->msg; /*XXX backward compat */
8043
8044 end = PFKEY_UNUNIT64(mhp->msg->sadb_msg_len);
8045 extlen = end; /*just in case extlen is not updated*/
8046 for (off = sizeof(struct sadb_msg); off < end; off += extlen) {
8047 n = m_pulldown(m, off, sizeof(struct sadb_ext), &toff);
8048 if (!n) {
8049 /* m is already freed */
8050 return ENOBUFS;
8051 }
8052 ext = (struct sadb_ext *)(mtod(n, char *) + toff);
8053
8054 /* set pointer */
8055 switch (ext->sadb_ext_type) {
8056 case SADB_EXT_SA:
8057 case SADB_EXT_ADDRESS_SRC:
8058 case SADB_EXT_ADDRESS_DST:
8059 case SADB_EXT_ADDRESS_PROXY:
8060 case SADB_EXT_LIFETIME_CURRENT:
8061 case SADB_EXT_LIFETIME_HARD:
8062 case SADB_EXT_LIFETIME_SOFT:
8063 case SADB_EXT_KEY_AUTH:
8064 case SADB_EXT_KEY_ENCRYPT:
8065 case SADB_EXT_IDENTITY_SRC:
8066 case SADB_EXT_IDENTITY_DST:
8067 case SADB_EXT_SENSITIVITY:
8068 case SADB_EXT_PROPOSAL:
8069 case SADB_EXT_SUPPORTED_AUTH:
8070 case SADB_EXT_SUPPORTED_ENCRYPT:
8071 case SADB_EXT_SPIRANGE:
8072 case SADB_X_EXT_POLICY:
8073 case SADB_X_EXT_SA2:
8074 case SADB_X_EXT_NAT_T_TYPE:
8075 case SADB_X_EXT_NAT_T_SPORT:
8076 case SADB_X_EXT_NAT_T_DPORT:
8077 case SADB_X_EXT_NAT_T_OAI:
8078 case SADB_X_EXT_NAT_T_OAR:
8079 case SADB_X_EXT_NAT_T_FRAG:
8080 /* duplicate check */
8081 /*
8082 * XXX Are there duplication payloads of either
8083 * KEY_AUTH or KEY_ENCRYPT ?
8084 */
8085 if (mhp->ext[ext->sadb_ext_type] != NULL) {
8086 IPSECLOG(LOG_DEBUG,
8087 "duplicate ext_type %u is passed.\n",
8088 ext->sadb_ext_type);
8089 m_freem(m);
8090 PFKEY_STATINC(PFKEY_STAT_OUT_DUPEXT);
8091 return EINVAL;
8092 }
8093 break;
8094 default:
8095 IPSECLOG(LOG_DEBUG, "invalid ext_type %u is passed.\n",
8096 ext->sadb_ext_type);
8097 m_freem(m);
8098 PFKEY_STATINC(PFKEY_STAT_OUT_INVEXTTYPE);
8099 return EINVAL;
8100 }
8101
8102 extlen = PFKEY_UNUNIT64(ext->sadb_ext_len);
8103
8104 if (key_validate_ext(ext, extlen)) {
8105 m_freem(m);
8106 PFKEY_STATINC(PFKEY_STAT_OUT_INVLEN);
8107 return EINVAL;
8108 }
8109
8110 n = m_pulldown(m, off, extlen, &toff);
8111 if (!n) {
8112 /* m is already freed */
8113 return ENOBUFS;
8114 }
8115 ext = (struct sadb_ext *)(mtod(n, char *) + toff);
8116
8117 mhp->ext[ext->sadb_ext_type] = ext;
8118 mhp->extoff[ext->sadb_ext_type] = off;
8119 mhp->extlen[ext->sadb_ext_type] = extlen;
8120 }
8121
8122 if (off != end) {
8123 m_freem(m);
8124 PFKEY_STATINC(PFKEY_STAT_OUT_INVLEN);
8125 return EINVAL;
8126 }
8127
8128 return 0;
8129 }
8130
8131 static int
8132 key_validate_ext(const struct sadb_ext *ext, int len)
8133 {
8134 const struct sockaddr *sa;
8135 enum { NONE, ADDR } checktype = NONE;
8136 int baselen = 0;
8137 const int sal = offsetof(struct sockaddr, sa_len) + sizeof(sa->sa_len);
8138
8139 if (len != PFKEY_UNUNIT64(ext->sadb_ext_len))
8140 return EINVAL;
8141
8142 /* if it does not match minimum/maximum length, bail */
8143 if (ext->sadb_ext_type >= __arraycount(minsize) ||
8144 ext->sadb_ext_type >= __arraycount(maxsize))
8145 return EINVAL;
8146 if (!minsize[ext->sadb_ext_type] || len < minsize[ext->sadb_ext_type])
8147 return EINVAL;
8148 if (maxsize[ext->sadb_ext_type] && len > maxsize[ext->sadb_ext_type])
8149 return EINVAL;
8150
8151 /* more checks based on sadb_ext_type XXX need more */
8152 switch (ext->sadb_ext_type) {
8153 case SADB_EXT_ADDRESS_SRC:
8154 case SADB_EXT_ADDRESS_DST:
8155 case SADB_EXT_ADDRESS_PROXY:
8156 baselen = PFKEY_ALIGN8(sizeof(struct sadb_address));
8157 checktype = ADDR;
8158 break;
8159 case SADB_EXT_IDENTITY_SRC:
8160 case SADB_EXT_IDENTITY_DST:
8161 if (((const struct sadb_ident *)ext)->sadb_ident_type ==
8162 SADB_X_IDENTTYPE_ADDR) {
8163 baselen = PFKEY_ALIGN8(sizeof(struct sadb_ident));
8164 checktype = ADDR;
8165 } else
8166 checktype = NONE;
8167 break;
8168 default:
8169 checktype = NONE;
8170 break;
8171 }
8172
8173 switch (checktype) {
8174 case NONE:
8175 break;
8176 case ADDR:
8177 sa = (const struct sockaddr *)(((const u_int8_t*)ext)+baselen);
8178 if (len < baselen + sal)
8179 return EINVAL;
8180 if (baselen + PFKEY_ALIGN8(sa->sa_len) != len)
8181 return EINVAL;
8182 break;
8183 }
8184
8185 return 0;
8186 }
8187
8188 static int
8189 key_do_init(void)
8190 {
8191 int i, error;
8192
8193 mutex_init(&key_misc.lock, MUTEX_DEFAULT, IPL_NONE);
8194
8195 mutex_init(&key_spd.lock, MUTEX_DEFAULT, IPL_NONE);
8196 cv_init(&key_spd.cv_lc, "key_sp_lc");
8197 key_spd.psz = pserialize_create();
8198 cv_init(&key_spd.cv_psz, "key_sp_psz");
8199 key_spd.psz_performing = false;
8200
8201 mutex_init(&key_sad.lock, MUTEX_DEFAULT, IPL_NONE);
8202 cv_init(&key_sad.cv_lc, "key_sa_lc");
8203 key_sad.psz = pserialize_create();
8204 cv_init(&key_sad.cv_psz, "key_sa_psz");
8205 key_sad.psz_performing = false;
8206
8207 pfkeystat_percpu = percpu_alloc(sizeof(uint64_t) * PFKEY_NSTATS);
8208
8209 callout_init(&key_timehandler_ch, CALLOUT_MPSAFE);
8210 error = workqueue_create(&key_timehandler_wq, "key_timehandler",
8211 key_timehandler_work, NULL, PRI_SOFTNET, IPL_SOFTNET, WQ_MPSAFE);
8212 if (error != 0)
8213 panic("%s: workqueue_create failed (%d)\n", __func__, error);
8214
8215 for (i = 0; i < IPSEC_DIR_MAX; i++) {
8216 PSLIST_INIT(&key_spd.splist[i]);
8217 }
8218
8219 PSLIST_INIT(&key_spd.socksplist);
8220
8221 key_sad.sahlists = hashinit(SAHHASH_NHASH, HASH_PSLIST, true,
8222 &key_sad.sahlistmask);
8223 key_sad.savlut = hashinit(SAVLUT_NHASH, HASH_PSLIST, true,
8224 &key_sad.savlutmask);
8225
8226 for (i = 0; i <= SADB_SATYPE_MAX; i++) {
8227 LIST_INIT(&key_misc.reglist[i]);
8228 }
8229
8230 #ifndef IPSEC_NONBLOCK_ACQUIRE
8231 LIST_INIT(&key_misc.acqlist);
8232 #endif
8233 #ifdef notyet
8234 LIST_INIT(&key_misc.spacqlist);
8235 #endif
8236
8237 /* system default */
8238 ip4_def_policy.policy = IPSEC_POLICY_NONE;
8239 ip4_def_policy.state = IPSEC_SPSTATE_ALIVE;
8240 localcount_init(&ip4_def_policy.localcount);
8241
8242 #ifdef INET6
8243 ip6_def_policy.policy = IPSEC_POLICY_NONE;
8244 ip6_def_policy.state = IPSEC_SPSTATE_ALIVE;
8245 localcount_init(&ip6_def_policy.localcount);
8246 #endif
8247
8248 callout_reset(&key_timehandler_ch, hz, key_timehandler, NULL);
8249
8250 /* initialize key statistics */
8251 keystat.getspi_count = 1;
8252
8253 aprint_verbose("IPsec: Initialized Security Association Processing.\n");
8254
8255 return (0);
8256 }
8257
8258 void
8259 key_init(void)
8260 {
8261 static ONCE_DECL(key_init_once);
8262
8263 sysctl_net_keyv2_setup(NULL);
8264 sysctl_net_key_compat_setup(NULL);
8265
8266 RUN_ONCE(&key_init_once, key_do_init);
8267
8268 key_init_so();
8269 }
8270
8271 /*
8272 * XXX: maybe This function is called after INBOUND IPsec processing.
8273 *
8274 * Special check for tunnel-mode packets.
8275 * We must make some checks for consistency between inner and outer IP header.
8276 *
8277 * xxx more checks to be provided
8278 */
8279 int
8280 key_checktunnelsanity(
8281 struct secasvar *sav,
8282 u_int family,
8283 void *src,
8284 void *dst
8285 )
8286 {
8287
8288 /* XXX: check inner IP header */
8289
8290 return 1;
8291 }
8292
8293 #if 0
8294 #define hostnamelen strlen(hostname)
8295
8296 /*
8297 * Get FQDN for the host.
8298 * If the administrator configured hostname (by hostname(1)) without
8299 * domain name, returns nothing.
8300 */
8301 static const char *
8302 key_getfqdn(void)
8303 {
8304 int i;
8305 int hasdot;
8306 static char fqdn[MAXHOSTNAMELEN + 1];
8307
8308 if (!hostnamelen)
8309 return NULL;
8310
8311 /* check if it comes with domain name. */
8312 hasdot = 0;
8313 for (i = 0; i < hostnamelen; i++) {
8314 if (hostname[i] == '.')
8315 hasdot++;
8316 }
8317 if (!hasdot)
8318 return NULL;
8319
8320 /* NOTE: hostname may not be NUL-terminated. */
8321 memset(fqdn, 0, sizeof(fqdn));
8322 memcpy(fqdn, hostname, hostnamelen);
8323 fqdn[hostnamelen] = '\0';
8324 return fqdn;
8325 }
8326
8327 /*
8328 * get username@FQDN for the host/user.
8329 */
8330 static const char *
8331 key_getuserfqdn(void)
8332 {
8333 const char *host;
8334 static char userfqdn[MAXHOSTNAMELEN + MAXLOGNAME + 2];
8335 struct proc *p = curproc;
8336 char *q;
8337
8338 if (!p || !p->p_pgrp || !p->p_pgrp->pg_session)
8339 return NULL;
8340 if (!(host = key_getfqdn()))
8341 return NULL;
8342
8343 /* NOTE: s_login may not be-NUL terminated. */
8344 memset(userfqdn, 0, sizeof(userfqdn));
8345 memcpy(userfqdn, Mp->p_pgrp->pg_session->s_login, AXLOGNAME);
8346 userfqdn[MAXLOGNAME] = '\0'; /* safeguard */
8347 q = userfqdn + strlen(userfqdn);
8348 *q++ = '@';
8349 memcpy(q, host, strlen(host));
8350 q += strlen(host);
8351 *q++ = '\0';
8352
8353 return userfqdn;
8354 }
8355 #endif
8356
8357 /* record data transfer on SA, and update timestamps */
8358 void
8359 key_sa_recordxfer(struct secasvar *sav, struct mbuf *m)
8360 {
8361 lifetime_counters_t *counters;
8362
8363 KASSERT(sav != NULL);
8364 KASSERT(sav->lft_c != NULL);
8365 KASSERT(m != NULL);
8366
8367 counters = percpu_getref(sav->lft_c_counters_percpu);
8368
8369 /*
8370 * XXX Currently, there is a difference of bytes size
8371 * between inbound and outbound processing.
8372 */
8373 (*counters)[LIFETIME_COUNTER_BYTES] += m->m_pkthdr.len;
8374 /* to check bytes lifetime is done in key_timehandler(). */
8375
8376 /*
8377 * We use the number of packets as the unit of
8378 * sadb_lifetime_allocations. We increment the variable
8379 * whenever {esp,ah}_{in,out}put is called.
8380 */
8381 (*counters)[LIFETIME_COUNTER_ALLOCATIONS]++;
8382 /* XXX check for expires? */
8383
8384 percpu_putref(sav->lft_c_counters_percpu);
8385
8386 /*
8387 * NOTE: We record CURRENT sadb_lifetime_usetime by using wall clock,
8388 * in seconds. HARD and SOFT lifetime are measured by the time
8389 * difference (again in seconds) from sadb_lifetime_usetime.
8390 *
8391 * usetime
8392 * v expire expire
8393 * -----+-----+--------+---> t
8394 * <--------------> HARD
8395 * <-----> SOFT
8396 */
8397 sav->lft_c->sadb_lifetime_usetime = time_uptime;
8398 /* XXX check for expires? */
8399
8400 return;
8401 }
8402
8403 /* dumb version */
8404 void
8405 key_sa_routechange(struct sockaddr *dst)
8406 {
8407 struct secashead *sah;
8408 int s;
8409
8410 s = pserialize_read_enter();
8411 SAHLIST_READER_FOREACH(sah) {
8412 struct route *ro;
8413 const struct sockaddr *sa;
8414
8415 key_sah_ref(sah);
8416 pserialize_read_exit(s);
8417
8418 ro = &sah->sa_route;
8419 sa = rtcache_getdst(ro);
8420 if (sa != NULL && dst->sa_len == sa->sa_len &&
8421 memcmp(dst, sa, dst->sa_len) == 0)
8422 rtcache_free(ro);
8423
8424 s = pserialize_read_enter();
8425 key_sah_unref(sah);
8426 }
8427 pserialize_read_exit(s);
8428
8429 return;
8430 }
8431
8432 static void
8433 key_sa_chgstate(struct secasvar *sav, u_int8_t state)
8434 {
8435 struct secasvar *_sav;
8436
8437 ASSERT_SLEEPABLE();
8438 KASSERT(mutex_owned(&key_sad.lock));
8439
8440 if (sav->state == state)
8441 return;
8442
8443 key_unlink_sav(sav);
8444 localcount_fini(&sav->localcount);
8445 SAVLIST_ENTRY_DESTROY(sav);
8446 key_init_sav(sav);
8447
8448 sav->state = state;
8449 if (!SADB_SASTATE_USABLE_P(sav)) {
8450 /* We don't need to care about the order */
8451 SAVLIST_WRITER_INSERT_HEAD(sav->sah, state, sav);
8452 return;
8453 }
8454 /*
8455 * Sort the list by lft_c->sadb_lifetime_addtime
8456 * in ascending order.
8457 */
8458 SAVLIST_WRITER_FOREACH(_sav, sav->sah, state) {
8459 if (_sav->lft_c->sadb_lifetime_addtime >
8460 sav->lft_c->sadb_lifetime_addtime) {
8461 SAVLIST_WRITER_INSERT_BEFORE(_sav, sav);
8462 break;
8463 }
8464 }
8465 if (_sav == NULL) {
8466 SAVLIST_WRITER_INSERT_TAIL(sav->sah, state, sav);
8467 }
8468
8469 SAVLUT_WRITER_INSERT_HEAD(sav);
8470
8471 key_validate_savlist(sav->sah, state);
8472 }
8473
8474 /* XXX too much? */
8475 static struct mbuf *
8476 key_alloc_mbuf(int l, int mflag)
8477 {
8478 struct mbuf *m = NULL, *n;
8479 int len, t;
8480
8481 KASSERT(mflag == M_NOWAIT || (mflag == M_WAITOK && !cpu_softintr_p()));
8482
8483 len = l;
8484 while (len > 0) {
8485 MGET(n, mflag, MT_DATA);
8486 if (n && len > MLEN) {
8487 MCLGET(n, mflag);
8488 if ((n->m_flags & M_EXT) == 0) {
8489 m_freem(n);
8490 n = NULL;
8491 }
8492 }
8493 if (!n) {
8494 m_freem(m);
8495 return NULL;
8496 }
8497
8498 n->m_next = NULL;
8499 n->m_len = 0;
8500 n->m_len = M_TRAILINGSPACE(n);
8501 /* use the bottom of mbuf, hoping we can prepend afterwards */
8502 if (n->m_len > len) {
8503 t = (n->m_len - len) & ~(sizeof(long) - 1);
8504 n->m_data += t;
8505 n->m_len = len;
8506 }
8507
8508 len -= n->m_len;
8509
8510 if (m)
8511 m_cat(m, n);
8512 else
8513 m = n;
8514 }
8515
8516 return m;
8517 }
8518
8519 static struct mbuf *
8520 key_setdump(u_int8_t req_satype, int *errorp, uint32_t pid)
8521 {
8522 struct secashead *sah;
8523 struct secasvar *sav;
8524 u_int16_t proto;
8525 u_int8_t satype;
8526 u_int8_t state;
8527 int cnt;
8528 struct mbuf *m, *n;
8529
8530 KASSERT(mutex_owned(&key_sad.lock));
8531
8532 /* map satype to proto */
8533 proto = key_satype2proto(req_satype);
8534 if (proto == 0) {
8535 *errorp = EINVAL;
8536 return (NULL);
8537 }
8538
8539 /* count sav entries to be sent to the userland. */
8540 cnt = 0;
8541 SAHLIST_WRITER_FOREACH(sah) {
8542 if (req_satype != SADB_SATYPE_UNSPEC &&
8543 proto != sah->saidx.proto)
8544 continue;
8545
8546 SASTATE_ANY_FOREACH(state) {
8547 SAVLIST_WRITER_FOREACH(sav, sah, state) {
8548 cnt++;
8549 }
8550 }
8551 }
8552
8553 if (cnt == 0) {
8554 *errorp = ENOENT;
8555 return (NULL);
8556 }
8557
8558 /* send this to the userland, one at a time. */
8559 m = NULL;
8560 SAHLIST_WRITER_FOREACH(sah) {
8561 if (req_satype != SADB_SATYPE_UNSPEC &&
8562 proto != sah->saidx.proto)
8563 continue;
8564
8565 /* map proto to satype */
8566 satype = key_proto2satype(sah->saidx.proto);
8567 if (satype == 0) {
8568 m_freem(m);
8569 *errorp = EINVAL;
8570 return (NULL);
8571 }
8572
8573 SASTATE_ANY_FOREACH(state) {
8574 SAVLIST_WRITER_FOREACH(sav, sah, state) {
8575 n = key_setdumpsa(sav, SADB_DUMP, satype,
8576 --cnt, pid);
8577 if (!m)
8578 m = n;
8579 else
8580 m_cat(m, n);
8581 }
8582 }
8583 }
8584
8585 if (!m) {
8586 *errorp = EINVAL;
8587 return (NULL);
8588 }
8589
8590 if ((m->m_flags & M_PKTHDR) != 0) {
8591 m->m_pkthdr.len = 0;
8592 for (n = m; n; n = n->m_next)
8593 m->m_pkthdr.len += n->m_len;
8594 }
8595
8596 *errorp = 0;
8597 return (m);
8598 }
8599
8600 static struct mbuf *
8601 key_setspddump(int *errorp, pid_t pid)
8602 {
8603 struct secpolicy *sp;
8604 int cnt;
8605 u_int dir;
8606 struct mbuf *m, *n;
8607
8608 KASSERT(mutex_owned(&key_spd.lock));
8609
8610 /* search SPD entry and get buffer size. */
8611 cnt = 0;
8612 for (dir = 0; dir < IPSEC_DIR_MAX; dir++) {
8613 SPLIST_WRITER_FOREACH(sp, dir) {
8614 cnt++;
8615 }
8616 }
8617
8618 if (cnt == 0) {
8619 *errorp = ENOENT;
8620 return (NULL);
8621 }
8622
8623 m = NULL;
8624 for (dir = 0; dir < IPSEC_DIR_MAX; dir++) {
8625 SPLIST_WRITER_FOREACH(sp, dir) {
8626 --cnt;
8627 n = key_setdumpsp(sp, SADB_X_SPDDUMP, cnt, pid);
8628
8629 if (!m)
8630 m = n;
8631 else {
8632 m->m_pkthdr.len += n->m_pkthdr.len;
8633 m_cat(m, n);
8634 }
8635 }
8636 }
8637
8638 *errorp = 0;
8639 return (m);
8640 }
8641
8642 int
8643 key_get_used(void) {
8644 return !SPLIST_READER_EMPTY(IPSEC_DIR_INBOUND) ||
8645 !SPLIST_READER_EMPTY(IPSEC_DIR_OUTBOUND) ||
8646 !SOCKSPLIST_READER_EMPTY();
8647 }
8648
8649 void
8650 key_update_used(void)
8651 {
8652 switch (ipsec_enabled) {
8653 default:
8654 case 0:
8655 #ifdef notyet
8656 /* XXX: racy */
8657 ipsec_used = 0;
8658 #endif
8659 break;
8660 case 1:
8661 #ifndef notyet
8662 /* XXX: racy */
8663 if (!ipsec_used)
8664 #endif
8665 ipsec_used = key_get_used();
8666 break;
8667 case 2:
8668 ipsec_used = 1;
8669 break;
8670 }
8671 }
8672
8673 static inline void
8674 key_savlut_writer_insert_head(struct secasvar *sav)
8675 {
8676 uint32_t hash_key;
8677 uint32_t hash;
8678
8679 KASSERT(mutex_owned(&key_sad.lock));
8680 KASSERT(!sav->savlut_added);
8681
8682 if (sav->sah->saidx.proto == IPPROTO_IPCOMP)
8683 hash_key = sav->alg_comp;
8684 else
8685 hash_key = sav->spi;
8686
8687 hash = key_savluthash(&sav->sah->saidx.dst.sa,
8688 sav->sah->saidx.proto, hash_key, key_sad.savlutmask);
8689
8690 PSLIST_WRITER_INSERT_HEAD(&key_sad.savlut[hash], sav,
8691 pslist_entry_savlut);
8692 sav->savlut_added = true;
8693 }
8694
8695 /*
8696 * Calculate hash using protocol, source address,
8697 * and destination address included in saidx.
8698 */
8699 static inline uint32_t
8700 key_saidxhash(const struct secasindex *saidx, u_long mask)
8701 {
8702 uint32_t hash32;
8703 const struct sockaddr_in *sin;
8704 const struct sockaddr_in6 *sin6;
8705
8706 hash32 = saidx->proto;
8707
8708 switch (saidx->src.sa.sa_family) {
8709 case AF_INET:
8710 sin = &saidx->src.sin;
8711 hash32 = hash32_buf(&sin->sin_addr,
8712 sizeof(sin->sin_addr), hash32);
8713 sin = &saidx->dst.sin;
8714 hash32 = hash32_buf(&sin->sin_addr,
8715 sizeof(sin->sin_addr), hash32 << 1);
8716 break;
8717 case AF_INET6:
8718 sin6 = &saidx->src.sin6;
8719 hash32 = hash32_buf(&sin6->sin6_addr,
8720 sizeof(sin6->sin6_addr), hash32);
8721 sin6 = &saidx->dst.sin6;
8722 hash32 = hash32_buf(&sin6->sin6_addr,
8723 sizeof(sin6->sin6_addr), hash32 << 1);
8724 break;
8725 default:
8726 hash32 = 0;
8727 break;
8728 }
8729
8730 return hash32 & mask;
8731 }
8732
8733 /*
8734 * Calculate hash using destination address, protocol,
8735 * and spi. Those parameter depend on the search of
8736 * key_lookup_sa().
8737 */
8738 static uint32_t
8739 key_savluthash(const struct sockaddr *dst, uint32_t proto,
8740 uint32_t spi, u_long mask)
8741 {
8742 uint32_t hash32;
8743 const struct sockaddr_in *sin;
8744 const struct sockaddr_in6 *sin6;
8745
8746 hash32 = hash32_buf(&proto, sizeof(proto), spi);
8747
8748 switch(dst->sa_family) {
8749 case AF_INET:
8750 sin = satocsin(dst);
8751 hash32 = hash32_buf(&sin->sin_addr,
8752 sizeof(sin->sin_addr), hash32);
8753 break;
8754 case AF_INET6:
8755 sin6 = satocsin6(dst);
8756 hash32 = hash32_buf(&sin6->sin6_addr,
8757 sizeof(sin6->sin6_addr), hash32);
8758 break;
8759 default:
8760 hash32 = 0;
8761 }
8762
8763 return hash32 & mask;
8764 }
8765
8766 static int
8767 sysctl_net_key_dumpsa(SYSCTLFN_ARGS)
8768 {
8769 struct mbuf *m, *n;
8770 int err2 = 0;
8771 char *p, *ep;
8772 size_t len;
8773 int error;
8774
8775 if (newp)
8776 return (EPERM);
8777 if (namelen != 1)
8778 return (EINVAL);
8779
8780 mutex_enter(&key_sad.lock);
8781 m = key_setdump(name[0], &error, l->l_proc->p_pid);
8782 mutex_exit(&key_sad.lock);
8783 if (!m)
8784 return (error);
8785 if (!oldp)
8786 *oldlenp = m->m_pkthdr.len;
8787 else {
8788 p = oldp;
8789 if (*oldlenp < m->m_pkthdr.len) {
8790 err2 = ENOMEM;
8791 ep = p + *oldlenp;
8792 } else {
8793 *oldlenp = m->m_pkthdr.len;
8794 ep = p + m->m_pkthdr.len;
8795 }
8796 for (n = m; n; n = n->m_next) {
8797 len = (ep - p < n->m_len) ?
8798 ep - p : n->m_len;
8799 error = copyout(mtod(n, const void *), p, len);
8800 p += len;
8801 if (error)
8802 break;
8803 }
8804 if (error == 0)
8805 error = err2;
8806 }
8807 m_freem(m);
8808
8809 return (error);
8810 }
8811
8812 static int
8813 sysctl_net_key_dumpsp(SYSCTLFN_ARGS)
8814 {
8815 struct mbuf *m, *n;
8816 int err2 = 0;
8817 char *p, *ep;
8818 size_t len;
8819 int error;
8820
8821 if (newp)
8822 return (EPERM);
8823 if (namelen != 0)
8824 return (EINVAL);
8825
8826 mutex_enter(&key_spd.lock);
8827 m = key_setspddump(&error, l->l_proc->p_pid);
8828 mutex_exit(&key_spd.lock);
8829 if (!m)
8830 return (error);
8831 if (!oldp)
8832 *oldlenp = m->m_pkthdr.len;
8833 else {
8834 p = oldp;
8835 if (*oldlenp < m->m_pkthdr.len) {
8836 err2 = ENOMEM;
8837 ep = p + *oldlenp;
8838 } else {
8839 *oldlenp = m->m_pkthdr.len;
8840 ep = p + m->m_pkthdr.len;
8841 }
8842 for (n = m; n; n = n->m_next) {
8843 len = (ep - p < n->m_len) ? ep - p : n->m_len;
8844 error = copyout(mtod(n, const void *), p, len);
8845 p += len;
8846 if (error)
8847 break;
8848 }
8849 if (error == 0)
8850 error = err2;
8851 }
8852 m_freem(m);
8853
8854 return (error);
8855 }
8856
8857 /*
8858 * Create sysctl tree for native IPSEC key knobs, originally
8859 * under name "net.keyv2" * with MIB number { CTL_NET, PF_KEY_V2. }.
8860 * However, sysctl(8) never checked for nodes under { CTL_NET, PF_KEY_V2 };
8861 * and in any case the part of our sysctl namespace used for dumping the
8862 * SPD and SA database *HAS* to be compatible with the KAME sysctl
8863 * namespace, for API reasons.
8864 *
8865 * Pending a consensus on the right way to fix this, add a level of
8866 * indirection in how we number the `native' IPSEC key nodes;
8867 * and (as requested by Andrew Brown) move registration of the
8868 * KAME-compatible names to a separate function.
8869 */
8870 #if 0
8871 # define IPSEC_PFKEY PF_KEY_V2
8872 # define IPSEC_PFKEY_NAME "keyv2"
8873 #else
8874 # define IPSEC_PFKEY PF_KEY
8875 # define IPSEC_PFKEY_NAME "key"
8876 #endif
8877
8878 static int
8879 sysctl_net_key_stats(SYSCTLFN_ARGS)
8880 {
8881
8882 return (NETSTAT_SYSCTL(pfkeystat_percpu, PFKEY_NSTATS));
8883 }
8884
8885 static void
8886 sysctl_net_keyv2_setup(struct sysctllog **clog)
8887 {
8888
8889 sysctl_createv(clog, 0, NULL, NULL,
8890 CTLFLAG_PERMANENT,
8891 CTLTYPE_NODE, IPSEC_PFKEY_NAME, NULL,
8892 NULL, 0, NULL, 0,
8893 CTL_NET, IPSEC_PFKEY, CTL_EOL);
8894
8895 sysctl_createv(clog, 0, NULL, NULL,
8896 CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
8897 CTLTYPE_INT, "debug", NULL,
8898 NULL, 0, &key_debug_level, 0,
8899 CTL_NET, IPSEC_PFKEY, KEYCTL_DEBUG_LEVEL, CTL_EOL);
8900 sysctl_createv(clog, 0, NULL, NULL,
8901 CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
8902 CTLTYPE_INT, "spi_try", NULL,
8903 NULL, 0, &key_spi_trycnt, 0,
8904 CTL_NET, IPSEC_PFKEY, KEYCTL_SPI_TRY, CTL_EOL);
8905 sysctl_createv(clog, 0, NULL, NULL,
8906 CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
8907 CTLTYPE_INT, "spi_min_value", NULL,
8908 NULL, 0, &key_spi_minval, 0,
8909 CTL_NET, IPSEC_PFKEY, KEYCTL_SPI_MIN_VALUE, CTL_EOL);
8910 sysctl_createv(clog, 0, NULL, NULL,
8911 CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
8912 CTLTYPE_INT, "spi_max_value", NULL,
8913 NULL, 0, &key_spi_maxval, 0,
8914 CTL_NET, IPSEC_PFKEY, KEYCTL_SPI_MAX_VALUE, CTL_EOL);
8915 sysctl_createv(clog, 0, NULL, NULL,
8916 CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
8917 CTLTYPE_INT, "random_int", NULL,
8918 NULL, 0, &key_int_random, 0,
8919 CTL_NET, IPSEC_PFKEY, KEYCTL_RANDOM_INT, CTL_EOL);
8920 sysctl_createv(clog, 0, NULL, NULL,
8921 CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
8922 CTLTYPE_INT, "larval_lifetime", NULL,
8923 NULL, 0, &key_larval_lifetime, 0,
8924 CTL_NET, IPSEC_PFKEY, KEYCTL_LARVAL_LIFETIME, CTL_EOL);
8925 sysctl_createv(clog, 0, NULL, NULL,
8926 CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
8927 CTLTYPE_INT, "blockacq_count", NULL,
8928 NULL, 0, &key_blockacq_count, 0,
8929 CTL_NET, IPSEC_PFKEY, KEYCTL_BLOCKACQ_COUNT, CTL_EOL);
8930 sysctl_createv(clog, 0, NULL, NULL,
8931 CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
8932 CTLTYPE_INT, "blockacq_lifetime", NULL,
8933 NULL, 0, &key_blockacq_lifetime, 0,
8934 CTL_NET, IPSEC_PFKEY, KEYCTL_BLOCKACQ_LIFETIME, CTL_EOL);
8935 sysctl_createv(clog, 0, NULL, NULL,
8936 CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
8937 CTLTYPE_INT, "esp_keymin", NULL,
8938 NULL, 0, &ipsec_esp_keymin, 0,
8939 CTL_NET, IPSEC_PFKEY, KEYCTL_ESP_KEYMIN, CTL_EOL);
8940 sysctl_createv(clog, 0, NULL, NULL,
8941 CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
8942 CTLTYPE_INT, "prefered_oldsa", NULL,
8943 NULL, 0, &key_prefered_oldsa, 0,
8944 CTL_NET, PF_KEY, KEYCTL_PREFERED_OLDSA, CTL_EOL);
8945 sysctl_createv(clog, 0, NULL, NULL,
8946 CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
8947 CTLTYPE_INT, "esp_auth", NULL,
8948 NULL, 0, &ipsec_esp_auth, 0,
8949 CTL_NET, IPSEC_PFKEY, KEYCTL_ESP_AUTH, CTL_EOL);
8950 sysctl_createv(clog, 0, NULL, NULL,
8951 CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
8952 CTLTYPE_INT, "ah_keymin", NULL,
8953 NULL, 0, &ipsec_ah_keymin, 0,
8954 CTL_NET, IPSEC_PFKEY, KEYCTL_AH_KEYMIN, CTL_EOL);
8955 sysctl_createv(clog, 0, NULL, NULL,
8956 CTLFLAG_PERMANENT,
8957 CTLTYPE_STRUCT, "stats",
8958 SYSCTL_DESCR("PF_KEY statistics"),
8959 sysctl_net_key_stats, 0, NULL, 0,
8960 CTL_NET, IPSEC_PFKEY, CTL_CREATE, CTL_EOL);
8961 }
8962
8963 /*
8964 * Register sysctl names used by setkey(8). For historical reasons,
8965 * and to share a single API, these names appear under { CTL_NET, PF_KEY }
8966 * for both IPSEC and KAME IPSEC.
8967 */
8968 static void
8969 sysctl_net_key_compat_setup(struct sysctllog **clog)
8970 {
8971
8972 sysctl_createv(clog, 0, NULL, NULL,
8973 CTLFLAG_PERMANENT,
8974 CTLTYPE_NODE, "key", NULL,
8975 NULL, 0, NULL, 0,
8976 CTL_NET, PF_KEY, CTL_EOL);
8977
8978 /* Register the net.key.dump{sa,sp} nodes used by setkey(8). */
8979 sysctl_createv(clog, 0, NULL, NULL,
8980 CTLFLAG_PERMANENT,
8981 CTLTYPE_STRUCT, "dumpsa", NULL,
8982 sysctl_net_key_dumpsa, 0, NULL, 0,
8983 CTL_NET, PF_KEY, KEYCTL_DUMPSA, CTL_EOL);
8984 sysctl_createv(clog, 0, NULL, NULL,
8985 CTLFLAG_PERMANENT,
8986 CTLTYPE_STRUCT, "dumpsp", NULL,
8987 sysctl_net_key_dumpsp, 0, NULL, 0,
8988 CTL_NET, PF_KEY, KEYCTL_DUMPSP, CTL_EOL);
8989 }
8990