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