Home | History | Annotate | Download | only in common
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License (the "License").
      6  * You may not use this file except in compliance with the License.
      7  *
      8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9  * or http://www.opensolaris.org/os/licensing.
     10  * See the License for the specific language governing permissions
     11  * and limitations under the License.
     12  *
     13  * When distributing Covered Code, include this CDDL HEADER in each
     14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15  * If applicable, add the following below this CDDL HEADER, with the
     16  * fields enclosed by brackets "[]" replaced with your own identifying
     17  * information: Portions Copyright [yyyy] [name of copyright owner]
     18  *
     19  * CDDL HEADER END
     20  */
     21 /*
     22  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
     23  * Use is subject to license terms.
     24  */
     25 
     26 #ifndef _META_ATTRMASTERS_H
     27 #define	_META_ATTRMASTERS_H
     28 
     29 #pragma ident	"%Z%%M%	%I%	%E% SMI"
     30 
     31 #ifdef	__cplusplus
     32 extern "C" {
     33 #endif
     34 
     35 /*
     36  * Master object templates
     37  *
     38  * [This file should only be included by a single source file. This is a
     39  * non-traditional header file in that it simply contains a bunch of large,
     40  * preinitialized static const structures. They're stored here to keep them
     41  * "out of the way."]
     42  *
     43  * In PKCS#11, each object is well-defined... Each object type has an exact
     44  * set of attributes, and each attribute always has some value. Some
     45  * attribute values must be specificed when the object is created, others
     46  * are optional (ie, a default value exisits). Thus, the template an
     47  * application provides when creating a new object may be a subset of the
     48  * allowed attributes. The "master" templates presented here, however,
     49  * are complete.
     50  */
     51 
     52 
     53 /*
     54  * Aliases for some field values in generic_attr_t, so that the initialization
     55  * below isn't just a confusing mess of B_TRUE and B_FALSE. Lint
     56  * complaints about using "!Foo" in const initializers,
     57  * so we #define each value.
     58  */
     59 
     60 #define	unused		0
     61 #define	Mallocd		B_TRUE
     62 #define	Clone		B_TRUE
     63 #define	EmptyValue	B_TRUE
     64 #define	NotMallocd	B_FALSE
     65 #define	NotClone	B_FALSE
     66 #define	NotEmptyValue	B_FALSE
     67 #define	EMPTYDATE	' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '
     68 #define	EMPTY		'\0'
     69 
     70 /*
     71  * A note regarding CKA_CLASS and sub-type (eg CKA_KEY_TYPE)
     72  *
     73  * These two attributes have been moved to the top of the master template
     74  * definitions. All the metaslot code assumes that CKA_CLASS resides in index=0,
     75  * and the sub-type resides in index=1.
     76  */
     77 
     78 
     79 /*
     80  * Common storage object attributes, Table 19 (p81) of PKCS#11 2.11r1 spec.
     81  */
     82 #define	COMMON_STORAGE_ATTRIBUTES					\
     83 	{ { CKA_TOKEN, NULL, sizeof (CK_BBOOL) },			\
     84 		NotMallocd, Clone, NotEmptyValue, B_FALSE,		\
     85 		CK_FALSE, unused, { unused } },				\
     86 	{ { CKA_PRIVATE, NULL, sizeof (CK_BBOOL) },			\
     87 		NotMallocd, Clone, NotEmptyValue, B_FALSE,		\
     88 		CK_FALSE, unused, { unused } },				\
     89 	{ { CKA_MODIFIABLE, NULL, sizeof (CK_BBOOL) },			\
     90 		NotMallocd, Clone, NotEmptyValue, B_FALSE,		\
     91 		CK_TRUE, unused, { unused } },				\
     92 	{ { CKA_LABEL, NULL, 0 },					\
     93 		NotMallocd, Clone, EmptyValue, B_FALSE,			\
     94 		unused, unused, { EMPTY } }
     95 
     96 /*
     97  * Common certificate attributes, Table 21 (p83) of PKCS#11 2.11r1 spec.
     98  * (CKA_CERTIFICATE_TYPE has been moved, to place at top of template)
     99  *
    100  */
    101 #define	COMMON_CERTIFICATE_ATTRIBUTES					\
    102 	{ { CKA_TRUSTED, NULL, sizeof (CK_BBOOL) },			\
    103 		NotMallocd, NotClone, NotEmptyValue, B_FALSE,		\
    104 		CK_FALSE, unused, { unused } }
    105 
    106 /*
    107  * Common key attributes, Table 25 (p89) of PKCS#11 2.11r1 spec.
    108  * (CKA_KEY_TYPE has been moved, to place at top of template)
    109  *
    110  */
    111 #define	COMMON_KEY_ATTRIBUTES						\
    112 	{ { CKA_ID, NULL, 0 },						\
    113 		NotMallocd, Clone, EmptyValue, B_FALSE,			\
    114 		unused, unused, { EMPTY } },				\
    115 	{ { CKA_START_DATE, NULL, sizeof (CK_DATE) },			\
    116 		NotMallocd, Clone, EmptyValue, B_FALSE,			\
    117 		unused, unused, { EMPTYDATE } },			\
    118 	{ { CKA_END_DATE, NULL, sizeof (CK_DATE) },			\
    119 		NotMallocd, Clone, EmptyValue, B_FALSE,			\
    120 		unused, unused, { EMPTYDATE } },			\
    121 	{ { CKA_DERIVE, NULL, sizeof (CK_BBOOL) },			\
    122 		NotMallocd, Clone, NotEmptyValue, B_FALSE,		\
    123 		CK_FALSE, unused, { unused } },				\
    124 	{ { CKA_LOCAL, NULL, sizeof (CK_BBOOL) },			\
    125 		NotMallocd, NotClone, NotEmptyValue, B_FALSE,		\
    126 		CK_FALSE, unused, { unused } },				\
    127 	{ { CKA_KEY_GEN_MECHANISM, NULL, sizeof (CK_MECHANISM_TYPE) },	\
    128 		NotMallocd, NotClone, EmptyValue, B_FALSE,		\
    129 		unused, CK_UNAVAILABLE_INFORMATION, { unused } }
    130 
    131 /*
    132  * Common public-key attributes, Table 26 (p90) of PKCS#11 2.11r1 spec.
    133  *
    134  * CKA_SUBJECT has the PKCS#11-specified default. The object-usage attributes
    135  * are token-specific defaults.
    136  *
    137  */
    138 #define	COMMON_PUBKEY_ATTRIBUTES					\
    139 	{ { CKA_SUBJECT, NULL, 0 },					\
    140 		NotMallocd, Clone, EmptyValue, B_FALSE,			\
    141 		unused, unused, { EMPTY } },				\
    142 	{ { CKA_ENCRYPT, NULL, sizeof (CK_BBOOL) },			\
    143 		NotMallocd, Clone, NotEmptyValue, B_FALSE,		\
    144 		CK_TRUE, unused, { unused } },				\
    145 	{ { CKA_VERIFY, NULL, sizeof (CK_BBOOL) },			\
    146 		NotMallocd, Clone, NotEmptyValue, B_FALSE,		\
    147 		CK_TRUE, unused, { unused } },				\
    148 	{ { CKA_VERIFY_RECOVER, NULL, sizeof (CK_BBOOL) },		\
    149 		NotMallocd, Clone, NotEmptyValue, B_FALSE,		\
    150 		CK_TRUE, unused, { unused } },				\
    151 	{ { CKA_WRAP, NULL, sizeof (CK_BBOOL) },			\
    152 		NotMallocd, Clone, NotEmptyValue, B_FALSE,		\
    153 		CK_TRUE, unused, { unused } },				\
    154 	{ { CKA_TRUSTED, NULL, sizeof (CK_BBOOL) },			\
    155 		NotMallocd, NotClone, NotEmptyValue, B_FALSE,		\
    156 		CK_FALSE, unused, { unused } }
    157 
    158 /*
    159  * Common private-key attributes, Table 34 (p97) of PKCS#11 2.11r1 spec.
    160  */
    161 #define	COMMON_PRIVKEY_ATTRIBUTES					\
    162 	{ { CKA_SUBJECT, NULL, 0 },					\
    163 		NotMallocd, Clone, EmptyValue, B_FALSE,			\
    164 		unused, unused, { EMPTY } },				\
    165 	{ { CKA_SENSITIVE, NULL, sizeof (CK_BBOOL) },			\
    166 		NotMallocd, Clone, NotEmptyValue, B_FALSE,		\
    167 		CK_FALSE, unused, { unused } },				\
    168 	{ { CKA_SECONDARY_AUTH, NULL, sizeof (CK_BBOOL) },		\
    169 		NotMallocd, Clone, EmptyValue, B_FALSE,			\
    170 		CK_FALSE, unused, { unused } },				\
    171 	{ { CKA_DECRYPT, NULL, sizeof (CK_BBOOL) },			\
    172 		NotMallocd, Clone, NotEmptyValue, B_FALSE,		\
    173 		CK_TRUE, unused, { unused } },				\
    174 	{ { CKA_SIGN, NULL, sizeof (CK_BBOOL) },			\
    175 		NotMallocd, Clone, NotEmptyValue, B_FALSE,		\
    176 		CK_TRUE, unused, { unused } },				\
    177 	{ { CKA_SIGN_RECOVER, NULL, sizeof (CK_BBOOL) },		\
    178 		NotMallocd, Clone, NotEmptyValue, B_FALSE,		\
    179 		CK_TRUE, unused, { unused } },				\
    180 	{ { CKA_UNWRAP, NULL, sizeof (CK_BBOOL) },			\
    181 		NotMallocd, Clone, NotEmptyValue, B_FALSE,		\
    182 		CK_TRUE, unused, { unused } },				\
    183 	{ { CKA_EXTRACTABLE, NULL, sizeof (CK_BBOOL) },			\
    184 		NotMallocd, Clone, NotEmptyValue, B_FALSE,		\
    185 		CK_TRUE, unused, { unused } },				\
    186 	{ { CKA_ALWAYS_SENSITIVE, NULL, sizeof (CK_BBOOL) },		\
    187 		NotMallocd, NotClone, NotEmptyValue, B_FALSE,		\
    188 		CK_FALSE, unused, { unused } },				\
    189 	{ { CKA_NEVER_EXTRACTABLE, NULL, sizeof (CK_BBOOL) },		\
    190 		NotMallocd, NotClone, NotEmptyValue, B_FALSE,		\
    191 		CK_FALSE, unused, { unused } }
    192 
    193 
    194 /*
    195  * Common secret-key attributes, Table 42 (p108) of PKCS#11 2.11r1 spec.
    196  */
    197 #define	COMMON_SECKEY_ATTRIBUTES					\
    198 	{ { CKA_SENSITIVE, NULL, sizeof (CK_BBOOL) },			\
    199 		NotMallocd, Clone, NotEmptyValue, B_FALSE,		\
    200 		CK_FALSE, unused, { unused } },				\
    201 	{ { CKA_ENCRYPT, NULL, sizeof (CK_BBOOL) },			\
    202 		NotMallocd, Clone, NotEmptyValue, B_FALSE,		\
    203 		CK_TRUE, unused, { unused } },				\
    204 	{ { CKA_DECRYPT, NULL, sizeof (CK_BBOOL) },			\
    205 		NotMallocd, Clone, NotEmptyValue, B_FALSE,		\
    206 		CK_TRUE, unused, { unused } },				\
    207 	{ { CKA_SIGN, NULL, sizeof (CK_BBOOL) },			\
    208 		NotMallocd, Clone, NotEmptyValue, B_FALSE,		\
    209 		CK_TRUE, unused, { unused } },				\
    210 	{ { CKA_VERIFY, NULL, sizeof (CK_BBOOL) },			\
    211 		NotMallocd, Clone, NotEmptyValue, B_FALSE,		\
    212 		CK_TRUE, unused, { unused } },				\
    213 	{ { CKA_WRAP, NULL, sizeof (CK_BBOOL) },			\
    214 		NotMallocd, Clone, NotEmptyValue, B_FALSE,		\
    215 		CK_TRUE, unused, { unused } },				\
    216 	{ { CKA_UNWRAP, NULL, sizeof (CK_BBOOL) },			\
    217 		NotMallocd, Clone, NotEmptyValue, B_FALSE,		\
    218 		CK_TRUE, unused, { unused } },				\
    219 	{ { CKA_EXTRACTABLE, NULL, sizeof (CK_BBOOL) },			\
    220 		NotMallocd, Clone, NotEmptyValue, B_FALSE,		\
    221 		CK_TRUE, unused, { unused } },				\
    222 	{ { CKA_ALWAYS_SENSITIVE, NULL, sizeof (CK_BBOOL) },		\
    223 		NotMallocd, NotClone, NotEmptyValue, B_FALSE,		\
    224 		CK_FALSE, unused, { unused } },				\
    225 	{ { CKA_NEVER_EXTRACTABLE, NULL, sizeof (CK_BBOOL) },		\
    226 		NotMallocd, NotClone, NotEmptyValue, B_FALSE,		\
    227 		CK_FALSE, unused, { unused } }
    228 
    229 /*
    230  * Common domain-paramaters attributes, Table 60 (p123) of PKCS#11 2.11r1 spec.
    231  * (CKA_KEY_TYPE has been removed, to place elsewhere)
    232  */
    233 #define	COMMON_DOMAIN_ATTRIBUTES					\
    234 	{ { CKA_LOCAL, NULL, sizeof (CK_BBOOL) },			\
    235 		NotMallocd, Clone, NotEmptyValue, B_FALSE,		\
    236 		CK_FALSE, unused, { unused } }
    237 
    238 
    239 /* ========================= HW Objects ========================= */
    240 
    241 
    242 /*
    243  * Master template for: CKO_HW_FEATURE + CKH_CLOCK
    244  */
    245 static const generic_attr_t OBJ_HW_CLOCK[] =
    246 {
    247 	{ { CKA_CLASS, NULL, sizeof (CK_OBJECT_CLASS) },
    248 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    249 		unused, CKO_HW_FEATURE, { unused } },
    250 	{ { CKA_HW_FEATURE_TYPE, NULL, sizeof (CK_HW_FEATURE_TYPE) },
    251 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    252 		unused, CKH_CLOCK, { unused } },
    253 	{ { CKA_VALUE, NULL, 16 },
    254 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    255 		unused, unused, { EMPTYDATE, EMPTYDATE } }
    256 };
    257 
    258 
    259 /*
    260  * Master template for: CKO_HW_FEATURE + CKH_MONOTONIC_COUNTER
    261  *
    262  * NOTE: no sub-type for this class!
    263  */
    264 static const generic_attr_t OBJ_HW_MONOTONIC[] =
    265 {
    266 	{ { CKA_CLASS, NULL, sizeof (CK_OBJECT_CLASS) },
    267 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    268 		unused, CKO_HW_FEATURE, { unused } },
    269 	{ { CKA_HW_FEATURE_TYPE, NULL, sizeof (CK_HW_FEATURE_TYPE) },
    270 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    271 		unused, CKH_MONOTONIC_COUNTER, { unused } },
    272 	{ { CKA_VALUE, NULL, 0 },
    273 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    274 		unused, unused, { EMPTY } },
    275 	{ { CKA_RESET_ON_INIT, NULL, sizeof (CK_BBOOL) },
    276 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    277 		CK_FALSE, unused, { unused } },
    278 	{ { CKA_HAS_RESET, NULL, sizeof (CK_BBOOL) },
    279 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    280 		CK_FALSE, unused, { unused } }
    281 };
    282 
    283 
    284 /* ========================= Data Objects ========================= */
    285 
    286 
    287 /*
    288  * Master template for CKO_DATA + (no subtypes for this class)
    289  *
    290  * Defaults are according to PKCS#11.
    291  *
    292  * NOTE: no sub-type for this class!
    293  */
    294 static const generic_attr_t OBJ_DATA[] =
    295 {
    296 	{ { CKA_CLASS, NULL, sizeof (CK_OBJECT_CLASS) },
    297 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    298 		unused, CKO_DATA, { unused } },
    299 	COMMON_STORAGE_ATTRIBUTES,
    300 	{ { CKA_APPLICATION, NULL, 0 },
    301 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    302 		unused, unused, { EMPTY } },
    303 	{ { CKA_OBJECT_ID, NULL, 0 },
    304 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    305 		unused, unused, { EMPTY } },
    306 	{ { CKA_VALUE, NULL, 0 },
    307 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    308 		unused, unused, { EMPTY } }
    309 };
    310 
    311 
    312 /* ========================= Certificate Objects ========================= */
    313 
    314 
    315 /*
    316  * Master template for CKO_CERTIFICATE + CKC_X_509
    317  *
    318  * Defaults are according to PKCS#11.
    319  */
    320 static const generic_attr_t OBJ_CERT_X509[] =
    321 {
    322 	{ { CKA_CLASS, NULL, sizeof (CK_OBJECT_CLASS) },
    323 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    324 		unused, CKO_CERTIFICATE, { unused } },
    325 	{ { CKA_CERTIFICATE_TYPE, NULL, sizeof (CK_CERTIFICATE_TYPE) },
    326 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    327 		unused, CKC_X_509, { unused } },
    328 	COMMON_STORAGE_ATTRIBUTES,
    329 	COMMON_CERTIFICATE_ATTRIBUTES,
    330 	{ { CKA_SUBJECT, NULL, 0 },
    331 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    332 		unused, unused, { EMPTY } },
    333 	{ { CKA_ID, NULL, 0 },
    334 		NotMallocd, Clone, EmptyValue, B_FALSE,
    335 		unused, unused, { EMPTY } },
    336 	{ { CKA_ISSUER, NULL, 0 },
    337 		NotMallocd, Clone, EmptyValue, B_FALSE,
    338 		unused, unused, { EMPTY } },
    339 	{ { CKA_SERIAL_NUMBER, NULL, 0 },
    340 		NotMallocd, Clone, EmptyValue, B_FALSE,
    341 		unused, unused, { EMPTY } },
    342 	{ { CKA_VALUE, NULL, 0 },
    343 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    344 		unused, unused, { EMPTY } }
    345 };
    346 
    347 
    348 /*
    349  * Master template for CKO_CERTIFICATE + CKC_X_509_ATTR_CERT
    350  *
    351  * Defaults are according to PKCS#11.
    352  */
    353 static const generic_attr_t OBJ_CERT_X509ATTR[] =
    354 {
    355 	{ { CKA_CLASS, NULL, sizeof (CK_OBJECT_CLASS) },
    356 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    357 		unused, CKO_CERTIFICATE, { unused } },
    358 	{ { CKA_CERTIFICATE_TYPE, NULL, sizeof (CK_CERTIFICATE_TYPE) },
    359 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    360 		unused, CKC_X_509_ATTR_CERT, { unused } },
    361 	COMMON_STORAGE_ATTRIBUTES,
    362 	COMMON_CERTIFICATE_ATTRIBUTES,
    363 	{ { CKA_OWNER, NULL, 0 },
    364 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    365 		unused, unused, { EMPTY } },
    366 	{ { CKA_AC_ISSUER, NULL, 0 },
    367 		NotMallocd, Clone, EmptyValue, B_FALSE,
    368 		unused, unused, { EMPTY } },
    369 	{ { CKA_SERIAL_NUMBER, NULL, 0 },
    370 		NotMallocd, Clone, EmptyValue, B_FALSE,
    371 		unused, unused, { EMPTY } },
    372 	{ { CKA_ATTR_TYPES, NULL, 0 },
    373 		NotMallocd, Clone, EmptyValue, B_FALSE,
    374 		unused, unused, { EMPTY } },
    375 	{ { CKA_VALUE, NULL, 0 },
    376 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    377 		unused, unused, { EMPTY } }
    378 };
    379 
    380 
    381 /* ========================= Public Keys ========================= */
    382 
    383 
    384 /*
    385  * Master template for CKO_PUBLIC_KEY + CKK_RSA
    386  */
    387 static const generic_attr_t OBJ_PUBKEY_RSA[] =
    388 {
    389 	{ { CKA_CLASS, NULL, sizeof (CK_OBJECT_CLASS) },
    390 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    391 		unused, CKO_PUBLIC_KEY, { unused } },
    392 	{ { CKA_KEY_TYPE, NULL, sizeof (CK_KEY_TYPE) },
    393 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    394 		unused, CKK_RSA, { unused } },
    395 	COMMON_STORAGE_ATTRIBUTES,
    396 	COMMON_KEY_ATTRIBUTES,
    397 	COMMON_PUBKEY_ATTRIBUTES,
    398 	{ { CKA_MODULUS, NULL, 0 },
    399 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    400 		unused, unused, { EMPTY } },
    401 	{ { CKA_MODULUS_BITS, NULL, sizeof (CK_ULONG)},
    402 		NotMallocd, NotClone, NotEmptyValue, B_FALSE,
    403 		unused, 0, { unused } },
    404 	{ { CKA_PUBLIC_EXPONENT, NULL, 0 },
    405 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    406 		unused, unused, { EMPTY } }
    407 };
    408 
    409 
    410 /*
    411  * Master template for CKO_PUBLIC_KEY + CKK_DSA
    412  *
    413  */
    414 static const generic_attr_t OBJ_PUBKEY_DSA[] =
    415 {
    416 	{ { CKA_CLASS, NULL, sizeof (CK_OBJECT_CLASS) },
    417 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    418 		unused, CKO_PUBLIC_KEY, { unused } },
    419 	{ { CKA_KEY_TYPE, NULL, sizeof (CK_KEY_TYPE) },
    420 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    421 		unused, CKK_DSA, { unused } },
    422 	COMMON_STORAGE_ATTRIBUTES,
    423 	COMMON_KEY_ATTRIBUTES,
    424 	COMMON_PUBKEY_ATTRIBUTES,
    425 	{ { CKA_PRIME, NULL, 0 },
    426 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    427 		unused, unused, { EMPTY } },
    428 	{ { CKA_SUBPRIME, NULL, 0 },
    429 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    430 		unused, unused, { EMPTY } },
    431 	{ { CKA_BASE, NULL, 0 },
    432 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    433 		unused, unused, { EMPTY } },
    434 	{ { CKA_VALUE, NULL, 0 },
    435 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    436 		unused, unused, { EMPTY } }
    437 };
    438 
    439 
    440 /*
    441  * Master template for CKO_PUBLIC_KEY + CKK_EC
    442  *
    443  */
    444 static const generic_attr_t OBJ_PUBKEY_EC[] =
    445 {
    446 	{ { CKA_CLASS, NULL, sizeof (CK_OBJECT_CLASS) },
    447 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    448 		unused, CKO_PUBLIC_KEY, { unused } },
    449 	{ { CKA_KEY_TYPE, NULL, sizeof (CK_KEY_TYPE) },
    450 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    451 		unused, CKK_EC, { unused } },
    452 	COMMON_STORAGE_ATTRIBUTES,
    453 	COMMON_KEY_ATTRIBUTES,
    454 	COMMON_PUBKEY_ATTRIBUTES,
    455 	{ { CKA_EC_PARAMS, NULL, 0 },
    456 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    457 		unused, unused, { EMPTY } },
    458 	{ { CKA_EC_POINT, NULL, 0 },
    459 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    460 		unused, unused, { EMPTY } }
    461 };
    462 
    463 
    464 /*
    465  * Master template for CKO_PUBLIC_KEY + CKK_DH
    466  *
    467  */
    468 static const generic_attr_t OBJ_PUBKEY_DH[] =
    469 {
    470 	{ { CKA_CLASS, NULL, sizeof (CK_OBJECT_CLASS) },
    471 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    472 		unused, CKO_PUBLIC_KEY, { unused } },
    473 	{ { CKA_KEY_TYPE, NULL, sizeof (CK_KEY_TYPE) },
    474 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    475 		unused, CKK_DH, { unused } },
    476 	COMMON_STORAGE_ATTRIBUTES,
    477 	COMMON_KEY_ATTRIBUTES,
    478 	COMMON_PUBKEY_ATTRIBUTES,
    479 	{ { CKA_PRIME, NULL, 0 },
    480 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    481 		unused, unused, { EMPTY } },
    482 	{ { CKA_BASE, NULL, 0 },
    483 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    484 		unused, unused, { EMPTY } },
    485 	{ { CKA_VALUE, NULL, 0 },
    486 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    487 		unused, unused, { EMPTY } }
    488 };
    489 
    490 
    491 /*
    492  * Master template for CKO_PUBLIC_KEY + CKK_X9_42_DH
    493  *
    494  */
    495 static const generic_attr_t OBJ_PUBKEY_X942DH[] =
    496 {
    497 	{ { CKA_CLASS, NULL, sizeof (CK_OBJECT_CLASS) },
    498 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    499 		unused, CKO_PUBLIC_KEY, { unused } },
    500 	{ { CKA_KEY_TYPE, NULL, sizeof (CK_KEY_TYPE) },
    501 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    502 		unused, CKK_X9_42_DH, { unused } },
    503 	COMMON_STORAGE_ATTRIBUTES,
    504 	COMMON_KEY_ATTRIBUTES,
    505 	COMMON_PUBKEY_ATTRIBUTES,
    506 	{ { CKA_PRIME, NULL, 0 },
    507 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    508 		unused, unused, { EMPTY } },
    509 	{ { CKA_BASE, NULL, 0 },
    510 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    511 		unused, unused, { EMPTY } },
    512 	{ { CKA_SUBPRIME, NULL, 0 },
    513 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    514 		unused, unused, { EMPTY } },
    515 	{ { CKA_VALUE, NULL, 0 },
    516 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    517 		unused, unused, { EMPTY } }
    518 };
    519 
    520 
    521 /*
    522  * Master template for CKO_PUBLIC_KEY + CKK_KEA
    523  *
    524  */
    525 static const generic_attr_t OBJ_PUBKEY_KEA[] =
    526 {
    527 	{ { CKA_CLASS, NULL, sizeof (CK_OBJECT_CLASS) },
    528 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    529 		unused, CKO_PUBLIC_KEY, { unused } },
    530 	{ { CKA_KEY_TYPE, NULL, sizeof (CK_KEY_TYPE) },
    531 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    532 		unused, CKK_KEA, { unused } },
    533 	COMMON_STORAGE_ATTRIBUTES,
    534 	COMMON_KEY_ATTRIBUTES,
    535 	COMMON_PUBKEY_ATTRIBUTES,
    536 	{ { CKA_PRIME, NULL, 0 },
    537 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    538 		unused, unused, { EMPTY } },
    539 	{ { CKA_BASE, NULL, 0 },
    540 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    541 		unused, unused, { EMPTY } },
    542 	{ { CKA_SUBPRIME, NULL, 0 },
    543 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    544 		unused, unused, { EMPTY } },
    545 	{ { CKA_VALUE, NULL, 0 },
    546 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    547 		unused, unused, { EMPTY } }
    548 };
    549 
    550 
    551 /* ========================= Private Keys ========================= */
    552 
    553 
    554 /*
    555  * Master template for CKO_PRIVATE_KEY + CKK_RSA
    556  *
    557  */
    558 static const generic_attr_t OBJ_PRIVKEY_RSA[] =
    559 {
    560 	{ { CKA_CLASS, NULL, sizeof (CK_OBJECT_CLASS) },
    561 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    562 		unused, CKO_PRIVATE_KEY, { unused } },
    563 	{ { CKA_KEY_TYPE, NULL, sizeof (CK_KEY_TYPE) },
    564 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    565 		unused, CKK_RSA, { unused } },
    566 	COMMON_STORAGE_ATTRIBUTES,
    567 	COMMON_KEY_ATTRIBUTES,
    568 	COMMON_PRIVKEY_ATTRIBUTES,
    569 	{ { CKA_MODULUS, NULL, 0 },
    570 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    571 		unused, unused, { EMPTY } },
    572 	{ { CKA_PRIVATE_EXPONENT, NULL, 0 },
    573 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    574 		unused, unused, { EMPTY } },
    575 	{ { CKA_PUBLIC_EXPONENT, NULL, 0 },
    576 		NotMallocd, Clone, EmptyValue, B_FALSE,
    577 		unused, unused, { EMPTY } },
    578 	{ { CKA_PRIME_1, NULL, 0 },
    579 		NotMallocd, Clone, EmptyValue, B_FALSE,
    580 		unused, unused, { EMPTY } },
    581 	{ { CKA_PRIME_2, NULL, 0 },
    582 		NotMallocd, Clone, EmptyValue, B_FALSE,
    583 		unused, unused, { EMPTY } },
    584 	{ { CKA_EXPONENT_1, NULL, 0 },
    585 		NotMallocd, Clone, EmptyValue, B_FALSE,
    586 		unused, unused, { EMPTY } },
    587 	{ { CKA_EXPONENT_2, NULL, 0 },
    588 		NotMallocd, Clone, EmptyValue, B_FALSE,
    589 		unused, unused, { EMPTY } },
    590 	{ { CKA_COEFFICIENT, NULL, 0 },
    591 		NotMallocd, Clone, EmptyValue, B_FALSE,
    592 		unused, unused, { EMPTY } }
    593 };
    594 
    595 
    596 /*
    597  * Master template for CKO_PRIVATE_KEY + CKK_DSA
    598  *
    599  */
    600 static const generic_attr_t OBJ_PRIVKEY_DSA[] =
    601 {
    602 	{ { CKA_CLASS, NULL, sizeof (CK_OBJECT_CLASS) },
    603 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    604 		unused, CKO_PRIVATE_KEY, { unused } },
    605 	{ { CKA_KEY_TYPE, NULL, sizeof (CK_KEY_TYPE) },
    606 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    607 		unused, CKK_DSA, { unused } },
    608 	COMMON_STORAGE_ATTRIBUTES,
    609 	COMMON_KEY_ATTRIBUTES,
    610 	COMMON_PRIVKEY_ATTRIBUTES,
    611 	{ { CKA_PRIME, NULL, 0 },
    612 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    613 		unused, unused, { EMPTY } },
    614 	{ { CKA_SUBPRIME, NULL, 0 },
    615 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    616 		unused, unused, { EMPTY } },
    617 	{ { CKA_BASE, NULL, 0 },
    618 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    619 		unused, unused, { EMPTY } },
    620 	{ { CKA_VALUE, NULL, 0 },
    621 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    622 		unused, unused, { EMPTY } }
    623 };
    624 
    625 
    626 /*
    627  * Master template for CKO_PRIVATE_KEY + CKK_EC
    628  *
    629  */
    630 static const generic_attr_t OBJ_PRIVKEY_EC[] =
    631 {
    632 	{ { CKA_CLASS, NULL, sizeof (CK_OBJECT_CLASS) },
    633 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    634 		unused, CKO_PRIVATE_KEY, { unused } },
    635 	{ { CKA_KEY_TYPE, NULL, sizeof (CK_KEY_TYPE) },
    636 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    637 		unused, CKK_EC, { unused } },
    638 	COMMON_STORAGE_ATTRIBUTES,
    639 	COMMON_KEY_ATTRIBUTES,
    640 	COMMON_PRIVKEY_ATTRIBUTES,
    641 	{ { CKA_EC_PARAMS, NULL, 0 },
    642 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    643 		unused, unused, { EMPTY } },
    644 	{ { CKA_VALUE, NULL, 0 },
    645 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    646 		unused, unused, { EMPTY } }
    647 };
    648 
    649 
    650 /*
    651  * Master template for CKO_PRIVATE_KEY + CKK_DH
    652  */
    653 static const generic_attr_t OBJ_PRIVKEY_DH[] =
    654 {
    655 	{ { CKA_CLASS, NULL, sizeof (CK_OBJECT_CLASS) },
    656 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    657 		unused, CKO_PRIVATE_KEY, { unused } },
    658 	{ { CKA_KEY_TYPE, NULL, sizeof (CK_KEY_TYPE) },
    659 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    660 		unused, CKK_DH, { unused } },
    661 	COMMON_STORAGE_ATTRIBUTES,
    662 	COMMON_KEY_ATTRIBUTES,
    663 	COMMON_PRIVKEY_ATTRIBUTES,
    664 	{ { CKA_PRIME, NULL, 0 },
    665 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    666 		unused, unused, { EMPTY } },
    667 	{ { CKA_BASE, NULL, 0 },
    668 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    669 		unused, unused, { EMPTY } },
    670 	{ { CKA_VALUE, NULL, 0 },
    671 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    672 		unused, unused, { EMPTY } },
    673 	{ { CKA_VALUE_BITS, NULL, sizeof (CK_ULONG) },
    674 		NotMallocd, NotClone, NotEmptyValue, B_FALSE,
    675 		unused, 0, { unused } }
    676 };
    677 
    678 
    679 /*
    680  * Master template for CKO_PRIVATE_KEY + CKK_X9_42_DH
    681  *
    682  */
    683 static const generic_attr_t OBJ_PRIVKEY_X942DH[] =
    684 {
    685 	{ { CKA_CLASS, NULL, sizeof (CK_OBJECT_CLASS) },
    686 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    687 		unused, CKO_PRIVATE_KEY, { unused } },
    688 	{ { CKA_KEY_TYPE, NULL, sizeof (CK_KEY_TYPE) },
    689 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    690 		unused, CKK_X9_42_DH, { unused } },
    691 	COMMON_STORAGE_ATTRIBUTES,
    692 	COMMON_KEY_ATTRIBUTES,
    693 	COMMON_PRIVKEY_ATTRIBUTES,
    694 	{ { CKA_PRIME, NULL, 0 },
    695 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    696 		unused, unused, { EMPTY } },
    697 	{ { CKA_SUBPRIME, NULL, 0 },
    698 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    699 		unused, unused, { EMPTY } },
    700 	{ { CKA_BASE, NULL, 0 },
    701 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    702 		unused, unused, { EMPTY } },
    703 	{ { CKA_VALUE, NULL, 0 },
    704 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    705 		unused, unused, { EMPTY } }
    706 };
    707 
    708 
    709 /*
    710  * Master template for CKO_PRIVATE_KEY + CKK_KEA
    711  *
    712  */
    713 static const generic_attr_t OBJ_PRIVKEY_KEA[] =
    714 {
    715 	{ { CKA_CLASS, NULL, sizeof (CK_OBJECT_CLASS) },
    716 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    717 		unused, CKO_PRIVATE_KEY, { unused } },
    718 	{ { CKA_KEY_TYPE, NULL, sizeof (CK_KEY_TYPE) },
    719 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    720 		unused, CKK_KEA, { unused } },
    721 	COMMON_STORAGE_ATTRIBUTES,
    722 	COMMON_KEY_ATTRIBUTES,
    723 	COMMON_PRIVKEY_ATTRIBUTES,
    724 	{ { CKA_PRIME, NULL, 0 },
    725 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    726 		unused, unused, { EMPTY } },
    727 	{ { CKA_BASE, NULL, 0 },
    728 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    729 		unused, unused, { EMPTY } },
    730 	{ { CKA_SUBPRIME, NULL, 0 },
    731 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    732 		unused, unused, { EMPTY } },
    733 	{ { CKA_VALUE, NULL, 0 },
    734 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    735 		unused, unused, { EMPTY } }
    736 };
    737 
    738 
    739 /* ========================= Secret Keys ========================= */
    740 
    741 
    742 /*
    743  * Master template for CKO_SECRET_KEY + (fixed-length keytype)
    744  */
    745 static const generic_attr_t OBJ_SECKEY[] =
    746 {
    747 	{ { CKA_CLASS, NULL, sizeof (CK_OBJECT_CLASS) },
    748 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    749 		unused, CKO_SECRET_KEY, { unused } },
    750 	{ { CKA_KEY_TYPE, NULL, sizeof (CK_KEY_TYPE) },
    751 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    752 		unused, CKK_GENERIC_SECRET, { unused } },
    753 	COMMON_STORAGE_ATTRIBUTES,
    754 	COMMON_KEY_ATTRIBUTES,
    755 	COMMON_SECKEY_ATTRIBUTES,
    756 	{ { CKA_VALUE, NULL, 0 },
    757 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    758 		unused, unused, { EMPTY } }
    759 };
    760 
    761 
    762 /*
    763  * Master template for CKO_SECRET_KEY + (variable-length keytype)
    764  *
    765  */
    766 static const generic_attr_t OBJ_SECKEY_WITHLEN[] =
    767 {
    768 	{ { CKA_CLASS, NULL, sizeof (CK_OBJECT_CLASS) },
    769 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    770 		unused, CKO_SECRET_KEY, { unused } },
    771 	{ { CKA_KEY_TYPE, NULL, sizeof (CK_KEY_TYPE) },
    772 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    773 		unused, CKK_GENERIC_SECRET, { unused } },
    774 	COMMON_STORAGE_ATTRIBUTES,
    775 	COMMON_KEY_ATTRIBUTES,
    776 	COMMON_SECKEY_ATTRIBUTES,
    777 	{ { CKA_VALUE, NULL, 0 },
    778 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    779 		unused, unused, { EMPTY } },
    780 	{ { CKA_VALUE_LEN, NULL, sizeof (CK_ULONG) },
    781 		NotMallocd, NotClone, NotEmptyValue, B_FALSE,
    782 		unused, 0, { unused } }
    783 };
    784 
    785 
    786 /* ========================= Domain Parameters ========================= */
    787 
    788 
    789 /*
    790  * Master template for CKO_DOMAIN_PARAMETERS + CKK_DSA
    791  *
    792  */
    793 static const generic_attr_t OBJ_DOM_DSA[] =
    794 {
    795 	{ { CKA_CLASS, NULL, sizeof (CK_OBJECT_CLASS) },
    796 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    797 		unused, CKO_DOMAIN_PARAMETERS, { unused } },
    798 	{ { CKA_KEY_TYPE, NULL, sizeof (CK_KEY_TYPE) },
    799 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    800 		unused, CKK_DSA, { unused } },
    801 	COMMON_STORAGE_ATTRIBUTES,
    802 	COMMON_DOMAIN_ATTRIBUTES,
    803 	{ { CKA_PRIME, NULL, 0 },
    804 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    805 		unused, unused, { EMPTY } },
    806 	{ { CKA_SUBPRIME, NULL, 0 },
    807 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    808 		unused, unused, { EMPTY } },
    809 	{ { CKA_BASE, NULL, 0 },
    810 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    811 		unused, unused, { EMPTY } },
    812 	{ { CKA_PRIME_BITS, NULL, sizeof (CK_ULONG) },
    813 		NotMallocd, NotClone, NotEmptyValue, B_FALSE,
    814 		unused, 0, { unused } }
    815 };
    816 
    817 /*
    818  * Master template for CKO_DOMAIN_PARAMETERS + CKK_DH
    819  *
    820  */
    821 static const generic_attr_t OBJ_DOM_DH[] =
    822 {
    823 	{ { CKA_CLASS, NULL, sizeof (CK_OBJECT_CLASS) },
    824 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    825 		unused, CKO_DOMAIN_PARAMETERS, { unused } },
    826 	{ { CKA_KEY_TYPE, NULL, sizeof (CK_KEY_TYPE) },
    827 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    828 		unused, CKK_DH, { unused } },
    829 	COMMON_STORAGE_ATTRIBUTES,
    830 	COMMON_DOMAIN_ATTRIBUTES,
    831 	{ { CKA_PRIME, NULL, 0 },
    832 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    833 		unused, unused, { EMPTY } },
    834 	{ { CKA_BASE, NULL, 0 },
    835 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    836 		unused, unused, { EMPTY } },
    837 	{ { CKA_PRIME_BITS, NULL, sizeof (CK_ULONG) },
    838 		NotMallocd, NotClone, NotEmptyValue, B_FALSE,
    839 		unused, 0, { unused } }
    840 };
    841 
    842 /*
    843  * Master template for CKO_DOMAIN_PARAMETERS + CKK_X9_42_DH
    844  *
    845  */
    846 static const generic_attr_t OBJ_DOM_X942DH[] =
    847 {
    848 	{ { CKA_CLASS, NULL, sizeof (CK_OBJECT_CLASS) },
    849 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    850 		unused, CKO_DOMAIN_PARAMETERS, { unused } },
    851 	{ { CKA_KEY_TYPE, NULL, sizeof (CK_KEY_TYPE) },
    852 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    853 		unused, CKK_X9_42_DH, { unused } },
    854 	COMMON_STORAGE_ATTRIBUTES,
    855 	COMMON_DOMAIN_ATTRIBUTES,
    856 	{ { CKA_PRIME, NULL, 0 },
    857 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    858 		unused, unused, { EMPTY } },
    859 	{ { CKA_BASE, NULL, 0 },
    860 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    861 		unused, unused, { EMPTY } },
    862 	{ { CKA_SUBPRIME, NULL, 0 },
    863 		NotMallocd, Clone, NotEmptyValue, B_FALSE,
    864 		unused, unused, { EMPTY } },
    865 	{ { CKA_PRIME_BITS, NULL, sizeof (CK_ULONG) },
    866 		NotMallocd, NotClone, NotEmptyValue, B_FALSE,
    867 		unused, 0, { unused } },
    868 	{ { CKA_SUBPRIME_BITS, NULL, sizeof (CK_ULONG) },
    869 		NotMallocd, NotClone, NotEmptyValue, B_FALSE,
    870 		unused, 0, { unused } }
    871 };
    872 
    873 #ifdef	__cplusplus
    874 }
    875 #endif
    876 
    877 #endif /* _META_ATTRMASTERS_H */
    878