]> git.saurik.com Git - apple/xnu.git/blame - bsd/net/if_utun_crypto.h
xnu-2050.24.15.tar.gz
[apple/xnu.git] / bsd / net / if_utun_crypto.h
CommitLineData
316670eb
A
1/*
2 * Copyright (c) 2011 Apple Inc. All rights reserved.
3 *
4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. The rights granted to you under the License
10 * may not be used to create, or enable the creation or redistribution of,
11 * unlawful or unlicensed copies of an Apple operating system, or to
12 * circumvent, violate, or enable the circumvention or violation of, any
13 * terms of an Apple operating system software license agreement.
14 *
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
17 *
18 * The Original Code and all software distributed under the License are
19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23 * Please see the License for the specific language governing rights and
24 * limitations under the License.
25 *
26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27 */
28
29#ifndef _NET_IF_UTUN_CRYPTO_H_
30#define _NET_IF_UTUN_CRYPTO_H_
31
32// constants used in configuring the crypto context
33typedef enum utun_crypto_ver {
34 UTUN_CRYPTO_VER_1 = 1,
35 UTUN_CRYPTO_VER_MAX,
36} utun_crypto_ver_t;
37
38#define UTUN_CRYPTO_KEYS_IPSEC_VER_1 UTUN_CRYPTO_VER_1
39#define UTUN_CRYPTO_IPSEC_VER_1 UTUN_CRYPTO_VER_1
40
41#define UTUN_CRYPTO_ARGS_VER_MAX UTUN_CRYPTO_VER_MAX
42#define UTUN_CRYPTO_KEYS_ARGS_VER_MAX UTUN_CRYPTO_VER_MAX
43
44typedef enum utun_crypto_dir {
45 UTUN_CRYPTO_DIR_IN = 1,
46 UTUN_CRYPTO_DIR_OUT,
47 UTUN_CRYPTO_DIR_MAX,
48} utun_crypto_dir_t;
49
50#define UTUN_CRYPTO_CTX_NUM_DIRS 2
51
52#define BITSTOBYTES(n) (n >> 3)
53#define BYTESTOBITS(n) (n << 3)
54
55#define MAX_KEY_AUTH_LEN_BITS 512 // corresponds to SHA512
56#define MAX_KEY_AUTH_LEN_BYTES (BITSTOBYTES(MAX_KEY_AUTH_LEN_BITS))
57#define MAX_KEY_ENC_LEN_BITS 256 // corresponds to AES256
58#define MAX_KEY_ENC_LEN_BYTES (BITSTOBYTES(MAX_KEY_ENC_LEN_BITS))
59
60typedef enum utun_crypto_type {
61 UTUN_CRYPTO_TYPE_IPSEC = 1,
62 UTUN_CRYPTO_TYPE_DTLS,
63 UTUN_CRYPTO_TYPE_MAX,
64} utun_crypto_type_t;
65
66typedef enum if_utun_crypto_ipsec_mode {
67 IF_UTUN_CRYPTO_IPSEC_MODE_NONE = 0,
68 IF_UTUN_CRYPTO_IPSEC_MODE_TRANSPORT,
69 IF_UTUN_CRYPTO_IPSEC_MODE_TUNNEL,
70 IF_UTUN_CRYPTO_IPSEC_MODE_MAX,
71} if_utun_crypto_ipsec_mode_t;
72
73typedef enum if_utun_crypto_ipsec_proto {
74 IF_UTUN_CRYPTO_IPSEC_PROTO_NONE = 0,
75 IF_UTUN_CRYPTO_IPSEC_PROTO_ESP,
76 IF_UTUN_CRYPTO_IPSEC_PROTO_AH,
77 IF_UTUN_CRYPTO_IPSEC_PROTO_MAX,
78} if_utun_crypto_ipsec_proto_t;
79
80typedef enum if_utun_crypto_ipsec_auth {
81 IF_UTUN_CRYPTO_IPSEC_AUTH_NONE = 0,
82 IF_UTUN_CRYPTO_IPSEC_AUTH_MD5,
83 IF_UTUN_CRYPTO_IPSEC_AUTH_SHA1,
84 IF_UTUN_CRYPTO_IPSEC_AUTH_SHA256,
85 IF_UTUN_CRYPTO_IPSEC_AUTH_SHA384,
86 IF_UTUN_CRYPTO_IPSEC_AUTH_SHA512,
87 IF_UTUN_CRYPTO_IPSEC_AUTH_MAX,
88} if_utun_crypto_ipsec_auth_t;
89
90typedef enum if_utun_crypto_ipsec_enc {
91 IF_UTUN_CRYPTO_IPSEC_ENC_NONE = 0,
92 IF_UTUN_CRYPTO_IPSEC_ENC_DES,
93 IF_UTUN_CRYPTO_IPSEC_ENC_3DES,
94 IF_UTUN_CRYPTO_IPSEC_ENC_AES128,
95 IF_UTUN_CRYPTO_IPSEC_ENC_AES256,
96 IF_UTUN_CRYPTO_IPSEC_ENC_MAX,
97} if_utun_crypto_ipsec_enc_t;
98
99typedef enum if_utun_crypto_ipsec_keepalive {
100 IF_UTUN_CRYPTO_IPSEC_KEEPALIVE_NONE = 0,
101 IF_UTUN_CRYPTO_IPSEC_KEEPALIVE_NATT,
102 IF_UTUN_CRYPTO_IPSEC_KEEPALIVE_ESP,
103 IF_UTUN_CRYPTO_IPSEC_KEEPALIVE_MAX,
104} if_utun_crypto_ipsec_keepalive_t;
105
106typedef enum if_utun_crypto_ipsec_natd {
107 IF_UTUN_CRYPTO_IPSEC_NATD_NONE = 0,
108 IF_UTUN_CRYPTO_IPSEC_NATD_MINE,
109 IF_UTUN_CRYPTO_IPSEC_NATD_PEER,
110 IF_UTUN_CRYPTO_IPSEC_NATD_BOTH,
111 IF_UTUN_CRYPTO_IPSEC_NATD_MAX,
112} if_utun_crypto_ipsec_natd_t;
113
114// structures used for storing the App's keying index arguments
115typedef struct utun_crypto_keys_idx_ipsec_args_v1 {
116 struct sockaddr_storage src_addr; // v4 or v6 socket address (ignore port numbers)
117 struct sockaddr_storage dst_addr; // v4 or v6 socket address (ignore port numbers)
118 if_utun_crypto_ipsec_proto_t proto;
119 if_utun_crypto_ipsec_mode_t mode;
120 u_int32_t reqid; // policy's reqid, default to 0 for now since we are avoiding policies.
121 u_int32_t spi; // 0 when requesting the index, otherwise it contains the resulting index
122 u_int32_t spirange_min; // default to 0
123 u_int32_t spirange_max; // default to 0xffffffff
124} __attribute__((packed)) utun_crypto_keys_idx_ipsec_args_v1_t;
125
126typedef struct utun_crypto_keys_idx_dtls_args_v1 {
127 // stub for DTLS keying index arguments
128 u_int32_t unused; // place holder
129} __attribute__((packed)) utun_crypto_keys_idx_dtls_args_v1_t;
130
131// App's parent structure for sending/storing keying index arguments
132typedef struct utun_crypto_keys_idx_args {
133 utun_crypto_ver_t ver;
134 utun_crypto_type_t type;
135 utun_crypto_dir_t dir;
136 u_int32_t args_ulen;
137 u_int32_t varargs_buflen;
138 union {
139 // don't change the order, number, or size of elements above this line (in this struct). otherwise UTUN_CRYPTO_CTX_IDX_ARGS_HDR_SIZE breaks backwards compatibility
140 utun_crypto_keys_idx_ipsec_args_v1_t ipsec_v1;
141 utun_crypto_keys_idx_dtls_args_v1_t dtls_v1;
142 // future (additional) versions of the arguments may be placed here
143 } u;
144 u_int8_t varargs_buf[0];
145} __attribute__((aligned(4), packed)) utun_crypto_keys_idx_args_t;
146
147// structures used for storing the App's keying material arguments
148typedef struct utun_crypto_keys_ipsec_args_v1 {
149 struct sockaddr_storage src_addr; // v4 or v6 socket address (ignore port numbers)
150 struct sockaddr_storage dst_addr; // v4 or v6 socket address (ignore port numbers)
151 if_utun_crypto_ipsec_proto_t proto;
152 if_utun_crypto_ipsec_mode_t mode;
153 if_utun_crypto_ipsec_auth_t alg_auth;
154 if_utun_crypto_ipsec_enc_t alg_enc;
155 if_utun_crypto_ipsec_keepalive_t keepalive;
156 if_utun_crypto_ipsec_natd_t natd;
157 u_int8_t replay; // window size default to 4
158 u_int8_t punt_rx_keepalive;
159 u_int16_t interval_tx_keepalive;
160 u_int16_t key_auth_len; // 128 or 160 or 192 or 256 or 384 or 512
161 u_int16_t key_enc_len; // 64 or 128 or 192 or 256
162 u_int16_t natt_port; // if non-zero flags will be set to include SADB_X_EXT_NATT
163 u_int16_t unused;
164 u_int32_t seq; // default to 0
165 u_int32_t spi;
166 u_int32_t pid; // vpnagent's process id
167 u_int32_t reqid; // policy's reqid, default to 0 for now since we are avoiding policies.
168 u_int64_t lifetime_hard; // value in seconds
169 u_int64_t lifetime_soft; // value in seconds
170 // key_auth and key_enc will actually be stored in utun_crypto_KEYS_args_t.varargs_buf
171} __attribute__((packed)) utun_crypto_keys_ipsec_args_v1_t;
172
173typedef struct utun_crypto_ctx_dtls_mat_args_v1 {
174 // stub for DTLS keying material arguments
175 u_int32_t unused; // place holder
176} __attribute__((packed)) utun_crypto_keys_dtls_args_v1_t;
177
178// App's parent structure for sending/storing keying material arguments
179typedef struct utun_crypto_keys_args {
180 utun_crypto_ver_t ver;
181 utun_crypto_type_t type;
182 utun_crypto_dir_t dir;
183 u_int32_t args_ulen;
184 u_int32_t varargs_buflen;
185 union {
186 // don't change the order, number, or size of elements above this line (in this struct). otherwise UTUN_CRYPTO_KEYS_ARGS_HDR_SIZE breaks backwards compatibility
187 utun_crypto_keys_ipsec_args_v1_t ipsec_v1;
188 utun_crypto_keys_dtls_args_v1_t dtls_v1;
189 // future (additional) versions of the arguments may be placed here
190 } u;
191 u_int8_t varargs_buf[0];
192} __attribute__((aligned(4), packed)) utun_crypto_keys_args_t;
193
194// structures used for storing the App's crypto arguments
195typedef struct utun_crypto_ipsec_args_v1 {
196 // stub for IPSec crypto context arguments
197 u_int32_t unused; // place holder
198} __attribute__((packed)) utun_crypto_ipsec_args_v1_t;
199
200typedef struct utun_crypto_dtls_args_v1 {
201 // stub for DTLS crypto context arguments
202 u_int32_t unused; // place holder
203} __attribute__((packed)) utun_crypto_dtls_args_v1_t;
204
205// App's parent structure for starting/stopping crypto
206typedef struct utun_crypto_args {
207 utun_crypto_ver_t ver;
208 utun_crypto_type_t type;
209 u_int32_t stop_data_traffic;
210 u_int32_t args_ulen;
211 u_int32_t varargs_buflen;
212 union {
213 // don't change the order, number, or size of elements above this line (in this struct). otherwise UTUN_CRYPTO_ARGS_HDR_SIZE breaks backwards compatibility
214 utun_crypto_ipsec_args_v1_t ipsec_v1;
215 utun_crypto_dtls_args_v1_t dtls_v1;
216 // future (additional) versions of the arguments may be placed here
217 } u;
218 u_int8_t varargs_buf[0]; // must be at the end of this struct
219} __attribute__((aligned(4), packed)) utun_crypto_args_t;
220
221#ifdef KERNEL_PRIVATE
222
223#include <sys/kern_control.h>
224#include <net/kpi_protocol.h>
225#include <net/kpi_interface.h>
226#include <net/pfkeyv2.h>
227#include <netkey/key.h>
228#include <netkey/keydb.h>
229
230struct utun_pcb;
231
232// structures used for storing kernel's keying material runtime state
233typedef struct utun_crypto_keys_ipsec_state {
234 // kernel's ipsec keying material state
235 u_int32_t spi;
236 struct secashead *sah;
237 struct secasvar *sav;
238 u_int8_t proto;
239 u_int8_t ifamily;
240 u_int8_t mode;
241 u_int8_t unused;
242} __attribute__((packed)) utun_crypto_keys_ipsec_state_t;
243
244typedef struct utun_crypto_keys_dtls_state {
245 // stub for kernel's DTLS keying material state
246 u_int32_t unused; // place holder
247} __attribute__((packed)) utun_crypto_keys_dtls_state_t;
248
249// kernel's parent structure for keying material state
250typedef struct utun_crypto_keys_state {
251 union {
252 utun_crypto_keys_ipsec_state_t ipsec;
253 utun_crypto_keys_dtls_state_t dtls;
254 } u;
255} __attribute__((aligned(4), packed)) utun_crypto_keys_state_t;
256
257// kernel's parent structure for keying material
258typedef struct utun_crypto_keys {
259 int valid; // is valid?
260 utun_crypto_type_t type;
261 u_int16_t unused;
262 utun_crypto_keys_state_t state; // runtime state
263 LIST_ENTRY(utun_crypto_keys) chain;
264} __attribute__((aligned(4), packed)) utun_crypto_keys_t;
265
266// kernel's parent structure for all crypto stuff
267typedef struct utun_crypto_ctx {
268 int valid;
269 utun_crypto_type_t type;
270 u_int16_t unused;
271 LIST_HEAD(chain, utun_crypto_keys) keys_listhead;
272} __attribute__((aligned(4), packed)) utun_crypto_ctx_t;
273
274#define UTUN_CRYPTO_KEYS_IDX_ARGS_HDR_SIZE ((size_t)(&((utun_crypto_keys_idx_args_t *)0)->u))
275#define UTUN_CRYPTO_KEYS_IDX_ARGS_VARARGS_BUF(args) ((u_int8_t *)args + UTUN_CRYPTO_KEYS_IDX_ARGS_HDR_SIZE + args->args_ulen)
276#define UTUN_CRYPTO_KEYS_IDX_ARGS_TOTAL_SIZE(args) ((size_t)(UTUN_CRYPTO_KEYS_IDX_ARGS_HDR_SIZE + args->args_ulen + args->varargs_buflen))
277
278#define UTUN_CRYPTO_KEYS_ARGS_HDR_SIZE ((size_t)(&((utun_crypto_keys_args_t *)0)->u))
279#define UTUN_CRYPTO_KEYS_ARGS_VARARGS_BUF(args) ((u_int8_t *)args + UTUN_CRYPTO_KEYS_ARGS_HDR_SIZE + args->args_ulen)
280#define UTUN_CRYPTO_KEYS_ARGS_TOTAL_SIZE(args) ((size_t)(UTUN_CRYPTO_KEYS_ARGS_HDR_SIZE + args->args_ulen + args->varargs_buflen))
281
282#define UTUN_CRYPTO_ARGS_HDR_SIZE ((size_t)(&((utun_crypto_args_t *)0)->u))
283#define UTUN_CRYPTO_ARGS_VARARGS_BUF(args) ((u_int8_t *)args + UTUN_CRYPTO_ARGS_HDR_SIZE + args->args_ulen)
284#define UTUN_CRYPTO_ARGS_TOTAL_SIZE(args) ((size_t)(UTUN_CRYPTO_ARGS_HDR_SIZE + args->args_ulen + args->varargs_buflen))
285
286#define UTUN_CRYPTO_DIR_TO_IDX(dir) (dir - 1)
287#define UTUN_CRYPTO_IDX_TO_DIR(idx) (idx + 1)
288
289void
290utun_cleanup_crypto(struct utun_pcb *pcb);
291
292errno_t
293utun_ctl_enable_crypto(__unused kern_ctl_ref kctlref,
294 __unused u_int32_t unit,
295 __unused void *unitinfo,
296 __unused int opt,
297 void *data,
298 size_t len);
299
300errno_t
301utun_ctl_disable_crypto(__unused kern_ctl_ref kctlref,
302 __unused u_int32_t unit,
303 __unused void *unitinfo,
304 __unused int opt,
305 void *data,
306 size_t len);
307
308errno_t
309utun_ctl_config_crypto_keys(__unused kern_ctl_ref kctlref,
310 __unused u_int32_t unit,
311 __unused void *unitinfo,
312 __unused int opt,
313 void *data,
314 size_t len);
315
316errno_t
317utun_ctl_unconfig_crypto_keys(__unused kern_ctl_ref kctlref,
318 __unused u_int32_t unit,
319 __unused void *unitinfo,
320 __unused int opt,
321 void *data,
322 size_t len);
323
324errno_t
325utun_ctl_generate_crypto_keys_idx(__unused kern_ctl_ref kctlref,
326 __unused u_int32_t unit,
327 __unused void *unitinfo,
328 __unused int opt,
329 void *data,
330 size_t *len);
331
332errno_t
333utun_ctl_stop_crypto_data_traffic(__unused kern_ctl_ref kctlref,
334 __unused u_int32_t unit,
335 __unused void *unitinfo,
336 __unused int opt,
337 void *data,
338 size_t len);
339
340errno_t
341utun_ctl_start_crypto_data_traffic(__unused kern_ctl_ref kctlref,
342 __unused u_int32_t unit,
343 __unused void *unitinfo,
344 __unused int opt,
345 void *data,
346 size_t len);
347
348int
349utun_pkt_crypto_output(struct utun_pcb *pcb, mbuf_t *m);
350
351#endif // KERNEL_PRIVATE
352
353#endif // _NET_IF_UTUN_CRYPTO_H_