1 1.93 ozaki /* $NetBSD: ipsec.h,v 1.93 2022/10/28 05:23:09 ozaki-r Exp $ */ 2 1.73 maxv /* $FreeBSD: ipsec.h,v 1.2.4.2 2004/02/14 22:23:23 bms Exp $ */ 3 1.1 jonathan /* $KAME: ipsec.h,v 1.53 2001/11/20 08:32:38 itojun Exp $ */ 4 1.1 jonathan 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 #ifndef _NETIPSEC_IPSEC_H_ 35 1.1 jonathan #define _NETIPSEC_IPSEC_H_ 36 1.1 jonathan 37 1.23 ad #if defined(_KERNEL_OPT) 38 1.1 jonathan #include "opt_inet.h" 39 1.1 jonathan #include "opt_ipsec.h" 40 1.1 jonathan #endif 41 1.1 jonathan 42 1.1 jonathan #include <net/pfkeyv2.h> 43 1.1 jonathan 44 1.1 jonathan #ifdef _KERNEL 45 1.50 ozaki #include <sys/socketvar.h> 46 1.58 ozaki #include <sys/localcount.h> 47 1.1 jonathan 48 1.92 ozaki #include <netinet/in_pcb.h> 49 1.31 drochner #include <netipsec/keydb.h> 50 1.30 drochner 51 1.1 jonathan /* 52 1.1 jonathan * Security Policy Index 53 1.1 jonathan * Ensure that both address families in the "src" and "dst" are same. 54 1.1 jonathan * When the value of the ul_proto is ICMPv6, the port field in "src" 55 1.1 jonathan * specifies ICMPv6 type, and the port field in "dst" specifies ICMPv6 code. 56 1.1 jonathan */ 57 1.1 jonathan struct secpolicyindex { 58 1.1 jonathan u_int8_t dir; /* direction of packet flow, see blow */ 59 1.1 jonathan union sockaddr_union src; /* IP src address for SP */ 60 1.1 jonathan union sockaddr_union dst; /* IP dst address for SP */ 61 1.1 jonathan u_int8_t prefs; /* prefix length in bits for src */ 62 1.1 jonathan u_int8_t prefd; /* prefix length in bits for dst */ 63 1.1 jonathan u_int16_t ul_proto; /* upper layer Protocol */ 64 1.1 jonathan }; 65 1.1 jonathan 66 1.1 jonathan /* Security Policy Data Base */ 67 1.1 jonathan struct secpolicy { 68 1.57 ozaki struct pslist_entry pslist_entry; 69 1.1 jonathan 70 1.58 ozaki struct localcount localcount; /* reference count */ 71 1.1 jonathan struct secpolicyindex spidx; /* selector */ 72 1.1 jonathan u_int32_t id; /* It's unique number on the system. */ 73 1.1 jonathan u_int state; /* 0: dead, others: alive */ 74 1.1 jonathan #define IPSEC_SPSTATE_DEAD 0 75 1.1 jonathan #define IPSEC_SPSTATE_ALIVE 1 76 1.1 jonathan 77 1.62 knakahar u_int origin; /* who generate this SP. */ 78 1.62 knakahar #define IPSEC_SPORIGIN_USER 0 79 1.62 knakahar #define IPSEC_SPORIGIN_KERNEL 1 80 1.62 knakahar 81 1.1 jonathan u_int policy; /* DISCARD, NONE or IPSEC, see keyv2.h */ 82 1.1 jonathan struct ipsecrequest *req; 83 1.1 jonathan /* pointer to the ipsec request tree, */ 84 1.1 jonathan /* if policy == IPSEC else this value == NULL.*/ 85 1.1 jonathan 86 1.1 jonathan /* 87 1.1 jonathan * lifetime handler. 88 1.1 jonathan * the policy can be used without limitiation if both lifetime and 89 1.1 jonathan * validtime are zero. 90 1.1 jonathan * "lifetime" is passed by sadb_lifetime.sadb_lifetime_addtime. 91 1.1 jonathan * "validtime" is passed by sadb_lifetime.sadb_lifetime_usetime. 92 1.1 jonathan */ 93 1.26 drochner time_t created; /* time created the policy */ 94 1.26 drochner time_t lastused; /* updated every when kernel sends a packet */ 95 1.26 drochner time_t lifetime; /* duration of the lifetime of this policy */ 96 1.26 drochner time_t validtime; /* duration this policy is valid without use */ 97 1.1 jonathan }; 98 1.1 jonathan 99 1.1 jonathan /* Request for IPsec */ 100 1.1 jonathan struct ipsecrequest { 101 1.1 jonathan struct ipsecrequest *next; 102 1.1 jonathan /* pointer to next structure */ 103 1.1 jonathan /* If NULL, it means the end of chain. */ 104 1.1 jonathan struct secasindex saidx;/* hint for search proper SA */ 105 1.1 jonathan /* if __ss_len == 0 then no address specified.*/ 106 1.1 jonathan u_int level; /* IPsec level defined below. */ 107 1.1 jonathan 108 1.1 jonathan struct secpolicy *sp; /* back pointer to SP */ 109 1.1 jonathan }; 110 1.1 jonathan 111 1.1 jonathan /* security policy in PCB */ 112 1.1 jonathan struct inpcbpolicy { 113 1.1 jonathan struct secpolicy *sp_in; 114 1.1 jonathan struct secpolicy *sp_out; 115 1.1 jonathan int priv; /* privileged socket ? */ 116 1.7 thorpej 117 1.7 thorpej /* cached policy */ 118 1.7 thorpej struct { 119 1.7 thorpej struct secpolicy *cachesp; 120 1.7 thorpej struct secpolicyindex cacheidx; 121 1.7 thorpej int cachehint; /* processing requirement hint: */ 122 1.49 ozaki #define IPSEC_PCBHINT_UNKNOWN 0 /* Unknown */ 123 1.7 thorpej #define IPSEC_PCBHINT_YES 1 /* IPsec processing is required */ 124 1.7 thorpej #define IPSEC_PCBHINT_NO 2 /* IPsec processing not required */ 125 1.7 thorpej u_int cachegen; /* spdgen when cache filled */ 126 1.7 thorpej } sp_cache[3]; /* XXX 3 == IPSEC_DIR_MAX */ 127 1.7 thorpej int sp_cacheflags; 128 1.7 thorpej #define IPSEC_PCBSP_CONNECTED 1 129 1.92 ozaki struct inpcb *sp_inp; /* back pointer */ 130 1.1 jonathan }; 131 1.1 jonathan 132 1.50 ozaki extern u_int ipsec_spdgen; 133 1.50 ozaki 134 1.74 christos static __inline bool 135 1.50 ozaki ipsec_pcb_skip_ipsec(struct inpcbpolicy *pcbsp, int dir) 136 1.50 ozaki { 137 1.50 ozaki 138 1.92 ozaki KASSERT(inp_locked(pcbsp->sp_inp)); 139 1.50 ozaki 140 1.50 ozaki return pcbsp->sp_cache[(dir)].cachehint == IPSEC_PCBHINT_NO && 141 1.50 ozaki pcbsp->sp_cache[(dir)].cachegen == ipsec_spdgen; 142 1.50 ozaki } 143 1.7 thorpej 144 1.1 jonathan /* SP acquiring list table. */ 145 1.1 jonathan struct secspacq { 146 1.1 jonathan LIST_ENTRY(secspacq) chain; 147 1.1 jonathan 148 1.1 jonathan struct secpolicyindex spidx; 149 1.1 jonathan 150 1.26 drochner time_t created; /* for lifetime */ 151 1.1 jonathan int count; /* for lifetime */ 152 1.1 jonathan /* XXX: here is mbuf place holder to be sent ? */ 153 1.1 jonathan }; 154 1.1 jonathan #endif /* _KERNEL */ 155 1.1 jonathan 156 1.47 ryo /* buffer size for formatted output of ipsec address (addr + '%' + scope_id?) */ 157 1.47 ryo #define IPSEC_ADDRSTRLEN (INET6_ADDRSTRLEN + 11) 158 1.47 ryo /* buffer size for ipsec_logsastr() */ 159 1.47 ryo #define IPSEC_LOGSASTRLEN 192 160 1.47 ryo 161 1.1 jonathan /* according to IANA assignment, port 0x0000 and proto 0xff are reserved. */ 162 1.1 jonathan #define IPSEC_PORT_ANY 0 163 1.1 jonathan #define IPSEC_ULPROTO_ANY 255 164 1.1 jonathan #define IPSEC_PROTO_ANY 255 165 1.1 jonathan 166 1.1 jonathan /* mode of security protocol */ 167 1.1 jonathan /* NOTE: DON'T use IPSEC_MODE_ANY at SPD. It's only use in SAD */ 168 1.1 jonathan #define IPSEC_MODE_ANY 0 /* i.e. wildcard. */ 169 1.1 jonathan #define IPSEC_MODE_TRANSPORT 1 170 1.1 jonathan #define IPSEC_MODE_TUNNEL 2 171 1.8 jonathan #define IPSEC_MODE_TCPMD5 3 /* TCP MD5 mode */ 172 1.1 jonathan 173 1.1 jonathan /* 174 1.1 jonathan * Direction of security policy. 175 1.1 jonathan * NOTE: Since INVALID is used just as flag. 176 1.1 jonathan * The other are used for loop counter too. 177 1.1 jonathan */ 178 1.1 jonathan #define IPSEC_DIR_ANY 0 179 1.1 jonathan #define IPSEC_DIR_INBOUND 1 180 1.1 jonathan #define IPSEC_DIR_OUTBOUND 2 181 1.1 jonathan #define IPSEC_DIR_MAX 3 182 1.1 jonathan #define IPSEC_DIR_INVALID 4 183 1.1 jonathan 184 1.42 ozaki #define IPSEC_DIR_IS_VALID(dir) ((dir) >= 0 && (dir) <= IPSEC_DIR_MAX) 185 1.42 ozaki #define IPSEC_DIR_IS_INOROUT(dir) ((dir) == IPSEC_DIR_INBOUND || \ 186 1.42 ozaki (dir) == IPSEC_DIR_OUTBOUND) 187 1.42 ozaki 188 1.1 jonathan /* Policy level */ 189 1.1 jonathan /* 190 1.1 jonathan * IPSEC, ENTRUST and BYPASS are allowed for setsockopt() in PCB, 191 1.1 jonathan * DISCARD, IPSEC and NONE are allowed for setkey() in SPD. 192 1.1 jonathan * DISCARD and NONE are allowed for system default. 193 1.1 jonathan */ 194 1.1 jonathan #define IPSEC_POLICY_DISCARD 0 /* discarding packet */ 195 1.1 jonathan #define IPSEC_POLICY_NONE 1 /* through IPsec engine */ 196 1.1 jonathan #define IPSEC_POLICY_IPSEC 2 /* do IPsec */ 197 1.1 jonathan #define IPSEC_POLICY_ENTRUST 3 /* consulting SPD if present. */ 198 1.1 jonathan #define IPSEC_POLICY_BYPASS 4 /* only for privileged socket. */ 199 1.1 jonathan 200 1.1 jonathan /* Security protocol level */ 201 1.1 jonathan #define IPSEC_LEVEL_DEFAULT 0 /* reference to system default */ 202 1.1 jonathan #define IPSEC_LEVEL_USE 1 /* use SA if present. */ 203 1.1 jonathan #define IPSEC_LEVEL_REQUIRE 2 /* require SA. */ 204 1.1 jonathan #define IPSEC_LEVEL_UNIQUE 3 /* unique SA. */ 205 1.1 jonathan 206 1.1 jonathan #define IPSEC_MANUAL_REQID_MAX 0x3fff 207 1.1 jonathan /* 208 1.1 jonathan * if security policy level == unique, this id 209 1.1 jonathan * indicate to a relative SA for use, else is 210 1.1 jonathan * zero. 211 1.1 jonathan * 1 - 0x3fff are reserved for manual keying. 212 1.1 jonathan * 0 are reserved for above reason. Others is 213 1.1 jonathan * for kernel use. 214 1.1 jonathan * Note that this id doesn't identify SA 215 1.1 jonathan * by only itself. 216 1.1 jonathan */ 217 1.1 jonathan #define IPSEC_REPLAYWSIZE 32 218 1.1 jonathan 219 1.1 jonathan #ifdef _KERNEL 220 1.1 jonathan 221 1.1 jonathan extern int ipsec_debug; 222 1.15 rpaulo #ifdef IPSEC_DEBUG 223 1.15 rpaulo extern int ipsec_replay; 224 1.15 rpaulo extern int ipsec_integrity; 225 1.15 rpaulo #endif 226 1.1 jonathan 227 1.1 jonathan extern struct secpolicy ip4_def_policy; 228 1.1 jonathan extern int ip4_esp_trans_deflev; 229 1.1 jonathan extern int ip4_esp_net_deflev; 230 1.1 jonathan extern int ip4_ah_trans_deflev; 231 1.1 jonathan extern int ip4_ah_net_deflev; 232 1.1 jonathan extern int ip4_ah_cleartos; 233 1.1 jonathan extern int ip4_ah_offsetmask; 234 1.1 jonathan extern int ip4_ipsec_dfbit; 235 1.1 jonathan extern int ip4_ipsec_ecn; 236 1.1 jonathan extern int crypto_support; 237 1.1 jonathan 238 1.48 ozaki #include <sys/syslog.h> 239 1.75 maxv 240 1.88 christos #define DPRINTF(fmt, args...) \ 241 1.88 christos do { \ 242 1.88 christos if (ipsec_debug) \ 243 1.88 christos log(LOG_DEBUG, "%s: " fmt, __func__, ##args); \ 244 1.88 christos } while (/*CONSTCOND*/0) 245 1.1 jonathan 246 1.48 ozaki #define IPSECLOG(level, fmt, args...) \ 247 1.48 ozaki do { \ 248 1.48 ozaki if (ipsec_debug) \ 249 1.48 ozaki log(level, "%s: " fmt, __func__, ##args); \ 250 1.88 christos } while (/*CONSTCOND*/0) 251 1.48 ozaki 252 1.75 maxv #define ipsec_indone(m) \ 253 1.75 maxv ((m->m_flags & M_AUTHIPHDR) || (m->m_flags & M_DECRYPTED)) 254 1.75 maxv #define ipsec_outdone(m) \ 255 1.85 maxv (m_tag_find((m), PACKET_TAG_IPSEC_OUT_DONE) != NULL) 256 1.75 maxv 257 1.87 knakahar static __inline bool 258 1.87 knakahar ipsec_skip_pfil(struct mbuf *m) 259 1.87 knakahar { 260 1.87 knakahar bool rv; 261 1.87 knakahar 262 1.87 knakahar if (ipsec_indone(m) && 263 1.87 knakahar ((m->m_pkthdr.pkthdr_flags & PKTHDR_FLAG_IPSEC_SKIP_PFIL) != 0)) { 264 1.87 knakahar m->m_pkthdr.pkthdr_flags &= ~PKTHDR_FLAG_IPSEC_SKIP_PFIL; 265 1.87 knakahar rv = true; 266 1.87 knakahar } else { 267 1.87 knakahar rv = false; 268 1.87 knakahar } 269 1.87 knakahar 270 1.87 knakahar return rv; 271 1.87 knakahar } 272 1.87 knakahar 273 1.64 maxv void ipsec_pcbconn(struct inpcbpolicy *); 274 1.64 maxv void ipsec_pcbdisconn(struct inpcbpolicy *); 275 1.64 maxv void ipsec_invalpcbcacheall(void); 276 1.7 thorpej 277 1.1 jonathan struct inpcb; 278 1.90 ozaki int ipsec4_output(struct mbuf *, struct inpcb *, int, u_long *, bool *, bool *, bool *); 279 1.81 maxv 280 1.91 ozaki int ipsec_ip_input_checkpolicy(struct mbuf *, bool); 281 1.81 maxv void ipsec_mtu(struct mbuf *, int *); 282 1.86 knakahar #ifdef INET6 283 1.86 knakahar void ipsec6_udp_cksum(struct mbuf *); 284 1.86 knakahar #endif 285 1.1 jonathan 286 1.1 jonathan struct inpcb; 287 1.76 maxv int ipsec_init_pcbpolicy(struct socket *so, struct inpcbpolicy **); 288 1.64 maxv int ipsec_copy_policy(const struct inpcbpolicy *, struct inpcbpolicy *); 289 1.64 maxv u_int ipsec_get_reqlevel(const struct ipsecrequest *); 290 1.64 maxv 291 1.92 ozaki int ipsec_set_policy(struct inpcb *, const void *, size_t, kauth_cred_t); 292 1.92 ozaki int ipsec_get_policy(struct inpcb *, const void *, size_t, struct mbuf **); 293 1.92 ozaki int ipsec_delete_pcbpolicy(struct inpcb *); 294 1.92 ozaki int ipsec_in_reject(struct mbuf *, struct inpcb *); 295 1.1 jonathan 296 1.64 maxv struct secasvar *ipsec_lookup_sa(const struct ipsecrequest *, 297 1.64 maxv const struct mbuf *); 298 1.1 jonathan 299 1.1 jonathan struct secas; 300 1.1 jonathan struct tcpcb; 301 1.64 maxv int ipsec_chkreplay(u_int32_t, const struct secasvar *); 302 1.64 maxv int ipsec_updatereplay(u_int32_t, const struct secasvar *); 303 1.1 jonathan 304 1.92 ozaki size_t ipsec_hdrsiz(struct mbuf *, u_int, struct inpcb *); 305 1.64 maxv size_t ipsec4_hdrsiz_tcp(struct tcpcb *); 306 1.1 jonathan 307 1.1 jonathan union sockaddr_union; 308 1.47 ryo const char *ipsec_address(const union sockaddr_union* sa, char *, size_t); 309 1.47 ryo const char *ipsec_logsastr(const struct secasvar *, char *, size_t); 310 1.1 jonathan 311 1.1 jonathan /* NetBSD protosw ctlin entrypoint */ 312 1.19 degroote void *esp4_ctlinput(int, const struct sockaddr *, void *); 313 1.19 degroote void *ah4_ctlinput(int, const struct sockaddr *, void *); 314 1.1 jonathan 315 1.59 ozaki void ipsec_output_init(void); 316 1.1 jonathan struct m_tag; 317 1.83 maxv void ipsec4_common_input(struct mbuf *m, int, int); 318 1.64 maxv int ipsec4_common_input_cb(struct mbuf *, struct secasvar *, int, int); 319 1.61 ozaki int ipsec4_process_packet(struct mbuf *, const struct ipsecrequest *, u_long *); 320 1.61 ozaki int ipsec_process_done(struct mbuf *, const struct ipsecrequest *, 321 1.89 knakahar struct secasvar *, int); 322 1.64 maxv 323 1.19 degroote struct mbuf *m_clone(struct mbuf *); 324 1.19 degroote struct mbuf *m_makespace(struct mbuf *, int, int, int *); 325 1.75 maxv void *m_pad(struct mbuf *, int); 326 1.19 degroote int m_striphdr(struct mbuf *, int, int); 327 1.1 jonathan 328 1.75 maxv extern int ipsec_used __read_mostly; 329 1.75 maxv extern int ipsec_enabled __read_mostly; 330 1.1 jonathan 331 1.1 jonathan #endif /* _KERNEL */ 332 1.1 jonathan 333 1.1 jonathan #ifndef _KERNEL 334 1.64 maxv char *ipsec_set_policy(const char *, int); 335 1.64 maxv int ipsec_get_policylen(char *); 336 1.64 maxv char *ipsec_dump_policy(char *, const char *); 337 1.64 maxv const char *ipsec_strerror(void); 338 1.1 jonathan #endif /* !_KERNEL */ 339 1.1 jonathan 340 1.9 jonathan #ifdef _KERNEL 341 1.1 jonathan /* External declarations of per-file init functions */ 342 1.41 ozaki void ah_attach(void); 343 1.41 ozaki void esp_attach(void); 344 1.41 ozaki void ipcomp_attach(void); 345 1.41 ozaki void ipe4_attach(void); 346 1.41 ozaki void tcpsignature_attach(void); 347 1.1 jonathan 348 1.39 ozaki void ipsec_attach(void); 349 1.39 ozaki 350 1.39 ozaki void sysctl_net_inet_ipsec_setup(struct sysctllog **); 351 1.39 ozaki #ifdef INET6 352 1.39 ozaki void sysctl_net_inet6_ipsec6_setup(struct sysctllog **); 353 1.39 ozaki #endif 354 1.39 ozaki 355 1.9 jonathan #endif /* _KERNEL */ 356 1.12 elad #endif /* !_NETIPSEC_IPSEC_H_ */ 357