1*7c478bd9Sstevel@tonic-gate /* 2*7c478bd9Sstevel@tonic-gate * CDDL HEADER START 3*7c478bd9Sstevel@tonic-gate * 4*7c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the 5*7c478bd9Sstevel@tonic-gate * Common Development and Distribution License, Version 1.0 only 6*7c478bd9Sstevel@tonic-gate * (the "License"). You may not use this file except in compliance 7*7c478bd9Sstevel@tonic-gate * with the License. 8*7c478bd9Sstevel@tonic-gate * 9*7c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10*7c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 11*7c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions 12*7c478bd9Sstevel@tonic-gate * and limitations under the License. 13*7c478bd9Sstevel@tonic-gate * 14*7c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 15*7c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16*7c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 17*7c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 18*7c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 19*7c478bd9Sstevel@tonic-gate * 20*7c478bd9Sstevel@tonic-gate * CDDL HEADER END 21*7c478bd9Sstevel@tonic-gate */ 22*7c478bd9Sstevel@tonic-gate /* 23*7c478bd9Sstevel@tonic-gate * Copyright 2004 Sun Microsystems, Inc. All rights reserved. 24*7c478bd9Sstevel@tonic-gate * Use is subject to license terms. 25*7c478bd9Sstevel@tonic-gate */ 26*7c478bd9Sstevel@tonic-gate 27*7c478bd9Sstevel@tonic-gate #ifndef _SOFTOBJECT_H 28*7c478bd9Sstevel@tonic-gate #define _SOFTOBJECT_H 29*7c478bd9Sstevel@tonic-gate 30*7c478bd9Sstevel@tonic-gate #pragma ident "%Z%%M% %I% %E% SMI" 31*7c478bd9Sstevel@tonic-gate 32*7c478bd9Sstevel@tonic-gate #ifdef __cplusplus 33*7c478bd9Sstevel@tonic-gate extern "C" { 34*7c478bd9Sstevel@tonic-gate #endif 35*7c478bd9Sstevel@tonic-gate 36*7c478bd9Sstevel@tonic-gate #include <pthread.h> 37*7c478bd9Sstevel@tonic-gate #include <security/pkcs11t.h> 38*7c478bd9Sstevel@tonic-gate #include "softKeystoreUtil.h" 39*7c478bd9Sstevel@tonic-gate #include "softSession.h" 40*7c478bd9Sstevel@tonic-gate 41*7c478bd9Sstevel@tonic-gate 42*7c478bd9Sstevel@tonic-gate #define SOFTTOKEN_OBJECT_MAGIC 0xECF0B002 43*7c478bd9Sstevel@tonic-gate 44*7c478bd9Sstevel@tonic-gate #define SOFT_CREATE_OBJ 1 45*7c478bd9Sstevel@tonic-gate #define SOFT_GEN_KEY 2 46*7c478bd9Sstevel@tonic-gate #define SOFT_DERIVE_KEY_DH 3 /* for CKM_DH_PKCS_DERIVE */ 47*7c478bd9Sstevel@tonic-gate #define SOFT_DERIVE_KEY_OTHER 4 /* for CKM_MD5_KEY_DERIVATION and */ 48*7c478bd9Sstevel@tonic-gate /* CKM_SHA1_KEY_DERIVATION */ 49*7c478bd9Sstevel@tonic-gate #define SOFT_UNWRAP_KEY 5 50*7c478bd9Sstevel@tonic-gate #define SOFT_CREATE_OBJ_INT 6 /* internal object creation */ 51*7c478bd9Sstevel@tonic-gate 52*7c478bd9Sstevel@tonic-gate typedef struct biginteger { 53*7c478bd9Sstevel@tonic-gate CK_BYTE *big_value; 54*7c478bd9Sstevel@tonic-gate CK_ULONG big_value_len; 55*7c478bd9Sstevel@tonic-gate } biginteger_t; 56*7c478bd9Sstevel@tonic-gate 57*7c478bd9Sstevel@tonic-gate 58*7c478bd9Sstevel@tonic-gate /* 59*7c478bd9Sstevel@tonic-gate * Secret key Struct 60*7c478bd9Sstevel@tonic-gate */ 61*7c478bd9Sstevel@tonic-gate typedef struct secret_key_obj { 62*7c478bd9Sstevel@tonic-gate CK_BYTE *sk_value; 63*7c478bd9Sstevel@tonic-gate CK_ULONG sk_value_len; 64*7c478bd9Sstevel@tonic-gate void *key_sched; 65*7c478bd9Sstevel@tonic-gate size_t keysched_len; 66*7c478bd9Sstevel@tonic-gate } secret_key_obj_t; 67*7c478bd9Sstevel@tonic-gate 68*7c478bd9Sstevel@tonic-gate 69*7c478bd9Sstevel@tonic-gate /* 70*7c478bd9Sstevel@tonic-gate * PKCS11: RSA Public Key Object Attributes 71*7c478bd9Sstevel@tonic-gate */ 72*7c478bd9Sstevel@tonic-gate typedef struct rsa_pub_key { 73*7c478bd9Sstevel@tonic-gate biginteger_t modulus; 74*7c478bd9Sstevel@tonic-gate CK_ULONG modulus_bits; 75*7c478bd9Sstevel@tonic-gate biginteger_t pub_exponent; 76*7c478bd9Sstevel@tonic-gate } rsa_pub_key_t; 77*7c478bd9Sstevel@tonic-gate 78*7c478bd9Sstevel@tonic-gate 79*7c478bd9Sstevel@tonic-gate /* 80*7c478bd9Sstevel@tonic-gate * PKCS11: DSA Public Key Object Attributes 81*7c478bd9Sstevel@tonic-gate */ 82*7c478bd9Sstevel@tonic-gate typedef struct dsa_pub_key { 83*7c478bd9Sstevel@tonic-gate biginteger_t prime; 84*7c478bd9Sstevel@tonic-gate biginteger_t subprime; 85*7c478bd9Sstevel@tonic-gate biginteger_t base; 86*7c478bd9Sstevel@tonic-gate biginteger_t value; 87*7c478bd9Sstevel@tonic-gate } dsa_pub_key_t; 88*7c478bd9Sstevel@tonic-gate 89*7c478bd9Sstevel@tonic-gate 90*7c478bd9Sstevel@tonic-gate /* 91*7c478bd9Sstevel@tonic-gate * PKCS11: Diffie-Hellman Public Key Object Attributes 92*7c478bd9Sstevel@tonic-gate */ 93*7c478bd9Sstevel@tonic-gate typedef struct dh_pub_key { 94*7c478bd9Sstevel@tonic-gate biginteger_t prime; 95*7c478bd9Sstevel@tonic-gate biginteger_t base; 96*7c478bd9Sstevel@tonic-gate biginteger_t value; 97*7c478bd9Sstevel@tonic-gate } dh_pub_key_t; 98*7c478bd9Sstevel@tonic-gate 99*7c478bd9Sstevel@tonic-gate 100*7c478bd9Sstevel@tonic-gate /* 101*7c478bd9Sstevel@tonic-gate * PKCS11: X9.42 Diffie-Hellman Public Key Object Attributes 102*7c478bd9Sstevel@tonic-gate */ 103*7c478bd9Sstevel@tonic-gate typedef struct dh942_pub_key { 104*7c478bd9Sstevel@tonic-gate biginteger_t prime; 105*7c478bd9Sstevel@tonic-gate biginteger_t base; 106*7c478bd9Sstevel@tonic-gate biginteger_t subprime; 107*7c478bd9Sstevel@tonic-gate biginteger_t value; 108*7c478bd9Sstevel@tonic-gate } dh942_pub_key_t; 109*7c478bd9Sstevel@tonic-gate 110*7c478bd9Sstevel@tonic-gate 111*7c478bd9Sstevel@tonic-gate /* 112*7c478bd9Sstevel@tonic-gate * Public Key Main Struct 113*7c478bd9Sstevel@tonic-gate */ 114*7c478bd9Sstevel@tonic-gate typedef struct public_key_obj { 115*7c478bd9Sstevel@tonic-gate union { 116*7c478bd9Sstevel@tonic-gate rsa_pub_key_t rsa_pub_key; /* RSA public key */ 117*7c478bd9Sstevel@tonic-gate dsa_pub_key_t dsa_pub_key; /* DSA public key */ 118*7c478bd9Sstevel@tonic-gate dh_pub_key_t dh_pub_key; /* DH public key */ 119*7c478bd9Sstevel@tonic-gate dh942_pub_key_t dh942_pub_key; /* DH9.42 public key */ 120*7c478bd9Sstevel@tonic-gate } key_type_u; 121*7c478bd9Sstevel@tonic-gate } public_key_obj_t; 122*7c478bd9Sstevel@tonic-gate 123*7c478bd9Sstevel@tonic-gate /* 124*7c478bd9Sstevel@tonic-gate * PKCS11: RSA Private Key Object Attributes 125*7c478bd9Sstevel@tonic-gate */ 126*7c478bd9Sstevel@tonic-gate typedef struct rsa_pri_key { 127*7c478bd9Sstevel@tonic-gate biginteger_t modulus; 128*7c478bd9Sstevel@tonic-gate biginteger_t pub_exponent; 129*7c478bd9Sstevel@tonic-gate biginteger_t pri_exponent; 130*7c478bd9Sstevel@tonic-gate biginteger_t prime_1; 131*7c478bd9Sstevel@tonic-gate biginteger_t prime_2; 132*7c478bd9Sstevel@tonic-gate biginteger_t exponent_1; 133*7c478bd9Sstevel@tonic-gate biginteger_t exponent_2; 134*7c478bd9Sstevel@tonic-gate biginteger_t coefficient; 135*7c478bd9Sstevel@tonic-gate } rsa_pri_key_t; 136*7c478bd9Sstevel@tonic-gate 137*7c478bd9Sstevel@tonic-gate /* 138*7c478bd9Sstevel@tonic-gate * PKCS11: DSA Private Key Object Attributes 139*7c478bd9Sstevel@tonic-gate */ 140*7c478bd9Sstevel@tonic-gate typedef struct dsa_pri_key { 141*7c478bd9Sstevel@tonic-gate biginteger_t prime; 142*7c478bd9Sstevel@tonic-gate biginteger_t subprime; 143*7c478bd9Sstevel@tonic-gate biginteger_t base; 144*7c478bd9Sstevel@tonic-gate biginteger_t value; 145*7c478bd9Sstevel@tonic-gate } dsa_pri_key_t; 146*7c478bd9Sstevel@tonic-gate 147*7c478bd9Sstevel@tonic-gate 148*7c478bd9Sstevel@tonic-gate /* 149*7c478bd9Sstevel@tonic-gate * PKCS11: Diffie-Hellman Private Key Object Attributes 150*7c478bd9Sstevel@tonic-gate */ 151*7c478bd9Sstevel@tonic-gate typedef struct dh_pri_key { 152*7c478bd9Sstevel@tonic-gate biginteger_t prime; 153*7c478bd9Sstevel@tonic-gate biginteger_t base; 154*7c478bd9Sstevel@tonic-gate biginteger_t value; 155*7c478bd9Sstevel@tonic-gate CK_ULONG value_bits; 156*7c478bd9Sstevel@tonic-gate } dh_pri_key_t; 157*7c478bd9Sstevel@tonic-gate 158*7c478bd9Sstevel@tonic-gate /* 159*7c478bd9Sstevel@tonic-gate * PKCS11: X9.42 Diffie-Hellman Private Key Object Attributes 160*7c478bd9Sstevel@tonic-gate */ 161*7c478bd9Sstevel@tonic-gate typedef struct dh942_pri_key { 162*7c478bd9Sstevel@tonic-gate biginteger_t prime; 163*7c478bd9Sstevel@tonic-gate biginteger_t base; 164*7c478bd9Sstevel@tonic-gate biginteger_t subprime; 165*7c478bd9Sstevel@tonic-gate biginteger_t value; 166*7c478bd9Sstevel@tonic-gate } dh942_pri_key_t; 167*7c478bd9Sstevel@tonic-gate 168*7c478bd9Sstevel@tonic-gate 169*7c478bd9Sstevel@tonic-gate /* 170*7c478bd9Sstevel@tonic-gate * Private Key Main Struct 171*7c478bd9Sstevel@tonic-gate */ 172*7c478bd9Sstevel@tonic-gate typedef struct private_key_obj { 173*7c478bd9Sstevel@tonic-gate union { 174*7c478bd9Sstevel@tonic-gate rsa_pri_key_t rsa_pri_key; /* RSA private key */ 175*7c478bd9Sstevel@tonic-gate dsa_pri_key_t dsa_pri_key; /* DSA private key */ 176*7c478bd9Sstevel@tonic-gate dh_pri_key_t dh_pri_key; /* DH private key */ 177*7c478bd9Sstevel@tonic-gate dh942_pri_key_t dh942_pri_key; /* DH9.42 private key */ 178*7c478bd9Sstevel@tonic-gate } key_type_u; 179*7c478bd9Sstevel@tonic-gate } private_key_obj_t; 180*7c478bd9Sstevel@tonic-gate 181*7c478bd9Sstevel@tonic-gate /* 182*7c478bd9Sstevel@tonic-gate * PKCS11: DSA Domain Parameters Object Attributes 183*7c478bd9Sstevel@tonic-gate */ 184*7c478bd9Sstevel@tonic-gate typedef struct dsa_dom_key { 185*7c478bd9Sstevel@tonic-gate biginteger_t prime; 186*7c478bd9Sstevel@tonic-gate biginteger_t subprime; 187*7c478bd9Sstevel@tonic-gate biginteger_t base; 188*7c478bd9Sstevel@tonic-gate CK_ULONG prime_bits; 189*7c478bd9Sstevel@tonic-gate } dsa_dom_key_t; 190*7c478bd9Sstevel@tonic-gate 191*7c478bd9Sstevel@tonic-gate 192*7c478bd9Sstevel@tonic-gate /* 193*7c478bd9Sstevel@tonic-gate * PKCS11: Diffie-Hellman Domain Parameters Object Attributes 194*7c478bd9Sstevel@tonic-gate */ 195*7c478bd9Sstevel@tonic-gate typedef struct dh_dom_key { 196*7c478bd9Sstevel@tonic-gate biginteger_t prime; 197*7c478bd9Sstevel@tonic-gate biginteger_t base; 198*7c478bd9Sstevel@tonic-gate CK_ULONG prime_bits; 199*7c478bd9Sstevel@tonic-gate } dh_dom_key_t; 200*7c478bd9Sstevel@tonic-gate 201*7c478bd9Sstevel@tonic-gate 202*7c478bd9Sstevel@tonic-gate /* 203*7c478bd9Sstevel@tonic-gate * PKCS11: X9.42 Diffie-Hellman Domain Parameters Object Attributes 204*7c478bd9Sstevel@tonic-gate */ 205*7c478bd9Sstevel@tonic-gate typedef struct dh942_dom_key { 206*7c478bd9Sstevel@tonic-gate biginteger_t prime; 207*7c478bd9Sstevel@tonic-gate biginteger_t base; 208*7c478bd9Sstevel@tonic-gate biginteger_t subprime; 209*7c478bd9Sstevel@tonic-gate CK_ULONG prime_bits; 210*7c478bd9Sstevel@tonic-gate CK_ULONG subprime_bits; 211*7c478bd9Sstevel@tonic-gate } dh942_dom_key_t; 212*7c478bd9Sstevel@tonic-gate 213*7c478bd9Sstevel@tonic-gate /* 214*7c478bd9Sstevel@tonic-gate * Domain Parameters Main Struct 215*7c478bd9Sstevel@tonic-gate */ 216*7c478bd9Sstevel@tonic-gate typedef struct domain_obj { 217*7c478bd9Sstevel@tonic-gate union { 218*7c478bd9Sstevel@tonic-gate dsa_dom_key_t dsa_dom_key; /* DSA domain parameters */ 219*7c478bd9Sstevel@tonic-gate dh_dom_key_t dh_dom_key; /* DH domain parameters */ 220*7c478bd9Sstevel@tonic-gate dh942_dom_key_t dh942_dom_key; /* DH9.42 domain parameters */ 221*7c478bd9Sstevel@tonic-gate } key_type_u; 222*7c478bd9Sstevel@tonic-gate } domain_obj_t; 223*7c478bd9Sstevel@tonic-gate 224*7c478bd9Sstevel@tonic-gate typedef struct cert_attr_type { 225*7c478bd9Sstevel@tonic-gate CK_BYTE *value; 226*7c478bd9Sstevel@tonic-gate CK_ULONG length; 227*7c478bd9Sstevel@tonic-gate } cert_attr_t; 228*7c478bd9Sstevel@tonic-gate 229*7c478bd9Sstevel@tonic-gate /* 230*7c478bd9Sstevel@tonic-gate * X.509 Public Key Certificate Structure. 231*7c478bd9Sstevel@tonic-gate * This structure contains only the attributes that are 232*7c478bd9Sstevel@tonic-gate * NOT modifiable after creation. 233*7c478bd9Sstevel@tonic-gate * ID, ISSUER, and SUBJECT attributes are kept in the extra_attrlistp 234*7c478bd9Sstevel@tonic-gate * record. 235*7c478bd9Sstevel@tonic-gate */ 236*7c478bd9Sstevel@tonic-gate typedef struct x509_cert { 237*7c478bd9Sstevel@tonic-gate cert_attr_t *subject; /* DER encoding of certificate subject name */ 238*7c478bd9Sstevel@tonic-gate cert_attr_t *value; /* BER encoding of the cert */ 239*7c478bd9Sstevel@tonic-gate } x509_cert_t; 240*7c478bd9Sstevel@tonic-gate 241*7c478bd9Sstevel@tonic-gate /* 242*7c478bd9Sstevel@tonic-gate * X.509 Attribute Certificiate Structure 243*7c478bd9Sstevel@tonic-gate * This structure contains only the attributes that are 244*7c478bd9Sstevel@tonic-gate * NOT modifiable after creation. 245*7c478bd9Sstevel@tonic-gate * AC_ISSUER, SERIAL_NUMBER, and ATTR_TYPES are kept in the 246*7c478bd9Sstevel@tonic-gate * extra_attrlistp record so they may be modified. 247*7c478bd9Sstevel@tonic-gate */ 248*7c478bd9Sstevel@tonic-gate typedef struct x509_attr_cert { 249*7c478bd9Sstevel@tonic-gate cert_attr_t *owner; /* DER encoding of attr cert subject field */ 250*7c478bd9Sstevel@tonic-gate cert_attr_t *value; /* BER encoding of cert */ 251*7c478bd9Sstevel@tonic-gate } x509_attr_cert_t; 252*7c478bd9Sstevel@tonic-gate 253*7c478bd9Sstevel@tonic-gate /* 254*7c478bd9Sstevel@tonic-gate * Certificate Object Main Struct 255*7c478bd9Sstevel@tonic-gate */ 256*7c478bd9Sstevel@tonic-gate typedef struct certificate_obj { 257*7c478bd9Sstevel@tonic-gate CK_CERTIFICATE_TYPE certificate_type; 258*7c478bd9Sstevel@tonic-gate union { 259*7c478bd9Sstevel@tonic-gate x509_cert_t x509; 260*7c478bd9Sstevel@tonic-gate x509_attr_cert_t x509_attr; 261*7c478bd9Sstevel@tonic-gate } cert_type_u; 262*7c478bd9Sstevel@tonic-gate } certificate_obj_t; 263*7c478bd9Sstevel@tonic-gate 264*7c478bd9Sstevel@tonic-gate /* 265*7c478bd9Sstevel@tonic-gate * This structure is used to hold the attributes in the 266*7c478bd9Sstevel@tonic-gate * Extra Attribute List. 267*7c478bd9Sstevel@tonic-gate */ 268*7c478bd9Sstevel@tonic-gate typedef struct attribute_info { 269*7c478bd9Sstevel@tonic-gate CK_ATTRIBUTE attr; 270*7c478bd9Sstevel@tonic-gate struct attribute_info *next; 271*7c478bd9Sstevel@tonic-gate } attribute_info_t; 272*7c478bd9Sstevel@tonic-gate 273*7c478bd9Sstevel@tonic-gate 274*7c478bd9Sstevel@tonic-gate typedef attribute_info_t *CK_ATTRIBUTE_INFO_PTR; 275*7c478bd9Sstevel@tonic-gate 276*7c478bd9Sstevel@tonic-gate /* 277*7c478bd9Sstevel@tonic-gate * This is the main structure of the Objects. 278*7c478bd9Sstevel@tonic-gate */ 279*7c478bd9Sstevel@tonic-gate typedef struct object { 280*7c478bd9Sstevel@tonic-gate /* Generic common fields. Always present */ 281*7c478bd9Sstevel@tonic-gate uint_t version; /* for token objects only */ 282*7c478bd9Sstevel@tonic-gate CK_OBJECT_CLASS class; 283*7c478bd9Sstevel@tonic-gate CK_KEY_TYPE key_type; 284*7c478bd9Sstevel@tonic-gate CK_CERTIFICATE_TYPE cert_type; 285*7c478bd9Sstevel@tonic-gate ulong_t magic_marker; 286*7c478bd9Sstevel@tonic-gate uint64_t bool_attr_mask; /* see below */ 287*7c478bd9Sstevel@tonic-gate CK_MECHANISM_TYPE mechanism; 288*7c478bd9Sstevel@tonic-gate uchar_t object_type; /* see below */ 289*7c478bd9Sstevel@tonic-gate struct ks_obj_handle ks_handle; /* keystore handle */ 290*7c478bd9Sstevel@tonic-gate 291*7c478bd9Sstevel@tonic-gate /* Fields for access and arbitration */ 292*7c478bd9Sstevel@tonic-gate pthread_mutex_t object_mutex; 293*7c478bd9Sstevel@tonic-gate struct object *next; 294*7c478bd9Sstevel@tonic-gate struct object *prev; 295*7c478bd9Sstevel@tonic-gate 296*7c478bd9Sstevel@tonic-gate /* Extra non-boolean attribute list */ 297*7c478bd9Sstevel@tonic-gate CK_ATTRIBUTE_INFO_PTR extra_attrlistp; 298*7c478bd9Sstevel@tonic-gate 299*7c478bd9Sstevel@tonic-gate /* For each object, only one of these object classes is presented */ 300*7c478bd9Sstevel@tonic-gate union { 301*7c478bd9Sstevel@tonic-gate public_key_obj_t *public_key; 302*7c478bd9Sstevel@tonic-gate private_key_obj_t *private_key; 303*7c478bd9Sstevel@tonic-gate secret_key_obj_t *secret_key; 304*7c478bd9Sstevel@tonic-gate domain_obj_t *domain; 305*7c478bd9Sstevel@tonic-gate certificate_obj_t *certificate; 306*7c478bd9Sstevel@tonic-gate } object_class_u; 307*7c478bd9Sstevel@tonic-gate 308*7c478bd9Sstevel@tonic-gate /* Session handle that the object belongs to */ 309*7c478bd9Sstevel@tonic-gate CK_SESSION_HANDLE session_handle; 310*7c478bd9Sstevel@tonic-gate uint32_t obj_refcnt; /* object reference count */ 311*7c478bd9Sstevel@tonic-gate pthread_cond_t obj_free_cond; /* cond variable for signal and wait */ 312*7c478bd9Sstevel@tonic-gate uint32_t obj_delete_sync; /* object delete sync flags */ 313*7c478bd9Sstevel@tonic-gate 314*7c478bd9Sstevel@tonic-gate } soft_object_t; 315*7c478bd9Sstevel@tonic-gate 316*7c478bd9Sstevel@tonic-gate typedef struct find_context { 317*7c478bd9Sstevel@tonic-gate soft_object_t **objs_found; 318*7c478bd9Sstevel@tonic-gate CK_ULONG num_results; 319*7c478bd9Sstevel@tonic-gate CK_ULONG next_result_index; /* next result object to return */ 320*7c478bd9Sstevel@tonic-gate } find_context_t; 321*7c478bd9Sstevel@tonic-gate 322*7c478bd9Sstevel@tonic-gate /* 323*7c478bd9Sstevel@tonic-gate * The following structure is used to link the to-be-freed session 324*7c478bd9Sstevel@tonic-gate * objects into a linked list. The objects on this linked list have 325*7c478bd9Sstevel@tonic-gate * not yet been freed via free() after C_DestroyObject() call; instead 326*7c478bd9Sstevel@tonic-gate * they are added to this list. The actual free will take place when 327*7c478bd9Sstevel@tonic-gate * the number of objects queued reaches MAX_OBJ_TO_BE_FREED, at which 328*7c478bd9Sstevel@tonic-gate * time the first object in the list will be freed. 329*7c478bd9Sstevel@tonic-gate */ 330*7c478bd9Sstevel@tonic-gate #define MAX_OBJ_TO_BE_FREED 300 331*7c478bd9Sstevel@tonic-gate 332*7c478bd9Sstevel@tonic-gate typedef struct obj_to_be_freed_list { 333*7c478bd9Sstevel@tonic-gate struct object *first; /* points to the first obj in the list */ 334*7c478bd9Sstevel@tonic-gate struct object *last; /* points to the last obj in the list */ 335*7c478bd9Sstevel@tonic-gate uint32_t count; /* current total objs in the list */ 336*7c478bd9Sstevel@tonic-gate pthread_mutex_t obj_to_be_free_mutex; 337*7c478bd9Sstevel@tonic-gate } obj_to_be_freed_list_t; 338*7c478bd9Sstevel@tonic-gate 339*7c478bd9Sstevel@tonic-gate /* 340*7c478bd9Sstevel@tonic-gate * Object type 341*7c478bd9Sstevel@tonic-gate */ 342*7c478bd9Sstevel@tonic-gate #define SESSION_PUBLIC 0 /* CKA_TOKEN = 0, CKA_PRIVATE = 0 */ 343*7c478bd9Sstevel@tonic-gate #define SESSION_PRIVATE 1 /* CKA_TOKEN = 0, CKA_PRIVATE = 1 */ 344*7c478bd9Sstevel@tonic-gate #define TOKEN_PUBLIC 2 /* CKA_TOKEN = 1, CKA_PRIVATE = 0 */ 345*7c478bd9Sstevel@tonic-gate #define TOKEN_PRIVATE 3 /* CKA_TOKEN = 1, CKA_PRIVATE = 1 */ 346*7c478bd9Sstevel@tonic-gate 347*7c478bd9Sstevel@tonic-gate #define TOKEN_OBJECT 2 348*7c478bd9Sstevel@tonic-gate #define PRIVATE_OBJECT 1 349*7c478bd9Sstevel@tonic-gate 350*7c478bd9Sstevel@tonic-gate typedef enum { 351*7c478bd9Sstevel@tonic-gate ALL_TOKEN = 0, 352*7c478bd9Sstevel@tonic-gate PUBLIC_TOKEN = 1, 353*7c478bd9Sstevel@tonic-gate PRIVATE_TOKEN = 2 354*7c478bd9Sstevel@tonic-gate } token_obj_type_t; 355*7c478bd9Sstevel@tonic-gate 356*7c478bd9Sstevel@tonic-gate #define IS_TOKEN_OBJECT(objp) \ 357*7c478bd9Sstevel@tonic-gate ((objp->object_type == TOKEN_PUBLIC) || \ 358*7c478bd9Sstevel@tonic-gate (objp->object_type == TOKEN_PRIVATE)) 359*7c478bd9Sstevel@tonic-gate 360*7c478bd9Sstevel@tonic-gate /* 361*7c478bd9Sstevel@tonic-gate * Types associated with copying object's content 362*7c478bd9Sstevel@tonic-gate */ 363*7c478bd9Sstevel@tonic-gate #define SOFT_SET_ATTR_VALUE 1 /* for C_SetAttributeValue */ 364*7c478bd9Sstevel@tonic-gate #define SOFT_COPY_OBJECT 2 /* for C_CopyObject */ 365*7c478bd9Sstevel@tonic-gate #define SOFT_COPY_OBJ_ORIG_SH 3 /* for copying an object but keeps */ 366*7c478bd9Sstevel@tonic-gate /* the original session handle */ 367*7c478bd9Sstevel@tonic-gate 368*7c478bd9Sstevel@tonic-gate /* 369*7c478bd9Sstevel@tonic-gate * The following definitions are the shortcuts 370*7c478bd9Sstevel@tonic-gate */ 371*7c478bd9Sstevel@tonic-gate 372*7c478bd9Sstevel@tonic-gate /* 373*7c478bd9Sstevel@tonic-gate * RSA Public Key Object Attributes 374*7c478bd9Sstevel@tonic-gate */ 375*7c478bd9Sstevel@tonic-gate #define OBJ_PUB(o) \ 376*7c478bd9Sstevel@tonic-gate ((o)->object_class_u.public_key) 377*7c478bd9Sstevel@tonic-gate #define KEY_PUB_RSA(k) \ 378*7c478bd9Sstevel@tonic-gate &((k)->key_type_u.rsa_pub_key) 379*7c478bd9Sstevel@tonic-gate #define OBJ_PUB_RSA_MOD(o) \ 380*7c478bd9Sstevel@tonic-gate &((o)->object_class_u.public_key->key_type_u.rsa_pub_key.modulus) 381*7c478bd9Sstevel@tonic-gate #define KEY_PUB_RSA_MOD(k) \ 382*7c478bd9Sstevel@tonic-gate &((k)->key_type_u.rsa_pub_key.modulus) 383*7c478bd9Sstevel@tonic-gate #define OBJ_PUB_RSA_PUBEXPO(o) \ 384*7c478bd9Sstevel@tonic-gate &((o)->object_class_u.public_key->key_type_u.rsa_pub_key.pub_exponent) 385*7c478bd9Sstevel@tonic-gate #define KEY_PUB_RSA_PUBEXPO(k) \ 386*7c478bd9Sstevel@tonic-gate &((k)->key_type_u.rsa_pub_key.pub_exponent) 387*7c478bd9Sstevel@tonic-gate #define OBJ_PUB_RSA_MOD_BITS(o) \ 388*7c478bd9Sstevel@tonic-gate ((o)->object_class_u.public_key->key_type_u.rsa_pub_key.modulus_bits) 389*7c478bd9Sstevel@tonic-gate #define KEY_PUB_RSA_MOD_BITS(k) \ 390*7c478bd9Sstevel@tonic-gate ((k)->key_type_u.rsa_pub_key.modulus_bits) 391*7c478bd9Sstevel@tonic-gate 392*7c478bd9Sstevel@tonic-gate /* 393*7c478bd9Sstevel@tonic-gate * DSA Public Key Object Attributes 394*7c478bd9Sstevel@tonic-gate */ 395*7c478bd9Sstevel@tonic-gate #define KEY_PUB_DSA(k) \ 396*7c478bd9Sstevel@tonic-gate &((k)->key_type_u.dsa_pub_key) 397*7c478bd9Sstevel@tonic-gate #define OBJ_PUB_DSA_PRIME(o) \ 398*7c478bd9Sstevel@tonic-gate &((o)->object_class_u.public_key->key_type_u.dsa_pub_key.prime) 399*7c478bd9Sstevel@tonic-gate #define KEY_PUB_DSA_PRIME(k) \ 400*7c478bd9Sstevel@tonic-gate &((k)->key_type_u.dsa_pub_key.prime) 401*7c478bd9Sstevel@tonic-gate #define OBJ_PUB_DSA_SUBPRIME(o) \ 402*7c478bd9Sstevel@tonic-gate &((o)->object_class_u.public_key->key_type_u.dsa_pub_key.subprime) 403*7c478bd9Sstevel@tonic-gate #define KEY_PUB_DSA_SUBPRIME(k) \ 404*7c478bd9Sstevel@tonic-gate &((k)->key_type_u.dsa_pub_key.subprime) 405*7c478bd9Sstevel@tonic-gate #define OBJ_PUB_DSA_BASE(o) \ 406*7c478bd9Sstevel@tonic-gate &((o)->object_class_u.public_key->key_type_u.dsa_pub_key.base) 407*7c478bd9Sstevel@tonic-gate #define KEY_PUB_DSA_BASE(k) \ 408*7c478bd9Sstevel@tonic-gate &((k)->key_type_u.dsa_pub_key.base) 409*7c478bd9Sstevel@tonic-gate #define OBJ_PUB_DSA_VALUE(o) \ 410*7c478bd9Sstevel@tonic-gate &((o)->object_class_u.public_key->key_type_u.dsa_pub_key.value) 411*7c478bd9Sstevel@tonic-gate #define KEY_PUB_DSA_VALUE(k) \ 412*7c478bd9Sstevel@tonic-gate &((k)->key_type_u.dsa_pub_key.value) 413*7c478bd9Sstevel@tonic-gate 414*7c478bd9Sstevel@tonic-gate /* 415*7c478bd9Sstevel@tonic-gate * Diffie-Hellman Public Key Object Attributes 416*7c478bd9Sstevel@tonic-gate */ 417*7c478bd9Sstevel@tonic-gate #define KEY_PUB_DH(k) \ 418*7c478bd9Sstevel@tonic-gate &((k)->key_type_u.dh_pub_key) 419*7c478bd9Sstevel@tonic-gate #define OBJ_PUB_DH_PRIME(o) \ 420*7c478bd9Sstevel@tonic-gate &((o)->object_class_u.public_key->key_type_u.dh_pub_key.prime) 421*7c478bd9Sstevel@tonic-gate #define KEY_PUB_DH_PRIME(k) \ 422*7c478bd9Sstevel@tonic-gate &((k)->key_type_u.dh_pub_key.prime) 423*7c478bd9Sstevel@tonic-gate #define OBJ_PUB_DH_BASE(o) \ 424*7c478bd9Sstevel@tonic-gate &((o)->object_class_u.public_key->key_type_u.dh_pub_key.base) 425*7c478bd9Sstevel@tonic-gate #define KEY_PUB_DH_BASE(k) \ 426*7c478bd9Sstevel@tonic-gate &((k)->key_type_u.dh_pub_key.base) 427*7c478bd9Sstevel@tonic-gate #define OBJ_PUB_DH_VALUE(o) \ 428*7c478bd9Sstevel@tonic-gate &((o)->object_class_u.public_key->key_type_u.dh_pub_key.value) 429*7c478bd9Sstevel@tonic-gate #define KEY_PUB_DH_VALUE(k) \ 430*7c478bd9Sstevel@tonic-gate &((k)->key_type_u.dh_pub_key.value) 431*7c478bd9Sstevel@tonic-gate 432*7c478bd9Sstevel@tonic-gate /* 433*7c478bd9Sstevel@tonic-gate * X9.42 Diffie-Hellman Public Key Object Attributes 434*7c478bd9Sstevel@tonic-gate */ 435*7c478bd9Sstevel@tonic-gate #define KEY_PUB_DH942(k) \ 436*7c478bd9Sstevel@tonic-gate &((k)->key_type_u.dh942_pub_key) 437*7c478bd9Sstevel@tonic-gate #define OBJ_PUB_DH942_PRIME(o) \ 438*7c478bd9Sstevel@tonic-gate &((o)->object_class_u.public_key->key_type_u.dh942_pub_key.prime) 439*7c478bd9Sstevel@tonic-gate #define KEY_PUB_DH942_PRIME(k) \ 440*7c478bd9Sstevel@tonic-gate &((k)->key_type_u.dh942_pub_key.prime) 441*7c478bd9Sstevel@tonic-gate #define OBJ_PUB_DH942_BASE(o) \ 442*7c478bd9Sstevel@tonic-gate &((o)->object_class_u.public_key->key_type_u.dh942_pub_key.base) 443*7c478bd9Sstevel@tonic-gate #define KEY_PUB_DH942_BASE(k) \ 444*7c478bd9Sstevel@tonic-gate &((k)->key_type_u.dh942_pub_key.base) 445*7c478bd9Sstevel@tonic-gate #define OBJ_PUB_DH942_SUBPRIME(o) \ 446*7c478bd9Sstevel@tonic-gate &((o)->object_class_u.public_key->key_type_u.dh942_pub_key.subprime) 447*7c478bd9Sstevel@tonic-gate #define KEY_PUB_DH942_SUBPRIME(k) \ 448*7c478bd9Sstevel@tonic-gate &((k)->key_type_u.dh942_pub_key.subprime) 449*7c478bd9Sstevel@tonic-gate #define OBJ_PUB_DH942_VALUE(o) \ 450*7c478bd9Sstevel@tonic-gate &((o)->object_class_u.public_key->key_type_u.dh942_pub_key.value) 451*7c478bd9Sstevel@tonic-gate #define KEY_PUB_DH942_VALUE(k) \ 452*7c478bd9Sstevel@tonic-gate &((k)->key_type_u.dh942_pub_key.value) 453*7c478bd9Sstevel@tonic-gate 454*7c478bd9Sstevel@tonic-gate /* 455*7c478bd9Sstevel@tonic-gate * RSA Private Key Object Attributes 456*7c478bd9Sstevel@tonic-gate */ 457*7c478bd9Sstevel@tonic-gate #define OBJ_PRI(o) \ 458*7c478bd9Sstevel@tonic-gate ((o)->object_class_u.private_key) 459*7c478bd9Sstevel@tonic-gate #define KEY_PRI_RSA(k) \ 460*7c478bd9Sstevel@tonic-gate &((k)->key_type_u.rsa_pri_key) 461*7c478bd9Sstevel@tonic-gate #define OBJ_PRI_RSA_MOD(o) \ 462*7c478bd9Sstevel@tonic-gate &((o)->object_class_u.private_key->key_type_u.rsa_pri_key.modulus) 463*7c478bd9Sstevel@tonic-gate #define KEY_PRI_RSA_MOD(k) \ 464*7c478bd9Sstevel@tonic-gate &((k)->key_type_u.rsa_pri_key.modulus) 465*7c478bd9Sstevel@tonic-gate #define OBJ_PRI_RSA_PUBEXPO(o) \ 466*7c478bd9Sstevel@tonic-gate &((o)->object_class_u.private_key->key_type_u.rsa_pri_key.pub_exponent) 467*7c478bd9Sstevel@tonic-gate #define KEY_PRI_RSA_PUBEXPO(k) \ 468*7c478bd9Sstevel@tonic-gate &((k)->key_type_u.rsa_pri_key.pub_exponent) 469*7c478bd9Sstevel@tonic-gate #define OBJ_PRI_RSA_PRIEXPO(o) \ 470*7c478bd9Sstevel@tonic-gate &((o)->object_class_u.private_key->key_type_u.rsa_pri_key.pri_exponent) 471*7c478bd9Sstevel@tonic-gate #define KEY_PRI_RSA_PRIEXPO(k) \ 472*7c478bd9Sstevel@tonic-gate &((k)->key_type_u.rsa_pri_key.pri_exponent) 473*7c478bd9Sstevel@tonic-gate #define OBJ_PRI_RSA_PRIME1(o) \ 474*7c478bd9Sstevel@tonic-gate &((o)->object_class_u.private_key->key_type_u.rsa_pri_key.prime_1) 475*7c478bd9Sstevel@tonic-gate #define KEY_PRI_RSA_PRIME1(k) \ 476*7c478bd9Sstevel@tonic-gate &((k)->key_type_u.rsa_pri_key.prime_1) 477*7c478bd9Sstevel@tonic-gate #define OBJ_PRI_RSA_PRIME2(o) \ 478*7c478bd9Sstevel@tonic-gate &((o)->object_class_u.private_key->key_type_u.rsa_pri_key.prime_2) 479*7c478bd9Sstevel@tonic-gate #define KEY_PRI_RSA_PRIME2(k) \ 480*7c478bd9Sstevel@tonic-gate &((k)->key_type_u.rsa_pri_key.prime_2) 481*7c478bd9Sstevel@tonic-gate #define OBJ_PRI_RSA_EXPO1(o) \ 482*7c478bd9Sstevel@tonic-gate &((o)->object_class_u.private_key->key_type_u.rsa_pri_key.exponent_1) 483*7c478bd9Sstevel@tonic-gate #define KEY_PRI_RSA_EXPO1(k) \ 484*7c478bd9Sstevel@tonic-gate &((k)->key_type_u.rsa_pri_key.exponent_1) 485*7c478bd9Sstevel@tonic-gate #define OBJ_PRI_RSA_EXPO2(o) \ 486*7c478bd9Sstevel@tonic-gate &((o)->object_class_u.private_key->key_type_u.rsa_pri_key.exponent_2) 487*7c478bd9Sstevel@tonic-gate #define KEY_PRI_RSA_EXPO2(k) \ 488*7c478bd9Sstevel@tonic-gate &((k)->key_type_u.rsa_pri_key.exponent_2) 489*7c478bd9Sstevel@tonic-gate #define OBJ_PRI_RSA_COEF(o) \ 490*7c478bd9Sstevel@tonic-gate &((o)->object_class_u.private_key->key_type_u.rsa_pri_key.coefficient) 491*7c478bd9Sstevel@tonic-gate #define KEY_PRI_RSA_COEF(k) \ 492*7c478bd9Sstevel@tonic-gate &((k)->key_type_u.rsa_pri_key.coefficient) 493*7c478bd9Sstevel@tonic-gate 494*7c478bd9Sstevel@tonic-gate /* 495*7c478bd9Sstevel@tonic-gate * DSA Private Key Object Attributes 496*7c478bd9Sstevel@tonic-gate */ 497*7c478bd9Sstevel@tonic-gate #define KEY_PRI_DSA(k) \ 498*7c478bd9Sstevel@tonic-gate &((k)->key_type_u.dsa_pri_key) 499*7c478bd9Sstevel@tonic-gate #define OBJ_PRI_DSA_PRIME(o) \ 500*7c478bd9Sstevel@tonic-gate &((o)->object_class_u.private_key->key_type_u.dsa_pri_key.prime) 501*7c478bd9Sstevel@tonic-gate #define KEY_PRI_DSA_PRIME(k) \ 502*7c478bd9Sstevel@tonic-gate &((k)->key_type_u.dsa_pri_key.prime) 503*7c478bd9Sstevel@tonic-gate #define OBJ_PRI_DSA_SUBPRIME(o) \ 504*7c478bd9Sstevel@tonic-gate &((o)->object_class_u.private_key->key_type_u.dsa_pri_key.subprime) 505*7c478bd9Sstevel@tonic-gate #define KEY_PRI_DSA_SUBPRIME(k) \ 506*7c478bd9Sstevel@tonic-gate &((k)->key_type_u.dsa_pri_key.subprime) 507*7c478bd9Sstevel@tonic-gate #define OBJ_PRI_DSA_BASE(o) \ 508*7c478bd9Sstevel@tonic-gate &((o)->object_class_u.private_key->key_type_u.dsa_pri_key.base) 509*7c478bd9Sstevel@tonic-gate #define KEY_PRI_DSA_BASE(k) \ 510*7c478bd9Sstevel@tonic-gate &((k)->key_type_u.dsa_pri_key.base) 511*7c478bd9Sstevel@tonic-gate #define OBJ_PRI_DSA_VALUE(o) \ 512*7c478bd9Sstevel@tonic-gate &((o)->object_class_u.private_key->key_type_u.dsa_pri_key.value) 513*7c478bd9Sstevel@tonic-gate #define KEY_PRI_DSA_VALUE(k) \ 514*7c478bd9Sstevel@tonic-gate &((k)->key_type_u.dsa_pri_key.value) 515*7c478bd9Sstevel@tonic-gate 516*7c478bd9Sstevel@tonic-gate /* 517*7c478bd9Sstevel@tonic-gate * Diffie-Hellman Private Key Object Attributes 518*7c478bd9Sstevel@tonic-gate */ 519*7c478bd9Sstevel@tonic-gate #define KEY_PRI_DH(k) \ 520*7c478bd9Sstevel@tonic-gate &((k)->key_type_u.dh_pri_key) 521*7c478bd9Sstevel@tonic-gate #define OBJ_PRI_DH_PRIME(o) \ 522*7c478bd9Sstevel@tonic-gate &((o)->object_class_u.private_key->key_type_u.dh_pri_key.prime) 523*7c478bd9Sstevel@tonic-gate #define KEY_PRI_DH_PRIME(k) \ 524*7c478bd9Sstevel@tonic-gate &((k)->key_type_u.dh_pri_key.prime) 525*7c478bd9Sstevel@tonic-gate #define OBJ_PRI_DH_BASE(o) \ 526*7c478bd9Sstevel@tonic-gate &((o)->object_class_u.private_key->key_type_u.dh_pri_key.base) 527*7c478bd9Sstevel@tonic-gate #define KEY_PRI_DH_BASE(k) \ 528*7c478bd9Sstevel@tonic-gate &((k)->key_type_u.dh_pri_key.base) 529*7c478bd9Sstevel@tonic-gate #define OBJ_PRI_DH_VALUE(o) \ 530*7c478bd9Sstevel@tonic-gate &((o)->object_class_u.private_key->key_type_u.dh_pri_key.value) 531*7c478bd9Sstevel@tonic-gate #define KEY_PRI_DH_VALUE(k) \ 532*7c478bd9Sstevel@tonic-gate &((k)->key_type_u.dh_pri_key.value) 533*7c478bd9Sstevel@tonic-gate #define OBJ_PRI_DH_VAL_BITS(o) \ 534*7c478bd9Sstevel@tonic-gate ((o)->object_class_u.private_key->key_type_u.dh_pri_key.value_bits) 535*7c478bd9Sstevel@tonic-gate #define KEY_PRI_DH_VAL_BITS(k) \ 536*7c478bd9Sstevel@tonic-gate ((k)->key_type_u.dh_pri_key.value_bits) 537*7c478bd9Sstevel@tonic-gate 538*7c478bd9Sstevel@tonic-gate /* 539*7c478bd9Sstevel@tonic-gate * X9.42 Diffie-Hellman Private Key Object Attributes 540*7c478bd9Sstevel@tonic-gate */ 541*7c478bd9Sstevel@tonic-gate #define KEY_PRI_DH942(k) \ 542*7c478bd9Sstevel@tonic-gate &((k)->key_type_u.dh942_pri_key) 543*7c478bd9Sstevel@tonic-gate #define OBJ_PRI_DH942_PRIME(o) \ 544*7c478bd9Sstevel@tonic-gate &((o)->object_class_u.private_key->key_type_u.dh942_pri_key.prime) 545*7c478bd9Sstevel@tonic-gate #define KEY_PRI_DH942_PRIME(k) \ 546*7c478bd9Sstevel@tonic-gate &((k)->key_type_u.dh942_pri_key.prime) 547*7c478bd9Sstevel@tonic-gate #define OBJ_PRI_DH942_BASE(o) \ 548*7c478bd9Sstevel@tonic-gate &((o)->object_class_u.private_key->key_type_u.dh942_pri_key.base) 549*7c478bd9Sstevel@tonic-gate #define KEY_PRI_DH942_BASE(k) \ 550*7c478bd9Sstevel@tonic-gate &((k)->key_type_u.dh942_pri_key.base) 551*7c478bd9Sstevel@tonic-gate #define OBJ_PRI_DH942_SUBPRIME(o) \ 552*7c478bd9Sstevel@tonic-gate &((o)->object_class_u.private_key->key_type_u.dh942_pri_key.subprime) 553*7c478bd9Sstevel@tonic-gate #define KEY_PRI_DH942_SUBPRIME(k) \ 554*7c478bd9Sstevel@tonic-gate &((k)->key_type_u.dh942_pri_key.subprime) 555*7c478bd9Sstevel@tonic-gate #define OBJ_PRI_DH942_VALUE(o) \ 556*7c478bd9Sstevel@tonic-gate &((o)->object_class_u.private_key->key_type_u.dh942_pri_key.value) 557*7c478bd9Sstevel@tonic-gate #define KEY_PRI_DH942_VALUE(k) \ 558*7c478bd9Sstevel@tonic-gate &((k)->key_type_u.dh942_pri_key.value) 559*7c478bd9Sstevel@tonic-gate 560*7c478bd9Sstevel@tonic-gate /* 561*7c478bd9Sstevel@tonic-gate * DSA Domain Parameters Object Attributes 562*7c478bd9Sstevel@tonic-gate */ 563*7c478bd9Sstevel@tonic-gate #define OBJ_DOM(o) \ 564*7c478bd9Sstevel@tonic-gate ((o)->object_class_u.domain) 565*7c478bd9Sstevel@tonic-gate #define KEY_DOM_DSA(k) \ 566*7c478bd9Sstevel@tonic-gate &((k)->key_type_u.dsa_dom_key) 567*7c478bd9Sstevel@tonic-gate #define OBJ_DOM_DSA_PRIME(o) \ 568*7c478bd9Sstevel@tonic-gate &((o)->object_class_u.domain->key_type_u.dsa_dom_key.prime) 569*7c478bd9Sstevel@tonic-gate #define KEY_DOM_DSA_PRIME(k) \ 570*7c478bd9Sstevel@tonic-gate &((k)->key_type_u.dsa_dom_key.prime) 571*7c478bd9Sstevel@tonic-gate #define OBJ_DOM_DSA_SUBPRIME(o) \ 572*7c478bd9Sstevel@tonic-gate &((o)->object_class_u.domain->key_type_u.dsa_dom_key.subprime) 573*7c478bd9Sstevel@tonic-gate #define KEY_DOM_DSA_SUBPRIME(k) \ 574*7c478bd9Sstevel@tonic-gate &((k)->key_type_u.dsa_dom_key.subprime) 575*7c478bd9Sstevel@tonic-gate #define OBJ_DOM_DSA_BASE(o) \ 576*7c478bd9Sstevel@tonic-gate &((o)->object_class_u.domain->key_type_u.dsa_dom_key.base) 577*7c478bd9Sstevel@tonic-gate #define KEY_DOM_DSA_BASE(k) \ 578*7c478bd9Sstevel@tonic-gate &((k)->key_type_u.dsa_dom_key.base) 579*7c478bd9Sstevel@tonic-gate #define OBJ_DOM_DSA_PRIME_BITS(o) \ 580*7c478bd9Sstevel@tonic-gate ((o)->object_class_u.domain->key_type_u.dsa_dom_key.prime_bits) 581*7c478bd9Sstevel@tonic-gate 582*7c478bd9Sstevel@tonic-gate /* 583*7c478bd9Sstevel@tonic-gate * Diffie-Hellman Domain Parameters Object Attributes 584*7c478bd9Sstevel@tonic-gate */ 585*7c478bd9Sstevel@tonic-gate #define KEY_DOM_DH(k) \ 586*7c478bd9Sstevel@tonic-gate &((k)->key_type_u.dh_dom_key) 587*7c478bd9Sstevel@tonic-gate #define OBJ_DOM_DH_PRIME(o) \ 588*7c478bd9Sstevel@tonic-gate &((o)->object_class_u.domain->key_type_u.dh_dom_key.prime) 589*7c478bd9Sstevel@tonic-gate #define KEY_DOM_DH_PRIME(k) \ 590*7c478bd9Sstevel@tonic-gate &((k)->key_type_u.dh_dom_key.prime) 591*7c478bd9Sstevel@tonic-gate #define OBJ_DOM_DH_BASE(o) \ 592*7c478bd9Sstevel@tonic-gate &((o)->object_class_u.domain->key_type_u.dh_dom_key.base) 593*7c478bd9Sstevel@tonic-gate #define KEY_DOM_DH_BASE(k) \ 594*7c478bd9Sstevel@tonic-gate &((k)->key_type_u.dh_dom_key.base) 595*7c478bd9Sstevel@tonic-gate #define OBJ_DOM_DH_PRIME_BITS(o) \ 596*7c478bd9Sstevel@tonic-gate ((o)->object_class_u.domain->key_type_u.dh_dom_key.prime_bits) 597*7c478bd9Sstevel@tonic-gate 598*7c478bd9Sstevel@tonic-gate /* 599*7c478bd9Sstevel@tonic-gate * X9.42 Diffie-Hellman Domain Parameters Object Attributes 600*7c478bd9Sstevel@tonic-gate */ 601*7c478bd9Sstevel@tonic-gate #define KEY_DOM_DH942(k) \ 602*7c478bd9Sstevel@tonic-gate &((k)->key_type_u.dh942_dom_key) 603*7c478bd9Sstevel@tonic-gate #define OBJ_DOM_DH942_PRIME(o) \ 604*7c478bd9Sstevel@tonic-gate &((o)->object_class_u.domain->key_type_u.dh942_dom_key.prime) 605*7c478bd9Sstevel@tonic-gate #define KEY_DOM_DH942_PRIME(k) \ 606*7c478bd9Sstevel@tonic-gate &((k)->key_type_u.dh942_dom_key.prime) 607*7c478bd9Sstevel@tonic-gate #define OBJ_DOM_DH942_BASE(o) \ 608*7c478bd9Sstevel@tonic-gate &((o)->object_class_u.domain->key_type_u.dh942_dom_key.base) 609*7c478bd9Sstevel@tonic-gate #define KEY_DOM_DH942_BASE(k) \ 610*7c478bd9Sstevel@tonic-gate &((k)->key_type_u.dh942_dom_key.base) 611*7c478bd9Sstevel@tonic-gate #define OBJ_DOM_DH942_SUBPRIME(o) \ 612*7c478bd9Sstevel@tonic-gate &((o)->object_class_u.domain->key_type_u.dh942_dom_key.subprime) 613*7c478bd9Sstevel@tonic-gate #define KEY_DOM_DH942_SUBPRIME(k) \ 614*7c478bd9Sstevel@tonic-gate &((k)->key_type_u.dh942_dom_key.subprime) 615*7c478bd9Sstevel@tonic-gate #define OBJ_DOM_DH942_PRIME_BITS(o) \ 616*7c478bd9Sstevel@tonic-gate ((o)->object_class_u.domain->key_type_u.dh942_dom_key.prime_bits) 617*7c478bd9Sstevel@tonic-gate #define OBJ_DOM_DH942_SUBPRIME_BITS(o) \ 618*7c478bd9Sstevel@tonic-gate ((o)->object_class_u.domain->key_type_u.dh942_dom_key.subprime_bits) 619*7c478bd9Sstevel@tonic-gate 620*7c478bd9Sstevel@tonic-gate /* 621*7c478bd9Sstevel@tonic-gate * Secret Key Object Attributes 622*7c478bd9Sstevel@tonic-gate */ 623*7c478bd9Sstevel@tonic-gate #define OBJ_SEC(o) \ 624*7c478bd9Sstevel@tonic-gate ((o)->object_class_u.secret_key) 625*7c478bd9Sstevel@tonic-gate #define OBJ_SEC_VALUE(o) \ 626*7c478bd9Sstevel@tonic-gate ((o)->object_class_u.secret_key->sk_value) 627*7c478bd9Sstevel@tonic-gate #define OBJ_SEC_VALUE_LEN(o) \ 628*7c478bd9Sstevel@tonic-gate ((o)->object_class_u.secret_key->sk_value_len) 629*7c478bd9Sstevel@tonic-gate #define OBJ_KEY_SCHED(o) \ 630*7c478bd9Sstevel@tonic-gate ((o)->object_class_u.secret_key->key_sched) 631*7c478bd9Sstevel@tonic-gate #define OBJ_KEY_SCHED_LEN(o) \ 632*7c478bd9Sstevel@tonic-gate ((o)->object_class_u.secret_key->keysched_len) 633*7c478bd9Sstevel@tonic-gate 634*7c478bd9Sstevel@tonic-gate #define OBJ_CERT(o) \ 635*7c478bd9Sstevel@tonic-gate ((o)->object_class_u.certificate) 636*7c478bd9Sstevel@tonic-gate /* 637*7c478bd9Sstevel@tonic-gate * X.509 Key Certificate object attributes 638*7c478bd9Sstevel@tonic-gate */ 639*7c478bd9Sstevel@tonic-gate #define X509_CERT(o) \ 640*7c478bd9Sstevel@tonic-gate ((o)->object_class_u.certificate->cert_type_u.x509) 641*7c478bd9Sstevel@tonic-gate #define X509_CERT_SUBJECT(o) \ 642*7c478bd9Sstevel@tonic-gate ((o)->object_class_u.certificate->cert_type_u.x509.subject) 643*7c478bd9Sstevel@tonic-gate #define X509_CERT_VALUE(o) \ 644*7c478bd9Sstevel@tonic-gate ((o)->object_class_u.certificate->cert_type_u.x509.value) 645*7c478bd9Sstevel@tonic-gate 646*7c478bd9Sstevel@tonic-gate /* 647*7c478bd9Sstevel@tonic-gate * X.509 Attribute Certificate object attributes 648*7c478bd9Sstevel@tonic-gate */ 649*7c478bd9Sstevel@tonic-gate #define X509_ATTR_CERT(o) \ 650*7c478bd9Sstevel@tonic-gate ((o)->object_class_u.certificate->cert_type_u.x509_attr) 651*7c478bd9Sstevel@tonic-gate #define X509_ATTR_CERT_OWNER(o) \ 652*7c478bd9Sstevel@tonic-gate ((o)->object_class_u.certificate->cert_type_u.x509_attr.owner) 653*7c478bd9Sstevel@tonic-gate #define X509_ATTR_CERT_VALUE(o) \ 654*7c478bd9Sstevel@tonic-gate ((o)->object_class_u.certificate->cert_type_u.x509_attr.value) 655*7c478bd9Sstevel@tonic-gate 656*7c478bd9Sstevel@tonic-gate /* 657*7c478bd9Sstevel@tonic-gate * key related attributes with CK_BBOOL data type 658*7c478bd9Sstevel@tonic-gate */ 659*7c478bd9Sstevel@tonic-gate #define DERIVE_BOOL_ON 0x00000001 660*7c478bd9Sstevel@tonic-gate #define LOCAL_BOOL_ON 0x00000002 661*7c478bd9Sstevel@tonic-gate #define SENSITIVE_BOOL_ON 0x00000004 662*7c478bd9Sstevel@tonic-gate #define SECONDARY_AUTH_BOOL_ON 0x00000008 663*7c478bd9Sstevel@tonic-gate #define ENCRYPT_BOOL_ON 0x00000010 664*7c478bd9Sstevel@tonic-gate #define DECRYPT_BOOL_ON 0x00000020 665*7c478bd9Sstevel@tonic-gate #define SIGN_BOOL_ON 0x00000040 666*7c478bd9Sstevel@tonic-gate #define SIGN_RECOVER_BOOL_ON 0x00000080 667*7c478bd9Sstevel@tonic-gate #define VERIFY_BOOL_ON 0x00000100 668*7c478bd9Sstevel@tonic-gate #define VERIFY_RECOVER_BOOL_ON 0x00000200 669*7c478bd9Sstevel@tonic-gate #define WRAP_BOOL_ON 0x00000400 670*7c478bd9Sstevel@tonic-gate #define UNWRAP_BOOL_ON 0x00000800 671*7c478bd9Sstevel@tonic-gate #define TRUSTED_BOOL_ON 0x00001000 672*7c478bd9Sstevel@tonic-gate #define EXTRACTABLE_BOOL_ON 0x00002000 673*7c478bd9Sstevel@tonic-gate #define ALWAYS_SENSITIVE_BOOL_ON 0x00004000 674*7c478bd9Sstevel@tonic-gate #define NEVER_EXTRACTABLE_BOOL_ON 0x00008000 675*7c478bd9Sstevel@tonic-gate #define NOT_MODIFIABLE_BOOL_ON 0x00010000 676*7c478bd9Sstevel@tonic-gate 677*7c478bd9Sstevel@tonic-gate #define PUBLIC_KEY_DEFAULT (ENCRYPT_BOOL_ON|\ 678*7c478bd9Sstevel@tonic-gate WRAP_BOOL_ON|\ 679*7c478bd9Sstevel@tonic-gate VERIFY_BOOL_ON|\ 680*7c478bd9Sstevel@tonic-gate VERIFY_RECOVER_BOOL_ON) 681*7c478bd9Sstevel@tonic-gate 682*7c478bd9Sstevel@tonic-gate #define PRIVATE_KEY_DEFAULT (DECRYPT_BOOL_ON|\ 683*7c478bd9Sstevel@tonic-gate UNWRAP_BOOL_ON|\ 684*7c478bd9Sstevel@tonic-gate SIGN_BOOL_ON|\ 685*7c478bd9Sstevel@tonic-gate SIGN_RECOVER_BOOL_ON|\ 686*7c478bd9Sstevel@tonic-gate EXTRACTABLE_BOOL_ON) 687*7c478bd9Sstevel@tonic-gate 688*7c478bd9Sstevel@tonic-gate #define SECRET_KEY_DEFAULT (ENCRYPT_BOOL_ON|\ 689*7c478bd9Sstevel@tonic-gate DECRYPT_BOOL_ON|\ 690*7c478bd9Sstevel@tonic-gate WRAP_BOOL_ON|\ 691*7c478bd9Sstevel@tonic-gate UNWRAP_BOOL_ON|\ 692*7c478bd9Sstevel@tonic-gate SIGN_BOOL_ON|\ 693*7c478bd9Sstevel@tonic-gate VERIFY_BOOL_ON|\ 694*7c478bd9Sstevel@tonic-gate EXTRACTABLE_BOOL_ON) 695*7c478bd9Sstevel@tonic-gate 696*7c478bd9Sstevel@tonic-gate /* 697*7c478bd9Sstevel@tonic-gate * MAX_KEY_ATTR_BUFLEN 698*7c478bd9Sstevel@tonic-gate * The maximum buffer size needed for public or private key attributes 699*7c478bd9Sstevel@tonic-gate * should be 514 bytes. Just to be safe we give a little more space. 700*7c478bd9Sstevel@tonic-gate */ 701*7c478bd9Sstevel@tonic-gate #define MAX_KEY_ATTR_BUFLEN 1024 702*7c478bd9Sstevel@tonic-gate 703*7c478bd9Sstevel@tonic-gate /* 704*7c478bd9Sstevel@tonic-gate * Flag definitions for obj_delete_sync 705*7c478bd9Sstevel@tonic-gate */ 706*7c478bd9Sstevel@tonic-gate #define OBJECT_IS_DELETING 1 /* Object is in a deleting state */ 707*7c478bd9Sstevel@tonic-gate #define OBJECT_REFCNT_WAITING 2 /* Waiting for object reference */ 708*7c478bd9Sstevel@tonic-gate /* count to become zero */ 709*7c478bd9Sstevel@tonic-gate 710*7c478bd9Sstevel@tonic-gate /* 711*7c478bd9Sstevel@tonic-gate * This macro is used to type cast an object handle to a pointer to 712*7c478bd9Sstevel@tonic-gate * the object struct. Also, it checks to see if the object struct 713*7c478bd9Sstevel@tonic-gate * is tagged with an object magic number. This is to detect when an 714*7c478bd9Sstevel@tonic-gate * application passes a bogus object pointer. 715*7c478bd9Sstevel@tonic-gate * Also, it checks to see if the object is in the deleting state that 716*7c478bd9Sstevel@tonic-gate * another thread is performing. If not, increment the object reference 717*7c478bd9Sstevel@tonic-gate * count by one. This is to prevent this object from being deleted by 718*7c478bd9Sstevel@tonic-gate * other thread. 719*7c478bd9Sstevel@tonic-gate */ 720*7c478bd9Sstevel@tonic-gate #define HANDLE2OBJECT_COMMON(hObject, object_p, rv, REFCNT_CODE) { \ 721*7c478bd9Sstevel@tonic-gate object_p = (soft_object_t *)(hObject); \ 722*7c478bd9Sstevel@tonic-gate if ((object_p == NULL) || \ 723*7c478bd9Sstevel@tonic-gate (object_p->magic_marker != SOFTTOKEN_OBJECT_MAGIC)) {\ 724*7c478bd9Sstevel@tonic-gate rv = CKR_OBJECT_HANDLE_INVALID; \ 725*7c478bd9Sstevel@tonic-gate } else { \ 726*7c478bd9Sstevel@tonic-gate (void) pthread_mutex_lock(&object_p->object_mutex); \ 727*7c478bd9Sstevel@tonic-gate if (!(object_p->obj_delete_sync & OBJECT_IS_DELETING)) { \ 728*7c478bd9Sstevel@tonic-gate REFCNT_CODE; \ 729*7c478bd9Sstevel@tonic-gate rv = CKR_OK; \ 730*7c478bd9Sstevel@tonic-gate } else { \ 731*7c478bd9Sstevel@tonic-gate rv = CKR_OBJECT_HANDLE_INVALID; \ 732*7c478bd9Sstevel@tonic-gate } \ 733*7c478bd9Sstevel@tonic-gate (void) pthread_mutex_unlock(&object_p->object_mutex); \ 734*7c478bd9Sstevel@tonic-gate } \ 735*7c478bd9Sstevel@tonic-gate } 736*7c478bd9Sstevel@tonic-gate 737*7c478bd9Sstevel@tonic-gate #define HANDLE2OBJECT(hObject, object_p, rv) \ 738*7c478bd9Sstevel@tonic-gate HANDLE2OBJECT_COMMON(hObject, object_p, rv, object_p->obj_refcnt++) 739*7c478bd9Sstevel@tonic-gate 740*7c478bd9Sstevel@tonic-gate #define HANDLE2OBJECT_DESTROY(hObject, object_p, rv) \ 741*7c478bd9Sstevel@tonic-gate HANDLE2OBJECT_COMMON(hObject, object_p, rv, /* no refcnt increment */) 742*7c478bd9Sstevel@tonic-gate 743*7c478bd9Sstevel@tonic-gate 744*7c478bd9Sstevel@tonic-gate #define OBJ_REFRELE(object_p) { \ 745*7c478bd9Sstevel@tonic-gate (void) pthread_mutex_lock(&object_p->object_mutex); \ 746*7c478bd9Sstevel@tonic-gate if ((--object_p->obj_refcnt) == 0 && \ 747*7c478bd9Sstevel@tonic-gate (object_p->obj_delete_sync & OBJECT_REFCNT_WAITING)) { \ 748*7c478bd9Sstevel@tonic-gate (void) pthread_cond_signal(&object_p->obj_free_cond); \ 749*7c478bd9Sstevel@tonic-gate } \ 750*7c478bd9Sstevel@tonic-gate (void) pthread_mutex_unlock(&object_p->object_mutex); \ 751*7c478bd9Sstevel@tonic-gate } 752*7c478bd9Sstevel@tonic-gate 753*7c478bd9Sstevel@tonic-gate /* 754*7c478bd9Sstevel@tonic-gate * Function Prototypes. 755*7c478bd9Sstevel@tonic-gate */ 756*7c478bd9Sstevel@tonic-gate void soft_cleanup_object(soft_object_t *objp); 757*7c478bd9Sstevel@tonic-gate 758*7c478bd9Sstevel@tonic-gate CK_RV soft_add_object(CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount, 759*7c478bd9Sstevel@tonic-gate CK_ULONG *objecthandle_p, soft_session_t *sp); 760*7c478bd9Sstevel@tonic-gate 761*7c478bd9Sstevel@tonic-gate void soft_delete_object(soft_session_t *sp, soft_object_t *objp, 762*7c478bd9Sstevel@tonic-gate boolean_t lock_held); 763*7c478bd9Sstevel@tonic-gate 764*7c478bd9Sstevel@tonic-gate void soft_cleanup_extra_attr(soft_object_t *object_p); 765*7c478bd9Sstevel@tonic-gate 766*7c478bd9Sstevel@tonic-gate CK_RV soft_copy_extra_attr(CK_ATTRIBUTE_INFO_PTR old_attrp, 767*7c478bd9Sstevel@tonic-gate soft_object_t *object_p); 768*7c478bd9Sstevel@tonic-gate 769*7c478bd9Sstevel@tonic-gate void soft_cleanup_object_bigint_attrs(soft_object_t *object_p); 770*7c478bd9Sstevel@tonic-gate 771*7c478bd9Sstevel@tonic-gate CK_RV soft_build_object(CK_ATTRIBUTE_PTR template, 772*7c478bd9Sstevel@tonic-gate CK_ULONG ulAttrNum, soft_object_t *new_object); 773*7c478bd9Sstevel@tonic-gate 774*7c478bd9Sstevel@tonic-gate CK_RV soft_build_secret_key_object(CK_ATTRIBUTE_PTR template, 775*7c478bd9Sstevel@tonic-gate CK_ULONG ulAttrNum, soft_object_t *new_object, CK_ULONG mode, 776*7c478bd9Sstevel@tonic-gate CK_ULONG key_len, CK_KEY_TYPE key_type); 777*7c478bd9Sstevel@tonic-gate 778*7c478bd9Sstevel@tonic-gate CK_RV soft_copy_object(soft_object_t *old_object, soft_object_t **new_object, 779*7c478bd9Sstevel@tonic-gate CK_ULONG object_func, soft_session_t *sp); 780*7c478bd9Sstevel@tonic-gate 781*7c478bd9Sstevel@tonic-gate void soft_merge_object(soft_object_t *old_object, soft_object_t *new_object); 782*7c478bd9Sstevel@tonic-gate 783*7c478bd9Sstevel@tonic-gate CK_RV soft_get_attribute(soft_object_t *object_p, CK_ATTRIBUTE_PTR template); 784*7c478bd9Sstevel@tonic-gate 785*7c478bd9Sstevel@tonic-gate CK_RV soft_set_attribute(soft_object_t *object_p, CK_ATTRIBUTE_PTR template, 786*7c478bd9Sstevel@tonic-gate boolean_t copy); 787*7c478bd9Sstevel@tonic-gate 788*7c478bd9Sstevel@tonic-gate CK_RV soft_set_common_storage_attribute(soft_object_t *object_p, 789*7c478bd9Sstevel@tonic-gate CK_ATTRIBUTE_PTR template, boolean_t copy); 790*7c478bd9Sstevel@tonic-gate 791*7c478bd9Sstevel@tonic-gate CK_RV soft_get_public_attr(soft_object_t *, CK_ATTRIBUTE_TYPE, uchar_t *, 792*7c478bd9Sstevel@tonic-gate uint32_t *); 793*7c478bd9Sstevel@tonic-gate 794*7c478bd9Sstevel@tonic-gate CK_RV soft_get_private_attr(soft_object_t *, CK_ATTRIBUTE_TYPE, uchar_t *, 795*7c478bd9Sstevel@tonic-gate uint32_t *); 796*7c478bd9Sstevel@tonic-gate 797*7c478bd9Sstevel@tonic-gate CK_RV get_ulong_attr_from_object(CK_ULONG value, CK_ATTRIBUTE_PTR template); 798*7c478bd9Sstevel@tonic-gate 799*7c478bd9Sstevel@tonic-gate void copy_bigint_attr(biginteger_t *src, biginteger_t *dst); 800*7c478bd9Sstevel@tonic-gate 801*7c478bd9Sstevel@tonic-gate void soft_add_object_to_session(soft_object_t *, soft_session_t *); 802*7c478bd9Sstevel@tonic-gate 803*7c478bd9Sstevel@tonic-gate CK_RV soft_build_key(CK_ATTRIBUTE_PTR, CK_ULONG, soft_object_t *, 804*7c478bd9Sstevel@tonic-gate CK_OBJECT_CLASS, CK_KEY_TYPE, CK_ULONG, CK_ULONG); 805*7c478bd9Sstevel@tonic-gate 806*7c478bd9Sstevel@tonic-gate CK_RV soft_copy_public_key_attr(public_key_obj_t *old_pub_key_obj_p, 807*7c478bd9Sstevel@tonic-gate public_key_obj_t **new_pub_key_obj_p, CK_KEY_TYPE key_type); 808*7c478bd9Sstevel@tonic-gate 809*7c478bd9Sstevel@tonic-gate CK_RV soft_copy_private_key_attr(private_key_obj_t *old_pri_key_obj_p, 810*7c478bd9Sstevel@tonic-gate private_key_obj_t **new_pri_key_obj_p, CK_KEY_TYPE key_type); 811*7c478bd9Sstevel@tonic-gate 812*7c478bd9Sstevel@tonic-gate CK_RV soft_copy_secret_key_attr(secret_key_obj_t *old_secret_key_obj_p, 813*7c478bd9Sstevel@tonic-gate secret_key_obj_t **new_secret_key_obj_p); 814*7c478bd9Sstevel@tonic-gate 815*7c478bd9Sstevel@tonic-gate CK_RV soft_copy_domain_attr(domain_obj_t *old_domain_obj_p, 816*7c478bd9Sstevel@tonic-gate domain_obj_t **new_domain_obj_p, CK_KEY_TYPE key_type); 817*7c478bd9Sstevel@tonic-gate 818*7c478bd9Sstevel@tonic-gate CK_RV soft_validate_attr(CK_ATTRIBUTE_PTR template, CK_ULONG ulAttrNum, 819*7c478bd9Sstevel@tonic-gate CK_OBJECT_CLASS *class); 820*7c478bd9Sstevel@tonic-gate 821*7c478bd9Sstevel@tonic-gate CK_RV soft_find_objects_init(soft_session_t *sp, CK_ATTRIBUTE_PTR pTemplate, 822*7c478bd9Sstevel@tonic-gate CK_ULONG ulCount); 823*7c478bd9Sstevel@tonic-gate 824*7c478bd9Sstevel@tonic-gate void soft_find_objects_final(soft_session_t *sp); 825*7c478bd9Sstevel@tonic-gate 826*7c478bd9Sstevel@tonic-gate void soft_find_objects(soft_session_t *sp, CK_OBJECT_HANDLE *obj_found, 827*7c478bd9Sstevel@tonic-gate CK_ULONG max_obj_requested, CK_ULONG *found_obj_count); 828*7c478bd9Sstevel@tonic-gate 829*7c478bd9Sstevel@tonic-gate void soft_process_find_attr(CK_OBJECT_CLASS *pclasses, 830*7c478bd9Sstevel@tonic-gate CK_ULONG *num_result_pclasses, CK_ATTRIBUTE_PTR pTemplate, 831*7c478bd9Sstevel@tonic-gate CK_ULONG ulCount); 832*7c478bd9Sstevel@tonic-gate 833*7c478bd9Sstevel@tonic-gate boolean_t soft_find_match_attrs(soft_object_t *obj, CK_OBJECT_CLASS *pclasses, 834*7c478bd9Sstevel@tonic-gate CK_ULONG num_pclasses, CK_ATTRIBUTE *tmpl_attr, CK_ULONG num_attr); 835*7c478bd9Sstevel@tonic-gate 836*7c478bd9Sstevel@tonic-gate CK_ATTRIBUTE_PTR get_extra_attr(CK_ATTRIBUTE_TYPE type, soft_object_t *obj); 837*7c478bd9Sstevel@tonic-gate 838*7c478bd9Sstevel@tonic-gate CK_RV get_string_from_template(CK_ATTRIBUTE_PTR dest, CK_ATTRIBUTE_PTR src); 839*7c478bd9Sstevel@tonic-gate 840*7c478bd9Sstevel@tonic-gate void string_attr_cleanup(CK_ATTRIBUTE_PTR template); 841*7c478bd9Sstevel@tonic-gate 842*7c478bd9Sstevel@tonic-gate void soft_cleanup_cert_object(soft_object_t *object_p); 843*7c478bd9Sstevel@tonic-gate 844*7c478bd9Sstevel@tonic-gate CK_RV soft_get_certificate_attribute(soft_object_t *object_p, 845*7c478bd9Sstevel@tonic-gate CK_ATTRIBUTE_PTR template); 846*7c478bd9Sstevel@tonic-gate 847*7c478bd9Sstevel@tonic-gate CK_RV soft_set_certificate_attribute(soft_object_t *object_p, 848*7c478bd9Sstevel@tonic-gate CK_ATTRIBUTE_PTR template, boolean_t copy); 849*7c478bd9Sstevel@tonic-gate 850*7c478bd9Sstevel@tonic-gate CK_RV soft_copy_certificate(certificate_obj_t *old, certificate_obj_t **new, 851*7c478bd9Sstevel@tonic-gate CK_CERTIFICATE_TYPE type); 852*7c478bd9Sstevel@tonic-gate 853*7c478bd9Sstevel@tonic-gate CK_RV get_cert_attr_from_template(cert_attr_t **dest, 854*7c478bd9Sstevel@tonic-gate CK_ATTRIBUTE_PTR src); 855*7c478bd9Sstevel@tonic-gate 856*7c478bd9Sstevel@tonic-gate /* Token object related function prototypes */ 857*7c478bd9Sstevel@tonic-gate 858*7c478bd9Sstevel@tonic-gate void soft_add_token_object_to_slot(soft_object_t *objp); 859*7c478bd9Sstevel@tonic-gate 860*7c478bd9Sstevel@tonic-gate void soft_remove_token_object_from_slot(soft_object_t *objp, 861*7c478bd9Sstevel@tonic-gate boolean_t lock_held); 862*7c478bd9Sstevel@tonic-gate 863*7c478bd9Sstevel@tonic-gate void soft_delete_token_object(soft_object_t *objp, boolean_t persistent, 864*7c478bd9Sstevel@tonic-gate boolean_t lock_held); 865*7c478bd9Sstevel@tonic-gate 866*7c478bd9Sstevel@tonic-gate void soft_delete_all_in_core_token_objects(token_obj_type_t type); 867*7c478bd9Sstevel@tonic-gate 868*7c478bd9Sstevel@tonic-gate void soft_validate_token_objects(boolean_t validate); 869*7c478bd9Sstevel@tonic-gate 870*7c478bd9Sstevel@tonic-gate CK_RV soft_object_write_access_check(soft_session_t *sp, soft_object_t *objp); 871*7c478bd9Sstevel@tonic-gate 872*7c478bd9Sstevel@tonic-gate CK_RV soft_pin_expired_check(soft_object_t *objp); 873*7c478bd9Sstevel@tonic-gate 874*7c478bd9Sstevel@tonic-gate CK_RV soft_copy_to_old_object(soft_object_t *new, soft_object_t *old); 875*7c478bd9Sstevel@tonic-gate 876*7c478bd9Sstevel@tonic-gate CK_RV soft_keystore_load_latest_object(soft_object_t *old_obj); 877*7c478bd9Sstevel@tonic-gate 878*7c478bd9Sstevel@tonic-gate CK_RV refresh_token_objects(); 879*7c478bd9Sstevel@tonic-gate 880*7c478bd9Sstevel@tonic-gate void bigint_attr_cleanup(biginteger_t *big); 881*7c478bd9Sstevel@tonic-gate 882*7c478bd9Sstevel@tonic-gate CK_RV soft_add_extra_attr(CK_ATTRIBUTE_PTR template, soft_object_t *object_p); 883*7c478bd9Sstevel@tonic-gate 884*7c478bd9Sstevel@tonic-gate CK_RV get_bigint_attr_from_template(biginteger_t *big, 885*7c478bd9Sstevel@tonic-gate CK_ATTRIBUTE_PTR template); 886*7c478bd9Sstevel@tonic-gate 887*7c478bd9Sstevel@tonic-gate #ifdef __cplusplus 888*7c478bd9Sstevel@tonic-gate } 889*7c478bd9Sstevel@tonic-gate #endif 890*7c478bd9Sstevel@tonic-gate 891*7c478bd9Sstevel@tonic-gate #endif /* _SOFTOBJECT_H */ 892