1 /* $FreeBSD: src/sys/netkey/key.c,v 1.16.2.13 2002/07/24 18:17:40 ume 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
37 #include <sys/types.h>
38 #include <sys/param.h>
39 #include <sys/systm.h>
40 #include <sys/kernel.h>
42 #include <sys/domain.h>
43 #include <sys/protosw.h>
44 #include <sys/malloc.h>
45 #include <sys/socket.h>
46 #include <sys/socketvar.h>
47 #include <sys/sysctl.h>
48 #include <sys/errno.h>
50 #include <sys/queue.h>
51 #include <sys/syslog.h>
54 #include <net/route.h>
55 #include <net/raw_cb.h>
57 #include <netinet/in.h>
58 #include <netinet/in_systm.h>
59 #include <netinet/ip.h>
60 #include <netinet/in_var.h>
63 #include <netinet/ip6.h>
64 #include <netinet6/in6_var.h>
65 #include <netinet6/ip6_var.h>
69 #include <netinet/in_pcb.h>
72 #include <netinet6/in6_pcb.h>
75 #include <net/pfkeyv2.h>
76 #include <netkey/keydb.h>
77 #include <netkey/key.h>
78 #include <netkey/keysock.h>
79 #include <netkey/key_debug.h>
83 #include <netinet6/ipsec.h>
85 #include <netinet6/ipsec6.h>
87 #include <netinet6/ah.h>
89 #include <netinet6/ah6.h>
92 #include <netinet6/esp.h>
94 #include <netinet6/esp6.h>
97 #include <netinet6/ipcomp.h>
99 #include <netinet6/ipcomp6.h>
104 #include <sys/random.h>
106 #include <net/net_osdep.h>
109 #define satosin(s) ((struct sockaddr_in *)s)
112 #define FULLMASK 0xff
115 * Note on SA reference counting:
116 * - SAs that are not in DEAD state will have (total external reference + 1)
117 * following value in reference count field. they cannot be freed and are
118 * referenced from SA header.
119 * - SAs that are in DEAD state will have (total external reference)
120 * in reference count field. they are ready to be freed. reference from
121 * SA header will be removed in key_delsav(), when the reference count
122 * field hits 0 (= no external reference other than from SA header.
125 u_int32_t key_debug_level
= 0; //### our sysctl is not dynamic
126 static u_int key_spi_trycnt
= 1000;
127 static u_int32_t key_spi_minval
= 0x100;
128 static u_int32_t key_spi_maxval
= 0x0fffffff; /* XXX */
129 static u_int32_t policy_id
= 0;
130 static u_int key_int_random
= 60; /*interval to initialize randseed,1(m)*/
131 static u_int key_larval_lifetime
= 30; /* interval to expire acquiring, 30(s)*/
132 static int key_blockacq_count
= 10; /* counter for blocking SADB_ACQUIRE.*/
133 static int key_blockacq_lifetime
= 20; /* lifetime for blocking SADB_ACQUIRE.*/
134 static int key_preferred_oldsa
= 0; /* preferred old sa rather than new sa.*/
135 static int natt_keepalive_interval
= 29; /* interval between natt keepalives.*/
137 static u_int32_t acq_seq
= 0;
138 static int key_tick_init_random
= 0;
139 __private_extern__ u_int32_t natt_now
= 0;
141 static LIST_HEAD(_sptree
, secpolicy
) sptree
[IPSEC_DIR_MAX
]; /* SPD */
142 static LIST_HEAD(_sahtree
, secashead
) sahtree
; /* SAD */
143 static LIST_HEAD(_regtree
, secreg
) regtree
[SADB_SATYPE_MAX
+ 1];
145 #ifndef IPSEC_NONBLOCK_ACQUIRE
146 static LIST_HEAD(_acqtree
, secacq
) acqtree
; /* acquiring list */
148 static LIST_HEAD(_spacqtree
, secspacq
) spacqtree
; /* SP acquiring list */
150 struct key_cb key_cb
;
152 /* search order for SAs */
153 static const u_int saorder_state_valid_prefer_old
[] = {
154 SADB_SASTATE_DYING
, SADB_SASTATE_MATURE
,
156 static const u_int saorder_state_valid_prefer_new
[] = {
157 SADB_SASTATE_MATURE
, SADB_SASTATE_DYING
,
159 static const u_int saorder_state_alive
[] = {
161 SADB_SASTATE_MATURE
, SADB_SASTATE_DYING
, SADB_SASTATE_LARVAL
163 static const u_int saorder_state_any
[] = {
164 SADB_SASTATE_MATURE
, SADB_SASTATE_DYING
,
165 SADB_SASTATE_LARVAL
, SADB_SASTATE_DEAD
168 static const int minsize
[] = {
169 sizeof(struct sadb_msg
), /* SADB_EXT_RESERVED */
170 sizeof(struct sadb_sa
), /* SADB_EXT_SA */
171 sizeof(struct sadb_lifetime
), /* SADB_EXT_LIFETIME_CURRENT */
172 sizeof(struct sadb_lifetime
), /* SADB_EXT_LIFETIME_HARD */
173 sizeof(struct sadb_lifetime
), /* SADB_EXT_LIFETIME_SOFT */
174 sizeof(struct sadb_address
), /* SADB_EXT_ADDRESS_SRC */
175 sizeof(struct sadb_address
), /* SADB_EXT_ADDRESS_DST */
176 sizeof(struct sadb_address
), /* SADB_EXT_ADDRESS_PROXY */
177 sizeof(struct sadb_key
), /* SADB_EXT_KEY_AUTH */
178 sizeof(struct sadb_key
), /* SADB_EXT_KEY_ENCRYPT */
179 sizeof(struct sadb_ident
), /* SADB_EXT_IDENTITY_SRC */
180 sizeof(struct sadb_ident
), /* SADB_EXT_IDENTITY_DST */
181 sizeof(struct sadb_sens
), /* SADB_EXT_SENSITIVITY */
182 sizeof(struct sadb_prop
), /* SADB_EXT_PROPOSAL */
183 sizeof(struct sadb_supported
), /* SADB_EXT_SUPPORTED_AUTH */
184 sizeof(struct sadb_supported
), /* SADB_EXT_SUPPORTED_ENCRYPT */
185 sizeof(struct sadb_spirange
), /* SADB_EXT_SPIRANGE */
186 0, /* SADB_X_EXT_KMPRIVATE */
187 sizeof(struct sadb_x_policy
), /* SADB_X_EXT_POLICY */
188 sizeof(struct sadb_x_sa2
), /* SADB_X_SA2 */
190 static const int maxsize
[] = {
191 sizeof(struct sadb_msg
), /* SADB_EXT_RESERVED */
192 sizeof(struct sadb_sa_2
), /* SADB_EXT_SA */
193 sizeof(struct sadb_lifetime
), /* SADB_EXT_LIFETIME_CURRENT */
194 sizeof(struct sadb_lifetime
), /* SADB_EXT_LIFETIME_HARD */
195 sizeof(struct sadb_lifetime
), /* SADB_EXT_LIFETIME_SOFT */
196 0, /* SADB_EXT_ADDRESS_SRC */
197 0, /* SADB_EXT_ADDRESS_DST */
198 0, /* SADB_EXT_ADDRESS_PROXY */
199 0, /* SADB_EXT_KEY_AUTH */
200 0, /* SADB_EXT_KEY_ENCRYPT */
201 0, /* SADB_EXT_IDENTITY_SRC */
202 0, /* SADB_EXT_IDENTITY_DST */
203 0, /* SADB_EXT_SENSITIVITY */
204 0, /* SADB_EXT_PROPOSAL */
205 0, /* SADB_EXT_SUPPORTED_AUTH */
206 0, /* SADB_EXT_SUPPORTED_ENCRYPT */
207 sizeof(struct sadb_spirange
), /* SADB_EXT_SPIRANGE */
208 0, /* SADB_X_EXT_KMPRIVATE */
209 0, /* SADB_X_EXT_POLICY */
210 sizeof(struct sadb_x_sa2
), /* SADB_X_SA2 */
213 static int ipsec_esp_keymin
= 256;
214 static int ipsec_esp_auth
= 0;
215 static int ipsec_ah_keymin
= 128;
217 SYSCTL_DECL(_net_key
);
219 SYSCTL_INT(_net_key
, KEYCTL_DEBUG_LEVEL
, debug
, CTLFLAG_RW
, \
220 &key_debug_level
, 0, "");
223 /* max count of trial for the decision of spi value */
224 SYSCTL_INT(_net_key
, KEYCTL_SPI_TRY
, spi_trycnt
, CTLFLAG_RW
, \
225 &key_spi_trycnt
, 0, "");
227 /* minimum spi value to allocate automatically. */
228 SYSCTL_INT(_net_key
, KEYCTL_SPI_MIN_VALUE
, spi_minval
, CTLFLAG_RW
, \
229 &key_spi_minval
, 0, "");
231 /* maximun spi value to allocate automatically. */
232 SYSCTL_INT(_net_key
, KEYCTL_SPI_MAX_VALUE
, spi_maxval
, CTLFLAG_RW
, \
233 &key_spi_maxval
, 0, "");
235 /* interval to initialize randseed */
236 SYSCTL_INT(_net_key
, KEYCTL_RANDOM_INT
, int_random
, CTLFLAG_RW
, \
237 &key_int_random
, 0, "");
239 /* lifetime for larval SA */
240 SYSCTL_INT(_net_key
, KEYCTL_LARVAL_LIFETIME
, larval_lifetime
, CTLFLAG_RW
, \
241 &key_larval_lifetime
, 0, "");
243 /* counter for blocking to send SADB_ACQUIRE to IKEd */
244 SYSCTL_INT(_net_key
, KEYCTL_BLOCKACQ_COUNT
, blockacq_count
, CTLFLAG_RW
, \
245 &key_blockacq_count
, 0, "");
247 /* lifetime for blocking to send SADB_ACQUIRE to IKEd */
248 SYSCTL_INT(_net_key
, KEYCTL_BLOCKACQ_LIFETIME
, blockacq_lifetime
, CTLFLAG_RW
, \
249 &key_blockacq_lifetime
, 0, "");
252 SYSCTL_INT(_net_key
, KEYCTL_ESP_AUTH
, esp_auth
, CTLFLAG_RW
, \
253 &ipsec_esp_auth
, 0, "");
255 /* minimum ESP key length */
256 SYSCTL_INT(_net_key
, KEYCTL_ESP_KEYMIN
, esp_keymin
, CTLFLAG_RW
, \
257 &ipsec_esp_keymin
, 0, "");
259 /* minimum AH key length */
260 SYSCTL_INT(_net_key
, KEYCTL_AH_KEYMIN
, ah_keymin
, CTLFLAG_RW
, \
261 &ipsec_ah_keymin
, 0, "");
263 /* perfered old SA rather than new SA */
264 SYSCTL_INT(_net_key
, KEYCTL_PREFERED_OLDSA
, prefered_oldsa
, CTLFLAG_RW
,\
265 &key_preferred_oldsa
, 0, "");
267 /* time between NATT keepalives in seconds, 0 disabled */
268 SYSCTL_INT(_net_key
, KEYCTL_NATT_KEEPALIVE_INTERVAL
, natt_keepalive_interval
, CTLFLAG_RW
,\
269 &natt_keepalive_interval
, 0, "");
272 #define LIST_FOREACH(elm, head, field) \
273 for (elm = LIST_FIRST(head); elm; elm = LIST_NEXT(elm, field))
275 #define __LIST_CHAINED(elm) \
276 (!((elm)->chain.le_next == NULL && (elm)->chain.le_prev == NULL))
277 #define LIST_INSERT_TAIL(head, elm, type, field) \
279 struct type *curelm = LIST_FIRST(head); \
280 if (curelm == NULL) {\
281 LIST_INSERT_HEAD(head, elm, field); \
283 while (LIST_NEXT(curelm, field)) \
284 curelm = LIST_NEXT(curelm, field);\
285 LIST_INSERT_AFTER(curelm, elm, field);\
289 #define KEY_CHKSASTATE(head, sav, name) \
291 if ((head) != (sav)) { \
292 ipseclog((LOG_DEBUG, "%s: state mismatched (TREE=%d SA=%d)\n", \
293 (name), (head), (sav))); \
298 #define KEY_CHKSPDIR(head, sp, name) \
300 if ((head) != (sp)) { \
301 ipseclog((LOG_DEBUG, "%s: direction mismatched (TREE=%d SP=%d), " \
302 "anyway continue.\n", \
303 (name), (head), (sp))); \
308 #define KMALLOC(p, t, n) \
309 ((p) = (t) _MALLOC((unsigned long)(n), M_SECA, M_NOWAIT))
311 _FREE((caddr_t)(p), M_SECA);
313 #define KMALLOC(p, t, n) \
315 ((p) = (t)_MALLOC((unsigned long)(n), M_SECA, M_NOWAIT)); \
316 printf("%s %d: %p <- KMALLOC(%s, %d)\n", \
317 __FILE__, __LINE__, (p), #t, n); \
322 printf("%s %d: %p -> KFREE()\n", __FILE__, __LINE__, (p)); \
323 _FREE((caddr_t)(p), M_SECA); \
328 * set parameters into secpolicyindex buffer.
329 * Must allocate secpolicyindex buffer passed to this function.
331 #define KEY_SETSECSPIDX(_dir, s, d, ps, pd, ulp, idx) \
333 bzero((idx), sizeof(struct secpolicyindex)); \
334 (idx)->dir = (_dir); \
335 (idx)->prefs = (ps); \
336 (idx)->prefd = (pd); \
337 (idx)->ul_proto = (ulp); \
338 bcopy((s), &(idx)->src, ((struct sockaddr *)(s))->sa_len); \
339 bcopy((d), &(idx)->dst, ((struct sockaddr *)(d))->sa_len); \
343 * set parameters into secasindex buffer.
344 * Must allocate secasindex buffer before calling this function.
346 #define KEY_SETSECASIDX(p, m, r, s, d, idx) \
348 bzero((idx), sizeof(struct secasindex)); \
349 (idx)->proto = (p); \
351 (idx)->reqid = (r); \
352 bcopy((s), &(idx)->src, ((struct sockaddr *)(s))->sa_len); \
353 bcopy((d), &(idx)->dst, ((struct sockaddr *)(d))->sa_len); \
358 u_long getspi_count
; /* the avarage of count to try to get new SPI */
362 struct sadb_msg
*msg
;
363 struct sadb_ext
*ext
[SADB_EXT_MAX
+ 1];
364 int extoff
[SADB_EXT_MAX
+ 1];
365 int extlen
[SADB_EXT_MAX
+ 1];
368 static struct secasvar
*key_allocsa_policy
__P((struct secasindex
*));
369 static void key_freesp_so
__P((struct secpolicy
**));
370 static struct secasvar
*key_do_allocsa_policy
__P((struct secashead
*, u_int
));
371 static void key_delsp
__P((struct secpolicy
*));
372 static struct secpolicy
*key_getsp
__P((struct secpolicyindex
*));
373 static struct secpolicy
*key_getspbyid
__P((u_int32_t
));
374 static u_int32_t key_newreqid
__P((void));
375 static struct mbuf
*key_gather_mbuf
__P((struct mbuf
*,
376 const struct sadb_msghdr
*, int, int, int *));
377 static int key_spdadd
__P((struct socket
*, struct mbuf
*,
378 const struct sadb_msghdr
*));
379 static u_int32_t key_getnewspid
__P((void));
380 static int key_spddelete
__P((struct socket
*, struct mbuf
*,
381 const struct sadb_msghdr
*));
382 static int key_spddelete2
__P((struct socket
*, struct mbuf
*,
383 const struct sadb_msghdr
*));
384 static int key_spdget
__P((struct socket
*, struct mbuf
*,
385 const struct sadb_msghdr
*));
386 static int key_spdflush
__P((struct socket
*, struct mbuf
*,
387 const struct sadb_msghdr
*));
388 static int key_spddump
__P((struct socket
*, struct mbuf
*,
389 const struct sadb_msghdr
*));
390 static struct mbuf
*key_setdumpsp
__P((struct secpolicy
*,
391 u_int8_t
, u_int32_t
, u_int32_t
));
392 static u_int key_getspreqmsglen
__P((struct secpolicy
*));
393 static int key_spdexpire
__P((struct secpolicy
*));
394 static struct secashead
*key_newsah
__P((struct secasindex
*));
395 static void key_delsah
__P((struct secashead
*));
396 static struct secasvar
*key_newsav
__P((struct mbuf
*,
397 const struct sadb_msghdr
*, struct secashead
*, int *));
398 static void key_delsav
__P((struct secasvar
*));
399 static struct secashead
*key_getsah
__P((struct secasindex
*));
400 static struct secasvar
*key_checkspidup
__P((struct secasindex
*, u_int32_t
));
401 static struct secasvar
*key_getsavbyspi
__P((struct secashead
*, u_int32_t
));
402 static int key_setsaval
__P((struct secasvar
*, struct mbuf
*,
403 const struct sadb_msghdr
*));
404 static int key_mature
__P((struct secasvar
*));
405 static struct mbuf
*key_setdumpsa
__P((struct secasvar
*, u_int8_t
,
406 u_int8_t
, u_int32_t
, u_int32_t
));
407 static struct mbuf
*key_setsadbmsg
__P((u_int8_t
, u_int16_t
, u_int8_t
,
408 u_int32_t
, pid_t
, u_int16_t
));
409 static struct mbuf
*key_setsadbsa
__P((struct secasvar
*));
410 static struct mbuf
*key_setsadbaddr
__P((u_int16_t
,
411 struct sockaddr
*, u_int8_t
, u_int16_t
));
413 static struct mbuf
*key_setsadbident
__P((u_int16_t
, u_int16_t
, caddr_t
,
416 static struct mbuf
*key_setsadbxsa2
__P((u_int8_t
, u_int32_t
, u_int32_t
));
417 static struct mbuf
*key_setsadbxpolicy
__P((u_int16_t
, u_int8_t
,
419 static void *key_newbuf
__P((const void *, u_int
));
421 static int key_ismyaddr6
__P((struct sockaddr_in6
*));
424 /* flags for key_cmpsaidx() */
425 #define CMP_HEAD 1 /* protocol, addresses. */
426 #define CMP_MODE_REQID 2 /* additionally HEAD, reqid, mode. */
427 #define CMP_REQID 3 /* additionally HEAD, reaid. */
428 #define CMP_EXACTLY 4 /* all elements. */
429 static int key_cmpsaidx
430 __P((struct secasindex
*, struct secasindex
*, int));
432 static int key_cmpspidx_exactly
433 __P((struct secpolicyindex
*, struct secpolicyindex
*));
434 static int key_cmpspidx_withmask
435 __P((struct secpolicyindex
*, struct secpolicyindex
*));
436 static int key_sockaddrcmp
__P((struct sockaddr
*, struct sockaddr
*, int));
437 static int key_bbcmp
__P((caddr_t
, caddr_t
, u_int
));
438 static void key_srandom
__P((void));
439 static u_int16_t key_satype2proto
__P((u_int8_t
));
440 static u_int8_t key_proto2satype
__P((u_int16_t
));
442 static int key_getspi
__P((struct socket
*, struct mbuf
*,
443 const struct sadb_msghdr
*));
444 static u_int32_t key_do_getnewspi
__P((struct sadb_spirange
*,
445 struct secasindex
*));
446 static int key_update
__P((struct socket
*, struct mbuf
*,
447 const struct sadb_msghdr
*));
449 static struct secasvar
*key_getsavbyseq
__P((struct secashead
*, u_int32_t
));
451 static int key_add
__P((struct socket
*, struct mbuf
*,
452 const struct sadb_msghdr
*));
453 static int key_setident
__P((struct secashead
*, struct mbuf
*,
454 const struct sadb_msghdr
*));
455 static struct mbuf
*key_getmsgbuf_x1
__P((struct mbuf
*,
456 const struct sadb_msghdr
*));
457 static int key_delete
__P((struct socket
*, struct mbuf
*,
458 const struct sadb_msghdr
*));
459 static int key_get
__P((struct socket
*, struct mbuf
*,
460 const struct sadb_msghdr
*));
462 static void key_getcomb_setlifetime
__P((struct sadb_comb
*));
464 static struct mbuf
*key_getcomb_esp
__P((void));
466 static struct mbuf
*key_getcomb_ah
__P((void));
467 static struct mbuf
*key_getcomb_ipcomp
__P((void));
468 static struct mbuf
*key_getprop
__P((const struct secasindex
*));
470 static int key_acquire
__P((struct secasindex
*, struct secpolicy
*));
471 #ifndef IPSEC_NONBLOCK_ACQUIRE
472 static struct secacq
*key_newacq
__P((struct secasindex
*));
473 static struct secacq
*key_getacq
__P((struct secasindex
*));
474 static struct secacq
*key_getacqbyseq
__P((u_int32_t
));
476 static struct secspacq
*key_newspacq
__P((struct secpolicyindex
*));
477 static struct secspacq
*key_getspacq
__P((struct secpolicyindex
*));
478 static int key_acquire2
__P((struct socket
*, struct mbuf
*,
479 const struct sadb_msghdr
*));
480 static int key_register
__P((struct socket
*, struct mbuf
*,
481 const struct sadb_msghdr
*));
482 static int key_expire
__P((struct secasvar
*));
483 static int key_flush
__P((struct socket
*, struct mbuf
*,
484 const struct sadb_msghdr
*));
485 static int key_dump
__P((struct socket
*, struct mbuf
*,
486 const struct sadb_msghdr
*));
487 static int key_promisc
__P((struct socket
*, struct mbuf
*,
488 const struct sadb_msghdr
*));
489 static int key_senderror
__P((struct socket
*, struct mbuf
*, int));
490 static int key_validate_ext
__P((const struct sadb_ext
*, int));
491 static int key_align
__P((struct mbuf
*, struct sadb_msghdr
*));
493 static const char *key_getfqdn
__P((void));
494 static const char *key_getuserfqdn
__P((void));
496 static void key_sa_chgstate
__P((struct secasvar
*, u_int8_t
));
497 static struct mbuf
*key_alloc_mbuf
__P((int));
499 extern int ipsec_bypass
;
500 void ipsec_send_natt_keepalive(struct secasvar
*sav
);
502 /* %%% IPsec policy management */
504 * allocating a SP for OUTBOUND or INBOUND packet.
505 * Must call key_freesp() later.
506 * OUT: NULL: not found
507 * others: found and return the pointer.
510 key_allocsp(spidx
, dir
)
511 struct secpolicyindex
*spidx
;
514 struct secpolicy
*sp
;
520 panic("key_allocsp: NULL pointer is passed.\n");
522 /* check direction */
524 case IPSEC_DIR_INBOUND
:
525 case IPSEC_DIR_OUTBOUND
:
528 panic("key_allocsp: Invalid direction is passed.\n");
532 s
= splnet(); /*called from softclock()*/
533 KEYDEBUG(KEYDEBUG_IPSEC_DATA
,
534 printf("*** objects\n");
535 kdebug_secpolicyindex(spidx
));
537 LIST_FOREACH(sp
, &sptree
[dir
], chain
) {
538 KEYDEBUG(KEYDEBUG_IPSEC_DATA
,
539 printf("*** in SPD\n");
540 kdebug_secpolicyindex(&sp
->spidx
));
542 if (sp
->state
== IPSEC_SPSTATE_DEAD
)
544 if (key_cmpspidx_withmask(&sp
->spidx
, spidx
))
553 KEY_CHKSPDIR(sp
->spidx
.dir
, dir
, "key_allocsp");
555 /* found a SPD entry */
557 sp
->lastused
= tv
.tv_sec
;
560 KEYDEBUG(KEYDEBUG_IPSEC_STAMP
,
561 printf("DP key_allocsp cause refcnt++:%d SP:%p\n",
568 * return a policy that matches this particular inbound packet.
572 key_gettunnel(osrc
, odst
, isrc
, idst
)
573 struct sockaddr
*osrc
, *odst
, *isrc
, *idst
;
575 struct secpolicy
*sp
;
576 const int dir
= IPSEC_DIR_INBOUND
;
579 struct ipsecrequest
*r1
, *r2
, *p
;
580 struct sockaddr
*os
, *od
, *is
, *id
;
581 struct secpolicyindex spidx
;
583 if (isrc
->sa_family
!= idst
->sa_family
) {
584 ipseclog((LOG_ERR
, "protocol family mismatched %d != %d\n.",
585 isrc
->sa_family
, idst
->sa_family
));
589 s
= splnet(); /*called from softclock()*/
590 LIST_FOREACH(sp
, &sptree
[dir
], chain
) {
591 if (sp
->state
== IPSEC_SPSTATE_DEAD
)
595 for (p
= sp
->req
; p
; p
= p
->next
) {
596 if (p
->saidx
.mode
!= IPSEC_MODE_TUNNEL
)
603 /* here we look at address matches only */
605 if (isrc
->sa_len
> sizeof(spidx
.src
) ||
606 idst
->sa_len
> sizeof(spidx
.dst
))
608 bcopy(isrc
, &spidx
.src
, isrc
->sa_len
);
609 bcopy(idst
, &spidx
.dst
, idst
->sa_len
);
610 if (!key_cmpspidx_withmask(&sp
->spidx
, &spidx
))
613 is
= (struct sockaddr
*)&r1
->saidx
.src
;
614 id
= (struct sockaddr
*)&r1
->saidx
.dst
;
615 if (key_sockaddrcmp(is
, isrc
, 0) ||
616 key_sockaddrcmp(id
, idst
, 0))
620 os
= (struct sockaddr
*)&r2
->saidx
.src
;
621 od
= (struct sockaddr
*)&r2
->saidx
.dst
;
622 if (key_sockaddrcmp(os
, osrc
, 0) ||
623 key_sockaddrcmp(od
, odst
, 0))
634 sp
->lastused
= tv
.tv_sec
;
641 * allocating an SA entry for an *OUTBOUND* packet.
642 * checking each request entries in SP, and acquire an SA if need.
643 * OUT: 0: there are valid requests.
644 * ENOENT: policy may be valid, but SA with REQUIRE is on acquiring.
647 key_checkrequest(isr
, saidx
)
648 struct ipsecrequest
*isr
;
649 struct secasindex
*saidx
;
655 if (isr
== NULL
|| saidx
== NULL
)
656 panic("key_checkrequest: NULL pointer is passed.\n");
659 switch (saidx
->mode
) {
660 case IPSEC_MODE_TRANSPORT
:
661 case IPSEC_MODE_TUNNEL
:
665 panic("key_checkrequest: Invalid policy defined.\n");
668 /* get current level */
669 level
= ipsec_get_reqlevel(isr
);
673 * We do allocate new SA only if the state of SA in the holder is
674 * SADB_SASTATE_DEAD. The SA for outbound must be the oldest.
676 if (isr
->sav
!= NULL
) {
677 if (isr
->sav
->sah
== NULL
)
678 panic("key_checkrequest: sah is null.\n");
679 if (isr
->sav
== (struct secasvar
*)LIST_FIRST(
680 &isr
->sav
->sah
->savtree
[SADB_SASTATE_DEAD
])) {
681 KEYDEBUG(KEYDEBUG_IPSEC_STAMP
,
682 printf("DP checkrequest calls free SA:%p\n",
684 key_freesav(isr
->sav
);
690 * we free any SA stashed in the IPsec request because a different
691 * SA may be involved each time this request is checked, either
692 * because new SAs are being configured, or this request is
693 * associated with an unconnected datagram socket, or this request
694 * is associated with a system default policy.
696 * The operation may have negative impact to performance. We may
697 * want to check cached SA carefully, rather than picking new SA
700 if (isr
->sav
!= NULL
) {
701 key_freesav(isr
->sav
);
707 * new SA allocation if no SA found.
708 * key_allocsa_policy should allocate the oldest SA available.
709 * See key_do_allocsa_policy(), and draft-jenkins-ipsec-rekeying-03.txt.
711 if (isr
->sav
== NULL
)
712 isr
->sav
= key_allocsa_policy(saidx
);
714 /* When there is SA. */
715 if (isr
->sav
!= NULL
)
719 if ((error
= key_acquire(saidx
, isr
->sp
)) != 0) {
720 /* XXX What should I do ? */
721 ipseclog((LOG_DEBUG
, "key_checkrequest: error %d returned "
722 "from key_acquire.\n", error
));
726 return level
== IPSEC_LEVEL_REQUIRE
? ENOENT
: 0;
730 * allocating a SA for policy entry from SAD.
731 * NOTE: searching SAD of aliving state.
732 * OUT: NULL: not found.
733 * others: found and return the pointer.
735 static struct secasvar
*
736 key_allocsa_policy(saidx
)
737 struct secasindex
*saidx
;
739 struct secashead
*sah
;
740 struct secasvar
*sav
;
741 u_int stateidx
, state
;
742 const u_int
*saorder_state_valid
;
745 LIST_FOREACH(sah
, &sahtree
, chain
) {
746 if (sah
->state
== SADB_SASTATE_DEAD
)
748 if (key_cmpsaidx(&sah
->saidx
, saidx
, CMP_MODE_REQID
))
757 * search a valid state list for outbound packet.
758 * This search order is important.
760 if (key_preferred_oldsa
) {
761 saorder_state_valid
= saorder_state_valid_prefer_old
;
762 arraysize
= _ARRAYLEN(saorder_state_valid_prefer_old
);
764 saorder_state_valid
= saorder_state_valid_prefer_new
;
765 arraysize
= _ARRAYLEN(saorder_state_valid_prefer_new
);
768 for (stateidx
= 0; stateidx
< arraysize
; stateidx
++) {
770 state
= saorder_state_valid
[stateidx
];
772 sav
= key_do_allocsa_policy(sah
, state
);
781 * searching SAD with direction, protocol, mode and state.
782 * called by key_allocsa_policy().
785 * others : found, pointer to a SA.
787 static struct secasvar
*
788 key_do_allocsa_policy(sah
, state
)
789 struct secashead
*sah
;
792 struct secasvar
*sav
, *nextsav
, *candidate
, *d
;
797 for (sav
= LIST_FIRST(&sah
->savtree
[state
]);
801 nextsav
= LIST_NEXT(sav
, chain
);
804 KEY_CHKSASTATE(sav
->state
, state
, "key_do_allocsa_policy");
807 if (candidate
== NULL
) {
812 /* Which SA is the better ? */
815 if (candidate
->lft_c
== NULL
|| sav
->lft_c
== NULL
)
816 panic("key_do_allocsa_policy: "
817 "lifetime_current is NULL.\n");
819 /* What the best method is to compare ? */
820 if (key_preferred_oldsa
) {
821 if (candidate
->lft_c
->sadb_lifetime_addtime
>
822 sav
->lft_c
->sadb_lifetime_addtime
) {
829 /* prefered new sa rather than old sa */
830 if (candidate
->lft_c
->sadb_lifetime_addtime
<
831 sav
->lft_c
->sadb_lifetime_addtime
) {
838 * prepared to delete the SA when there is more
839 * suitable candidate and the lifetime of the SA is not
842 if (d
->lft_c
->sadb_lifetime_addtime
!= 0) {
843 struct mbuf
*m
, *result
;
845 key_sa_chgstate(d
, SADB_SASTATE_DEAD
);
847 m
= key_setsadbmsg(SADB_DELETE
, 0,
848 d
->sah
->saidx
.proto
, 0, 0, d
->refcnt
- 1);
853 /* set sadb_address for saidx's. */
854 m
= key_setsadbaddr(SADB_EXT_ADDRESS_SRC
,
855 (struct sockaddr
*)&d
->sah
->saidx
.src
,
856 d
->sah
->saidx
.src
.ss_len
<< 3,
862 /* set sadb_address for saidx's. */
863 m
= key_setsadbaddr(SADB_EXT_ADDRESS_DST
,
864 (struct sockaddr
*)&d
->sah
->saidx
.src
,
865 d
->sah
->saidx
.src
.ss_len
<< 3,
871 /* create SA extension */
872 m
= key_setsadbsa(d
);
877 if (result
->m_len
< sizeof(struct sadb_msg
)) {
878 result
= m_pullup(result
,
879 sizeof(struct sadb_msg
));
884 result
->m_pkthdr
.len
= 0;
885 for (m
= result
; m
; m
= m
->m_next
)
886 result
->m_pkthdr
.len
+= m
->m_len
;
887 mtod(result
, struct sadb_msg
*)->sadb_msg_len
=
888 PFKEY_UNIT64(result
->m_pkthdr
.len
);
890 if (key_sendup_mbuf(NULL
, result
,
891 KEY_SENDUP_REGISTERED
))
900 KEYDEBUG(KEYDEBUG_IPSEC_STAMP
,
901 printf("DP allocsa_policy cause "
902 "refcnt++:%d SA:%p\n",
903 candidate
->refcnt
, candidate
));
909 * allocating a SA entry for a *INBOUND* packet.
910 * Must call key_freesav() later.
911 * OUT: positive: pointer to a sav.
912 * NULL: not found, or error occured.
914 * In the comparison, source address will be ignored for RFC2401 conformance.
915 * To quote, from section 4.1:
916 * A security association is uniquely identified by a triple consisting
917 * of a Security Parameter Index (SPI), an IP Destination Address, and a
918 * security protocol (AH or ESP) identifier.
919 * Note that, however, we do need to keep source address in IPsec SA.
920 * IKE specification and PF_KEY specification do assume that we
921 * keep source address in IPsec SA. We see a tricky situation here.
924 key_allocsa(family
, src
, dst
, proto
, spi
)
929 struct secashead
*sah
;
930 struct secasvar
*sav
;
931 u_int stateidx
, state
;
932 struct sockaddr_in sin
;
933 struct sockaddr_in6 sin6
;
935 const u_int
*saorder_state_valid
;
939 if (src
== NULL
|| dst
== NULL
)
940 panic("key_allocsa: NULL pointer is passed.\n");
943 * when both systems employ similar strategy to use a SA.
944 * the search order is important even in the inbound case.
946 if (key_preferred_oldsa
) {
947 saorder_state_valid
= saorder_state_valid_prefer_old
;
948 arraysize
= _ARRAYLEN(saorder_state_valid_prefer_old
);
950 saorder_state_valid
= saorder_state_valid_prefer_new
;
951 arraysize
= _ARRAYLEN(saorder_state_valid_prefer_new
);
956 * XXX: to be checked internal IP header somewhere. Also when
957 * IPsec tunnel packet is received. But ESP tunnel mode is
958 * encrypted so we can't check internal IP header.
960 s
= splnet(); /*called from softclock()*/
961 LIST_FOREACH(sah
, &sahtree
, chain
) {
963 * search a valid state list for inbound packet.
964 * the search order is not important.
966 for (stateidx
= 0; stateidx
< arraysize
; stateidx
++) {
967 state
= saorder_state_valid
[stateidx
];
968 LIST_FOREACH(sav
, &sah
->savtree
[state
], chain
) {
970 KEY_CHKSASTATE(sav
->state
, state
, "key_allocsav");
971 if (proto
!= sav
->sah
->saidx
.proto
)
975 if (family
!= sav
->sah
->saidx
.src
.ss_family
||
976 family
!= sav
->sah
->saidx
.dst
.ss_family
)
979 #if 0 /* don't check src */
980 /* check src address */
983 bzero(&sin
, sizeof(sin
));
984 sin
.sin_family
= AF_INET
;
985 sin
.sin_len
= sizeof(sin
);
986 bcopy(src
, &sin
.sin_addr
,
987 sizeof(sin
.sin_addr
));
988 if (key_sockaddrcmp((struct sockaddr
*)&sin
,
989 (struct sockaddr
*)&sav
->sah
->saidx
.src
, 0) != 0)
994 bzero(&sin6
, sizeof(sin6
));
995 sin6
.sin6_family
= AF_INET6
;
996 sin6
.sin6_len
= sizeof(sin6
);
997 bcopy(src
, &sin6
.sin6_addr
,
998 sizeof(sin6
.sin6_addr
));
999 if (IN6_IS_SCOPE_LINKLOCAL(&sin6
.sin6_addr
)) {
1000 /* kame fake scopeid */
1001 sin6
.sin6_scope_id
=
1002 ntohs(sin6
.sin6_addr
.s6_addr16
[1]);
1003 sin6
.sin6_addr
.s6_addr16
[1] = 0;
1005 if (key_sockaddrcmp((struct sockaddr
*)&sin6
,
1006 (struct sockaddr
*)&sav
->sah
->saidx
.src
, 0) != 0)
1010 ipseclog((LOG_DEBUG
, "key_allocsa: "
1011 "unknown address family=%d.\n",
1017 /* check dst address */
1020 bzero(&sin
, sizeof(sin
));
1021 sin
.sin_family
= AF_INET
;
1022 sin
.sin_len
= sizeof(sin
);
1023 bcopy(dst
, &sin
.sin_addr
,
1024 sizeof(sin
.sin_addr
));
1025 if (key_sockaddrcmp((struct sockaddr
*)&sin
,
1026 (struct sockaddr
*)&sav
->sah
->saidx
.dst
, 0) != 0)
1031 bzero(&sin6
, sizeof(sin6
));
1032 sin6
.sin6_family
= AF_INET6
;
1033 sin6
.sin6_len
= sizeof(sin6
);
1034 bcopy(dst
, &sin6
.sin6_addr
,
1035 sizeof(sin6
.sin6_addr
));
1036 if (IN6_IS_SCOPE_LINKLOCAL(&sin6
.sin6_addr
)) {
1037 /* kame fake scopeid */
1038 sin6
.sin6_scope_id
=
1039 ntohs(sin6
.sin6_addr
.s6_addr16
[1]);
1040 sin6
.sin6_addr
.s6_addr16
[1] = 0;
1042 if (key_sockaddrcmp((struct sockaddr
*)&sin6
,
1043 (struct sockaddr
*)&sav
->sah
->saidx
.dst
, 0) != 0)
1047 ipseclog((LOG_DEBUG
, "key_allocsa: "
1048 "unknown address family=%d.\n",
1065 KEYDEBUG(KEYDEBUG_IPSEC_STAMP
,
1066 printf("DP allocsa cause refcnt++:%d SA:%p\n",
1072 * Must be called after calling key_allocsp().
1073 * For both the packet without socket and key_freeso().
1077 struct secpolicy
*sp
;
1081 panic("key_freesp: NULL pointer is passed.\n");
1084 KEYDEBUG(KEYDEBUG_IPSEC_STAMP
,
1085 printf("DP freesp cause refcnt--:%d SP:%p\n",
1088 if (sp
->refcnt
== 0)
1095 * Must be called after calling key_allocsp().
1096 * For the packet with socket.
1104 panic("key_freeso: NULL pointer is passed.\n");
1106 switch (so
->so_proto
->pr_domain
->dom_family
) {
1110 struct inpcb
*pcb
= sotoinpcb(so
);
1112 /* Does it have a PCB ? */
1113 if (pcb
== NULL
|| pcb
->inp_sp
== NULL
)
1115 key_freesp_so(&pcb
->inp_sp
->sp_in
);
1116 key_freesp_so(&pcb
->inp_sp
->sp_out
);
1124 struct inpcb
*pcb
= sotoinpcb(so
);
1126 /* Does it have a PCB ? */
1127 if (pcb
== NULL
|| pcb
->inp_sp
== NULL
)
1129 key_freesp_so(&pcb
->inp_sp
->sp_in
);
1130 key_freesp_so(&pcb
->inp_sp
->sp_out
);
1132 struct in6pcb
*pcb
= sotoin6pcb(so
);
1134 /* Does it have a PCB ? */
1135 if (pcb
== NULL
|| pcb
->in6p_sp
== NULL
)
1137 key_freesp_so(&pcb
->in6p_sp
->sp_in
);
1138 key_freesp_so(&pcb
->in6p_sp
->sp_out
);
1144 ipseclog((LOG_DEBUG
, "key_freeso: unknown address family=%d.\n",
1145 so
->so_proto
->pr_domain
->dom_family
));
1154 struct secpolicy
**sp
;
1157 if (sp
== NULL
|| *sp
== NULL
)
1158 panic("key_freesp_so: sp == NULL\n");
1160 switch ((*sp
)->policy
) {
1161 case IPSEC_POLICY_IPSEC
:
1162 KEYDEBUG(KEYDEBUG_IPSEC_STAMP
,
1163 printf("DP freeso calls free SP:%p\n", *sp
));
1167 case IPSEC_POLICY_ENTRUST
:
1168 case IPSEC_POLICY_BYPASS
:
1171 panic("key_freesp_so: Invalid policy found %d", (*sp
)->policy
);
1178 * Must be called after calling key_allocsa().
1179 * This function is called by key_freesp() to free some SA allocated
1184 struct secasvar
*sav
;
1188 panic("key_freesav: NULL pointer is passed.\n");
1191 KEYDEBUG(KEYDEBUG_IPSEC_STAMP
,
1192 printf("DP freesav cause refcnt--:%d SA:%p SPI %u\n",
1193 sav
->refcnt
, sav
, (u_int32_t
)ntohl(sav
->spi
)));
1195 if (sav
->refcnt
== 0)
1201 /* %%% SPD management */
1203 * free security policy entry.
1207 struct secpolicy
*sp
;
1213 panic("key_delsp: NULL pointer is passed.\n");
1215 sp
->state
= IPSEC_SPSTATE_DEAD
;
1218 return; /* can't free */
1220 s
= splnet(); /*called from softclock()*/
1221 /* remove from SP index */
1222 if (__LIST_CHAINED(sp
))
1223 LIST_REMOVE(sp
, chain
);
1226 struct ipsecrequest
*isr
= sp
->req
, *nextisr
;
1228 while (isr
!= NULL
) {
1229 if (isr
->sav
!= NULL
) {
1230 KEYDEBUG(KEYDEBUG_IPSEC_STAMP
,
1231 printf("DP delsp calls free SA:%p\n",
1233 key_freesav(isr
->sav
);
1237 nextisr
= isr
->next
;
1243 keydb_delsecpolicy(sp
);
1252 * OUT: NULL : not found
1253 * others : found, pointer to a SP.
1255 static struct secpolicy
*
1257 struct secpolicyindex
*spidx
;
1259 struct secpolicy
*sp
;
1263 panic("key_getsp: NULL pointer is passed.\n");
1265 LIST_FOREACH(sp
, &sptree
[spidx
->dir
], chain
) {
1266 if (sp
->state
== IPSEC_SPSTATE_DEAD
)
1268 if (key_cmpspidx_exactly(spidx
, &sp
->spidx
)) {
1279 * OUT: NULL : not found
1280 * others : found, pointer to a SP.
1282 static struct secpolicy
*
1286 struct secpolicy
*sp
;
1288 LIST_FOREACH(sp
, &sptree
[IPSEC_DIR_INBOUND
], chain
) {
1289 if (sp
->state
== IPSEC_SPSTATE_DEAD
)
1297 LIST_FOREACH(sp
, &sptree
[IPSEC_DIR_OUTBOUND
], chain
) {
1298 if (sp
->state
== IPSEC_SPSTATE_DEAD
)
1312 struct secpolicy
*newsp
= NULL
;
1314 newsp
= keydb_newsecpolicy();
1325 * create secpolicy structure from sadb_x_policy structure.
1326 * NOTE: `state', `secpolicyindex' in secpolicy structure are not set,
1327 * so must be set properly later.
1330 key_msg2sp(xpl0
, len
, error
)
1331 struct sadb_x_policy
*xpl0
;
1335 struct secpolicy
*newsp
;
1339 panic("key_msg2sp: NULL pointer was passed.\n");
1340 if (len
< sizeof(*xpl0
))
1341 panic("key_msg2sp: invalid length.\n");
1342 if (len
!= PFKEY_EXTLEN(xpl0
)) {
1343 ipseclog((LOG_DEBUG
, "key_msg2sp: Invalid msg length.\n"));
1348 if ((newsp
= key_newsp()) == NULL
) {
1353 newsp
->spidx
.dir
= xpl0
->sadb_x_policy_dir
;
1354 newsp
->policy
= xpl0
->sadb_x_policy_type
;
1357 switch (xpl0
->sadb_x_policy_type
) {
1358 case IPSEC_POLICY_DISCARD
:
1359 case IPSEC_POLICY_NONE
:
1360 case IPSEC_POLICY_ENTRUST
:
1361 case IPSEC_POLICY_BYPASS
:
1365 case IPSEC_POLICY_IPSEC
:
1368 struct sadb_x_ipsecrequest
*xisr
;
1369 struct ipsecrequest
**p_isr
= &newsp
->req
;
1371 /* validity check */
1372 if (PFKEY_EXTLEN(xpl0
) < sizeof(*xpl0
)) {
1373 ipseclog((LOG_DEBUG
,
1374 "key_msg2sp: Invalid msg length.\n"));
1380 tlen
= PFKEY_EXTLEN(xpl0
) - sizeof(*xpl0
);
1381 xisr
= (struct sadb_x_ipsecrequest
*)(xpl0
+ 1);
1386 if (xisr
->sadb_x_ipsecrequest_len
< sizeof(*xisr
)) {
1387 ipseclog((LOG_DEBUG
, "key_msg2sp: "
1388 "invalid ipsecrequest length.\n"));
1394 /* allocate request buffer */
1395 KMALLOC(*p_isr
, struct ipsecrequest
*, sizeof(**p_isr
));
1396 if ((*p_isr
) == NULL
) {
1397 ipseclog((LOG_DEBUG
,
1398 "key_msg2sp: No more memory.\n"));
1403 bzero(*p_isr
, sizeof(**p_isr
));
1406 (*p_isr
)->next
= NULL
;
1408 switch (xisr
->sadb_x_ipsecrequest_proto
) {
1411 case IPPROTO_IPCOMP
:
1414 ipseclog((LOG_DEBUG
,
1415 "key_msg2sp: invalid proto type=%u\n",
1416 xisr
->sadb_x_ipsecrequest_proto
));
1418 *error
= EPROTONOSUPPORT
;
1421 (*p_isr
)->saidx
.proto
= xisr
->sadb_x_ipsecrequest_proto
;
1423 switch (xisr
->sadb_x_ipsecrequest_mode
) {
1424 case IPSEC_MODE_TRANSPORT
:
1425 case IPSEC_MODE_TUNNEL
:
1427 case IPSEC_MODE_ANY
:
1429 ipseclog((LOG_DEBUG
,
1430 "key_msg2sp: invalid mode=%u\n",
1431 xisr
->sadb_x_ipsecrequest_mode
));
1436 (*p_isr
)->saidx
.mode
= xisr
->sadb_x_ipsecrequest_mode
;
1438 switch (xisr
->sadb_x_ipsecrequest_level
) {
1439 case IPSEC_LEVEL_DEFAULT
:
1440 case IPSEC_LEVEL_USE
:
1441 case IPSEC_LEVEL_REQUIRE
:
1443 case IPSEC_LEVEL_UNIQUE
:
1444 /* validity check */
1446 * If range violation of reqid, kernel will
1447 * update it, don't refuse it.
1449 if (xisr
->sadb_x_ipsecrequest_reqid
1450 > IPSEC_MANUAL_REQID_MAX
) {
1451 ipseclog((LOG_DEBUG
,
1452 "key_msg2sp: reqid=%d range "
1453 "violation, updated by kernel.\n",
1454 xisr
->sadb_x_ipsecrequest_reqid
));
1455 xisr
->sadb_x_ipsecrequest_reqid
= 0;
1458 /* allocate new reqid id if reqid is zero. */
1459 if (xisr
->sadb_x_ipsecrequest_reqid
== 0) {
1461 if ((reqid
= key_newreqid()) == 0) {
1466 (*p_isr
)->saidx
.reqid
= reqid
;
1467 xisr
->sadb_x_ipsecrequest_reqid
= reqid
;
1469 /* set it for manual keying. */
1470 (*p_isr
)->saidx
.reqid
=
1471 xisr
->sadb_x_ipsecrequest_reqid
;
1476 ipseclog((LOG_DEBUG
, "key_msg2sp: invalid level=%u\n",
1477 xisr
->sadb_x_ipsecrequest_level
));
1482 (*p_isr
)->level
= xisr
->sadb_x_ipsecrequest_level
;
1484 /* set IP addresses if there */
1485 if (xisr
->sadb_x_ipsecrequest_len
> sizeof(*xisr
)) {
1486 struct sockaddr
*paddr
;
1488 paddr
= (struct sockaddr
*)(xisr
+ 1);
1490 /* validity check */
1492 > sizeof((*p_isr
)->saidx
.src
)) {
1493 ipseclog((LOG_DEBUG
, "key_msg2sp: invalid request "
1494 "address length.\n"));
1499 bcopy(paddr
, &(*p_isr
)->saidx
.src
,
1502 paddr
= (struct sockaddr
*)((caddr_t
)paddr
1505 /* validity check */
1507 > sizeof((*p_isr
)->saidx
.dst
)) {
1508 ipseclog((LOG_DEBUG
, "key_msg2sp: invalid request "
1509 "address length.\n"));
1514 bcopy(paddr
, &(*p_isr
)->saidx
.dst
,
1518 (*p_isr
)->sav
= NULL
;
1519 (*p_isr
)->sp
= newsp
;
1521 /* initialization for the next. */
1522 p_isr
= &(*p_isr
)->next
;
1523 tlen
-= xisr
->sadb_x_ipsecrequest_len
;
1525 /* validity check */
1527 ipseclog((LOG_DEBUG
, "key_msg2sp: becoming tlen < 0.\n"));
1533 xisr
= (struct sadb_x_ipsecrequest
*)((caddr_t
)xisr
1534 + xisr
->sadb_x_ipsecrequest_len
);
1539 ipseclog((LOG_DEBUG
, "key_msg2sp: invalid policy type.\n"));
1552 static u_int32_t auto_reqid
= IPSEC_MANUAL_REQID_MAX
+ 1;
1554 auto_reqid
= (auto_reqid
== ~0
1555 ? IPSEC_MANUAL_REQID_MAX
+ 1 : auto_reqid
+ 1);
1557 /* XXX should be unique check */
1563 * copy secpolicy struct to sadb_x_policy structure indicated.
1567 struct secpolicy
*sp
;
1569 struct sadb_x_policy
*xpl
;
1576 panic("key_sp2msg: NULL pointer was passed.\n");
1578 tlen
= key_getspreqmsglen(sp
);
1580 m
= key_alloc_mbuf(tlen
);
1581 if (!m
|| m
->m_next
) { /*XXX*/
1589 xpl
= mtod(m
, struct sadb_x_policy
*);
1592 xpl
->sadb_x_policy_len
= PFKEY_UNIT64(tlen
);
1593 xpl
->sadb_x_policy_exttype
= SADB_X_EXT_POLICY
;
1594 xpl
->sadb_x_policy_type
= sp
->policy
;
1595 xpl
->sadb_x_policy_dir
= sp
->spidx
.dir
;
1596 xpl
->sadb_x_policy_id
= sp
->id
;
1597 p
= (caddr_t
)xpl
+ sizeof(*xpl
);
1599 /* if is the policy for ipsec ? */
1600 if (sp
->policy
== IPSEC_POLICY_IPSEC
) {
1601 struct sadb_x_ipsecrequest
*xisr
;
1602 struct ipsecrequest
*isr
;
1604 for (isr
= sp
->req
; isr
!= NULL
; isr
= isr
->next
) {
1606 xisr
= (struct sadb_x_ipsecrequest
*)p
;
1608 xisr
->sadb_x_ipsecrequest_proto
= isr
->saidx
.proto
;
1609 xisr
->sadb_x_ipsecrequest_mode
= isr
->saidx
.mode
;
1610 xisr
->sadb_x_ipsecrequest_level
= isr
->level
;
1611 xisr
->sadb_x_ipsecrequest_reqid
= isr
->saidx
.reqid
;
1614 bcopy(&isr
->saidx
.src
, p
, isr
->saidx
.src
.ss_len
);
1615 p
+= isr
->saidx
.src
.ss_len
;
1616 bcopy(&isr
->saidx
.dst
, p
, isr
->saidx
.dst
.ss_len
);
1617 p
+= isr
->saidx
.src
.ss_len
;
1619 xisr
->sadb_x_ipsecrequest_len
=
1620 PFKEY_ALIGN8(sizeof(*xisr
)
1621 + isr
->saidx
.src
.ss_len
1622 + isr
->saidx
.dst
.ss_len
);
1629 /* m will not be freed nor modified */
1630 static struct mbuf
*
1631 key_gather_mbuf(struct mbuf
*m
, const struct sadb_msghdr
*mhp
,
1632 int ndeep
, int nitem
, int *items
)
1636 struct mbuf
*result
= NULL
, *n
;
1639 if (m
== NULL
|| mhp
== NULL
)
1640 panic("null pointer passed to key_gather");
1642 for (i
= 0; i
< nitem
; i
++) {
1644 if (idx
< 0 || idx
> SADB_EXT_MAX
)
1646 /* don't attempt to pull empty extension */
1647 if (idx
== SADB_EXT_RESERVED
&& mhp
->msg
== NULL
)
1649 if (idx
!= SADB_EXT_RESERVED
&&
1650 (mhp
->ext
[idx
] == NULL
|| mhp
->extlen
[idx
] == 0))
1653 if (idx
== SADB_EXT_RESERVED
) {
1654 len
= PFKEY_ALIGN8(sizeof(struct sadb_msg
));
1657 panic("assumption failed");
1659 MGETHDR(n
, M_DONTWAIT
, MT_DATA
);
1664 m_copydata(m
, 0, sizeof(struct sadb_msg
),
1666 } else if (i
< ndeep
) {
1667 len
= mhp
->extlen
[idx
];
1668 n
= key_alloc_mbuf(len
);
1669 if (!n
|| n
->m_next
) { /*XXX*/
1674 m_copydata(m
, mhp
->extoff
[idx
], mhp
->extlen
[idx
],
1677 n
= m_copym(m
, mhp
->extoff
[idx
], mhp
->extlen
[idx
],
1689 if ((result
->m_flags
& M_PKTHDR
) != 0) {
1690 result
->m_pkthdr
.len
= 0;
1691 for (n
= result
; n
; n
= n
->m_next
)
1692 result
->m_pkthdr
.len
+= n
->m_len
;
1703 * SADB_X_SPDADD, SADB_X_SPDSETIDX or SADB_X_SPDUPDATE processing
1704 * add a entry to SP database, when received
1705 * <base, address(SD), (lifetime(H),) policy>
1707 * Adding to SP database,
1709 * <base, address(SD), (lifetime(H),) policy>
1710 * to the socket which was send.
1712 * SPDADD set a unique policy entry.
1713 * SPDSETIDX like SPDADD without a part of policy requests.
1714 * SPDUPDATE replace a unique policy entry.
1716 * m will always be freed.
1719 key_spdadd(so
, m
, mhp
)
1722 const struct sadb_msghdr
*mhp
;
1724 struct sadb_address
*src0
, *dst0
;
1725 struct sadb_x_policy
*xpl0
, *xpl
;
1726 struct sadb_lifetime
*lft
= NULL
;
1727 struct secpolicyindex spidx
;
1728 struct secpolicy
*newsp
;
1733 if (so
== NULL
|| m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
)
1734 panic("key_spdadd: NULL pointer is passed.\n");
1736 if (mhp
->ext
[SADB_EXT_ADDRESS_SRC
] == NULL
||
1737 mhp
->ext
[SADB_EXT_ADDRESS_DST
] == NULL
||
1738 mhp
->ext
[SADB_X_EXT_POLICY
] == NULL
) {
1739 ipseclog((LOG_DEBUG
, "key_spdadd: invalid message is passed.\n"));
1740 return key_senderror(so
, m
, EINVAL
);
1742 if (mhp
->extlen
[SADB_EXT_ADDRESS_SRC
] < sizeof(struct sadb_address
) ||
1743 mhp
->extlen
[SADB_EXT_ADDRESS_DST
] < sizeof(struct sadb_address
) ||
1744 mhp
->extlen
[SADB_X_EXT_POLICY
] < sizeof(struct sadb_x_policy
)) {
1745 ipseclog((LOG_DEBUG
, "key_spdadd: invalid message is passed.\n"));
1746 return key_senderror(so
, m
, EINVAL
);
1748 if (mhp
->ext
[SADB_EXT_LIFETIME_HARD
] != NULL
) {
1749 if (mhp
->extlen
[SADB_EXT_LIFETIME_HARD
]
1750 < sizeof(struct sadb_lifetime
)) {
1751 ipseclog((LOG_DEBUG
, "key_spdadd: invalid message is passed.\n"));
1752 return key_senderror(so
, m
, EINVAL
);
1754 lft
= (struct sadb_lifetime
*)mhp
->ext
[SADB_EXT_LIFETIME_HARD
];
1757 src0
= (struct sadb_address
*)mhp
->ext
[SADB_EXT_ADDRESS_SRC
];
1758 dst0
= (struct sadb_address
*)mhp
->ext
[SADB_EXT_ADDRESS_DST
];
1759 xpl0
= (struct sadb_x_policy
*)mhp
->ext
[SADB_X_EXT_POLICY
];
1762 /* XXX boundary check against sa_len */
1763 KEY_SETSECSPIDX(xpl0
->sadb_x_policy_dir
,
1766 src0
->sadb_address_prefixlen
,
1767 dst0
->sadb_address_prefixlen
,
1768 src0
->sadb_address_proto
,
1771 /* checking the direciton. */
1772 switch (xpl0
->sadb_x_policy_dir
) {
1773 case IPSEC_DIR_INBOUND
:
1774 case IPSEC_DIR_OUTBOUND
:
1777 ipseclog((LOG_DEBUG
, "key_spdadd: Invalid SP direction.\n"));
1778 mhp
->msg
->sadb_msg_errno
= EINVAL
;
1783 /* key_spdadd() accepts DISCARD, NONE and IPSEC. */
1784 if (xpl0
->sadb_x_policy_type
== IPSEC_POLICY_ENTRUST
1785 || xpl0
->sadb_x_policy_type
== IPSEC_POLICY_BYPASS
) {
1786 ipseclog((LOG_DEBUG
, "key_spdadd: Invalid policy type.\n"));
1787 return key_senderror(so
, m
, EINVAL
);
1790 /* policy requests are mandatory when action is ipsec. */
1791 if (mhp
->msg
->sadb_msg_type
!= SADB_X_SPDSETIDX
1792 && xpl0
->sadb_x_policy_type
== IPSEC_POLICY_IPSEC
1793 && mhp
->extlen
[SADB_X_EXT_POLICY
] <= sizeof(*xpl0
)) {
1794 ipseclog((LOG_DEBUG
, "key_spdadd: some policy requests part required.\n"));
1795 return key_senderror(so
, m
, EINVAL
);
1799 * checking there is SP already or not.
1800 * SPDUPDATE doesn't depend on whether there is a SP or not.
1801 * If the type is either SPDADD or SPDSETIDX AND a SP is found,
1804 newsp
= key_getsp(&spidx
);
1805 if (mhp
->msg
->sadb_msg_type
== SADB_X_SPDUPDATE
) {
1807 newsp
->state
= IPSEC_SPSTATE_DEAD
;
1811 if (newsp
!= NULL
) {
1813 ipseclog((LOG_DEBUG
, "key_spdadd: a SP entry exists already.\n"));
1814 return key_senderror(so
, m
, EEXIST
);
1818 /* allocation new SP entry */
1819 if ((newsp
= key_msg2sp(xpl0
, PFKEY_EXTLEN(xpl0
), &error
)) == NULL
) {
1820 return key_senderror(so
, m
, error
);
1823 if ((newsp
->id
= key_getnewspid()) == 0) {
1824 keydb_delsecpolicy(newsp
);
1825 return key_senderror(so
, m
, ENOBUFS
);
1828 /* XXX boundary check against sa_len */
1829 KEY_SETSECSPIDX(xpl0
->sadb_x_policy_dir
,
1832 src0
->sadb_address_prefixlen
,
1833 dst0
->sadb_address_prefixlen
,
1834 src0
->sadb_address_proto
,
1837 /* sanity check on addr pair */
1838 if (((struct sockaddr
*)(src0
+ 1))->sa_family
!=
1839 ((struct sockaddr
*)(dst0
+ 1))->sa_family
) {
1840 keydb_delsecpolicy(newsp
);
1841 return key_senderror(so
, m
, EINVAL
);
1843 if (((struct sockaddr
*)(src0
+ 1))->sa_len
!=
1844 ((struct sockaddr
*)(dst0
+ 1))->sa_len
) {
1845 keydb_delsecpolicy(newsp
);
1846 return key_senderror(so
, m
, EINVAL
);
1849 if (newsp
->req
&& newsp
->req
->saidx
.src
.ss_family
) {
1850 struct sockaddr
*sa
;
1851 sa
= (struct sockaddr
*)(src0
+ 1);
1852 if (sa
->sa_family
!= newsp
->req
->saidx
.src
.ss_family
) {
1853 keydb_delsecpolicy(newsp
);
1854 return key_senderror(so
, m
, EINVAL
);
1857 if (newsp
->req
&& newsp
->req
->saidx
.dst
.ss_family
) {
1858 struct sockaddr
*sa
;
1859 sa
= (struct sockaddr
*)(dst0
+ 1);
1860 if (sa
->sa_family
!= newsp
->req
->saidx
.dst
.ss_family
) {
1861 keydb_delsecpolicy(newsp
);
1862 return key_senderror(so
, m
, EINVAL
);
1868 newsp
->created
= tv
.tv_sec
;
1869 newsp
->lastused
= tv
.tv_sec
;
1870 newsp
->lifetime
= lft
? lft
->sadb_lifetime_addtime
: 0;
1871 newsp
->validtime
= lft
? lft
->sadb_lifetime_usetime
: 0;
1873 newsp
->refcnt
= 1; /* do not reclaim until I say I do */
1874 newsp
->state
= IPSEC_SPSTATE_ALIVE
;
1875 LIST_INSERT_TAIL(&sptree
[newsp
->spidx
.dir
], newsp
, secpolicy
, chain
);
1877 /* Turn off the ipsec bypass */
1878 if (ipsec_bypass
!= 0)
1881 /* delete the entry in spacqtree */
1882 if (mhp
->msg
->sadb_msg_type
== SADB_X_SPDUPDATE
) {
1883 struct secspacq
*spacq
;
1884 if ((spacq
= key_getspacq(&spidx
)) != NULL
) {
1885 /* reset counter in order to deletion by timehandler. */
1887 spacq
->created
= tv
.tv_sec
;
1893 struct mbuf
*n
, *mpolicy
;
1894 struct sadb_msg
*newmsg
;
1897 /* create new sadb_msg to reply. */
1899 int mbufItems
[] = {SADB_EXT_RESERVED
, SADB_X_EXT_POLICY
,
1900 SADB_EXT_LIFETIME_HARD
, SADB_EXT_ADDRESS_SRC
,
1901 SADB_EXT_ADDRESS_DST
};
1902 n
= key_gather_mbuf(m
, mhp
, 2, sizeof(mbufItems
)/sizeof(int), mbufItems
);
1904 int mbufItems
[] = {SADB_EXT_RESERVED
, SADB_X_EXT_POLICY
,
1905 SADB_EXT_ADDRESS_SRC
, SADB_EXT_ADDRESS_DST
};
1906 n
= key_gather_mbuf(m
, mhp
, 2, sizeof(mbufItems
)/sizeof(int), mbufItems
);
1909 return key_senderror(so
, m
, ENOBUFS
);
1911 if (n
->m_len
< sizeof(*newmsg
)) {
1912 n
= m_pullup(n
, sizeof(*newmsg
));
1914 return key_senderror(so
, m
, ENOBUFS
);
1916 newmsg
= mtod(n
, struct sadb_msg
*);
1917 newmsg
->sadb_msg_errno
= 0;
1918 newmsg
->sadb_msg_len
= PFKEY_UNIT64(n
->m_pkthdr
.len
);
1921 mpolicy
= m_pulldown(n
, PFKEY_ALIGN8(sizeof(struct sadb_msg
)),
1922 sizeof(*xpl
), &off
);
1923 if (mpolicy
== NULL
) {
1924 /* n is already freed */
1925 return key_senderror(so
, m
, ENOBUFS
);
1927 xpl
= (struct sadb_x_policy
*)(mtod(mpolicy
, caddr_t
) + off
);
1928 if (xpl
->sadb_x_policy_exttype
!= SADB_X_EXT_POLICY
) {
1930 return key_senderror(so
, m
, EINVAL
);
1932 xpl
->sadb_x_policy_id
= newsp
->id
;
1935 return key_sendup_mbuf(so
, n
, KEY_SENDUP_ALL
);
1940 * get new policy id.
1948 u_int32_t newid
= 0;
1949 int count
= key_spi_trycnt
; /* XXX */
1950 struct secpolicy
*sp
;
1952 /* when requesting to allocate spi ranged */
1954 newid
= (policy_id
= (policy_id
== ~0 ? 1 : policy_id
+ 1));
1956 if ((sp
= key_getspbyid(newid
)) == NULL
)
1962 if (count
== 0 || newid
== 0) {
1963 ipseclog((LOG_DEBUG
, "key_getnewspid: to allocate policy id is failed.\n"));
1971 * SADB_SPDDELETE processing
1973 * <base, address(SD), policy(*)>
1974 * from the user(?), and set SADB_SASTATE_DEAD,
1976 * <base, address(SD), policy(*)>
1978 * policy(*) including direction of policy.
1980 * m will always be freed.
1983 key_spddelete(so
, m
, mhp
)
1986 const struct sadb_msghdr
*mhp
;
1988 struct sadb_address
*src0
, *dst0
;
1989 struct sadb_x_policy
*xpl0
;
1990 struct secpolicyindex spidx
;
1991 struct secpolicy
*sp
;
1994 if (so
== NULL
|| m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
)
1995 panic("key_spddelete: NULL pointer is passed.\n");
1997 if (mhp
->ext
[SADB_EXT_ADDRESS_SRC
] == NULL
||
1998 mhp
->ext
[SADB_EXT_ADDRESS_DST
] == NULL
||
1999 mhp
->ext
[SADB_X_EXT_POLICY
] == NULL
) {
2000 ipseclog((LOG_DEBUG
, "key_spddelete: invalid message is passed.\n"));
2001 return key_senderror(so
, m
, EINVAL
);
2003 if (mhp
->extlen
[SADB_EXT_ADDRESS_SRC
] < sizeof(struct sadb_address
) ||
2004 mhp
->extlen
[SADB_EXT_ADDRESS_DST
] < sizeof(struct sadb_address
) ||
2005 mhp
->extlen
[SADB_X_EXT_POLICY
] < sizeof(struct sadb_x_policy
)) {
2006 ipseclog((LOG_DEBUG
, "key_spddelete: invalid message is passed.\n"));
2007 return key_senderror(so
, m
, EINVAL
);
2010 src0
= (struct sadb_address
*)mhp
->ext
[SADB_EXT_ADDRESS_SRC
];
2011 dst0
= (struct sadb_address
*)mhp
->ext
[SADB_EXT_ADDRESS_DST
];
2012 xpl0
= (struct sadb_x_policy
*)mhp
->ext
[SADB_X_EXT_POLICY
];
2015 /* XXX boundary check against sa_len */
2016 KEY_SETSECSPIDX(xpl0
->sadb_x_policy_dir
,
2019 src0
->sadb_address_prefixlen
,
2020 dst0
->sadb_address_prefixlen
,
2021 src0
->sadb_address_proto
,
2024 /* checking the direciton. */
2025 switch (xpl0
->sadb_x_policy_dir
) {
2026 case IPSEC_DIR_INBOUND
:
2027 case IPSEC_DIR_OUTBOUND
:
2030 ipseclog((LOG_DEBUG
, "key_spddelete: Invalid SP direction.\n"));
2031 return key_senderror(so
, m
, EINVAL
);
2034 /* Is there SP in SPD ? */
2035 if ((sp
= key_getsp(&spidx
)) == NULL
) {
2036 ipseclog((LOG_DEBUG
, "key_spddelete: no SP found.\n"));
2037 return key_senderror(so
, m
, EINVAL
);
2040 /* save policy id to buffer to be returned. */
2041 xpl0
->sadb_x_policy_id
= sp
->id
;
2043 sp
->state
= IPSEC_SPSTATE_DEAD
;
2048 struct sadb_msg
*newmsg
;
2049 int mbufItems
[] = {SADB_EXT_RESERVED
, SADB_X_EXT_POLICY
,
2050 SADB_EXT_ADDRESS_SRC
, SADB_EXT_ADDRESS_DST
};
2052 /* create new sadb_msg to reply. */
2053 n
= key_gather_mbuf(m
, mhp
, 1, sizeof(mbufItems
)/sizeof(int), mbufItems
);
2055 return key_senderror(so
, m
, ENOBUFS
);
2057 newmsg
= mtod(n
, struct sadb_msg
*);
2058 newmsg
->sadb_msg_errno
= 0;
2059 newmsg
->sadb_msg_len
= PFKEY_UNIT64(n
->m_pkthdr
.len
);
2062 return key_sendup_mbuf(so
, n
, KEY_SENDUP_ALL
);
2067 * SADB_SPDDELETE2 processing
2070 * from the user(?), and set SADB_SASTATE_DEAD,
2074 * policy(*) including direction of policy.
2076 * m will always be freed.
2079 key_spddelete2(so
, m
, mhp
)
2082 const struct sadb_msghdr
*mhp
;
2085 struct secpolicy
*sp
;
2088 if (so
== NULL
|| m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
)
2089 panic("key_spddelete2: NULL pointer is passed.\n");
2091 if (mhp
->ext
[SADB_X_EXT_POLICY
] == NULL
||
2092 mhp
->extlen
[SADB_X_EXT_POLICY
] < sizeof(struct sadb_x_policy
)) {
2093 ipseclog((LOG_DEBUG
, "key_spddelete2: invalid message is passed.\n"));
2094 key_senderror(so
, m
, EINVAL
);
2098 id
= ((struct sadb_x_policy
*)mhp
->ext
[SADB_X_EXT_POLICY
])->sadb_x_policy_id
;
2100 /* Is there SP in SPD ? */
2101 if ((sp
= key_getspbyid(id
)) == NULL
) {
2102 ipseclog((LOG_DEBUG
, "key_spddelete2: no SP found id:%u.\n", id
));
2103 key_senderror(so
, m
, EINVAL
);
2106 sp
->state
= IPSEC_SPSTATE_DEAD
;
2110 struct mbuf
*n
, *nn
;
2111 struct sadb_msg
*newmsg
;
2114 /* create new sadb_msg to reply. */
2115 len
= PFKEY_ALIGN8(sizeof(struct sadb_msg
));
2118 return key_senderror(so
, m
, ENOBUFS
);
2119 MGETHDR(n
, M_DONTWAIT
, MT_DATA
);
2120 if (n
&& len
> MHLEN
) {
2121 MCLGET(n
, M_DONTWAIT
);
2122 if ((n
->m_flags
& M_EXT
) == 0) {
2128 return key_senderror(so
, m
, ENOBUFS
);
2134 m_copydata(m
, 0, sizeof(struct sadb_msg
), mtod(n
, caddr_t
) + off
);
2135 off
+= PFKEY_ALIGN8(sizeof(struct sadb_msg
));
2139 panic("length inconsistency in key_spddelete2");
2142 n
->m_next
= m_copym(m
, mhp
->extoff
[SADB_X_EXT_POLICY
],
2143 mhp
->extlen
[SADB_X_EXT_POLICY
], M_DONTWAIT
);
2146 return key_senderror(so
, m
, ENOBUFS
);
2149 n
->m_pkthdr
.len
= 0;
2150 for (nn
= n
; nn
; nn
= nn
->m_next
)
2151 n
->m_pkthdr
.len
+= nn
->m_len
;
2153 newmsg
= mtod(n
, struct sadb_msg
*);
2154 newmsg
->sadb_msg_errno
= 0;
2155 newmsg
->sadb_msg_len
= PFKEY_UNIT64(n
->m_pkthdr
.len
);
2158 return key_sendup_mbuf(so
, n
, KEY_SENDUP_ALL
);
2163 * SADB_X_GET processing
2168 * <base, address(SD), policy>
2170 * policy(*) including direction of policy.
2172 * m will always be freed.
2175 key_spdget(so
, m
, mhp
)
2178 const struct sadb_msghdr
*mhp
;
2181 struct secpolicy
*sp
;
2185 if (so
== NULL
|| m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
)
2186 panic("key_spdget: NULL pointer is passed.\n");
2188 if (mhp
->ext
[SADB_X_EXT_POLICY
] == NULL
||
2189 mhp
->extlen
[SADB_X_EXT_POLICY
] < sizeof(struct sadb_x_policy
)) {
2190 ipseclog((LOG_DEBUG
, "key_spdget: invalid message is passed.\n"));
2191 return key_senderror(so
, m
, EINVAL
);
2194 id
= ((struct sadb_x_policy
*)mhp
->ext
[SADB_X_EXT_POLICY
])->sadb_x_policy_id
;
2196 /* Is there SP in SPD ? */
2197 if ((sp
= key_getspbyid(id
)) == NULL
) {
2198 ipseclog((LOG_DEBUG
, "key_spdget: no SP found id:%u.\n", id
));
2199 return key_senderror(so
, m
, ENOENT
);
2202 n
= key_setdumpsp(sp
, SADB_X_SPDGET
, 0, mhp
->msg
->sadb_msg_pid
);
2205 return key_sendup_mbuf(so
, n
, KEY_SENDUP_ONE
);
2207 return key_senderror(so
, m
, ENOBUFS
);
2211 * SADB_X_SPDACQUIRE processing.
2212 * Acquire policy and SA(s) for a *OUTBOUND* packet.
2215 * to KMD, and expect to receive
2216 * <base> with SADB_X_SPDACQUIRE if error occured,
2219 * with SADB_X_SPDUPDATE from KMD by PF_KEY.
2220 * policy(*) is without policy requests.
2223 * others: error number
2227 struct secpolicy
*sp
;
2229 struct mbuf
*result
= NULL
, *m
;
2230 struct secspacq
*newspacq
;
2235 panic("key_spdacquire: NULL pointer is passed.\n");
2236 if (sp
->req
!= NULL
)
2237 panic("key_spdacquire: called but there is request.\n");
2238 if (sp
->policy
!= IPSEC_POLICY_IPSEC
)
2239 panic("key_spdacquire: policy mismathed. IPsec is expected.\n");
2241 /* get a entry to check whether sent message or not. */
2242 if ((newspacq
= key_getspacq(&sp
->spidx
)) != NULL
) {
2243 if (key_blockacq_count
< newspacq
->count
) {
2244 /* reset counter and do send message. */
2245 newspacq
->count
= 0;
2247 /* increment counter and do nothing. */
2252 /* make new entry for blocking to send SADB_ACQUIRE. */
2253 if ((newspacq
= key_newspacq(&sp
->spidx
)) == NULL
)
2256 /* add to acqtree */
2257 LIST_INSERT_HEAD(&spacqtree
, newspacq
, chain
);
2260 /* create new sadb_msg to reply. */
2261 m
= key_setsadbmsg(SADB_X_SPDACQUIRE
, 0, 0, 0, 0, 0);
2268 result
->m_pkthdr
.len
= 0;
2269 for (m
= result
; m
; m
= m
->m_next
)
2270 result
->m_pkthdr
.len
+= m
->m_len
;
2272 mtod(result
, struct sadb_msg
*)->sadb_msg_len
=
2273 PFKEY_UNIT64(result
->m_pkthdr
.len
);
2275 return key_sendup_mbuf(NULL
, m
, KEY_SENDUP_REGISTERED
);
2284 * SADB_SPDFLUSH processing
2287 * from the user, and free all entries in secpctree.
2291 * NOTE: what to do is only marking SADB_SASTATE_DEAD.
2293 * m will always be freed.
2296 key_spdflush(so
, m
, mhp
)
2299 const struct sadb_msghdr
*mhp
;
2301 struct sadb_msg
*newmsg
;
2302 struct secpolicy
*sp
;
2306 if (so
== NULL
|| m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
)
2307 panic("key_spdflush: NULL pointer is passed.\n");
2309 if (m
->m_len
!= PFKEY_ALIGN8(sizeof(struct sadb_msg
)))
2310 return key_senderror(so
, m
, EINVAL
);
2312 for (dir
= 0; dir
< IPSEC_DIR_MAX
; dir
++) {
2313 LIST_FOREACH(sp
, &sptree
[dir
], chain
) {
2314 sp
->state
= IPSEC_SPSTATE_DEAD
;
2318 if (sizeof(struct sadb_msg
) > m
->m_len
+ M_TRAILINGSPACE(m
)) {
2319 ipseclog((LOG_DEBUG
, "key_spdflush: No more memory.\n"));
2320 return key_senderror(so
, m
, ENOBUFS
);
2326 m
->m_pkthdr
.len
= m
->m_len
= PFKEY_ALIGN8(sizeof(struct sadb_msg
));
2327 newmsg
= mtod(m
, struct sadb_msg
*);
2328 newmsg
->sadb_msg_errno
= 0;
2329 newmsg
->sadb_msg_len
= PFKEY_UNIT64(m
->m_pkthdr
.len
);
2331 return key_sendup_mbuf(so
, m
, KEY_SENDUP_ALL
);
2335 * SADB_SPDDUMP processing
2338 * from the user, and dump all SP leaves
2343 * m will always be freed.
2346 key_spddump(so
, m
, mhp
)
2349 const struct sadb_msghdr
*mhp
;
2351 struct secpolicy
*sp
;
2357 if (so
== NULL
|| m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
)
2358 panic("key_spddump: NULL pointer is passed.\n");
2360 /* search SPD entry and get buffer size. */
2362 for (dir
= 0; dir
< IPSEC_DIR_MAX
; dir
++) {
2363 LIST_FOREACH(sp
, &sptree
[dir
], chain
) {
2369 return key_senderror(so
, m
, ENOENT
);
2371 for (dir
= 0; dir
< IPSEC_DIR_MAX
; dir
++) {
2372 LIST_FOREACH(sp
, &sptree
[dir
], chain
) {
2374 n
= key_setdumpsp(sp
, SADB_X_SPDDUMP
, cnt
,
2375 mhp
->msg
->sadb_msg_pid
);
2378 key_sendup_mbuf(so
, n
, KEY_SENDUP_ONE
);
2386 static struct mbuf
*
2387 key_setdumpsp(sp
, type
, seq
, pid
)
2388 struct secpolicy
*sp
;
2392 struct mbuf
*result
= NULL
, *m
;
2394 m
= key_setsadbmsg(type
, 0, SADB_SATYPE_UNSPEC
, seq
, pid
, sp
->refcnt
);
2399 m
= key_setsadbaddr(SADB_EXT_ADDRESS_SRC
,
2400 (struct sockaddr
*)&sp
->spidx
.src
, sp
->spidx
.prefs
,
2401 sp
->spidx
.ul_proto
);
2406 m
= key_setsadbaddr(SADB_EXT_ADDRESS_DST
,
2407 (struct sockaddr
*)&sp
->spidx
.dst
, sp
->spidx
.prefd
,
2408 sp
->spidx
.ul_proto
);
2418 if ((result
->m_flags
& M_PKTHDR
) == 0)
2421 if (result
->m_len
< sizeof(struct sadb_msg
)) {
2422 result
= m_pullup(result
, sizeof(struct sadb_msg
));
2427 result
->m_pkthdr
.len
= 0;
2428 for (m
= result
; m
; m
= m
->m_next
)
2429 result
->m_pkthdr
.len
+= m
->m_len
;
2431 mtod(result
, struct sadb_msg
*)->sadb_msg_len
=
2432 PFKEY_UNIT64(result
->m_pkthdr
.len
);
2442 * get PFKEY message length for security policy and request.
2445 key_getspreqmsglen(sp
)
2446 struct secpolicy
*sp
;
2450 tlen
= sizeof(struct sadb_x_policy
);
2452 /* if is the policy for ipsec ? */
2453 if (sp
->policy
!= IPSEC_POLICY_IPSEC
)
2456 /* get length of ipsec requests */
2458 struct ipsecrequest
*isr
;
2461 for (isr
= sp
->req
; isr
!= NULL
; isr
= isr
->next
) {
2462 len
= sizeof(struct sadb_x_ipsecrequest
)
2463 + isr
->saidx
.src
.ss_len
2464 + isr
->saidx
.dst
.ss_len
;
2466 tlen
+= PFKEY_ALIGN8(len
);
2474 * SADB_SPDEXPIRE processing
2476 * <base, address(SD), lifetime(CH), policy>
2480 * others : error number
2484 struct secpolicy
*sp
;
2487 struct mbuf
*result
= NULL
, *m
;
2490 struct sadb_lifetime
*lt
;
2492 /* XXX: Why do we lock ? */
2493 s
= splnet(); /*called from softclock()*/
2497 panic("key_spdexpire: NULL pointer is passed.\n");
2499 /* set msg header */
2500 m
= key_setsadbmsg(SADB_X_SPDEXPIRE
, 0, 0, 0, 0, 0);
2507 /* create lifetime extension (current and hard) */
2508 len
= PFKEY_ALIGN8(sizeof(*lt
)) * 2;
2509 m
= key_alloc_mbuf(len
);
2510 if (!m
|| m
->m_next
) { /*XXX*/
2516 bzero(mtod(m
, caddr_t
), len
);
2517 lt
= mtod(m
, struct sadb_lifetime
*);
2518 lt
->sadb_lifetime_len
= PFKEY_UNIT64(sizeof(struct sadb_lifetime
));
2519 lt
->sadb_lifetime_exttype
= SADB_EXT_LIFETIME_CURRENT
;
2520 lt
->sadb_lifetime_allocations
= 0;
2521 lt
->sadb_lifetime_bytes
= 0;
2522 lt
->sadb_lifetime_addtime
= sp
->created
;
2523 lt
->sadb_lifetime_usetime
= sp
->lastused
;
2524 lt
= (struct sadb_lifetime
*)(mtod(m
, caddr_t
) + len
/ 2);
2525 lt
->sadb_lifetime_len
= PFKEY_UNIT64(sizeof(struct sadb_lifetime
));
2526 lt
->sadb_lifetime_exttype
= SADB_EXT_LIFETIME_HARD
;
2527 lt
->sadb_lifetime_allocations
= 0;
2528 lt
->sadb_lifetime_bytes
= 0;
2529 lt
->sadb_lifetime_addtime
= sp
->lifetime
;
2530 lt
->sadb_lifetime_usetime
= sp
->validtime
;
2533 /* set sadb_address for source */
2534 m
= key_setsadbaddr(SADB_EXT_ADDRESS_SRC
,
2535 (struct sockaddr
*)&sp
->spidx
.src
,
2536 sp
->spidx
.prefs
, sp
->spidx
.ul_proto
);
2543 /* set sadb_address for destination */
2544 m
= key_setsadbaddr(SADB_EXT_ADDRESS_DST
,
2545 (struct sockaddr
*)&sp
->spidx
.dst
,
2546 sp
->spidx
.prefd
, sp
->spidx
.ul_proto
);
2561 if ((result
->m_flags
& M_PKTHDR
) == 0) {
2566 if (result
->m_len
< sizeof(struct sadb_msg
)) {
2567 result
= m_pullup(result
, sizeof(struct sadb_msg
));
2568 if (result
== NULL
) {
2574 result
->m_pkthdr
.len
= 0;
2575 for (m
= result
; m
; m
= m
->m_next
)
2576 result
->m_pkthdr
.len
+= m
->m_len
;
2578 mtod(result
, struct sadb_msg
*)->sadb_msg_len
=
2579 PFKEY_UNIT64(result
->m_pkthdr
.len
);
2581 return key_sendup_mbuf(NULL
, result
, KEY_SENDUP_REGISTERED
);
2590 /* %%% SAD management */
2592 * allocating a memory for new SA head, and copy from the values of mhp.
2593 * OUT: NULL : failure due to the lack of memory.
2594 * others : pointer to new SA head.
2596 static struct secashead
*
2598 struct secasindex
*saidx
;
2600 struct secashead
*newsah
;
2604 panic("key_newsaidx: NULL pointer is passed.\n");
2606 newsah
= keydb_newsecashead();
2610 bcopy(saidx
, &newsah
->saidx
, sizeof(newsah
->saidx
));
2612 /* add to saidxtree */
2613 newsah
->state
= SADB_SASTATE_MATURE
;
2614 LIST_INSERT_HEAD(&sahtree
, newsah
, chain
);
2620 * delete SA index and all SA registerd.
2624 struct secashead
*sah
;
2626 struct secasvar
*sav
, *nextsav
;
2627 u_int stateidx
, state
;
2633 panic("key_delsah: NULL pointer is passed.\n");
2635 s
= splnet(); /*called from softclock()*/
2637 /* searching all SA registerd in the secindex. */
2639 stateidx
< _ARRAYLEN(saorder_state_any
);
2642 state
= saorder_state_any
[stateidx
];
2643 for (sav
= (struct secasvar
*)LIST_FIRST(&sah
->savtree
[state
]);
2647 nextsav
= LIST_NEXT(sav
, chain
);
2649 if (sav
->refcnt
> 0) {
2650 /* give up to delete this sa */
2656 KEY_CHKSASTATE(state
, sav
->state
, "key_delsah");
2660 /* remove back pointer */
2666 /* don't delete sah only if there are savs. */
2672 if (sah
->sa_route
.ro_rt
) {
2673 rtfree(sah
->sa_route
.ro_rt
);
2674 sah
->sa_route
.ro_rt
= (struct rtentry
*)NULL
;
2677 /* remove from tree of SA index */
2678 if (__LIST_CHAINED(sah
))
2679 LIST_REMOVE(sah
, chain
);
2688 * allocating a new SA with LARVAL state. key_add() and key_getspi() call,
2689 * and copy the values of mhp into new buffer.
2690 * When SAD message type is GETSPI:
2691 * to set sequence number from acq_seq++,
2692 * to set zero to SPI.
2693 * not to call key_setsava().
2695 * others : pointer to new secasvar.
2697 * does not modify mbuf. does not free mbuf on error.
2699 static struct secasvar
*
2700 key_newsav(m
, mhp
, sah
, errp
)
2702 const struct sadb_msghdr
*mhp
;
2703 struct secashead
*sah
;
2706 struct secasvar
*newsav
;
2707 const struct sadb_sa
*xsa
;
2710 if (m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
|| sah
== NULL
)
2711 panic("key_newsa: NULL pointer is passed.\n");
2713 KMALLOC(newsav
, struct secasvar
*, sizeof(struct secasvar
));
2714 if (newsav
== NULL
) {
2715 ipseclog((LOG_DEBUG
, "key_newsa: No more memory.\n"));
2719 bzero((caddr_t
)newsav
, sizeof(struct secasvar
));
2721 switch (mhp
->msg
->sadb_msg_type
) {
2725 #if IPSEC_DOSEQCHECK
2726 /* sync sequence number */
2727 if (mhp
->msg
->sadb_msg_seq
== 0)
2729 (acq_seq
= (acq_seq
== ~0 ? 1 : ++acq_seq
));
2732 newsav
->seq
= mhp
->msg
->sadb_msg_seq
;
2737 if (mhp
->ext
[SADB_EXT_SA
] == NULL
) {
2739 ipseclog((LOG_DEBUG
, "key_newsa: invalid message is passed.\n"));
2743 xsa
= (const struct sadb_sa
*)mhp
->ext
[SADB_EXT_SA
];
2744 newsav
->spi
= xsa
->sadb_sa_spi
;
2745 newsav
->seq
= mhp
->msg
->sadb_msg_seq
;
2753 /* copy sav values */
2754 if (mhp
->msg
->sadb_msg_type
!= SADB_GETSPI
) {
2755 *errp
= key_setsaval(newsav
, m
, mhp
);
2766 newsav
->created
= tv
.tv_sec
;
2769 newsav
->pid
= mhp
->msg
->sadb_msg_pid
;
2774 newsav
->state
= SADB_SASTATE_LARVAL
;
2775 LIST_INSERT_TAIL(&sah
->savtree
[SADB_SASTATE_LARVAL
], newsav
,
2782 * free() SA variable entry.
2786 struct secasvar
*sav
;
2790 panic("key_delsav: NULL pointer is passed.\n");
2792 if (sav
->refcnt
> 0)
2793 return; /* can't free */
2795 /* remove from SA header */
2796 if (__LIST_CHAINED(sav
))
2797 LIST_REMOVE(sav
, chain
);
2799 if (sav
->key_auth
!= NULL
) {
2800 bzero(_KEYBUF(sav
->key_auth
), _KEYLEN(sav
->key_auth
));
2801 KFREE(sav
->key_auth
);
2802 sav
->key_auth
= NULL
;
2804 if (sav
->key_enc
!= NULL
) {
2805 bzero(_KEYBUF(sav
->key_enc
), _KEYLEN(sav
->key_enc
));
2806 KFREE(sav
->key_enc
);
2807 sav
->key_enc
= NULL
;
2810 bzero(sav
->sched
, sav
->schedlen
);
2814 if (sav
->replay
!= NULL
) {
2815 keydb_delsecreplay(sav
->replay
);
2818 if (sav
->lft_c
!= NULL
) {
2822 if (sav
->lft_h
!= NULL
) {
2826 if (sav
->lft_s
!= NULL
) {
2830 if (sav
->iv
!= NULL
) {
2844 * others : found, pointer to a SA.
2846 static struct secashead
*
2848 struct secasindex
*saidx
;
2850 struct secashead
*sah
;
2852 LIST_FOREACH(sah
, &sahtree
, chain
) {
2853 if (sah
->state
== SADB_SASTATE_DEAD
)
2855 if (key_cmpsaidx(&sah
->saidx
, saidx
, CMP_REQID
))
2863 * check not to be duplicated SPI.
2864 * NOTE: this function is too slow due to searching all SAD.
2867 * others : found, pointer to a SA.
2869 static struct secasvar
*
2870 key_checkspidup(saidx
, spi
)
2871 struct secasindex
*saidx
;
2874 struct secashead
*sah
;
2875 struct secasvar
*sav
;
2877 /* check address family */
2878 if (saidx
->src
.ss_family
!= saidx
->dst
.ss_family
) {
2879 ipseclog((LOG_DEBUG
, "key_checkspidup: address family mismatched.\n"));
2884 LIST_FOREACH(sah
, &sahtree
, chain
) {
2885 if (!key_ismyaddr((struct sockaddr
*)&sah
->saidx
.dst
))
2887 sav
= key_getsavbyspi(sah
, spi
);
2896 * search SAD litmited alive SA, protocol, SPI.
2899 * others : found, pointer to a SA.
2901 static struct secasvar
*
2902 key_getsavbyspi(sah
, spi
)
2903 struct secashead
*sah
;
2906 struct secasvar
*sav
;
2907 u_int stateidx
, state
;
2909 /* search all status */
2911 stateidx
< _ARRAYLEN(saorder_state_alive
);
2914 state
= saorder_state_alive
[stateidx
];
2915 LIST_FOREACH(sav
, &sah
->savtree
[state
], chain
) {
2918 if (sav
->state
!= state
) {
2919 ipseclog((LOG_DEBUG
, "key_getsavbyspi: "
2920 "invalid sav->state (queue: %d SA: %d)\n",
2921 state
, sav
->state
));
2925 if (sav
->spi
== spi
)
2934 * copy SA values from PF_KEY message except *SPI, SEQ, PID, STATE and TYPE*.
2935 * You must update these if need.
2939 * does not modify mbuf. does not free mbuf on error.
2942 key_setsaval(sav
, m
, mhp
)
2943 struct secasvar
*sav
;
2945 const struct sadb_msghdr
*mhp
;
2948 const struct esp_algorithm
*algo
;
2954 if (m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
)
2955 panic("key_setsaval: NULL pointer is passed.\n");
2957 /* initialization */
2959 sav
->key_auth
= NULL
;
2960 sav
->key_enc
= NULL
;
2967 sav
->remote_ike_port
= 0;
2968 sav
->natt_last_activity
= natt_now
;
2971 if (mhp
->ext
[SADB_EXT_SA
] != NULL
) {
2972 const struct sadb_sa
*sa0
;
2974 sa0
= (const struct sadb_sa
*)mhp
->ext
[SADB_EXT_SA
];
2975 if (mhp
->extlen
[SADB_EXT_SA
] < sizeof(*sa0
)) {
2980 sav
->alg_auth
= sa0
->sadb_sa_auth
;
2981 sav
->alg_enc
= sa0
->sadb_sa_encrypt
;
2982 sav
->flags
= sa0
->sadb_sa_flags
;
2985 * Verify that a nat-traversal port was specified if
2986 * the nat-traversal flag is set.
2988 if ((sav
->flags
& SADB_X_EXT_NATT
) != 0) {
2989 if (mhp
->extlen
[SADB_EXT_SA
] < sizeof(struct sadb_sa_2
) ||
2990 ((struct sadb_sa_2
*)(sa0
))->sadb_sa_natt_port
== 0) {
2994 sav
->remote_ike_port
= ((struct sadb_sa_2
*)(sa0
))->sadb_sa_natt_port
;
2998 if ((sa0
->sadb_sa_flags
& SADB_X_EXT_OLD
) == 0) {
2999 sav
->replay
= keydb_newsecreplay(sa0
->sadb_sa_replay
);
3000 if (sav
->replay
== NULL
) {
3001 ipseclog((LOG_DEBUG
, "key_setsaval: No more memory.\n"));
3008 /* Authentication keys */
3009 if (mhp
->ext
[SADB_EXT_KEY_AUTH
] != NULL
) {
3010 const struct sadb_key
*key0
;
3013 key0
= (const struct sadb_key
*)mhp
->ext
[SADB_EXT_KEY_AUTH
];
3014 len
= mhp
->extlen
[SADB_EXT_KEY_AUTH
];
3017 if (len
< sizeof(*key0
)) {
3021 switch (mhp
->msg
->sadb_msg_satype
) {
3022 case SADB_SATYPE_AH
:
3023 case SADB_SATYPE_ESP
:
3024 if (len
== PFKEY_ALIGN8(sizeof(struct sadb_key
)) &&
3025 sav
->alg_auth
!= SADB_X_AALG_NULL
)
3028 case SADB_X_SATYPE_IPCOMP
:
3034 ipseclog((LOG_DEBUG
, "key_setsaval: invalid key_auth values.\n"));
3038 sav
->key_auth
= (struct sadb_key
*)key_newbuf(key0
, len
);
3039 if (sav
->key_auth
== NULL
) {
3040 ipseclog((LOG_DEBUG
, "key_setsaval: No more memory.\n"));
3046 /* Encryption key */
3047 if (mhp
->ext
[SADB_EXT_KEY_ENCRYPT
] != NULL
) {
3048 const struct sadb_key
*key0
;
3051 key0
= (const struct sadb_key
*)mhp
->ext
[SADB_EXT_KEY_ENCRYPT
];
3052 len
= mhp
->extlen
[SADB_EXT_KEY_ENCRYPT
];
3055 if (len
< sizeof(*key0
)) {
3059 switch (mhp
->msg
->sadb_msg_satype
) {
3060 case SADB_SATYPE_ESP
:
3061 if (len
== PFKEY_ALIGN8(sizeof(struct sadb_key
)) &&
3062 sav
->alg_enc
!= SADB_EALG_NULL
) {
3066 sav
->key_enc
= (struct sadb_key
*)key_newbuf(key0
, len
);
3067 if (sav
->key_enc
== NULL
) {
3068 ipseclog((LOG_DEBUG
, "key_setsaval: No more memory.\n"));
3073 case SADB_X_SATYPE_IPCOMP
:
3074 if (len
!= PFKEY_ALIGN8(sizeof(struct sadb_key
)))
3076 sav
->key_enc
= NULL
; /*just in case*/
3078 case SADB_SATYPE_AH
:
3084 ipseclog((LOG_DEBUG
, "key_setsatval: invalid key_enc value.\n"));
3092 switch (mhp
->msg
->sadb_msg_satype
) {
3093 case SADB_SATYPE_ESP
:
3095 algo
= esp_algorithm_lookup(sav
->alg_enc
);
3096 if (algo
&& algo
->ivlen
)
3097 sav
->ivlen
= (*algo
->ivlen
)(algo
, sav
);
3098 if (sav
->ivlen
== 0)
3100 KMALLOC(sav
->iv
, caddr_t
, sav
->ivlen
);
3102 ipseclog((LOG_DEBUG
, "key_setsaval: No more memory.\n"));
3108 key_randomfill(sav
->iv
, sav
->ivlen
);
3111 case SADB_SATYPE_AH
:
3112 case SADB_X_SATYPE_IPCOMP
:
3115 ipseclog((LOG_DEBUG
, "key_setsaval: invalid SA type.\n"));
3122 sav
->created
= tv
.tv_sec
;
3124 /* make lifetime for CURRENT */
3125 KMALLOC(sav
->lft_c
, struct sadb_lifetime
*,
3126 sizeof(struct sadb_lifetime
));
3127 if (sav
->lft_c
== NULL
) {
3128 ipseclog((LOG_DEBUG
, "key_setsaval: No more memory.\n"));
3135 sav
->lft_c
->sadb_lifetime_len
=
3136 PFKEY_UNIT64(sizeof(struct sadb_lifetime
));
3137 sav
->lft_c
->sadb_lifetime_exttype
= SADB_EXT_LIFETIME_CURRENT
;
3138 sav
->lft_c
->sadb_lifetime_allocations
= 0;
3139 sav
->lft_c
->sadb_lifetime_bytes
= 0;
3140 sav
->lft_c
->sadb_lifetime_addtime
= tv
.tv_sec
;
3141 sav
->lft_c
->sadb_lifetime_usetime
= 0;
3143 /* lifetimes for HARD and SOFT */
3145 const struct sadb_lifetime
*lft0
;
3147 lft0
= (struct sadb_lifetime
*)mhp
->ext
[SADB_EXT_LIFETIME_HARD
];
3149 if (mhp
->extlen
[SADB_EXT_LIFETIME_HARD
] < sizeof(*lft0
)) {
3153 sav
->lft_h
= (struct sadb_lifetime
*)key_newbuf(lft0
,
3155 if (sav
->lft_h
== NULL
) {
3156 ipseclog((LOG_DEBUG
, "key_setsaval: No more memory.\n"));
3160 /* to be initialize ? */
3163 lft0
= (struct sadb_lifetime
*)mhp
->ext
[SADB_EXT_LIFETIME_SOFT
];
3165 if (mhp
->extlen
[SADB_EXT_LIFETIME_SOFT
] < sizeof(*lft0
)) {
3169 sav
->lft_s
= (struct sadb_lifetime
*)key_newbuf(lft0
,
3171 if (sav
->lft_s
== NULL
) {
3172 ipseclog((LOG_DEBUG
, "key_setsaval: No more memory.\n"));
3176 /* to be initialize ? */
3183 /* initialization */
3184 if (sav
->replay
!= NULL
) {
3185 keydb_delsecreplay(sav
->replay
);
3188 if (sav
->key_auth
!= NULL
) {
3189 bzero(_KEYBUF(sav
->key_auth
), _KEYLEN(sav
->key_auth
));
3190 KFREE(sav
->key_auth
);
3191 sav
->key_auth
= NULL
;
3193 if (sav
->key_enc
!= NULL
) {
3194 bzero(_KEYBUF(sav
->key_enc
), _KEYLEN(sav
->key_enc
));
3195 KFREE(sav
->key_enc
);
3196 sav
->key_enc
= NULL
;
3199 bzero(sav
->sched
, sav
->schedlen
);
3203 if (sav
->iv
!= NULL
) {
3207 if (sav
->lft_c
!= NULL
) {
3211 if (sav
->lft_h
!= NULL
) {
3215 if (sav
->lft_s
!= NULL
) {
3224 * validation with a secasvar entry, and set SADB_SATYPE_MATURE.
3230 struct secasvar
*sav
;
3233 int checkmask
= 0; /* 2^0: ealg 2^1: aalg 2^2: calg */
3234 int mustmask
= 0; /* 2^0: ealg 2^1: aalg 2^2: calg */
3238 /* check SPI value */
3239 switch (sav
->sah
->saidx
.proto
) {
3242 if (ntohl(sav
->spi
) >= 0 && ntohl(sav
->spi
) <= 255) {
3243 ipseclog((LOG_DEBUG
,
3244 "key_mature: illegal range of SPI %u.\n",
3245 (u_int32_t
)ntohl(sav
->spi
)));
3252 switch (sav
->sah
->saidx
.proto
) {
3255 if ((sav
->flags
& SADB_X_EXT_OLD
)
3256 && (sav
->flags
& SADB_X_EXT_DERIV
)) {
3257 ipseclog((LOG_DEBUG
, "key_mature: "
3258 "invalid flag (derived) given to old-esp.\n"));
3261 if (sav
->alg_auth
== SADB_AALG_NONE
)
3269 if (sav
->flags
& SADB_X_EXT_DERIV
) {
3270 ipseclog((LOG_DEBUG
, "key_mature: "
3271 "invalid flag (derived) given to AH SA.\n"));
3274 if (sav
->alg_enc
!= SADB_EALG_NONE
) {
3275 ipseclog((LOG_DEBUG
, "key_mature: "
3276 "protocol and algorithm mismated.\n"));
3282 case IPPROTO_IPCOMP
:
3283 if (sav
->alg_auth
!= SADB_AALG_NONE
) {
3284 ipseclog((LOG_DEBUG
, "key_mature: "
3285 "protocol and algorithm mismated.\n"));
3288 if ((sav
->flags
& SADB_X_EXT_RAWCPI
) == 0
3289 && ntohl(sav
->spi
) >= 0x10000) {
3290 ipseclog((LOG_DEBUG
, "key_mature: invalid cpi for IPComp.\n"));
3297 ipseclog((LOG_DEBUG
, "key_mature: Invalid satype.\n"));
3298 return EPROTONOSUPPORT
;
3301 /* check authentication algorithm */
3302 if ((checkmask
& 2) != 0) {
3303 const struct ah_algorithm
*algo
;
3306 algo
= ah_algorithm_lookup(sav
->alg_auth
);
3308 ipseclog((LOG_DEBUG
,"key_mature: "
3309 "unknown authentication algorithm.\n"));
3313 /* algorithm-dependent check */
3315 keylen
= sav
->key_auth
->sadb_key_bits
;
3318 if (keylen
< algo
->keymin
|| algo
->keymax
< keylen
) {
3319 ipseclog((LOG_DEBUG
,
3320 "key_mature: invalid AH key length %d "
3321 "(%d-%d allowed)\n",
3322 keylen
, algo
->keymin
, algo
->keymax
));
3327 if ((*algo
->mature
)(sav
)) {
3328 /* message generated in per-algorithm function*/
3331 mature
= SADB_SATYPE_AH
;
3334 if ((mustmask
& 2) != 0 && mature
!= SADB_SATYPE_AH
) {
3335 ipseclog((LOG_DEBUG
, "key_mature: no satisfy algorithm for AH\n"));
3340 /* check encryption algorithm */
3341 if ((checkmask
& 1) != 0) {
3343 const struct esp_algorithm
*algo
;
3346 algo
= esp_algorithm_lookup(sav
->alg_enc
);
3348 ipseclog((LOG_DEBUG
, "key_mature: unknown encryption algorithm.\n"));
3352 /* algorithm-dependent check */
3354 keylen
= sav
->key_enc
->sadb_key_bits
;
3357 if (keylen
< algo
->keymin
|| algo
->keymax
< keylen
) {
3358 ipseclog((LOG_DEBUG
,
3359 "key_mature: invalid ESP key length %d "
3360 "(%d-%d allowed)\n",
3361 keylen
, algo
->keymin
, algo
->keymax
));
3366 if ((*algo
->mature
)(sav
)) {
3367 /* message generated in per-algorithm function*/
3370 mature
= SADB_SATYPE_ESP
;
3373 if ((mustmask
& 1) != 0 && mature
!= SADB_SATYPE_ESP
) {
3374 ipseclog((LOG_DEBUG
, "key_mature: no satisfy algorithm for ESP\n"));
3378 ipseclog((LOG_DEBUG
, "key_mature: ESP not supported in this configuration\n"));
3383 /* check compression algorithm */
3384 if ((checkmask
& 4) != 0) {
3385 const struct ipcomp_algorithm
*algo
;
3387 /* algorithm-dependent check */
3388 algo
= ipcomp_algorithm_lookup(sav
->alg_enc
);
3390 ipseclog((LOG_DEBUG
, "key_mature: unknown compression algorithm.\n"));
3395 key_sa_chgstate(sav
, SADB_SASTATE_MATURE
);
3401 * subroutine for SADB_GET and SADB_DUMP.
3403 static struct mbuf
*
3404 key_setdumpsa(sav
, type
, satype
, seq
, pid
)
3405 struct secasvar
*sav
;
3406 u_int8_t type
, satype
;
3409 struct mbuf
*result
= NULL
, *tres
= NULL
, *m
;
3414 SADB_EXT_SA
, SADB_X_EXT_SA2
,
3415 SADB_EXT_LIFETIME_HARD
, SADB_EXT_LIFETIME_SOFT
,
3416 SADB_EXT_LIFETIME_CURRENT
, SADB_EXT_ADDRESS_SRC
,
3417 SADB_EXT_ADDRESS_DST
, SADB_EXT_ADDRESS_PROXY
, SADB_EXT_KEY_AUTH
,
3418 SADB_EXT_KEY_ENCRYPT
, SADB_EXT_IDENTITY_SRC
,
3419 SADB_EXT_IDENTITY_DST
, SADB_EXT_SENSITIVITY
,
3422 m
= key_setsadbmsg(type
, 0, satype
, seq
, pid
, sav
->refcnt
);
3427 for (i
= sizeof(dumporder
)/sizeof(dumporder
[0]) - 1; i
>= 0; i
--) {
3430 switch (dumporder
[i
]) {
3432 m
= key_setsadbsa(sav
);
3437 case SADB_X_EXT_SA2
:
3438 m
= key_setsadbxsa2(sav
->sah
->saidx
.mode
,
3439 sav
->replay
? sav
->replay
->count
: 0,
3440 sav
->sah
->saidx
.reqid
);
3445 case SADB_EXT_ADDRESS_SRC
:
3446 m
= key_setsadbaddr(SADB_EXT_ADDRESS_SRC
,
3447 (struct sockaddr
*)&sav
->sah
->saidx
.src
,
3448 FULLMASK
, IPSEC_ULPROTO_ANY
);
3453 case SADB_EXT_ADDRESS_DST
:
3454 m
= key_setsadbaddr(SADB_EXT_ADDRESS_DST
,
3455 (struct sockaddr
*)&sav
->sah
->saidx
.dst
,
3456 FULLMASK
, IPSEC_ULPROTO_ANY
);
3461 case SADB_EXT_KEY_AUTH
:
3464 l
= PFKEY_UNUNIT64(sav
->key_auth
->sadb_key_len
);
3468 case SADB_EXT_KEY_ENCRYPT
:
3471 l
= PFKEY_UNUNIT64(sav
->key_enc
->sadb_key_len
);
3475 case SADB_EXT_LIFETIME_CURRENT
:
3478 l
= PFKEY_UNUNIT64(((struct sadb_ext
*)sav
->lft_c
)->sadb_ext_len
);
3482 case SADB_EXT_LIFETIME_HARD
:
3485 l
= PFKEY_UNUNIT64(((struct sadb_ext
*)sav
->lft_h
)->sadb_ext_len
);
3489 case SADB_EXT_LIFETIME_SOFT
:
3492 l
= PFKEY_UNUNIT64(((struct sadb_ext
*)sav
->lft_s
)->sadb_ext_len
);
3496 case SADB_EXT_ADDRESS_PROXY
:
3497 case SADB_EXT_IDENTITY_SRC
:
3498 case SADB_EXT_IDENTITY_DST
:
3499 /* XXX: should we brought from SPD ? */
3500 case SADB_EXT_SENSITIVITY
:
3505 if ((!m
&& !p
) || (m
&& p
))
3508 M_PREPEND(tres
, l
, M_DONTWAIT
);
3511 bcopy(p
, mtod(tres
, caddr_t
), l
);
3515 m
= key_alloc_mbuf(l
);
3518 m_copyback(m
, 0, l
, p
);
3526 m_cat(result
, tres
);
3528 if (result
->m_len
< sizeof(struct sadb_msg
)) {
3529 result
= m_pullup(result
, sizeof(struct sadb_msg
));
3534 result
->m_pkthdr
.len
= 0;
3535 for (m
= result
; m
; m
= m
->m_next
)
3536 result
->m_pkthdr
.len
+= m
->m_len
;
3538 mtod(result
, struct sadb_msg
*)->sadb_msg_len
=
3539 PFKEY_UNIT64(result
->m_pkthdr
.len
);
3550 * set data into sadb_msg.
3552 static struct mbuf
*
3553 key_setsadbmsg(type
, tlen
, satype
, seq
, pid
, reserved
)
3554 u_int8_t type
, satype
;
3564 len
= PFKEY_ALIGN8(sizeof(struct sadb_msg
));
3567 MGETHDR(m
, M_DONTWAIT
, MT_DATA
);
3568 if (m
&& len
> MHLEN
) {
3569 MCLGET(m
, M_DONTWAIT
);
3570 if ((m
->m_flags
& M_EXT
) == 0) {
3577 m
->m_pkthdr
.len
= m
->m_len
= len
;
3580 p
= mtod(m
, struct sadb_msg
*);
3583 p
->sadb_msg_version
= PF_KEY_V2
;
3584 p
->sadb_msg_type
= type
;
3585 p
->sadb_msg_errno
= 0;
3586 p
->sadb_msg_satype
= satype
;
3587 p
->sadb_msg_len
= PFKEY_UNIT64(tlen
);
3588 p
->sadb_msg_reserved
= reserved
;
3589 p
->sadb_msg_seq
= seq
;
3590 p
->sadb_msg_pid
= (u_int32_t
)pid
;
3596 * copy secasvar data into sadb_address.
3598 static struct mbuf
*
3600 struct secasvar
*sav
;
3606 len
= PFKEY_ALIGN8(sizeof(struct sadb_sa
));
3607 m
= key_alloc_mbuf(len
);
3608 if (!m
|| m
->m_next
) { /*XXX*/
3614 p
= mtod(m
, struct sadb_sa
*);
3617 p
->sadb_sa_len
= PFKEY_UNIT64(len
);
3618 p
->sadb_sa_exttype
= SADB_EXT_SA
;
3619 p
->sadb_sa_spi
= sav
->spi
;
3620 p
->sadb_sa_replay
= (sav
->replay
!= NULL
? sav
->replay
->wsize
: 0);
3621 p
->sadb_sa_state
= sav
->state
;
3622 p
->sadb_sa_auth
= sav
->alg_auth
;
3623 p
->sadb_sa_encrypt
= sav
->alg_enc
;
3624 p
->sadb_sa_flags
= sav
->flags
;
3630 * set data into sadb_address.
3632 static struct mbuf
*
3633 key_setsadbaddr(exttype
, saddr
, prefixlen
, ul_proto
)
3635 struct sockaddr
*saddr
;
3640 struct sadb_address
*p
;
3643 len
= PFKEY_ALIGN8(sizeof(struct sadb_address
)) +
3644 PFKEY_ALIGN8(saddr
->sa_len
);
3645 m
= key_alloc_mbuf(len
);
3646 if (!m
|| m
->m_next
) { /*XXX*/
3652 p
= mtod(m
, struct sadb_address
*);
3655 p
->sadb_address_len
= PFKEY_UNIT64(len
);
3656 p
->sadb_address_exttype
= exttype
;
3657 p
->sadb_address_proto
= ul_proto
;
3658 if (prefixlen
== FULLMASK
) {
3659 switch (saddr
->sa_family
) {
3661 prefixlen
= sizeof(struct in_addr
) << 3;
3664 prefixlen
= sizeof(struct in6_addr
) << 3;
3670 p
->sadb_address_prefixlen
= prefixlen
;
3671 p
->sadb_address_reserved
= 0;
3674 mtod(m
, caddr_t
) + PFKEY_ALIGN8(sizeof(struct sadb_address
)),
3682 * set data into sadb_ident.
3684 static struct mbuf
*
3685 key_setsadbident(exttype
, idtype
, string
, stringlen
, id
)
3686 u_int16_t exttype
, idtype
;
3692 struct sadb_ident
*p
;
3695 len
= PFKEY_ALIGN8(sizeof(struct sadb_ident
)) + PFKEY_ALIGN8(stringlen
);
3696 m
= key_alloc_mbuf(len
);
3697 if (!m
|| m
->m_next
) { /*XXX*/
3703 p
= mtod(m
, struct sadb_ident
*);
3706 p
->sadb_ident_len
= PFKEY_UNIT64(len
);
3707 p
->sadb_ident_exttype
= exttype
;
3708 p
->sadb_ident_type
= idtype
;
3709 p
->sadb_ident_reserved
= 0;
3710 p
->sadb_ident_id
= id
;
3713 mtod(m
, caddr_t
) + PFKEY_ALIGN8(sizeof(struct sadb_ident
)),
3721 * set data into sadb_x_sa2.
3723 static struct mbuf
*
3724 key_setsadbxsa2(mode
, seq
, reqid
)
3726 u_int32_t seq
, reqid
;
3729 struct sadb_x_sa2
*p
;
3732 len
= PFKEY_ALIGN8(sizeof(struct sadb_x_sa2
));
3733 m
= key_alloc_mbuf(len
);
3734 if (!m
|| m
->m_next
) { /*XXX*/
3740 p
= mtod(m
, struct sadb_x_sa2
*);
3743 p
->sadb_x_sa2_len
= PFKEY_UNIT64(len
);
3744 p
->sadb_x_sa2_exttype
= SADB_X_EXT_SA2
;
3745 p
->sadb_x_sa2_mode
= mode
;
3746 p
->sadb_x_sa2_reserved1
= 0;
3747 p
->sadb_x_sa2_reserved2
= 0;
3748 p
->sadb_x_sa2_sequence
= seq
;
3749 p
->sadb_x_sa2_reqid
= reqid
;
3755 * set data into sadb_x_policy
3757 static struct mbuf
*
3758 key_setsadbxpolicy(type
, dir
, id
)
3764 struct sadb_x_policy
*p
;
3767 len
= PFKEY_ALIGN8(sizeof(struct sadb_x_policy
));
3768 m
= key_alloc_mbuf(len
);
3769 if (!m
|| m
->m_next
) { /*XXX*/
3775 p
= mtod(m
, struct sadb_x_policy
*);
3778 p
->sadb_x_policy_len
= PFKEY_UNIT64(len
);
3779 p
->sadb_x_policy_exttype
= SADB_X_EXT_POLICY
;
3780 p
->sadb_x_policy_type
= type
;
3781 p
->sadb_x_policy_dir
= dir
;
3782 p
->sadb_x_policy_id
= id
;
3789 * copy a buffer into the new buffer allocated.
3792 key_newbuf(src
, len
)
3798 KMALLOC(new, caddr_t
, len
);
3800 ipseclog((LOG_DEBUG
, "key_newbuf: No more memory.\n"));
3803 bcopy(src
, new, len
);
3808 /* compare my own address
3809 * OUT: 1: true, i.e. my address.
3814 struct sockaddr
*sa
;
3817 struct sockaddr_in
*sin
;
3818 struct in_ifaddr
*ia
;
3823 panic("key_ismyaddr: NULL pointer is passed.\n");
3825 switch (sa
->sa_family
) {
3828 sin
= (struct sockaddr_in
*)sa
;
3829 for (ia
= in_ifaddrhead
.tqh_first
; ia
;
3830 ia
= ia
->ia_link
.tqe_next
)
3832 if (sin
->sin_family
== ia
->ia_addr
.sin_family
&&
3833 sin
->sin_len
== ia
->ia_addr
.sin_len
&&
3834 sin
->sin_addr
.s_addr
== ia
->ia_addr
.sin_addr
.s_addr
)
3843 return key_ismyaddr6((struct sockaddr_in6
*)sa
);
3852 * compare my own address for IPv6.
3855 * NOTE: derived ip6_input() in KAME. This is necessary to modify more.
3857 #include <netinet6/in6_var.h>
3861 struct sockaddr_in6
*sin6
;
3863 struct in6_ifaddr
*ia
;
3864 struct in6_multi
*in6m
;
3866 for (ia
= in6_ifaddr
; ia
; ia
= ia
->ia_next
) {
3867 if (key_sockaddrcmp((struct sockaddr
*)&sin6
,
3868 (struct sockaddr
*)&ia
->ia_addr
, 0) == 0)
3873 * XXX why do we care about multlicast here while we don't care
3874 * about IPv4 multicast??
3878 IN6_LOOKUP_MULTI(sin6
->sin6_addr
, ia
->ia_ifp
, in6m
);
3883 /* loopback, just for safety */
3884 if (IN6_IS_ADDR_LOOPBACK(&sin6
->sin6_addr
))
3892 * compare two secasindex structure.
3893 * flag can specify to compare 2 saidxes.
3894 * compare two secasindex structure without both mode and reqid.
3895 * don't compare port.
3897 * saidx0: source, it can be in SAD.
3904 key_cmpsaidx(saidx0
, saidx1
, flag
)
3905 struct secasindex
*saidx0
, *saidx1
;
3909 if (saidx0
== NULL
&& saidx1
== NULL
)
3912 if (saidx0
== NULL
|| saidx1
== NULL
)
3915 if (saidx0
->proto
!= saidx1
->proto
)
3918 if (flag
== CMP_EXACTLY
) {
3919 if (saidx0
->mode
!= saidx1
->mode
)
3921 if (saidx0
->reqid
!= saidx1
->reqid
)
3923 if (bcmp(&saidx0
->src
, &saidx1
->src
, saidx0
->src
.ss_len
) != 0 ||
3924 bcmp(&saidx0
->dst
, &saidx1
->dst
, saidx0
->dst
.ss_len
) != 0)
3928 /* CMP_MODE_REQID, CMP_REQID, CMP_HEAD */
3929 if (flag
== CMP_MODE_REQID
3930 ||flag
== CMP_REQID
) {
3932 * If reqid of SPD is non-zero, unique SA is required.
3933 * The result must be of same reqid in this case.
3935 if (saidx1
->reqid
!= 0 && saidx0
->reqid
!= saidx1
->reqid
)
3939 if (flag
== CMP_MODE_REQID
) {
3940 if (saidx0
->mode
!= IPSEC_MODE_ANY
3941 && saidx0
->mode
!= saidx1
->mode
)
3945 if (key_sockaddrcmp((struct sockaddr
*)&saidx0
->src
,
3946 (struct sockaddr
*)&saidx1
->src
, 0) != 0) {
3949 if (key_sockaddrcmp((struct sockaddr
*)&saidx0
->dst
,
3950 (struct sockaddr
*)&saidx1
->dst
, 0) != 0) {
3959 * compare two secindex structure exactly.
3961 * spidx0: source, it is often in SPD.
3962 * spidx1: object, it is often from PFKEY message.
3968 key_cmpspidx_exactly(spidx0
, spidx1
)
3969 struct secpolicyindex
*spidx0
, *spidx1
;
3972 if (spidx0
== NULL
&& spidx1
== NULL
)
3975 if (spidx0
== NULL
|| spidx1
== NULL
)
3978 if (spidx0
->prefs
!= spidx1
->prefs
3979 || spidx0
->prefd
!= spidx1
->prefd
3980 || spidx0
->ul_proto
!= spidx1
->ul_proto
)
3983 if (key_sockaddrcmp((struct sockaddr
*)&spidx0
->src
,
3984 (struct sockaddr
*)&spidx1
->src
, 1) != 0) {
3987 if (key_sockaddrcmp((struct sockaddr
*)&spidx0
->dst
,
3988 (struct sockaddr
*)&spidx1
->dst
, 1) != 0) {
3996 * compare two secindex structure with mask.
3998 * spidx0: source, it is often in SPD.
3999 * spidx1: object, it is often from IP header.
4005 key_cmpspidx_withmask(spidx0
, spidx1
)
4006 struct secpolicyindex
*spidx0
, *spidx1
;
4009 if (spidx0
== NULL
&& spidx1
== NULL
)
4012 if (spidx0
== NULL
|| spidx1
== NULL
)
4015 if (spidx0
->src
.ss_family
!= spidx1
->src
.ss_family
||
4016 spidx0
->dst
.ss_family
!= spidx1
->dst
.ss_family
||
4017 spidx0
->src
.ss_len
!= spidx1
->src
.ss_len
||
4018 spidx0
->dst
.ss_len
!= spidx1
->dst
.ss_len
)
4021 /* if spidx.ul_proto == IPSEC_ULPROTO_ANY, ignore. */
4022 if (spidx0
->ul_proto
!= (u_int16_t
)IPSEC_ULPROTO_ANY
4023 && spidx0
->ul_proto
!= spidx1
->ul_proto
)
4026 switch (spidx0
->src
.ss_family
) {
4028 if (satosin(&spidx0
->src
)->sin_port
!= IPSEC_PORT_ANY
4029 && satosin(&spidx0
->src
)->sin_port
!=
4030 satosin(&spidx1
->src
)->sin_port
)
4032 if (!key_bbcmp((caddr_t
)&satosin(&spidx0
->src
)->sin_addr
,
4033 (caddr_t
)&satosin(&spidx1
->src
)->sin_addr
, spidx0
->prefs
))
4037 if (satosin6(&spidx0
->src
)->sin6_port
!= IPSEC_PORT_ANY
4038 && satosin6(&spidx0
->src
)->sin6_port
!=
4039 satosin6(&spidx1
->src
)->sin6_port
)
4042 * scope_id check. if sin6_scope_id is 0, we regard it
4043 * as a wildcard scope, which matches any scope zone ID.
4045 if (satosin6(&spidx0
->src
)->sin6_scope_id
&&
4046 satosin6(&spidx1
->src
)->sin6_scope_id
&&
4047 satosin6(&spidx0
->src
)->sin6_scope_id
!=
4048 satosin6(&spidx1
->src
)->sin6_scope_id
)
4050 if (!key_bbcmp((caddr_t
)&satosin6(&spidx0
->src
)->sin6_addr
,
4051 (caddr_t
)&satosin6(&spidx1
->src
)->sin6_addr
, spidx0
->prefs
))
4056 if (bcmp(&spidx0
->src
, &spidx1
->src
, spidx0
->src
.ss_len
) != 0)
4061 switch (spidx0
->dst
.ss_family
) {
4063 if (satosin(&spidx0
->dst
)->sin_port
!= IPSEC_PORT_ANY
4064 && satosin(&spidx0
->dst
)->sin_port
!=
4065 satosin(&spidx1
->dst
)->sin_port
)
4067 if (!key_bbcmp((caddr_t
)&satosin(&spidx0
->dst
)->sin_addr
,
4068 (caddr_t
)&satosin(&spidx1
->dst
)->sin_addr
, spidx0
->prefd
))
4072 if (satosin6(&spidx0
->dst
)->sin6_port
!= IPSEC_PORT_ANY
4073 && satosin6(&spidx0
->dst
)->sin6_port
!=
4074 satosin6(&spidx1
->dst
)->sin6_port
)
4077 * scope_id check. if sin6_scope_id is 0, we regard it
4078 * as a wildcard scope, which matches any scope zone ID.
4080 if (satosin6(&spidx0
->src
)->sin6_scope_id
&&
4081 satosin6(&spidx1
->src
)->sin6_scope_id
&&
4082 satosin6(&spidx0
->dst
)->sin6_scope_id
!=
4083 satosin6(&spidx1
->dst
)->sin6_scope_id
)
4085 if (!key_bbcmp((caddr_t
)&satosin6(&spidx0
->dst
)->sin6_addr
,
4086 (caddr_t
)&satosin6(&spidx1
->dst
)->sin6_addr
, spidx0
->prefd
))
4091 if (bcmp(&spidx0
->dst
, &spidx1
->dst
, spidx0
->dst
.ss_len
) != 0)
4096 /* XXX Do we check other field ? e.g. flowinfo */
4101 /* returns 0 on match */
4103 key_sockaddrcmp(sa1
, sa2
, port
)
4104 struct sockaddr
*sa1
;
4105 struct sockaddr
*sa2
;
4108 if (sa1
->sa_family
!= sa2
->sa_family
|| sa1
->sa_len
!= sa2
->sa_len
)
4111 switch (sa1
->sa_family
) {
4113 if (sa1
->sa_len
!= sizeof(struct sockaddr_in
))
4115 if (satosin(sa1
)->sin_addr
.s_addr
!=
4116 satosin(sa2
)->sin_addr
.s_addr
) {
4119 if (port
&& satosin(sa1
)->sin_port
!= satosin(sa2
)->sin_port
)
4123 if (sa1
->sa_len
!= sizeof(struct sockaddr_in6
))
4124 return 1; /*EINVAL*/
4125 if (satosin6(sa1
)->sin6_scope_id
!=
4126 satosin6(sa2
)->sin6_scope_id
) {
4129 if (!IN6_ARE_ADDR_EQUAL(&satosin6(sa1
)->sin6_addr
,
4130 &satosin6(sa2
)->sin6_addr
)) {
4134 satosin6(sa1
)->sin6_port
!= satosin6(sa2
)->sin6_port
) {
4138 if (bcmp(sa1
, sa2
, sa1
->sa_len
) != 0)
4147 * compare two buffers with mask.
4151 * bits: Number of bits to compare
4157 key_bbcmp(p1
, p2
, bits
)
4163 /* XXX: This could be considerably faster if we compare a word
4164 * at a time, but it is complicated on LSB Endian machines */
4166 /* Handle null pointers */
4167 if (p1
== NULL
|| p2
== NULL
)
4177 mask
= ~((1<<(8-bits
))-1);
4178 if ((*p1
& mask
) != (*p2
& mask
))
4181 return 1; /* Match! */
4186 * scanning SPD and SAD to check status for each entries,
4187 * and do to remove or to expire.
4188 * XXX: year 2038 problem may remain.
4191 key_timehandler_funnel(void)
4194 boolean_t funnel_state
;
4195 funnel_state
= thread_funnel_set(network_flock
, TRUE
);
4199 (void) thread_funnel_set(network_flock
, FALSE
);
4204 key_timehandler(void)
4212 s
= splnet(); /*called from softclock()*/
4216 struct secpolicy
*sp
, *nextsp
;
4218 for (dir
= 0; dir
< IPSEC_DIR_MAX
; dir
++) {
4219 for (sp
= LIST_FIRST(&sptree
[dir
]);
4223 nextsp
= LIST_NEXT(sp
, chain
);
4225 if (sp
->state
== IPSEC_SPSTATE_DEAD
) {
4230 if (sp
->lifetime
== 0 && sp
->validtime
== 0)
4233 /* the deletion will occur next time */
4235 && tv
.tv_sec
- sp
->created
> sp
->lifetime
)
4237 && tv
.tv_sec
- sp
->lastused
> sp
->validtime
)) {
4238 sp
->state
= IPSEC_SPSTATE_DEAD
;
4248 struct secashead
*sah
, *nextsah
;
4249 struct secasvar
*sav
, *nextsav
;
4251 for (sah
= LIST_FIRST(&sahtree
);
4255 nextsah
= LIST_NEXT(sah
, chain
);
4257 /* if sah has been dead, then delete it and process next sah. */
4258 if (sah
->state
== SADB_SASTATE_DEAD
) {
4263 /* if LARVAL entry doesn't become MATURE, delete it. */
4264 for (sav
= LIST_FIRST(&sah
->savtree
[SADB_SASTATE_LARVAL
]);
4268 nextsav
= LIST_NEXT(sav
, chain
);
4270 if (tv
.tv_sec
- sav
->created
> key_larval_lifetime
) {
4276 * If this is a NAT traversal SA with no activity,
4277 * we need to send a keep alive.
4279 * Performed outside of the loop before so we will
4280 * only ever send one keepalive. The first SA on
4281 * the list is the one that will be used for sending
4282 * traffic, so this is the one we use for determining
4283 * when to send the keepalive.
4285 sav
= LIST_FIRST(&sah
->savtree
[SADB_SASTATE_MATURE
]);
4286 if (natt_keepalive_interval
&& sav
&& (sav
->flags
& SADB_X_EXT_NATT_KEEPALIVE
) != 0 &&
4287 (natt_now
- sav
->natt_last_activity
) >= natt_keepalive_interval
) {
4288 ipsec_send_natt_keepalive(sav
);
4292 * check MATURE entry to start to send expire message
4295 for (sav
= LIST_FIRST(&sah
->savtree
[SADB_SASTATE_MATURE
]);
4299 nextsav
= LIST_NEXT(sav
, chain
);
4301 /* we don't need to check. */
4302 if (sav
->lft_s
== NULL
)
4306 if (sav
->lft_c
== NULL
) {
4307 ipseclog((LOG_DEBUG
,"key_timehandler: "
4308 "There is no CURRENT time, why?\n"));
4312 /* check SOFT lifetime */
4313 if (sav
->lft_s
->sadb_lifetime_addtime
!= 0
4314 && tv
.tv_sec
- sav
->created
> sav
->lft_s
->sadb_lifetime_addtime
) {
4316 * check the SA if it has been used.
4317 * when it hasn't been used, delete it.
4318 * i don't think such SA will be used.
4320 if (sav
->lft_c
->sadb_lifetime_usetime
== 0) {
4321 key_sa_chgstate(sav
, SADB_SASTATE_DEAD
);
4325 key_sa_chgstate(sav
, SADB_SASTATE_DYING
);
4327 * XXX If we keep to send expire
4328 * message in the status of
4329 * DYING. Do remove below code.
4335 /* check SOFT lifetime by bytes */
4337 * XXX I don't know the way to delete this SA
4338 * when new SA is installed. Caution when it's
4339 * installed too big lifetime by time.
4341 else if (sav
->lft_s
->sadb_lifetime_bytes
!= 0
4342 && sav
->lft_s
->sadb_lifetime_bytes
< sav
->lft_c
->sadb_lifetime_bytes
) {
4344 key_sa_chgstate(sav
, SADB_SASTATE_DYING
);
4346 * XXX If we keep to send expire
4347 * message in the status of
4348 * DYING. Do remove below code.
4354 /* check DYING entry to change status to DEAD. */
4355 for (sav
= LIST_FIRST(&sah
->savtree
[SADB_SASTATE_DYING
]);
4359 nextsav
= LIST_NEXT(sav
, chain
);
4361 /* we don't need to check. */
4362 if (sav
->lft_h
== NULL
)
4366 if (sav
->lft_c
== NULL
) {
4367 ipseclog((LOG_DEBUG
, "key_timehandler: "
4368 "There is no CURRENT time, why?\n"));
4372 if (sav
->lft_h
->sadb_lifetime_addtime
!= 0
4373 && tv
.tv_sec
- sav
->created
> sav
->lft_h
->sadb_lifetime_addtime
) {
4374 key_sa_chgstate(sav
, SADB_SASTATE_DEAD
);
4378 #if 0 /* XXX Should we keep to send expire message until HARD lifetime ? */
4379 else if (sav
->lft_s
!= NULL
4380 && sav
->lft_s
->sadb_lifetime_addtime
!= 0
4381 && tv
.tv_sec
- sav
->created
> sav
->lft_s
->sadb_lifetime_addtime
) {
4383 * XXX: should be checked to be
4384 * installed the valid SA.
4388 * If there is no SA then sending
4394 /* check HARD lifetime by bytes */
4395 else if (sav
->lft_h
->sadb_lifetime_bytes
!= 0
4396 && sav
->lft_h
->sadb_lifetime_bytes
< sav
->lft_c
->sadb_lifetime_bytes
) {
4397 key_sa_chgstate(sav
, SADB_SASTATE_DEAD
);
4403 /* delete entry in DEAD */
4404 for (sav
= LIST_FIRST(&sah
->savtree
[SADB_SASTATE_DEAD
]);
4408 nextsav
= LIST_NEXT(sav
, chain
);
4411 if (sav
->state
!= SADB_SASTATE_DEAD
) {
4412 ipseclog((LOG_DEBUG
, "key_timehandler: "
4413 "invalid sav->state "
4414 "(queue: %d SA: %d): "
4416 SADB_SASTATE_DEAD
, sav
->state
));
4420 * do not call key_freesav() here.
4421 * sav should already be freed, and sav->refcnt
4422 * shows other references to sav
4423 * (such as from SPD).
4429 #ifndef IPSEC_NONBLOCK_ACQUIRE
4432 struct secacq
*acq
, *nextacq
;
4434 for (acq
= LIST_FIRST(&acqtree
);
4438 nextacq
= LIST_NEXT(acq
, chain
);
4440 if (tv
.tv_sec
- acq
->created
> key_blockacq_lifetime
4441 && __LIST_CHAINED(acq
)) {
4442 LIST_REMOVE(acq
, chain
);
4451 struct secspacq
*acq
, *nextacq
;
4453 for (acq
= LIST_FIRST(&spacqtree
);
4457 nextacq
= LIST_NEXT(acq
, chain
);
4459 if (tv
.tv_sec
- acq
->created
> key_blockacq_lifetime
4460 && __LIST_CHAINED(acq
)) {
4461 LIST_REMOVE(acq
, chain
);
4467 /* initialize random seed */
4468 if (key_tick_init_random
++ > key_int_random
) {
4469 key_tick_init_random
= 0;
4475 #ifndef IPSEC_DEBUG2
4476 /* do exchange to tick time !! */
4477 (void)timeout((void *)key_timehandler_funnel
, (void *)0, hz
);
4478 #endif /* IPSEC_DEBUG2 */
4485 * to initialize a seed for random()
4491 /* Our PRNG is based on Yarrow and doesn't need to be seeded */
4498 srandom(tv
.tv_usec
);
4509 key_randomfill(&value
, sizeof(value
));
4514 key_randomfill(p
, l
)
4520 static int warn
= 1;
4523 read_random(p
, (u_int
)l
);
4526 n
= (size_t)read_random(p
, (u_int
)l
);
4530 bcopy(&v
, (u_int8_t
*)p
+ n
,
4531 l
- n
< sizeof(v
) ? l
- n
: sizeof(v
));
4535 printf("WARNING: pseudo-random number generator "
4536 "used for IPsec processing\n");
4544 * map SADB_SATYPE_* to IPPROTO_*.
4545 * if satype == SADB_SATYPE then satype is mapped to ~0.
4547 * 0: invalid satype.
4550 key_satype2proto(satype
)
4554 case SADB_SATYPE_UNSPEC
:
4555 return IPSEC_PROTO_ANY
;
4556 case SADB_SATYPE_AH
:
4558 case SADB_SATYPE_ESP
:
4560 case SADB_X_SATYPE_IPCOMP
:
4561 return IPPROTO_IPCOMP
;
4570 * map IPPROTO_* to SADB_SATYPE_*
4572 * 0: invalid protocol type.
4575 key_proto2satype(proto
)
4580 return SADB_SATYPE_AH
;
4582 return SADB_SATYPE_ESP
;
4583 case IPPROTO_IPCOMP
:
4584 return SADB_X_SATYPE_IPCOMP
;
4594 * SADB_GETSPI processing is to receive
4595 * <base, (SA2), src address, dst address, (SPI range)>
4596 * from the IKMPd, to assign a unique spi value, to hang on the INBOUND
4597 * tree with the status of LARVAL, and send
4598 * <base, SA(*), address(SD)>
4601 * IN: mhp: pointer to the pointer to each header.
4602 * OUT: NULL if fail.
4603 * other if success, return pointer to the message to send.
4606 key_getspi(so
, m
, mhp
)
4609 const struct sadb_msghdr
*mhp
;
4611 struct sadb_address
*src0
, *dst0
;
4612 struct secasindex saidx
;
4613 struct secashead
*newsah
;
4614 struct secasvar
*newsav
;
4622 if (so
== NULL
|| m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
)
4623 panic("key_getspi: NULL pointer is passed.\n");
4625 if (mhp
->ext
[SADB_EXT_ADDRESS_SRC
] == NULL
||
4626 mhp
->ext
[SADB_EXT_ADDRESS_DST
] == NULL
) {
4627 ipseclog((LOG_DEBUG
, "key_getspi: invalid message is passed.\n"));
4628 return key_senderror(so
, m
, EINVAL
);
4630 if (mhp
->extlen
[SADB_EXT_ADDRESS_SRC
] < sizeof(struct sadb_address
) ||
4631 mhp
->extlen
[SADB_EXT_ADDRESS_DST
] < sizeof(struct sadb_address
)) {
4632 ipseclog((LOG_DEBUG
, "key_getspi: invalid message is passed.\n"));
4633 return key_senderror(so
, m
, EINVAL
);
4635 if (mhp
->ext
[SADB_X_EXT_SA2
] != NULL
) {
4636 mode
= ((struct sadb_x_sa2
*)mhp
->ext
[SADB_X_EXT_SA2
])->sadb_x_sa2_mode
;
4637 reqid
= ((struct sadb_x_sa2
*)mhp
->ext
[SADB_X_EXT_SA2
])->sadb_x_sa2_reqid
;
4639 mode
= IPSEC_MODE_ANY
;
4643 src0
= (struct sadb_address
*)(mhp
->ext
[SADB_EXT_ADDRESS_SRC
]);
4644 dst0
= (struct sadb_address
*)(mhp
->ext
[SADB_EXT_ADDRESS_DST
]);
4646 /* map satype to proto */
4647 if ((proto
= key_satype2proto(mhp
->msg
->sadb_msg_satype
)) == 0) {
4648 ipseclog((LOG_DEBUG
, "key_getspi: invalid satype is passed.\n"));
4649 return key_senderror(so
, m
, EINVAL
);
4652 /* make sure if port number is zero. */
4653 switch (((struct sockaddr
*)(src0
+ 1))->sa_family
) {
4655 if (((struct sockaddr
*)(src0
+ 1))->sa_len
!=
4656 sizeof(struct sockaddr_in
))
4657 return key_senderror(so
, m
, EINVAL
);
4658 ((struct sockaddr_in
*)(src0
+ 1))->sin_port
= 0;
4661 if (((struct sockaddr
*)(src0
+ 1))->sa_len
!=
4662 sizeof(struct sockaddr_in6
))
4663 return key_senderror(so
, m
, EINVAL
);
4664 ((struct sockaddr_in6
*)(src0
+ 1))->sin6_port
= 0;
4669 switch (((struct sockaddr
*)(dst0
+ 1))->sa_family
) {
4671 if (((struct sockaddr
*)(dst0
+ 1))->sa_len
!=
4672 sizeof(struct sockaddr_in
))
4673 return key_senderror(so
, m
, EINVAL
);
4674 ((struct sockaddr_in
*)(dst0
+ 1))->sin_port
= 0;
4677 if (((struct sockaddr
*)(dst0
+ 1))->sa_len
!=
4678 sizeof(struct sockaddr_in6
))
4679 return key_senderror(so
, m
, EINVAL
);
4680 ((struct sockaddr_in6
*)(dst0
+ 1))->sin6_port
= 0;
4686 /* XXX boundary check against sa_len */
4687 KEY_SETSECASIDX(proto
, mode
, reqid
, src0
+ 1, dst0
+ 1, &saidx
);
4689 /* SPI allocation */
4690 spi
= key_do_getnewspi((struct sadb_spirange
*)mhp
->ext
[SADB_EXT_SPIRANGE
],
4693 return key_senderror(so
, m
, EINVAL
);
4695 /* get a SA index */
4696 if ((newsah
= key_getsah(&saidx
)) == NULL
) {
4697 /* create a new SA index */
4698 if ((newsah
= key_newsah(&saidx
)) == NULL
) {
4699 ipseclog((LOG_DEBUG
, "key_getspi: No more memory.\n"));
4700 return key_senderror(so
, m
, ENOBUFS
);
4706 newsav
= key_newsav(m
, mhp
, newsah
, &error
);
4707 if (newsav
== NULL
) {
4708 /* XXX don't free new SA index allocated in above. */
4709 return key_senderror(so
, m
, error
);
4713 newsav
->spi
= htonl(spi
);
4715 #ifndef IPSEC_NONBLOCK_ACQUIRE
4716 /* delete the entry in acqtree */
4717 if (mhp
->msg
->sadb_msg_seq
!= 0) {
4719 if ((acq
= key_getacqbyseq(mhp
->msg
->sadb_msg_seq
)) != NULL
) {
4720 /* reset counter in order to deletion by timehandler. */
4723 acq
->created
= tv
.tv_sec
;
4730 struct mbuf
*n
, *nn
;
4731 struct sadb_sa
*m_sa
;
4732 struct sadb_msg
*newmsg
;
4735 /* create new sadb_msg to reply. */
4736 len
= PFKEY_ALIGN8(sizeof(struct sadb_msg
)) +
4737 PFKEY_ALIGN8(sizeof(struct sadb_sa
));
4739 return key_senderror(so
, m
, ENOBUFS
);
4741 MGETHDR(n
, M_DONTWAIT
, MT_DATA
);
4743 MCLGET(n
, M_DONTWAIT
);
4744 if ((n
->m_flags
& M_EXT
) == 0) {
4750 return key_senderror(so
, m
, ENOBUFS
);
4756 m_copydata(m
, 0, sizeof(struct sadb_msg
), mtod(n
, caddr_t
) + off
);
4757 off
+= PFKEY_ALIGN8(sizeof(struct sadb_msg
));
4759 m_sa
= (struct sadb_sa
*)(mtod(n
, caddr_t
) + off
);
4760 m_sa
->sadb_sa_len
= PFKEY_UNIT64(sizeof(struct sadb_sa
));
4761 m_sa
->sadb_sa_exttype
= SADB_EXT_SA
;
4762 m_sa
->sadb_sa_spi
= htonl(spi
);
4763 off
+= PFKEY_ALIGN8(sizeof(struct sadb_sa
));
4767 panic("length inconsistency in key_getspi");
4770 int mbufItems
[] = {SADB_EXT_ADDRESS_SRC
, SADB_EXT_ADDRESS_DST
};
4771 n
->m_next
= key_gather_mbuf(m
, mhp
, 0, sizeof(mbufItems
)/sizeof(int), mbufItems
);
4774 return key_senderror(so
, m
, ENOBUFS
);
4778 if (n
->m_len
< sizeof(struct sadb_msg
)) {
4779 n
= m_pullup(n
, sizeof(struct sadb_msg
));
4781 return key_sendup_mbuf(so
, m
, KEY_SENDUP_ONE
);
4784 n
->m_pkthdr
.len
= 0;
4785 for (nn
= n
; nn
; nn
= nn
->m_next
)
4786 n
->m_pkthdr
.len
+= nn
->m_len
;
4788 newmsg
= mtod(n
, struct sadb_msg
*);
4789 newmsg
->sadb_msg_seq
= newsav
->seq
;
4790 newmsg
->sadb_msg_errno
= 0;
4791 newmsg
->sadb_msg_len
= PFKEY_UNIT64(n
->m_pkthdr
.len
);
4794 return key_sendup_mbuf(so
, n
, KEY_SENDUP_ONE
);
4799 * allocating new SPI
4800 * called by key_getspi().
4806 key_do_getnewspi(spirange
, saidx
)
4807 struct sadb_spirange
*spirange
;
4808 struct secasindex
*saidx
;
4812 int count
= key_spi_trycnt
;
4814 /* set spi range to allocate */
4815 if (spirange
!= NULL
) {
4816 min
= spirange
->sadb_spirange_min
;
4817 max
= spirange
->sadb_spirange_max
;
4819 min
= key_spi_minval
;
4820 max
= key_spi_maxval
;
4822 /* IPCOMP needs 2-byte SPI */
4823 if (saidx
->proto
== IPPROTO_IPCOMP
) {
4830 t
= min
; min
= max
; max
= t
;
4835 if (key_checkspidup(saidx
, min
) != NULL
) {
4836 ipseclog((LOG_DEBUG
, "key_do_getnewspi: SPI %u exists already.\n", min
));
4840 count
--; /* taking one cost. */
4848 /* when requesting to allocate spi ranged */
4850 /* generate pseudo-random SPI value ranged. */
4851 newspi
= min
+ (key_random() % (max
- min
+ 1));
4853 if (key_checkspidup(saidx
, newspi
) == NULL
)
4857 if (count
== 0 || newspi
== 0) {
4858 ipseclog((LOG_DEBUG
, "key_do_getnewspi: to allocate spi is failed.\n"));
4864 keystat
.getspi_count
=
4865 (keystat
.getspi_count
+ key_spi_trycnt
- count
) / 2;
4871 * SADB_UPDATE processing
4873 * <base, SA, (SA2), (lifetime(HSC),) address(SD), (address(P),)
4874 * key(AE), (identity(SD),) (sensitivity)>
4875 * from the ikmpd, and update a secasvar entry whose status is SADB_SASTATE_LARVAL.
4877 * <base, SA, (SA2), (lifetime(HSC),) address(SD), (address(P),)
4878 * (identity(SD),) (sensitivity)>
4881 * m will always be freed.
4884 key_update(so
, m
, mhp
)
4887 const struct sadb_msghdr
*mhp
;
4889 struct sadb_sa
*sa0
;
4890 struct sadb_address
*src0
, *dst0
;
4891 struct secasindex saidx
;
4892 struct secashead
*sah
;
4893 struct secasvar
*sav
;
4900 if (so
== NULL
|| m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
)
4901 panic("key_update: NULL pointer is passed.\n");
4903 /* map satype to proto */
4904 if ((proto
= key_satype2proto(mhp
->msg
->sadb_msg_satype
)) == 0) {
4905 ipseclog((LOG_DEBUG
, "key_update: invalid satype is passed.\n"));
4906 return key_senderror(so
, m
, EINVAL
);
4909 if (mhp
->ext
[SADB_EXT_SA
] == NULL
||
4910 mhp
->ext
[SADB_EXT_ADDRESS_SRC
] == NULL
||
4911 mhp
->ext
[SADB_EXT_ADDRESS_DST
] == NULL
||
4912 (mhp
->msg
->sadb_msg_satype
== SADB_SATYPE_ESP
&&
4913 mhp
->ext
[SADB_EXT_KEY_ENCRYPT
] == NULL
) ||
4914 (mhp
->msg
->sadb_msg_satype
== SADB_SATYPE_AH
&&
4915 mhp
->ext
[SADB_EXT_KEY_AUTH
] == NULL
) ||
4916 (mhp
->ext
[SADB_EXT_LIFETIME_HARD
] != NULL
&&
4917 mhp
->ext
[SADB_EXT_LIFETIME_SOFT
] == NULL
) ||
4918 (mhp
->ext
[SADB_EXT_LIFETIME_HARD
] == NULL
&&
4919 mhp
->ext
[SADB_EXT_LIFETIME_SOFT
] != NULL
)) {
4920 ipseclog((LOG_DEBUG
, "key_update: invalid message is passed.\n"));
4921 return key_senderror(so
, m
, EINVAL
);
4923 if (mhp
->extlen
[SADB_EXT_SA
] < sizeof(struct sadb_sa
) ||
4924 mhp
->extlen
[SADB_EXT_ADDRESS_SRC
] < sizeof(struct sadb_address
) ||
4925 mhp
->extlen
[SADB_EXT_ADDRESS_DST
] < sizeof(struct sadb_address
)) {
4926 ipseclog((LOG_DEBUG
, "key_update: invalid message is passed.\n"));
4927 return key_senderror(so
, m
, EINVAL
);
4929 if (mhp
->ext
[SADB_X_EXT_SA2
] != NULL
) {
4930 mode
= ((struct sadb_x_sa2
*)mhp
->ext
[SADB_X_EXT_SA2
])->sadb_x_sa2_mode
;
4931 reqid
= ((struct sadb_x_sa2
*)mhp
->ext
[SADB_X_EXT_SA2
])->sadb_x_sa2_reqid
;
4933 mode
= IPSEC_MODE_ANY
;
4936 /* XXX boundary checking for other extensions */
4938 sa0
= (struct sadb_sa
*)mhp
->ext
[SADB_EXT_SA
];
4939 src0
= (struct sadb_address
*)(mhp
->ext
[SADB_EXT_ADDRESS_SRC
]);
4940 dst0
= (struct sadb_address
*)(mhp
->ext
[SADB_EXT_ADDRESS_DST
]);
4942 /* XXX boundary check against sa_len */
4943 KEY_SETSECASIDX(proto
, mode
, reqid
, src0
+ 1, dst0
+ 1, &saidx
);
4945 /* get a SA header */
4946 if ((sah
= key_getsah(&saidx
)) == NULL
) {
4947 ipseclog((LOG_DEBUG
, "key_update: no SA index found.\n"));
4948 return key_senderror(so
, m
, ENOENT
);
4951 /* set spidx if there */
4953 error
= key_setident(sah
, m
, mhp
);
4955 return key_senderror(so
, m
, error
);
4957 /* find a SA with sequence number. */
4958 #if IPSEC_DOSEQCHECK
4959 if (mhp
->msg
->sadb_msg_seq
!= 0
4960 && (sav
= key_getsavbyseq(sah
, mhp
->msg
->sadb_msg_seq
)) == NULL
) {
4961 ipseclog((LOG_DEBUG
,
4962 "key_update: no larval SA with sequence %u exists.\n",
4963 mhp
->msg
->sadb_msg_seq
));
4964 return key_senderror(so
, m
, ENOENT
);
4967 if ((sav
= key_getsavbyspi(sah
, sa0
->sadb_sa_spi
)) == NULL
) {
4968 ipseclog((LOG_DEBUG
,
4969 "key_update: no such a SA found (spi:%u)\n",
4970 (u_int32_t
)ntohl(sa0
->sadb_sa_spi
)));
4971 return key_senderror(so
, m
, EINVAL
);
4975 /* validity check */
4976 if (sav
->sah
->saidx
.proto
!= proto
) {
4977 ipseclog((LOG_DEBUG
,
4978 "key_update: protocol mismatched (DB=%u param=%u)\n",
4979 sav
->sah
->saidx
.proto
, proto
));
4980 return key_senderror(so
, m
, EINVAL
);
4982 #if IPSEC_DOSEQCHECK
4983 if (sav
->spi
!= sa0
->sadb_sa_spi
) {
4984 ipseclog((LOG_DEBUG
,
4985 "key_update: SPI mismatched (DB:%u param:%u)\n",
4986 (u_int32_t
)ntohl(sav
->spi
),
4987 (u_int32_t
)ntohl(sa0
->sadb_sa_spi
)));
4988 return key_senderror(so
, m
, EINVAL
);
4991 if (sav
->pid
!= mhp
->msg
->sadb_msg_pid
) {
4992 ipseclog((LOG_DEBUG
,
4993 "key_update: pid mismatched (DB:%u param:%u)\n",
4994 sav
->pid
, mhp
->msg
->sadb_msg_pid
));
4995 return key_senderror(so
, m
, EINVAL
);
4998 /* copy sav values */
4999 error
= key_setsaval(sav
, m
, mhp
);
5002 return key_senderror(so
, m
, error
);
5005 /* check SA values to be mature. */
5006 if ((mhp
->msg
->sadb_msg_errno
= key_mature(sav
)) != 0) {
5008 return key_senderror(so
, m
, 0);
5014 /* set msg buf from mhp */
5015 n
= key_getmsgbuf_x1(m
, mhp
);
5017 ipseclog((LOG_DEBUG
, "key_update: No more memory.\n"));
5018 return key_senderror(so
, m
, ENOBUFS
);
5022 return key_sendup_mbuf(so
, n
, KEY_SENDUP_ALL
);
5027 * search SAD with sequence for a SA which state is SADB_SASTATE_LARVAL.
5028 * only called by key_update().
5031 * others : found, pointer to a SA.
5033 #if IPSEC_DOSEQCHECK
5034 static struct secasvar
*
5035 key_getsavbyseq(sah
, seq
)
5036 struct secashead
*sah
;
5039 struct secasvar
*sav
;
5042 state
= SADB_SASTATE_LARVAL
;
5044 /* search SAD with sequence number ? */
5045 LIST_FOREACH(sav
, &sah
->savtree
[state
], chain
) {
5047 KEY_CHKSASTATE(state
, sav
->state
, "key_getsabyseq");
5049 if (sav
->seq
== seq
) {
5051 KEYDEBUG(KEYDEBUG_IPSEC_STAMP
,
5052 printf("DP key_getsavbyseq cause "
5053 "refcnt++:%d SA:%p\n",
5064 * SADB_ADD processing
5065 * add a entry to SA database, when received
5066 * <base, SA, (SA2), (lifetime(HSC),) address(SD), (address(P),)
5067 * key(AE), (identity(SD),) (sensitivity)>
5070 * <base, SA, (SA2), (lifetime(HSC),) address(SD), (address(P),)
5071 * (identity(SD),) (sensitivity)>
5074 * IGNORE identity and sensitivity messages.
5076 * m will always be freed.
5082 const struct sadb_msghdr
*mhp
;
5084 struct sadb_sa
*sa0
;
5085 struct sadb_address
*src0
, *dst0
;
5086 struct secasindex saidx
;
5087 struct secashead
*newsah
;
5088 struct secasvar
*newsav
;
5095 if (so
== NULL
|| m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
)
5096 panic("key_add: NULL pointer is passed.\n");
5098 /* map satype to proto */
5099 if ((proto
= key_satype2proto(mhp
->msg
->sadb_msg_satype
)) == 0) {
5100 ipseclog((LOG_DEBUG
, "key_add: invalid satype is passed.\n"));
5101 return key_senderror(so
, m
, EINVAL
);
5104 if (mhp
->ext
[SADB_EXT_SA
] == NULL
||
5105 mhp
->ext
[SADB_EXT_ADDRESS_SRC
] == NULL
||
5106 mhp
->ext
[SADB_EXT_ADDRESS_DST
] == NULL
||
5107 (mhp
->msg
->sadb_msg_satype
== SADB_SATYPE_ESP
&&
5108 mhp
->ext
[SADB_EXT_KEY_ENCRYPT
] == NULL
) ||
5109 (mhp
->msg
->sadb_msg_satype
== SADB_SATYPE_AH
&&
5110 mhp
->ext
[SADB_EXT_KEY_AUTH
] == NULL
) ||
5111 (mhp
->ext
[SADB_EXT_LIFETIME_HARD
] != NULL
&&
5112 mhp
->ext
[SADB_EXT_LIFETIME_SOFT
] == NULL
) ||
5113 (mhp
->ext
[SADB_EXT_LIFETIME_HARD
] == NULL
&&
5114 mhp
->ext
[SADB_EXT_LIFETIME_SOFT
] != NULL
)) {
5115 ipseclog((LOG_DEBUG
, "key_add: invalid message is passed.\n"));
5116 return key_senderror(so
, m
, EINVAL
);
5118 if (mhp
->extlen
[SADB_EXT_SA
] < sizeof(struct sadb_sa
) ||
5119 mhp
->extlen
[SADB_EXT_ADDRESS_SRC
] < sizeof(struct sadb_address
) ||
5120 mhp
->extlen
[SADB_EXT_ADDRESS_DST
] < sizeof(struct sadb_address
)) {
5122 ipseclog((LOG_DEBUG
, "key_add: invalid message is passed.\n"));
5123 return key_senderror(so
, m
, EINVAL
);
5125 if (mhp
->ext
[SADB_X_EXT_SA2
] != NULL
) {
5126 mode
= ((struct sadb_x_sa2
*)mhp
->ext
[SADB_X_EXT_SA2
])->sadb_x_sa2_mode
;
5127 reqid
= ((struct sadb_x_sa2
*)mhp
->ext
[SADB_X_EXT_SA2
])->sadb_x_sa2_reqid
;
5129 mode
= IPSEC_MODE_ANY
;
5133 sa0
= (struct sadb_sa
*)mhp
->ext
[SADB_EXT_SA
];
5134 src0
= (struct sadb_address
*)mhp
->ext
[SADB_EXT_ADDRESS_SRC
];
5135 dst0
= (struct sadb_address
*)mhp
->ext
[SADB_EXT_ADDRESS_DST
];
5137 /* XXX boundary check against sa_len */
5138 KEY_SETSECASIDX(proto
, mode
, reqid
, src0
+ 1, dst0
+ 1, &saidx
);
5140 /* get a SA header */
5141 if ((newsah
= key_getsah(&saidx
)) == NULL
) {
5142 /* create a new SA header */
5143 if ((newsah
= key_newsah(&saidx
)) == NULL
) {
5144 ipseclog((LOG_DEBUG
, "key_add: No more memory.\n"));
5145 return key_senderror(so
, m
, ENOBUFS
);
5149 /* set spidx if there */
5151 error
= key_setident(newsah
, m
, mhp
);
5153 return key_senderror(so
, m
, error
);
5156 /* create new SA entry. */
5157 /* We can create new SA only if SPI is differenct. */
5158 if (key_getsavbyspi(newsah
, sa0
->sadb_sa_spi
)) {
5159 ipseclog((LOG_DEBUG
, "key_add: SA already exists.\n"));
5160 return key_senderror(so
, m
, EEXIST
);
5162 newsav
= key_newsav(m
, mhp
, newsah
, &error
);
5163 if (newsav
== NULL
) {
5164 return key_senderror(so
, m
, error
);
5167 /* check SA values to be mature. */
5168 if ((error
= key_mature(newsav
)) != 0) {
5169 key_freesav(newsav
);
5170 return key_senderror(so
, m
, error
);
5174 * don't call key_freesav() here, as we would like to keep the SA
5175 * in the database on success.
5181 /* set msg buf from mhp */
5182 n
= key_getmsgbuf_x1(m
, mhp
);
5184 ipseclog((LOG_DEBUG
, "key_update: No more memory.\n"));
5185 return key_senderror(so
, m
, ENOBUFS
);
5189 return key_sendup_mbuf(so
, n
, KEY_SENDUP_ALL
);
5195 key_setident(sah
, m
, mhp
)
5196 struct secashead
*sah
;
5198 const struct sadb_msghdr
*mhp
;
5200 const struct sadb_ident
*idsrc
, *iddst
;
5201 int idsrclen
, iddstlen
;
5204 if (sah
== NULL
|| m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
)
5205 panic("key_setident: NULL pointer is passed.\n");
5207 /* don't make buffer if not there */
5208 if (mhp
->ext
[SADB_EXT_IDENTITY_SRC
] == NULL
&&
5209 mhp
->ext
[SADB_EXT_IDENTITY_DST
] == NULL
) {
5215 if (mhp
->ext
[SADB_EXT_IDENTITY_SRC
] == NULL
||
5216 mhp
->ext
[SADB_EXT_IDENTITY_DST
] == NULL
) {
5217 ipseclog((LOG_DEBUG
, "key_setident: invalid identity.\n"));
5221 idsrc
= (const struct sadb_ident
*)mhp
->ext
[SADB_EXT_IDENTITY_SRC
];
5222 iddst
= (const struct sadb_ident
*)mhp
->ext
[SADB_EXT_IDENTITY_DST
];
5223 idsrclen
= mhp
->extlen
[SADB_EXT_IDENTITY_SRC
];
5224 iddstlen
= mhp
->extlen
[SADB_EXT_IDENTITY_DST
];
5226 /* validity check */
5227 if (idsrc
->sadb_ident_type
!= iddst
->sadb_ident_type
) {
5228 ipseclog((LOG_DEBUG
, "key_setident: ident type mismatch.\n"));
5232 switch (idsrc
->sadb_ident_type
) {
5233 case SADB_IDENTTYPE_PREFIX
:
5234 case SADB_IDENTTYPE_FQDN
:
5235 case SADB_IDENTTYPE_USERFQDN
:
5237 /* XXX do nothing */
5243 /* make structure */
5244 KMALLOC(sah
->idents
, struct sadb_ident
*, idsrclen
);
5245 if (sah
->idents
== NULL
) {
5246 ipseclog((LOG_DEBUG
, "key_setident: No more memory.\n"));
5249 KMALLOC(sah
->identd
, struct sadb_ident
*, iddstlen
);
5250 if (sah
->identd
== NULL
) {
5253 ipseclog((LOG_DEBUG
, "key_setident: No more memory.\n"));
5256 bcopy(idsrc
, sah
->idents
, idsrclen
);
5257 bcopy(iddst
, sah
->identd
, iddstlen
);
5263 * m will not be freed on return.
5264 * it is caller's responsibility to free the result.
5266 static struct mbuf
*
5267 key_getmsgbuf_x1(m
, mhp
)
5269 const struct sadb_msghdr
*mhp
;
5272 int mbufItems
[] = {SADB_EXT_RESERVED
, SADB_EXT_SA
,
5273 SADB_X_EXT_SA2
, SADB_EXT_ADDRESS_SRC
,
5274 SADB_EXT_ADDRESS_DST
, SADB_EXT_LIFETIME_HARD
,
5275 SADB_EXT_LIFETIME_SOFT
, SADB_EXT_IDENTITY_SRC
,
5276 SADB_EXT_IDENTITY_DST
};
5279 if (m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
)
5280 panic("key_getmsgbuf_x1: NULL pointer is passed.\n");
5282 /* create new sadb_msg to reply. */
5283 n
= key_gather_mbuf(m
, mhp
, 1, sizeof(mbufItems
)/sizeof(int), mbufItems
);
5287 if (n
->m_len
< sizeof(struct sadb_msg
)) {
5288 n
= m_pullup(n
, sizeof(struct sadb_msg
));
5292 mtod(n
, struct sadb_msg
*)->sadb_msg_errno
= 0;
5293 mtod(n
, struct sadb_msg
*)->sadb_msg_len
=
5294 PFKEY_UNIT64(n
->m_pkthdr
.len
);
5299 static int key_delete_all
__P((struct socket
*, struct mbuf
*,
5300 const struct sadb_msghdr
*, u_int16_t
));
5303 * SADB_DELETE processing
5305 * <base, SA(*), address(SD)>
5306 * from the ikmpd, and set SADB_SASTATE_DEAD,
5308 * <base, SA(*), address(SD)>
5311 * m will always be freed.
5314 key_delete(so
, m
, mhp
)
5317 const struct sadb_msghdr
*mhp
;
5319 struct sadb_sa
*sa0
;
5320 struct sadb_address
*src0
, *dst0
;
5321 struct secasindex saidx
;
5322 struct secashead
*sah
;
5323 struct secasvar
*sav
= NULL
;
5327 if (so
== NULL
|| m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
)
5328 panic("key_delete: NULL pointer is passed.\n");
5330 /* map satype to proto */
5331 if ((proto
= key_satype2proto(mhp
->msg
->sadb_msg_satype
)) == 0) {
5332 ipseclog((LOG_DEBUG
, "key_delete: invalid satype is passed.\n"));
5333 return key_senderror(so
, m
, EINVAL
);
5336 if (mhp
->ext
[SADB_EXT_ADDRESS_SRC
] == NULL
||
5337 mhp
->ext
[SADB_EXT_ADDRESS_DST
] == NULL
) {
5338 ipseclog((LOG_DEBUG
, "key_delete: invalid message is passed.\n"));
5339 return key_senderror(so
, m
, EINVAL
);
5342 if (mhp
->extlen
[SADB_EXT_ADDRESS_SRC
] < sizeof(struct sadb_address
) ||
5343 mhp
->extlen
[SADB_EXT_ADDRESS_DST
] < sizeof(struct sadb_address
)) {
5344 ipseclog((LOG_DEBUG
, "key_delete: invalid message is passed.\n"));
5345 return key_senderror(so
, m
, EINVAL
);
5348 if (mhp
->ext
[SADB_EXT_SA
] == NULL
) {
5350 * Caller wants us to delete all non-LARVAL SAs
5351 * that match the src/dst. This is used during
5352 * IKE INITIAL-CONTACT.
5354 ipseclog((LOG_DEBUG
, "key_delete: doing delete all.\n"));
5355 return key_delete_all(so
, m
, mhp
, proto
);
5356 } else if (mhp
->extlen
[SADB_EXT_SA
] < sizeof(struct sadb_sa
)) {
5357 ipseclog((LOG_DEBUG
, "key_delete: invalid message is passed.\n"));
5358 return key_senderror(so
, m
, EINVAL
);
5361 sa0
= (struct sadb_sa
*)mhp
->ext
[SADB_EXT_SA
];
5362 src0
= (struct sadb_address
*)(mhp
->ext
[SADB_EXT_ADDRESS_SRC
]);
5363 dst0
= (struct sadb_address
*)(mhp
->ext
[SADB_EXT_ADDRESS_DST
]);
5365 /* XXX boundary check against sa_len */
5366 KEY_SETSECASIDX(proto
, IPSEC_MODE_ANY
, 0, src0
+ 1, dst0
+ 1, &saidx
);
5368 /* get a SA header */
5369 LIST_FOREACH(sah
, &sahtree
, chain
) {
5370 if (sah
->state
== SADB_SASTATE_DEAD
)
5372 if (key_cmpsaidx(&sah
->saidx
, &saidx
, CMP_HEAD
) == 0)
5375 /* get a SA with SPI. */
5376 sav
= key_getsavbyspi(sah
, sa0
->sadb_sa_spi
);
5381 ipseclog((LOG_DEBUG
, "key_delete: no SA found.\n"));
5382 return key_senderror(so
, m
, ENOENT
);
5385 key_sa_chgstate(sav
, SADB_SASTATE_DEAD
);
5391 struct sadb_msg
*newmsg
;
5392 int mbufItems
[] = {SADB_EXT_RESERVED
, SADB_EXT_SA
,
5393 SADB_EXT_ADDRESS_SRC
, SADB_EXT_ADDRESS_DST
};
5395 /* create new sadb_msg to reply. */
5396 n
= key_gather_mbuf(m
, mhp
, 1, sizeof(mbufItems
)/sizeof(int), mbufItems
);
5398 return key_senderror(so
, m
, ENOBUFS
);
5400 if (n
->m_len
< sizeof(struct sadb_msg
)) {
5401 n
= m_pullup(n
, sizeof(struct sadb_msg
));
5403 return key_senderror(so
, m
, ENOBUFS
);
5405 newmsg
= mtod(n
, struct sadb_msg
*);
5406 newmsg
->sadb_msg_errno
= 0;
5407 newmsg
->sadb_msg_len
= PFKEY_UNIT64(n
->m_pkthdr
.len
);
5410 return key_sendup_mbuf(so
, n
, KEY_SENDUP_ALL
);
5415 * delete all SAs for src/dst. Called from key_delete().
5418 key_delete_all(so
, m
, mhp
, proto
)
5421 const struct sadb_msghdr
*mhp
;
5424 struct sadb_address
*src0
, *dst0
;
5425 struct secasindex saidx
;
5426 struct secashead
*sah
;
5427 struct secasvar
*sav
, *nextsav
;
5428 u_int stateidx
, state
;
5430 src0
= (struct sadb_address
*)(mhp
->ext
[SADB_EXT_ADDRESS_SRC
]);
5431 dst0
= (struct sadb_address
*)(mhp
->ext
[SADB_EXT_ADDRESS_DST
]);
5433 /* XXX boundary check against sa_len */
5434 KEY_SETSECASIDX(proto
, IPSEC_MODE_ANY
, 0, src0
+ 1, dst0
+ 1, &saidx
);
5436 LIST_FOREACH(sah
, &sahtree
, chain
) {
5437 if (sah
->state
== SADB_SASTATE_DEAD
)
5439 if (key_cmpsaidx(&sah
->saidx
, &saidx
, CMP_HEAD
) == 0)
5442 /* Delete all non-LARVAL SAs. */
5444 stateidx
< _ARRAYLEN(saorder_state_alive
);
5446 state
= saorder_state_alive
[stateidx
];
5447 if (state
== SADB_SASTATE_LARVAL
)
5449 for (sav
= LIST_FIRST(&sah
->savtree
[state
]);
5450 sav
!= NULL
; sav
= nextsav
) {
5451 nextsav
= LIST_NEXT(sav
, chain
);
5453 if (sav
->state
!= state
) {
5454 ipseclog((LOG_DEBUG
, "key_delete_all: "
5455 "invalid sav->state "
5456 "(queue: %d SA: %d)\n",
5457 state
, sav
->state
));
5461 key_sa_chgstate(sav
, SADB_SASTATE_DEAD
);
5468 struct sadb_msg
*newmsg
;
5469 int mbufItems
[] = {SADB_EXT_RESERVED
, SADB_EXT_ADDRESS_SRC
,
5470 SADB_EXT_ADDRESS_DST
};
5472 /* create new sadb_msg to reply. */
5473 n
= key_gather_mbuf(m
, mhp
, 1, sizeof(mbufItems
)/sizeof(int), mbufItems
);
5475 return key_senderror(so
, m
, ENOBUFS
);
5477 if (n
->m_len
< sizeof(struct sadb_msg
)) {
5478 n
= m_pullup(n
, sizeof(struct sadb_msg
));
5480 return key_senderror(so
, m
, ENOBUFS
);
5482 newmsg
= mtod(n
, struct sadb_msg
*);
5483 newmsg
->sadb_msg_errno
= 0;
5484 newmsg
->sadb_msg_len
= PFKEY_UNIT64(n
->m_pkthdr
.len
);
5487 return key_sendup_mbuf(so
, n
, KEY_SENDUP_ALL
);
5492 * SADB_GET processing
5494 * <base, SA(*), address(SD)>
5495 * from the ikmpd, and get a SP and a SA to respond,
5497 * <base, SA, (lifetime(HSC),) address(SD), (address(P),) key(AE),
5498 * (identity(SD),) (sensitivity)>
5501 * m will always be freed.
5507 const struct sadb_msghdr
*mhp
;
5509 struct sadb_sa
*sa0
;
5510 struct sadb_address
*src0
, *dst0
;
5511 struct secasindex saidx
;
5512 struct secashead
*sah
;
5513 struct secasvar
*sav
= NULL
;
5517 if (so
== NULL
|| m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
)
5518 panic("key_get: NULL pointer is passed.\n");
5520 /* map satype to proto */
5521 if ((proto
= key_satype2proto(mhp
->msg
->sadb_msg_satype
)) == 0) {
5522 ipseclog((LOG_DEBUG
, "key_get: invalid satype is passed.\n"));
5523 return key_senderror(so
, m
, EINVAL
);
5526 if (mhp
->ext
[SADB_EXT_SA
] == NULL
||
5527 mhp
->ext
[SADB_EXT_ADDRESS_SRC
] == NULL
||
5528 mhp
->ext
[SADB_EXT_ADDRESS_DST
] == NULL
) {
5529 ipseclog((LOG_DEBUG
, "key_get: invalid message is passed.\n"));
5530 return key_senderror(so
, m
, EINVAL
);
5532 if (mhp
->extlen
[SADB_EXT_SA
] < sizeof(struct sadb_sa
) ||
5533 mhp
->extlen
[SADB_EXT_ADDRESS_SRC
] < sizeof(struct sadb_address
) ||
5534 mhp
->extlen
[SADB_EXT_ADDRESS_DST
] < sizeof(struct sadb_address
)) {
5535 ipseclog((LOG_DEBUG
, "key_get: invalid message is passed.\n"));
5536 return key_senderror(so
, m
, EINVAL
);
5539 sa0
= (struct sadb_sa
*)mhp
->ext
[SADB_EXT_SA
];
5540 src0
= (struct sadb_address
*)mhp
->ext
[SADB_EXT_ADDRESS_SRC
];
5541 dst0
= (struct sadb_address
*)mhp
->ext
[SADB_EXT_ADDRESS_DST
];
5543 /* XXX boundary check against sa_len */
5544 KEY_SETSECASIDX(proto
, IPSEC_MODE_ANY
, 0, src0
+ 1, dst0
+ 1, &saidx
);
5546 /* get a SA header */
5547 LIST_FOREACH(sah
, &sahtree
, chain
) {
5548 if (sah
->state
== SADB_SASTATE_DEAD
)
5550 if (key_cmpsaidx(&sah
->saidx
, &saidx
, CMP_HEAD
) == 0)
5553 /* get a SA with SPI. */
5554 sav
= key_getsavbyspi(sah
, sa0
->sadb_sa_spi
);
5559 ipseclog((LOG_DEBUG
, "key_get: no SA found.\n"));
5560 return key_senderror(so
, m
, ENOENT
);
5567 /* map proto to satype */
5568 if ((satype
= key_proto2satype(sah
->saidx
.proto
)) == 0) {
5569 ipseclog((LOG_DEBUG
, "key_get: there was invalid proto in SAD.\n"));
5570 return key_senderror(so
, m
, EINVAL
);
5573 /* create new sadb_msg to reply. */
5574 n
= key_setdumpsa(sav
, SADB_GET
, satype
, mhp
->msg
->sadb_msg_seq
,
5575 mhp
->msg
->sadb_msg_pid
);
5577 return key_senderror(so
, m
, ENOBUFS
);
5580 return key_sendup_mbuf(so
, n
, KEY_SENDUP_ONE
);
5584 /* XXX make it sysctl-configurable? */
5586 key_getcomb_setlifetime(comb
)
5587 struct sadb_comb
*comb
;
5590 comb
->sadb_comb_soft_allocations
= 1;
5591 comb
->sadb_comb_hard_allocations
= 1;
5592 comb
->sadb_comb_soft_bytes
= 0;
5593 comb
->sadb_comb_hard_bytes
= 0;
5594 comb
->sadb_comb_hard_addtime
= 86400; /* 1 day */
5595 comb
->sadb_comb_soft_addtime
= comb
->sadb_comb_soft_addtime
* 80 / 100;
5596 comb
->sadb_comb_soft_usetime
= 28800; /* 8 hours */
5597 comb
->sadb_comb_hard_usetime
= comb
->sadb_comb_hard_usetime
* 80 / 100;
5602 * XXX reorder combinations by preference
5603 * XXX no idea if the user wants ESP authentication or not
5605 static struct mbuf
*
5608 struct sadb_comb
*comb
;
5609 const struct esp_algorithm
*algo
;
5610 struct mbuf
*result
= NULL
, *m
, *n
;
5614 const int l
= PFKEY_ALIGN8(sizeof(struct sadb_comb
));
5617 for (i
= 1; i
<= SADB_EALG_MAX
; i
++) {
5618 algo
= esp_algorithm_lookup(i
);
5622 if (algo
->keymax
< ipsec_esp_keymin
)
5624 if (algo
->keymin
< ipsec_esp_keymin
)
5625 encmin
= ipsec_esp_keymin
;
5627 encmin
= algo
->keymin
;
5630 m
= key_getcomb_ah();
5634 panic("assumption failed in key_getcomb_esp");
5636 MGET(m
, M_DONTWAIT
, MT_DATA
);
5641 bzero(mtod(m
, caddr_t
), m
->m_len
);
5648 for (n
= m
; n
; n
= n
->m_next
)
5652 panic("assumption failed in key_getcomb_esp");
5655 for (off
= 0; off
< totlen
; off
+= l
) {
5656 n
= m_pulldown(m
, off
, l
, &o
);
5658 /* m is already freed */
5661 comb
= (struct sadb_comb
*)(mtod(n
, caddr_t
) + o
);
5662 bzero(comb
, sizeof(*comb
));
5663 key_getcomb_setlifetime(comb
);
5664 comb
->sadb_comb_encrypt
= i
;
5665 comb
->sadb_comb_encrypt_minbits
= encmin
;
5666 comb
->sadb_comb_encrypt_maxbits
= algo
->keymax
;
5685 * XXX reorder combinations by preference
5687 static struct mbuf
*
5690 struct sadb_comb
*comb
;
5691 const struct ah_algorithm
*algo
;
5695 const int l
= PFKEY_ALIGN8(sizeof(struct sadb_comb
));
5698 for (i
= 1; i
<= SADB_AALG_MAX
; i
++) {
5700 /* we prefer HMAC algorithms, not old algorithms */
5701 if (i
!= SADB_AALG_SHA1HMAC
&& i
!= SADB_AALG_MD5HMAC
)
5704 algo
= ah_algorithm_lookup(i
);
5708 if (algo
->keymax
< ipsec_ah_keymin
)
5710 if (algo
->keymin
< ipsec_ah_keymin
)
5711 min
= ipsec_ah_keymin
;
5718 panic("assumption failed in key_getcomb_ah");
5720 MGET(m
, M_DONTWAIT
, MT_DATA
);
5727 M_PREPEND(m
, l
, M_DONTWAIT
);
5731 comb
= mtod(m
, struct sadb_comb
*);
5732 bzero(comb
, sizeof(*comb
));
5733 key_getcomb_setlifetime(comb
);
5734 comb
->sadb_comb_auth
= i
;
5735 comb
->sadb_comb_auth_minbits
= min
;
5736 comb
->sadb_comb_auth_maxbits
= algo
->keymax
;
5743 * not really an official behavior. discussed in pf_key@inner.net in Sep2000.
5744 * XXX reorder combinations by preference
5746 static struct mbuf
*
5747 key_getcomb_ipcomp()
5749 struct sadb_comb
*comb
;
5750 const struct ipcomp_algorithm
*algo
;
5753 const int l
= PFKEY_ALIGN8(sizeof(struct sadb_comb
));
5756 for (i
= 1; i
<= SADB_X_CALG_MAX
; i
++) {
5757 algo
= ipcomp_algorithm_lookup(i
);
5764 panic("assumption failed in key_getcomb_ipcomp");
5766 MGET(m
, M_DONTWAIT
, MT_DATA
);
5773 M_PREPEND(m
, l
, M_DONTWAIT
);
5777 comb
= mtod(m
, struct sadb_comb
*);
5778 bzero(comb
, sizeof(*comb
));
5779 key_getcomb_setlifetime(comb
);
5780 comb
->sadb_comb_encrypt
= i
;
5781 /* what should we set into sadb_comb_*_{min,max}bits? */
5788 * XXX no way to pass mode (transport/tunnel) to userland
5789 * XXX replay checking?
5790 * XXX sysctl interface to ipsec_{ah,esp}_keymin
5792 static struct mbuf
*
5794 const struct secasindex
*saidx
;
5796 struct sadb_prop
*prop
;
5798 const int l
= PFKEY_ALIGN8(sizeof(struct sadb_prop
));
5801 switch (saidx
->proto
) {
5804 m
= key_getcomb_esp();
5808 m
= key_getcomb_ah();
5810 case IPPROTO_IPCOMP
:
5811 m
= key_getcomb_ipcomp();
5819 M_PREPEND(m
, l
, M_DONTWAIT
);
5824 for (n
= m
; n
; n
= n
->m_next
)
5827 prop
= mtod(m
, struct sadb_prop
*);
5828 bzero(prop
, sizeof(*prop
));
5829 prop
->sadb_prop_len
= PFKEY_UNIT64(totlen
);
5830 prop
->sadb_prop_exttype
= SADB_EXT_PROPOSAL
;
5831 prop
->sadb_prop_replay
= 32; /* XXX */
5837 * SADB_ACQUIRE processing called by key_checkrequest() and key_acquire2().
5839 * <base, SA, address(SD), (address(P)), x_policy,
5840 * (identity(SD),) (sensitivity,) proposal>
5841 * to KMD, and expect to receive
5842 * <base> with SADB_ACQUIRE if error occured,
5844 * <base, src address, dst address, (SPI range)> with SADB_GETSPI
5845 * from KMD by PF_KEY.
5847 * XXX x_policy is outside of RFC2367 (KAME extension).
5848 * XXX sensitivity is not supported.
5849 * XXX for ipcomp, RFC2367 does not define how to fill in proposal.
5850 * see comment for key_getcomb_ipcomp().
5854 * others: error number
5857 key_acquire(saidx
, sp
)
5858 struct secasindex
*saidx
;
5859 struct secpolicy
*sp
;
5861 struct mbuf
*result
= NULL
, *m
;
5862 #ifndef IPSEC_NONBLOCK_ACQUIRE
5863 struct secacq
*newacq
;
5871 panic("key_acquire: NULL pointer is passed.\n");
5872 if ((satype
= key_proto2satype(saidx
->proto
)) == 0)
5873 panic("key_acquire: invalid proto is passed.\n");
5875 #ifndef IPSEC_NONBLOCK_ACQUIRE
5877 * We never do anything about acquirng SA. There is anather
5878 * solution that kernel blocks to send SADB_ACQUIRE message until
5879 * getting something message from IKEd. In later case, to be
5880 * managed with ACQUIRING list.
5882 /* get a entry to check whether sending message or not. */
5883 if ((newacq
= key_getacq(saidx
)) != NULL
) {
5884 if (key_blockacq_count
< newacq
->count
) {
5885 /* reset counter and do send message. */
5888 /* increment counter and do nothing. */
5893 /* make new entry for blocking to send SADB_ACQUIRE. */
5894 if ((newacq
= key_newacq(saidx
)) == NULL
)
5897 /* add to acqtree */
5898 LIST_INSERT_HEAD(&acqtree
, newacq
, chain
);
5903 #ifndef IPSEC_NONBLOCK_ACQUIRE
5906 seq
= (acq_seq
= (acq_seq
== ~0 ? 1 : ++acq_seq
));
5908 m
= key_setsadbmsg(SADB_ACQUIRE
, 0, satype
, seq
, 0, 0);
5915 /* set sadb_address for saidx's. */
5916 m
= key_setsadbaddr(SADB_EXT_ADDRESS_SRC
,
5917 (struct sockaddr
*)&saidx
->src
, FULLMASK
, IPSEC_ULPROTO_ANY
);
5924 m
= key_setsadbaddr(SADB_EXT_ADDRESS_DST
,
5925 (struct sockaddr
*)&saidx
->dst
, FULLMASK
, IPSEC_ULPROTO_ANY
);
5932 /* XXX proxy address (optional) */
5934 /* set sadb_x_policy */
5936 m
= key_setsadbxpolicy(sp
->policy
, sp
->spidx
.dir
, sp
->id
);
5944 /* XXX identity (optional) */
5946 if (idexttype
&& fqdn
) {
5947 /* create identity extension (FQDN) */
5948 struct sadb_ident
*id
;
5951 fqdnlen
= strlen(fqdn
) + 1; /* +1 for terminating-NUL */
5952 id
= (struct sadb_ident
*)p
;
5953 bzero(id
, sizeof(*id
) + PFKEY_ALIGN8(fqdnlen
));
5954 id
->sadb_ident_len
= PFKEY_UNIT64(sizeof(*id
) + PFKEY_ALIGN8(fqdnlen
));
5955 id
->sadb_ident_exttype
= idexttype
;
5956 id
->sadb_ident_type
= SADB_IDENTTYPE_FQDN
;
5957 bcopy(fqdn
, id
+ 1, fqdnlen
);
5958 p
+= sizeof(struct sadb_ident
) + PFKEY_ALIGN8(fqdnlen
);
5962 /* create identity extension (USERFQDN) */
5963 struct sadb_ident
*id
;
5967 /* +1 for terminating-NUL */
5968 userfqdnlen
= strlen(userfqdn
) + 1;
5971 id
= (struct sadb_ident
*)p
;
5972 bzero(id
, sizeof(*id
) + PFKEY_ALIGN8(userfqdnlen
));
5973 id
->sadb_ident_len
= PFKEY_UNIT64(sizeof(*id
) + PFKEY_ALIGN8(userfqdnlen
));
5974 id
->sadb_ident_exttype
= idexttype
;
5975 id
->sadb_ident_type
= SADB_IDENTTYPE_USERFQDN
;
5976 /* XXX is it correct? */
5977 if (curproc
&& curproc
->p_cred
)
5978 id
->sadb_ident_id
= curproc
->p_cred
->p_ruid
;
5979 if (userfqdn
&& userfqdnlen
)
5980 bcopy(userfqdn
, id
+ 1, userfqdnlen
);
5981 p
+= sizeof(struct sadb_ident
) + PFKEY_ALIGN8(userfqdnlen
);
5985 /* XXX sensitivity (optional) */
5987 /* create proposal/combination extension */
5988 m
= key_getprop(saidx
);
5991 * spec conformant: always attach proposal/combination extension,
5992 * the problem is that we have no way to attach it for ipcomp,
5993 * due to the way sadb_comb is declared in RFC2367.
6002 * outside of spec; make proposal/combination extension optional.
6008 if ((result
->m_flags
& M_PKTHDR
) == 0) {
6013 if (result
->m_len
< sizeof(struct sadb_msg
)) {
6014 result
= m_pullup(result
, sizeof(struct sadb_msg
));
6015 if (result
== NULL
) {
6021 result
->m_pkthdr
.len
= 0;
6022 for (m
= result
; m
; m
= m
->m_next
)
6023 result
->m_pkthdr
.len
+= m
->m_len
;
6025 mtod(result
, struct sadb_msg
*)->sadb_msg_len
=
6026 PFKEY_UNIT64(result
->m_pkthdr
.len
);
6028 return key_sendup_mbuf(NULL
, result
, KEY_SENDUP_REGISTERED
);
6036 #ifndef IPSEC_NONBLOCK_ACQUIRE
6037 static struct secacq
*
6039 struct secasindex
*saidx
;
6041 struct secacq
*newacq
;
6045 KMALLOC(newacq
, struct secacq
*, sizeof(struct secacq
));
6046 if (newacq
== NULL
) {
6047 ipseclog((LOG_DEBUG
, "key_newacq: No more memory.\n"));
6050 bzero(newacq
, sizeof(*newacq
));
6053 bcopy(saidx
, &newacq
->saidx
, sizeof(newacq
->saidx
));
6054 newacq
->seq
= (acq_seq
== ~0 ? 1 : ++acq_seq
);
6056 newacq
->created
= tv
.tv_sec
;
6062 static struct secacq
*
6064 struct secasindex
*saidx
;
6068 LIST_FOREACH(acq
, &acqtree
, chain
) {
6069 if (key_cmpsaidx(saidx
, &acq
->saidx
, CMP_EXACTLY
))
6076 static struct secacq
*
6077 key_getacqbyseq(seq
)
6082 LIST_FOREACH(acq
, &acqtree
, chain
) {
6083 if (acq
->seq
== seq
)
6091 static struct secspacq
*
6093 struct secpolicyindex
*spidx
;
6095 struct secspacq
*acq
;
6099 KMALLOC(acq
, struct secspacq
*, sizeof(struct secspacq
));
6101 ipseclog((LOG_DEBUG
, "key_newspacq: No more memory.\n"));
6104 bzero(acq
, sizeof(*acq
));
6107 bcopy(spidx
, &acq
->spidx
, sizeof(acq
->spidx
));
6109 acq
->created
= tv
.tv_sec
;
6115 static struct secspacq
*
6117 struct secpolicyindex
*spidx
;
6119 struct secspacq
*acq
;
6121 LIST_FOREACH(acq
, &spacqtree
, chain
) {
6122 if (key_cmpspidx_exactly(spidx
, &acq
->spidx
))
6130 * SADB_ACQUIRE processing,
6131 * in first situation, is receiving
6133 * from the ikmpd, and clear sequence of its secasvar entry.
6135 * In second situation, is receiving
6136 * <base, address(SD), (address(P),) (identity(SD),) (sensitivity,) proposal>
6137 * from a user land process, and return
6138 * <base, address(SD), (address(P),) (identity(SD),) (sensitivity,) proposal>
6141 * m will always be freed.
6144 key_acquire2(so
, m
, mhp
)
6147 const struct sadb_msghdr
*mhp
;
6149 const struct sadb_address
*src0
, *dst0
;
6150 struct secasindex saidx
;
6151 struct secashead
*sah
;
6156 if (so
== NULL
|| m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
)
6157 panic("key_acquire2: NULL pointer is passed.\n");
6160 * Error message from KMd.
6161 * We assume that if error was occured in IKEd, the length of PFKEY
6162 * message is equal to the size of sadb_msg structure.
6163 * We do not raise error even if error occured in this function.
6165 if (mhp
->msg
->sadb_msg_len
== PFKEY_UNIT64(sizeof(struct sadb_msg
))) {
6166 #ifndef IPSEC_NONBLOCK_ACQUIRE
6170 /* check sequence number */
6171 if (mhp
->msg
->sadb_msg_seq
== 0) {
6172 ipseclog((LOG_DEBUG
, "key_acquire2: must specify sequence number.\n"));
6177 if ((acq
= key_getacqbyseq(mhp
->msg
->sadb_msg_seq
)) == NULL
) {
6179 * the specified larval SA is already gone, or we got
6180 * a bogus sequence number. we can silently ignore it.
6186 /* reset acq counter in order to deletion by timehander. */
6188 acq
->created
= tv
.tv_sec
;
6196 * This message is from user land.
6199 /* map satype to proto */
6200 if ((proto
= key_satype2proto(mhp
->msg
->sadb_msg_satype
)) == 0) {
6201 ipseclog((LOG_DEBUG
, "key_acquire2: invalid satype is passed.\n"));
6202 return key_senderror(so
, m
, EINVAL
);
6205 if (mhp
->ext
[SADB_EXT_ADDRESS_SRC
] == NULL
||
6206 mhp
->ext
[SADB_EXT_ADDRESS_DST
] == NULL
||
6207 mhp
->ext
[SADB_EXT_PROPOSAL
] == NULL
) {
6209 ipseclog((LOG_DEBUG
, "key_acquire2: invalid message is passed.\n"));
6210 return key_senderror(so
, m
, EINVAL
);
6212 if (mhp
->extlen
[SADB_EXT_ADDRESS_SRC
] < sizeof(struct sadb_address
) ||
6213 mhp
->extlen
[SADB_EXT_ADDRESS_DST
] < sizeof(struct sadb_address
) ||
6214 mhp
->extlen
[SADB_EXT_PROPOSAL
] < sizeof(struct sadb_prop
)) {
6216 ipseclog((LOG_DEBUG
, "key_acquire2: invalid message is passed.\n"));
6217 return key_senderror(so
, m
, EINVAL
);
6220 src0
= (struct sadb_address
*)mhp
->ext
[SADB_EXT_ADDRESS_SRC
];
6221 dst0
= (struct sadb_address
*)mhp
->ext
[SADB_EXT_ADDRESS_DST
];
6223 /* XXX boundary check against sa_len */
6224 KEY_SETSECASIDX(proto
, IPSEC_MODE_ANY
, 0, src0
+ 1, dst0
+ 1, &saidx
);
6226 /* get a SA index */
6227 LIST_FOREACH(sah
, &sahtree
, chain
) {
6228 if (sah
->state
== SADB_SASTATE_DEAD
)
6230 if (key_cmpsaidx(&sah
->saidx
, &saidx
, CMP_MODE_REQID
))
6234 ipseclog((LOG_DEBUG
, "key_acquire2: a SA exists already.\n"));
6235 return key_senderror(so
, m
, EEXIST
);
6238 error
= key_acquire(&saidx
, NULL
);
6240 ipseclog((LOG_DEBUG
, "key_acquire2: error %d returned "
6241 "from key_acquire.\n", mhp
->msg
->sadb_msg_errno
));
6242 return key_senderror(so
, m
, error
);
6245 return key_sendup_mbuf(so
, m
, KEY_SENDUP_REGISTERED
);
6249 * SADB_REGISTER processing.
6250 * If SATYPE_UNSPEC has been passed as satype, only return sabd_supported.
6253 * from the ikmpd, and register a socket to send PF_KEY messages,
6257 * If socket is detached, must free from regnode.
6259 * m will always be freed.
6262 key_register(so
, m
, mhp
)
6265 const struct sadb_msghdr
*mhp
;
6267 struct secreg
*reg
, *newreg
= 0;
6270 if (so
== NULL
|| m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
)
6271 panic("key_register: NULL pointer is passed.\n");
6273 /* check for invalid register message */
6274 if (mhp
->msg
->sadb_msg_satype
>= sizeof(regtree
)/sizeof(regtree
[0]))
6275 return key_senderror(so
, m
, EINVAL
);
6277 /* When SATYPE_UNSPEC is specified, only return sabd_supported. */
6278 if (mhp
->msg
->sadb_msg_satype
== SADB_SATYPE_UNSPEC
)
6281 /* check whether existing or not */
6282 LIST_FOREACH(reg
, ®tree
[mhp
->msg
->sadb_msg_satype
], chain
) {
6283 if (reg
->so
== so
) {
6284 ipseclog((LOG_DEBUG
, "key_register: socket exists already.\n"));
6285 return key_senderror(so
, m
, EEXIST
);
6289 /* create regnode */
6290 KMALLOC(newreg
, struct secreg
*, sizeof(*newreg
));
6291 if (newreg
== NULL
) {
6292 ipseclog((LOG_DEBUG
, "key_register: No more memory.\n"));
6293 return key_senderror(so
, m
, ENOBUFS
);
6295 bzero((caddr_t
)newreg
, sizeof(*newreg
));
6298 ((struct keycb
*)sotorawcb(so
))->kp_registered
++;
6300 /* add regnode to regtree. */
6301 LIST_INSERT_HEAD(®tree
[mhp
->msg
->sadb_msg_satype
], newreg
, chain
);
6306 struct sadb_msg
*newmsg
;
6307 struct sadb_supported
*sup
;
6308 u_int len
, alen
, elen
;
6311 struct sadb_alg
*alg
;
6313 /* create new sadb_msg to reply. */
6315 for (i
= 1; i
<= SADB_AALG_MAX
; i
++) {
6316 if (ah_algorithm_lookup(i
))
6317 alen
+= sizeof(struct sadb_alg
);
6320 alen
+= sizeof(struct sadb_supported
);
6323 for (i
= 1; i
<= SADB_EALG_MAX
; i
++) {
6324 if (esp_algorithm_lookup(i
))
6325 elen
+= sizeof(struct sadb_alg
);
6328 elen
+= sizeof(struct sadb_supported
);
6331 len
= sizeof(struct sadb_msg
) + alen
+ elen
;
6334 return key_senderror(so
, m
, ENOBUFS
);
6336 MGETHDR(n
, M_DONTWAIT
, MT_DATA
);
6338 MCLGET(n
, M_DONTWAIT
);
6339 if ((n
->m_flags
& M_EXT
) == 0) {
6345 return key_senderror(so
, m
, ENOBUFS
);
6347 n
->m_pkthdr
.len
= n
->m_len
= len
;
6351 m_copydata(m
, 0, sizeof(struct sadb_msg
), mtod(n
, caddr_t
) + off
);
6352 newmsg
= mtod(n
, struct sadb_msg
*);
6353 newmsg
->sadb_msg_errno
= 0;
6354 newmsg
->sadb_msg_len
= PFKEY_UNIT64(len
);
6355 off
+= PFKEY_ALIGN8(sizeof(struct sadb_msg
));
6357 /* for authentication algorithm */
6359 sup
= (struct sadb_supported
*)(mtod(n
, caddr_t
) + off
);
6360 sup
->sadb_supported_len
= PFKEY_UNIT64(alen
);
6361 sup
->sadb_supported_exttype
= SADB_EXT_SUPPORTED_AUTH
;
6362 off
+= PFKEY_ALIGN8(sizeof(*sup
));
6364 for (i
= 1; i
<= SADB_AALG_MAX
; i
++) {
6365 const struct ah_algorithm
*aalgo
;
6367 aalgo
= ah_algorithm_lookup(i
);
6370 alg
= (struct sadb_alg
*)(mtod(n
, caddr_t
) + off
);
6371 alg
->sadb_alg_id
= i
;
6372 alg
->sadb_alg_ivlen
= 0;
6373 alg
->sadb_alg_minbits
= aalgo
->keymin
;
6374 alg
->sadb_alg_maxbits
= aalgo
->keymax
;
6375 off
+= PFKEY_ALIGN8(sizeof(*alg
));
6380 /* for encryption algorithm */
6382 sup
= (struct sadb_supported
*)(mtod(n
, caddr_t
) + off
);
6383 sup
->sadb_supported_len
= PFKEY_UNIT64(elen
);
6384 sup
->sadb_supported_exttype
= SADB_EXT_SUPPORTED_ENCRYPT
;
6385 off
+= PFKEY_ALIGN8(sizeof(*sup
));
6387 for (i
= 1; i
<= SADB_EALG_MAX
; i
++) {
6388 const struct esp_algorithm
*ealgo
;
6390 ealgo
= esp_algorithm_lookup(i
);
6393 alg
= (struct sadb_alg
*)(mtod(n
, caddr_t
) + off
);
6394 alg
->sadb_alg_id
= i
;
6395 if (ealgo
&& ealgo
->ivlen
) {
6397 * give NULL to get the value preferred by
6398 * algorithm XXX SADB_X_EXT_DERIV ?
6400 alg
->sadb_alg_ivlen
=
6401 (*ealgo
->ivlen
)(ealgo
, NULL
);
6403 alg
->sadb_alg_ivlen
= 0;
6404 alg
->sadb_alg_minbits
= ealgo
->keymin
;
6405 alg
->sadb_alg_maxbits
= ealgo
->keymax
;
6406 off
+= PFKEY_ALIGN8(sizeof(struct sadb_alg
));
6413 panic("length assumption failed in key_register");
6417 return key_sendup_mbuf(so
, n
, KEY_SENDUP_REGISTERED
);
6422 * free secreg entry registered.
6423 * XXX: I want to do free a socket marked done SADB_RESIGER to socket.
6434 panic("key_freereg: NULL pointer is passed.\n");
6437 * check whether existing or not.
6438 * check all type of SA, because there is a potential that
6439 * one socket is registered to multiple type of SA.
6441 for (i
= 0; i
<= SADB_SATYPE_MAX
; i
++) {
6442 LIST_FOREACH(reg
, ®tree
[i
], chain
) {
6444 && __LIST_CHAINED(reg
)) {
6445 LIST_REMOVE(reg
, chain
);
6456 * SADB_EXPIRE processing
6458 * <base, SA, SA2, lifetime(C and one of HS), address(SD)>
6460 * NOTE: We send only soft lifetime extension.
6463 * others : error number
6467 struct secasvar
*sav
;
6471 struct mbuf
*result
= NULL
, *m
;
6474 struct sadb_lifetime
*lt
;
6476 /* XXX: Why do we lock ? */
6477 s
= splnet(); /*called from softclock()*/
6481 panic("key_expire: NULL pointer is passed.\n");
6482 if (sav
->sah
== NULL
)
6483 panic("key_expire: Why was SA index in SA NULL.\n");
6484 if ((satype
= key_proto2satype(sav
->sah
->saidx
.proto
)) == 0)
6485 panic("key_expire: invalid proto is passed.\n");
6487 /* set msg header */
6488 m
= key_setsadbmsg(SADB_EXPIRE
, 0, satype
, sav
->seq
, 0, sav
->refcnt
);
6495 /* create SA extension */
6496 m
= key_setsadbsa(sav
);
6503 /* create SA extension */
6504 m
= key_setsadbxsa2(sav
->sah
->saidx
.mode
,
6505 sav
->replay
? sav
->replay
->count
: 0,
6506 sav
->sah
->saidx
.reqid
);
6513 /* create lifetime extension (current and soft) */
6514 len
= PFKEY_ALIGN8(sizeof(*lt
)) * 2;
6515 m
= key_alloc_mbuf(len
);
6516 if (!m
|| m
->m_next
) { /*XXX*/
6522 bzero(mtod(m
, caddr_t
), len
);
6523 lt
= mtod(m
, struct sadb_lifetime
*);
6524 lt
->sadb_lifetime_len
= PFKEY_UNIT64(sizeof(struct sadb_lifetime
));
6525 lt
->sadb_lifetime_exttype
= SADB_EXT_LIFETIME_CURRENT
;
6526 lt
->sadb_lifetime_allocations
= sav
->lft_c
->sadb_lifetime_allocations
;
6527 lt
->sadb_lifetime_bytes
= sav
->lft_c
->sadb_lifetime_bytes
;
6528 lt
->sadb_lifetime_addtime
= sav
->lft_c
->sadb_lifetime_addtime
;
6529 lt
->sadb_lifetime_usetime
= sav
->lft_c
->sadb_lifetime_usetime
;
6530 lt
= (struct sadb_lifetime
*)(mtod(m
, caddr_t
) + len
/ 2);
6531 bcopy(sav
->lft_s
, lt
, sizeof(*lt
));
6534 /* set sadb_address for source */
6535 m
= key_setsadbaddr(SADB_EXT_ADDRESS_SRC
,
6536 (struct sockaddr
*)&sav
->sah
->saidx
.src
,
6537 FULLMASK
, IPSEC_ULPROTO_ANY
);
6544 /* set sadb_address for destination */
6545 m
= key_setsadbaddr(SADB_EXT_ADDRESS_DST
,
6546 (struct sockaddr
*)&sav
->sah
->saidx
.dst
,
6547 FULLMASK
, IPSEC_ULPROTO_ANY
);
6554 if ((result
->m_flags
& M_PKTHDR
) == 0) {
6559 if (result
->m_len
< sizeof(struct sadb_msg
)) {
6560 result
= m_pullup(result
, sizeof(struct sadb_msg
));
6561 if (result
== NULL
) {
6567 result
->m_pkthdr
.len
= 0;
6568 for (m
= result
; m
; m
= m
->m_next
)
6569 result
->m_pkthdr
.len
+= m
->m_len
;
6571 mtod(result
, struct sadb_msg
*)->sadb_msg_len
=
6572 PFKEY_UNIT64(result
->m_pkthdr
.len
);
6575 return key_sendup_mbuf(NULL
, result
, KEY_SENDUP_REGISTERED
);
6585 * SADB_FLUSH processing
6588 * from the ikmpd, and free all entries in secastree.
6592 * NOTE: to do is only marking SADB_SASTATE_DEAD.
6594 * m will always be freed.
6597 key_flush(so
, m
, mhp
)
6600 const struct sadb_msghdr
*mhp
;
6602 struct sadb_msg
*newmsg
;
6603 struct secashead
*sah
, *nextsah
;
6604 struct secasvar
*sav
, *nextsav
;
6610 if (so
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
)
6611 panic("key_flush: NULL pointer is passed.\n");
6613 /* map satype to proto */
6614 if ((proto
= key_satype2proto(mhp
->msg
->sadb_msg_satype
)) == 0) {
6615 ipseclog((LOG_DEBUG
, "key_flush: invalid satype is passed.\n"));
6616 return key_senderror(so
, m
, EINVAL
);
6619 /* no SATYPE specified, i.e. flushing all SA. */
6620 for (sah
= LIST_FIRST(&sahtree
);
6623 nextsah
= LIST_NEXT(sah
, chain
);
6625 if (mhp
->msg
->sadb_msg_satype
!= SADB_SATYPE_UNSPEC
6626 && proto
!= sah
->saidx
.proto
)
6630 stateidx
< _ARRAYLEN(saorder_state_alive
);
6632 state
= saorder_state_any
[stateidx
];
6633 for (sav
= LIST_FIRST(&sah
->savtree
[state
]);
6637 nextsav
= LIST_NEXT(sav
, chain
);
6639 key_sa_chgstate(sav
, SADB_SASTATE_DEAD
);
6644 sah
->state
= SADB_SASTATE_DEAD
;
6647 if (m
->m_len
< sizeof(struct sadb_msg
) ||
6648 sizeof(struct sadb_msg
) > m
->m_len
+ M_TRAILINGSPACE(m
)) {
6649 ipseclog((LOG_DEBUG
, "key_flush: No more memory.\n"));
6650 return key_senderror(so
, m
, ENOBUFS
);
6656 m
->m_pkthdr
.len
= m
->m_len
= sizeof(struct sadb_msg
);
6657 newmsg
= mtod(m
, struct sadb_msg
*);
6658 newmsg
->sadb_msg_errno
= 0;
6659 newmsg
->sadb_msg_len
= PFKEY_UNIT64(m
->m_pkthdr
.len
);
6661 return key_sendup_mbuf(so
, m
, KEY_SENDUP_ALL
);
6665 * SADB_DUMP processing
6666 * dump all entries including status of DEAD in SAD.
6669 * from the ikmpd, and dump all secasvar leaves
6674 * m will always be freed.
6677 key_dump(so
, m
, mhp
)
6680 const struct sadb_msghdr
*mhp
;
6682 struct secashead
*sah
;
6683 struct secasvar
*sav
;
6689 struct sadb_msg
*newmsg
;
6693 if (so
== NULL
|| m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
)
6694 panic("key_dump: NULL pointer is passed.\n");
6696 /* map satype to proto */
6697 if ((proto
= key_satype2proto(mhp
->msg
->sadb_msg_satype
)) == 0) {
6698 ipseclog((LOG_DEBUG
, "key_dump: invalid satype is passed.\n"));
6699 return key_senderror(so
, m
, EINVAL
);
6702 /* count sav entries to be sent to the userland. */
6704 LIST_FOREACH(sah
, &sahtree
, chain
) {
6705 if (mhp
->msg
->sadb_msg_satype
!= SADB_SATYPE_UNSPEC
6706 && proto
!= sah
->saidx
.proto
)
6710 stateidx
< _ARRAYLEN(saorder_state_any
);
6712 state
= saorder_state_any
[stateidx
];
6713 LIST_FOREACH(sav
, &sah
->savtree
[state
], chain
) {
6720 return key_senderror(so
, m
, ENOENT
);
6722 /* send this to the userland, one at a time. */
6724 LIST_FOREACH(sah
, &sahtree
, chain
) {
6725 if (mhp
->msg
->sadb_msg_satype
!= SADB_SATYPE_UNSPEC
6726 && proto
!= sah
->saidx
.proto
)
6729 /* map proto to satype */
6730 if ((satype
= key_proto2satype(sah
->saidx
.proto
)) == 0) {
6731 ipseclog((LOG_DEBUG
, "key_dump: there was invalid proto in SAD.\n"));
6732 return key_senderror(so
, m
, EINVAL
);
6736 stateidx
< _ARRAYLEN(saorder_state_any
);
6738 state
= saorder_state_any
[stateidx
];
6739 LIST_FOREACH(sav
, &sah
->savtree
[state
], chain
) {
6740 n
= key_setdumpsa(sav
, SADB_DUMP
, satype
,
6741 --cnt
, mhp
->msg
->sadb_msg_pid
);
6743 return key_senderror(so
, m
, ENOBUFS
);
6745 key_sendup_mbuf(so
, n
, KEY_SENDUP_ONE
);
6755 * SADB_X_PROMISC processing
6757 * m will always be freed.
6760 key_promisc(so
, m
, mhp
)
6763 const struct sadb_msghdr
*mhp
;
6768 if (so
== NULL
|| m
== NULL
|| mhp
== NULL
|| mhp
->msg
== NULL
)
6769 panic("key_promisc: NULL pointer is passed.\n");
6771 olen
= PFKEY_UNUNIT64(mhp
->msg
->sadb_msg_len
);
6773 if (olen
< sizeof(struct sadb_msg
)) {
6775 return key_senderror(so
, m
, EINVAL
);
6780 } else if (olen
== sizeof(struct sadb_msg
)) {
6781 /* enable/disable promisc mode */
6784 if ((kp
= (struct keycb
*)sotorawcb(so
)) == NULL
)
6785 return key_senderror(so
, m
, EINVAL
);
6786 mhp
->msg
->sadb_msg_errno
= 0;
6787 switch (mhp
->msg
->sadb_msg_satype
) {
6790 kp
->kp_promisc
= mhp
->msg
->sadb_msg_satype
;
6793 return key_senderror(so
, m
, EINVAL
);
6796 /* send the original message back to everyone */
6797 mhp
->msg
->sadb_msg_errno
= 0;
6798 return key_sendup_mbuf(so
, m
, KEY_SENDUP_ALL
);
6800 /* send packet as is */
6802 m_adj(m
, PFKEY_ALIGN8(sizeof(struct sadb_msg
)));
6804 /* TODO: if sadb_msg_seq is specified, send to specific pid */
6805 return key_sendup_mbuf(so
, m
, KEY_SENDUP_ALL
);
6809 static int (*key_typesw
[]) __P((struct socket
*, struct mbuf
*,
6810 const struct sadb_msghdr
*)) = {
6811 NULL
, /* SADB_RESERVED */
6812 key_getspi
, /* SADB_GETSPI */
6813 key_update
, /* SADB_UPDATE */
6814 key_add
, /* SADB_ADD */
6815 key_delete
, /* SADB_DELETE */
6816 key_get
, /* SADB_GET */
6817 key_acquire2
, /* SADB_ACQUIRE */
6818 key_register
, /* SADB_REGISTER */
6819 NULL
, /* SADB_EXPIRE */
6820 key_flush
, /* SADB_FLUSH */
6821 key_dump
, /* SADB_DUMP */
6822 key_promisc
, /* SADB_X_PROMISC */
6823 NULL
, /* SADB_X_PCHANGE */
6824 key_spdadd
, /* SADB_X_SPDUPDATE */
6825 key_spdadd
, /* SADB_X_SPDADD */
6826 key_spddelete
, /* SADB_X_SPDDELETE */
6827 key_spdget
, /* SADB_X_SPDGET */
6828 NULL
, /* SADB_X_SPDACQUIRE */
6829 key_spddump
, /* SADB_X_SPDDUMP */
6830 key_spdflush
, /* SADB_X_SPDFLUSH */
6831 key_spdadd
, /* SADB_X_SPDSETIDX */
6832 NULL
, /* SADB_X_SPDEXPIRE */
6833 key_spddelete2
, /* SADB_X_SPDDELETE2 */
6837 * parse sadb_msg buffer to process PFKEYv2,
6838 * and create a data to response if needed.
6839 * I think to be dealed with mbuf directly.
6841 * msgp : pointer to pointer to a received buffer pulluped.
6842 * This is rewrited to response.
6843 * so : pointer to socket.
6845 * length for buffer to send to user process.
6852 struct sadb_msg
*msg
;
6853 struct sadb_msghdr mh
;
6859 if (m
== NULL
|| so
== NULL
)
6860 panic("key_parse: NULL pointer is passed.\n");
6862 #if 0 /*kdebug_sadb assumes msg in linear buffer*/
6863 KEYDEBUG(KEYDEBUG_KEY_DUMP
,
6864 ipseclog((LOG_DEBUG
, "key_parse: passed sadb_msg\n"));
6868 if (m
->m_len
< sizeof(struct sadb_msg
)) {
6869 m
= m_pullup(m
, sizeof(struct sadb_msg
));
6873 msg
= mtod(m
, struct sadb_msg
*);
6874 orglen
= PFKEY_UNUNIT64(msg
->sadb_msg_len
);
6875 target
= KEY_SENDUP_ONE
;
6877 if ((m
->m_flags
& M_PKTHDR
) == 0 ||
6878 m
->m_pkthdr
.len
!= m
->m_pkthdr
.len
) {
6879 ipseclog((LOG_DEBUG
, "key_parse: invalid message length.\n"));
6880 pfkeystat
.out_invlen
++;
6885 if (msg
->sadb_msg_version
!= PF_KEY_V2
) {
6886 ipseclog((LOG_DEBUG
,
6887 "key_parse: PF_KEY version %u is mismatched.\n",
6888 msg
->sadb_msg_version
));
6889 pfkeystat
.out_invver
++;
6894 if (msg
->sadb_msg_type
> SADB_MAX
) {
6895 ipseclog((LOG_DEBUG
, "key_parse: invalid type %u is passed.\n",
6896 msg
->sadb_msg_type
));
6897 pfkeystat
.out_invmsgtype
++;
6902 /* for old-fashioned code - should be nuked */
6903 if (m
->m_pkthdr
.len
> MCLBYTES
) {
6910 MGETHDR(n
, M_DONTWAIT
, MT_DATA
);
6911 if (n
&& m
->m_pkthdr
.len
> MHLEN
) {
6912 MCLGET(n
, M_DONTWAIT
);
6913 if ((n
->m_flags
& M_EXT
) == 0) {
6922 m_copydata(m
, 0, m
->m_pkthdr
.len
, mtod(n
, caddr_t
));
6923 n
->m_pkthdr
.len
= n
->m_len
= m
->m_pkthdr
.len
;
6929 /* align the mbuf chain so that extensions are in contiguous region. */
6930 error
= key_align(m
, &mh
);
6934 if (m
->m_next
) { /*XXX*/
6942 switch (msg
->sadb_msg_satype
) {
6943 case SADB_SATYPE_UNSPEC
:
6944 switch (msg
->sadb_msg_type
) {
6952 ipseclog((LOG_DEBUG
, "key_parse: must specify satype "
6953 "when msg type=%u.\n", msg
->sadb_msg_type
));
6954 pfkeystat
.out_invsatype
++;
6959 case SADB_SATYPE_AH
:
6960 case SADB_SATYPE_ESP
:
6961 case SADB_X_SATYPE_IPCOMP
:
6962 switch (msg
->sadb_msg_type
) {
6964 case SADB_X_SPDDELETE
:
6966 case SADB_X_SPDDUMP
:
6967 case SADB_X_SPDFLUSH
:
6968 case SADB_X_SPDSETIDX
:
6969 case SADB_X_SPDUPDATE
:
6970 case SADB_X_SPDDELETE2
:
6971 ipseclog((LOG_DEBUG
, "key_parse: illegal satype=%u\n",
6972 msg
->sadb_msg_type
));
6973 pfkeystat
.out_invsatype
++;
6978 case SADB_SATYPE_RSVP
:
6979 case SADB_SATYPE_OSPFV2
:
6980 case SADB_SATYPE_RIPV2
:
6981 case SADB_SATYPE_MIP
:
6982 ipseclog((LOG_DEBUG
, "key_parse: type %u isn't supported.\n",
6983 msg
->sadb_msg_satype
));
6984 pfkeystat
.out_invsatype
++;
6987 case 1: /* XXX: What does it do? */
6988 if (msg
->sadb_msg_type
== SADB_X_PROMISC
)
6992 ipseclog((LOG_DEBUG
, "key_parse: invalid type %u is passed.\n",
6993 msg
->sadb_msg_satype
));
6994 pfkeystat
.out_invsatype
++;
6999 /* check field of upper layer protocol and address family */
7000 if (mh
.ext
[SADB_EXT_ADDRESS_SRC
] != NULL
7001 && mh
.ext
[SADB_EXT_ADDRESS_DST
] != NULL
) {
7002 struct sadb_address
*src0
, *dst0
;
7005 src0
= (struct sadb_address
*)(mh
.ext
[SADB_EXT_ADDRESS_SRC
]);
7006 dst0
= (struct sadb_address
*)(mh
.ext
[SADB_EXT_ADDRESS_DST
]);
7008 /* check upper layer protocol */
7009 if (src0
->sadb_address_proto
!= dst0
->sadb_address_proto
) {
7010 ipseclog((LOG_DEBUG
, "key_parse: upper layer protocol mismatched.\n"));
7011 pfkeystat
.out_invaddr
++;
7017 if (PFKEY_ADDR_SADDR(src0
)->sa_family
!=
7018 PFKEY_ADDR_SADDR(dst0
)->sa_family
) {
7019 ipseclog((LOG_DEBUG
, "key_parse: address family mismatched.\n"));
7020 pfkeystat
.out_invaddr
++;
7024 if (PFKEY_ADDR_SADDR(src0
)->sa_len
!=
7025 PFKEY_ADDR_SADDR(dst0
)->sa_len
) {
7026 ipseclog((LOG_DEBUG
,
7027 "key_parse: address struct size mismatched.\n"));
7028 pfkeystat
.out_invaddr
++;
7033 switch (PFKEY_ADDR_SADDR(src0
)->sa_family
) {
7035 if (PFKEY_ADDR_SADDR(src0
)->sa_len
!=
7036 sizeof(struct sockaddr_in
)) {
7037 pfkeystat
.out_invaddr
++;
7043 if (PFKEY_ADDR_SADDR(src0
)->sa_len
!=
7044 sizeof(struct sockaddr_in6
)) {
7045 pfkeystat
.out_invaddr
++;
7051 ipseclog((LOG_DEBUG
,
7052 "key_parse: unsupported address family.\n"));
7053 pfkeystat
.out_invaddr
++;
7054 error
= EAFNOSUPPORT
;
7058 switch (PFKEY_ADDR_SADDR(src0
)->sa_family
) {
7060 plen
= sizeof(struct in_addr
) << 3;
7063 plen
= sizeof(struct in6_addr
) << 3;
7066 plen
= 0; /*fool gcc*/
7070 /* check max prefix length */
7071 if (src0
->sadb_address_prefixlen
> plen
||
7072 dst0
->sadb_address_prefixlen
> plen
) {
7073 ipseclog((LOG_DEBUG
,
7074 "key_parse: illegal prefixlen.\n"));
7075 pfkeystat
.out_invaddr
++;
7081 * prefixlen == 0 is valid because there can be a case when
7082 * all addresses are matched.
7086 if (msg
->sadb_msg_type
>= sizeof(key_typesw
)/sizeof(key_typesw
[0]) ||
7087 key_typesw
[msg
->sadb_msg_type
] == NULL
) {
7088 pfkeystat
.out_invmsgtype
++;
7093 return (*key_typesw
[msg
->sadb_msg_type
])(so
, m
, &mh
);
7096 msg
->sadb_msg_errno
= error
;
7097 return key_sendup_mbuf(so
, m
, target
);
7101 key_senderror(so
, m
, code
)
7106 struct sadb_msg
*msg
;
7108 if (m
->m_len
< sizeof(struct sadb_msg
))
7109 panic("invalid mbuf passed to key_senderror");
7111 msg
= mtod(m
, struct sadb_msg
*);
7112 msg
->sadb_msg_errno
= code
;
7113 return key_sendup_mbuf(so
, m
, KEY_SENDUP_ONE
);
7117 * set the pointer to each header into message buffer.
7118 * m will be freed on error.
7119 * XXX larger-than-MCLBYTES extension?
7124 struct sadb_msghdr
*mhp
;
7127 struct sadb_ext
*ext
;
7133 if (m
== NULL
|| mhp
== NULL
)
7134 panic("key_align: NULL pointer is passed.\n");
7135 if (m
->m_len
< sizeof(struct sadb_msg
))
7136 panic("invalid mbuf passed to key_align");
7139 bzero(mhp
, sizeof(*mhp
));
7141 mhp
->msg
= mtod(m
, struct sadb_msg
*);
7142 mhp
->ext
[0] = (struct sadb_ext
*)mhp
->msg
; /*XXX backward compat */
7144 end
= PFKEY_UNUNIT64(mhp
->msg
->sadb_msg_len
);
7145 extlen
= end
; /*just in case extlen is not updated*/
7146 for (off
= sizeof(struct sadb_msg
); off
< end
; off
+= extlen
) {
7147 n
= m_pulldown(m
, off
, sizeof(struct sadb_ext
), &toff
);
7149 /* m is already freed */
7152 ext
= (struct sadb_ext
*)(mtod(n
, caddr_t
) + toff
);
7155 switch (ext
->sadb_ext_type
) {
7157 case SADB_EXT_ADDRESS_SRC
:
7158 case SADB_EXT_ADDRESS_DST
:
7159 case SADB_EXT_ADDRESS_PROXY
:
7160 case SADB_EXT_LIFETIME_CURRENT
:
7161 case SADB_EXT_LIFETIME_HARD
:
7162 case SADB_EXT_LIFETIME_SOFT
:
7163 case SADB_EXT_KEY_AUTH
:
7164 case SADB_EXT_KEY_ENCRYPT
:
7165 case SADB_EXT_IDENTITY_SRC
:
7166 case SADB_EXT_IDENTITY_DST
:
7167 case SADB_EXT_SENSITIVITY
:
7168 case SADB_EXT_PROPOSAL
:
7169 case SADB_EXT_SUPPORTED_AUTH
:
7170 case SADB_EXT_SUPPORTED_ENCRYPT
:
7171 case SADB_EXT_SPIRANGE
:
7172 case SADB_X_EXT_POLICY
:
7173 case SADB_X_EXT_SA2
:
7174 /* duplicate check */
7176 * XXX Are there duplication payloads of either
7177 * KEY_AUTH or KEY_ENCRYPT ?
7179 if (mhp
->ext
[ext
->sadb_ext_type
] != NULL
) {
7180 ipseclog((LOG_DEBUG
,
7181 "key_align: duplicate ext_type %u "
7182 "is passed.\n", ext
->sadb_ext_type
));
7184 pfkeystat
.out_dupext
++;
7189 ipseclog((LOG_DEBUG
,
7190 "key_align: invalid ext_type %u is passed.\n",
7191 ext
->sadb_ext_type
));
7193 pfkeystat
.out_invexttype
++;
7197 extlen
= PFKEY_UNUNIT64(ext
->sadb_ext_len
);
7199 if (key_validate_ext(ext
, extlen
)) {
7201 pfkeystat
.out_invlen
++;
7205 n
= m_pulldown(m
, off
, extlen
, &toff
);
7207 /* m is already freed */
7210 ext
= (struct sadb_ext
*)(mtod(n
, caddr_t
) + toff
);
7212 mhp
->ext
[ext
->sadb_ext_type
] = ext
;
7213 mhp
->extoff
[ext
->sadb_ext_type
] = off
;
7214 mhp
->extlen
[ext
->sadb_ext_type
] = extlen
;
7219 pfkeystat
.out_invlen
++;
7227 key_validate_ext(ext
, len
)
7228 const struct sadb_ext
*ext
;
7231 struct sockaddr
*sa
;
7232 enum { NONE
, ADDR
} checktype
= NONE
;
7234 const int sal
= offsetof(struct sockaddr
, sa_len
) + sizeof(sa
->sa_len
);
7236 if (len
!= PFKEY_UNUNIT64(ext
->sadb_ext_len
))
7239 /* if it does not match minimum/maximum length, bail */
7240 if (ext
->sadb_ext_type
>= sizeof(minsize
) / sizeof(minsize
[0]) ||
7241 ext
->sadb_ext_type
>= sizeof(maxsize
) / sizeof(maxsize
[0]))
7243 if (!minsize
[ext
->sadb_ext_type
] || len
< minsize
[ext
->sadb_ext_type
])
7245 if (maxsize
[ext
->sadb_ext_type
] && len
> maxsize
[ext
->sadb_ext_type
])
7248 /* more checks based on sadb_ext_type XXX need more */
7249 switch (ext
->sadb_ext_type
) {
7250 case SADB_EXT_ADDRESS_SRC
:
7251 case SADB_EXT_ADDRESS_DST
:
7252 case SADB_EXT_ADDRESS_PROXY
:
7253 baselen
= PFKEY_ALIGN8(sizeof(struct sadb_address
));
7256 case SADB_EXT_IDENTITY_SRC
:
7257 case SADB_EXT_IDENTITY_DST
:
7258 if (((struct sadb_ident
*)ext
)->sadb_ident_type
==
7259 SADB_X_IDENTTYPE_ADDR
) {
7260 baselen
= PFKEY_ALIGN8(sizeof(struct sadb_ident
));
7270 switch (checktype
) {
7274 sa
= (struct sockaddr
*)((caddr_t
)ext
+ baselen
);
7275 if (len
< baselen
+ sal
)
7277 if (baselen
+ PFKEY_ALIGN8(sa
->sa_len
) != len
)
7290 bzero((caddr_t
)&key_cb
, sizeof(key_cb
));
7292 for (i
= 0; i
< IPSEC_DIR_MAX
; i
++) {
7293 LIST_INIT(&sptree
[i
]);
7296 LIST_INIT(&sahtree
);
7298 for (i
= 0; i
<= SADB_SATYPE_MAX
; i
++) {
7299 LIST_INIT(®tree
[i
]);
7302 #ifndef IPSEC_NONBLOCK_ACQUIRE
7303 LIST_INIT(&acqtree
);
7305 LIST_INIT(&spacqtree
);
7307 /* system default */
7309 ip4_def_policy
.policy
= IPSEC_POLICY_NONE
;
7310 ip4_def_policy
.refcnt
++; /*never reclaim this*/
7313 ip6_def_policy
.policy
= IPSEC_POLICY_NONE
;
7314 ip6_def_policy
.refcnt
++; /*never reclaim this*/
7317 #ifndef IPSEC_DEBUG2
7318 timeout((void *)key_timehandler_funnel
, (void *)0, hz
);
7319 #endif /*IPSEC_DEBUG2*/
7321 /* initialize key statistics */
7322 keystat
.getspi_count
= 1;
7325 printf("IPsec: Initialized Security Association Processing.\n");
7332 * XXX: maybe This function is called after INBOUND IPsec processing.
7334 * Special check for tunnel-mode packets.
7335 * We must make some checks for consistency between inner and outer IP header.
7337 * xxx more checks to be provided
7340 key_checktunnelsanity(sav
, family
, src
, dst
)
7341 struct secasvar
*sav
;
7347 if (sav
->sah
== NULL
)
7348 panic("sav->sah == NULL at key_checktunnelsanity");
7350 /* XXX: check inner IP header */
7356 #define hostnamelen strlen(hostname)
7359 * Get FQDN for the host.
7360 * If the administrator configured hostname (by hostname(1)) without
7361 * domain name, returns nothing.
7368 static char fqdn
[MAXHOSTNAMELEN
+ 1];
7373 /* check if it comes with domain name. */
7375 for (i
= 0; i
< hostnamelen
; i
++) {
7376 if (hostname
[i
] == '.')
7382 /* NOTE: hostname may not be NUL-terminated. */
7383 bzero(fqdn
, sizeof(fqdn
));
7384 bcopy(hostname
, fqdn
, hostnamelen
);
7385 fqdn
[hostnamelen
] = '\0';
7390 * get username@FQDN for the host/user.
7396 static char userfqdn
[MAXHOSTNAMELEN
+ MAXLOGNAME
+ 2];
7397 struct proc
*p
= curproc
;
7400 if (!p
|| !p
->p_pgrp
|| !p
->p_pgrp
->pg_session
)
7402 if (!(host
= key_getfqdn()))
7405 /* NOTE: s_login may not be-NUL terminated. */
7406 bzero(userfqdn
, sizeof(userfqdn
));
7407 bcopy(p
->p_pgrp
->pg_session
->s_login
, userfqdn
, MAXLOGNAME
);
7408 userfqdn
[MAXLOGNAME
] = '\0'; /* safeguard */
7409 q
= userfqdn
+ strlen(userfqdn
);
7411 bcopy(host
, q
, strlen(host
));
7419 /* record data transfer on SA, and update timestamps */
7421 key_sa_recordxfer(sav
, m
)
7422 struct secasvar
*sav
;
7426 panic("key_sa_recordxfer called with sav == NULL");
7428 panic("key_sa_recordxfer called with m == NULL");
7433 * XXX Currently, there is a difference of bytes size
7434 * between inbound and outbound processing.
7436 sav
->lft_c
->sadb_lifetime_bytes
+= m
->m_pkthdr
.len
;
7437 /* to check bytes lifetime is done in key_timehandler(). */
7440 * We use the number of packets as the unit of
7441 * sadb_lifetime_allocations. We increment the variable
7442 * whenever {esp,ah}_{in,out}put is called.
7444 sav
->lft_c
->sadb_lifetime_allocations
++;
7445 /* XXX check for expires? */
7448 * NOTE: We record CURRENT sadb_lifetime_usetime by using wall clock,
7449 * in seconds. HARD and SOFT lifetime are measured by the time
7450 * difference (again in seconds) from sadb_lifetime_usetime.
7454 * -----+-----+--------+---> t
7455 * <--------------> HARD
7461 sav
->lft_c
->sadb_lifetime_usetime
= tv
.tv_sec
;
7462 /* XXX check for expires? */
7470 key_sa_routechange(dst
)
7471 struct sockaddr
*dst
;
7473 struct secashead
*sah
;
7476 LIST_FOREACH(sah
, &sahtree
, chain
) {
7477 ro
= &sah
->sa_route
;
7478 if (ro
->ro_rt
&& dst
->sa_len
== ro
->ro_dst
.sa_len
7479 && bcmp(dst
, &ro
->ro_dst
, dst
->sa_len
) == 0) {
7481 ro
->ro_rt
= (struct rtentry
*)NULL
;
7489 key_sa_chgstate(sav
, state
)
7490 struct secasvar
*sav
;
7494 panic("key_sa_chgstate called with sav == NULL");
7496 if (sav
->state
== state
)
7499 if (__LIST_CHAINED(sav
))
7500 LIST_REMOVE(sav
, chain
);
7503 LIST_INSERT_HEAD(&sav
->sah
->savtree
[state
], sav
, chain
);
7508 struct secasvar
*sav
;
7512 panic("key_sa_stir_iv called with sav == NULL");
7513 key_randomfill(sav
->iv
, sav
->ivlen
);
7517 static struct mbuf
*
7521 struct mbuf
*m
= NULL
, *n
;
7526 MGET(n
, M_DONTWAIT
, MT_DATA
);
7527 if (n
&& len
> MLEN
)
7528 MCLGET(n
, M_DONTWAIT
);
7536 n
->m_len
= M_TRAILINGSPACE(n
);
7537 /* use the bottom of mbuf, hoping we can prepend afterwards */
7538 if (n
->m_len
> len
) {
7539 t
= (n
->m_len
- len
) & ~(sizeof(long) - 1);