Home | History | Annotate | Download | only in crypto
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License (the "License").
      6  * You may not use this file except in compliance with the License.
      7  *
      8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9  * or http://www.opensolaris.org/os/licensing.
     10  * See the License for the specific language governing permissions
     11  * and limitations under the License.
     12  *
     13  * When distributing Covered Code, include this CDDL HEADER in each
     14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15  * If applicable, add the following below this CDDL HEADER, with the
     16  * fields enclosed by brackets "[]" replaced with your own identifying
     17  * information: Portions Copyright [yyyy] [name of copyright owner]
     18  *
     19  * CDDL HEADER END
     20  */
     21 /*
     22  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
     23  * Use is subject to license terms.
     24  */
     25 
     26 #ifndef	_SYS_CRYPTO_API_H
     27 #define	_SYS_CRYPTO_API_H
     28 
     29 #ifdef	__cplusplus
     30 extern "C" {
     31 #endif
     32 
     33 #include <sys/types.h>
     34 #include <sys/crypto/common.h>
     35 
     36 #ifdef	_KERNEL
     37 
     38 
     39 typedef long crypto_req_id_t;
     40 typedef void *crypto_bc_t;
     41 typedef void *crypto_context_t;
     42 typedef void *crypto_ctx_template_t;
     43 
     44 typedef uint32_t crypto_call_flag_t;
     45 
     46 /* crypto_call_flag's values */
     47 #define	CRYPTO_ALWAYS_QUEUE	0x00000001	/* ALWAYS queue the req. */
     48 #define	CRYPTO_NOTIFY_OPDONE	0x00000002	/* Notify intermediate steps */
     49 #define	CRYPTO_SKIP_REQID	0x00000004	/* Skip request ID generation */
     50 #define	CRYPTO_RESTRICTED	0x00000008	/* cannot use restricted prov */
     51 
     52 typedef struct {
     53 	crypto_call_flag_t	cr_flag;
     54 	void			(*cr_callback_func)(void *, int);
     55 	void			*cr_callback_arg;
     56 	crypto_req_id_t		cr_reqid;
     57 } crypto_call_req_t;
     58 
     59 /*
     60  * Returns the mechanism type corresponding to a mechanism name.
     61  */
     62 
     63 #define	CRYPTO_MECH_INVALID	((uint64_t)-1)
     64 extern crypto_mech_type_t crypto_mech2id(crypto_mech_name_t name);
     65 
     66 /*
     67  * Create and destroy context templates.
     68  */
     69 extern int crypto_create_ctx_template(crypto_mechanism_t *mech,
     70     crypto_key_t *key, crypto_ctx_template_t *tmpl, int kmflag);
     71 extern void crypto_destroy_ctx_template(crypto_ctx_template_t tmpl);
     72 
     73 /*
     74  * Single and multi-part digest operations.
     75  */
     76 extern int crypto_digest(crypto_mechanism_t *mech, crypto_data_t *data,
     77     crypto_data_t *digest, crypto_call_req_t *cr);
     78 extern int crypto_digest_prov(crypto_provider_t, crypto_session_id_t,
     79     crypto_mechanism_t *, crypto_data_t *, crypto_data_t *,
     80     crypto_call_req_t *);
     81 extern int crypto_digest_init(crypto_mechanism_t *mech, crypto_context_t *ctxp,
     82     crypto_call_req_t *cr);
     83 extern int crypto_digest_init_prov(crypto_provider_t, crypto_session_id_t,
     84     crypto_mechanism_t *, crypto_context_t *, crypto_call_req_t *);
     85 extern int crypto_digest_update(crypto_context_t ctx, crypto_data_t *data,
     86     crypto_call_req_t *cr);
     87 extern int crypto_digest_final(crypto_context_t ctx, crypto_data_t *digest,
     88     crypto_call_req_t *cr);
     89 
     90 /*
     91  * Single and multi-part MAC operations.
     92  */
     93 extern int crypto_mac(crypto_mechanism_t *mech, crypto_data_t *data,
     94     crypto_key_t *key, crypto_ctx_template_t tmpl, crypto_data_t *mac,
     95     crypto_call_req_t *cr);
     96 extern int crypto_mac_prov(crypto_provider_t, crypto_session_id_t,
     97     crypto_mechanism_t *, crypto_data_t *, crypto_key_t *,
     98     crypto_ctx_template_t, crypto_data_t *, crypto_call_req_t *);
     99 extern int crypto_mac_verify(crypto_mechanism_t *mech, crypto_data_t *data,
    100     crypto_key_t *key, crypto_ctx_template_t tmpl, crypto_data_t *mac,
    101     crypto_call_req_t *cr);
    102 extern int crypto_mac_verify_prov(crypto_provider_t, crypto_session_id_t,
    103     crypto_mechanism_t *, crypto_data_t *, crypto_key_t *,
    104     crypto_ctx_template_t, crypto_data_t *, crypto_call_req_t *);
    105 extern int crypto_mac_init(crypto_mechanism_t *mech, crypto_key_t *key,
    106     crypto_ctx_template_t tmpl, crypto_context_t *ctxp, crypto_call_req_t *cr);
    107 extern int crypto_mac_init_prov(crypto_provider_t, crypto_session_id_t,
    108     crypto_mechanism_t *, crypto_key_t *, crypto_ctx_template_t,
    109     crypto_context_t *, crypto_call_req_t *);
    110 extern int crypto_mac_update(crypto_context_t ctx, crypto_data_t *data,
    111     crypto_call_req_t *cr);
    112 extern int crypto_mac_final(crypto_context_t ctx, crypto_data_t *data,
    113     crypto_call_req_t *cr);
    114 
    115 /*
    116  * Single and multi-part sign with private key operations.
    117  */
    118 extern int crypto_sign(crypto_mechanism_t *mech, crypto_key_t *key,
    119     crypto_data_t *data, crypto_ctx_template_t tmpl,
    120     crypto_data_t *signature, crypto_call_req_t *cr);
    121 extern int crypto_sign_prov(crypto_provider_t, crypto_session_id_t,
    122     crypto_mechanism_t *, crypto_key_t *, crypto_data_t *,
    123     crypto_ctx_template_t, crypto_data_t *, crypto_call_req_t *);
    124 extern int crypto_sign_init(crypto_mechanism_t *mech, crypto_key_t *key,
    125     crypto_ctx_template_t tmpl, crypto_context_t *ctxp, crypto_call_req_t *cr);
    126 extern int crypto_sign_init_prov(crypto_provider_t, crypto_session_id_t,
    127     crypto_mechanism_t *, crypto_key_t *, crypto_ctx_template_t,
    128     crypto_context_t *, crypto_call_req_t *);
    129 extern int crypto_sign_update(crypto_context_t ctx, crypto_data_t *data,
    130     crypto_call_req_t *cr);
    131 extern int crypto_sign_final(crypto_context_t ctx, crypto_data_t *signature,
    132     crypto_call_req_t *cr);
    133 extern int crypto_sign_recover_init_prov(crypto_provider_t,
    134     crypto_session_id_t, crypto_mechanism_t *, crypto_key_t *,
    135     crypto_ctx_template_t tmpl, crypto_context_t *, crypto_call_req_t *);
    136 extern int crypto_sign_recover(crypto_mechanism_t *mech, crypto_key_t *key,
    137     crypto_data_t *data, crypto_ctx_template_t tmpl, crypto_data_t *signature,
    138     crypto_call_req_t *cr);
    139 extern int crypto_sign_recover_prov(crypto_provider_t, crypto_session_id_t,
    140     crypto_mechanism_t *, crypto_key_t *, crypto_data_t *,
    141     crypto_ctx_template_t, crypto_data_t *, crypto_call_req_t *);
    142 
    143 /*
    144  * Single and multi-part verify with public key operations.
    145  */
    146 extern int crypto_verify(crypto_mechanism_t *mech, crypto_key_t *key,
    147     crypto_data_t *data, crypto_ctx_template_t tmpl, crypto_data_t *signature,
    148     crypto_call_req_t *cr);
    149 extern int crypto_verify_prov(crypto_provider_t, crypto_session_id_t,
    150     crypto_mechanism_t *, crypto_key_t *, crypto_data_t *,
    151     crypto_ctx_template_t, crypto_data_t *, crypto_call_req_t *);
    152 extern int crypto_verify_init(crypto_mechanism_t *mech, crypto_key_t *key,
    153     crypto_ctx_template_t tmpl, crypto_context_t *ctxp, crypto_call_req_t *cr);
    154 extern int crypto_verify_init_prov(crypto_provider_t, crypto_session_id_t,
    155     crypto_mechanism_t *, crypto_key_t *, crypto_ctx_template_t,
    156     crypto_context_t *, crypto_call_req_t *);
    157 extern int crypto_verify_update(crypto_context_t ctx, crypto_data_t *data,
    158     crypto_call_req_t *cr);
    159 extern int crypto_verify_final(crypto_context_t ctx, crypto_data_t *signature,
    160     crypto_call_req_t *cr);
    161 extern int crypto_verify_recover_init_prov(crypto_provider_t,
    162     crypto_session_id_t, crypto_mechanism_t *, crypto_key_t *,
    163     crypto_ctx_template_t tmpl, crypto_context_t *, crypto_call_req_t *);
    164 extern int crypto_verify_recover(crypto_mechanism_t *mech, crypto_key_t *key,
    165     crypto_data_t *signature, crypto_ctx_template_t tmpl, crypto_data_t *data,
    166     crypto_call_req_t *cr);
    167 extern int crypto_verify_recover_prov(crypto_provider_t, crypto_session_id_t,
    168     crypto_mechanism_t *, crypto_key_t *, crypto_data_t *,
    169     crypto_ctx_template_t, crypto_data_t *, crypto_call_req_t *);
    170 
    171 /*
    172  * Single and multi-part encryption operations.
    173  */
    174 extern int crypto_encrypt(crypto_mechanism_t *mech, crypto_data_t *plaintext,
    175     crypto_key_t *key, crypto_ctx_template_t tmpl, crypto_data_t *ciphertext,
    176     crypto_call_req_t *cr);
    177 extern int crypto_encrypt_prov(crypto_provider_t, crypto_session_id_t,
    178     crypto_mechanism_t *, crypto_data_t *, crypto_key_t *,
    179     crypto_ctx_template_t, crypto_data_t *, crypto_call_req_t *);
    180 extern int crypto_encrypt_init(crypto_mechanism_t *mech, crypto_key_t *key,
    181     crypto_ctx_template_t tmpl, crypto_context_t *ctxp, crypto_call_req_t *cr);
    182 extern int crypto_encrypt_init_prov(crypto_provider_t, crypto_session_id_t,
    183     crypto_mechanism_t *, crypto_key_t *, crypto_ctx_template_t,
    184     crypto_context_t *, crypto_call_req_t *);
    185 extern int crypto_encrypt_update(crypto_context_t ctx,
    186     crypto_data_t *plaintext, crypto_data_t *ciphertext,
    187     crypto_call_req_t *cr);
    188 extern int crypto_encrypt_final(crypto_context_t ctx,
    189     crypto_data_t *ciphertext, crypto_call_req_t *cr);
    190 
    191 /*
    192  * Single and multi-part decryption operations.
    193  */
    194 extern int crypto_decrypt(crypto_mechanism_t *mech, crypto_data_t *ciphertext,
    195     crypto_key_t *key, crypto_ctx_template_t tmpl, crypto_data_t *plaintext,
    196     crypto_call_req_t *cr);
    197 extern int crypto_decrypt_prov(crypto_provider_t, crypto_session_id_t,
    198     crypto_mechanism_t *, crypto_data_t *, crypto_key_t *,
    199     crypto_ctx_template_t, crypto_data_t *, crypto_call_req_t *);
    200 extern int crypto_decrypt_init(crypto_mechanism_t *mech, crypto_key_t *key,
    201     crypto_ctx_template_t tmpl, crypto_context_t *ctxp,
    202     crypto_call_req_t *cr);
    203 extern int crypto_decrypt_init_prov(crypto_provider_t, crypto_session_id_t,
    204     crypto_mechanism_t *, crypto_key_t *, crypto_ctx_template_t,
    205     crypto_context_t *, crypto_call_req_t *);
    206 extern int crypto_decrypt_update(crypto_context_t ctx,
    207     crypto_data_t *ciphertext, crypto_data_t *plaintext,
    208     crypto_call_req_t *cr);
    209 extern int crypto_decrypt_final(crypto_context_t ctx, crypto_data_t *plaintext,
    210     crypto_call_req_t *cr);
    211 
    212 /*
    213  * Single and multi-part encrypt/MAC dual operations.
    214  */
    215 extern int crypto_encrypt_mac(crypto_mechanism_t *encr_mech,
    216     crypto_mechanism_t *mac_mech, crypto_data_t *pt,
    217     crypto_key_t *encr_key, crypto_key_t *mac_key,
    218     crypto_ctx_template_t encr_tmpl, crypto_ctx_template_t mac_tmpl,
    219     crypto_dual_data_t *ct, crypto_data_t *mac, crypto_call_req_t *cr);
    220 extern int crypto_encrypt_mac_prov(crypto_provider_t, crypto_session_id_t,
    221     crypto_mechanism_t *, crypto_mechanism_t *, crypto_data_t *,
    222     crypto_key_t *, crypto_key_t *, crypto_ctx_template_t,
    223     crypto_ctx_template_t, crypto_dual_data_t *, crypto_data_t *,
    224     crypto_call_req_t *);
    225 extern int crypto_encrypt_mac_init(crypto_mechanism_t *encr_mech,
    226     crypto_mechanism_t *mac_mech, crypto_key_t *encr_key,
    227     crypto_key_t *mac_key, crypto_ctx_template_t encr_tmpl,
    228     crypto_ctx_template_t mac_tmpl, crypto_context_t *ctxp,
    229     crypto_call_req_t *cr);
    230 extern int crypto_encrypt_mac_init_prov(crypto_provider_t, crypto_session_id_t,
    231     crypto_mechanism_t *, crypto_mechanism_t *, crypto_key_t *, crypto_key_t *,
    232     crypto_ctx_template_t, crypto_ctx_template_t, crypto_context_t *,
    233     crypto_call_req_t *);
    234 extern int crypto_encrypt_mac_update(crypto_context_t ctx,
    235     crypto_data_t *pt, crypto_dual_data_t *ct, crypto_call_req_t *cr);
    236 extern int crypto_encrypt_mac_final(crypto_context_t ctx,
    237     crypto_dual_data_t *ct, crypto_data_t *mac, crypto_call_req_t *cr);
    238 
    239 /*
    240  * Single and multi-part MAC/decrypt dual operations.
    241  */
    242 extern int crypto_mac_decrypt(crypto_mechanism_t *mac_mech,
    243     crypto_mechanism_t *decr_mech, crypto_dual_data_t *ct,
    244     crypto_key_t *mac_key, crypto_key_t *decr_key,
    245     crypto_ctx_template_t mac_tmpl, crypto_ctx_template_t decr_tmpl,
    246     crypto_data_t *mac, crypto_data_t *pt, crypto_call_req_t *cr);
    247 extern int crypto_mac_decrypt_prov(crypto_provider_t, crypto_session_id_t,
    248     crypto_mechanism_t *mac_mech, crypto_mechanism_t *decr_mech,
    249     crypto_dual_data_t *ct, crypto_key_t *mac_key, crypto_key_t *decr_key,
    250     crypto_ctx_template_t mac_tmpl, crypto_ctx_template_t decr_tmpl,
    251     crypto_data_t *mac, crypto_data_t *pt, crypto_call_req_t *cr);
    252 extern int crypto_mac_verify_decrypt(crypto_mechanism_t *mac_mech,
    253     crypto_mechanism_t *decr_mech, crypto_dual_data_t *ct,
    254     crypto_key_t *mac_key, crypto_key_t *decr_key,
    255     crypto_ctx_template_t mac_tmpl, crypto_ctx_template_t decr_tmpl,
    256     crypto_data_t *mac, crypto_data_t *pt, crypto_call_req_t *cr);
    257 extern int crypto_mac_verify_decrypt_prov(crypto_provider_t,
    258     crypto_session_id_t, crypto_mechanism_t *mac_mech,
    259     crypto_mechanism_t *decr_mech, crypto_dual_data_t *ct,
    260     crypto_key_t *mac_key, crypto_key_t *decr_key,
    261     crypto_ctx_template_t mac_tmpl, crypto_ctx_template_t decr_tmpl,
    262     crypto_data_t *mac, crypto_data_t *pt, crypto_call_req_t *cr);
    263 extern int crypto_mac_decrypt_init(crypto_mechanism_t *mac_mech,
    264     crypto_mechanism_t *decr_mech, crypto_key_t *mac_key,
    265     crypto_key_t *decr_key, crypto_ctx_template_t mac_tmpl,
    266     crypto_ctx_template_t decr_tmpl, crypto_context_t *ctxp,
    267     crypto_call_req_t *cr);
    268 extern int crypto_mac_decrypt_init_prov(crypto_provider_t,
    269     crypto_session_id_t, crypto_mechanism_t *mac_mech,
    270     crypto_mechanism_t *decr_mech, crypto_key_t *mac_key,
    271     crypto_key_t *decr_key, crypto_ctx_template_t mac_tmpl,
    272     crypto_ctx_template_t decr_tmpl, crypto_context_t *ctxp,
    273     crypto_call_req_t *cr);
    274 extern int crypto_mac_decrypt_update(crypto_context_t ctx,
    275     crypto_dual_data_t *ct, crypto_data_t *pt, crypto_call_req_t *cr);
    276 extern int crypto_mac_decrypt_final(crypto_context_t ctx, crypto_data_t *mac,
    277     crypto_data_t *pt, crypto_call_req_t *cr);
    278 
    279 /* Session Management */
    280 extern int crypto_session_open(crypto_provider_t, crypto_session_id_t *,
    281     crypto_call_req_t *);
    282 extern int crypto_session_close(crypto_provider_t, crypto_session_id_t,
    283     crypto_call_req_t *);
    284 extern int crypto_session_login(crypto_provider_t, crypto_session_id_t,
    285     crypto_user_type_t, char *, size_t, crypto_call_req_t *);
    286 extern int crypto_session_logout(crypto_provider_t, crypto_session_id_t,
    287     crypto_call_req_t *);
    288 
    289 /* Object Management */
    290 extern int crypto_object_copy(crypto_provider_t, crypto_session_id_t,
    291     crypto_object_id_t, crypto_object_attribute_t *, uint_t,
    292     crypto_object_id_t *, crypto_call_req_t *);
    293 extern int crypto_object_create(crypto_provider_t, crypto_session_id_t,
    294     crypto_object_attribute_t *, uint_t, crypto_object_id_t *,
    295     crypto_call_req_t *);
    296 extern int crypto_object_destroy(crypto_provider_t, crypto_session_id_t,
    297     crypto_object_id_t, crypto_call_req_t *);
    298 extern int crypto_object_get_attribute_value(crypto_provider_t,
    299     crypto_session_id_t, crypto_object_id_t, crypto_object_attribute_t *,
    300     uint_t, crypto_call_req_t *);
    301 extern int crypto_object_get_size(crypto_provider_t, crypto_session_id_t,
    302     crypto_object_id_t, size_t *, crypto_call_req_t *);
    303 extern int crypto_object_find_final(crypto_provider_t, void *,
    304     crypto_call_req_t *);
    305 extern int crypto_object_find_init(crypto_provider_t, crypto_session_id_t,
    306     crypto_object_attribute_t *, uint_t, void **, crypto_call_req_t *);
    307 extern int crypto_object_find(crypto_provider_t, void *, crypto_object_id_t *,
    308     uint_t *, uint_t, crypto_call_req_t *);
    309 extern int crypto_object_set_attribute_value(crypto_provider_t,
    310     crypto_session_id_t, crypto_object_id_t, crypto_object_attribute_t *,
    311     uint_t, crypto_call_req_t *);
    312 
    313 /* Key Management */
    314 extern int crypto_key_derive(crypto_provider_t, crypto_session_id_t,
    315     crypto_mechanism_t *, crypto_key_t *, crypto_object_attribute_t *,
    316     uint_t, crypto_object_id_t *, crypto_call_req_t *);
    317 extern int crypto_key_generate(crypto_provider_t, crypto_session_id_t,
    318     crypto_mechanism_t *, crypto_object_attribute_t *, uint_t,
    319     crypto_object_id_t *, crypto_call_req_t *);
    320 extern int crypto_key_generate_pair(crypto_provider_t, crypto_session_id_t,
    321     crypto_mechanism_t *, crypto_object_attribute_t *, uint_t,
    322     crypto_object_attribute_t *, uint_t, crypto_object_id_t *,
    323     crypto_object_id_t *, crypto_call_req_t *);
    324 extern int crypto_key_unwrap(crypto_provider_t, crypto_session_id_t,
    325     crypto_mechanism_t *, crypto_key_t *, uchar_t *, size_t *,
    326     crypto_object_attribute_t *, uint_t, crypto_object_id_t *,
    327     crypto_call_req_t *);
    328 extern int crypto_key_wrap(crypto_provider_t, crypto_session_id_t,
    329     crypto_mechanism_t *, crypto_key_t *, crypto_object_id_t *, uchar_t *,
    330     size_t *, crypto_call_req_t *);
    331 extern int crypto_key_check_prov(crypto_provider_t, crypto_mechanism_t *mech,
    332     crypto_key_t *key);
    333 extern int crypto_key_check(crypto_mechanism_t *mech, crypto_key_t *key);
    334 
    335 
    336 /*
    337  * Routines to cancel a single asynchronous request or all asynchronous
    338  * requests associated with a particular context.
    339  */
    340 extern void crypto_cancel_req(crypto_req_id_t req);
    341 extern void crypto_cancel_ctx(crypto_context_t ctx);
    342 
    343 /*
    344  * crypto_get_mech_list(9F) allocates and returns the list of currently
    345  * supported cryptographic mechanisms.
    346  */
    347 extern crypto_mech_name_t *crypto_get_mech_list(uint_t *count, int kmflag);
    348 extern void crypto_free_mech_list(crypto_mech_name_t *mech_names,
    349     uint_t count);
    350 
    351 extern crypto_provider_t crypto_get_provider(char *, char *, char *);
    352 extern int crypto_get_provinfo(crypto_provider_t, crypto_provider_ext_info_t *);
    353 extern void crypto_release_provider(crypto_provider_t);
    354 
    355 /*
    356  * A kernel consumer can request to be notified when some particular event
    357  * occurs. The valid events, callback function type, and functions to
    358  * be called to register or unregister for notification are defined below.
    359  */
    360 
    361 #define	CRYPTO_EVENT_MECHS_CHANGED		0x00000001
    362 #define	CRYPTO_EVENT_PROVIDER_REGISTERED	0x00000002
    363 #define	CRYPTO_EVENT_PROVIDER_UNREGISTERED	0x00000004
    364 
    365 typedef enum {
    366 	CRYPTO_MECH_ADDED = 1,
    367 	CRYPTO_MECH_REMOVED
    368 } crypto_event_change_t;
    369 
    370 /* The event_arg argument structure for CRYPTO_EVENT_PROVIDERS_CHANGE event */
    371 typedef struct crypto_notify_event_change {
    372 	crypto_mech_name_t ec_mech_name;
    373 	crypto_provider_type_t ec_provider_type;
    374 	crypto_event_change_t ec_change;
    375 } crypto_notify_event_change_t;
    376 
    377 typedef void *crypto_notify_handle_t;
    378 typedef void (*crypto_notify_callback_t)(uint32_t event_mask, void *event_arg);
    379 
    380 extern crypto_notify_handle_t crypto_notify_events(
    381     crypto_notify_callback_t nf, uint32_t event_mask);
    382 extern void crypto_unnotify_events(crypto_notify_handle_t);
    383 
    384 /*
    385  * crypto_bufcall(9F) group of routines.
    386  */
    387 extern crypto_bc_t crypto_bufcall_alloc(void);
    388 extern int crypto_bufcall_free(crypto_bc_t bc);
    389 extern int crypto_bufcall(crypto_bc_t bc, void (*func)(void *arg), void *arg);
    390 extern int crypto_unbufcall(crypto_bc_t bc);
    391 
    392 #endif	/* _KERNEL */
    393 
    394 /*
    395  * To obtain the list of key size ranges supported by a mechanism.
    396  */
    397 
    398 #define	CRYPTO_MECH_USAGE_ENCRYPT	0x00000001
    399 #define	CRYPTO_MECH_USAGE_DECRYPT	0x00000002
    400 #define	CRYPTO_MECH_USAGE_MAC		0x00000004
    401 
    402 typedef	uint32_t crypto_mech_usage_t;
    403 
    404 typedef struct crypto_mechanism_info {
    405 	size_t mi_min_key_size;
    406 	size_t mi_max_key_size;
    407 	crypto_keysize_unit_t mi_keysize_unit; /* for mi_xxx_key_size */
    408 	crypto_mech_usage_t mi_usage;
    409 } crypto_mechanism_info_t;
    410 
    411 #ifdef	_KERNEL
    412 #ifdef	_SYSCALL32
    413 
    414 typedef struct crypto_mechanism_info32 {
    415 	size32_t mi_min_key_size;
    416 	size32_t mi_max_key_size;
    417 	crypto_keysize_unit_t mi_keysize_unit; /* for mi_xxx_key_size */
    418 	crypto_mech_usage_t mi_usage;
    419 } crypto_mechanism_info32_t;
    420 
    421 #endif	/* _SYSCALL32 */
    422 #endif	/* _KERNEL */
    423 
    424 extern int crypto_get_all_mech_info(crypto_mech_type_t,
    425     crypto_mechanism_info_t **, uint_t *, int);
    426 extern void crypto_free_all_mech_info(crypto_mechanism_info_t *, uint_t);
    427 
    428 #ifdef	__cplusplus
    429 }
    430 #endif
    431 
    432 #endif	/* _SYS_CRYPTO_API_H */
    433