1 /* $FreeBSD: src/sys/netipsec/key.c,v 1.3.2.1 2003/01/24 05:11:35 sam Exp $ */
2 /* $KAME: key.c,v 1.191 2001/06/27 10:46:49 sakane Exp $ */
5 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * 3. Neither the name of the project nor the names of its contributors
17 * may be used to endorse or promote products derived from this software
18 * without specific prior written permission.
20 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34 * This code is referd to RFC 2367
38 #include "opt_inet6.h"
39 #include "opt_ipsec.h"
41 #include <sys/types.h>
42 #include <sys/param.h>
43 #include <sys/systm.h>
44 #include <sys/kernel.h>
46 #include <sys/domain.h>
47 #include <sys/protosw.h>
48 #include <sys/malloc.h>
49 #include <sys/socket.h>
50 #include <sys/socketvar.h>
51 #include <sys/sysctl.h>
52 #include <sys/errno.h>
54 #include <sys/queue.h>
55 #include <sys/syslog.h>
58 #include <net/route.h>
59 #include <net/raw_cb.h>
61 #include <netinet/in.h>
62 #include <netinet/in_systm.h>
63 #include <netinet/ip.h>
64 #include <netinet/in_var.h>
67 #include <netinet/ip6.h>
68 #include <netinet6/in6_var.h>
69 #include <netinet6/ip6_var.h>
73 #include <netinet/in_pcb.h>
76 #include <netinet6/in6_pcb.h>
79 #include <net/pfkeyv2.h>
80 #include <netproto/ipsec/keydb.h>
81 #include <netproto/ipsec/key.h>
82 #include <netproto/ipsec/keysock.h>
83 #include <netproto/ipsec/key_debug.h>
85 #include <netproto/ipsec/ipsec.h>
87 #include <netproto/ipsec/ipsec6.h>
90 #include <netproto/ipsec/xform.h>
92 #include <machine/stdarg.h>
95 #include <sys/random.h>
97 #include <net/net_osdep.h>
100 #define _BITS(bytes) ((bytes) << 3)
103 * Note on SA reference counting:
104 * - SAs that are not in DEAD state will have (total external reference + 1)
105 * following value in reference count field. they cannot be freed and are
106 * referenced from SA header.
107 * - SAs that are in DEAD state will have (total external reference)
108 * in reference count field. they are ready to be freed. reference from
109 * SA header will be removed in key_delsav(), when the reference count
110 * field hits 0 (= no external reference other than from SA header.
114 static struct callout key_timehandler_ch
;
116 u_int32_t key_debug_level
= 0;
117 static u_int key_spi_trycnt
= 1000;
118 static u_int32_t key_spi_minval
= 0x100;
119 static u_int32_t key_spi_maxval
= 0x0fffffff; /* XXX */
120 static u_int32_t policy_id
= 0;
121 static u_int key_int_random
= 60; /*interval to initialize randseed,1(m)*/
122 static u_int key_larval_lifetime
= 30; /* interval to expire acquiring, 30(s)*/
123 static int key_blockacq_count
= 10; /* counter for blocking SADB_ACQUIRE.*/
124 static int key_blockacq_lifetime
= 20; /* lifetime for blocking SADB_ACQUIRE.*/
125 static int key_prefered_oldsa
= 1; /* prefered old sa rather than new sa.*/
127 static u_int32_t acq_seq
= 0;
128 static int key_tick_init_random
= 0;
130 static LIST_HEAD(_sptree
, secpolicy
) sptree
[IPSEC_DIR_MAX
]; /* SPD */
131 static LIST_HEAD(_sahtree
, secashead
) sahtree
; /* SAD */
132 static LIST_HEAD(_regtree
, secreg
) regtree
[SADB_SATYPE_MAX
+ 1];
134 #ifndef IPSEC_NONBLOCK_ACQUIRE
135 static LIST_HEAD(_acqtree
, secacq
) acqtree
; /* acquiring list */
137 static LIST_HEAD(_spacqtree
, secspacq
) spacqtree
; /* SP acquiring list */
139 /* search order for SAs */
140 static u_int saorder_state_valid
[] = {
141 SADB_SASTATE_DYING
, SADB_SASTATE_MATURE
,
143 * This order is important because we must select the oldest SA
144 * for outbound processing. For inbound, This is not important.
147 static u_int saorder_state_alive
[] = {
149 SADB_SASTATE_MATURE
, SADB_SASTATE_DYING
, SADB_SASTATE_LARVAL
151 static u_int saorder_state_any
[] = {
152 SADB_SASTATE_MATURE
, SADB_SASTATE_DYING
,
153 SADB_SASTATE_LARVAL
, SADB_SASTATE_DEAD
156 static const int minsize
[] = {
157 sizeof(struct sadb_msg
), /* SADB_EXT_RESERVED */
158 sizeof(struct sadb_sa
), /* SADB_EXT_SA */
159 sizeof(struct sadb_lifetime
), /* SADB_EXT_LIFETIME_CURRENT */
160 sizeof(struct sadb_lifetime
), /* SADB_EXT_LIFETIME_HARD */
161 sizeof(struct sadb_lifetime
), /* SADB_EXT_LIFETIME_SOFT */
162 sizeof(struct sadb_address
), /* SADB_EXT_ADDRESS_SRC */
163 sizeof(struct sadb_address
), /* SADB_EXT_ADDRESS_DST */
164 sizeof(struct sadb_address
), /* SADB_EXT_ADDRESS_PROXY */
165 sizeof(struct sadb_key
), /* SADB_EXT_KEY_AUTH */
166 sizeof(struct sadb_key
), /* SADB_EXT_KEY_ENCRYPT */
167 sizeof(struct sadb_ident
), /* SADB_EXT_IDENTITY_SRC */
168 sizeof(struct sadb_ident
), /* SADB_EXT_IDENTITY_DST */
169 sizeof(struct sadb_sens
), /* SADB_EXT_SENSITIVITY */
170 sizeof(struct sadb_prop
), /* SADB_EXT_PROPOSAL */
171 sizeof(struct sadb_supported
), /* SADB_EXT_SUPPORTED_AUTH */
172 sizeof(struct sadb_supported
), /* SADB_EXT_SUPPORTED_ENCRYPT */
173 sizeof(struct sadb_spirange
), /* SADB_EXT_SPIRANGE */
174 0, /* SADB_X_EXT_KMPRIVATE */
175 sizeof(struct sadb_x_policy
), /* SADB_X_EXT_POLICY */
176 sizeof(struct sadb_x_sa2
), /* SADB_X_SA2 */
178 static const int maxsize
[] = {
179 sizeof(struct sadb_msg
), /* SADB_EXT_RESERVED */
180 sizeof(struct sadb_sa
), /* SADB_EXT_SA */
181 sizeof(struct sadb_lifetime
), /* SADB_EXT_LIFETIME_CURRENT */
182 sizeof(struct sadb_lifetime
), /* SADB_EXT_LIFETIME_HARD */
183 sizeof(struct sadb_lifetime
), /* SADB_EXT_LIFETIME_SOFT */
184 0, /* SADB_EXT_ADDRESS_SRC */
185 0, /* SADB_EXT_ADDRESS_DST */
186 0, /* SADB_EXT_ADDRESS_PROXY */
187 0, /* SADB_EXT_KEY_AUTH */
188 0, /* SADB_EXT_KEY_ENCRYPT */
189 0, /* SADB_EXT_IDENTITY_SRC */
190 0, /* SADB_EXT_IDENTITY_DST */
191 0, /* SADB_EXT_SENSITIVITY */
192 0, /* SADB_EXT_PROPOSAL */
193 0, /* SADB_EXT_SUPPORTED_AUTH */
194 0, /* SADB_EXT_SUPPORTED_ENCRYPT */
195 sizeof(struct sadb_spirange
), /* SADB_EXT_SPIRANGE */
196 0, /* SADB_X_EXT_KMPRIVATE */
197 0, /* SADB_X_EXT_POLICY */
198 sizeof(struct sadb_x_sa2
), /* SADB_X_SA2 */
201 static int ipsec_esp_keymin
= 256;
202 static int ipsec_esp_auth
= 0;
203 static int ipsec_ah_keymin
= 128;
206 SYSCTL_DECL(_net_key
);
209 SYSCTL_INT(_net_key
, KEYCTL_DEBUG_LEVEL
, debug
, CTLFLAG_RW
, \
210 &key_debug_level
, 0, "");
212 /* max count of trial for the decision of spi value */
213 SYSCTL_INT(_net_key
, KEYCTL_SPI_TRY
, spi_trycnt
, CTLFLAG_RW
, \
214 &key_spi_trycnt
, 0, "");
216 /* minimum spi value to allocate automatically. */
217 SYSCTL_INT(_net_key
, KEYCTL_SPI_MIN_VALUE
, spi_minval
, CTLFLAG_RW
, \
218 &key_spi_minval
, 0, "");
220 /* maximun spi value to allocate automatically. */
221 SYSCTL_INT(_net_key
, KEYCTL_SPI_MAX_VALUE
, spi_maxval
, CTLFLAG_RW
, \
222 &key_spi_maxval
, 0, "");
224 /* interval to initialize randseed */
225 SYSCTL_INT(_net_key
, KEYCTL_RANDOM_INT
, int_random
, CTLFLAG_RW
, \
226 &key_int_random
, 0, "");
228 /* lifetime for larval SA */
229 SYSCTL_INT(_net_key
, KEYCTL_LARVAL_LIFETIME
, larval_lifetime
, CTLFLAG_RW
, \
230 &key_larval_lifetime
, 0, "");
232 /* counter for blocking to send SADB_ACQUIRE to IKEd */
233 SYSCTL_INT(_net_key
, KEYCTL_BLOCKACQ_COUNT
, blockacq_count
, CTLFLAG_RW
, \
234 &key_blockacq_count
, 0, "");
236 /* lifetime for blocking to send SADB_ACQUIRE to IKEd */
237 SYSCTL_INT(_net_key
, KEYCTL_BLOCKACQ_LIFETIME
, blockacq_lifetime
, CTLFLAG_RW
, \
238 &key_blockacq_lifetime
, 0, "");
241 SYSCTL_INT(_net_key
, KEYCTL_ESP_AUTH
, esp_auth
, CTLFLAG_RW
, \
242 &ipsec_esp_auth
, 0, "");
244 /* minimum ESP key length */
245 SYSCTL_INT(_net_key
, KEYCTL_ESP_KEYMIN
, esp_keymin
, CTLFLAG_RW
, \
246 &ipsec_esp_keymin
, 0, "");
248 /* minimum AH key length */
249 SYSCTL_INT(_net_key
, KEYCTL_AH_KEYMIN
, ah_keymin
, CTLFLAG_RW
, \
250 &ipsec_ah_keymin
, 0, "");
252 /* perfered old SA rather than new SA */
253 SYSCTL_INT(_net_key
, KEYCTL_PREFERED_OLDSA
, prefered_oldsa
, CTLFLAG_RW
,\
254 &key_prefered_oldsa
, 0, "");
256 #define __LIST_CHAINED(elm) \
257 (!((elm)->chain.le_next == NULL && (elm)->chain.le_prev == NULL))
258 #define LIST_INSERT_TAIL(head, elm, type, field) \
260 struct type *curelm = LIST_FIRST(head); \
261 if (curelm == NULL) {\
262 LIST_INSERT_HEAD(head, elm, field); \
264 while (LIST_NEXT(curelm, field)) \
265 curelm = LIST_NEXT(curelm, field);\
266 LIST_INSERT_AFTER(curelm, elm, field);\
270 #define KEY_CHKSASTATE(head, sav, name) \
272 if ((head) != (sav)) { \
273 ipseclog((LOG_DEBUG, "%s: state mismatched (TREE=%d SA=%d)\n", \
274 (name), (head), (sav))); \
279 #define KEY_CHKSPDIR(head, sp, name) \
281 if ((head) != (sp)) { \
282 ipseclog((LOG_DEBUG, "%s: direction mismatched (TREE=%d SP=%d), " \
283 "anyway continue.\n", \
284 (name), (head), (sp))); \
288 MALLOC_DEFINE(M_SECA
, "key mgmt", "security associations, key management");
291 #define KMALLOC(p, t, n) \
292 ((p) = (t) kmalloc((unsigned long)(n), M_SECA, M_INTWAIT | M_NULLOK))
294 kfree((caddr_t)(p), M_SECA)
296 #define KMALLOC(p, t, n) \
298 ((p) = (t)kmalloc((unsigned long)(n), M_SECA, M_INTWAIT | M_NULLOK)); \
299 kprintf("%s %d: %p <- KMALLOC(%s, %d)\n", \
300 __FILE__, __LINE__, (p), #t, n); \
305 kprintf("%s %d: %p -> KFREE()\n", __FILE__, __LINE__, (p)); \
306 kfree((caddr_t)(p), M_SECA); \
311 * set parameters into secpolicyindex buffer.
312 * Must allocate secpolicyindex buffer passed to this function.
314 #define KEY_SETSECSPIDX(_dir, s, d, ps, pd, ulp, idx) \
316 bzero((idx), sizeof(struct secpolicyindex)); \
317 (idx)->dir = (_dir); \
318 (idx)->prefs = (ps); \
319 (idx)->prefd = (pd); \
320 (idx)->ul_proto = (ulp); \
321 bcopy((s), &(idx)->src, ((const struct sockaddr *)(s))->sa_len); \
322 bcopy((d), &(idx)->dst, ((const struct sockaddr *)(d))->sa_len); \
326 * set parameters into secasindex buffer.
327 * Must allocate secasindex buffer before calling this function.
329 #define KEY_SETSECASIDX(p, m, r, s, d, idx) \
331 bzero((idx), sizeof(struct secasindex)); \
332 (idx)->proto = (p); \
334 (idx)->reqid = (r); \
335 bcopy((s), &(idx)->src, ((const struct sockaddr *)(s))->sa_len); \
336 bcopy((d), &(idx)->dst, ((const struct sockaddr *)(d))->sa_len); \
341 u_long getspi_count
; /* the avarage of count to try to get new SPI */
345 struct sadb_msg
*msg
;
346 struct sadb_ext
*ext
[SADB_EXT_MAX
+ 1];
347 int extoff
[SADB_EXT_MAX
+ 1];
348 int extlen
[SADB_EXT_MAX
+ 1];
351 static struct secasvar
*key_allocsa_policy (const struct secasindex
*);
352 static void key_freesp_so (struct secpolicy
**);
353 static struct secasvar
*key_do_allocsa_policy (struct secashead
*, u_int
);
354 static void key_delsp (struct secpolicy
*);
355 static struct secpolicy
*key_getsp (struct secpolicyindex
*);
356 static struct secpolicy
*key_getspbyid (u_int32_t
);
357 static u_int32_t
key_newreqid (void);
358 static struct mbuf
*key_gather_mbuf (struct mbuf
*,
359 const struct sadb_msghdr
*, int, int, ...);
360 static int key_spdadd (struct socket
*, struct mbuf
*,
361 const struct sadb_msghdr
*);
362 static u_int32_t
key_getnewspid (void);
363 static int key_spddelete (struct socket
*, struct mbuf
*,
364 const struct sadb_msghdr
*);
365 static int key_spddelete2 (struct socket
*, struct mbuf
*,
366 const struct sadb_msghdr
*);
367 static int key_spdget (struct socket
*, struct mbuf
*,
368 const struct sadb_msghdr
*);
369 static int key_spdflush (struct socket
*, struct mbuf
*,
370 const struct sadb_msghdr
*);
371 static int key_spddump (struct socket
*, struct mbuf
*,
372 const struct sadb_msghdr
*);
373 static struct mbuf
*key_setdumpsp (struct secpolicy
*,
374 u_int8_t
, u_int32_t
, u_int32_t
);
375 static u_int
key_getspreqmsglen (struct secpolicy
*);
376 static int key_spdexpire (struct secpolicy
*);
377 static struct secashead
*key_newsah (struct secasindex
*);
378 static void key_delsah (struct secashead
*);
379 static struct secasvar
*key_newsav (struct mbuf
*,
380 const struct sadb_msghdr
*, struct secashead
*, int *,
382 #define KEY_NEWSAV(m, sadb, sah, e) \
383 key_newsav(m, sadb, sah, e, __FILE__, __LINE__)
384 static void key_delsav (struct secasvar
*);
385 static struct secashead
*key_getsah (struct secasindex
*);
386 static struct secasvar
*key_checkspidup (struct secasindex
*, u_int32_t
);
387 static struct secasvar
*key_getsavbyspi (struct secashead
*, u_int32_t
);
388 static int key_setsaval (struct secasvar
*, struct mbuf
*,
389 const struct sadb_msghdr
*);
390 static int key_mature (struct secasvar
*);
391 static struct mbuf
*key_setdumpsa (struct secasvar
*, u_int8_t
,
392 u_int8_t
, u_int32_t
, u_int32_t
);
393 static struct mbuf
*key_setsadbmsg (u_int8_t
, u_int16_t
, u_int8_t
,
394 u_int32_t
, pid_t
, u_int16_t
);
395 static struct mbuf
*key_setsadbsa (struct secasvar
*);
396 static struct mbuf
*key_setsadbaddr (u_int16_t
,
397 const struct sockaddr
*, u_int8_t
, u_int16_t
);
399 static struct mbuf
*key_setsadbident (u_int16_t
, u_int16_t
, caddr_t
,
402 static struct mbuf
*key_setsadbxsa2 (u_int8_t
, u_int32_t
, u_int32_t
);
403 static struct mbuf
*key_setsadbxpolicy (u_int16_t
, u_int8_t
,
405 static void *key_newbuf (const void *, u_int
);
407 static int key_ismyaddr6 (struct sockaddr_in6
*);
410 /* flags for key_cmpsaidx() */
411 #define CMP_HEAD 1 /* protocol, addresses. */
412 #define CMP_MODE_REQID 2 /* additionally HEAD, reqid, mode. */
413 #define CMP_REQID 3 /* additionally HEAD, reaid. */
414 #define CMP_EXACTLY 4 /* all elements. */
415 static int key_cmpsaidx
416 (const struct secasindex
*, const struct secasindex
*, int);
418 static int key_cmpspidx_exactly
419 (struct secpolicyindex
*, struct secpolicyindex
*);
420 static int key_cmpspidx_withmask
421 (struct secpolicyindex
*, struct secpolicyindex
*);
422 static int key_sockaddrcmp (const struct sockaddr
*, const struct sockaddr
*, int);
423 static int key_bbcmp (const void *, const void *, u_int
);
424 static void key_srandom (void);
425 static u_int16_t
key_satype2proto (u_int8_t
);
426 static u_int8_t
key_proto2satype (u_int16_t
);
428 static int key_getspi (struct socket
*, struct mbuf
*,
429 const struct sadb_msghdr
*);
430 static u_int32_t
key_do_getnewspi (struct sadb_spirange
*,
431 struct secasindex
*);
432 static int key_update (struct socket
*, struct mbuf
*,
433 const struct sadb_msghdr
*);
434 #ifdef IPSEC_DOSEQCHECK
435 static struct secasvar
*key_getsavbyseq (struct secashead
*, u_int32_t
);
437 static int key_add (struct socket
*, struct mbuf
*,
438 const struct sadb_msghdr
*);
439 static int key_setident (struct secashead
*, struct mbuf
*,
440 const struct sadb_msghdr
*);
441 static struct mbuf
*key_getmsgbuf_x1 (struct mbuf
*,
442 const struct sadb_msghdr
*);
443 static int key_delete (struct socket
*, struct mbuf
*,
444 const struct sadb_msghdr
*);
445 static int key_get (struct socket
*, struct mbuf
*,
446 const struct sadb_msghdr
*);
448 static void key_getcomb_setlifetime (struct sadb_comb
*);
449 static struct mbuf
*key_getcomb_esp (void);
450 static struct mbuf
*key_getcomb_ah (void);
451 static struct mbuf
*key_getcomb_ipcomp (void);
452 static struct mbuf
*key_getprop (const struct secasindex
*);
454 static int key_acquire (const struct secasindex
*, struct secpolicy
*);
455 #ifndef IPSEC_NONBLOCK_ACQUIRE
456 static struct secacq
*key_newacq (const struct secasindex
*);
457 static struct secacq
*key_getacq (const struct secasindex
*);
458 static struct secacq
*key_getacqbyseq (u_int32_t
);
460 static struct secspacq
*key_newspacq (struct secpolicyindex
*);
461 static struct secspacq
*key_getspacq (struct secpolicyindex
*);
462 static int key_acquire2 (struct socket
*, struct mbuf
*,
463 const struct sadb_msghdr
*);
464 static int key_register (struct socket
*, struct mbuf
*,
465 const struct sadb_msghdr
*);
466 static int key_expire (struct secasvar
*);
467 static int key_flush (struct socket
*, struct mbuf
*,
468 const struct sadb_msghdr
*);
469 static int key_dump (struct socket
*, struct mbuf
*,
470 const struct sadb_msghdr
*);
471 static int key_promisc (struct socket
*, struct mbuf
*,
472 const struct sadb_msghdr
*);
473 static int key_senderror (struct socket
*, struct mbuf
*, int);
474 static int key_validate_ext (const struct sadb_ext
*, int);
475 static int key_align (struct mbuf
*, struct sadb_msghdr
*);
477 static const char *key_getfqdn (void);
478 static const char *key_getuserfqdn (void);
480 static void key_sa_chgstate (struct secasvar
*, u_int8_t
);
481 static struct mbuf
*key_alloc_mbuf (int);
483 #define SA_ADDREF(p) do { \
485 KASSERT((p)->refcnt != 0, \
486 ("SA refcnt overflow at %s:%u", __FILE__, __LINE__)); \
488 #define SA_DELREF(p) do { \
489 KASSERT((p)->refcnt > 0, \
490 ("SA refcnt underflow at %s:%u", __FILE__, __LINE__)); \
494 #define SP_ADDREF(p) do { \
496 KASSERT((p)->refcnt != 0, \
497 ("SP refcnt overflow at %s:%u", __FILE__, __LINE__)); \
499 #define SP_DELREF(p) do { \
500 KASSERT((p)->refcnt > 0, \
501 ("SP refcnt underflow at %s:%u", __FILE__, __LINE__)); \
506 * Return 0 when there are known to be no SP's for the specified
507 * direction. Otherwise return 1. This is used by IPsec code
508 * to optimize performance.
511 key_havesp(u_int dir
)
513 return (dir
== IPSEC_DIR_INBOUND
|| dir
== IPSEC_DIR_OUTBOUND
?
514 LIST_FIRST(&sptree
[dir
]) != NULL
: 1);
517 /* %%% IPsec policy management */
519 * allocating a SP for OUTBOUND or INBOUND packet.
520 * Must call key_freesp() later.
521 * OUT: NULL: not found
522 * others: found and return the pointer.
525 key_allocsp(struct secpolicyindex
*spidx
, u_int dir
, const char* where
, int tag
)
527 struct secpolicy
*sp
;
530 KASSERT(spidx
!= NULL
, ("key_allocsp: null spidx"));
531 KASSERT(dir
== IPSEC_DIR_INBOUND
|| dir
== IPSEC_DIR_OUTBOUND
,
532 ("key_allocsp: invalid direction %u", dir
));
534 KEYDEBUG(KEYDEBUG_IPSEC_STAMP
,
535 kprintf("DP key_allocsp from %s:%u\n", where
, tag
));
539 KEYDEBUG(KEYDEBUG_IPSEC_DATA
,
540 kprintf("*** objects\n"); kdebug_secpolicyindex(spidx
));
542 LIST_FOREACH(sp
, &sptree
[dir
], chain
) {
543 KEYDEBUG(KEYDEBUG_IPSEC_DATA
,
544 kprintf("*** in SPD\n");
545 kdebug_secpolicyindex(&sp
->spidx
));
547 if (sp
->state
== IPSEC_SPSTATE_DEAD
)
549 if (key_cmpspidx_withmask(&sp
->spidx
, spidx
))
556 KEY_CHKSPDIR(sp
->spidx
.dir
, dir
, "key_allocsp");
558 /* found a SPD entry */
559 sp
->lastused
= time_second
;
564 KEYDEBUG(KEYDEBUG_IPSEC_STAMP
,
565 kprintf("DP key_allocsp return SP:%p (ID=%u) refcnt %u\n",
566 sp
, sp
? sp
->id
: 0, sp
? sp
->refcnt
: 0));
571 * allocating a SP for OUTBOUND or INBOUND packet.
572 * Must call key_freesp() later.
573 * OUT: NULL: not found
574 * others: found and return the pointer.
577 key_allocsp2(u_int32_t spi
,
578 union sockaddr_union
*dst
,
581 const char* where
, int tag
)
583 struct secpolicy
*sp
;
586 KASSERT(dst
!= NULL
, ("key_allocsp2: null dst"));
587 KASSERT(dir
== IPSEC_DIR_INBOUND
|| dir
== IPSEC_DIR_OUTBOUND
,
588 ("key_allocsp2: invalid direction %u", dir
));
590 KEYDEBUG(KEYDEBUG_IPSEC_STAMP
,
591 kprintf("DP key_allocsp2 from %s:%u\n", where
, tag
));
595 KEYDEBUG(KEYDEBUG_IPSEC_DATA
,
596 kprintf("*** objects\n");
597 kprintf("spi %u proto %u dir %u\n", spi
, proto
, dir
);
598 kdebug_sockaddr(&dst
->sa
));
600 LIST_FOREACH(sp
, &sptree
[dir
], chain
) {
601 KEYDEBUG(KEYDEBUG_IPSEC_DATA
,
602 kprintf("*** in SPD\n");
603 kdebug_secpolicyindex(&sp
->spidx
));
605 if (sp
->state
== IPSEC_SPSTATE_DEAD
)
607 /* compare simple values, then dst address */
608 if (sp
->spidx
.ul_proto
!= proto
)
610 /* NB: spi's must exist and match */
611 if (!sp
->req
|| !sp
->req
->sav
|| sp
->req
->sav
->spi
!= spi
)
613 if (key_sockaddrcmp(&sp
->spidx
.dst
.sa
, &dst
->sa
, 1) == 0)
620 KEY_CHKSPDIR(sp
->spidx
.dir
, dir
, "key_allocsp2");
622 /* found a SPD entry */
623 sp
->lastused
= time_second
;
628 KEYDEBUG(KEYDEBUG_IPSEC_STAMP
,
629 kprintf("DP key_allocsp2 return SP:%p (ID=%u) refcnt %u\n",
630 sp
, sp
? sp
->id
: 0, sp
? sp
->refcnt
: 0));
635 * return a policy that matches this particular inbound packet.
639 key_gettunnel(const struct sockaddr
*osrc
,
640 const struct sockaddr
*odst
,
641 const struct sockaddr
*isrc
,
642 const struct sockaddr
*idst
,
643 const char* where
, int tag
)
645 struct secpolicy
*sp
;
646 const int dir
= IPSEC_DIR_INBOUND
;
648 struct ipsecrequest
*r1
, *r2
, *p
;
649 struct secpolicyindex spidx
;
651 KEYDEBUG(KEYDEBUG_IPSEC_STAMP
,
652 kprintf("DP key_gettunnel from %s:%u\n", where
, tag
));
654 if (isrc
->sa_family
!= idst
->sa_family
) {
655 ipseclog((LOG_ERR
, "protocol family mismatched %d != %d\n.",
656 isrc
->sa_family
, idst
->sa_family
));
662 LIST_FOREACH(sp
, &sptree
[dir
], chain
) {
663 if (sp
->state
== IPSEC_SPSTATE_DEAD
)
667 for (p
= sp
->req
; p
; p
= p
->next
) {
668 if (p
->saidx
.mode
!= IPSEC_MODE_TUNNEL
)
675 /* here we look at address matches only */
677 if (isrc
->sa_len
> sizeof(spidx
.src
) ||
678 idst
->sa_len
> sizeof(spidx
.dst
))
680 bcopy(isrc
, &spidx
.src
, isrc
->sa_len
);
681 bcopy(idst
, &spidx
.dst
, idst
->sa_len
);
682 if (!key_cmpspidx_withmask(&sp
->spidx
, &spidx
))
685 if (key_sockaddrcmp(&r1
->saidx
.src
.sa
, isrc
, 0) ||
686 key_sockaddrcmp(&r1
->saidx
.dst
.sa
, idst
, 0))
690 if (key_sockaddrcmp(&r2
->saidx
.src
.sa
, osrc
, 0) ||
691 key_sockaddrcmp(&r2
->saidx
.dst
.sa
, odst
, 0))
700 sp
->lastused
= time_second
;
705 KEYDEBUG(KEYDEBUG_IPSEC_STAMP
,
706 kprintf("DP key_gettunnel return SP:%p (ID=%u) refcnt %u\n",
707 sp
, sp
? sp
->id
: 0, sp
? sp
->refcnt
: 0));
712 * allocating an SA entry for an *OUTBOUND* packet.
713 * checking each request entries in SP, and acquire an SA if need.
714 * OUT: 0: there are valid requests.
715 * ENOENT: policy may be valid, but SA with REQUIRE is on acquiring.
718 key_checkrequest(struct ipsecrequest
*isr
, const struct secasindex
*saidx
)
723 KASSERT(isr
!= NULL
, ("key_checkrequest: null isr"));
724 KASSERT(saidx
!= NULL
, ("key_checkrequest: null saidx"));
725 KASSERT(saidx
->mode
== IPSEC_MODE_TRANSPORT
||
726 saidx
->mode
== IPSEC_MODE_TUNNEL
,
727 ("key_checkrequest: unexpected policy %u", saidx
->mode
));
729 /* get current level */
730 level
= ipsec_get_reqlevel(isr
);
733 * XXX guard against protocol callbacks from the crypto
734 * thread as they reference ipsecrequest.sav which we
735 * temporarily null out below. Need to rethink how we
736 * handle bundled SA's in the callback thread.
740 * We do allocate new SA only if the state of SA in the holder is
741 * SADB_SASTATE_DEAD. The SA for outbound must be the oldest.
743 if (isr
->sav
!= NULL
) {
744 if (isr
->sav
->sah
== NULL
)
745 panic("key_checkrequest: sah is null.");
746 if (isr
->sav
== (struct secasvar
*)LIST_FIRST(
747 &isr
->sav
->sah
->savtree
[SADB_SASTATE_DEAD
])) {
748 KEY_FREESAV(&isr
->sav
);
754 * we free any SA stashed in the IPsec request because a different
755 * SA may be involved each time this request is checked, either
756 * because new SAs are being configured, or this request is
757 * associated with an unconnected datagram socket, or this request
758 * is associated with a system default policy.
760 * The operation may have negative impact to performance. We may
761 * want to check cached SA carefully, rather than picking new SA
764 if (isr
->sav
!= NULL
) {
765 KEY_FREESAV(&isr
->sav
);
771 * new SA allocation if no SA found.
772 * key_allocsa_policy should allocate the oldest SA available.
773 * See key_do_allocsa_policy(), and draft-jenkins-ipsec-rekeying-03.txt.
775 if (isr
->sav
== NULL
)
776 isr
->sav
= key_allocsa_policy(saidx
);
778 /* When there is SA. */
779 if (isr
->sav
!= NULL
) {
780 if (isr
->sav
->state
!= SADB_SASTATE_MATURE
&&
781 isr
->sav
->state
!= SADB_SASTATE_DYING
)
787 error
= key_acquire(saidx
, isr
->sp
);
789 /* XXX What should I do ? */
790 ipseclog((LOG_DEBUG
, "key_checkrequest: error %d returned "
791 "from key_acquire.\n", error
));
795 if (level
!= IPSEC_LEVEL_REQUIRE
) {
796 /* XXX sigh, the interface to this routine is botched */
797 KASSERT(isr
->sav
== NULL
, ("key_checkrequest: unexpected SA"));
805 * allocating a SA for policy entry from SAD.
806 * NOTE: searching SAD of aliving state.
807 * OUT: NULL: not found.
808 * others: found and return the pointer.
810 static struct secasvar
*
811 key_allocsa_policy(const struct secasindex
*saidx
)
813 struct secashead
*sah
;
814 struct secasvar
*sav
;
815 u_int stateidx
, state
;
817 LIST_FOREACH(sah
, &sahtree
, chain
) {
818 if (sah
->state
== SADB_SASTATE_DEAD
)
820 if (key_cmpsaidx(&sah
->saidx
, saidx
, CMP_MODE_REQID
))
828 /* search valid state */
830 stateidx
< NELEM(saorder_state_valid
);
833 state
= saorder_state_valid
[stateidx
];
835 sav
= key_do_allocsa_policy(sah
, state
);
844 * searching SAD with direction, protocol, mode and state.
845 * called by key_allocsa_policy().
848 * others : found, pointer to a SA.
850 static struct secasvar
*
851 key_do_allocsa_policy(struct secashead
*sah
, u_int state
)
853 struct secasvar
*sav
, *nextsav
, *candidate
= NULL
, *d
;
855 LIST_FOREACH_MUTABLE(sav
, &sah
->savtree
[state
], chain
, nextsav
) {
857 KEY_CHKSASTATE(sav
->state
, state
, "key_do_allocsa_policy");
860 if (candidate
== NULL
) {
865 /* Which SA is the better ? */
868 if (candidate
->lft_c
== NULL
|| sav
->lft_c
== NULL
)
869 panic("key_do_allocsa_policy: "
870 "lifetime_current is NULL.\n");
872 /* What the best method is to compare ? */
873 if (key_prefered_oldsa
) {
874 if (candidate
->lft_c
->sadb_lifetime_addtime
>
875 sav
->lft_c
->sadb_lifetime_addtime
) {
881 /* prefered new sa rather than old sa */
882 if (candidate
->lft_c
->sadb_lifetime_addtime
<
883 sav
->lft_c
->sadb_lifetime_addtime
) {
890 * prepared to delete the SA when there is more
891 * suitable candidate and the lifetime of the SA is not
894 if (d
->lft_c
->sadb_lifetime_addtime
!= 0) {
895 struct mbuf
*m
, *result
;
898 key_sa_chgstate(d
, SADB_SASTATE_DEAD
);
900 KASSERT(d
->refcnt
> 0,
901 ("key_do_allocsa_policy: bogus ref count"));
903 satype
= key_proto2satype(d
->sah
->saidx
.proto
);
907 m
= key_setsadbmsg(SADB_DELETE
, 0, satype
, 0, 0,
913 /* set sadb_address for saidx's. */
914 m
= key_setsadbaddr(SADB_EXT_ADDRESS_SRC
,
915 &d
->sah
->saidx
.src
.sa
,
916 d
->sah
->saidx
.src
.sa
.sa_len
<< 3,
922 /* set sadb_address for saidx's. */
923 m
= key_setsadbaddr(SADB_EXT_ADDRESS_DST
,
924 &d
->sah
->saidx
.dst
.sa
,
925 d
->sah
->saidx
.dst
.sa
.sa_len
<< 3,
931 /* create SA extension */
932 m
= key_setsadbsa(d
);
937 if (result
->m_len
< sizeof(struct sadb_msg
)) {
938 result
= m_pullup(result
,
939 sizeof(struct sadb_msg
));
944 result
->m_pkthdr
.len
= m_lengthm(result
, NULL
);
945 mtod(result
, struct sadb_msg
*)->sadb_msg_len
=
946 PFKEY_UNIT64(result
->m_pkthdr
.len
);
948 if (key_sendup_mbuf(NULL
, result
,
949 KEY_SENDUP_REGISTERED
))
957 SA_ADDREF(candidate
);
958 KEYDEBUG(KEYDEBUG_IPSEC_STAMP
,
959 kprintf("DP allocsa_policy cause refcnt++:%d SA:%p\n",
960 candidate
->refcnt
, candidate
));
966 * allocating a usable SA entry for a *INBOUND* packet.
967 * Must call key_freesav() later.
968 * OUT: positive: pointer to a usable sav (i.e. MATURE or DYING state).
969 * NULL: not found, or error occured.
971 * In the comparison, no source address is used--for RFC2401 conformance.
972 * To quote, from section 4.1:
973 * A security association is uniquely identified by a triple consisting
974 * of a Security Parameter Index (SPI), an IP Destination Address, and a
975 * security protocol (AH or ESP) identifier.
976 * Note that, however, we do need to keep source address in IPsec SA.
977 * IKE specification and PF_KEY specification do assume that we
978 * keep source address in IPsec SA. We see a tricky situation here.
982 union sockaddr_union
*dst
,
985 const char* where
, int tag
)
987 struct secashead
*sah
;
988 struct secasvar
*sav
;
989 u_int stateidx
, state
;
992 KASSERT(dst
!= NULL
, ("key_allocsa: null dst address"));
994 KEYDEBUG(KEYDEBUG_IPSEC_STAMP
,
995 kprintf("DP key_allocsa from %s:%u\n", where
, tag
));
999 * XXX: to be checked internal IP header somewhere. Also when
1000 * IPsec tunnel packet is received. But ESP tunnel mode is
1001 * encrypted so we can't check internal IP header.
1004 LIST_FOREACH(sah
, &sahtree
, chain
) {
1005 /* search valid state */
1007 stateidx
< NELEM(saorder_state_valid
);
1009 state
= saorder_state_valid
[stateidx
];
1010 LIST_FOREACH(sav
, &sah
->savtree
[state
], chain
) {
1012 KEY_CHKSASTATE(sav
->state
, state
, "key_allocsav");
1013 /* do not return entries w/ unusable state */
1014 if (sav
->state
!= SADB_SASTATE_MATURE
&&
1015 sav
->state
!= SADB_SASTATE_DYING
)
1017 if (proto
!= sav
->sah
->saidx
.proto
)
1019 if (spi
!= sav
->spi
)
1021 #if 0 /* don't check src */
1022 /* check src address */
1023 if (key_sockaddrcmp(&src
->sa
, &sav
->sah
->saidx
.src
.sa
, 0) != 0)
1026 /* check dst address */
1027 if (key_sockaddrcmp(&dst
->sa
, &sav
->sah
->saidx
.dst
.sa
, 0) != 0)
1038 KEYDEBUG(KEYDEBUG_IPSEC_STAMP
,
1039 kprintf("DP key_allocsa return SA:%p; refcnt %u\n",
1040 sav
, sav
? sav
->refcnt
: 0));
1045 * Must be called after calling key_allocsp().
1046 * For both the packet without socket and key_freeso().
1049 _key_freesp(struct secpolicy
**spp
, const char* where
, int tag
)
1051 struct secpolicy
*sp
= *spp
;
1053 KASSERT(sp
!= NULL
, ("key_freesp: null sp"));
1057 KEYDEBUG(KEYDEBUG_IPSEC_STAMP
,
1058 kprintf("DP key_freesp SP:%p (ID=%u) from %s:%u; refcnt now %u\n",
1059 sp
, sp
->id
, where
, tag
, sp
->refcnt
));
1061 if (sp
->refcnt
== 0) {
1068 * Must be called after calling key_allocsp().
1069 * For the packet with socket.
1072 key_freeso(struct socket
*so
)
1075 KASSERT(so
!= NULL
, ("key_freeso: null so"));
1077 switch (so
->so_proto
->pr_domain
->dom_family
) {
1081 struct inpcb
*pcb
= so
->so_pcb
;
1083 /* Does it have a PCB ? */
1086 key_freesp_so(&pcb
->inp_sp
->sp_in
);
1087 key_freesp_so(&pcb
->inp_sp
->sp_out
);
1094 #ifdef HAVE_NRL_INPCB
1095 struct inpcb
*pcb
= so
->so_pcb
;
1097 /* Does it have a PCB ? */
1100 key_freesp_so(&pcb
->inp_sp
->sp_in
);
1101 key_freesp_so(&pcb
->inp_sp
->sp_out
);
1103 struct in6pcb
*pcb
= so
->so_pcb
;
1105 /* Does it have a PCB ? */
1108 key_freesp_so(&pcb
->in6p_sp
->sp_in
);
1109 key_freesp_so(&pcb
->in6p_sp
->sp_out
);
1115 ipseclog((LOG_DEBUG
, "key_freeso: unknown address family=%d.\n",
1116 so
->so_proto
->pr_domain
->dom_family
));
1122 key_freesp_so(struct secpolicy
**sp
)
1124 KASSERT(sp
!= NULL
&& *sp
!= NULL
, ("key_freesp_so: null sp"));
1126 if ((*sp
)->policy
== IPSEC_POLICY_ENTRUST
||
1127 (*sp
)->policy
== IPSEC_POLICY_BYPASS
)
1130 KASSERT((*sp
)->policy
== IPSEC_POLICY_IPSEC
,
1131 ("key_freesp_so: invalid policy %u", (*sp
)->policy
));
1136 * Must be called after calling key_allocsa().
1137 * This function is called by key_freesp() to free some SA allocated
1141 key_freesav(struct secasvar
**psav
, const char* where
, int tag
)
1143 struct secasvar
*sav
= *psav
;
1145 KASSERT(sav
!= NULL
, ("key_freesav: null sav"));
1149 KEYDEBUG(KEYDEBUG_IPSEC_STAMP
,
1150 kprintf("DP key_freesav SA:%p (SPI %u) from %s:%u; refcnt now %u\n",
1151 sav
, ntohl(sav
->spi
), where
, tag
, sav
->refcnt
));
1153 if (sav
->refcnt
== 0) {
1159 /* %%% SPD management */
1161 * free security policy entry.
1164 key_delsp(struct secpolicy
*sp
)
1168 KASSERT(sp
!= NULL
, ("key_delsp: null sp"));
1170 sp
->state
= IPSEC_SPSTATE_DEAD
;
1172 KASSERT(sp
->refcnt
== 0,
1173 ("key_delsp: SP with references deleted (refcnt %u)",
1177 /* remove from SP index */
1178 if (__LIST_CHAINED(sp
))
1179 LIST_REMOVE(sp
, chain
);
1182 struct ipsecrequest
*isr
= sp
->req
, *nextisr
;
1184 while (isr
!= NULL
) {
1185 if (isr
->sav
!= NULL
) {
1186 KEY_FREESAV(&isr
->sav
);
1190 nextisr
= isr
->next
;
1203 * OUT: NULL : not found
1204 * others : found, pointer to a SP.
1206 static struct secpolicy
*
1207 key_getsp(struct secpolicyindex
*spidx
)
1209 struct secpolicy
*sp
;
1211 KASSERT(spidx
!= NULL
, ("key_getsp: null spidx"));
1213 LIST_FOREACH(sp
, &sptree
[spidx
->dir
], chain
) {
1214 if (sp
->state
== IPSEC_SPSTATE_DEAD
)
1216 if (key_cmpspidx_exactly(spidx
, &sp
->spidx
)) {
1227 * OUT: NULL : not found
1228 * others : found, pointer to a SP.
1230 static struct secpolicy
*
1231 key_getspbyid(u_int32_t id
)
1233 struct secpolicy
*sp
;
1235 LIST_FOREACH(sp
, &sptree
[IPSEC_DIR_INBOUND
], chain
) {
1236 if (sp
->state
== IPSEC_SPSTATE_DEAD
)
1244 LIST_FOREACH(sp
, &sptree
[IPSEC_DIR_OUTBOUND
], chain
) {
1245 if (sp
->state
== IPSEC_SPSTATE_DEAD
)
1257 key_newsp(const char* where
, int tag
)
1259 struct secpolicy
*newsp
= NULL
;
1261 newsp
= kmalloc(sizeof(struct secpolicy
), M_SECA
,
1262 M_INTWAIT
| M_ZERO
| M_NULLOK
);
1268 KEYDEBUG(KEYDEBUG_IPSEC_STAMP
,
1269 kprintf("DP key_newsp from %s:%u return SP:%p\n",
1270 where
, tag
, newsp
));
1275 * create secpolicy structure from sadb_x_policy structure.
1276 * NOTE: `state', `secpolicyindex' in secpolicy structure are not set,
1277 * so must be set properly later.
1280 key_msg2sp(struct sadb_x_policy
*xpl0
, size_t len
, int *error
)
1282 struct secpolicy
*newsp
;
1286 panic("key_msg2sp: NULL pointer was passed.");
1287 if (len
< sizeof(*xpl0
))
1288 panic("key_msg2sp: invalid length.");
1289 if (len
!= PFKEY_EXTLEN(xpl0
)) {
1290 ipseclog((LOG_DEBUG
, "key_msg2sp: Invalid msg length.\n"));
1295 if ((newsp
= KEY_NEWSP()) == NULL
) {
1300 newsp
->spidx
.dir
= xpl0
->sadb_x_policy_dir
;
1301 newsp
->policy
= xpl0
->sadb_x_policy_type
;
1304 switch (xpl0
->sadb_x_policy_type
) {
1305 case IPSEC_POLICY_DISCARD
:
1306 case IPSEC_POLICY_NONE
:
1307 case IPSEC_POLICY_ENTRUST
:
1308 case IPSEC_POLICY_BYPASS
:
1312 case IPSEC_POLICY_IPSEC
:
1315 struct sadb_x_ipsecrequest
*xisr
;
1316 struct ipsecrequest
**p_isr
= &newsp
->req
;
1318 /* validity check */
1319 if (PFKEY_EXTLEN(xpl0
) < sizeof(*xpl0
)) {
1320 ipseclog((LOG_DEBUG
,
1321 "key_msg2sp: Invalid msg length.\n"));
1327 tlen
= PFKEY_EXTLEN(xpl0
) - sizeof(*xpl0
);
1328 xisr
= (struct sadb_x_ipsecrequest
*)(xpl0
+ 1);
1332 if (xisr
->sadb_x_ipsecrequest_len
< sizeof(*xisr
)) {
1333 ipseclog((LOG_DEBUG
, "key_msg2sp: "
1334 "invalid ipsecrequest length.\n"));
1340 /* allocate request buffer */
1341 KMALLOC(*p_isr
, struct ipsecrequest
*, sizeof(**p_isr
));
1342 if ((*p_isr
) == NULL
) {
1343 ipseclog((LOG_DEBUG
,
1344 "key_msg2sp: No more memory.\n"));
1349 bzero(*p_isr
, sizeof(**p_isr
));
1352 (*p_isr
)->next
= NULL
;
1354 switch (xisr
->sadb_x_ipsecrequest_proto
) {
1357 case IPPROTO_IPCOMP
:
1360 ipseclog((LOG_DEBUG
,
1361 "key_msg2sp: invalid proto type=%u\n",
1362 xisr
->sadb_x_ipsecrequest_proto
));
1364 *error
= EPROTONOSUPPORT
;
1367 (*p_isr
)->saidx
.proto
= xisr
->sadb_x_ipsecrequest_proto
;
1369 switch (xisr
->sadb_x_ipsecrequest_mode
) {
1370 case IPSEC_MODE_TRANSPORT
:
1371 case IPSEC_MODE_TUNNEL
:
1373 case IPSEC_MODE_ANY
:
1375 ipseclog((LOG_DEBUG
,
1376 "key_msg2sp: invalid mode=%u\n",
1377 xisr
->sadb_x_ipsecrequest_mode
));
1382 (*p_isr
)->saidx
.mode
= xisr
->sadb_x_ipsecrequest_mode
;
1384 switch (xisr
->sadb_x_ipsecrequest_level
) {
1385 case IPSEC_LEVEL_DEFAULT
:
1386 case IPSEC_LEVEL_USE
:
1387 case IPSEC_LEVEL_REQUIRE
:
1389 case IPSEC_LEVEL_UNIQUE
:
1390 /* validity check */
1392 * If range violation of reqid, kernel will
1393 * update it, don't refuse it.
1395 if (xisr
->sadb_x_ipsecrequest_reqid
1396 > IPSEC_MANUAL_REQID_MAX
) {
1397 ipseclog((LOG_DEBUG
,
1398 "key_msg2sp: reqid=%d range "
1399 "violation, updated by kernel.\n",
1400 xisr
->sadb_x_ipsecrequest_reqid
));
1401 xisr
->sadb_x_ipsecrequest_reqid
= 0;
1404 /* allocate new reqid id if reqid is zero. */
1405 if (xisr
->sadb_x_ipsecrequest_reqid
== 0) {
1407 if ((reqid
= key_newreqid()) == 0) {
1412 (*p_isr
)->saidx
.reqid
= reqid
;
1413 xisr
->sadb_x_ipsecrequest_reqid
= reqid
;
1415 /* set it for manual keying. */
1416 (*p_isr
)->saidx
.reqid
=
1417 xisr
->sadb_x_ipsecrequest_reqid
;
1422 ipseclog((LOG_DEBUG
, "key_msg2sp: invalid level=%u\n",
1423 xisr
->sadb_x_ipsecrequest_level
));
1428 (*p_isr
)->level
= xisr
->sadb_x_ipsecrequest_level
;
1430 /* set IP addresses if there */
1431 if (xisr
->sadb_x_ipsecrequest_len
> sizeof(*xisr
)) {
1432 struct sockaddr
*paddr
;
1434 paddr
= (struct sockaddr
*)(xisr
+ 1);
1436 /* validity check */
1438 > sizeof((*p_isr
)->saidx
.src
)) {
1439 ipseclog((LOG_DEBUG
, "key_msg2sp: invalid request "
1440 "address length.\n"));
1445 bcopy(paddr
, &(*p_isr
)->saidx
.src
,
1448 paddr
= (struct sockaddr
*)((caddr_t
)paddr
1451 /* validity check */
1453 > sizeof((*p_isr
)->saidx
.dst
)) {
1454 ipseclog((LOG_DEBUG
, "key_msg2sp: invalid request "
1455 "address length.\n"));
1460 bcopy(paddr
, &(*p_isr
)->saidx
.dst
,
1464 (*p_isr
)->sav
= NULL
;
1465 (*p_isr
)->sp
= newsp
;
1467 /* initialization for the next. */
1468 p_isr
= &(*p_isr
)->next
;
1469 tlen
-= xisr
->sadb_x_ipsecrequest_len
;
1471 /* validity check */
1473 ipseclog((LOG_DEBUG
, "key_msg2sp: becoming tlen < 0.\n"));
1479 xisr
= (struct sadb_x_ipsecrequest
*)((caddr_t
)xisr
1480 + xisr
->sadb_x_ipsecrequest_len
);
1485 ipseclog((LOG_DEBUG
, "key_msg2sp: invalid policy type.\n"));
1498 static u_int32_t auto_reqid
= IPSEC_MANUAL_REQID_MAX
+ 1;
1500 auto_reqid
= (auto_reqid
== ~0
1501 ? IPSEC_MANUAL_REQID_MAX
+ 1 : auto_reqid
+ 1);
1503 /* XXX should be unique check */
1509 * copy secpolicy struct to sadb_x_policy structure indicated.
1512 key_sp2msg(struct secpolicy
*sp
)
1514 struct sadb_x_policy
*xpl
;
1521 panic("key_sp2msg: NULL pointer was passed.");
1523 tlen
= key_getspreqmsglen(sp
);
1525 m
= key_alloc_mbuf(tlen
);
1526 if (!m
|| m
->m_next
) { /*XXX*/
1534 xpl
= mtod(m
, struct sadb_x_policy
*);
1537 xpl
->sadb_x_policy_len
= PFKEY_UNIT64(tlen
);
1538 xpl
->sadb_x_policy_exttype
= SADB_X_EXT_POLICY
;
1539 xpl
->sadb_x_policy_type
= sp
->policy
;
1540 xpl
->sadb_x_policy_dir
= sp
->spidx
.dir
;
1541 xpl
->sadb_x_policy_id
= sp
->id
;
1542 p
= (caddr_t
)xpl
+ sizeof(*xpl
);
1544 /* if is the policy for ipsec ? */
1545 if (sp
->policy
== IPSEC_POLICY_IPSEC
) {
1546 struct sadb_x_ipsecrequest
*xisr
;
1547 struct ipsecrequest
*isr
;
1549 for (isr
= sp
->req
; isr
!= NULL
; isr
= isr
->next
) {
1551 xisr
= (struct sadb_x_ipsecrequest
*)p
;
1553 xisr
->sadb_x_ipsecrequest_proto
= isr
->saidx
.proto
;
1554 xisr
->sadb_x_ipsecrequest_mode
= isr
->saidx
.mode
;
1555 xisr
->sadb_x_ipsecrequest_level
= isr
->level
;
1556 xisr
->sadb_x_ipsecrequest_reqid
= isr
->saidx
.reqid
;
1559 bcopy(&isr
->saidx
.src
, p
, isr
->saidx
.src
.sa
.sa_len
);
1560 p
+= isr
->saidx
.src
.sa
.sa_len
;
1561 bcopy(&isr
->saidx
.dst
, p
, isr
->saidx
.dst
.sa
.sa_len
);
1562 p
+= isr
->saidx
.src
.sa
.sa_len
;
1564 xisr
->sadb_x_ipsecrequest_len
=
1565 PFKEY_ALIGN8(sizeof(*xisr
)
1566 + isr
->saidx
.src
.sa
.sa_len
1567 + isr
->saidx
.dst
.sa
.sa_len
);
1574 /* m will not be freed nor modified */
1575 static struct mbuf
*
1576 key_gather_mbuf(struct mbuf
*m
, const struct sadb_msghdr
*mhp
,
1577 int ndeep
, int nitem
, ...)
1582 struct mbuf
*result
= NULL
, *n
;
1585 if (m
== NULL
|| mhp
== NULL
)
1586 panic("null pointer passed to key_gather");
1588 __va_start(ap
, nitem
);
1589 for (i
= 0; i
< nitem
; i
++) {
1590 idx
= __va_arg(ap
, int);
1591 if (idx
< 0 || idx
> SADB_EXT_MAX
)
1593 /* don't attempt to pull empty extension */
1594 if (idx
== SADB_EXT_RESERVED
&& mhp
->msg
== NULL
)
1596 if (idx
!= SADB_EXT_RESERVED
&&
1597 (mhp
->ext
[idx
] == NULL
|| mhp
->extlen
[idx
] == 0))
1600 if (idx
== SADB_EXT_RESERVED
) {
1601 len
= PFKEY_ALIGN8(sizeof(struct sadb_msg
));
1604 panic("assumption failed");
1606 MGETHDR(n
, M_NOWAIT
, MT_DATA
);
1611 m_copydata(m
, 0, sizeof(struct sadb_msg
),
1613 } else if (i
< ndeep
) {
1614 len
= mhp
->extlen
[idx
];
1615 n
= key_alloc_mbuf(len
);
1616 if (!n
|| n
->m_next
) { /*XXX*/
1621 m_copydata(m
, mhp
->extoff
[idx
], mhp
->extlen
[idx
],
1624 n
= m_copym(m
, mhp
->extoff
[idx
], mhp
->extlen
[idx
],
1637 if (result
->m_flags
& M_PKTHDR
)
1638 result
->m_pkthdr
.len
= m_lengthm(result
, NULL
);
1648 * SADB_X_SPDADD, SADB_X_SPDSETIDX or SADB_X_SPDUPDATE processing
1649 * add an entry to SP database, when received
1650 * <base, address(SD), (lifetime(H),) policy>
1652 * Adding to SP database,
1654 * <base, address(SD), (lifetime(H),) policy>
1655 * to the socket which was send.
1657 * SPDADD set a unique policy entry.
1658 * SPDSETIDX like SPDADD without a part of policy requests.
1659 * SPDUPDATE replace a unique policy entry.
1661 * m will always be freed.
1664 key_spdadd(struct socket
*so
, struct mbuf
*m
, const struct sadb_msghdr
*mhp
)
1666 struct sadb_address
*src0
, *dst0
;
1667 struct sadb_x_policy
*xpl0
, *xpl
;
1668 struct sadb_lifetime
*lft
= NULL
;
1669 struct secpolicyindex spidx
;
1670 struct secpolicy
*newsp
;
1671 struct sockaddr
*saddr
, *daddr
;
1675 if (so
== NULL
|| m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
)
1676 panic("key_spdadd: NULL pointer is passed.");
1678 if (mhp
->ext
[SADB_EXT_ADDRESS_SRC
] == NULL
||
1679 mhp
->ext
[SADB_EXT_ADDRESS_DST
] == NULL
||
1680 mhp
->ext
[SADB_X_EXT_POLICY
] == NULL
) {
1681 ipseclog((LOG_DEBUG
, "key_spdadd: invalid message is passed.\n"));
1682 return key_senderror(so
, m
, EINVAL
);
1684 if (mhp
->extlen
[SADB_EXT_ADDRESS_SRC
] < sizeof(struct sadb_address
) ||
1685 mhp
->extlen
[SADB_EXT_ADDRESS_DST
] < sizeof(struct sadb_address
) ||
1686 mhp
->extlen
[SADB_X_EXT_POLICY
] < sizeof(struct sadb_x_policy
)) {
1687 ipseclog((LOG_DEBUG
, "key_spdadd: invalid message is passed.\n"));
1688 return key_senderror(so
, m
, EINVAL
);
1690 if (mhp
->ext
[SADB_EXT_LIFETIME_HARD
] != NULL
) {
1691 if (mhp
->extlen
[SADB_EXT_LIFETIME_HARD
]
1692 < sizeof(struct sadb_lifetime
)) {
1693 ipseclog((LOG_DEBUG
, "key_spdadd: invalid message is passed.\n"));
1694 return key_senderror(so
, m
, EINVAL
);
1696 lft
= (struct sadb_lifetime
*)mhp
->ext
[SADB_EXT_LIFETIME_HARD
];
1699 src0
= (struct sadb_address
*)mhp
->ext
[SADB_EXT_ADDRESS_SRC
];
1700 dst0
= (struct sadb_address
*)mhp
->ext
[SADB_EXT_ADDRESS_DST
];
1701 xpl0
= (struct sadb_x_policy
*)mhp
->ext
[SADB_X_EXT_POLICY
];
1704 /* XXX boundary check against sa_len */
1705 KEY_SETSECSPIDX(xpl0
->sadb_x_policy_dir
,
1708 src0
->sadb_address_prefixlen
,
1709 dst0
->sadb_address_prefixlen
,
1710 src0
->sadb_address_proto
,
1713 /* checking the direciton. */
1714 switch (xpl0
->sadb_x_policy_dir
) {
1715 case IPSEC_DIR_INBOUND
:
1716 case IPSEC_DIR_OUTBOUND
:
1719 ipseclog((LOG_DEBUG
, "key_spdadd: Invalid SP direction.\n"));
1720 mhp
->msg
->sadb_msg_errno
= EINVAL
;
1725 /* key_spdadd() accepts DISCARD, NONE and IPSEC. */
1726 if (xpl0
->sadb_x_policy_type
== IPSEC_POLICY_ENTRUST
1727 || xpl0
->sadb_x_policy_type
== IPSEC_POLICY_BYPASS
) {
1728 ipseclog((LOG_DEBUG
, "key_spdadd: Invalid policy type.\n"));
1729 return key_senderror(so
, m
, EINVAL
);
1732 /* policy requests are mandatory when action is ipsec. */
1733 if (mhp
->msg
->sadb_msg_type
!= SADB_X_SPDSETIDX
1734 && xpl0
->sadb_x_policy_type
== IPSEC_POLICY_IPSEC
1735 && mhp
->extlen
[SADB_X_EXT_POLICY
] <= sizeof(*xpl0
)) {
1736 ipseclog((LOG_DEBUG
, "key_spdadd: some policy requests part required.\n"));
1737 return key_senderror(so
, m
, EINVAL
);
1741 * checking there is SP already or not.
1742 * SPDUPDATE doesn't depend on whether there is a SP or not.
1743 * If the type is either SPDADD or SPDSETIDX AND a SP is found,
1746 newsp
= key_getsp(&spidx
);
1747 if (mhp
->msg
->sadb_msg_type
== SADB_X_SPDUPDATE
) {
1749 newsp
->state
= IPSEC_SPSTATE_DEAD
;
1753 if (newsp
!= NULL
) {
1755 ipseclog((LOG_DEBUG
, "key_spdadd: a SP entry exists already.\n"));
1756 return key_senderror(so
, m
, EEXIST
);
1760 /* allocation new SP entry */
1761 if ((newsp
= key_msg2sp(xpl0
, PFKEY_EXTLEN(xpl0
), &error
)) == NULL
) {
1762 return key_senderror(so
, m
, error
);
1765 if ((newsp
->id
= key_getnewspid()) == 0) {
1767 return key_senderror(so
, m
, ENOBUFS
);
1770 /* XXX boundary check against sa_len */
1771 KEY_SETSECSPIDX(xpl0
->sadb_x_policy_dir
,
1774 src0
->sadb_address_prefixlen
,
1775 dst0
->sadb_address_prefixlen
,
1776 src0
->sadb_address_proto
,
1779 /* sanity check on addr pair */
1780 saddr
= (struct sockaddr
*)(src0
+ 1);
1781 daddr
= (struct sockaddr
*)(dst0
+ 1);
1782 if (saddr
->sa_family
!= daddr
->sa_family
) {
1784 return key_senderror(so
, m
, EINVAL
);
1786 if (saddr
->sa_len
!= daddr
->sa_len
) {
1788 return key_senderror(so
, m
, EINVAL
);
1791 if (newsp
->req
&& newsp
->req
->saidx
.src
.sa
.sa_family
) {
1792 if (saddr
->sa_family
!= newsp
->req
->saidx
.src
.sa
.sa_family
) {
1794 return key_senderror(so
, m
, EINVAL
);
1797 if (newsp
->req
&& newsp
->req
->saidx
.dst
.sa
.sa_family
) {
1798 if (daddr
->sa_family
!= newsp
->req
->saidx
.dst
.sa
.sa_family
) {
1800 return key_senderror(so
, m
, EINVAL
);
1805 newsp
->created
= time_second
;
1806 newsp
->lastused
= newsp
->created
;
1807 newsp
->lifetime
= lft
? lft
->sadb_lifetime_addtime
: 0;
1808 newsp
->validtime
= lft
? lft
->sadb_lifetime_usetime
: 0;
1810 newsp
->refcnt
= 1; /* do not reclaim until I say I do */
1811 newsp
->state
= IPSEC_SPSTATE_ALIVE
;
1812 LIST_INSERT_TAIL(&sptree
[newsp
->spidx
.dir
], newsp
, secpolicy
, chain
);
1814 /* delete the entry in spacqtree */
1815 if (mhp
->msg
->sadb_msg_type
== SADB_X_SPDUPDATE
) {
1816 struct secspacq
*spacq
;
1817 if ((spacq
= key_getspacq(&spidx
)) != NULL
) {
1818 /* reset counter in order to deletion by timehandler. */
1819 spacq
->created
= time_second
;
1825 struct mbuf
*n
, *mpolicy
;
1826 struct sadb_msg
*newmsg
;
1829 /* create new sadb_msg to reply. */
1831 n
= key_gather_mbuf(m
, mhp
, 2, 5, SADB_EXT_RESERVED
,
1832 SADB_X_EXT_POLICY
, SADB_EXT_LIFETIME_HARD
,
1833 SADB_EXT_ADDRESS_SRC
, SADB_EXT_ADDRESS_DST
);
1835 n
= key_gather_mbuf(m
, mhp
, 2, 4, SADB_EXT_RESERVED
,
1837 SADB_EXT_ADDRESS_SRC
, SADB_EXT_ADDRESS_DST
);
1840 return key_senderror(so
, m
, ENOBUFS
);
1842 if (n
->m_len
< sizeof(*newmsg
)) {
1843 n
= m_pullup(n
, sizeof(*newmsg
));
1845 return key_senderror(so
, m
, ENOBUFS
);
1847 newmsg
= mtod(n
, struct sadb_msg
*);
1848 newmsg
->sadb_msg_errno
= 0;
1849 newmsg
->sadb_msg_len
= PFKEY_UNIT64(n
->m_pkthdr
.len
);
1852 mpolicy
= m_pulldown(n
, PFKEY_ALIGN8(sizeof(struct sadb_msg
)),
1853 sizeof(*xpl
), &off
);
1854 if (mpolicy
== NULL
) {
1855 /* n is already freed */
1856 return key_senderror(so
, m
, ENOBUFS
);
1858 xpl
= (struct sadb_x_policy
*)(mtod(mpolicy
, caddr_t
) + off
);
1859 if (xpl
->sadb_x_policy_exttype
!= SADB_X_EXT_POLICY
) {
1861 return key_senderror(so
, m
, EINVAL
);
1863 xpl
->sadb_x_policy_id
= newsp
->id
;
1866 return key_sendup_mbuf(so
, n
, KEY_SENDUP_ALL
);
1871 * get new policy id.
1877 key_getnewspid(void)
1879 u_int32_t newid
= 0;
1880 int count
= key_spi_trycnt
; /* XXX */
1881 struct secpolicy
*sp
;
1883 /* when requesting to allocate spi ranged */
1885 newid
= (policy_id
= (policy_id
== ~0 ? 1 : policy_id
+ 1));
1887 if ((sp
= key_getspbyid(newid
)) == NULL
)
1893 if (count
== 0 || newid
== 0) {
1894 ipseclog((LOG_DEBUG
, "key_getnewspid: to allocate policy id is failed.\n"));
1902 * SADB_SPDDELETE processing
1904 * <base, address(SD), policy(*)>
1905 * from the user(?), and set SADB_SASTATE_DEAD,
1907 * <base, address(SD), policy(*)>
1909 * policy(*) including direction of policy.
1911 * m will always be freed.
1914 key_spddelete(struct socket
*so
, struct mbuf
*m
, const struct sadb_msghdr
*mhp
)
1916 struct sadb_address
*src0
, *dst0
;
1917 struct sadb_x_policy
*xpl0
;
1918 struct secpolicyindex spidx
;
1919 struct secpolicy
*sp
;
1922 if (so
== NULL
|| m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
)
1923 panic("key_spddelete: NULL pointer is passed.");
1925 if (mhp
->ext
[SADB_EXT_ADDRESS_SRC
] == NULL
||
1926 mhp
->ext
[SADB_EXT_ADDRESS_DST
] == NULL
||
1927 mhp
->ext
[SADB_X_EXT_POLICY
] == NULL
) {
1928 ipseclog((LOG_DEBUG
, "key_spddelete: invalid message is passed.\n"));
1929 return key_senderror(so
, m
, EINVAL
);
1931 if (mhp
->extlen
[SADB_EXT_ADDRESS_SRC
] < sizeof(struct sadb_address
) ||
1932 mhp
->extlen
[SADB_EXT_ADDRESS_DST
] < sizeof(struct sadb_address
) ||
1933 mhp
->extlen
[SADB_X_EXT_POLICY
] < sizeof(struct sadb_x_policy
)) {
1934 ipseclog((LOG_DEBUG
, "key_spddelete: invalid message is passed.\n"));
1935 return key_senderror(so
, m
, EINVAL
);
1938 src0
= (struct sadb_address
*)mhp
->ext
[SADB_EXT_ADDRESS_SRC
];
1939 dst0
= (struct sadb_address
*)mhp
->ext
[SADB_EXT_ADDRESS_DST
];
1940 xpl0
= (struct sadb_x_policy
*)mhp
->ext
[SADB_X_EXT_POLICY
];
1943 /* XXX boundary check against sa_len */
1944 KEY_SETSECSPIDX(xpl0
->sadb_x_policy_dir
,
1947 src0
->sadb_address_prefixlen
,
1948 dst0
->sadb_address_prefixlen
,
1949 src0
->sadb_address_proto
,
1952 /* checking the direciton. */
1953 switch (xpl0
->sadb_x_policy_dir
) {
1954 case IPSEC_DIR_INBOUND
:
1955 case IPSEC_DIR_OUTBOUND
:
1958 ipseclog((LOG_DEBUG
, "key_spddelete: Invalid SP direction.\n"));
1959 return key_senderror(so
, m
, EINVAL
);
1962 /* Is there SP in SPD ? */
1963 if ((sp
= key_getsp(&spidx
)) == NULL
) {
1964 ipseclog((LOG_DEBUG
, "key_spddelete: no SP found.\n"));
1965 return key_senderror(so
, m
, EINVAL
);
1968 /* save policy id to buffer to be returned. */
1969 xpl0
->sadb_x_policy_id
= sp
->id
;
1971 sp
->state
= IPSEC_SPSTATE_DEAD
;
1976 struct sadb_msg
*newmsg
;
1978 /* create new sadb_msg to reply. */
1979 n
= key_gather_mbuf(m
, mhp
, 1, 4, SADB_EXT_RESERVED
,
1980 SADB_X_EXT_POLICY
, SADB_EXT_ADDRESS_SRC
, SADB_EXT_ADDRESS_DST
);
1982 return key_senderror(so
, m
, ENOBUFS
);
1984 newmsg
= mtod(n
, struct sadb_msg
*);
1985 newmsg
->sadb_msg_errno
= 0;
1986 newmsg
->sadb_msg_len
= PFKEY_UNIT64(n
->m_pkthdr
.len
);
1989 return key_sendup_mbuf(so
, n
, KEY_SENDUP_ALL
);
1994 * SADB_SPDDELETE2 processing
1997 * from the user(?), and set SADB_SASTATE_DEAD,
2001 * policy(*) including direction of policy.
2003 * m will always be freed.
2006 key_spddelete2(struct socket
*so
, struct mbuf
*m
,
2007 const struct sadb_msghdr
*mhp
)
2010 struct secpolicy
*sp
;
2013 if (so
== NULL
|| m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
)
2014 panic("key_spddelete2: NULL pointer is passed.");
2016 if (mhp
->ext
[SADB_X_EXT_POLICY
] == NULL
||
2017 mhp
->extlen
[SADB_X_EXT_POLICY
] < sizeof(struct sadb_x_policy
)) {
2018 ipseclog((LOG_DEBUG
, "key_spddelete2: invalid message is passed.\n"));
2019 key_senderror(so
, m
, EINVAL
);
2023 id
= ((struct sadb_x_policy
*)mhp
->ext
[SADB_X_EXT_POLICY
])->sadb_x_policy_id
;
2025 /* Is there SP in SPD ? */
2026 if ((sp
= key_getspbyid(id
)) == NULL
) {
2027 ipseclog((LOG_DEBUG
, "key_spddelete2: no SP found id:%u.\n", id
));
2028 key_senderror(so
, m
, EINVAL
);
2031 sp
->state
= IPSEC_SPSTATE_DEAD
;
2036 struct sadb_msg
*newmsg
;
2039 /* create new sadb_msg to reply. */
2040 len
= PFKEY_ALIGN8(sizeof(struct sadb_msg
));
2043 return key_senderror(so
, m
, ENOBUFS
);
2044 n
= m_getb(len
, M_NOWAIT
, MT_DATA
, M_PKTHDR
);
2046 return key_senderror(so
, m
, ENOBUFS
);
2049 m_copydata(m
, 0, sizeof(struct sadb_msg
), mtod(n
, caddr_t
));
2050 off
= PFKEY_ALIGN8(sizeof(struct sadb_msg
));
2054 panic("length inconsistency in key_spddelete2");
2057 n
->m_next
= m_copym(m
, mhp
->extoff
[SADB_X_EXT_POLICY
],
2058 mhp
->extlen
[SADB_X_EXT_POLICY
], M_NOWAIT
);
2061 return key_senderror(so
, m
, ENOBUFS
);
2063 n
->m_pkthdr
.len
= m_lengthm(n
, NULL
);
2065 newmsg
= mtod(n
, struct sadb_msg
*);
2066 newmsg
->sadb_msg_errno
= 0;
2067 newmsg
->sadb_msg_len
= PFKEY_UNIT64(n
->m_pkthdr
.len
);
2070 return key_sendup_mbuf(so
, n
, KEY_SENDUP_ALL
);
2075 * SADB_X_GET processing
2080 * <base, address(SD), policy>
2082 * policy(*) including direction of policy.
2084 * m will always be freed.
2087 key_spdget(struct socket
*so
, struct mbuf
*m
, const struct sadb_msghdr
*mhp
)
2090 struct secpolicy
*sp
;
2094 if (so
== NULL
|| m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
)
2095 panic("key_spdget: NULL pointer is passed.");
2097 if (mhp
->ext
[SADB_X_EXT_POLICY
] == NULL
||
2098 mhp
->extlen
[SADB_X_EXT_POLICY
] < sizeof(struct sadb_x_policy
)) {
2099 ipseclog((LOG_DEBUG
, "key_spdget: invalid message is passed.\n"));
2100 return key_senderror(so
, m
, EINVAL
);
2103 id
= ((struct sadb_x_policy
*)mhp
->ext
[SADB_X_EXT_POLICY
])->sadb_x_policy_id
;
2105 /* Is there SP in SPD ? */
2106 if ((sp
= key_getspbyid(id
)) == NULL
) {
2107 ipseclog((LOG_DEBUG
, "key_spdget: no SP found id:%u.\n", id
));
2108 return key_senderror(so
, m
, ENOENT
);
2111 n
= key_setdumpsp(sp
, SADB_X_SPDGET
, 0, mhp
->msg
->sadb_msg_pid
);
2114 return key_sendup_mbuf(so
, n
, KEY_SENDUP_ONE
);
2116 return key_senderror(so
, m
, ENOBUFS
);
2120 * SADB_X_SPDACQUIRE processing.
2121 * Acquire policy and SA(s) for a *OUTBOUND* packet.
2124 * to KMD, and expect to receive
2125 * <base> with SADB_X_SPDACQUIRE if error occured,
2128 * with SADB_X_SPDUPDATE from KMD by PF_KEY.
2129 * policy(*) is without policy requests.
2132 * others: error number
2135 key_spdacquire(struct secpolicy
*sp
)
2137 struct mbuf
*result
= NULL
, *m
;
2138 struct secspacq
*newspacq
;
2143 panic("key_spdacquire: NULL pointer is passed.");
2144 if (sp
->req
!= NULL
)
2145 panic("key_spdacquire: called but there is request.");
2146 if (sp
->policy
!= IPSEC_POLICY_IPSEC
)
2147 panic("key_spdacquire: policy mismatched. IPsec is expected.");
2149 /* Get an entry to check whether sent message or not. */
2150 if ((newspacq
= key_getspacq(&sp
->spidx
)) != NULL
) {
2151 if (key_blockacq_count
< newspacq
->count
) {
2152 /* reset counter and do send message. */
2153 newspacq
->count
= 0;
2155 /* increment counter and do nothing. */
2160 /* make new entry for blocking to send SADB_ACQUIRE. */
2161 if ((newspacq
= key_newspacq(&sp
->spidx
)) == NULL
)
2164 /* add to acqtree */
2165 LIST_INSERT_HEAD(&spacqtree
, newspacq
, chain
);
2168 /* create new sadb_msg to reply. */
2169 m
= key_setsadbmsg(SADB_X_SPDACQUIRE
, 0, 0, 0, 0, 0);
2175 result
->m_pkthdr
.len
= m_lengthm(result
, NULL
);
2176 mtod(result
, struct sadb_msg
*)->sadb_msg_len
=
2177 PFKEY_UNIT64(result
->m_pkthdr
.len
);
2179 return key_sendup_mbuf(NULL
, m
, KEY_SENDUP_REGISTERED
);
2188 * SADB_SPDFLUSH processing
2191 * from the user, and free all entries in secpctree.
2195 * NOTE: what to do is only marking SADB_SASTATE_DEAD.
2197 * m will always be freed.
2200 key_spdflush(struct socket
*so
, struct mbuf
*m
, const struct sadb_msghdr
*mhp
)
2202 struct sadb_msg
*newmsg
;
2203 struct secpolicy
*sp
;
2207 if (so
== NULL
|| m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
)
2208 panic("key_spdflush: NULL pointer is passed.");
2210 if (m
->m_len
!= PFKEY_ALIGN8(sizeof(struct sadb_msg
)))
2211 return key_senderror(so
, m
, EINVAL
);
2213 for (dir
= 0; dir
< IPSEC_DIR_MAX
; dir
++) {
2214 LIST_FOREACH(sp
, &sptree
[dir
], chain
) {
2215 sp
->state
= IPSEC_SPSTATE_DEAD
;
2219 if (sizeof(struct sadb_msg
) > m
->m_len
+ M_TRAILINGSPACE(m
)) {
2220 ipseclog((LOG_DEBUG
, "key_spdflush: No more memory.\n"));
2221 return key_senderror(so
, m
, ENOBUFS
);
2227 m
->m_pkthdr
.len
= m
->m_len
= PFKEY_ALIGN8(sizeof(struct sadb_msg
));
2228 newmsg
= mtod(m
, struct sadb_msg
*);
2229 newmsg
->sadb_msg_errno
= 0;
2230 newmsg
->sadb_msg_len
= PFKEY_UNIT64(m
->m_pkthdr
.len
);
2232 return key_sendup_mbuf(so
, m
, KEY_SENDUP_ALL
);
2236 * SADB_SPDDUMP processing
2239 * from the user, and dump all SP leaves
2244 * m will always be freed.
2247 key_spddump(struct socket
*so
, struct mbuf
*m
, const struct sadb_msghdr
*mhp
)
2249 struct secpolicy
*sp
;
2255 if (so
== NULL
|| m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
)
2256 panic("key_spddump: NULL pointer is passed.");
2258 /* search SPD entry and get buffer size. */
2260 for (dir
= 0; dir
< IPSEC_DIR_MAX
; dir
++) {
2261 LIST_FOREACH(sp
, &sptree
[dir
], chain
) {
2267 return key_senderror(so
, m
, ENOENT
);
2269 for (dir
= 0; dir
< IPSEC_DIR_MAX
; dir
++) {
2270 LIST_FOREACH(sp
, &sptree
[dir
], chain
) {
2272 n
= key_setdumpsp(sp
, SADB_X_SPDDUMP
, cnt
,
2273 mhp
->msg
->sadb_msg_pid
);
2276 key_sendup_mbuf(so
, n
, KEY_SENDUP_ONE
);
2284 static struct mbuf
*
2285 key_setdumpsp(struct secpolicy
*sp
, u_int8_t type
, u_int32_t seq
,
2288 struct mbuf
*result
= NULL
, *m
;
2290 m
= key_setsadbmsg(type
, 0, SADB_SATYPE_UNSPEC
, seq
, pid
, sp
->refcnt
);
2295 m
= key_setsadbaddr(SADB_EXT_ADDRESS_SRC
,
2296 &sp
->spidx
.src
.sa
, sp
->spidx
.prefs
,
2297 sp
->spidx
.ul_proto
);
2302 m
= key_setsadbaddr(SADB_EXT_ADDRESS_DST
,
2303 &sp
->spidx
.dst
.sa
, sp
->spidx
.prefd
,
2304 sp
->spidx
.ul_proto
);
2314 if ((result
->m_flags
& M_PKTHDR
) == 0)
2317 if (result
->m_len
< sizeof(struct sadb_msg
)) {
2318 result
= m_pullup(result
, sizeof(struct sadb_msg
));
2322 result
->m_pkthdr
.len
= m_lengthm(result
, NULL
);
2323 mtod(result
, struct sadb_msg
*)->sadb_msg_len
=
2324 PFKEY_UNIT64(result
->m_pkthdr
.len
);
2334 * get PFKEY message length for security policy and request.
2337 key_getspreqmsglen(struct secpolicy
*sp
)
2339 struct ipsecrequest
*isr
;
2342 tlen
= sizeof(struct sadb_x_policy
);
2344 /* if is the policy for ipsec ? */
2345 if (sp
->policy
!= IPSEC_POLICY_IPSEC
)
2348 /* get length of ipsec requests */
2349 for (isr
= sp
->req
; isr
!= NULL
; isr
= isr
->next
) {
2350 len
= sizeof(struct sadb_x_ipsecrequest
) +
2351 isr
->saidx
.src
.sa
.sa_len
+ isr
->saidx
.dst
.sa
.sa_len
;
2353 tlen
+= PFKEY_ALIGN8(len
);
2360 * SADB_SPDEXPIRE processing
2362 * <base, address(SD), lifetime(CH), policy>
2366 * others : error number
2369 key_spdexpire(struct secpolicy
*sp
)
2372 struct mbuf
*result
= NULL
, *m
;
2375 struct sadb_lifetime
*lt
;
2377 /* XXX: Why do we lock ? */
2382 panic("key_spdexpire: NULL pointer is passed.");
2384 /* set msg header */
2385 m
= key_setsadbmsg(SADB_X_SPDEXPIRE
, 0, 0, 0, 0, 0);
2392 /* create lifetime extension (current and hard) */
2393 len
= PFKEY_ALIGN8(sizeof(*lt
)) * 2;
2394 m
= key_alloc_mbuf(len
);
2395 if (!m
|| m
->m_next
) { /*XXX*/
2401 bzero(mtod(m
, caddr_t
), len
);
2402 lt
= mtod(m
, struct sadb_lifetime
*);
2403 lt
->sadb_lifetime_len
= PFKEY_UNIT64(sizeof(struct sadb_lifetime
));
2404 lt
->sadb_lifetime_exttype
= SADB_EXT_LIFETIME_CURRENT
;
2405 lt
->sadb_lifetime_allocations
= 0;
2406 lt
->sadb_lifetime_bytes
= 0;
2407 lt
->sadb_lifetime_addtime
= sp
->created
;
2408 lt
->sadb_lifetime_usetime
= sp
->lastused
;
2409 lt
= (struct sadb_lifetime
*)(mtod(m
, caddr_t
) + len
/ 2);
2410 lt
->sadb_lifetime_len
= PFKEY_UNIT64(sizeof(struct sadb_lifetime
));
2411 lt
->sadb_lifetime_exttype
= SADB_EXT_LIFETIME_HARD
;
2412 lt
->sadb_lifetime_allocations
= 0;
2413 lt
->sadb_lifetime_bytes
= 0;
2414 lt
->sadb_lifetime_addtime
= sp
->lifetime
;
2415 lt
->sadb_lifetime_usetime
= sp
->validtime
;
2418 /* set sadb_address for source */
2419 m
= key_setsadbaddr(SADB_EXT_ADDRESS_SRC
,
2421 sp
->spidx
.prefs
, sp
->spidx
.ul_proto
);
2428 /* set sadb_address for destination */
2429 m
= key_setsadbaddr(SADB_EXT_ADDRESS_DST
,
2431 sp
->spidx
.prefd
, sp
->spidx
.ul_proto
);
2446 if ((result
->m_flags
& M_PKTHDR
) == 0) {
2451 if (result
->m_len
< sizeof(struct sadb_msg
)) {
2452 result
= m_pullup(result
, sizeof(struct sadb_msg
));
2453 if (result
== NULL
) {
2458 result
->m_pkthdr
.len
= m_lengthm(result
, NULL
);
2459 mtod(result
, struct sadb_msg
*)->sadb_msg_len
=
2460 PFKEY_UNIT64(result
->m_pkthdr
.len
);
2462 error
= key_sendup_mbuf(NULL
, result
, KEY_SENDUP_REGISTERED
);
2473 /* %%% SAD management */
2475 * allocating a memory for new SA head, and copy from the values of mhp.
2476 * OUT: NULL : failure due to the lack of memory.
2477 * others : pointer to new SA head.
2479 static struct secashead
*
2480 key_newsah(struct secasindex
*saidx
)
2482 struct secashead
*newsah
;
2484 KASSERT(saidx
!= NULL
, ("key_newsaidx: null saidx"));
2486 newsah
= kmalloc(sizeof(struct secashead
), M_SECA
,
2487 M_INTWAIT
| M_ZERO
| M_NULLOK
);
2488 if (newsah
!= NULL
) {
2490 for (i
= 0; i
< NELEM(newsah
->savtree
); i
++)
2491 LIST_INIT(&newsah
->savtree
[i
]);
2492 newsah
->saidx
= *saidx
;
2494 /* add to saidxtree */
2495 newsah
->state
= SADB_SASTATE_MATURE
;
2496 LIST_INSERT_HEAD(&sahtree
, newsah
, chain
);
2502 * Delete SA index and all registered SAs.
2505 key_delsah(struct secashead
*sah
)
2507 struct secasvar
*sav
, *nextsav
;
2513 panic("key_delsah: NULL pointer is passed.");
2517 /* searching all SA registerd in the secindex. */
2518 for (stateidx
= 0; stateidx
< NELEM(saorder_state_any
);
2520 u_int state
= saorder_state_any
[stateidx
];
2522 LIST_FOREACH_MUTABLE(sav
, &sah
->savtree
[state
], chain
, nextsav
)
2523 if (sav
->refcnt
== 0) {
2525 KEY_CHKSASTATE(state
, sav
->state
, __func__
);
2528 /* give up to delete this SA */
2533 /* Delete sah it has are no savs. */
2534 if (nzombies
== 0) {
2535 /* remove from tree of SA index */
2536 if (__LIST_CHAINED(sah
))
2537 LIST_REMOVE(sah
, chain
);
2538 if (sah
->sa_route
.ro_rt
) {
2539 RTFREE(sah
->sa_route
.ro_rt
);
2540 sah
->sa_route
.ro_rt
= NULL
;
2550 * allocating a new SA with LARVAL state. key_add() and key_getspi() call,
2551 * and copy the values of mhp into new buffer.
2552 * When SAD message type is GETSPI:
2553 * to set sequence number from acq_seq++,
2554 * to set zero to SPI.
2555 * not to call key_setsava().
2557 * others : pointer to new secasvar.
2559 * does not modify mbuf. does not free mbuf on error.
2561 static struct secasvar
*
2562 key_newsav(struct mbuf
*m
, const struct sadb_msghdr
*mhp
, struct secashead
*sah
,
2563 int *errp
, const char *where
, int tag
)
2565 struct secasvar
*newsav
;
2566 const struct sadb_sa
*xsa
;
2569 if (m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
|| sah
== NULL
)
2570 panic("key_newsa: NULL pointer is passed.");
2572 KMALLOC(newsav
, struct secasvar
*, sizeof(struct secasvar
));
2573 if (newsav
== NULL
) {
2574 ipseclog((LOG_DEBUG
, "key_newsa: No more memory.\n"));
2578 bzero((caddr_t
)newsav
, sizeof(struct secasvar
));
2580 switch (mhp
->msg
->sadb_msg_type
) {
2584 #ifdef IPSEC_DOSEQCHECK
2585 /* sync sequence number */
2586 if (mhp
->msg
->sadb_msg_seq
== 0)
2588 (acq_seq
= (acq_seq
== ~0 ? 1 : ++acq_seq
));
2591 newsav
->seq
= mhp
->msg
->sadb_msg_seq
;
2596 if (mhp
->ext
[SADB_EXT_SA
] == NULL
) {
2597 KFREE(newsav
), newsav
= NULL
;
2598 ipseclog((LOG_DEBUG
, "key_newsa: invalid message is passed.\n"));
2602 xsa
= (const struct sadb_sa
*)mhp
->ext
[SADB_EXT_SA
];
2603 newsav
->spi
= xsa
->sadb_sa_spi
;
2604 newsav
->seq
= mhp
->msg
->sadb_msg_seq
;
2607 KFREE(newsav
), newsav
= NULL
;
2612 /* copy sav values */
2613 if (mhp
->msg
->sadb_msg_type
!= SADB_GETSPI
) {
2614 *errp
= key_setsaval(newsav
, m
, mhp
);
2616 KFREE(newsav
), newsav
= NULL
;
2622 newsav
->created
= time_second
;
2623 newsav
->pid
= mhp
->msg
->sadb_msg_pid
;
2628 newsav
->state
= SADB_SASTATE_LARVAL
;
2629 LIST_INSERT_TAIL(&sah
->savtree
[SADB_SASTATE_LARVAL
], newsav
,
2632 KEYDEBUG(KEYDEBUG_IPSEC_STAMP
,
2633 kprintf("DP key_newsav from %s:%u return SP:%p\n",
2634 where
, tag
, newsav
));
2640 * free() SA variable entry.
2643 key_delsav(struct secasvar
*sav
)
2645 KASSERT(sav
!= NULL
, ("key_delsav: null sav"));
2646 KASSERT(sav
->refcnt
== 0,
2647 ("key_delsav: reference count %u > 0", sav
->refcnt
));
2649 /* remove from SA header */
2650 if (__LIST_CHAINED(sav
))
2651 LIST_REMOVE(sav
, chain
);
2654 * Cleanup xform state. Note that zeroize'ing causes the
2655 * keys to be cleared; otherwise we must do it ourself.
2657 if (sav
->tdb_xform
!= NULL
) {
2658 sav
->tdb_xform
->xf_zeroize(sav
);
2659 sav
->tdb_xform
= NULL
;
2661 if (sav
->key_auth
!= NULL
)
2662 bzero(_KEYBUF(sav
->key_auth
), _KEYLEN(sav
->key_auth
));
2663 if (sav
->key_enc
!= NULL
)
2664 bzero(_KEYBUF(sav
->key_enc
), _KEYLEN(sav
->key_enc
));
2666 if (sav
->key_auth
!= NULL
) {
2667 KFREE(sav
->key_auth
);
2668 sav
->key_auth
= NULL
;
2670 if (sav
->key_enc
!= NULL
) {
2671 KFREE(sav
->key_enc
);
2672 sav
->key_enc
= NULL
;
2675 bzero(sav
->sched
, sav
->schedlen
);
2679 if (sav
->replay
!= NULL
) {
2683 if (sav
->lft_c
!= NULL
) {
2687 if (sav
->lft_h
!= NULL
) {
2691 if (sav
->lft_s
!= NULL
) {
2695 if (sav
->iv
!= NULL
) {
2709 * others : found, pointer to a SA.
2711 static struct secashead
*
2712 key_getsah(struct secasindex
*saidx
)
2714 struct secashead
*sah
;
2716 LIST_FOREACH(sah
, &sahtree
, chain
) {
2717 if (sah
->state
== SADB_SASTATE_DEAD
)
2719 if (key_cmpsaidx(&sah
->saidx
, saidx
, CMP_REQID
))
2727 * check not to be duplicated SPI.
2728 * NOTE: this function is too slow due to searching all SAD.
2731 * others : found, pointer to a SA.
2733 static struct secasvar
*
2734 key_checkspidup(struct secasindex
*saidx
, u_int32_t spi
)
2736 struct secashead
*sah
;
2737 struct secasvar
*sav
;
2739 /* check address family */
2740 if (saidx
->src
.sa
.sa_family
!= saidx
->dst
.sa
.sa_family
) {
2741 ipseclog((LOG_DEBUG
, "key_checkspidup: address family mismatched.\n"));
2746 LIST_FOREACH(sah
, &sahtree
, chain
) {
2747 if (!key_ismyaddr((struct sockaddr
*)&sah
->saidx
.dst
))
2749 sav
= key_getsavbyspi(sah
, spi
);
2758 * search SAD litmited alive SA, protocol, SPI.
2761 * others : found, pointer to a SA.
2763 static struct secasvar
*
2764 key_getsavbyspi(struct secashead
*sah
, u_int32_t spi
)
2766 struct secasvar
*sav
;
2769 /* search all status */
2770 for (stateidx
= 0; stateidx
< NELEM(saorder_state_alive
);
2772 u_int state
= saorder_state_alive
[stateidx
];
2774 LIST_FOREACH(sav
, &sah
->savtree
[state
], chain
) {
2776 if (sav
->state
!= state
) {
2777 ipseclog((LOG_DEBUG
, "key_getsavbyspi: "
2778 "invalid sav->state (queue: %d SA: %d)\n",
2779 state
, sav
->state
));
2783 if (sav
->spi
== spi
)
2792 * copy SA values from PF_KEY message except *SPI, SEQ, PID, STATE and TYPE*.
2793 * You must update these if need.
2797 * does not modify mbuf. does not free mbuf on error.
2800 key_setsaval(struct secasvar
*sav
, struct mbuf
*m
,
2801 const struct sadb_msghdr
*mhp
)
2806 if (m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
)
2807 panic("key_setsaval: NULL pointer is passed.");
2809 /* initialization */
2811 sav
->key_auth
= NULL
;
2812 sav
->key_enc
= NULL
;
2819 sav
->tdb_xform
= NULL
; /* transform */
2820 sav
->tdb_encalgxform
= NULL
; /* encoding algorithm */
2821 sav
->tdb_authalgxform
= NULL
; /* authentication algorithm */
2822 sav
->tdb_compalgxform
= NULL
; /* compression algorithm */
2825 if (mhp
->ext
[SADB_EXT_SA
] != NULL
) {
2826 const struct sadb_sa
*sa0
;
2828 sa0
= (const struct sadb_sa
*)mhp
->ext
[SADB_EXT_SA
];
2829 if (mhp
->extlen
[SADB_EXT_SA
] < sizeof(*sa0
)) {
2834 sav
->alg_auth
= sa0
->sadb_sa_auth
;
2835 sav
->alg_enc
= sa0
->sadb_sa_encrypt
;
2836 sav
->flags
= sa0
->sadb_sa_flags
;
2839 if ((sa0
->sadb_sa_flags
& SADB_X_EXT_OLD
) == 0) {
2841 kmalloc(sizeof(struct secreplay
)+sa0
->sadb_sa_replay
,
2842 M_SECA
, M_INTWAIT
| M_ZERO
| M_NULLOK
);
2843 if (sav
->replay
== NULL
) {
2844 ipseclog((LOG_DEBUG
, "key_setsaval: No more memory.\n"));
2848 if (sa0
->sadb_sa_replay
!= 0)
2849 sav
->replay
->bitmap
= (caddr_t
)(sav
->replay
+1);
2850 sav
->replay
->wsize
= sa0
->sadb_sa_replay
;
2854 /* Authentication keys */
2855 if (mhp
->ext
[SADB_EXT_KEY_AUTH
] != NULL
) {
2856 const struct sadb_key
*key0
;
2859 key0
= (const struct sadb_key
*)mhp
->ext
[SADB_EXT_KEY_AUTH
];
2860 len
= mhp
->extlen
[SADB_EXT_KEY_AUTH
];
2863 if (len
< sizeof(*key0
)) {
2867 switch (mhp
->msg
->sadb_msg_satype
) {
2868 case SADB_SATYPE_AH
:
2869 case SADB_SATYPE_ESP
:
2870 if (len
== PFKEY_ALIGN8(sizeof(struct sadb_key
)) &&
2871 sav
->alg_auth
!= SADB_X_AALG_NULL
)
2874 case SADB_X_SATYPE_IPCOMP
:
2880 ipseclog((LOG_DEBUG
, "key_setsaval: invalid key_auth values.\n"));
2884 sav
->key_auth
= (struct sadb_key
*)key_newbuf(key0
, len
);
2885 if (sav
->key_auth
== NULL
) {
2886 ipseclog((LOG_DEBUG
, "key_setsaval: No more memory.\n"));
2892 /* Encryption key */
2893 if (mhp
->ext
[SADB_EXT_KEY_ENCRYPT
] != NULL
) {
2894 const struct sadb_key
*key0
;
2897 key0
= (const struct sadb_key
*)mhp
->ext
[SADB_EXT_KEY_ENCRYPT
];
2898 len
= mhp
->extlen
[SADB_EXT_KEY_ENCRYPT
];
2901 if (len
< sizeof(*key0
)) {
2905 switch (mhp
->msg
->sadb_msg_satype
) {
2906 case SADB_SATYPE_ESP
:
2907 if (len
== PFKEY_ALIGN8(sizeof(struct sadb_key
)) &&
2908 sav
->alg_enc
!= SADB_EALG_NULL
) {
2912 sav
->key_enc
= (struct sadb_key
*)key_newbuf(key0
, len
);
2913 if (sav
->key_enc
== NULL
) {
2914 ipseclog((LOG_DEBUG
, "key_setsaval: No more memory.\n"));
2919 case SADB_X_SATYPE_IPCOMP
:
2920 if (len
!= PFKEY_ALIGN8(sizeof(struct sadb_key
)))
2922 sav
->key_enc
= NULL
; /*just in case*/
2924 case SADB_SATYPE_AH
:
2930 ipseclog((LOG_DEBUG
, "key_setsatval: invalid key_enc value.\n"));
2938 switch (mhp
->msg
->sadb_msg_satype
) {
2939 case SADB_SATYPE_AH
:
2940 error
= xform_init(sav
, XF_AH
);
2942 case SADB_SATYPE_ESP
:
2943 error
= xform_init(sav
, XF_ESP
);
2945 case SADB_X_SATYPE_IPCOMP
:
2946 error
= xform_init(sav
, XF_IPCOMP
);
2950 ipseclog((LOG_DEBUG
,
2951 "key_setsaval: unable to initialize SA type %u.\n",
2952 mhp
->msg
->sadb_msg_satype
));
2957 sav
->created
= time_second
;
2959 /* make lifetime for CURRENT */
2960 KMALLOC(sav
->lft_c
, struct sadb_lifetime
*,
2961 sizeof(struct sadb_lifetime
));
2962 if (sav
->lft_c
== NULL
) {
2963 ipseclog((LOG_DEBUG
, "key_setsaval: No more memory.\n"));
2968 sav
->lft_c
->sadb_lifetime_len
=
2969 PFKEY_UNIT64(sizeof(struct sadb_lifetime
));
2970 sav
->lft_c
->sadb_lifetime_exttype
= SADB_EXT_LIFETIME_CURRENT
;
2971 sav
->lft_c
->sadb_lifetime_allocations
= 0;
2972 sav
->lft_c
->sadb_lifetime_bytes
= 0;
2973 sav
->lft_c
->sadb_lifetime_addtime
= time_second
;
2974 sav
->lft_c
->sadb_lifetime_usetime
= 0;
2976 /* lifetimes for HARD and SOFT */
2978 const struct sadb_lifetime
*lft0
;
2980 lft0
= (struct sadb_lifetime
*)mhp
->ext
[SADB_EXT_LIFETIME_HARD
];
2982 if (mhp
->extlen
[SADB_EXT_LIFETIME_HARD
] < sizeof(*lft0
)) {
2986 sav
->lft_h
= (struct sadb_lifetime
*)key_newbuf(lft0
,
2988 if (sav
->lft_h
== NULL
) {
2989 ipseclog((LOG_DEBUG
, "key_setsaval: No more memory.\n"));
2993 /* to be initialize ? */
2996 lft0
= (struct sadb_lifetime
*)mhp
->ext
[SADB_EXT_LIFETIME_SOFT
];
2998 if (mhp
->extlen
[SADB_EXT_LIFETIME_SOFT
] < sizeof(*lft0
)) {
3002 sav
->lft_s
= (struct sadb_lifetime
*)key_newbuf(lft0
,
3004 if (sav
->lft_s
== NULL
) {
3005 ipseclog((LOG_DEBUG
, "key_setsaval: No more memory.\n"));
3009 /* to be initialize ? */
3016 /* initialization */
3017 if (sav
->replay
!= NULL
) {
3021 if (sav
->key_auth
!= NULL
) {
3022 KFREE(sav
->key_auth
);
3023 sav
->key_auth
= NULL
;
3025 if (sav
->key_enc
!= NULL
) {
3026 KFREE(sav
->key_enc
);
3027 sav
->key_enc
= NULL
;
3033 if (sav
->iv
!= NULL
) {
3037 if (sav
->lft_c
!= NULL
) {
3041 if (sav
->lft_h
!= NULL
) {
3045 if (sav
->lft_s
!= NULL
) {
3054 * validation with a secasvar entry, and set SADB_SATYPE_MATURE.
3059 key_mature(struct secasvar
*sav
)
3063 /* check SPI value */
3064 switch (sav
->sah
->saidx
.proto
) {
3067 if (ntohl(sav
->spi
) >= 0 && ntohl(sav
->spi
) <= 255) {
3068 ipseclog((LOG_DEBUG
,
3069 "key_mature: illegal range of SPI %u.\n",
3070 (u_int32_t
)ntohl(sav
->spi
)));
3077 switch (sav
->sah
->saidx
.proto
) {
3080 if ((sav
->flags
& (SADB_X_EXT_OLD
|SADB_X_EXT_DERIV
)) ==
3081 (SADB_X_EXT_OLD
|SADB_X_EXT_DERIV
)) {
3082 ipseclog((LOG_DEBUG
, "key_mature: "
3083 "invalid flag (derived) given to old-esp.\n"));
3086 error
= xform_init(sav
, XF_ESP
);
3090 if (sav
->flags
& SADB_X_EXT_DERIV
) {
3091 ipseclog((LOG_DEBUG
, "key_mature: "
3092 "invalid flag (derived) given to AH SA.\n"));
3095 if (sav
->alg_enc
!= SADB_EALG_NONE
) {
3096 ipseclog((LOG_DEBUG
, "key_mature: "
3097 "protocol and algorithm mismated.\n"));
3100 error
= xform_init(sav
, XF_AH
);
3102 case IPPROTO_IPCOMP
:
3103 if (sav
->alg_auth
!= SADB_AALG_NONE
) {
3104 ipseclog((LOG_DEBUG
, "key_mature: "
3105 "protocol and algorithm mismated.\n"));
3108 if ((sav
->flags
& SADB_X_EXT_RAWCPI
) == 0
3109 && ntohl(sav
->spi
) >= 0x10000) {
3110 ipseclog((LOG_DEBUG
, "key_mature: invalid cpi for IPComp.\n"));
3113 error
= xform_init(sav
, XF_IPCOMP
);
3116 ipseclog((LOG_DEBUG
, "key_mature: Invalid satype.\n"));
3117 error
= EPROTONOSUPPORT
;
3121 key_sa_chgstate(sav
, SADB_SASTATE_MATURE
);
3126 * subroutine for SADB_GET and SADB_DUMP.
3128 static struct mbuf
*
3129 key_setdumpsa(struct secasvar
*sav
, u_int8_t type
, u_int8_t satype
,
3130 u_int32_t seq
, u_int32_t pid
)
3132 struct mbuf
*result
= NULL
, *tres
= NULL
, *m
;
3137 SADB_EXT_SA
, SADB_X_EXT_SA2
,
3138 SADB_EXT_LIFETIME_HARD
, SADB_EXT_LIFETIME_SOFT
,
3139 SADB_EXT_LIFETIME_CURRENT
, SADB_EXT_ADDRESS_SRC
,
3140 SADB_EXT_ADDRESS_DST
, SADB_EXT_ADDRESS_PROXY
, SADB_EXT_KEY_AUTH
,
3141 SADB_EXT_KEY_ENCRYPT
, SADB_EXT_IDENTITY_SRC
,
3142 SADB_EXT_IDENTITY_DST
, SADB_EXT_SENSITIVITY
,
3145 m
= key_setsadbmsg(type
, 0, satype
, seq
, pid
, sav
->refcnt
);
3150 for (i
= NELEM(dumporder
) - 1; i
>= 0; i
--) {
3153 switch (dumporder
[i
]) {
3155 m
= key_setsadbsa(sav
);
3160 case SADB_X_EXT_SA2
:
3161 m
= key_setsadbxsa2(sav
->sah
->saidx
.mode
,
3162 sav
->replay
? sav
->replay
->count
: 0,
3163 sav
->sah
->saidx
.reqid
);
3168 case SADB_EXT_ADDRESS_SRC
:
3169 m
= key_setsadbaddr(SADB_EXT_ADDRESS_SRC
,
3170 &sav
->sah
->saidx
.src
.sa
,
3171 FULLMASK
, IPSEC_ULPROTO_ANY
);
3176 case SADB_EXT_ADDRESS_DST
:
3177 m
= key_setsadbaddr(SADB_EXT_ADDRESS_DST
,
3178 &sav
->sah
->saidx
.dst
.sa
,
3179 FULLMASK
, IPSEC_ULPROTO_ANY
);
3184 case SADB_EXT_KEY_AUTH
:
3187 l
= PFKEY_UNUNIT64(sav
->key_auth
->sadb_key_len
);
3191 case SADB_EXT_KEY_ENCRYPT
:
3194 l
= PFKEY_UNUNIT64(sav
->key_enc
->sadb_key_len
);
3198 case SADB_EXT_LIFETIME_CURRENT
:
3201 l
= PFKEY_UNUNIT64(((struct sadb_ext
*)sav
->lft_c
)->sadb_ext_len
);
3205 case SADB_EXT_LIFETIME_HARD
:
3208 l
= PFKEY_UNUNIT64(((struct sadb_ext
*)sav
->lft_h
)->sadb_ext_len
);
3212 case SADB_EXT_LIFETIME_SOFT
:
3215 l
= PFKEY_UNUNIT64(((struct sadb_ext
*)sav
->lft_s
)->sadb_ext_len
);
3219 case SADB_EXT_ADDRESS_PROXY
:
3220 case SADB_EXT_IDENTITY_SRC
:
3221 case SADB_EXT_IDENTITY_DST
:
3222 /* XXX: should we brought from SPD ? */
3223 case SADB_EXT_SENSITIVITY
:
3228 if ((!m
&& !p
) || (m
&& p
))
3231 M_PREPEND(tres
, l
, M_NOWAIT
);
3234 bcopy(p
, mtod(tres
, caddr_t
), l
);
3238 m
= key_alloc_mbuf(l
);
3241 m_copyback(m
, 0, l
, p
);
3249 m_cat(result
, tres
);
3251 if (result
->m_len
< sizeof(struct sadb_msg
)) {
3252 result
= m_pullup(result
, sizeof(struct sadb_msg
));
3256 result
->m_pkthdr
.len
= m_lengthm(result
, NULL
);
3257 mtod(result
, struct sadb_msg
*)->sadb_msg_len
=
3258 PFKEY_UNIT64(result
->m_pkthdr
.len
);
3269 * set data into sadb_msg.
3271 static struct mbuf
*
3272 key_setsadbmsg(u_int8_t type
, u_int16_t tlen
, u_int8_t satype
, u_int32_t seq
,
3273 pid_t pid
, u_int16_t reserved
)
3279 len
= PFKEY_ALIGN8(sizeof(struct sadb_msg
));
3282 m
= m_getb(len
, M_NOWAIT
, MT_DATA
, M_PKTHDR
);
3285 m
->m_pkthdr
.len
= m
->m_len
= len
;
3287 p
= mtod(m
, struct sadb_msg
*);
3290 p
->sadb_msg_version
= PF_KEY_V2
;
3291 p
->sadb_msg_type
= type
;
3292 p
->sadb_msg_errno
= 0;
3293 p
->sadb_msg_satype
= satype
;
3294 p
->sadb_msg_len
= PFKEY_UNIT64(tlen
);
3295 p
->sadb_msg_reserved
= reserved
;
3296 p
->sadb_msg_seq
= seq
;
3297 p
->sadb_msg_pid
= (u_int32_t
)pid
;
3303 * copy secasvar data into sadb_address.
3305 static struct mbuf
*
3306 key_setsadbsa(struct secasvar
*sav
)
3312 len
= PFKEY_ALIGN8(sizeof(struct sadb_sa
));
3313 m
= key_alloc_mbuf(len
);
3314 if (!m
|| m
->m_next
) { /*XXX*/
3320 p
= mtod(m
, struct sadb_sa
*);
3323 p
->sadb_sa_len
= PFKEY_UNIT64(len
);
3324 p
->sadb_sa_exttype
= SADB_EXT_SA
;
3325 p
->sadb_sa_spi
= sav
->spi
;
3326 p
->sadb_sa_replay
= (sav
->replay
!= NULL
? sav
->replay
->wsize
: 0);
3327 p
->sadb_sa_state
= sav
->state
;
3328 p
->sadb_sa_auth
= sav
->alg_auth
;
3329 p
->sadb_sa_encrypt
= sav
->alg_enc
;
3330 p
->sadb_sa_flags
= sav
->flags
;
3336 * set data into sadb_address.
3338 static struct mbuf
*
3339 key_setsadbaddr(u_int16_t exttype
, const struct sockaddr
*saddr
, u_int8_t prefixlen
,
3343 struct sadb_address
*p
;
3346 len
= PFKEY_ALIGN8(sizeof(struct sadb_address
)) +
3347 PFKEY_ALIGN8(saddr
->sa_len
);
3348 m
= key_alloc_mbuf(len
);
3349 if (!m
|| m
->m_next
) { /*XXX*/
3355 p
= mtod(m
, struct sadb_address
*);
3358 p
->sadb_address_len
= PFKEY_UNIT64(len
);
3359 p
->sadb_address_exttype
= exttype
;
3360 p
->sadb_address_proto
= ul_proto
;
3361 if (prefixlen
== FULLMASK
) {
3362 switch (saddr
->sa_family
) {
3364 prefixlen
= sizeof(struct in_addr
) << 3;
3367 prefixlen
= sizeof(struct in6_addr
) << 3;
3373 p
->sadb_address_prefixlen
= prefixlen
;
3374 p
->sadb_address_reserved
= 0;
3377 mtod(m
, caddr_t
) + PFKEY_ALIGN8(sizeof(struct sadb_address
)),
3385 * set data into sadb_ident.
3387 static struct mbuf
*
3388 key_setsadbident(u_int16_t exttype
, u_int16_t idtype
, caddr_t string
,
3389 int stringlen
, u_int64_t id
)
3392 struct sadb_ident
*p
;
3395 len
= PFKEY_ALIGN8(sizeof(struct sadb_ident
)) + PFKEY_ALIGN8(stringlen
);
3396 m
= key_alloc_mbuf(len
);
3397 if (!m
|| m
->m_next
) { /*XXX*/
3403 p
= mtod(m
, struct sadb_ident
*);
3406 p
->sadb_ident_len
= PFKEY_UNIT64(len
);
3407 p
->sadb_ident_exttype
= exttype
;
3408 p
->sadb_ident_type
= idtype
;
3409 p
->sadb_ident_reserved
= 0;
3410 p
->sadb_ident_id
= id
;
3413 mtod(m
, caddr_t
) + PFKEY_ALIGN8(sizeof(struct sadb_ident
)),
3421 * set data into sadb_x_sa2.
3423 static struct mbuf
*
3424 key_setsadbxsa2(u_int8_t mode
, u_int32_t seq
, u_int32_t reqid
)
3427 struct sadb_x_sa2
*p
;
3430 len
= PFKEY_ALIGN8(sizeof(struct sadb_x_sa2
));
3431 m
= key_alloc_mbuf(len
);
3432 if (!m
|| m
->m_next
) { /*XXX*/
3438 p
= mtod(m
, struct sadb_x_sa2
*);
3441 p
->sadb_x_sa2_len
= PFKEY_UNIT64(len
);
3442 p
->sadb_x_sa2_exttype
= SADB_X_EXT_SA2
;
3443 p
->sadb_x_sa2_mode
= mode
;
3444 p
->sadb_x_sa2_reserved1
= 0;
3445 p
->sadb_x_sa2_reserved2
= 0;
3446 p
->sadb_x_sa2_sequence
= seq
;
3447 p
->sadb_x_sa2_reqid
= reqid
;
3453 * set data into sadb_x_policy
3455 static struct mbuf
*
3456 key_setsadbxpolicy(u_int16_t type
, u_int8_t dir
, u_int32_t id
)
3459 struct sadb_x_policy
*p
;
3462 len
= PFKEY_ALIGN8(sizeof(struct sadb_x_policy
));
3463 m
= key_alloc_mbuf(len
);
3464 if (!m
|| m
->m_next
) { /*XXX*/
3470 p
= mtod(m
, struct sadb_x_policy
*);
3473 p
->sadb_x_policy_len
= PFKEY_UNIT64(len
);
3474 p
->sadb_x_policy_exttype
= SADB_X_EXT_POLICY
;
3475 p
->sadb_x_policy_type
= type
;
3476 p
->sadb_x_policy_dir
= dir
;
3477 p
->sadb_x_policy_id
= id
;
3484 * copy a buffer into the new buffer allocated.
3487 key_newbuf(const void *src
, u_int len
)
3491 KMALLOC(new, caddr_t
, len
);
3493 ipseclog((LOG_DEBUG
, "key_newbuf: No more memory.\n"));
3496 bcopy(src
, new, len
);
3501 /* compare my own address
3502 * OUT: 1: true, i.e. my address.
3506 key_ismyaddr(struct sockaddr
*sa
)
3509 struct sockaddr_in
*sin
;
3510 struct in_ifaddr_container
*iac
;
3515 panic("key_ismyaddr: NULL pointer is passed.");
3517 switch (sa
->sa_family
) {
3520 sin
= (struct sockaddr_in
*)sa
;
3521 TAILQ_FOREACH(iac
, &in_ifaddrheads
[mycpuid
], ia_link
) {
3522 struct in_ifaddr
*ia
= iac
->ia
;
3524 if (sin
->sin_family
== ia
->ia_addr
.sin_family
&&
3525 sin
->sin_len
== ia
->ia_addr
.sin_len
&&
3526 sin
->sin_addr
.s_addr
== ia
->ia_addr
.sin_addr
.s_addr
)
3535 return key_ismyaddr6((struct sockaddr_in6
*)sa
);
3544 * compare my own address for IPv6.
3547 * NOTE: derived ip6_input() in KAME. This is necessary to modify more.
3550 key_ismyaddr6(struct sockaddr_in6
*sin6
)
3552 struct in6_ifaddr
*ia
;
3553 struct in6_multi
*in6m
;
3555 for (ia
= in6_ifaddr
; ia
; ia
= ia
->ia_next
) {
3556 if (key_sockaddrcmp((struct sockaddr
*)&sin6
,
3557 (struct sockaddr
*)&ia
->ia_addr
, 0) == 0)
3562 * XXX why do we care about multlicast here while we don't care
3563 * about IPv4 multicast??
3566 in6m
= IN6_LOOKUP_MULTI(&sin6
->sin6_addr
, ia
->ia_ifp
);
3571 /* loopback, just for safety */
3572 if (IN6_IS_ADDR_LOOPBACK(&sin6
->sin6_addr
))
3580 * compare two secasindex structure.
3581 * flag can specify to compare 2 saidxes.
3582 * compare two secasindex structure without both mode and reqid.
3583 * don't compare port.
3585 * saidx0: source, it can be in SAD.
3593 const struct secasindex
*saidx0
,
3594 const struct secasindex
*saidx1
,
3598 if (saidx0
== NULL
&& saidx1
== NULL
)
3601 if (saidx0
== NULL
|| saidx1
== NULL
)
3604 if (saidx0
->proto
!= saidx1
->proto
)
3607 if (flag
== CMP_EXACTLY
) {
3608 if (saidx0
->mode
!= saidx1
->mode
)
3610 if (saidx0
->reqid
!= saidx1
->reqid
)
3612 if (bcmp(&saidx0
->src
, &saidx1
->src
, saidx0
->src
.sa
.sa_len
) != 0 ||
3613 bcmp(&saidx0
->dst
, &saidx1
->dst
, saidx0
->dst
.sa
.sa_len
) != 0)
3617 /* CMP_MODE_REQID, CMP_REQID, CMP_HEAD */
3618 if (flag
== CMP_MODE_REQID
3619 ||flag
== CMP_REQID
) {
3621 * If reqid of SPD is non-zero, unique SA is required.
3622 * The result must be of same reqid in this case.
3624 if (saidx1
->reqid
!= 0 && saidx0
->reqid
!= saidx1
->reqid
)
3628 if (flag
== CMP_MODE_REQID
) {
3629 if (saidx0
->mode
!= IPSEC_MODE_ANY
3630 && saidx0
->mode
!= saidx1
->mode
)
3634 if (key_sockaddrcmp(&saidx0
->src
.sa
, &saidx1
->src
.sa
, 0) != 0) {
3637 if (key_sockaddrcmp(&saidx0
->dst
.sa
, &saidx1
->dst
.sa
, 0) != 0) {
3646 * compare two secindex structure exactly.
3648 * spidx0: source, it is often in SPD.
3649 * spidx1: object, it is often from PFKEY message.
3655 key_cmpspidx_exactly(
3656 struct secpolicyindex
*spidx0
,
3657 struct secpolicyindex
*spidx1
)
3660 if (spidx0
== NULL
&& spidx1
== NULL
)
3663 if (spidx0
== NULL
|| spidx1
== NULL
)
3666 if (spidx0
->prefs
!= spidx1
->prefs
3667 || spidx0
->prefd
!= spidx1
->prefd
3668 || spidx0
->ul_proto
!= spidx1
->ul_proto
)
3671 return key_sockaddrcmp(&spidx0
->src
.sa
, &spidx1
->src
.sa
, 1) == 0 &&
3672 key_sockaddrcmp(&spidx0
->dst
.sa
, &spidx1
->dst
.sa
, 1) == 0;
3676 * compare two secindex structure with mask.
3678 * spidx0: source, it is often in SPD.
3679 * spidx1: object, it is often from IP header.
3685 key_cmpspidx_withmask(
3686 struct secpolicyindex
*spidx0
,
3687 struct secpolicyindex
*spidx1
)
3690 if (spidx0
== NULL
&& spidx1
== NULL
)
3693 if (spidx0
== NULL
|| spidx1
== NULL
)
3696 if (spidx0
->src
.sa
.sa_family
!= spidx1
->src
.sa
.sa_family
||
3697 spidx0
->dst
.sa
.sa_family
!= spidx1
->dst
.sa
.sa_family
||
3698 spidx0
->src
.sa
.sa_len
!= spidx1
->src
.sa
.sa_len
||
3699 spidx0
->dst
.sa
.sa_len
!= spidx1
->dst
.sa
.sa_len
)
3702 /* if spidx.ul_proto == IPSEC_ULPROTO_ANY, ignore. */
3703 if (spidx0
->ul_proto
!= (u_int16_t
)IPSEC_ULPROTO_ANY
3704 && spidx0
->ul_proto
!= spidx1
->ul_proto
)
3707 switch (spidx0
->src
.sa
.sa_family
) {
3709 if (spidx0
->src
.sin
.sin_port
!= IPSEC_PORT_ANY
3710 && spidx0
->src
.sin
.sin_port
!= spidx1
->src
.sin
.sin_port
)
3712 if (!key_bbcmp(&spidx0
->src
.sin
.sin_addr
,
3713 &spidx1
->src
.sin
.sin_addr
, spidx0
->prefs
))
3717 if (spidx0
->src
.sin6
.sin6_port
!= IPSEC_PORT_ANY
3718 && spidx0
->src
.sin6
.sin6_port
!= spidx1
->src
.sin6
.sin6_port
)
3721 * scope_id check. if sin6_scope_id is 0, we regard it
3722 * as a wildcard scope, which matches any scope zone ID.
3724 if (spidx0
->src
.sin6
.sin6_scope_id
&&
3725 spidx1
->src
.sin6
.sin6_scope_id
&&
3726 spidx0
->src
.sin6
.sin6_scope_id
!= spidx1
->src
.sin6
.sin6_scope_id
)
3728 if (!key_bbcmp(&spidx0
->src
.sin6
.sin6_addr
,
3729 &spidx1
->src
.sin6
.sin6_addr
, spidx0
->prefs
))
3734 if (bcmp(&spidx0
->src
, &spidx1
->src
, spidx0
->src
.sa
.sa_len
) != 0)
3739 switch (spidx0
->dst
.sa
.sa_family
) {
3741 if (spidx0
->dst
.sin
.sin_port
!= IPSEC_PORT_ANY
3742 && spidx0
->dst
.sin
.sin_port
!= spidx1
->dst
.sin
.sin_port
)
3744 if (!key_bbcmp(&spidx0
->dst
.sin
.sin_addr
,
3745 &spidx1
->dst
.sin
.sin_addr
, spidx0
->prefd
))
3749 if (spidx0
->dst
.sin6
.sin6_port
!= IPSEC_PORT_ANY
3750 && spidx0
->dst
.sin6
.sin6_port
!= spidx1
->dst
.sin6
.sin6_port
)
3753 * scope_id check. if sin6_scope_id is 0, we regard it
3754 * as a wildcard scope, which matches any scope zone ID.
3756 if (spidx0
->dst
.sin6
.sin6_scope_id
&&
3757 spidx1
->dst
.sin6
.sin6_scope_id
&&
3758 spidx0
->dst
.sin6
.sin6_scope_id
!= spidx1
->dst
.sin6
.sin6_scope_id
)
3760 if (!key_bbcmp(&spidx0
->dst
.sin6
.sin6_addr
,
3761 &spidx1
->dst
.sin6
.sin6_addr
, spidx0
->prefd
))
3766 if (bcmp(&spidx0
->dst
, &spidx1
->dst
, spidx0
->dst
.sa
.sa_len
) != 0)
3771 /* XXX Do we check other field ? e.g. flowinfo */
3776 /* returns 0 on match */
3779 const struct sockaddr
*sa1
,
3780 const struct sockaddr
*sa2
,
3786 #define satosin(s) ((const struct sockaddr_in *)s)
3790 #define satosin6(s) ((const struct sockaddr_in6 *)s)
3791 if (sa1
->sa_family
!= sa2
->sa_family
|| sa1
->sa_len
!= sa2
->sa_len
)
3794 switch (sa1
->sa_family
) {
3796 if (sa1
->sa_len
!= sizeof(struct sockaddr_in
))
3798 if (satosin(sa1
)->sin_addr
.s_addr
!=
3799 satosin(sa2
)->sin_addr
.s_addr
) {
3802 if (port
&& satosin(sa1
)->sin_port
!= satosin(sa2
)->sin_port
)
3806 if (sa1
->sa_len
!= sizeof(struct sockaddr_in6
))
3807 return 1; /*EINVAL*/
3808 if (satosin6(sa1
)->sin6_scope_id
!=
3809 satosin6(sa2
)->sin6_scope_id
) {
3812 if (!IN6_ARE_ADDR_EQUAL(&satosin6(sa1
)->sin6_addr
,
3813 &satosin6(sa2
)->sin6_addr
)) {
3817 satosin6(sa1
)->sin6_port
!= satosin6(sa2
)->sin6_port
) {
3821 if (bcmp(sa1
, sa2
, sa1
->sa_len
) != 0)
3832 * compare two buffers with mask.
3836 * bits: Number of bits to compare
3842 key_bbcmp(const void *a1
, const void *a2
, u_int bits
)
3844 const unsigned char *p1
= a1
;
3845 const unsigned char *p2
= a2
;
3847 /* XXX: This could be considerably faster if we compare a word
3848 * at a time, but it is complicated on LSB Endian machines */
3850 /* Handle null pointers */
3851 if (p1
== NULL
|| p2
== NULL
)
3861 u_int8_t mask
= ~((1<<(8-bits
))-1);
3862 if ((*p1
& mask
) != (*p2
& mask
))
3865 return 1; /* Match! */
3870 * scanning SPD and SAD to check status for each entries,
3871 * and do to remove or to expire.
3872 * XXX: year 2038 problem may remain.
3875 key_timehandler(void *unused
)
3878 time_t now
= time_second
;
3879 struct secspacq
*spacq
, *nextspacq
;
3885 struct secpolicy
*sp
, *nextsp
;
3887 for (dir
= 0; dir
< IPSEC_DIR_MAX
; dir
++) {
3888 LIST_FOREACH_MUTABLE(sp
, &sptree
[dir
], chain
, nextsp
) {
3889 if (sp
->state
== IPSEC_SPSTATE_DEAD
) {
3894 if (sp
->lifetime
== 0 && sp
->validtime
== 0)
3897 /* the deletion will occur next time */
3898 if ((sp
->lifetime
&& now
- sp
->created
> sp
->lifetime
)
3899 || (sp
->validtime
&& now
- sp
->lastused
> sp
->validtime
)) {
3900 sp
->state
= IPSEC_SPSTATE_DEAD
;
3910 struct secashead
*sah
, *nextsah
;
3911 struct secasvar
*sav
, *nextsav
;
3913 LIST_FOREACH_MUTABLE(sah
, &sahtree
, chain
, nextsah
) {
3914 /* if sah has been dead, then delete it and process next sah. */
3915 if (sah
->state
== SADB_SASTATE_DEAD
) {
3920 /* if LARVAL entry doesn't become MATURE, delete it. */
3921 LIST_FOREACH_MUTABLE(sav
, &sah
->savtree
[SADB_SASTATE_LARVAL
],
3923 if (now
- sav
->created
> key_larval_lifetime
) {
3929 * check MATURE entry to start to send expire message
3932 LIST_FOREACH_MUTABLE(sav
, &sah
->savtree
[SADB_SASTATE_MATURE
],
3934 /* we don't need to check. */
3935 if (sav
->lft_s
== NULL
)
3939 if (sav
->lft_c
== NULL
) {
3940 ipseclog((LOG_DEBUG
,"key_timehandler: "
3941 "There is no CURRENT time, why?\n"));
3945 /* check SOFT lifetime */
3946 if (sav
->lft_s
->sadb_lifetime_addtime
!= 0
3947 && now
- sav
->created
> sav
->lft_s
->sadb_lifetime_addtime
) {
3949 * check SA to be used whether or not.
3950 * when SA hasn't been used, delete it.
3952 if (sav
->lft_c
->sadb_lifetime_usetime
== 0) {
3953 key_sa_chgstate(sav
, SADB_SASTATE_DEAD
);
3956 key_sa_chgstate(sav
, SADB_SASTATE_DYING
);
3958 * XXX If we keep to send expire
3959 * message in the status of
3960 * DYING. Do remove below code.
3965 /* check SOFT lifetime by bytes */
3967 * XXX I don't know the way to delete this SA
3968 * when new SA is installed. Caution when it's
3969 * installed too big lifetime by time.
3971 else if (sav
->lft_s
->sadb_lifetime_bytes
!= 0
3972 && sav
->lft_s
->sadb_lifetime_bytes
< sav
->lft_c
->sadb_lifetime_bytes
) {
3974 key_sa_chgstate(sav
, SADB_SASTATE_DYING
);
3976 * XXX If we keep to send expire
3977 * message in the status of
3978 * DYING. Do remove below code.
3984 /* check DYING entry to change status to DEAD. */
3985 LIST_FOREACH_MUTABLE(sav
, &sah
->savtree
[SADB_SASTATE_DYING
],
3987 /* we don't need to check. */
3988 if (sav
->lft_h
== NULL
)
3992 if (sav
->lft_c
== NULL
) {
3993 ipseclog((LOG_DEBUG
, "key_timehandler: "
3994 "There is no CURRENT time, why?\n"));
3998 if (sav
->lft_h
->sadb_lifetime_addtime
!= 0
3999 && now
- sav
->created
> sav
->lft_h
->sadb_lifetime_addtime
) {
4000 key_sa_chgstate(sav
, SADB_SASTATE_DEAD
);
4003 #if 0 /* XXX Should we keep to send expire message until HARD lifetime ? */
4004 else if (sav
->lft_s
!= NULL
4005 && sav
->lft_s
->sadb_lifetime_addtime
!= 0
4006 && now
- sav
->created
> sav
->lft_s
->sadb_lifetime_addtime
) {
4008 * XXX: should be checked to be
4009 * installed the valid SA.
4013 * If there is no SA then sending
4019 /* check HARD lifetime by bytes */
4020 else if (sav
->lft_h
->sadb_lifetime_bytes
!= 0
4021 && sav
->lft_h
->sadb_lifetime_bytes
< sav
->lft_c
->sadb_lifetime_bytes
) {
4022 key_sa_chgstate(sav
, SADB_SASTATE_DEAD
);
4027 /* delete entry in DEAD */
4028 LIST_FOREACH_MUTABLE(sav
, &sah
->savtree
[SADB_SASTATE_DEAD
],
4031 if (sav
->state
!= SADB_SASTATE_DEAD
) {
4032 ipseclog((LOG_DEBUG
, "key_timehandler: "
4033 "invalid sav->state "
4034 "(queue: %d SA: %d): "
4036 SADB_SASTATE_DEAD
, sav
->state
));
4040 * do not call key_freesav() here.
4041 * sav should already be freed, and sav->refcnt
4042 * shows other references to sav
4043 * (such as from SPD).
4049 #ifndef IPSEC_NONBLOCK_ACQUIRE
4052 struct secacq
*acq
, *nextacq
;
4054 LIST_FOREACH_MUTABLE(acq
, &acqtree
, chain
, nextacq
) {
4055 if (now
- acq
->created
> key_blockacq_lifetime
&&
4056 __LIST_CHAINED(acq
)) {
4057 LIST_REMOVE(acq
, chain
);
4065 LIST_FOREACH_MUTABLE(spacq
, &spacqtree
, chain
, nextspacq
) {
4066 if (now
- spacq
->created
> key_blockacq_lifetime
&&
4067 __LIST_CHAINED(spacq
)) {
4068 LIST_REMOVE(spacq
, chain
);
4073 /* initialize random seed */
4074 if (key_tick_init_random
++ > key_int_random
) {
4075 key_tick_init_random
= 0;
4079 #ifndef IPSEC_DEBUG2
4080 /* do exchange to tick time !! */
4081 callout_reset(&key_timehandler_ch
, hz
, key_timehandler
, NULL
);
4089 * to initialize a seed for random()
4094 skrandom(time_second
);
4102 key_randomfill(&value
, sizeof(value
));
4107 key_randomfill(void *p
, size_t l
)
4111 static int warn
= 1;
4113 n
= (size_t)read_random(p
, (u_int
)l
);
4117 bcopy(&v
, (u_int8_t
*)p
+ n
,
4118 l
- n
< sizeof(v
) ? l
- n
: sizeof(v
));
4122 kprintf("WARNING: pseudo-random number generator "
4123 "used for IPsec processing\n");
4130 * map SADB_SATYPE_* to IPPROTO_*.
4131 * if satype == SADB_SATYPE then satype is mapped to ~0.
4133 * 0: invalid satype.
4136 key_satype2proto(u_int8_t satype
)
4139 case SADB_SATYPE_UNSPEC
:
4140 return IPSEC_PROTO_ANY
;
4141 case SADB_SATYPE_AH
:
4143 case SADB_SATYPE_ESP
:
4145 case SADB_X_SATYPE_IPCOMP
:
4146 return IPPROTO_IPCOMP
;
4154 * map IPPROTO_* to SADB_SATYPE_*
4156 * 0: invalid protocol type.
4159 key_proto2satype(u_int16_t proto
)
4163 return SADB_SATYPE_AH
;
4165 return SADB_SATYPE_ESP
;
4166 case IPPROTO_IPCOMP
:
4167 return SADB_X_SATYPE_IPCOMP
;
4176 * SADB_GETSPI processing is to receive
4177 * <base, (SA2), src address, dst address, (SPI range)>
4178 * from the IKMPd, to assign a unique spi value, to hang on the INBOUND
4179 * tree with the status of LARVAL, and send
4180 * <base, SA(*), address(SD)>
4183 * IN: mhp: pointer to the pointer to each header.
4184 * OUT: NULL if fail.
4185 * other if success, return pointer to the message to send.
4188 key_getspi(struct socket
*so
, struct mbuf
*m
, const struct sadb_msghdr
*mhp
)
4190 struct sadb_address
*src0
, *dst0
;
4191 struct secasindex saidx
;
4192 struct secashead
*newsah
;
4193 struct secasvar
*newsav
;
4194 struct sockaddr
*saddr
, *daddr
;
4202 if (so
== NULL
|| m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
)
4203 panic("key_getspi: NULL pointer is passed.");
4205 if (mhp
->ext
[SADB_EXT_ADDRESS_SRC
] == NULL
||
4206 mhp
->ext
[SADB_EXT_ADDRESS_DST
] == NULL
) {
4207 ipseclog((LOG_DEBUG
, "key_getspi: invalid message is passed.\n"));
4208 return key_senderror(so
, m
, EINVAL
);
4210 if (mhp
->extlen
[SADB_EXT_ADDRESS_SRC
] < sizeof(struct sadb_address
) ||
4211 mhp
->extlen
[SADB_EXT_ADDRESS_DST
] < sizeof(struct sadb_address
)) {
4212 ipseclog((LOG_DEBUG
, "key_getspi: invalid message is passed.\n"));
4213 return key_senderror(so
, m
, EINVAL
);
4215 if (mhp
->ext
[SADB_X_EXT_SA2
] != NULL
) {
4216 mode
= ((struct sadb_x_sa2
*)mhp
->ext
[SADB_X_EXT_SA2
])->sadb_x_sa2_mode
;
4217 reqid
= ((struct sadb_x_sa2
*)mhp
->ext
[SADB_X_EXT_SA2
])->sadb_x_sa2_reqid
;
4219 mode
= IPSEC_MODE_ANY
;
4223 src0
= (struct sadb_address
*)(mhp
->ext
[SADB_EXT_ADDRESS_SRC
]);
4224 dst0
= (struct sadb_address
*)(mhp
->ext
[SADB_EXT_ADDRESS_DST
]);
4226 /* map satype to proto */
4227 if ((proto
= key_satype2proto(mhp
->msg
->sadb_msg_satype
)) == 0) {
4228 ipseclog((LOG_DEBUG
, "key_getspi: invalid satype is passed.\n"));
4229 return key_senderror(so
, m
, EINVAL
);
4232 /* make sure if port number is zero. */
4233 saddr
= (struct sockaddr
*)(src0
+ 1);
4234 daddr
= (struct sockaddr
*)(dst0
+ 1);
4235 switch (saddr
->sa_family
) {
4237 if (saddr
->sa_len
!= sizeof(struct sockaddr_in
))
4238 return key_senderror(so
, m
, EINVAL
);
4239 ((struct sockaddr_in
*)(src0
+ 1))->sin_port
= 0;
4242 if (saddr
->sa_len
!= sizeof(struct sockaddr_in6
))
4243 return key_senderror(so
, m
, EINVAL
);
4244 ((struct sockaddr_in6
*)(src0
+ 1))->sin6_port
= 0;
4249 switch (daddr
->sa_family
) {
4251 if (daddr
->sa_len
!= sizeof(struct sockaddr_in
))
4252 return key_senderror(so
, m
, EINVAL
);
4253 ((struct sockaddr_in
*)(dst0
+ 1))->sin_port
= 0;
4256 if (daddr
->sa_len
!= sizeof(struct sockaddr_in6
))
4257 return key_senderror(so
, m
, EINVAL
);
4258 ((struct sockaddr_in6
*)(dst0
+ 1))->sin6_port
= 0;
4264 /* XXX boundary check against sa_len */
4265 KEY_SETSECASIDX(proto
, mode
, reqid
, src0
+ 1, dst0
+ 1, &saidx
);
4267 /* SPI allocation */
4268 spi
= key_do_getnewspi((struct sadb_spirange
*)mhp
->ext
[SADB_EXT_SPIRANGE
],
4271 return key_senderror(so
, m
, EINVAL
);
4273 /* get a SA index */
4274 if ((newsah
= key_getsah(&saidx
)) == NULL
) {
4275 /* create a new SA index */
4276 if ((newsah
= key_newsah(&saidx
)) == NULL
) {
4277 ipseclog((LOG_DEBUG
, "key_getspi: No more memory.\n"));
4278 return key_senderror(so
, m
, ENOBUFS
);
4284 newsav
= KEY_NEWSAV(m
, mhp
, newsah
, &error
);
4285 if (newsav
== NULL
) {
4286 /* XXX don't free new SA index allocated in above. */
4287 return key_senderror(so
, m
, error
);
4291 newsav
->spi
= htonl(spi
);
4293 #ifndef IPSEC_NONBLOCK_ACQUIRE
4294 /* delete the entry in acqtree */
4295 if (mhp
->msg
->sadb_msg_seq
!= 0) {
4297 if ((acq
= key_getacqbyseq(mhp
->msg
->sadb_msg_seq
)) != NULL
) {
4298 /* reset counter in order to deletion by timehandler. */
4299 acq
->created
= time_second
;
4307 struct sadb_sa
*m_sa
;
4308 struct sadb_msg
*newmsg
;
4311 /* create new sadb_msg to reply. */
4312 len
= PFKEY_ALIGN8(sizeof(struct sadb_msg
)) +
4313 PFKEY_ALIGN8(sizeof(struct sadb_sa
));
4315 return key_senderror(so
, m
, ENOBUFS
);
4316 n
= m_getb(len
, M_NOWAIT
, MT_DATA
, M_PKTHDR
);
4318 return key_senderror(so
, m
, ENOBUFS
);
4321 m_copydata(m
, 0, sizeof(struct sadb_msg
), mtod(n
, caddr_t
));
4322 off
= PFKEY_ALIGN8(sizeof(struct sadb_msg
));
4324 m_sa
= (struct sadb_sa
*)(mtod(n
, caddr_t
) + off
);
4325 m_sa
->sadb_sa_len
= PFKEY_UNIT64(sizeof(struct sadb_sa
));
4326 m_sa
->sadb_sa_exttype
= SADB_EXT_SA
;
4327 m_sa
->sadb_sa_spi
= htonl(spi
);
4328 off
+= PFKEY_ALIGN8(sizeof(struct sadb_sa
));
4332 panic("length inconsistency in key_getspi");
4335 n
->m_next
= key_gather_mbuf(m
, mhp
, 0, 2, SADB_EXT_ADDRESS_SRC
,
4336 SADB_EXT_ADDRESS_DST
);
4339 return key_senderror(so
, m
, ENOBUFS
);
4342 if (n
->m_len
< sizeof(struct sadb_msg
)) {
4343 n
= m_pullup(n
, sizeof(struct sadb_msg
));
4345 return key_sendup_mbuf(so
, m
, KEY_SENDUP_ONE
);
4347 n
->m_pkthdr
.len
= m_lengthm(n
, NULL
);
4349 newmsg
= mtod(n
, struct sadb_msg
*);
4350 newmsg
->sadb_msg_seq
= newsav
->seq
;
4351 newmsg
->sadb_msg_errno
= 0;
4352 newmsg
->sadb_msg_len
= PFKEY_UNIT64(n
->m_pkthdr
.len
);
4355 return key_sendup_mbuf(so
, n
, KEY_SENDUP_ONE
);
4360 * allocating new SPI
4361 * called by key_getspi().
4367 key_do_getnewspi(struct sadb_spirange
*spirange
, struct secasindex
*saidx
)
4371 int count
= key_spi_trycnt
;
4373 /* set spi range to allocate */
4374 if (spirange
!= NULL
) {
4375 min
= spirange
->sadb_spirange_min
;
4376 max
= spirange
->sadb_spirange_max
;
4378 min
= key_spi_minval
;
4379 max
= key_spi_maxval
;
4381 /* IPCOMP needs 2-byte SPI */
4382 if (saidx
->proto
== IPPROTO_IPCOMP
) {
4389 t
= min
; min
= max
; max
= t
;
4394 if (key_checkspidup(saidx
, min
) != NULL
) {
4395 ipseclog((LOG_DEBUG
, "key_do_getnewspi: SPI %u exists already.\n", min
));
4399 count
--; /* taking one cost. */
4407 /* when requesting to allocate spi ranged */
4409 /* generate pseudo-random SPI value ranged. */
4410 newspi
= min
+ (key_random() % (max
- min
+ 1));
4412 if (key_checkspidup(saidx
, newspi
) == NULL
)
4416 if (count
== 0 || newspi
== 0) {
4417 ipseclog((LOG_DEBUG
, "key_do_getnewspi: to allocate spi is failed.\n"));
4423 keystat
.getspi_count
=
4424 (keystat
.getspi_count
+ key_spi_trycnt
- count
) / 2;
4430 * SADB_UPDATE processing
4432 * <base, SA, (SA2), (lifetime(HSC),) address(SD), (address(P),)
4433 * key(AE), (identity(SD),) (sensitivity)>
4434 * from the ikmpd, and update a secasvar entry whose status is SADB_SASTATE_LARVAL.
4436 * <base, SA, (SA2), (lifetime(HSC),) address(SD), (address(P),)
4437 * (identity(SD),) (sensitivity)>
4440 * m will always be freed.
4443 key_update(struct socket
*so
, struct mbuf
*m
, const struct sadb_msghdr
*mhp
)
4445 struct sadb_sa
*sa0
;
4446 struct sadb_address
*src0
, *dst0
;
4447 struct secasindex saidx
;
4448 struct secashead
*sah
;
4449 struct secasvar
*sav
;
4456 if (so
== NULL
|| m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
)
4457 panic("key_update: NULL pointer is passed.");
4459 /* map satype to proto */
4460 if ((proto
= key_satype2proto(mhp
->msg
->sadb_msg_satype
)) == 0) {
4461 ipseclog((LOG_DEBUG
, "key_update: invalid satype is passed.\n"));
4462 return key_senderror(so
, m
, EINVAL
);
4465 if (mhp
->ext
[SADB_EXT_SA
] == NULL
||
4466 mhp
->ext
[SADB_EXT_ADDRESS_SRC
] == NULL
||
4467 mhp
->ext
[SADB_EXT_ADDRESS_DST
] == NULL
||
4468 (mhp
->msg
->sadb_msg_satype
== SADB_SATYPE_ESP
&&
4469 mhp
->ext
[SADB_EXT_KEY_ENCRYPT
] == NULL
) ||
4470 (mhp
->msg
->sadb_msg_satype
== SADB_SATYPE_AH
&&
4471 mhp
->ext
[SADB_EXT_KEY_AUTH
] == NULL
) ||
4472 (mhp
->ext
[SADB_EXT_LIFETIME_HARD
] != NULL
&&
4473 mhp
->ext
[SADB_EXT_LIFETIME_SOFT
] == NULL
) ||
4474 (mhp
->ext
[SADB_EXT_LIFETIME_HARD
] == NULL
&&
4475 mhp
->ext
[SADB_EXT_LIFETIME_SOFT
] != NULL
)) {
4476 ipseclog((LOG_DEBUG
, "key_update: invalid message is passed.\n"));
4477 return key_senderror(so
, m
, EINVAL
);
4479 if (mhp
->extlen
[SADB_EXT_SA
] < sizeof(struct sadb_sa
) ||
4480 mhp
->extlen
[SADB_EXT_ADDRESS_SRC
] < sizeof(struct sadb_address
) ||
4481 mhp
->extlen
[SADB_EXT_ADDRESS_DST
] < sizeof(struct sadb_address
)) {
4482 ipseclog((LOG_DEBUG
, "key_update: invalid message is passed.\n"));
4483 return key_senderror(so
, m
, EINVAL
);
4485 if (mhp
->ext
[SADB_X_EXT_SA2
] != NULL
) {
4486 mode
= ((struct sadb_x_sa2
*)mhp
->ext
[SADB_X_EXT_SA2
])->sadb_x_sa2_mode
;
4487 reqid
= ((struct sadb_x_sa2
*)mhp
->ext
[SADB_X_EXT_SA2
])->sadb_x_sa2_reqid
;
4489 mode
= IPSEC_MODE_ANY
;
4492 /* XXX boundary checking for other extensions */
4494 sa0
= (struct sadb_sa
*)mhp
->ext
[SADB_EXT_SA
];
4495 src0
= (struct sadb_address
*)(mhp
->ext
[SADB_EXT_ADDRESS_SRC
]);
4496 dst0
= (struct sadb_address
*)(mhp
->ext
[SADB_EXT_ADDRESS_DST
]);
4498 /* XXX boundary check against sa_len */
4499 KEY_SETSECASIDX(proto
, mode
, reqid
, src0
+ 1, dst0
+ 1, &saidx
);
4501 /* get a SA header */
4502 if ((sah
= key_getsah(&saidx
)) == NULL
) {
4503 ipseclog((LOG_DEBUG
, "key_update: no SA index found.\n"));
4504 return key_senderror(so
, m
, ENOENT
);
4507 /* set spidx if there */
4509 error
= key_setident(sah
, m
, mhp
);
4511 return key_senderror(so
, m
, error
);
4513 /* find a SA with sequence number. */
4514 #ifdef IPSEC_DOSEQCHECK
4515 if (mhp
->msg
->sadb_msg_seq
!= 0
4516 && (sav
= key_getsavbyseq(sah
, mhp
->msg
->sadb_msg_seq
)) == NULL
) {
4517 ipseclog((LOG_DEBUG
,
4518 "key_update: no larval SA with sequence %u exists.\n",
4519 mhp
->msg
->sadb_msg_seq
));
4520 return key_senderror(so
, m
, ENOENT
);
4523 if ((sav
= key_getsavbyspi(sah
, sa0
->sadb_sa_spi
)) == NULL
) {
4524 ipseclog((LOG_DEBUG
,
4525 "key_update: no such a SA found (spi:%u)\n",
4526 (u_int32_t
)ntohl(sa0
->sadb_sa_spi
)));
4527 return key_senderror(so
, m
, EINVAL
);
4531 /* validity check */
4532 if (sav
->sah
->saidx
.proto
!= proto
) {
4533 ipseclog((LOG_DEBUG
,
4534 "key_update: protocol mismatched (DB=%u param=%u)\n",
4535 sav
->sah
->saidx
.proto
, proto
));
4536 return key_senderror(so
, m
, EINVAL
);
4538 #ifdef IPSEC_DOSEQCHECK
4539 if (sav
->spi
!= sa0
->sadb_sa_spi
) {
4540 ipseclog((LOG_DEBUG
,
4541 "key_update: SPI mismatched (DB:%u param:%u)\n",
4542 (u_int32_t
)ntohl(sav
->spi
),
4543 (u_int32_t
)ntohl(sa0
->sadb_sa_spi
)));
4544 return key_senderror(so
, m
, EINVAL
);
4547 if (sav
->pid
!= mhp
->msg
->sadb_msg_pid
) {
4548 ipseclog((LOG_DEBUG
,
4549 "key_update: pid mismatched (DB:%u param:%u)\n",
4550 sav
->pid
, mhp
->msg
->sadb_msg_pid
));
4551 return key_senderror(so
, m
, EINVAL
);
4554 /* copy sav values */
4555 error
= key_setsaval(sav
, m
, mhp
);
4558 return key_senderror(so
, m
, error
);
4561 /* check SA values to be mature. */
4562 if ((mhp
->msg
->sadb_msg_errno
= key_mature(sav
)) != 0) {
4564 return key_senderror(so
, m
, 0);
4570 /* set msg buf from mhp */
4571 n
= key_getmsgbuf_x1(m
, mhp
);
4573 ipseclog((LOG_DEBUG
, "key_update: No more memory.\n"));
4574 return key_senderror(so
, m
, ENOBUFS
);
4578 return key_sendup_mbuf(so
, n
, KEY_SENDUP_ALL
);
4583 * search SAD with sequence for a SA which state is SADB_SASTATE_LARVAL.
4584 * only called by key_update().
4587 * others : found, pointer to a SA.
4589 #ifdef IPSEC_DOSEQCHECK
4590 static struct secasvar
*
4591 key_getsavbyseq(struct secashead
*sah
, u_int32_t seq
)
4593 struct secasvar
*sav
;
4596 state
= SADB_SASTATE_LARVAL
;
4598 /* search SAD with sequence number ? */
4599 LIST_FOREACH(sav
, &sah
->savtree
[state
], chain
) {
4601 KEY_CHKSASTATE(state
, sav
->state
, "key_getsabyseq");
4603 if (sav
->seq
== seq
) {
4605 KEYDEBUG(KEYDEBUG_IPSEC_STAMP
,
4606 kprintf("DP key_getsavbyseq cause "
4607 "refcnt++:%d SA:%p\n",
4618 * SADB_ADD processing
4619 * add an entry to SA database, when received
4620 * <base, SA, (SA2), (lifetime(HSC),) address(SD), (address(P),)
4621 * key(AE), (identity(SD),) (sensitivity)>
4624 * <base, SA, (SA2), (lifetime(HSC),) address(SD), (address(P),)
4625 * (identity(SD),) (sensitivity)>
4628 * IGNORE identity and sensitivity messages.
4630 * m will always be freed.
4633 key_add(struct socket
*so
, struct mbuf
*m
, const struct sadb_msghdr
*mhp
)
4635 struct sadb_sa
*sa0
;
4636 struct sadb_address
*src0
, *dst0
;
4637 struct secasindex saidx
;
4638 struct secashead
*newsah
;
4639 struct secasvar
*newsav
;
4646 if (so
== NULL
|| m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
)
4647 panic("key_add: NULL pointer is passed.");
4649 /* map satype to proto */
4650 if ((proto
= key_satype2proto(mhp
->msg
->sadb_msg_satype
)) == 0) {
4651 ipseclog((LOG_DEBUG
, "key_add: invalid satype is passed.\n"));
4652 return key_senderror(so
, m
, EINVAL
);
4655 if (mhp
->ext
[SADB_EXT_SA
] == NULL
||
4656 mhp
->ext
[SADB_EXT_ADDRESS_SRC
] == NULL
||
4657 mhp
->ext
[SADB_EXT_ADDRESS_DST
] == NULL
||
4658 (mhp
->msg
->sadb_msg_satype
== SADB_SATYPE_ESP
&&
4659 mhp
->ext
[SADB_EXT_KEY_ENCRYPT
] == NULL
) ||
4660 (mhp
->msg
->sadb_msg_satype
== SADB_SATYPE_AH
&&
4661 mhp
->ext
[SADB_EXT_KEY_AUTH
] == NULL
) ||
4662 (mhp
->ext
[SADB_EXT_LIFETIME_HARD
] != NULL
&&
4663 mhp
->ext
[SADB_EXT_LIFETIME_SOFT
] == NULL
) ||
4664 (mhp
->ext
[SADB_EXT_LIFETIME_HARD
] == NULL
&&
4665 mhp
->ext
[SADB_EXT_LIFETIME_SOFT
] != NULL
)) {
4666 ipseclog((LOG_DEBUG
, "key_add: invalid message is passed.\n"));
4667 return key_senderror(so
, m
, EINVAL
);
4669 if (mhp
->extlen
[SADB_EXT_SA
] < sizeof(struct sadb_sa
) ||
4670 mhp
->extlen
[SADB_EXT_ADDRESS_SRC
] < sizeof(struct sadb_address
) ||
4671 mhp
->extlen
[SADB_EXT_ADDRESS_DST
] < sizeof(struct sadb_address
)) {
4673 ipseclog((LOG_DEBUG
, "key_add: invalid message is passed.\n"));
4674 return key_senderror(so
, m
, EINVAL
);
4676 if (mhp
->ext
[SADB_X_EXT_SA2
] != NULL
) {
4677 mode
= ((struct sadb_x_sa2
*)mhp
->ext
[SADB_X_EXT_SA2
])->sadb_x_sa2_mode
;
4678 reqid
= ((struct sadb_x_sa2
*)mhp
->ext
[SADB_X_EXT_SA2
])->sadb_x_sa2_reqid
;
4680 mode
= IPSEC_MODE_ANY
;
4684 sa0
= (struct sadb_sa
*)mhp
->ext
[SADB_EXT_SA
];
4685 src0
= (struct sadb_address
*)mhp
->ext
[SADB_EXT_ADDRESS_SRC
];
4686 dst0
= (struct sadb_address
*)mhp
->ext
[SADB_EXT_ADDRESS_DST
];
4688 /* XXX boundary check against sa_len */
4689 KEY_SETSECASIDX(proto
, mode
, reqid
, src0
+ 1, dst0
+ 1, &saidx
);
4691 /* get a SA header */
4692 if ((newsah
= key_getsah(&saidx
)) == NULL
) {
4693 /* create a new SA header */
4694 if ((newsah
= key_newsah(&saidx
)) == NULL
) {
4695 ipseclog((LOG_DEBUG
, "key_add: No more memory.\n"));
4696 return key_senderror(so
, m
, ENOBUFS
);
4700 /* set spidx if there */
4702 error
= key_setident(newsah
, m
, mhp
);
4704 return key_senderror(so
, m
, error
);
4707 /* create new SA entry. */
4708 /* We can create new SA only if SPI is differenct. */
4709 if (key_getsavbyspi(newsah
, sa0
->sadb_sa_spi
)) {
4710 ipseclog((LOG_DEBUG
, "key_add: SA already exists.\n"));
4711 return key_senderror(so
, m
, EEXIST
);
4713 newsav
= KEY_NEWSAV(m
, mhp
, newsah
, &error
);
4714 if (newsav
== NULL
) {
4715 return key_senderror(so
, m
, error
);
4718 /* check SA values to be mature. */
4719 if ((error
= key_mature(newsav
)) != 0) {
4720 KEY_FREESAV(&newsav
);
4721 return key_senderror(so
, m
, error
);
4725 * don't call key_freesav() here, as we would like to keep the SA
4726 * in the database on success.
4732 /* set msg buf from mhp */
4733 n
= key_getmsgbuf_x1(m
, mhp
);
4735 ipseclog((LOG_DEBUG
, "key_update: No more memory.\n"));
4736 return key_senderror(so
, m
, ENOBUFS
);
4740 return key_sendup_mbuf(so
, n
, KEY_SENDUP_ALL
);
4746 key_setident(struct secashead
*sah
, struct mbuf
*m
,
4747 const struct sadb_msghdr
*mhp
)
4749 const struct sadb_ident
*idsrc
, *iddst
;
4750 int idsrclen
, iddstlen
;
4753 if (sah
== NULL
|| m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
)
4754 panic("key_setident: NULL pointer is passed.");
4756 /* don't make buffer if not there */
4757 if (mhp
->ext
[SADB_EXT_IDENTITY_SRC
] == NULL
&&
4758 mhp
->ext
[SADB_EXT_IDENTITY_DST
] == NULL
) {
4764 if (mhp
->ext
[SADB_EXT_IDENTITY_SRC
] == NULL
||
4765 mhp
->ext
[SADB_EXT_IDENTITY_DST
] == NULL
) {
4766 ipseclog((LOG_DEBUG
, "key_setident: invalid identity.\n"));
4770 idsrc
= (const struct sadb_ident
*)mhp
->ext
[SADB_EXT_IDENTITY_SRC
];
4771 iddst
= (const struct sadb_ident
*)mhp
->ext
[SADB_EXT_IDENTITY_DST
];
4772 idsrclen
= mhp
->extlen
[SADB_EXT_IDENTITY_SRC
];
4773 iddstlen
= mhp
->extlen
[SADB_EXT_IDENTITY_DST
];
4775 /* validity check */
4776 if (idsrc
->sadb_ident_type
!= iddst
->sadb_ident_type
) {
4777 ipseclog((LOG_DEBUG
, "key_setident: ident type mismatch.\n"));
4781 switch (idsrc
->sadb_ident_type
) {
4782 case SADB_IDENTTYPE_PREFIX
:
4783 case SADB_IDENTTYPE_FQDN
:
4784 case SADB_IDENTTYPE_USERFQDN
:
4786 /* XXX do nothing */
4792 /* make structure */
4793 KMALLOC(sah
->idents
, struct sadb_ident
*, idsrclen
);
4794 if (sah
->idents
== NULL
) {
4795 ipseclog((LOG_DEBUG
, "key_setident: No more memory.\n"));
4798 KMALLOC(sah
->identd
, struct sadb_ident
*, iddstlen
);
4799 if (sah
->identd
== NULL
) {
4802 ipseclog((LOG_DEBUG
, "key_setident: No more memory.\n"));
4805 bcopy(idsrc
, sah
->idents
, idsrclen
);
4806 bcopy(iddst
, sah
->identd
, iddstlen
);
4812 * m will not be freed on return.
4813 * it is caller's responsibility to free the result.
4815 static struct mbuf
*
4816 key_getmsgbuf_x1(struct mbuf
*m
, const struct sadb_msghdr
*mhp
)
4821 if (m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
)
4822 panic("key_getmsgbuf_x1: NULL pointer is passed.");
4824 /* create new sadb_msg to reply. */
4825 n
= key_gather_mbuf(m
, mhp
, 1, 9, SADB_EXT_RESERVED
,
4826 SADB_EXT_SA
, SADB_X_EXT_SA2
,
4827 SADB_EXT_ADDRESS_SRC
, SADB_EXT_ADDRESS_DST
,
4828 SADB_EXT_LIFETIME_HARD
, SADB_EXT_LIFETIME_SOFT
,
4829 SADB_EXT_IDENTITY_SRC
, SADB_EXT_IDENTITY_DST
);
4833 if (n
->m_len
< sizeof(struct sadb_msg
)) {
4834 n
= m_pullup(n
, sizeof(struct sadb_msg
));
4838 mtod(n
, struct sadb_msg
*)->sadb_msg_errno
= 0;
4839 mtod(n
, struct sadb_msg
*)->sadb_msg_len
=
4840 PFKEY_UNIT64(n
->m_pkthdr
.len
);
4845 static int key_delete_all (struct socket
*, struct mbuf
*,
4846 const struct sadb_msghdr
*, u_int16_t
);
4849 * SADB_DELETE processing
4851 * <base, SA(*), address(SD)>
4852 * from the ikmpd, and set SADB_SASTATE_DEAD,
4854 * <base, SA(*), address(SD)>
4857 * m will always be freed.
4860 key_delete(struct socket
*so
, struct mbuf
*m
, const struct sadb_msghdr
*mhp
)
4862 struct sadb_sa
*sa0
;
4863 struct sadb_address
*src0
, *dst0
;
4864 struct secasindex saidx
;
4865 struct secashead
*sah
;
4866 struct secasvar
*sav
= NULL
;
4870 if (so
== NULL
|| m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
)
4871 panic("key_delete: NULL pointer is passed.");
4873 /* map satype to proto */
4874 if ((proto
= key_satype2proto(mhp
->msg
->sadb_msg_satype
)) == 0) {
4875 ipseclog((LOG_DEBUG
, "key_delete: invalid satype is passed.\n"));
4876 return key_senderror(so
, m
, EINVAL
);
4879 if (mhp
->ext
[SADB_EXT_ADDRESS_SRC
] == NULL
||
4880 mhp
->ext
[SADB_EXT_ADDRESS_DST
] == NULL
) {
4881 ipseclog((LOG_DEBUG
, "key_delete: invalid message is passed.\n"));
4882 return key_senderror(so
, m
, EINVAL
);
4885 if (mhp
->extlen
[SADB_EXT_ADDRESS_SRC
] < sizeof(struct sadb_address
) ||
4886 mhp
->extlen
[SADB_EXT_ADDRESS_DST
] < sizeof(struct sadb_address
)) {
4887 ipseclog((LOG_DEBUG
, "key_delete: invalid message is passed.\n"));
4888 return key_senderror(so
, m
, EINVAL
);
4891 if (mhp
->ext
[SADB_EXT_SA
] == NULL
) {
4893 * Caller wants us to delete all non-LARVAL SAs
4894 * that match the src/dst. This is used during
4895 * IKE INITIAL-CONTACT.
4897 ipseclog((LOG_DEBUG
, "key_delete: doing delete all.\n"));
4898 return key_delete_all(so
, m
, mhp
, proto
);
4899 } else if (mhp
->extlen
[SADB_EXT_SA
] < sizeof(struct sadb_sa
)) {
4900 ipseclog((LOG_DEBUG
, "key_delete: invalid message is passed.\n"));
4901 return key_senderror(so
, m
, EINVAL
);
4904 sa0
= (struct sadb_sa
*)mhp
->ext
[SADB_EXT_SA
];
4905 src0
= (struct sadb_address
*)(mhp
->ext
[SADB_EXT_ADDRESS_SRC
]);
4906 dst0
= (struct sadb_address
*)(mhp
->ext
[SADB_EXT_ADDRESS_DST
]);
4908 /* XXX boundary check against sa_len */
4909 KEY_SETSECASIDX(proto
, IPSEC_MODE_ANY
, 0, src0
+ 1, dst0
+ 1, &saidx
);
4911 /* get a SA header */
4912 LIST_FOREACH(sah
, &sahtree
, chain
) {
4913 if (sah
->state
== SADB_SASTATE_DEAD
)
4915 if (key_cmpsaidx(&sah
->saidx
, &saidx
, CMP_HEAD
) == 0)
4918 /* get a SA with SPI. */
4919 sav
= key_getsavbyspi(sah
, sa0
->sadb_sa_spi
);
4924 ipseclog((LOG_DEBUG
, "key_delete: no SA found.\n"));
4925 return key_senderror(so
, m
, ENOENT
);
4928 key_sa_chgstate(sav
, SADB_SASTATE_DEAD
);
4933 struct sadb_msg
*newmsg
;
4935 /* create new sadb_msg to reply. */
4936 n
= key_gather_mbuf(m
, mhp
, 1, 4, SADB_EXT_RESERVED
,
4937 SADB_EXT_SA
, SADB_EXT_ADDRESS_SRC
, SADB_EXT_ADDRESS_DST
);
4939 return key_senderror(so
, m
, ENOBUFS
);
4941 if (n
->m_len
< sizeof(struct sadb_msg
)) {
4942 n
= m_pullup(n
, sizeof(struct sadb_msg
));
4944 return key_senderror(so
, m
, ENOBUFS
);
4946 newmsg
= mtod(n
, struct sadb_msg
*);
4947 newmsg
->sadb_msg_errno
= 0;
4948 newmsg
->sadb_msg_len
= PFKEY_UNIT64(n
->m_pkthdr
.len
);
4951 return key_sendup_mbuf(so
, n
, KEY_SENDUP_ALL
);
4956 * delete all SAs for src/dst. Called from key_delete().
4959 key_delete_all(struct socket
*so
, struct mbuf
*m
,
4960 const struct sadb_msghdr
*mhp
, u_int16_t proto
)
4962 struct sadb_address
*src0
, *dst0
;
4963 struct secasindex saidx
;
4964 struct secashead
*sah
;
4965 struct secasvar
*sav
, *nextsav
;
4966 u_int stateidx
, state
;
4968 struct sadb_msg
*newmsg
;
4970 src0
= (struct sadb_address
*)(mhp
->ext
[SADB_EXT_ADDRESS_SRC
]);
4971 dst0
= (struct sadb_address
*)(mhp
->ext
[SADB_EXT_ADDRESS_DST
]);
4973 /* XXX boundary check against sa_len */
4974 KEY_SETSECASIDX(proto
, IPSEC_MODE_ANY
, 0, src0
+ 1, dst0
+ 1, &saidx
);
4976 LIST_FOREACH(sah
, &sahtree
, chain
) {
4977 if (sah
->state
== SADB_SASTATE_DEAD
)
4979 if (key_cmpsaidx(&sah
->saidx
, &saidx
, CMP_HEAD
) == 0)
4982 /* Delete all non-LARVAL SAs. */
4983 for (stateidx
= 0; stateidx
< NELEM(saorder_state_alive
);
4985 state
= saorder_state_alive
[stateidx
];
4986 if (state
== SADB_SASTATE_LARVAL
)
4988 LIST_FOREACH_MUTABLE(sav
, &sah
->savtree
[state
], chain
,
4991 if (sav
->state
!= state
) {
4992 ipseclog((LOG_DEBUG
, "key_delete_all: "
4993 "invalid sav->state "
4994 "(queue: %d SA: %d)\n",
4995 state
, sav
->state
));
4999 key_sa_chgstate(sav
, SADB_SASTATE_DEAD
);
5005 /* create new sadb_msg to reply. */
5006 n
= key_gather_mbuf(m
, mhp
, 1, 3, SADB_EXT_RESERVED
,
5007 SADB_EXT_ADDRESS_SRC
, SADB_EXT_ADDRESS_DST
);
5009 return key_senderror(so
, m
, ENOBUFS
);
5011 if (n
->m_len
< sizeof(struct sadb_msg
)) {
5012 n
= m_pullup(n
, sizeof(struct sadb_msg
));
5014 return key_senderror(so
, m
, ENOBUFS
);
5016 newmsg
= mtod(n
, struct sadb_msg
*);
5017 newmsg
->sadb_msg_errno
= 0;
5018 newmsg
->sadb_msg_len
= PFKEY_UNIT64(n
->m_pkthdr
.len
);
5021 return key_sendup_mbuf(so
, n
, KEY_SENDUP_ALL
);
5025 * SADB_GET processing
5027 * <base, SA(*), address(SD)>
5028 * from the ikmpd, and get a SP and a SA to respond,
5030 * <base, SA, (lifetime(HSC),) address(SD), (address(P),) key(AE),
5031 * (identity(SD),) (sensitivity)>
5034 * m will always be freed.
5037 key_get(struct socket
*so
, struct mbuf
*m
, const struct sadb_msghdr
*mhp
)
5039 struct sadb_sa
*sa0
;
5040 struct sadb_address
*src0
, *dst0
;
5041 struct secasindex saidx
;
5042 struct secashead
*sah
;
5043 struct secasvar
*sav
= NULL
;
5047 if (so
== NULL
|| m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
)
5048 panic("key_get: NULL pointer is passed.");
5050 /* map satype to proto */
5051 if ((proto
= key_satype2proto(mhp
->msg
->sadb_msg_satype
)) == 0) {
5052 ipseclog((LOG_DEBUG
, "key_get: invalid satype is passed.\n"));
5053 return key_senderror(so
, m
, EINVAL
);
5056 if (mhp
->ext
[SADB_EXT_SA
] == NULL
||
5057 mhp
->ext
[SADB_EXT_ADDRESS_SRC
] == NULL
||
5058 mhp
->ext
[SADB_EXT_ADDRESS_DST
] == NULL
) {
5059 ipseclog((LOG_DEBUG
, "key_get: invalid message is passed.\n"));
5060 return key_senderror(so
, m
, EINVAL
);
5062 if (mhp
->extlen
[SADB_EXT_SA
] < sizeof(struct sadb_sa
) ||
5063 mhp
->extlen
[SADB_EXT_ADDRESS_SRC
] < sizeof(struct sadb_address
) ||
5064 mhp
->extlen
[SADB_EXT_ADDRESS_DST
] < sizeof(struct sadb_address
)) {
5065 ipseclog((LOG_DEBUG
, "key_get: invalid message is passed.\n"));
5066 return key_senderror(so
, m
, EINVAL
);
5069 sa0
= (struct sadb_sa
*)mhp
->ext
[SADB_EXT_SA
];
5070 src0
= (struct sadb_address
*)mhp
->ext
[SADB_EXT_ADDRESS_SRC
];
5071 dst0
= (struct sadb_address
*)mhp
->ext
[SADB_EXT_ADDRESS_DST
];
5073 /* XXX boundary check against sa_len */
5074 KEY_SETSECASIDX(proto
, IPSEC_MODE_ANY
, 0, src0
+ 1, dst0
+ 1, &saidx
);
5076 /* get a SA header */
5077 LIST_FOREACH(sah
, &sahtree
, chain
) {
5078 if (sah
->state
== SADB_SASTATE_DEAD
)
5080 if (key_cmpsaidx(&sah
->saidx
, &saidx
, CMP_HEAD
) == 0)
5083 /* get a SA with SPI. */
5084 sav
= key_getsavbyspi(sah
, sa0
->sadb_sa_spi
);
5089 ipseclog((LOG_DEBUG
, "key_get: no SA found.\n"));
5090 return key_senderror(so
, m
, ENOENT
);
5097 /* map proto to satype */
5098 if ((satype
= key_proto2satype(sah
->saidx
.proto
)) == 0) {
5099 ipseclog((LOG_DEBUG
, "key_get: there was invalid proto in SAD.\n"));
5100 return key_senderror(so
, m
, EINVAL
);
5103 /* create new sadb_msg to reply. */
5104 n
= key_setdumpsa(sav
, SADB_GET
, satype
, mhp
->msg
->sadb_msg_seq
,
5105 mhp
->msg
->sadb_msg_pid
);
5107 return key_senderror(so
, m
, ENOBUFS
);
5110 return key_sendup_mbuf(so
, n
, KEY_SENDUP_ONE
);
5114 /* XXX make it sysctl-configurable? */
5116 key_getcomb_setlifetime(struct sadb_comb
*comb
)
5119 comb
->sadb_comb_soft_allocations
= 1;
5120 comb
->sadb_comb_hard_allocations
= 1;
5121 comb
->sadb_comb_soft_bytes
= 0;
5122 comb
->sadb_comb_hard_bytes
= 0;
5123 comb
->sadb_comb_hard_addtime
= 86400; /* 1 day */
5124 comb
->sadb_comb_soft_addtime
= comb
->sadb_comb_soft_addtime
* 80 / 100;
5125 comb
->sadb_comb_soft_usetime
= 28800; /* 8 hours */
5126 comb
->sadb_comb_hard_usetime
= comb
->sadb_comb_hard_usetime
* 80 / 100;
5130 * XXX reorder combinations by preference
5131 * XXX no idea if the user wants ESP authentication or not
5133 static struct mbuf
*
5134 key_getcomb_esp(void)
5136 struct sadb_comb
*comb
;
5137 struct enc_xform
*algo
;
5138 struct mbuf
*result
= NULL
, *m
, *n
;
5142 const int l
= PFKEY_ALIGN8(sizeof(struct sadb_comb
));
5145 for (i
= 1; i
<= SADB_EALG_MAX
; i
++) {
5146 algo
= esp_algorithm_lookup(i
);
5150 /* discard algorithms with key size smaller than system min */
5151 if (_BITS(algo
->maxkey
) < ipsec_esp_keymin
)
5153 if (_BITS(algo
->minkey
) < ipsec_esp_keymin
)
5154 encmin
= ipsec_esp_keymin
;
5156 encmin
= _BITS(algo
->minkey
);
5159 m
= key_getcomb_ah();
5162 ("key_getcomb_esp: l=%u > MLEN=%lu",
5164 MGET(m
, M_NOWAIT
, MT_DATA
);
5169 bzero(mtod(m
, caddr_t
), m
->m_len
);
5175 totlen
= m_lengthm(m
, NULL
);
5176 KASSERT((totlen
% l
) == 0,
5177 ("key_getcomb_esp: totlen=%u, l=%u", totlen
, l
));
5179 for (off
= 0; off
< totlen
; off
+= l
) {
5180 n
= m_pulldown(m
, off
, l
, &o
);
5182 /* m is already freed */
5185 comb
= (struct sadb_comb
*)(mtod(n
, caddr_t
) + o
);
5186 bzero(comb
, sizeof(*comb
));
5187 key_getcomb_setlifetime(comb
);
5188 comb
->sadb_comb_encrypt
= i
;
5189 comb
->sadb_comb_encrypt_minbits
= encmin
;
5190 comb
->sadb_comb_encrypt_maxbits
= _BITS(algo
->maxkey
);
5209 const struct auth_hash
*ah
,
5214 *min
= *max
= ah
->keysize
;
5215 if (ah
->keysize
== 0) {
5217 * Transform takes arbitrary key size but algorithm
5218 * key size is restricted. Enforce this here.
5221 case SADB_X_AALG_MD5
: *min
= *max
= 16; break;
5222 case SADB_X_AALG_SHA
: *min
= *max
= 20; break;
5223 case SADB_X_AALG_NULL
: *min
= 1; *max
= 256; break;
5225 DPRINTF(("key_getsizes_ah: unknown AH algorithm %u\n",
5233 * XXX reorder combinations by preference
5235 static struct mbuf
*
5236 key_getcomb_ah(void)
5238 struct sadb_comb
*comb
;
5239 struct auth_hash
*algo
;
5241 u_int16_t minkeysize
, maxkeysize
;
5243 const int l
= PFKEY_ALIGN8(sizeof(struct sadb_comb
));
5246 for (i
= 1; i
<= SADB_AALG_MAX
; i
++) {
5248 /* we prefer HMAC algorithms, not old algorithms */
5249 if (i
!= SADB_AALG_SHA1HMAC
&& i
!= SADB_AALG_MD5HMAC
)
5252 algo
= ah_algorithm_lookup(i
);
5255 key_getsizes_ah(algo
, i
, &minkeysize
, &maxkeysize
);
5256 /* discard algorithms with key size smaller than system min */
5257 if (_BITS(minkeysize
) < ipsec_ah_keymin
)
5262 ("key_getcomb_ah: l=%u > MLEN=%lu",
5264 MGET(m
, M_NOWAIT
, MT_DATA
);
5271 M_PREPEND(m
, l
, M_NOWAIT
);
5275 comb
= mtod(m
, struct sadb_comb
*);
5276 bzero(comb
, sizeof(*comb
));
5277 key_getcomb_setlifetime(comb
);
5278 comb
->sadb_comb_auth
= i
;
5279 comb
->sadb_comb_auth_minbits
= _BITS(minkeysize
);
5280 comb
->sadb_comb_auth_maxbits
= _BITS(maxkeysize
);
5287 * not really an official behavior. discussed in pf_key@inner.net in Sep2000.
5288 * XXX reorder combinations by preference
5290 static struct mbuf
*
5291 key_getcomb_ipcomp(void)
5293 struct sadb_comb
*comb
;
5294 struct comp_algo
*algo
;
5297 const int l
= PFKEY_ALIGN8(sizeof(struct sadb_comb
));
5300 for (i
= 1; i
<= SADB_X_CALG_MAX
; i
++) {
5301 algo
= ipcomp_algorithm_lookup(i
);
5307 ("key_getcomb_ipcomp: l=%u > MLEN=%lu",
5309 MGET(m
, M_NOWAIT
, MT_DATA
);
5316 M_PREPEND(m
, l
, M_NOWAIT
);
5320 comb
= mtod(m
, struct sadb_comb
*);
5321 bzero(comb
, sizeof(*comb
));
5322 key_getcomb_setlifetime(comb
);
5323 comb
->sadb_comb_encrypt
= i
;
5324 /* what should we set into sadb_comb_*_{min,max}bits? */
5331 * XXX no way to pass mode (transport/tunnel) to userland
5332 * XXX replay checking?
5333 * XXX sysctl interface to ipsec_{ah,esp}_keymin
5335 static struct mbuf
*
5336 key_getprop(const struct secasindex
*saidx
)
5338 struct sadb_prop
*prop
;
5340 const int l
= PFKEY_ALIGN8(sizeof(struct sadb_prop
));
5342 switch (saidx
->proto
) {
5344 m
= key_getcomb_esp();
5347 m
= key_getcomb_ah();
5349 case IPPROTO_IPCOMP
:
5350 m
= key_getcomb_ipcomp();
5358 M_PREPEND(m
, l
, M_NOWAIT
);
5362 prop
= mtod(m
, struct sadb_prop
*);
5363 bzero(prop
, sizeof(*prop
));
5364 prop
->sadb_prop_len
= PFKEY_UNIT64(m_lengthm(m
, NULL
));
5365 prop
->sadb_prop_exttype
= SADB_EXT_PROPOSAL
;
5366 prop
->sadb_prop_replay
= 32; /* XXX */
5372 * SADB_ACQUIRE processing called by key_checkrequest() and key_acquire2().
5374 * <base, SA, address(SD), (address(P)), x_policy,
5375 * (identity(SD),) (sensitivity,) proposal>
5376 * to KMD, and expect to receive
5377 * <base> with SADB_ACQUIRE if error occured,
5379 * <base, src address, dst address, (SPI range)> with SADB_GETSPI
5380 * from KMD by PF_KEY.
5382 * XXX x_policy is outside of RFC2367 (KAME extension).
5383 * XXX sensitivity is not supported.
5384 * XXX for ipcomp, RFC2367 does not define how to fill in proposal.
5385 * see comment for key_getcomb_ipcomp().
5389 * others: error number
5392 key_acquire(const struct secasindex
*saidx
, struct secpolicy
*sp
)
5394 struct mbuf
*result
= NULL
, *m
;
5395 #ifndef IPSEC_NONBLOCK_ACQUIRE
5396 struct secacq
*newacq
;
5403 KASSERT(saidx
!= NULL
, ("key_acquire: null saidx"));
5404 satype
= key_proto2satype(saidx
->proto
);
5405 KASSERT(satype
!= 0,
5406 ("key_acquire: null satype, protocol %u", saidx
->proto
));
5408 #ifndef IPSEC_NONBLOCK_ACQUIRE
5410 * We never do anything about acquirng SA. There is anather
5411 * solution that kernel blocks to send SADB_ACQUIRE message until
5412 * getting something message from IKEd. In later case, to be
5413 * managed with ACQUIRING list.
5415 /* Get an entry to check whether sending message or not. */
5416 if ((newacq
= key_getacq(saidx
)) != NULL
) {
5417 if (key_blockacq_count
< newacq
->count
) {
5418 /* reset counter and do send message. */
5421 /* increment counter and do nothing. */
5426 /* make new entry for blocking to send SADB_ACQUIRE. */
5427 if ((newacq
= key_newacq(saidx
)) == NULL
)
5430 /* add to acqtree */
5431 LIST_INSERT_HEAD(&acqtree
, newacq
, chain
);
5436 #ifndef IPSEC_NONBLOCK_ACQUIRE
5439 seq
= (acq_seq
= (acq_seq
== ~0 ? 1 : ++acq_seq
));
5441 m
= key_setsadbmsg(SADB_ACQUIRE
, 0, satype
, seq
, 0, 0);
5448 /* set sadb_address for saidx's. */
5449 m
= key_setsadbaddr(SADB_EXT_ADDRESS_SRC
,
5450 &saidx
->src
.sa
, FULLMASK
, IPSEC_ULPROTO_ANY
);
5457 m
= key_setsadbaddr(SADB_EXT_ADDRESS_DST
,
5458 &saidx
->dst
.sa
, FULLMASK
, IPSEC_ULPROTO_ANY
);
5465 /* XXX proxy address (optional) */
5467 /* set sadb_x_policy */
5469 m
= key_setsadbxpolicy(sp
->policy
, sp
->spidx
.dir
, sp
->id
);
5477 /* XXX identity (optional) */
5479 if (idexttype
&& fqdn
) {
5480 /* create identity extension (FQDN) */
5481 struct sadb_ident
*id
;
5484 fqdnlen
= strlen(fqdn
) + 1; /* +1 for terminating-NUL */
5485 id
= (struct sadb_ident
*)p
;
5486 bzero(id
, sizeof(*id
) + PFKEY_ALIGN8(fqdnlen
));
5487 id
->sadb_ident_len
= PFKEY_UNIT64(sizeof(*id
) + PFKEY_ALIGN8(fqdnlen
));
5488 id
->sadb_ident_exttype
= idexttype
;
5489 id
->sadb_ident_type
= SADB_IDENTTYPE_FQDN
;
5490 bcopy(fqdn
, id
+ 1, fqdnlen
);
5491 p
+= sizeof(struct sadb_ident
) + PFKEY_ALIGN8(fqdnlen
);
5495 /* create identity extension (USERFQDN) */
5496 struct sadb_ident
*id
;
5500 /* +1 for terminating-NUL */
5501 userfqdnlen
= strlen(userfqdn
) + 1;
5504 id
= (struct sadb_ident
*)p
;
5505 bzero(id
, sizeof(*id
) + PFKEY_ALIGN8(userfqdnlen
));
5506 id
->sadb_ident_len
= PFKEY_UNIT64(sizeof(*id
) + PFKEY_ALIGN8(userfqdnlen
));
5507 id
->sadb_ident_exttype
= idexttype
;
5508 id
->sadb_ident_type
= SADB_IDENTTYPE_USERFQDN
;
5509 /* XXX is it correct? */
5510 if (curproc
&& curproc
->p_cred
)
5511 id
->sadb_ident_id
= curproc
->p_cred
->p_ruid
;
5512 if (userfqdn
&& userfqdnlen
)
5513 bcopy(userfqdn
, id
+ 1, userfqdnlen
);
5514 p
+= sizeof(struct sadb_ident
) + PFKEY_ALIGN8(userfqdnlen
);
5518 /* XXX sensitivity (optional) */
5520 /* create proposal/combination extension */
5521 m
= key_getprop(saidx
);
5524 * spec conformant: always attach proposal/combination extension,
5525 * the problem is that we have no way to attach it for ipcomp,
5526 * due to the way sadb_comb is declared in RFC2367.
5535 * outside of spec; make proposal/combination extension optional.
5541 if ((result
->m_flags
& M_PKTHDR
) == 0) {
5546 if (result
->m_len
< sizeof(struct sadb_msg
)) {
5547 result
= m_pullup(result
, sizeof(struct sadb_msg
));
5548 if (result
== NULL
) {
5553 result
->m_pkthdr
.len
= m_lengthm(result
, NULL
);
5554 mtod(result
, struct sadb_msg
*)->sadb_msg_len
=
5555 PFKEY_UNIT64(result
->m_pkthdr
.len
);
5557 return key_sendup_mbuf(NULL
, result
, KEY_SENDUP_REGISTERED
);
5565 #ifndef IPSEC_NONBLOCK_ACQUIRE
5566 static struct secacq
*
5567 key_newacq(const struct secasindex
*saidx
)
5569 struct secacq
*newacq
;
5572 KMALLOC(newacq
, struct secacq
*, sizeof(struct secacq
));
5573 if (newacq
== NULL
) {
5574 ipseclog((LOG_DEBUG
, "key_newacq: No more memory.\n"));
5577 bzero(newacq
, sizeof(*newacq
));
5580 bcopy(saidx
, &newacq
->saidx
, sizeof(newacq
->saidx
));
5581 newacq
->seq
= (acq_seq
== ~0 ? 1 : ++acq_seq
);
5582 newacq
->created
= time_second
;
5588 static struct secacq
*
5589 key_getacq(const struct secasindex
*saidx
)
5593 LIST_FOREACH(acq
, &acqtree
, chain
) {
5594 if (key_cmpsaidx(saidx
, &acq
->saidx
, CMP_EXACTLY
))
5601 static struct secacq
*
5602 key_getacqbyseq(u_int32_t seq
)
5606 LIST_FOREACH(acq
, &acqtree
, chain
) {
5607 if (acq
->seq
== seq
)
5615 static struct secspacq
*
5616 key_newspacq(struct secpolicyindex
*spidx
)
5618 struct secspacq
*acq
;
5621 KMALLOC(acq
, struct secspacq
*, sizeof(struct secspacq
));
5623 ipseclog((LOG_DEBUG
, "key_newspacq: No more memory.\n"));
5626 bzero(acq
, sizeof(*acq
));
5629 bcopy(spidx
, &acq
->spidx
, sizeof(acq
->spidx
));
5630 acq
->created
= time_second
;
5636 static struct secspacq
*
5637 key_getspacq(struct secpolicyindex
*spidx
)
5639 struct secspacq
*acq
;
5641 LIST_FOREACH(acq
, &spacqtree
, chain
) {
5642 if (key_cmpspidx_exactly(spidx
, &acq
->spidx
))
5650 * SADB_ACQUIRE processing,
5651 * in first situation, is receiving
5653 * from the ikmpd, and clear sequence of its secasvar entry.
5655 * In second situation, is receiving
5656 * <base, address(SD), (address(P),) (identity(SD),) (sensitivity,) proposal>
5657 * from a user land process, and return
5658 * <base, address(SD), (address(P),) (identity(SD),) (sensitivity,) proposal>
5661 * m will always be freed.
5664 key_acquire2(struct socket
*so
, struct mbuf
*m
, const struct sadb_msghdr
*mhp
)
5666 const struct sadb_address
*src0
, *dst0
;
5667 struct secasindex saidx
;
5668 struct secashead
*sah
;
5673 if (so
== NULL
|| m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
)
5674 panic("key_acquire2: NULL pointer is passed.");
5677 * Error message from KMd.
5678 * We assume that if error was occured in IKEd, the length of PFKEY
5679 * message is equal to the size of sadb_msg structure.
5680 * We do not raise error even if error occured in this function.
5682 if (mhp
->msg
->sadb_msg_len
== PFKEY_UNIT64(sizeof(struct sadb_msg
))) {
5683 #ifndef IPSEC_NONBLOCK_ACQUIRE
5686 /* check sequence number */
5687 if (mhp
->msg
->sadb_msg_seq
== 0) {
5688 ipseclog((LOG_DEBUG
, "key_acquire2: must specify sequence number.\n"));
5693 if ((acq
= key_getacqbyseq(mhp
->msg
->sadb_msg_seq
)) == NULL
) {
5695 * the specified larval SA is already gone, or we got
5696 * a bogus sequence number. we can silently ignore it.
5702 /* reset acq counter in order to deletion by timehander. */
5703 acq
->created
= time_second
;
5711 * This message is from user land.
5714 /* map satype to proto */
5715 if ((proto
= key_satype2proto(mhp
->msg
->sadb_msg_satype
)) == 0) {
5716 ipseclog((LOG_DEBUG
, "key_acquire2: invalid satype is passed.\n"));
5717 return key_senderror(so
, m
, EINVAL
);
5720 if (mhp
->ext
[SADB_EXT_ADDRESS_SRC
] == NULL
||
5721 mhp
->ext
[SADB_EXT_ADDRESS_DST
] == NULL
||
5722 mhp
->ext
[SADB_EXT_PROPOSAL
] == NULL
) {
5724 ipseclog((LOG_DEBUG
, "key_acquire2: invalid message is passed.\n"));
5725 return key_senderror(so
, m
, EINVAL
);
5727 if (mhp
->extlen
[SADB_EXT_ADDRESS_SRC
] < sizeof(struct sadb_address
) ||
5728 mhp
->extlen
[SADB_EXT_ADDRESS_DST
] < sizeof(struct sadb_address
) ||
5729 mhp
->extlen
[SADB_EXT_PROPOSAL
] < sizeof(struct sadb_prop
)) {
5731 ipseclog((LOG_DEBUG
, "key_acquire2: invalid message is passed.\n"));
5732 return key_senderror(so
, m
, EINVAL
);
5735 src0
= (struct sadb_address
*)mhp
->ext
[SADB_EXT_ADDRESS_SRC
];
5736 dst0
= (struct sadb_address
*)mhp
->ext
[SADB_EXT_ADDRESS_DST
];
5738 /* XXX boundary check against sa_len */
5739 KEY_SETSECASIDX(proto
, IPSEC_MODE_ANY
, 0, src0
+ 1, dst0
+ 1, &saidx
);
5741 /* get a SA index */
5742 LIST_FOREACH(sah
, &sahtree
, chain
) {
5743 if (sah
->state
== SADB_SASTATE_DEAD
)
5745 if (key_cmpsaidx(&sah
->saidx
, &saidx
, CMP_MODE_REQID
))
5749 ipseclog((LOG_DEBUG
, "key_acquire2: a SA exists already.\n"));
5750 return key_senderror(so
, m
, EEXIST
);
5753 error
= key_acquire(&saidx
, NULL
);
5755 ipseclog((LOG_DEBUG
, "key_acquire2: error %d returned "
5756 "from key_acquire.\n", mhp
->msg
->sadb_msg_errno
));
5757 return key_senderror(so
, m
, error
);
5760 return key_sendup_mbuf(so
, m
, KEY_SENDUP_REGISTERED
);
5764 * SADB_REGISTER processing.
5765 * If SATYPE_UNSPEC has been passed as satype, only return sabd_supported.
5768 * from the ikmpd, and register a socket to send PF_KEY messages,
5772 * If socket is detached, must free from regnode.
5774 * m will always be freed.
5777 key_register(struct socket
*so
, struct mbuf
*m
,
5778 const struct sadb_msghdr
*mhp
)
5780 struct secreg
*reg
, *newreg
= NULL
;
5783 if (so
== NULL
|| m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
)
5784 panic("key_register: NULL pointer is passed.");
5786 /* check for invalid register message */
5787 if (mhp
->msg
->sadb_msg_satype
>= NELEM(regtree
))
5788 return key_senderror(so
, m
, EINVAL
);
5790 /* When SATYPE_UNSPEC is specified, only return sabd_supported. */
5791 if (mhp
->msg
->sadb_msg_satype
== SADB_SATYPE_UNSPEC
)
5794 /* check whether existing or not */
5795 LIST_FOREACH(reg
, ®tree
[mhp
->msg
->sadb_msg_satype
], chain
) {
5796 if (reg
->so
== so
) {
5797 ipseclog((LOG_DEBUG
, "key_register: socket exists already.\n"));
5798 return key_senderror(so
, m
, EEXIST
);
5802 /* create regnode */
5803 KMALLOC(newreg
, struct secreg
*, sizeof(*newreg
));
5804 if (newreg
== NULL
) {
5805 ipseclog((LOG_DEBUG
, "key_register: No more memory.\n"));
5806 return key_senderror(so
, m
, ENOBUFS
);
5808 bzero((caddr_t
)newreg
, sizeof(*newreg
));
5811 ((struct keycb
*)sotorawcb(so
))->kp_registered
++;
5813 /* add regnode to regtree. */
5814 LIST_INSERT_HEAD(®tree
[mhp
->msg
->sadb_msg_satype
], newreg
, chain
);
5819 struct sadb_msg
*newmsg
;
5820 struct sadb_supported
*sup
;
5821 u_int len
, alen
, elen
;
5824 struct sadb_alg
*alg
;
5826 /* create new sadb_msg to reply. */
5828 for (i
= 1; i
<= SADB_AALG_MAX
; i
++) {
5829 if (ah_algorithm_lookup(i
))
5830 alen
+= sizeof(struct sadb_alg
);
5833 alen
+= sizeof(struct sadb_supported
);
5835 for (i
= 1; i
<= SADB_EALG_MAX
; i
++) {
5836 if (esp_algorithm_lookup(i
))
5837 elen
+= sizeof(struct sadb_alg
);
5840 elen
+= sizeof(struct sadb_supported
);
5842 len
= sizeof(struct sadb_msg
) + alen
+ elen
;
5845 return key_senderror(so
, m
, ENOBUFS
);
5846 n
= m_getb(len
, M_NOWAIT
, MT_DATA
, M_PKTHDR
);
5848 return key_senderror(so
, m
, ENOBUFS
);
5849 n
->m_pkthdr
.len
= n
->m_len
= len
;
5851 m_copydata(m
, 0, sizeof(struct sadb_msg
), mtod(n
, caddr_t
));
5852 newmsg
= mtod(n
, struct sadb_msg
*);
5853 newmsg
->sadb_msg_errno
= 0;
5854 newmsg
->sadb_msg_len
= PFKEY_UNIT64(len
);
5855 off
= PFKEY_ALIGN8(sizeof(struct sadb_msg
));
5857 /* for authentication algorithm */
5859 sup
= (struct sadb_supported
*)(mtod(n
, caddr_t
) + off
);
5860 sup
->sadb_supported_len
= PFKEY_UNIT64(alen
);
5861 sup
->sadb_supported_exttype
= SADB_EXT_SUPPORTED_AUTH
;
5862 off
+= PFKEY_ALIGN8(sizeof(*sup
));
5864 for (i
= 1; i
<= SADB_AALG_MAX
; i
++) {
5865 struct auth_hash
*aalgo
;
5866 u_int16_t minkeysize
, maxkeysize
;
5868 aalgo
= ah_algorithm_lookup(i
);
5871 alg
= (struct sadb_alg
*)(mtod(n
, caddr_t
) + off
);
5872 alg
->sadb_alg_id
= i
;
5873 alg
->sadb_alg_ivlen
= 0;
5874 key_getsizes_ah(aalgo
, i
, &minkeysize
, &maxkeysize
);
5875 alg
->sadb_alg_minbits
= _BITS(minkeysize
);
5876 alg
->sadb_alg_maxbits
= _BITS(maxkeysize
);
5877 off
+= PFKEY_ALIGN8(sizeof(*alg
));
5881 /* for encryption algorithm */
5883 sup
= (struct sadb_supported
*)(mtod(n
, caddr_t
) + off
);
5884 sup
->sadb_supported_len
= PFKEY_UNIT64(elen
);
5885 sup
->sadb_supported_exttype
= SADB_EXT_SUPPORTED_ENCRYPT
;
5886 off
+= PFKEY_ALIGN8(sizeof(*sup
));
5888 for (i
= 1; i
<= SADB_EALG_MAX
; i
++) {
5889 struct enc_xform
*ealgo
;
5891 ealgo
= esp_algorithm_lookup(i
);
5894 alg
= (struct sadb_alg
*)(mtod(n
, caddr_t
) + off
);
5895 alg
->sadb_alg_id
= i
;
5896 alg
->sadb_alg_ivlen
= ealgo
->blocksize
;
5897 alg
->sadb_alg_minbits
= _BITS(ealgo
->minkey
);
5898 alg
->sadb_alg_maxbits
= _BITS(ealgo
->maxkey
);
5899 off
+= PFKEY_ALIGN8(sizeof(struct sadb_alg
));
5905 panic("length assumption failed in key_register");
5909 return key_sendup_mbuf(so
, n
, KEY_SENDUP_REGISTERED
);
5914 * free secreg entry registered.
5915 * XXX: I want to do free a socket marked done SADB_RESIGER to socket.
5918 key_freereg(struct socket
*so
)
5925 panic("key_freereg: NULL pointer is passed.");
5928 * check whether existing or not.
5929 * check all type of SA, because there is a potential that
5930 * one socket is registered to multiple type of SA.
5932 for (i
= 0; i
<= SADB_SATYPE_MAX
; i
++) {
5933 LIST_FOREACH(reg
, ®tree
[i
], chain
) {
5935 && __LIST_CHAINED(reg
)) {
5936 LIST_REMOVE(reg
, chain
);
5947 * SADB_EXPIRE processing
5949 * <base, SA, SA2, lifetime(C and one of HS), address(SD)>
5951 * NOTE: We send only soft lifetime extension.
5954 * others : error number
5957 key_expire(struct secasvar
*sav
)
5961 struct mbuf
*result
= NULL
, *m
;
5964 struct sadb_lifetime
*lt
;
5966 /* XXX: Why do we lock ? */
5971 panic("key_expire: NULL pointer is passed.");
5972 if (sav
->sah
== NULL
)
5973 panic("key_expire: Why was SA index in SA NULL.");
5974 if ((satype
= key_proto2satype(sav
->sah
->saidx
.proto
)) == 0)
5975 panic("key_expire: invalid proto is passed.");
5977 /* set msg header */
5978 m
= key_setsadbmsg(SADB_EXPIRE
, 0, satype
, sav
->seq
, 0, sav
->refcnt
);
5985 /* create SA extension */
5986 m
= key_setsadbsa(sav
);
5993 /* create SA extension */
5994 m
= key_setsadbxsa2(sav
->sah
->saidx
.mode
,
5995 sav
->replay
? sav
->replay
->count
: 0,
5996 sav
->sah
->saidx
.reqid
);
6003 /* create lifetime extension (current and soft) */
6004 len
= PFKEY_ALIGN8(sizeof(*lt
)) * 2;
6005 m
= key_alloc_mbuf(len
);
6006 if (!m
|| m
->m_next
) { /*XXX*/
6012 bzero(mtod(m
, caddr_t
), len
);
6013 lt
= mtod(m
, struct sadb_lifetime
*);
6014 lt
->sadb_lifetime_len
= PFKEY_UNIT64(sizeof(struct sadb_lifetime
));
6015 lt
->sadb_lifetime_exttype
= SADB_EXT_LIFETIME_CURRENT
;
6016 lt
->sadb_lifetime_allocations
= sav
->lft_c
->sadb_lifetime_allocations
;
6017 lt
->sadb_lifetime_bytes
= sav
->lft_c
->sadb_lifetime_bytes
;
6018 lt
->sadb_lifetime_addtime
= sav
->lft_c
->sadb_lifetime_addtime
;
6019 lt
->sadb_lifetime_usetime
= sav
->lft_c
->sadb_lifetime_usetime
;
6020 lt
= (struct sadb_lifetime
*)(mtod(m
, caddr_t
) + len
/ 2);
6021 bcopy(sav
->lft_s
, lt
, sizeof(*lt
));
6024 /* set sadb_address for source */
6025 m
= key_setsadbaddr(SADB_EXT_ADDRESS_SRC
,
6026 &sav
->sah
->saidx
.src
.sa
,
6027 FULLMASK
, IPSEC_ULPROTO_ANY
);
6034 /* set sadb_address for destination */
6035 m
= key_setsadbaddr(SADB_EXT_ADDRESS_DST
,
6036 &sav
->sah
->saidx
.dst
.sa
,
6037 FULLMASK
, IPSEC_ULPROTO_ANY
);
6044 if ((result
->m_flags
& M_PKTHDR
) == 0) {
6049 if (result
->m_len
< sizeof(struct sadb_msg
)) {
6050 result
= m_pullup(result
, sizeof(struct sadb_msg
));
6051 if (result
== NULL
) {
6056 result
->m_pkthdr
.len
= m_lengthm(result
, NULL
);
6057 mtod(result
, struct sadb_msg
*)->sadb_msg_len
=
6058 PFKEY_UNIT64(result
->m_pkthdr
.len
);
6061 return key_sendup_mbuf(NULL
, result
, KEY_SENDUP_REGISTERED
);
6071 * SADB_FLUSH processing
6074 * from the ikmpd, and free all entries in secastree.
6078 * NOTE: to do is only marking SADB_SASTATE_DEAD.
6080 * m will always be freed.
6083 key_flush(struct socket
*so
, struct mbuf
*m
, const struct sadb_msghdr
*mhp
)
6085 struct sadb_msg
*newmsg
;
6086 struct secashead
*sah
;
6091 if (so
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
)
6092 panic("key_flush: NULL pointer is passed.");
6094 /* map satype to proto */
6095 if ((proto
= key_satype2proto(mhp
->msg
->sadb_msg_satype
)) == 0) {
6096 ipseclog((LOG_DEBUG
, "key_flush: invalid satype is passed.\n"));
6097 return key_senderror(so
, m
, EINVAL
);
6100 /* no SATYPE specified, i.e. flushing all SA. */
6101 LIST_FOREACH(sah
, &sahtree
, chain
) {
6102 if (mhp
->msg
->sadb_msg_satype
!= SADB_SATYPE_UNSPEC
&&
6103 proto
!= sah
->saidx
.proto
)
6106 for (stateidx
= 0; stateidx
< NELEM(saorder_state_alive
);
6108 struct secasvar
*sav
, *nextsav
;
6109 u_int8_t state
= saorder_state_any
[stateidx
];
6111 LIST_FOREACH_MUTABLE(sav
, &sah
->savtree
[state
], chain
,
6113 key_sa_chgstate(sav
, SADB_SASTATE_DEAD
);
6118 sah
->state
= SADB_SASTATE_DEAD
;
6121 if (m
->m_len
< sizeof(struct sadb_msg
) ||
6122 sizeof(struct sadb_msg
) > m
->m_len
+ M_TRAILINGSPACE(m
)) {
6123 ipseclog((LOG_DEBUG
, "key_flush: No more memory.\n"));
6124 return key_senderror(so
, m
, ENOBUFS
);
6130 m
->m_pkthdr
.len
= m
->m_len
= sizeof(struct sadb_msg
);
6131 newmsg
= mtod(m
, struct sadb_msg
*);
6132 newmsg
->sadb_msg_errno
= 0;
6133 newmsg
->sadb_msg_len
= PFKEY_UNIT64(m
->m_pkthdr
.len
);
6135 return key_sendup_mbuf(so
, m
, KEY_SENDUP_ALL
);
6139 * SADB_DUMP processing
6140 * dump all entries including status of DEAD in SAD.
6143 * from the ikmpd, and dump all secasvar leaves
6148 * m will always be freed.
6151 key_dump(struct socket
*so
, struct mbuf
*m
, const struct sadb_msghdr
*mhp
)
6153 struct secashead
*sah
;
6154 struct secasvar
*sav
;
6163 if (so
== NULL
|| m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
)
6164 panic("key_dump: NULL pointer is passed.");
6166 /* map satype to proto */
6167 if ((proto
= key_satype2proto(mhp
->msg
->sadb_msg_satype
)) == 0) {
6168 ipseclog((LOG_DEBUG
, "key_dump: invalid satype is passed.\n"));
6169 return key_senderror(so
, m
, EINVAL
);
6172 /* count sav entries to be sent to the userland. */
6174 LIST_FOREACH(sah
, &sahtree
, chain
) {
6175 if (mhp
->msg
->sadb_msg_satype
!= SADB_SATYPE_UNSPEC
&&
6176 proto
!= sah
->saidx
.proto
)
6179 for (stateidx
= 0; stateidx
< NELEM(saorder_state_any
);
6181 state
= saorder_state_any
[stateidx
];
6182 LIST_FOREACH(sav
, &sah
->savtree
[state
], chain
) {
6189 return key_senderror(so
, m
, ENOENT
);
6191 /* send this to the userland, one at a time. */
6192 LIST_FOREACH(sah
, &sahtree
, chain
) {
6193 if (mhp
->msg
->sadb_msg_satype
!= SADB_SATYPE_UNSPEC
6194 && proto
!= sah
->saidx
.proto
)
6197 /* map proto to satype */
6198 if ((satype
= key_proto2satype(sah
->saidx
.proto
)) == 0) {
6199 ipseclog((LOG_DEBUG
, "key_dump: there was invalid proto in SAD.\n"));
6200 return key_senderror(so
, m
, EINVAL
);
6203 for (stateidx
= 0; stateidx
< NELEM(saorder_state_any
);
6205 state
= saorder_state_any
[stateidx
];
6206 LIST_FOREACH(sav
, &sah
->savtree
[state
], chain
) {
6207 n
= key_setdumpsa(sav
, SADB_DUMP
, satype
,
6208 --cnt
, mhp
->msg
->sadb_msg_pid
);
6210 return key_senderror(so
, m
, ENOBUFS
);
6212 key_sendup_mbuf(so
, n
, KEY_SENDUP_ONE
);
6222 * SADB_X_PROMISC processing
6224 * m will always be freed.
6227 key_promisc(struct socket
*so
, struct mbuf
*m
, const struct sadb_msghdr
*mhp
)
6232 if (so
== NULL
|| m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
)
6233 panic("key_promisc: NULL pointer is passed.");
6235 olen
= PFKEY_UNUNIT64(mhp
->msg
->sadb_msg_len
);
6237 if (olen
< sizeof(struct sadb_msg
)) {
6239 return key_senderror(so
, m
, EINVAL
);
6244 } else if (olen
== sizeof(struct sadb_msg
)) {
6245 /* enable/disable promisc mode */
6248 if ((kp
= (struct keycb
*)sotorawcb(so
)) == NULL
)
6249 return key_senderror(so
, m
, EINVAL
);
6250 mhp
->msg
->sadb_msg_errno
= 0;
6251 switch (mhp
->msg
->sadb_msg_satype
) {
6254 kp
->kp_promisc
= mhp
->msg
->sadb_msg_satype
;
6257 return key_senderror(so
, m
, EINVAL
);
6260 /* send the original message back to everyone */
6261 mhp
->msg
->sadb_msg_errno
= 0;
6262 return key_sendup_mbuf(so
, m
, KEY_SENDUP_ALL
);
6264 /* send packet as is */
6266 m_adj(m
, PFKEY_ALIGN8(sizeof(struct sadb_msg
)));
6268 /* TODO: if sadb_msg_seq is specified, send to specific pid */
6269 return key_sendup_mbuf(so
, m
, KEY_SENDUP_ALL
);
6273 static int (*key_typesw
[]) (struct socket
*, struct mbuf
*,
6274 const struct sadb_msghdr
*) = {
6275 NULL
, /* SADB_RESERVED */
6276 key_getspi
, /* SADB_GETSPI */
6277 key_update
, /* SADB_UPDATE */
6278 key_add
, /* SADB_ADD */
6279 key_delete
, /* SADB_DELETE */
6280 key_get
, /* SADB_GET */
6281 key_acquire2
, /* SADB_ACQUIRE */
6282 key_register
, /* SADB_REGISTER */
6283 NULL
, /* SADB_EXPIRE */
6284 key_flush
, /* SADB_FLUSH */
6285 key_dump
, /* SADB_DUMP */
6286 key_promisc
, /* SADB_X_PROMISC */
6287 NULL
, /* SADB_X_PCHANGE */
6288 key_spdadd
, /* SADB_X_SPDUPDATE */
6289 key_spdadd
, /* SADB_X_SPDADD */
6290 key_spddelete
, /* SADB_X_SPDDELETE */
6291 key_spdget
, /* SADB_X_SPDGET */
6292 NULL
, /* SADB_X_SPDACQUIRE */
6293 key_spddump
, /* SADB_X_SPDDUMP */
6294 key_spdflush
, /* SADB_X_SPDFLUSH */
6295 key_spdadd
, /* SADB_X_SPDSETIDX */
6296 NULL
, /* SADB_X_SPDEXPIRE */
6297 key_spddelete2
, /* SADB_X_SPDDELETE2 */
6301 * parse sadb_msg buffer to process PFKEYv2,
6302 * and create a data to response if needed.
6303 * I think to be dealed with mbuf directly.
6305 * msgp : pointer to pointer to a received buffer pulluped.
6306 * This is rewrited to response.
6307 * so : pointer to socket.
6309 * length for buffer to send to user process.
6312 key_parse(struct mbuf
*m
, struct socket
*so
)
6314 struct sadb_msg
*msg
;
6315 struct sadb_msghdr mh
;
6321 if (m
== NULL
|| so
== NULL
)
6322 panic("key_parse: NULL pointer is passed.");
6324 #if 0 /*kdebug_sadb assumes msg in linear buffer*/
6325 KEYDEBUG(KEYDEBUG_KEY_DUMP
,
6326 ipseclog((LOG_DEBUG
, "key_parse: passed sadb_msg\n"));
6330 if (m
->m_len
< sizeof(struct sadb_msg
)) {
6331 m
= m_pullup(m
, sizeof(struct sadb_msg
));
6335 msg
= mtod(m
, struct sadb_msg
*);
6336 orglen
= PFKEY_UNUNIT64(msg
->sadb_msg_len
);
6337 target
= KEY_SENDUP_ONE
;
6339 if ((m
->m_flags
& M_PKTHDR
) == 0 ||
6340 m
->m_pkthdr
.len
!= m
->m_pkthdr
.len
) {
6341 ipseclog((LOG_DEBUG
, "key_parse: invalid message length.\n"));
6342 pfkeystat
.out_invlen
++;
6347 if (msg
->sadb_msg_version
!= PF_KEY_V2
) {
6348 ipseclog((LOG_DEBUG
,
6349 "key_parse: PF_KEY version %u is mismatched.\n",
6350 msg
->sadb_msg_version
));
6351 pfkeystat
.out_invver
++;
6356 if (msg
->sadb_msg_type
> SADB_MAX
) {
6357 ipseclog((LOG_DEBUG
, "key_parse: invalid type %u is passed.\n",
6358 msg
->sadb_msg_type
));
6359 pfkeystat
.out_invmsgtype
++;
6364 /* for old-fashioned code - should be nuked */
6365 if (m
->m_pkthdr
.len
> MCLBYTES
) {
6372 n
= m_getb(m
->m_pkthdr
.len
, M_NOWAIT
, MT_DATA
, M_PKTHDR
);
6377 m_copydata(m
, 0, m
->m_pkthdr
.len
, mtod(n
, caddr_t
));
6378 n
->m_pkthdr
.len
= n
->m_len
= m
->m_pkthdr
.len
;
6383 /* align the mbuf chain so that extensions are in contiguous region. */
6384 error
= key_align(m
, &mh
);
6391 switch (msg
->sadb_msg_satype
) {
6392 case SADB_SATYPE_UNSPEC
:
6393 switch (msg
->sadb_msg_type
) {
6401 ipseclog((LOG_DEBUG
, "key_parse: must specify satype "
6402 "when msg type=%u.\n", msg
->sadb_msg_type
));
6403 pfkeystat
.out_invsatype
++;
6408 case SADB_SATYPE_AH
:
6409 case SADB_SATYPE_ESP
:
6410 case SADB_X_SATYPE_IPCOMP
:
6411 switch (msg
->sadb_msg_type
) {
6413 case SADB_X_SPDDELETE
:
6415 case SADB_X_SPDDUMP
:
6416 case SADB_X_SPDFLUSH
:
6417 case SADB_X_SPDSETIDX
:
6418 case SADB_X_SPDUPDATE
:
6419 case SADB_X_SPDDELETE2
:
6420 ipseclog((LOG_DEBUG
, "key_parse: illegal satype=%u\n",
6421 msg
->sadb_msg_type
));
6422 pfkeystat
.out_invsatype
++;
6427 case SADB_SATYPE_RSVP
:
6428 case SADB_SATYPE_OSPFV2
:
6429 case SADB_SATYPE_RIPV2
:
6430 case SADB_SATYPE_MIP
:
6431 ipseclog((LOG_DEBUG
, "key_parse: type %u isn't supported.\n",
6432 msg
->sadb_msg_satype
));
6433 pfkeystat
.out_invsatype
++;
6436 case 1: /* XXX: What does it do? */
6437 if (msg
->sadb_msg_type
== SADB_X_PROMISC
)
6441 ipseclog((LOG_DEBUG
, "key_parse: invalid type %u is passed.\n",
6442 msg
->sadb_msg_satype
));
6443 pfkeystat
.out_invsatype
++;
6448 /* check field of upper layer protocol and address family */
6449 if (mh
.ext
[SADB_EXT_ADDRESS_SRC
] != NULL
6450 && mh
.ext
[SADB_EXT_ADDRESS_DST
] != NULL
) {
6451 struct sadb_address
*src0
, *dst0
;
6454 src0
= (struct sadb_address
*)(mh
.ext
[SADB_EXT_ADDRESS_SRC
]);
6455 dst0
= (struct sadb_address
*)(mh
.ext
[SADB_EXT_ADDRESS_DST
]);
6457 /* check upper layer protocol */
6458 if (src0
->sadb_address_proto
!= dst0
->sadb_address_proto
) {
6459 ipseclog((LOG_DEBUG
, "key_parse: upper layer protocol mismatched.\n"));
6460 pfkeystat
.out_invaddr
++;
6466 if (PFKEY_ADDR_SADDR(src0
)->sa_family
!=
6467 PFKEY_ADDR_SADDR(dst0
)->sa_family
) {
6468 ipseclog((LOG_DEBUG
, "key_parse: address family mismatched.\n"));
6469 pfkeystat
.out_invaddr
++;
6473 if (PFKEY_ADDR_SADDR(src0
)->sa_len
!=
6474 PFKEY_ADDR_SADDR(dst0
)->sa_len
) {
6475 ipseclog((LOG_DEBUG
,
6476 "key_parse: address struct size mismatched.\n"));
6477 pfkeystat
.out_invaddr
++;
6482 switch (PFKEY_ADDR_SADDR(src0
)->sa_family
) {
6484 if (PFKEY_ADDR_SADDR(src0
)->sa_len
!=
6485 sizeof(struct sockaddr_in
)) {
6486 pfkeystat
.out_invaddr
++;
6492 if (PFKEY_ADDR_SADDR(src0
)->sa_len
!=
6493 sizeof(struct sockaddr_in6
)) {
6494 pfkeystat
.out_invaddr
++;
6500 ipseclog((LOG_DEBUG
,
6501 "key_parse: unsupported address family.\n"));
6502 pfkeystat
.out_invaddr
++;
6503 error
= EAFNOSUPPORT
;
6507 switch (PFKEY_ADDR_SADDR(src0
)->sa_family
) {
6509 plen
= sizeof(struct in_addr
) << 3;
6512 plen
= sizeof(struct in6_addr
) << 3;
6515 plen
= 0; /*fool gcc*/
6519 /* check max prefix length */
6520 if (src0
->sadb_address_prefixlen
> plen
||
6521 dst0
->sadb_address_prefixlen
> plen
) {
6522 ipseclog((LOG_DEBUG
,
6523 "key_parse: illegal prefixlen.\n"));
6524 pfkeystat
.out_invaddr
++;
6530 * prefixlen == 0 is valid because there can be a case when
6531 * all addresses are matched.
6535 if (msg
->sadb_msg_type
>= NELEM(key_typesw
) ||
6536 key_typesw
[msg
->sadb_msg_type
] == NULL
) {
6537 pfkeystat
.out_invmsgtype
++;
6542 return (*key_typesw
[msg
->sadb_msg_type
])(so
, m
, &mh
);
6545 msg
->sadb_msg_errno
= error
;
6546 return key_sendup_mbuf(so
, m
, target
);
6550 key_senderror(struct socket
*so
, struct mbuf
*m
, int code
)
6552 struct sadb_msg
*msg
;
6554 if (m
->m_len
< sizeof(struct sadb_msg
))
6555 panic("invalid mbuf passed to key_senderror");
6557 msg
= mtod(m
, struct sadb_msg
*);
6558 msg
->sadb_msg_errno
= code
;
6559 return key_sendup_mbuf(so
, m
, KEY_SENDUP_ONE
);
6563 * set the pointer to each header into message buffer.
6564 * m will be freed on error.
6565 * XXX larger-than-MCLBYTES extension?
6568 key_align(struct mbuf
*m
, struct sadb_msghdr
*mhp
)
6571 struct sadb_ext
*ext
;
6577 if (m
== NULL
|| mhp
== NULL
)
6578 panic("key_align: NULL pointer is passed.");
6579 if (m
->m_len
< sizeof(struct sadb_msg
))
6580 panic("invalid mbuf passed to key_align");
6583 bzero(mhp
, sizeof(*mhp
));
6585 mhp
->msg
= mtod(m
, struct sadb_msg
*);
6586 mhp
->ext
[0] = (struct sadb_ext
*)mhp
->msg
; /*XXX backward compat */
6588 end
= PFKEY_UNUNIT64(mhp
->msg
->sadb_msg_len
);
6589 extlen
= end
; /*just in case extlen is not updated*/
6590 for (off
= sizeof(struct sadb_msg
); off
< end
; off
+= extlen
) {
6591 n
= m_pulldown(m
, off
, sizeof(struct sadb_ext
), &toff
);
6593 /* m is already freed */
6596 ext
= (struct sadb_ext
*)(mtod(n
, caddr_t
) + toff
);
6599 switch (ext
->sadb_ext_type
) {
6601 case SADB_EXT_ADDRESS_SRC
:
6602 case SADB_EXT_ADDRESS_DST
:
6603 case SADB_EXT_ADDRESS_PROXY
:
6604 case SADB_EXT_LIFETIME_CURRENT
:
6605 case SADB_EXT_LIFETIME_HARD
:
6606 case SADB_EXT_LIFETIME_SOFT
:
6607 case SADB_EXT_KEY_AUTH
:
6608 case SADB_EXT_KEY_ENCRYPT
:
6609 case SADB_EXT_IDENTITY_SRC
:
6610 case SADB_EXT_IDENTITY_DST
:
6611 case SADB_EXT_SENSITIVITY
:
6612 case SADB_EXT_PROPOSAL
:
6613 case SADB_EXT_SUPPORTED_AUTH
:
6614 case SADB_EXT_SUPPORTED_ENCRYPT
:
6615 case SADB_EXT_SPIRANGE
:
6616 case SADB_X_EXT_POLICY
:
6617 case SADB_X_EXT_SA2
:
6618 /* duplicate check */
6620 * XXX Are there duplication payloads of either
6621 * KEY_AUTH or KEY_ENCRYPT ?
6623 if (mhp
->ext
[ext
->sadb_ext_type
] != NULL
) {
6624 ipseclog((LOG_DEBUG
,
6625 "key_align: duplicate ext_type %u "
6626 "is passed.\n", ext
->sadb_ext_type
));
6628 pfkeystat
.out_dupext
++;
6633 ipseclog((LOG_DEBUG
,
6634 "key_align: invalid ext_type %u is passed.\n",
6635 ext
->sadb_ext_type
));
6637 pfkeystat
.out_invexttype
++;
6641 extlen
= PFKEY_UNUNIT64(ext
->sadb_ext_len
);
6643 if (key_validate_ext(ext
, extlen
)) {
6645 pfkeystat
.out_invlen
++;
6649 n
= m_pulldown(m
, off
, extlen
, &toff
);
6651 /* m is already freed */
6654 ext
= (struct sadb_ext
*)(mtod(n
, caddr_t
) + toff
);
6656 mhp
->ext
[ext
->sadb_ext_type
] = ext
;
6657 mhp
->extoff
[ext
->sadb_ext_type
] = off
;
6658 mhp
->extlen
[ext
->sadb_ext_type
] = extlen
;
6663 pfkeystat
.out_invlen
++;
6671 key_validate_ext(const struct sadb_ext
*ext
, int len
)
6673 const struct sockaddr
*sa
;
6674 enum { NONE
, ADDR
} checktype
= NONE
;
6676 const int sal
= offsetof(struct sockaddr
, sa_len
) + sizeof(sa
->sa_len
);
6678 if (len
!= PFKEY_UNUNIT64(ext
->sadb_ext_len
))
6681 /* if it does not match minimum/maximum length, bail */
6682 if (ext
->sadb_ext_type
>= NELEM(minsize
) ||
6683 ext
->sadb_ext_type
>= NELEM(maxsize
))
6685 if (!minsize
[ext
->sadb_ext_type
] || len
< minsize
[ext
->sadb_ext_type
])
6687 if (maxsize
[ext
->sadb_ext_type
] && len
> maxsize
[ext
->sadb_ext_type
])
6690 /* more checks based on sadb_ext_type XXX need more */
6691 switch (ext
->sadb_ext_type
) {
6692 case SADB_EXT_ADDRESS_SRC
:
6693 case SADB_EXT_ADDRESS_DST
:
6694 case SADB_EXT_ADDRESS_PROXY
:
6695 baselen
= PFKEY_ALIGN8(sizeof(struct sadb_address
));
6698 case SADB_EXT_IDENTITY_SRC
:
6699 case SADB_EXT_IDENTITY_DST
:
6700 if (((const struct sadb_ident
*)ext
)->sadb_ident_type
==
6701 SADB_X_IDENTTYPE_ADDR
) {
6702 baselen
= PFKEY_ALIGN8(sizeof(struct sadb_ident
));
6712 switch (checktype
) {
6716 sa
= (const struct sockaddr
*)(((const u_int8_t
*)ext
)+baselen
);
6717 if (len
< baselen
+ sal
)
6719 if (baselen
+ PFKEY_ALIGN8(sa
->sa_len
) != len
)
6732 for (i
= 0; i
< IPSEC_DIR_MAX
; i
++) {
6733 LIST_INIT(&sptree
[i
]);
6736 LIST_INIT(&sahtree
);
6738 for (i
= 0; i
<= SADB_SATYPE_MAX
; i
++) {
6739 LIST_INIT(®tree
[i
]);
6742 #ifndef IPSEC_NONBLOCK_ACQUIRE
6743 LIST_INIT(&acqtree
);
6745 LIST_INIT(&spacqtree
);
6747 /* system default */
6748 ip4_def_policy
.policy
= IPSEC_POLICY_NONE
;
6749 ip4_def_policy
.refcnt
++; /*never reclaim this*/
6751 #ifndef IPSEC_DEBUG2
6752 callout_init(&key_timehandler_ch
);
6753 callout_reset(&key_timehandler_ch
, hz
, key_timehandler
, NULL
);
6754 #endif /*IPSEC_DEBUG2*/
6756 /* initialize key statistics */
6757 keystat
.getspi_count
= 1;
6759 kprintf("IPsec: Initialized Security Association Processing.\n");
6765 * XXX: maybe This function is called after INBOUND IPsec processing.
6767 * Special check for tunnel-mode packets.
6768 * We must make some checks for consistency between inner and outer IP header.
6770 * xxx more checks to be provided
6773 key_checktunnelsanity(struct secasvar
*sav
, u_int family
, caddr_t src
,
6777 if (sav
->sah
== NULL
)
6778 panic("sav->sah == NULL at key_checktunnelsanity");
6780 /* XXX: check inner IP header */
6786 #define hostnamelen strlen(hostname)
6789 * Get FQDN for the host.
6790 * If the administrator configured hostname (by hostname(1)) without
6791 * domain name, returns nothing.
6798 static char fqdn
[MAXHOSTNAMELEN
+ 1];
6803 /* check if it comes with domain name. */
6805 for (i
= 0; i
< hostnamelen
; i
++) {
6806 if (hostname
[i
] == '.')
6812 /* NOTE: hostname may not be NUL-terminated. */
6813 bzero(fqdn
, sizeof(fqdn
));
6814 bcopy(hostname
, fqdn
, hostnamelen
);
6815 fqdn
[hostnamelen
] = '\0';
6820 * get username@FQDN for the host/user.
6823 key_getuserfqdn(void)
6826 static char userfqdn
[MAXHOSTNAMELEN
+ MAXLOGNAME
+ 2];
6827 struct proc
*p
= curproc
;
6830 if (!p
|| !p
->p_pgrp
|| !p
->p_pgrp
->pg_session
)
6832 if (!(host
= key_getfqdn()))
6835 /* NOTE: s_login may not be-NUL terminated. */
6836 bzero(userfqdn
, sizeof(userfqdn
));
6837 bcopy(p
->p_pgrp
->pg_session
->s_login
, userfqdn
, MAXLOGNAME
);
6838 userfqdn
[MAXLOGNAME
] = '\0'; /* safeguard */
6839 q
= userfqdn
+ strlen(userfqdn
);
6841 bcopy(host
, q
, strlen(host
));
6849 /* record data transfer on SA, and update timestamps */
6851 key_sa_recordxfer(struct secasvar
*sav
, struct mbuf
*m
)
6853 KASSERT(sav
!= NULL
, ("key_sa_recordxfer: Null secasvar"));
6854 KASSERT(m
!= NULL
, ("key_sa_recordxfer: Null mbuf"));
6859 * XXX Currently, there is a difference of bytes size
6860 * between inbound and outbound processing.
6862 sav
->lft_c
->sadb_lifetime_bytes
+= m
->m_pkthdr
.len
;
6863 /* to check bytes lifetime is done in key_timehandler(). */
6866 * We use the number of packets as the unit of
6867 * sadb_lifetime_allocations. We increment the variable
6868 * whenever {esp,ah}_{in,out}put is called.
6870 sav
->lft_c
->sadb_lifetime_allocations
++;
6871 /* XXX check for expires? */
6874 * NOTE: We record CURRENT sadb_lifetime_usetime by using wall clock,
6875 * in seconds. HARD and SOFT lifetime are measured by the time
6876 * difference (again in seconds) from sadb_lifetime_usetime.
6880 * -----+-----+--------+---> t
6881 * <--------------> HARD
6884 sav
->lft_c
->sadb_lifetime_usetime
= time_second
;
6885 /* XXX check for expires? */
6892 key_sa_routechange(struct sockaddr
*dst
)
6894 struct secashead
*sah
;
6897 LIST_FOREACH(sah
, &sahtree
, chain
) {
6898 ro
= &sah
->sa_route
;
6899 if (ro
->ro_rt
&& dst
->sa_len
== ro
->ro_dst
.sa_len
6900 && bcmp(dst
, &ro
->ro_dst
, dst
->sa_len
) == 0) {
6910 key_sa_chgstate(struct secasvar
*sav
, u_int8_t state
)
6913 panic("key_sa_chgstate called with sav == NULL");
6915 if (sav
->state
== state
)
6918 if (__LIST_CHAINED(sav
))
6919 LIST_REMOVE(sav
, chain
);
6922 LIST_INSERT_HEAD(&sav
->sah
->savtree
[state
], sav
, chain
);
6926 key_sa_stir_iv(struct secasvar
*sav
)
6930 panic("key_sa_stir_iv called with sav == NULL");
6931 key_randomfill(sav
->iv
, sav
->ivlen
);
6935 static struct mbuf
*
6936 key_alloc_mbuf(int l
)
6938 struct mbuf
*m
= NULL
, *n
;
6943 n
= m_getb(len
, M_NOWAIT
, MT_DATA
, 0);
6949 n
->m_len
= M_TRAILINGSPACE(n
);
6950 /* use the bottom of mbuf, hoping we can prepend afterwards */
6951 if (n
->m_len
> len
) {
6952 t
= (n
->m_len
- len
) & ~(sizeof(long) - 1);