key.c revision 185348
15649SN/A/* $FreeBSD: head/sys/netipsec/key.c 185348 2008-11-26 22:32:07Z zec $ */ 26073SN/A/* $KAME: key.c,v 1.191 2001/06/27 10:46:49 sakane Exp $ */ 35649SN/A 45649SN/A/*- 55649SN/A * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. 65649SN/A * All rights reserved. 75649SN/A * 85649SN/A * Redistribution and use in source and binary forms, with or without 95649SN/A * modification, are permitted provided that the following conditions 105649SN/A * are met: 115649SN/A * 1. Redistributions of source code must retain the above copyright 125649SN/A * notice, this list of conditions and the following disclaimer. 135649SN/A * 2. Redistributions in binary form must reproduce the above copyright 145649SN/A * notice, this list of conditions and the following disclaimer in the 155649SN/A * documentation and/or other materials provided with the distribution. 165649SN/A * 3. Neither the name of the project nor the names of its contributors 175649SN/A * may be used to endorse or promote products derived from this software 185649SN/A * without specific prior written permission. 195649SN/A * 205649SN/A * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND 215649SN/A * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 225649SN/A * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 235649SN/A * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE 245649SN/A * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 255649SN/A * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 265649SN/A * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 275649SN/A * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 285649SN/A * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 295649SN/A * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 305649SN/A * SUCH DAMAGE. 315649SN/A */ 325649SN/A 335649SN/A/* 345649SN/A * This code is referd to RFC 2367 355649SN/A */ 365649SN/A 375649SN/A#include "opt_inet.h" 385649SN/A#include "opt_inet6.h" 395649SN/A#include "opt_ipsec.h" 405649SN/A 415649SN/A#include <sys/types.h> 425649SN/A#include <sys/param.h> 435649SN/A#include <sys/systm.h> 445649SN/A#include <sys/kernel.h> 455649SN/A#include <sys/lock.h> 465649SN/A#include <sys/mutex.h> 475649SN/A#include <sys/mbuf.h> 485649SN/A#include <sys/domain.h> 495649SN/A#include <sys/protosw.h> 505649SN/A#include <sys/malloc.h> 515649SN/A#include <sys/socket.h> 525649SN/A#include <sys/socketvar.h> 535649SN/A#include <sys/sysctl.h> 545649SN/A#include <sys/errno.h> 555649SN/A#include <sys/proc.h> 565649SN/A#include <sys/queue.h> 575649SN/A#include <sys/refcount.h> 585649SN/A#include <sys/syslog.h> 595649SN/A#include <sys/vimage.h> 605649SN/A 615649SN/A#include <net/if.h> 625649SN/A#include <net/route.h> 635649SN/A#include <net/raw_cb.h> 645649SN/A 655649SN/A#include <netinet/in.h> 665649SN/A#include <netinet/in_systm.h> 675649SN/A#include <netinet/ip.h> 68#include <netinet/in_var.h> 69 70#ifdef INET6 71#include <netinet/ip6.h> 72#include <netinet6/in6_var.h> 73#include <netinet6/ip6_var.h> 74#endif /* INET6 */ 75 76#ifdef INET 77#include <netinet/in_pcb.h> 78#endif 79#ifdef INET6 80#include <netinet6/in6_pcb.h> 81#endif /* INET6 */ 82 83#include <net/pfkeyv2.h> 84#include <netipsec/keydb.h> 85#include <netipsec/key.h> 86#include <netipsec/keysock.h> 87#include <netipsec/key_debug.h> 88 89#include <netipsec/ipsec.h> 90#ifdef INET6 91#include <netipsec/ipsec6.h> 92#endif 93 94#include <netipsec/xform.h> 95 96#include <machine/stdarg.h> 97 98/* randomness */ 99#include <sys/random.h> 100#include <sys/vimage.h> 101 102#define FULLMASK 0xff 103#define _BITS(bytes) ((bytes) << 3) 104 105/* 106 * Note on SA reference counting: 107 * - SAs that are not in DEAD state will have (total external reference + 1) 108 * following value in reference count field. they cannot be freed and are 109 * referenced from SA header. 110 * - SAs that are in DEAD state will have (total external reference) 111 * in reference count field. they are ready to be freed. reference from 112 * SA header will be removed in key_delsav(), when the reference count 113 * field hits 0 (= no external reference other than from SA header. 114 */ 115 116#ifdef VIMAGE_GLOBALS 117u_int32_t key_debug_level; 118static u_int key_spi_trycnt; 119static u_int32_t key_spi_minval; 120static u_int32_t key_spi_maxval; 121static u_int32_t policy_id; 122static u_int key_int_random; 123static u_int key_larval_lifetime; 124static int key_blockacq_count; 125static int key_blockacq_lifetime; 126static int key_preferred_oldsa; 127 128static u_int32_t acq_seq; 129 130static int ipsec_esp_keymin; 131static int ipsec_esp_auth; 132static int ipsec_ah_keymin; 133 134static LIST_HEAD(_sptree, secpolicy) sptree[IPSEC_DIR_MAX]; /* SPD */ 135static LIST_HEAD(_sahtree, secashead) sahtree; /* SAD */ 136static LIST_HEAD(_regtree, secreg) regtree[SADB_SATYPE_MAX + 1]; 137static LIST_HEAD(_acqtree, secacq) acqtree; /* acquiring list */ 138static LIST_HEAD(_spacqtree, secspacq) spacqtree; /* SP acquiring list */ 139#endif /* VIMAGE_GLOBALS */ 140 141static struct mtx sptree_lock; 142#define SPTREE_LOCK_INIT() \ 143 mtx_init(&sptree_lock, "sptree", \ 144 "fast ipsec security policy database", MTX_DEF) 145#define SPTREE_LOCK_DESTROY() mtx_destroy(&sptree_lock) 146#define SPTREE_LOCK() mtx_lock(&sptree_lock) 147#define SPTREE_UNLOCK() mtx_unlock(&sptree_lock) 148#define SPTREE_LOCK_ASSERT() mtx_assert(&sptree_lock, MA_OWNED) 149 150static struct mtx sahtree_lock; 151#define SAHTREE_LOCK_INIT() \ 152 mtx_init(&sahtree_lock, "sahtree", \ 153 "fast ipsec security association database", MTX_DEF) 154#define SAHTREE_LOCK_DESTROY() mtx_destroy(&sahtree_lock) 155#define SAHTREE_LOCK() mtx_lock(&sahtree_lock) 156#define SAHTREE_UNLOCK() mtx_unlock(&sahtree_lock) 157#define SAHTREE_LOCK_ASSERT() mtx_assert(&sahtree_lock, MA_OWNED) 158 159 /* registed list */ 160static struct mtx regtree_lock; 161#define REGTREE_LOCK_INIT() \ 162 mtx_init(®tree_lock, "regtree", "fast ipsec regtree", MTX_DEF) 163#define REGTREE_LOCK_DESTROY() mtx_destroy(®tree_lock) 164#define REGTREE_LOCK() mtx_lock(®tree_lock) 165#define REGTREE_UNLOCK() mtx_unlock(®tree_lock) 166#define REGTREE_LOCK_ASSERT() mtx_assert(®tree_lock, MA_OWNED) 167 168static struct mtx acq_lock; 169#define ACQ_LOCK_INIT() \ 170 mtx_init(&acq_lock, "acqtree", "fast ipsec acquire list", MTX_DEF) 171#define ACQ_LOCK_DESTROY() mtx_destroy(&acq_lock) 172#define ACQ_LOCK() mtx_lock(&acq_lock) 173#define ACQ_UNLOCK() mtx_unlock(&acq_lock) 174#define ACQ_LOCK_ASSERT() mtx_assert(&acq_lock, MA_OWNED) 175 176static struct mtx spacq_lock; 177#define SPACQ_LOCK_INIT() \ 178 mtx_init(&spacq_lock, "spacqtree", \ 179 "fast ipsec security policy acquire list", MTX_DEF) 180#define SPACQ_LOCK_DESTROY() mtx_destroy(&spacq_lock) 181#define SPACQ_LOCK() mtx_lock(&spacq_lock) 182#define SPACQ_UNLOCK() mtx_unlock(&spacq_lock) 183#define SPACQ_LOCK_ASSERT() mtx_assert(&spacq_lock, MA_OWNED) 184 185/* search order for SAs */ 186static const u_int saorder_state_valid_prefer_old[] = { 187 SADB_SASTATE_DYING, SADB_SASTATE_MATURE, 188}; 189static const u_int saorder_state_valid_prefer_new[] = { 190 SADB_SASTATE_MATURE, SADB_SASTATE_DYING, 191}; 192static const u_int saorder_state_alive[] = { 193 /* except DEAD */ 194 SADB_SASTATE_MATURE, SADB_SASTATE_DYING, SADB_SASTATE_LARVAL 195}; 196static const u_int saorder_state_any[] = { 197 SADB_SASTATE_MATURE, SADB_SASTATE_DYING, 198 SADB_SASTATE_LARVAL, SADB_SASTATE_DEAD 199}; 200 201static const int minsize[] = { 202 sizeof(struct sadb_msg), /* SADB_EXT_RESERVED */ 203 sizeof(struct sadb_sa), /* SADB_EXT_SA */ 204 sizeof(struct sadb_lifetime), /* SADB_EXT_LIFETIME_CURRENT */ 205 sizeof(struct sadb_lifetime), /* SADB_EXT_LIFETIME_HARD */ 206 sizeof(struct sadb_lifetime), /* SADB_EXT_LIFETIME_SOFT */ 207 sizeof(struct sadb_address), /* SADB_EXT_ADDRESS_SRC */ 208 sizeof(struct sadb_address), /* SADB_EXT_ADDRESS_DST */ 209 sizeof(struct sadb_address), /* SADB_EXT_ADDRESS_PROXY */ 210 sizeof(struct sadb_key), /* SADB_EXT_KEY_AUTH */ 211 sizeof(struct sadb_key), /* SADB_EXT_KEY_ENCRYPT */ 212 sizeof(struct sadb_ident), /* SADB_EXT_IDENTITY_SRC */ 213 sizeof(struct sadb_ident), /* SADB_EXT_IDENTITY_DST */ 214 sizeof(struct sadb_sens), /* SADB_EXT_SENSITIVITY */ 215 sizeof(struct sadb_prop), /* SADB_EXT_PROPOSAL */ 216 sizeof(struct sadb_supported), /* SADB_EXT_SUPPORTED_AUTH */ 217 sizeof(struct sadb_supported), /* SADB_EXT_SUPPORTED_ENCRYPT */ 218 sizeof(struct sadb_spirange), /* SADB_EXT_SPIRANGE */ 219 0, /* SADB_X_EXT_KMPRIVATE */ 220 sizeof(struct sadb_x_policy), /* SADB_X_EXT_POLICY */ 221 sizeof(struct sadb_x_sa2), /* SADB_X_SA2 */ 222}; 223static const int maxsize[] = { 224 sizeof(struct sadb_msg), /* SADB_EXT_RESERVED */ 225 sizeof(struct sadb_sa), /* SADB_EXT_SA */ 226 sizeof(struct sadb_lifetime), /* SADB_EXT_LIFETIME_CURRENT */ 227 sizeof(struct sadb_lifetime), /* SADB_EXT_LIFETIME_HARD */ 228 sizeof(struct sadb_lifetime), /* SADB_EXT_LIFETIME_SOFT */ 229 0, /* SADB_EXT_ADDRESS_SRC */ 230 0, /* SADB_EXT_ADDRESS_DST */ 231 0, /* SADB_EXT_ADDRESS_PROXY */ 232 0, /* SADB_EXT_KEY_AUTH */ 233 0, /* SADB_EXT_KEY_ENCRYPT */ 234 0, /* SADB_EXT_IDENTITY_SRC */ 235 0, /* SADB_EXT_IDENTITY_DST */ 236 0, /* SADB_EXT_SENSITIVITY */ 237 0, /* SADB_EXT_PROPOSAL */ 238 0, /* SADB_EXT_SUPPORTED_AUTH */ 239 0, /* SADB_EXT_SUPPORTED_ENCRYPT */ 240 sizeof(struct sadb_spirange), /* SADB_EXT_SPIRANGE */ 241 0, /* SADB_X_EXT_KMPRIVATE */ 242 0, /* SADB_X_EXT_POLICY */ 243 sizeof(struct sadb_x_sa2), /* SADB_X_SA2 */ 244}; 245 246#ifdef SYSCTL_DECL 247SYSCTL_DECL(_net_key); 248#endif 249 250SYSCTL_V_INT(V_NET, vnet_ipsec,_net_key, KEYCTL_DEBUG_LEVEL, debug, 251 CTLFLAG_RW, key_debug_level, 0, ""); 252 253/* max count of trial for the decision of spi value */ 254SYSCTL_V_INT(V_NET, vnet_ipsec,_net_key, KEYCTL_SPI_TRY, spi_trycnt, 255 CTLFLAG_RW, key_spi_trycnt, 0, ""); 256 257/* minimum spi value to allocate automatically. */ 258SYSCTL_V_INT(V_NET, vnet_ipsec, _net_key, KEYCTL_SPI_MIN_VALUE, 259 spi_minval, CTLFLAG_RW, key_spi_minval, 0, ""); 260 261/* maximun spi value to allocate automatically. */ 262SYSCTL_V_INT(V_NET, vnet_ipsec, _net_key, KEYCTL_SPI_MAX_VALUE, 263 spi_maxval, CTLFLAG_RW, key_spi_maxval, 0, ""); 264 265/* interval to initialize randseed */ 266SYSCTL_V_INT(V_NET, vnet_ipsec, _net_key, KEYCTL_RANDOM_INT, 267 int_random, CTLFLAG_RW, key_int_random, 0, ""); 268 269/* lifetime for larval SA */ 270SYSCTL_V_INT(V_NET, vnet_ipsec, _net_key, KEYCTL_LARVAL_LIFETIME, 271 larval_lifetime, CTLFLAG_RW, key_larval_lifetime, 0, ""); 272 273/* counter for blocking to send SADB_ACQUIRE to IKEd */ 274SYSCTL_V_INT(V_NET, vnet_ipsec, _net_key, KEYCTL_BLOCKACQ_COUNT, 275 blockacq_count, CTLFLAG_RW, key_blockacq_count, 0, ""); 276 277/* lifetime for blocking to send SADB_ACQUIRE to IKEd */ 278SYSCTL_V_INT(V_NET, vnet_ipsec, _net_key, KEYCTL_BLOCKACQ_LIFETIME, 279 blockacq_lifetime, CTLFLAG_RW, key_blockacq_lifetime, 0, ""); 280 281/* ESP auth */ 282SYSCTL_V_INT(V_NET, vnet_ipsec, _net_key, KEYCTL_ESP_AUTH, esp_auth, 283 CTLFLAG_RW, ipsec_esp_auth, 0, ""); 284 285/* minimum ESP key length */ 286SYSCTL_V_INT(V_NET, vnet_ipsec, _net_key, KEYCTL_ESP_KEYMIN, 287 esp_keymin, CTLFLAG_RW, ipsec_esp_keymin, 0, ""); 288 289/* minimum AH key length */ 290SYSCTL_V_INT(V_NET, vnet_ipsec, _net_key, KEYCTL_AH_KEYMIN, ah_keymin, 291 CTLFLAG_RW, ipsec_ah_keymin, 0, ""); 292 293/* perfered old SA rather than new SA */ 294SYSCTL_V_INT(V_NET, vnet_ipsec, _net_key, KEYCTL_PREFERED_OLDSA, 295 preferred_oldsa, CTLFLAG_RW, key_preferred_oldsa, 0, ""); 296 297#define __LIST_CHAINED(elm) \ 298 (!((elm)->chain.le_next == NULL && (elm)->chain.le_prev == NULL)) 299#define LIST_INSERT_TAIL(head, elm, type, field) \ 300do {\ 301 struct type *curelm = LIST_FIRST(head); \ 302 if (curelm == NULL) {\ 303 LIST_INSERT_HEAD(head, elm, field); \ 304 } else { \ 305 while (LIST_NEXT(curelm, field)) \ 306 curelm = LIST_NEXT(curelm, field);\ 307 LIST_INSERT_AFTER(curelm, elm, field);\ 308 }\ 309} while (0) 310 311#define KEY_CHKSASTATE(head, sav, name) \ 312do { \ 313 if ((head) != (sav)) { \ 314 ipseclog((LOG_DEBUG, "%s: state mismatched (TREE=%d SA=%d)\n", \ 315 (name), (head), (sav))); \ 316 continue; \ 317 } \ 318} while (0) 319 320#define KEY_CHKSPDIR(head, sp, name) \ 321do { \ 322 if ((head) != (sp)) { \ 323 ipseclog((LOG_DEBUG, "%s: direction mismatched (TREE=%d SP=%d), " \ 324 "anyway continue.\n", \ 325 (name), (head), (sp))); \ 326 } \ 327} while (0) 328 329MALLOC_DEFINE(M_IPSEC_SA, "secasvar", "ipsec security association"); 330MALLOC_DEFINE(M_IPSEC_SAH, "sahead", "ipsec sa head"); 331MALLOC_DEFINE(M_IPSEC_SP, "ipsecpolicy", "ipsec security policy"); 332MALLOC_DEFINE(M_IPSEC_SR, "ipsecrequest", "ipsec security request"); 333MALLOC_DEFINE(M_IPSEC_MISC, "ipsec-misc", "ipsec miscellaneous"); 334MALLOC_DEFINE(M_IPSEC_SAQ, "ipsec-saq", "ipsec sa acquire"); 335MALLOC_DEFINE(M_IPSEC_SAR, "ipsec-reg", "ipsec sa acquire"); 336 337/* 338 * set parameters into secpolicyindex buffer. 339 * Must allocate secpolicyindex buffer passed to this function. 340 */ 341#define KEY_SETSECSPIDX(_dir, s, d, ps, pd, ulp, idx) \ 342do { \ 343 bzero((idx), sizeof(struct secpolicyindex)); \ 344 (idx)->dir = (_dir); \ 345 (idx)->prefs = (ps); \ 346 (idx)->prefd = (pd); \ 347 (idx)->ul_proto = (ulp); \ 348 bcopy((s), &(idx)->src, ((const struct sockaddr *)(s))->sa_len); \ 349 bcopy((d), &(idx)->dst, ((const struct sockaddr *)(d))->sa_len); \ 350} while (0) 351 352/* 353 * set parameters into secasindex buffer. 354 * Must allocate secasindex buffer before calling this function. 355 */ 356#define KEY_SETSECASIDX(p, m, r, s, d, idx) \ 357do { \ 358 bzero((idx), sizeof(struct secasindex)); \ 359 (idx)->proto = (p); \ 360 (idx)->mode = (m); \ 361 (idx)->reqid = (r); \ 362 bcopy((s), &(idx)->src, ((const struct sockaddr *)(s))->sa_len); \ 363 bcopy((d), &(idx)->dst, ((const struct sockaddr *)(d))->sa_len); \ 364} while (0) 365 366/* key statistics */ 367struct _keystat { 368 u_long getspi_count; /* the avarage of count to try to get new SPI */ 369} keystat; 370 371struct sadb_msghdr { 372 struct sadb_msg *msg; 373 struct sadb_ext *ext[SADB_EXT_MAX + 1]; 374 int extoff[SADB_EXT_MAX + 1]; 375 int extlen[SADB_EXT_MAX + 1]; 376}; 377 378static struct secasvar *key_allocsa_policy __P((const struct secasindex *)); 379static void key_freesp_so __P((struct secpolicy **)); 380static struct secasvar *key_do_allocsa_policy __P((struct secashead *, u_int)); 381static void key_delsp __P((struct secpolicy *)); 382static struct secpolicy *key_getsp __P((struct secpolicyindex *)); 383static void _key_delsp(struct secpolicy *sp); 384static struct secpolicy *key_getspbyid __P((u_int32_t)); 385static u_int32_t key_newreqid __P((void)); 386static struct mbuf *key_gather_mbuf __P((struct mbuf *, 387 const struct sadb_msghdr *, int, int, ...)); 388static int key_spdadd __P((struct socket *, struct mbuf *, 389 const struct sadb_msghdr *)); 390static u_int32_t key_getnewspid __P((void)); 391static int key_spddelete __P((struct socket *, struct mbuf *, 392 const struct sadb_msghdr *)); 393static int key_spddelete2 __P((struct socket *, struct mbuf *, 394 const struct sadb_msghdr *)); 395static int key_spdget __P((struct socket *, struct mbuf *, 396 const struct sadb_msghdr *)); 397static int key_spdflush __P((struct socket *, struct mbuf *, 398 const struct sadb_msghdr *)); 399static int key_spddump __P((struct socket *, struct mbuf *, 400 const struct sadb_msghdr *)); 401static struct mbuf *key_setdumpsp __P((struct secpolicy *, 402 u_int8_t, u_int32_t, u_int32_t)); 403static u_int key_getspreqmsglen __P((struct secpolicy *)); 404static int key_spdexpire __P((struct secpolicy *)); 405static struct secashead *key_newsah __P((struct secasindex *)); 406static void key_delsah __P((struct secashead *)); 407static struct secasvar *key_newsav __P((struct mbuf *, 408 const struct sadb_msghdr *, struct secashead *, int *, 409 const char*, int)); 410#define KEY_NEWSAV(m, sadb, sah, e) \ 411 key_newsav(m, sadb, sah, e, __FILE__, __LINE__) 412static void key_delsav __P((struct secasvar *)); 413static struct secashead *key_getsah __P((struct secasindex *)); 414static struct secasvar *key_checkspidup __P((struct secasindex *, u_int32_t)); 415static struct secasvar *key_getsavbyspi __P((struct secashead *, u_int32_t)); 416static int key_setsaval __P((struct secasvar *, struct mbuf *, 417 const struct sadb_msghdr *)); 418static int key_mature __P((struct secasvar *)); 419static struct mbuf *key_setdumpsa __P((struct secasvar *, u_int8_t, 420 u_int8_t, u_int32_t, u_int32_t)); 421static struct mbuf *key_setsadbmsg __P((u_int8_t, u_int16_t, u_int8_t, 422 u_int32_t, pid_t, u_int16_t)); 423static struct mbuf *key_setsadbsa __P((struct secasvar *)); 424static struct mbuf *key_setsadbaddr __P((u_int16_t, 425 const struct sockaddr *, u_int8_t, u_int16_t)); 426static struct mbuf *key_setsadbxsa2 __P((u_int8_t, u_int32_t, u_int32_t)); 427static struct mbuf *key_setsadbxpolicy __P((u_int16_t, u_int8_t, 428 u_int32_t)); 429static struct seckey *key_dup_keymsg(const struct sadb_key *, u_int, 430 struct malloc_type *); 431static struct seclifetime *key_dup_lifemsg(const struct sadb_lifetime *src, 432 struct malloc_type *type); 433#ifdef INET6 434static int key_ismyaddr6 __P((struct sockaddr_in6 *)); 435#endif 436 437/* flags for key_cmpsaidx() */ 438#define CMP_HEAD 1 /* protocol, addresses. */ 439#define CMP_MODE_REQID 2 /* additionally HEAD, reqid, mode. */ 440#define CMP_REQID 3 /* additionally HEAD, reaid. */ 441#define CMP_EXACTLY 4 /* all elements. */ 442static int key_cmpsaidx 443 __P((const struct secasindex *, const struct secasindex *, int)); 444 445static int key_cmpspidx_exactly 446 __P((struct secpolicyindex *, struct secpolicyindex *)); 447static int key_cmpspidx_withmask 448 __P((struct secpolicyindex *, struct secpolicyindex *)); 449static int key_sockaddrcmp __P((const struct sockaddr *, const struct sockaddr *, int)); 450static int key_bbcmp __P((const void *, const void *, u_int)); 451static u_int16_t key_satype2proto __P((u_int8_t)); 452static u_int8_t key_proto2satype __P((u_int16_t)); 453 454static int key_getspi __P((struct socket *, struct mbuf *, 455 const struct sadb_msghdr *)); 456static u_int32_t key_do_getnewspi __P((struct sadb_spirange *, 457 struct secasindex *)); 458static int key_update __P((struct socket *, struct mbuf *, 459 const struct sadb_msghdr *)); 460#ifdef IPSEC_DOSEQCHECK 461static struct secasvar *key_getsavbyseq __P((struct secashead *, u_int32_t)); 462#endif 463static int key_add __P((struct socket *, struct mbuf *, 464 const struct sadb_msghdr *)); 465static int key_setident __P((struct secashead *, struct mbuf *, 466 const struct sadb_msghdr *)); 467static struct mbuf *key_getmsgbuf_x1 __P((struct mbuf *, 468 const struct sadb_msghdr *)); 469static int key_delete __P((struct socket *, struct mbuf *, 470 const struct sadb_msghdr *)); 471static int key_get __P((struct socket *, struct mbuf *, 472 const struct sadb_msghdr *)); 473 474static void key_getcomb_setlifetime __P((struct sadb_comb *)); 475static struct mbuf *key_getcomb_esp __P((void)); 476static struct mbuf *key_getcomb_ah __P((void)); 477static struct mbuf *key_getcomb_ipcomp __P((void)); 478static struct mbuf *key_getprop __P((const struct secasindex *)); 479 480static int key_acquire __P((const struct secasindex *, struct secpolicy *)); 481static struct secacq *key_newacq __P((const struct secasindex *)); 482static struct secacq *key_getacq __P((const struct secasindex *)); 483static struct secacq *key_getacqbyseq __P((u_int32_t)); 484static struct secspacq *key_newspacq __P((struct secpolicyindex *)); 485static struct secspacq *key_getspacq __P((struct secpolicyindex *)); 486static int key_acquire2 __P((struct socket *, struct mbuf *, 487 const struct sadb_msghdr *)); 488static int key_register __P((struct socket *, struct mbuf *, 489 const struct sadb_msghdr *)); 490static int key_expire __P((struct secasvar *)); 491static int key_flush __P((struct socket *, struct mbuf *, 492 const struct sadb_msghdr *)); 493static int key_dump __P((struct socket *, struct mbuf *, 494 const struct sadb_msghdr *)); 495static int key_promisc __P((struct socket *, struct mbuf *, 496 const struct sadb_msghdr *)); 497static int key_senderror __P((struct socket *, struct mbuf *, int)); 498static int key_validate_ext __P((const struct sadb_ext *, int)); 499static int key_align __P((struct mbuf *, struct sadb_msghdr *)); 500static struct mbuf *key_setlifetime(struct seclifetime *src, 501 u_int16_t exttype); 502static struct mbuf *key_setkey(struct seckey *src, u_int16_t exttype); 503 504#if 0 505static const char *key_getfqdn __P((void)); 506static const char *key_getuserfqdn __P((void)); 507#endif 508static void key_sa_chgstate __P((struct secasvar *, u_int8_t)); 509static struct mbuf *key_alloc_mbuf __P((int)); 510 511static __inline void 512sa_initref(struct secasvar *sav) 513{ 514 515 refcount_init(&sav->refcnt, 1); 516} 517static __inline void 518sa_addref(struct secasvar *sav) 519{ 520 521 refcount_acquire(&sav->refcnt); 522 IPSEC_ASSERT(sav->refcnt != 0, ("SA refcnt overflow")); 523} 524static __inline int 525sa_delref(struct secasvar *sav) 526{ 527 528 IPSEC_ASSERT(sav->refcnt > 0, ("SA refcnt underflow")); 529 return (refcount_release(&sav->refcnt)); 530} 531 532#define SP_ADDREF(p) do { \ 533 (p)->refcnt++; \ 534 IPSEC_ASSERT((p)->refcnt != 0, ("SP refcnt overflow")); \ 535} while (0) 536#define SP_DELREF(p) do { \ 537 IPSEC_ASSERT((p)->refcnt > 0, ("SP refcnt underflow")); \ 538 (p)->refcnt--; \ 539} while (0) 540 541 542/* 543 * Update the refcnt while holding the SPTREE lock. 544 */ 545void 546key_addref(struct secpolicy *sp) 547{ 548 SPTREE_LOCK(); 549 SP_ADDREF(sp); 550 SPTREE_UNLOCK(); 551} 552 553/* 554 * Return 0 when there are known to be no SP's for the specified 555 * direction. Otherwise return 1. This is used by IPsec code 556 * to optimize performance. 557 */ 558int 559key_havesp(u_int dir) 560{ 561 INIT_VNET_IPSEC(curvnet); 562 563 return (dir == IPSEC_DIR_INBOUND || dir == IPSEC_DIR_OUTBOUND ? 564 LIST_FIRST(&V_sptree[dir]) != NULL : 1); 565} 566 567/* %%% IPsec policy management */ 568/* 569 * allocating a SP for OUTBOUND or INBOUND packet. 570 * Must call key_freesp() later. 571 * OUT: NULL: not found 572 * others: found and return the pointer. 573 */ 574struct secpolicy * 575key_allocsp(struct secpolicyindex *spidx, u_int dir, const char* where, int tag) 576{ 577 INIT_VNET_IPSEC(curvnet); 578 struct secpolicy *sp; 579 580 IPSEC_ASSERT(spidx != NULL, ("null spidx")); 581 IPSEC_ASSERT(dir == IPSEC_DIR_INBOUND || dir == IPSEC_DIR_OUTBOUND, 582 ("invalid direction %u", dir)); 583 584 KEYDEBUG(KEYDEBUG_IPSEC_STAMP, 585 printf("DP %s from %s:%u\n", __func__, where, tag)); 586 587 /* get a SP entry */ 588 KEYDEBUG(KEYDEBUG_IPSEC_DATA, 589 printf("*** objects\n"); 590 kdebug_secpolicyindex(spidx)); 591 592 SPTREE_LOCK(); 593 LIST_FOREACH(sp, &V_sptree[dir], chain) { 594 KEYDEBUG(KEYDEBUG_IPSEC_DATA, 595 printf("*** in SPD\n"); 596 kdebug_secpolicyindex(&sp->spidx)); 597 598 if (sp->state == IPSEC_SPSTATE_DEAD) 599 continue; 600 if (key_cmpspidx_withmask(&sp->spidx, spidx)) 601 goto found; 602 } 603 sp = NULL; 604found: 605 if (sp) { 606 /* sanity check */ 607 KEY_CHKSPDIR(sp->spidx.dir, dir, __func__); 608 609 /* found a SPD entry */ 610 sp->lastused = time_second; 611 SP_ADDREF(sp); 612 } 613 SPTREE_UNLOCK(); 614 615 KEYDEBUG(KEYDEBUG_IPSEC_STAMP, 616 printf("DP %s return SP:%p (ID=%u) refcnt %u\n", __func__, 617 sp, sp ? sp->id : 0, sp ? sp->refcnt : 0)); 618 return sp; 619} 620 621/* 622 * allocating a SP for OUTBOUND or INBOUND packet. 623 * Must call key_freesp() later. 624 * OUT: NULL: not found 625 * others: found and return the pointer. 626 */ 627struct secpolicy * 628key_allocsp2(u_int32_t spi, 629 union sockaddr_union *dst, 630 u_int8_t proto, 631 u_int dir, 632 const char* where, int tag) 633{ 634 INIT_VNET_IPSEC(curvnet); 635 struct secpolicy *sp; 636 637 IPSEC_ASSERT(dst != NULL, ("null dst")); 638 IPSEC_ASSERT(dir == IPSEC_DIR_INBOUND || dir == IPSEC_DIR_OUTBOUND, 639 ("invalid direction %u", dir)); 640 641 KEYDEBUG(KEYDEBUG_IPSEC_STAMP, 642 printf("DP %s from %s:%u\n", __func__, where, tag)); 643 644 /* get a SP entry */ 645 KEYDEBUG(KEYDEBUG_IPSEC_DATA, 646 printf("*** objects\n"); 647 printf("spi %u proto %u dir %u\n", spi, proto, dir); 648 kdebug_sockaddr(&dst->sa)); 649 650 SPTREE_LOCK(); 651 LIST_FOREACH(sp, &V_sptree[dir], chain) { 652 KEYDEBUG(KEYDEBUG_IPSEC_DATA, 653 printf("*** in SPD\n"); 654 kdebug_secpolicyindex(&sp->spidx)); 655 656 if (sp->state == IPSEC_SPSTATE_DEAD) 657 continue; 658 /* compare simple values, then dst address */ 659 if (sp->spidx.ul_proto != proto) 660 continue; 661 /* NB: spi's must exist and match */ 662 if (!sp->req || !sp->req->sav || sp->req->sav->spi != spi) 663 continue; 664 if (key_sockaddrcmp(&sp->spidx.dst.sa, &dst->sa, 1) == 0) 665 goto found; 666 } 667 sp = NULL; 668found: 669 if (sp) { 670 /* sanity check */ 671 KEY_CHKSPDIR(sp->spidx.dir, dir, __func__); 672 673 /* found a SPD entry */ 674 sp->lastused = time_second; 675 SP_ADDREF(sp); 676 } 677 SPTREE_UNLOCK(); 678 679 KEYDEBUG(KEYDEBUG_IPSEC_STAMP, 680 printf("DP %s return SP:%p (ID=%u) refcnt %u\n", __func__, 681 sp, sp ? sp->id : 0, sp ? sp->refcnt : 0)); 682 return sp; 683} 684 685/* 686 * return a policy that matches this particular inbound packet. 687 * XXX slow 688 */ 689struct secpolicy * 690key_gettunnel(const struct sockaddr *osrc, 691 const struct sockaddr *odst, 692 const struct sockaddr *isrc, 693 const struct sockaddr *idst, 694 const char* where, int tag) 695{ 696 INIT_VNET_IPSEC(curvnet); 697 struct secpolicy *sp; 698 const int dir = IPSEC_DIR_INBOUND; 699 struct ipsecrequest *r1, *r2, *p; 700 struct secpolicyindex spidx; 701 702 KEYDEBUG(KEYDEBUG_IPSEC_STAMP, 703 printf("DP %s from %s:%u\n", __func__, where, tag)); 704 705 if (isrc->sa_family != idst->sa_family) { 706 ipseclog((LOG_ERR, "%s: protocol family mismatched %d != %d\n.", 707 __func__, isrc->sa_family, idst->sa_family)); 708 sp = NULL; 709 goto done; 710 } 711 712 SPTREE_LOCK(); 713 LIST_FOREACH(sp, &V_sptree[dir], chain) { 714 if (sp->state == IPSEC_SPSTATE_DEAD) 715 continue; 716 717 r1 = r2 = NULL; 718 for (p = sp->req; p; p = p->next) { 719 if (p->saidx.mode != IPSEC_MODE_TUNNEL) 720 continue; 721 722 r1 = r2; 723 r2 = p; 724 725 if (!r1) { 726 /* here we look at address matches only */ 727 spidx = sp->spidx; 728 if (isrc->sa_len > sizeof(spidx.src) || 729 idst->sa_len > sizeof(spidx.dst)) 730 continue; 731 bcopy(isrc, &spidx.src, isrc->sa_len); 732 bcopy(idst, &spidx.dst, idst->sa_len); 733 if (!key_cmpspidx_withmask(&sp->spidx, &spidx)) 734 continue; 735 } else { 736 if (key_sockaddrcmp(&r1->saidx.src.sa, isrc, 0) || 737 key_sockaddrcmp(&r1->saidx.dst.sa, idst, 0)) 738 continue; 739 } 740 741 if (key_sockaddrcmp(&r2->saidx.src.sa, osrc, 0) || 742 key_sockaddrcmp(&r2->saidx.dst.sa, odst, 0)) 743 continue; 744 745 goto found; 746 } 747 } 748 sp = NULL; 749found: 750 if (sp) { 751 sp->lastused = time_second; 752 SP_ADDREF(sp); 753 } 754 SPTREE_UNLOCK(); 755done: 756 KEYDEBUG(KEYDEBUG_IPSEC_STAMP, 757 printf("DP %s return SP:%p (ID=%u) refcnt %u\n", __func__, 758 sp, sp ? sp->id : 0, sp ? sp->refcnt : 0)); 759 return sp; 760} 761 762/* 763 * allocating an SA entry for an *OUTBOUND* packet. 764 * checking each request entries in SP, and acquire an SA if need. 765 * OUT: 0: there are valid requests. 766 * ENOENT: policy may be valid, but SA with REQUIRE is on acquiring. 767 */ 768int 769key_checkrequest(struct ipsecrequest *isr, const struct secasindex *saidx) 770{ 771 INIT_VNET_IPSEC(curvnet); 772 u_int level; 773 int error; 774 775 IPSEC_ASSERT(isr != NULL, ("null isr")); 776 IPSEC_ASSERT(saidx != NULL, ("null saidx")); 777 IPSEC_ASSERT(saidx->mode == IPSEC_MODE_TRANSPORT || 778 saidx->mode == IPSEC_MODE_TUNNEL, 779 ("unexpected policy %u", saidx->mode)); 780 781 /* 782 * XXX guard against protocol callbacks from the crypto 783 * thread as they reference ipsecrequest.sav which we 784 * temporarily null out below. Need to rethink how we 785 * handle bundled SA's in the callback thread. 786 */ 787 IPSECREQUEST_LOCK_ASSERT(isr); 788 789 /* get current level */ 790 level = ipsec_get_reqlevel(isr); 791#if 0 792 /* 793 * We do allocate new SA only if the state of SA in the holder is 794 * SADB_SASTATE_DEAD. The SA for outbound must be the oldest. 795 */ 796 if (isr->sav != NULL) { 797 if (isr->sav->sah == NULL) 798 panic("%s: sah is null.\n", __func__); 799 if (isr->sav == (struct secasvar *)LIST_FIRST( 800 &isr->sav->sah->savtree[SADB_SASTATE_DEAD])) { 801 KEY_FREESAV(&isr->sav); 802 isr->sav = NULL; 803 } 804 } 805#else 806 /* 807 * we free any SA stashed in the IPsec request because a different 808 * SA may be involved each time this request is checked, either 809 * because new SAs are being configured, or this request is 810 * associated with an unconnected datagram socket, or this request 811 * is associated with a system default policy. 812 * 813 * The operation may have negative impact to performance. We may 814 * want to check cached SA carefully, rather than picking new SA 815 * every time. 816 */ 817 if (isr->sav != NULL) { 818 KEY_FREESAV(&isr->sav); 819 isr->sav = NULL; 820 } 821#endif 822 823 /* 824 * new SA allocation if no SA found. 825 * key_allocsa_policy should allocate the oldest SA available. 826 * See key_do_allocsa_policy(), and draft-jenkins-ipsec-rekeying-03.txt. 827 */ 828 if (isr->sav == NULL) 829 isr->sav = key_allocsa_policy(saidx); 830 831 /* When there is SA. */ 832 if (isr->sav != NULL) { 833 if (isr->sav->state != SADB_SASTATE_MATURE && 834 isr->sav->state != SADB_SASTATE_DYING) 835 return EINVAL; 836 return 0; 837 } 838 839 /* there is no SA */ 840 error = key_acquire(saidx, isr->sp); 841 if (error != 0) { 842 /* XXX What should I do ? */ 843 ipseclog((LOG_DEBUG, "%s: error %d returned from key_acquire\n", 844 __func__, error)); 845 return error; 846 } 847 848 if (level != IPSEC_LEVEL_REQUIRE) { 849 /* XXX sigh, the interface to this routine is botched */ 850 IPSEC_ASSERT(isr->sav == NULL, ("unexpected SA")); 851 return 0; 852 } else { 853 return ENOENT; 854 } 855} 856 857/* 858 * allocating a SA for policy entry from SAD. 859 * NOTE: searching SAD of aliving state. 860 * OUT: NULL: not found. 861 * others: found and return the pointer. 862 */ 863static struct secasvar * 864key_allocsa_policy(const struct secasindex *saidx) 865{ 866#define N(a) _ARRAYLEN(a) 867 INIT_VNET_IPSEC(curvnet); 868 struct secashead *sah; 869 struct secasvar *sav; 870 u_int stateidx, arraysize; 871 const u_int *state_valid; 872 873 SAHTREE_LOCK(); 874 LIST_FOREACH(sah, &V_sahtree, chain) { 875 if (sah->state == SADB_SASTATE_DEAD) 876 continue; 877 if (key_cmpsaidx(&sah->saidx, saidx, CMP_MODE_REQID)) { 878 if (V_key_preferred_oldsa) { 879 state_valid = saorder_state_valid_prefer_old; 880 arraysize = N(saorder_state_valid_prefer_old); 881 } else { 882 state_valid = saorder_state_valid_prefer_new; 883 arraysize = N(saorder_state_valid_prefer_new); 884 } 885 SAHTREE_UNLOCK(); 886 goto found; 887 } 888 } 889 SAHTREE_UNLOCK(); 890 891 return NULL; 892 893 found: 894 /* search valid state */ 895 for (stateidx = 0; stateidx < arraysize; stateidx++) { 896 sav = key_do_allocsa_policy(sah, state_valid[stateidx]); 897 if (sav != NULL) 898 return sav; 899 } 900 901 return NULL; 902#undef N 903} 904 905/* 906 * searching SAD with direction, protocol, mode and state. 907 * called by key_allocsa_policy(). 908 * OUT: 909 * NULL : not found 910 * others : found, pointer to a SA. 911 */ 912static struct secasvar * 913key_do_allocsa_policy(struct secashead *sah, u_int state) 914{ 915 INIT_VNET_IPSEC(curvnet); 916 struct secasvar *sav, *nextsav, *candidate, *d; 917 918 /* initilize */ 919 candidate = NULL; 920 921 SAHTREE_LOCK(); 922 for (sav = LIST_FIRST(&sah->savtree[state]); 923 sav != NULL; 924 sav = nextsav) { 925 926 nextsav = LIST_NEXT(sav, chain); 927 928 /* sanity check */ 929 KEY_CHKSASTATE(sav->state, state, __func__); 930 931 /* initialize */ 932 if (candidate == NULL) { 933 candidate = sav; 934 continue; 935 } 936 937 /* Which SA is the better ? */ 938 939 IPSEC_ASSERT(candidate->lft_c != NULL, 940 ("null candidate lifetime")); 941 IPSEC_ASSERT(sav->lft_c != NULL, ("null sav lifetime")); 942 943 /* What the best method is to compare ? */ 944 if (V_key_preferred_oldsa) { 945 if (candidate->lft_c->addtime > 946 sav->lft_c->addtime) { 947 candidate = sav; 948 } 949 continue; 950 /*NOTREACHED*/ 951 } 952 953 /* preferred new sa rather than old sa */ 954 if (candidate->lft_c->addtime < 955 sav->lft_c->addtime) { 956 d = candidate; 957 candidate = sav; 958 } else 959 d = sav; 960 961 /* 962 * prepared to delete the SA when there is more 963 * suitable candidate and the lifetime of the SA is not 964 * permanent. 965 */ 966 if (d->lft_h->addtime != 0) { 967 struct mbuf *m, *result; 968 u_int8_t satype; 969 970 key_sa_chgstate(d, SADB_SASTATE_DEAD); 971 972 IPSEC_ASSERT(d->refcnt > 0, ("bogus ref count")); 973 974 satype = key_proto2satype(d->sah->saidx.proto); 975 if (satype == 0) 976 goto msgfail; 977 978 m = key_setsadbmsg(SADB_DELETE, 0, 979 satype, 0, 0, d->refcnt - 1); 980 if (!m) 981 goto msgfail; 982 result = m; 983 984 /* set sadb_address for saidx's. */ 985 m = key_setsadbaddr(SADB_EXT_ADDRESS_SRC, 986 &d->sah->saidx.src.sa, 987 d->sah->saidx.src.sa.sa_len << 3, 988 IPSEC_ULPROTO_ANY); 989 if (!m) 990 goto msgfail; 991 m_cat(result, m); 992 993 /* set sadb_address for saidx's. */ 994 m = key_setsadbaddr(SADB_EXT_ADDRESS_DST, 995 &d->sah->saidx.dst.sa, 996 d->sah->saidx.dst.sa.sa_len << 3, 997 IPSEC_ULPROTO_ANY); 998 if (!m) 999 goto msgfail; 1000 m_cat(result, m); 1001 1002 /* create SA extension */ 1003 m = key_setsadbsa(d); 1004 if (!m) 1005 goto msgfail; 1006 m_cat(result, m); 1007 1008 if (result->m_len < sizeof(struct sadb_msg)) { 1009 result = m_pullup(result, 1010 sizeof(struct sadb_msg)); 1011 if (result == NULL) 1012 goto msgfail; 1013 } 1014 1015 result->m_pkthdr.len = 0; 1016 for (m = result; m; m = m->m_next) 1017 result->m_pkthdr.len += m->m_len; 1018 mtod(result, struct sadb_msg *)->sadb_msg_len = 1019 PFKEY_UNIT64(result->m_pkthdr.len); 1020 1021 if (key_sendup_mbuf(NULL, result, 1022 KEY_SENDUP_REGISTERED)) 1023 goto msgfail; 1024 msgfail: 1025 KEY_FREESAV(&d); 1026 } 1027 } 1028 if (candidate) { 1029 sa_addref(candidate); 1030 KEYDEBUG(KEYDEBUG_IPSEC_STAMP, 1031 printf("DP %s cause refcnt++:%d SA:%p\n", 1032 __func__, candidate->refcnt, candidate)); 1033 } 1034 SAHTREE_UNLOCK(); 1035 1036 return candidate; 1037} 1038 1039/* 1040 * allocating a usable SA entry for a *INBOUND* packet. 1041 * Must call key_freesav() later. 1042 * OUT: positive: pointer to a usable sav (i.e. MATURE or DYING state). 1043 * NULL: not found, or error occured. 1044 * 1045 * In the comparison, no source address is used--for RFC2401 conformance. 1046 * To quote, from section 4.1: 1047 * A security association is uniquely identified by a triple consisting 1048 * of a Security Parameter Index (SPI), an IP Destination Address, and a 1049 * security protocol (AH or ESP) identifier. 1050 * Note that, however, we do need to keep source address in IPsec SA. 1051 * IKE specification and PF_KEY specification do assume that we 1052 * keep source address in IPsec SA. We see a tricky situation here. 1053 */ 1054struct secasvar * 1055key_allocsa( 1056 union sockaddr_union *dst, 1057 u_int proto, 1058 u_int32_t spi, 1059 const char* where, int tag) 1060{ 1061 INIT_VNET_IPSEC(curvnet); 1062 struct secashead *sah; 1063 struct secasvar *sav; 1064 u_int stateidx, arraysize, state; 1065 const u_int *saorder_state_valid; 1066 1067 IPSEC_ASSERT(dst != NULL, ("null dst address")); 1068 1069 KEYDEBUG(KEYDEBUG_IPSEC_STAMP, 1070 printf("DP %s from %s:%u\n", __func__, where, tag)); 1071 1072 /* 1073 * searching SAD. 1074 * XXX: to be checked internal IP header somewhere. Also when 1075 * IPsec tunnel packet is received. But ESP tunnel mode is 1076 * encrypted so we can't check internal IP header. 1077 */ 1078 SAHTREE_LOCK(); 1079 if (V_key_preferred_oldsa) { 1080 saorder_state_valid = saorder_state_valid_prefer_old; 1081 arraysize = _ARRAYLEN(saorder_state_valid_prefer_old); 1082 } else { 1083 saorder_state_valid = saorder_state_valid_prefer_new; 1084 arraysize = _ARRAYLEN(saorder_state_valid_prefer_new); 1085 } 1086 LIST_FOREACH(sah, &V_sahtree, chain) { 1087 /* search valid state */ 1088 for (stateidx = 0; stateidx < arraysize; stateidx++) { 1089 state = saorder_state_valid[stateidx]; 1090 LIST_FOREACH(sav, &sah->savtree[state], chain) { 1091 /* sanity check */ 1092 KEY_CHKSASTATE(sav->state, state, __func__); 1093 /* do not return entries w/ unusable state */ 1094 if (sav->state != SADB_SASTATE_MATURE && 1095 sav->state != SADB_SASTATE_DYING) 1096 continue; 1097 if (proto != sav->sah->saidx.proto) 1098 continue; 1099 if (spi != sav->spi) 1100 continue; 1101#if 0 /* don't check src */ 1102 /* check src address */ 1103 if (key_sockaddrcmp(&src->sa, &sav->sah->saidx.src.sa, 0) != 0) 1104 continue; 1105#endif 1106 /* check dst address */ 1107 if (key_sockaddrcmp(&dst->sa, &sav->sah->saidx.dst.sa, 0) != 0) 1108 continue; 1109 sa_addref(sav); 1110 goto done; 1111 } 1112 } 1113 } 1114 sav = NULL; 1115done: 1116 SAHTREE_UNLOCK(); 1117 1118 KEYDEBUG(KEYDEBUG_IPSEC_STAMP, 1119 printf("DP %s return SA:%p; refcnt %u\n", __func__, 1120 sav, sav ? sav->refcnt : 0)); 1121 return sav; 1122} 1123 1124/* 1125 * Must be called after calling key_allocsp(). 1126 * For both the packet without socket and key_freeso(). 1127 */ 1128void 1129_key_freesp(struct secpolicy **spp, const char* where, int tag) 1130{ 1131 INIT_VNET_IPSEC(curvnet); 1132 struct secpolicy *sp = *spp; 1133 1134 IPSEC_ASSERT(sp != NULL, ("null sp")); 1135 1136 SPTREE_LOCK(); 1137 SP_DELREF(sp); 1138 1139 KEYDEBUG(KEYDEBUG_IPSEC_STAMP, 1140 printf("DP %s SP:%p (ID=%u) from %s:%u; refcnt now %u\n", 1141 __func__, sp, sp->id, where, tag, sp->refcnt)); 1142 1143 if (sp->refcnt == 0) { 1144 *spp = NULL; 1145 key_delsp(sp); 1146 } 1147 SPTREE_UNLOCK(); 1148} 1149 1150/* 1151 * Must be called after calling key_allocsp(). 1152 * For the packet with socket. 1153 */ 1154void 1155key_freeso(struct socket *so) 1156{ 1157 INIT_VNET_IPSEC(curvnet); 1158 IPSEC_ASSERT(so != NULL, ("null so")); 1159 1160 switch (so->so_proto->pr_domain->dom_family) { 1161#ifdef INET 1162 case PF_INET: 1163 { 1164 struct inpcb *pcb = sotoinpcb(so); 1165 1166 /* Does it have a PCB ? */ 1167 if (pcb == NULL) 1168 return; 1169 key_freesp_so(&pcb->inp_sp->sp_in); 1170 key_freesp_so(&pcb->inp_sp->sp_out); 1171 } 1172 break; 1173#endif 1174#ifdef INET6 1175 case PF_INET6: 1176 { 1177#ifdef HAVE_NRL_INPCB 1178 struct inpcb *pcb = sotoinpcb(so); 1179 1180 /* Does it have a PCB ? */ 1181 if (pcb == NULL) 1182 return; 1183 key_freesp_so(&pcb->inp_sp->sp_in); 1184 key_freesp_so(&pcb->inp_sp->sp_out); 1185#else 1186 struct in6pcb *pcb = sotoin6pcb(so); 1187 1188 /* Does it have a PCB ? */ 1189 if (pcb == NULL) 1190 return; 1191 key_freesp_so(&pcb->in6p_sp->sp_in); 1192 key_freesp_so(&pcb->in6p_sp->sp_out); 1193#endif 1194 } 1195 break; 1196#endif /* INET6 */ 1197 default: 1198 ipseclog((LOG_DEBUG, "%s: unknown address family=%d.\n", 1199 __func__, so->so_proto->pr_domain->dom_family)); 1200 return; 1201 } 1202} 1203 1204static void 1205key_freesp_so(struct secpolicy **sp) 1206{ 1207 IPSEC_ASSERT(sp != NULL && *sp != NULL, ("null sp")); 1208 1209 if ((*sp)->policy == IPSEC_POLICY_ENTRUST || 1210 (*sp)->policy == IPSEC_POLICY_BYPASS) 1211 return; 1212 1213 IPSEC_ASSERT((*sp)->policy == IPSEC_POLICY_IPSEC, 1214 ("invalid policy %u", (*sp)->policy)); 1215 KEY_FREESP(sp); 1216} 1217 1218/* 1219 * Must be called after calling key_allocsa(). 1220 * This function is called by key_freesp() to free some SA allocated 1221 * for a policy. 1222 */ 1223void 1224key_freesav(struct secasvar **psav, const char* where, int tag) 1225{ 1226 INIT_VNET_IPSEC(curvnet); 1227 struct secasvar *sav = *psav; 1228 1229 IPSEC_ASSERT(sav != NULL, ("null sav")); 1230 1231 if (sa_delref(sav)) { 1232 KEYDEBUG(KEYDEBUG_IPSEC_STAMP, 1233 printf("DP %s SA:%p (SPI %u) from %s:%u; refcnt now %u\n", 1234 __func__, sav, ntohl(sav->spi), where, tag, sav->refcnt)); 1235 *psav = NULL; 1236 key_delsav(sav); 1237 } else { 1238 KEYDEBUG(KEYDEBUG_IPSEC_STAMP, 1239 printf("DP %s SA:%p (SPI %u) from %s:%u; refcnt now %u\n", 1240 __func__, sav, ntohl(sav->spi), where, tag, sav->refcnt)); 1241 } 1242} 1243 1244/* %%% SPD management */ 1245/* 1246 * free security policy entry. 1247 */ 1248static void 1249key_delsp(struct secpolicy *sp) 1250{ 1251 struct ipsecrequest *isr, *nextisr; 1252 1253 IPSEC_ASSERT(sp != NULL, ("null sp")); 1254 SPTREE_LOCK_ASSERT(); 1255 1256 sp->state = IPSEC_SPSTATE_DEAD; 1257 1258 IPSEC_ASSERT(sp->refcnt == 0, 1259 ("SP with references deleted (refcnt %u)", sp->refcnt)); 1260 1261 /* remove from SP index */ 1262 if (__LIST_CHAINED(sp)) 1263 LIST_REMOVE(sp, chain); 1264 1265 for (isr = sp->req; isr != NULL; isr = nextisr) { 1266 if (isr->sav != NULL) { 1267 KEY_FREESAV(&isr->sav); 1268 isr->sav = NULL; 1269 } 1270 1271 nextisr = isr->next; 1272 ipsec_delisr(isr); 1273 } 1274 _key_delsp(sp); 1275} 1276 1277/* 1278 * search SPD 1279 * OUT: NULL : not found 1280 * others : found, pointer to a SP. 1281 */ 1282static struct secpolicy * 1283key_getsp(struct secpolicyindex *spidx) 1284{ 1285 INIT_VNET_IPSEC(curvnet); 1286 struct secpolicy *sp; 1287 1288 IPSEC_ASSERT(spidx != NULL, ("null spidx")); 1289 1290 SPTREE_LOCK(); 1291 LIST_FOREACH(sp, &V_sptree[spidx->dir], chain) { 1292 if (sp->state == IPSEC_SPSTATE_DEAD) 1293 continue; 1294 if (key_cmpspidx_exactly(spidx, &sp->spidx)) { 1295 SP_ADDREF(sp); 1296 break; 1297 } 1298 } 1299 SPTREE_UNLOCK(); 1300 1301 return sp; 1302} 1303 1304/* 1305 * get SP by index. 1306 * OUT: NULL : not found 1307 * others : found, pointer to a SP. 1308 */ 1309static struct secpolicy * 1310key_getspbyid(u_int32_t id) 1311{ 1312 INIT_VNET_IPSEC(curvnet); 1313 struct secpolicy *sp; 1314 1315 SPTREE_LOCK(); 1316 LIST_FOREACH(sp, &V_sptree[IPSEC_DIR_INBOUND], chain) { 1317 if (sp->state == IPSEC_SPSTATE_DEAD) 1318 continue; 1319 if (sp->id == id) { 1320 SP_ADDREF(sp); 1321 goto done; 1322 } 1323 } 1324 1325 LIST_FOREACH(sp, &V_sptree[IPSEC_DIR_OUTBOUND], chain) { 1326 if (sp->state == IPSEC_SPSTATE_DEAD) 1327 continue; 1328 if (sp->id == id) { 1329 SP_ADDREF(sp); 1330 goto done; 1331 } 1332 } 1333done: 1334 SPTREE_UNLOCK(); 1335 1336 return sp; 1337} 1338 1339struct secpolicy * 1340key_newsp(const char* where, int tag) 1341{ 1342 INIT_VNET_IPSEC(curvnet); 1343 struct secpolicy *newsp = NULL; 1344 1345 newsp = (struct secpolicy *) 1346 malloc(sizeof(struct secpolicy), M_IPSEC_SP, M_NOWAIT|M_ZERO); 1347 if (newsp) { 1348 SECPOLICY_LOCK_INIT(newsp); 1349 newsp->refcnt = 1; 1350 newsp->req = NULL; 1351 } 1352 1353 KEYDEBUG(KEYDEBUG_IPSEC_STAMP, 1354 printf("DP %s from %s:%u return SP:%p\n", __func__, 1355 where, tag, newsp)); 1356 return newsp; 1357} 1358 1359static void 1360_key_delsp(struct secpolicy *sp) 1361{ 1362 SECPOLICY_LOCK_DESTROY(sp); 1363 free(sp, M_IPSEC_SP); 1364} 1365 1366/* 1367 * create secpolicy structure from sadb_x_policy structure. 1368 * NOTE: `state', `secpolicyindex' in secpolicy structure are not set, 1369 * so must be set properly later. 1370 */ 1371struct secpolicy * 1372key_msg2sp(xpl0, len, error) 1373 struct sadb_x_policy *xpl0; 1374 size_t len; 1375 int *error; 1376{ 1377 INIT_VNET_IPSEC(curvnet); 1378 struct secpolicy *newsp; 1379 1380 IPSEC_ASSERT(xpl0 != NULL, ("null xpl0")); 1381 IPSEC_ASSERT(len >= sizeof(*xpl0), ("policy too short: %zu", len)); 1382 1383 if (len != PFKEY_EXTLEN(xpl0)) { 1384 ipseclog((LOG_DEBUG, "%s: Invalid msg length.\n", __func__)); 1385 *error = EINVAL; 1386 return NULL; 1387 } 1388 1389 if ((newsp = KEY_NEWSP()) == NULL) { 1390 *error = ENOBUFS; 1391 return NULL; 1392 } 1393 1394 newsp->spidx.dir = xpl0->sadb_x_policy_dir; 1395 newsp->policy = xpl0->sadb_x_policy_type; 1396 1397 /* check policy */ 1398 switch (xpl0->sadb_x_policy_type) { 1399 case IPSEC_POLICY_DISCARD: 1400 case IPSEC_POLICY_NONE: 1401 case IPSEC_POLICY_ENTRUST: 1402 case IPSEC_POLICY_BYPASS: 1403 newsp->req = NULL; 1404 break; 1405 1406 case IPSEC_POLICY_IPSEC: 1407 { 1408 int tlen; 1409 struct sadb_x_ipsecrequest *xisr; 1410 struct ipsecrequest **p_isr = &newsp->req; 1411 1412 /* validity check */ 1413 if (PFKEY_EXTLEN(xpl0) < sizeof(*xpl0)) { 1414 ipseclog((LOG_DEBUG, "%s: Invalid msg length.\n", 1415 __func__)); 1416 KEY_FREESP(&newsp); 1417 *error = EINVAL; 1418 return NULL; 1419 } 1420 1421 tlen = PFKEY_EXTLEN(xpl0) - sizeof(*xpl0); 1422 xisr = (struct sadb_x_ipsecrequest *)(xpl0 + 1); 1423 1424 while (tlen > 0) { 1425 /* length check */ 1426 if (xisr->sadb_x_ipsecrequest_len < sizeof(*xisr)) { 1427 ipseclog((LOG_DEBUG, "%s: invalid ipsecrequest " 1428 "length.\n", __func__)); 1429 KEY_FREESP(&newsp); 1430 *error = EINVAL; 1431 return NULL; 1432 } 1433 1434 /* allocate request buffer */ 1435 /* NB: data structure is zero'd */ 1436 *p_isr = ipsec_newisr(); 1437 if ((*p_isr) == NULL) { 1438 ipseclog((LOG_DEBUG, 1439 "%s: No more memory.\n", __func__)); 1440 KEY_FREESP(&newsp); 1441 *error = ENOBUFS; 1442 return NULL; 1443 } 1444 1445 /* set values */ 1446 switch (xisr->sadb_x_ipsecrequest_proto) { 1447 case IPPROTO_ESP: 1448 case IPPROTO_AH: 1449 case IPPROTO_IPCOMP: 1450 break; 1451 default: 1452 ipseclog((LOG_DEBUG, 1453 "%s: invalid proto type=%u\n", __func__, 1454 xisr->sadb_x_ipsecrequest_proto)); 1455 KEY_FREESP(&newsp); 1456 *error = EPROTONOSUPPORT; 1457 return NULL; 1458 } 1459 (*p_isr)->saidx.proto = xisr->sadb_x_ipsecrequest_proto; 1460 1461 switch (xisr->sadb_x_ipsecrequest_mode) { 1462 case IPSEC_MODE_TRANSPORT: 1463 case IPSEC_MODE_TUNNEL: 1464 break; 1465 case IPSEC_MODE_ANY: 1466 default: 1467 ipseclog((LOG_DEBUG, 1468 "%s: invalid mode=%u\n", __func__, 1469 xisr->sadb_x_ipsecrequest_mode)); 1470 KEY_FREESP(&newsp); 1471 *error = EINVAL; 1472 return NULL; 1473 } 1474 (*p_isr)->saidx.mode = xisr->sadb_x_ipsecrequest_mode; 1475 1476 switch (xisr->sadb_x_ipsecrequest_level) { 1477 case IPSEC_LEVEL_DEFAULT: 1478 case IPSEC_LEVEL_USE: 1479 case IPSEC_LEVEL_REQUIRE: 1480 break; 1481 case IPSEC_LEVEL_UNIQUE: 1482 /* validity check */ 1483 /* 1484 * If range violation of reqid, kernel will 1485 * update it, don't refuse it. 1486 */ 1487 if (xisr->sadb_x_ipsecrequest_reqid 1488 > IPSEC_MANUAL_REQID_MAX) { 1489 ipseclog((LOG_DEBUG, 1490 "%s: reqid=%d range " 1491 "violation, updated by kernel.\n", 1492 __func__, 1493 xisr->sadb_x_ipsecrequest_reqid)); 1494 xisr->sadb_x_ipsecrequest_reqid = 0; 1495 } 1496 1497 /* allocate new reqid id if reqid is zero. */ 1498 if (xisr->sadb_x_ipsecrequest_reqid == 0) { 1499 u_int32_t reqid; 1500 if ((reqid = key_newreqid()) == 0) { 1501 KEY_FREESP(&newsp); 1502 *error = ENOBUFS; 1503 return NULL; 1504 } 1505 (*p_isr)->saidx.reqid = reqid; 1506 xisr->sadb_x_ipsecrequest_reqid = reqid; 1507 } else { 1508 /* set it for manual keying. */ 1509 (*p_isr)->saidx.reqid = 1510 xisr->sadb_x_ipsecrequest_reqid; 1511 } 1512 break; 1513 1514 default: 1515 ipseclog((LOG_DEBUG, "%s: invalid level=%u\n", 1516 __func__, 1517 xisr->sadb_x_ipsecrequest_level)); 1518 KEY_FREESP(&newsp); 1519 *error = EINVAL; 1520 return NULL; 1521 } 1522 (*p_isr)->level = xisr->sadb_x_ipsecrequest_level; 1523 1524 /* set IP addresses if there */ 1525 if (xisr->sadb_x_ipsecrequest_len > sizeof(*xisr)) { 1526 struct sockaddr *paddr; 1527 1528 paddr = (struct sockaddr *)(xisr + 1); 1529 1530 /* validity check */ 1531 if (paddr->sa_len 1532 > sizeof((*p_isr)->saidx.src)) { 1533 ipseclog((LOG_DEBUG, "%s: invalid " 1534 "request address length.\n", 1535 __func__)); 1536 KEY_FREESP(&newsp); 1537 *error = EINVAL; 1538 return NULL; 1539 } 1540 bcopy(paddr, &(*p_isr)->saidx.src, 1541 paddr->sa_len); 1542 1543 paddr = (struct sockaddr *)((caddr_t)paddr 1544 + paddr->sa_len); 1545 1546 /* validity check */ 1547 if (paddr->sa_len 1548 > sizeof((*p_isr)->saidx.dst)) { 1549 ipseclog((LOG_DEBUG, "%s: invalid " 1550 "request address length.\n", 1551 __func__)); 1552 KEY_FREESP(&newsp); 1553 *error = EINVAL; 1554 return NULL; 1555 } 1556 bcopy(paddr, &(*p_isr)->saidx.dst, 1557 paddr->sa_len); 1558 } 1559 1560 (*p_isr)->sp = newsp; 1561 1562 /* initialization for the next. */ 1563 p_isr = &(*p_isr)->next; 1564 tlen -= xisr->sadb_x_ipsecrequest_len; 1565 1566 /* validity check */ 1567 if (tlen < 0) { 1568 ipseclog((LOG_DEBUG, "%s: becoming tlen < 0.\n", 1569 __func__)); 1570 KEY_FREESP(&newsp); 1571 *error = EINVAL; 1572 return NULL; 1573 } 1574 1575 xisr = (struct sadb_x_ipsecrequest *)((caddr_t)xisr 1576 + xisr->sadb_x_ipsecrequest_len); 1577 } 1578 } 1579 break; 1580 default: 1581 ipseclog((LOG_DEBUG, "%s: invalid policy type.\n", __func__)); 1582 KEY_FREESP(&newsp); 1583 *error = EINVAL; 1584 return NULL; 1585 } 1586 1587 *error = 0; 1588 return newsp; 1589} 1590 1591static u_int32_t 1592key_newreqid() 1593{ 1594 static u_int32_t auto_reqid = IPSEC_MANUAL_REQID_MAX + 1; 1595 1596 auto_reqid = (auto_reqid == ~0 1597 ? IPSEC_MANUAL_REQID_MAX + 1 : auto_reqid + 1); 1598 1599 /* XXX should be unique check */ 1600 1601 return auto_reqid; 1602} 1603 1604/* 1605 * copy secpolicy struct to sadb_x_policy structure indicated. 1606 */ 1607struct mbuf * 1608key_sp2msg(sp) 1609 struct secpolicy *sp; 1610{ 1611 struct sadb_x_policy *xpl; 1612 int tlen; 1613 caddr_t p; 1614 struct mbuf *m; 1615 1616 IPSEC_ASSERT(sp != NULL, ("null policy")); 1617 1618 tlen = key_getspreqmsglen(sp); 1619 1620 m = key_alloc_mbuf(tlen); 1621 if (!m || m->m_next) { /*XXX*/ 1622 if (m) 1623 m_freem(m); 1624 return NULL; 1625 } 1626 1627 m->m_len = tlen; 1628 m->m_next = NULL; 1629 xpl = mtod(m, struct sadb_x_policy *); 1630 bzero(xpl, tlen); 1631 1632 xpl->sadb_x_policy_len = PFKEY_UNIT64(tlen); 1633 xpl->sadb_x_policy_exttype = SADB_X_EXT_POLICY; 1634 xpl->sadb_x_policy_type = sp->policy; 1635 xpl->sadb_x_policy_dir = sp->spidx.dir; 1636 xpl->sadb_x_policy_id = sp->id; 1637 p = (caddr_t)xpl + sizeof(*xpl); 1638 1639 /* if is the policy for ipsec ? */ 1640 if (sp->policy == IPSEC_POLICY_IPSEC) { 1641 struct sadb_x_ipsecrequest *xisr; 1642 struct ipsecrequest *isr; 1643 1644 for (isr = sp->req; isr != NULL; isr = isr->next) { 1645 1646 xisr = (struct sadb_x_ipsecrequest *)p; 1647 1648 xisr->sadb_x_ipsecrequest_proto = isr->saidx.proto; 1649 xisr->sadb_x_ipsecrequest_mode = isr->saidx.mode; 1650 xisr->sadb_x_ipsecrequest_level = isr->level; 1651 xisr->sadb_x_ipsecrequest_reqid = isr->saidx.reqid; 1652 1653 p += sizeof(*xisr); 1654 bcopy(&isr->saidx.src, p, isr->saidx.src.sa.sa_len); 1655 p += isr->saidx.src.sa.sa_len; 1656 bcopy(&isr->saidx.dst, p, isr->saidx.dst.sa.sa_len); 1657 p += isr->saidx.src.sa.sa_len; 1658 1659 xisr->sadb_x_ipsecrequest_len = 1660 PFKEY_ALIGN8(sizeof(*xisr) 1661 + isr->saidx.src.sa.sa_len 1662 + isr->saidx.dst.sa.sa_len); 1663 } 1664 } 1665 1666 return m; 1667} 1668 1669/* m will not be freed nor modified */ 1670static struct mbuf * 1671#ifdef __STDC__ 1672key_gather_mbuf(struct mbuf *m, const struct sadb_msghdr *mhp, 1673 int ndeep, int nitem, ...) 1674#else 1675key_gather_mbuf(m, mhp, ndeep, nitem, va_alist) 1676 struct mbuf *m; 1677 const struct sadb_msghdr *mhp; 1678 int ndeep; 1679 int nitem; 1680 va_dcl 1681#endif 1682{ 1683 va_list ap; 1684 int idx; 1685 int i; 1686 struct mbuf *result = NULL, *n; 1687 int len; 1688 1689 IPSEC_ASSERT(m != NULL, ("null mbuf")); 1690 IPSEC_ASSERT(mhp != NULL, ("null msghdr")); 1691 1692 va_start(ap, nitem); 1693 for (i = 0; i < nitem; i++) { 1694 idx = va_arg(ap, int); 1695 if (idx < 0 || idx > SADB_EXT_MAX) 1696 goto fail; 1697 /* don't attempt to pull empty extension */ 1698 if (idx == SADB_EXT_RESERVED && mhp->msg == NULL) 1699 continue; 1700 if (idx != SADB_EXT_RESERVED && 1701 (mhp->ext[idx] == NULL || mhp->extlen[idx] == 0)) 1702 continue; 1703 1704 if (idx == SADB_EXT_RESERVED) { 1705 len = PFKEY_ALIGN8(sizeof(struct sadb_msg)); 1706 1707 IPSEC_ASSERT(len <= MHLEN, ("header too big %u", len)); 1708 1709 MGETHDR(n, M_DONTWAIT, MT_DATA); 1710 if (!n) 1711 goto fail; 1712 n->m_len = len; 1713 n->m_next = NULL; 1714 m_copydata(m, 0, sizeof(struct sadb_msg), 1715 mtod(n, caddr_t)); 1716 } else if (i < ndeep) { 1717 len = mhp->extlen[idx]; 1718 n = key_alloc_mbuf(len); 1719 if (!n || n->m_next) { /*XXX*/ 1720 if (n) 1721 m_freem(n); 1722 goto fail; 1723 } 1724 m_copydata(m, mhp->extoff[idx], mhp->extlen[idx], 1725 mtod(n, caddr_t)); 1726 } else { 1727 n = m_copym(m, mhp->extoff[idx], mhp->extlen[idx], 1728 M_DONTWAIT); 1729 } 1730 if (n == NULL) 1731 goto fail; 1732 1733 if (result) 1734 m_cat(result, n); 1735 else 1736 result = n; 1737 } 1738 va_end(ap); 1739 1740 if ((result->m_flags & M_PKTHDR) != 0) { 1741 result->m_pkthdr.len = 0; 1742 for (n = result; n; n = n->m_next) 1743 result->m_pkthdr.len += n->m_len; 1744 } 1745 1746 return result; 1747 1748fail: 1749 m_freem(result); 1750 return NULL; 1751} 1752 1753/* 1754 * SADB_X_SPDADD, SADB_X_SPDSETIDX or SADB_X_SPDUPDATE processing 1755 * add an entry to SP database, when received 1756 * <base, address(SD), (lifetime(H),) policy> 1757 * from the user(?). 1758 * Adding to SP database, 1759 * and send 1760 * <base, address(SD), (lifetime(H),) policy> 1761 * to the socket which was send. 1762 * 1763 * SPDADD set a unique policy entry. 1764 * SPDSETIDX like SPDADD without a part of policy requests. 1765 * SPDUPDATE replace a unique policy entry. 1766 * 1767 * m will always be freed. 1768 */ 1769static int 1770key_spdadd(so, m, mhp) 1771 struct socket *so; 1772 struct mbuf *m; 1773 const struct sadb_msghdr *mhp; 1774{ 1775 INIT_VNET_IPSEC(curvnet); 1776 struct sadb_address *src0, *dst0; 1777 struct sadb_x_policy *xpl0, *xpl; 1778 struct sadb_lifetime *lft = NULL; 1779 struct secpolicyindex spidx; 1780 struct secpolicy *newsp; 1781 int error; 1782 1783 IPSEC_ASSERT(so != NULL, ("null socket")); 1784 IPSEC_ASSERT(m != NULL, ("null mbuf")); 1785 IPSEC_ASSERT(mhp != NULL, ("null msghdr")); 1786 IPSEC_ASSERT(mhp->msg != NULL, ("null msg")); 1787 1788 if (mhp->ext[SADB_EXT_ADDRESS_SRC] == NULL || 1789 mhp->ext[SADB_EXT_ADDRESS_DST] == NULL || 1790 mhp->ext[SADB_X_EXT_POLICY] == NULL) { 1791 ipseclog((LOG_DEBUG, "key_spdadd: invalid message is passed.\n")); 1792 return key_senderror(so, m, EINVAL); 1793 } 1794 if (mhp->extlen[SADB_EXT_ADDRESS_SRC] < sizeof(struct sadb_address) || 1795 mhp->extlen[SADB_EXT_ADDRESS_DST] < sizeof(struct sadb_address) || 1796 mhp->extlen[SADB_X_EXT_POLICY] < sizeof(struct sadb_x_policy)) { 1797 ipseclog((LOG_DEBUG, "%s: invalid message is passed.\n", 1798 __func__)); 1799 return key_senderror(so, m, EINVAL); 1800 } 1801 if (mhp->ext[SADB_EXT_LIFETIME_HARD] != NULL) { 1802 if (mhp->extlen[SADB_EXT_LIFETIME_HARD] 1803 < sizeof(struct sadb_lifetime)) { 1804 ipseclog((LOG_DEBUG, "%s: invalid message is passed.\n", 1805 __func__)); 1806 return key_senderror(so, m, EINVAL); 1807 } 1808 lft = (struct sadb_lifetime *)mhp->ext[SADB_EXT_LIFETIME_HARD]; 1809 } 1810 1811 src0 = (struct sadb_address *)mhp->ext[SADB_EXT_ADDRESS_SRC]; 1812 dst0 = (struct sadb_address *)mhp->ext[SADB_EXT_ADDRESS_DST]; 1813 xpl0 = (struct sadb_x_policy *)mhp->ext[SADB_X_EXT_POLICY]; 1814 1815 /* make secindex */ 1816 /* XXX boundary check against sa_len */ 1817 KEY_SETSECSPIDX(xpl0->sadb_x_policy_dir, 1818 src0 + 1, 1819 dst0 + 1, 1820 src0->sadb_address_prefixlen, 1821 dst0->sadb_address_prefixlen, 1822 src0->sadb_address_proto, 1823 &spidx); 1824 1825 /* checking the direciton. */ 1826 switch (xpl0->sadb_x_policy_dir) { 1827 case IPSEC_DIR_INBOUND: 1828 case IPSEC_DIR_OUTBOUND: 1829 break; 1830 default: 1831 ipseclog((LOG_DEBUG, "%s: Invalid SP direction.\n", __func__)); 1832 mhp->msg->sadb_msg_errno = EINVAL; 1833 return 0; 1834 } 1835 1836 /* check policy */ 1837 /* key_spdadd() accepts DISCARD, NONE and IPSEC. */ 1838 if (xpl0->sadb_x_policy_type == IPSEC_POLICY_ENTRUST 1839 || xpl0->sadb_x_policy_type == IPSEC_POLICY_BYPASS) { 1840 ipseclog((LOG_DEBUG, "%s: Invalid policy type.\n", __func__)); 1841 return key_senderror(so, m, EINVAL); 1842 } 1843 1844 /* policy requests are mandatory when action is ipsec. */ 1845 if (mhp->msg->sadb_msg_type != SADB_X_SPDSETIDX 1846 && xpl0->sadb_x_policy_type == IPSEC_POLICY_IPSEC 1847 && mhp->extlen[SADB_X_EXT_POLICY] <= sizeof(*xpl0)) { 1848 ipseclog((LOG_DEBUG, "%s: some policy requests part required\n", 1849 __func__)); 1850 return key_senderror(so, m, EINVAL); 1851 } 1852 1853 /* 1854 * checking there is SP already or not. 1855 * SPDUPDATE doesn't depend on whether there is a SP or not. 1856 * If the type is either SPDADD or SPDSETIDX AND a SP is found, 1857 * then error. 1858 */ 1859 newsp = key_getsp(&spidx); 1860 if (mhp->msg->sadb_msg_type == SADB_X_SPDUPDATE) { 1861 if (newsp) { 1862 newsp->state = IPSEC_SPSTATE_DEAD; 1863 KEY_FREESP(&newsp); 1864 } 1865 } else { 1866 if (newsp != NULL) { 1867 KEY_FREESP(&newsp); 1868 ipseclog((LOG_DEBUG, "%s: a SP entry exists already.\n", 1869 __func__)); 1870 return key_senderror(so, m, EEXIST); 1871 } 1872 } 1873 1874 /* allocation new SP entry */ 1875 if ((newsp = key_msg2sp(xpl0, PFKEY_EXTLEN(xpl0), &error)) == NULL) { 1876 return key_senderror(so, m, error); 1877 } 1878 1879 if ((newsp->id = key_getnewspid()) == 0) { 1880 _key_delsp(newsp); 1881 return key_senderror(so, m, ENOBUFS); 1882 } 1883 1884 /* XXX boundary check against sa_len */ 1885 KEY_SETSECSPIDX(xpl0->sadb_x_policy_dir, 1886 src0 + 1, 1887 dst0 + 1, 1888 src0->sadb_address_prefixlen, 1889 dst0->sadb_address_prefixlen, 1890 src0->sadb_address_proto, 1891 &newsp->spidx); 1892 1893 /* sanity check on addr pair */ 1894 if (((struct sockaddr *)(src0 + 1))->sa_family != 1895 ((struct sockaddr *)(dst0+ 1))->sa_family) { 1896 _key_delsp(newsp); 1897 return key_senderror(so, m, EINVAL); 1898 } 1899 if (((struct sockaddr *)(src0 + 1))->sa_len != 1900 ((struct sockaddr *)(dst0+ 1))->sa_len) { 1901 _key_delsp(newsp); 1902 return key_senderror(so, m, EINVAL); 1903 } 1904#if 1 1905 if (newsp->req && newsp->req->saidx.src.sa.sa_family) { 1906 struct sockaddr *sa; 1907 sa = (struct sockaddr *)(src0 + 1); 1908 if (sa->sa_family != newsp->req->saidx.src.sa.sa_family) { 1909 _key_delsp(newsp); 1910 return key_senderror(so, m, EINVAL); 1911 } 1912 } 1913 if (newsp->req && newsp->req->saidx.dst.sa.sa_family) { 1914 struct sockaddr *sa; 1915 sa = (struct sockaddr *)(dst0 + 1); 1916 if (sa->sa_family != newsp->req->saidx.dst.sa.sa_family) { 1917 _key_delsp(newsp); 1918 return key_senderror(so, m, EINVAL); 1919 } 1920 } 1921#endif 1922 1923 newsp->created = time_second; 1924 newsp->lastused = newsp->created; 1925 newsp->lifetime = lft ? lft->sadb_lifetime_addtime : 0; 1926 newsp->validtime = lft ? lft->sadb_lifetime_usetime : 0; 1927 1928 newsp->refcnt = 1; /* do not reclaim until I say I do */ 1929 newsp->state = IPSEC_SPSTATE_ALIVE; 1930 LIST_INSERT_TAIL(&V_sptree[newsp->spidx.dir], newsp, secpolicy, chain); 1931 1932 /* delete the entry in spacqtree */ 1933 if (mhp->msg->sadb_msg_type == SADB_X_SPDUPDATE) { 1934 struct secspacq *spacq = key_getspacq(&spidx); 1935 if (spacq != NULL) { 1936 /* reset counter in order to deletion by timehandler. */ 1937 spacq->created = time_second; 1938 spacq->count = 0; 1939 SPACQ_UNLOCK(); 1940 } 1941 } 1942 1943 { 1944 struct mbuf *n, *mpolicy; 1945 struct sadb_msg *newmsg; 1946 int off; 1947 1948 /* create new sadb_msg to reply. */ 1949 if (lft) { 1950 n = key_gather_mbuf(m, mhp, 2, 5, SADB_EXT_RESERVED, 1951 SADB_X_EXT_POLICY, SADB_EXT_LIFETIME_HARD, 1952 SADB_EXT_ADDRESS_SRC, SADB_EXT_ADDRESS_DST); 1953 } else { 1954 n = key_gather_mbuf(m, mhp, 2, 4, SADB_EXT_RESERVED, 1955 SADB_X_EXT_POLICY, 1956 SADB_EXT_ADDRESS_SRC, SADB_EXT_ADDRESS_DST); 1957 } 1958 if (!n) 1959 return key_senderror(so, m, ENOBUFS); 1960 1961 if (n->m_len < sizeof(*newmsg)) { 1962 n = m_pullup(n, sizeof(*newmsg)); 1963 if (!n) 1964 return key_senderror(so, m, ENOBUFS); 1965 } 1966 newmsg = mtod(n, struct sadb_msg *); 1967 newmsg->sadb_msg_errno = 0; 1968 newmsg->sadb_msg_len = PFKEY_UNIT64(n->m_pkthdr.len); 1969 1970 off = 0; 1971 mpolicy = m_pulldown(n, PFKEY_ALIGN8(sizeof(struct sadb_msg)), 1972 sizeof(*xpl), &off); 1973 if (mpolicy == NULL) { 1974 /* n is already freed */ 1975 return key_senderror(so, m, ENOBUFS); 1976 } 1977 xpl = (struct sadb_x_policy *)(mtod(mpolicy, caddr_t) + off); 1978 if (xpl->sadb_x_policy_exttype != SADB_X_EXT_POLICY) { 1979 m_freem(n); 1980 return key_senderror(so, m, EINVAL); 1981 } 1982 xpl->sadb_x_policy_id = newsp->id; 1983 1984 m_freem(m); 1985 return key_sendup_mbuf(so, n, KEY_SENDUP_ALL); 1986 } 1987} 1988 1989/* 1990 * get new policy id. 1991 * OUT: 1992 * 0: failure. 1993 * others: success. 1994 */ 1995static u_int32_t 1996key_getnewspid() 1997{ 1998 INIT_VNET_IPSEC(curvnet); 1999 u_int32_t newid = 0; 2000 int count = V_key_spi_trycnt; /* XXX */ 2001 struct secpolicy *sp; 2002 2003 /* when requesting to allocate spi ranged */ 2004 while (count--) { 2005 newid = (V_policy_id = (V_policy_id == ~0 ? 1 : V_policy_id + 1)); 2006 2007 if ((sp = key_getspbyid(newid)) == NULL) 2008 break; 2009 2010 KEY_FREESP(&sp); 2011 } 2012 2013 if (count == 0 || newid == 0) { 2014 ipseclog((LOG_DEBUG, "%s: to allocate policy id is failed.\n", 2015 __func__)); 2016 return 0; 2017 } 2018 2019 return newid; 2020} 2021 2022/* 2023 * SADB_SPDDELETE processing 2024 * receive 2025 * <base, address(SD), policy(*)> 2026 * from the user(?), and set SADB_SASTATE_DEAD, 2027 * and send, 2028 * <base, address(SD), policy(*)> 2029 * to the ikmpd. 2030 * policy(*) including direction of policy. 2031 * 2032 * m will always be freed. 2033 */ 2034static int 2035key_spddelete(so, m, mhp) 2036 struct socket *so; 2037 struct mbuf *m; 2038 const struct sadb_msghdr *mhp; 2039{ 2040 INIT_VNET_IPSEC(curvnet); 2041 struct sadb_address *src0, *dst0; 2042 struct sadb_x_policy *xpl0; 2043 struct secpolicyindex spidx; 2044 struct secpolicy *sp; 2045 2046 IPSEC_ASSERT(so != NULL, ("null so")); 2047 IPSEC_ASSERT(m != NULL, ("null mbuf")); 2048 IPSEC_ASSERT(mhp != NULL, ("null msghdr")); 2049 IPSEC_ASSERT(mhp->msg != NULL, ("null msg")); 2050 2051 if (mhp->ext[SADB_EXT_ADDRESS_SRC] == NULL || 2052 mhp->ext[SADB_EXT_ADDRESS_DST] == NULL || 2053 mhp->ext[SADB_X_EXT_POLICY] == NULL) { 2054 ipseclog((LOG_DEBUG, "%s: invalid message is passed.\n", 2055 __func__)); 2056 return key_senderror(so, m, EINVAL); 2057 } 2058 if (mhp->extlen[SADB_EXT_ADDRESS_SRC] < sizeof(struct sadb_address) || 2059 mhp->extlen[SADB_EXT_ADDRESS_DST] < sizeof(struct sadb_address) || 2060 mhp->extlen[SADB_X_EXT_POLICY] < sizeof(struct sadb_x_policy)) { 2061 ipseclog((LOG_DEBUG, "%s: invalid message is passed.\n", 2062 __func__)); 2063 return key_senderror(so, m, EINVAL); 2064 } 2065 2066 src0 = (struct sadb_address *)mhp->ext[SADB_EXT_ADDRESS_SRC]; 2067 dst0 = (struct sadb_address *)mhp->ext[SADB_EXT_ADDRESS_DST]; 2068 xpl0 = (struct sadb_x_policy *)mhp->ext[SADB_X_EXT_POLICY]; 2069 2070 /* make secindex */ 2071 /* XXX boundary check against sa_len */ 2072 KEY_SETSECSPIDX(xpl0->sadb_x_policy_dir, 2073 src0 + 1, 2074 dst0 + 1, 2075 src0->sadb_address_prefixlen, 2076 dst0->sadb_address_prefixlen, 2077 src0->sadb_address_proto, 2078 &spidx); 2079 2080 /* checking the direciton. */ 2081 switch (xpl0->sadb_x_policy_dir) { 2082 case IPSEC_DIR_INBOUND: 2083 case IPSEC_DIR_OUTBOUND: 2084 break; 2085 default: 2086 ipseclog((LOG_DEBUG, "%s: Invalid SP direction.\n", __func__)); 2087 return key_senderror(so, m, EINVAL); 2088 } 2089 2090 /* Is there SP in SPD ? */ 2091 if ((sp = key_getsp(&spidx)) == NULL) { 2092 ipseclog((LOG_DEBUG, "%s: no SP found.\n", __func__)); 2093 return key_senderror(so, m, EINVAL); 2094 } 2095 2096 /* save policy id to buffer to be returned. */ 2097 xpl0->sadb_x_policy_id = sp->id; 2098 2099 sp->state = IPSEC_SPSTATE_DEAD; 2100 KEY_FREESP(&sp); 2101 2102 { 2103 struct mbuf *n; 2104 struct sadb_msg *newmsg; 2105 2106 /* create new sadb_msg to reply. */ 2107 n = key_gather_mbuf(m, mhp, 1, 4, SADB_EXT_RESERVED, 2108 SADB_X_EXT_POLICY, SADB_EXT_ADDRESS_SRC, SADB_EXT_ADDRESS_DST); 2109 if (!n) 2110 return key_senderror(so, m, ENOBUFS); 2111 2112 newmsg = mtod(n, struct sadb_msg *); 2113 newmsg->sadb_msg_errno = 0; 2114 newmsg->sadb_msg_len = PFKEY_UNIT64(n->m_pkthdr.len); 2115 2116 m_freem(m); 2117 return key_sendup_mbuf(so, n, KEY_SENDUP_ALL); 2118 } 2119} 2120 2121/* 2122 * SADB_SPDDELETE2 processing 2123 * receive 2124 * <base, policy(*)> 2125 * from the user(?), and set SADB_SASTATE_DEAD, 2126 * and send, 2127 * <base, policy(*)> 2128 * to the ikmpd. 2129 * policy(*) including direction of policy. 2130 * 2131 * m will always be freed. 2132 */ 2133static int 2134key_spddelete2(so, m, mhp) 2135 struct socket *so; 2136 struct mbuf *m; 2137 const struct sadb_msghdr *mhp; 2138{ 2139 INIT_VNET_IPSEC(curvnet); 2140 u_int32_t id; 2141 struct secpolicy *sp; 2142 2143 IPSEC_ASSERT(so != NULL, ("null socket")); 2144 IPSEC_ASSERT(m != NULL, ("null mbuf")); 2145 IPSEC_ASSERT(mhp != NULL, ("null msghdr")); 2146 IPSEC_ASSERT(mhp->msg != NULL, ("null msg")); 2147 2148 if (mhp->ext[SADB_X_EXT_POLICY] == NULL || 2149 mhp->extlen[SADB_X_EXT_POLICY] < sizeof(struct sadb_x_policy)) { 2150 ipseclog((LOG_DEBUG, "%s: invalid message is passed.\n", __func__)); 2151 return key_senderror(so, m, EINVAL); 2152 } 2153 2154 id = ((struct sadb_x_policy *)mhp->ext[SADB_X_EXT_POLICY])->sadb_x_policy_id; 2155 2156 /* Is there SP in SPD ? */ 2157 if ((sp = key_getspbyid(id)) == NULL) { 2158 ipseclog((LOG_DEBUG, "%s: no SP found id:%u.\n", __func__, id)); 2159 return key_senderror(so, m, EINVAL); 2160 } 2161 2162 sp->state = IPSEC_SPSTATE_DEAD; 2163 KEY_FREESP(&sp); 2164 2165 { 2166 struct mbuf *n, *nn; 2167 struct sadb_msg *newmsg; 2168 int off, len; 2169 2170 /* create new sadb_msg to reply. */ 2171 len = PFKEY_ALIGN8(sizeof(struct sadb_msg)); 2172 2173 MGETHDR(n, M_DONTWAIT, MT_DATA); 2174 if (n && len > MHLEN) { 2175 MCLGET(n, M_DONTWAIT); 2176 if ((n->m_flags & M_EXT) == 0) { 2177 m_freem(n); 2178 n = NULL; 2179 } 2180 } 2181 if (!n) 2182 return key_senderror(so, m, ENOBUFS); 2183 2184 n->m_len = len; 2185 n->m_next = NULL; 2186 off = 0; 2187 2188 m_copydata(m, 0, sizeof(struct sadb_msg), mtod(n, caddr_t) + off); 2189 off += PFKEY_ALIGN8(sizeof(struct sadb_msg)); 2190 2191 IPSEC_ASSERT(off == len, ("length inconsistency (off %u len %u)", 2192 off, len)); 2193 2194 n->m_next = m_copym(m, mhp->extoff[SADB_X_EXT_POLICY], 2195 mhp->extlen[SADB_X_EXT_POLICY], M_DONTWAIT); 2196 if (!n->m_next) { 2197 m_freem(n); 2198 return key_senderror(so, m, ENOBUFS); 2199 } 2200 2201 n->m_pkthdr.len = 0; 2202 for (nn = n; nn; nn = nn->m_next) 2203 n->m_pkthdr.len += nn->m_len; 2204 2205 newmsg = mtod(n, struct sadb_msg *); 2206 newmsg->sadb_msg_errno = 0; 2207 newmsg->sadb_msg_len = PFKEY_UNIT64(n->m_pkthdr.len); 2208 2209 m_freem(m); 2210 return key_sendup_mbuf(so, n, KEY_SENDUP_ALL); 2211 } 2212} 2213 2214/* 2215 * SADB_X_GET processing 2216 * receive 2217 * <base, policy(*)> 2218 * from the user(?), 2219 * and send, 2220 * <base, address(SD), policy> 2221 * to the ikmpd. 2222 * policy(*) including direction of policy. 2223 * 2224 * m will always be freed. 2225 */ 2226static int 2227key_spdget(so, m, mhp) 2228 struct socket *so; 2229 struct mbuf *m; 2230 const struct sadb_msghdr *mhp; 2231{ 2232 INIT_VNET_IPSEC(curvnet); 2233 u_int32_t id; 2234 struct secpolicy *sp; 2235 struct mbuf *n; 2236 2237 IPSEC_ASSERT(so != NULL, ("null socket")); 2238 IPSEC_ASSERT(m != NULL, ("null mbuf")); 2239 IPSEC_ASSERT(mhp != NULL, ("null msghdr")); 2240 IPSEC_ASSERT(mhp->msg != NULL, ("null msg")); 2241 2242 if (mhp->ext[SADB_X_EXT_POLICY] == NULL || 2243 mhp->extlen[SADB_X_EXT_POLICY] < sizeof(struct sadb_x_policy)) { 2244 ipseclog((LOG_DEBUG, "%s: invalid message is passed.\n", 2245 __func__)); 2246 return key_senderror(so, m, EINVAL); 2247 } 2248 2249 id = ((struct sadb_x_policy *)mhp->ext[SADB_X_EXT_POLICY])->sadb_x_policy_id; 2250 2251 /* Is there SP in SPD ? */ 2252 if ((sp = key_getspbyid(id)) == NULL) { 2253 ipseclog((LOG_DEBUG, "%s: no SP found id:%u.\n", __func__, id)); 2254 return key_senderror(so, m, ENOENT); 2255 } 2256 2257 n = key_setdumpsp(sp, SADB_X_SPDGET, 0, mhp->msg->sadb_msg_pid); 2258 if (n != NULL) { 2259 m_freem(m); 2260 return key_sendup_mbuf(so, n, KEY_SENDUP_ONE); 2261 } else 2262 return key_senderror(so, m, ENOBUFS); 2263} 2264 2265/* 2266 * SADB_X_SPDACQUIRE processing. 2267 * Acquire policy and SA(s) for a *OUTBOUND* packet. 2268 * send 2269 * <base, policy(*)> 2270 * to KMD, and expect to receive 2271 * <base> with SADB_X_SPDACQUIRE if error occured, 2272 * or 2273 * <base, policy> 2274 * with SADB_X_SPDUPDATE from KMD by PF_KEY. 2275 * policy(*) is without policy requests. 2276 * 2277 * 0 : succeed 2278 * others: error number 2279 */ 2280int 2281key_spdacquire(sp) 2282 struct secpolicy *sp; 2283{ 2284 INIT_VNET_IPSEC(curvnet); 2285 struct mbuf *result = NULL, *m; 2286 struct secspacq *newspacq; 2287 2288 IPSEC_ASSERT(sp != NULL, ("null secpolicy")); 2289 IPSEC_ASSERT(sp->req == NULL, ("policy exists")); 2290 IPSEC_ASSERT(sp->policy == IPSEC_POLICY_IPSEC, 2291 ("policy not IPSEC %u", sp->policy)); 2292 2293 /* Get an entry to check whether sent message or not. */ 2294 newspacq = key_getspacq(&sp->spidx); 2295 if (newspacq != NULL) { 2296 if (V_key_blockacq_count < newspacq->count) { 2297 /* reset counter and do send message. */ 2298 newspacq->count = 0; 2299 } else { 2300 /* increment counter and do nothing. */ 2301 newspacq->count++; 2302 return 0; 2303 } 2304 SPACQ_UNLOCK(); 2305 } else { 2306 /* make new entry for blocking to send SADB_ACQUIRE. */ 2307 newspacq = key_newspacq(&sp->spidx); 2308 if (newspacq == NULL) 2309 return ENOBUFS; 2310 } 2311 2312 /* create new sadb_msg to reply. */ 2313 m = key_setsadbmsg(SADB_X_SPDACQUIRE, 0, 0, 0, 0, 0); 2314 if (!m) 2315 return ENOBUFS; 2316 2317 result = m; 2318 2319 result->m_pkthdr.len = 0; 2320 for (m = result; m; m = m->m_next) 2321 result->m_pkthdr.len += m->m_len; 2322 2323 mtod(result, struct sadb_msg *)->sadb_msg_len = 2324 PFKEY_UNIT64(result->m_pkthdr.len); 2325 2326 return key_sendup_mbuf(NULL, m, KEY_SENDUP_REGISTERED); 2327} 2328 2329/* 2330 * SADB_SPDFLUSH processing 2331 * receive 2332 * <base> 2333 * from the user, and free all entries in secpctree. 2334 * and send, 2335 * <base> 2336 * to the user. 2337 * NOTE: what to do is only marking SADB_SASTATE_DEAD. 2338 * 2339 * m will always be freed. 2340 */ 2341static int 2342key_spdflush(so, m, mhp) 2343 struct socket *so; 2344 struct mbuf *m; 2345 const struct sadb_msghdr *mhp; 2346{ 2347 INIT_VNET_IPSEC(curvnet); 2348 struct sadb_msg *newmsg; 2349 struct secpolicy *sp; 2350 u_int dir; 2351 2352 IPSEC_ASSERT(so != NULL, ("null socket")); 2353 IPSEC_ASSERT(m != NULL, ("null mbuf")); 2354 IPSEC_ASSERT(mhp != NULL, ("null msghdr")); 2355 IPSEC_ASSERT(mhp->msg != NULL, ("null msg")); 2356 2357 if (m->m_len != PFKEY_ALIGN8(sizeof(struct sadb_msg))) 2358 return key_senderror(so, m, EINVAL); 2359 2360 for (dir = 0; dir < IPSEC_DIR_MAX; dir++) { 2361 SPTREE_LOCK(); 2362 LIST_FOREACH(sp, &V_sptree[dir], chain) 2363 sp->state = IPSEC_SPSTATE_DEAD; 2364 SPTREE_UNLOCK(); 2365 } 2366 2367 if (sizeof(struct sadb_msg) > m->m_len + M_TRAILINGSPACE(m)) { 2368 ipseclog((LOG_DEBUG, "%s: No more memory.\n", __func__)); 2369 return key_senderror(so, m, ENOBUFS); 2370 } 2371 2372 if (m->m_next) 2373 m_freem(m->m_next); 2374 m->m_next = NULL; 2375 m->m_pkthdr.len = m->m_len = PFKEY_ALIGN8(sizeof(struct sadb_msg)); 2376 newmsg = mtod(m, struct sadb_msg *); 2377 newmsg->sadb_msg_errno = 0; 2378 newmsg->sadb_msg_len = PFKEY_UNIT64(m->m_pkthdr.len); 2379 2380 return key_sendup_mbuf(so, m, KEY_SENDUP_ALL); 2381} 2382 2383/* 2384 * SADB_SPDDUMP processing 2385 * receive 2386 * <base> 2387 * from the user, and dump all SP leaves 2388 * and send, 2389 * <base> ..... 2390 * to the ikmpd. 2391 * 2392 * m will always be freed. 2393 */ 2394static int 2395key_spddump(so, m, mhp) 2396 struct socket *so; 2397 struct mbuf *m; 2398 const struct sadb_msghdr *mhp; 2399{ 2400 INIT_VNET_IPSEC(curvnet); 2401 struct secpolicy *sp; 2402 int cnt; 2403 u_int dir; 2404 struct mbuf *n; 2405 2406 IPSEC_ASSERT(so != NULL, ("null socket")); 2407 IPSEC_ASSERT(m != NULL, ("null mbuf")); 2408 IPSEC_ASSERT(mhp != NULL, ("null msghdr")); 2409 IPSEC_ASSERT(mhp->msg != NULL, ("null msg")); 2410 2411 /* search SPD entry and get buffer size. */ 2412 cnt = 0; 2413 for (dir = 0; dir < IPSEC_DIR_MAX; dir++) { 2414 LIST_FOREACH(sp, &V_sptree[dir], chain) { 2415 cnt++; 2416 } 2417 } 2418 2419 if (cnt == 0) 2420 return key_senderror(so, m, ENOENT); 2421 2422 for (dir = 0; dir < IPSEC_DIR_MAX; dir++) { 2423 LIST_FOREACH(sp, &V_sptree[dir], chain) { 2424 --cnt; 2425 n = key_setdumpsp(sp, SADB_X_SPDDUMP, cnt, 2426 mhp->msg->sadb_msg_pid); 2427 2428 if (n) 2429 key_sendup_mbuf(so, n, KEY_SENDUP_ONE); 2430 } 2431 } 2432 2433 m_freem(m); 2434 return 0; 2435} 2436 2437static struct mbuf * 2438key_setdumpsp(sp, type, seq, pid) 2439 struct secpolicy *sp; 2440 u_int8_t type; 2441 u_int32_t seq, pid; 2442{ 2443 struct mbuf *result = NULL, *m; 2444 struct seclifetime lt; 2445 2446 m = key_setsadbmsg(type, 0, SADB_SATYPE_UNSPEC, seq, pid, sp->refcnt); 2447 if (!m) 2448 goto fail; 2449 result = m; 2450 2451 m = key_setsadbaddr(SADB_EXT_ADDRESS_SRC, 2452 &sp->spidx.src.sa, sp->spidx.prefs, 2453 sp->spidx.ul_proto); 2454 if (!m) 2455 goto fail; 2456 m_cat(result, m); 2457 2458 m = key_setsadbaddr(SADB_EXT_ADDRESS_DST, 2459 &sp->spidx.dst.sa, sp->spidx.prefd, 2460 sp->spidx.ul_proto); 2461 if (!m) 2462 goto fail; 2463 m_cat(result, m); 2464 2465 m = key_sp2msg(sp); 2466 if (!m) 2467 goto fail; 2468 m_cat(result, m); 2469 2470 if(sp->lifetime){ 2471 lt.addtime=sp->created; 2472 lt.usetime= sp->lastused; 2473 m = key_setlifetime(<, SADB_EXT_LIFETIME_CURRENT); 2474 if (!m) 2475 goto fail; 2476 m_cat(result, m); 2477 2478 lt.addtime=sp->lifetime; 2479 lt.usetime= sp->validtime; 2480 m = key_setlifetime(<, SADB_EXT_LIFETIME_HARD); 2481 if (!m) 2482 goto fail; 2483 m_cat(result, m); 2484 } 2485 2486 if ((result->m_flags & M_PKTHDR) == 0) 2487 goto fail; 2488 2489 if (result->m_len < sizeof(struct sadb_msg)) { 2490 result = m_pullup(result, sizeof(struct sadb_msg)); 2491 if (result == NULL) 2492 goto fail; 2493 } 2494 2495 result->m_pkthdr.len = 0; 2496 for (m = result; m; m = m->m_next) 2497 result->m_pkthdr.len += m->m_len; 2498 2499 mtod(result, struct sadb_msg *)->sadb_msg_len = 2500 PFKEY_UNIT64(result->m_pkthdr.len); 2501 2502 return result; 2503 2504fail: 2505 m_freem(result); 2506 return NULL; 2507} 2508 2509/* 2510 * get PFKEY message length for security policy and request. 2511 */ 2512static u_int 2513key_getspreqmsglen(sp) 2514 struct secpolicy *sp; 2515{ 2516 u_int tlen; 2517 2518 tlen = sizeof(struct sadb_x_policy); 2519 2520 /* if is the policy for ipsec ? */ 2521 if (sp->policy != IPSEC_POLICY_IPSEC) 2522 return tlen; 2523 2524 /* get length of ipsec requests */ 2525 { 2526 struct ipsecrequest *isr; 2527 int len; 2528 2529 for (isr = sp->req; isr != NULL; isr = isr->next) { 2530 len = sizeof(struct sadb_x_ipsecrequest) 2531 + isr->saidx.src.sa.sa_len 2532 + isr->saidx.dst.sa.sa_len; 2533 2534 tlen += PFKEY_ALIGN8(len); 2535 } 2536 } 2537 2538 return tlen; 2539} 2540 2541/* 2542 * SADB_SPDEXPIRE processing 2543 * send 2544 * <base, address(SD), lifetime(CH), policy> 2545 * to KMD by PF_KEY. 2546 * 2547 * OUT: 0 : succeed 2548 * others : error number 2549 */ 2550static int 2551key_spdexpire(sp) 2552 struct secpolicy *sp; 2553{ 2554 struct mbuf *result = NULL, *m; 2555 int len; 2556 int error = -1; 2557 struct sadb_lifetime *lt; 2558 2559 /* XXX: Why do we lock ? */ 2560 2561 IPSEC_ASSERT(sp != NULL, ("null secpolicy")); 2562 2563 /* set msg header */ 2564 m = key_setsadbmsg(SADB_X_SPDEXPIRE, 0, 0, 0, 0, 0); 2565 if (!m) { 2566 error = ENOBUFS; 2567 goto fail; 2568 } 2569 result = m; 2570 2571 /* create lifetime extension (current and hard) */ 2572 len = PFKEY_ALIGN8(sizeof(*lt)) * 2; 2573 m = key_alloc_mbuf(len); 2574 if (!m || m->m_next) { /*XXX*/ 2575 if (m) 2576 m_freem(m); 2577 error = ENOBUFS; 2578 goto fail; 2579 } 2580 bzero(mtod(m, caddr_t), len); 2581 lt = mtod(m, struct sadb_lifetime *); 2582 lt->sadb_lifetime_len = PFKEY_UNIT64(sizeof(struct sadb_lifetime)); 2583 lt->sadb_lifetime_exttype = SADB_EXT_LIFETIME_CURRENT; 2584 lt->sadb_lifetime_allocations = 0; 2585 lt->sadb_lifetime_bytes = 0; 2586 lt->sadb_lifetime_addtime = sp->created; 2587 lt->sadb_lifetime_usetime = sp->lastused; 2588 lt = (struct sadb_lifetime *)(mtod(m, caddr_t) + len / 2); 2589 lt->sadb_lifetime_len = PFKEY_UNIT64(sizeof(struct sadb_lifetime)); 2590 lt->sadb_lifetime_exttype = SADB_EXT_LIFETIME_HARD; 2591 lt->sadb_lifetime_allocations = 0; 2592 lt->sadb_lifetime_bytes = 0; 2593 lt->sadb_lifetime_addtime = sp->lifetime; 2594 lt->sadb_lifetime_usetime = sp->validtime; 2595 m_cat(result, m); 2596 2597 /* set sadb_address for source */ 2598 m = key_setsadbaddr(SADB_EXT_ADDRESS_SRC, 2599 &sp->spidx.src.sa, 2600 sp->spidx.prefs, sp->spidx.ul_proto); 2601 if (!m) { 2602 error = ENOBUFS; 2603 goto fail; 2604 } 2605 m_cat(result, m); 2606 2607 /* set sadb_address for destination */ 2608 m = key_setsadbaddr(SADB_EXT_ADDRESS_DST, 2609 &sp->spidx.dst.sa, 2610 sp->spidx.prefd, sp->spidx.ul_proto); 2611 if (!m) { 2612 error = ENOBUFS; 2613 goto fail; 2614 } 2615 m_cat(result, m); 2616 2617 /* set secpolicy */ 2618 m = key_sp2msg(sp); 2619 if (!m) { 2620 error = ENOBUFS; 2621 goto fail; 2622 } 2623 m_cat(result, m); 2624 2625 if ((result->m_flags & M_PKTHDR) == 0) { 2626 error = EINVAL; 2627 goto fail; 2628 } 2629 2630 if (result->m_len < sizeof(struct sadb_msg)) { 2631 result = m_pullup(result, sizeof(struct sadb_msg)); 2632 if (result == NULL) { 2633 error = ENOBUFS; 2634 goto fail; 2635 } 2636 } 2637 2638 result->m_pkthdr.len = 0; 2639 for (m = result; m; m = m->m_next) 2640 result->m_pkthdr.len += m->m_len; 2641 2642 mtod(result, struct sadb_msg *)->sadb_msg_len = 2643 PFKEY_UNIT64(result->m_pkthdr.len); 2644 2645 return key_sendup_mbuf(NULL, result, KEY_SENDUP_REGISTERED); 2646 2647 fail: 2648 if (result) 2649 m_freem(result); 2650 return error; 2651} 2652 2653/* %%% SAD management */ 2654/* 2655 * allocating a memory for new SA head, and copy from the values of mhp. 2656 * OUT: NULL : failure due to the lack of memory. 2657 * others : pointer to new SA head. 2658 */ 2659static struct secashead * 2660key_newsah(saidx) 2661 struct secasindex *saidx; 2662{ 2663 INIT_VNET_IPSEC(curvnet); 2664 struct secashead *newsah; 2665 2666 IPSEC_ASSERT(saidx != NULL, ("null saidx")); 2667 2668 newsah = malloc(sizeof(struct secashead), M_IPSEC_SAH, M_NOWAIT|M_ZERO); 2669 if (newsah != NULL) { 2670 int i; 2671 for (i = 0; i < sizeof(newsah->savtree)/sizeof(newsah->savtree[0]); i++) 2672 LIST_INIT(&newsah->savtree[i]); 2673 newsah->saidx = *saidx; 2674 2675 /* add to saidxtree */ 2676 newsah->state = SADB_SASTATE_MATURE; 2677 2678 SAHTREE_LOCK(); 2679 LIST_INSERT_HEAD(&V_sahtree, newsah, chain); 2680 SAHTREE_UNLOCK(); 2681 } 2682 return(newsah); 2683} 2684 2685/* 2686 * delete SA index and all SA registerd. 2687 */ 2688static void 2689key_delsah(sah) 2690 struct secashead *sah; 2691{ 2692 INIT_VNET_IPSEC(curvnet); 2693 struct secasvar *sav, *nextsav; 2694 u_int stateidx; 2695 int zombie = 0; 2696 2697 IPSEC_ASSERT(sah != NULL, ("NULL sah")); 2698 SAHTREE_LOCK_ASSERT(); 2699 2700 /* searching all SA registerd in the secindex. */ 2701 for (stateidx = 0; 2702 stateidx < _ARRAYLEN(saorder_state_any); 2703 stateidx++) { 2704 u_int state = saorder_state_any[stateidx]; 2705 LIST_FOREACH_SAFE(sav, &sah->savtree[state], chain, nextsav) { 2706 if (sav->refcnt == 0) { 2707 /* sanity check */ 2708 KEY_CHKSASTATE(state, sav->state, __func__); 2709 KEY_FREESAV(&sav); 2710 } else { 2711 /* give up to delete this sa */ 2712 zombie++; 2713 } 2714 } 2715 } 2716 if (!zombie) { /* delete only if there are savs */ 2717 /* remove from tree of SA index */ 2718 if (__LIST_CHAINED(sah)) 2719 LIST_REMOVE(sah, chain); 2720 if (sah->sa_route.ro_rt) { 2721 RTFREE(sah->sa_route.ro_rt); 2722 sah->sa_route.ro_rt = (struct rtentry *)NULL; 2723 } 2724 free(sah, M_IPSEC_SAH); 2725 } 2726} 2727 2728/* 2729 * allocating a new SA with LARVAL state. key_add() and key_getspi() call, 2730 * and copy the values of mhp into new buffer. 2731 * When SAD message type is GETSPI: 2732 * to set sequence number from acq_seq++, 2733 * to set zero to SPI. 2734 * not to call key_setsava(). 2735 * OUT: NULL : fail 2736 * others : pointer to new secasvar. 2737 * 2738 * does not modify mbuf. does not free mbuf on error. 2739 */ 2740static struct secasvar * 2741key_newsav(m, mhp, sah, errp, where, tag) 2742 struct mbuf *m; 2743 const struct sadb_msghdr *mhp; 2744 struct secashead *sah; 2745 int *errp; 2746 const char* where; 2747 int tag; 2748{ 2749 INIT_VNET_IPSEC(curvnet); 2750 struct secasvar *newsav; 2751 const struct sadb_sa *xsa; 2752 2753 IPSEC_ASSERT(m != NULL, ("null mbuf")); 2754 IPSEC_ASSERT(mhp != NULL, ("null msghdr")); 2755 IPSEC_ASSERT(mhp->msg != NULL, ("null msg")); 2756 IPSEC_ASSERT(sah != NULL, ("null secashead")); 2757 2758 newsav = malloc(sizeof(struct secasvar), M_IPSEC_SA, M_NOWAIT|M_ZERO); 2759 if (newsav == NULL) { 2760 ipseclog((LOG_DEBUG, "%s: No more memory.\n", __func__)); 2761 *errp = ENOBUFS; 2762 goto done; 2763 } 2764 2765 switch (mhp->msg->sadb_msg_type) { 2766 case SADB_GETSPI: 2767 newsav->spi = 0; 2768 2769#ifdef IPSEC_DOSEQCHECK 2770 /* sync sequence number */ 2771 if (mhp->msg->sadb_msg_seq == 0) 2772 newsav->seq = 2773 (V_acq_seq = (V_acq_seq == ~0 ? 1 : ++V_acq_seq)); 2774 else 2775#endif 2776 newsav->seq = mhp->msg->sadb_msg_seq; 2777 break; 2778 2779 case SADB_ADD: 2780 /* sanity check */ 2781 if (mhp->ext[SADB_EXT_SA] == NULL) { 2782 free(newsav, M_IPSEC_SA); 2783 newsav = NULL; 2784 ipseclog((LOG_DEBUG, "%s: invalid message is passed.\n", 2785 __func__)); 2786 *errp = EINVAL; 2787 goto done; 2788 } 2789 xsa = (const struct sadb_sa *)mhp->ext[SADB_EXT_SA]; 2790 newsav->spi = xsa->sadb_sa_spi; 2791 newsav->seq = mhp->msg->sadb_msg_seq; 2792 break; 2793 default: 2794 free(newsav, M_IPSEC_SA); 2795 newsav = NULL; 2796 *errp = EINVAL; 2797 goto done; 2798 } 2799 2800 2801 /* copy sav values */ 2802 if (mhp->msg->sadb_msg_type != SADB_GETSPI) { 2803 *errp = key_setsaval(newsav, m, mhp); 2804 if (*errp) { 2805 free(newsav, M_IPSEC_SA); 2806 newsav = NULL; 2807 goto done; 2808 } 2809 } 2810 2811 SECASVAR_LOCK_INIT(newsav); 2812 2813 /* reset created */ 2814 newsav->created = time_second; 2815 newsav->pid = mhp->msg->sadb_msg_pid; 2816 2817 /* add to satree */ 2818 newsav->sah = sah; 2819 sa_initref(newsav); 2820 newsav->state = SADB_SASTATE_LARVAL; 2821 2822 /* XXX locking??? */ 2823 LIST_INSERT_TAIL(&sah->savtree[SADB_SASTATE_LARVAL], newsav, 2824 secasvar, chain); 2825done: 2826 KEYDEBUG(KEYDEBUG_IPSEC_STAMP, 2827 printf("DP %s from %s:%u return SP:%p\n", __func__, 2828 where, tag, newsav)); 2829 2830 return newsav; 2831} 2832 2833/* 2834 * free() SA variable entry. 2835 */ 2836static void 2837key_cleansav(struct secasvar *sav) 2838{ 2839 /* 2840 * Cleanup xform state. Note that zeroize'ing causes the 2841 * keys to be cleared; otherwise we must do it ourself. 2842 */ 2843 if (sav->tdb_xform != NULL) { 2844 sav->tdb_xform->xf_zeroize(sav); 2845 sav->tdb_xform = NULL; 2846 } else { 2847 KASSERT(sav->iv == NULL, ("iv but no xform")); 2848 if (sav->key_auth != NULL) 2849 bzero(sav->key_auth->key_data, _KEYLEN(sav->key_auth)); 2850 if (sav->key_enc != NULL) 2851 bzero(sav->key_enc->key_data, _KEYLEN(sav->key_enc)); 2852 } 2853 if (sav->key_auth != NULL) { 2854 if (sav->key_auth->key_data != NULL) 2855 free(sav->key_auth->key_data, M_IPSEC_MISC); 2856 free(sav->key_auth, M_IPSEC_MISC); 2857 sav->key_auth = NULL; 2858 } 2859 if (sav->key_enc != NULL) { 2860 if (sav->key_enc->key_data != NULL) 2861 free(sav->key_enc->key_data, M_IPSEC_MISC); 2862 free(sav->key_enc, M_IPSEC_MISC); 2863 sav->key_enc = NULL; 2864 } 2865 if (sav->sched) { 2866 bzero(sav->sched, sav->schedlen); 2867 free(sav->sched, M_IPSEC_MISC); 2868 sav->sched = NULL; 2869 } 2870 if (sav->replay != NULL) { 2871 free(sav->replay, M_IPSEC_MISC); 2872 sav->replay = NULL; 2873 } 2874 if (sav->lft_c != NULL) { 2875 free(sav->lft_c, M_IPSEC_MISC); 2876 sav->lft_c = NULL; 2877 } 2878 if (sav->lft_h != NULL) { 2879 free(sav->lft_h, M_IPSEC_MISC); 2880 sav->lft_h = NULL; 2881 } 2882 if (sav->lft_s != NULL) { 2883 free(sav->lft_s, M_IPSEC_MISC); 2884 sav->lft_s = NULL; 2885 } 2886} 2887 2888/* 2889 * free() SA variable entry. 2890 */ 2891static void 2892key_delsav(sav) 2893 struct secasvar *sav; 2894{ 2895 IPSEC_ASSERT(sav != NULL, ("null sav")); 2896 IPSEC_ASSERT(sav->refcnt == 0, ("reference count %u > 0", sav->refcnt)); 2897 2898 /* remove from SA header */ 2899 if (__LIST_CHAINED(sav)) 2900 LIST_REMOVE(sav, chain); 2901 key_cleansav(sav); 2902 SECASVAR_LOCK_DESTROY(sav); 2903 free(sav, M_IPSEC_SA); 2904} 2905 2906/* 2907 * search SAD. 2908 * OUT: 2909 * NULL : not found 2910 * others : found, pointer to a SA. 2911 */ 2912static struct secashead * 2913key_getsah(saidx) 2914 struct secasindex *saidx; 2915{ 2916 INIT_VNET_IPSEC(curvnet); 2917 struct secashead *sah; 2918 2919 SAHTREE_LOCK(); 2920 LIST_FOREACH(sah, &V_sahtree, chain) { 2921 if (sah->state == SADB_SASTATE_DEAD) 2922 continue; 2923 if (key_cmpsaidx(&sah->saidx, saidx, CMP_REQID)) 2924 break; 2925 } 2926 SAHTREE_UNLOCK(); 2927 2928 return sah; 2929} 2930 2931/* 2932 * check not to be duplicated SPI. 2933 * NOTE: this function is too slow due to searching all SAD. 2934 * OUT: 2935 * NULL : not found 2936 * others : found, pointer to a SA. 2937 */ 2938static struct secasvar * 2939key_checkspidup(saidx, spi) 2940 struct secasindex *saidx; 2941 u_int32_t spi; 2942{ 2943 INIT_VNET_IPSEC(curvnet); 2944 struct secashead *sah; 2945 struct secasvar *sav; 2946 2947 /* check address family */ 2948 if (saidx->src.sa.sa_family != saidx->dst.sa.sa_family) { 2949 ipseclog((LOG_DEBUG, "%s: address family mismatched.\n", 2950 __func__)); 2951 return NULL; 2952 } 2953 2954 sav = NULL; 2955 /* check all SAD */ 2956 SAHTREE_LOCK(); 2957 LIST_FOREACH(sah, &V_sahtree, chain) { 2958 if (!key_ismyaddr((struct sockaddr *)&sah->saidx.dst)) 2959 continue; 2960 sav = key_getsavbyspi(sah, spi); 2961 if (sav != NULL) 2962 break; 2963 } 2964 SAHTREE_UNLOCK(); 2965 2966 return sav; 2967} 2968 2969/* 2970 * search SAD litmited alive SA, protocol, SPI. 2971 * OUT: 2972 * NULL : not found 2973 * others : found, pointer to a SA. 2974 */ 2975static struct secasvar * 2976key_getsavbyspi(sah, spi) 2977 struct secashead *sah; 2978 u_int32_t spi; 2979{ 2980 INIT_VNET_IPSEC(curvnet); 2981 struct secasvar *sav; 2982 u_int stateidx, state; 2983 2984 sav = NULL; 2985 SAHTREE_LOCK_ASSERT(); 2986 /* search all status */ 2987 for (stateidx = 0; 2988 stateidx < _ARRAYLEN(saorder_state_alive); 2989 stateidx++) { 2990 2991 state = saorder_state_alive[stateidx]; 2992 LIST_FOREACH(sav, &sah->savtree[state], chain) { 2993 2994 /* sanity check */ 2995 if (sav->state != state) { 2996 ipseclog((LOG_DEBUG, "%s: " 2997 "invalid sav->state (queue: %d SA: %d)\n", 2998 __func__, state, sav->state)); 2999 continue; 3000 } 3001 3002 if (sav->spi == spi) 3003 return sav; 3004 } 3005 } 3006 3007 return NULL; 3008} 3009 3010/* 3011 * copy SA values from PF_KEY message except *SPI, SEQ, PID, STATE and TYPE*. 3012 * You must update these if need. 3013 * OUT: 0: success. 3014 * !0: failure. 3015 * 3016 * does not modify mbuf. does not free mbuf on error. 3017 */ 3018static int 3019key_setsaval(sav, m, mhp) 3020 struct secasvar *sav; 3021 struct mbuf *m; 3022 const struct sadb_msghdr *mhp; 3023{ 3024 INIT_VNET_IPSEC(curvnet); 3025 int error = 0; 3026 3027 IPSEC_ASSERT(m != NULL, ("null mbuf")); 3028 IPSEC_ASSERT(mhp != NULL, ("null msghdr")); 3029 IPSEC_ASSERT(mhp->msg != NULL, ("null msg")); 3030 3031 /* initialization */ 3032 sav->replay = NULL; 3033 sav->key_auth = NULL; 3034 sav->key_enc = NULL; 3035 sav->sched = NULL; 3036 sav->schedlen = 0; 3037 sav->iv = NULL; 3038 sav->lft_c = NULL; 3039 sav->lft_h = NULL; 3040 sav->lft_s = NULL; 3041 sav->tdb_xform = NULL; /* transform */ 3042 sav->tdb_encalgxform = NULL; /* encoding algorithm */ 3043 sav->tdb_authalgxform = NULL; /* authentication algorithm */ 3044 sav->tdb_compalgxform = NULL; /* compression algorithm */ 3045 3046 /* SA */ 3047 if (mhp->ext[SADB_EXT_SA] != NULL) { 3048 const struct sadb_sa *sa0; 3049 3050 sa0 = (const struct sadb_sa *)mhp->ext[SADB_EXT_SA]; 3051 if (mhp->extlen[SADB_EXT_SA] < sizeof(*sa0)) { 3052 error = EINVAL; 3053 goto fail; 3054 } 3055 3056 sav->alg_auth = sa0->sadb_sa_auth; 3057 sav->alg_enc = sa0->sadb_sa_encrypt; 3058 sav->flags = sa0->sadb_sa_flags; 3059 3060 /* replay window */ 3061 if ((sa0->sadb_sa_flags & SADB_X_EXT_OLD) == 0) { 3062 sav->replay = (struct secreplay *) 3063 malloc(sizeof(struct secreplay)+sa0->sadb_sa_replay, M_IPSEC_MISC, M_NOWAIT|M_ZERO); 3064 if (sav->replay == NULL) { 3065 ipseclog((LOG_DEBUG, "%s: No more memory.\n", 3066 __func__)); 3067 error = ENOBUFS; 3068 goto fail; 3069 } 3070 if (sa0->sadb_sa_replay != 0) 3071 sav->replay->bitmap = (caddr_t)(sav->replay+1); 3072 sav->replay->wsize = sa0->sadb_sa_replay; 3073 } 3074 } 3075 3076 /* Authentication keys */ 3077 if (mhp->ext[SADB_EXT_KEY_AUTH] != NULL) { 3078 const struct sadb_key *key0; 3079 int len; 3080 3081 key0 = (const struct sadb_key *)mhp->ext[SADB_EXT_KEY_AUTH]; 3082 len = mhp->extlen[SADB_EXT_KEY_AUTH]; 3083 3084 error = 0; 3085 if (len < sizeof(*key0)) { 3086 error = EINVAL; 3087 goto fail; 3088 } 3089 switch (mhp->msg->sadb_msg_satype) { 3090 case SADB_SATYPE_AH: 3091 case SADB_SATYPE_ESP: 3092 case SADB_X_SATYPE_TCPSIGNATURE: 3093 if (len == PFKEY_ALIGN8(sizeof(struct sadb_key)) && 3094 sav->alg_auth != SADB_X_AALG_NULL) 3095 error = EINVAL; 3096 break; 3097 case SADB_X_SATYPE_IPCOMP: 3098 default: 3099 error = EINVAL; 3100 break; 3101 } 3102 if (error) { 3103 ipseclog((LOG_DEBUG, "%s: invalid key_auth values.\n", 3104 __func__)); 3105 goto fail; 3106 } 3107 3108 sav->key_auth = (struct seckey *)key_dup_keymsg(key0, len, 3109 M_IPSEC_MISC); 3110 if (sav->key_auth == NULL ) { 3111 ipseclog((LOG_DEBUG, "%s: No more memory.\n", 3112 __func__)); 3113 error = ENOBUFS; 3114 goto fail; 3115 } 3116 } 3117 3118 /* Encryption key */ 3119 if (mhp->ext[SADB_EXT_KEY_ENCRYPT] != NULL) { 3120 const struct sadb_key *key0; 3121 int len; 3122 3123 key0 = (const struct sadb_key *)mhp->ext[SADB_EXT_KEY_ENCRYPT]; 3124 len = mhp->extlen[SADB_EXT_KEY_ENCRYPT]; 3125 3126 error = 0; 3127 if (len < sizeof(*key0)) { 3128 error = EINVAL; 3129 goto fail; 3130 } 3131 switch (mhp->msg->sadb_msg_satype) { 3132 case SADB_SATYPE_ESP: 3133 if (len == PFKEY_ALIGN8(sizeof(struct sadb_key)) && 3134 sav->alg_enc != SADB_EALG_NULL) { 3135 error = EINVAL; 3136 break; 3137 } 3138 sav->key_enc = (struct seckey *)key_dup_keymsg(key0, 3139 len, 3140 M_IPSEC_MISC); 3141 if (sav->key_enc == NULL) { 3142 ipseclog((LOG_DEBUG, "%s: No more memory.\n", 3143 __func__)); 3144 error = ENOBUFS; 3145 goto fail; 3146 } 3147 break; 3148 case SADB_X_SATYPE_IPCOMP: 3149 if (len != PFKEY_ALIGN8(sizeof(struct sadb_key))) 3150 error = EINVAL; 3151 sav->key_enc = NULL; /*just in case*/ 3152 break; 3153 case SADB_SATYPE_AH: 3154 case SADB_X_SATYPE_TCPSIGNATURE: 3155 default: 3156 error = EINVAL; 3157 break; 3158 } 3159 if (error) { 3160 ipseclog((LOG_DEBUG, "%s: invalid key_enc value.\n", 3161 __func__)); 3162 goto fail; 3163 } 3164 } 3165 3166 /* set iv */ 3167 sav->ivlen = 0; 3168 3169 switch (mhp->msg->sadb_msg_satype) { 3170 case SADB_SATYPE_AH: 3171 error = xform_init(sav, XF_AH); 3172 break; 3173 case SADB_SATYPE_ESP: 3174 error = xform_init(sav, XF_ESP); 3175 break; 3176 case SADB_X_SATYPE_IPCOMP: 3177 error = xform_init(sav, XF_IPCOMP); 3178 break; 3179 case SADB_X_SATYPE_TCPSIGNATURE: 3180 error = xform_init(sav, XF_TCPSIGNATURE); 3181 break; 3182 } 3183 if (error) { 3184 ipseclog((LOG_DEBUG, "%s: unable to initialize SA type %u.\n", 3185 __func__, mhp->msg->sadb_msg_satype)); 3186 goto fail; 3187 } 3188 3189 /* reset created */ 3190 sav->created = time_second; 3191 3192 /* make lifetime for CURRENT */ 3193 sav->lft_c = malloc(sizeof(struct seclifetime), M_IPSEC_MISC, M_NOWAIT); 3194 if (sav->lft_c == NULL) { 3195 ipseclog((LOG_DEBUG, "%s: No more memory.\n", __func__)); 3196 error = ENOBUFS; 3197 goto fail; 3198 } 3199 3200 sav->lft_c->allocations = 0; 3201 sav->lft_c->bytes = 0; 3202 sav->lft_c->addtime = time_second; 3203 sav->lft_c->usetime = 0; 3204 3205 /* lifetimes for HARD and SOFT */ 3206 { 3207 const struct sadb_lifetime *lft0; 3208 3209 lft0 = (struct sadb_lifetime *)mhp->ext[SADB_EXT_LIFETIME_HARD]; 3210 if (lft0 != NULL) { 3211 if (mhp->extlen[SADB_EXT_LIFETIME_HARD] < sizeof(*lft0)) { 3212 error = EINVAL; 3213 goto fail; 3214 } 3215 sav->lft_h = key_dup_lifemsg(lft0, M_IPSEC_MISC); 3216 if (sav->lft_h == NULL) { 3217 ipseclog((LOG_DEBUG, "%s: No more memory.\n",__func__)); 3218 error = ENOBUFS; 3219 goto fail; 3220 } 3221 /* to be initialize ? */ 3222 } 3223 3224 lft0 = (struct sadb_lifetime *)mhp->ext[SADB_EXT_LIFETIME_SOFT]; 3225 if (lft0 != NULL) { 3226 if (mhp->extlen[SADB_EXT_LIFETIME_SOFT] < sizeof(*lft0)) { 3227 error = EINVAL; 3228 goto fail; 3229 } 3230 sav->lft_s = key_dup_lifemsg(lft0, M_IPSEC_MISC); 3231 if (sav->lft_s == NULL) { 3232 ipseclog((LOG_DEBUG, "%s: No more memory.\n",__func__)); 3233 error = ENOBUFS; 3234 goto fail; 3235 } 3236 /* to be initialize ? */ 3237 } 3238 } 3239 3240 return 0; 3241 3242 fail: 3243 /* initialization */ 3244 key_cleansav(sav); 3245 3246 return error; 3247} 3248 3249/* 3250 * validation with a secasvar entry, and set SADB_SATYPE_MATURE. 3251 * OUT: 0: valid 3252 * other: errno 3253 */ 3254static int 3255key_mature(struct secasvar *sav) 3256{ 3257 INIT_VNET_IPSEC(curvnet); 3258 int error; 3259 3260 /* check SPI value */ 3261 switch (sav->sah->saidx.proto) { 3262 case IPPROTO_ESP: 3263 case IPPROTO_AH: 3264 /* 3265 * RFC 4302, 2.4. Security Parameters Index (SPI), SPI values 3266 * 1-255 reserved by IANA for future use, 3267 * 0 for implementation specific, local use. 3268 */ 3269 if (ntohl(sav->spi) <= 255) { 3270 ipseclog((LOG_DEBUG, "%s: illegal range of SPI %u.\n", 3271 __func__, (u_int32_t)ntohl(sav->spi))); 3272 return EINVAL; 3273 } 3274 break; 3275 } 3276 3277 /* check satype */ 3278 switch (sav->sah->saidx.proto) { 3279 case IPPROTO_ESP: 3280 /* check flags */ 3281 if ((sav->flags & (SADB_X_EXT_OLD|SADB_X_EXT_DERIV)) == 3282 (SADB_X_EXT_OLD|SADB_X_EXT_DERIV)) { 3283 ipseclog((LOG_DEBUG, "%s: invalid flag (derived) " 3284 "given to old-esp.\n", __func__)); 3285 return EINVAL; 3286 } 3287 error = xform_init(sav, XF_ESP); 3288 break; 3289 case IPPROTO_AH: 3290 /* check flags */ 3291 if (sav->flags & SADB_X_EXT_DERIV) { 3292 ipseclog((LOG_DEBUG, "%s: invalid flag (derived) " 3293 "given to AH SA.\n", __func__)); 3294 return EINVAL; 3295 } 3296 if (sav->alg_enc != SADB_EALG_NONE) { 3297 ipseclog((LOG_DEBUG, "%s: protocol and algorithm " 3298 "mismated.\n", __func__)); 3299 return(EINVAL); 3300 } 3301 error = xform_init(sav, XF_AH); 3302 break; 3303 case IPPROTO_IPCOMP: 3304 if (sav->alg_auth != SADB_AALG_NONE) { 3305 ipseclog((LOG_DEBUG, "%s: protocol and algorithm " 3306 "mismated.\n", __func__)); 3307 return(EINVAL); 3308 } 3309 if ((sav->flags & SADB_X_EXT_RAWCPI) == 0 3310 && ntohl(sav->spi) >= 0x10000) { 3311 ipseclog((LOG_DEBUG, "%s: invalid cpi for IPComp.\n", 3312 __func__)); 3313 return(EINVAL); 3314 } 3315 error = xform_init(sav, XF_IPCOMP); 3316 break; 3317 case IPPROTO_TCP: 3318 if (sav->alg_enc != SADB_EALG_NONE) { 3319 ipseclog((LOG_DEBUG, "%s: protocol and algorithm " 3320 "mismated.\n", __func__)); 3321 return(EINVAL); 3322 } 3323 error = xform_init(sav, XF_TCPSIGNATURE); 3324 break; 3325 default: 3326 ipseclog((LOG_DEBUG, "%s: Invalid satype.\n", __func__)); 3327 error = EPROTONOSUPPORT; 3328 break; 3329 } 3330 if (error == 0) { 3331 SAHTREE_LOCK(); 3332 key_sa_chgstate(sav, SADB_SASTATE_MATURE); 3333 SAHTREE_UNLOCK(); 3334 } 3335 return (error); 3336} 3337 3338/* 3339 * subroutine for SADB_GET and SADB_DUMP. 3340 */ 3341static struct mbuf * 3342key_setdumpsa(sav, type, satype, seq, pid) 3343 struct secasvar *sav; 3344 u_int8_t type, satype; 3345 u_int32_t seq, pid; 3346{ 3347 struct mbuf *result = NULL, *tres = NULL, *m; 3348 int i; 3349 int dumporder[] = { 3350 SADB_EXT_SA, SADB_X_EXT_SA2, 3351 SADB_EXT_LIFETIME_HARD, SADB_EXT_LIFETIME_SOFT, 3352 SADB_EXT_LIFETIME_CURRENT, SADB_EXT_ADDRESS_SRC, 3353 SADB_EXT_ADDRESS_DST, SADB_EXT_ADDRESS_PROXY, SADB_EXT_KEY_AUTH, 3354 SADB_EXT_KEY_ENCRYPT, SADB_EXT_IDENTITY_SRC, 3355 SADB_EXT_IDENTITY_DST, SADB_EXT_SENSITIVITY, 3356 }; 3357 3358 m = key_setsadbmsg(type, 0, satype, seq, pid, sav->refcnt); 3359 if (m == NULL) 3360 goto fail; 3361 result = m; 3362 3363 for (i = sizeof(dumporder)/sizeof(dumporder[0]) - 1; i >= 0; i--) { 3364 m = NULL; 3365 switch (dumporder[i]) { 3366 case SADB_EXT_SA: 3367 m = key_setsadbsa(sav); 3368 if (!m) 3369 goto fail; 3370 break; 3371 3372 case SADB_X_EXT_SA2: 3373 m = key_setsadbxsa2(sav->sah->saidx.mode, 3374 sav->replay ? sav->replay->count : 0, 3375 sav->sah->saidx.reqid); 3376 if (!m) 3377 goto fail; 3378 break; 3379 3380 case SADB_EXT_ADDRESS_SRC: 3381 m = key_setsadbaddr(SADB_EXT_ADDRESS_SRC, 3382 &sav->sah->saidx.src.sa, 3383 FULLMASK, IPSEC_ULPROTO_ANY); 3384 if (!m) 3385 goto fail; 3386 break; 3387 3388 case SADB_EXT_ADDRESS_DST: 3389 m = key_setsadbaddr(SADB_EXT_ADDRESS_DST, 3390 &sav->sah->saidx.dst.sa, 3391 FULLMASK, IPSEC_ULPROTO_ANY); 3392 if (!m) 3393 goto fail; 3394 break; 3395 3396 case SADB_EXT_KEY_AUTH: 3397 if (!sav->key_auth) 3398 continue; 3399 m = key_setkey(sav->key_auth, SADB_EXT_KEY_AUTH); 3400 if (!m) 3401 goto fail; 3402 break; 3403 3404 case SADB_EXT_KEY_ENCRYPT: 3405 if (!sav->key_enc) 3406 continue; 3407 m = key_setkey(sav->key_enc, SADB_EXT_KEY_ENCRYPT); 3408 if (!m) 3409 goto fail; 3410 break; 3411 3412 case SADB_EXT_LIFETIME_CURRENT: 3413 if (!sav->lft_c) 3414 continue; 3415 m = key_setlifetime(sav->lft_c, 3416 SADB_EXT_LIFETIME_CURRENT); 3417 if (!m) 3418 goto fail; 3419 break; 3420 3421 case SADB_EXT_LIFETIME_HARD: 3422 if (!sav->lft_h) 3423 continue; 3424 m = key_setlifetime(sav->lft_h, 3425 SADB_EXT_LIFETIME_HARD); 3426 if (!m) 3427 goto fail; 3428 break; 3429 3430 case SADB_EXT_LIFETIME_SOFT: 3431 if (!sav->lft_s) 3432 continue; 3433 m = key_setlifetime(sav->lft_s, 3434 SADB_EXT_LIFETIME_SOFT); 3435 3436 if (!m) 3437 goto fail; 3438 break; 3439 3440 case SADB_EXT_ADDRESS_PROXY: 3441 case SADB_EXT_IDENTITY_SRC: 3442 case SADB_EXT_IDENTITY_DST: 3443 /* XXX: should we brought from SPD ? */ 3444 case SADB_EXT_SENSITIVITY: 3445 default: 3446 continue; 3447 } 3448 3449 if (!m) 3450 goto fail; 3451 if (tres) 3452 m_cat(m, tres); 3453 tres = m; 3454 3455 } 3456 3457 m_cat(result, tres); 3458 if (result->m_len < sizeof(struct sadb_msg)) { 3459 result = m_pullup(result, sizeof(struct sadb_msg)); 3460 if (result == NULL) 3461 goto fail; 3462 } 3463 3464 result->m_pkthdr.len = 0; 3465 for (m = result; m; m = m->m_next) 3466 result->m_pkthdr.len += m->m_len; 3467 3468 mtod(result, struct sadb_msg *)->sadb_msg_len = 3469 PFKEY_UNIT64(result->m_pkthdr.len); 3470 3471 return result; 3472 3473fail: 3474 m_freem(result); 3475 m_freem(tres); 3476 return NULL; 3477} 3478 3479/* 3480 * set data into sadb_msg. 3481 */ 3482static struct mbuf * 3483key_setsadbmsg(type, tlen, satype, seq, pid, reserved) 3484 u_int8_t type, satype; 3485 u_int16_t tlen; 3486 u_int32_t seq; 3487 pid_t pid; 3488 u_int16_t reserved; 3489{ 3490 struct mbuf *m; 3491 struct sadb_msg *p; 3492 int len; 3493 3494 len = PFKEY_ALIGN8(sizeof(struct sadb_msg)); 3495 if (len > MCLBYTES) 3496 return NULL; 3497 MGETHDR(m, M_DONTWAIT, MT_DATA); 3498 if (m && len > MHLEN) { 3499 MCLGET(m, M_DONTWAIT); 3500 if ((m->m_flags & M_EXT) == 0) { 3501 m_freem(m); 3502 m = NULL; 3503 } 3504 } 3505 if (!m) 3506 return NULL; 3507 m->m_pkthdr.len = m->m_len = len; 3508 m->m_next = NULL; 3509 3510 p = mtod(m, struct sadb_msg *); 3511 3512 bzero(p, len); 3513 p->sadb_msg_version = PF_KEY_V2; 3514 p->sadb_msg_type = type; 3515 p->sadb_msg_errno = 0; 3516 p->sadb_msg_satype = satype; 3517 p->sadb_msg_len = PFKEY_UNIT64(tlen); 3518 p->sadb_msg_reserved = reserved; 3519 p->sadb_msg_seq = seq; 3520 p->sadb_msg_pid = (u_int32_t)pid; 3521 3522 return m; 3523} 3524 3525/* 3526 * copy secasvar data into sadb_address. 3527 */ 3528static struct mbuf * 3529key_setsadbsa(sav) 3530 struct secasvar *sav; 3531{ 3532 struct mbuf *m; 3533 struct sadb_sa *p; 3534 int len; 3535 3536 len = PFKEY_ALIGN8(sizeof(struct sadb_sa)); 3537 m = key_alloc_mbuf(len); 3538 if (!m || m->m_next) { /*XXX*/ 3539 if (m) 3540 m_freem(m); 3541 return NULL; 3542 } 3543 3544 p = mtod(m, struct sadb_sa *); 3545 3546 bzero(p, len); 3547 p->sadb_sa_len = PFKEY_UNIT64(len); 3548 p->sadb_sa_exttype = SADB_EXT_SA; 3549 p->sadb_sa_spi = sav->spi; 3550 p->sadb_sa_replay = (sav->replay != NULL ? sav->replay->wsize : 0); 3551 p->sadb_sa_state = sav->state; 3552 p->sadb_sa_auth = sav->alg_auth; 3553 p->sadb_sa_encrypt = sav->alg_enc; 3554 p->sadb_sa_flags = sav->flags; 3555 3556 return m; 3557} 3558 3559/* 3560 * set data into sadb_address. 3561 */ 3562static struct mbuf * 3563key_setsadbaddr(exttype, saddr, prefixlen, ul_proto) 3564 u_int16_t exttype; 3565 const struct sockaddr *saddr; 3566 u_int8_t prefixlen; 3567 u_int16_t ul_proto; 3568{ 3569 struct mbuf *m; 3570 struct sadb_address *p; 3571 size_t len; 3572 3573 len = PFKEY_ALIGN8(sizeof(struct sadb_address)) + 3574 PFKEY_ALIGN8(saddr->sa_len); 3575 m = key_alloc_mbuf(len); 3576 if (!m || m->m_next) { /*XXX*/ 3577 if (m) 3578 m_freem(m); 3579 return NULL; 3580 } 3581 3582 p = mtod(m, struct sadb_address *); 3583 3584 bzero(p, len); 3585 p->sadb_address_len = PFKEY_UNIT64(len); 3586 p->sadb_address_exttype = exttype; 3587 p->sadb_address_proto = ul_proto; 3588 if (prefixlen == FULLMASK) { 3589 switch (saddr->sa_family) { 3590 case AF_INET: 3591 prefixlen = sizeof(struct in_addr) << 3; 3592 break; 3593 case AF_INET6: 3594 prefixlen = sizeof(struct in6_addr) << 3; 3595 break; 3596 default: 3597 ; /*XXX*/ 3598 } 3599 } 3600 p->sadb_address_prefixlen = prefixlen; 3601 p->sadb_address_reserved = 0; 3602 3603 bcopy(saddr, 3604 mtod(m, caddr_t) + PFKEY_ALIGN8(sizeof(struct sadb_address)), 3605 saddr->sa_len); 3606 3607 return m; 3608} 3609 3610/* 3611 * set data into sadb_x_sa2. 3612 */ 3613static struct mbuf * 3614key_setsadbxsa2(mode, seq, reqid) 3615 u_int8_t mode; 3616 u_int32_t seq, reqid; 3617{ 3618 struct mbuf *m; 3619 struct sadb_x_sa2 *p; 3620 size_t len; 3621 3622 len = PFKEY_ALIGN8(sizeof(struct sadb_x_sa2)); 3623 m = key_alloc_mbuf(len); 3624 if (!m || m->m_next) { /*XXX*/ 3625 if (m) 3626 m_freem(m); 3627 return NULL; 3628 } 3629 3630 p = mtod(m, struct sadb_x_sa2 *); 3631 3632 bzero(p, len); 3633 p->sadb_x_sa2_len = PFKEY_UNIT64(len); 3634 p->sadb_x_sa2_exttype = SADB_X_EXT_SA2; 3635 p->sadb_x_sa2_mode = mode; 3636 p->sadb_x_sa2_reserved1 = 0; 3637 p->sadb_x_sa2_reserved2 = 0; 3638 p->sadb_x_sa2_sequence = seq; 3639 p->sadb_x_sa2_reqid = reqid; 3640 3641 return m; 3642} 3643 3644/* 3645 * set data into sadb_x_policy 3646 */ 3647static struct mbuf * 3648key_setsadbxpolicy(type, dir, id) 3649 u_int16_t type; 3650 u_int8_t dir; 3651 u_int32_t id; 3652{ 3653 struct mbuf *m; 3654 struct sadb_x_policy *p; 3655 size_t len; 3656 3657 len = PFKEY_ALIGN8(sizeof(struct sadb_x_policy)); 3658 m = key_alloc_mbuf(len); 3659 if (!m || m->m_next) { /*XXX*/ 3660 if (m) 3661 m_freem(m); 3662 return NULL; 3663 } 3664 3665 p = mtod(m, struct sadb_x_policy *); 3666 3667 bzero(p, len); 3668 p->sadb_x_policy_len = PFKEY_UNIT64(len); 3669 p->sadb_x_policy_exttype = SADB_X_EXT_POLICY; 3670 p->sadb_x_policy_type = type; 3671 p->sadb_x_policy_dir = dir; 3672 p->sadb_x_policy_id = id; 3673 3674 return m; 3675} 3676 3677/* %%% utilities */ 3678/* Take a key message (sadb_key) from the socket and turn it into one 3679 * of the kernel's key structures (seckey). 3680 * 3681 * IN: pointer to the src 3682 * OUT: NULL no more memory 3683 */ 3684struct seckey * 3685key_dup_keymsg(const struct sadb_key *src, u_int len, 3686 struct malloc_type *type) 3687{ 3688 INIT_VNET_IPSEC(curvnet); 3689 struct seckey *dst; 3690 dst = (struct seckey *)malloc(sizeof(struct seckey), type, M_NOWAIT); 3691 if (dst != NULL) { 3692 dst->bits = src->sadb_key_bits; 3693 dst->key_data = (char *)malloc(len, type, M_NOWAIT); 3694 if (dst->key_data != NULL) { 3695 bcopy((const char *)src + sizeof(struct sadb_key), 3696 dst->key_data, len); 3697 } else { 3698 ipseclog((LOG_DEBUG, "%s: No more memory.\n", 3699 __func__)); 3700 free(dst, type); 3701 dst = NULL; 3702 } 3703 } else { 3704 ipseclog((LOG_DEBUG, "%s: No more memory.\n", 3705 __func__)); 3706 3707 } 3708 return dst; 3709} 3710 3711/* Take a lifetime message (sadb_lifetime) passed in on a socket and 3712 * turn it into one of the kernel's lifetime structures (seclifetime). 3713 * 3714 * IN: pointer to the destination, source and malloc type 3715 * OUT: NULL, no more memory 3716 */ 3717 3718static struct seclifetime * 3719key_dup_lifemsg(const struct sadb_lifetime *src, 3720 struct malloc_type *type) 3721{ 3722 INIT_VNET_IPSEC(curvnet); 3723 struct seclifetime *dst = NULL; 3724 3725 dst = (struct seclifetime *)malloc(sizeof(struct seclifetime), 3726 type, M_NOWAIT); 3727 if (dst == NULL) { 3728 /* XXX counter */ 3729 ipseclog((LOG_DEBUG, "%s: No more memory.\n", __func__)); 3730 } else { 3731 dst->allocations = src->sadb_lifetime_allocations; 3732 dst->bytes = src->sadb_lifetime_bytes; 3733 dst->addtime = src->sadb_lifetime_addtime; 3734 dst->usetime = src->sadb_lifetime_usetime; 3735 } 3736 return dst; 3737} 3738 3739/* compare my own address 3740 * OUT: 1: true, i.e. my address. 3741 * 0: false 3742 */ 3743int 3744key_ismyaddr(sa) 3745 struct sockaddr *sa; 3746{ 3747#ifdef INET 3748 INIT_VNET_INET(curvnet); 3749 struct sockaddr_in *sin; 3750 struct in_ifaddr *ia; 3751#endif 3752 3753 IPSEC_ASSERT(sa != NULL, ("null sockaddr")); 3754 3755 switch (sa->sa_family) { 3756#ifdef INET 3757 case AF_INET: 3758 sin = (struct sockaddr_in *)sa; 3759 for (ia = V_in_ifaddrhead.tqh_first; ia; 3760 ia = ia->ia_link.tqe_next) 3761 { 3762 if (sin->sin_family == ia->ia_addr.sin_family && 3763 sin->sin_len == ia->ia_addr.sin_len && 3764 sin->sin_addr.s_addr == ia->ia_addr.sin_addr.s_addr) 3765 { 3766 return 1; 3767 } 3768 } 3769 break; 3770#endif 3771#ifdef INET6 3772 case AF_INET6: 3773 return key_ismyaddr6((struct sockaddr_in6 *)sa); 3774#endif 3775 } 3776 3777 return 0; 3778} 3779 3780#ifdef INET6 3781/* 3782 * compare my own address for IPv6. 3783 * 1: ours 3784 * 0: other 3785 * NOTE: derived ip6_input() in KAME. This is necessary to modify more. 3786 */ 3787#include <netinet6/in6_var.h> 3788 3789static int 3790key_ismyaddr6(sin6) 3791 struct sockaddr_in6 *sin6; 3792{ 3793 INIT_VNET_INET6(curvnet); 3794 struct in6_ifaddr *ia; 3795 struct in6_multi *in6m; 3796 3797 for (ia = V_in6_ifaddr; ia; ia = ia->ia_next) { 3798 if (key_sockaddrcmp((struct sockaddr *)&sin6, 3799 (struct sockaddr *)&ia->ia_addr, 0) == 0) 3800 return 1; 3801 3802 /* 3803 * XXX Multicast 3804 * XXX why do we care about multlicast here while we don't care 3805 * about IPv4 multicast?? 3806 * XXX scope 3807 */ 3808 in6m = NULL; 3809 IN6_LOOKUP_MULTI(sin6->sin6_addr, ia->ia_ifp, in6m); 3810 if (in6m) 3811 return 1; 3812 } 3813 3814 /* loopback, just for safety */ 3815 if (IN6_IS_ADDR_LOOPBACK(&sin6->sin6_addr)) 3816 return 1; 3817 3818 return 0; 3819} 3820#endif /*INET6*/ 3821 3822/* 3823 * compare two secasindex structure. 3824 * flag can specify to compare 2 saidxes. 3825 * compare two secasindex structure without both mode and reqid. 3826 * don't compare port. 3827 * IN: 3828 * saidx0: source, it can be in SAD. 3829 * saidx1: object. 3830 * OUT: 3831 * 1 : equal 3832 * 0 : not equal 3833 */ 3834static int 3835key_cmpsaidx( 3836 const struct secasindex *saidx0, 3837 const struct secasindex *saidx1, 3838 int flag) 3839{ 3840 /* sanity */ 3841 if (saidx0 == NULL && saidx1 == NULL) 3842 return 1; 3843 3844 if (saidx0 == NULL || saidx1 == NULL) 3845 return 0; 3846 3847 if (saidx0->proto != saidx1->proto) 3848 return 0; 3849 3850 if (flag == CMP_EXACTLY) { 3851 if (saidx0->mode != saidx1->mode) 3852 return 0; 3853 if (saidx0->reqid != saidx1->reqid) 3854 return 0; 3855 if (bcmp(&saidx0->src, &saidx1->src, saidx0->src.sa.sa_len) != 0 || 3856 bcmp(&saidx0->dst, &saidx1->dst, saidx0->dst.sa.sa_len) != 0) 3857 return 0; 3858 } else { 3859 3860 /* CMP_MODE_REQID, CMP_REQID, CMP_HEAD */ 3861 if (flag == CMP_MODE_REQID 3862 ||flag == CMP_REQID) { 3863 /* 3864 * If reqid of SPD is non-zero, unique SA is required. 3865 * The result must be of same reqid in this case. 3866 */ 3867 if (saidx1->reqid != 0 && saidx0->reqid != saidx1->reqid) 3868 return 0; 3869 } 3870 3871 if (flag == CMP_MODE_REQID) { 3872 if (saidx0->mode != IPSEC_MODE_ANY 3873 && saidx0->mode != saidx1->mode) 3874 return 0; 3875 } 3876 3877 if (key_sockaddrcmp(&saidx0->src.sa, &saidx1->src.sa, 0) != 0) { 3878 return 0; 3879 } 3880 if (key_sockaddrcmp(&saidx0->dst.sa, &saidx1->dst.sa, 0) != 0) { 3881 return 0; 3882 } 3883 } 3884 3885 return 1; 3886} 3887 3888/* 3889 * compare two secindex structure exactly. 3890 * IN: 3891 * spidx0: source, it is often in SPD. 3892 * spidx1: object, it is often from PFKEY message. 3893 * OUT: 3894 * 1 : equal 3895 * 0 : not equal 3896 */ 3897static int 3898key_cmpspidx_exactly( 3899 struct secpolicyindex *spidx0, 3900 struct secpolicyindex *spidx1) 3901{ 3902 /* sanity */ 3903 if (spidx0 == NULL && spidx1 == NULL) 3904 return 1; 3905 3906 if (spidx0 == NULL || spidx1 == NULL) 3907 return 0; 3908 3909 if (spidx0->prefs != spidx1->prefs 3910 || spidx0->prefd != spidx1->prefd 3911 || spidx0->ul_proto != spidx1->ul_proto) 3912 return 0; 3913 3914 return key_sockaddrcmp(&spidx0->src.sa, &spidx1->src.sa, 1) == 0 && 3915 key_sockaddrcmp(&spidx0->dst.sa, &spidx1->dst.sa, 1) == 0; 3916} 3917 3918/* 3919 * compare two secindex structure with mask. 3920 * IN: 3921 * spidx0: source, it is often in SPD. 3922 * spidx1: object, it is often from IP header. 3923 * OUT: 3924 * 1 : equal 3925 * 0 : not equal 3926 */ 3927static int 3928key_cmpspidx_withmask( 3929 struct secpolicyindex *spidx0, 3930 struct secpolicyindex *spidx1) 3931{ 3932 /* sanity */ 3933 if (spidx0 == NULL && spidx1 == NULL) 3934 return 1; 3935 3936 if (spidx0 == NULL || spidx1 == NULL) 3937 return 0; 3938 3939 if (spidx0->src.sa.sa_family != spidx1->src.sa.sa_family || 3940 spidx0->dst.sa.sa_family != spidx1->dst.sa.sa_family || 3941 spidx0->src.sa.sa_len != spidx1->src.sa.sa_len || 3942 spidx0->dst.sa.sa_len != spidx1->dst.sa.sa_len) 3943 return 0; 3944 3945 /* if spidx.ul_proto == IPSEC_ULPROTO_ANY, ignore. */ 3946 if (spidx0->ul_proto != (u_int16_t)IPSEC_ULPROTO_ANY 3947 && spidx0->ul_proto != spidx1->ul_proto) 3948 return 0; 3949 3950 switch (spidx0->src.sa.sa_family) { 3951 case AF_INET: 3952 if (spidx0->src.sin.sin_port != IPSEC_PORT_ANY 3953 && spidx0->src.sin.sin_port != spidx1->src.sin.sin_port) 3954 return 0; 3955 if (!key_bbcmp(&spidx0->src.sin.sin_addr, 3956 &spidx1->src.sin.sin_addr, spidx0->prefs)) 3957 return 0; 3958 break; 3959 case AF_INET6: 3960 if (spidx0->src.sin6.sin6_port != IPSEC_PORT_ANY 3961 && spidx0->src.sin6.sin6_port != spidx1->src.sin6.sin6_port) 3962 return 0; 3963 /* 3964 * scope_id check. if sin6_scope_id is 0, we regard it 3965 * as a wildcard scope, which matches any scope zone ID. 3966 */ 3967 if (spidx0->src.sin6.sin6_scope_id && 3968 spidx1->src.sin6.sin6_scope_id && 3969 spidx0->src.sin6.sin6_scope_id != spidx1->src.sin6.sin6_scope_id) 3970 return 0; 3971 if (!key_bbcmp(&spidx0->src.sin6.sin6_addr, 3972 &spidx1->src.sin6.sin6_addr, spidx0->prefs)) 3973 return 0; 3974 break; 3975 default: 3976 /* XXX */ 3977 if (bcmp(&spidx0->src, &spidx1->src, spidx0->src.sa.sa_len) != 0) 3978 return 0; 3979 break; 3980 } 3981 3982 switch (spidx0->dst.sa.sa_family) { 3983 case AF_INET: 3984 if (spidx0->dst.sin.sin_port != IPSEC_PORT_ANY 3985 && spidx0->dst.sin.sin_port != spidx1->dst.sin.sin_port) 3986 return 0; 3987 if (!key_bbcmp(&spidx0->dst.sin.sin_addr, 3988 &spidx1->dst.sin.sin_addr, spidx0->prefd)) 3989 return 0; 3990 break; 3991 case AF_INET6: 3992 if (spidx0->dst.sin6.sin6_port != IPSEC_PORT_ANY 3993 && spidx0->dst.sin6.sin6_port != spidx1->dst.sin6.sin6_port) 3994 return 0; 3995 /* 3996 * scope_id check. if sin6_scope_id is 0, we regard it 3997 * as a wildcard scope, which matches any scope zone ID. 3998 */ 3999 if (spidx0->dst.sin6.sin6_scope_id && 4000 spidx1->dst.sin6.sin6_scope_id && 4001 spidx0->dst.sin6.sin6_scope_id != spidx1->dst.sin6.sin6_scope_id) 4002 return 0; 4003 if (!key_bbcmp(&spidx0->dst.sin6.sin6_addr, 4004 &spidx1->dst.sin6.sin6_addr, spidx0->prefd)) 4005 return 0; 4006 break; 4007 default: 4008 /* XXX */ 4009 if (bcmp(&spidx0->dst, &spidx1->dst, spidx0->dst.sa.sa_len) != 0) 4010 return 0; 4011 break; 4012 } 4013 4014 /* XXX Do we check other field ? e.g. flowinfo */ 4015 4016 return 1; 4017} 4018 4019/* returns 0 on match */ 4020static int 4021key_sockaddrcmp( 4022 const struct sockaddr *sa1, 4023 const struct sockaddr *sa2, 4024 int port) 4025{ 4026#ifdef satosin 4027#undef satosin 4028#endif 4029#define satosin(s) ((const struct sockaddr_in *)s) 4030#ifdef satosin6 4031#undef satosin6 4032#endif 4033#define satosin6(s) ((const struct sockaddr_in6 *)s) 4034 if (sa1->sa_family != sa2->sa_family || sa1->sa_len != sa2->sa_len) 4035 return 1; 4036 4037 switch (sa1->sa_family) { 4038 case AF_INET: 4039 if (sa1->sa_len != sizeof(struct sockaddr_in)) 4040 return 1; 4041 if (satosin(sa1)->sin_addr.s_addr != 4042 satosin(sa2)->sin_addr.s_addr) { 4043 return 1; 4044 } 4045 if (port && satosin(sa1)->sin_port != satosin(sa2)->sin_port) 4046 return 1; 4047 break; 4048 case AF_INET6: 4049 if (sa1->sa_len != sizeof(struct sockaddr_in6)) 4050 return 1; /*EINVAL*/ 4051 if (satosin6(sa1)->sin6_scope_id != 4052 satosin6(sa2)->sin6_scope_id) { 4053 return 1; 4054 } 4055 if (!IN6_ARE_ADDR_EQUAL(&satosin6(sa1)->sin6_addr, 4056 &satosin6(sa2)->sin6_addr)) { 4057 return 1; 4058 } 4059 if (port && 4060 satosin6(sa1)->sin6_port != satosin6(sa2)->sin6_port) { 4061 return 1; 4062 } 4063 break; 4064 default: 4065 if (bcmp(sa1, sa2, sa1->sa_len) != 0) 4066 return 1; 4067 break; 4068 } 4069 4070 return 0; 4071#undef satosin 4072#undef satosin6 4073} 4074 4075/* 4076 * compare two buffers with mask. 4077 * IN: 4078 * addr1: source 4079 * addr2: object 4080 * bits: Number of bits to compare 4081 * OUT: 4082 * 1 : equal 4083 * 0 : not equal 4084 */ 4085static int 4086key_bbcmp(const void *a1, const void *a2, u_int bits) 4087{ 4088 const unsigned char *p1 = a1; 4089 const unsigned char *p2 = a2; 4090 4091 /* XXX: This could be considerably faster if we compare a word 4092 * at a time, but it is complicated on LSB Endian machines */ 4093 4094 /* Handle null pointers */ 4095 if (p1 == NULL || p2 == NULL) 4096 return (p1 == p2); 4097 4098 while (bits >= 8) { 4099 if (*p1++ != *p2++) 4100 return 0; 4101 bits -= 8; 4102 } 4103 4104 if (bits > 0) { 4105 u_int8_t mask = ~((1<<(8-bits))-1); 4106 if ((*p1 & mask) != (*p2 & mask)) 4107 return 0; 4108 } 4109 return 1; /* Match! */ 4110} 4111 4112static void 4113key_flush_spd(time_t now) 4114{ 4115 INIT_VNET_IPSEC(curvnet); 4116 static u_int16_t sptree_scangen = 0; 4117 u_int16_t gen = sptree_scangen++; 4118 struct secpolicy *sp; 4119 u_int dir; 4120 4121 /* SPD */ 4122 for (dir = 0; dir < IPSEC_DIR_MAX; dir++) { 4123restart: 4124 SPTREE_LOCK(); 4125 LIST_FOREACH(sp, &V_sptree[dir], chain) { 4126 if (sp->scangen == gen) /* previously handled */ 4127 continue; 4128 sp->scangen = gen; 4129 if (sp->state == IPSEC_SPSTATE_DEAD) { 4130 /* NB: clean entries created by key_spdflush */ 4131 SPTREE_UNLOCK(); 4132 KEY_FREESP(&sp); 4133 goto restart; 4134 } 4135 if (sp->lifetime == 0 && sp->validtime == 0) 4136 continue; 4137 if ((sp->lifetime && now - sp->created > sp->lifetime) 4138 || (sp->validtime && now - sp->lastused > sp->validtime)) { 4139 sp->state = IPSEC_SPSTATE_DEAD; 4140 SPTREE_UNLOCK(); 4141 key_spdexpire(sp); 4142 KEY_FREESP(&sp); 4143 goto restart; 4144 } 4145 } 4146 SPTREE_UNLOCK(); 4147 } 4148} 4149 4150static void 4151key_flush_sad(time_t now) 4152{ 4153 INIT_VNET_IPSEC(curvnet); 4154 struct secashead *sah, *nextsah; 4155 struct secasvar *sav, *nextsav; 4156 4157 /* SAD */ 4158 SAHTREE_LOCK(); 4159 LIST_FOREACH_SAFE(sah, &V_sahtree, chain, nextsah) { 4160 /* if sah has been dead, then delete it and process next sah. */ 4161 if (sah->state == SADB_SASTATE_DEAD) { 4162 key_delsah(sah); 4163 continue; 4164 } 4165 4166 /* if LARVAL entry doesn't become MATURE, delete it. */ 4167 LIST_FOREACH_SAFE(sav, &sah->savtree[SADB_SASTATE_LARVAL], chain, nextsav) { 4168 if (now - sav->created > V_key_larval_lifetime) 4169 KEY_FREESAV(&sav); 4170 } 4171 4172 /* 4173 * check MATURE entry to start to send expire message 4174 * whether or not. 4175 */ 4176 LIST_FOREACH_SAFE(sav, &sah->savtree[SADB_SASTATE_MATURE], chain, nextsav) { 4177 /* we don't need to check. */ 4178 if (sav->lft_s == NULL) 4179 continue; 4180 4181 /* sanity check */ 4182 if (sav->lft_c == NULL) { 4183 ipseclog((LOG_DEBUG,"%s: there is no CURRENT " 4184 "time, why?\n", __func__)); 4185 continue; 4186 } 4187 4188 /* check SOFT lifetime */ 4189 if (sav->lft_s->addtime != 0 && 4190 now - sav->created > sav->lft_s->addtime) { 4191 /* 4192 * check SA to be used whether or not. 4193 * when SA hasn't been used, delete it. 4194 */ 4195 if (sav->lft_c->usetime == 0) { 4196 key_sa_chgstate(sav, SADB_SASTATE_DEAD); 4197 KEY_FREESAV(&sav); 4198 } else { 4199 key_sa_chgstate(sav, SADB_SASTATE_DYING); 4200 /* 4201 * XXX If we keep to send expire 4202 * message in the status of 4203 * DYING. Do remove below code. 4204 */ 4205 key_expire(sav); 4206 } 4207 } 4208 /* check SOFT lifetime by bytes */ 4209 /* 4210 * XXX I don't know the way to delete this SA 4211 * when new SA is installed. Caution when it's 4212 * installed too big lifetime by time. 4213 */ 4214 else if (sav->lft_s->bytes != 0 && 4215 sav->lft_s->bytes < sav->lft_c->bytes) { 4216 4217 key_sa_chgstate(sav, SADB_SASTATE_DYING); 4218 /* 4219 * XXX If we keep to send expire 4220 * message in the status of 4221 * DYING. Do remove below code. 4222 */ 4223 key_expire(sav); 4224 } 4225 } 4226 4227 /* check DYING entry to change status to DEAD. */ 4228 LIST_FOREACH_SAFE(sav, &sah->savtree[SADB_SASTATE_DYING], chain, nextsav) { 4229 /* we don't need to check. */ 4230 if (sav->lft_h == NULL) 4231 continue; 4232 4233 /* sanity check */ 4234 if (sav->lft_c == NULL) { 4235 ipseclog((LOG_DEBUG, "%s: there is no CURRENT " 4236 "time, why?\n", __func__)); 4237 continue; 4238 } 4239 4240 if (sav->lft_h->addtime != 0 && 4241 now - sav->created > sav->lft_h->addtime) { 4242 key_sa_chgstate(sav, SADB_SASTATE_DEAD); 4243 KEY_FREESAV(&sav); 4244 } 4245#if 0 /* XXX Should we keep to send expire message until HARD lifetime ? */ 4246 else if (sav->lft_s != NULL 4247 && sav->lft_s->addtime != 0 4248 && now - sav->created > sav->lft_s->addtime) { 4249 /* 4250 * XXX: should be checked to be 4251 * installed the valid SA. 4252 */ 4253 4254 /* 4255 * If there is no SA then sending 4256 * expire message. 4257 */ 4258 key_expire(sav); 4259 } 4260#endif 4261 /* check HARD lifetime by bytes */ 4262 else if (sav->lft_h->bytes != 0 && 4263 sav->lft_h->bytes < sav->lft_c->bytes) { 4264 key_sa_chgstate(sav, SADB_SASTATE_DEAD); 4265 KEY_FREESAV(&sav); 4266 } 4267 } 4268 4269 /* delete entry in DEAD */ 4270 LIST_FOREACH_SAFE(sav, &sah->savtree[SADB_SASTATE_DEAD], chain, nextsav) { 4271 /* sanity check */ 4272 if (sav->state != SADB_SASTATE_DEAD) { 4273 ipseclog((LOG_DEBUG, "%s: invalid sav->state " 4274 "(queue: %d SA: %d): kill it anyway\n", 4275 __func__, 4276 SADB_SASTATE_DEAD, sav->state)); 4277 } 4278 /* 4279 * do not call key_freesav() here. 4280 * sav should already be freed, and sav->refcnt 4281 * shows other references to sav 4282 * (such as from SPD). 4283 */ 4284 } 4285 } 4286 SAHTREE_UNLOCK(); 4287} 4288 4289static void 4290key_flush_acq(time_t now) 4291{ 4292 INIT_VNET_IPSEC(curvnet); 4293 struct secacq *acq, *nextacq; 4294 4295 /* ACQ tree */ 4296 ACQ_LOCK(); 4297 for (acq = LIST_FIRST(&V_acqtree); acq != NULL; acq = nextacq) { 4298 nextacq = LIST_NEXT(acq, chain); 4299 if (now - acq->created > V_key_blockacq_lifetime 4300 && __LIST_CHAINED(acq)) { 4301 LIST_REMOVE(acq, chain); 4302 free(acq, M_IPSEC_SAQ); 4303 } 4304 } 4305 ACQ_UNLOCK(); 4306} 4307 4308static void 4309key_flush_spacq(time_t now) 4310{ 4311 INIT_VNET_IPSEC(curvnet); 4312 struct secspacq *acq, *nextacq; 4313 4314 /* SP ACQ tree */ 4315 SPACQ_LOCK(); 4316 for (acq = LIST_FIRST(&V_spacqtree); acq != NULL; acq = nextacq) { 4317 nextacq = LIST_NEXT(acq, chain); 4318 if (now - acq->created > V_key_blockacq_lifetime 4319 && __LIST_CHAINED(acq)) { 4320 LIST_REMOVE(acq, chain); 4321 free(acq, M_IPSEC_SAQ); 4322 } 4323 } 4324 SPACQ_UNLOCK(); 4325} 4326 4327/* 4328 * time handler. 4329 * scanning SPD and SAD to check status for each entries, 4330 * and do to remove or to expire. 4331 * XXX: year 2038 problem may remain. 4332 */ 4333void 4334key_timehandler(void) 4335{ 4336 VNET_ITERATOR_DECL(vnet_iter); 4337 time_t now = time_second; 4338 4339 VNET_LIST_RLOCK(); 4340 VNET_FOREACH(vnet_iter) { 4341 CURVNET_SET(vnet_iter); 4342 key_flush_spd(now); 4343 key_flush_sad(now); 4344 key_flush_acq(now); 4345 key_flush_spacq(now); 4346 CURVNET_RESTORE(); 4347 } 4348 VNET_LIST_RUNLOCK(); 4349 4350#ifndef IPSEC_DEBUG2 4351 /* do exchange to tick time !! */ 4352 (void)timeout((void *)key_timehandler, (void *)0, hz); 4353#endif /* IPSEC_DEBUG2 */ 4354} 4355 4356u_long 4357key_random() 4358{ 4359 u_long value; 4360 4361 key_randomfill(&value, sizeof(value)); 4362 return value; 4363} 4364 4365void 4366key_randomfill(p, l) 4367 void *p; 4368 size_t l; 4369{ 4370 size_t n; 4371 u_long v; 4372 static int warn = 1; 4373 4374 n = 0; 4375 n = (size_t)read_random(p, (u_int)l); 4376 /* last resort */ 4377 while (n < l) { 4378 v = random(); 4379 bcopy(&v, (u_int8_t *)p + n, 4380 l - n < sizeof(v) ? l - n : sizeof(v)); 4381 n += sizeof(v); 4382 4383 if (warn) { 4384 printf("WARNING: pseudo-random number generator " 4385 "used for IPsec processing\n"); 4386 warn = 0; 4387 } 4388 } 4389} 4390 4391/* 4392 * map SADB_SATYPE_* to IPPROTO_*. 4393 * if satype == SADB_SATYPE then satype is mapped to ~0. 4394 * OUT: 4395 * 0: invalid satype. 4396 */ 4397static u_int16_t 4398key_satype2proto(satype) 4399 u_int8_t satype; 4400{ 4401 switch (satype) { 4402 case SADB_SATYPE_UNSPEC: 4403 return IPSEC_PROTO_ANY; 4404 case SADB_SATYPE_AH: 4405 return IPPROTO_AH; 4406 case SADB_SATYPE_ESP: 4407 return IPPROTO_ESP; 4408 case SADB_X_SATYPE_IPCOMP: 4409 return IPPROTO_IPCOMP; 4410 case SADB_X_SATYPE_TCPSIGNATURE: 4411 return IPPROTO_TCP; 4412 default: 4413 return 0; 4414 } 4415 /* NOTREACHED */ 4416} 4417 4418/* 4419 * map IPPROTO_* to SADB_SATYPE_* 4420 * OUT: 4421 * 0: invalid protocol type. 4422 */ 4423static u_int8_t 4424key_proto2satype(proto) 4425 u_int16_t proto; 4426{ 4427 switch (proto) { 4428 case IPPROTO_AH: 4429 return SADB_SATYPE_AH; 4430 case IPPROTO_ESP: 4431 return SADB_SATYPE_ESP; 4432 case IPPROTO_IPCOMP: 4433 return SADB_X_SATYPE_IPCOMP; 4434 case IPPROTO_TCP: 4435 return SADB_X_SATYPE_TCPSIGNATURE; 4436 default: 4437 return 0; 4438 } 4439 /* NOTREACHED */ 4440} 4441 4442/* %%% PF_KEY */ 4443/* 4444 * SADB_GETSPI processing is to receive 4445 * <base, (SA2), src address, dst address, (SPI range)> 4446 * from the IKMPd, to assign a unique spi value, to hang on the INBOUND 4447 * tree with the status of LARVAL, and send 4448 * <base, SA(*), address(SD)> 4449 * to the IKMPd. 4450 * 4451 * IN: mhp: pointer to the pointer to each header. 4452 * OUT: NULL if fail. 4453 * other if success, return pointer to the message to send. 4454 */ 4455static int 4456key_getspi(so, m, mhp) 4457 struct socket *so; 4458 struct mbuf *m; 4459 const struct sadb_msghdr *mhp; 4460{ 4461 INIT_VNET_IPSEC(curvnet); 4462 struct sadb_address *src0, *dst0; 4463 struct secasindex saidx; 4464 struct secashead *newsah; 4465 struct secasvar *newsav; 4466 u_int8_t proto; 4467 u_int32_t spi; 4468 u_int8_t mode; 4469 u_int32_t reqid; 4470 int error; 4471 4472 IPSEC_ASSERT(so != NULL, ("null socket")); 4473 IPSEC_ASSERT(m != NULL, ("null mbuf")); 4474 IPSEC_ASSERT(mhp != NULL, ("null msghdr")); 4475 IPSEC_ASSERT(mhp->msg != NULL, ("null msg")); 4476 4477 if (mhp->ext[SADB_EXT_ADDRESS_SRC] == NULL || 4478 mhp->ext[SADB_EXT_ADDRESS_DST] == NULL) { 4479 ipseclog((LOG_DEBUG, "%s: invalid message is passed.\n", 4480 __func__)); 4481 return key_senderror(so, m, EINVAL); 4482 } 4483 if (mhp->extlen[SADB_EXT_ADDRESS_SRC] < sizeof(struct sadb_address) || 4484 mhp->extlen[SADB_EXT_ADDRESS_DST] < sizeof(struct sadb_address)) { 4485 ipseclog((LOG_DEBUG, "%s: invalid message is passed.\n", 4486 __func__)); 4487 return key_senderror(so, m, EINVAL); 4488 } 4489 if (mhp->ext[SADB_X_EXT_SA2] != NULL) { 4490 mode = ((struct sadb_x_sa2 *)mhp->ext[SADB_X_EXT_SA2])->sadb_x_sa2_mode; 4491 reqid = ((struct sadb_x_sa2 *)mhp->ext[SADB_X_EXT_SA2])->sadb_x_sa2_reqid; 4492 } else { 4493 mode = IPSEC_MODE_ANY; 4494 reqid = 0; 4495 } 4496 4497 src0 = (struct sadb_address *)(mhp->ext[SADB_EXT_ADDRESS_SRC]); 4498 dst0 = (struct sadb_address *)(mhp->ext[SADB_EXT_ADDRESS_DST]); 4499 4500 /* map satype to proto */ 4501 if ((proto = key_satype2proto(mhp->msg->sadb_msg_satype)) == 0) { 4502 ipseclog((LOG_DEBUG, "%s: invalid satype is passed.\n", 4503 __func__)); 4504 return key_senderror(so, m, EINVAL); 4505 } 4506 4507 /* make sure if port number is zero. */ 4508 switch (((struct sockaddr *)(src0 + 1))->sa_family) { 4509 case AF_INET: 4510 if (((struct sockaddr *)(src0 + 1))->sa_len != 4511 sizeof(struct sockaddr_in)) 4512 return key_senderror(so, m, EINVAL); 4513 ((struct sockaddr_in *)(src0 + 1))->sin_port = 0; 4514 break; 4515 case AF_INET6: 4516 if (((struct sockaddr *)(src0 + 1))->sa_len != 4517 sizeof(struct sockaddr_in6)) 4518 return key_senderror(so, m, EINVAL); 4519 ((struct sockaddr_in6 *)(src0 + 1))->sin6_port = 0; 4520 break; 4521 default: 4522 ; /*???*/ 4523 } 4524 switch (((struct sockaddr *)(dst0 + 1))->sa_family) { 4525 case AF_INET: 4526 if (((struct sockaddr *)(dst0 + 1))->sa_len != 4527 sizeof(struct sockaddr_in)) 4528 return key_senderror(so, m, EINVAL); 4529 ((struct sockaddr_in *)(dst0 + 1))->sin_port = 0; 4530 break; 4531 case AF_INET6: 4532 if (((struct sockaddr *)(dst0 + 1))->sa_len != 4533 sizeof(struct sockaddr_in6)) 4534 return key_senderror(so, m, EINVAL); 4535 ((struct sockaddr_in6 *)(dst0 + 1))->sin6_port = 0; 4536 break; 4537 default: 4538 ; /*???*/ 4539 } 4540 4541 /* XXX boundary check against sa_len */ 4542 KEY_SETSECASIDX(proto, mode, reqid, src0 + 1, dst0 + 1, &saidx); 4543 4544 /* SPI allocation */ 4545 spi = key_do_getnewspi((struct sadb_spirange *)mhp->ext[SADB_EXT_SPIRANGE], 4546 &saidx); 4547 if (spi == 0) 4548 return key_senderror(so, m, EINVAL); 4549 4550 /* get a SA index */ 4551 if ((newsah = key_getsah(&saidx)) == NULL) { 4552 /* create a new SA index */ 4553 if ((newsah = key_newsah(&saidx)) == NULL) { 4554 ipseclog((LOG_DEBUG, "%s: No more memory.\n",__func__)); 4555 return key_senderror(so, m, ENOBUFS); 4556 } 4557 } 4558 4559 /* get a new SA */ 4560 /* XXX rewrite */ 4561 newsav = KEY_NEWSAV(m, mhp, newsah, &error); 4562 if (newsav == NULL) { 4563 /* XXX don't free new SA index allocated in above. */ 4564 return key_senderror(so, m, error); 4565 } 4566 4567 /* set spi */ 4568 newsav->spi = htonl(spi); 4569 4570 /* delete the entry in acqtree */ 4571 if (mhp->msg->sadb_msg_seq != 0) { 4572 struct secacq *acq; 4573 if ((acq = key_getacqbyseq(mhp->msg->sadb_msg_seq)) != NULL) { 4574 /* reset counter in order to deletion by timehandler. */ 4575 acq->created = time_second; 4576 acq->count = 0; 4577 } 4578 } 4579 4580 { 4581 struct mbuf *n, *nn; 4582 struct sadb_sa *m_sa; 4583 struct sadb_msg *newmsg; 4584 int off, len; 4585 4586 /* create new sadb_msg to reply. */ 4587 len = PFKEY_ALIGN8(sizeof(struct sadb_msg)) + 4588 PFKEY_ALIGN8(sizeof(struct sadb_sa)); 4589 4590 MGETHDR(n, M_DONTWAIT, MT_DATA); 4591 if (len > MHLEN) { 4592 MCLGET(n, M_DONTWAIT); 4593 if ((n->m_flags & M_EXT) == 0) { 4594 m_freem(n); 4595 n = NULL; 4596 } 4597 } 4598 if (!n) 4599 return key_senderror(so, m, ENOBUFS); 4600 4601 n->m_len = len; 4602 n->m_next = NULL; 4603 off = 0; 4604 4605 m_copydata(m, 0, sizeof(struct sadb_msg), mtod(n, caddr_t) + off); 4606 off += PFKEY_ALIGN8(sizeof(struct sadb_msg)); 4607 4608 m_sa = (struct sadb_sa *)(mtod(n, caddr_t) + off); 4609 m_sa->sadb_sa_len = PFKEY_UNIT64(sizeof(struct sadb_sa)); 4610 m_sa->sadb_sa_exttype = SADB_EXT_SA; 4611 m_sa->sadb_sa_spi = htonl(spi); 4612 off += PFKEY_ALIGN8(sizeof(struct sadb_sa)); 4613 4614 IPSEC_ASSERT(off == len, 4615 ("length inconsistency (off %u len %u)", off, len)); 4616 4617 n->m_next = key_gather_mbuf(m, mhp, 0, 2, SADB_EXT_ADDRESS_SRC, 4618 SADB_EXT_ADDRESS_DST); 4619 if (!n->m_next) { 4620 m_freem(n); 4621 return key_senderror(so, m, ENOBUFS); 4622 } 4623 4624 if (n->m_len < sizeof(struct sadb_msg)) { 4625 n = m_pullup(n, sizeof(struct sadb_msg)); 4626 if (n == NULL) 4627 return key_sendup_mbuf(so, m, KEY_SENDUP_ONE); 4628 } 4629 4630 n->m_pkthdr.len = 0; 4631 for (nn = n; nn; nn = nn->m_next) 4632 n->m_pkthdr.len += nn->m_len; 4633 4634 newmsg = mtod(n, struct sadb_msg *); 4635 newmsg->sadb_msg_seq = newsav->seq; 4636 newmsg->sadb_msg_errno = 0; 4637 newmsg->sadb_msg_len = PFKEY_UNIT64(n->m_pkthdr.len); 4638 4639 m_freem(m); 4640 return key_sendup_mbuf(so, n, KEY_SENDUP_ONE); 4641 } 4642} 4643 4644/* 4645 * allocating new SPI 4646 * called by key_getspi(). 4647 * OUT: 4648 * 0: failure. 4649 * others: success. 4650 */ 4651static u_int32_t 4652key_do_getnewspi(spirange, saidx) 4653 struct sadb_spirange *spirange; 4654 struct secasindex *saidx; 4655{ 4656 INIT_VNET_IPSEC(curvnet); 4657 u_int32_t newspi; 4658 u_int32_t min, max; 4659 int count = V_key_spi_trycnt; 4660 4661 /* set spi range to allocate */ 4662 if (spirange != NULL) { 4663 min = spirange->sadb_spirange_min; 4664 max = spirange->sadb_spirange_max; 4665 } else { 4666 min = V_key_spi_minval; 4667 max = V_key_spi_maxval; 4668 } 4669 /* IPCOMP needs 2-byte SPI */ 4670 if (saidx->proto == IPPROTO_IPCOMP) { 4671 u_int32_t t; 4672 if (min >= 0x10000) 4673 min = 0xffff; 4674 if (max >= 0x10000) 4675 max = 0xffff; 4676 if (min > max) { 4677 t = min; min = max; max = t; 4678 } 4679 } 4680 4681 if (min == max) { 4682 if (key_checkspidup(saidx, min) != NULL) { 4683 ipseclog((LOG_DEBUG, "%s: SPI %u exists already.\n", 4684 __func__, min)); 4685 return 0; 4686 } 4687 4688 count--; /* taking one cost. */ 4689 newspi = min; 4690 4691 } else { 4692 4693 /* init SPI */ 4694 newspi = 0; 4695 4696 /* when requesting to allocate spi ranged */ 4697 while (count--) { 4698 /* generate pseudo-random SPI value ranged. */ 4699 newspi = min + (key_random() % (max - min + 1)); 4700 4701 if (key_checkspidup(saidx, newspi) == NULL) 4702 break; 4703 } 4704 4705 if (count == 0 || newspi == 0) { 4706 ipseclog((LOG_DEBUG, "%s: to allocate spi is failed.\n", 4707 __func__)); 4708 return 0; 4709 } 4710 } 4711 4712 /* statistics */ 4713 keystat.getspi_count = 4714 (keystat.getspi_count + V_key_spi_trycnt - count) / 2; 4715 4716 return newspi; 4717} 4718 4719/* 4720 * SADB_UPDATE processing 4721 * receive 4722 * <base, SA, (SA2), (lifetime(HSC),) address(SD), (address(P),) 4723 * key(AE), (identity(SD),) (sensitivity)> 4724 * from the ikmpd, and update a secasvar entry whose status is SADB_SASTATE_LARVAL. 4725 * and send 4726 * <base, SA, (SA2), (lifetime(HSC),) address(SD), (address(P),) 4727 * (identity(SD),) (sensitivity)> 4728 * to the ikmpd. 4729 * 4730 * m will always be freed. 4731 */ 4732static int 4733key_update(so, m, mhp) 4734 struct socket *so; 4735 struct mbuf *m; 4736 const struct sadb_msghdr *mhp; 4737{ 4738 INIT_VNET_IPSEC(curvnet); 4739 struct sadb_sa *sa0; 4740 struct sadb_address *src0, *dst0; 4741 struct secasindex saidx; 4742 struct secashead *sah; 4743 struct secasvar *sav; 4744 u_int16_t proto; 4745 u_int8_t mode; 4746 u_int32_t reqid; 4747 int error; 4748 4749 IPSEC_ASSERT(so != NULL, ("null socket")); 4750 IPSEC_ASSERT(m != NULL, ("null mbuf")); 4751 IPSEC_ASSERT(mhp != NULL, ("null msghdr")); 4752 IPSEC_ASSERT(mhp->msg != NULL, ("null msg")); 4753 4754 /* map satype to proto */ 4755 if ((proto = key_satype2proto(mhp->msg->sadb_msg_satype)) == 0) { 4756 ipseclog((LOG_DEBUG, "%s: invalid satype is passed.\n", 4757 __func__)); 4758 return key_senderror(so, m, EINVAL); 4759 } 4760 4761 if (mhp->ext[SADB_EXT_SA] == NULL || 4762 mhp->ext[SADB_EXT_ADDRESS_SRC] == NULL || 4763 mhp->ext[SADB_EXT_ADDRESS_DST] == NULL || 4764 (mhp->msg->sadb_msg_satype == SADB_SATYPE_ESP && 4765 mhp->ext[SADB_EXT_KEY_ENCRYPT] == NULL) || 4766 (mhp->msg->sadb_msg_satype == SADB_SATYPE_AH && 4767 mhp->ext[SADB_EXT_KEY_AUTH] == NULL) || 4768 (mhp->ext[SADB_EXT_LIFETIME_HARD] != NULL && 4769 mhp->ext[SADB_EXT_LIFETIME_SOFT] == NULL) || 4770 (mhp->ext[SADB_EXT_LIFETIME_HARD] == NULL && 4771 mhp->ext[SADB_EXT_LIFETIME_SOFT] != NULL)) { 4772 ipseclog((LOG_DEBUG, "%s: invalid message is passed.\n", 4773 __func__)); 4774 return key_senderror(so, m, EINVAL); 4775 } 4776 if (mhp->extlen[SADB_EXT_SA] < sizeof(struct sadb_sa) || 4777 mhp->extlen[SADB_EXT_ADDRESS_SRC] < sizeof(struct sadb_address) || 4778 mhp->extlen[SADB_EXT_ADDRESS_DST] < sizeof(struct sadb_address)) { 4779 ipseclog((LOG_DEBUG, "%s: invalid message is passed.\n", 4780 __func__)); 4781 return key_senderror(so, m, EINVAL); 4782 } 4783 if (mhp->ext[SADB_X_EXT_SA2] != NULL) { 4784 mode = ((struct sadb_x_sa2 *)mhp->ext[SADB_X_EXT_SA2])->sadb_x_sa2_mode; 4785 reqid = ((struct sadb_x_sa2 *)mhp->ext[SADB_X_EXT_SA2])->sadb_x_sa2_reqid; 4786 } else { 4787 mode = IPSEC_MODE_ANY; 4788 reqid = 0; 4789 } 4790 /* XXX boundary checking for other extensions */ 4791 4792 sa0 = (struct sadb_sa *)mhp->ext[SADB_EXT_SA]; 4793 src0 = (struct sadb_address *)(mhp->ext[SADB_EXT_ADDRESS_SRC]); 4794 dst0 = (struct sadb_address *)(mhp->ext[SADB_EXT_ADDRESS_DST]); 4795 4796 /* XXX boundary check against sa_len */ 4797 KEY_SETSECASIDX(proto, mode, reqid, src0 + 1, dst0 + 1, &saidx); 4798 4799 /* get a SA header */ 4800 if ((sah = key_getsah(&saidx)) == NULL) { 4801 ipseclog((LOG_DEBUG, "%s: no SA index found.\n", __func__)); 4802 return key_senderror(so, m, ENOENT); 4803 } 4804 4805 /* set spidx if there */ 4806 /* XXX rewrite */ 4807 error = key_setident(sah, m, mhp); 4808 if (error) 4809 return key_senderror(so, m, error); 4810 4811 /* find a SA with sequence number. */ 4812#ifdef IPSEC_DOSEQCHECK 4813 if (mhp->msg->sadb_msg_seq != 0 4814 && (sav = key_getsavbyseq(sah, mhp->msg->sadb_msg_seq)) == NULL) { 4815 ipseclog((LOG_DEBUG, "%s: no larval SA with sequence %u " 4816 "exists.\n", __func__, mhp->msg->sadb_msg_seq)); 4817 return key_senderror(so, m, ENOENT); 4818 } 4819#else 4820 SAHTREE_LOCK(); 4821 sav = key_getsavbyspi(sah, sa0->sadb_sa_spi); 4822 SAHTREE_UNLOCK(); 4823 if (sav == NULL) { 4824 ipseclog((LOG_DEBUG, "%s: no such a SA found (spi:%u)\n", 4825 __func__, (u_int32_t)ntohl(sa0->sadb_sa_spi))); 4826 return key_senderror(so, m, EINVAL); 4827 } 4828#endif 4829 4830 /* validity check */ 4831 if (sav->sah->saidx.proto != proto) { 4832 ipseclog((LOG_DEBUG, "%s: protocol mismatched " 4833 "(DB=%u param=%u)\n", __func__, 4834 sav->sah->saidx.proto, proto)); 4835 return key_senderror(so, m, EINVAL); 4836 } 4837#ifdef IPSEC_DOSEQCHECK 4838 if (sav->spi != sa0->sadb_sa_spi) { 4839 ipseclog((LOG_DEBUG, "%s: SPI mismatched (DB:%u param:%u)\n", 4840 __func__, 4841 (u_int32_t)ntohl(sav->spi), 4842 (u_int32_t)ntohl(sa0->sadb_sa_spi))); 4843 return key_senderror(so, m, EINVAL); 4844 } 4845#endif 4846 if (sav->pid != mhp->msg->sadb_msg_pid) { 4847 ipseclog((LOG_DEBUG, "%s: pid mismatched (DB:%u param:%u)\n", 4848 __func__, sav->pid, mhp->msg->sadb_msg_pid)); 4849 return key_senderror(so, m, EINVAL); 4850 } 4851 4852 /* copy sav values */ 4853 error = key_setsaval(sav, m, mhp); 4854 if (error) { 4855 KEY_FREESAV(&sav); 4856 return key_senderror(so, m, error); 4857 } 4858 4859 /* check SA values to be mature. */ 4860 if ((mhp->msg->sadb_msg_errno = key_mature(sav)) != 0) { 4861 KEY_FREESAV(&sav); 4862 return key_senderror(so, m, 0); 4863 } 4864 4865 { 4866 struct mbuf *n; 4867 4868 /* set msg buf from mhp */ 4869 n = key_getmsgbuf_x1(m, mhp); 4870 if (n == NULL) { 4871 ipseclog((LOG_DEBUG, "%s: No more memory.\n", __func__)); 4872 return key_senderror(so, m, ENOBUFS); 4873 } 4874 4875 m_freem(m); 4876 return key_sendup_mbuf(so, n, KEY_SENDUP_ALL); 4877 } 4878} 4879 4880/* 4881 * search SAD with sequence for a SA which state is SADB_SASTATE_LARVAL. 4882 * only called by key_update(). 4883 * OUT: 4884 * NULL : not found 4885 * others : found, pointer to a SA. 4886 */ 4887#ifdef IPSEC_DOSEQCHECK 4888static struct secasvar * 4889key_getsavbyseq(sah, seq) 4890 struct secashead *sah; 4891 u_int32_t seq; 4892{ 4893 struct secasvar *sav; 4894 u_int state; 4895 4896 state = SADB_SASTATE_LARVAL; 4897 4898 /* search SAD with sequence number ? */ 4899 LIST_FOREACH(sav, &sah->savtree[state], chain) { 4900 4901 KEY_CHKSASTATE(state, sav->state, __func__); 4902 4903 if (sav->seq == seq) { 4904 sa_addref(sav); 4905 KEYDEBUG(KEYDEBUG_IPSEC_STAMP, 4906 printf("DP %s cause refcnt++:%d SA:%p\n", 4907 __func__, sav->refcnt, sav)); 4908 return sav; 4909 } 4910 } 4911 4912 return NULL; 4913} 4914#endif 4915 4916/* 4917 * SADB_ADD processing 4918 * add an entry to SA database, when received 4919 * <base, SA, (SA2), (lifetime(HSC),) address(SD), (address(P),) 4920 * key(AE), (identity(SD),) (sensitivity)> 4921 * from the ikmpd, 4922 * and send 4923 * <base, SA, (SA2), (lifetime(HSC),) address(SD), (address(P),) 4924 * (identity(SD),) (sensitivity)> 4925 * to the ikmpd. 4926 * 4927 * IGNORE identity and sensitivity messages. 4928 * 4929 * m will always be freed. 4930 */ 4931static int 4932key_add(so, m, mhp) 4933 struct socket *so; 4934 struct mbuf *m; 4935 const struct sadb_msghdr *mhp; 4936{ 4937 INIT_VNET_IPSEC(curvnet); 4938 struct sadb_sa *sa0; 4939 struct sadb_address *src0, *dst0; 4940 struct secasindex saidx; 4941 struct secashead *newsah; 4942 struct secasvar *newsav; 4943 u_int16_t proto; 4944 u_int8_t mode; 4945 u_int32_t reqid; 4946 int error; 4947 4948 IPSEC_ASSERT(so != NULL, ("null socket")); 4949 IPSEC_ASSERT(m != NULL, ("null mbuf")); 4950 IPSEC_ASSERT(mhp != NULL, ("null msghdr")); 4951 IPSEC_ASSERT(mhp->msg != NULL, ("null msg")); 4952 4953 /* map satype to proto */ 4954 if ((proto = key_satype2proto(mhp->msg->sadb_msg_satype)) == 0) { 4955 ipseclog((LOG_DEBUG, "%s: invalid satype is passed.\n", 4956 __func__)); 4957 return key_senderror(so, m, EINVAL); 4958 } 4959 4960 if (mhp->ext[SADB_EXT_SA] == NULL || 4961 mhp->ext[SADB_EXT_ADDRESS_SRC] == NULL || 4962 mhp->ext[SADB_EXT_ADDRESS_DST] == NULL || 4963 (mhp->msg->sadb_msg_satype == SADB_SATYPE_ESP && 4964 mhp->ext[SADB_EXT_KEY_ENCRYPT] == NULL) || 4965 (mhp->msg->sadb_msg_satype == SADB_SATYPE_AH && 4966 mhp->ext[SADB_EXT_KEY_AUTH] == NULL) || 4967 (mhp->ext[SADB_EXT_LIFETIME_HARD] != NULL && 4968 mhp->ext[SADB_EXT_LIFETIME_SOFT] == NULL) || 4969 (mhp->ext[SADB_EXT_LIFETIME_HARD] == NULL && 4970 mhp->ext[SADB_EXT_LIFETIME_SOFT] != NULL)) { 4971 ipseclog((LOG_DEBUG, "%s: invalid message is passed.\n", 4972 __func__)); 4973 return key_senderror(so, m, EINVAL); 4974 } 4975 if (mhp->extlen[SADB_EXT_SA] < sizeof(struct sadb_sa) || 4976 mhp->extlen[SADB_EXT_ADDRESS_SRC] < sizeof(struct sadb_address) || 4977 mhp->extlen[SADB_EXT_ADDRESS_DST] < sizeof(struct sadb_address)) { 4978 /* XXX need more */ 4979 ipseclog((LOG_DEBUG, "%s: invalid message is passed.\n", 4980 __func__)); 4981 return key_senderror(so, m, EINVAL); 4982 } 4983 if (mhp->ext[SADB_X_EXT_SA2] != NULL) { 4984 mode = ((struct sadb_x_sa2 *)mhp->ext[SADB_X_EXT_SA2])->sadb_x_sa2_mode; 4985 reqid = ((struct sadb_x_sa2 *)mhp->ext[SADB_X_EXT_SA2])->sadb_x_sa2_reqid; 4986 } else { 4987 mode = IPSEC_MODE_ANY; 4988 reqid = 0; 4989 } 4990 4991 sa0 = (struct sadb_sa *)mhp->ext[SADB_EXT_SA]; 4992 src0 = (struct sadb_address *)mhp->ext[SADB_EXT_ADDRESS_SRC]; 4993 dst0 = (struct sadb_address *)mhp->ext[SADB_EXT_ADDRESS_DST]; 4994 4995 /* XXX boundary check against sa_len */ 4996 KEY_SETSECASIDX(proto, mode, reqid, src0 + 1, dst0 + 1, &saidx); 4997 4998 /* get a SA header */ 4999 if ((newsah = key_getsah(&saidx)) == NULL) { 5000 /* create a new SA header */ 5001 if ((newsah = key_newsah(&saidx)) == NULL) { 5002 ipseclog((LOG_DEBUG, "%s: No more memory.\n",__func__)); 5003 return key_senderror(so, m, ENOBUFS); 5004 } 5005 } 5006 5007 /* set spidx if there */ 5008 /* XXX rewrite */ 5009 error = key_setident(newsah, m, mhp); 5010 if (error) { 5011 return key_senderror(so, m, error); 5012 } 5013 5014 /* create new SA entry. */ 5015 /* We can create new SA only if SPI is differenct. */ 5016 SAHTREE_LOCK(); 5017 newsav = key_getsavbyspi(newsah, sa0->sadb_sa_spi); 5018 SAHTREE_UNLOCK(); 5019 if (newsav != NULL) { 5020 ipseclog((LOG_DEBUG, "%s: SA already exists.\n", __func__)); 5021 return key_senderror(so, m, EEXIST); 5022 } 5023 newsav = KEY_NEWSAV(m, mhp, newsah, &error); 5024 if (newsav == NULL) { 5025 return key_senderror(so, m, error); 5026 } 5027 5028 /* check SA values to be mature. */ 5029 if ((error = key_mature(newsav)) != 0) { 5030 KEY_FREESAV(&newsav); 5031 return key_senderror(so, m, error); 5032 } 5033 5034 /* 5035 * don't call key_freesav() here, as we would like to keep the SA 5036 * in the database on success. 5037 */ 5038 5039 { 5040 struct mbuf *n; 5041 5042 /* set msg buf from mhp */ 5043 n = key_getmsgbuf_x1(m, mhp); 5044 if (n == NULL) { 5045 ipseclog((LOG_DEBUG, "%s: No more memory.\n", __func__)); 5046 return key_senderror(so, m, ENOBUFS); 5047 } 5048 5049 m_freem(m); 5050 return key_sendup_mbuf(so, n, KEY_SENDUP_ALL); 5051 } 5052} 5053 5054/* m is retained */ 5055static int 5056key_setident(sah, m, mhp) 5057 struct secashead *sah; 5058 struct mbuf *m; 5059 const struct sadb_msghdr *mhp; 5060{ 5061 INIT_VNET_IPSEC(curvnet); 5062 const struct sadb_ident *idsrc, *iddst; 5063 int idsrclen, iddstlen; 5064 5065 IPSEC_ASSERT(sah != NULL, ("null secashead")); 5066 IPSEC_ASSERT(m != NULL, ("null mbuf")); 5067 IPSEC_ASSERT(mhp != NULL, ("null msghdr")); 5068 IPSEC_ASSERT(mhp->msg != NULL, ("null msg")); 5069 5070 /* don't make buffer if not there */ 5071 if (mhp->ext[SADB_EXT_IDENTITY_SRC] == NULL && 5072 mhp->ext[SADB_EXT_IDENTITY_DST] == NULL) { 5073 sah->idents = NULL; 5074 sah->identd = NULL; 5075 return 0; 5076 } 5077 5078 if (mhp->ext[SADB_EXT_IDENTITY_SRC] == NULL || 5079 mhp->ext[SADB_EXT_IDENTITY_DST] == NULL) { 5080 ipseclog((LOG_DEBUG, "%s: invalid identity.\n", __func__)); 5081 return EINVAL; 5082 } 5083 5084 idsrc = (const struct sadb_ident *)mhp->ext[SADB_EXT_IDENTITY_SRC]; 5085 iddst = (const struct sadb_ident *)mhp->ext[SADB_EXT_IDENTITY_DST]; 5086 idsrclen = mhp->extlen[SADB_EXT_IDENTITY_SRC]; 5087 iddstlen = mhp->extlen[SADB_EXT_IDENTITY_DST]; 5088 5089 /* validity check */ 5090 if (idsrc->sadb_ident_type != iddst->sadb_ident_type) { 5091 ipseclog((LOG_DEBUG, "%s: ident type mismatch.\n", __func__)); 5092 return EINVAL; 5093 } 5094 5095 switch (idsrc->sadb_ident_type) { 5096 case SADB_IDENTTYPE_PREFIX: 5097 case SADB_IDENTTYPE_FQDN: 5098 case SADB_IDENTTYPE_USERFQDN: 5099 default: 5100 /* XXX do nothing */ 5101 sah->idents = NULL; 5102 sah->identd = NULL; 5103 return 0; 5104 } 5105 5106 /* make structure */ 5107 sah->idents = malloc(sizeof(struct secident), M_IPSEC_MISC, M_NOWAIT); 5108 if (sah->idents == NULL) { 5109 ipseclog((LOG_DEBUG, "%s: No more memory.\n", __func__)); 5110 return ENOBUFS; 5111 } 5112 sah->identd = malloc(sizeof(struct secident), M_IPSEC_MISC, M_NOWAIT); 5113 if (sah->identd == NULL) { 5114 free(sah->idents, M_IPSEC_MISC); 5115 sah->idents = NULL; 5116 ipseclog((LOG_DEBUG, "%s: No more memory.\n", __func__)); 5117 return ENOBUFS; 5118 } 5119 sah->idents->type = idsrc->sadb_ident_type; 5120 sah->idents->id = idsrc->sadb_ident_id; 5121 5122 sah->identd->type = iddst->sadb_ident_type; 5123 sah->identd->id = iddst->sadb_ident_id; 5124 5125 return 0; 5126} 5127 5128/* 5129 * m will not be freed on return. 5130 * it is caller's responsibility to free the result. 5131 */ 5132static struct mbuf * 5133key_getmsgbuf_x1(m, mhp) 5134 struct mbuf *m; 5135 const struct sadb_msghdr *mhp; 5136{ 5137 struct mbuf *n; 5138 5139 IPSEC_ASSERT(m != NULL, ("null mbuf")); 5140 IPSEC_ASSERT(mhp != NULL, ("null msghdr")); 5141 IPSEC_ASSERT(mhp->msg != NULL, ("null msg")); 5142 5143 /* create new sadb_msg to reply. */ 5144 n = key_gather_mbuf(m, mhp, 1, 9, SADB_EXT_RESERVED, 5145 SADB_EXT_SA, SADB_X_EXT_SA2, 5146 SADB_EXT_ADDRESS_SRC, SADB_EXT_ADDRESS_DST, 5147 SADB_EXT_LIFETIME_HARD, SADB_EXT_LIFETIME_SOFT, 5148 SADB_EXT_IDENTITY_SRC, SADB_EXT_IDENTITY_DST); 5149 if (!n) 5150 return NULL; 5151 5152 if (n->m_len < sizeof(struct sadb_msg)) { 5153 n = m_pullup(n, sizeof(struct sadb_msg)); 5154 if (n == NULL) 5155 return NULL; 5156 } 5157 mtod(n, struct sadb_msg *)->sadb_msg_errno = 0; 5158 mtod(n, struct sadb_msg *)->sadb_msg_len = 5159 PFKEY_UNIT64(n->m_pkthdr.len); 5160 5161 return n; 5162} 5163 5164static int key_delete_all __P((struct socket *, struct mbuf *, 5165 const struct sadb_msghdr *, u_int16_t)); 5166 5167/* 5168 * SADB_DELETE processing 5169 * receive 5170 * <base, SA(*), address(SD)> 5171 * from the ikmpd, and set SADB_SASTATE_DEAD, 5172 * and send, 5173 * <base, SA(*), address(SD)> 5174 * to the ikmpd. 5175 * 5176 * m will always be freed. 5177 */ 5178static int 5179key_delete(so, m, mhp) 5180 struct socket *so; 5181 struct mbuf *m; 5182 const struct sadb_msghdr *mhp; 5183{ 5184 INIT_VNET_IPSEC(curvnet); 5185 struct sadb_sa *sa0; 5186 struct sadb_address *src0, *dst0; 5187 struct secasindex saidx; 5188 struct secashead *sah; 5189 struct secasvar *sav = NULL; 5190 u_int16_t proto; 5191 5192 IPSEC_ASSERT(so != NULL, ("null socket")); 5193 IPSEC_ASSERT(m != NULL, ("null mbuf")); 5194 IPSEC_ASSERT(mhp != NULL, ("null msghdr")); 5195 IPSEC_ASSERT(mhp->msg != NULL, ("null msg")); 5196 5197 /* map satype to proto */ 5198 if ((proto = key_satype2proto(mhp->msg->sadb_msg_satype)) == 0) { 5199 ipseclog((LOG_DEBUG, "%s: invalid satype is passed.\n", 5200 __func__)); 5201 return key_senderror(so, m, EINVAL); 5202 } 5203 5204 if (mhp->ext[SADB_EXT_ADDRESS_SRC] == NULL || 5205 mhp->ext[SADB_EXT_ADDRESS_DST] == NULL) { 5206 ipseclog((LOG_DEBUG, "%s: invalid message is passed.\n", 5207 __func__)); 5208 return key_senderror(so, m, EINVAL); 5209 } 5210 5211 if (mhp->extlen[SADB_EXT_ADDRESS_SRC] < sizeof(struct sadb_address) || 5212 mhp->extlen[SADB_EXT_ADDRESS_DST] < sizeof(struct sadb_address)) { 5213 ipseclog((LOG_DEBUG, "%s: invalid message is passed.\n", 5214 __func__)); 5215 return key_senderror(so, m, EINVAL); 5216 } 5217 5218 if (mhp->ext[SADB_EXT_SA] == NULL) { 5219 /* 5220 * Caller wants us to delete all non-LARVAL SAs 5221 * that match the src/dst. This is used during 5222 * IKE INITIAL-CONTACT. 5223 */ 5224 ipseclog((LOG_DEBUG, "%s: doing delete all.\n", __func__)); 5225 return key_delete_all(so, m, mhp, proto); 5226 } else if (mhp->extlen[SADB_EXT_SA] < sizeof(struct sadb_sa)) { 5227 ipseclog((LOG_DEBUG, "%s: invalid message is passed.\n", 5228 __func__)); 5229 return key_senderror(so, m, EINVAL); 5230 } 5231 5232 sa0 = (struct sadb_sa *)mhp->ext[SADB_EXT_SA]; 5233 src0 = (struct sadb_address *)(mhp->ext[SADB_EXT_ADDRESS_SRC]); 5234 dst0 = (struct sadb_address *)(mhp->ext[SADB_EXT_ADDRESS_DST]); 5235 5236 /* XXX boundary check against sa_len */ 5237 KEY_SETSECASIDX(proto, IPSEC_MODE_ANY, 0, src0 + 1, dst0 + 1, &saidx); 5238 5239 /* get a SA header */ 5240 SAHTREE_LOCK(); 5241 LIST_FOREACH(sah, &V_sahtree, chain) { 5242 if (sah->state == SADB_SASTATE_DEAD) 5243 continue; 5244 if (key_cmpsaidx(&sah->saidx, &saidx, CMP_HEAD) == 0) 5245 continue; 5246 5247 /* get a SA with SPI. */ 5248 sav = key_getsavbyspi(sah, sa0->sadb_sa_spi); 5249 if (sav) 5250 break; 5251 } 5252 if (sah == NULL) { 5253 SAHTREE_UNLOCK(); 5254 ipseclog((LOG_DEBUG, "%s: no SA found.\n", __func__)); 5255 return key_senderror(so, m, ENOENT); 5256 } 5257 5258 key_sa_chgstate(sav, SADB_SASTATE_DEAD); 5259 SAHTREE_UNLOCK(); 5260 KEY_FREESAV(&sav); 5261 5262 { 5263 struct mbuf *n; 5264 struct sadb_msg *newmsg; 5265 5266 /* create new sadb_msg to reply. */ 5267 n = key_gather_mbuf(m, mhp, 1, 4, SADB_EXT_RESERVED, 5268 SADB_EXT_SA, SADB_EXT_ADDRESS_SRC, SADB_EXT_ADDRESS_DST); 5269 if (!n) 5270 return key_senderror(so, m, ENOBUFS); 5271 5272 if (n->m_len < sizeof(struct sadb_msg)) { 5273 n = m_pullup(n, sizeof(struct sadb_msg)); 5274 if (n == NULL) 5275 return key_senderror(so, m, ENOBUFS); 5276 } 5277 newmsg = mtod(n, struct sadb_msg *); 5278 newmsg->sadb_msg_errno = 0; 5279 newmsg->sadb_msg_len = PFKEY_UNIT64(n->m_pkthdr.len); 5280 5281 m_freem(m); 5282 return key_sendup_mbuf(so, n, KEY_SENDUP_ALL); 5283 } 5284} 5285 5286/* 5287 * delete all SAs for src/dst. Called from key_delete(). 5288 */ 5289static int 5290key_delete_all(so, m, mhp, proto) 5291 struct socket *so; 5292 struct mbuf *m; 5293 const struct sadb_msghdr *mhp; 5294 u_int16_t proto; 5295{ 5296 INIT_VNET_IPSEC(curvnet); 5297 struct sadb_address *src0, *dst0; 5298 struct secasindex saidx; 5299 struct secashead *sah; 5300 struct secasvar *sav, *nextsav; 5301 u_int stateidx, state; 5302 5303 src0 = (struct sadb_address *)(mhp->ext[SADB_EXT_ADDRESS_SRC]); 5304 dst0 = (struct sadb_address *)(mhp->ext[SADB_EXT_ADDRESS_DST]); 5305 5306 /* XXX boundary check against sa_len */ 5307 KEY_SETSECASIDX(proto, IPSEC_MODE_ANY, 0, src0 + 1, dst0 + 1, &saidx); 5308 5309 SAHTREE_LOCK(); 5310 LIST_FOREACH(sah, &V_sahtree, chain) { 5311 if (sah->state == SADB_SASTATE_DEAD) 5312 continue; 5313 if (key_cmpsaidx(&sah->saidx, &saidx, CMP_HEAD) == 0) 5314 continue; 5315 5316 /* Delete all non-LARVAL SAs. */ 5317 for (stateidx = 0; 5318 stateidx < _ARRAYLEN(saorder_state_alive); 5319 stateidx++) { 5320 state = saorder_state_alive[stateidx]; 5321 if (state == SADB_SASTATE_LARVAL) 5322 continue; 5323 for (sav = LIST_FIRST(&sah->savtree[state]); 5324 sav != NULL; sav = nextsav) { 5325 nextsav = LIST_NEXT(sav, chain); 5326 /* sanity check */ 5327 if (sav->state != state) { 5328 ipseclog((LOG_DEBUG, "%s: invalid " 5329 "sav->state (queue %d SA %d)\n", 5330 __func__, state, sav->state)); 5331 continue; 5332 } 5333 5334 key_sa_chgstate(sav, SADB_SASTATE_DEAD); 5335 KEY_FREESAV(&sav); 5336 } 5337 } 5338 } 5339 SAHTREE_UNLOCK(); 5340 { 5341 struct mbuf *n; 5342 struct sadb_msg *newmsg; 5343 5344 /* create new sadb_msg to reply. */ 5345 n = key_gather_mbuf(m, mhp, 1, 3, SADB_EXT_RESERVED, 5346 SADB_EXT_ADDRESS_SRC, SADB_EXT_ADDRESS_DST); 5347 if (!n) 5348 return key_senderror(so, m, ENOBUFS); 5349 5350 if (n->m_len < sizeof(struct sadb_msg)) { 5351 n = m_pullup(n, sizeof(struct sadb_msg)); 5352 if (n == NULL) 5353 return key_senderror(so, m, ENOBUFS); 5354 } 5355 newmsg = mtod(n, struct sadb_msg *); 5356 newmsg->sadb_msg_errno = 0; 5357 newmsg->sadb_msg_len = PFKEY_UNIT64(n->m_pkthdr.len); 5358 5359 m_freem(m); 5360 return key_sendup_mbuf(so, n, KEY_SENDUP_ALL); 5361 } 5362} 5363 5364/* 5365 * SADB_GET processing 5366 * receive 5367 * <base, SA(*), address(SD)> 5368 * from the ikmpd, and get a SP and a SA to respond, 5369 * and send, 5370 * <base, SA, (lifetime(HSC),) address(SD), (address(P),) key(AE), 5371 * (identity(SD),) (sensitivity)> 5372 * to the ikmpd. 5373 * 5374 * m will always be freed. 5375 */ 5376static int 5377key_get(so, m, mhp) 5378 struct socket *so; 5379 struct mbuf *m; 5380 const struct sadb_msghdr *mhp; 5381{ 5382 INIT_VNET_IPSEC(curvnet); 5383 struct sadb_sa *sa0; 5384 struct sadb_address *src0, *dst0; 5385 struct secasindex saidx; 5386 struct secashead *sah; 5387 struct secasvar *sav = NULL; 5388 u_int16_t proto; 5389 5390 IPSEC_ASSERT(so != NULL, ("null socket")); 5391 IPSEC_ASSERT(m != NULL, ("null mbuf")); 5392 IPSEC_ASSERT(mhp != NULL, ("null msghdr")); 5393 IPSEC_ASSERT(mhp->msg != NULL, ("null msg")); 5394 5395 /* map satype to proto */ 5396 if ((proto = key_satype2proto(mhp->msg->sadb_msg_satype)) == 0) { 5397 ipseclog((LOG_DEBUG, "%s: invalid satype is passed.\n", 5398 __func__)); 5399 return key_senderror(so, m, EINVAL); 5400 } 5401 5402 if (mhp->ext[SADB_EXT_SA] == NULL || 5403 mhp->ext[SADB_EXT_ADDRESS_SRC] == NULL || 5404 mhp->ext[SADB_EXT_ADDRESS_DST] == NULL) { 5405 ipseclog((LOG_DEBUG, "%s: invalid message is passed.\n", 5406 __func__)); 5407 return key_senderror(so, m, EINVAL); 5408 } 5409 if (mhp->extlen[SADB_EXT_SA] < sizeof(struct sadb_sa) || 5410 mhp->extlen[SADB_EXT_ADDRESS_SRC] < sizeof(struct sadb_address) || 5411 mhp->extlen[SADB_EXT_ADDRESS_DST] < sizeof(struct sadb_address)) { 5412 ipseclog((LOG_DEBUG, "%s: invalid message is passed.\n", 5413 __func__)); 5414 return key_senderror(so, m, EINVAL); 5415 } 5416 5417 sa0 = (struct sadb_sa *)mhp->ext[SADB_EXT_SA]; 5418 src0 = (struct sadb_address *)mhp->ext[SADB_EXT_ADDRESS_SRC]; 5419 dst0 = (struct sadb_address *)mhp->ext[SADB_EXT_ADDRESS_DST]; 5420 5421 /* XXX boundary check against sa_len */ 5422 KEY_SETSECASIDX(proto, IPSEC_MODE_ANY, 0, src0 + 1, dst0 + 1, &saidx); 5423 5424 /* get a SA header */ 5425 SAHTREE_LOCK(); 5426 LIST_FOREACH(sah, &V_sahtree, chain) { 5427 if (sah->state == SADB_SASTATE_DEAD) 5428 continue; 5429 if (key_cmpsaidx(&sah->saidx, &saidx, CMP_HEAD) == 0) 5430 continue; 5431 5432 /* get a SA with SPI. */ 5433 sav = key_getsavbyspi(sah, sa0->sadb_sa_spi); 5434 if (sav) 5435 break; 5436 } 5437 SAHTREE_UNLOCK(); 5438 if (sah == NULL) { 5439 ipseclog((LOG_DEBUG, "%s: no SA found.\n", __func__)); 5440 return key_senderror(so, m, ENOENT); 5441 } 5442 5443 { 5444 struct mbuf *n; 5445 u_int8_t satype; 5446 5447 /* map proto to satype */ 5448 if ((satype = key_proto2satype(sah->saidx.proto)) == 0) { 5449 ipseclog((LOG_DEBUG, "%s: there was invalid proto in SAD.\n", 5450 __func__)); 5451 return key_senderror(so, m, EINVAL); 5452 } 5453 5454 /* create new sadb_msg to reply. */ 5455 n = key_setdumpsa(sav, SADB_GET, satype, mhp->msg->sadb_msg_seq, 5456 mhp->msg->sadb_msg_pid); 5457 if (!n) 5458 return key_senderror(so, m, ENOBUFS); 5459 5460 m_freem(m); 5461 return key_sendup_mbuf(so, n, KEY_SENDUP_ONE); 5462 } 5463} 5464 5465/* XXX make it sysctl-configurable? */ 5466static void 5467key_getcomb_setlifetime(comb) 5468 struct sadb_comb *comb; 5469{ 5470 5471 comb->sadb_comb_soft_allocations = 1; 5472 comb->sadb_comb_hard_allocations = 1; 5473 comb->sadb_comb_soft_bytes = 0; 5474 comb->sadb_comb_hard_bytes = 0; 5475 comb->sadb_comb_hard_addtime = 86400; /* 1 day */ 5476 comb->sadb_comb_soft_addtime = comb->sadb_comb_soft_addtime * 80 / 100; 5477 comb->sadb_comb_soft_usetime = 28800; /* 8 hours */ 5478 comb->sadb_comb_hard_usetime = comb->sadb_comb_hard_usetime * 80 / 100; 5479} 5480 5481/* 5482 * XXX reorder combinations by preference 5483 * XXX no idea if the user wants ESP authentication or not 5484 */ 5485static struct mbuf * 5486key_getcomb_esp() 5487{ 5488 INIT_VNET_IPSEC(curvnet); 5489 struct sadb_comb *comb; 5490 struct enc_xform *algo; 5491 struct mbuf *result = NULL, *m, *n; 5492 int encmin; 5493 int i, off, o; 5494 int totlen; 5495 const int l = PFKEY_ALIGN8(sizeof(struct sadb_comb)); 5496 5497 m = NULL; 5498 for (i = 1; i <= SADB_EALG_MAX; i++) { 5499 algo = esp_algorithm_lookup(i); 5500 if (algo == NULL) 5501 continue; 5502 5503 /* discard algorithms with key size smaller than system min */ 5504 if (_BITS(algo->maxkey) < V_ipsec_esp_keymin) 5505 continue; 5506 if (_BITS(algo->minkey) < V_ipsec_esp_keymin) 5507 encmin = V_ipsec_esp_keymin; 5508 else 5509 encmin = _BITS(algo->minkey); 5510 5511 if (V_ipsec_esp_auth) 5512 m = key_getcomb_ah(); 5513 else { 5514 IPSEC_ASSERT(l <= MLEN, 5515 ("l=%u > MLEN=%lu", l, (u_long) MLEN)); 5516 MGET(m, M_DONTWAIT, MT_DATA); 5517 if (m) { 5518 M_ALIGN(m, l); 5519 m->m_len = l; 5520 m->m_next = NULL; 5521 bzero(mtod(m, caddr_t), m->m_len); 5522 } 5523 } 5524 if (!m) 5525 goto fail; 5526 5527 totlen = 0; 5528 for (n = m; n; n = n->m_next) 5529 totlen += n->m_len; 5530 IPSEC_ASSERT((totlen % l) == 0, ("totlen=%u, l=%u", totlen, l)); 5531 5532 for (off = 0; off < totlen; off += l) { 5533 n = m_pulldown(m, off, l, &o); 5534 if (!n) { 5535 /* m is already freed */ 5536 goto fail; 5537 } 5538 comb = (struct sadb_comb *)(mtod(n, caddr_t) + o); 5539 bzero(comb, sizeof(*comb)); 5540 key_getcomb_setlifetime(comb); 5541 comb->sadb_comb_encrypt = i; 5542 comb->sadb_comb_encrypt_minbits = encmin; 5543 comb->sadb_comb_encrypt_maxbits = _BITS(algo->maxkey); 5544 } 5545 5546 if (!result) 5547 result = m; 5548 else 5549 m_cat(result, m); 5550 } 5551 5552 return result; 5553 5554 fail: 5555 if (result) 5556 m_freem(result); 5557 return NULL; 5558} 5559 5560static void 5561key_getsizes_ah( 5562 const struct auth_hash *ah, 5563 int alg, 5564 u_int16_t* min, 5565 u_int16_t* max) 5566{ 5567 INIT_VNET_IPSEC(curvnet); 5568 5569 *min = *max = ah->keysize; 5570 if (ah->keysize == 0) { 5571 /* 5572 * Transform takes arbitrary key size but algorithm 5573 * key size is restricted. Enforce this here. 5574 */ 5575 switch (alg) { 5576 case SADB_X_AALG_MD5: *min = *max = 16; break; 5577 case SADB_X_AALG_SHA: *min = *max = 20; break; 5578 case SADB_X_AALG_NULL: *min = 1; *max = 256; break; 5579 default: 5580 DPRINTF(("%s: unknown AH algorithm %u\n", 5581 __func__, alg)); 5582 break; 5583 } 5584 } 5585} 5586 5587/* 5588 * XXX reorder combinations by preference 5589 */ 5590static struct mbuf * 5591key_getcomb_ah() 5592{ 5593 INIT_VNET_IPSEC(curvnet); 5594 struct sadb_comb *comb; 5595 struct auth_hash *algo; 5596 struct mbuf *m; 5597 u_int16_t minkeysize, maxkeysize; 5598 int i; 5599 const int l = PFKEY_ALIGN8(sizeof(struct sadb_comb)); 5600 5601 m = NULL; 5602 for (i = 1; i <= SADB_AALG_MAX; i++) { 5603#if 1 5604 /* we prefer HMAC algorithms, not old algorithms */ 5605 if (i != SADB_AALG_SHA1HMAC && i != SADB_AALG_MD5HMAC) 5606 continue; 5607#endif 5608 algo = ah_algorithm_lookup(i); 5609 if (!algo) 5610 continue; 5611 key_getsizes_ah(algo, i, &minkeysize, &maxkeysize); 5612 /* discard algorithms with key size smaller than system min */ 5613 if (_BITS(minkeysize) < V_ipsec_ah_keymin) 5614 continue; 5615 5616 if (!m) { 5617 IPSEC_ASSERT(l <= MLEN, 5618 ("l=%u > MLEN=%lu", l, (u_long) MLEN)); 5619 MGET(m, M_DONTWAIT, MT_DATA); 5620 if (m) { 5621 M_ALIGN(m, l); 5622 m->m_len = l; 5623 m->m_next = NULL; 5624 } 5625 } else 5626 M_PREPEND(m, l, M_DONTWAIT); 5627 if (!m) 5628 return NULL; 5629 5630 comb = mtod(m, struct sadb_comb *); 5631 bzero(comb, sizeof(*comb)); 5632 key_getcomb_setlifetime(comb); 5633 comb->sadb_comb_auth = i; 5634 comb->sadb_comb_auth_minbits = _BITS(minkeysize); 5635 comb->sadb_comb_auth_maxbits = _BITS(maxkeysize); 5636 } 5637 5638 return m; 5639} 5640 5641/* 5642 * not really an official behavior. discussed in pf_key@inner.net in Sep2000. 5643 * XXX reorder combinations by preference 5644 */ 5645static struct mbuf * 5646key_getcomb_ipcomp() 5647{ 5648 struct sadb_comb *comb; 5649 struct comp_algo *algo; 5650 struct mbuf *m; 5651 int i; 5652 const int l = PFKEY_ALIGN8(sizeof(struct sadb_comb)); 5653 5654 m = NULL; 5655 for (i = 1; i <= SADB_X_CALG_MAX; i++) { 5656 algo = ipcomp_algorithm_lookup(i); 5657 if (!algo) 5658 continue; 5659 5660 if (!m) { 5661 IPSEC_ASSERT(l <= MLEN, 5662 ("l=%u > MLEN=%lu", l, (u_long) MLEN)); 5663 MGET(m, M_DONTWAIT, MT_DATA); 5664 if (m) { 5665 M_ALIGN(m, l); 5666 m->m_len = l; 5667 m->m_next = NULL; 5668 } 5669 } else 5670 M_PREPEND(m, l, M_DONTWAIT); 5671 if (!m) 5672 return NULL; 5673 5674 comb = mtod(m, struct sadb_comb *); 5675 bzero(comb, sizeof(*comb)); 5676 key_getcomb_setlifetime(comb); 5677 comb->sadb_comb_encrypt = i; 5678 /* what should we set into sadb_comb_*_{min,max}bits? */ 5679 } 5680 5681 return m; 5682} 5683 5684/* 5685 * XXX no way to pass mode (transport/tunnel) to userland 5686 * XXX replay checking? 5687 * XXX sysctl interface to ipsec_{ah,esp}_keymin 5688 */ 5689static struct mbuf * 5690key_getprop(saidx) 5691 const struct secasindex *saidx; 5692{ 5693 struct sadb_prop *prop; 5694 struct mbuf *m, *n; 5695 const int l = PFKEY_ALIGN8(sizeof(struct sadb_prop)); 5696 int totlen; 5697 5698 switch (saidx->proto) { 5699 case IPPROTO_ESP: 5700 m = key_getcomb_esp(); 5701 break; 5702 case IPPROTO_AH: 5703 m = key_getcomb_ah(); 5704 break; 5705 case IPPROTO_IPCOMP: 5706 m = key_getcomb_ipcomp(); 5707 break; 5708 default: 5709 return NULL; 5710 } 5711 5712 if (!m) 5713 return NULL; 5714 M_PREPEND(m, l, M_DONTWAIT); 5715 if (!m) 5716 return NULL; 5717 5718 totlen = 0; 5719 for (n = m; n; n = n->m_next) 5720 totlen += n->m_len; 5721 5722 prop = mtod(m, struct sadb_prop *); 5723 bzero(prop, sizeof(*prop)); 5724 prop->sadb_prop_len = PFKEY_UNIT64(totlen); 5725 prop->sadb_prop_exttype = SADB_EXT_PROPOSAL; 5726 prop->sadb_prop_replay = 32; /* XXX */ 5727 5728 return m; 5729} 5730 5731/* 5732 * SADB_ACQUIRE processing called by key_checkrequest() and key_acquire2(). 5733 * send 5734 * <base, SA, address(SD), (address(P)), x_policy, 5735 * (identity(SD),) (sensitivity,) proposal> 5736 * to KMD, and expect to receive 5737 * <base> with SADB_ACQUIRE if error occured, 5738 * or 5739 * <base, src address, dst address, (SPI range)> with SADB_GETSPI 5740 * from KMD by PF_KEY. 5741 * 5742 * XXX x_policy is outside of RFC2367 (KAME extension). 5743 * XXX sensitivity is not supported. 5744 * XXX for ipcomp, RFC2367 does not define how to fill in proposal. 5745 * see comment for key_getcomb_ipcomp(). 5746 * 5747 * OUT: 5748 * 0 : succeed 5749 * others: error number 5750 */ 5751static int 5752key_acquire(const struct secasindex *saidx, struct secpolicy *sp) 5753{ 5754 INIT_VNET_IPSEC(curvnet); 5755 struct mbuf *result = NULL, *m; 5756 struct secacq *newacq; 5757 u_int8_t satype; 5758 int error = -1; 5759 u_int32_t seq; 5760 5761 IPSEC_ASSERT(saidx != NULL, ("null saidx")); 5762 satype = key_proto2satype(saidx->proto); 5763 IPSEC_ASSERT(satype != 0, ("null satype, protocol %u", saidx->proto)); 5764 5765 /* 5766 * We never do anything about acquirng SA. There is anather 5767 * solution that kernel blocks to send SADB_ACQUIRE message until 5768 * getting something message from IKEd. In later case, to be 5769 * managed with ACQUIRING list. 5770 */ 5771 /* Get an entry to check whether sending message or not. */ 5772 if ((newacq = key_getacq(saidx)) != NULL) { 5773 if (V_key_blockacq_count < newacq->count) { 5774 /* reset counter and do send message. */ 5775 newacq->count = 0; 5776 } else { 5777 /* increment counter and do nothing. */ 5778 newacq->count++; 5779 return 0; 5780 } 5781 } else { 5782 /* make new entry for blocking to send SADB_ACQUIRE. */ 5783 if ((newacq = key_newacq(saidx)) == NULL) 5784 return ENOBUFS; 5785 } 5786 5787 5788 seq = newacq->seq; 5789 m = key_setsadbmsg(SADB_ACQUIRE, 0, satype, seq, 0, 0); 5790 if (!m) { 5791 error = ENOBUFS; 5792 goto fail; 5793 } 5794 result = m; 5795 5796 /* set sadb_address for saidx's. */ 5797 m = key_setsadbaddr(SADB_EXT_ADDRESS_SRC, 5798 &saidx->src.sa, FULLMASK, IPSEC_ULPROTO_ANY); 5799 if (!m) { 5800 error = ENOBUFS; 5801 goto fail; 5802 } 5803 m_cat(result, m); 5804 5805 m = key_setsadbaddr(SADB_EXT_ADDRESS_DST, 5806 &saidx->dst.sa, FULLMASK, IPSEC_ULPROTO_ANY); 5807 if (!m) { 5808 error = ENOBUFS; 5809 goto fail; 5810 } 5811 m_cat(result, m); 5812 5813 /* XXX proxy address (optional) */ 5814 5815 /* set sadb_x_policy */ 5816 if (sp) { 5817 m = key_setsadbxpolicy(sp->policy, sp->spidx.dir, sp->id); 5818 if (!m) { 5819 error = ENOBUFS; 5820 goto fail; 5821 } 5822 m_cat(result, m); 5823 } 5824 5825 /* XXX identity (optional) */ 5826#if 0 5827 if (idexttype && fqdn) { 5828 /* create identity extension (FQDN) */ 5829 struct sadb_ident *id; 5830 int fqdnlen; 5831 5832 fqdnlen = strlen(fqdn) + 1; /* +1 for terminating-NUL */ 5833 id = (struct sadb_ident *)p; 5834 bzero(id, sizeof(*id) + PFKEY_ALIGN8(fqdnlen)); 5835 id->sadb_ident_len = PFKEY_UNIT64(sizeof(*id) + PFKEY_ALIGN8(fqdnlen)); 5836 id->sadb_ident_exttype = idexttype; 5837 id->sadb_ident_type = SADB_IDENTTYPE_FQDN; 5838 bcopy(fqdn, id + 1, fqdnlen); 5839 p += sizeof(struct sadb_ident) + PFKEY_ALIGN8(fqdnlen); 5840 } 5841 5842 if (idexttype) { 5843 /* create identity extension (USERFQDN) */ 5844 struct sadb_ident *id; 5845 int userfqdnlen; 5846 5847 if (userfqdn) { 5848 /* +1 for terminating-NUL */ 5849 userfqdnlen = strlen(userfqdn) + 1; 5850 } else 5851 userfqdnlen = 0; 5852 id = (struct sadb_ident *)p; 5853 bzero(id, sizeof(*id) + PFKEY_ALIGN8(userfqdnlen)); 5854 id->sadb_ident_len = PFKEY_UNIT64(sizeof(*id) + PFKEY_ALIGN8(userfqdnlen)); 5855 id->sadb_ident_exttype = idexttype; 5856 id->sadb_ident_type = SADB_IDENTTYPE_USERFQDN; 5857 /* XXX is it correct? */ 5858 if (curproc && curproc->p_cred) 5859 id->sadb_ident_id = curproc->p_cred->p_ruid; 5860 if (userfqdn && userfqdnlen) 5861 bcopy(userfqdn, id + 1, userfqdnlen); 5862 p += sizeof(struct sadb_ident) + PFKEY_ALIGN8(userfqdnlen); 5863 } 5864#endif 5865 5866 /* XXX sensitivity (optional) */ 5867 5868 /* create proposal/combination extension */ 5869 m = key_getprop(saidx); 5870#if 0 5871 /* 5872 * spec conformant: always attach proposal/combination extension, 5873 * the problem is that we have no way to attach it for ipcomp, 5874 * due to the way sadb_comb is declared in RFC2367. 5875 */ 5876 if (!m) { 5877 error = ENOBUFS; 5878 goto fail; 5879 } 5880 m_cat(result, m); 5881#else 5882 /* 5883 * outside of spec; make proposal/combination extension optional. 5884 */ 5885 if (m) 5886 m_cat(result, m); 5887#endif 5888 5889 if ((result->m_flags & M_PKTHDR) == 0) { 5890 error = EINVAL; 5891 goto fail; 5892 } 5893 5894 if (result->m_len < sizeof(struct sadb_msg)) { 5895 result = m_pullup(result, sizeof(struct sadb_msg)); 5896 if (result == NULL) { 5897 error = ENOBUFS; 5898 goto fail; 5899 } 5900 } 5901 5902 result->m_pkthdr.len = 0; 5903 for (m = result; m; m = m->m_next) 5904 result->m_pkthdr.len += m->m_len; 5905 5906 mtod(result, struct sadb_msg *)->sadb_msg_len = 5907 PFKEY_UNIT64(result->m_pkthdr.len); 5908 5909 return key_sendup_mbuf(NULL, result, KEY_SENDUP_REGISTERED); 5910 5911 fail: 5912 if (result) 5913 m_freem(result); 5914 return error; 5915} 5916 5917static struct secacq * 5918key_newacq(const struct secasindex *saidx) 5919{ 5920 INIT_VNET_IPSEC(curvnet); 5921 struct secacq *newacq; 5922 5923 /* get new entry */ 5924 newacq = malloc(sizeof(struct secacq), M_IPSEC_SAQ, M_NOWAIT|M_ZERO); 5925 if (newacq == NULL) { 5926 ipseclog((LOG_DEBUG, "%s: No more memory.\n", __func__)); 5927 return NULL; 5928 } 5929 5930 /* copy secindex */ 5931 bcopy(saidx, &newacq->saidx, sizeof(newacq->saidx)); 5932 newacq->seq = (V_acq_seq == ~0 ? 1 : ++V_acq_seq); 5933 newacq->created = time_second; 5934 newacq->count = 0; 5935 5936 /* add to acqtree */ 5937 ACQ_LOCK(); 5938 LIST_INSERT_HEAD(&V_acqtree, newacq, chain); 5939 ACQ_UNLOCK(); 5940 5941 return newacq; 5942} 5943 5944static struct secacq * 5945key_getacq(const struct secasindex *saidx) 5946{ 5947 INIT_VNET_IPSEC(curvnet); 5948 struct secacq *acq; 5949 5950 ACQ_LOCK(); 5951 LIST_FOREACH(acq, &V_acqtree, chain) { 5952 if (key_cmpsaidx(saidx, &acq->saidx, CMP_EXACTLY)) 5953 break; 5954 } 5955 ACQ_UNLOCK(); 5956 5957 return acq; 5958} 5959 5960static struct secacq * 5961key_getacqbyseq(seq) 5962 u_int32_t seq; 5963{ 5964 INIT_VNET_IPSEC(curvnet); 5965 struct secacq *acq; 5966 5967 ACQ_LOCK(); 5968 LIST_FOREACH(acq, &V_acqtree, chain) { 5969 if (acq->seq == seq) 5970 break; 5971 } 5972 ACQ_UNLOCK(); 5973 5974 return acq; 5975} 5976 5977static struct secspacq * 5978key_newspacq(spidx) 5979 struct secpolicyindex *spidx; 5980{ 5981 INIT_VNET_IPSEC(curvnet); 5982 struct secspacq *acq; 5983 5984 /* get new entry */ 5985 acq = malloc(sizeof(struct secspacq), M_IPSEC_SAQ, M_NOWAIT|M_ZERO); 5986 if (acq == NULL) { 5987 ipseclog((LOG_DEBUG, "%s: No more memory.\n", __func__)); 5988 return NULL; 5989 } 5990 5991 /* copy secindex */ 5992 bcopy(spidx, &acq->spidx, sizeof(acq->spidx)); 5993 acq->created = time_second; 5994 acq->count = 0; 5995 5996 /* add to spacqtree */ 5997 SPACQ_LOCK(); 5998 LIST_INSERT_HEAD(&V_spacqtree, acq, chain); 5999 SPACQ_UNLOCK(); 6000 6001 return acq; 6002} 6003 6004static struct secspacq * 6005key_getspacq(spidx) 6006 struct secpolicyindex *spidx; 6007{ 6008 INIT_VNET_IPSEC(curvnet); 6009 struct secspacq *acq; 6010 6011 SPACQ_LOCK(); 6012 LIST_FOREACH(acq, &V_spacqtree, chain) { 6013 if (key_cmpspidx_exactly(spidx, &acq->spidx)) { 6014 /* NB: return holding spacq_lock */ 6015 return acq; 6016 } 6017 } 6018 SPACQ_UNLOCK(); 6019 6020 return NULL; 6021} 6022 6023/* 6024 * SADB_ACQUIRE processing, 6025 * in first situation, is receiving 6026 * <base> 6027 * from the ikmpd, and clear sequence of its secasvar entry. 6028 * 6029 * In second situation, is receiving 6030 * <base, address(SD), (address(P),) (identity(SD),) (sensitivity,) proposal> 6031 * from a user land process, and return 6032 * <base, address(SD), (address(P),) (identity(SD),) (sensitivity,) proposal> 6033 * to the socket. 6034 * 6035 * m will always be freed. 6036 */ 6037static int 6038key_acquire2(so, m, mhp) 6039 struct socket *so; 6040 struct mbuf *m; 6041 const struct sadb_msghdr *mhp; 6042{ 6043 INIT_VNET_IPSEC(curvnet); 6044 const struct sadb_address *src0, *dst0; 6045 struct secasindex saidx; 6046 struct secashead *sah; 6047 u_int16_t proto; 6048 int error; 6049 6050 IPSEC_ASSERT(so != NULL, ("null socket")); 6051 IPSEC_ASSERT(m != NULL, ("null mbuf")); 6052 IPSEC_ASSERT(mhp != NULL, ("null msghdr")); 6053 IPSEC_ASSERT(mhp->msg != NULL, ("null msg")); 6054 6055 /* 6056 * Error message from KMd. 6057 * We assume that if error was occured in IKEd, the length of PFKEY 6058 * message is equal to the size of sadb_msg structure. 6059 * We do not raise error even if error occured in this function. 6060 */ 6061 if (mhp->msg->sadb_msg_len == PFKEY_UNIT64(sizeof(struct sadb_msg))) { 6062 struct secacq *acq; 6063 6064 /* check sequence number */ 6065 if (mhp->msg->sadb_msg_seq == 0) { 6066 ipseclog((LOG_DEBUG, "%s: must specify sequence " 6067 "number.\n", __func__)); 6068 m_freem(m); 6069 return 0; 6070 } 6071 6072 if ((acq = key_getacqbyseq(mhp->msg->sadb_msg_seq)) == NULL) { 6073 /* 6074 * the specified larval SA is already gone, or we got 6075 * a bogus sequence number. we can silently ignore it. 6076 */ 6077 m_freem(m); 6078 return 0; 6079 } 6080 6081 /* reset acq counter in order to deletion by timehander. */ 6082 acq->created = time_second; 6083 acq->count = 0; 6084 m_freem(m); 6085 return 0; 6086 } 6087 6088 /* 6089 * This message is from user land. 6090 */ 6091 6092 /* map satype to proto */ 6093 if ((proto = key_satype2proto(mhp->msg->sadb_msg_satype)) == 0) { 6094 ipseclog((LOG_DEBUG, "%s: invalid satype is passed.\n", 6095 __func__)); 6096 return key_senderror(so, m, EINVAL); 6097 } 6098 6099 if (mhp->ext[SADB_EXT_ADDRESS_SRC] == NULL || 6100 mhp->ext[SADB_EXT_ADDRESS_DST] == NULL || 6101 mhp->ext[SADB_EXT_PROPOSAL] == NULL) { 6102 /* error */ 6103 ipseclog((LOG_DEBUG, "%s: invalid message is passed.\n", 6104 __func__)); 6105 return key_senderror(so, m, EINVAL); 6106 } 6107 if (mhp->extlen[SADB_EXT_ADDRESS_SRC] < sizeof(struct sadb_address) || 6108 mhp->extlen[SADB_EXT_ADDRESS_DST] < sizeof(struct sadb_address) || 6109 mhp->extlen[SADB_EXT_PROPOSAL] < sizeof(struct sadb_prop)) { 6110 /* error */ 6111 ipseclog((LOG_DEBUG, "%s: invalid message is passed.\n", 6112 __func__)); 6113 return key_senderror(so, m, EINVAL); 6114 } 6115 6116 src0 = (struct sadb_address *)mhp->ext[SADB_EXT_ADDRESS_SRC]; 6117 dst0 = (struct sadb_address *)mhp->ext[SADB_EXT_ADDRESS_DST]; 6118 6119 /* XXX boundary check against sa_len */ 6120 KEY_SETSECASIDX(proto, IPSEC_MODE_ANY, 0, src0 + 1, dst0 + 1, &saidx); 6121 6122 /* get a SA index */ 6123 SAHTREE_LOCK(); 6124 LIST_FOREACH(sah, &V_sahtree, chain) { 6125 if (sah->state == SADB_SASTATE_DEAD) 6126 continue; 6127 if (key_cmpsaidx(&sah->saidx, &saidx, CMP_MODE_REQID)) 6128 break; 6129 } 6130 SAHTREE_UNLOCK(); 6131 if (sah != NULL) { 6132 ipseclog((LOG_DEBUG, "%s: a SA exists already.\n", __func__)); 6133 return key_senderror(so, m, EEXIST); 6134 } 6135 6136 error = key_acquire(&saidx, NULL); 6137 if (error != 0) { 6138 ipseclog((LOG_DEBUG, "%s: error %d returned from key_acquire\n", 6139 __func__, mhp->msg->sadb_msg_errno)); 6140 return key_senderror(so, m, error); 6141 } 6142 6143 return key_sendup_mbuf(so, m, KEY_SENDUP_REGISTERED); 6144} 6145 6146/* 6147 * SADB_REGISTER processing. 6148 * If SATYPE_UNSPEC has been passed as satype, only return sabd_supported. 6149 * receive 6150 * <base> 6151 * from the ikmpd, and register a socket to send PF_KEY messages, 6152 * and send 6153 * <base, supported> 6154 * to KMD by PF_KEY. 6155 * If socket is detached, must free from regnode. 6156 * 6157 * m will always be freed. 6158 */ 6159static int 6160key_register(so, m, mhp) 6161 struct socket *so; 6162 struct mbuf *m; 6163 const struct sadb_msghdr *mhp; 6164{ 6165 INIT_VNET_IPSEC(curvnet); 6166 struct secreg *reg, *newreg = 0; 6167 6168 IPSEC_ASSERT(so != NULL, ("null socket")); 6169 IPSEC_ASSERT(m != NULL, ("null mbuf")); 6170 IPSEC_ASSERT(mhp != NULL, ("null msghdr")); 6171 IPSEC_ASSERT(mhp->msg != NULL, ("null msg")); 6172 6173 /* check for invalid register message */ 6174 if (mhp->msg->sadb_msg_satype >= sizeof(V_regtree)/sizeof(V_regtree[0])) 6175 return key_senderror(so, m, EINVAL); 6176 6177 /* When SATYPE_UNSPEC is specified, only return sabd_supported. */ 6178 if (mhp->msg->sadb_msg_satype == SADB_SATYPE_UNSPEC) 6179 goto setmsg; 6180 6181 /* check whether existing or not */ 6182 REGTREE_LOCK(); 6183 LIST_FOREACH(reg, &V_regtree[mhp->msg->sadb_msg_satype], chain) { 6184 if (reg->so == so) { 6185 REGTREE_UNLOCK(); 6186 ipseclog((LOG_DEBUG, "%s: socket exists already.\n", 6187 __func__)); 6188 return key_senderror(so, m, EEXIST); 6189 } 6190 } 6191 6192 /* create regnode */ 6193 newreg = malloc(sizeof(struct secreg), M_IPSEC_SAR, M_NOWAIT|M_ZERO); 6194 if (newreg == NULL) { 6195 REGTREE_UNLOCK(); 6196 ipseclog((LOG_DEBUG, "%s: No more memory.\n", __func__)); 6197 return key_senderror(so, m, ENOBUFS); 6198 } 6199 6200 newreg->so = so; 6201 ((struct keycb *)sotorawcb(so))->kp_registered++; 6202 6203 /* add regnode to regtree. */ 6204 LIST_INSERT_HEAD(&V_regtree[mhp->msg->sadb_msg_satype], newreg, chain); 6205 REGTREE_UNLOCK(); 6206 6207 setmsg: 6208 { 6209 struct mbuf *n; 6210 struct sadb_msg *newmsg; 6211 struct sadb_supported *sup; 6212 u_int len, alen, elen; 6213 int off; 6214 int i; 6215 struct sadb_alg *alg; 6216 6217 /* create new sadb_msg to reply. */ 6218 alen = 0; 6219 for (i = 1; i <= SADB_AALG_MAX; i++) { 6220 if (ah_algorithm_lookup(i)) 6221 alen += sizeof(struct sadb_alg); 6222 } 6223 if (alen) 6224 alen += sizeof(struct sadb_supported); 6225 elen = 0; 6226 for (i = 1; i <= SADB_EALG_MAX; i++) { 6227 if (esp_algorithm_lookup(i)) 6228 elen += sizeof(struct sadb_alg); 6229 } 6230 if (elen) 6231 elen += sizeof(struct sadb_supported); 6232 6233 len = sizeof(struct sadb_msg) + alen + elen; 6234 6235 if (len > MCLBYTES) 6236 return key_senderror(so, m, ENOBUFS); 6237 6238 MGETHDR(n, M_DONTWAIT, MT_DATA); 6239 if (len > MHLEN) { 6240 MCLGET(n, M_DONTWAIT); 6241 if ((n->m_flags & M_EXT) == 0) { 6242 m_freem(n); 6243 n = NULL; 6244 } 6245 } 6246 if (!n) 6247 return key_senderror(so, m, ENOBUFS); 6248 6249 n->m_pkthdr.len = n->m_len = len; 6250 n->m_next = NULL; 6251 off = 0; 6252 6253 m_copydata(m, 0, sizeof(struct sadb_msg), mtod(n, caddr_t) + off); 6254 newmsg = mtod(n, struct sadb_msg *); 6255 newmsg->sadb_msg_errno = 0; 6256 newmsg->sadb_msg_len = PFKEY_UNIT64(len); 6257 off += PFKEY_ALIGN8(sizeof(struct sadb_msg)); 6258 6259 /* for authentication algorithm */ 6260 if (alen) { 6261 sup = (struct sadb_supported *)(mtod(n, caddr_t) + off); 6262 sup->sadb_supported_len = PFKEY_UNIT64(alen); 6263 sup->sadb_supported_exttype = SADB_EXT_SUPPORTED_AUTH; 6264 off += PFKEY_ALIGN8(sizeof(*sup)); 6265 6266 for (i = 1; i <= SADB_AALG_MAX; i++) { 6267 struct auth_hash *aalgo; 6268 u_int16_t minkeysize, maxkeysize; 6269 6270 aalgo = ah_algorithm_lookup(i); 6271 if (!aalgo) 6272 continue; 6273 alg = (struct sadb_alg *)(mtod(n, caddr_t) + off); 6274 alg->sadb_alg_id = i; 6275 alg->sadb_alg_ivlen = 0; 6276 key_getsizes_ah(aalgo, i, &minkeysize, &maxkeysize); 6277 alg->sadb_alg_minbits = _BITS(minkeysize); 6278 alg->sadb_alg_maxbits = _BITS(maxkeysize); 6279 off += PFKEY_ALIGN8(sizeof(*alg)); 6280 } 6281 } 6282 6283 /* for encryption algorithm */ 6284 if (elen) { 6285 sup = (struct sadb_supported *)(mtod(n, caddr_t) + off); 6286 sup->sadb_supported_len = PFKEY_UNIT64(elen); 6287 sup->sadb_supported_exttype = SADB_EXT_SUPPORTED_ENCRYPT; 6288 off += PFKEY_ALIGN8(sizeof(*sup)); 6289 6290 for (i = 1; i <= SADB_EALG_MAX; i++) { 6291 struct enc_xform *ealgo; 6292 6293 ealgo = esp_algorithm_lookup(i); 6294 if (!ealgo) 6295 continue; 6296 alg = (struct sadb_alg *)(mtod(n, caddr_t) + off); 6297 alg->sadb_alg_id = i; 6298 alg->sadb_alg_ivlen = ealgo->blocksize; 6299 alg->sadb_alg_minbits = _BITS(ealgo->minkey); 6300 alg->sadb_alg_maxbits = _BITS(ealgo->maxkey); 6301 off += PFKEY_ALIGN8(sizeof(struct sadb_alg)); 6302 } 6303 } 6304 6305 IPSEC_ASSERT(off == len, 6306 ("length assumption failed (off %u len %u)", off, len)); 6307 6308 m_freem(m); 6309 return key_sendup_mbuf(so, n, KEY_SENDUP_REGISTERED); 6310 } 6311} 6312 6313/* 6314 * free secreg entry registered. 6315 * XXX: I want to do free a socket marked done SADB_RESIGER to socket. 6316 */ 6317void 6318key_freereg(struct socket *so) 6319{ 6320 INIT_VNET_IPSEC(curvnet); 6321 struct secreg *reg; 6322 int i; 6323 6324 IPSEC_ASSERT(so != NULL, ("NULL so")); 6325 6326 /* 6327 * check whether existing or not. 6328 * check all type of SA, because there is a potential that 6329 * one socket is registered to multiple type of SA. 6330 */ 6331 REGTREE_LOCK(); 6332 for (i = 0; i <= SADB_SATYPE_MAX; i++) { 6333 LIST_FOREACH(reg, &V_regtree[i], chain) { 6334 if (reg->so == so && __LIST_CHAINED(reg)) { 6335 LIST_REMOVE(reg, chain); 6336 free(reg, M_IPSEC_SAR); 6337 break; 6338 } 6339 } 6340 } 6341 REGTREE_UNLOCK(); 6342} 6343 6344/* 6345 * SADB_EXPIRE processing 6346 * send 6347 * <base, SA, SA2, lifetime(C and one of HS), address(SD)> 6348 * to KMD by PF_KEY. 6349 * NOTE: We send only soft lifetime extension. 6350 * 6351 * OUT: 0 : succeed 6352 * others : error number 6353 */ 6354static int 6355key_expire(struct secasvar *sav) 6356{ 6357 int s; 6358 int satype; 6359 struct mbuf *result = NULL, *m; 6360 int len; 6361 int error = -1; 6362 struct sadb_lifetime *lt; 6363 6364 /* XXX: Why do we lock ? */ 6365 s = splnet(); /*called from softclock()*/ 6366 6367 IPSEC_ASSERT (sav != NULL, ("null sav")); 6368 IPSEC_ASSERT (sav->sah != NULL, ("null sa header")); 6369 6370 /* set msg header */ 6371 satype = key_proto2satype(sav->sah->saidx.proto); 6372 IPSEC_ASSERT(satype != 0, ("invalid proto, satype %u", satype)); 6373 m = key_setsadbmsg(SADB_EXPIRE, 0, satype, sav->seq, 0, sav->refcnt); 6374 if (!m) { 6375 error = ENOBUFS; 6376 goto fail; 6377 } 6378 result = m; 6379 6380 /* create SA extension */ 6381 m = key_setsadbsa(sav); 6382 if (!m) { 6383 error = ENOBUFS; 6384 goto fail; 6385 } 6386 m_cat(result, m); 6387 6388 /* create SA extension */ 6389 m = key_setsadbxsa2(sav->sah->saidx.mode, 6390 sav->replay ? sav->replay->count : 0, 6391 sav->sah->saidx.reqid); 6392 if (!m) { 6393 error = ENOBUFS; 6394 goto fail; 6395 } 6396 m_cat(result, m); 6397 6398 /* create lifetime extension (current and soft) */ 6399 len = PFKEY_ALIGN8(sizeof(*lt)) * 2; 6400 m = key_alloc_mbuf(len); 6401 if (!m || m->m_next) { /*XXX*/ 6402 if (m) 6403 m_freem(m); 6404 error = ENOBUFS; 6405 goto fail; 6406 } 6407 bzero(mtod(m, caddr_t), len); 6408 lt = mtod(m, struct sadb_lifetime *); 6409 lt->sadb_lifetime_len = PFKEY_UNIT64(sizeof(struct sadb_lifetime)); 6410 lt->sadb_lifetime_exttype = SADB_EXT_LIFETIME_CURRENT; 6411 lt->sadb_lifetime_allocations = sav->lft_c->allocations; 6412 lt->sadb_lifetime_bytes = sav->lft_c->bytes; 6413 lt->sadb_lifetime_addtime = sav->lft_c->addtime; 6414 lt->sadb_lifetime_usetime = sav->lft_c->usetime; 6415 lt = (struct sadb_lifetime *)(mtod(m, caddr_t) + len / 2); 6416 lt->sadb_lifetime_len = PFKEY_UNIT64(sizeof(struct sadb_lifetime)); 6417 lt->sadb_lifetime_exttype = SADB_EXT_LIFETIME_SOFT; 6418 lt->sadb_lifetime_allocations = sav->lft_s->allocations; 6419 lt->sadb_lifetime_bytes = sav->lft_s->bytes; 6420 lt->sadb_lifetime_addtime = sav->lft_s->addtime; 6421 lt->sadb_lifetime_usetime = sav->lft_s->usetime; 6422 m_cat(result, m); 6423 6424 /* set sadb_address for source */ 6425 m = key_setsadbaddr(SADB_EXT_ADDRESS_SRC, 6426 &sav->sah->saidx.src.sa, 6427 FULLMASK, IPSEC_ULPROTO_ANY); 6428 if (!m) { 6429 error = ENOBUFS; 6430 goto fail; 6431 } 6432 m_cat(result, m); 6433 6434 /* set sadb_address for destination */ 6435 m = key_setsadbaddr(SADB_EXT_ADDRESS_DST, 6436 &sav->sah->saidx.dst.sa, 6437 FULLMASK, IPSEC_ULPROTO_ANY); 6438 if (!m) { 6439 error = ENOBUFS; 6440 goto fail; 6441 } 6442 m_cat(result, m); 6443 6444 if ((result->m_flags & M_PKTHDR) == 0) { 6445 error = EINVAL; 6446 goto fail; 6447 } 6448 6449 if (result->m_len < sizeof(struct sadb_msg)) { 6450 result = m_pullup(result, sizeof(struct sadb_msg)); 6451 if (result == NULL) { 6452 error = ENOBUFS; 6453 goto fail; 6454 } 6455 } 6456 6457 result->m_pkthdr.len = 0; 6458 for (m = result; m; m = m->m_next) 6459 result->m_pkthdr.len += m->m_len; 6460 6461 mtod(result, struct sadb_msg *)->sadb_msg_len = 6462 PFKEY_UNIT64(result->m_pkthdr.len); 6463 6464 splx(s); 6465 return key_sendup_mbuf(NULL, result, KEY_SENDUP_REGISTERED); 6466 6467 fail: 6468 if (result) 6469 m_freem(result); 6470 splx(s); 6471 return error; 6472} 6473 6474/* 6475 * SADB_FLUSH processing 6476 * receive 6477 * <base> 6478 * from the ikmpd, and free all entries in secastree. 6479 * and send, 6480 * <base> 6481 * to the ikmpd. 6482 * NOTE: to do is only marking SADB_SASTATE_DEAD. 6483 * 6484 * m will always be freed. 6485 */ 6486static int 6487key_flush(so, m, mhp) 6488 struct socket *so; 6489 struct mbuf *m; 6490 const struct sadb_msghdr *mhp; 6491{ 6492 INIT_VNET_IPSEC(curvnet); 6493 struct sadb_msg *newmsg; 6494 struct secashead *sah, *nextsah; 6495 struct secasvar *sav, *nextsav; 6496 u_int16_t proto; 6497 u_int8_t state; 6498 u_int stateidx; 6499 6500 IPSEC_ASSERT(so != NULL, ("null socket")); 6501 IPSEC_ASSERT(mhp != NULL, ("null msghdr")); 6502 IPSEC_ASSERT(mhp->msg != NULL, ("null msg")); 6503 6504 /* map satype to proto */ 6505 if ((proto = key_satype2proto(mhp->msg->sadb_msg_satype)) == 0) { 6506 ipseclog((LOG_DEBUG, "%s: invalid satype is passed.\n", 6507 __func__)); 6508 return key_senderror(so, m, EINVAL); 6509 } 6510 6511 /* no SATYPE specified, i.e. flushing all SA. */ 6512 SAHTREE_LOCK(); 6513 for (sah = LIST_FIRST(&V_sahtree); 6514 sah != NULL; 6515 sah = nextsah) { 6516 nextsah = LIST_NEXT(sah, chain); 6517 6518 if (mhp->msg->sadb_msg_satype != SADB_SATYPE_UNSPEC 6519 && proto != sah->saidx.proto) 6520 continue; 6521 6522 for (stateidx = 0; 6523 stateidx < _ARRAYLEN(saorder_state_alive); 6524 stateidx++) { 6525 state = saorder_state_any[stateidx]; 6526 for (sav = LIST_FIRST(&sah->savtree[state]); 6527 sav != NULL; 6528 sav = nextsav) { 6529 6530 nextsav = LIST_NEXT(sav, chain); 6531 6532 key_sa_chgstate(sav, SADB_SASTATE_DEAD); 6533 KEY_FREESAV(&sav); 6534 } 6535 } 6536 6537 sah->state = SADB_SASTATE_DEAD; 6538 } 6539 SAHTREE_UNLOCK(); 6540 6541 if (m->m_len < sizeof(struct sadb_msg) || 6542 sizeof(struct sadb_msg) > m->m_len + M_TRAILINGSPACE(m)) { 6543 ipseclog((LOG_DEBUG, "%s: No more memory.\n", __func__)); 6544 return key_senderror(so, m, ENOBUFS); 6545 } 6546 6547 if (m->m_next) 6548 m_freem(m->m_next); 6549 m->m_next = NULL; 6550 m->m_pkthdr.len = m->m_len = sizeof(struct sadb_msg); 6551 newmsg = mtod(m, struct sadb_msg *); 6552 newmsg->sadb_msg_errno = 0; 6553 newmsg->sadb_msg_len = PFKEY_UNIT64(m->m_pkthdr.len); 6554 6555 return key_sendup_mbuf(so, m, KEY_SENDUP_ALL); 6556} 6557 6558/* 6559 * SADB_DUMP processing 6560 * dump all entries including status of DEAD in SAD. 6561 * receive 6562 * <base> 6563 * from the ikmpd, and dump all secasvar leaves 6564 * and send, 6565 * <base> ..... 6566 * to the ikmpd. 6567 * 6568 * m will always be freed. 6569 */ 6570static int 6571key_dump(so, m, mhp) 6572 struct socket *so; 6573 struct mbuf *m; 6574 const struct sadb_msghdr *mhp; 6575{ 6576 INIT_VNET_IPSEC(curvnet); 6577 struct secashead *sah; 6578 struct secasvar *sav; 6579 u_int16_t proto; 6580 u_int stateidx; 6581 u_int8_t satype; 6582 u_int8_t state; 6583 int cnt; 6584 struct sadb_msg *newmsg; 6585 struct mbuf *n; 6586 6587 IPSEC_ASSERT(so != NULL, ("null socket")); 6588 IPSEC_ASSERT(m != NULL, ("null mbuf")); 6589 IPSEC_ASSERT(mhp != NULL, ("null msghdr")); 6590 IPSEC_ASSERT(mhp->msg != NULL, ("null msg")); 6591 6592 /* map satype to proto */ 6593 if ((proto = key_satype2proto(mhp->msg->sadb_msg_satype)) == 0) { 6594 ipseclog((LOG_DEBUG, "%s: invalid satype is passed.\n", 6595 __func__)); 6596 return key_senderror(so, m, EINVAL); 6597 } 6598 6599 /* count sav entries to be sent to the userland. */ 6600 cnt = 0; 6601 SAHTREE_LOCK(); 6602 LIST_FOREACH(sah, &V_sahtree, chain) { 6603 if (mhp->msg->sadb_msg_satype != SADB_SATYPE_UNSPEC 6604 && proto != sah->saidx.proto) 6605 continue; 6606 6607 for (stateidx = 0; 6608 stateidx < _ARRAYLEN(saorder_state_any); 6609 stateidx++) { 6610 state = saorder_state_any[stateidx]; 6611 LIST_FOREACH(sav, &sah->savtree[state], chain) { 6612 cnt++; 6613 } 6614 } 6615 } 6616 6617 if (cnt == 0) { 6618 SAHTREE_UNLOCK(); 6619 return key_senderror(so, m, ENOENT); 6620 } 6621 6622 /* send this to the userland, one at a time. */ 6623 newmsg = NULL; 6624 LIST_FOREACH(sah, &V_sahtree, chain) { 6625 if (mhp->msg->sadb_msg_satype != SADB_SATYPE_UNSPEC 6626 && proto != sah->saidx.proto) 6627 continue; 6628 6629 /* map proto to satype */ 6630 if ((satype = key_proto2satype(sah->saidx.proto)) == 0) { 6631 SAHTREE_UNLOCK(); 6632 ipseclog((LOG_DEBUG, "%s: there was invalid proto in " 6633 "SAD.\n", __func__)); 6634 return key_senderror(so, m, EINVAL); 6635 } 6636 6637 for (stateidx = 0; 6638 stateidx < _ARRAYLEN(saorder_state_any); 6639 stateidx++) { 6640 state = saorder_state_any[stateidx]; 6641 LIST_FOREACH(sav, &sah->savtree[state], chain) { 6642 n = key_setdumpsa(sav, SADB_DUMP, satype, 6643 --cnt, mhp->msg->sadb_msg_pid); 6644 if (!n) { 6645 SAHTREE_UNLOCK(); 6646 return key_senderror(so, m, ENOBUFS); 6647 } 6648 key_sendup_mbuf(so, n, KEY_SENDUP_ONE); 6649 } 6650 } 6651 } 6652 SAHTREE_UNLOCK(); 6653 6654 m_freem(m); 6655 return 0; 6656} 6657 6658/* 6659 * SADB_X_PROMISC processing 6660 * 6661 * m will always be freed. 6662 */ 6663static int 6664key_promisc(so, m, mhp) 6665 struct socket *so; 6666 struct mbuf *m; 6667 const struct sadb_msghdr *mhp; 6668{ 6669 int olen; 6670 6671 IPSEC_ASSERT(so != NULL, ("null socket")); 6672 IPSEC_ASSERT(m != NULL, ("null mbuf")); 6673 IPSEC_ASSERT(mhp != NULL, ("null msghdr")); 6674 IPSEC_ASSERT(mhp->msg != NULL, ("null msg")); 6675 6676 olen = PFKEY_UNUNIT64(mhp->msg->sadb_msg_len); 6677 6678 if (olen < sizeof(struct sadb_msg)) { 6679#if 1 6680 return key_senderror(so, m, EINVAL); 6681#else 6682 m_freem(m); 6683 return 0; 6684#endif 6685 } else if (olen == sizeof(struct sadb_msg)) { 6686 /* enable/disable promisc mode */ 6687 struct keycb *kp; 6688 6689 if ((kp = (struct keycb *)sotorawcb(so)) == NULL) 6690 return key_senderror(so, m, EINVAL); 6691 mhp->msg->sadb_msg_errno = 0; 6692 switch (mhp->msg->sadb_msg_satype) { 6693 case 0: 6694 case 1: 6695 kp->kp_promisc = mhp->msg->sadb_msg_satype; 6696 break; 6697 default: 6698 return key_senderror(so, m, EINVAL); 6699 } 6700 6701 /* send the original message back to everyone */ 6702 mhp->msg->sadb_msg_errno = 0; 6703 return key_sendup_mbuf(so, m, KEY_SENDUP_ALL); 6704 } else { 6705 /* send packet as is */ 6706 6707 m_adj(m, PFKEY_ALIGN8(sizeof(struct sadb_msg))); 6708 6709 /* TODO: if sadb_msg_seq is specified, send to specific pid */ 6710 return key_sendup_mbuf(so, m, KEY_SENDUP_ALL); 6711 } 6712} 6713 6714static int (*key_typesw[]) __P((struct socket *, struct mbuf *, 6715 const struct sadb_msghdr *)) = { 6716 NULL, /* SADB_RESERVED */ 6717 key_getspi, /* SADB_GETSPI */ 6718 key_update, /* SADB_UPDATE */ 6719 key_add, /* SADB_ADD */ 6720 key_delete, /* SADB_DELETE */ 6721 key_get, /* SADB_GET */ 6722 key_acquire2, /* SADB_ACQUIRE */ 6723 key_register, /* SADB_REGISTER */ 6724 NULL, /* SADB_EXPIRE */ 6725 key_flush, /* SADB_FLUSH */ 6726 key_dump, /* SADB_DUMP */ 6727 key_promisc, /* SADB_X_PROMISC */ 6728 NULL, /* SADB_X_PCHANGE */ 6729 key_spdadd, /* SADB_X_SPDUPDATE */ 6730 key_spdadd, /* SADB_X_SPDADD */ 6731 key_spddelete, /* SADB_X_SPDDELETE */ 6732 key_spdget, /* SADB_X_SPDGET */ 6733 NULL, /* SADB_X_SPDACQUIRE */ 6734 key_spddump, /* SADB_X_SPDDUMP */ 6735 key_spdflush, /* SADB_X_SPDFLUSH */ 6736 key_spdadd, /* SADB_X_SPDSETIDX */ 6737 NULL, /* SADB_X_SPDEXPIRE */ 6738 key_spddelete2, /* SADB_X_SPDDELETE2 */ 6739}; 6740 6741/* 6742 * parse sadb_msg buffer to process PFKEYv2, 6743 * and create a data to response if needed. 6744 * I think to be dealed with mbuf directly. 6745 * IN: 6746 * msgp : pointer to pointer to a received buffer pulluped. 6747 * This is rewrited to response. 6748 * so : pointer to socket. 6749 * OUT: 6750 * length for buffer to send to user process. 6751 */ 6752int 6753key_parse(m, so) 6754 struct mbuf *m; 6755 struct socket *so; 6756{ 6757 INIT_VNET_IPSEC(curvnet); 6758 struct sadb_msg *msg; 6759 struct sadb_msghdr mh; 6760 u_int orglen; 6761 int error; 6762 int target; 6763 6764 IPSEC_ASSERT(so != NULL, ("null socket")); 6765 IPSEC_ASSERT(m != NULL, ("null mbuf")); 6766 6767#if 0 /*kdebug_sadb assumes msg in linear buffer*/ 6768 KEYDEBUG(KEYDEBUG_KEY_DUMP, 6769 ipseclog((LOG_DEBUG, "%s: passed sadb_msg\n", __func__)); 6770 kdebug_sadb(msg)); 6771#endif 6772 6773 if (m->m_len < sizeof(struct sadb_msg)) { 6774 m = m_pullup(m, sizeof(struct sadb_msg)); 6775 if (!m) 6776 return ENOBUFS; 6777 } 6778 msg = mtod(m, struct sadb_msg *); 6779 orglen = PFKEY_UNUNIT64(msg->sadb_msg_len); 6780 target = KEY_SENDUP_ONE; 6781 6782 if ((m->m_flags & M_PKTHDR) == 0 || 6783 m->m_pkthdr.len != m->m_pkthdr.len) { 6784 ipseclog((LOG_DEBUG, "%s: invalid message length.\n",__func__)); 6785 V_pfkeystat.out_invlen++; 6786 error = EINVAL; 6787 goto senderror; 6788 } 6789 6790 if (msg->sadb_msg_version != PF_KEY_V2) { 6791 ipseclog((LOG_DEBUG, "%s: PF_KEY version %u is mismatched.\n", 6792 __func__, msg->sadb_msg_version)); 6793 V_pfkeystat.out_invver++; 6794 error = EINVAL; 6795 goto senderror; 6796 } 6797 6798 if (msg->sadb_msg_type > SADB_MAX) { 6799 ipseclog((LOG_DEBUG, "%s: invalid type %u is passed.\n", 6800 __func__, msg->sadb_msg_type)); 6801 V_pfkeystat.out_invmsgtype++; 6802 error = EINVAL; 6803 goto senderror; 6804 } 6805 6806 /* for old-fashioned code - should be nuked */ 6807 if (m->m_pkthdr.len > MCLBYTES) { 6808 m_freem(m); 6809 return ENOBUFS; 6810 } 6811 if (m->m_next) { 6812 struct mbuf *n; 6813 6814 MGETHDR(n, M_DONTWAIT, MT_DATA); 6815 if (n && m->m_pkthdr.len > MHLEN) { 6816 MCLGET(n, M_DONTWAIT); 6817 if ((n->m_flags & M_EXT) == 0) { 6818 m_free(n); 6819 n = NULL; 6820 } 6821 } 6822 if (!n) { 6823 m_freem(m); 6824 return ENOBUFS; 6825 } 6826 m_copydata(m, 0, m->m_pkthdr.len, mtod(n, caddr_t)); 6827 n->m_pkthdr.len = n->m_len = m->m_pkthdr.len; 6828 n->m_next = NULL; 6829 m_freem(m); 6830 m = n; 6831 } 6832 6833 /* align the mbuf chain so that extensions are in contiguous region. */ 6834 error = key_align(m, &mh); 6835 if (error) 6836 return error; 6837 6838 msg = mh.msg; 6839 6840 /* check SA type */ 6841 switch (msg->sadb_msg_satype) { 6842 case SADB_SATYPE_UNSPEC: 6843 switch (msg->sadb_msg_type) { 6844 case SADB_GETSPI: 6845 case SADB_UPDATE: 6846 case SADB_ADD: 6847 case SADB_DELETE: 6848 case SADB_GET: 6849 case SADB_ACQUIRE: 6850 case SADB_EXPIRE: 6851 ipseclog((LOG_DEBUG, "%s: must specify satype " 6852 "when msg type=%u.\n", __func__, 6853 msg->sadb_msg_type)); 6854 V_pfkeystat.out_invsatype++; 6855 error = EINVAL; 6856 goto senderror; 6857 } 6858 break; 6859 case SADB_SATYPE_AH: 6860 case SADB_SATYPE_ESP: 6861 case SADB_X_SATYPE_IPCOMP: 6862 case SADB_X_SATYPE_TCPSIGNATURE: 6863 switch (msg->sadb_msg_type) { 6864 case SADB_X_SPDADD: 6865 case SADB_X_SPDDELETE: 6866 case SADB_X_SPDGET: 6867 case SADB_X_SPDDUMP: 6868 case SADB_X_SPDFLUSH: 6869 case SADB_X_SPDSETIDX: 6870 case SADB_X_SPDUPDATE: 6871 case SADB_X_SPDDELETE2: 6872 ipseclog((LOG_DEBUG, "%s: illegal satype=%u\n", 6873 __func__, msg->sadb_msg_type)); 6874 V_pfkeystat.out_invsatype++; 6875 error = EINVAL; 6876 goto senderror; 6877 } 6878 break; 6879 case SADB_SATYPE_RSVP: 6880 case SADB_SATYPE_OSPFV2: 6881 case SADB_SATYPE_RIPV2: 6882 case SADB_SATYPE_MIP: 6883 ipseclog((LOG_DEBUG, "%s: type %u isn't supported.\n", 6884 __func__, msg->sadb_msg_satype)); 6885 V_pfkeystat.out_invsatype++; 6886 error = EOPNOTSUPP; 6887 goto senderror; 6888 case 1: /* XXX: What does it do? */ 6889 if (msg->sadb_msg_type == SADB_X_PROMISC) 6890 break; 6891 /*FALLTHROUGH*/ 6892 default: 6893 ipseclog((LOG_DEBUG, "%s: invalid type %u is passed.\n", 6894 __func__, msg->sadb_msg_satype)); 6895 V_pfkeystat.out_invsatype++; 6896 error = EINVAL; 6897 goto senderror; 6898 } 6899 6900 /* check field of upper layer protocol and address family */ 6901 if (mh.ext[SADB_EXT_ADDRESS_SRC] != NULL 6902 && mh.ext[SADB_EXT_ADDRESS_DST] != NULL) { 6903 struct sadb_address *src0, *dst0; 6904 u_int plen; 6905 6906 src0 = (struct sadb_address *)(mh.ext[SADB_EXT_ADDRESS_SRC]); 6907 dst0 = (struct sadb_address *)(mh.ext[SADB_EXT_ADDRESS_DST]); 6908 6909 /* check upper layer protocol */ 6910 if (src0->sadb_address_proto != dst0->sadb_address_proto) { 6911 ipseclog((LOG_DEBUG, "%s: upper layer protocol " 6912 "mismatched.\n", __func__)); 6913 V_pfkeystat.out_invaddr++; 6914 error = EINVAL; 6915 goto senderror; 6916 } 6917 6918 /* check family */ 6919 if (PFKEY_ADDR_SADDR(src0)->sa_family != 6920 PFKEY_ADDR_SADDR(dst0)->sa_family) { 6921 ipseclog((LOG_DEBUG, "%s: address family mismatched.\n", 6922 __func__)); 6923 V_pfkeystat.out_invaddr++; 6924 error = EINVAL; 6925 goto senderror; 6926 } 6927 if (PFKEY_ADDR_SADDR(src0)->sa_len != 6928 PFKEY_ADDR_SADDR(dst0)->sa_len) { 6929 ipseclog((LOG_DEBUG, "%s: address struct size " 6930 "mismatched.\n", __func__)); 6931 V_pfkeystat.out_invaddr++; 6932 error = EINVAL; 6933 goto senderror; 6934 } 6935 6936 switch (PFKEY_ADDR_SADDR(src0)->sa_family) { 6937 case AF_INET: 6938 if (PFKEY_ADDR_SADDR(src0)->sa_len != 6939 sizeof(struct sockaddr_in)) { 6940 V_pfkeystat.out_invaddr++; 6941 error = EINVAL; 6942 goto senderror; 6943 } 6944 break; 6945 case AF_INET6: 6946 if (PFKEY_ADDR_SADDR(src0)->sa_len != 6947 sizeof(struct sockaddr_in6)) { 6948 V_pfkeystat.out_invaddr++; 6949 error = EINVAL; 6950 goto senderror; 6951 } 6952 break; 6953 default: 6954 ipseclog((LOG_DEBUG, "%s: unsupported address family\n", 6955 __func__)); 6956 V_pfkeystat.out_invaddr++; 6957 error = EAFNOSUPPORT; 6958 goto senderror; 6959 } 6960 6961 switch (PFKEY_ADDR_SADDR(src0)->sa_family) { 6962 case AF_INET: 6963 plen = sizeof(struct in_addr) << 3; 6964 break; 6965 case AF_INET6: 6966 plen = sizeof(struct in6_addr) << 3; 6967 break; 6968 default: 6969 plen = 0; /*fool gcc*/ 6970 break; 6971 } 6972 6973 /* check max prefix length */ 6974 if (src0->sadb_address_prefixlen > plen || 6975 dst0->sadb_address_prefixlen > plen) { 6976 ipseclog((LOG_DEBUG, "%s: illegal prefixlen.\n", 6977 __func__)); 6978 V_pfkeystat.out_invaddr++; 6979 error = EINVAL; 6980 goto senderror; 6981 } 6982 6983 /* 6984 * prefixlen == 0 is valid because there can be a case when 6985 * all addresses are matched. 6986 */ 6987 } 6988 6989 if (msg->sadb_msg_type >= sizeof(key_typesw)/sizeof(key_typesw[0]) || 6990 key_typesw[msg->sadb_msg_type] == NULL) { 6991 V_pfkeystat.out_invmsgtype++; 6992 error = EINVAL; 6993 goto senderror; 6994 } 6995 6996 return (*key_typesw[msg->sadb_msg_type])(so, m, &mh); 6997 6998senderror: 6999 msg->sadb_msg_errno = error; 7000 return key_sendup_mbuf(so, m, target); 7001} 7002 7003static int 7004key_senderror(so, m, code) 7005 struct socket *so; 7006 struct mbuf *m; 7007 int code; 7008{ 7009 struct sadb_msg *msg; 7010 7011 IPSEC_ASSERT(m->m_len >= sizeof(struct sadb_msg), 7012 ("mbuf too small, len %u", m->m_len)); 7013 7014 msg = mtod(m, struct sadb_msg *); 7015 msg->sadb_msg_errno = code; 7016 return key_sendup_mbuf(so, m, KEY_SENDUP_ONE); 7017} 7018 7019/* 7020 * set the pointer to each header into message buffer. 7021 * m will be freed on error. 7022 * XXX larger-than-MCLBYTES extension? 7023 */ 7024static int 7025key_align(m, mhp) 7026 struct mbuf *m; 7027 struct sadb_msghdr *mhp; 7028{ 7029 INIT_VNET_IPSEC(curvnet); 7030 struct mbuf *n; 7031 struct sadb_ext *ext; 7032 size_t off, end; 7033 int extlen; 7034 int toff; 7035 7036 IPSEC_ASSERT(m != NULL, ("null mbuf")); 7037 IPSEC_ASSERT(mhp != NULL, ("null msghdr")); 7038 IPSEC_ASSERT(m->m_len >= sizeof(struct sadb_msg), 7039 ("mbuf too small, len %u", m->m_len)); 7040 7041 /* initialize */ 7042 bzero(mhp, sizeof(*mhp)); 7043 7044 mhp->msg = mtod(m, struct sadb_msg *); 7045 mhp->ext[0] = (struct sadb_ext *)mhp->msg; /*XXX backward compat */ 7046 7047 end = PFKEY_UNUNIT64(mhp->msg->sadb_msg_len); 7048 extlen = end; /*just in case extlen is not updated*/ 7049 for (off = sizeof(struct sadb_msg); off < end; off += extlen) { 7050 n = m_pulldown(m, off, sizeof(struct sadb_ext), &toff); 7051 if (!n) { 7052 /* m is already freed */ 7053 return ENOBUFS; 7054 } 7055 ext = (struct sadb_ext *)(mtod(n, caddr_t) + toff); 7056 7057 /* set pointer */ 7058 switch (ext->sadb_ext_type) { 7059 case SADB_EXT_SA: 7060 case SADB_EXT_ADDRESS_SRC: 7061 case SADB_EXT_ADDRESS_DST: 7062 case SADB_EXT_ADDRESS_PROXY: 7063 case SADB_EXT_LIFETIME_CURRENT: 7064 case SADB_EXT_LIFETIME_HARD: 7065 case SADB_EXT_LIFETIME_SOFT: 7066 case SADB_EXT_KEY_AUTH: 7067 case SADB_EXT_KEY_ENCRYPT: 7068 case SADB_EXT_IDENTITY_SRC: 7069 case SADB_EXT_IDENTITY_DST: 7070 case SADB_EXT_SENSITIVITY: 7071 case SADB_EXT_PROPOSAL: 7072 case SADB_EXT_SUPPORTED_AUTH: 7073 case SADB_EXT_SUPPORTED_ENCRYPT: 7074 case SADB_EXT_SPIRANGE: 7075 case SADB_X_EXT_POLICY: 7076 case SADB_X_EXT_SA2: 7077 /* duplicate check */ 7078 /* 7079 * XXX Are there duplication payloads of either 7080 * KEY_AUTH or KEY_ENCRYPT ? 7081 */ 7082 if (mhp->ext[ext->sadb_ext_type] != NULL) { 7083 ipseclog((LOG_DEBUG, "%s: duplicate ext_type " 7084 "%u\n", __func__, ext->sadb_ext_type)); 7085 m_freem(m); 7086 V_pfkeystat.out_dupext++; 7087 return EINVAL; 7088 } 7089 break; 7090 default: 7091 ipseclog((LOG_DEBUG, "%s: invalid ext_type %u\n", 7092 __func__, ext->sadb_ext_type)); 7093 m_freem(m); 7094 V_pfkeystat.out_invexttype++; 7095 return EINVAL; 7096 } 7097 7098 extlen = PFKEY_UNUNIT64(ext->sadb_ext_len); 7099 7100 if (key_validate_ext(ext, extlen)) { 7101 m_freem(m); 7102 V_pfkeystat.out_invlen++; 7103 return EINVAL; 7104 } 7105 7106 n = m_pulldown(m, off, extlen, &toff); 7107 if (!n) { 7108 /* m is already freed */ 7109 return ENOBUFS; 7110 } 7111 ext = (struct sadb_ext *)(mtod(n, caddr_t) + toff); 7112 7113 mhp->ext[ext->sadb_ext_type] = ext; 7114 mhp->extoff[ext->sadb_ext_type] = off; 7115 mhp->extlen[ext->sadb_ext_type] = extlen; 7116 } 7117 7118 if (off != end) { 7119 m_freem(m); 7120 V_pfkeystat.out_invlen++; 7121 return EINVAL; 7122 } 7123 7124 return 0; 7125} 7126 7127static int 7128key_validate_ext(ext, len) 7129 const struct sadb_ext *ext; 7130 int len; 7131{ 7132 const struct sockaddr *sa; 7133 enum { NONE, ADDR } checktype = NONE; 7134 int baselen = 0; 7135 const int sal = offsetof(struct sockaddr, sa_len) + sizeof(sa->sa_len); 7136 7137 if (len != PFKEY_UNUNIT64(ext->sadb_ext_len)) 7138 return EINVAL; 7139 7140 /* if it does not match minimum/maximum length, bail */ 7141 if (ext->sadb_ext_type >= sizeof(minsize) / sizeof(minsize[0]) || 7142 ext->sadb_ext_type >= sizeof(maxsize) / sizeof(maxsize[0])) 7143 return EINVAL; 7144 if (!minsize[ext->sadb_ext_type] || len < minsize[ext->sadb_ext_type]) 7145 return EINVAL; 7146 if (maxsize[ext->sadb_ext_type] && len > maxsize[ext->sadb_ext_type]) 7147 return EINVAL; 7148 7149 /* more checks based on sadb_ext_type XXX need more */ 7150 switch (ext->sadb_ext_type) { 7151 case SADB_EXT_ADDRESS_SRC: 7152 case SADB_EXT_ADDRESS_DST: 7153 case SADB_EXT_ADDRESS_PROXY: 7154 baselen = PFKEY_ALIGN8(sizeof(struct sadb_address)); 7155 checktype = ADDR; 7156 break; 7157 case SADB_EXT_IDENTITY_SRC: 7158 case SADB_EXT_IDENTITY_DST: 7159 if (((const struct sadb_ident *)ext)->sadb_ident_type == 7160 SADB_X_IDENTTYPE_ADDR) { 7161 baselen = PFKEY_ALIGN8(sizeof(struct sadb_ident)); 7162 checktype = ADDR; 7163 } else 7164 checktype = NONE; 7165 break; 7166 default: 7167 checktype = NONE; 7168 break; 7169 } 7170 7171 switch (checktype) { 7172 case NONE: 7173 break; 7174 case ADDR: 7175 sa = (const struct sockaddr *)(((const u_int8_t*)ext)+baselen); 7176 if (len < baselen + sal) 7177 return EINVAL; 7178 if (baselen + PFKEY_ALIGN8(sa->sa_len) != len) 7179 return EINVAL; 7180 break; 7181 } 7182 7183 return 0; 7184} 7185 7186void 7187key_init(void) 7188{ 7189 INIT_VNET_IPSEC(curvnet); 7190 int i; 7191 7192 V_key_debug_level = 0; 7193 V_key_spi_trycnt = 1000; 7194 V_key_spi_minval = 0x100; 7195 V_key_spi_maxval = 0x0fffffff; /* XXX */ 7196 V_policy_id = 0; 7197 V_key_int_random = 60; /*interval to initialize randseed,1(m)*/ 7198 V_key_larval_lifetime = 30; /* interval to expire acquiring, 30(s)*/ 7199 V_key_blockacq_count = 10; /* counter for blocking SADB_ACQUIRE.*/ 7200 V_key_blockacq_lifetime = 20; /* lifetime for blocking SADB_ACQUIRE.*/ 7201 V_key_preferred_oldsa = 1; /* preferred old sa rather than new sa*/ 7202 7203 V_acq_seq = 0; 7204 7205 V_ipsec_esp_keymin = 256; 7206 V_ipsec_esp_auth = 0; 7207 V_ipsec_ah_keymin = 128; 7208 7209 SPTREE_LOCK_INIT(); 7210 REGTREE_LOCK_INIT(); 7211 SAHTREE_LOCK_INIT(); 7212 ACQ_LOCK_INIT(); 7213 SPACQ_LOCK_INIT(); 7214 7215 for (i = 0; i < IPSEC_DIR_MAX; i++) 7216 LIST_INIT(&V_sptree[i]); 7217 7218 LIST_INIT(&V_sahtree); 7219 7220 for (i = 0; i <= SADB_SATYPE_MAX; i++) 7221 LIST_INIT(&V_regtree[i]); 7222 7223 LIST_INIT(&V_acqtree); 7224 LIST_INIT(&V_spacqtree); 7225 7226 /* system default */ 7227 V_ip4_def_policy.policy = IPSEC_POLICY_NONE; 7228 V_ip4_def_policy.refcnt++; /*never reclaim this*/ 7229 7230#ifndef IPSEC_DEBUG2 7231 timeout((void *)key_timehandler, (void *)0, hz); 7232#endif /*IPSEC_DEBUG2*/ 7233 7234 /* initialize key statistics */ 7235 keystat.getspi_count = 1; 7236 7237 printf("IPsec: Initialized Security Association Processing.\n"); 7238 7239 return; 7240} 7241 7242/* 7243 * XXX: maybe This function is called after INBOUND IPsec processing. 7244 * 7245 * Special check for tunnel-mode packets. 7246 * We must make some checks for consistency between inner and outer IP header. 7247 * 7248 * xxx more checks to be provided 7249 */ 7250int 7251key_checktunnelsanity(sav, family, src, dst) 7252 struct secasvar *sav; 7253 u_int family; 7254 caddr_t src; 7255 caddr_t dst; 7256{ 7257 IPSEC_ASSERT(sav->sah != NULL, ("null SA header")); 7258 7259 /* XXX: check inner IP header */ 7260 7261 return 1; 7262} 7263 7264/* record data transfer on SA, and update timestamps */ 7265void 7266key_sa_recordxfer(sav, m) 7267 struct secasvar *sav; 7268 struct mbuf *m; 7269{ 7270 IPSEC_ASSERT(sav != NULL, ("Null secasvar")); 7271 IPSEC_ASSERT(m != NULL, ("Null mbuf")); 7272 if (!sav->lft_c) 7273 return; 7274 7275 /* 7276 * XXX Currently, there is a difference of bytes size 7277 * between inbound and outbound processing. 7278 */ 7279 sav->lft_c->bytes += m->m_pkthdr.len; 7280 /* to check bytes lifetime is done in key_timehandler(). */ 7281 7282 /* 7283 * We use the number of packets as the unit of 7284 * allocations. We increment the variable 7285 * whenever {esp,ah}_{in,out}put is called. 7286 */ 7287 sav->lft_c->allocations++; 7288 /* XXX check for expires? */ 7289 7290 /* 7291 * NOTE: We record CURRENT usetime by using wall clock, 7292 * in seconds. HARD and SOFT lifetime are measured by the time 7293 * difference (again in seconds) from usetime. 7294 * 7295 * usetime 7296 * v expire expire 7297 * -----+-----+--------+---> t 7298 * <--------------> HARD 7299 * <-----> SOFT 7300 */ 7301 sav->lft_c->usetime = time_second; 7302 /* XXX check for expires? */ 7303 7304 return; 7305} 7306 7307/* dumb version */ 7308void 7309key_sa_routechange(dst) 7310 struct sockaddr *dst; 7311{ 7312 INIT_VNET_IPSEC(curvnet); 7313 struct secashead *sah; 7314 struct route *ro; 7315 7316 SAHTREE_LOCK(); 7317 LIST_FOREACH(sah, &V_sahtree, chain) { 7318 ro = &sah->sa_route; 7319 if (ro->ro_rt && dst->sa_len == ro->ro_dst.sa_len 7320 && bcmp(dst, &ro->ro_dst, dst->sa_len) == 0) { 7321 RTFREE(ro->ro_rt); 7322 ro->ro_rt = (struct rtentry *)NULL; 7323 } 7324 } 7325 SAHTREE_UNLOCK(); 7326} 7327 7328static void 7329key_sa_chgstate(sav, state) 7330 struct secasvar *sav; 7331 u_int8_t state; 7332{ 7333 IPSEC_ASSERT(sav != NULL, ("NULL sav")); 7334 SAHTREE_LOCK_ASSERT(); 7335 7336 if (sav->state != state) { 7337 if (__LIST_CHAINED(sav)) 7338 LIST_REMOVE(sav, chain); 7339 sav->state = state; 7340 LIST_INSERT_HEAD(&sav->sah->savtree[state], sav, chain); 7341 } 7342} 7343 7344void 7345key_sa_stir_iv(sav) 7346 struct secasvar *sav; 7347{ 7348 7349 IPSEC_ASSERT(sav->iv != NULL, ("null IV")); 7350 key_randomfill(sav->iv, sav->ivlen); 7351} 7352 7353/* XXX too much? */ 7354static struct mbuf * 7355key_alloc_mbuf(l) 7356 int l; 7357{ 7358 struct mbuf *m = NULL, *n; 7359 int len, t; 7360 7361 len = l; 7362 while (len > 0) { 7363 MGET(n, M_DONTWAIT, MT_DATA); 7364 if (n && len > MLEN) 7365 MCLGET(n, M_DONTWAIT); 7366 if (!n) { 7367 m_freem(m); 7368 return NULL; 7369 } 7370 7371 n->m_next = NULL; 7372 n->m_len = 0; 7373 n->m_len = M_TRAILINGSPACE(n); 7374 /* use the bottom of mbuf, hoping we can prepend afterwards */ 7375 if (n->m_len > len) { 7376 t = (n->m_len - len) & ~(sizeof(long) - 1); 7377 n->m_data += t; 7378 n->m_len = len; 7379 } 7380 7381 len -= n->m_len; 7382 7383 if (m) 7384 m_cat(m, n); 7385 else 7386 m = n; 7387 } 7388 7389 return m; 7390} 7391 7392/* 7393 * Take one of the kernel's security keys and convert it into a PF_KEY 7394 * structure within an mbuf, suitable for sending up to a waiting 7395 * application in user land. 7396 * 7397 * IN: 7398 * src: A pointer to a kernel security key. 7399 * exttype: Which type of key this is. Refer to the PF_KEY data structures. 7400 * OUT: 7401 * a valid mbuf or NULL indicating an error 7402 * 7403 */ 7404 7405static struct mbuf * 7406key_setkey(struct seckey *src, u_int16_t exttype) 7407{ 7408 struct mbuf *m; 7409 struct sadb_key *p; 7410 int len; 7411 7412 if (src == NULL) 7413 return NULL; 7414 7415 len = PFKEY_ALIGN8(sizeof(struct sadb_key) + _KEYLEN(src)); 7416 m = key_alloc_mbuf(len); 7417 if (m == NULL) 7418 return NULL; 7419 p = mtod(m, struct sadb_key *); 7420 bzero(p, len); 7421 p->sadb_key_len = PFKEY_UNIT64(len); 7422 p->sadb_key_exttype = exttype; 7423 p->sadb_key_bits = src->bits; 7424 bcopy(src->key_data, _KEYBUF(p), _KEYLEN(src)); 7425 7426 return m; 7427} 7428 7429/* 7430 * Take one of the kernel's lifetime data structures and convert it 7431 * into a PF_KEY structure within an mbuf, suitable for sending up to 7432 * a waiting application in user land. 7433 * 7434 * IN: 7435 * src: A pointer to a kernel lifetime structure. 7436 * exttype: Which type of lifetime this is. Refer to the PF_KEY 7437 * data structures for more information. 7438 * OUT: 7439 * a valid mbuf or NULL indicating an error 7440 * 7441 */ 7442 7443static struct mbuf * 7444key_setlifetime(struct seclifetime *src, u_int16_t exttype) 7445{ 7446 struct mbuf *m = NULL; 7447 struct sadb_lifetime *p; 7448 int len = PFKEY_ALIGN8(sizeof(struct sadb_lifetime)); 7449 7450 if (src == NULL) 7451 return NULL; 7452 7453 m = key_alloc_mbuf(len); 7454 if (m == NULL) 7455 return m; 7456 p = mtod(m, struct sadb_lifetime *); 7457 7458 bzero(p, len); 7459 p->sadb_lifetime_len = PFKEY_UNIT64(len); 7460 p->sadb_lifetime_exttype = exttype; 7461 p->sadb_lifetime_allocations = src->allocations; 7462 p->sadb_lifetime_bytes = src->bytes; 7463 p->sadb_lifetime_addtime = src->addtime; 7464 p->sadb_lifetime_usetime = src->usetime; 7465 7466 return m; 7467 7468} 7469