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/*
23 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
24 * Use is subject to license terms.
25 */
26
27#ifndef	_SYS_CRYPTO_IOCTL_H
28#define	_SYS_CRYPTO_IOCTL_H
29
30#ifdef	__cplusplus
31extern "C" {
32#endif
33
34#include <sys/types.h>
35#include <sys/crypto/api.h>
36#include <sys/crypto/spi.h>
37#include <sys/crypto/common.h>
38
39#define	CRYPTO_MAX_ATTRIBUTE_COUNT	128
40
41#define	CRYPTO_IOFLAGS_RW_SESSION	0x00000001
42
43#define	CRYPTO(x)		(('y' << 8) | (x))
44
45#define	MAX_NUM_THRESHOLD	7
46
47/* the PKCS11 Mechanisms */
48#define	CKM_RC4			0x00000111UL
49#define	CKM_DES3_ECB		0x00000132UL
50#define	CKM_DES3_CBC		0x00000133UL
51#define	CKM_MD5			0x00000210UL
52#define	CKM_SHA_1		0x00000220UL
53#define	CKM_AES_ECB		0x00001081UL
54#define	CKM_AES_CBC		0x00001082UL
55
56/*
57 * General Purpose Ioctls
58 */
59
60typedef struct fl_mechs_threshold {
61	int		mech_type;
62	uint32_t	mech_threshold;
63} fl_mechs_threshold_t;
64
65typedef struct crypto_function_list {
66	boolean_t fl_digest_init;
67	boolean_t fl_digest;
68	boolean_t fl_digest_update;
69	boolean_t fl_digest_key;
70	boolean_t fl_digest_final;
71
72	boolean_t fl_encrypt_init;
73	boolean_t fl_encrypt;
74	boolean_t fl_encrypt_update;
75	boolean_t fl_encrypt_final;
76
77	boolean_t fl_decrypt_init;
78	boolean_t fl_decrypt;
79	boolean_t fl_decrypt_update;
80	boolean_t fl_decrypt_final;
81
82	boolean_t fl_mac_init;
83	boolean_t fl_mac;
84	boolean_t fl_mac_update;
85	boolean_t fl_mac_final;
86
87	boolean_t fl_sign_init;
88	boolean_t fl_sign;
89	boolean_t fl_sign_update;
90	boolean_t fl_sign_final;
91	boolean_t fl_sign_recover_init;
92	boolean_t fl_sign_recover;
93
94	boolean_t fl_verify_init;
95	boolean_t fl_verify;
96	boolean_t fl_verify_update;
97	boolean_t fl_verify_final;
98	boolean_t fl_verify_recover_init;
99	boolean_t fl_verify_recover;
100
101	boolean_t fl_digest_encrypt_update;
102	boolean_t fl_decrypt_digest_update;
103	boolean_t fl_sign_encrypt_update;
104	boolean_t fl_decrypt_verify_update;
105
106	boolean_t fl_seed_random;
107	boolean_t fl_generate_random;
108
109	boolean_t fl_session_open;
110	boolean_t fl_session_close;
111	boolean_t fl_session_login;
112	boolean_t fl_session_logout;
113
114	boolean_t fl_object_create;
115	boolean_t fl_object_copy;
116	boolean_t fl_object_destroy;
117	boolean_t fl_object_get_size;
118	boolean_t fl_object_get_attribute_value;
119	boolean_t fl_object_set_attribute_value;
120	boolean_t fl_object_find_init;
121	boolean_t fl_object_find;
122	boolean_t fl_object_find_final;
123
124	boolean_t fl_key_generate;
125	boolean_t fl_key_generate_pair;
126	boolean_t fl_key_wrap;
127	boolean_t fl_key_unwrap;
128	boolean_t fl_key_derive;
129
130	boolean_t fl_init_token;
131	boolean_t fl_init_pin;
132	boolean_t fl_set_pin;
133
134	boolean_t prov_is_hash_limited;
135	uint32_t prov_hash_threshold;
136	uint32_t prov_hash_limit;
137
138	boolean_t prov_is_hmac_limited;
139	uint32_t prov_hmac_limit;
140
141	int total_threshold_count;
142	fl_mechs_threshold_t	fl_threshold[MAX_NUM_THRESHOLD];
143} crypto_function_list_t;
144
145typedef struct crypto_get_function_list {
146	uint_t			fl_return_value;
147	crypto_provider_id_t	fl_provider_id;
148	crypto_function_list_t	fl_list;
149} crypto_get_function_list_t;
150
151typedef struct crypto_get_mechanism_number {
152	uint_t			pn_return_value;
153	caddr_t			pn_mechanism_string;
154	size_t			pn_mechanism_len;
155	crypto_mech_type_t	pn_internal_number;
156} crypto_get_mechanism_number_t;
157
158#ifdef	_KERNEL
159#ifdef	_SYSCALL32
160
161#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
162#pragma pack(4)
163#endif
164
165typedef struct crypto_get_mechanism_number32 {
166	uint32_t		pn_return_value;
167	caddr32_t		pn_mechanism_string;
168	size32_t		pn_mechanism_len;
169	crypto_mech_type_t	pn_internal_number;
170} crypto_get_mechanism_number32_t;
171
172#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
173#pragma pack()
174#endif
175
176#endif	/* _SYSCALL32 */
177#endif	/* _KERNEL */
178
179#define	CRYPTO_GET_FUNCTION_LIST	CRYPTO(20)
180#define	CRYPTO_GET_MECHANISM_NUMBER	CRYPTO(21)
181
182/*
183 * Session Ioctls
184 */
185
186typedef uint32_t	crypto_flags_t;
187
188typedef struct crypto_open_session {
189	uint_t			os_return_value;
190	crypto_session_id_t	os_session;
191	crypto_flags_t		os_flags;
192	crypto_provider_id_t	os_provider_id;
193} crypto_open_session_t;
194
195typedef struct crypto_close_session {
196	uint_t			cs_return_value;
197	crypto_session_id_t	cs_session;
198} crypto_close_session_t;
199
200typedef struct crypto_close_all_sessions {
201	uint_t			as_return_value;
202	crypto_provider_id_t	as_provider_id;
203} crypto_close_all_sessions_t;
204
205#define	CRYPTO_OPEN_SESSION		CRYPTO(30)
206#define	CRYPTO_CLOSE_SESSION		CRYPTO(31)
207#define	CRYPTO_CLOSE_ALL_SESSIONS	CRYPTO(32)
208
209/*
210 * Login Ioctls
211 */
212typedef struct crypto_login {
213	uint_t			co_return_value;
214	crypto_session_id_t	co_session;
215	uint_t			co_user_type;
216	uint_t			co_pin_len;
217	caddr_t			co_pin;
218} crypto_login_t;
219
220typedef struct crypto_logout {
221	uint_t			cl_return_value;
222	crypto_session_id_t	cl_session;
223} crypto_logout_t;
224
225#ifdef	_KERNEL
226#ifdef	_SYSCALL32
227
228typedef struct crypto_login32 {
229	uint32_t		co_return_value;
230	crypto_session_id_t	co_session;
231	uint32_t		co_user_type;
232	uint32_t		co_pin_len;
233	caddr32_t		co_pin;
234} crypto_login32_t;
235
236typedef struct crypto_logout32 {
237	uint32_t		cl_return_value;
238	crypto_session_id_t	cl_session;
239} crypto_logout32_t;
240
241#endif	/* _SYSCALL32 */
242#endif	/* _KERNEL */
243
244#define	CRYPTO_LOGIN			CRYPTO(40)
245#define	CRYPTO_LOGOUT			CRYPTO(41)
246
247/* flag for encrypt and decrypt operations */
248#define	CRYPTO_INPLACE_OPERATION	0x00000001
249
250/*
251 * Cryptographic Ioctls
252 */
253typedef struct crypto_encrypt {
254	uint_t			ce_return_value;
255	crypto_session_id_t	ce_session;
256	size_t			ce_datalen;
257	caddr_t			ce_databuf;
258	size_t			ce_encrlen;
259	caddr_t			ce_encrbuf;
260	uint_t			ce_flags;
261} crypto_encrypt_t;
262
263typedef struct crypto_encrypt_init {
264	uint_t			ei_return_value;
265	crypto_session_id_t	ei_session;
266	crypto_mechanism_t	ei_mech;
267	crypto_key_t		ei_key;
268} crypto_encrypt_init_t;
269
270typedef struct crypto_encrypt_update {
271	uint_t			eu_return_value;
272	crypto_session_id_t	eu_session;
273	size_t			eu_datalen;
274	caddr_t			eu_databuf;
275	size_t			eu_encrlen;
276	caddr_t			eu_encrbuf;
277	uint_t			eu_flags;
278} crypto_encrypt_update_t;
279
280typedef struct crypto_encrypt_final {
281	uint_t			ef_return_value;
282	crypto_session_id_t	ef_session;
283	size_t			ef_encrlen;
284	caddr_t			ef_encrbuf;
285} crypto_encrypt_final_t;
286
287typedef struct crypto_decrypt {
288	uint_t			cd_return_value;
289	crypto_session_id_t	cd_session;
290	size_t			cd_encrlen;
291	caddr_t			cd_encrbuf;
292	size_t			cd_datalen;
293	caddr_t			cd_databuf;
294	uint_t			cd_flags;
295} crypto_decrypt_t;
296
297typedef struct crypto_decrypt_init {
298	uint_t			di_return_value;
299	crypto_session_id_t	di_session;
300	crypto_mechanism_t	di_mech;
301	crypto_key_t		di_key;
302} crypto_decrypt_init_t;
303
304typedef struct crypto_decrypt_update {
305	uint_t			du_return_value;
306	crypto_session_id_t	du_session;
307	size_t			du_encrlen;
308	caddr_t			du_encrbuf;
309	size_t			du_datalen;
310	caddr_t			du_databuf;
311	uint_t			du_flags;
312} crypto_decrypt_update_t;
313
314typedef struct crypto_decrypt_final {
315	uint_t			df_return_value;
316	crypto_session_id_t	df_session;
317	size_t			df_datalen;
318	caddr_t			df_databuf;
319} crypto_decrypt_final_t;
320
321typedef struct crypto_digest {
322	uint_t			cd_return_value;
323	crypto_session_id_t	cd_session;
324	size_t			cd_datalen;
325	caddr_t			cd_databuf;
326	size_t			cd_digestlen;
327	caddr_t			cd_digestbuf;
328} crypto_digest_t;
329
330typedef struct crypto_digest_init {
331	uint_t			di_return_value;
332	crypto_session_id_t	di_session;
333	crypto_mechanism_t	di_mech;
334} crypto_digest_init_t;
335
336typedef struct crypto_digest_update {
337	uint_t			du_return_value;
338	crypto_session_id_t	du_session;
339	size_t			du_datalen;
340	caddr_t			du_databuf;
341} crypto_digest_update_t;
342
343typedef struct crypto_digest_key {
344	uint_t			dk_return_value;
345	crypto_session_id_t	dk_session;
346	crypto_key_t		dk_key;
347} crypto_digest_key_t;
348
349typedef struct crypto_digest_final {
350	uint_t			df_return_value;
351	crypto_session_id_t	df_session;
352	size_t			df_digestlen;
353	caddr_t			df_digestbuf;
354} crypto_digest_final_t;
355
356typedef struct crypto_mac {
357	uint_t			cm_return_value;
358	crypto_session_id_t	cm_session;
359	size_t			cm_datalen;
360	caddr_t			cm_databuf;
361	size_t			cm_maclen;
362	caddr_t			cm_macbuf;
363} crypto_mac_t;
364
365typedef struct crypto_mac_init {
366	uint_t			mi_return_value;
367	crypto_session_id_t	mi_session;
368	crypto_mechanism_t	mi_mech;
369	crypto_key_t		mi_key;
370} crypto_mac_init_t;
371
372typedef struct crypto_mac_update {
373	uint_t			mu_return_value;
374	crypto_session_id_t	mu_session;
375	size_t			mu_datalen;
376	caddr_t			mu_databuf;
377} crypto_mac_update_t;
378
379typedef struct crypto_mac_final {
380	uint_t			mf_return_value;
381	crypto_session_id_t	mf_session;
382	size_t			mf_maclen;
383	caddr_t			mf_macbuf;
384} crypto_mac_final_t;
385
386typedef struct crypto_sign {
387	uint_t			cs_return_value;
388	crypto_session_id_t	cs_session;
389	size_t			cs_datalen;
390	caddr_t			cs_databuf;
391	size_t			cs_signlen;
392	caddr_t			cs_signbuf;
393} crypto_sign_t;
394
395typedef struct crypto_sign_init {
396	uint_t			si_return_value;
397	crypto_session_id_t	si_session;
398	crypto_mechanism_t	si_mech;
399	crypto_key_t		si_key;
400} crypto_sign_init_t;
401
402typedef struct crypto_sign_update {
403	uint_t			su_return_value;
404	crypto_session_id_t	su_session;
405	size_t			su_datalen;
406	caddr_t			su_databuf;
407} crypto_sign_update_t;
408
409typedef struct crypto_sign_final {
410	uint_t			sf_return_value;
411	crypto_session_id_t	sf_session;
412	size_t			sf_signlen;
413	caddr_t			sf_signbuf;
414} crypto_sign_final_t;
415
416typedef struct crypto_sign_recover_init {
417	uint_t			ri_return_value;
418	crypto_session_id_t	ri_session;
419	crypto_mechanism_t	ri_mech;
420	crypto_key_t		ri_key;
421} crypto_sign_recover_init_t;
422
423typedef struct crypto_sign_recover {
424	uint_t			sr_return_value;
425	crypto_session_id_t	sr_session;
426	size_t			sr_datalen;
427	caddr_t			sr_databuf;
428	size_t			sr_signlen;
429	caddr_t			sr_signbuf;
430} crypto_sign_recover_t;
431
432typedef struct crypto_verify {
433	uint_t			cv_return_value;
434	crypto_session_id_t	cv_session;
435	size_t			cv_datalen;
436	caddr_t			cv_databuf;
437	size_t			cv_signlen;
438	caddr_t			cv_signbuf;
439} crypto_verify_t;
440
441typedef struct crypto_verify_init {
442	uint_t			vi_return_value;
443	crypto_session_id_t	vi_session;
444	crypto_mechanism_t	vi_mech;
445	crypto_key_t		vi_key;
446} crypto_verify_init_t;
447
448typedef struct crypto_verify_update {
449	uint_t			vu_return_value;
450	crypto_session_id_t	vu_session;
451	size_t			vu_datalen;
452	caddr_t			vu_databuf;
453} crypto_verify_update_t;
454
455typedef struct crypto_verify_final {
456	uint_t			vf_return_value;
457	crypto_session_id_t	vf_session;
458	size_t			vf_signlen;
459	caddr_t			vf_signbuf;
460} crypto_verify_final_t;
461
462typedef struct crypto_verify_recover_init {
463	uint_t			ri_return_value;
464	crypto_session_id_t	ri_session;
465	crypto_mechanism_t	ri_mech;
466	crypto_key_t		ri_key;
467} crypto_verify_recover_init_t;
468
469typedef struct crypto_verify_recover {
470	uint_t			vr_return_value;
471	crypto_session_id_t	vr_session;
472	size_t			vr_signlen;
473	caddr_t			vr_signbuf;
474	size_t			vr_datalen;
475	caddr_t			vr_databuf;
476} crypto_verify_recover_t;
477
478typedef struct crypto_digest_encrypt_update {
479	uint_t			eu_return_value;
480	crypto_session_id_t	eu_session;
481	size_t			eu_datalen;
482	caddr_t			eu_databuf;
483	size_t			eu_encrlen;
484	caddr_t			eu_encrbuf;
485} crypto_digest_encrypt_update_t;
486
487typedef struct crypto_decrypt_digest_update {
488	uint_t			du_return_value;
489	crypto_session_id_t	du_session;
490	size_t			du_encrlen;
491	caddr_t			du_encrbuf;
492	size_t			du_datalen;
493	caddr_t			du_databuf;
494} crypto_decrypt_digest_update_t;
495
496typedef struct crypto_sign_encrypt_update {
497	uint_t			eu_return_value;
498	crypto_session_id_t	eu_session;
499	size_t			eu_datalen;
500	caddr_t			eu_databuf;
501	size_t			eu_encrlen;
502	caddr_t			eu_encrbuf;
503} crypto_sign_encrypt_update_t;
504
505typedef struct crypto_decrypt_verify_update {
506	uint_t			vu_return_value;
507	crypto_session_id_t	vu_session;
508	size_t			vu_encrlen;
509	caddr_t			vu_encrbuf;
510	size_t			vu_datalen;
511	caddr_t			vu_databuf;
512} crypto_decrypt_verify_update_t;
513
514#ifdef	_KERNEL
515#ifdef	_SYSCALL32
516
517typedef struct crypto_encrypt32 {
518	uint32_t		ce_return_value;
519	crypto_session_id_t	ce_session;
520	size32_t		ce_datalen;
521	caddr32_t		ce_databuf;
522	size32_t		ce_encrlen;
523	caddr32_t		ce_encrbuf;
524	uint32_t		ce_flags;
525} crypto_encrypt32_t;
526
527#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
528#pragma pack(4)
529#endif
530
531typedef struct crypto_encrypt_init32 {
532	uint32_t		ei_return_value;
533	crypto_session_id_t	ei_session;
534	crypto_mechanism32_t	ei_mech;
535	crypto_key32_t		ei_key;
536} crypto_encrypt_init32_t;
537
538#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
539#pragma pack()
540#endif
541
542typedef struct crypto_encrypt_update32 {
543	uint32_t		eu_return_value;
544	crypto_session_id_t	eu_session;
545	size32_t		eu_datalen;
546	caddr32_t		eu_databuf;
547	size32_t		eu_encrlen;
548	caddr32_t		eu_encrbuf;
549	uint_t			eu_flags;
550} crypto_encrypt_update32_t;
551
552typedef struct crypto_encrypt_final32 {
553	uint32_t		ef_return_value;
554	crypto_session_id_t	ef_session;
555	size32_t		ef_encrlen;
556	caddr32_t		ef_encrbuf;
557} crypto_encrypt_final32_t;
558
559typedef struct crypto_decrypt32 {
560	uint32_t		cd_return_value;
561	crypto_session_id_t	cd_session;
562	size32_t		cd_encrlen;
563	caddr32_t		cd_encrbuf;
564	size32_t		cd_datalen;
565	caddr32_t		cd_databuf;
566	uint32_t		cd_flags;
567} crypto_decrypt32_t;
568
569#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
570#pragma pack(4)
571#endif
572
573typedef struct crypto_decrypt_init32 {
574	uint32_t		di_return_value;
575	crypto_session_id_t	di_session;
576	crypto_mechanism32_t	di_mech;
577	crypto_key32_t		di_key;
578} crypto_decrypt_init32_t;
579
580#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
581#pragma pack()
582#endif
583
584typedef struct crypto_decrypt_update32 {
585	uint32_t		du_return_value;
586	crypto_session_id_t	du_session;
587	size32_t		du_encrlen;
588	caddr32_t		du_encrbuf;
589	size32_t		du_datalen;
590	caddr32_t		du_databuf;
591	uint_t			du_flags;
592} crypto_decrypt_update32_t;
593
594typedef struct crypto_decrypt_final32 {
595	uint32_t		df_return_value;
596	crypto_session_id_t	df_session;
597	size32_t		df_datalen;
598	caddr32_t		df_databuf;
599} crypto_decrypt_final32_t;
600
601typedef struct crypto_digest32 {
602	uint32_t		cd_return_value;
603	crypto_session_id_t	cd_session;
604	size32_t		cd_datalen;
605	caddr32_t		cd_databuf;
606	size32_t		cd_digestlen;
607	caddr32_t		cd_digestbuf;
608} crypto_digest32_t;
609
610typedef struct crypto_digest_init32 {
611	uint32_t		di_return_value;
612	crypto_session_id_t	di_session;
613	crypto_mechanism32_t	di_mech;
614} crypto_digest_init32_t;
615
616typedef struct crypto_digest_update32 {
617	uint32_t		du_return_value;
618	crypto_session_id_t	du_session;
619	size32_t		du_datalen;
620	caddr32_t		du_databuf;
621} crypto_digest_update32_t;
622
623typedef struct crypto_digest_key32 {
624	uint32_t		dk_return_value;
625	crypto_session_id_t	dk_session;
626	crypto_key32_t		dk_key;
627} crypto_digest_key32_t;
628
629typedef struct crypto_digest_final32 {
630	uint32_t		df_return_value;
631	crypto_session_id_t	df_session;
632	size32_t		df_digestlen;
633	caddr32_t		df_digestbuf;
634} crypto_digest_final32_t;
635
636typedef struct crypto_mac32 {
637	uint32_t		cm_return_value;
638	crypto_session_id_t	cm_session;
639	size32_t		cm_datalen;
640	caddr32_t		cm_databuf;
641	size32_t		cm_maclen;
642	caddr32_t		cm_macbuf;
643} crypto_mac32_t;
644
645#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
646#pragma pack(4)
647#endif
648
649typedef struct crypto_mac_init32 {
650	uint32_t		mi_return_value;
651	crypto_session_id_t	mi_session;
652	crypto_mechanism32_t	mi_mech;
653	crypto_key32_t		mi_key;
654} crypto_mac_init32_t;
655
656#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
657#pragma pack()
658#endif
659
660typedef struct crypto_mac_update32 {
661	uint32_t		mu_return_value;
662	crypto_session_id_t	mu_session;
663	size32_t		mu_datalen;
664	caddr32_t		mu_databuf;
665} crypto_mac_update32_t;
666
667typedef struct crypto_mac_final32 {
668	uint32_t		mf_return_value;
669	crypto_session_id_t	mf_session;
670	size32_t		mf_maclen;
671	caddr32_t		mf_macbuf;
672} crypto_mac_final32_t;
673
674typedef struct crypto_sign32 {
675	uint32_t		cs_return_value;
676	crypto_session_id_t	cs_session;
677	size32_t		cs_datalen;
678	caddr32_t		cs_databuf;
679	size32_t		cs_signlen;
680	caddr32_t		cs_signbuf;
681} crypto_sign32_t;
682
683#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
684#pragma pack(4)
685#endif
686
687typedef struct crypto_sign_init32 {
688	uint32_t		si_return_value;
689	crypto_session_id_t	si_session;
690	crypto_mechanism32_t	si_mech;
691	crypto_key32_t		si_key;
692} crypto_sign_init32_t;
693
694#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
695#pragma pack()
696#endif
697
698typedef struct crypto_sign_update32 {
699	uint32_t		su_return_value;
700	crypto_session_id_t	su_session;
701	size32_t		su_datalen;
702	caddr32_t		su_databuf;
703} crypto_sign_update32_t;
704
705typedef struct crypto_sign_final32 {
706	uint32_t		sf_return_value;
707	crypto_session_id_t	sf_session;
708	size32_t		sf_signlen;
709	caddr32_t		sf_signbuf;
710} crypto_sign_final32_t;
711
712#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
713#pragma pack(4)
714#endif
715
716typedef struct crypto_sign_recover_init32 {
717	uint32_t		ri_return_value;
718	crypto_session_id_t	ri_session;
719	crypto_mechanism32_t	ri_mech;
720	crypto_key32_t		ri_key;
721} crypto_sign_recover_init32_t;
722
723#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
724#pragma pack()
725#endif
726
727typedef struct crypto_sign_recover32 {
728	uint32_t		sr_return_value;
729	crypto_session_id_t	sr_session;
730	size32_t		sr_datalen;
731	caddr32_t		sr_databuf;
732	size32_t		sr_signlen;
733	caddr32_t		sr_signbuf;
734} crypto_sign_recover32_t;
735
736typedef struct crypto_verify32 {
737	uint32_t		cv_return_value;
738	crypto_session_id_t	cv_session;
739	size32_t		cv_datalen;
740	caddr32_t		cv_databuf;
741	size32_t		cv_signlen;
742	caddr32_t		cv_signbuf;
743} crypto_verify32_t;
744
745#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
746#pragma pack(4)
747#endif
748
749typedef struct crypto_verify_init32 {
750	uint32_t		vi_return_value;
751	crypto_session_id_t	vi_session;
752	crypto_mechanism32_t	vi_mech;
753	crypto_key32_t		vi_key;
754} crypto_verify_init32_t;
755
756#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
757#pragma pack()
758#endif
759
760typedef struct crypto_verify_update32 {
761	uint32_t		vu_return_value;
762	crypto_session_id_t	vu_session;
763	size32_t		vu_datalen;
764	caddr32_t		vu_databuf;
765} crypto_verify_update32_t;
766
767typedef struct crypto_verify_final32 {
768	uint32_t		vf_return_value;
769	crypto_session_id_t	vf_session;
770	size32_t		vf_signlen;
771	caddr32_t		vf_signbuf;
772} crypto_verify_final32_t;
773
774#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
775#pragma pack(4)
776#endif
777
778typedef struct crypto_verify_recover_init32 {
779	uint32_t		ri_return_value;
780	crypto_session_id_t	ri_session;
781	crypto_mechanism32_t	ri_mech;
782	crypto_key32_t		ri_key;
783} crypto_verify_recover_init32_t;
784
785#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
786#pragma pack()
787#endif
788
789typedef struct crypto_verify_recover32 {
790	uint32_t		vr_return_value;
791	crypto_session_id_t	vr_session;
792	size32_t		vr_signlen;
793	caddr32_t		vr_signbuf;
794	size32_t		vr_datalen;
795	caddr32_t		vr_databuf;
796} crypto_verify_recover32_t;
797
798typedef struct crypto_digest_encrypt_update32 {
799	uint32_t		eu_return_value;
800	crypto_session_id_t	eu_session;
801	size32_t		eu_datalen;
802	caddr32_t		eu_databuf;
803	size32_t		eu_encrlen;
804	caddr32_t		eu_encrbuf;
805} crypto_digest_encrypt_update32_t;
806
807typedef struct crypto_decrypt_digest_update32 {
808	uint32_t		du_return_value;
809	crypto_session_id_t	du_session;
810	size32_t		du_encrlen;
811	caddr32_t		du_encrbuf;
812	size32_t		du_datalen;
813	caddr32_t		du_databuf;
814} crypto_decrypt_digest_update32_t;
815
816typedef struct crypto_sign_encrypt_update32 {
817	uint32_t		eu_return_value;
818	crypto_session_id_t	eu_session;
819	size32_t		eu_datalen;
820	caddr32_t		eu_databuf;
821	size32_t		eu_encrlen;
822	caddr32_t		eu_encrbuf;
823} crypto_sign_encrypt_update32_t;
824
825typedef struct crypto_decrypt_verify_update32 {
826	uint32_t		vu_return_value;
827	crypto_session_id_t	vu_session;
828	size32_t		vu_encrlen;
829	caddr32_t		vu_encrbuf;
830	size32_t		vu_datalen;
831	caddr32_t		vu_databuf;
832} crypto_decrypt_verify_update32_t;
833
834#endif	/* _SYSCALL32 */
835#endif	/* _KERNEL */
836
837#define	CRYPTO_ENCRYPT			CRYPTO(50)
838#define	CRYPTO_ENCRYPT_INIT		CRYPTO(51)
839#define	CRYPTO_ENCRYPT_UPDATE		CRYPTO(52)
840#define	CRYPTO_ENCRYPT_FINAL		CRYPTO(53)
841#define	CRYPTO_DECRYPT			CRYPTO(54)
842#define	CRYPTO_DECRYPT_INIT		CRYPTO(55)
843#define	CRYPTO_DECRYPT_UPDATE		CRYPTO(56)
844#define	CRYPTO_DECRYPT_FINAL		CRYPTO(57)
845
846#define	CRYPTO_DIGEST			CRYPTO(58)
847#define	CRYPTO_DIGEST_INIT		CRYPTO(59)
848#define	CRYPTO_DIGEST_UPDATE		CRYPTO(60)
849#define	CRYPTO_DIGEST_KEY		CRYPTO(61)
850#define	CRYPTO_DIGEST_FINAL		CRYPTO(62)
851#define	CRYPTO_MAC			CRYPTO(63)
852#define	CRYPTO_MAC_INIT			CRYPTO(64)
853#define	CRYPTO_MAC_UPDATE		CRYPTO(65)
854#define	CRYPTO_MAC_FINAL		CRYPTO(66)
855
856#define	CRYPTO_SIGN			CRYPTO(67)
857#define	CRYPTO_SIGN_INIT		CRYPTO(68)
858#define	CRYPTO_SIGN_UPDATE		CRYPTO(69)
859#define	CRYPTO_SIGN_FINAL		CRYPTO(70)
860#define	CRYPTO_SIGN_RECOVER_INIT	CRYPTO(71)
861#define	CRYPTO_SIGN_RECOVER		CRYPTO(72)
862#define	CRYPTO_VERIFY			CRYPTO(73)
863#define	CRYPTO_VERIFY_INIT		CRYPTO(74)
864#define	CRYPTO_VERIFY_UPDATE		CRYPTO(75)
865#define	CRYPTO_VERIFY_FINAL		CRYPTO(76)
866#define	CRYPTO_VERIFY_RECOVER_INIT	CRYPTO(77)
867#define	CRYPTO_VERIFY_RECOVER		CRYPTO(78)
868
869#define	CRYPTO_DIGEST_ENCRYPT_UPDATE	CRYPTO(79)
870#define	CRYPTO_DECRYPT_DIGEST_UPDATE	CRYPTO(80)
871#define	CRYPTO_SIGN_ENCRYPT_UPDATE	CRYPTO(81)
872#define	CRYPTO_DECRYPT_VERIFY_UPDATE	CRYPTO(82)
873
874/*
875 * Random Number Ioctls
876 */
877typedef struct crypto_seed_random {
878	uint_t			sr_return_value;
879	crypto_session_id_t	sr_session;
880	size_t			sr_seedlen;
881	caddr_t			sr_seedbuf;
882} crypto_seed_random_t;
883
884typedef struct crypto_generate_random {
885	uint_t			gr_return_value;
886	crypto_session_id_t	gr_session;
887	caddr_t			gr_buf;
888	size_t			gr_buflen;
889} crypto_generate_random_t;
890
891#ifdef	_KERNEL
892#ifdef	_SYSCALL32
893
894typedef struct crypto_seed_random32 {
895	uint32_t		sr_return_value;
896	crypto_session_id_t	sr_session;
897	size32_t		sr_seedlen;
898	caddr32_t		sr_seedbuf;
899} crypto_seed_random32_t;
900
901typedef struct crypto_generate_random32 {
902	uint32_t		gr_return_value;
903	crypto_session_id_t	gr_session;
904	caddr32_t		gr_buf;
905	size32_t		gr_buflen;
906} crypto_generate_random32_t;
907
908#endif	/* _SYSCALL32 */
909#endif	/* _KERNEL */
910
911#define	CRYPTO_SEED_RANDOM		CRYPTO(90)
912#define	CRYPTO_GENERATE_RANDOM		CRYPTO(91)
913
914/*
915 * Object Management Ioctls
916 */
917typedef struct crypto_object_create {
918	uint_t			oc_return_value;
919	crypto_session_id_t	oc_session;
920	crypto_object_id_t	oc_handle;
921	uint_t			oc_count;
922	caddr_t			oc_attributes;
923} crypto_object_create_t;
924
925typedef struct crypto_object_copy {
926	uint_t			oc_return_value;
927	crypto_session_id_t	oc_session;
928	crypto_object_id_t	oc_handle;
929	crypto_object_id_t	oc_new_handle;
930	uint_t			oc_count;
931	caddr_t			oc_new_attributes;
932} crypto_object_copy_t;
933
934typedef struct crypto_object_destroy {
935	uint_t			od_return_value;
936	crypto_session_id_t	od_session;
937	crypto_object_id_t	od_handle;
938} crypto_object_destroy_t;
939
940typedef struct crypto_object_get_attribute_value {
941	uint_t			og_return_value;
942	crypto_session_id_t	og_session;
943	crypto_object_id_t	og_handle;
944	uint_t			og_count;
945	caddr_t			og_attributes;
946} crypto_object_get_attribute_value_t;
947
948typedef struct crypto_object_get_size {
949	uint_t			gs_return_value;
950	crypto_session_id_t	gs_session;
951	crypto_object_id_t	gs_handle;
952	size_t			gs_size;
953} crypto_object_get_size_t;
954
955typedef struct crypto_object_set_attribute_value {
956	uint_t			sa_return_value;
957	crypto_session_id_t	sa_session;
958	crypto_object_id_t	sa_handle;
959	uint_t			sa_count;
960	caddr_t			sa_attributes;
961} crypto_object_set_attribute_value_t;
962
963typedef struct crypto_object_find_init {
964	uint_t			fi_return_value;
965	crypto_session_id_t	fi_session;
966	uint_t			fi_count;
967	caddr_t			fi_attributes;
968} crypto_object_find_init_t;
969
970typedef struct crypto_object_find_update {
971	uint_t			fu_return_value;
972	crypto_session_id_t	fu_session;
973	uint_t			fu_max_count;
974	uint_t			fu_count;
975	caddr_t			fu_handles;
976} crypto_object_find_update_t;
977
978typedef struct crypto_object_find_final {
979	uint_t			ff_return_value;
980	crypto_session_id_t	ff_session;
981} crypto_object_find_final_t;
982
983#ifdef	_KERNEL
984#ifdef	_SYSCALL32
985
986typedef struct crypto_object_create32 {
987	uint32_t		oc_return_value;
988	crypto_session_id_t	oc_session;
989	crypto_object_id_t	oc_handle;
990	uint32_t		oc_count;
991	caddr32_t		oc_attributes;
992} crypto_object_create32_t;
993
994typedef struct crypto_object_copy32 {
995	uint32_t		oc_return_value;
996	crypto_session_id_t	oc_session;
997	crypto_object_id_t	oc_handle;
998	crypto_object_id_t	oc_new_handle;
999	uint32_t		oc_count;
1000	caddr32_t		oc_new_attributes;
1001} crypto_object_copy32_t;
1002
1003typedef struct crypto_object_destroy32 {
1004	uint32_t		od_return_value;
1005	crypto_session_id_t	od_session;
1006	crypto_object_id_t	od_handle;
1007} crypto_object_destroy32_t;
1008
1009typedef struct crypto_object_get_attribute_value32 {
1010	uint32_t		og_return_value;
1011	crypto_session_id_t	og_session;
1012	crypto_object_id_t	og_handle;
1013	uint32_t		og_count;
1014	caddr32_t		og_attributes;
1015} crypto_object_get_attribute_value32_t;
1016
1017typedef struct crypto_object_get_size32 {
1018	uint32_t		gs_return_value;
1019	crypto_session_id_t	gs_session;
1020	crypto_object_id_t	gs_handle;
1021	size32_t		gs_size;
1022} crypto_object_get_size32_t;
1023
1024typedef struct crypto_object_set_attribute_value32 {
1025	uint32_t		sa_return_value;
1026	crypto_session_id_t	sa_session;
1027	crypto_object_id_t	sa_handle;
1028	uint32_t		sa_count;
1029	caddr32_t		sa_attributes;
1030} crypto_object_set_attribute_value32_t;
1031
1032typedef struct crypto_object_find_init32 {
1033	uint32_t		fi_return_value;
1034	crypto_session_id_t	fi_session;
1035	uint32_t		fi_count;
1036	caddr32_t		fi_attributes;
1037} crypto_object_find_init32_t;
1038
1039typedef struct crypto_object_find_update32 {
1040	uint32_t		fu_return_value;
1041	crypto_session_id_t	fu_session;
1042	uint32_t		fu_max_count;
1043	uint32_t		fu_count;
1044	caddr32_t		fu_handles;
1045} crypto_object_find_update32_t;
1046
1047typedef struct crypto_object_find_final32 {
1048	uint32_t		ff_return_value;
1049	crypto_session_id_t	ff_session;
1050} crypto_object_find_final32_t;
1051
1052#endif	/* _SYSCALL32 */
1053#endif	/* _KERNEL */
1054
1055#define	CRYPTO_OBJECT_CREATE			CRYPTO(100)
1056#define	CRYPTO_OBJECT_COPY			CRYPTO(101)
1057#define	CRYPTO_OBJECT_DESTROY			CRYPTO(102)
1058#define	CRYPTO_OBJECT_GET_ATTRIBUTE_VALUE	CRYPTO(103)
1059#define	CRYPTO_OBJECT_GET_SIZE			CRYPTO(104)
1060#define	CRYPTO_OBJECT_SET_ATTRIBUTE_VALUE	CRYPTO(105)
1061#define	CRYPTO_OBJECT_FIND_INIT			CRYPTO(106)
1062#define	CRYPTO_OBJECT_FIND_UPDATE		CRYPTO(107)
1063#define	CRYPTO_OBJECT_FIND_FINAL		CRYPTO(108)
1064
1065/*
1066 * Key Generation Ioctls
1067 */
1068typedef struct crypto_object_generate_key {
1069	uint_t			gk_return_value;
1070	crypto_session_id_t	gk_session;
1071	crypto_object_id_t	gk_handle;
1072	crypto_mechanism_t	gk_mechanism;
1073	uint_t			gk_count;
1074	caddr_t			gk_attributes;
1075} crypto_object_generate_key_t;
1076
1077typedef struct crypto_object_generate_key_pair {
1078	uint_t			kp_return_value;
1079	crypto_session_id_t	kp_session;
1080	crypto_object_id_t	kp_public_handle;
1081	crypto_object_id_t	kp_private_handle;
1082	uint_t			kp_public_count;
1083	uint_t			kp_private_count;
1084	caddr_t			kp_public_attributes;
1085	caddr_t			kp_private_attributes;
1086	crypto_mechanism_t	kp_mechanism;
1087} crypto_object_generate_key_pair_t;
1088
1089typedef struct crypto_object_wrap_key {
1090	uint_t			wk_return_value;
1091	crypto_session_id_t	wk_session;
1092	crypto_mechanism_t	wk_mechanism;
1093	crypto_key_t		wk_wrapping_key;
1094	crypto_object_id_t	wk_object_handle;
1095	size_t			wk_wrapped_key_len;
1096	caddr_t			wk_wrapped_key;
1097} crypto_object_wrap_key_t;
1098
1099typedef struct crypto_object_unwrap_key {
1100	uint_t			uk_return_value;
1101	crypto_session_id_t	uk_session;
1102	crypto_mechanism_t	uk_mechanism;
1103	crypto_key_t		uk_unwrapping_key;
1104	crypto_object_id_t	uk_object_handle;
1105	size_t			uk_wrapped_key_len;
1106	caddr_t			uk_wrapped_key;
1107	uint_t			uk_count;
1108	caddr_t			uk_attributes;
1109} crypto_object_unwrap_key_t;
1110
1111typedef struct crypto_derive_key {
1112	uint_t			dk_return_value;
1113	crypto_session_id_t	dk_session;
1114	crypto_mechanism_t	dk_mechanism;
1115	crypto_key_t		dk_base_key;
1116	crypto_object_id_t	dk_object_handle;
1117	uint_t			dk_count;
1118	caddr_t			dk_attributes;
1119} crypto_derive_key_t;
1120
1121#ifdef	_KERNEL
1122#ifdef	_SYSCALL32
1123
1124#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
1125#pragma pack(4)
1126#endif
1127
1128typedef struct crypto_object_generate_key32 {
1129	uint32_t		gk_return_value;
1130	crypto_session_id_t	gk_session;
1131	crypto_object_id_t	gk_handle;
1132	crypto_mechanism32_t	gk_mechanism;
1133	uint32_t		gk_count;
1134	caddr32_t		gk_attributes;
1135} crypto_object_generate_key32_t;
1136
1137#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
1138#pragma pack()
1139#endif
1140
1141typedef struct crypto_object_generate_key_pair32 {
1142	uint32_t		kp_return_value;
1143	crypto_session_id_t	kp_session;
1144	crypto_object_id_t	kp_public_handle;
1145	crypto_object_id_t	kp_private_handle;
1146	uint32_t		kp_public_count;
1147	uint32_t		kp_private_count;
1148	caddr32_t		kp_public_attributes;
1149	caddr32_t		kp_private_attributes;
1150	crypto_mechanism32_t	kp_mechanism;
1151} crypto_object_generate_key_pair32_t;
1152
1153typedef struct crypto_object_wrap_key32 {
1154	uint32_t		wk_return_value;
1155	crypto_session_id_t	wk_session;
1156	crypto_mechanism32_t	wk_mechanism;
1157	crypto_key32_t		wk_wrapping_key;
1158	crypto_object_id_t	wk_object_handle;
1159	size32_t		wk_wrapped_key_len;
1160	caddr32_t		wk_wrapped_key;
1161} crypto_object_wrap_key32_t;
1162
1163typedef struct crypto_object_unwrap_key32 {
1164	uint32_t		uk_return_value;
1165	crypto_session_id_t	uk_session;
1166	crypto_mechanism32_t	uk_mechanism;
1167	crypto_key32_t		uk_unwrapping_key;
1168	crypto_object_id_t	uk_object_handle;
1169	size32_t		uk_wrapped_key_len;
1170	caddr32_t		uk_wrapped_key;
1171	uint32_t		uk_count;
1172	caddr32_t		uk_attributes;
1173} crypto_object_unwrap_key32_t;
1174
1175typedef struct crypto_derive_key32 {
1176	uint32_t		dk_return_value;
1177	crypto_session_id_t	dk_session;
1178	crypto_mechanism32_t	dk_mechanism;
1179	crypto_key32_t		dk_base_key;
1180	crypto_object_id_t	dk_object_handle;
1181	uint32_t		dk_count;
1182	caddr32_t		dk_attributes;
1183} crypto_derive_key32_t;
1184
1185#endif	/* _SYSCALL32 */
1186#endif	/* _KERNEL */
1187
1188#define	CRYPTO_GENERATE_KEY		CRYPTO(110)
1189#define	CRYPTO_GENERATE_KEY_PAIR	CRYPTO(111)
1190#define	CRYPTO_WRAP_KEY			CRYPTO(112)
1191#define	CRYPTO_UNWRAP_KEY		CRYPTO(113)
1192#define	CRYPTO_DERIVE_KEY		CRYPTO(114)
1193
1194/*
1195 * Provider Management Ioctls
1196 */
1197
1198typedef struct crypto_get_provider_list {
1199	uint_t			pl_return_value;
1200	uint_t			pl_count;
1201	crypto_provider_entry_t	pl_list[1];
1202} crypto_get_provider_list_t;
1203
1204typedef struct crypto_provider_data {
1205	uchar_t			pd_prov_desc[CRYPTO_PROVIDER_DESCR_MAX_LEN];
1206	uchar_t			pd_label[CRYPTO_EXT_SIZE_LABEL];
1207	uchar_t			pd_manufacturerID[CRYPTO_EXT_SIZE_MANUF];
1208	uchar_t			pd_model[CRYPTO_EXT_SIZE_MODEL];
1209	uchar_t			pd_serial_number[CRYPTO_EXT_SIZE_SERIAL];
1210	ulong_t			pd_flags;
1211	ulong_t			pd_max_session_count;
1212	ulong_t			pd_session_count;
1213	ulong_t			pd_max_rw_session_count;
1214	ulong_t			pd_rw_session_count;
1215	ulong_t			pd_max_pin_len;
1216	ulong_t			pd_min_pin_len;
1217	ulong_t			pd_total_public_memory;
1218	ulong_t			pd_free_public_memory;
1219	ulong_t			pd_total_private_memory;
1220	ulong_t			pd_free_private_memory;
1221	crypto_version_t	pd_hardware_version;
1222	crypto_version_t	pd_firmware_version;
1223	uchar_t			pd_time[CRYPTO_EXT_SIZE_TIME];
1224} crypto_provider_data_t;
1225
1226typedef struct crypto_get_provider_info {
1227	uint_t			gi_return_value;
1228	crypto_provider_id_t	gi_provider_id;
1229	crypto_provider_data_t	gi_provider_data;
1230} crypto_get_provider_info_t;
1231
1232typedef struct crypto_get_provider_mechanisms {
1233	uint_t			pm_return_value;
1234	crypto_provider_id_t	pm_provider_id;
1235	uint_t			pm_count;
1236	crypto_mech_name_t	pm_list[1];
1237} crypto_get_provider_mechanisms_t;
1238
1239typedef struct crypto_get_provider_mechanism_info {
1240	uint_t			mi_return_value;
1241	crypto_provider_id_t	mi_provider_id;
1242	crypto_mech_name_t	mi_mechanism_name;
1243	uint32_t		mi_min_key_size;
1244	uint32_t		mi_max_key_size;
1245	uint32_t		mi_flags;
1246} crypto_get_provider_mechanism_info_t;
1247
1248typedef struct crypto_init_token {
1249	uint_t			it_return_value;
1250	crypto_provider_id_t	it_provider_id;
1251	caddr_t			it_pin;
1252	size_t			it_pin_len;
1253	caddr_t			it_label;
1254} crypto_init_token_t;
1255
1256typedef struct crypto_init_pin {
1257	uint_t			ip_return_value;
1258	crypto_session_id_t	ip_session;
1259	caddr_t			ip_pin;
1260	size_t			ip_pin_len;
1261} crypto_init_pin_t;
1262
1263typedef struct crypto_set_pin {
1264	uint_t			sp_return_value;
1265	crypto_session_id_t	sp_session;
1266	caddr_t			sp_old_pin;
1267	size_t			sp_old_len;
1268	caddr_t			sp_new_pin;
1269	size_t			sp_new_len;
1270} crypto_set_pin_t;
1271
1272#ifdef	_KERNEL
1273#ifdef	_SYSCALL32
1274
1275typedef struct crypto_get_provider_list32 {
1276	uint32_t		pl_return_value;
1277	uint32_t		pl_count;
1278	crypto_provider_entry_t pl_list[1];
1279} crypto_get_provider_list32_t;
1280
1281typedef struct crypto_version32 {
1282	uchar_t	cv_major;
1283	uchar_t	cv_minor;
1284} crypto_version32_t;
1285
1286typedef struct crypto_provider_data32 {
1287	uchar_t			pd_prov_desc[CRYPTO_PROVIDER_DESCR_MAX_LEN];
1288	uchar_t			pd_label[CRYPTO_EXT_SIZE_LABEL];
1289	uchar_t			pd_manufacturerID[CRYPTO_EXT_SIZE_MANUF];
1290	uchar_t			pd_model[CRYPTO_EXT_SIZE_MODEL];
1291	uchar_t			pd_serial_number[CRYPTO_EXT_SIZE_SERIAL];
1292	uint32_t		pd_flags;
1293	uint32_t		pd_max_session_count;
1294	uint32_t		pd_session_count;
1295	uint32_t		pd_max_rw_session_count;
1296	uint32_t		pd_rw_session_count;
1297	uint32_t		pd_max_pin_len;
1298	uint32_t		pd_min_pin_len;
1299	uint32_t		pd_total_public_memory;
1300	uint32_t		pd_free_public_memory;
1301	uint32_t		pd_total_private_memory;
1302	uint32_t		pd_free_private_memory;
1303	crypto_version32_t	pd_hardware_version;
1304	crypto_version32_t	pd_firmware_version;
1305	uchar_t			pd_time[CRYPTO_EXT_SIZE_TIME];
1306} crypto_provider_data32_t;
1307
1308typedef struct crypto_get_provider_info32 {
1309	uint32_t		gi_return_value;
1310	crypto_provider_id_t	gi_provider_id;
1311	crypto_provider_data32_t gi_provider_data;
1312} crypto_get_provider_info32_t;
1313
1314typedef struct crypto_get_provider_mechanisms32 {
1315	uint32_t		pm_return_value;
1316	crypto_provider_id_t	pm_provider_id;
1317	uint32_t		pm_count;
1318	crypto_mech_name_t	pm_list[1];
1319} crypto_get_provider_mechanisms32_t;
1320
1321typedef struct crypto_init_token32 {
1322	uint32_t		it_return_value;
1323	crypto_provider_id_t	it_provider_id;
1324	caddr32_t		it_pin;
1325	size32_t		it_pin_len;
1326	caddr32_t		it_label;
1327} crypto_init_token32_t;
1328
1329typedef struct crypto_init_pin32 {
1330	uint32_t		ip_return_value;
1331	crypto_session_id_t	ip_session;
1332	caddr32_t		ip_pin;
1333	size32_t		ip_pin_len;
1334} crypto_init_pin32_t;
1335
1336typedef struct crypto_set_pin32 {
1337	uint32_t		sp_return_value;
1338	crypto_session_id_t	sp_session;
1339	caddr32_t		sp_old_pin;
1340	size32_t		sp_old_len;
1341	caddr32_t		sp_new_pin;
1342	size32_t		sp_new_len;
1343} crypto_set_pin32_t;
1344
1345#endif	/* _SYSCALL32 */
1346#endif	/* _KERNEL */
1347
1348#define	CRYPTO_GET_PROVIDER_LIST		CRYPTO(120)
1349#define	CRYPTO_GET_PROVIDER_INFO		CRYPTO(121)
1350#define	CRYPTO_GET_PROVIDER_MECHANISMS		CRYPTO(122)
1351#define	CRYPTO_GET_PROVIDER_MECHANISM_INFO	CRYPTO(123)
1352#define	CRYPTO_INIT_TOKEN			CRYPTO(124)
1353#define	CRYPTO_INIT_PIN				CRYPTO(125)
1354#define	CRYPTO_SET_PIN				CRYPTO(126)
1355
1356/*
1357 * No (Key) Store Key Generation Ioctls
1358 */
1359typedef struct crypto_nostore_generate_key {
1360	uint_t			ngk_return_value;
1361	crypto_session_id_t	ngk_session;
1362	crypto_mechanism_t	ngk_mechanism;
1363	uint_t			ngk_in_count;
1364	uint_t			ngk_out_count;
1365	caddr_t			ngk_in_attributes;
1366	caddr_t			ngk_out_attributes;
1367} crypto_nostore_generate_key_t;
1368
1369typedef struct crypto_nostore_generate_key_pair {
1370	uint_t			nkp_return_value;
1371	crypto_session_id_t	nkp_session;
1372	uint_t			nkp_in_public_count;
1373	uint_t			nkp_in_private_count;
1374	uint_t			nkp_out_public_count;
1375	uint_t			nkp_out_private_count;
1376	caddr_t			nkp_in_public_attributes;
1377	caddr_t			nkp_in_private_attributes;
1378	caddr_t			nkp_out_public_attributes;
1379	caddr_t			nkp_out_private_attributes;
1380	crypto_mechanism_t	nkp_mechanism;
1381} crypto_nostore_generate_key_pair_t;
1382
1383typedef struct crypto_nostore_derive_key {
1384	uint_t			ndk_return_value;
1385	crypto_session_id_t	ndk_session;
1386	crypto_mechanism_t	ndk_mechanism;
1387	crypto_key_t		ndk_base_key;
1388	uint_t			ndk_in_count;
1389	uint_t			ndk_out_count;
1390	caddr_t			ndk_in_attributes;
1391	caddr_t			ndk_out_attributes;
1392} crypto_nostore_derive_key_t;
1393
1394#ifdef	_KERNEL
1395#ifdef	_SYSCALL32
1396
1397typedef struct crypto_nostore_generate_key32 {
1398	uint32_t		ngk_return_value;
1399	crypto_session_id_t	ngk_session;
1400	crypto_mechanism32_t	ngk_mechanism;
1401	uint32_t		ngk_in_count;
1402	uint32_t		ngk_out_count;
1403	caddr32_t		ngk_in_attributes;
1404	caddr32_t		ngk_out_attributes;
1405} crypto_nostore_generate_key32_t;
1406
1407typedef struct crypto_nostore_generate_key_pair32 {
1408	uint32_t		nkp_return_value;
1409	crypto_session_id_t	nkp_session;
1410	uint32_t		nkp_in_public_count;
1411	uint32_t		nkp_in_private_count;
1412	uint32_t		nkp_out_public_count;
1413	uint32_t		nkp_out_private_count;
1414	caddr32_t		nkp_in_public_attributes;
1415	caddr32_t		nkp_in_private_attributes;
1416	caddr32_t		nkp_out_public_attributes;
1417	caddr32_t		nkp_out_private_attributes;
1418	crypto_mechanism32_t	nkp_mechanism;
1419} crypto_nostore_generate_key_pair32_t;
1420
1421#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
1422#pragma pack(4)
1423#endif
1424
1425typedef struct crypto_nostore_derive_key32 {
1426	uint32_t		ndk_return_value;
1427	crypto_session_id_t	ndk_session;
1428	crypto_mechanism32_t	ndk_mechanism;
1429	crypto_key32_t		ndk_base_key;
1430	uint32_t		ndk_in_count;
1431	uint32_t		ndk_out_count;
1432	caddr32_t		ndk_in_attributes;
1433	caddr32_t		ndk_out_attributes;
1434} crypto_nostore_derive_key32_t;
1435
1436#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
1437#pragma pack()
1438#endif
1439
1440#endif	/* _SYSCALL32 */
1441#endif	/* _KERNEL */
1442
1443#define	CRYPTO_NOSTORE_GENERATE_KEY		CRYPTO(127)
1444#define	CRYPTO_NOSTORE_GENERATE_KEY_PAIR	CRYPTO(128)
1445#define	CRYPTO_NOSTORE_DERIVE_KEY		CRYPTO(129)
1446
1447/*
1448 * Mechanism Ioctls
1449 */
1450
1451typedef struct crypto_get_mechanism_list {
1452	uint_t			ml_return_value;
1453	uint_t			ml_count;
1454	crypto_mech_name_t	ml_list[1];
1455} crypto_get_mechanism_list_t;
1456
1457typedef struct crypto_get_all_mechanism_info {
1458	uint_t			mi_return_value;
1459	crypto_mech_name_t	mi_mechanism_name;
1460	uint_t			mi_count;
1461	crypto_mechanism_info_t	mi_list[1];
1462} crypto_get_all_mechanism_info_t;
1463
1464#ifdef	_KERNEL
1465#ifdef	_SYSCALL32
1466
1467typedef struct crypto_get_mechanism_list32 {
1468	uint32_t		ml_return_value;
1469	uint32_t		ml_count;
1470	crypto_mech_name_t	ml_list[1];
1471} crypto_get_mechanism_list32_t;
1472
1473typedef struct crypto_get_all_mechanism_info32 {
1474	uint32_t		mi_return_value;
1475	crypto_mech_name_t	mi_mechanism_name;
1476	uint32_t		mi_count;
1477	crypto_mechanism_info32_t mi_list[1];
1478} crypto_get_all_mechanism_info32_t;
1479
1480#endif	/* _SYSCALL32 */
1481#endif	/* _KERNEL */
1482
1483#define	CRYPTO_GET_MECHANISM_LIST		CRYPTO(140)
1484#define	CRYPTO_GET_ALL_MECHANISM_INFO		CRYPTO(141)
1485
1486#define	CRYPTO_GET_PROVIDER_BY_MECH		CRYPTO(142)
1487
1488typedef struct crypto_by_mech {
1489	int rv;
1490	int res;
1491	crypto_mech_type_t mech_type;
1492	uint_t mech_keylen;
1493	crypto_func_group_t mech_fg;
1494	crypto_session_id_t session_id;
1495} crypto_by_mech_t;
1496
1497#ifdef	__cplusplus
1498}
1499#endif
1500
1501#endif	/* _SYS_CRYPTO_IOCTL_H */
1502