xref: /onnv-gate/usr/src/lib/pkcs11/pkcs11_kernel/common/kernelObject.h (revision 9341:e32192a0f3a4)
10Sstevel@tonic-gate /*
20Sstevel@tonic-gate  * CDDL HEADER START
30Sstevel@tonic-gate  *
40Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
54219Smcpowers  * Common Development and Distribution License (the "License").
64219Smcpowers  * You may not use this file except in compliance with the License.
70Sstevel@tonic-gate  *
80Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
90Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
100Sstevel@tonic-gate  * See the License for the specific language governing permissions
110Sstevel@tonic-gate  * and limitations under the License.
120Sstevel@tonic-gate  *
130Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
140Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
150Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
160Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
170Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
180Sstevel@tonic-gate  *
190Sstevel@tonic-gate  * CDDL HEADER END
200Sstevel@tonic-gate  */
210Sstevel@tonic-gate /*
22*9341SAnthony.Scarpino@Sun.COM  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
230Sstevel@tonic-gate  * Use is subject to license terms.
240Sstevel@tonic-gate  */
250Sstevel@tonic-gate 
260Sstevel@tonic-gate #ifndef	_KERNELOBJECT_H
270Sstevel@tonic-gate #define	_KERNELOBJECT_H
280Sstevel@tonic-gate 
290Sstevel@tonic-gate #ifdef __cplusplus
300Sstevel@tonic-gate extern "C" {
310Sstevel@tonic-gate #endif
320Sstevel@tonic-gate 
330Sstevel@tonic-gate #include <security/pkcs11t.h>
340Sstevel@tonic-gate #include "kernelSession.h"
350Sstevel@tonic-gate #include "kernelSlot.h"
360Sstevel@tonic-gate 
370Sstevel@tonic-gate #define	KERNELTOKEN_OBJECT_MAGIC	0xECF0B003
380Sstevel@tonic-gate 
394219Smcpowers #define	KERNEL_CREATE_OBJ	1
404219Smcpowers #define	KERNEL_GEN_KEY		2
414219Smcpowers 
420Sstevel@tonic-gate #define	RSA_PRI_ATTR_COUNT		7
430Sstevel@tonic-gate #define	RSA_PUB_ATTR_COUNT		3
440Sstevel@tonic-gate #define	DSA_ATTR_COUNT			4
455072Smcpowers #define	EC_ATTR_COUNT			2
460Sstevel@tonic-gate 
470Sstevel@tonic-gate /*
480Sstevel@tonic-gate  * Secret key Struct
490Sstevel@tonic-gate  */
500Sstevel@tonic-gate typedef struct secret_key_obj {
510Sstevel@tonic-gate 	CK_BYTE *sk_value;
520Sstevel@tonic-gate 	CK_ULONG sk_value_len;
530Sstevel@tonic-gate } secret_key_obj_t;
540Sstevel@tonic-gate 
550Sstevel@tonic-gate 
560Sstevel@tonic-gate /*
570Sstevel@tonic-gate  * This structure is used to hold the attributes in the
580Sstevel@tonic-gate  * Extra Attribute List.
590Sstevel@tonic-gate  */
600Sstevel@tonic-gate typedef struct attribute_info {
610Sstevel@tonic-gate 	CK_ATTRIBUTE	attr;
620Sstevel@tonic-gate 	struct attribute_info *next;
630Sstevel@tonic-gate } attribute_info_t;
640Sstevel@tonic-gate 
650Sstevel@tonic-gate typedef attribute_info_t *CK_ATTRIBUTE_INFO_PTR;
660Sstevel@tonic-gate 
670Sstevel@tonic-gate 
680Sstevel@tonic-gate /*
690Sstevel@tonic-gate  * biginteger Struct
700Sstevel@tonic-gate  */
710Sstevel@tonic-gate typedef struct biginteger {
720Sstevel@tonic-gate 	CK_BYTE *big_value;
730Sstevel@tonic-gate 	CK_ULONG big_value_len;
740Sstevel@tonic-gate } biginteger_t;
750Sstevel@tonic-gate 
760Sstevel@tonic-gate 
770Sstevel@tonic-gate /*
780Sstevel@tonic-gate  * PKCS11: RSA Public Key Object Attributes
790Sstevel@tonic-gate  */
800Sstevel@tonic-gate typedef struct rsa_pub_key {
810Sstevel@tonic-gate 	biginteger_t modulus;
820Sstevel@tonic-gate 	CK_ULONG modulus_bits;
830Sstevel@tonic-gate 	biginteger_t pub_exponent;
840Sstevel@tonic-gate } rsa_pub_key_t;
850Sstevel@tonic-gate 
860Sstevel@tonic-gate 
870Sstevel@tonic-gate /*
880Sstevel@tonic-gate  * PKCS11: DSA Public Key Object Attributes
890Sstevel@tonic-gate  */
900Sstevel@tonic-gate typedef struct dsa_pub_key {
910Sstevel@tonic-gate 	biginteger_t prime;
920Sstevel@tonic-gate 	biginteger_t subprime;
930Sstevel@tonic-gate 	biginteger_t base;
940Sstevel@tonic-gate 	biginteger_t value;
950Sstevel@tonic-gate } dsa_pub_key_t;
960Sstevel@tonic-gate 
974219Smcpowers /*
984219Smcpowers  * PKCS11: Diffie-Hellman Public Key Object Attributes
994219Smcpowers  */
1004219Smcpowers typedef struct dh_pub_key {
1014219Smcpowers 	biginteger_t prime;
1024219Smcpowers 	biginteger_t base;
1034219Smcpowers 	biginteger_t value;
1044219Smcpowers } dh_pub_key_t;
1054219Smcpowers 
1064219Smcpowers /*
1074219Smcpowers  * PKCS11: EC Public Key Object Attributes
1084219Smcpowers  */
1094219Smcpowers typedef struct ec_pub_key {
1104219Smcpowers 	biginteger_t point;
1114219Smcpowers } ec_pub_key_t;
1124219Smcpowers 
1130Sstevel@tonic-gate 
1140Sstevel@tonic-gate /*
1150Sstevel@tonic-gate  * Public Key Main Struct
1160Sstevel@tonic-gate  */
1170Sstevel@tonic-gate typedef struct public_key_obj {
1180Sstevel@tonic-gate 	union {
1190Sstevel@tonic-gate 		rsa_pub_key_t rsa_pub_key; /* RSA public key */
1200Sstevel@tonic-gate 		dsa_pub_key_t dsa_pub_key; /* DSA public key */
1214219Smcpowers 		dh_pub_key_t dh_pub_key; /* DH public key */
1224219Smcpowers 		ec_pub_key_t ec_pub_key; /* EC public key */
1230Sstevel@tonic-gate 	} key_type_u;
1240Sstevel@tonic-gate } public_key_obj_t;
1250Sstevel@tonic-gate 
1260Sstevel@tonic-gate 
1270Sstevel@tonic-gate /*
1280Sstevel@tonic-gate  * PKCS11: RSA Private Key Object Attributes
1290Sstevel@tonic-gate  */
1300Sstevel@tonic-gate typedef struct rsa_pri_key {
1310Sstevel@tonic-gate 	biginteger_t modulus;
1320Sstevel@tonic-gate 	biginteger_t pub_exponent;
1330Sstevel@tonic-gate 	biginteger_t pri_exponent;
1340Sstevel@tonic-gate 	biginteger_t prime_1;
1350Sstevel@tonic-gate 	biginteger_t prime_2;
1360Sstevel@tonic-gate 	biginteger_t exponent_1;
1370Sstevel@tonic-gate 	biginteger_t exponent_2;
1380Sstevel@tonic-gate 	biginteger_t coefficient;
1390Sstevel@tonic-gate } rsa_pri_key_t;
1400Sstevel@tonic-gate 
1410Sstevel@tonic-gate 
1420Sstevel@tonic-gate /*
1430Sstevel@tonic-gate  * PKCS11: DSA Private Key Object Attributes
1440Sstevel@tonic-gate  */
1450Sstevel@tonic-gate typedef struct dsa_pri_key {
1460Sstevel@tonic-gate 	biginteger_t prime;
1470Sstevel@tonic-gate 	biginteger_t subprime;
1480Sstevel@tonic-gate 	biginteger_t base;
1490Sstevel@tonic-gate 	biginteger_t value;
1500Sstevel@tonic-gate } dsa_pri_key_t;
1510Sstevel@tonic-gate 
1520Sstevel@tonic-gate 
1530Sstevel@tonic-gate /*
1544219Smcpowers  * PKCS11: Diffie-Hellman Private Key Object Attributes
1554219Smcpowers  */
1564219Smcpowers typedef struct dh_pri_key {
1574219Smcpowers 	biginteger_t prime;
1584219Smcpowers 	biginteger_t base;
1594219Smcpowers 	biginteger_t value;
1604219Smcpowers 	CK_ULONG value_bits;
1614219Smcpowers } dh_pri_key_t;
1624219Smcpowers 
1634219Smcpowers 
1644219Smcpowers /*
1654219Smcpowers  * PKCS11: EC Private Key Object Attributes
1664219Smcpowers  */
1674219Smcpowers typedef struct ec_pri_key {
1684219Smcpowers 	biginteger_t value;
1694219Smcpowers } ec_pri_key_t;
1704219Smcpowers 
1714219Smcpowers /*
1720Sstevel@tonic-gate  * Private Key Main Struct
1730Sstevel@tonic-gate  */
1740Sstevel@tonic-gate typedef struct private_key_obj {
1750Sstevel@tonic-gate 	union {
1760Sstevel@tonic-gate 		rsa_pri_key_t rsa_pri_key; /* RSA private key */
1770Sstevel@tonic-gate 		dsa_pri_key_t dsa_pri_key; /* DSA private key */
1784219Smcpowers 		dh_pri_key_t dh_pri_key; /* DH private key */
1794219Smcpowers 		ec_pri_key_t ec_pri_key; /* EC private key */
1800Sstevel@tonic-gate 	} key_type_u;
1810Sstevel@tonic-gate } private_key_obj_t;
1820Sstevel@tonic-gate 
1830Sstevel@tonic-gate 
1840Sstevel@tonic-gate /*
1850Sstevel@tonic-gate  * This is the main structure of the Objects.
1860Sstevel@tonic-gate  */
1870Sstevel@tonic-gate typedef struct object {
1880Sstevel@tonic-gate 	boolean_t	is_lib_obj; /* default is TRUE */
1890Sstevel@tonic-gate 	crypto_object_id_t	k_handle;
1900Sstevel@tonic-gate 
1910Sstevel@tonic-gate 	/* Generic common fields. Always present */
1920Sstevel@tonic-gate 	CK_OBJECT_CLASS class;
1930Sstevel@tonic-gate 	CK_KEY_TYPE key_type;
1940Sstevel@tonic-gate 	CK_ULONG magic_marker;
1950Sstevel@tonic-gate 	uint64_t bool_attr_mask;
1960Sstevel@tonic-gate 	CK_MECHANISM_TYPE mechanism;
1970Sstevel@tonic-gate 
1980Sstevel@tonic-gate 	/* Fields for access and arbitration */
1990Sstevel@tonic-gate 	pthread_mutex_t object_mutex;
2000Sstevel@tonic-gate 	struct object *next;
2010Sstevel@tonic-gate 	struct object *prev;
2020Sstevel@tonic-gate 
2030Sstevel@tonic-gate 	/* Extra non-boolean attribute list */
2040Sstevel@tonic-gate 	CK_ATTRIBUTE_INFO_PTR extra_attrlistp;
2050Sstevel@tonic-gate 	CK_ULONG extra_attrcount;
2060Sstevel@tonic-gate 
2070Sstevel@tonic-gate 	/* For each object, only one object class is presented */
2080Sstevel@tonic-gate 	union {
2090Sstevel@tonic-gate 		secret_key_obj_t  *secret_key;
2100Sstevel@tonic-gate 		public_key_obj_t  *public_key;
2110Sstevel@tonic-gate 		private_key_obj_t *private_key;
2120Sstevel@tonic-gate 	} object_class_u;
2130Sstevel@tonic-gate 
2140Sstevel@tonic-gate 	/* Session handle that the object belongs to */
2150Sstevel@tonic-gate 	CK_SESSION_HANDLE	session_handle;
216214Smcpowers 	uint32_t	obj_refcnt;	/* object reference count */
217214Smcpowers 	pthread_cond_t	obj_free_cond;	/* cond variable for signal and wait */
218214Smcpowers 	uint32_t	obj_delete_sync;	/* object delete sync flags */
2190Sstevel@tonic-gate 
2200Sstevel@tonic-gate } kernel_object_t;
2210Sstevel@tonic-gate 
2220Sstevel@tonic-gate 
2230Sstevel@tonic-gate typedef struct find_context {
2240Sstevel@tonic-gate 	kernel_object_t **objs_found;
2250Sstevel@tonic-gate 	CK_ULONG num_results;
2260Sstevel@tonic-gate 	CK_ULONG next_result_index; /* next result object to return */
2270Sstevel@tonic-gate } find_context_t;
2280Sstevel@tonic-gate 
2290Sstevel@tonic-gate /*
230214Smcpowers  * The following structure is used to link the to-be-freed session
231214Smcpowers  * objects into a linked list. The objects on this linked list have
232214Smcpowers  * not yet been freed via free() after C_DestroyObject() call; instead
233214Smcpowers  * they are added to this list. The actual free will take place when
234214Smcpowers  * the number of objects queued reaches MAX_OBJ_TO_BE_FREED, at which
235214Smcpowers  * time the first object in the list will be freed.
236214Smcpowers  */
237214Smcpowers #define	MAX_OBJ_TO_BE_FREED		300
238214Smcpowers 
239214Smcpowers typedef struct obj_to_be_freed_list {
240214Smcpowers 	kernel_object_t	*first;	/* points to first obj in the list */
241214Smcpowers 	kernel_object_t	*last;	/* points to last obj in the list */
242214Smcpowers 	uint32_t	count;	/* current total objs in the list */
243214Smcpowers 	pthread_mutex_t obj_to_be_free_mutex;
244214Smcpowers } object_to_be_freed_list_t;
245214Smcpowers 
246214Smcpowers extern object_to_be_freed_list_t obj_delay_freed;
247214Smcpowers 
248214Smcpowers 
249214Smcpowers /*
2500Sstevel@tonic-gate  * The following definitions are the shortcuts
2510Sstevel@tonic-gate  */
2520Sstevel@tonic-gate 
2530Sstevel@tonic-gate /*
2540Sstevel@tonic-gate  * Secret Key Object Attributes
2550Sstevel@tonic-gate  */
2560Sstevel@tonic-gate #define	OBJ_SEC(o) \
2570Sstevel@tonic-gate 	(o->object_class_u.secret_key)
2580Sstevel@tonic-gate #define	OBJ_SEC_VALUE(o) \
2590Sstevel@tonic-gate 	(o->object_class_u.secret_key->sk_value)
2600Sstevel@tonic-gate #define	OBJ_SEC_VALUE_LEN(o) \
2610Sstevel@tonic-gate 	(o->object_class_u.secret_key->sk_value_len)
2620Sstevel@tonic-gate 
2630Sstevel@tonic-gate /*
2640Sstevel@tonic-gate  * RSA Public Key Object Attributes
2650Sstevel@tonic-gate  */
2660Sstevel@tonic-gate #define	OBJ_PUB(o) \
2670Sstevel@tonic-gate 	((o)->object_class_u.public_key)
2680Sstevel@tonic-gate #define	KEY_PUB_RSA(k) \
2690Sstevel@tonic-gate 	&((k)->key_type_u.rsa_pub_key)
2700Sstevel@tonic-gate #define	OBJ_PUB_RSA_MOD(o) \
2710Sstevel@tonic-gate 	&((o)->object_class_u.public_key->key_type_u.rsa_pub_key.modulus)
2720Sstevel@tonic-gate #define	KEY_PUB_RSA_MOD(k) \
2730Sstevel@tonic-gate 	&((k)->key_type_u.rsa_pub_key.modulus)
2740Sstevel@tonic-gate #define	OBJ_PUB_RSA_PUBEXPO(o) \
2750Sstevel@tonic-gate 	&((o)->object_class_u.public_key->key_type_u.rsa_pub_key.pub_exponent)
2760Sstevel@tonic-gate #define	KEY_PUB_RSA_PUBEXPO(k) \
2770Sstevel@tonic-gate 	&((k)->key_type_u.rsa_pub_key.pub_exponent)
2780Sstevel@tonic-gate #define	OBJ_PUB_RSA_MOD_BITS(o) \
2790Sstevel@tonic-gate 	((o)->object_class_u.public_key->key_type_u.rsa_pub_key.modulus_bits)
2800Sstevel@tonic-gate #define	KEY_PUB_RSA_MOD_BITS(k) \
2810Sstevel@tonic-gate 	((k)->key_type_u.rsa_pub_key.modulus_bits)
2820Sstevel@tonic-gate 
2830Sstevel@tonic-gate 
2840Sstevel@tonic-gate /*
2850Sstevel@tonic-gate  * DSA Public Key Object Attributes
2860Sstevel@tonic-gate  */
2870Sstevel@tonic-gate #define	KEY_PUB_DSA(k) \
2880Sstevel@tonic-gate 	&((k)->key_type_u.dsa_pub_key)
2890Sstevel@tonic-gate #define	OBJ_PUB_DSA_PRIME(o) \
2900Sstevel@tonic-gate 	&((o)->object_class_u.public_key->key_type_u.dsa_pub_key.prime)
2910Sstevel@tonic-gate #define	KEY_PUB_DSA_PRIME(k) \
2920Sstevel@tonic-gate 	&((k)->key_type_u.dsa_pub_key.prime)
2930Sstevel@tonic-gate #define	OBJ_PUB_DSA_SUBPRIME(o) \
2940Sstevel@tonic-gate 	&((o)->object_class_u.public_key->key_type_u.dsa_pub_key.subprime)
2950Sstevel@tonic-gate #define	KEY_PUB_DSA_SUBPRIME(k) \
2960Sstevel@tonic-gate 	&((k)->key_type_u.dsa_pub_key.subprime)
2970Sstevel@tonic-gate #define	OBJ_PUB_DSA_BASE(o) \
2980Sstevel@tonic-gate 	&((o)->object_class_u.public_key->key_type_u.dsa_pub_key.base)
2990Sstevel@tonic-gate #define	KEY_PUB_DSA_BASE(k) \
3000Sstevel@tonic-gate 	&((k)->key_type_u.dsa_pub_key.base)
3010Sstevel@tonic-gate #define	OBJ_PUB_DSA_VALUE(o) \
3020Sstevel@tonic-gate 	&((o)->object_class_u.public_key->key_type_u.dsa_pub_key.value)
3030Sstevel@tonic-gate #define	KEY_PUB_DSA_VALUE(k) \
3040Sstevel@tonic-gate 	&((k)->key_type_u.dsa_pub_key.value)
3050Sstevel@tonic-gate 
3060Sstevel@tonic-gate 
3070Sstevel@tonic-gate /*
3084219Smcpowers  * Diffie-Hellman Public Key Object Attributes
3094219Smcpowers  */
3104219Smcpowers #define	KEY_PUB_DH(k) \
3114219Smcpowers 	&((k)->key_type_u.dh_pub_key)
3124219Smcpowers #define	OBJ_PUB_DH_PRIME(o) \
3134219Smcpowers 	&((o)->object_class_u.public_key->key_type_u.dh_pub_key.prime)
3144219Smcpowers #define	KEY_PUB_DH_PRIME(k) \
3154219Smcpowers 	&((k)->key_type_u.dh_pub_key.prime)
3164219Smcpowers #define	OBJ_PUB_DH_BASE(o) \
3174219Smcpowers 	&((o)->object_class_u.public_key->key_type_u.dh_pub_key.base)
3184219Smcpowers #define	KEY_PUB_DH_BASE(k) \
3194219Smcpowers 	&((k)->key_type_u.dh_pub_key.base)
3204219Smcpowers #define	OBJ_PUB_DH_VALUE(o) \
3214219Smcpowers 	&((o)->object_class_u.public_key->key_type_u.dh_pub_key.value)
3224219Smcpowers #define	KEY_PUB_DH_VALUE(k) \
3234219Smcpowers 	&((k)->key_type_u.dh_pub_key.value)
3244219Smcpowers 
3254219Smcpowers 
3264219Smcpowers /*
3274219Smcpowers  * EC Public Key Object Attributes
3284219Smcpowers  */
3294219Smcpowers #define	OBJ_PUB_EC_POINT(o) \
3304219Smcpowers 	&((o)->object_class_u.public_key->key_type_u.ec_pub_key.point)
3314219Smcpowers #define	KEY_PUB_EC_POINT(k) \
3324219Smcpowers 	&((k)->key_type_u.ec_pub_key.point)
3334219Smcpowers 
3344219Smcpowers 
3354219Smcpowers /*
3360Sstevel@tonic-gate  * RSA Private Key Object Attributes
3370Sstevel@tonic-gate  */
3380Sstevel@tonic-gate #define	OBJ_PRI(o) \
3390Sstevel@tonic-gate 	((o)->object_class_u.private_key)
3400Sstevel@tonic-gate #define	KEY_PRI_RSA(k) \
3410Sstevel@tonic-gate 	&((k)->key_type_u.rsa_pri_key)
3420Sstevel@tonic-gate #define	OBJ_PRI_RSA_MOD(o) \
3430Sstevel@tonic-gate 	&((o)->object_class_u.private_key->key_type_u.rsa_pri_key.modulus)
3440Sstevel@tonic-gate #define	KEY_PRI_RSA_MOD(k) \
3450Sstevel@tonic-gate 	&((k)->key_type_u.rsa_pri_key.modulus)
3460Sstevel@tonic-gate #define	OBJ_PRI_RSA_PUBEXPO(o) \
3470Sstevel@tonic-gate 	&((o)->object_class_u.private_key->key_type_u.rsa_pri_key.pub_exponent)
3480Sstevel@tonic-gate #define	KEY_PRI_RSA_PUBEXPO(k) \
3490Sstevel@tonic-gate 	&((k)->key_type_u.rsa_pri_key.pub_exponent)
3500Sstevel@tonic-gate #define	OBJ_PRI_RSA_PRIEXPO(o) \
3510Sstevel@tonic-gate 	&((o)->object_class_u.private_key->key_type_u.rsa_pri_key.pri_exponent)
3520Sstevel@tonic-gate #define	KEY_PRI_RSA_PRIEXPO(k) \
3530Sstevel@tonic-gate 	&((k)->key_type_u.rsa_pri_key.pri_exponent)
3540Sstevel@tonic-gate #define	OBJ_PRI_RSA_PRIME1(o) \
3550Sstevel@tonic-gate 	&((o)->object_class_u.private_key->key_type_u.rsa_pri_key.prime_1)
3560Sstevel@tonic-gate #define	KEY_PRI_RSA_PRIME1(k) \
3570Sstevel@tonic-gate 	&((k)->key_type_u.rsa_pri_key.prime_1)
3580Sstevel@tonic-gate #define	OBJ_PRI_RSA_PRIME2(o) \
3590Sstevel@tonic-gate 	&((o)->object_class_u.private_key->key_type_u.rsa_pri_key.prime_2)
3600Sstevel@tonic-gate #define	KEY_PRI_RSA_PRIME2(k) \
3610Sstevel@tonic-gate 	&((k)->key_type_u.rsa_pri_key.prime_2)
3620Sstevel@tonic-gate #define	OBJ_PRI_RSA_EXPO1(o) \
3630Sstevel@tonic-gate 	&((o)->object_class_u.private_key->key_type_u.rsa_pri_key.exponent_1)
3640Sstevel@tonic-gate #define	KEY_PRI_RSA_EXPO1(k) \
3650Sstevel@tonic-gate 	&((k)->key_type_u.rsa_pri_key.exponent_1)
3660Sstevel@tonic-gate #define	OBJ_PRI_RSA_EXPO2(o) \
3670Sstevel@tonic-gate 	&((o)->object_class_u.private_key->key_type_u.rsa_pri_key.exponent_2)
3680Sstevel@tonic-gate #define	KEY_PRI_RSA_EXPO2(k) \
3690Sstevel@tonic-gate 	&((k)->key_type_u.rsa_pri_key.exponent_2)
3700Sstevel@tonic-gate #define	OBJ_PRI_RSA_COEF(o) \
3710Sstevel@tonic-gate 	&((o)->object_class_u.private_key->key_type_u.rsa_pri_key.coefficient)
3720Sstevel@tonic-gate #define	KEY_PRI_RSA_COEF(k) \
3730Sstevel@tonic-gate 	&((k)->key_type_u.rsa_pri_key.coefficient)
3740Sstevel@tonic-gate 
3750Sstevel@tonic-gate /*
3760Sstevel@tonic-gate  * DSA Private Key Object Attributes
3770Sstevel@tonic-gate  */
3780Sstevel@tonic-gate #define	KEY_PRI_DSA(k) \
3790Sstevel@tonic-gate 	&((k)->key_type_u.dsa_pri_key)
3800Sstevel@tonic-gate #define	OBJ_PRI_DSA_PRIME(o) \
3810Sstevel@tonic-gate 	&((o)->object_class_u.private_key->key_type_u.dsa_pri_key.prime)
3820Sstevel@tonic-gate #define	KEY_PRI_DSA_PRIME(k) \
3830Sstevel@tonic-gate 	&((k)->key_type_u.dsa_pri_key.prime)
3840Sstevel@tonic-gate #define	OBJ_PRI_DSA_SUBPRIME(o) \
3850Sstevel@tonic-gate 	&((o)->object_class_u.private_key->key_type_u.dsa_pri_key.subprime)
3860Sstevel@tonic-gate #define	KEY_PRI_DSA_SUBPRIME(k) \
3870Sstevel@tonic-gate 	&((k)->key_type_u.dsa_pri_key.subprime)
3880Sstevel@tonic-gate #define	OBJ_PRI_DSA_BASE(o) \
3890Sstevel@tonic-gate 	&((o)->object_class_u.private_key->key_type_u.dsa_pri_key.base)
3900Sstevel@tonic-gate #define	KEY_PRI_DSA_BASE(k) \
3910Sstevel@tonic-gate 	&((k)->key_type_u.dsa_pri_key.base)
3920Sstevel@tonic-gate #define	OBJ_PRI_DSA_VALUE(o) \
3930Sstevel@tonic-gate 	&((o)->object_class_u.private_key->key_type_u.dsa_pri_key.value)
3940Sstevel@tonic-gate #define	KEY_PRI_DSA_VALUE(k) \
3950Sstevel@tonic-gate 	&((k)->key_type_u.dsa_pri_key.value)
3960Sstevel@tonic-gate 
3970Sstevel@tonic-gate /*
3984219Smcpowers  * Diffie-Hellman Private Key Object Attributes
3994219Smcpowers  */
4004219Smcpowers #define	KEY_PRI_DH(k) \
4014219Smcpowers 	&((k)->key_type_u.dh_pri_key)
4024219Smcpowers #define	OBJ_PRI_DH_PRIME(o) \
4034219Smcpowers 	&((o)->object_class_u.private_key->key_type_u.dh_pri_key.prime)
4044219Smcpowers #define	KEY_PRI_DH_PRIME(k) \
4054219Smcpowers 	&((k)->key_type_u.dh_pri_key.prime)
4064219Smcpowers #define	OBJ_PRI_DH_BASE(o) \
4074219Smcpowers 	&((o)->object_class_u.private_key->key_type_u.dh_pri_key.base)
4084219Smcpowers #define	KEY_PRI_DH_BASE(k) \
4094219Smcpowers 	&((k)->key_type_u.dh_pri_key.base)
4104219Smcpowers #define	OBJ_PRI_DH_VALUE(o) \
4114219Smcpowers 	&((o)->object_class_u.private_key->key_type_u.dh_pri_key.value)
4124219Smcpowers #define	KEY_PRI_DH_VALUE(k) \
4134219Smcpowers 	&((k)->key_type_u.dh_pri_key.value)
4144219Smcpowers #define	OBJ_PRI_DH_VAL_BITS(o) \
4154219Smcpowers 	((o)->object_class_u.private_key->key_type_u.dh_pri_key.value_bits)
4164219Smcpowers #define	KEY_PRI_DH_VAL_BITS(k) \
4174219Smcpowers 	((k)->key_type_u.dh_pri_key.value_bits)
4184219Smcpowers 
4194219Smcpowers /*
4204219Smcpowers  * EC Private Key Object Attributes
4214219Smcpowers  */
4224219Smcpowers #define	OBJ_PRI_EC_VALUE(o) \
4234219Smcpowers 	&((o)->object_class_u.private_key->key_type_u.ec_pri_key.value)
4244219Smcpowers #define	KEY_PRI_EC_VALUE(k) \
4254219Smcpowers 	&((k)->key_type_u.ec_pri_key.value)
4264219Smcpowers 
4274219Smcpowers /*
4280Sstevel@tonic-gate  * key related attributes with CK_BBOOL data type
4290Sstevel@tonic-gate  */
4300Sstevel@tonic-gate #define	DERIVE_BOOL_ON			0x00000001
4310Sstevel@tonic-gate #define	LOCAL_BOOL_ON			0x00000002
4320Sstevel@tonic-gate #define	SENSITIVE_BOOL_ON		0x00000004
4330Sstevel@tonic-gate #define	SECONDARY_AUTH_BOOL_ON		0x00000008
4340Sstevel@tonic-gate #define	ENCRYPT_BOOL_ON			0x00000010
4350Sstevel@tonic-gate #define	DECRYPT_BOOL_ON			0x00000020
4360Sstevel@tonic-gate #define	SIGN_BOOL_ON			0x00000040
4370Sstevel@tonic-gate #define	SIGN_RECOVER_BOOL_ON		0x00000080
4380Sstevel@tonic-gate #define	VERIFY_BOOL_ON			0x00000100
4390Sstevel@tonic-gate #define	VERIFY_RECOVER_BOOL_ON		0x00000200
4400Sstevel@tonic-gate #define	WRAP_BOOL_ON			0x00000400
4410Sstevel@tonic-gate #define	UNWRAP_BOOL_ON			0x00000800
4420Sstevel@tonic-gate #define	TRUSTED_BOOL_ON			0x00001000
4430Sstevel@tonic-gate #define	EXTRACTABLE_BOOL_ON		0x00002000
4440Sstevel@tonic-gate #define	ALWAYS_SENSITIVE_BOOL_ON	0x00004000
4450Sstevel@tonic-gate #define	NEVER_EXTRACTABLE_BOOL_ON	0x00008000
4460Sstevel@tonic-gate #define	PRIVATE_BOOL_ON			0x00010000
4470Sstevel@tonic-gate #define	TOKEN_BOOL_ON			0x00020000
4480Sstevel@tonic-gate #define	MODIFIABLE_BOOL_ON		0x00040000
4490Sstevel@tonic-gate 
4500Sstevel@tonic-gate #define	SECRET_KEY_DEFAULT	(ENCRYPT_BOOL_ON|\
4510Sstevel@tonic-gate 				DECRYPT_BOOL_ON|\
4520Sstevel@tonic-gate 				SIGN_BOOL_ON|\
4530Sstevel@tonic-gate 				VERIFY_BOOL_ON|\
454*9341SAnthony.Scarpino@Sun.COM 				WRAP_BOOL_ON|\
455*9341SAnthony.Scarpino@Sun.COM 				UNWRAP_BOOL_ON|\
4560Sstevel@tonic-gate 				EXTRACTABLE_BOOL_ON|\
4570Sstevel@tonic-gate 				MODIFIABLE_BOOL_ON)
4580Sstevel@tonic-gate 
4590Sstevel@tonic-gate #define	PUBLIC_KEY_DEFAULT	(ENCRYPT_BOOL_ON|\
460*9341SAnthony.Scarpino@Sun.COM 				WRAP_BOOL_ON|\
4610Sstevel@tonic-gate 				VERIFY_BOOL_ON|\
4620Sstevel@tonic-gate 				VERIFY_RECOVER_BOOL_ON|\
4630Sstevel@tonic-gate 				MODIFIABLE_BOOL_ON)
4640Sstevel@tonic-gate 
4650Sstevel@tonic-gate #define	PRIVATE_KEY_DEFAULT	(DECRYPT_BOOL_ON|\
466*9341SAnthony.Scarpino@Sun.COM 				UNWRAP_BOOL_ON|\
4670Sstevel@tonic-gate 				SIGN_BOOL_ON|\
4680Sstevel@tonic-gate 				SIGN_RECOVER_BOOL_ON|\
4690Sstevel@tonic-gate 				EXTRACTABLE_BOOL_ON|\
4700Sstevel@tonic-gate 				MODIFIABLE_BOOL_ON)
4710Sstevel@tonic-gate 
4720Sstevel@tonic-gate /*
473214Smcpowers  * Flag definitions for obj_delete_sync
474214Smcpowers  */
475214Smcpowers #define	OBJECT_IS_DELETING	1	/* Object is in a deleting state */
476214Smcpowers #define	OBJECT_REFCNT_WAITING	2	/* Waiting for object reference */
477214Smcpowers 					/* count to become zero */
478214Smcpowers 
479214Smcpowers /*
4800Sstevel@tonic-gate  * This macro is used to type cast an object handle to a pointer to
4810Sstevel@tonic-gate  * the object struct. Also, it checks to see if the object struct
4820Sstevel@tonic-gate  * is tagged with an object magic number. This is to detect when an
4830Sstevel@tonic-gate  * application passes a bogus object pointer.
484214Smcpowers  * Also, it checks to see if the object is in the deleting state that
485214Smcpowers  * another thread is performing. If not, increment the object reference
486214Smcpowers  * count by one. This is to prevent this object from being deleted by
487214Smcpowers  * other thread.
4880Sstevel@tonic-gate  */
489214Smcpowers #define	HANDLE2OBJECT_COMMON(hObject, object_p, rv, REFCNT_CODE) { \
490214Smcpowers 	object_p = (kernel_object_t *)(hObject); \
491214Smcpowers 	if ((object_p == NULL) || \
492214Smcpowers 		(object_p->magic_marker != KERNELTOKEN_OBJECT_MAGIC)) {\
493214Smcpowers 			rv = CKR_OBJECT_HANDLE_INVALID; \
4940Sstevel@tonic-gate 	} else { \
495214Smcpowers 		(void) pthread_mutex_lock(&object_p->object_mutex); \
496214Smcpowers 		if (!(object_p->obj_delete_sync & OBJECT_IS_DELETING)) { \
497214Smcpowers 			REFCNT_CODE; \
498214Smcpowers 			rv = CKR_OK; \
499214Smcpowers 		} else { \
500214Smcpowers 			rv = CKR_OBJECT_HANDLE_INVALID; \
501214Smcpowers 		} \
502214Smcpowers 		(void) pthread_mutex_unlock(&object_p->object_mutex); \
503214Smcpowers 	} \
504214Smcpowers }
505214Smcpowers 
506214Smcpowers #define	HANDLE2OBJECT(hObject, object_p, rv) \
507214Smcpowers 	HANDLE2OBJECT_COMMON(hObject, object_p, rv, object_p->obj_refcnt++)
508214Smcpowers 
509214Smcpowers #define	HANDLE2OBJECT_DESTROY(hObject, object_p, rv) \
510214Smcpowers 	HANDLE2OBJECT_COMMON(hObject, object_p, rv, /* no refcnt increment */)
511214Smcpowers 
512214Smcpowers 
513214Smcpowers #define	OBJ_REFRELE(object_p) { \
514214Smcpowers 	(void) pthread_mutex_lock(&object_p->object_mutex); \
515214Smcpowers 	if ((--object_p->obj_refcnt) == 0 && \
516214Smcpowers 	    (object_p->obj_delete_sync & OBJECT_REFCNT_WAITING)) { \
517214Smcpowers 		(void) pthread_cond_signal(&object_p->obj_free_cond); \
518214Smcpowers 	} \
519214Smcpowers 	(void) pthread_mutex_unlock(&object_p->object_mutex); \
520214Smcpowers }
521214Smcpowers 
5220Sstevel@tonic-gate 
5230Sstevel@tonic-gate /*
5240Sstevel@tonic-gate  * Function Prototypes.
5250Sstevel@tonic-gate  */
5260Sstevel@tonic-gate void kernel_cleanup_object(kernel_object_t *objp);
5270Sstevel@tonic-gate 
5280Sstevel@tonic-gate CK_RV kernel_add_object(CK_ATTRIBUTE_PTR pTemplate,  CK_ULONG ulCount,
5290Sstevel@tonic-gate     CK_ULONG *objecthandle_p, kernel_session_t *sp);
5300Sstevel@tonic-gate 
5310Sstevel@tonic-gate CK_RV kernel_delete_session_object(kernel_session_t *sp, kernel_object_t *objp,
5320Sstevel@tonic-gate     boolean_t lock_held, boolean_t wrapper_only);
5330Sstevel@tonic-gate 
5340Sstevel@tonic-gate void kernel_cleanup_extra_attr(kernel_object_t *object_p);
5350Sstevel@tonic-gate 
5360Sstevel@tonic-gate CK_RV kernel_copy_extra_attr(CK_ATTRIBUTE_INFO_PTR old_attrp,
5370Sstevel@tonic-gate     kernel_object_t *object_p);
5380Sstevel@tonic-gate 
5390Sstevel@tonic-gate void kernel_cleanup_object_bigint_attrs(kernel_object_t *object_p);
5400Sstevel@tonic-gate 
5414219Smcpowers CK_RV kernel_build_object(CK_ATTRIBUTE_PTR template, CK_ULONG ulAttrNum,
5424219Smcpowers     kernel_object_t *new_object, kernel_session_t *sp, uint_t);
5430Sstevel@tonic-gate 
5440Sstevel@tonic-gate CK_RV kernel_copy_object(kernel_object_t *old_object,
5450Sstevel@tonic-gate     kernel_object_t **new_object, boolean_t copy_everything,
5460Sstevel@tonic-gate     kernel_session_t *sp);
5470Sstevel@tonic-gate 
5480Sstevel@tonic-gate void kernel_merge_object(kernel_object_t *old_object,
5490Sstevel@tonic-gate     kernel_object_t *new_object);
5500Sstevel@tonic-gate 
5510Sstevel@tonic-gate CK_RV kernel_get_attribute(kernel_object_t *object_p,
5520Sstevel@tonic-gate     CK_ATTRIBUTE_PTR template);
5530Sstevel@tonic-gate 
5540Sstevel@tonic-gate CK_RV kernel_set_attribute(kernel_object_t *object_p,
5550Sstevel@tonic-gate     CK_ATTRIBUTE_PTR template, boolean_t copy, kernel_session_t *sp);
5560Sstevel@tonic-gate 
5570Sstevel@tonic-gate void copy_bigint_attr(biginteger_t *src, biginteger_t *dst);
5580Sstevel@tonic-gate 
5590Sstevel@tonic-gate void kernel_add_object_to_session(kernel_object_t *objp, kernel_session_t *sp);
5600Sstevel@tonic-gate 
5610Sstevel@tonic-gate CK_RV kernel_copy_public_key_attr(public_key_obj_t *old_pub_key_obj_p,
5620Sstevel@tonic-gate     public_key_obj_t **new_pub_key_obj_p, CK_KEY_TYPE key_type);
5630Sstevel@tonic-gate 
5640Sstevel@tonic-gate CK_RV kernel_copy_private_key_attr(private_key_obj_t *old_pri_key_obj_p,
5650Sstevel@tonic-gate     private_key_obj_t **new_pri_key_obj_p, CK_KEY_TYPE key_type);
5660Sstevel@tonic-gate 
5670Sstevel@tonic-gate CK_RV kernel_copy_secret_key_attr(secret_key_obj_t *old_secret_key_obj_p,
5680Sstevel@tonic-gate     secret_key_obj_t **new_secret_key_obj_p);
5690Sstevel@tonic-gate 
5700Sstevel@tonic-gate CK_RV kernel_validate_attr(CK_ATTRIBUTE_PTR template, CK_ULONG ulAttrNum,
5710Sstevel@tonic-gate     CK_OBJECT_CLASS *class);
5720Sstevel@tonic-gate 
5730Sstevel@tonic-gate CK_RV kernel_find_objects_init(kernel_session_t *sp,
5740Sstevel@tonic-gate     CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount);
5750Sstevel@tonic-gate 
5760Sstevel@tonic-gate void kernel_find_objects_final(kernel_session_t *sp);
5770Sstevel@tonic-gate 
5780Sstevel@tonic-gate void kernel_find_objects(kernel_session_t *sp,
5790Sstevel@tonic-gate     CK_OBJECT_HANDLE *obj_found, CK_ULONG max_obj_requested,
5800Sstevel@tonic-gate     CK_ULONG *found_obj_count);
5810Sstevel@tonic-gate 
5820Sstevel@tonic-gate void kernel_process_find_attr(CK_OBJECT_CLASS *pclasses,
5830Sstevel@tonic-gate     CK_ULONG *num_result_pclasses, CK_ATTRIBUTE_PTR pTemplate,
5840Sstevel@tonic-gate     CK_ULONG ulCount);
5850Sstevel@tonic-gate 
5860Sstevel@tonic-gate boolean_t kernel_find_match_attrs(kernel_object_t *obj,
5870Sstevel@tonic-gate     CK_OBJECT_CLASS *pclasses, CK_ULONG num_pclasses,
5880Sstevel@tonic-gate     CK_ATTRIBUTE *tmpl_attr, CK_ULONG num_attr);
5890Sstevel@tonic-gate 
5900Sstevel@tonic-gate CK_ATTRIBUTE_PTR get_extra_attr(CK_ATTRIBUTE_TYPE type, kernel_object_t *obj);
5910Sstevel@tonic-gate 
5920Sstevel@tonic-gate CK_RV get_string_from_template(CK_ATTRIBUTE_PTR dest, CK_ATTRIBUTE_PTR src);
5930Sstevel@tonic-gate 
5940Sstevel@tonic-gate void string_attr_cleanup(CK_ATTRIBUTE_PTR template);
5950Sstevel@tonic-gate 
5960Sstevel@tonic-gate void kernel_add_token_object_to_slot(kernel_object_t *objp,
5970Sstevel@tonic-gate     kernel_slot_t *pslot);
5980Sstevel@tonic-gate 
5990Sstevel@tonic-gate void kernel_remove_token_object_from_slot(kernel_slot_t *pslot,
6000Sstevel@tonic-gate     kernel_object_t *objp);
6010Sstevel@tonic-gate 
6020Sstevel@tonic-gate CK_RV kernel_delete_token_object(kernel_slot_t *pslot, kernel_session_t *sp,
6030Sstevel@tonic-gate     kernel_object_t *obj, boolean_t lock_held, boolean_t wrapper_only);
6040Sstevel@tonic-gate 
6050Sstevel@tonic-gate void kernel_cleanup_pri_objects_in_slot(kernel_slot_t *pslot,
6060Sstevel@tonic-gate     kernel_session_t *sp);
6070Sstevel@tonic-gate 
6080Sstevel@tonic-gate CK_RV kernel_get_object_size(kernel_object_t *objp, CK_ULONG_PTR pulSize);
6090Sstevel@tonic-gate 
610214Smcpowers void kernel_object_delay_free(kernel_object_t *objp);
611214Smcpowers 
6120Sstevel@tonic-gate #ifdef	__cplusplus
6130Sstevel@tonic-gate }
6140Sstevel@tonic-gate #endif
6150Sstevel@tonic-gate 
6160Sstevel@tonic-gate #endif /* _KERNELOBJECT_H */
617