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