xref: /netbsd/sys/netipsec/ipsec.c (revision a35dced6)
1 /* $NetBSD: ipsec.c,v 1.178 2023/01/27 09:33:43 ozaki-r Exp $ */
2 /* $FreeBSD: ipsec.c,v 1.2.2.2 2003/07/01 01:38:13 sam Exp $ */
3 /* $KAME: ipsec.c,v 1.103 2001/05/24 07:14:18 sakane Exp $ */
4 
5 /*
6  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
7  * All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  * 1. Redistributions of source code must retain the above copyright
13  *	notice, this list of conditions and the following disclaimer.
14  * 2. Redistributions in binary form must reproduce the above copyright
15  *	notice, this list of conditions and the following disclaimer in the
16  *	documentation and/or other materials provided with the distribution.
17  * 3. Neither the name of the project nor the names of its contributors
18  *	may be used to endorse or promote products derived from this software
19  *	without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31  * SUCH DAMAGE.
32  */
33 
34 #include <sys/cdefs.h>
35 __KERNEL_RCSID(0, "$NetBSD: ipsec.c,v 1.178 2023/01/27 09:33:43 ozaki-r Exp $");
36 
37 /*
38  * IPsec controller part.
39  */
40 
41 #if defined(_KERNEL_OPT)
42 #include "opt_inet.h"
43 #include "opt_ipsec.h"
44 #endif
45 
46 #include <sys/param.h>
47 #include <sys/systm.h>
48 #include <sys/mbuf.h>
49 #include <sys/domain.h>
50 #include <sys/protosw.h>
51 #include <sys/socket.h>
52 #include <sys/socketvar.h>
53 #include <sys/errno.h>
54 #include <sys/time.h>
55 #include <sys/kernel.h>
56 #include <sys/syslog.h>
57 #include <sys/sysctl.h>
58 #include <sys/proc.h>
59 #include <sys/kauth.h>
60 #include <sys/cpu.h>
61 #include <sys/kmem.h>
62 #include <sys/pserialize.h>
63 
64 #include <net/if.h>
65 #include <net/route.h>
66 
67 #include <netinet/in.h>
68 #include <netinet/in_systm.h>
69 #include <netinet/ip.h>
70 #include <netinet/ip_var.h>
71 #include <netinet/in_var.h>
72 #include <netinet/udp.h>
73 #include <netinet/udp_var.h>
74 #include <netinet/tcp.h>
75 #include <netinet/udp.h>
76 #include <netinet/ip_icmp.h>
77 #include <netinet/ip_private.h>
78 
79 #include <netinet/ip6.h>
80 #ifdef INET6
81 #include <netinet6/ip6_var.h>
82 #endif
83 #include <netinet/in_pcb.h>
84 #include <netinet/in_offload.h>
85 #ifdef INET6
86 #include <netinet6/in6_pcb.h>
87 #include <netinet/icmp6.h>
88 #endif
89 
90 #include <netipsec/ipsec.h>
91 #include <netipsec/ipsec_var.h>
92 #include <netipsec/ipsec_private.h>
93 #ifdef INET6
94 #include <netipsec/ipsec6.h>
95 #endif
96 #include <netipsec/ah_var.h>
97 #include <netipsec/esp_var.h>
98 #include <netipsec/ipcomp.h>		/*XXX*/
99 #include <netipsec/ipcomp_var.h>
100 
101 #include <netipsec/key.h>
102 #include <netipsec/keydb.h>
103 #include <netipsec/key_debug.h>
104 
105 #include <netipsec/xform.h>
106 
107 int ipsec_used = 0;
108 int ipsec_enabled = 1;
109 
110 #ifdef IPSEC_DEBUG
111 int ipsec_debug = 1;
112 
113 /*
114  * When set to 1, IPsec will send packets with the same sequence number.
115  * This allows to verify if the other side has proper replay attacks detection.
116  */
117 int ipsec_replay = 0;
118 
119 /*
120  * When set 1, IPsec will send packets with corrupted HMAC.
121  * This allows to verify if the other side properly detects modified packets.
122  */
123 int ipsec_integrity = 0;
124 #else
125 int ipsec_debug = 0;
126 #endif
127 
128 percpu_t *ipsecstat_percpu;
129 
130 int ip4_ah_offsetmask = 0;	/* maybe IP_DF? */
131 int ip4_ipsec_dfbit = 2;	/* DF bit on encap. 0: clear 1: set 2: copy */
132 int ip4_esp_trans_deflev = IPSEC_LEVEL_USE;
133 int ip4_esp_net_deflev = IPSEC_LEVEL_USE;
134 int ip4_ah_trans_deflev = IPSEC_LEVEL_USE;
135 int ip4_ah_net_deflev = IPSEC_LEVEL_USE;
136 struct secpolicy ip4_def_policy;
137 int ip4_ipsec_ecn = 0;		/* ECN ignore(-1)/forbidden(0)/allowed(1) */
138 
139 u_int ipsec_spdgen = 1;		/* SPD generation # */
140 
141 static struct secpolicy ipsec_dummy_sp __read_mostly = {
142 	.state		= IPSEC_SPSTATE_ALIVE,
143 	/* If ENTRUST, the dummy SP never be used. See ipsec_getpolicybysock. */
144 	.policy		= IPSEC_POLICY_ENTRUST,
145 };
146 
147 static struct secpolicy *ipsec_checkpcbcache(struct mbuf *,
148     struct inpcbpolicy *, int);
149 static int ipsec_fillpcbcache(struct inpcbpolicy *, struct mbuf *,
150     struct secpolicy *, int);
151 static int ipsec_invalpcbcache(struct inpcbpolicy *, int);
152 
153 /*
154  * Crypto support requirements:
155  *
156  *  1	require hardware support
157  * -1	require software support
158  *  0	take anything
159  */
160 int crypto_support = 0;
161 
162 static struct secpolicy *ipsec_getpolicybysock(struct mbuf *, u_int,
163     struct inpcb *, int *);
164 
165 #ifdef INET6
166 int ip6_esp_trans_deflev = IPSEC_LEVEL_USE;
167 int ip6_esp_net_deflev = IPSEC_LEVEL_USE;
168 int ip6_ah_trans_deflev = IPSEC_LEVEL_USE;
169 int ip6_ah_net_deflev = IPSEC_LEVEL_USE;
170 struct secpolicy ip6_def_policy;
171 int ip6_ipsec_ecn = 0;		/* ECN ignore(-1)/forbidden(0)/allowed(1) */
172 #endif
173 
174 static int ipsec_setspidx_inpcb(struct mbuf *, struct inpcb *);
175 static int ipsec_setspidx(struct mbuf *, struct secpolicyindex *, int, int);
176 static void ipsec4_get_ulp(struct mbuf *m, struct secpolicyindex *, int);
177 static int ipsec4_setspidx_ipaddr(struct mbuf *, struct secpolicyindex *);
178 #ifdef INET6
179 static void ipsec6_get_ulp(struct mbuf *m, struct secpolicyindex *, int);
180 static int ipsec6_setspidx_ipaddr(struct mbuf *, struct secpolicyindex *);
181 #endif
182 static void ipsec_delpcbpolicy(struct inpcbpolicy *);
183 static void ipsec_destroy_policy(struct secpolicy *);
184 static int ipsec_sp_reject(const struct secpolicy *, const struct mbuf *);
185 static void vshiftl(unsigned char *, int, int);
186 static size_t ipsec_sp_hdrsiz(const struct secpolicy *, const struct mbuf *);
187 
188 /*
189  * Try to validate and use cached policy on a PCB.
190  */
191 static struct secpolicy *
ipsec_checkpcbcache(struct mbuf * m,struct inpcbpolicy * pcbsp,int dir)192 ipsec_checkpcbcache(struct mbuf *m, struct inpcbpolicy *pcbsp, int dir)
193 {
194 	struct secpolicyindex spidx;
195 	struct secpolicy *sp = NULL;
196 	int s;
197 
198 	KASSERT(IPSEC_DIR_IS_VALID(dir));
199 	KASSERT(pcbsp != NULL);
200 	KASSERT(dir < __arraycount(pcbsp->sp_cache));
201 	KASSERT(inp_locked(pcbsp->sp_inp));
202 
203 	/*
204 	 * Checking the generation and sp->state and taking a reference to an SP
205 	 * must be in a critical section of pserialize. See key_unlink_sp.
206 	 */
207 	s = pserialize_read_enter();
208 	/* SPD table change invalidate all the caches. */
209 	if (ipsec_spdgen != pcbsp->sp_cache[dir].cachegen) {
210 		ipsec_invalpcbcache(pcbsp, dir);
211 		goto out;
212 	}
213 	sp = pcbsp->sp_cache[dir].cachesp;
214 	if (sp == NULL)
215 		goto out;
216 	if (sp->state != IPSEC_SPSTATE_ALIVE) {
217 		sp = NULL;
218 		ipsec_invalpcbcache(pcbsp, dir);
219 		goto out;
220 	}
221 	if ((pcbsp->sp_cacheflags & IPSEC_PCBSP_CONNECTED) == 0) {
222 		/* NB: assume ipsec_setspidx never sleep */
223 		if (ipsec_setspidx(m, &spidx, dir, 1) != 0) {
224 			sp = NULL;
225 			goto out;
226 		}
227 
228 		/*
229 		 * We have to make an exact match here since the cached rule
230 		 * might have lower priority than a rule that would otherwise
231 		 * have matched the packet.
232 		 */
233 		if (memcmp(&pcbsp->sp_cache[dir].cacheidx, &spidx,
234 		    sizeof(spidx))) {
235 			sp = NULL;
236 			goto out;
237 		}
238 	} else {
239 		/*
240 		 * The pcb is connected, and the L4 code is sure that:
241 		 * - outgoing side uses inp_[lf]addr
242 		 * - incoming side looks up policy after inpcb lookup
243 		 * and address pair is know to be stable.  We do not need
244 		 * to generate spidx again, nor check the address match again.
245 		 *
246 		 * For IPv4/v6 SOCK_STREAM sockets, this assumptions holds
247 		 * and there are calls to ipsec_pcbconn() from inpcb_connect().
248 		 */
249 	}
250 
251 	key_sp_touch(sp);
252 	KEY_SP_REF(sp);
253 	KEYDEBUG_PRINTF(KEYDEBUG_IPSEC_STAMP,
254 	    "DP cause refcnt++:%d SP:%p\n",
255 	    key_sp_refcnt(sp), pcbsp->sp_cache[dir].cachesp);
256 out:
257 	pserialize_read_exit(s);
258 	return sp;
259 }
260 
261 static int
ipsec_fillpcbcache(struct inpcbpolicy * pcbsp,struct mbuf * m,struct secpolicy * sp,int dir)262 ipsec_fillpcbcache(struct inpcbpolicy *pcbsp, struct mbuf *m,
263     struct secpolicy *sp, int dir)
264 {
265 
266 	KASSERT(IPSEC_DIR_IS_INOROUT(dir));
267 	KASSERT(dir < __arraycount(pcbsp->sp_cache));
268 	KASSERT(inp_locked(pcbsp->sp_inp));
269 
270 	pcbsp->sp_cache[dir].cachesp = NULL;
271 	pcbsp->sp_cache[dir].cachehint = IPSEC_PCBHINT_UNKNOWN;
272 	if (ipsec_setspidx(m, &pcbsp->sp_cache[dir].cacheidx, dir, 1) != 0) {
273 		return EINVAL;
274 	}
275 	pcbsp->sp_cache[dir].cachesp = sp;
276 	if (pcbsp->sp_cache[dir].cachesp) {
277 		/*
278 		 * If the PCB is connected, we can remember a hint to
279 		 * possibly short-circuit IPsec processing in other places.
280 		 */
281 		if (pcbsp->sp_cacheflags & IPSEC_PCBSP_CONNECTED) {
282 			switch (pcbsp->sp_cache[dir].cachesp->policy) {
283 			case IPSEC_POLICY_NONE:
284 			case IPSEC_POLICY_BYPASS:
285 				pcbsp->sp_cache[dir].cachehint =
286 				    IPSEC_PCBHINT_NO;
287 				break;
288 			default:
289 				pcbsp->sp_cache[dir].cachehint =
290 				    IPSEC_PCBHINT_YES;
291 			}
292 		}
293 	}
294 	pcbsp->sp_cache[dir].cachegen = ipsec_spdgen;
295 
296 	return 0;
297 }
298 
299 static int
ipsec_invalpcbcache(struct inpcbpolicy * pcbsp,int dir)300 ipsec_invalpcbcache(struct inpcbpolicy *pcbsp, int dir)
301 {
302 	int i;
303 
304 	KASSERT(inp_locked(pcbsp->sp_inp));
305 
306 	for (i = IPSEC_DIR_INBOUND; i <= IPSEC_DIR_OUTBOUND; i++) {
307 		if (dir != IPSEC_DIR_ANY && i != dir)
308 			continue;
309 		pcbsp->sp_cache[i].cachesp = NULL;
310 		pcbsp->sp_cache[i].cachehint = IPSEC_PCBHINT_UNKNOWN;
311 		pcbsp->sp_cache[i].cachegen = 0;
312 		memset(&pcbsp->sp_cache[i].cacheidx, 0,
313 		    sizeof(pcbsp->sp_cache[i].cacheidx));
314 	}
315 	return 0;
316 }
317 
318 void
ipsec_pcbconn(struct inpcbpolicy * pcbsp)319 ipsec_pcbconn(struct inpcbpolicy *pcbsp)
320 {
321 
322 	KASSERT(inp_locked(pcbsp->sp_inp));
323 
324 	pcbsp->sp_cacheflags |= IPSEC_PCBSP_CONNECTED;
325 	ipsec_invalpcbcache(pcbsp, IPSEC_DIR_ANY);
326 }
327 
328 void
ipsec_pcbdisconn(struct inpcbpolicy * pcbsp)329 ipsec_pcbdisconn(struct inpcbpolicy *pcbsp)
330 {
331 
332 	KASSERT(inp_locked(pcbsp->sp_inp));
333 
334 	pcbsp->sp_cacheflags &= ~IPSEC_PCBSP_CONNECTED;
335 	ipsec_invalpcbcache(pcbsp, IPSEC_DIR_ANY);
336 }
337 
338 void
ipsec_invalpcbcacheall(void)339 ipsec_invalpcbcacheall(void)
340 {
341 
342 	if (ipsec_spdgen == UINT_MAX)
343 		ipsec_spdgen = 1;
344 	else
345 		ipsec_spdgen++;
346 }
347 
348 /*
349  * Return a held reference to the default SP.
350  */
351 static struct secpolicy *
key_get_default_sp(int af,const char * where,int tag)352 key_get_default_sp(int af, const char *where, int tag)
353 {
354 	struct secpolicy *sp;
355 
356 	KEYDEBUG_PRINTF(KEYDEBUG_IPSEC_STAMP, "DP from %s:%u\n", where, tag);
357 
358 	switch(af) {
359 	case AF_INET:
360 		sp = &ip4_def_policy;
361 		break;
362 #ifdef INET6
363 	case AF_INET6:
364 		sp = &ip6_def_policy;
365 		break;
366 #endif
367 	default:
368 		KEYDEBUG_PRINTF(KEYDEBUG_IPSEC_STAMP,
369 		    "unexpected protocol family %u\n", af);
370 		return NULL;
371 	}
372 
373 	if (sp->policy != IPSEC_POLICY_DISCARD &&
374 	    sp->policy != IPSEC_POLICY_NONE) {
375 		IPSECLOG(LOG_INFO, "fixed system default policy: %d->%d\n",
376 		    sp->policy, IPSEC_POLICY_NONE);
377 		sp->policy = IPSEC_POLICY_NONE;
378 	}
379 	KEY_SP_REF(sp);
380 
381 	KEYDEBUG_PRINTF(KEYDEBUG_IPSEC_STAMP, "DP returns SP:%p (%u)\n",
382 	    sp, key_sp_refcnt(sp));
383 	return sp;
384 }
385 
386 #define	KEY_GET_DEFAULT_SP(af) \
387 	key_get_default_sp((af), __func__, __LINE__)
388 
389 /*
390  * For OUTBOUND packet having a socket. Searching SPD for packet,
391  * and return a pointer to SP.
392  * OUT:	NULL:	no appropriate SP found, the following value is set to error.
393  *		0	: bypass
394  *		EACCES	: discard packet.
395  *		ENOENT	: ipsec_acquire() in progress, maybe.
396  *		others	: error occurred.
397  *	others:	a pointer to SP
398  *
399  * NOTE: IPv6 mapped address concern is implemented here.
400  */
401 static struct secpolicy *
ipsec_getpolicybysock(struct mbuf * m,u_int dir,struct inpcb * inp,int * error)402 ipsec_getpolicybysock(struct mbuf *m, u_int dir, struct inpcb *inp,
403     int *error)
404 {
405 	struct inpcbpolicy *pcbsp = NULL;
406 	struct secpolicy *currsp = NULL;	/* policy on socket */
407 	struct secpolicy *sp;
408 	int af;
409 
410 	KASSERT(m != NULL);
411 	KASSERT(inp != NULL);
412 	KASSERT(error != NULL);
413 	KASSERTMSG(IPSEC_DIR_IS_INOROUT(dir), "invalid direction %u", dir);
414 
415 	KASSERT(inp->inp_socket != NULL);
416 	KASSERT(inp_locked(inp));
417 
418 	/* XXX FIXME inpcb vs socket*/
419 	af = inp->inp_af;
420 	KASSERTMSG(af == AF_INET || af == AF_INET6,
421 	    "unexpected protocol family %u", af);
422 
423 	KASSERT(inp->inp_sp != NULL);
424 	/* If we have a cached entry, and if it is still valid, use it. */
425 	IPSEC_STATINC(IPSEC_STAT_SPDCACHELOOKUP);
426 	currsp = ipsec_checkpcbcache(m, inp->inp_sp, dir);
427 	if (currsp) {
428 		*error = 0;
429 		return currsp;
430 	}
431 	IPSEC_STATINC(IPSEC_STAT_SPDCACHEMISS);
432 
433 	switch (af) {
434 	case AF_INET:
435 #if defined(INET6)
436 	case AF_INET6:
437 #endif
438 		*error = ipsec_setspidx_inpcb(m, inp);
439 		pcbsp = inp->inp_sp;
440 		break;
441 	default:
442 		*error = EPFNOSUPPORT;
443 		break;
444 	}
445 	if (*error)
446 		return NULL;
447 
448 	KASSERT(pcbsp != NULL);
449 	switch (dir) {
450 	case IPSEC_DIR_INBOUND:
451 		currsp = pcbsp->sp_in;
452 		break;
453 	case IPSEC_DIR_OUTBOUND:
454 		currsp = pcbsp->sp_out;
455 		break;
456 	}
457 	KASSERT(currsp != NULL);
458 
459 	if (pcbsp->priv) {	/* when privileged socket */
460 		switch (currsp->policy) {
461 		case IPSEC_POLICY_BYPASS:
462 		case IPSEC_POLICY_IPSEC:
463 			KEY_SP_REF(currsp);
464 			sp = currsp;
465 			break;
466 
467 		case IPSEC_POLICY_ENTRUST:
468 			/* look for a policy in SPD */
469 			if (key_havesp(dir))
470 				sp = KEY_LOOKUP_SP_BYSPIDX(&currsp->spidx, dir);
471 			else
472 				sp = NULL;
473 			if (sp == NULL)		/* no SP found */
474 				sp = KEY_GET_DEFAULT_SP(af);
475 			break;
476 
477 		default:
478 			IPSECLOG(LOG_ERR, "Invalid policy for PCB %d\n",
479 			    currsp->policy);
480 			*error = EINVAL;
481 			return NULL;
482 		}
483 	} else {				/* unpriv, SPD has policy */
484 		if (key_havesp(dir))
485 			sp = KEY_LOOKUP_SP_BYSPIDX(&currsp->spidx, dir);
486 		else
487 			sp = NULL;
488 		if (sp == NULL) {		/* no SP found */
489 			switch (currsp->policy) {
490 			case IPSEC_POLICY_BYPASS:
491 				IPSECLOG(LOG_ERR, "Illegal policy for "
492 				    "non-priviliged defined %d\n",
493 				    currsp->policy);
494 				*error = EINVAL;
495 				return NULL;
496 
497 			case IPSEC_POLICY_ENTRUST:
498 				sp = KEY_GET_DEFAULT_SP(af);
499 				break;
500 
501 			case IPSEC_POLICY_IPSEC:
502 				KEY_SP_REF(currsp);
503 				sp = currsp;
504 				break;
505 
506 			default:
507 				IPSECLOG(LOG_ERR, "Invalid policy for "
508 				    "PCB %d\n", currsp->policy);
509 				*error = EINVAL;
510 				return NULL;
511 			}
512 		}
513 	}
514 	KASSERTMSG(sp != NULL, "null SP (priv %u policy %u", pcbsp->priv,
515 	    currsp->policy);
516 	KEYDEBUG_PRINTF(KEYDEBUG_IPSEC_STAMP,
517 	    "DP (priv %u policy %u) allocates SP:%p (refcnt %u)\n",
518 	    pcbsp->priv, currsp->policy, sp, key_sp_refcnt(sp));
519 	ipsec_fillpcbcache(pcbsp, m, sp, dir);
520 	return sp;
521 }
522 
523 /*
524  * For FORWARDING packet or OUTBOUND without a socket. Searching SPD for packet,
525  * and return a pointer to SP.
526  * OUT:	positive: a pointer to the entry for security policy leaf matched.
527  *	NULL:	no appropriate SP found, the following value is set to error.
528  *		0	: bypass
529  *		EACCES	: discard packet.
530  *		ENOENT	: ipsec_acquire() in progress, maybe.
531  *		others	: error occurred.
532  */
533 static struct secpolicy *
ipsec_getpolicybyaddr(struct mbuf * m,u_int dir,int flag,int * error)534 ipsec_getpolicybyaddr(struct mbuf *m, u_int dir, int flag, int *error)
535 {
536 	struct secpolicyindex spidx;
537 	struct secpolicy *sp;
538 
539 	KASSERT(m != NULL);
540 	KASSERT(error != NULL);
541 	KASSERTMSG(IPSEC_DIR_IS_INOROUT(dir), "invalid direction %u", dir);
542 
543 	sp = NULL;
544 
545 	/* Make an index to look for a policy. */
546 	*error = ipsec_setspidx(m, &spidx, dir, 1);
547 	if (*error != 0) {
548 		IPSECLOG(LOG_DEBUG, "setpidx failed, dir %u flag %u\n", dir, flag);
549 		memset(&spidx, 0, sizeof(spidx));
550 		return NULL;
551 	}
552 
553 	spidx.dir = dir;
554 
555 	if (key_havesp(dir)) {
556 		sp = KEY_LOOKUP_SP_BYSPIDX(&spidx, dir);
557 	}
558 	if (sp == NULL) {
559 		/* no SP found, use system default */
560 		sp = KEY_GET_DEFAULT_SP(spidx.dst.sa.sa_family);
561 	}
562 
563 	KASSERT(sp != NULL);
564 	return sp;
565 }
566 
567 static struct secpolicy *
ipsec_checkpolicy(struct mbuf * m,u_int dir,u_int flag,int * error,struct inpcb * inp)568 ipsec_checkpolicy(struct mbuf *m, u_int dir, u_int flag, int *error,
569     struct inpcb *inp)
570 {
571 	struct secpolicy *sp;
572 
573 	*error = 0;
574 
575 	if (inp == NULL) {
576 		sp = ipsec_getpolicybyaddr(m, dir, flag, error);
577 	} else {
578 		KASSERT(inp->inp_socket != NULL);
579 		sp = ipsec_getpolicybysock(m, dir, inp, error);
580 	}
581 	if (sp == NULL) {
582 		KASSERTMSG(*error != 0, "getpolicy failed w/o error");
583 		IPSEC_STATINC(IPSEC_STAT_OUT_INVAL);
584 		return NULL;
585 	}
586 	KASSERTMSG(*error == 0, "sp w/ error set to %u", *error);
587 
588 	switch (sp->policy) {
589 	case IPSEC_POLICY_ENTRUST:
590 	default:
591 		printf("%s: invalid policy %u\n", __func__, sp->policy);
592 		/* fall thru... */
593 	case IPSEC_POLICY_DISCARD:
594 		IPSEC_STATINC(IPSEC_STAT_OUT_POLVIO);
595 		*error = -EINVAL;	/* packet is discarded by caller */
596 		break;
597 	case IPSEC_POLICY_BYPASS:
598 	case IPSEC_POLICY_NONE:
599 		KEY_SP_UNREF(&sp);
600 		sp = NULL;		/* NB: force NULL result */
601 		break;
602 	case IPSEC_POLICY_IPSEC:
603 		KASSERT(sp->req != NULL);
604 		break;
605 	}
606 
607 	if (*error != 0) {
608 		KEY_SP_UNREF(&sp);
609 		sp = NULL;
610 		IPSECLOG(LOG_DEBUG, "done, error %d\n", *error);
611 	}
612 
613 	return sp;
614 }
615 
616 int
ipsec4_output(struct mbuf * m,struct inpcb * inp,int flags,u_long * mtu,bool * natt_frag,bool * done,bool * count_drop)617 ipsec4_output(struct mbuf *m, struct inpcb *inp, int flags,
618     u_long *mtu, bool *natt_frag, bool *done, bool *count_drop)
619 {
620 	struct secpolicy *sp = NULL;
621 	u_long _mtu = 0;
622 	int error;
623 
624 	/*
625 	 * Check the security policy (SP) for the packet and, if required,
626 	 * do IPsec-related processing.  There are two cases here; the first
627 	 * time a packet is sent through it will be untagged and handled by
628 	 * ipsec_checkpolicy().  If the packet is resubmitted to ip_output
629 	 * (e.g. after AH, ESP, etc. processing), there will be a tag to
630 	 * bypass the lookup and related policy checking.
631 	 */
632 	if (ipsec_outdone(m)) {
633 		return 0;
634 	}
635 	if (inp && ipsec_pcb_skip_ipsec(inp->inp_sp, IPSEC_DIR_OUTBOUND)) {
636 		return 0;
637 	}
638 	sp = ipsec_checkpolicy(m, IPSEC_DIR_OUTBOUND, flags, &error, inp);
639 
640 	/*
641 	 * There are four return cases:
642 	 *	sp != NULL                    apply IPsec policy
643 	 *	sp == NULL, error == 0        no IPsec handling needed
644 	 *	sp == NULL, error == -EINVAL  discard packet w/o error
645 	 *	sp == NULL, error != 0        discard packet, report error
646 	 */
647 	if (sp == NULL) {
648 		if (error) {
649 			/*
650 			 * Hack: -EINVAL is used to signal that a packet
651 			 * should be silently discarded.  This is typically
652 			 * because we asked key management for an SA and
653 			 * it was delayed (e.g. kicked up to IKE).
654 			 */
655 			if (error == -EINVAL)
656 				error = 0;
657 			m_freem(m);
658 			*done = true;
659 			*count_drop = true;
660 			return error;
661 		}
662 		/* No IPsec processing for this packet. */
663 		return 0;
664 	}
665 
666 	/*
667 	 * Do delayed checksums now because we send before
668 	 * this is done in the normal processing path.
669 	 */
670 	if (m->m_pkthdr.csum_flags & (M_CSUM_TCPv4|M_CSUM_UDPv4)) {
671 		in_undefer_cksum_tcpudp(m);
672 		m->m_pkthdr.csum_flags &= ~(M_CSUM_TCPv4|M_CSUM_UDPv4);
673 	}
674 
675 	error = ipsec4_process_packet(m, sp->req, &_mtu);
676 	if (error == 0 && _mtu != 0) {
677 		/*
678 		 * NAT-T ESP fragmentation: do not do IPSec processing
679 		 * now, we will do it on each fragmented packet.
680 		 */
681 		*mtu = _mtu;
682 		*natt_frag = true;
683 		KEY_SP_UNREF(&sp);
684 		return 0;
685 	}
686 
687 	/*
688 	 * Preserve KAME behaviour: ENOENT can be returned
689 	 * when an SA acquire is in progress.  Don't propagate
690 	 * this to user-level; it confuses applications.
691 	 *
692 	 * XXX this will go away when the SADB is redone.
693 	 */
694 	if (error == ENOENT)
695 		error = 0;
696 	KEY_SP_UNREF(&sp);
697 	*done = true;
698 	return error;
699 }
700 
701 int
ipsec_ip_input_checkpolicy(struct mbuf * m,bool forward)702 ipsec_ip_input_checkpolicy(struct mbuf *m, bool forward)
703 {
704 	struct secpolicy *sp;
705 	int error;
706 
707 	error = ipsec_in_reject(m, NULL);
708 	if (error) {
709 		return EINVAL;
710 	}
711 
712 	if (!forward || !(m->m_flags & M_CANFASTFWD)) {
713 		return 0;
714 	}
715 
716 	/*
717 	 * Peek at the outbound SP for this packet to determine if
718 	 * it is a Fast Forward candidate.
719 	 */
720 	sp = ipsec_checkpolicy(m, IPSEC_DIR_OUTBOUND, IP_FORWARDING,
721 	    &error, NULL);
722 	if (sp != NULL) {
723 		m->m_flags &= ~M_CANFASTFWD;
724 		KEY_SP_UNREF(&sp);
725 	}
726 
727 	return 0;
728 }
729 
730 /*
731  * If the packet is routed over IPsec tunnel, tell the originator the
732  * tunnel MTU.
733  *     tunnel MTU = if MTU - sizeof(IP) - ESP/AH hdrsiz
734  *
735  * XXX: Quick hack!!!
736  *
737  * XXX: And what if the MTU goes negative?
738  */
739 void
ipsec_mtu(struct mbuf * m,int * destmtu)740 ipsec_mtu(struct mbuf *m, int *destmtu)
741 {
742 	struct secpolicy *sp;
743 	size_t ipsechdr;
744 	int error;
745 
746 	sp = ipsec_getpolicybyaddr(m, IPSEC_DIR_OUTBOUND, IP_FORWARDING,
747 	    &error);
748 	if (sp == NULL) {
749 		return;
750 	}
751 
752 	/* Count IPsec header size. */
753 	ipsechdr = ipsec_sp_hdrsiz(sp, m);
754 
755 	/*
756 	 * Find the correct route for outer IP header, compute tunnel MTU.
757 	 */
758 	if (sp->req) {
759 		struct secasvar *sav;
760 
761 		sav = ipsec_lookup_sa(sp->req, m);
762 		if (sav != NULL) {
763 			struct route *ro;
764 			struct rtentry *rt;
765 
766 			ro = &sav->sah->sa_route;
767 			rt = rtcache_validate(ro);
768 			if (rt && rt->rt_ifp) {
769 				*destmtu = rt->rt_rmx.rmx_mtu ?
770 				    rt->rt_rmx.rmx_mtu : rt->rt_ifp->if_mtu;
771 				*destmtu -= ipsechdr;
772 			}
773 			rtcache_unref(rt, ro);
774 			KEY_SA_UNREF(&sav);
775 		}
776 	}
777 	KEY_SP_UNREF(&sp);
778 }
779 
780 static int
ipsec_setspidx_inpcb(struct mbuf * m,struct inpcb * inp)781 ipsec_setspidx_inpcb(struct mbuf *m, struct inpcb *inp)
782 {
783 	int error;
784 
785 	KASSERT(inp != NULL);
786 	KASSERT(inp->inp_sp != NULL);
787 	KASSERT(inp->inp_sp->sp_out != NULL);
788 	KASSERT(inp->inp_sp->sp_in != NULL);
789 
790 	error = ipsec_setspidx(m, &inp->inp_sp->sp_in->spidx,
791 	    IPSEC_DIR_INBOUND, 1);
792 	if (error == 0) {
793 		inp->inp_sp->sp_out->spidx = inp->inp_sp->sp_in->spidx;
794 		inp->inp_sp->sp_out->spidx.dir = IPSEC_DIR_OUTBOUND;
795 	} else {
796 		memset(&inp->inp_sp->sp_in->spidx, 0,
797 		    sizeof(inp->inp_sp->sp_in->spidx));
798 		memset(&inp->inp_sp->sp_out->spidx, 0,
799 		    sizeof(inp->inp_sp->sp_out->spidx));
800 	}
801 	return error;
802 }
803 
804 /*
805  * configure security policy index (src/dst/proto/sport/dport)
806  * by looking at the content of mbuf.
807  * the caller is responsible for error recovery (like clearing up spidx).
808  */
809 static int
ipsec_setspidx(struct mbuf * m,struct secpolicyindex * spidx,int dir,int needport)810 ipsec_setspidx(struct mbuf *m, struct secpolicyindex *spidx, int dir,
811     int needport)
812 {
813 	struct ip *ip = NULL;
814 	struct ip ipbuf;
815 	u_int v;
816 	int error;
817 
818 	KASSERT(m != NULL);
819 	M_VERIFY_PACKET(m);
820 
821 	if (m->m_pkthdr.len < sizeof(struct ip)) {
822 		KEYDEBUG_PRINTF(KEYDEBUG_IPSEC_DUMP,
823 		    "pkthdr.len(%d) < sizeof(struct ip), ignored.\n",
824 		    m->m_pkthdr.len);
825 		return EINVAL;
826 	}
827 
828 	memset(spidx, 0, sizeof(*spidx));
829 	spidx->dir = dir;
830 
831 	if (m->m_len >= sizeof(*ip)) {
832 		ip = mtod(m, struct ip *);
833 	} else {
834 		m_copydata(m, 0, sizeof(ipbuf), &ipbuf);
835 		ip = &ipbuf;
836 	}
837 	v = ip->ip_v;
838 	switch (v) {
839 	case 4:
840 		error = ipsec4_setspidx_ipaddr(m, spidx);
841 		if (error)
842 			return error;
843 		ipsec4_get_ulp(m, spidx, needport);
844 		return 0;
845 #ifdef INET6
846 	case 6:
847 		if (m->m_pkthdr.len < sizeof(struct ip6_hdr)) {
848 			KEYDEBUG_PRINTF(KEYDEBUG_IPSEC_DUMP,
849 			    "pkthdr.len(%d) < sizeof(struct ip6_hdr), "
850 			    "ignored.\n", m->m_pkthdr.len);
851 			return EINVAL;
852 		}
853 		error = ipsec6_setspidx_ipaddr(m, spidx);
854 		if (error)
855 			return error;
856 		ipsec6_get_ulp(m, spidx, needport);
857 		return 0;
858 #endif
859 	default:
860 		KEYDEBUG_PRINTF(KEYDEBUG_IPSEC_DUMP,
861 		    "unknown IP version %u, ignored.\n", v);
862 		return EINVAL;
863 	}
864 }
865 
866 static void
ipsec4_get_ulp(struct mbuf * m,struct secpolicyindex * spidx,int needport)867 ipsec4_get_ulp(struct mbuf *m, struct secpolicyindex *spidx, int needport)
868 {
869 	u_int8_t nxt;
870 	int off;
871 
872 	KASSERT(m != NULL);
873 	KASSERTMSG(m->m_pkthdr.len >= sizeof(struct ip), "packet too short");
874 
875 	/* NB: ip_input() flips it into host endian XXX need more checking */
876 	if (m->m_len >= sizeof(struct ip)) {
877 		struct ip *ip = mtod(m, struct ip *);
878 		if (ip->ip_off & htons(IP_MF | IP_OFFMASK))
879 			goto done;
880 		off = ip->ip_hl << 2;
881 		nxt = ip->ip_p;
882 	} else {
883 		struct ip ih;
884 
885 		m_copydata(m, 0, sizeof(struct ip), &ih);
886 		if (ih.ip_off & htons(IP_MF | IP_OFFMASK))
887 			goto done;
888 		off = ih.ip_hl << 2;
889 		nxt = ih.ip_p;
890 	}
891 
892 	while (off < m->m_pkthdr.len) {
893 		struct ip6_ext ip6e;
894 		struct tcphdr th;
895 		struct udphdr uh;
896 		struct icmp icmph;
897 
898 		switch (nxt) {
899 		case IPPROTO_TCP:
900 			spidx->ul_proto = nxt;
901 			if (!needport)
902 				goto done_proto;
903 			if (off + sizeof(struct tcphdr) > m->m_pkthdr.len)
904 				goto done;
905 			m_copydata(m, off, sizeof(th), &th);
906 			spidx->src.sin.sin_port = th.th_sport;
907 			spidx->dst.sin.sin_port = th.th_dport;
908 			return;
909 		case IPPROTO_UDP:
910 			spidx->ul_proto = nxt;
911 			if (!needport)
912 				goto done_proto;
913 			if (off + sizeof(struct udphdr) > m->m_pkthdr.len)
914 				goto done;
915 			m_copydata(m, off, sizeof(uh), &uh);
916 			spidx->src.sin.sin_port = uh.uh_sport;
917 			spidx->dst.sin.sin_port = uh.uh_dport;
918 			return;
919 		case IPPROTO_AH:
920 			if (off + sizeof(ip6e) > m->m_pkthdr.len)
921 				goto done;
922 			/* XXX sigh, this works but is totally bogus */
923 			m_copydata(m, off, sizeof(ip6e), &ip6e);
924 			off += (ip6e.ip6e_len + 2) << 2;
925 			nxt = ip6e.ip6e_nxt;
926 			break;
927 		case IPPROTO_ICMP:
928 			spidx->ul_proto = nxt;
929 			if (off + sizeof(struct icmp) > m->m_pkthdr.len)
930 				goto done;
931 			m_copydata(m, off, sizeof(icmph), &icmph);
932 			((struct sockaddr_in *)&spidx->src)->sin_port =
933 			    htons((uint16_t)icmph.icmp_type);
934 			((struct sockaddr_in *)&spidx->dst)->sin_port =
935 			    htons((uint16_t)icmph.icmp_code);
936 			return;
937 		default:
938 			/* XXX intermediate headers??? */
939 			spidx->ul_proto = nxt;
940 			goto done_proto;
941 		}
942 	}
943 done:
944 	spidx->ul_proto = IPSEC_ULPROTO_ANY;
945 done_proto:
946 	spidx->src.sin.sin_port = IPSEC_PORT_ANY;
947 	spidx->dst.sin.sin_port = IPSEC_PORT_ANY;
948 }
949 
950 static int
ipsec4_setspidx_ipaddr(struct mbuf * m,struct secpolicyindex * spidx)951 ipsec4_setspidx_ipaddr(struct mbuf *m, struct secpolicyindex *spidx)
952 {
953 	static const struct sockaddr_in template = {
954 		sizeof(struct sockaddr_in),
955 		AF_INET,
956 		0, { 0 }, { 0, 0, 0, 0, 0, 0, 0, 0 }
957 	};
958 
959 	spidx->src.sin = template;
960 	spidx->dst.sin = template;
961 
962 	if (m->m_len < sizeof(struct ip)) {
963 		m_copydata(m, offsetof(struct ip, ip_src),
964 		    sizeof(struct in_addr), &spidx->src.sin.sin_addr);
965 		m_copydata(m, offsetof(struct ip, ip_dst),
966 		    sizeof(struct in_addr), &spidx->dst.sin.sin_addr);
967 	} else {
968 		struct ip *ip = mtod(m, struct ip *);
969 		spidx->src.sin.sin_addr = ip->ip_src;
970 		spidx->dst.sin.sin_addr = ip->ip_dst;
971 	}
972 
973 	spidx->prefs = sizeof(struct in_addr) << 3;
974 	spidx->prefd = sizeof(struct in_addr) << 3;
975 
976 	return 0;
977 }
978 
979 #ifdef INET6
980 static void
ipsec6_get_ulp(struct mbuf * m,struct secpolicyindex * spidx,int needport)981 ipsec6_get_ulp(struct mbuf *m, struct secpolicyindex *spidx, int needport)
982 {
983 	int off, nxt;
984 	struct tcphdr th;
985 	struct udphdr uh;
986 	struct icmp6_hdr icmph;
987 
988 	KASSERT(m != NULL);
989 
990 	if (KEYDEBUG_ON(KEYDEBUG_IPSEC_DUMP)) {
991 		kdebug_mbuf(__func__, m);
992 	}
993 
994 	/* set default */
995 	spidx->ul_proto = IPSEC_ULPROTO_ANY;
996 	((struct sockaddr_in6 *)&spidx->src)->sin6_port = IPSEC_PORT_ANY;
997 	((struct sockaddr_in6 *)&spidx->dst)->sin6_port = IPSEC_PORT_ANY;
998 
999 	nxt = -1;
1000 	off = ip6_lasthdr(m, 0, IPPROTO_IPV6, &nxt);
1001 	if (off < 0 || m->m_pkthdr.len < off)
1002 		return;
1003 
1004 	switch (nxt) {
1005 	case IPPROTO_TCP:
1006 		spidx->ul_proto = nxt;
1007 		if (!needport)
1008 			break;
1009 		if (off + sizeof(struct tcphdr) > m->m_pkthdr.len)
1010 			break;
1011 		m_copydata(m, off, sizeof(th), &th);
1012 		((struct sockaddr_in6 *)&spidx->src)->sin6_port = th.th_sport;
1013 		((struct sockaddr_in6 *)&spidx->dst)->sin6_port = th.th_dport;
1014 		break;
1015 	case IPPROTO_UDP:
1016 		spidx->ul_proto = nxt;
1017 		if (!needport)
1018 			break;
1019 		if (off + sizeof(struct udphdr) > m->m_pkthdr.len)
1020 			break;
1021 		m_copydata(m, off, sizeof(uh), &uh);
1022 		((struct sockaddr_in6 *)&spidx->src)->sin6_port = uh.uh_sport;
1023 		((struct sockaddr_in6 *)&spidx->dst)->sin6_port = uh.uh_dport;
1024 		break;
1025 	case IPPROTO_ICMPV6:
1026 		spidx->ul_proto = nxt;
1027 		if (off + sizeof(struct icmp6_hdr) > m->m_pkthdr.len)
1028 			break;
1029 		m_copydata(m, off, sizeof(icmph), &icmph);
1030 		((struct sockaddr_in6 *)&spidx->src)->sin6_port =
1031 		    htons((uint16_t)icmph.icmp6_type);
1032 		((struct sockaddr_in6 *)&spidx->dst)->sin6_port =
1033 		    htons((uint16_t)icmph.icmp6_code);
1034 		break;
1035 	default:
1036 		/* XXX intermediate headers??? */
1037 		spidx->ul_proto = nxt;
1038 		break;
1039 	}
1040 }
1041 
1042 static int
ipsec6_setspidx_ipaddr(struct mbuf * m,struct secpolicyindex * spidx)1043 ipsec6_setspidx_ipaddr(struct mbuf *m, struct secpolicyindex *spidx)
1044 {
1045 	struct ip6_hdr *ip6 = NULL;
1046 	struct ip6_hdr ip6buf;
1047 	struct sockaddr_in6 *sin6;
1048 
1049 	if (m->m_len >= sizeof(*ip6)) {
1050 		ip6 = mtod(m, struct ip6_hdr *);
1051 	} else {
1052 		m_copydata(m, 0, sizeof(ip6buf), &ip6buf);
1053 		ip6 = &ip6buf;
1054 	}
1055 
1056 	sin6 = (struct sockaddr_in6 *)&spidx->src;
1057 	memset(sin6, 0, sizeof(*sin6));
1058 	sin6->sin6_family = AF_INET6;
1059 	sin6->sin6_len = sizeof(struct sockaddr_in6);
1060 	memcpy(&sin6->sin6_addr, &ip6->ip6_src, sizeof(ip6->ip6_src));
1061 	if (IN6_IS_SCOPE_LINKLOCAL(&ip6->ip6_src)) {
1062 		sin6->sin6_addr.s6_addr16[1] = 0;
1063 		sin6->sin6_scope_id = ntohs(ip6->ip6_src.s6_addr16[1]);
1064 	}
1065 	spidx->prefs = sizeof(struct in6_addr) << 3;
1066 
1067 	sin6 = (struct sockaddr_in6 *)&spidx->dst;
1068 	memset(sin6, 0, sizeof(*sin6));
1069 	sin6->sin6_family = AF_INET6;
1070 	sin6->sin6_len = sizeof(struct sockaddr_in6);
1071 	memcpy(&sin6->sin6_addr, &ip6->ip6_dst, sizeof(ip6->ip6_dst));
1072 	if (IN6_IS_SCOPE_LINKLOCAL(&ip6->ip6_dst)) {
1073 		sin6->sin6_addr.s6_addr16[1] = 0;
1074 		sin6->sin6_scope_id = ntohs(ip6->ip6_dst.s6_addr16[1]);
1075 	}
1076 	spidx->prefd = sizeof(struct in6_addr) << 3;
1077 
1078 	return 0;
1079 }
1080 #endif
1081 
1082 static void
ipsec_delpcbpolicy(struct inpcbpolicy * p)1083 ipsec_delpcbpolicy(struct inpcbpolicy *p)
1084 {
1085 
1086 	kmem_intr_free(p, sizeof(*p));
1087 }
1088 
1089 int
ipsec_init_pcbpolicy(struct socket * so,struct inpcbpolicy ** policy)1090 ipsec_init_pcbpolicy(struct socket *so, struct inpcbpolicy **policy)
1091 {
1092 	struct inpcbpolicy *new;
1093 
1094 	KASSERT(so != NULL);
1095 	KASSERT(policy != NULL);
1096 
1097 	new = kmem_intr_zalloc(sizeof(*new), KM_NOSLEEP);
1098 	if (new == NULL) {
1099 		IPSECLOG(LOG_DEBUG, "No more memory.\n");
1100 		return ENOBUFS;
1101 	}
1102 
1103 	if (IPSEC_PRIVILEGED_SO(so))
1104 		new->priv = 1;
1105 	else
1106 		new->priv = 0;
1107 
1108 	/*
1109 	 * Set dummy SPs. Actual SPs will be allocated later if needed.
1110 	 */
1111 	new->sp_in = &ipsec_dummy_sp;
1112 	new->sp_out = &ipsec_dummy_sp;
1113 
1114 	*policy = new;
1115 
1116 	return 0;
1117 }
1118 
1119 static void
ipsec_destroy_policy(struct secpolicy * sp)1120 ipsec_destroy_policy(struct secpolicy *sp)
1121 {
1122 
1123 	if (sp == &ipsec_dummy_sp) {
1124 		; /* It's dummy. No need to free it. */
1125 	} else {
1126 		/*
1127 		 * We cannot destroy here because it can be called in
1128 		 * softint. So mark the SP as DEAD and let the timer
1129 		 * destroy it. See key_timehandler_spd.
1130 		 */
1131 		sp->state = IPSEC_SPSTATE_DEAD;
1132 	}
1133 }
1134 
1135 int
ipsec_set_policy(struct inpcb * inp,const void * request,size_t len,kauth_cred_t cred)1136 ipsec_set_policy(struct inpcb *inp, const void *request, size_t len,
1137     kauth_cred_t cred)
1138 {
1139 	const struct sadb_x_policy *xpl;
1140 	struct secpolicy *newsp, *oldsp;
1141 	struct secpolicy **policy;
1142 	int error;
1143 
1144 	KASSERT(!cpu_softintr_p());
1145 	KASSERT(inp != NULL);
1146 	KASSERT(inp_locked(inp));
1147 	KASSERT(request != NULL);
1148 
1149 	if (len < sizeof(*xpl))
1150 		return EINVAL;
1151 	xpl = (const struct sadb_x_policy *)request;
1152 
1153 	KASSERT(inp->inp_sp != NULL);
1154 
1155 	/* select direction */
1156 	switch (xpl->sadb_x_policy_dir) {
1157 	case IPSEC_DIR_INBOUND:
1158 		policy = &inp->inp_sp->sp_in;
1159 		break;
1160 	case IPSEC_DIR_OUTBOUND:
1161 		policy = &inp->inp_sp->sp_out;
1162 		break;
1163 	default:
1164 		IPSECLOG(LOG_ERR, "invalid direction=%u\n",
1165 		    xpl->sadb_x_policy_dir);
1166 		return EINVAL;
1167 	}
1168 
1169 	/* sanity check. */
1170 	if (policy == NULL || *policy == NULL)
1171 		return EINVAL;
1172 
1173 	if (KEYDEBUG_ON(KEYDEBUG_IPSEC_DUMP)) {
1174 		kdebug_sadb_xpolicy("set passed policy", request);
1175 	}
1176 
1177 	/* check policy type */
1178 	/* ipsec_set_policy() accepts IPSEC, ENTRUST and BYPASS. */
1179 	if (xpl->sadb_x_policy_type == IPSEC_POLICY_DISCARD ||
1180 	    xpl->sadb_x_policy_type == IPSEC_POLICY_NONE)
1181 		return EINVAL;
1182 
1183 	/* check privileged socket */
1184 	if (xpl->sadb_x_policy_type == IPSEC_POLICY_BYPASS) {
1185 		error = kauth_authorize_network(cred, KAUTH_NETWORK_IPSEC,
1186 		    KAUTH_REQ_NETWORK_IPSEC_BYPASS, NULL, NULL, NULL);
1187 		if (error)
1188 			return error;
1189 	}
1190 
1191 	/* allocation new SP entry */
1192 	if ((newsp = key_msg2sp(xpl, len, &error)) == NULL)
1193 		return error;
1194 
1195 	key_init_sp(newsp);
1196 	newsp->created = time_uptime;
1197 	/* Insert the global list for SPs for sockets */
1198 	key_socksplist_add(newsp);
1199 
1200 	/* clear old SP and set new SP */
1201 	oldsp = *policy;
1202 	*policy = newsp;
1203 	ipsec_destroy_policy(oldsp);
1204 
1205 	if (KEYDEBUG_ON(KEYDEBUG_IPSEC_DUMP)) {
1206 		printf("%s: new policy\n", __func__);
1207 		kdebug_secpolicy(newsp);
1208 	}
1209 
1210 	return 0;
1211 }
1212 
1213 int
ipsec_get_policy(struct inpcb * inp,const void * request,size_t len,struct mbuf ** mp)1214 ipsec_get_policy(struct inpcb *inp, const void *request, size_t len,
1215     struct mbuf **mp)
1216 {
1217 	const struct sadb_x_policy *xpl;
1218 	struct secpolicy *policy;
1219 
1220 	/* sanity check. */
1221 	if (inp == NULL || request == NULL || mp == NULL)
1222 		return EINVAL;
1223 	KASSERT(inp->inp_sp != NULL);
1224 	if (len < sizeof(*xpl))
1225 		return EINVAL;
1226 	xpl = (const struct sadb_x_policy *)request;
1227 
1228 	/* select direction */
1229 	switch (xpl->sadb_x_policy_dir) {
1230 	case IPSEC_DIR_INBOUND:
1231 		policy = inp->inp_sp->sp_in;
1232 		break;
1233 	case IPSEC_DIR_OUTBOUND:
1234 		policy = inp->inp_sp->sp_out;
1235 		break;
1236 	default:
1237 		IPSECLOG(LOG_ERR, "invalid direction=%u\n",
1238 		    xpl->sadb_x_policy_dir);
1239 		return EINVAL;
1240 	}
1241 
1242 	if (policy == NULL)
1243 		return EINVAL;
1244 
1245 	*mp = key_sp2msg(policy, M_NOWAIT);
1246 	if (!*mp) {
1247 		IPSECLOG(LOG_DEBUG, "No more memory.\n");
1248 		return ENOBUFS;
1249 	}
1250 
1251 	if (KEYDEBUG_ON(KEYDEBUG_IPSEC_DUMP)) {
1252 		kdebug_mbuf(__func__, *mp);
1253 	}
1254 
1255 	return 0;
1256 }
1257 
1258 int
ipsec_delete_pcbpolicy(struct inpcb * inp)1259 ipsec_delete_pcbpolicy(struct inpcb *inp)
1260 {
1261 
1262 	KASSERT(inp != NULL);
1263 
1264 	if (inp->inp_sp == NULL)
1265 		return 0;
1266 
1267 	if (inp->inp_sp->sp_in != NULL)
1268 		ipsec_destroy_policy(inp->inp_sp->sp_in);
1269 
1270 	if (inp->inp_sp->sp_out != NULL)
1271 		ipsec_destroy_policy(inp->inp_sp->sp_out);
1272 
1273 	ipsec_invalpcbcache(inp->inp_sp, IPSEC_DIR_ANY);
1274 
1275 	ipsec_delpcbpolicy(inp->inp_sp);
1276 	inp->inp_sp = NULL;
1277 
1278 	return 0;
1279 }
1280 
1281 /*
1282  * Return the current level (either IPSEC_LEVEL_USE or IPSEC_LEVEL_REQUIRE).
1283  */
1284 u_int
ipsec_get_reqlevel(const struct ipsecrequest * isr)1285 ipsec_get_reqlevel(const struct ipsecrequest *isr)
1286 {
1287 	u_int level = 0;
1288 	u_int esp_trans_deflev, esp_net_deflev;
1289 	u_int ah_trans_deflev, ah_net_deflev;
1290 
1291 	KASSERT(isr != NULL);
1292 	KASSERT(isr->sp != NULL);
1293 	KASSERTMSG(
1294 	    isr->sp->spidx.src.sa.sa_family == isr->sp->spidx.dst.sa.sa_family,
1295 	    "af family mismatch, src %u, dst %u",
1296 	    isr->sp->spidx.src.sa.sa_family, isr->sp->spidx.dst.sa.sa_family);
1297 
1298 /* XXX note that we have ipseclog() expanded here - code sync issue */
1299 #define IPSEC_CHECK_DEFAULT(lev)					\
1300     (((lev) != IPSEC_LEVEL_USE && (lev) != IPSEC_LEVEL_REQUIRE		\
1301     && (lev) != IPSEC_LEVEL_UNIQUE) ?					\
1302 	(ipsec_debug ? log(LOG_INFO, "fixed system default level " #lev \
1303 	":%d->%d\n", (lev), IPSEC_LEVEL_REQUIRE) : (void)0),		\
1304 	(lev) = IPSEC_LEVEL_REQUIRE, (lev)				\
1305     : (lev))
1306 
1307 	/* set default level */
1308 	switch (((struct sockaddr *)&isr->sp->spidx.src)->sa_family) {
1309 #ifdef INET
1310 	case AF_INET:
1311 		esp_trans_deflev = IPSEC_CHECK_DEFAULT(ip4_esp_trans_deflev);
1312 		esp_net_deflev = IPSEC_CHECK_DEFAULT(ip4_esp_net_deflev);
1313 		ah_trans_deflev = IPSEC_CHECK_DEFAULT(ip4_ah_trans_deflev);
1314 		ah_net_deflev = IPSEC_CHECK_DEFAULT(ip4_ah_net_deflev);
1315 		break;
1316 #endif
1317 #ifdef INET6
1318 	case AF_INET6:
1319 		esp_trans_deflev = IPSEC_CHECK_DEFAULT(ip6_esp_trans_deflev);
1320 		esp_net_deflev = IPSEC_CHECK_DEFAULT(ip6_esp_net_deflev);
1321 		ah_trans_deflev = IPSEC_CHECK_DEFAULT(ip6_ah_trans_deflev);
1322 		ah_net_deflev = IPSEC_CHECK_DEFAULT(ip6_ah_net_deflev);
1323 		break;
1324 #endif
1325 	default:
1326 		panic("%s: unknown af %u", __func__,
1327 		    isr->sp->spidx.src.sa.sa_family);
1328 	}
1329 
1330 #undef IPSEC_CHECK_DEFAULT
1331 
1332 	/* set level */
1333 	switch (isr->level) {
1334 	case IPSEC_LEVEL_DEFAULT:
1335 		switch (isr->saidx.proto) {
1336 		case IPPROTO_ESP:
1337 			if (isr->saidx.mode == IPSEC_MODE_TUNNEL)
1338 				level = esp_net_deflev;
1339 			else
1340 				level = esp_trans_deflev;
1341 			break;
1342 		case IPPROTO_AH:
1343 			if (isr->saidx.mode == IPSEC_MODE_TUNNEL)
1344 				level = ah_net_deflev;
1345 			else
1346 				level = ah_trans_deflev;
1347 			break;
1348 		case IPPROTO_IPCOMP:
1349 			/*
1350 			 * we don't really care, as IPcomp document says that
1351 			 * we shouldn't compress small packets
1352 			 */
1353 			level = IPSEC_LEVEL_USE;
1354 			break;
1355 		default:
1356 			panic("%s: Illegal protocol defined %u", __func__,
1357 			    isr->saidx.proto);
1358 		}
1359 		break;
1360 
1361 	case IPSEC_LEVEL_USE:
1362 	case IPSEC_LEVEL_REQUIRE:
1363 		level = isr->level;
1364 		break;
1365 	case IPSEC_LEVEL_UNIQUE:
1366 		level = IPSEC_LEVEL_REQUIRE;
1367 		break;
1368 
1369 	default:
1370 		panic("%s: Illegal IPsec level %u", __func__, isr->level);
1371 	}
1372 
1373 	return level;
1374 }
1375 
1376 /*
1377  * Check security policy requirements against the actual packet contents.
1378  *
1379  * If the SP requires an IPsec packet, and the packet was neither AH nor ESP,
1380  * then kick it.
1381  */
1382 static int
ipsec_sp_reject(const struct secpolicy * sp,const struct mbuf * m)1383 ipsec_sp_reject(const struct secpolicy *sp, const struct mbuf *m)
1384 {
1385 	struct ipsecrequest *isr;
1386 
1387 	if (KEYDEBUG_ON(KEYDEBUG_IPSEC_DATA)) {
1388 		printf("%s: using SP\n", __func__);
1389 		kdebug_secpolicy(sp);
1390 	}
1391 
1392 	/* check policy */
1393 	switch (sp->policy) {
1394 	case IPSEC_POLICY_DISCARD:
1395 		return 1;
1396 	case IPSEC_POLICY_BYPASS:
1397 	case IPSEC_POLICY_NONE:
1398 		return 0;
1399 	}
1400 
1401 	KASSERTMSG(sp->policy == IPSEC_POLICY_IPSEC,
1402 	    "invalid policy %u", sp->policy);
1403 
1404 	/* XXX should compare policy against ipsec header history */
1405 
1406 	for (isr = sp->req; isr != NULL; isr = isr->next) {
1407 		if (ipsec_get_reqlevel(isr) != IPSEC_LEVEL_REQUIRE)
1408 			continue;
1409 		switch (isr->saidx.proto) {
1410 		case IPPROTO_ESP:
1411 			if ((m->m_flags & M_DECRYPTED) == 0) {
1412 				KEYDEBUG_PRINTF(KEYDEBUG_IPSEC_DUMP,
1413 				    "ESP m_flags:%x\n", m->m_flags);
1414 				return 1;
1415 			}
1416 			break;
1417 		case IPPROTO_AH:
1418 			if ((m->m_flags & M_AUTHIPHDR) == 0) {
1419 				KEYDEBUG_PRINTF(KEYDEBUG_IPSEC_DUMP,
1420 				    "AH m_flags:%x\n", m->m_flags);
1421 				return 1;
1422 			}
1423 			break;
1424 		case IPPROTO_IPCOMP:
1425 			/*
1426 			 * We don't really care, as IPcomp document
1427 			 * says that we shouldn't compress small
1428 			 * packets, IPComp policy should always be
1429 			 * treated as being in "use" level.
1430 			 */
1431 			break;
1432 		}
1433 	}
1434 
1435 	return 0;
1436 }
1437 
1438 /*
1439  * Check security policy requirements.
1440  */
1441 int
ipsec_in_reject(struct mbuf * m,struct inpcb * inp)1442 ipsec_in_reject(struct mbuf *m, struct inpcb *inp)
1443 {
1444 	struct secpolicy *sp;
1445 	int error;
1446 	int result;
1447 
1448 	KASSERT(m != NULL);
1449 
1450 	if (inp == NULL)
1451 		sp = ipsec_getpolicybyaddr(m, IPSEC_DIR_INBOUND,
1452 		    IP_FORWARDING, &error);
1453 	else
1454 		sp = ipsec_getpolicybysock(m, IPSEC_DIR_INBOUND,
1455 		    inp, &error);
1456 
1457 	if (sp != NULL) {
1458 		result = ipsec_sp_reject(sp, m);
1459 		if (result)
1460 			IPSEC_STATINC(IPSEC_STAT_IN_POLVIO);
1461 		KEY_SP_UNREF(&sp);
1462 	} else {
1463 		result = 0;
1464 	}
1465 	return result;
1466 }
1467 
1468 /*
1469  * Compute the byte size to be occupied by the IPsec header. If it is
1470  * tunneled, it includes the size of outer IP header.
1471  */
1472 static size_t
ipsec_sp_hdrsiz(const struct secpolicy * sp,const struct mbuf * m)1473 ipsec_sp_hdrsiz(const struct secpolicy *sp, const struct mbuf *m)
1474 {
1475 	struct ipsecrequest *isr;
1476 	size_t siz;
1477 
1478 	if (KEYDEBUG_ON(KEYDEBUG_IPSEC_DATA)) {
1479 		printf("%s: using SP\n", __func__);
1480 		kdebug_secpolicy(sp);
1481 	}
1482 
1483 	switch (sp->policy) {
1484 	case IPSEC_POLICY_DISCARD:
1485 	case IPSEC_POLICY_BYPASS:
1486 	case IPSEC_POLICY_NONE:
1487 		return 0;
1488 	}
1489 
1490 	KASSERTMSG(sp->policy == IPSEC_POLICY_IPSEC,
1491 	    "invalid policy %u", sp->policy);
1492 
1493 	siz = 0;
1494 	for (isr = sp->req; isr != NULL; isr = isr->next) {
1495 		size_t clen = 0;
1496 		struct secasvar *sav;
1497 
1498 		switch (isr->saidx.proto) {
1499 		case IPPROTO_ESP:
1500 			sav = ipsec_lookup_sa(isr, m);
1501 			if (sav != NULL) {
1502 				clen = esp_hdrsiz(sav);
1503 				KEY_SA_UNREF(&sav);
1504 			} else
1505 				clen = esp_hdrsiz(NULL);
1506 			break;
1507 		case IPPROTO_AH:
1508 			sav = ipsec_lookup_sa(isr, m);
1509 			if (sav != NULL) {
1510 				clen = ah_hdrsiz(sav);
1511 				KEY_SA_UNREF(&sav);
1512 			} else
1513 				clen = ah_hdrsiz(NULL);
1514 			break;
1515 		case IPPROTO_IPCOMP:
1516 			clen = sizeof(struct ipcomp);
1517 			break;
1518 		}
1519 
1520 		if (isr->saidx.mode == IPSEC_MODE_TUNNEL) {
1521 			switch (isr->saidx.dst.sa.sa_family) {
1522 			case AF_INET:
1523 				clen += sizeof(struct ip);
1524 				break;
1525 #ifdef INET6
1526 			case AF_INET6:
1527 				clen += sizeof(struct ip6_hdr);
1528 				break;
1529 #endif
1530 			default:
1531 				IPSECLOG(LOG_ERR, "unknown AF %d in "
1532 				    "IPsec tunnel SA\n",
1533 				    ((const struct sockaddr *)&isr->saidx.dst)
1534 				    ->sa_family);
1535 				break;
1536 			}
1537 		}
1538 		siz += clen;
1539 	}
1540 
1541 	return siz;
1542 }
1543 
1544 size_t
ipsec_hdrsiz(struct mbuf * m,u_int dir,struct inpcb * inp)1545 ipsec_hdrsiz(struct mbuf *m, u_int dir, struct inpcb *inp)
1546 {
1547 	struct secpolicy *sp;
1548 	int error;
1549 	size_t size;
1550 
1551 	KASSERT(m != NULL);
1552 	KASSERTMSG(inp == NULL || inp->inp_socket != NULL,
1553 	    "socket w/o inpcb");
1554 
1555 	if (inp == NULL)
1556 		sp = ipsec_getpolicybyaddr(m, dir, IP_FORWARDING, &error);
1557 	else
1558 		sp = ipsec_getpolicybysock(m, dir, inp, &error);
1559 
1560 	if (sp != NULL) {
1561 		size = ipsec_sp_hdrsiz(sp, m);
1562 		KEYDEBUG_PRINTF(KEYDEBUG_IPSEC_DATA, "size:%zu.\n", size);
1563 		KEY_SP_UNREF(&sp);
1564 	} else {
1565 		size = 0;
1566 	}
1567 
1568 	return size;
1569 }
1570 
1571 /*
1572  * Check the variable replay window.
1573  * ipsec_chkreplay() performs replay check before ICV verification.
1574  * ipsec_updatereplay() updates replay bitmap.  This must be called after
1575  * ICV verification (it also performs replay check, which is usually done
1576  * beforehand).
1577  * 0 (zero) is returned if packet disallowed, 1 if packet permitted.
1578  *
1579  * based on RFC 2401.
1580  */
1581 int
ipsec_chkreplay(u_int32_t seq,const struct secasvar * sav)1582 ipsec_chkreplay(u_int32_t seq, const struct secasvar *sav)
1583 {
1584 	const struct secreplay *replay;
1585 	u_int32_t diff;
1586 	int fr;
1587 	u_int32_t wsizeb;	/* constant: bits of window size */
1588 	int frlast;		/* constant: last frame */
1589 
1590 	KASSERT(sav != NULL);
1591 	KASSERT(sav->replay != NULL);
1592 
1593 	replay = sav->replay;
1594 
1595 	if (replay->wsize == 0)
1596 		return 1;	/* no need to check replay. */
1597 
1598 	/* constant */
1599 	frlast = replay->wsize - 1;
1600 	wsizeb = replay->wsize << 3;
1601 
1602 	/* sequence number of 0 is invalid */
1603 	if (seq == 0)
1604 		return 0;
1605 
1606 	/* first time is always okay */
1607 	if (replay->count == 0)
1608 		return 1;
1609 
1610 	if (seq > replay->lastseq) {
1611 		/* larger sequences are okay */
1612 		return 1;
1613 	} else {
1614 		/* seq is equal or less than lastseq. */
1615 		diff = replay->lastseq - seq;
1616 
1617 		/* over range to check, i.e. too old or wrapped */
1618 		if (diff >= wsizeb)
1619 			return 0;
1620 
1621 		fr = frlast - diff / 8;
1622 
1623 		/* this packet already seen ? */
1624 		if ((replay->bitmap)[fr] & (1 << (diff % 8)))
1625 			return 0;
1626 
1627 		/* out of order but good */
1628 		return 1;
1629 	}
1630 }
1631 
1632 /*
1633  * check replay counter whether to update or not.
1634  * OUT:	0:	OK
1635  *	1:	NG
1636  */
1637 int
ipsec_updatereplay(u_int32_t seq,const struct secasvar * sav)1638 ipsec_updatereplay(u_int32_t seq, const struct secasvar *sav)
1639 {
1640 	struct secreplay *replay;
1641 	u_int32_t diff;
1642 	int fr;
1643 	u_int32_t wsizeb;	/* constant: bits of window size */
1644 	int frlast;		/* constant: last frame */
1645 
1646 	KASSERT(sav != NULL);
1647 	KASSERT(sav->replay != NULL);
1648 
1649 	replay = sav->replay;
1650 
1651 	if (replay->wsize == 0)
1652 		goto ok;	/* no need to check replay. */
1653 
1654 	/* constant */
1655 	frlast = replay->wsize - 1;
1656 	wsizeb = replay->wsize << 3;
1657 
1658 	/* sequence number of 0 is invalid */
1659 	if (seq == 0)
1660 		return 1;
1661 
1662 	/* first time */
1663 	if (replay->count == 0) {
1664 		replay->lastseq = seq;
1665 		memset(replay->bitmap, 0, replay->wsize);
1666 		(replay->bitmap)[frlast] = 1;
1667 		goto ok;
1668 	}
1669 
1670 	if (seq > replay->lastseq) {
1671 		/* seq is larger than lastseq. */
1672 		diff = seq - replay->lastseq;
1673 
1674 		/* new larger sequence number */
1675 		if (diff < wsizeb) {
1676 			/* In window */
1677 			/* set bit for this packet */
1678 			vshiftl(replay->bitmap, diff, replay->wsize);
1679 			(replay->bitmap)[frlast] |= 1;
1680 		} else {
1681 			/* this packet has a "way larger" */
1682 			memset(replay->bitmap, 0, replay->wsize);
1683 			(replay->bitmap)[frlast] = 1;
1684 		}
1685 		replay->lastseq = seq;
1686 
1687 		/* larger is good */
1688 	} else {
1689 		/* seq is equal or less than lastseq. */
1690 		diff = replay->lastseq - seq;
1691 
1692 		/* over range to check, i.e. too old or wrapped */
1693 		if (diff >= wsizeb)
1694 			return 1;
1695 
1696 		fr = frlast - diff / 8;
1697 
1698 		/* this packet already seen ? */
1699 		if ((replay->bitmap)[fr] & (1 << (diff % 8)))
1700 			return 1;
1701 
1702 		/* mark as seen */
1703 		(replay->bitmap)[fr] |= (1 << (diff % 8));
1704 
1705 		/* out of order but good */
1706 	}
1707 
1708 ok:
1709 	if (replay->count == ~0) {
1710 		char buf[IPSEC_LOGSASTRLEN];
1711 
1712 		/* set overflow flag */
1713 		replay->overflow++;
1714 
1715 		/* don't increment, no more packets accepted */
1716 		if ((sav->flags & SADB_X_EXT_CYCSEQ) == 0)
1717 			return 1;
1718 
1719 		IPSECLOG(LOG_WARNING, "replay counter made %d cycle. %s\n",
1720 		    replay->overflow, ipsec_logsastr(sav, buf, sizeof(buf)));
1721 	}
1722 
1723 	replay->count++;
1724 
1725 	return 0;
1726 }
1727 
1728 /*
1729  * shift variable length buffer to left.
1730  * IN:	bitmap: pointer to the buffer
1731  *	nbit:	the number of to shift.
1732  *	wsize:	buffer size (bytes).
1733  */
1734 static void
vshiftl(unsigned char * bitmap,int nbit,int wsize)1735 vshiftl(unsigned char *bitmap, int nbit, int wsize)
1736 {
1737 	int s, j, i;
1738 	unsigned char over;
1739 
1740 	for (j = 0; j < nbit; j += 8) {
1741 		s = (nbit - j < 8) ? (nbit - j): 8;
1742 		bitmap[0] <<= s;
1743 		for (i = 1; i < wsize; i++) {
1744 			over = (bitmap[i] >> (8 - s));
1745 			bitmap[i] <<= s;
1746 			bitmap[i-1] |= over;
1747 		}
1748 	}
1749 
1750 	return;
1751 }
1752 
1753 /* Return a printable string for the address. */
1754 const char *
ipsec_address(const union sockaddr_union * sa,char * buf,size_t size)1755 ipsec_address(const union sockaddr_union *sa, char *buf, size_t size)
1756 {
1757 	switch (sa->sa.sa_family) {
1758 	case AF_INET:
1759 		in_print(buf, size, &sa->sin.sin_addr);
1760 		return buf;
1761 #if INET6
1762 	case AF_INET6:
1763 		in6_print(buf, size, &sa->sin6.sin6_addr);
1764 		return buf;
1765 #endif
1766 	default:
1767 		return "(unknown address family)";
1768 	}
1769 }
1770 
1771 const char *
ipsec_logsastr(const struct secasvar * sav,char * buf,size_t size)1772 ipsec_logsastr(const struct secasvar *sav, char *buf, size_t size)
1773 {
1774 	const struct secasindex *saidx = &sav->sah->saidx;
1775 	char sbuf[IPSEC_ADDRSTRLEN], dbuf[IPSEC_ADDRSTRLEN];
1776 
1777 	KASSERTMSG(saidx->src.sa.sa_family == saidx->dst.sa.sa_family,
1778 	    "af family mismatch, src %u, dst %u",
1779 	    saidx->src.sa.sa_family, saidx->dst.sa.sa_family);
1780 
1781 	snprintf(buf, size, "SA(SPI=%u src=%s dst=%s)",
1782 	    (u_int32_t)ntohl(sav->spi),
1783 	    ipsec_address(&saidx->src, sbuf, sizeof(sbuf)),
1784 	    ipsec_address(&saidx->dst, dbuf, sizeof(dbuf)));
1785 
1786 	return buf;
1787 }
1788 
1789 #ifdef INET6
1790 struct secpolicy *
ipsec6_check_policy(struct mbuf * m,struct inpcb * inp,int flags,int * needipsecp,int * errorp)1791 ipsec6_check_policy(struct mbuf *m, struct inpcb *inp, int flags,
1792     int *needipsecp, int *errorp)
1793 {
1794 	struct secpolicy *sp = NULL;
1795 	int error = 0;
1796 	int needipsec = 0;
1797 
1798 	if (ipsec_outdone(m)) {
1799 		goto skippolicycheck;
1800 	}
1801 	if (inp && ipsec_pcb_skip_ipsec(inp->inp_sp, IPSEC_DIR_OUTBOUND)) {
1802 		goto skippolicycheck;
1803 	}
1804 	sp = ipsec_checkpolicy(m, IPSEC_DIR_OUTBOUND, flags, &error, inp);
1805 
1806 	/*
1807 	 * There are four return cases:
1808 	 *	sp != NULL                    apply IPsec policy
1809 	 *	sp == NULL, error == 0        no IPsec handling needed
1810 	 *	sp == NULL, error == -EINVAL  discard packet w/o error
1811 	 *	sp == NULL, error != 0        discard packet, report error
1812 	 */
1813 	if (sp == NULL) {
1814 		needipsec = 0;
1815 	} else {
1816 		needipsec = 1;
1817 	}
1818 
1819 skippolicycheck:
1820 	*errorp = error;
1821 	*needipsecp = needipsec;
1822 	return sp;
1823 }
1824 
1825 /*
1826  * calculate UDP checksum for UDP encapsulated ESP for IPv6.
1827  *
1828  * RFC2460(Internet Protocol, Version 6 Specification) says:
1829  *
1830  *   IPv6 receivers MUST discard UDP packets with a zero checksum.
1831  *
1832  * There is more relaxed specification RFC6935(IPv6 and UDP Checksums for
1833  * Tunneled Packets). The document allows zero checksum. It's too
1834  * late to publish, there are a lot of interoperability problems...
1835  */
1836 void
ipsec6_udp_cksum(struct mbuf * m)1837 ipsec6_udp_cksum(struct mbuf *m)
1838 {
1839 	struct ip6_hdr *ip6;
1840 	uint16_t plen, uh_sum;
1841 	int off;
1842 
1843 	/* must called after m_pullup() */
1844 	KASSERT(m->m_len >= sizeof(struct ip6_hdr));
1845 
1846 	ip6 = mtod(m, struct ip6_hdr *);
1847 	KASSERT(ip6->ip6_nxt == IPPROTO_UDP);
1848 
1849 	/* ip6->ip6_plen can not be updated before ip6_output() */
1850 	plen = m->m_pkthdr.len - sizeof(*ip6);
1851 	KASSERT(plen >= sizeof(struct udphdr));
1852 
1853 	uh_sum = in6_cksum(m, IPPROTO_UDP, sizeof(*ip6), plen);
1854 	if (uh_sum == 0)
1855 		uh_sum = 0xffff;
1856 
1857 	off = sizeof(*ip6) + offsetof(struct udphdr, uh_sum);
1858 	m_copyback(m, off, sizeof(uh_sum), (void *)&uh_sum);
1859 }
1860 #endif /* INET6 */
1861 
1862 /*
1863  * -----------------------------------------------------------------------------
1864  */
1865 
1866 /* XXX this stuff doesn't belong here... */
1867 
1868 static struct xformsw *xforms = NULL;
1869 
1870 /*
1871  * Register a transform; typically at system startup.
1872  */
1873 void
xform_register(struct xformsw * xsp)1874 xform_register(struct xformsw *xsp)
1875 {
1876 	xsp->xf_next = xforms;
1877 	xforms = xsp;
1878 }
1879 
1880 /*
1881  * Initialize transform support in an sav.
1882  */
1883 int
xform_init(struct secasvar * sav,int xftype)1884 xform_init(struct secasvar *sav, int xftype)
1885 {
1886 	struct xformsw *xsp;
1887 
1888 	if (sav->tdb_xform != NULL)	/* previously initialized */
1889 		return 0;
1890 	for (xsp = xforms; xsp; xsp = xsp->xf_next)
1891 		if (xsp->xf_type == xftype)
1892 			return (*xsp->xf_init)(sav, xsp);
1893 
1894 	IPSECLOG(LOG_DEBUG, "no match for xform type %d\n", xftype);
1895 	return EINVAL;
1896 }
1897 
1898 /*
1899  * XXXJRT This should be done as a protosw init call.
1900  */
1901 void
ipsec_attach(void)1902 ipsec_attach(void)
1903 {
1904 
1905 	ipsec_output_init();
1906 
1907 	ipsecstat_percpu = percpu_alloc(sizeof(uint64_t) * IPSEC_NSTATS);
1908 
1909 	sysctl_net_inet_ipsec_setup(NULL);
1910 #ifdef INET6
1911 	sysctl_net_inet6_ipsec6_setup(NULL);
1912 #endif
1913 
1914 	ah_attach();
1915 	esp_attach();
1916 	ipcomp_attach();
1917 	ipe4_attach();
1918 #ifdef TCP_SIGNATURE
1919 	tcpsignature_attach();
1920 #endif
1921 }
1922