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