xref: /illumos-gate/usr/src/uts/common/net/pfkeyv2.h (revision 630ff0785eaea8913473d6696818bd2b9e84756a)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #ifndef	_NET_PFKEYV2_H
27 #define	_NET_PFKEYV2_H
28 
29 #pragma ident	"%Z%%M%	%I%	%E% SMI"
30 
31 /*
32  * Definitions and structures for PF_KEY version 2.  See RFC 2367 for
33  * more details.  SA == Security Association, which is what PF_KEY provides
34  * an API for managing.
35  */
36 
37 #ifdef	__cplusplus
38 extern "C" {
39 #endif
40 
41 #define	PF_KEY_V2		2
42 #define	PFKEYV2_REVISION	200109L
43 
44 /*
45  * Base PF_KEY message.
46  */
47 
48 typedef struct sadb_msg {
49 	uint8_t sadb_msg_version;	/* Version, currently PF_KEY_V2 */
50 	uint8_t sadb_msg_type;		/* ADD, UPDATE, etc. */
51 	uint8_t sadb_msg_errno;		/* Error number from UNIX errno space */
52 	uint8_t sadb_msg_satype;	/* ESP, AH, etc. */
53 	uint16_t sadb_msg_len;		/* Length in 64-bit words. */
54 	uint16_t sadb_msg_reserved;	/* must be zero */
55 /*
56  * Use the reserved field for extended diagnostic information on errno
57  * responses.
58  */
59 #define	sadb_x_msg_diagnostic sadb_msg_reserved
60 	/* Union is for guaranteeing 64-bit alignment. */
61 	union {
62 		struct {
63 			uint32_t sadb_x_msg_useq;	/* Set by originator */
64 			uint32_t sadb_x_msg_upid;	/* Set by originator */
65 		} sadb_x_msg_actual;
66 		uint64_t sadb_x_msg_alignment;
67 	} sadb_x_msg_u;
68 #define	sadb_msg_seq sadb_x_msg_u.sadb_x_msg_actual.sadb_x_msg_useq
69 #define	sadb_msg_pid sadb_x_msg_u.sadb_x_msg_actual.sadb_x_msg_upid
70 } sadb_msg_t;
71 
72 /*
73  * Generic extension header.
74  */
75 
76 typedef struct sadb_ext {
77 	union {
78 		/* Union is for guaranteeing 64-bit alignment. */
79 		struct {
80 			uint16_t sadb_x_ext_ulen;	/* In 64s, inclusive */
81 			uint16_t sadb_x_ext_utype;	/* 0 is reserved */
82 		} sadb_x_ext_actual;
83 		uint64_t sadb_x_ext_alignment;
84 	} sadb_x_ext_u;
85 #define	sadb_ext_len sadb_x_ext_u.sadb_x_ext_actual.sadb_x_ext_ulen
86 #define	sadb_ext_type sadb_x_ext_u.sadb_x_ext_actual.sadb_x_ext_utype
87 } sadb_ext_t;
88 
89 /*
90  * Security Association information extension.
91  */
92 
93 typedef struct sadb_sa {
94 	/* Union is for guaranteeing 64-bit alignment. */
95 	union {
96 		struct {
97 			uint16_t sadb_x_sa_ulen;
98 			uint16_t sadb_x_sa_uexttype;	/* ASSOCIATION */
99 			uint32_t sadb_x_sa_uspi;	/* Sec. Param. Index */
100 		} sadb_x_sa_uactual;
101 		uint64_t sadb_x_sa_alignment;
102 	} sadb_x_sa_u;
103 #define	sadb_sa_len sadb_x_sa_u.sadb_x_sa_uactual.sadb_x_sa_ulen
104 #define	sadb_sa_exttype sadb_x_sa_u.sadb_x_sa_uactual.sadb_x_sa_uexttype
105 #define	sadb_sa_spi sadb_x_sa_u.sadb_x_sa_uactual.sadb_x_sa_uspi
106 	uint8_t sadb_sa_replay;		/* Replay counter */
107 	uint8_t sadb_sa_state;		/* MATURE, DEAD, DYING, LARVAL */
108 	uint8_t sadb_sa_auth;		/* Authentication algorithm */
109 	uint8_t sadb_sa_encrypt;	/* Encryption algorithm */
110 	uint32_t sadb_sa_flags;		/* SA flags. */
111 } sadb_sa_t;
112 
113 /*
114  * SA Lifetime extension.  Already 64-bit aligned thanks to uint64_t fields.
115  */
116 
117 typedef struct sadb_lifetime {
118 	uint16_t sadb_lifetime_len;
119 	uint16_t sadb_lifetime_exttype;		/* SOFT, HARD, CURRENT */
120 	uint32_t sadb_lifetime_allocations;
121 	uint64_t sadb_lifetime_bytes;
122 	uint64_t sadb_lifetime_addtime;	/* These fields are assumed to hold */
123 	uint64_t sadb_lifetime_usetime;	/* >= sizeof (time_t). */
124 } sadb_lifetime_t;
125 
126 /*
127  * SA address information.
128  */
129 
130 typedef struct sadb_address {
131 	/* Union is for guaranteeing 64-bit alignment. */
132 	union {
133 		struct {
134 			uint16_t sadb_x_address_ulen;
135 			uint16_t sadb_x_address_uexttype; /* SRC, DST, PROXY */
136 			uint8_t sadb_x_address_uproto; /* Proto for ports... */
137 			uint8_t sadb_x_address_uprefixlen; /* Prefix length. */
138 			uint16_t sadb_x_address_ureserved; /* Padding */
139 		} sadb_x_address_actual;
140 		uint64_t sadb_x_address_alignment;
141 	} sadb_x_address_u;
142 #define	sadb_address_len \
143 	sadb_x_address_u.sadb_x_address_actual.sadb_x_address_ulen
144 #define	sadb_address_exttype \
145 	sadb_x_address_u.sadb_x_address_actual.sadb_x_address_uexttype
146 #define	sadb_address_proto \
147 	sadb_x_address_u.sadb_x_address_actual.sadb_x_address_uproto
148 #define	sadb_address_prefixlen \
149 	sadb_x_address_u.sadb_x_address_actual.sadb_x_address_uprefixlen
150 #define	sadb_address_reserved \
151 	sadb_x_address_u.sadb_x_address_actual.sadb_x_address_ureserved
152 	/* Followed by a sockaddr structure which may contain ports. */
153 } sadb_address_t;
154 
155 /*
156  * SA key information.
157  */
158 
159 typedef struct sadb_key {
160 	/* Union is for guaranteeing 64-bit alignment. */
161 	union {
162 		struct {
163 			uint16_t sadb_x_key_ulen;
164 			uint16_t sadb_x_key_uexttype;	/* AUTH, ENCRYPT */
165 			uint16_t sadb_x_key_ubits;	/* Actual len (bits) */
166 			uint16_t sadb_x_key_ureserved;
167 		} sadb_x_key_actual;
168 		uint64_t sadb_x_key_alignment;
169 	} sadb_x_key_u;
170 #define	sadb_key_len sadb_x_key_u.sadb_x_key_actual.sadb_x_key_ulen
171 #define	sadb_key_exttype sadb_x_key_u.sadb_x_key_actual.sadb_x_key_uexttype
172 #define	sadb_key_bits sadb_x_key_u.sadb_x_key_actual.sadb_x_key_ubits
173 #define	sadb_key_reserved sadb_x_key_u.sadb_x_key_actual.sadb_x_key_ureserved
174 	/* Followed by actual key(s) in canonical (outbound proc.) order. */
175 } sadb_key_t;
176 
177 /*
178  * SA Identity information.  Already 64-bit aligned thanks to uint64_t fields.
179  */
180 
181 typedef struct sadb_ident {
182 	uint16_t sadb_ident_len;
183 	uint16_t sadb_ident_exttype;	/* SRC, DST, PROXY */
184 	uint16_t sadb_ident_type;	/* FQDN, USER_FQDN, etc. */
185 	uint16_t sadb_ident_reserved;	/* Padding */
186 	uint64_t sadb_ident_id;		/* For userid, etc. */
187 	/* Followed by an identity null-terminate C string if present. */
188 } sadb_ident_t;
189 
190 /*
191  * SA sensitivity information.  This is mostly useful on MLS systems.
192  */
193 
194 typedef struct sadb_sens {
195 	/* Union is for guaranteeing 64-bit alignment. */
196 	union {
197 		struct {
198 			uint16_t sadb_x_sens_ulen;
199 			uint16_t sadb_x_sens_uexttype;	/* SENSITIVITY */
200 			uint32_t sadb_x_sens_udpd;	/* Protection domain */
201 		} sadb_x_sens_actual;
202 		uint64_t sadb_x_sens_alignment;
203 	} sadb_x_sens_u;
204 #define	sadb_sens_len sadb_x_sens_u.sadb_x_sens_actual.sadb_x_sens_ulen
205 #define	sadb_sens_exttype sadb_x_sens_u.sadb_x_sens_actual.sadb_x_sens_uexttype
206 #define	sadb_sens_dpd sadb_x_sens_u.sadb_x_sens_actual.sadb_x_sens_udpd
207 	uint8_t sadb_sens_sens_level;
208 	uint8_t sadb_sens_sens_len;		/* 64-bit words */
209 	uint8_t sadb_sens_integ_level;
210 	uint8_t sadb_sens_integ_len;		/* 64-bit words */
211 	uint32_t sadb_sens_reserved;
212 	/*
213 	 * followed by two uint64_t arrays
214 	 * uint64_t sadb_sens_bitmap[sens_bitmap_len];
215 	 * uint64_t sadb_integ_bitmap[integ_bitmap_len];
216 	 */
217 } sadb_sens_t;
218 
219 /*
220  * A proposal extension.  This is found in an ACQUIRE message, and it
221  * proposes what sort of SA the kernel would like to ACQUIRE.
222  */
223 
224 /* First, a base structure... */
225 
226 typedef struct sadb_x_propbase {
227 	uint16_t sadb_x_propb_len;
228 	uint16_t sadb_x_propb_exttype;	/* PROPOSAL, X_EPROP */
229 	union {
230 		struct {
231 			uint8_t sadb_x_propb_lenres_replay;
232 			uint8_t sadb_x_propb_lenres_eres;
233 			uint16_t sadb_x_propb_lenres_numecombs;
234 		} sadb_x_propb_lenres;
235 		struct {
236 			uint8_t sadb_x_propb_oldres_replay;
237 			uint8_t sadb_x_propb_oldres_reserved[3];
238 		} sadb_x_propb_oldres;
239 	} sadb_x_propb_u;
240 #define	sadb_x_propb_replay \
241 	sadb_x_propb_u.sadb_x_propb_lenres.sadb_x_propb_lenres_replay
242 #define	sadb_x_propb_reserved \
243 	sadb_x_propb_u.sadb_x_propb_oldres.sadb_x_propb_oldres_reserved
244 #define	sadb_x_propb_ereserved \
245 	sadb_x_propb_u.sadb_x_propb_lenres.sadb_x_propb_lenres_eres
246 #define	sadb_x_propb_numecombs \
247 	sadb_x_propb_u.sadb_x_propb_lenres.sadb_x_propb_lenres_numecombs
248 	/* Followed by sadb_comb[] array or sadb_ecomb[] array. */
249 } sadb_x_propbase_t;
250 
251 /* Now, the actual sadb_prop structure, which will have alignment in it! */
252 
253 typedef struct sadb_prop {
254 	/* Union is for guaranteeing 64-bit alignment. */
255 	union {
256 		sadb_x_propbase_t sadb_x_prop_actual;
257 		uint64_t sadb_x_prop_alignment;
258 	} sadb_x_prop_u;
259 #define	sadb_prop_len sadb_x_prop_u.sadb_x_prop_actual.sadb_x_propb_len
260 #define	sadb_prop_exttype sadb_x_prop_u.sadb_x_prop_actual.sadb_x_propb_exttype
261 #define	sadb_prop_replay sadb_x_prop_u.sadb_x_prop_actual.sadb_x_propb_replay
262 #define	sadb_prop_reserved \
263 	sadb_x_prop_u.sadb_x_prop_actual.sadb_x_propb_reserved
264 #define	sadb_x_prop_ereserved \
265 	sadb_x_prop_u.sadb_x_prop_actual.sadb_x_propb_ereserved
266 #define	sadb_x_prop_numecombs \
267 	sadb_x_prop_u.sadb_x_prop_actual.sadb_x_propb_numecombs
268 } sadb_prop_t;
269 
270 /*
271  * This is a proposed combination.  Many of these can follow a proposal
272  * extension.  Already 64-bit aligned thanks to uint64_t fields.
273  */
274 
275 typedef struct sadb_comb {
276 	uint8_t sadb_comb_auth;			/* Authentication algorithm */
277 	uint8_t sadb_comb_encrypt;		/* Encryption algorithm */
278 	uint16_t sadb_comb_flags;		/* Comb. flags (e.g. PFS) */
279 	uint16_t sadb_comb_auth_minbits;	/* Bit strengths for auth */
280 	uint16_t sadb_comb_auth_maxbits;
281 	uint16_t sadb_comb_encrypt_minbits;	/* Bit strengths for encrypt */
282 	uint16_t sadb_comb_encrypt_maxbits;
283 	uint32_t sadb_comb_reserved;
284 	uint32_t sadb_comb_soft_allocations;	/* Lifetime proposals for */
285 	uint32_t sadb_comb_hard_allocations;	/* this combination. */
286 	uint64_t sadb_comb_soft_bytes;
287 	uint64_t sadb_comb_hard_bytes;
288 	uint64_t sadb_comb_soft_addtime;
289 	uint64_t sadb_comb_hard_addtime;
290 	uint64_t sadb_comb_soft_usetime;
291 	uint64_t sadb_comb_hard_usetime;
292 } sadb_comb_t;
293 
294 /*
295  * An extended combination that can comprise of many SA types.
296  * A single combination has algorithms and SA types locked.
297  * These are represented by algorithm descriptors, the second structure
298  * in the list.  For example, if the EACQUIRE requests AH(MD5) + ESP(DES/null)
299  * _or_ ESP(DES/MD5), it would have two combinations:
300  *
301  * COMB: algdes(AH, AUTH, MD5), algdes(ESP, CRYPT, DES)
302  * COMB: algdes(ESP, AUTH, MD5), algdes(ESP, CRYPT, DES)
303  *
304  * If an SA type supports an algorithm type, and there's no descriptor,
305  * assume it requires NONE, just like it were explicitly stated.
306  * (This includes ESP NULL encryption, BTW.)
307  *
308  * Already 64-bit aligned thanks to uint64_t fields.
309  */
310 
311 typedef struct sadb_x_ecomb {
312 	uint8_t sadb_x_ecomb_numalgs;
313 	uint8_t sadb_x_ecomb_reserved;
314 	uint16_t sadb_x_ecomb_flags;	/* E.g. PFS? */
315 	uint32_t sadb_x_ecomb_reserved2;
316 	uint32_t sadb_x_ecomb_soft_allocations;
317 	uint32_t sadb_x_ecomb_hard_allocations;
318 	uint64_t sadb_x_ecomb_soft_bytes;
319 	uint64_t sadb_x_ecomb_hard_bytes;
320 	uint64_t sadb_x_ecomb_soft_addtime;
321 	uint64_t sadb_x_ecomb_hard_addtime;
322 	uint64_t sadb_x_ecomb_soft_usetime;
323 	uint64_t sadb_x_ecomb_hard_usetime;
324 } sadb_x_ecomb_t;
325 
326 typedef struct sadb_x_algdesc {
327 	/* Union is for guaranteeing 64-bit alignment. */
328 	union {
329 		struct {
330 			uint8_t sadb_x_algdesc_usatype;	/* ESP, AH, etc. */
331 			uint8_t sadb_x_algdesc_ualgtype; /* AUTH, CRYPT, COMP */
332 			uint8_t sadb_x_algdesc_ualg;	/* 3DES, MD5, etc. */
333 			uint8_t sadb_x_algdesc_ureserved;
334 			uint16_t sadb_x_algdesc_uminbits; /* Bit strengths. */
335 			uint16_t sadb_x_algdesc_umaxbits;
336 		} sadb_x_algdesc_actual;
337 		uint64_t sadb_x_algdesc_alignment;
338 	} sadb_x_algdesc_u;
339 #define	sadb_x_algdesc_satype \
340 	sadb_x_algdesc_u.sadb_x_algdesc_actual.sadb_x_algdesc_usatype
341 #define	sadb_x_algdesc_algtype \
342 	sadb_x_algdesc_u.sadb_x_algdesc_actual.sadb_x_algdesc_ualgtype
343 #define	sadb_x_algdesc_alg \
344 	sadb_x_algdesc_u.sadb_x_algdesc_actual.sadb_x_algdesc_ualg
345 #define	sadb_x_algdesc_reserved \
346 	sadb_x_algdesc_u.sadb_x_algdesc_actual.sadb_x_algdesc_ureserved
347 #define	sadb_x_algdesc_minbits \
348 	sadb_x_algdesc_u.sadb_x_algdesc_actual.sadb_x_algdesc_uminbits
349 #define	sadb_x_algdesc_maxbits \
350 	sadb_x_algdesc_u.sadb_x_algdesc_actual.sadb_x_algdesc_umaxbits
351 } sadb_x_algdesc_t;
352 
353 /*
354  * When key mgmt. registers with the kernel, the kernel will tell key mgmt.
355  * its supported algorithms.
356  */
357 
358 typedef struct sadb_supported {
359 	/* Union is for guaranteeing 64-bit alignment. */
360 	union {
361 		struct {
362 			uint16_t sadb_x_supported_ulen;
363 			uint16_t sadb_x_supported_uexttype;
364 			uint32_t sadb_x_supported_ureserved;
365 		} sadb_x_supported_actual;
366 		uint64_t sadb_x_supported_alignment;
367 	} sadb_x_supported_u;
368 #define	sadb_supported_len \
369 	sadb_x_supported_u.sadb_x_supported_actual.sadb_x_supported_ulen
370 #define	sadb_supported_exttype \
371 	sadb_x_supported_u.sadb_x_supported_actual.sadb_x_supported_uexttype
372 #define	sadb_supported_reserved \
373 	sadb_x_supported_u.sadb_x_supported_actual.sadb_x_supported_ureserved
374 } sadb_supported_t;
375 
376 /* First, a base structure... */
377 typedef struct sadb_x_algb {
378 	uint8_t sadb_x_algb_id;		/* Algorithm type. */
379 	uint8_t sadb_x_algb_ivlen;		/* IV len, in bits */
380 	uint16_t sadb_x_algb_minbits;	/* Min. key len (in bits) */
381 	uint16_t sadb_x_algb_maxbits;	/* Max. key length */
382 	union {
383 		uint16_t sadb_x_algb_ureserved;
384 		uint8_t sadb_x_algb_udefaults[2];
385 	} sadb_x_algb_union;
386 
387 #define	sadb_x_algb_reserved sadb_x_algb_union.sadb_x_algb_ureserved
388 #define	sadb_x_algb_increment sadb_x_algb_union.sadb_x_algb_udefaults[0]
389 #define	sadb_x_algb_defincr sadb_x_algb_union.sadb_x_algb_udefaults[1]
390 /*
391  * alg_increment: the number of bits from a key length to the next
392  * alg_defincr: the number of increments from the smallest possible
393  * key to the default key length
394  */
395 } sadb_x_algb_t;
396 /* useful macros for dealing with defincr */
397 #define	SADB_ALG_DEFAULT_LEN(min, incr, defincr) ((min) + ((defincr) * (incr)))
398 #define	SADB_ALG_DEFAULT_INCR(min, incr, default) (((default) - (min)) / (incr))
399 
400 /* Now, the actual sadb_alg structure, which will have alignment in it. */
401 typedef struct sadb_alg {
402 	/* Union is for guaranteeing 64-bit alignment. */
403 	union {
404 		sadb_x_algb_t sadb_x_alg_actual;
405 		uint64_t sadb_x_alg_alignment;
406 	} sadb_x_alg_u;
407 #define	sadb_alg_id sadb_x_alg_u.sadb_x_alg_actual.sadb_x_algb_id
408 #define	sadb_alg_ivlen sadb_x_alg_u.sadb_x_alg_actual.sadb_x_algb_ivlen
409 #define	sadb_alg_minbits sadb_x_alg_u.sadb_x_alg_actual.sadb_x_algb_minbits
410 #define	sadb_alg_maxbits sadb_x_alg_u.sadb_x_alg_actual.sadb_x_algb_maxbits
411 #define	sadb_alg_reserved sadb_x_alg_u.sadb_x_alg_actual.sadb_x_algb_reserved
412 #define	sadb_x_alg_increment \
413 	sadb_x_alg_u.sadb_x_alg_actual.sadb_x_algb_increment
414 #define	sadb_x_alg_defincr sadb_x_alg_u.sadb_x_alg_actual.sadb_x_algb_defincr
415 } sadb_alg_t;
416 
417 /*
418  * If key mgmt. needs an SPI in a range (including 0 to 0xFFFFFFFF), it
419  * asks the kernel with this extension in the SADB_GETSPI message.
420  */
421 
422 typedef struct sadb_spirange {
423 	uint16_t sadb_spirange_len;
424 	uint16_t sadb_spirange_exttype;	/* SPI_RANGE */
425 	uint32_t sadb_spirange_min;
426 	/* Union is for guaranteeing 64-bit alignment. */
427 	union {
428 		struct {
429 			uint32_t sadb_x_spirange_umax;
430 			uint32_t sadb_x_spirange_ureserved;
431 		} sadb_x_spirange_actual;
432 		uint64_t sadb_x_spirange_alignment;
433 	} sadb_x_spirange_u;
434 #define	sadb_spirange_max \
435 	sadb_x_spirange_u.sadb_x_spirange_actual.sadb_x_spirange_umax
436 #define	sadb_spirange_reserved \
437 	sadb_x_spirange_u.sadb_x_spirange_actual.sadb_x_spirange_ureserved
438 } sadb_spirange_t;
439 
440 /*
441  * For the "extended REGISTER" which'll tell the kernel to send me
442  * "extended ACQUIREs".
443  */
444 
445 typedef struct sadb_x_ereg {
446 	/* Union is for guaranteeing 64-bit alignment. */
447 	union {
448 		struct {
449 			uint16_t sadb_x_ereg_ulen;
450 			uint16_t sadb_x_ereg_uexttype;	/* X_EREG */
451 			/* Array of SA types, 0-terminated. */
452 			uint8_t sadb_x_ereg_usatypes[4];
453 		} sadb_x_ereg_actual;
454 		uint64_t sadb_x_ereg_alignment;
455 	} sadb_x_ereg_u;
456 #define	sadb_x_ereg_len \
457 	sadb_x_ereg_u.sadb_x_ereg_actual.sadb_x_ereg_ulen
458 #define	sadb_x_ereg_exttype \
459 	sadb_x_ereg_u.sadb_x_ereg_actual.sadb_x_ereg_uexttype
460 #define	sadb_x_ereg_satypes \
461 	sadb_x_ereg_u.sadb_x_ereg_actual.sadb_x_ereg_usatypes
462 } sadb_x_ereg_t;
463 
464 /*
465  * For conveying a Key Management Cookie with SADB_GETSPI, SADB_ADD,
466  * SADB_ACQUIRE, or SADB_X_INVERSE_ACQUIRE.
467  */
468 
469 typedef struct sadb_x_kmc {
470 	uint16_t sadb_x_kmc_len;
471 	uint16_t sadb_x_kmc_exttype;	/* X_KM_COOKIE */
472 	uint32_t sadb_x_kmc_proto;	/* KM protocol */
473 	union {
474 		struct {
475 			uint32_t sadb_x_kmc_ucookie;	/* KMP-specific */
476 			uint32_t sadb_x_kmc_ureserved;	/* Must be zero */
477 		} sadb_x_kmc_actual;
478 		uint64_t sadb_x_kmc_alignment;
479 	} sadb_x_kmc_u;
480 #define	sadb_x_kmc_cookie sadb_x_kmc_u.sadb_x_kmc_actual.sadb_x_kmc_ucookie
481 #define	sadb_x_kmc_reserved sadb_x_kmc_u.sadb_x_kmc_actual.sadb_x_kmc_ureserved
482 } sadb_x_kmc_t;
483 
484 typedef struct sadb_x_pair {
485 	union {
486 		/* Union is for guaranteeing 64-bit alignment. */
487 		struct {
488 			uint16_t sadb_x_pair_ulen;
489 			uint16_t sadb_x_pair_uexttype;
490 			uint32_t sadb_x_pair_uspi;	/* SPI of paired SA */
491 		} sadb_x_pair_actual;
492 		uint64_t sadb_x_ext_alignment;
493 	} sadb_x_pair_u;
494 #define	sadb_x_pair_len sadb_x_pair_u.sadb_x_pair_actual.sadb_x_pair_ulen
495 #define	sadb_x_pair_exttype \
496 	sadb_x_pair_u.sadb_x_pair_actual.sadb_x_pair_uexttype
497 #define	sadb_x_pair_spi sadb_x_pair_u.sadb_x_pair_actual.sadb_x_pair_uspi
498 } sadb_x_pair_t;
499 
500 /*
501  * Base message types.
502  */
503 
504 #define	SADB_RESERVED	0
505 #define	SADB_GETSPI	1
506 #define	SADB_UPDATE	2
507 #define	SADB_ADD	3
508 #define	SADB_DELETE	4
509 #define	SADB_GET	5
510 #define	SADB_ACQUIRE	6
511 #define	SADB_REGISTER	7
512 #define	SADB_EXPIRE	8
513 #define	SADB_FLUSH	9
514 #define	SADB_DUMP	10   /* not used normally */
515 #define	SADB_X_PROMISC	11
516 #define	SADB_X_INVERSE_ACQUIRE	12
517 #define	SADB_X_UPDATEPAIR	13
518 #define	SADB_X_DELPAIR	14
519 #define	SADB_MAX	14
520 
521 /*
522  * SA flags
523  */
524 
525 #define	SADB_SAFLAGS_PFS	0x1	/* Perfect forward secrecy? */
526 #define	SADB_SAFLAGS_NOREPLAY	0x2	/* Replay field NOT PRESENT. */
527 
528 /* Below flags are used by this implementation.  Grow from left-to-right. */
529 #define	SADB_X_SAFLAGS_USED	0x80000000	/* SA used/not used */
530 #define	SADB_X_SAFLAGS_UNIQUE	0x40000000	/* SA unique/reusable */
531 #define	SADB_X_SAFLAGS_AALG1	0x20000000	/* Auth-alg specific flag 1 */
532 #define	SADB_X_SAFLAGS_AALG2	0x10000000	/* Auth-alg specific flag 2 */
533 #define	SADB_X_SAFLAGS_EALG1	 0x8000000	/* Encr-alg specific flag 1 */
534 #define	SADB_X_SAFLAGS_EALG2	 0x4000000	/* Encr-alg specific flag 2 */
535 #define	SADB_X_SAFLAGS_KM1	 0x2000000	/* Key mgmt. specific flag 1 */
536 #define	SADB_X_SAFLAGS_KM2	 0x1000000	/* Key mgmt. specific flag 2 */
537 #define	SADB_X_SAFLAGS_KM3	  0x800000	/* Key mgmt. specific flag 3 */
538 #define	SADB_X_SAFLAGS_KM4	  0x400000	/* Key mgmt. specific flag 4 */
539 #define	SADB_X_SAFLAGS_KRES1	  0x200000	/* Reserved by the kernel */
540 #define	SADB_X_SAFLAGS_NATT_LOC	  0x100000	/* this has a natted src SA */
541 #define	SADB_X_SAFLAGS_NATT_REM	   0x80000	/* this has a natted dst SA */
542 #define	SADB_X_SAFLAGS_KRES2	   0x40000	/* Reserved by the kernel */
543 #define	SADB_X_SAFLAGS_TUNNEL	   0x20000	/* tunnel mode */
544 #define	SADB_X_SAFLAGS_PAIRED	   0x10000	/* inbound/outbound pair */
545 #define	SADB_X_SAFLAGS_OUTBOUND	    0x8000	/* SA direction bit */
546 #define	SADB_X_SAFLAGS_INBOUND	    0x4000	/* SA direction bit */
547 
548 #define	SADB_X_SAFLAGS_KRES	\
549 	SADB_X_SAFLAGS_KRES1 | SADB_X_SAFLAGS_KRES2
550 
551 /*
552  * SA state.
553  */
554 
555 #define	SADB_SASTATE_LARVAL	  0
556 #define	SADB_SASTATE_MATURE	  1
557 #define	SADB_SASTATE_DYING	  2
558 #define	SADB_SASTATE_DEAD	  3
559 
560 #define	SADB_SASTATE_MAX	  3
561 
562 /*
563  * SA type.  Gaps are present in the number space because (for the time being)
564  * these types correspond to the SA types in the IPsec DOI document.
565  */
566 
567 #define	SADB_SATYPE_UNSPEC	0
568 #define	SADB_SATYPE_AH		2  /* RFC-1826 */
569 #define	SADB_SATYPE_ESP		3  /* RFC-1827 */
570 #define	SADB_SATYPE_RSVP	5  /* RSVP Authentication */
571 #define	SADB_SATYPE_OSPFV2	6  /* OSPFv2 Authentication */
572 #define	SADB_SATYPE_RIPV2	7  /* RIPv2 Authentication */
573 #define	SADB_SATYPE_MIP		8  /* Mobile IPv4 Authentication */
574 
575 #define	SADB_SATYPE_MAX		8
576 
577 /*
578  * Algorithm types.  Gaps are present because (for the time being) these types
579  * correspond to the SA types in the IPsec DOI document.
580  *
581  * NOTE:  These are numbered to play nice with the IPsec DOI.  That's why
582  *	  there are gaps.
583  */
584 
585 /* Authentication algorithms */
586 #define	SADB_AALG_NONE		0
587 #define	SADB_AALG_MD5HMAC	2
588 #define	SADB_AALG_SHA1HMAC	3
589 #define	SADB_AALG_SHA256HMAC	5
590 #define	SADB_AALG_SHA384HMAC	6
591 #define	SADB_AALG_SHA512HMAC	7
592 
593 #define	SADB_AALG_MAX		7
594 
595 /* Encryption algorithms */
596 #define	SADB_EALG_NONE		0
597 #define	SADB_EALG_DESCBC	2
598 #define	SADB_EALG_3DESCBC	3
599 #define	SADB_EALG_BLOWFISH	7
600 #define	SADB_EALG_NULL		11
601 #define	SADB_EALG_AES		12
602 #define	SADB_EALG_MAX		12
603 
604 /*
605  * Extension header values.
606  */
607 
608 #define	SADB_EXT_RESERVED		0
609 
610 #define	SADB_EXT_SA			1
611 #define	SADB_EXT_LIFETIME_CURRENT	2
612 #define	SADB_EXT_LIFETIME_HARD		3
613 #define	SADB_EXT_LIFETIME_SOFT		4
614 #define	SADB_EXT_ADDRESS_SRC		5
615 #define	SADB_EXT_ADDRESS_DST		6
616 /* These two are synonyms. */
617 #define	SADB_EXT_ADDRESS_PROXY		7
618 #define	SADB_X_EXT_ADDRESS_INNER_SRC	SADB_EXT_ADDRESS_PROXY
619 #define	SADB_EXT_KEY_AUTH		8
620 #define	SADB_EXT_KEY_ENCRYPT		9
621 #define	SADB_EXT_IDENTITY_SRC		10
622 #define	SADB_EXT_IDENTITY_DST		11
623 #define	SADB_EXT_SENSITIVITY		12
624 #define	SADB_EXT_PROPOSAL		13
625 #define	SADB_EXT_SUPPORTED_AUTH		14
626 #define	SADB_EXT_SUPPORTED_ENCRYPT	15
627 #define	SADB_EXT_SPIRANGE		16
628 #define	SADB_X_EXT_EREG			17
629 #define	SADB_X_EXT_EPROP		18
630 #define	SADB_X_EXT_KM_COOKIE		19
631 #define	SADB_X_EXT_ADDRESS_NATT_LOC	20
632 #define	SADB_X_EXT_ADDRESS_NATT_REM	21
633 #define	SADB_X_EXT_ADDRESS_INNER_DST	22
634 #define	SADB_X_EXT_PAIR			23
635 
636 #define	SADB_EXT_MAX			23
637 
638 /*
639  * Identity types.
640  */
641 
642 #define	SADB_IDENTTYPE_RESERVED 0
643 
644 /*
645  * For PREFIX and ADDR_RANGE, use the AF of the PROXY if present, or the SRC
646  * if not present.
647  */
648 #define	SADB_IDENTTYPE_PREFIX		1
649 #define	SADB_IDENTTYPE_FQDN		2  /* Fully qualified domain name. */
650 #define	SADB_IDENTTYPE_USER_FQDN	3  /* e.g. root@domain.com */
651 #define	SADB_X_IDENTTYPE_DN		4  /* ASN.1 DER Distinguished Name. */
652 #define	SADB_X_IDENTTYPE_GN		5  /* ASN.1 DER Generic Name. */
653 #define	SADB_X_IDENTTYPE_KEY_ID		6  /* Generic KEY ID. */
654 #define	SADB_X_IDENTTYPE_ADDR_RANGE	7
655 
656 #define	SADB_IDENTTYPE_MAX 	7
657 
658 /*
659  * Protection DOI values for the SENSITIVITY extension.  There are no values
660  * currently, so the MAX is the only non-zero value available.
661  */
662 
663 #define	SADB_DPD_NONE	0
664 
665 #define	SADB_DPD_MAX	1
666 
667 /*
668  * Diagnostic codes.  These supplement error messages.  Be sure to
669  * update libipsecutil's keysock_diag() if you change any of these.
670  */
671 
672 #define	SADB_X_DIAGNOSTIC_PRESET		-1	/* Internal value. */
673 
674 #define	SADB_X_DIAGNOSTIC_NONE			0
675 
676 #define	SADB_X_DIAGNOSTIC_UNKNOWN_MSG		1
677 #define	SADB_X_DIAGNOSTIC_UNKNOWN_EXT		2
678 #define	SADB_X_DIAGNOSTIC_BAD_EXTLEN		3
679 #define	SADB_X_DIAGNOSTIC_UNKNOWN_SATYPE	4
680 #define	SADB_X_DIAGNOSTIC_SATYPE_NEEDED		5
681 #define	SADB_X_DIAGNOSTIC_NO_SADBS		6
682 #define	SADB_X_DIAGNOSTIC_NO_EXT		7
683 /* Bad address family value */
684 #define	SADB_X_DIAGNOSTIC_BAD_SRC_AF		8
685 /* in sockaddr->sa_family. */
686 #define	SADB_X_DIAGNOSTIC_BAD_DST_AF		9
687 /* These two are synonyms. */
688 #define	SADB_X_DIAGNOSTIC_BAD_PROXY_AF		10
689 #define	SADB_X_DIAGNOSTIC_BAD_INNER_SRC_AF	10
690 
691 #define	SADB_X_DIAGNOSTIC_AF_MISMATCH		11
692 
693 #define	SADB_X_DIAGNOSTIC_BAD_SRC		12
694 #define	SADB_X_DIAGNOSTIC_BAD_DST		13
695 
696 #define	SADB_X_DIAGNOSTIC_ALLOC_HSERR		14
697 #define	SADB_X_DIAGNOSTIC_BYTES_HSERR		15
698 #define	SADB_X_DIAGNOSTIC_ADDTIME_HSERR		16
699 #define	SADB_X_DIAGNOSTIC_USETIME_HSERR		17
700 
701 #define	SADB_X_DIAGNOSTIC_MISSING_SRC		18
702 #define	SADB_X_DIAGNOSTIC_MISSING_DST		19
703 #define	SADB_X_DIAGNOSTIC_MISSING_SA		20
704 #define	SADB_X_DIAGNOSTIC_MISSING_EKEY		21
705 #define	SADB_X_DIAGNOSTIC_MISSING_AKEY		22
706 #define	SADB_X_DIAGNOSTIC_MISSING_RANGE		23
707 
708 #define	SADB_X_DIAGNOSTIC_DUPLICATE_SRC		24
709 #define	SADB_X_DIAGNOSTIC_DUPLICATE_DST		25
710 #define	SADB_X_DIAGNOSTIC_DUPLICATE_SA		26
711 #define	SADB_X_DIAGNOSTIC_DUPLICATE_EKEY	27
712 #define	SADB_X_DIAGNOSTIC_DUPLICATE_AKEY	28
713 #define	SADB_X_DIAGNOSTIC_DUPLICATE_RANGE	29
714 
715 #define	SADB_X_DIAGNOSTIC_MALFORMED_SRC		30
716 #define	SADB_X_DIAGNOSTIC_MALFORMED_DST		31
717 #define	SADB_X_DIAGNOSTIC_MALFORMED_SA		32
718 #define	SADB_X_DIAGNOSTIC_MALFORMED_EKEY	33
719 #define	SADB_X_DIAGNOSTIC_MALFORMED_AKEY	34
720 #define	SADB_X_DIAGNOSTIC_MALFORMED_RANGE	35
721 
722 #define	SADB_X_DIAGNOSTIC_AKEY_PRESENT		36
723 #define	SADB_X_DIAGNOSTIC_EKEY_PRESENT		37
724 #define	SADB_X_DIAGNOSTIC_PROP_PRESENT		38
725 #define	SADB_X_DIAGNOSTIC_SUPP_PRESENT		39
726 
727 #define	SADB_X_DIAGNOSTIC_BAD_AALG		40
728 #define	SADB_X_DIAGNOSTIC_BAD_EALG		41
729 #define	SADB_X_DIAGNOSTIC_BAD_SAFLAGS		42
730 #define	SADB_X_DIAGNOSTIC_BAD_SASTATE		43
731 
732 #define	SADB_X_DIAGNOSTIC_BAD_AKEYBITS		44
733 #define	SADB_X_DIAGNOSTIC_BAD_EKEYBITS		45
734 
735 #define	SADB_X_DIAGNOSTIC_ENCR_NOTSUPP		46
736 
737 #define	SADB_X_DIAGNOSTIC_WEAK_EKEY		47
738 #define	SADB_X_DIAGNOSTIC_WEAK_AKEY		48
739 
740 #define	SADB_X_DIAGNOSTIC_DUPLICATE_KMP		49
741 #define	SADB_X_DIAGNOSTIC_DUPLICATE_KMC		50
742 
743 #define	SADB_X_DIAGNOSTIC_MISSING_NATT_LOC	51
744 #define	SADB_X_DIAGNOSTIC_MISSING_NATT_REM	52
745 #define	SADB_X_DIAGNOSTIC_DUPLICATE_NATT_LOC	53
746 #define	SADB_X_DIAGNOSTIC_DUPLICATE_NATT_REM	54
747 #define	SADB_X_DIAGNOSTIC_MALFORMED_NATT_LOC	55
748 #define	SADB_X_DIAGNOSTIC_MALFORMED_NATT_REM	56
749 #define	SADB_X_DIAGNOSTIC_DUPLICATE_NATT_PORTS	57
750 
751 #define	SADB_X_DIAGNOSTIC_MISSING_INNER_SRC	58
752 #define	SADB_X_DIAGNOSTIC_MISSING_INNER_DST	59
753 #define	SADB_X_DIAGNOSTIC_DUPLICATE_INNER_SRC	60
754 #define	SADB_X_DIAGNOSTIC_DUPLICATE_INNER_DST	61
755 #define	SADB_X_DIAGNOSTIC_MALFORMED_INNER_SRC	62
756 #define	SADB_X_DIAGNOSTIC_MALFORMED_INNER_DST	63
757 
758 #define	SADB_X_DIAGNOSTIC_PREFIX_INNER_SRC	64
759 #define	SADB_X_DIAGNOSTIC_PREFIX_INNER_DST	65
760 #define	SADB_X_DIAGNOSTIC_BAD_INNER_DST_AF	66
761 #define	SADB_X_DIAGNOSTIC_INNER_AF_MISMATCH	67
762 
763 #define	SADB_X_DIAGNOSTIC_BAD_NATT_REM_AF	68
764 #define	SADB_X_DIAGNOSTIC_BAD_NATT_LOC_AF	69
765 
766 #define	SADB_X_DIAGNOSTIC_PROTO_MISMATCH	70
767 #define	SADB_X_DIAGNOSTIC_INNER_PROTO_MISMATCH	71
768 
769 #define	SADB_X_DIAGNOSTIC_DUAL_PORT_SETS	72
770 
771 #define	SADB_X_DIAGNOSTIC_PAIR_INAPPROPRIATE	73
772 #define	SADB_X_DIAGNOSTIC_PAIR_ADD_MISMATCH	74
773 #define	SADB_X_DIAGNOSTIC_PAIR_ALREADY		75
774 #define	SADB_X_DIAGNOSTIC_PAIR_SA_NOTFOUND	76
775 #define	SADB_X_DIAGNOSTIC_BAD_SA_DIRECTION	77
776 
777 #define	SADB_X_DIAGNOSTIC_SA_NOTFOUND		78
778 #define	SADB_X_DIAGNOSTIC_SA_EXPIRED		79
779 #define	SADB_X_DIAGNOSTIC_MAX			79
780 
781 /* Algorithm type for sadb_x_algdesc above... */
782 
783 #define	SADB_X_ALGTYPE_NONE		0
784 #define	SADB_X_ALGTYPE_AUTH		1
785 #define	SADB_X_ALGTYPE_CRYPT		2
786 #define	SADB_X_ALGTYPE_COMPRESS		3
787 
788 #define	SADB_X_ALGTYPE_MAX		3
789 
790 /* Key management protocol for sadb_x_kmc above... */
791 
792 #define	SADB_X_KMP_MANUAL	0
793 #define	SADB_X_KMP_IKE		1
794 #define	SADB_X_KMP_KINK		2
795 
796 #define	SADB_X_KMP_MAX		2
797 
798 /*
799  * Handy conversion macros.  Not part of the PF_KEY spec...
800  */
801 
802 #define	SADB_64TO8(x)	((x) << 3)
803 #define	SADB_8TO64(x)	((x) >> 3)
804 #define	SADB_8TO1(x)	((x) << 3)
805 #define	SADB_1TO8(x)	((x) >> 3)
806 
807 #ifdef	__cplusplus
808 }
809 #endif
810 
811 #endif	/* _NET_PFKEYV2_H */
812