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 */ 21*12573SDina.Nimeh@Sun.COM 220Sstevel@tonic-gate /* 23*12573SDina.Nimeh@Sun.COM * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. 240Sstevel@tonic-gate */ 250Sstevel@tonic-gate 260Sstevel@tonic-gate #ifndef _SOFTOBJECT_H 270Sstevel@tonic-gate #define _SOFTOBJECT_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 <pthread.h> 340Sstevel@tonic-gate #include <security/pkcs11t.h> 350Sstevel@tonic-gate #include "softKeystoreUtil.h" 360Sstevel@tonic-gate #include "softSession.h" 370Sstevel@tonic-gate 380Sstevel@tonic-gate 390Sstevel@tonic-gate #define SOFTTOKEN_OBJECT_MAGIC 0xECF0B002 400Sstevel@tonic-gate 410Sstevel@tonic-gate #define SOFT_CREATE_OBJ 1 420Sstevel@tonic-gate #define SOFT_GEN_KEY 2 430Sstevel@tonic-gate #define SOFT_DERIVE_KEY_DH 3 /* for CKM_DH_PKCS_DERIVE */ 440Sstevel@tonic-gate #define SOFT_DERIVE_KEY_OTHER 4 /* for CKM_MD5_KEY_DERIVATION and */ 450Sstevel@tonic-gate /* CKM_SHA1_KEY_DERIVATION */ 460Sstevel@tonic-gate #define SOFT_UNWRAP_KEY 5 470Sstevel@tonic-gate #define SOFT_CREATE_OBJ_INT 6 /* internal object creation */ 480Sstevel@tonic-gate 490Sstevel@tonic-gate typedef struct biginteger { 500Sstevel@tonic-gate CK_BYTE *big_value; 510Sstevel@tonic-gate CK_ULONG big_value_len; 520Sstevel@tonic-gate } biginteger_t; 530Sstevel@tonic-gate 540Sstevel@tonic-gate 550Sstevel@tonic-gate /* 560Sstevel@tonic-gate * Secret key Struct 570Sstevel@tonic-gate */ 580Sstevel@tonic-gate typedef struct secret_key_obj { 590Sstevel@tonic-gate CK_BYTE *sk_value; 600Sstevel@tonic-gate CK_ULONG sk_value_len; 610Sstevel@tonic-gate void *key_sched; 620Sstevel@tonic-gate size_t keysched_len; 630Sstevel@tonic-gate } secret_key_obj_t; 640Sstevel@tonic-gate 650Sstevel@tonic-gate 660Sstevel@tonic-gate /* 670Sstevel@tonic-gate * PKCS11: RSA Public Key Object Attributes 680Sstevel@tonic-gate */ 690Sstevel@tonic-gate typedef struct rsa_pub_key { 700Sstevel@tonic-gate biginteger_t modulus; 710Sstevel@tonic-gate CK_ULONG modulus_bits; 720Sstevel@tonic-gate biginteger_t pub_exponent; 730Sstevel@tonic-gate } rsa_pub_key_t; 740Sstevel@tonic-gate 750Sstevel@tonic-gate 760Sstevel@tonic-gate /* 770Sstevel@tonic-gate * PKCS11: DSA Public Key Object Attributes 780Sstevel@tonic-gate */ 790Sstevel@tonic-gate typedef struct dsa_pub_key { 800Sstevel@tonic-gate biginteger_t prime; 810Sstevel@tonic-gate biginteger_t subprime; 820Sstevel@tonic-gate biginteger_t base; 830Sstevel@tonic-gate biginteger_t value; 840Sstevel@tonic-gate } dsa_pub_key_t; 850Sstevel@tonic-gate 860Sstevel@tonic-gate 870Sstevel@tonic-gate /* 880Sstevel@tonic-gate * PKCS11: Diffie-Hellman Public Key Object Attributes 890Sstevel@tonic-gate */ 900Sstevel@tonic-gate typedef struct dh_pub_key { 910Sstevel@tonic-gate biginteger_t prime; 920Sstevel@tonic-gate biginteger_t base; 930Sstevel@tonic-gate biginteger_t value; 940Sstevel@tonic-gate } dh_pub_key_t; 950Sstevel@tonic-gate 960Sstevel@tonic-gate 970Sstevel@tonic-gate /* 980Sstevel@tonic-gate * PKCS11: X9.42 Diffie-Hellman Public Key Object Attributes 990Sstevel@tonic-gate */ 1000Sstevel@tonic-gate typedef struct dh942_pub_key { 1010Sstevel@tonic-gate biginteger_t prime; 1020Sstevel@tonic-gate biginteger_t base; 1030Sstevel@tonic-gate biginteger_t subprime; 1040Sstevel@tonic-gate biginteger_t value; 1050Sstevel@tonic-gate } dh942_pub_key_t; 1060Sstevel@tonic-gate 1070Sstevel@tonic-gate 1080Sstevel@tonic-gate /* 1094219Smcpowers * PKCS11: Elliptic Curve Public Key Object Attributes 1104219Smcpowers */ 1114219Smcpowers typedef struct ec_pub_key { 1124219Smcpowers biginteger_t param; 1134219Smcpowers biginteger_t point; 1144219Smcpowers } ec_pub_key_t; 1154219Smcpowers 1164219Smcpowers 1174219Smcpowers /* 1180Sstevel@tonic-gate * Public Key Main Struct 1190Sstevel@tonic-gate */ 1200Sstevel@tonic-gate typedef struct public_key_obj { 1210Sstevel@tonic-gate union { 1220Sstevel@tonic-gate rsa_pub_key_t rsa_pub_key; /* RSA public key */ 1230Sstevel@tonic-gate dsa_pub_key_t dsa_pub_key; /* DSA public key */ 1240Sstevel@tonic-gate dh_pub_key_t dh_pub_key; /* DH public key */ 1250Sstevel@tonic-gate dh942_pub_key_t dh942_pub_key; /* DH9.42 public key */ 1264219Smcpowers ec_pub_key_t ec_pub_key; /* Elliptic Curve public key */ 1270Sstevel@tonic-gate } key_type_u; 1280Sstevel@tonic-gate } public_key_obj_t; 1290Sstevel@tonic-gate 1300Sstevel@tonic-gate /* 1310Sstevel@tonic-gate * PKCS11: RSA Private Key Object Attributes 1320Sstevel@tonic-gate */ 1330Sstevel@tonic-gate typedef struct rsa_pri_key { 1340Sstevel@tonic-gate biginteger_t modulus; 1350Sstevel@tonic-gate biginteger_t pub_exponent; 1360Sstevel@tonic-gate biginteger_t pri_exponent; 1370Sstevel@tonic-gate biginteger_t prime_1; 1380Sstevel@tonic-gate biginteger_t prime_2; 1390Sstevel@tonic-gate biginteger_t exponent_1; 1400Sstevel@tonic-gate biginteger_t exponent_2; 1410Sstevel@tonic-gate biginteger_t coefficient; 1420Sstevel@tonic-gate } rsa_pri_key_t; 1430Sstevel@tonic-gate 1440Sstevel@tonic-gate /* 1450Sstevel@tonic-gate * PKCS11: DSA Private Key Object Attributes 1460Sstevel@tonic-gate */ 1470Sstevel@tonic-gate typedef struct dsa_pri_key { 1480Sstevel@tonic-gate biginteger_t prime; 1490Sstevel@tonic-gate biginteger_t subprime; 1500Sstevel@tonic-gate biginteger_t base; 1510Sstevel@tonic-gate biginteger_t value; 1520Sstevel@tonic-gate } dsa_pri_key_t; 1530Sstevel@tonic-gate 1540Sstevel@tonic-gate 1550Sstevel@tonic-gate /* 1560Sstevel@tonic-gate * PKCS11: Diffie-Hellman Private Key Object Attributes 1570Sstevel@tonic-gate */ 1580Sstevel@tonic-gate typedef struct dh_pri_key { 1590Sstevel@tonic-gate biginteger_t prime; 1600Sstevel@tonic-gate biginteger_t base; 1610Sstevel@tonic-gate biginteger_t value; 1620Sstevel@tonic-gate CK_ULONG value_bits; 1630Sstevel@tonic-gate } dh_pri_key_t; 1640Sstevel@tonic-gate 1650Sstevel@tonic-gate /* 1660Sstevel@tonic-gate * PKCS11: X9.42 Diffie-Hellman Private Key Object Attributes 1670Sstevel@tonic-gate */ 1680Sstevel@tonic-gate typedef struct dh942_pri_key { 1690Sstevel@tonic-gate biginteger_t prime; 1700Sstevel@tonic-gate biginteger_t base; 1710Sstevel@tonic-gate biginteger_t subprime; 1720Sstevel@tonic-gate biginteger_t value; 1730Sstevel@tonic-gate } dh942_pri_key_t; 1740Sstevel@tonic-gate 1754219Smcpowers /* 1764219Smcpowers * PKCS11: Elliptic Curve Private Key Object Attributes 1774219Smcpowers */ 1784219Smcpowers typedef struct ec_pri_key { 1794219Smcpowers biginteger_t param; 1804219Smcpowers biginteger_t value; 1814219Smcpowers } ec_pri_key_t; 1824219Smcpowers 1830Sstevel@tonic-gate 1840Sstevel@tonic-gate /* 1850Sstevel@tonic-gate * Private Key Main Struct 1860Sstevel@tonic-gate */ 1870Sstevel@tonic-gate typedef struct private_key_obj { 1880Sstevel@tonic-gate union { 1890Sstevel@tonic-gate rsa_pri_key_t rsa_pri_key; /* RSA private key */ 1900Sstevel@tonic-gate dsa_pri_key_t dsa_pri_key; /* DSA private key */ 1910Sstevel@tonic-gate dh_pri_key_t dh_pri_key; /* DH private key */ 1920Sstevel@tonic-gate dh942_pri_key_t dh942_pri_key; /* DH9.42 private key */ 1934219Smcpowers ec_pri_key_t ec_pri_key; /* Elliptic Curve private key */ 1940Sstevel@tonic-gate } key_type_u; 1950Sstevel@tonic-gate } private_key_obj_t; 1960Sstevel@tonic-gate 1970Sstevel@tonic-gate /* 1980Sstevel@tonic-gate * PKCS11: DSA Domain Parameters Object Attributes 1990Sstevel@tonic-gate */ 2000Sstevel@tonic-gate typedef struct dsa_dom_key { 2010Sstevel@tonic-gate biginteger_t prime; 2020Sstevel@tonic-gate biginteger_t subprime; 2030Sstevel@tonic-gate biginteger_t base; 2040Sstevel@tonic-gate CK_ULONG prime_bits; 2050Sstevel@tonic-gate } dsa_dom_key_t; 2060Sstevel@tonic-gate 2070Sstevel@tonic-gate 2080Sstevel@tonic-gate /* 2090Sstevel@tonic-gate * PKCS11: Diffie-Hellman Domain Parameters Object Attributes 2100Sstevel@tonic-gate */ 2110Sstevel@tonic-gate typedef struct dh_dom_key { 2120Sstevel@tonic-gate biginteger_t prime; 2130Sstevel@tonic-gate biginteger_t base; 2140Sstevel@tonic-gate CK_ULONG prime_bits; 2150Sstevel@tonic-gate } dh_dom_key_t; 2160Sstevel@tonic-gate 2170Sstevel@tonic-gate 2180Sstevel@tonic-gate /* 2190Sstevel@tonic-gate * PKCS11: X9.42 Diffie-Hellman Domain Parameters Object Attributes 2200Sstevel@tonic-gate */ 2210Sstevel@tonic-gate typedef struct dh942_dom_key { 2220Sstevel@tonic-gate biginteger_t prime; 2230Sstevel@tonic-gate biginteger_t base; 2240Sstevel@tonic-gate biginteger_t subprime; 2250Sstevel@tonic-gate CK_ULONG prime_bits; 2260Sstevel@tonic-gate CK_ULONG subprime_bits; 2270Sstevel@tonic-gate } dh942_dom_key_t; 2280Sstevel@tonic-gate 2290Sstevel@tonic-gate /* 2300Sstevel@tonic-gate * Domain Parameters Main Struct 2310Sstevel@tonic-gate */ 2320Sstevel@tonic-gate typedef struct domain_obj { 2330Sstevel@tonic-gate union { 2340Sstevel@tonic-gate dsa_dom_key_t dsa_dom_key; /* DSA domain parameters */ 2350Sstevel@tonic-gate dh_dom_key_t dh_dom_key; /* DH domain parameters */ 2360Sstevel@tonic-gate dh942_dom_key_t dh942_dom_key; /* DH9.42 domain parameters */ 2370Sstevel@tonic-gate } key_type_u; 2380Sstevel@tonic-gate } domain_obj_t; 2390Sstevel@tonic-gate 2400Sstevel@tonic-gate typedef struct cert_attr_type { 2410Sstevel@tonic-gate CK_BYTE *value; 2420Sstevel@tonic-gate CK_ULONG length; 2430Sstevel@tonic-gate } cert_attr_t; 2440Sstevel@tonic-gate 2450Sstevel@tonic-gate /* 2460Sstevel@tonic-gate * X.509 Public Key Certificate Structure. 2470Sstevel@tonic-gate * This structure contains only the attributes that are 2480Sstevel@tonic-gate * NOT modifiable after creation. 2490Sstevel@tonic-gate * ID, ISSUER, and SUBJECT attributes are kept in the extra_attrlistp 2500Sstevel@tonic-gate * record. 2510Sstevel@tonic-gate */ 2520Sstevel@tonic-gate typedef struct x509_cert { 2530Sstevel@tonic-gate cert_attr_t *subject; /* DER encoding of certificate subject name */ 2540Sstevel@tonic-gate cert_attr_t *value; /* BER encoding of the cert */ 2550Sstevel@tonic-gate } x509_cert_t; 2560Sstevel@tonic-gate 2570Sstevel@tonic-gate /* 2580Sstevel@tonic-gate * X.509 Attribute Certificiate Structure 2590Sstevel@tonic-gate * This structure contains only the attributes that are 2600Sstevel@tonic-gate * NOT modifiable after creation. 2610Sstevel@tonic-gate * AC_ISSUER, SERIAL_NUMBER, and ATTR_TYPES are kept in the 2620Sstevel@tonic-gate * extra_attrlistp record so they may be modified. 2630Sstevel@tonic-gate */ 2640Sstevel@tonic-gate typedef struct x509_attr_cert { 2650Sstevel@tonic-gate cert_attr_t *owner; /* DER encoding of attr cert subject field */ 2660Sstevel@tonic-gate cert_attr_t *value; /* BER encoding of cert */ 2670Sstevel@tonic-gate } x509_attr_cert_t; 2680Sstevel@tonic-gate 2690Sstevel@tonic-gate /* 2700Sstevel@tonic-gate * Certificate Object Main Struct 2710Sstevel@tonic-gate */ 2720Sstevel@tonic-gate typedef struct certificate_obj { 2730Sstevel@tonic-gate CK_CERTIFICATE_TYPE certificate_type; 2740Sstevel@tonic-gate union { 2750Sstevel@tonic-gate x509_cert_t x509; 2760Sstevel@tonic-gate x509_attr_cert_t x509_attr; 2770Sstevel@tonic-gate } cert_type_u; 2780Sstevel@tonic-gate } certificate_obj_t; 2790Sstevel@tonic-gate 2800Sstevel@tonic-gate /* 2810Sstevel@tonic-gate * This structure is used to hold the attributes in the 2820Sstevel@tonic-gate * Extra Attribute List. 2830Sstevel@tonic-gate */ 2840Sstevel@tonic-gate typedef struct attribute_info { 2850Sstevel@tonic-gate CK_ATTRIBUTE attr; 2860Sstevel@tonic-gate struct attribute_info *next; 2870Sstevel@tonic-gate } attribute_info_t; 2880Sstevel@tonic-gate 2890Sstevel@tonic-gate 2900Sstevel@tonic-gate typedef attribute_info_t *CK_ATTRIBUTE_INFO_PTR; 2910Sstevel@tonic-gate 2920Sstevel@tonic-gate /* 2930Sstevel@tonic-gate * This is the main structure of the Objects. 2940Sstevel@tonic-gate */ 2950Sstevel@tonic-gate typedef struct object { 2960Sstevel@tonic-gate /* Generic common fields. Always present */ 2970Sstevel@tonic-gate uint_t version; /* for token objects only */ 2980Sstevel@tonic-gate CK_OBJECT_CLASS class; 2990Sstevel@tonic-gate CK_KEY_TYPE key_type; 3000Sstevel@tonic-gate CK_CERTIFICATE_TYPE cert_type; 3010Sstevel@tonic-gate ulong_t magic_marker; 3020Sstevel@tonic-gate uint64_t bool_attr_mask; /* see below */ 3030Sstevel@tonic-gate CK_MECHANISM_TYPE mechanism; 3040Sstevel@tonic-gate uchar_t object_type; /* see below */ 3050Sstevel@tonic-gate struct ks_obj_handle ks_handle; /* keystore handle */ 3060Sstevel@tonic-gate 3070Sstevel@tonic-gate /* Fields for access and arbitration */ 3080Sstevel@tonic-gate pthread_mutex_t object_mutex; 3090Sstevel@tonic-gate struct object *next; 3100Sstevel@tonic-gate struct object *prev; 3110Sstevel@tonic-gate 3120Sstevel@tonic-gate /* Extra non-boolean attribute list */ 3130Sstevel@tonic-gate CK_ATTRIBUTE_INFO_PTR extra_attrlistp; 3140Sstevel@tonic-gate 3150Sstevel@tonic-gate /* For each object, only one of these object classes is presented */ 3160Sstevel@tonic-gate union { 3170Sstevel@tonic-gate public_key_obj_t *public_key; 3180Sstevel@tonic-gate private_key_obj_t *private_key; 3190Sstevel@tonic-gate secret_key_obj_t *secret_key; 3200Sstevel@tonic-gate domain_obj_t *domain; 3210Sstevel@tonic-gate certificate_obj_t *certificate; 3220Sstevel@tonic-gate } object_class_u; 3230Sstevel@tonic-gate 3240Sstevel@tonic-gate /* Session handle that the object belongs to */ 3250Sstevel@tonic-gate CK_SESSION_HANDLE session_handle; 3260Sstevel@tonic-gate uint32_t obj_refcnt; /* object reference count */ 3270Sstevel@tonic-gate pthread_cond_t obj_free_cond; /* cond variable for signal and wait */ 3280Sstevel@tonic-gate uint32_t obj_delete_sync; /* object delete sync flags */ 3290Sstevel@tonic-gate 3300Sstevel@tonic-gate } soft_object_t; 3310Sstevel@tonic-gate 3320Sstevel@tonic-gate typedef struct find_context { 3330Sstevel@tonic-gate soft_object_t **objs_found; 3340Sstevel@tonic-gate CK_ULONG num_results; 3350Sstevel@tonic-gate CK_ULONG next_result_index; /* next result object to return */ 3360Sstevel@tonic-gate } find_context_t; 3370Sstevel@tonic-gate 3380Sstevel@tonic-gate /* 3390Sstevel@tonic-gate * The following structure is used to link the to-be-freed session 3400Sstevel@tonic-gate * objects into a linked list. The objects on this linked list have 3410Sstevel@tonic-gate * not yet been freed via free() after C_DestroyObject() call; instead 3420Sstevel@tonic-gate * they are added to this list. The actual free will take place when 3430Sstevel@tonic-gate * the number of objects queued reaches MAX_OBJ_TO_BE_FREED, at which 3440Sstevel@tonic-gate * time the first object in the list will be freed. 3450Sstevel@tonic-gate */ 3460Sstevel@tonic-gate #define MAX_OBJ_TO_BE_FREED 300 3470Sstevel@tonic-gate 3480Sstevel@tonic-gate typedef struct obj_to_be_freed_list { 3490Sstevel@tonic-gate struct object *first; /* points to the first obj in the list */ 3500Sstevel@tonic-gate struct object *last; /* points to the last obj in the list */ 3510Sstevel@tonic-gate uint32_t count; /* current total objs in the list */ 3520Sstevel@tonic-gate pthread_mutex_t obj_to_be_free_mutex; 3530Sstevel@tonic-gate } obj_to_be_freed_list_t; 3540Sstevel@tonic-gate 3550Sstevel@tonic-gate /* 3560Sstevel@tonic-gate * Object type 3570Sstevel@tonic-gate */ 3580Sstevel@tonic-gate #define SESSION_PUBLIC 0 /* CKA_TOKEN = 0, CKA_PRIVATE = 0 */ 3590Sstevel@tonic-gate #define SESSION_PRIVATE 1 /* CKA_TOKEN = 0, CKA_PRIVATE = 1 */ 3600Sstevel@tonic-gate #define TOKEN_PUBLIC 2 /* CKA_TOKEN = 1, CKA_PRIVATE = 0 */ 3610Sstevel@tonic-gate #define TOKEN_PRIVATE 3 /* CKA_TOKEN = 1, CKA_PRIVATE = 1 */ 3620Sstevel@tonic-gate 3630Sstevel@tonic-gate #define TOKEN_OBJECT 2 3640Sstevel@tonic-gate #define PRIVATE_OBJECT 1 3650Sstevel@tonic-gate 3660Sstevel@tonic-gate typedef enum { 3670Sstevel@tonic-gate ALL_TOKEN = 0, 3680Sstevel@tonic-gate PUBLIC_TOKEN = 1, 3690Sstevel@tonic-gate PRIVATE_TOKEN = 2 3700Sstevel@tonic-gate } token_obj_type_t; 3710Sstevel@tonic-gate 3720Sstevel@tonic-gate #define IS_TOKEN_OBJECT(objp) \ 3730Sstevel@tonic-gate ((objp->object_type == TOKEN_PUBLIC) || \ 3740Sstevel@tonic-gate (objp->object_type == TOKEN_PRIVATE)) 3750Sstevel@tonic-gate 3760Sstevel@tonic-gate /* 3770Sstevel@tonic-gate * Types associated with copying object's content 3780Sstevel@tonic-gate */ 3790Sstevel@tonic-gate #define SOFT_SET_ATTR_VALUE 1 /* for C_SetAttributeValue */ 3800Sstevel@tonic-gate #define SOFT_COPY_OBJECT 2 /* for C_CopyObject */ 3810Sstevel@tonic-gate #define SOFT_COPY_OBJ_ORIG_SH 3 /* for copying an object but keeps */ 3820Sstevel@tonic-gate /* the original session handle */ 3830Sstevel@tonic-gate 3840Sstevel@tonic-gate /* 3850Sstevel@tonic-gate * The following definitions are the shortcuts 3860Sstevel@tonic-gate */ 3870Sstevel@tonic-gate 3880Sstevel@tonic-gate /* 3890Sstevel@tonic-gate * RSA Public Key Object Attributes 3900Sstevel@tonic-gate */ 3910Sstevel@tonic-gate #define OBJ_PUB(o) \ 3920Sstevel@tonic-gate ((o)->object_class_u.public_key) 3930Sstevel@tonic-gate #define KEY_PUB_RSA(k) \ 3940Sstevel@tonic-gate &((k)->key_type_u.rsa_pub_key) 3950Sstevel@tonic-gate #define OBJ_PUB_RSA_MOD(o) \ 3960Sstevel@tonic-gate &((o)->object_class_u.public_key->key_type_u.rsa_pub_key.modulus) 3970Sstevel@tonic-gate #define KEY_PUB_RSA_MOD(k) \ 3980Sstevel@tonic-gate &((k)->key_type_u.rsa_pub_key.modulus) 3990Sstevel@tonic-gate #define OBJ_PUB_RSA_PUBEXPO(o) \ 4000Sstevel@tonic-gate &((o)->object_class_u.public_key->key_type_u.rsa_pub_key.pub_exponent) 4010Sstevel@tonic-gate #define KEY_PUB_RSA_PUBEXPO(k) \ 4020Sstevel@tonic-gate &((k)->key_type_u.rsa_pub_key.pub_exponent) 4030Sstevel@tonic-gate #define OBJ_PUB_RSA_MOD_BITS(o) \ 4040Sstevel@tonic-gate ((o)->object_class_u.public_key->key_type_u.rsa_pub_key.modulus_bits) 4050Sstevel@tonic-gate #define KEY_PUB_RSA_MOD_BITS(k) \ 4060Sstevel@tonic-gate ((k)->key_type_u.rsa_pub_key.modulus_bits) 4070Sstevel@tonic-gate 4080Sstevel@tonic-gate /* 4090Sstevel@tonic-gate * DSA Public Key Object Attributes 4100Sstevel@tonic-gate */ 4110Sstevel@tonic-gate #define KEY_PUB_DSA(k) \ 4120Sstevel@tonic-gate &((k)->key_type_u.dsa_pub_key) 4130Sstevel@tonic-gate #define OBJ_PUB_DSA_PRIME(o) \ 4140Sstevel@tonic-gate &((o)->object_class_u.public_key->key_type_u.dsa_pub_key.prime) 4150Sstevel@tonic-gate #define KEY_PUB_DSA_PRIME(k) \ 4160Sstevel@tonic-gate &((k)->key_type_u.dsa_pub_key.prime) 4170Sstevel@tonic-gate #define OBJ_PUB_DSA_SUBPRIME(o) \ 4180Sstevel@tonic-gate &((o)->object_class_u.public_key->key_type_u.dsa_pub_key.subprime) 4190Sstevel@tonic-gate #define KEY_PUB_DSA_SUBPRIME(k) \ 4200Sstevel@tonic-gate &((k)->key_type_u.dsa_pub_key.subprime) 4210Sstevel@tonic-gate #define OBJ_PUB_DSA_BASE(o) \ 4220Sstevel@tonic-gate &((o)->object_class_u.public_key->key_type_u.dsa_pub_key.base) 4230Sstevel@tonic-gate #define KEY_PUB_DSA_BASE(k) \ 4240Sstevel@tonic-gate &((k)->key_type_u.dsa_pub_key.base) 4250Sstevel@tonic-gate #define OBJ_PUB_DSA_VALUE(o) \ 4260Sstevel@tonic-gate &((o)->object_class_u.public_key->key_type_u.dsa_pub_key.value) 4270Sstevel@tonic-gate #define KEY_PUB_DSA_VALUE(k) \ 4280Sstevel@tonic-gate &((k)->key_type_u.dsa_pub_key.value) 4290Sstevel@tonic-gate 4300Sstevel@tonic-gate /* 4310Sstevel@tonic-gate * Diffie-Hellman Public Key Object Attributes 4320Sstevel@tonic-gate */ 4330Sstevel@tonic-gate #define KEY_PUB_DH(k) \ 4340Sstevel@tonic-gate &((k)->key_type_u.dh_pub_key) 4350Sstevel@tonic-gate #define OBJ_PUB_DH_PRIME(o) \ 4360Sstevel@tonic-gate &((o)->object_class_u.public_key->key_type_u.dh_pub_key.prime) 4370Sstevel@tonic-gate #define KEY_PUB_DH_PRIME(k) \ 4380Sstevel@tonic-gate &((k)->key_type_u.dh_pub_key.prime) 4390Sstevel@tonic-gate #define OBJ_PUB_DH_BASE(o) \ 4400Sstevel@tonic-gate &((o)->object_class_u.public_key->key_type_u.dh_pub_key.base) 4410Sstevel@tonic-gate #define KEY_PUB_DH_BASE(k) \ 4420Sstevel@tonic-gate &((k)->key_type_u.dh_pub_key.base) 4430Sstevel@tonic-gate #define OBJ_PUB_DH_VALUE(o) \ 4440Sstevel@tonic-gate &((o)->object_class_u.public_key->key_type_u.dh_pub_key.value) 4450Sstevel@tonic-gate #define KEY_PUB_DH_VALUE(k) \ 4460Sstevel@tonic-gate &((k)->key_type_u.dh_pub_key.value) 4470Sstevel@tonic-gate 4480Sstevel@tonic-gate /* 4490Sstevel@tonic-gate * X9.42 Diffie-Hellman Public Key Object Attributes 4500Sstevel@tonic-gate */ 4510Sstevel@tonic-gate #define KEY_PUB_DH942(k) \ 4520Sstevel@tonic-gate &((k)->key_type_u.dh942_pub_key) 4530Sstevel@tonic-gate #define OBJ_PUB_DH942_PRIME(o) \ 4540Sstevel@tonic-gate &((o)->object_class_u.public_key->key_type_u.dh942_pub_key.prime) 4550Sstevel@tonic-gate #define KEY_PUB_DH942_PRIME(k) \ 4560Sstevel@tonic-gate &((k)->key_type_u.dh942_pub_key.prime) 4570Sstevel@tonic-gate #define OBJ_PUB_DH942_BASE(o) \ 4580Sstevel@tonic-gate &((o)->object_class_u.public_key->key_type_u.dh942_pub_key.base) 4590Sstevel@tonic-gate #define KEY_PUB_DH942_BASE(k) \ 4600Sstevel@tonic-gate &((k)->key_type_u.dh942_pub_key.base) 4610Sstevel@tonic-gate #define OBJ_PUB_DH942_SUBPRIME(o) \ 4620Sstevel@tonic-gate &((o)->object_class_u.public_key->key_type_u.dh942_pub_key.subprime) 4630Sstevel@tonic-gate #define KEY_PUB_DH942_SUBPRIME(k) \ 4640Sstevel@tonic-gate &((k)->key_type_u.dh942_pub_key.subprime) 4650Sstevel@tonic-gate #define OBJ_PUB_DH942_VALUE(o) \ 4660Sstevel@tonic-gate &((o)->object_class_u.public_key->key_type_u.dh942_pub_key.value) 4670Sstevel@tonic-gate #define KEY_PUB_DH942_VALUE(k) \ 4680Sstevel@tonic-gate &((k)->key_type_u.dh942_pub_key.value) 4690Sstevel@tonic-gate 4700Sstevel@tonic-gate /* 4714219Smcpowers * Elliptic Curve Public Key Object Attributes 4724219Smcpowers */ 4734219Smcpowers #define KEY_PUB_EC(k) \ 4744219Smcpowers &((k)->key_type_u.ec_pub_key) 4754219Smcpowers #define OBJ_PUB_EC_POINT(o) \ 4764219Smcpowers &((o)->object_class_u.public_key->key_type_u.ec_pub_key.point) 4774219Smcpowers #define KEY_PUB_EC_POINT(k) \ 4784219Smcpowers &((k)->key_type_u.ec_pub_key.point) 4794219Smcpowers 4804219Smcpowers 4814219Smcpowers /* 4820Sstevel@tonic-gate * RSA Private Key Object Attributes 4830Sstevel@tonic-gate */ 4840Sstevel@tonic-gate #define OBJ_PRI(o) \ 4850Sstevel@tonic-gate ((o)->object_class_u.private_key) 4860Sstevel@tonic-gate #define KEY_PRI_RSA(k) \ 4870Sstevel@tonic-gate &((k)->key_type_u.rsa_pri_key) 4880Sstevel@tonic-gate #define OBJ_PRI_RSA_MOD(o) \ 4890Sstevel@tonic-gate &((o)->object_class_u.private_key->key_type_u.rsa_pri_key.modulus) 4900Sstevel@tonic-gate #define KEY_PRI_RSA_MOD(k) \ 4910Sstevel@tonic-gate &((k)->key_type_u.rsa_pri_key.modulus) 4920Sstevel@tonic-gate #define OBJ_PRI_RSA_PUBEXPO(o) \ 4930Sstevel@tonic-gate &((o)->object_class_u.private_key->key_type_u.rsa_pri_key.pub_exponent) 4940Sstevel@tonic-gate #define KEY_PRI_RSA_PUBEXPO(k) \ 4950Sstevel@tonic-gate &((k)->key_type_u.rsa_pri_key.pub_exponent) 4960Sstevel@tonic-gate #define OBJ_PRI_RSA_PRIEXPO(o) \ 4970Sstevel@tonic-gate &((o)->object_class_u.private_key->key_type_u.rsa_pri_key.pri_exponent) 4980Sstevel@tonic-gate #define KEY_PRI_RSA_PRIEXPO(k) \ 4990Sstevel@tonic-gate &((k)->key_type_u.rsa_pri_key.pri_exponent) 5000Sstevel@tonic-gate #define OBJ_PRI_RSA_PRIME1(o) \ 5010Sstevel@tonic-gate &((o)->object_class_u.private_key->key_type_u.rsa_pri_key.prime_1) 5020Sstevel@tonic-gate #define KEY_PRI_RSA_PRIME1(k) \ 5030Sstevel@tonic-gate &((k)->key_type_u.rsa_pri_key.prime_1) 5040Sstevel@tonic-gate #define OBJ_PRI_RSA_PRIME2(o) \ 5050Sstevel@tonic-gate &((o)->object_class_u.private_key->key_type_u.rsa_pri_key.prime_2) 5060Sstevel@tonic-gate #define KEY_PRI_RSA_PRIME2(k) \ 5070Sstevel@tonic-gate &((k)->key_type_u.rsa_pri_key.prime_2) 5080Sstevel@tonic-gate #define OBJ_PRI_RSA_EXPO1(o) \ 5090Sstevel@tonic-gate &((o)->object_class_u.private_key->key_type_u.rsa_pri_key.exponent_1) 5100Sstevel@tonic-gate #define KEY_PRI_RSA_EXPO1(k) \ 5110Sstevel@tonic-gate &((k)->key_type_u.rsa_pri_key.exponent_1) 5120Sstevel@tonic-gate #define OBJ_PRI_RSA_EXPO2(o) \ 5130Sstevel@tonic-gate &((o)->object_class_u.private_key->key_type_u.rsa_pri_key.exponent_2) 5140Sstevel@tonic-gate #define KEY_PRI_RSA_EXPO2(k) \ 5150Sstevel@tonic-gate &((k)->key_type_u.rsa_pri_key.exponent_2) 5160Sstevel@tonic-gate #define OBJ_PRI_RSA_COEF(o) \ 5170Sstevel@tonic-gate &((o)->object_class_u.private_key->key_type_u.rsa_pri_key.coefficient) 5180Sstevel@tonic-gate #define KEY_PRI_RSA_COEF(k) \ 5190Sstevel@tonic-gate &((k)->key_type_u.rsa_pri_key.coefficient) 5200Sstevel@tonic-gate 5210Sstevel@tonic-gate /* 5220Sstevel@tonic-gate * DSA Private Key Object Attributes 5230Sstevel@tonic-gate */ 5240Sstevel@tonic-gate #define KEY_PRI_DSA(k) \ 5250Sstevel@tonic-gate &((k)->key_type_u.dsa_pri_key) 5260Sstevel@tonic-gate #define OBJ_PRI_DSA_PRIME(o) \ 5270Sstevel@tonic-gate &((o)->object_class_u.private_key->key_type_u.dsa_pri_key.prime) 5280Sstevel@tonic-gate #define KEY_PRI_DSA_PRIME(k) \ 5290Sstevel@tonic-gate &((k)->key_type_u.dsa_pri_key.prime) 5300Sstevel@tonic-gate #define OBJ_PRI_DSA_SUBPRIME(o) \ 5310Sstevel@tonic-gate &((o)->object_class_u.private_key->key_type_u.dsa_pri_key.subprime) 5320Sstevel@tonic-gate #define KEY_PRI_DSA_SUBPRIME(k) \ 5330Sstevel@tonic-gate &((k)->key_type_u.dsa_pri_key.subprime) 5340Sstevel@tonic-gate #define OBJ_PRI_DSA_BASE(o) \ 5350Sstevel@tonic-gate &((o)->object_class_u.private_key->key_type_u.dsa_pri_key.base) 5360Sstevel@tonic-gate #define KEY_PRI_DSA_BASE(k) \ 5370Sstevel@tonic-gate &((k)->key_type_u.dsa_pri_key.base) 5380Sstevel@tonic-gate #define OBJ_PRI_DSA_VALUE(o) \ 5390Sstevel@tonic-gate &((o)->object_class_u.private_key->key_type_u.dsa_pri_key.value) 5400Sstevel@tonic-gate #define KEY_PRI_DSA_VALUE(k) \ 5410Sstevel@tonic-gate &((k)->key_type_u.dsa_pri_key.value) 5420Sstevel@tonic-gate 5430Sstevel@tonic-gate /* 5440Sstevel@tonic-gate * Diffie-Hellman Private Key Object Attributes 5450Sstevel@tonic-gate */ 5460Sstevel@tonic-gate #define KEY_PRI_DH(k) \ 5470Sstevel@tonic-gate &((k)->key_type_u.dh_pri_key) 5480Sstevel@tonic-gate #define OBJ_PRI_DH_PRIME(o) \ 5490Sstevel@tonic-gate &((o)->object_class_u.private_key->key_type_u.dh_pri_key.prime) 5500Sstevel@tonic-gate #define KEY_PRI_DH_PRIME(k) \ 5510Sstevel@tonic-gate &((k)->key_type_u.dh_pri_key.prime) 5520Sstevel@tonic-gate #define OBJ_PRI_DH_BASE(o) \ 5530Sstevel@tonic-gate &((o)->object_class_u.private_key->key_type_u.dh_pri_key.base) 5540Sstevel@tonic-gate #define KEY_PRI_DH_BASE(k) \ 5550Sstevel@tonic-gate &((k)->key_type_u.dh_pri_key.base) 5560Sstevel@tonic-gate #define OBJ_PRI_DH_VALUE(o) \ 5570Sstevel@tonic-gate &((o)->object_class_u.private_key->key_type_u.dh_pri_key.value) 5580Sstevel@tonic-gate #define KEY_PRI_DH_VALUE(k) \ 5590Sstevel@tonic-gate &((k)->key_type_u.dh_pri_key.value) 5600Sstevel@tonic-gate #define OBJ_PRI_DH_VAL_BITS(o) \ 5610Sstevel@tonic-gate ((o)->object_class_u.private_key->key_type_u.dh_pri_key.value_bits) 5620Sstevel@tonic-gate #define KEY_PRI_DH_VAL_BITS(k) \ 5630Sstevel@tonic-gate ((k)->key_type_u.dh_pri_key.value_bits) 5640Sstevel@tonic-gate 5650Sstevel@tonic-gate /* 5660Sstevel@tonic-gate * X9.42 Diffie-Hellman Private Key Object Attributes 5670Sstevel@tonic-gate */ 5680Sstevel@tonic-gate #define KEY_PRI_DH942(k) \ 5690Sstevel@tonic-gate &((k)->key_type_u.dh942_pri_key) 5700Sstevel@tonic-gate #define OBJ_PRI_DH942_PRIME(o) \ 5710Sstevel@tonic-gate &((o)->object_class_u.private_key->key_type_u.dh942_pri_key.prime) 5720Sstevel@tonic-gate #define KEY_PRI_DH942_PRIME(k) \ 5730Sstevel@tonic-gate &((k)->key_type_u.dh942_pri_key.prime) 5740Sstevel@tonic-gate #define OBJ_PRI_DH942_BASE(o) \ 5750Sstevel@tonic-gate &((o)->object_class_u.private_key->key_type_u.dh942_pri_key.base) 5760Sstevel@tonic-gate #define KEY_PRI_DH942_BASE(k) \ 5770Sstevel@tonic-gate &((k)->key_type_u.dh942_pri_key.base) 5780Sstevel@tonic-gate #define OBJ_PRI_DH942_SUBPRIME(o) \ 5790Sstevel@tonic-gate &((o)->object_class_u.private_key->key_type_u.dh942_pri_key.subprime) 5800Sstevel@tonic-gate #define KEY_PRI_DH942_SUBPRIME(k) \ 5810Sstevel@tonic-gate &((k)->key_type_u.dh942_pri_key.subprime) 5820Sstevel@tonic-gate #define OBJ_PRI_DH942_VALUE(o) \ 5830Sstevel@tonic-gate &((o)->object_class_u.private_key->key_type_u.dh942_pri_key.value) 5840Sstevel@tonic-gate #define KEY_PRI_DH942_VALUE(k) \ 5850Sstevel@tonic-gate &((k)->key_type_u.dh942_pri_key.value) 5860Sstevel@tonic-gate 5870Sstevel@tonic-gate /* 5884219Smcpowers * Elliptic Curve Private Key Object Attributes 5894219Smcpowers */ 5904219Smcpowers 5914219Smcpowers #define KEY_PRI_EC(k) \ 5924219Smcpowers &((k)->key_type_u.ec_pri_key) 5934219Smcpowers #define OBJ_PRI_EC_VALUE(o) \ 5944219Smcpowers &((o)->object_class_u.private_key->key_type_u.ec_pri_key.value) 5954219Smcpowers #define KEY_PRI_EC_VALUE(k) \ 5964219Smcpowers &((k)->key_type_u.ec_pri_key.value) 5974219Smcpowers 5984219Smcpowers /* 5990Sstevel@tonic-gate * DSA Domain Parameters Object Attributes 6000Sstevel@tonic-gate */ 6010Sstevel@tonic-gate #define OBJ_DOM(o) \ 6020Sstevel@tonic-gate ((o)->object_class_u.domain) 6030Sstevel@tonic-gate #define KEY_DOM_DSA(k) \ 6040Sstevel@tonic-gate &((k)->key_type_u.dsa_dom_key) 6050Sstevel@tonic-gate #define OBJ_DOM_DSA_PRIME(o) \ 6060Sstevel@tonic-gate &((o)->object_class_u.domain->key_type_u.dsa_dom_key.prime) 6070Sstevel@tonic-gate #define KEY_DOM_DSA_PRIME(k) \ 6080Sstevel@tonic-gate &((k)->key_type_u.dsa_dom_key.prime) 6090Sstevel@tonic-gate #define OBJ_DOM_DSA_SUBPRIME(o) \ 6100Sstevel@tonic-gate &((o)->object_class_u.domain->key_type_u.dsa_dom_key.subprime) 6110Sstevel@tonic-gate #define KEY_DOM_DSA_SUBPRIME(k) \ 6120Sstevel@tonic-gate &((k)->key_type_u.dsa_dom_key.subprime) 6130Sstevel@tonic-gate #define OBJ_DOM_DSA_BASE(o) \ 6140Sstevel@tonic-gate &((o)->object_class_u.domain->key_type_u.dsa_dom_key.base) 6150Sstevel@tonic-gate #define KEY_DOM_DSA_BASE(k) \ 6160Sstevel@tonic-gate &((k)->key_type_u.dsa_dom_key.base) 6170Sstevel@tonic-gate #define OBJ_DOM_DSA_PRIME_BITS(o) \ 6180Sstevel@tonic-gate ((o)->object_class_u.domain->key_type_u.dsa_dom_key.prime_bits) 6190Sstevel@tonic-gate 6200Sstevel@tonic-gate /* 6210Sstevel@tonic-gate * Diffie-Hellman Domain Parameters Object Attributes 6220Sstevel@tonic-gate */ 6230Sstevel@tonic-gate #define KEY_DOM_DH(k) \ 6240Sstevel@tonic-gate &((k)->key_type_u.dh_dom_key) 6250Sstevel@tonic-gate #define OBJ_DOM_DH_PRIME(o) \ 6260Sstevel@tonic-gate &((o)->object_class_u.domain->key_type_u.dh_dom_key.prime) 6270Sstevel@tonic-gate #define KEY_DOM_DH_PRIME(k) \ 6280Sstevel@tonic-gate &((k)->key_type_u.dh_dom_key.prime) 6290Sstevel@tonic-gate #define OBJ_DOM_DH_BASE(o) \ 6300Sstevel@tonic-gate &((o)->object_class_u.domain->key_type_u.dh_dom_key.base) 6310Sstevel@tonic-gate #define KEY_DOM_DH_BASE(k) \ 6320Sstevel@tonic-gate &((k)->key_type_u.dh_dom_key.base) 6330Sstevel@tonic-gate #define OBJ_DOM_DH_PRIME_BITS(o) \ 6340Sstevel@tonic-gate ((o)->object_class_u.domain->key_type_u.dh_dom_key.prime_bits) 6350Sstevel@tonic-gate 6360Sstevel@tonic-gate /* 6370Sstevel@tonic-gate * X9.42 Diffie-Hellman Domain Parameters Object Attributes 6380Sstevel@tonic-gate */ 6390Sstevel@tonic-gate #define KEY_DOM_DH942(k) \ 6400Sstevel@tonic-gate &((k)->key_type_u.dh942_dom_key) 6410Sstevel@tonic-gate #define OBJ_DOM_DH942_PRIME(o) \ 6420Sstevel@tonic-gate &((o)->object_class_u.domain->key_type_u.dh942_dom_key.prime) 6430Sstevel@tonic-gate #define KEY_DOM_DH942_PRIME(k) \ 6440Sstevel@tonic-gate &((k)->key_type_u.dh942_dom_key.prime) 6450Sstevel@tonic-gate #define OBJ_DOM_DH942_BASE(o) \ 6460Sstevel@tonic-gate &((o)->object_class_u.domain->key_type_u.dh942_dom_key.base) 6470Sstevel@tonic-gate #define KEY_DOM_DH942_BASE(k) \ 6480Sstevel@tonic-gate &((k)->key_type_u.dh942_dom_key.base) 6490Sstevel@tonic-gate #define OBJ_DOM_DH942_SUBPRIME(o) \ 6500Sstevel@tonic-gate &((o)->object_class_u.domain->key_type_u.dh942_dom_key.subprime) 6510Sstevel@tonic-gate #define KEY_DOM_DH942_SUBPRIME(k) \ 6520Sstevel@tonic-gate &((k)->key_type_u.dh942_dom_key.subprime) 6530Sstevel@tonic-gate #define OBJ_DOM_DH942_PRIME_BITS(o) \ 6540Sstevel@tonic-gate ((o)->object_class_u.domain->key_type_u.dh942_dom_key.prime_bits) 6550Sstevel@tonic-gate #define OBJ_DOM_DH942_SUBPRIME_BITS(o) \ 6560Sstevel@tonic-gate ((o)->object_class_u.domain->key_type_u.dh942_dom_key.subprime_bits) 6570Sstevel@tonic-gate 6580Sstevel@tonic-gate /* 6590Sstevel@tonic-gate * Secret Key Object Attributes 6600Sstevel@tonic-gate */ 6610Sstevel@tonic-gate #define OBJ_SEC(o) \ 6620Sstevel@tonic-gate ((o)->object_class_u.secret_key) 6630Sstevel@tonic-gate #define OBJ_SEC_VALUE(o) \ 6640Sstevel@tonic-gate ((o)->object_class_u.secret_key->sk_value) 6650Sstevel@tonic-gate #define OBJ_SEC_VALUE_LEN(o) \ 6660Sstevel@tonic-gate ((o)->object_class_u.secret_key->sk_value_len) 6670Sstevel@tonic-gate #define OBJ_KEY_SCHED(o) \ 6680Sstevel@tonic-gate ((o)->object_class_u.secret_key->key_sched) 6690Sstevel@tonic-gate #define OBJ_KEY_SCHED_LEN(o) \ 6700Sstevel@tonic-gate ((o)->object_class_u.secret_key->keysched_len) 6710Sstevel@tonic-gate 6720Sstevel@tonic-gate #define OBJ_CERT(o) \ 6730Sstevel@tonic-gate ((o)->object_class_u.certificate) 6740Sstevel@tonic-gate /* 6750Sstevel@tonic-gate * X.509 Key Certificate object attributes 6760Sstevel@tonic-gate */ 6770Sstevel@tonic-gate #define X509_CERT(o) \ 6780Sstevel@tonic-gate ((o)->object_class_u.certificate->cert_type_u.x509) 6790Sstevel@tonic-gate #define X509_CERT_SUBJECT(o) \ 6800Sstevel@tonic-gate ((o)->object_class_u.certificate->cert_type_u.x509.subject) 6810Sstevel@tonic-gate #define X509_CERT_VALUE(o) \ 6820Sstevel@tonic-gate ((o)->object_class_u.certificate->cert_type_u.x509.value) 6830Sstevel@tonic-gate 6840Sstevel@tonic-gate /* 6850Sstevel@tonic-gate * X.509 Attribute Certificate object attributes 6860Sstevel@tonic-gate */ 6870Sstevel@tonic-gate #define X509_ATTR_CERT(o) \ 6880Sstevel@tonic-gate ((o)->object_class_u.certificate->cert_type_u.x509_attr) 6890Sstevel@tonic-gate #define X509_ATTR_CERT_OWNER(o) \ 6900Sstevel@tonic-gate ((o)->object_class_u.certificate->cert_type_u.x509_attr.owner) 6910Sstevel@tonic-gate #define X509_ATTR_CERT_VALUE(o) \ 6920Sstevel@tonic-gate ((o)->object_class_u.certificate->cert_type_u.x509_attr.value) 6930Sstevel@tonic-gate 6940Sstevel@tonic-gate /* 6950Sstevel@tonic-gate * key related attributes with CK_BBOOL data type 6960Sstevel@tonic-gate */ 6970Sstevel@tonic-gate #define DERIVE_BOOL_ON 0x00000001 6980Sstevel@tonic-gate #define LOCAL_BOOL_ON 0x00000002 6990Sstevel@tonic-gate #define SENSITIVE_BOOL_ON 0x00000004 7000Sstevel@tonic-gate #define SECONDARY_AUTH_BOOL_ON 0x00000008 7010Sstevel@tonic-gate #define ENCRYPT_BOOL_ON 0x00000010 7020Sstevel@tonic-gate #define DECRYPT_BOOL_ON 0x00000020 7030Sstevel@tonic-gate #define SIGN_BOOL_ON 0x00000040 7040Sstevel@tonic-gate #define SIGN_RECOVER_BOOL_ON 0x00000080 7050Sstevel@tonic-gate #define VERIFY_BOOL_ON 0x00000100 7060Sstevel@tonic-gate #define VERIFY_RECOVER_BOOL_ON 0x00000200 7070Sstevel@tonic-gate #define WRAP_BOOL_ON 0x00000400 7080Sstevel@tonic-gate #define UNWRAP_BOOL_ON 0x00000800 7090Sstevel@tonic-gate #define TRUSTED_BOOL_ON 0x00001000 7100Sstevel@tonic-gate #define EXTRACTABLE_BOOL_ON 0x00002000 7110Sstevel@tonic-gate #define ALWAYS_SENSITIVE_BOOL_ON 0x00004000 7120Sstevel@tonic-gate #define NEVER_EXTRACTABLE_BOOL_ON 0x00008000 7130Sstevel@tonic-gate #define NOT_MODIFIABLE_BOOL_ON 0x00010000 7140Sstevel@tonic-gate 7150Sstevel@tonic-gate #define PUBLIC_KEY_DEFAULT (ENCRYPT_BOOL_ON|\ 7160Sstevel@tonic-gate WRAP_BOOL_ON|\ 7170Sstevel@tonic-gate VERIFY_BOOL_ON|\ 7180Sstevel@tonic-gate VERIFY_RECOVER_BOOL_ON) 7190Sstevel@tonic-gate 7200Sstevel@tonic-gate #define PRIVATE_KEY_DEFAULT (DECRYPT_BOOL_ON|\ 7210Sstevel@tonic-gate UNWRAP_BOOL_ON|\ 7220Sstevel@tonic-gate SIGN_BOOL_ON|\ 7230Sstevel@tonic-gate SIGN_RECOVER_BOOL_ON|\ 7240Sstevel@tonic-gate EXTRACTABLE_BOOL_ON) 7250Sstevel@tonic-gate 7260Sstevel@tonic-gate #define SECRET_KEY_DEFAULT (ENCRYPT_BOOL_ON|\ 7270Sstevel@tonic-gate DECRYPT_BOOL_ON|\ 7280Sstevel@tonic-gate WRAP_BOOL_ON|\ 7290Sstevel@tonic-gate UNWRAP_BOOL_ON|\ 7300Sstevel@tonic-gate SIGN_BOOL_ON|\ 7310Sstevel@tonic-gate VERIFY_BOOL_ON|\ 7320Sstevel@tonic-gate EXTRACTABLE_BOOL_ON) 7330Sstevel@tonic-gate 7340Sstevel@tonic-gate /* 7350Sstevel@tonic-gate * MAX_KEY_ATTR_BUFLEN 7360Sstevel@tonic-gate * The maximum buffer size needed for public or private key attributes 7370Sstevel@tonic-gate * should be 514 bytes. Just to be safe we give a little more space. 7380Sstevel@tonic-gate */ 7390Sstevel@tonic-gate #define MAX_KEY_ATTR_BUFLEN 1024 7400Sstevel@tonic-gate 7410Sstevel@tonic-gate /* 7420Sstevel@tonic-gate * Flag definitions for obj_delete_sync 7430Sstevel@tonic-gate */ 7440Sstevel@tonic-gate #define OBJECT_IS_DELETING 1 /* Object is in a deleting state */ 7450Sstevel@tonic-gate #define OBJECT_REFCNT_WAITING 2 /* Waiting for object reference */ 7460Sstevel@tonic-gate /* count to become zero */ 7470Sstevel@tonic-gate 7480Sstevel@tonic-gate /* 7490Sstevel@tonic-gate * This macro is used to type cast an object handle to a pointer to 7500Sstevel@tonic-gate * the object struct. Also, it checks to see if the object struct 7510Sstevel@tonic-gate * is tagged with an object magic number. This is to detect when an 7520Sstevel@tonic-gate * application passes a bogus object pointer. 7530Sstevel@tonic-gate * Also, it checks to see if the object is in the deleting state that 7540Sstevel@tonic-gate * another thread is performing. If not, increment the object reference 7550Sstevel@tonic-gate * count by one. This is to prevent this object from being deleted by 7560Sstevel@tonic-gate * other thread. 7570Sstevel@tonic-gate */ 7580Sstevel@tonic-gate #define HANDLE2OBJECT_COMMON(hObject, object_p, rv, REFCNT_CODE) { \ 7590Sstevel@tonic-gate object_p = (soft_object_t *)(hObject); \ 7600Sstevel@tonic-gate if ((object_p == NULL) || \ 7610Sstevel@tonic-gate (object_p->magic_marker != SOFTTOKEN_OBJECT_MAGIC)) {\ 7620Sstevel@tonic-gate rv = CKR_OBJECT_HANDLE_INVALID; \ 7630Sstevel@tonic-gate } else { \ 7640Sstevel@tonic-gate (void) pthread_mutex_lock(&object_p->object_mutex); \ 7650Sstevel@tonic-gate if (!(object_p->obj_delete_sync & OBJECT_IS_DELETING)) { \ 7660Sstevel@tonic-gate REFCNT_CODE; \ 7670Sstevel@tonic-gate rv = CKR_OK; \ 7680Sstevel@tonic-gate } else { \ 7690Sstevel@tonic-gate rv = CKR_OBJECT_HANDLE_INVALID; \ 7700Sstevel@tonic-gate } \ 7710Sstevel@tonic-gate (void) pthread_mutex_unlock(&object_p->object_mutex); \ 7720Sstevel@tonic-gate } \ 7730Sstevel@tonic-gate } 7740Sstevel@tonic-gate 7750Sstevel@tonic-gate #define HANDLE2OBJECT(hObject, object_p, rv) \ 7760Sstevel@tonic-gate HANDLE2OBJECT_COMMON(hObject, object_p, rv, object_p->obj_refcnt++) 7770Sstevel@tonic-gate 7780Sstevel@tonic-gate #define HANDLE2OBJECT_DESTROY(hObject, object_p, rv) \ 7790Sstevel@tonic-gate HANDLE2OBJECT_COMMON(hObject, object_p, rv, /* no refcnt increment */) 7800Sstevel@tonic-gate 7810Sstevel@tonic-gate 7820Sstevel@tonic-gate #define OBJ_REFRELE(object_p) { \ 7830Sstevel@tonic-gate (void) pthread_mutex_lock(&object_p->object_mutex); \ 7840Sstevel@tonic-gate if ((--object_p->obj_refcnt) == 0 && \ 7850Sstevel@tonic-gate (object_p->obj_delete_sync & OBJECT_REFCNT_WAITING)) { \ 7860Sstevel@tonic-gate (void) pthread_cond_signal(&object_p->obj_free_cond); \ 7870Sstevel@tonic-gate } \ 7880Sstevel@tonic-gate (void) pthread_mutex_unlock(&object_p->object_mutex); \ 7890Sstevel@tonic-gate } 7900Sstevel@tonic-gate 7910Sstevel@tonic-gate /* 7920Sstevel@tonic-gate * Function Prototypes. 7930Sstevel@tonic-gate */ 7940Sstevel@tonic-gate void soft_cleanup_object(soft_object_t *objp); 7950Sstevel@tonic-gate 7960Sstevel@tonic-gate CK_RV soft_add_object(CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount, 7970Sstevel@tonic-gate CK_ULONG *objecthandle_p, soft_session_t *sp); 7980Sstevel@tonic-gate 7990Sstevel@tonic-gate void soft_delete_object(soft_session_t *sp, soft_object_t *objp, 8009661SZdenek.Kotala@Sun.COM boolean_t force, boolean_t lock_held); 8010Sstevel@tonic-gate 8020Sstevel@tonic-gate void soft_cleanup_extra_attr(soft_object_t *object_p); 8030Sstevel@tonic-gate 8040Sstevel@tonic-gate CK_RV soft_copy_extra_attr(CK_ATTRIBUTE_INFO_PTR old_attrp, 8050Sstevel@tonic-gate soft_object_t *object_p); 8060Sstevel@tonic-gate 8070Sstevel@tonic-gate void soft_cleanup_object_bigint_attrs(soft_object_t *object_p); 8080Sstevel@tonic-gate 8090Sstevel@tonic-gate CK_RV soft_build_object(CK_ATTRIBUTE_PTR template, 8100Sstevel@tonic-gate CK_ULONG ulAttrNum, soft_object_t *new_object); 8110Sstevel@tonic-gate 8120Sstevel@tonic-gate CK_RV soft_build_secret_key_object(CK_ATTRIBUTE_PTR template, 8130Sstevel@tonic-gate CK_ULONG ulAttrNum, soft_object_t *new_object, CK_ULONG mode, 8140Sstevel@tonic-gate CK_ULONG key_len, CK_KEY_TYPE key_type); 8150Sstevel@tonic-gate 8160Sstevel@tonic-gate CK_RV soft_copy_object(soft_object_t *old_object, soft_object_t **new_object, 8170Sstevel@tonic-gate CK_ULONG object_func, soft_session_t *sp); 8180Sstevel@tonic-gate 8190Sstevel@tonic-gate void soft_merge_object(soft_object_t *old_object, soft_object_t *new_object); 8200Sstevel@tonic-gate 8210Sstevel@tonic-gate CK_RV soft_get_attribute(soft_object_t *object_p, CK_ATTRIBUTE_PTR template); 8220Sstevel@tonic-gate 8230Sstevel@tonic-gate CK_RV soft_set_attribute(soft_object_t *object_p, CK_ATTRIBUTE_PTR template, 8240Sstevel@tonic-gate boolean_t copy); 8250Sstevel@tonic-gate 8260Sstevel@tonic-gate CK_RV soft_set_common_storage_attribute(soft_object_t *object_p, 8270Sstevel@tonic-gate CK_ATTRIBUTE_PTR template, boolean_t copy); 8280Sstevel@tonic-gate 8297260Smcpowers CK_RV soft_get_public_value(soft_object_t *, CK_ATTRIBUTE_TYPE, uchar_t *, 8300Sstevel@tonic-gate uint32_t *); 8310Sstevel@tonic-gate 8327260Smcpowers CK_RV soft_get_private_value(soft_object_t *, CK_ATTRIBUTE_TYPE, uchar_t *, 8330Sstevel@tonic-gate uint32_t *); 8340Sstevel@tonic-gate 8350Sstevel@tonic-gate CK_RV get_ulong_attr_from_object(CK_ULONG value, CK_ATTRIBUTE_PTR template); 8360Sstevel@tonic-gate 8370Sstevel@tonic-gate void copy_bigint_attr(biginteger_t *src, biginteger_t *dst); 8380Sstevel@tonic-gate 8390Sstevel@tonic-gate void soft_add_object_to_session(soft_object_t *, soft_session_t *); 8400Sstevel@tonic-gate 8410Sstevel@tonic-gate CK_RV soft_build_key(CK_ATTRIBUTE_PTR, CK_ULONG, soft_object_t *, 8420Sstevel@tonic-gate CK_OBJECT_CLASS, CK_KEY_TYPE, CK_ULONG, CK_ULONG); 8430Sstevel@tonic-gate 8440Sstevel@tonic-gate CK_RV soft_copy_public_key_attr(public_key_obj_t *old_pub_key_obj_p, 8450Sstevel@tonic-gate public_key_obj_t **new_pub_key_obj_p, CK_KEY_TYPE key_type); 8460Sstevel@tonic-gate 8470Sstevel@tonic-gate CK_RV soft_copy_private_key_attr(private_key_obj_t *old_pri_key_obj_p, 8480Sstevel@tonic-gate private_key_obj_t **new_pri_key_obj_p, CK_KEY_TYPE key_type); 8490Sstevel@tonic-gate 8500Sstevel@tonic-gate CK_RV soft_copy_secret_key_attr(secret_key_obj_t *old_secret_key_obj_p, 8510Sstevel@tonic-gate secret_key_obj_t **new_secret_key_obj_p); 8520Sstevel@tonic-gate 8530Sstevel@tonic-gate CK_RV soft_copy_domain_attr(domain_obj_t *old_domain_obj_p, 8540Sstevel@tonic-gate domain_obj_t **new_domain_obj_p, CK_KEY_TYPE key_type); 8550Sstevel@tonic-gate 8560Sstevel@tonic-gate CK_RV soft_validate_attr(CK_ATTRIBUTE_PTR template, CK_ULONG ulAttrNum, 8570Sstevel@tonic-gate CK_OBJECT_CLASS *class); 8580Sstevel@tonic-gate 8590Sstevel@tonic-gate CK_RV soft_find_objects_init(soft_session_t *sp, CK_ATTRIBUTE_PTR pTemplate, 8600Sstevel@tonic-gate CK_ULONG ulCount); 8610Sstevel@tonic-gate 8620Sstevel@tonic-gate void soft_find_objects_final(soft_session_t *sp); 8630Sstevel@tonic-gate 8640Sstevel@tonic-gate void soft_find_objects(soft_session_t *sp, CK_OBJECT_HANDLE *obj_found, 8650Sstevel@tonic-gate CK_ULONG max_obj_requested, CK_ULONG *found_obj_count); 8660Sstevel@tonic-gate 8670Sstevel@tonic-gate void soft_process_find_attr(CK_OBJECT_CLASS *pclasses, 8680Sstevel@tonic-gate CK_ULONG *num_result_pclasses, CK_ATTRIBUTE_PTR pTemplate, 8690Sstevel@tonic-gate CK_ULONG ulCount); 8700Sstevel@tonic-gate 8710Sstevel@tonic-gate boolean_t soft_find_match_attrs(soft_object_t *obj, CK_OBJECT_CLASS *pclasses, 8720Sstevel@tonic-gate CK_ULONG num_pclasses, CK_ATTRIBUTE *tmpl_attr, CK_ULONG num_attr); 8730Sstevel@tonic-gate 8740Sstevel@tonic-gate CK_ATTRIBUTE_PTR get_extra_attr(CK_ATTRIBUTE_TYPE type, soft_object_t *obj); 8750Sstevel@tonic-gate 8760Sstevel@tonic-gate CK_RV get_string_from_template(CK_ATTRIBUTE_PTR dest, CK_ATTRIBUTE_PTR src); 8770Sstevel@tonic-gate 8780Sstevel@tonic-gate void string_attr_cleanup(CK_ATTRIBUTE_PTR template); 8790Sstevel@tonic-gate 8800Sstevel@tonic-gate void soft_cleanup_cert_object(soft_object_t *object_p); 8810Sstevel@tonic-gate 8820Sstevel@tonic-gate CK_RV soft_get_certificate_attribute(soft_object_t *object_p, 8830Sstevel@tonic-gate CK_ATTRIBUTE_PTR template); 8840Sstevel@tonic-gate 8850Sstevel@tonic-gate CK_RV soft_set_certificate_attribute(soft_object_t *object_p, 8860Sstevel@tonic-gate CK_ATTRIBUTE_PTR template, boolean_t copy); 8870Sstevel@tonic-gate 8880Sstevel@tonic-gate CK_RV soft_copy_certificate(certificate_obj_t *old, certificate_obj_t **new, 8890Sstevel@tonic-gate CK_CERTIFICATE_TYPE type); 8900Sstevel@tonic-gate 8910Sstevel@tonic-gate CK_RV get_cert_attr_from_template(cert_attr_t **dest, 8920Sstevel@tonic-gate CK_ATTRIBUTE_PTR src); 8930Sstevel@tonic-gate 8940Sstevel@tonic-gate /* Token object related function prototypes */ 8950Sstevel@tonic-gate 8960Sstevel@tonic-gate void soft_add_token_object_to_slot(soft_object_t *objp); 8970Sstevel@tonic-gate 8980Sstevel@tonic-gate void soft_remove_token_object_from_slot(soft_object_t *objp, 8990Sstevel@tonic-gate boolean_t lock_held); 9000Sstevel@tonic-gate 9010Sstevel@tonic-gate void soft_delete_token_object(soft_object_t *objp, boolean_t persistent, 9020Sstevel@tonic-gate boolean_t lock_held); 9030Sstevel@tonic-gate 9040Sstevel@tonic-gate void soft_delete_all_in_core_token_objects(token_obj_type_t type); 9050Sstevel@tonic-gate 9060Sstevel@tonic-gate void soft_validate_token_objects(boolean_t validate); 9070Sstevel@tonic-gate 9080Sstevel@tonic-gate CK_RV soft_object_write_access_check(soft_session_t *sp, soft_object_t *objp); 9090Sstevel@tonic-gate 9100Sstevel@tonic-gate CK_RV soft_pin_expired_check(soft_object_t *objp); 9110Sstevel@tonic-gate 9120Sstevel@tonic-gate CK_RV soft_copy_to_old_object(soft_object_t *new, soft_object_t *old); 9130Sstevel@tonic-gate 9140Sstevel@tonic-gate CK_RV soft_keystore_load_latest_object(soft_object_t *old_obj); 9150Sstevel@tonic-gate 9160Sstevel@tonic-gate CK_RV refresh_token_objects(); 9170Sstevel@tonic-gate 9180Sstevel@tonic-gate void bigint_attr_cleanup(biginteger_t *big); 9190Sstevel@tonic-gate 9200Sstevel@tonic-gate CK_RV soft_add_extra_attr(CK_ATTRIBUTE_PTR template, soft_object_t *object_p); 9210Sstevel@tonic-gate 9220Sstevel@tonic-gate CK_RV get_bigint_attr_from_template(biginteger_t *big, 9230Sstevel@tonic-gate CK_ATTRIBUTE_PTR template); 9240Sstevel@tonic-gate 925*12573SDina.Nimeh@Sun.COM CK_RV dup_bigint_attr(biginteger_t *bi, CK_BYTE *buf, CK_ULONG buflen); 926*12573SDina.Nimeh@Sun.COM 9270Sstevel@tonic-gate #ifdef __cplusplus 9280Sstevel@tonic-gate } 9290Sstevel@tonic-gate #endif 9300Sstevel@tonic-gate 9310Sstevel@tonic-gate #endif /* _SOFTOBJECT_H */ 932