17c478bd9Sstevel@tonic-gate /*
27c478bd9Sstevel@tonic-gate  * CDDL HEADER START
37c478bd9Sstevel@tonic-gate  *
47c478bd9Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
5034448feSmcpowers  * Common Development and Distribution License (the "License").
6034448feSmcpowers  * You may not use this file except in compliance with the License.
77c478bd9Sstevel@tonic-gate  *
87c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
97c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
107c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
117c478bd9Sstevel@tonic-gate  * and limitations under the License.
127c478bd9Sstevel@tonic-gate  *
137c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
147c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
157c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
167c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
177c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
187c478bd9Sstevel@tonic-gate  *
197c478bd9Sstevel@tonic-gate  * CDDL HEADER END
207c478bd9Sstevel@tonic-gate  */
217c478bd9Sstevel@tonic-gate /*
22*d288ba74SAnthony Scarpino  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
237c478bd9Sstevel@tonic-gate  * Use is subject to license terms.
247c478bd9Sstevel@tonic-gate  */
257c478bd9Sstevel@tonic-gate 
267c478bd9Sstevel@tonic-gate #ifndef	_KERNELOBJECT_H
277c478bd9Sstevel@tonic-gate #define	_KERNELOBJECT_H
287c478bd9Sstevel@tonic-gate 
297c478bd9Sstevel@tonic-gate #ifdef __cplusplus
307c478bd9Sstevel@tonic-gate extern "C" {
317c478bd9Sstevel@tonic-gate #endif
327c478bd9Sstevel@tonic-gate 
337c478bd9Sstevel@tonic-gate #include <security/pkcs11t.h>
347c478bd9Sstevel@tonic-gate #include "kernelSession.h"
357c478bd9Sstevel@tonic-gate #include "kernelSlot.h"
367c478bd9Sstevel@tonic-gate 
377c478bd9Sstevel@tonic-gate #define	KERNELTOKEN_OBJECT_MAGIC	0xECF0B003
387c478bd9Sstevel@tonic-gate 
39034448feSmcpowers #define	KERNEL_CREATE_OBJ	1
40034448feSmcpowers #define	KERNEL_GEN_KEY		2
41034448feSmcpowers 
427c478bd9Sstevel@tonic-gate #define	RSA_PRI_ATTR_COUNT		7
437c478bd9Sstevel@tonic-gate #define	RSA_PUB_ATTR_COUNT		3
447c478bd9Sstevel@tonic-gate #define	DSA_ATTR_COUNT			4
45d2b32306Smcpowers #define	EC_ATTR_COUNT			2
467c478bd9Sstevel@tonic-gate 
477c478bd9Sstevel@tonic-gate /*
487c478bd9Sstevel@tonic-gate  * Secret key Struct
497c478bd9Sstevel@tonic-gate  */
507c478bd9Sstevel@tonic-gate typedef struct secret_key_obj {
517c478bd9Sstevel@tonic-gate 	CK_BYTE *sk_value;
527c478bd9Sstevel@tonic-gate 	CK_ULONG sk_value_len;
537c478bd9Sstevel@tonic-gate } secret_key_obj_t;
547c478bd9Sstevel@tonic-gate 
557c478bd9Sstevel@tonic-gate 
567c478bd9Sstevel@tonic-gate /*
577c478bd9Sstevel@tonic-gate  * This structure is used to hold the attributes in the
587c478bd9Sstevel@tonic-gate  * Extra Attribute List.
597c478bd9Sstevel@tonic-gate  */
607c478bd9Sstevel@tonic-gate typedef struct attribute_info {
617c478bd9Sstevel@tonic-gate 	CK_ATTRIBUTE	attr;
627c478bd9Sstevel@tonic-gate 	struct attribute_info *next;
637c478bd9Sstevel@tonic-gate } attribute_info_t;
647c478bd9Sstevel@tonic-gate 
657c478bd9Sstevel@tonic-gate typedef attribute_info_t *CK_ATTRIBUTE_INFO_PTR;
667c478bd9Sstevel@tonic-gate 
677c478bd9Sstevel@tonic-gate 
687c478bd9Sstevel@tonic-gate /*
697c478bd9Sstevel@tonic-gate  * biginteger Struct
707c478bd9Sstevel@tonic-gate  */
717c478bd9Sstevel@tonic-gate typedef struct biginteger {
727c478bd9Sstevel@tonic-gate 	CK_BYTE *big_value;
737c478bd9Sstevel@tonic-gate 	CK_ULONG big_value_len;
747c478bd9Sstevel@tonic-gate } biginteger_t;
757c478bd9Sstevel@tonic-gate 
767c478bd9Sstevel@tonic-gate 
777c478bd9Sstevel@tonic-gate /*
787c478bd9Sstevel@tonic-gate  * PKCS11: RSA Public Key Object Attributes
797c478bd9Sstevel@tonic-gate  */
807c478bd9Sstevel@tonic-gate typedef struct rsa_pub_key {
817c478bd9Sstevel@tonic-gate 	biginteger_t modulus;
827c478bd9Sstevel@tonic-gate 	CK_ULONG modulus_bits;
837c478bd9Sstevel@tonic-gate 	biginteger_t pub_exponent;
847c478bd9Sstevel@tonic-gate } rsa_pub_key_t;
857c478bd9Sstevel@tonic-gate 
867c478bd9Sstevel@tonic-gate 
877c478bd9Sstevel@tonic-gate /*
887c478bd9Sstevel@tonic-gate  * PKCS11: DSA Public Key Object Attributes
897c478bd9Sstevel@tonic-gate  */
907c478bd9Sstevel@tonic-gate typedef struct dsa_pub_key {
917c478bd9Sstevel@tonic-gate 	biginteger_t prime;
927c478bd9Sstevel@tonic-gate 	biginteger_t subprime;
937c478bd9Sstevel@tonic-gate 	biginteger_t base;
947c478bd9Sstevel@tonic-gate 	biginteger_t value;
957c478bd9Sstevel@tonic-gate } dsa_pub_key_t;
967c478bd9Sstevel@tonic-gate 
97034448feSmcpowers /*
98034448feSmcpowers  * PKCS11: Diffie-Hellman Public Key Object Attributes
99034448feSmcpowers  */
100034448feSmcpowers typedef struct dh_pub_key {
101034448feSmcpowers 	biginteger_t prime;
102034448feSmcpowers 	biginteger_t base;
103034448feSmcpowers 	biginteger_t value;
104034448feSmcpowers } dh_pub_key_t;
105034448feSmcpowers 
106034448feSmcpowers /*
107034448feSmcpowers  * PKCS11: EC Public Key Object Attributes
108034448feSmcpowers  */
109034448feSmcpowers typedef struct ec_pub_key {
110034448feSmcpowers 	biginteger_t point;
111034448feSmcpowers } ec_pub_key_t;
112034448feSmcpowers 
1137c478bd9Sstevel@tonic-gate 
1147c478bd9Sstevel@tonic-gate /*
1157c478bd9Sstevel@tonic-gate  * Public Key Main Struct
1167c478bd9Sstevel@tonic-gate  */
1177c478bd9Sstevel@tonic-gate typedef struct public_key_obj {
1187c478bd9Sstevel@tonic-gate 	union {
1197c478bd9Sstevel@tonic-gate 		rsa_pub_key_t rsa_pub_key; /* RSA public key */
1207c478bd9Sstevel@tonic-gate 		dsa_pub_key_t dsa_pub_key; /* DSA public key */
121034448feSmcpowers 		dh_pub_key_t dh_pub_key; /* DH public key */
122034448feSmcpowers 		ec_pub_key_t ec_pub_key; /* EC public key */
1237c478bd9Sstevel@tonic-gate 	} key_type_u;
1247c478bd9Sstevel@tonic-gate } public_key_obj_t;
1257c478bd9Sstevel@tonic-gate 
1267c478bd9Sstevel@tonic-gate 
1277c478bd9Sstevel@tonic-gate /*
1287c478bd9Sstevel@tonic-gate  * PKCS11: RSA Private Key Object Attributes
1297c478bd9Sstevel@tonic-gate  */
1307c478bd9Sstevel@tonic-gate typedef struct rsa_pri_key {
1317c478bd9Sstevel@tonic-gate 	biginteger_t modulus;
1327c478bd9Sstevel@tonic-gate 	biginteger_t pub_exponent;
1337c478bd9Sstevel@tonic-gate 	biginteger_t pri_exponent;
1347c478bd9Sstevel@tonic-gate 	biginteger_t prime_1;
1357c478bd9Sstevel@tonic-gate 	biginteger_t prime_2;
1367c478bd9Sstevel@tonic-gate 	biginteger_t exponent_1;
1377c478bd9Sstevel@tonic-gate 	biginteger_t exponent_2;
1387c478bd9Sstevel@tonic-gate 	biginteger_t coefficient;
1397c478bd9Sstevel@tonic-gate } rsa_pri_key_t;
1407c478bd9Sstevel@tonic-gate 
1417c478bd9Sstevel@tonic-gate 
1427c478bd9Sstevel@tonic-gate /*
1437c478bd9Sstevel@tonic-gate  * PKCS11: DSA Private Key Object Attributes
1447c478bd9Sstevel@tonic-gate  */
1457c478bd9Sstevel@tonic-gate typedef struct dsa_pri_key {
1467c478bd9Sstevel@tonic-gate 	biginteger_t prime;
1477c478bd9Sstevel@tonic-gate 	biginteger_t subprime;
1487c478bd9Sstevel@tonic-gate 	biginteger_t base;
1497c478bd9Sstevel@tonic-gate 	biginteger_t value;
1507c478bd9Sstevel@tonic-gate } dsa_pri_key_t;
1517c478bd9Sstevel@tonic-gate 
1527c478bd9Sstevel@tonic-gate 
153034448feSmcpowers /*
154034448feSmcpowers  * PKCS11: Diffie-Hellman Private Key Object Attributes
155034448feSmcpowers  */
156034448feSmcpowers typedef struct dh_pri_key {
157034448feSmcpowers 	biginteger_t prime;
158034448feSmcpowers 	biginteger_t base;
159034448feSmcpowers 	biginteger_t value;
160034448feSmcpowers 	CK_ULONG value_bits;
161034448feSmcpowers } dh_pri_key_t;
162034448feSmcpowers 
163034448feSmcpowers 
164034448feSmcpowers /*
165034448feSmcpowers  * PKCS11: EC Private Key Object Attributes
166034448feSmcpowers  */
167034448feSmcpowers typedef struct ec_pri_key {
168034448feSmcpowers 	biginteger_t value;
169034448feSmcpowers } ec_pri_key_t;
170034448feSmcpowers 
1717c478bd9Sstevel@tonic-gate /*
1727c478bd9Sstevel@tonic-gate  * Private Key Main Struct
1737c478bd9Sstevel@tonic-gate  */
1747c478bd9Sstevel@tonic-gate typedef struct private_key_obj {
1757c478bd9Sstevel@tonic-gate 	union {
1767c478bd9Sstevel@tonic-gate 		rsa_pri_key_t rsa_pri_key; /* RSA private key */
1777c478bd9Sstevel@tonic-gate 		dsa_pri_key_t dsa_pri_key; /* DSA private key */
178034448feSmcpowers 		dh_pri_key_t dh_pri_key; /* DH private key */
179034448feSmcpowers 		ec_pri_key_t ec_pri_key; /* EC private key */
1807c478bd9Sstevel@tonic-gate 	} key_type_u;
1817c478bd9Sstevel@tonic-gate } private_key_obj_t;
1827c478bd9Sstevel@tonic-gate 
1837c478bd9Sstevel@tonic-gate 
1847c478bd9Sstevel@tonic-gate /*
1857c478bd9Sstevel@tonic-gate  * This is the main structure of the Objects.
1867c478bd9Sstevel@tonic-gate  */
1877c478bd9Sstevel@tonic-gate typedef struct object {
1887c478bd9Sstevel@tonic-gate 	boolean_t	is_lib_obj; /* default is TRUE */
1897c478bd9Sstevel@tonic-gate 	crypto_object_id_t	k_handle;
1907c478bd9Sstevel@tonic-gate 
1917c478bd9Sstevel@tonic-gate 	/* Generic common fields. Always present */
1927c478bd9Sstevel@tonic-gate 	CK_OBJECT_CLASS class;
1937c478bd9Sstevel@tonic-gate 	CK_KEY_TYPE key_type;
1947c478bd9Sstevel@tonic-gate 	CK_ULONG magic_marker;
1957c478bd9Sstevel@tonic-gate 	uint64_t bool_attr_mask;
1967c478bd9Sstevel@tonic-gate 	CK_MECHANISM_TYPE mechanism;
1977c478bd9Sstevel@tonic-gate 
1987c478bd9Sstevel@tonic-gate 	/* Fields for access and arbitration */
1997c478bd9Sstevel@tonic-gate 	pthread_mutex_t object_mutex;
2007c478bd9Sstevel@tonic-gate 	struct object *next;
2017c478bd9Sstevel@tonic-gate 	struct object *prev;
2027c478bd9Sstevel@tonic-gate 
2037c478bd9Sstevel@tonic-gate 	/* Extra non-boolean attribute list */
2047c478bd9Sstevel@tonic-gate 	CK_ATTRIBUTE_INFO_PTR extra_attrlistp;
2057c478bd9Sstevel@tonic-gate 	CK_ULONG extra_attrcount;
2067c478bd9Sstevel@tonic-gate 
2077c478bd9Sstevel@tonic-gate 	/* For each object, only one object class is presented */
2087c478bd9Sstevel@tonic-gate 	union {
2097c478bd9Sstevel@tonic-gate 		secret_key_obj_t  *secret_key;
2107c478bd9Sstevel@tonic-gate 		public_key_obj_t  *public_key;
2117c478bd9Sstevel@tonic-gate 		private_key_obj_t *private_key;
2127c478bd9Sstevel@tonic-gate 	} object_class_u;
2137c478bd9Sstevel@tonic-gate 
2147c478bd9Sstevel@tonic-gate 	/* Session handle that the object belongs to */
2157c478bd9Sstevel@tonic-gate 	CK_SESSION_HANDLE	session_handle;
21601223cbaSmcpowers 	uint32_t	obj_refcnt;	/* object reference count */
21701223cbaSmcpowers 	pthread_cond_t	obj_free_cond;	/* cond variable for signal and wait */
21801223cbaSmcpowers 	uint32_t	obj_delete_sync;	/* object delete sync flags */
2197c478bd9Sstevel@tonic-gate 
2207c478bd9Sstevel@tonic-gate } kernel_object_t;
2217c478bd9Sstevel@tonic-gate 
2227c478bd9Sstevel@tonic-gate 
2237c478bd9Sstevel@tonic-gate typedef struct find_context {
2247c478bd9Sstevel@tonic-gate 	kernel_object_t **objs_found;
2257c478bd9Sstevel@tonic-gate 	CK_ULONG num_results;
2267c478bd9Sstevel@tonic-gate 	CK_ULONG next_result_index; /* next result object to return */
2277c478bd9Sstevel@tonic-gate } find_context_t;
2287c478bd9Sstevel@tonic-gate 
22901223cbaSmcpowers /*
23001223cbaSmcpowers  * The following structure is used to link the to-be-freed session
23101223cbaSmcpowers  * objects into a linked list. The objects on this linked list have
23201223cbaSmcpowers  * not yet been freed via free() after C_DestroyObject() call; instead
23301223cbaSmcpowers  * they are added to this list. The actual free will take place when
23401223cbaSmcpowers  * the number of objects queued reaches MAX_OBJ_TO_BE_FREED, at which
23501223cbaSmcpowers  * time the first object in the list will be freed.
23601223cbaSmcpowers  */
23701223cbaSmcpowers #define	MAX_OBJ_TO_BE_FREED		300
23801223cbaSmcpowers 
23901223cbaSmcpowers typedef struct obj_to_be_freed_list {
24001223cbaSmcpowers 	kernel_object_t	*first;	/* points to first obj in the list */
24101223cbaSmcpowers 	kernel_object_t	*last;	/* points to last obj in the list */
24201223cbaSmcpowers 	uint32_t	count;	/* current total objs in the list */
24301223cbaSmcpowers 	pthread_mutex_t obj_to_be_free_mutex;
24401223cbaSmcpowers } object_to_be_freed_list_t;
24501223cbaSmcpowers 
24601223cbaSmcpowers extern object_to_be_freed_list_t obj_delay_freed;
24701223cbaSmcpowers 
24801223cbaSmcpowers 
2497c478bd9Sstevel@tonic-gate /*
2507c478bd9Sstevel@tonic-gate  * The following definitions are the shortcuts
2517c478bd9Sstevel@tonic-gate  */
2527c478bd9Sstevel@tonic-gate 
2537c478bd9Sstevel@tonic-gate /*
2547c478bd9Sstevel@tonic-gate  * Secret Key Object Attributes
2557c478bd9Sstevel@tonic-gate  */
2567c478bd9Sstevel@tonic-gate #define	OBJ_SEC(o) \
2577c478bd9Sstevel@tonic-gate 	(o->object_class_u.secret_key)
2587c478bd9Sstevel@tonic-gate #define	OBJ_SEC_VALUE(o) \
2597c478bd9Sstevel@tonic-gate 	(o->object_class_u.secret_key->sk_value)
2607c478bd9Sstevel@tonic-gate #define	OBJ_SEC_VALUE_LEN(o) \
2617c478bd9Sstevel@tonic-gate 	(o->object_class_u.secret_key->sk_value_len)
2627c478bd9Sstevel@tonic-gate 
2637c478bd9Sstevel@tonic-gate /*
2647c478bd9Sstevel@tonic-gate  * RSA Public Key Object Attributes
2657c478bd9Sstevel@tonic-gate  */
2667c478bd9Sstevel@tonic-gate #define	OBJ_PUB(o) \
2677c478bd9Sstevel@tonic-gate 	((o)->object_class_u.public_key)
2687c478bd9Sstevel@tonic-gate #define	KEY_PUB_RSA(k) \
2697c478bd9Sstevel@tonic-gate 	&((k)->key_type_u.rsa_pub_key)
2707c478bd9Sstevel@tonic-gate #define	OBJ_PUB_RSA_MOD(o) \
2717c478bd9Sstevel@tonic-gate 	&((o)->object_class_u.public_key->key_type_u.rsa_pub_key.modulus)
2727c478bd9Sstevel@tonic-gate #define	KEY_PUB_RSA_MOD(k) \
2737c478bd9Sstevel@tonic-gate 	&((k)->key_type_u.rsa_pub_key.modulus)
2747c478bd9Sstevel@tonic-gate #define	OBJ_PUB_RSA_PUBEXPO(o) \
2757c478bd9Sstevel@tonic-gate 	&((o)->object_class_u.public_key->key_type_u.rsa_pub_key.pub_exponent)
2767c478bd9Sstevel@tonic-gate #define	KEY_PUB_RSA_PUBEXPO(k) \
2777c478bd9Sstevel@tonic-gate 	&((k)->key_type_u.rsa_pub_key.pub_exponent)
2787c478bd9Sstevel@tonic-gate #define	OBJ_PUB_RSA_MOD_BITS(o) \
2797c478bd9Sstevel@tonic-gate 	((o)->object_class_u.public_key->key_type_u.rsa_pub_key.modulus_bits)
2807c478bd9Sstevel@tonic-gate #define	KEY_PUB_RSA_MOD_BITS(k) \
2817c478bd9Sstevel@tonic-gate 	((k)->key_type_u.rsa_pub_key.modulus_bits)
2827c478bd9Sstevel@tonic-gate 
2837c478bd9Sstevel@tonic-gate 
2847c478bd9Sstevel@tonic-gate /*
2857c478bd9Sstevel@tonic-gate  * DSA Public Key Object Attributes
2867c478bd9Sstevel@tonic-gate  */
2877c478bd9Sstevel@tonic-gate #define	KEY_PUB_DSA(k) \
2887c478bd9Sstevel@tonic-gate 	&((k)->key_type_u.dsa_pub_key)
2897c478bd9Sstevel@tonic-gate #define	OBJ_PUB_DSA_PRIME(o) \
2907c478bd9Sstevel@tonic-gate 	&((o)->object_class_u.public_key->key_type_u.dsa_pub_key.prime)
2917c478bd9Sstevel@tonic-gate #define	KEY_PUB_DSA_PRIME(k) \
2927c478bd9Sstevel@tonic-gate 	&((k)->key_type_u.dsa_pub_key.prime)
2937c478bd9Sstevel@tonic-gate #define	OBJ_PUB_DSA_SUBPRIME(o) \
2947c478bd9Sstevel@tonic-gate 	&((o)->object_class_u.public_key->key_type_u.dsa_pub_key.subprime)
2957c478bd9Sstevel@tonic-gate #define	KEY_PUB_DSA_SUBPRIME(k) \
2967c478bd9Sstevel@tonic-gate 	&((k)->key_type_u.dsa_pub_key.subprime)
2977c478bd9Sstevel@tonic-gate #define	OBJ_PUB_DSA_BASE(o) \
2987c478bd9Sstevel@tonic-gate 	&((o)->object_class_u.public_key->key_type_u.dsa_pub_key.base)
2997c478bd9Sstevel@tonic-gate #define	KEY_PUB_DSA_BASE(k) \
3007c478bd9Sstevel@tonic-gate 	&((k)->key_type_u.dsa_pub_key.base)
3017c478bd9Sstevel@tonic-gate #define	OBJ_PUB_DSA_VALUE(o) \
3027c478bd9Sstevel@tonic-gate 	&((o)->object_class_u.public_key->key_type_u.dsa_pub_key.value)
3037c478bd9Sstevel@tonic-gate #define	KEY_PUB_DSA_VALUE(k) \
3047c478bd9Sstevel@tonic-gate 	&((k)->key_type_u.dsa_pub_key.value)
3057c478bd9Sstevel@tonic-gate 
3067c478bd9Sstevel@tonic-gate 
307034448feSmcpowers /*
308034448feSmcpowers  * Diffie-Hellman Public Key Object Attributes
309034448feSmcpowers  */
310034448feSmcpowers #define	KEY_PUB_DH(k) \
311034448feSmcpowers 	&((k)->key_type_u.dh_pub_key)
312034448feSmcpowers #define	OBJ_PUB_DH_PRIME(o) \
313034448feSmcpowers 	&((o)->object_class_u.public_key->key_type_u.dh_pub_key.prime)
314034448feSmcpowers #define	KEY_PUB_DH_PRIME(k) \
315034448feSmcpowers 	&((k)->key_type_u.dh_pub_key.prime)
316034448feSmcpowers #define	OBJ_PUB_DH_BASE(o) \
317034448feSmcpowers 	&((o)->object_class_u.public_key->key_type_u.dh_pub_key.base)
318034448feSmcpowers #define	KEY_PUB_DH_BASE(k) \
319034448feSmcpowers 	&((k)->key_type_u.dh_pub_key.base)
320034448feSmcpowers #define	OBJ_PUB_DH_VALUE(o) \
321034448feSmcpowers 	&((o)->object_class_u.public_key->key_type_u.dh_pub_key.value)
322034448feSmcpowers #define	KEY_PUB_DH_VALUE(k) \
323034448feSmcpowers 	&((k)->key_type_u.dh_pub_key.value)
324034448feSmcpowers 
325034448feSmcpowers 
326034448feSmcpowers /*
327034448feSmcpowers  * EC Public Key Object Attributes
328034448feSmcpowers  */
329034448feSmcpowers #define	OBJ_PUB_EC_POINT(o) \
330034448feSmcpowers 	&((o)->object_class_u.public_key->key_type_u.ec_pub_key.point)
331034448feSmcpowers #define	KEY_PUB_EC_POINT(k) \
332034448feSmcpowers 	&((k)->key_type_u.ec_pub_key.point)
333034448feSmcpowers 
334034448feSmcpowers 
3357c478bd9Sstevel@tonic-gate /*
3367c478bd9Sstevel@tonic-gate  * RSA Private Key Object Attributes
3377c478bd9Sstevel@tonic-gate  */
3387c478bd9Sstevel@tonic-gate #define	OBJ_PRI(o) \
3397c478bd9Sstevel@tonic-gate 	((o)->object_class_u.private_key)
3407c478bd9Sstevel@tonic-gate #define	KEY_PRI_RSA(k) \
3417c478bd9Sstevel@tonic-gate 	&((k)->key_type_u.rsa_pri_key)
3427c478bd9Sstevel@tonic-gate #define	OBJ_PRI_RSA_MOD(o) \
3437c478bd9Sstevel@tonic-gate 	&((o)->object_class_u.private_key->key_type_u.rsa_pri_key.modulus)
3447c478bd9Sstevel@tonic-gate #define	KEY_PRI_RSA_MOD(k) \
3457c478bd9Sstevel@tonic-gate 	&((k)->key_type_u.rsa_pri_key.modulus)
3467c478bd9Sstevel@tonic-gate #define	OBJ_PRI_RSA_PUBEXPO(o) \
3477c478bd9Sstevel@tonic-gate 	&((o)->object_class_u.private_key->key_type_u.rsa_pri_key.pub_exponent)
3487c478bd9Sstevel@tonic-gate #define	KEY_PRI_RSA_PUBEXPO(k) \
3497c478bd9Sstevel@tonic-gate 	&((k)->key_type_u.rsa_pri_key.pub_exponent)
3507c478bd9Sstevel@tonic-gate #define	OBJ_PRI_RSA_PRIEXPO(o) \
3517c478bd9Sstevel@tonic-gate 	&((o)->object_class_u.private_key->key_type_u.rsa_pri_key.pri_exponent)
3527c478bd9Sstevel@tonic-gate #define	KEY_PRI_RSA_PRIEXPO(k) \
3537c478bd9Sstevel@tonic-gate 	&((k)->key_type_u.rsa_pri_key.pri_exponent)
3547c478bd9Sstevel@tonic-gate #define	OBJ_PRI_RSA_PRIME1(o) \
3557c478bd9Sstevel@tonic-gate 	&((o)->object_class_u.private_key->key_type_u.rsa_pri_key.prime_1)
3567c478bd9Sstevel@tonic-gate #define	KEY_PRI_RSA_PRIME1(k) \
3577c478bd9Sstevel@tonic-gate 	&((k)->key_type_u.rsa_pri_key.prime_1)
3587c478bd9Sstevel@tonic-gate #define	OBJ_PRI_RSA_PRIME2(o) \
3597c478bd9Sstevel@tonic-gate 	&((o)->object_class_u.private_key->key_type_u.rsa_pri_key.prime_2)
3607c478bd9Sstevel@tonic-gate #define	KEY_PRI_RSA_PRIME2(k) \
3617c478bd9Sstevel@tonic-gate 	&((k)->key_type_u.rsa_pri_key.prime_2)
3627c478bd9Sstevel@tonic-gate #define	OBJ_PRI_RSA_EXPO1(o) \
3637c478bd9Sstevel@tonic-gate 	&((o)->object_class_u.private_key->key_type_u.rsa_pri_key.exponent_1)
3647c478bd9Sstevel@tonic-gate #define	KEY_PRI_RSA_EXPO1(k) \
3657c478bd9Sstevel@tonic-gate 	&((k)->key_type_u.rsa_pri_key.exponent_1)
3667c478bd9Sstevel@tonic-gate #define	OBJ_PRI_RSA_EXPO2(o) \
3677c478bd9Sstevel@tonic-gate 	&((o)->object_class_u.private_key->key_type_u.rsa_pri_key.exponent_2)
3687c478bd9Sstevel@tonic-gate #define	KEY_PRI_RSA_EXPO2(k) \
3697c478bd9Sstevel@tonic-gate 	&((k)->key_type_u.rsa_pri_key.exponent_2)
3707c478bd9Sstevel@tonic-gate #define	OBJ_PRI_RSA_COEF(o) \
3717c478bd9Sstevel@tonic-gate 	&((o)->object_class_u.private_key->key_type_u.rsa_pri_key.coefficient)
3727c478bd9Sstevel@tonic-gate #define	KEY_PRI_RSA_COEF(k) \
3737c478bd9Sstevel@tonic-gate 	&((k)->key_type_u.rsa_pri_key.coefficient)
3747c478bd9Sstevel@tonic-gate 
3757c478bd9Sstevel@tonic-gate /*
3767c478bd9Sstevel@tonic-gate  * DSA Private Key Object Attributes
3777c478bd9Sstevel@tonic-gate  */
3787c478bd9Sstevel@tonic-gate #define	KEY_PRI_DSA(k) \
3797c478bd9Sstevel@tonic-gate 	&((k)->key_type_u.dsa_pri_key)
3807c478bd9Sstevel@tonic-gate #define	OBJ_PRI_DSA_PRIME(o) \
3817c478bd9Sstevel@tonic-gate 	&((o)->object_class_u.private_key->key_type_u.dsa_pri_key.prime)
3827c478bd9Sstevel@tonic-gate #define	KEY_PRI_DSA_PRIME(k) \
3837c478bd9Sstevel@tonic-gate 	&((k)->key_type_u.dsa_pri_key.prime)
3847c478bd9Sstevel@tonic-gate #define	OBJ_PRI_DSA_SUBPRIME(o) \
3857c478bd9Sstevel@tonic-gate 	&((o)->object_class_u.private_key->key_type_u.dsa_pri_key.subprime)
3867c478bd9Sstevel@tonic-gate #define	KEY_PRI_DSA_SUBPRIME(k) \
3877c478bd9Sstevel@tonic-gate 	&((k)->key_type_u.dsa_pri_key.subprime)
3887c478bd9Sstevel@tonic-gate #define	OBJ_PRI_DSA_BASE(o) \
3897c478bd9Sstevel@tonic-gate 	&((o)->object_class_u.private_key->key_type_u.dsa_pri_key.base)
3907c478bd9Sstevel@tonic-gate #define	KEY_PRI_DSA_BASE(k) \
3917c478bd9Sstevel@tonic-gate 	&((k)->key_type_u.dsa_pri_key.base)
3927c478bd9Sstevel@tonic-gate #define	OBJ_PRI_DSA_VALUE(o) \
3937c478bd9Sstevel@tonic-gate 	&((o)->object_class_u.private_key->key_type_u.dsa_pri_key.value)
3947c478bd9Sstevel@tonic-gate #define	KEY_PRI_DSA_VALUE(k) \
3957c478bd9Sstevel@tonic-gate 	&((k)->key_type_u.dsa_pri_key.value)
3967c478bd9Sstevel@tonic-gate 
397034448feSmcpowers /*
398034448feSmcpowers  * Diffie-Hellman Private Key Object Attributes
399034448feSmcpowers  */
400034448feSmcpowers #define	KEY_PRI_DH(k) \
401034448feSmcpowers 	&((k)->key_type_u.dh_pri_key)
402034448feSmcpowers #define	OBJ_PRI_DH_PRIME(o) \
403034448feSmcpowers 	&((o)->object_class_u.private_key->key_type_u.dh_pri_key.prime)
404034448feSmcpowers #define	KEY_PRI_DH_PRIME(k) \
405034448feSmcpowers 	&((k)->key_type_u.dh_pri_key.prime)
406034448feSmcpowers #define	OBJ_PRI_DH_BASE(o) \
407034448feSmcpowers 	&((o)->object_class_u.private_key->key_type_u.dh_pri_key.base)
408034448feSmcpowers #define	KEY_PRI_DH_BASE(k) \
409034448feSmcpowers 	&((k)->key_type_u.dh_pri_key.base)
410034448feSmcpowers #define	OBJ_PRI_DH_VALUE(o) \
411034448feSmcpowers 	&((o)->object_class_u.private_key->key_type_u.dh_pri_key.value)
412034448feSmcpowers #define	KEY_PRI_DH_VALUE(k) \
413034448feSmcpowers 	&((k)->key_type_u.dh_pri_key.value)
414034448feSmcpowers #define	OBJ_PRI_DH_VAL_BITS(o) \
415034448feSmcpowers 	((o)->object_class_u.private_key->key_type_u.dh_pri_key.value_bits)
416034448feSmcpowers #define	KEY_PRI_DH_VAL_BITS(k) \
417034448feSmcpowers 	((k)->key_type_u.dh_pri_key.value_bits)
418034448feSmcpowers 
419034448feSmcpowers /*
420034448feSmcpowers  * EC Private Key Object Attributes
421034448feSmcpowers  */
422034448feSmcpowers #define	OBJ_PRI_EC_VALUE(o) \
423034448feSmcpowers 	&((o)->object_class_u.private_key->key_type_u.ec_pri_key.value)
424034448feSmcpowers #define	KEY_PRI_EC_VALUE(k) \
425034448feSmcpowers 	&((k)->key_type_u.ec_pri_key.value)
426034448feSmcpowers 
4277c478bd9Sstevel@tonic-gate /*
4287c478bd9Sstevel@tonic-gate  * key related attributes with CK_BBOOL data type
4297c478bd9Sstevel@tonic-gate  */
4307c478bd9Sstevel@tonic-gate #define	DERIVE_BOOL_ON			0x00000001
4317c478bd9Sstevel@tonic-gate #define	LOCAL_BOOL_ON			0x00000002
4327c478bd9Sstevel@tonic-gate #define	SENSITIVE_BOOL_ON		0x00000004
4337c478bd9Sstevel@tonic-gate #define	SECONDARY_AUTH_BOOL_ON		0x00000008
4347c478bd9Sstevel@tonic-gate #define	ENCRYPT_BOOL_ON			0x00000010
4357c478bd9Sstevel@tonic-gate #define	DECRYPT_BOOL_ON			0x00000020
4367c478bd9Sstevel@tonic-gate #define	SIGN_BOOL_ON			0x00000040
4377c478bd9Sstevel@tonic-gate #define	SIGN_RECOVER_BOOL_ON		0x00000080
4387c478bd9Sstevel@tonic-gate #define	VERIFY_BOOL_ON			0x00000100
4397c478bd9Sstevel@tonic-gate #define	VERIFY_RECOVER_BOOL_ON		0x00000200
4407c478bd9Sstevel@tonic-gate #define	WRAP_BOOL_ON			0x00000400
4417c478bd9Sstevel@tonic-gate #define	UNWRAP_BOOL_ON			0x00000800
4427c478bd9Sstevel@tonic-gate #define	TRUSTED_BOOL_ON			0x00001000
4437c478bd9Sstevel@tonic-gate #define	EXTRACTABLE_BOOL_ON		0x00002000
4447c478bd9Sstevel@tonic-gate #define	ALWAYS_SENSITIVE_BOOL_ON	0x00004000
4457c478bd9Sstevel@tonic-gate #define	NEVER_EXTRACTABLE_BOOL_ON	0x00008000
4467c478bd9Sstevel@tonic-gate #define	PRIVATE_BOOL_ON			0x00010000
4477c478bd9Sstevel@tonic-gate #define	TOKEN_BOOL_ON			0x00020000
4487c478bd9Sstevel@tonic-gate #define	MODIFIABLE_BOOL_ON		0x00040000
4497c478bd9Sstevel@tonic-gate 
4507c478bd9Sstevel@tonic-gate #define	SECRET_KEY_DEFAULT	(ENCRYPT_BOOL_ON|\
4517c478bd9Sstevel@tonic-gate 				DECRYPT_BOOL_ON|\
4527c478bd9Sstevel@tonic-gate 				SIGN_BOOL_ON|\
4537c478bd9Sstevel@tonic-gate 				VERIFY_BOOL_ON|\
454*d288ba74SAnthony Scarpino 				WRAP_BOOL_ON|\
455*d288ba74SAnthony Scarpino 				UNWRAP_BOOL_ON|\
4567c478bd9Sstevel@tonic-gate 				EXTRACTABLE_BOOL_ON|\
4577c478bd9Sstevel@tonic-gate 				MODIFIABLE_BOOL_ON)
4587c478bd9Sstevel@tonic-gate 
4597c478bd9Sstevel@tonic-gate #define	PUBLIC_KEY_DEFAULT	(ENCRYPT_BOOL_ON|\
460*d288ba74SAnthony Scarpino 				WRAP_BOOL_ON|\
4617c478bd9Sstevel@tonic-gate 				VERIFY_BOOL_ON|\
4627c478bd9Sstevel@tonic-gate 				VERIFY_RECOVER_BOOL_ON|\
4637c478bd9Sstevel@tonic-gate 				MODIFIABLE_BOOL_ON)
4647c478bd9Sstevel@tonic-gate 
4657c478bd9Sstevel@tonic-gate #define	PRIVATE_KEY_DEFAULT	(DECRYPT_BOOL_ON|\
466*d288ba74SAnthony Scarpino 				UNWRAP_BOOL_ON|\
4677c478bd9Sstevel@tonic-gate 				SIGN_BOOL_ON|\
4687c478bd9Sstevel@tonic-gate 				SIGN_RECOVER_BOOL_ON|\
4697c478bd9Sstevel@tonic-gate 				EXTRACTABLE_BOOL_ON|\
4707c478bd9Sstevel@tonic-gate 				MODIFIABLE_BOOL_ON)
4717c478bd9Sstevel@tonic-gate 
47201223cbaSmcpowers /*
47301223cbaSmcpowers  * Flag definitions for obj_delete_sync
47401223cbaSmcpowers  */
47501223cbaSmcpowers #define	OBJECT_IS_DELETING	1	/* Object is in a deleting state */
47601223cbaSmcpowers #define	OBJECT_REFCNT_WAITING	2	/* Waiting for object reference */
47701223cbaSmcpowers 					/* count to become zero */
47801223cbaSmcpowers 
4797c478bd9Sstevel@tonic-gate /*
4807c478bd9Sstevel@tonic-gate  * This macro is used to type cast an object handle to a pointer to
4817c478bd9Sstevel@tonic-gate  * the object struct. Also, it checks to see if the object struct
4827c478bd9Sstevel@tonic-gate  * is tagged with an object magic number. This is to detect when an
4837c478bd9Sstevel@tonic-gate  * application passes a bogus object pointer.
48401223cbaSmcpowers  * Also, it checks to see if the object is in the deleting state that
48501223cbaSmcpowers  * another thread is performing. If not, increment the object reference
48601223cbaSmcpowers  * count by one. This is to prevent this object from being deleted by
48701223cbaSmcpowers  * other thread.
4887c478bd9Sstevel@tonic-gate  */
48901223cbaSmcpowers #define	HANDLE2OBJECT_COMMON(hObject, object_p, rv, REFCNT_CODE) { \
49001223cbaSmcpowers 	object_p = (kernel_object_t *)(hObject); \
49101223cbaSmcpowers 	if ((object_p == NULL) || \
49201223cbaSmcpowers 		(object_p->magic_marker != KERNELTOKEN_OBJECT_MAGIC)) {\
49301223cbaSmcpowers 			rv = CKR_OBJECT_HANDLE_INVALID; \
4947c478bd9Sstevel@tonic-gate 	} else { \
49501223cbaSmcpowers 		(void) pthread_mutex_lock(&object_p->object_mutex); \
49601223cbaSmcpowers 		if (!(object_p->obj_delete_sync & OBJECT_IS_DELETING)) { \
49701223cbaSmcpowers 			REFCNT_CODE; \
49801223cbaSmcpowers 			rv = CKR_OK; \
49901223cbaSmcpowers 		} else { \
50001223cbaSmcpowers 			rv = CKR_OBJECT_HANDLE_INVALID; \
50101223cbaSmcpowers 		} \
50201223cbaSmcpowers 		(void) pthread_mutex_unlock(&object_p->object_mutex); \
50301223cbaSmcpowers 	} \
50401223cbaSmcpowers }
50501223cbaSmcpowers 
50601223cbaSmcpowers #define	HANDLE2OBJECT(hObject, object_p, rv) \
50701223cbaSmcpowers 	HANDLE2OBJECT_COMMON(hObject, object_p, rv, object_p->obj_refcnt++)
50801223cbaSmcpowers 
50901223cbaSmcpowers #define	HANDLE2OBJECT_DESTROY(hObject, object_p, rv) \
51001223cbaSmcpowers 	HANDLE2OBJECT_COMMON(hObject, object_p, rv, /* no refcnt increment */)
51101223cbaSmcpowers 
51201223cbaSmcpowers 
51301223cbaSmcpowers #define	OBJ_REFRELE(object_p) { \
51401223cbaSmcpowers 	(void) pthread_mutex_lock(&object_p->object_mutex); \
51501223cbaSmcpowers 	if ((--object_p->obj_refcnt) == 0 && \
51601223cbaSmcpowers 	    (object_p->obj_delete_sync & OBJECT_REFCNT_WAITING)) { \
51701223cbaSmcpowers 		(void) pthread_cond_signal(&object_p->obj_free_cond); \
51801223cbaSmcpowers 	} \
51901223cbaSmcpowers 	(void) pthread_mutex_unlock(&object_p->object_mutex); \
52001223cbaSmcpowers }
52101223cbaSmcpowers 
5227c478bd9Sstevel@tonic-gate 
5237c478bd9Sstevel@tonic-gate /*
5247c478bd9Sstevel@tonic-gate  * Function Prototypes.
5257c478bd9Sstevel@tonic-gate  */
5267c478bd9Sstevel@tonic-gate void kernel_cleanup_object(kernel_object_t *objp);
5277c478bd9Sstevel@tonic-gate 
5287c478bd9Sstevel@tonic-gate CK_RV kernel_add_object(CK_ATTRIBUTE_PTR pTemplate,  CK_ULONG ulCount,
5297c478bd9Sstevel@tonic-gate     CK_ULONG *objecthandle_p, kernel_session_t *sp);
5307c478bd9Sstevel@tonic-gate 
5317c478bd9Sstevel@tonic-gate CK_RV kernel_delete_session_object(kernel_session_t *sp, kernel_object_t *objp,
5327c478bd9Sstevel@tonic-gate     boolean_t lock_held, boolean_t wrapper_only);
5337c478bd9Sstevel@tonic-gate 
5347c478bd9Sstevel@tonic-gate void kernel_cleanup_extra_attr(kernel_object_t *object_p);
5357c478bd9Sstevel@tonic-gate 
5367c478bd9Sstevel@tonic-gate CK_RV kernel_copy_extra_attr(CK_ATTRIBUTE_INFO_PTR old_attrp,
5377c478bd9Sstevel@tonic-gate     kernel_object_t *object_p);
5387c478bd9Sstevel@tonic-gate 
5397c478bd9Sstevel@tonic-gate void kernel_cleanup_object_bigint_attrs(kernel_object_t *object_p);
5407c478bd9Sstevel@tonic-gate 
541034448feSmcpowers CK_RV kernel_build_object(CK_ATTRIBUTE_PTR template, CK_ULONG ulAttrNum,
542034448feSmcpowers     kernel_object_t *new_object, kernel_session_t *sp, uint_t);
5437c478bd9Sstevel@tonic-gate 
5447c478bd9Sstevel@tonic-gate CK_RV kernel_copy_object(kernel_object_t *old_object,
5457c478bd9Sstevel@tonic-gate     kernel_object_t **new_object, boolean_t copy_everything,
5467c478bd9Sstevel@tonic-gate     kernel_session_t *sp);
5477c478bd9Sstevel@tonic-gate 
5487c478bd9Sstevel@tonic-gate void kernel_merge_object(kernel_object_t *old_object,
5497c478bd9Sstevel@tonic-gate     kernel_object_t *new_object);
5507c478bd9Sstevel@tonic-gate 
5517c478bd9Sstevel@tonic-gate CK_RV kernel_get_attribute(kernel_object_t *object_p,
5527c478bd9Sstevel@tonic-gate     CK_ATTRIBUTE_PTR template);
5537c478bd9Sstevel@tonic-gate 
5547c478bd9Sstevel@tonic-gate CK_RV kernel_set_attribute(kernel_object_t *object_p,
5557c478bd9Sstevel@tonic-gate     CK_ATTRIBUTE_PTR template, boolean_t copy, kernel_session_t *sp);
5567c478bd9Sstevel@tonic-gate 
5577c478bd9Sstevel@tonic-gate void copy_bigint_attr(biginteger_t *src, biginteger_t *dst);
5587c478bd9Sstevel@tonic-gate 
5597c478bd9Sstevel@tonic-gate void kernel_add_object_to_session(kernel_object_t *objp, kernel_session_t *sp);
5607c478bd9Sstevel@tonic-gate 
5617c478bd9Sstevel@tonic-gate CK_RV kernel_copy_public_key_attr(public_key_obj_t *old_pub_key_obj_p,
5627c478bd9Sstevel@tonic-gate     public_key_obj_t **new_pub_key_obj_p, CK_KEY_TYPE key_type);
5637c478bd9Sstevel@tonic-gate 
5647c478bd9Sstevel@tonic-gate CK_RV kernel_copy_private_key_attr(private_key_obj_t *old_pri_key_obj_p,
5657c478bd9Sstevel@tonic-gate     private_key_obj_t **new_pri_key_obj_p, CK_KEY_TYPE key_type);
5667c478bd9Sstevel@tonic-gate 
5677c478bd9Sstevel@tonic-gate CK_RV kernel_copy_secret_key_attr(secret_key_obj_t *old_secret_key_obj_p,
5687c478bd9Sstevel@tonic-gate     secret_key_obj_t **new_secret_key_obj_p);
5697c478bd9Sstevel@tonic-gate 
5707c478bd9Sstevel@tonic-gate CK_RV kernel_validate_attr(CK_ATTRIBUTE_PTR template, CK_ULONG ulAttrNum,
5717c478bd9Sstevel@tonic-gate     CK_OBJECT_CLASS *class);
5727c478bd9Sstevel@tonic-gate 
5737c478bd9Sstevel@tonic-gate CK_RV kernel_find_objects_init(kernel_session_t *sp,
5747c478bd9Sstevel@tonic-gate     CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount);
5757c478bd9Sstevel@tonic-gate 
5767c478bd9Sstevel@tonic-gate void kernel_find_objects_final(kernel_session_t *sp);
5777c478bd9Sstevel@tonic-gate 
5787c478bd9Sstevel@tonic-gate void kernel_find_objects(kernel_session_t *sp,
5797c478bd9Sstevel@tonic-gate     CK_OBJECT_HANDLE *obj_found, CK_ULONG max_obj_requested,
5807c478bd9Sstevel@tonic-gate     CK_ULONG *found_obj_count);
5817c478bd9Sstevel@tonic-gate 
5827c478bd9Sstevel@tonic-gate void kernel_process_find_attr(CK_OBJECT_CLASS *pclasses,
5837c478bd9Sstevel@tonic-gate     CK_ULONG *num_result_pclasses, CK_ATTRIBUTE_PTR pTemplate,
5847c478bd9Sstevel@tonic-gate     CK_ULONG ulCount);
5857c478bd9Sstevel@tonic-gate 
5867c478bd9Sstevel@tonic-gate boolean_t kernel_find_match_attrs(kernel_object_t *obj,
5877c478bd9Sstevel@tonic-gate     CK_OBJECT_CLASS *pclasses, CK_ULONG num_pclasses,
5887c478bd9Sstevel@tonic-gate     CK_ATTRIBUTE *tmpl_attr, CK_ULONG num_attr);
5897c478bd9Sstevel@tonic-gate 
5907c478bd9Sstevel@tonic-gate CK_ATTRIBUTE_PTR get_extra_attr(CK_ATTRIBUTE_TYPE type, kernel_object_t *obj);
5917c478bd9Sstevel@tonic-gate 
5927c478bd9Sstevel@tonic-gate CK_RV get_string_from_template(CK_ATTRIBUTE_PTR dest, CK_ATTRIBUTE_PTR src);
5937c478bd9Sstevel@tonic-gate 
5947c478bd9Sstevel@tonic-gate void string_attr_cleanup(CK_ATTRIBUTE_PTR template);
5957c478bd9Sstevel@tonic-gate 
5967c478bd9Sstevel@tonic-gate void kernel_add_token_object_to_slot(kernel_object_t *objp,
5977c478bd9Sstevel@tonic-gate     kernel_slot_t *pslot);
5987c478bd9Sstevel@tonic-gate 
5997c478bd9Sstevel@tonic-gate void kernel_remove_token_object_from_slot(kernel_slot_t *pslot,
6007c478bd9Sstevel@tonic-gate     kernel_object_t *objp);
6017c478bd9Sstevel@tonic-gate 
6027c478bd9Sstevel@tonic-gate CK_RV kernel_delete_token_object(kernel_slot_t *pslot, kernel_session_t *sp,
6037c478bd9Sstevel@tonic-gate     kernel_object_t *obj, boolean_t lock_held, boolean_t wrapper_only);
6047c478bd9Sstevel@tonic-gate 
6057c478bd9Sstevel@tonic-gate void kernel_cleanup_pri_objects_in_slot(kernel_slot_t *pslot,
6067c478bd9Sstevel@tonic-gate     kernel_session_t *sp);
6077c478bd9Sstevel@tonic-gate 
6087c478bd9Sstevel@tonic-gate CK_RV kernel_get_object_size(kernel_object_t *objp, CK_ULONG_PTR pulSize);
6097c478bd9Sstevel@tonic-gate 
61001223cbaSmcpowers void kernel_object_delay_free(kernel_object_t *objp);
61101223cbaSmcpowers 
6127c478bd9Sstevel@tonic-gate #ifdef	__cplusplus
6137c478bd9Sstevel@tonic-gate }
6147c478bd9Sstevel@tonic-gate #endif
6157c478bd9Sstevel@tonic-gate 
6167c478bd9Sstevel@tonic-gate #endif /* _KERNELOBJECT_H */
617