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