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 (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
23  */
24 
25 #ifndef	_IKEDOOR_H
26 #define	_IKEDOOR_H
27 
28 #ifdef	__cplusplus
29 extern "C" {
30 #endif
31 
32 #include <limits.h>
33 #include <sys/sysmacros.h>
34 #include <net/pfkeyv2.h>
35 #include <door.h>
36 
37 /*
38  * This version number is intended to stop the calling process from
39  * getting confused if a structure is changed and a mismatch occurs.
40  * This should be incremented each time a structure is changed.
41  */
42 
43 /*
44  * The IKE process may be a 64-bit process, but ikeadm or any other IKE
45  * door consumer does not have to be.  We need to be strict ala. PF_KEY or
46  * any on-the-wire-protocol with respect to structure fields offsets and
47  * alignment.  Please make sure all structures are the same size on both
48  * 64-bit and 32-bit execution environments (or even other ones), and that
49  * apart from trivial 4-byte enums or base headers, that all structures are
50  * multiples of 8-bytes (64-bits).
51  */
52 #define	DOORVER 4
53 #define	DOORNM	"/var/run/ike_door"
54 
55 
56 typedef enum {
57 	IKE_SVC_GET_DBG,
58 	IKE_SVC_SET_DBG,
59 
60 	IKE_SVC_GET_PRIV,
61 	IKE_SVC_SET_PRIV,
62 
63 	IKE_SVC_GET_STATS,
64 
65 	IKE_SVC_GET_P1,
66 	IKE_SVC_DEL_P1,
67 	IKE_SVC_DUMP_P1S,
68 	IKE_SVC_FLUSH_P1S,
69 
70 	IKE_SVC_GET_RULE,
71 	IKE_SVC_NEW_RULE,
72 	IKE_SVC_DEL_RULE,
73 	IKE_SVC_DUMP_RULES,
74 	IKE_SVC_READ_RULES,
75 	IKE_SVC_WRITE_RULES,
76 
77 	IKE_SVC_GET_PS,
78 	IKE_SVC_NEW_PS,
79 	IKE_SVC_DEL_PS,
80 	IKE_SVC_DUMP_PS,
81 	IKE_SVC_READ_PS,
82 	IKE_SVC_WRITE_PS,
83 
84 	IKE_SVC_DBG_RBDUMP,
85 
86 	IKE_SVC_GET_DEFS,
87 
88 	IKE_SVC_SET_PIN,
89 	IKE_SVC_DEL_PIN,
90 
91 	IKE_SVC_DUMP_CERTCACHE,
92 	IKE_SVC_FLUSH_CERTCACHE,
93 
94 	IKE_SVC_DUMP_GROUPS,
95 	IKE_SVC_DUMP_ENCRALGS,
96 	IKE_SVC_DUMP_AUTHALGS,
97 
98 	IKE_SVC_ERROR
99 } ike_svccmd_t;
100 
101 /* DPD status */
102 
103 typedef enum dpd_status {
104 	DPD_NOT_INITIATED = 0,
105 	DPD_IN_PROGRESS,
106 	DPD_SUCCESSFUL,
107 	DPD_FAILURE
108 } dpd_status_t;
109 
110 #define	IKE_SVC_MAX	IKE_SVC_ERROR
111 
112 
113 /*
114  * Support structures/defines
115  */
116 
117 #define	IKEDOORROUNDUP(i)   P2ROUNDUP((i), sizeof (uint64_t))
118 
119 /*
120  * Debug categories.  The debug level is a bitmask made up of
121  * flags indicating the desired categories; only 31 bits are
122  * available, as the highest-order bit designates an invalid
123  * setting.
124  */
125 #define	D_INVALID	0x80000000
126 
127 #define	D_CERT		0x00000001	/* certificate management */
128 #define	D_KEY		0x00000002	/* key management */
129 #define	D_OP		0x00000004	/* operational: config, init, mem */
130 #define	D_P1		0x00000008	/* phase 1 negotiation */
131 #define	D_P2		0x00000010	/* phase 2 negotiation */
132 #define	D_PFKEY		0x00000020	/* pf key interface */
133 #define	D_POL		0x00000040	/* policy management */
134 #define	D_PROP		0x00000080	/* proposal construction */
135 #define	D_DOOR		0x00000100	/* door server */
136 #define	D_CONFIG	0x00000200	/* config file processing */
137 #define	D_LABEL		0x00000400	/* MAC labels */
138 
139 #define	D_HIGHBIT	0x00000400
140 #define	D_ALL		0x000007ff
141 
142 /*
143  * Access privilege levels: define level of access to keying information.
144  * The privileges granted at each level is a superset of the privileges
145  * granted at all lower levels.
146  *
147  * The door operations which require special privileges are:
148  *
149  *	- receiving keying material for SAs and preshared key entries
150  *	  IKE_PRIV_KEYMAT must be set for this.
151  *
152  *	- get/dump/new/delete/read/write preshared keys
153  *	  IKE_PRIV_KEYMAT or IKE_PRIV_MODKEYS must be set to do this.
154  *	  If IKE_PRIV_MODKEYS is set, the information returned for a
155  *	  get/dump request will not include the actual key; in order
156  *	  to get the key itself, IKE_PRIV_KEYMAT must be set.
157  *
158  *	- modifying the privilege level: the daemon's privilege level
159  *	  is set when the daemon is started; the level may only be
160  *	  lowered via the door interface.
161  *
162  * All other operations are allowed at any privilege level.
163  */
164 #define	IKE_PRIV_MINIMUM	0
165 #define	IKE_PRIV_MODKEYS	1
166 #define	IKE_PRIV_KEYMAT		2
167 #define	IKE_PRIV_MAXIMUM	2
168 
169 /* global ike stats formatting structure */
170 typedef struct {
171 	uint32_t	st_init_p1_current;
172 	uint32_t	st_resp_p1_current;
173 	uint32_t	st_init_p1_total;
174 	uint32_t	st_resp_p1_total;
175 	uint32_t	st_init_p1_attempts;
176 	uint32_t	st_resp_p1_attempts;
177 	uint32_t	st_init_p1_noresp;   /* failed; no response from peer */
178 	uint32_t	st_init_p1_respfail; /* failed, but peer responded */
179 	uint32_t	st_resp_p1_fail;
180 	uint32_t	st_reserved;
181 	char		st_pkcs11_libname[PATH_MAX];
182 } ike_stats_t;
183 
184 /* structure used to pass default values used by in.iked back to ikeadm */
185 typedef struct {
186 	uint32_t	rule_p1_lifetime_secs;
187 	uint32_t	rule_p1_minlife;
188 	uint32_t	rule_p1_nonce_len;
189 	uint32_t	rule_p2_lifetime_secs;
190 	uint32_t	rule_p2_softlife_secs;
191 	uint32_t	rule_p2_idletime_secs;
192 	uint32_t	sys_p2_lifetime_secs;
193 	uint32_t	sys_p2_softlife_secs;
194 	uint32_t	sys_p2_idletime_secs;
195 	uint32_t	rule_p2_lifetime_kb;
196 	uint32_t	rule_p2_softlife_kb;
197 	uint32_t	sys_p2_lifetime_bytes;
198 	uint32_t	sys_p2_softlife_bytes;
199 	uint32_t	rule_p2_minlife_hard_secs;
200 	uint32_t	rule_p2_minlife_soft_secs;
201 	uint32_t	rule_p2_minlife_idle_secs;
202 	uint32_t	rule_p2_minlife_hard_kb;
203 	uint32_t	rule_p2_minlife_soft_kb;
204 	uint32_t	rule_p2_maxlife_secs;
205 	uint32_t	rule_p2_maxlife_kb;
206 	uint32_t	rule_p2_nonce_len;
207 	uint32_t	rule_p2_pfs;
208 	uint32_t	rule_p2_mindiff_secs;
209 	uint32_t	rule_p2_mindiff_kb;
210 	uint32_t	conversion_factor;	/* for secs to kbytes */
211 	uint32_t	rule_max_certs;
212 	uint32_t	rule_ike_port;
213 	uint32_t	rule_natt_port;
214 	uint32_t	defaults_reserved;	/* For 64-bit alignment. */
215 } ike_defaults_t;
216 
217 /* data formatting structures for P1 SA dumps */
218 typedef struct {
219 	struct sockaddr_storage	loc_addr;
220 	struct sockaddr_storage	rem_addr;
221 #define	beg_iprange	loc_addr
222 #define	end_iprange	rem_addr
223 } ike_addr_pr_t;
224 
225 typedef struct {
226 	uint64_t	cky_i;
227 	uint64_t	cky_r;
228 } ike_cky_pr_t;
229 
230 typedef struct {
231 	ike_cky_pr_t	p1hdr_cookies;
232 	uint8_t		p1hdr_major;
233 	uint8_t		p1hdr_minor;
234 	uint8_t		p1hdr_xchg;
235 	uint8_t		p1hdr_isinit;
236 	uint32_t	p1hdr_state;
237 	boolean_t	p1hdr_support_dpd;
238 	dpd_status_t	p1hdr_dpd_state;
239 	uint64_t	p1hdr_dpd_time;
240 } ike_p1_hdr_t;
241 
242 /* values for p1hdr_xchg (aligned with RFC2408, section 3.1) */
243 #define	IKE_XCHG_NONE			0
244 #define	IKE_XCHG_BASE			1
245 #define	IKE_XCHG_IDENTITY_PROTECT	2
246 #define	IKE_XCHG_AUTH_ONLY		3
247 #define	IKE_XCHG_AGGRESSIVE		4
248 /* following not from RFC; used only for preshared key definitions */
249 #define	IKE_XCHG_IP_AND_AGGR		240
250 /* also not from RFC; used as wildcard */
251 #define	IKE_XCHG_ANY			256
252 
253 /* values for p1hdr_state */
254 #define	IKE_SA_STATE_INVALID	0
255 #define	IKE_SA_STATE_INIT	1
256 #define	IKE_SA_STATE_SENT_SA	2
257 #define	IKE_SA_STATE_SENT_KE	3
258 #define	IKE_SA_STATE_SENT_LAST	4
259 #define	IKE_SA_STATE_DONE	5
260 #define	IKE_SA_STATE_DELETED	6
261 
262 typedef struct {
263 	uint16_t	p1xf_dh_group;
264 	uint16_t	p1xf_encr_alg;
265 	uint16_t	p1xf_encr_low_bits;
266 	uint16_t	p1xf_encr_high_bits;
267 	uint16_t	p1xf_auth_alg;
268 	uint16_t	p1xf_auth_meth;
269 	uint16_t	p1xf_prf;
270 	uint16_t	p1xf_pfs;
271 	uint32_t	p1xf_max_secs;
272 	uint32_t	p1xf_max_kbytes;
273 	uint32_t	p1xf_max_keyuses;
274 	uint32_t	p1xf_reserved;	/* Alignment to 64-bit. */
275 } ike_p1_xform_t;
276 
277 /* values for p1xf_dh_group (aligned with RFC2409, Appendix A) */
278 #define	IKE_GRP_DESC_MODP_768	1
279 #define	IKE_GRP_DESC_MODP_1024	2
280 #define	IKE_GRP_DESC_EC2N_155	3
281 #define	IKE_GRP_DESC_EC2N_185	4
282 /* values for p1xf_dh_group (aligned with RFC3526) */
283 #define	IKE_GRP_DESC_MODP_1536		5
284 #define	IKE_GRP_DESC_MODP_2048		14
285 #define	IKE_GRP_DESC_MODP_3072		15
286 #define	IKE_GRP_DESC_MODP_4096		16
287 #define	IKE_GRP_DESC_MODP_6144		17
288 #define	IKE_GRP_DESC_MODP_8192		18
289 #define	IKE_GRP_DESC_ECP_256		19
290 #define	IKE_GRP_DESC_ECP_384		20
291 #define	IKE_GRP_DESC_ECP_521		21
292 /* values for p1xf_dh_group (aligned with RFC5114) */
293 #define	IKE_GRP_DESC_MODP_1024_160 	22
294 #define	IKE_GRP_DESC_MODP_2048_224 	23
295 #define	IKE_GRP_DESC_MODP_2048_256 	24
296 #define	IKE_GRP_DESC_ECP_192		25
297 #define	IKE_GRP_DESC_ECP_224		26
298 
299 /* values for p1xf_auth_meth (aligned with RFC2409, Appendix A) */
300 #define	IKE_AUTH_METH_PRE_SHARED_KEY	1
301 #define	IKE_AUTH_METH_DSS_SIG		2
302 #define	IKE_AUTH_METH_RSA_SIG		3
303 #define	IKE_AUTH_METH_RSA_ENCR		4
304 #define	IKE_AUTH_METH_RSA_ENCR_REVISED	5
305 
306 /* values for p1xf_prf */
307 #define	IKE_PRF_NONE		0
308 #define	IKE_PRF_HMAC_MD5	1
309 #define	IKE_PRF_HMAC_SHA1	2
310 #define	IKE_PRF_HMAC_SHA256	5
311 #define	IKE_PRF_HMAC_SHA384	6
312 #define	IKE_PRF_HMAC_SHA512	7
313 
314 typedef struct {
315 	/*
316 	 * NOTE: the new and del counters count the actual number of SAs,
317 	 * not the number of "suites", as defined in the ike monitoring
318 	 * mib draft; we do this because we don't have a good way of
319 	 * tracking the deletion of entire suites (we're notified of
320 	 * deleted qm sas individually).
321 	 */
322 	uint32_t	p1stat_new_qm_sas;
323 	uint32_t	p1stat_del_qm_sas;
324 	uint64_t	p1stat_start;
325 	uint32_t	p1stat_kbytes;
326 	uint32_t	p1stat_keyuses;
327 } ike_p1_stats_t;
328 
329 typedef struct {
330 	uint32_t	p1err_decrypt;
331 	uint32_t	p1err_hash;
332 	uint32_t	p1err_otherrx;
333 	uint32_t	p1err_tx;
334 } ike_p1_errors_t;
335 
336 typedef struct {
337 	uint32_t	p1key_type;
338 	uint32_t	p1key_len;
339 	/*
340 	 * followed by (len - sizeof (ike_p1_key_t)) bytes of hex data,
341 	 * 64-bit aligned (pad bytes are added at the end, if necessary,
342 	 * and NOT INCLUDED in the len value, which reflects the actual
343 	 * key size).
344 	 */
345 } ike_p1_key_t;
346 
347 /* key info types for ike_p1_key_t struct */
348 #define	IKE_KEY_PRESHARED	1
349 #define	IKE_KEY_SKEYID		2
350 #define	IKE_KEY_SKEYID_D	3
351 #define	IKE_KEY_SKEYID_A	4
352 #define	IKE_KEY_SKEYID_E	5
353 #define	IKE_KEY_ENCR		6
354 #define	IKE_KEY_IV		7
355 
356 typedef struct {
357 	ike_p1_hdr_t	p1sa_hdr;
358 	ike_p1_xform_t	p1sa_xform;
359 	ike_addr_pr_t	p1sa_ipaddrs;
360 	uint16_t	p1sa_stat_off;
361 	uint16_t	p1sa_stat_len;
362 	uint16_t	p1sa_error_off;
363 	uint16_t	p1sa_error_len;
364 	uint16_t	p1sa_localid_off;
365 	uint16_t	p1sa_localid_len;
366 	uint16_t	p1sa_remoteid_off;
367 	uint16_t	p1sa_remoteid_len;
368 	uint16_t	p1sa_key_off;
369 	uint16_t	p1sa_key_len;
370 	uint32_t	p1sa_reserved;
371 	/*
372 	 * variable-length structures will be included here, as
373 	 * indicated by offset/length fields.
374 	 * stats and errors will be formatted as ike_p1_stats_t and
375 	 * ike_p1_errors_t, respectively.
376 	 * key info will be formatted as a series of p1_key_t structs.
377 	 * local/remote ids will be formatted as sadb_ident_t structs.
378 	 */
379 } ike_p1_sa_t;
380 
381 
382 #define	MAX_LABEL_LEN	256
383 
384 
385 /* data formatting structure for policy (rule) dumps */
386 
387 typedef struct {
388 	char		rule_label[MAX_LABEL_LEN];
389 	uint32_t	rule_kmcookie;
390 	uint16_t	rule_ike_mode;
391 	uint16_t	rule_local_idtype;	/* SADB_IDENTTYPE_* value */
392 	uint32_t	rule_p1_nonce_len;
393 	uint32_t	rule_p2_nonce_len;
394 	uint32_t	rule_p2_pfs;
395 	uint32_t	rule_p2_lifetime_secs;
396 	uint32_t	rule_p2_softlife_secs;
397 	uint32_t	rule_p2_idletime_secs;
398 	uint32_t	rule_p2_lifetime_kb;
399 	uint32_t	rule_p2_softlife_kb;
400 	uint16_t	rule_xform_cnt;
401 	uint16_t	rule_xform_off;
402 	uint16_t	rule_locip_cnt;
403 	uint16_t	rule_locip_off;
404 	uint16_t	rule_remip_cnt;
405 	uint16_t	rule_remip_off;
406 	uint16_t	rule_locid_inclcnt;
407 	uint16_t	rule_locid_exclcnt;
408 	uint16_t	rule_locid_off;
409 	uint16_t	rule_remid_inclcnt;
410 	uint16_t	rule_remid_exclcnt;
411 	uint16_t	rule_remid_off;
412 	/*
413 	 * Followed by several lists of variable-length structures, described
414 	 * by counts and offsets:
415 	 *	transforms			ike_p1_xform_t structs
416 	 *	ranges of local ip addrs	ike_addr_pr_t structs
417 	 *	ranges of remote ip addrs	ike_addr_pr_t structs
418 	 *	local identification strings	null-terminated ascii strings
419 	 *	remote identification strings	null-terminated ascii strings
420 	 */
421 } ike_rule_t;
422 
423 /* data formatting structure for DH group dumps */
424 typedef struct {
425 	uint16_t	group_number;
426 	uint16_t	group_bits;
427 	char		group_label[MAX_LABEL_LEN];
428 } ike_group_t;
429 
430 /* data formatting structure for encryption algorithm dumps */
431 typedef struct {
432 	uint_t		encr_value;
433 	char		encr_name[MAX_LABEL_LEN];
434 	int		encr_keylen_min;
435 	int		encr_keylen_max;
436 } ike_encralg_t;
437 
438 /* data formatting structure for authentication algorithm dumps */
439 typedef struct {
440 	uint_t		auth_value;
441 	char		auth_name[MAX_LABEL_LEN];
442 } ike_authalg_t;
443 
444 /*
445  * data formatting structure for preshared keys
446  * ps_ike_mode field uses the IKE_XCHG_* defs
447  */
448 typedef struct {
449 	ike_addr_pr_t	ps_ipaddrs;
450 	uint16_t	ps_ike_mode;
451 	uint16_t	ps_localid_off;
452 	uint16_t	ps_localid_len;
453 	uint16_t	ps_remoteid_off;
454 	uint16_t	ps_remoteid_len;
455 	uint16_t	ps_key_off;
456 	uint16_t	ps_key_len;
457 	uint16_t	ps_key_bits;
458 	int		ps_localid_plen;
459 	int		ps_remoteid_plen;
460 	/*
461 	 * followed by variable-length structures, as indicated by
462 	 * offset/length fields.
463 	 * key info will be formatted as an array of bytes.
464 	 * local/remote ids will be formatted as sadb_ident_t structs.
465 	 */
466 } ike_ps_t;
467 
468 #define	DN_MAX			1024
469 #define	CERT_OFF_WIRE		-1
470 #define	CERT_NO_PRIVKEY		0
471 #define	CERT_PRIVKEY_LOCKED	1
472 #define	CERT_PRIVKEY_AVAIL	2
473 
474 /*
475  * data formatting structure for cached certs
476  */
477 typedef struct {
478 	uint32_t	cache_id;
479 	uint32_t	certclass;
480 	int		linkage;
481 	uint32_t	certcache_padding;	/* For 64-bit alignment. */
482 	char		subject[DN_MAX];
483 	char		issuer[DN_MAX];
484 } ike_certcache_t;
485 
486 /* identification types */
487 #define	IKE_ID_IDENT_PAIR	1
488 #define	IKE_ID_ADDR_PAIR	2
489 #define	IKE_ID_CKY_PAIR		3
490 #define	IKE_ID_LABEL		4
491 
492 
493 /* locations for read/write requests */
494 #define	IKE_RW_LOC_DEFAULT	1
495 #define	IKE_RW_LOC_USER_SPEC	2
496 
497 
498 /* door interface error codes */
499 #define	IKE_ERR_NO_OBJ		1	/* nothing found to match the request */
500 #define	IKE_ERR_NO_DESC		2	/* fd was required with this request */
501 #define	IKE_ERR_ID_INVALID	3	/* invalid id info was provided */
502 #define	IKE_ERR_LOC_INVALID	4	/* invalid location info was provided */
503 #define	IKE_ERR_CMD_INVALID	5	/* invalid command was provided */
504 #define	IKE_ERR_DATA_INVALID	6	/* invalid data was provided */
505 #define	IKE_ERR_CMD_NOTSUP	7	/* unsupported command */
506 #define	IKE_ERR_REQ_INVALID	8	/* badly formatted request */
507 #define	IKE_ERR_NO_PRIV		9	/* privilege level not high enough */
508 #define	IKE_ERR_SYS_ERR		10	/* syserr occurred while processing */
509 #define	IKE_ERR_DUP_IGNORED	11	/* attempt to add a duplicate entry */
510 #define	IKE_ERR_NO_TOKEN	12	/* cannot login into pkcs#11 token */
511 #define	IKE_ERR_NO_AUTH		13	/* not authorized */
512 #define	IKE_ERR_IN_PROGRESS	14	/* operation already in progress */
513 #define	IKE_ERR_NO_MEM		15	/* insufficient memory */
514 
515 
516 /*
517  * IKE_SVC_GET_DBG
518  * Used to request the current debug level.
519  *
520  * Upon request, dbg_level is 0 (don't care).
521  *
522  * Upon return, dbg_level contains the current value.
523  *
524  *
525  * IKE_SVC_SET_DBG
526  * Used to request modification of the debug level.
527  *
528  * Upon request, dbg_level contains desired level.  If debug output is
529  * to be directed to a different file, the fd should be passed in the
530  * door_desc_t field of the door_arg_t param.  NOTE: if the daemon is
531  * currently running in the background with no debug set, an output
532  * file MUST be given.
533  *
534  * Upon return, dbg_level contains the old debug level, and acknowledges
535  * successful completion of the request.  If an error is encountered,
536  * ike_err_t is returned instead, with appropriate error value and cmd
537  * IKE_SVC_ERROR.
538  */
539 typedef struct {
540 	ike_svccmd_t	cmd;
541 	uint32_t	dbg_level;
542 } ike_dbg_t;
543 
544 /*
545  * IKE_SVC_GET_PRIV
546  * Used to request the current privilege level.
547  *
548  * Upon request, priv_level is 0 (don't care).
549  *
550  * Upon return, priv_level contains the current value.
551  *
552  *
553  * IKE_SVC_SET_PRIV
554  * Used to request modification of the privilege level.
555  *
556  * Upon request, priv_level contains the desired level.  The level may
557  * only be lowered via the door interface; it cannot be raised.  Thus,
558  * if in.iked is started at the lowest level, it cannot be changed.
559  *
560  * Upon return, priv_level contains the old privilege level, and
561  * acknowledges successful completion of the request.  If an error is
562  * encountered, ike_err_t is returned instead, with appropriate error
563  * value and cmd IKE_SVC_ERROR.
564  */
565 typedef struct {
566 	ike_svccmd_t	cmd;
567 	uint32_t	priv_level;
568 } ike_priv_t;
569 
570 
571 /*
572  * IKE_SVC_GET_STATS
573  * Used to request current statistics on Phase 1 SA creation and
574  * failures.  The statistics represent all activity in in.iked.
575  *
576  * Upon request, cmd is set, and stat_len does not matter.
577  *
578  * Upon successful return, stat_len contains the total size of the
579  * returned buffer, which contains first the ike_statreq_t struct,
580  * followed by the stat data in the ike_stats_t structure. In case
581  * of an error in processing the request, ike_err_t is returned with
582  * IKE_SVC_ERROR command and appropriate error code.
583  */
584 typedef struct {
585 	ike_svccmd_t	cmd;
586 	uint32_t	stat_len;
587 } ike_statreq_t;
588 
589 /*
590  * IKE_SVC_GET_DEFS
591  * Used to request default values from in.iked.
592  *
593  * Upon request, cmd is set, and stat_len does not matter.
594  *
595  * Upon successful return, stat_len contains the total size of the
596  * returned buffer, this contains a pair of ike_defaults_t's.
597  */
598 typedef struct {
599 	ike_svccmd_t	cmd;
600 	uint32_t	stat_len;
601 	uint32_t	version;
602 	uint32_t	defreq_reserved;	/* For 64-bit alignment. */
603 } ike_defreq_t;
604 
605 /*
606  * IKE_SVC_DUMP_{P1S|RULES|PS|CERTCACHE}
607  * Used to request a table dump, and to return info for a single table
608  * item.  The expectation is that all of the table data will be passed
609  * through the door, one entry at a time; an individual request must be
610  * sent for each entry, however (the door server can't send unrequested
611  * data).
612  *
613  * Upon request: cmd is set, and dump_next contains the item number
614  * requested (0 for first request).  dump_len is 0; no data follows.
615  *
616  * Upon return: cmd is set, and dump_next contains the item number of
617  * the *next* item in the table (to be used in the subsequent request).
618  * dump_next = 0 indicates that this is the last item in the table.
619  * dump_len is the total length (data + struct) returned.  Data is
620  * formatted as indicated by the cmd type:
621  *   IKE_SVC_DUMP_P1S:		ike_p1_sa_t
622  *   IKE_SVC_DUMP_RULES:	ike_rule_t
623  *   IKE_SVC_DUMP_PS:		ike_ps_t
624  *   IKE_SVC_DUMP_CERTCACHE:	ike_certcache_t
625  */
626 typedef struct {
627 	ike_svccmd_t	cmd;
628 	uint32_t	dump_len;
629 	union {
630 		struct {
631 			uint32_t	dump_unext;
632 			uint32_t	dump_ureserved;
633 		} dump_actual;
634 		uint64_t dump_alignment;
635 	} dump_u;
636 #define	dump_next dump_u.dump_actual.dump_unext
637 #define	dump_reserved dump_u.dump_actual.dump_ureserved
638 	/* dump_len - sizeof (ike_dump_t) bytes of data included here */
639 } ike_dump_t;
640 
641 
642 /*
643  * IKE_SVC_GET_{P1|RULE|PS}
644  * Used to request and return individual table items.
645  *
646  * Upon request: get_len is the total msg length (struct + id data);
647  * get_idtype indicates the type of identification being used.
648  *   IKE_SVC_GET_P1:		ike_addr_pr_t or ike_cky_pr_t
649  *   IKE_SVC_GET_RULE:		char string (label)
650  *   IKE_SVC_GET_PS:		ike_addr_pr_t or pair of sadb_ident_t
651  *
652  * Upon return: get_len is the total size (struct + data), get_idtype
653  * is unused, and the data that follows is formatted according to cmd:
654  *   IKE_SVC_GET_P1:		ike_p1_sa_t
655  *   IKE_SVC_GET_RULE:		ike_rule_t
656  *   IKE_SVC_GET_PS:		ike_ps_t
657  */
658 typedef struct {
659 	ike_svccmd_t	cmd;
660 	uint32_t	get_len;
661 	union {
662 		struct {
663 			uint32_t	getu_idtype;
664 			uint32_t	getu_reserved;
665 		} get_actual;
666 		uint64_t get_alignment;
667 	} get_u;
668 #define	get_idtype get_u.get_actual.getu_idtype
669 #define	get_reserved get_u.get_actual.getu_reserved
670 	/* get_len - sizeof (ike_get_t) bytes of data included here */
671 } ike_get_t;
672 
673 
674 /*
675  * IKE_SVC_NEW_{RULE|PS}
676  * Used to request and acknowledge insertion of a table item.
677  *
678  * Upon request: new_len is the total (data + struct) size passed, or 0.
679  * new_len = 0 => a door_desc_t is also included with a file descriptor
680  * for a file containing the data to be added.  The file should include
681  * a single item: a rule, or a pre-shared key.  For new_len != 0, the
682  * data is formatted according to the cmd type:
683  *   IKE_SVC_NEW_RULE:		ike_rule_t
684  *   IKE_SVC_NEW_PS:		ike_ps_t
685  *
686  * Upon return: new_len is 0; simply acknowledges successful insertion
687  * of the requested item.  If insertion is not successful, ike_err_t is
688  * returned instead with appropriate error value.
689  */
690 typedef struct {
691 	ike_svccmd_t	cmd;
692 	uint32_t	new_len;
693 	/* new_len - sizeof (ike_new_t) bytes included here */
694 	uint64_t	new_align;	/* Padding for 64-bit alignment. */
695 } ike_new_t;
696 
697 
698 /*
699  * IKE_SVC_DEL_{P1|RULE|PS}
700  * Used to request and acknowledge the deletion of an individual table
701  * item.
702  *
703  * Upon request: del_len is the total msg length (struct + id data);
704  * del_idtype indicates the type of identification being used.
705  *   IKE_SVC_DEL_P1:		ike_addr_pr_t or ike_cky_pr_t
706  *   IKE_SVC_DEL_RULE:		char string (label)
707  *   IKE_SVC_DEL_PS:		ike_addr_pr_t or pair of sadb_ident_t
708  *
709  * Upon return: acknowledges deletion of the requested item; del_len and
710  * del_idtype are unspecified.  If deletion is not successful, ike_err_t
711  * is returned instead with appropriate error value.
712  */
713 typedef struct {
714 	ike_svccmd_t	cmd;
715 	uint32_t	del_len;
716 	uint32_t	del_idtype;
717 	uint32_t	del_reserved;
718 	/* del_len - sizeof (ike_del_t) bytes of data included here. */
719 } ike_del_t;
720 
721 
722 /*
723  * IKE_SVC_READ_{RULES|PS}
724  * Used to ask daemon to re-read particular configuration info.
725  *
726  * Upon request: rw_loc indicates where the info should be read from:
727  * either from a user-supplied file descriptor(s), or from the default
728  * location(s).  If rw_loc indicates user-supplied location, the file
729  * descriptor(s) should be passed in the door_desc_t struct.  For the
730  * IKE_SVC_READ_RULES cmd, two file descriptors should be specified:
731  * first, one for the config file which contains the data to be read,
732  * and second, one for the cookie file which will be written to as
733  * in.iked process the config file.
734  *
735  * Upon return: rw_loc is unspecified; the message simply acknowledges
736  * successful completion of the request.  If an error occurred,
737  * ike_err_t is returned instead with appropriate error value.
738  *
739  *
740  * IKE_SVC_WRITE_{RULES|PS}
741  * Used to ask daemon to write its current config info to files.
742  *
743  * Request and return are handled the same as for the IKE_SVC_READ_*
744  * cmds; however, the rw_loc MUST be a user-supplied location.  Also,
745  * for the IKE_SVC_WRITE_RULES cmd, the cookie file fd is not required;
746  * only a single fd, for the file to which the config info should be
747  * written, should be passed in.
748  */
749 typedef struct {
750 	ike_svccmd_t	cmd;
751 	uint32_t	rw_loc;
752 } ike_rw_t;
753 
754 
755 /*
756  * IKE_SVC_FLUSH_P1S
757  * IKE_SVC_FLUSH_CERTCACHE
758  *
759  * Used to request and acknowledge tear-down of all P1 SAs
760  * or to flush the certificate cache.
761  */
762 typedef struct {
763 	ike_svccmd_t	cmd;
764 } ike_flush_t;
765 
766 
767 #ifndef PKCS11_TOKSIZE
768 #define	PKCS11_TOKSIZE 32
769 #endif
770 #define	MAX_PIN_LEN 256
771 /*
772  * IKE_SVC_SET_PIN
773  * IKE_SVC_DEL_PIN
774  *
775  * Used to supply a pin for a PKCS#11 tokenj object.
776  *
777  */
778 typedef struct {
779 	ike_svccmd_t	cmd;
780 	uint32_t	pin_reserved;	/* For 64-bit alignment. */
781 	char pkcs11_token[PKCS11_TOKSIZE];
782 	uchar_t token_pin[MAX_PIN_LEN];
783 } ike_pin_t;
784 
785 /*
786  * IKE_SVC_ERROR
787  * Used on return if server encountered an error while processing
788  * the request.  An appropriate error code is included (as defined
789  * in this header file); in the case of IKE_ERR_SYS_ERR, a value
790  * from the UNIX errno space is included in the ike_err_unix field.
791  */
792 typedef struct {
793 	ike_svccmd_t	cmd;
794 	uint32_t	ike_err;
795 	uint32_t	ike_err_unix;
796 	uint32_t	ike_err_reserved;
797 } ike_err_t;
798 
799 /*
800  * Generic type for use when the request/reply type is unknown
801  */
802 typedef struct {
803 	ike_svccmd_t	cmd;
804 } ike_cmd_t;
805 
806 
807 /*
808  * Union containing all possible request/return structures.
809  */
810 typedef union {
811 	ike_cmd_t	svc_cmd;
812 	ike_dbg_t	svc_dbg;
813 	ike_priv_t	svc_priv;
814 	ike_statreq_t	svc_stats;
815 	ike_dump_t	svc_dump;
816 	ike_get_t	svc_get;
817 	ike_new_t	svc_new;
818 	ike_del_t	svc_del;
819 	ike_rw_t	svc_rw;
820 	ike_flush_t	svc_flush;
821 	ike_pin_t	svc_pin;
822 	ike_err_t	svc_err;
823 	ike_defreq_t	svc_defaults;
824 } ike_service_t;
825 
826 #ifdef	__cplusplus
827 }
828 #endif
829 
830 #endif	/* _IKEDOOR_H */
831