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