| 1 | /*	$KAME: keydb.h,v 1.14 2000/08/02 17:58:26 sakane Exp $	*/ |
| 2 | |
| 3 | /*- |
| 4 | * SPDX-License-Identifier: BSD-3-Clause |
| 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 | #ifndef _NETIPSEC_KEYDB_H_ |
| 35 | #define _NETIPSEC_KEYDB_H_ |
| 36 | |
| 37 | #ifdef _KERNEL |
| 38 | #include <sys/counter.h> |
| 39 | #include <sys/ck.h> |
| 40 | #include <sys/lock.h> |
| 41 | #include <sys/mutex.h> |
| 42 | #include <sys/rmlock.h> |
| 43 | #include <sys/_task.h> |
| 44 | |
| 45 | #include <netipsec/key_var.h> |
| 46 | #include <opencrypto/_cryptodev.h> |
| 47 | |
| 48 | #ifndef _SOCKADDR_UNION_DEFINED |
| 49 | #define	_SOCKADDR_UNION_DEFINED |
| 50 | /* |
| 51 | * The union of all possible address formats we handle. |
| 52 | */ |
| 53 | union sockaddr_union { |
| 54 | 	struct sockaddr		sa; |
| 55 | 	struct sockaddr_in	sin; |
| 56 | 	struct sockaddr_in6	sin6; |
| 57 | }; |
| 58 | #endif /* _SOCKADDR_UNION_DEFINED */ |
| 59 | |
| 60 | /* Security Association Index */ |
| 61 | /* NOTE: Ensure to be same address family */ |
| 62 | struct secasindex { |
| 63 | 	union sockaddr_union src;	/* source address for SA */ |
| 64 | 	union sockaddr_union dst;	/* destination address for SA */ |
| 65 | 	uint8_t proto;			/* IPPROTO_ESP or IPPROTO_AH */ |
| 66 | 	uint8_t mode;			/* mode of protocol, see ipsec.h */ |
| 67 | 	uint32_t reqid;			/* reqid id who owned this SA */ |
| 68 | 					/* see IPSEC_MANUAL_REQID_MAX. */ |
| 69 | }; |
| 70 | |
| 71 | /* |
| 72 | * In order to split out the keydb implementation from that of the |
| 73 | * PF_KEY sockets we need to define a few structures that while they |
| 74 | * may seem common are likely to diverge over time. |
| 75 | */ |
| 76 | |
| 77 | /* sadb_identity */ |
| 78 | struct secident { |
| 79 | 	u_int16_t type; |
| 80 | 	u_int64_t id; |
| 81 | }; |
| 82 | |
| 83 | /* sadb_key */ |
| 84 | struct seckey { |
| 85 | 	u_int16_t bits; |
| 86 | 	char *key_data; |
| 87 | }; |
| 88 | |
| 89 | struct seclifetime { |
| 90 | 	u_int32_t allocations; |
| 91 | 	u_int64_t bytes; |
| 92 | 	u_int64_t addtime; |
| 93 | 	u_int64_t usetime; |
| 94 | }; |
| 95 | |
| 96 | struct secnatt { |
| 97 | 	union sockaddr_union oai;	/* original addresses of initiator */ |
| 98 | 	union sockaddr_union oar;	/* original address of responder */ |
| 99 | 	uint16_t sport;			/* source port */ |
| 100 | 	uint16_t dport;			/* destination port */ |
| 101 | 	uint16_t cksum;			/* checksum delta */ |
| 102 | 	uint16_t flags; |
| 103 | #define	IPSEC_NATT_F_OAI	0x0001 |
| 104 | #define	IPSEC_NATT_F_OAR	0x0002 |
| 105 | }; |
| 106 | |
| 107 | /* Security Association Data Base */ |
| 108 | TAILQ_HEAD(secasvar_queue, secasvar); |
| 109 | struct secashead { |
| 110 | 	TAILQ_ENTRY(secashead) chain; |
| 111 | 	LIST_ENTRY(secashead) addrhash;	/* hash by sproto+src+dst addresses */ |
| 112 | 	LIST_ENTRY(secashead) drainq;	/* used ONLY by flush callout */ |
| 113 | |
| 114 | 	struct secasindex saidx; |
| 115 | |
| 116 | 	struct secident *idents;	/* source identity */ |
| 117 | 	struct secident *identd;	/* destination identity */ |
| 118 | 					/* XXX I don't know how to use them. */ |
| 119 | |
| 120 | 	volatile u_int refcnt;		/* reference count */ |
| 121 | 	uint8_t state;			/* MATURE or DEAD. */ |
| 122 | 	struct secasvar_queue savtree_alive;	/* MATURE and DYING SA */ |
| 123 | 	struct secasvar_queue savtree_larval;	/* LARVAL SA */ |
| 124 | }; |
| 125 | |
| 126 | struct xformsw; |
| 127 | struct enc_xform; |
| 128 | struct auth_hash; |
| 129 | struct comp_algo; |
| 130 | struct ifp_handle_sav; |
| 131 | |
| 132 | /* |
| 133 | * Security Association |
| 134 | * |
| 135 | * For INBOUND packets we do SA lookup using SPI, thus only SPIHASH is used. |
| 136 | * For OUTBOUND packets there may be several SA suitable for packet. |
| 137 | * We use key_preferred_oldsa variable to choose better SA. First of we do |
| 138 | * lookup for suitable SAH using packet's saidx. Then we use SAH's savtree |
| 139 | * to search better candidate. The newer SA (by created time) are placed |
| 140 | * in the beginning of the savtree list. There is no preference between |
| 141 | * DYING and MATURE. |
| 142 | * |
| 143 | * NB: Fields with a tdb_ prefix are part of the "glue" used |
| 144 | * to interface to the OpenBSD crypto support. This was done |
| 145 | * to distinguish this code from the mainline KAME code. |
| 146 | * NB: Fields are sorted on the basis of the frequency of changes, i.e. |
| 147 | * constants and unchangeable fields are going first. |
| 148 | * NB: if you want to change this structure, check that this will not break |
| 149 | * key_updateaddresses(). |
| 150 | */ |
| 151 | struct secasvar { |
| 152 | 	uint32_t spi;			/* SPI Value, network byte order */ |
| 153 | 	uint32_t flags;			/* holder for SADB_KEY_FLAGS */ |
| 154 | 	uint32_t seq;			/* sequence number */ |
| 155 | 	pid_t pid;			/* message's pid */ |
| 156 | 	u_int ivlen;			/* length of IV */ |
| 157 | |
| 158 | 	struct secashead *sah;		/* back pointer to the secashead */ |
| 159 | 	struct seckey *key_auth;	/* Key for Authentication */ |
| 160 | 	struct seckey *key_enc;	 /* Key for Encryption */ |
| 161 | 	struct secreplay *replay;	/* replay prevention */ |
| 162 | 	struct secnatt *natt;		/* NAT-T config */ |
| 163 | 	struct rmlock *lock;		/* update/access lock */ |
| 164 | |
| 165 | 	const struct xformsw *tdb_xform;	/* transform */ |
| 166 | 	const struct enc_xform *tdb_encalgxform;/* encoding algorithm */ |
| 167 | 	const struct auth_hash *tdb_authalgxform;/* authentication algorithm */ |
| 168 | 	const struct comp_algo *tdb_compalgxform;/* compression algorithm */ |
| 169 | 	crypto_session_t tdb_cryptoid;		/* crypto session */ |
| 170 | |
| 171 | 	uint8_t alg_auth;		/* Authentication Algorithm Identifier*/ |
| 172 | 	uint8_t alg_enc;		/* Cipher Algorithm Identifier */ |
| 173 | 	uint8_t alg_comp;		/* Compression Algorithm Identifier */ |
| 174 | 	uint8_t state;			/* Status of this SA (pfkeyv2.h) */ |
| 175 | |
| 176 | 	counter_u64_t lft_c;		/* CURRENT lifetime */ |
| 177 | #define	lft_c_allocations	lft_c |
| 178 | #define	lft_c_bytes		lft_c + 1 |
| 179 | 	struct seclifetime *lft_h;	/* HARD lifetime */ |
| 180 | 	struct seclifetime *lft_s;	/* SOFT lifetime */ |
| 181 | |
| 182 | 	uint64_t created;		/* time when SA was created */ |
| 183 | 	uint64_t firstused;		/* time when SA was first used */ |
| 184 | |
| 185 | 	TAILQ_ENTRY(secasvar) chain; |
| 186 | 	LIST_ENTRY(secasvar) spihash; |
| 187 | 	LIST_ENTRY(secasvar) drainq;	/* used ONLY by flush callout */ |
| 188 | |
| 189 | 	uint64_t cntr;			/* counter for GCM and CTR */ |
| 190 | 	volatile u_int refcnt;		/* reference count */ |
| 191 | 	CK_LIST_HEAD(, ifp_handle_sav) accel_ifps; |
| 192 | 	uintptr_t	accel_forget_tq; |
| 193 | 	const char	*accel_ifname; |
| 194 | 	uint32_t	accel_flags; |
| 195 | 	counter_u64_t	accel_lft_sw; |
| 196 | 	uint64_t	accel_hw_allocs; |
| 197 | 	uint64_t	accel_hw_octets; |
| 198 | 	uint64_t	accel_firstused; |
| 199 | }; |
| 200 | |
| 201 | #define	SADB_KEY_ACCEL_INST	0x00000001 |
| 202 | #define	SADB_KEY_ACCEL_DEINST	0x00000002 |
| 203 | |
| 204 | #define	SECASVAR_RLOCK_TRACKER		struct rm_priotracker _secas_tracker |
| 205 | #define	SECASVAR_RLOCK(_sav)		rm_rlock((_sav)->lock, &_secas_tracker) |
| 206 | #define	SECASVAR_RUNLOCK(_sav)		rm_runlock((_sav)->lock, &_secas_tracker) |
| 207 | #define	SECASVAR_WLOCK(_sav)		rm_wlock((_sav)->lock) |
| 208 | #define	SECASVAR_WUNLOCK(_sav)		rm_wunlock((_sav)->lock) |
| 209 | #define	SECASVAR_LOCK_ASSERT(_sav)	rm_assert((_sav)->lock, RA_LOCKED) |
| 210 | #define	SECASVAR_LOCK_WASSERT(_sav)	rm_assert((_sav)->lock, RA_WLOCKED) |
| 211 | #define	SAV_ISGCM(_sav)							\ |
| 212 | 			((_sav)->alg_enc == SADB_X_EALG_AESGCM8 ||	\ |
| 213 | 			(_sav)->alg_enc == SADB_X_EALG_AESGCM12 ||	\ |
| 214 | 			(_sav)->alg_enc == SADB_X_EALG_AESGCM16) |
| 215 | #define	SAV_ISCTR(_sav) ((_sav)->alg_enc == SADB_X_EALG_AESCTR) |
| 216 | #define	SAV_ISCHACHA(_sav)	\ |
| 217 | ((_sav)->alg_enc == SADB_X_EALG_CHACHA20POLY1305) |
| 218 | #define SAV_ISCTRORGCM(_sav)	(SAV_ISCTR((_sav)) || SAV_ISGCM((_sav))) |
| 219 | |
| 220 | #define	IPSEC_SEQH_SHIFT	32 |
| 221 | |
| 222 | /* Replay prevention, protected by SECASVAR_LOCK: |
| 223 | * (m) locked by mtx |
| 224 | * (c) read only except during creation / free |
| 225 | */ |
| 226 | struct secreplay { |
| 227 | 	struct mtx lock; |
| 228 | 	u_int64_t count;	/* (m) */ |
| 229 | 	u_int wsize;		/* (c) window size, i.g. 4 bytes */ |
| 230 | 	u_int64_t last;		/* (m) used by receiver */ |
| 231 | 	u_int32_t *bitmap;	/* (m) used by receiver */ |
| 232 | 	u_int bitmap_size;	/* (c) size of the bitmap array */ |
| 233 | 	int overflow;		/* (m) overflow flag */ |
| 234 | }; |
| 235 | |
| 236 | #define SECREPLAY_LOCK(_r)	mtx_lock(&(_r)->lock) |
| 237 | #define SECREPLAY_UNLOCK(_r)	mtx_unlock(&(_r)->lock) |
| 238 | #define SECREPLAY_ASSERT(_r)	mtx_assert(&(_r)->lock, MA_OWNED) |
| 239 | |
| 240 | /* socket table due to send PF_KEY messages. */ |
| 241 | struct secreg { |
| 242 | 	LIST_ENTRY(secreg) chain; |
| 243 | |
| 244 | 	struct socket *so; |
| 245 | }; |
| 246 | |
| 247 | /* acquiring list table. */ |
| 248 | struct secacq { |
| 249 | 	LIST_ENTRY(secacq) chain; |
| 250 | 	LIST_ENTRY(secacq) addrhash; |
| 251 | 	LIST_ENTRY(secacq) seqhash; |
| 252 | |
| 253 | 	struct secasindex saidx; |
| 254 | 	uint32_t seq;		/* sequence number */ |
| 255 | 	time_t created;		/* for lifetime */ |
| 256 | 	int count;		/* for lifetime */ |
| 257 | }; |
| 258 | |
| 259 | #endif /* _KERNEL */ |
| 260 | |
| 261 | #endif /* _NETIPSEC_KEYDB_H_ */ |