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