1
2 /*
3 * Licensed Materials - Property of IBM
4 *
5 * trousers - An open source TCG Software Stack
6 *
7 * (C) Copyright International Business Machines Corp. 2004-2007
8 *
9 */
10
11
12 #include <stdlib.h>
13 #include <stdio.h>
14 #include <string.h>
15 #include <time.h>
16 #include <errno.h>
17
18 #include "trousers/tss.h"
19 #include "trousers/trousers.h"
20 #include "trousers_types.h"
21 #include "trousers_types.h"
22 #include "spi_utils.h"
23 #include "capabilities.h"
24 #include "tsplog.h"
25 #include "obj.h"
26 #include "tsp_audit.h"
27
28
29 TSS_RESULT
Tspi_SetAttribUint32(TSS_HOBJECT hObject,TSS_FLAG attribFlag,TSS_FLAG subFlag,UINT32 ulAttrib)30 Tspi_SetAttribUint32(TSS_HOBJECT hObject, /* in */
31 TSS_FLAG attribFlag, /* in */
32 TSS_FLAG subFlag, /* in */
33 UINT32 ulAttrib) /* in */
34 {
35 TSS_RESULT result;
36
37 if (obj_is_rsakey(hObject)) {
38 #ifdef TSS_BUILD_RSAKEY_LIST
39 if (attribFlag == TSS_TSPATTRIB_KEY_REGISTER) {
40 if (subFlag)
41 return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
42
43 if (ulAttrib == TSS_TSPATTRIB_KEYREGISTER_USER)
44 result = obj_rsakey_set_pstype(hObject, TSS_PS_TYPE_USER);
45 else if (ulAttrib == TSS_TSPATTRIB_KEYREGISTER_SYSTEM)
46 result = obj_rsakey_set_pstype(hObject, TSS_PS_TYPE_SYSTEM);
47 else if (ulAttrib == TSS_TSPATTRIB_KEYREGISTER_NO)
48 result = obj_rsakey_set_pstype(hObject, TSS_PS_TYPE_NO);
49 else
50 return TSPERR(TSS_E_INVALID_ATTRIB_DATA);
51 } else if (attribFlag == TSS_TSPATTRIB_KEY_INFO) {
52 switch (subFlag) {
53 case TSS_TSPATTRIB_KEYINFO_USAGE:
54 result = obj_rsakey_set_usage(hObject, ulAttrib);
55 break;
56 case TSS_TSPATTRIB_KEYINFO_MIGRATABLE:
57 if (ulAttrib != TRUE && ulAttrib != FALSE)
58 return TSPERR(TSS_E_INVALID_ATTRIB_DATA);
59
60 result = obj_rsakey_set_migratable(hObject, ulAttrib);
61 break;
62 case TSS_TSPATTRIB_KEYINFO_REDIRECTED:
63 if (ulAttrib != TRUE && ulAttrib != FALSE)
64 return TSPERR(TSS_E_INVALID_ATTRIB_DATA);
65
66 result = obj_rsakey_set_redirected(hObject, ulAttrib);
67 break;
68 case TSS_TSPATTRIB_KEYINFO_VOLATILE:
69 if (ulAttrib != TRUE && ulAttrib != FALSE)
70 return TSPERR(TSS_E_INVALID_ATTRIB_DATA);
71
72 result = obj_rsakey_set_volatile(hObject, ulAttrib);
73 break;
74 case TSS_TSPATTRIB_KEYINFO_AUTHUSAGE:
75 /* fall through */
76 case TSS_TSPATTRIB_KEYINFO_AUTHDATAUSAGE:
77 if (ulAttrib != TRUE && ulAttrib != FALSE)
78 return TSPERR(TSS_E_INVALID_ATTRIB_DATA);
79
80 result = obj_rsakey_set_authdata_usage(hObject, ulAttrib);
81 break;
82 case TSS_TSPATTRIB_KEYINFO_ALGORITHM:
83 result = obj_rsakey_set_alg(hObject, ulAttrib);
84 break;
85 case TSS_TSPATTRIB_KEYINFO_ENCSCHEME:
86 if (ulAttrib != TSS_ES_NONE &&
87 ulAttrib != TSS_ES_RSAESPKCSV15 &&
88 ulAttrib != TSS_ES_RSAESOAEP_SHA1_MGF1)
89 return TSPERR(TSS_E_INVALID_ATTRIB_DATA);
90
91 result = obj_rsakey_set_es(hObject, ulAttrib);
92 break;
93 case TSS_TSPATTRIB_KEYINFO_SIGSCHEME:
94 if (ulAttrib != TSS_SS_NONE &&
95 ulAttrib != TSS_SS_RSASSAPKCS1V15_SHA1 &&
96 ulAttrib != TSS_SS_RSASSAPKCS1V15_DER &&
97 ulAttrib != TSS_SS_RSASSAPKCS1V15_INFO)
98 return TSPERR(TSS_E_INVALID_ATTRIB_DATA);
99
100 result = obj_rsakey_set_ss(hObject, ulAttrib);
101 break;
102 case TSS_TSPATTRIB_KEYINFO_KEYFLAGS:
103 result = obj_rsakey_set_flags(hObject, ulAttrib);
104 break;
105 case TSS_TSPATTRIB_KEYINFO_SIZE:
106 result = obj_rsakey_set_size(hObject, ulAttrib);
107 break;
108 default:
109 return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
110 }
111 } else if (attribFlag == TSS_TSPATTRIB_RSAKEY_INFO) {
112 if (subFlag == TSS_TSPATTRIB_KEYINFO_RSA_PRIMES) {
113 result = obj_rsakey_set_num_primes(hObject, ulAttrib);
114 } else
115 return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
116 } else
117 return TSPERR(TSS_E_INVALID_ATTRIB_FLAG);
118 #endif
119 #ifdef TSS_BUILD_NV
120 } else if (obj_is_nvstore(hObject)) {
121 switch (attribFlag) {
122 case TSS_TSPATTRIB_NV_INDEX:
123 if ((result = obj_nvstore_set_index(hObject, ulAttrib)))
124 return result;
125 break;
126 case TSS_TSPATTRIB_NV_DATASIZE:
127 if ((result = obj_nvstore_set_datasize(hObject, ulAttrib)))
128 return result;
129 break;
130 case TSS_TSPATTRIB_NV_PERMISSIONS:
131 if ((result = obj_nvstore_set_permission(hObject, ulAttrib)))
132 return result;
133 break;
134 default:
135 return TSPERR(TSS_E_INVALID_ATTRIB_FLAG);
136 break;
137 }
138 #endif
139 } else if (obj_is_policy(hObject)) {
140 switch (attribFlag) {
141 case TSS_TSPATTRIB_POLICY_CALLBACK_HMAC:
142 case TSS_TSPATTRIB_POLICY_CALLBACK_XOR_ENC:
143 case TSS_TSPATTRIB_POLICY_CALLBACK_TAKEOWNERSHIP:
144 case TSS_TSPATTRIB_POLICY_CALLBACK_CHANGEAUTHASYM:
145 result = obj_policy_set_cb11(hObject, attribFlag,
146 subFlag, ulAttrib);
147 break;
148 case TSS_TSPATTRIB_POLICY_SECRET_LIFETIME:
149 if (subFlag == TSS_TSPATTRIB_POLICYSECRET_LIFETIME_ALWAYS ||
150 subFlag == TSS_TSPATTRIB_POLICYSECRET_LIFETIME_COUNTER ||
151 subFlag == TSS_TSPATTRIB_POLICYSECRET_LIFETIME_TIMER) {
152 result = obj_policy_set_lifetime(hObject, subFlag,
153 ulAttrib);
154 } else {
155 result = TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
156 }
157 break;
158 case TSS_TSPATTRIB_SECRET_HASH_MODE:
159 result = obj_policy_set_hash_mode(hObject, ulAttrib);
160 break;
161 #ifdef TSS_BUILD_DELEGATION
162 case TSS_TSPATTRIB_POLICY_DELEGATION_INFO:
163 switch (subFlag) {
164 case TSS_TSPATTRIB_POLDEL_TYPE:
165 switch (ulAttrib) {
166 case TSS_DELEGATIONTYPE_NONE:
167 case TSS_DELEGATIONTYPE_OWNER:
168 case TSS_DELEGATIONTYPE_KEY:
169 result = obj_policy_set_delegation_type(hObject,
170 ulAttrib);
171 break;
172 default:
173 result = TSPERR(TSS_E_INVALID_ATTRIB_DATA);
174 }
175 break;
176 case TSS_TSPATTRIB_POLDEL_INDEX:
177 result = obj_policy_set_delegation_index(hObject, ulAttrib);
178 break;
179 case TSS_TSPATTRIB_POLDEL_PER1:
180 result = obj_policy_set_delegation_per1(hObject, ulAttrib);
181 break;
182 case TSS_TSPATTRIB_POLDEL_PER2:
183 result = obj_policy_set_delegation_per2(hObject, ulAttrib);
184 break;
185 default:
186 result = TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
187 }
188 break;
189 #endif
190 default:
191 return TSPERR(TSS_E_INVALID_ATTRIB_FLAG);
192 break;
193 }
194 } else if (obj_is_context(hObject)) {
195 switch (attribFlag) {
196 case TSS_TSPATTRIB_CONTEXT_SILENT_MODE:
197 if (ulAttrib == TSS_TSPATTRIB_CONTEXT_NOT_SILENT)
198 result = obj_context_set_mode(hObject, ulAttrib);
199 else if (ulAttrib == TSS_TSPATTRIB_CONTEXT_SILENT) {
200 if (obj_context_has_popups(hObject))
201 return TSPERR(TSS_E_SILENT_CONTEXT);
202 result = obj_context_set_mode(hObject, ulAttrib);
203 } else
204 return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
205 break;
206 #ifdef TSS_BUILD_TRANSPORT
207 case TSS_TSPATTRIB_CONTEXT_TRANSPORT:
208 if (subFlag == TSS_TSPATTRIB_CONTEXTTRANS_CONTROL) {
209 if (ulAttrib != TSS_TSPATTRIB_DISABLE_TRANSPORT &&
210 ulAttrib != TSS_TSPATTRIB_ENABLE_TRANSPORT)
211 return TSPERR(TSS_E_INVALID_ATTRIB_DATA);
212
213 result = obj_context_transport_set_control(hObject,
214 ulAttrib);
215 } else if (subFlag == TSS_TSPATTRIB_CONTEXTTRANS_MODE) {
216 switch (ulAttrib) {
217 case TSS_TSPATTRIB_TRANSPORT_NO_DEFAULT_ENCRYPTION:
218 case TSS_TSPATTRIB_TRANSPORT_DEFAULT_ENCRYPTION:
219 case TSS_TSPATTRIB_TRANSPORT_AUTHENTIC_CHANNEL:
220 case TSS_TSPATTRIB_TRANSPORT_EXCLUSIVE:
221 case TSS_TSPATTRIB_TRANSPORT_STATIC_AUTH:
222 break;
223 default:
224 return TSPERR(TSS_E_INVALID_ATTRIB_DATA);
225 }
226
227 result = obj_context_transport_set_mode(hObject, ulAttrib);
228 } else
229 return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
230
231 break;
232 #endif
233 case TSS_TSPATTRIB_SECRET_HASH_MODE:
234 result = obj_context_set_hash_mode(hObject, ulAttrib);
235 break;
236 default:
237 return TSPERR(TSS_E_INVALID_ATTRIB_FLAG);
238 break;
239 }
240 } else if (obj_is_tpm(hObject)) {
241 switch (attribFlag) {
242 case TSS_TSPATTRIB_TPM_CALLBACK_COLLATEIDENTITY:
243 case TSS_TSPATTRIB_TPM_CALLBACK_ACTIVATEIDENTITY:
244 if ((result = obj_tpm_set_cb11(hObject, attribFlag, subFlag,
245 ulAttrib)))
246 return result;
247 break;
248 #ifdef TSS_BUILD_AUDIT
249 case TSS_TSPATTRIB_TPM_ORDINAL_AUDIT_STATUS:
250 result = __tspi_audit_set_ordinal_audit_status(hObject, attribFlag,
251 subFlag, ulAttrib);
252 break;
253 #endif
254 default:
255 result = TSPERR(TSS_E_INVALID_ATTRIB_FLAG);
256 break;
257 }
258 #ifdef TSS_BUILD_SEALX
259 } else if (obj_is_encdata(hObject)) {
260 if (attribFlag != TSS_TSPATTRIB_ENCDATA_SEAL)
261 return TSPERR(TSS_E_INVALID_ATTRIB_FLAG);
262 if (subFlag == TSS_TSPATTRIB_ENCDATASEAL_PROTECT_MODE) {
263 if (ulAttrib != TSS_TSPATTRIB_ENCDATASEAL_NO_PROTECT &&
264 ulAttrib != TSS_TSPATTRIB_ENCDATASEAL_PROTECT)
265 return TSPERR(TSS_E_INVALID_ATTRIB_DATA);
266
267 result = obj_encdata_set_seal_protect_mode(hObject, ulAttrib);
268 } else
269 return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
270 #endif
271 #ifdef TSS_BUILD_DELEGATION
272 } else if (obj_is_delfamily(hObject)) {
273 switch (attribFlag) {
274 case TSS_TSPATTRIB_DELFAMILY_STATE:
275 switch (subFlag) {
276 case TSS_TSPATTRIB_DELFAMILYSTATE_LOCKED:
277 result = obj_delfamily_set_locked(hObject, (TSS_BOOL)ulAttrib, TRUE);
278 break;
279 case TSS_TSPATTRIB_DELFAMILYSTATE_ENABLED:
280 result = obj_delfamily_set_enabled(hObject, (TSS_BOOL)ulAttrib, TRUE);
281 break;
282 default:
283 return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
284 }
285 break;
286 default:
287 return TSPERR(TSS_E_INVALID_ATTRIB_FLAG);
288 }
289 #endif
290 } else {
291 if (obj_is_hash(hObject) || obj_is_pcrs(hObject))
292 result = TSPERR(TSS_E_BAD_PARAMETER);
293 else
294 result = TSPERR(TSS_E_INVALID_HANDLE);
295 }
296
297 return result;
298 }
299
300 TSS_RESULT
Tspi_GetAttribUint32(TSS_HOBJECT hObject,TSS_FLAG attribFlag,TSS_FLAG subFlag,UINT32 * pulAttrib)301 Tspi_GetAttribUint32(TSS_HOBJECT hObject, /* in */
302 TSS_FLAG attribFlag, /* in */
303 TSS_FLAG subFlag, /* in */
304 UINT32 * pulAttrib) /* out */
305 {
306 UINT32 attrib;
307 TSS_RESULT result = TSS_SUCCESS;
308
309 if (pulAttrib == NULL)
310 return TSPERR(TSS_E_BAD_PARAMETER);
311
312 if (obj_is_rsakey(hObject)) {
313 #ifdef TSS_BUILD_RSAKEY_LIST
314 if (attribFlag == TSS_TSPATTRIB_KEY_REGISTER) {
315 if (subFlag != 0)
316 return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
317
318 if ((result = obj_rsakey_get_pstype(hObject, &attrib)))
319 return result;
320
321 if (attrib == TSS_PS_TYPE_USER)
322 *pulAttrib = TSS_TSPATTRIB_KEYREGISTER_USER;
323 else if (attrib == TSS_PS_TYPE_SYSTEM)
324 *pulAttrib = TSS_TSPATTRIB_KEYREGISTER_SYSTEM;
325 else
326 *pulAttrib = TSS_TSPATTRIB_KEYREGISTER_NO;
327 } else if (attribFlag == TSS_TSPATTRIB_KEY_INFO) {
328 switch (subFlag) {
329 case TSS_TSPATTRIB_KEYINFO_USAGE:
330 if ((result = obj_rsakey_get_usage(hObject, pulAttrib)))
331 return result;
332 break;
333 case TSS_TSPATTRIB_KEYINFO_MIGRATABLE:
334 *pulAttrib = obj_rsakey_is_migratable(hObject);
335 break;
336 case TSS_TSPATTRIB_KEYINFO_REDIRECTED:
337 *pulAttrib = obj_rsakey_is_redirected(hObject);
338 break;
339 case TSS_TSPATTRIB_KEYINFO_VOLATILE:
340 *pulAttrib = obj_rsakey_is_volatile(hObject);
341 break;
342 case TSS_TSPATTRIB_KEYINFO_AUTHUSAGE:
343 /* fall through */
344 case TSS_TSPATTRIB_KEYINFO_AUTHDATAUSAGE:
345 if ((result = obj_rsakey_get_authdata_usage(hObject, pulAttrib)))
346 return result;
347 break;
348 case TSS_TSPATTRIB_KEYINFO_ALGORITHM:
349 if ((result = obj_rsakey_get_alg(hObject, pulAttrib)))
350 return result;
351 break;
352 case TSS_TSPATTRIB_KEYINFO_ENCSCHEME:
353 if ((result = obj_rsakey_get_es(hObject, pulAttrib)))
354 return result;
355 break;
356 case TSS_TSPATTRIB_KEYINFO_SIGSCHEME:
357 if ((result = obj_rsakey_get_ss(hObject, pulAttrib)))
358 return result;
359 break;
360 case TSS_TSPATTRIB_KEYINFO_KEYFLAGS:
361 if ((result = obj_rsakey_get_flags(hObject, pulAttrib)))
362 return result;
363 break;
364 case TSS_TSPATTRIB_KEYINFO_SIZE:
365 if ((result = obj_rsakey_get_size(hObject, pulAttrib)))
366 return result;
367 break;
368 #ifdef TSS_BUILD_CMK
369 case TSS_TSPATTRIB_KEYINFO_CMK:
370 *pulAttrib = obj_rsakey_is_cmk(hObject);
371 break;
372 #endif
373 default:
374 return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
375 }
376 } else if (attribFlag == TSS_TSPATTRIB_RSAKEY_INFO) {
377 if (subFlag == TSS_TSPATTRIB_KEYINFO_RSA_KEYSIZE) {
378 if ((result = obj_rsakey_get_size(hObject, pulAttrib)))
379 return result;
380 } else if (subFlag == TSS_TSPATTRIB_KEYINFO_RSA_PRIMES) {
381 if ((result = obj_rsakey_get_num_primes(hObject, pulAttrib)))
382 return result;
383 } else {
384 return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
385 }
386 } else if (attribFlag == TSS_TSPATTRIB_KEY_PCR_LONG) {
387 if (subFlag == TSS_TSPATTRIB_KEYPCRLONG_LOCALITY_ATCREATION ||
388 subFlag == TSS_TSPATTRIB_KEYPCRLONG_LOCALITY_ATRELEASE) {
389 result = obj_rsakey_get_pcr_locality(hObject, subFlag, pulAttrib);
390 } else
391 return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
392 } else
393 return TSPERR(TSS_E_INVALID_ATTRIB_FLAG);
394 #endif
395 #ifdef TSS_BUILD_NV
396 } else if (obj_is_nvstore(hObject)) {
397 switch (attribFlag) {
398 case TSS_TSPATTRIB_NV_INDEX:
399 if ((result = obj_nvstore_get_index(hObject, pulAttrib)))
400 return result;
401 break;
402 case TSS_TSPATTRIB_NV_DATASIZE:
403 if ((result = obj_nvstore_get_datasize(hObject, pulAttrib)))
404 return result;
405 break;
406 case TSS_TSPATTRIB_NV_PERMISSIONS:
407 if ((result = obj_nvstore_get_permission(hObject, pulAttrib)))
408 return result;
409 break;
410 case TSS_TSPATTRIB_NV_STATE:
411 switch (subFlag) {
412 case TSS_TSPATTRIB_NVSTATE_READSTCLEAR:
413 if ((result =
414 obj_nvstore_get_state_readstclear(hObject,
415 pulAttrib)))
416 return result;
417 break;
418 case TSS_TSPATTRIB_NVSTATE_WRITEDEFINE:
419 if ((result =
420 obj_nvstore_get_state_writedefine(hObject,
421 pulAttrib)))
422 return result;
423 break;
424 case TSS_TSPATTRIB_NVSTATE_WRITESTCLEAR:
425 if ((result =
426 obj_nvstore_get_state_writestclear(hObject,
427 pulAttrib)))
428 return result;
429 break;
430 default:
431 return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
432 }
433 break;
434 case TSS_TSPATTRIB_NV_PCR:
435 switch (subFlag) {
436 case TSS_TSPATTRIB_NVPCR_READLOCALITYATRELEASE:
437 if ((result =
438 obj_nvstore_get_readlocalityatrelease(hObject,
439 pulAttrib)))
440 return result;
441 break;
442 case TSS_TSPATTRIB_NVPCR_WRITELOCALITYATRELEASE:
443 if ((result =
444 obj_nvstore_get_writelocalityatrelease(hObject,
445 pulAttrib)))
446 return result;
447 break;
448 default:
449 return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
450 }
451 break;
452 case TSS_TSPATTRIB_KEYCONTROL_OWNEREVICT:
453 if ((result = obj_rsakey_get_ownerevict(hObject, pulAttrib)))
454 return result;
455 break;
456 default:
457 return TSPERR(TSS_E_INVALID_ATTRIB_FLAG);
458 }
459 #endif
460 } else if (obj_is_policy(hObject)) {
461 switch (attribFlag) {
462 case TSS_TSPATTRIB_POLICY_CALLBACK_HMAC:
463 case TSS_TSPATTRIB_POLICY_CALLBACK_XOR_ENC:
464 case TSS_TSPATTRIB_POLICY_CALLBACK_TAKEOWNERSHIP:
465 case TSS_TSPATTRIB_POLICY_CALLBACK_CHANGEAUTHASYM:
466 if ((result = obj_policy_get_cb11(hObject, attribFlag, pulAttrib)))
467 return result;
468 break;
469 case TSS_TSPATTRIB_POLICY_SECRET_LIFETIME:
470 if ((result = obj_policy_get_lifetime(hObject, &attrib)))
471 return result;
472
473 if (subFlag == TSS_TSPATTRIB_POLICYSECRET_LIFETIME_ALWAYS) {
474 if (attrib == TSS_TSPATTRIB_POLICYSECRET_LIFETIME_ALWAYS)
475 *pulAttrib = TRUE;
476 else
477 *pulAttrib = FALSE;
478 } else if (subFlag == TSS_TSPATTRIB_POLICYSECRET_LIFETIME_COUNTER) {
479 if (attrib != TSS_TSPATTRIB_POLICYSECRET_LIFETIME_COUNTER)
480 return TSPERR(TSS_E_BAD_PARAMETER);
481 if ((result = obj_policy_get_counter(hObject, pulAttrib)))
482 return result;
483 } else if (subFlag == TSS_TSPATTRIB_POLICYSECRET_LIFETIME_TIMER) {
484 if ((result =
485 obj_policy_get_secs_until_expired(hObject, pulAttrib)))
486 return result;
487 } else
488 return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
489 break;
490 case TSS_TSPATTRIB_SECRET_HASH_MODE:
491 if (subFlag == TSS_TSPATTRIB_SECRET_HASH_MODE_POPUP)
492 result = obj_policy_get_hash_mode(hObject, pulAttrib);
493 else
494 return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
495 break;
496 #ifdef TSS_BUILD_DELEGATION
497 case TSS_TSPATTRIB_POLICY_DELEGATION_INFO:
498 switch (subFlag) {
499 case TSS_TSPATTRIB_POLDEL_TYPE:
500 result = obj_policy_get_delegation_type(hObject,
501 pulAttrib);
502 break;
503 case TSS_TSPATTRIB_POLDEL_INDEX:
504 result = obj_policy_get_delegation_index(hObject,
505 pulAttrib);
506 break;
507 case TSS_TSPATTRIB_POLDEL_PER1:
508 result = obj_policy_get_delegation_per1(hObject,
509 pulAttrib);
510 break;
511 case TSS_TSPATTRIB_POLDEL_PER2:
512 result = obj_policy_get_delegation_per2(hObject,
513 pulAttrib);
514 break;
515 case TSS_TSPATTRIB_POLDEL_LABEL:
516 result = obj_policy_get_delegation_label(hObject,
517 (BYTE *)pulAttrib);
518 break;
519 case TSS_TSPATTRIB_POLDEL_FAMILYID:
520 result = obj_policy_get_delegation_familyid(hObject,
521 pulAttrib);
522 break;
523 case TSS_TSPATTRIB_POLDEL_VERCOUNT:
524 result = obj_policy_get_delegation_vercount(hObject,
525 pulAttrib);
526 break;
527 default:
528 result = TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
529 }
530 break;
531 case TSS_TSPATTRIB_POLICY_DELEGATION_PCR:
532 switch (subFlag) {
533 case TSS_TSPATTRIB_POLDELPCR_LOCALITY:
534 result = obj_policy_get_delegation_pcr_locality(hObject,
535 pulAttrib);
536 break;
537 default:
538 result = TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
539 }
540 break;
541 #endif
542 default:
543 return TSPERR(TSS_E_INVALID_ATTRIB_FLAG);
544 break;
545 }
546 } else if (obj_is_context(hObject)) {
547 switch (attribFlag) {
548 case TSS_TSPATTRIB_CONTEXT_SILENT_MODE:
549 if ((result = obj_context_get_mode(hObject, pulAttrib)))
550 return result;
551 break;
552 case TSS_TSPATTRIB_SECRET_HASH_MODE:
553 if (subFlag == TSS_TSPATTRIB_SECRET_HASH_MODE_POPUP)
554 result = obj_context_get_hash_mode(hObject, pulAttrib);
555 else
556 return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
557 break;
558 #ifdef TSS_BUILD_TRANSPORT
559 case TSS_TSPATTRIB_CONTEXT_TRANSPORT:
560 if (subFlag == TSS_TSPATTRIB_DISABLE_TRANSPORT ||
561 subFlag == TSS_TSPATTRIB_ENABLE_TRANSPORT) {
562 result = obj_context_transport_get_control(hObject, subFlag,
563 pulAttrib);
564 } else if (
565 subFlag == TSS_TSPATTRIB_TRANSPORT_NO_DEFAULT_ENCRYPTION ||
566 subFlag == TSS_TSPATTRIB_TRANSPORT_DEFAULT_ENCRYPTION ||
567 subFlag == TSS_TSPATTRIB_TRANSPORT_AUTHENTIC_CHANNEL ||
568 subFlag == TSS_TSPATTRIB_TRANSPORT_EXCLUSIVE ||
569 subFlag == TSS_TSPATTRIB_TRANSPORT_STATIC_AUTH) {
570 result = obj_context_transport_get_mode(hObject, subFlag,
571 pulAttrib);
572 } else
573 return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
574 break;
575 #endif
576 default:
577 return TSPERR(TSS_E_INVALID_ATTRIB_FLAG);
578 break;
579 }
580 } else if (obj_is_tpm(hObject)) {
581 switch (attribFlag) {
582 case TSS_TSPATTRIB_TPM_CALLBACK_COLLATEIDENTITY:
583 case TSS_TSPATTRIB_TPM_CALLBACK_ACTIVATEIDENTITY:
584 if ((result = obj_tpm_get_cb11(hObject, attribFlag, pulAttrib)))
585 return result;
586 break;
587 default:
588 result = TSPERR(TSS_E_INVALID_ATTRIB_FLAG);
589 break;
590 }
591 } else if (obj_is_encdata(hObject)) {
592 #ifdef TSS_BUILD_SEALX
593 if (attribFlag == TSS_TSPATTRIB_ENCDATA_SEAL) {
594 if (subFlag == TSS_TSPATTRIB_ENCDATASEAL_PROTECT_MODE)
595 result = obj_encdata_get_seal_protect_mode(hObject, pulAttrib);
596 else
597 return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
598 } else if (attribFlag == TSS_TSPATTRIB_ENCDATA_PCR_LONG) {
599 if (subFlag == TSS_TSPATTRIB_ENCDATAPCRLONG_LOCALITY_ATCREATION ||
600 subFlag == TSS_TSPATTRIB_ENCDATAPCRLONG_LOCALITY_ATRELEASE) {
601 result = obj_encdata_get_pcr_locality(hObject, subFlag, pulAttrib);
602 } else
603 return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
604 } else
605 return TSPERR(TSS_E_INVALID_ATTRIB_FLAG);
606 #endif
607 #ifdef TSS_BUILD_DELEGATION
608 } else if (obj_is_delfamily(hObject)) {
609 switch (attribFlag) {
610 case TSS_TSPATTRIB_DELFAMILY_STATE:
611 switch (subFlag) {
612 case TSS_TSPATTRIB_DELFAMILYSTATE_LOCKED:
613 result = obj_delfamily_get_locked(hObject, (TSS_BOOL *)pulAttrib);
614 break;
615 case TSS_TSPATTRIB_DELFAMILYSTATE_ENABLED:
616 result = obj_delfamily_get_enabled(hObject, (TSS_BOOL *)pulAttrib);
617 break;
618 default:
619 return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
620 }
621 break;
622 case TSS_TSPATTRIB_DELFAMILY_INFO:
623 switch (subFlag) {
624 case TSS_TSPATTRIB_DELFAMILYINFO_LABEL:
625 result = obj_delfamily_get_label(hObject, (BYTE *)pulAttrib);
626 break;
627 case TSS_TSPATTRIB_DELFAMILYINFO_VERCOUNT:
628 result = obj_delfamily_get_vercount(hObject, pulAttrib);
629 break;
630 case TSS_TSPATTRIB_DELFAMILYINFO_FAMILYID:
631 result = obj_delfamily_get_familyid(hObject, pulAttrib);
632 break;
633 default:
634 return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
635 }
636 break;
637 default:
638 return TSPERR(TSS_E_INVALID_ATTRIB_FLAG);
639 }
640 #endif
641 } else {
642 if (obj_is_hash(hObject) || obj_is_pcrs(hObject))
643 result = TSPERR(TSS_E_BAD_PARAMETER);
644 else
645 result = TSPERR(TSS_E_INVALID_HANDLE);
646 }
647
648 return result;
649 }
650
651 TSS_RESULT
Tspi_SetAttribData(TSS_HOBJECT hObject,TSS_FLAG attribFlag,TSS_FLAG subFlag,UINT32 ulAttribDataSize,BYTE * rgbAttribData)652 Tspi_SetAttribData(TSS_HOBJECT hObject, /* in */
653 TSS_FLAG attribFlag, /* in */
654 TSS_FLAG subFlag, /* in */
655 UINT32 ulAttribDataSize, /* in */
656 BYTE * rgbAttribData) /* in */
657 {
658 TSS_RESULT result;
659 BYTE *string = NULL;
660
661 if (obj_is_rsakey(hObject)) {
662 #ifdef TSS_BUILD_RSAKEY_LIST
663 if (attribFlag == TSS_TSPATTRIB_KEY_BLOB) {
664 if (subFlag == TSS_TSPATTRIB_KEYBLOB_BLOB) {
665 /* A TPM_KEY(12) structure, in blob form */
666 result = obj_rsakey_set_tcpakey(hObject, ulAttribDataSize,
667 rgbAttribData);
668 if (result == TSS_SUCCESS)
669 result = obj_rsakey_set_tcs_handle(hObject, 0);
670 } else if (subFlag == TSS_TSPATTRIB_KEYBLOB_PUBLIC_KEY) {
671 /* A TCPA_PUBKEY structure, in blob form */
672 result = obj_rsakey_set_pubkey(hObject, FALSE, rgbAttribData);
673 } else if (subFlag == TSS_TSPATTRIB_KEYBLOB_PRIVATE_KEY) {
674 /* A blob, either encrypted or unencrypted */
675 result = obj_rsakey_set_privkey(hObject, FALSE, ulAttribDataSize,
676 rgbAttribData);
677 } else {
678 return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
679 }
680 } else if (attribFlag == TSS_TSPATTRIB_RSAKEY_INFO) {
681 if (subFlag == TSS_TSPATTRIB_KEYINFO_RSA_EXPONENT) {
682 result = obj_rsakey_set_exponent(hObject, ulAttribDataSize,
683 rgbAttribData);
684 } else if (subFlag == TSS_TSPATTRIB_KEYINFO_RSA_MODULUS) {
685 result = obj_rsakey_set_modulus(hObject, ulAttribDataSize,
686 rgbAttribData);
687 } else {
688 return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
689 }
690 #ifdef TSS_BUILD_CMK
691 } else if (attribFlag == TSS_TSPATTRIB_KEY_CMKINFO) {
692 if (subFlag == TSS_TSPATTRIB_KEYINFO_CMK_MA_APPROVAL) {
693 result = obj_rsakey_set_msa_approval(hObject, ulAttribDataSize,
694 rgbAttribData);
695 } else if (subFlag == TSS_TSPATTRIB_KEYINFO_CMK_MA_DIGEST) {
696 result = obj_rsakey_set_msa_digest(hObject, ulAttribDataSize,
697 rgbAttribData);
698 } else {
699 return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
700 }
701 #endif
702 } else {
703 return TSPERR(TSS_E_INVALID_ATTRIB_FLAG);
704 }
705 #endif
706 } else if (obj_is_encdata(hObject)) {
707 #ifdef TSS_BUILD_ENCDATA_LIST
708 if (attribFlag != TSS_TSPATTRIB_ENCDATA_BLOB)
709 return TSPERR(TSS_E_INVALID_ATTRIB_FLAG);
710 if (subFlag != TSS_TSPATTRIB_ENCDATABLOB_BLOB)
711 return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
712
713 result = obj_encdata_set_data(hObject, ulAttribDataSize, rgbAttribData);
714 #endif
715 } else if (obj_is_policy(hObject)) {
716 switch (attribFlag) {
717 case TSS_TSPATTRIB_POLICY_POPUPSTRING:
718 if ((string = Trspi_UNICODE_To_Native(rgbAttribData,
719 NULL)) == NULL)
720 return TSPERR(TSS_E_INTERNAL_ERROR);
721
722 result = obj_policy_set_string(hObject,
723 ulAttribDataSize,
724 string);
725 break;
726 case TSS_TSPATTRIB_POLICY_CALLBACK_HMAC:
727 case TSS_TSPATTRIB_POLICY_CALLBACK_XOR_ENC:
728 case TSS_TSPATTRIB_POLICY_CALLBACK_TAKEOWNERSHIP:
729 case TSS_TSPATTRIB_POLICY_CALLBACK_CHANGEAUTHASYM:
730 #ifdef TSS_BUILD_SEALX
731 case TSS_TSPATTRIB_POLICY_CALLBACK_SEALX_MASK:
732 #endif
733 result = obj_policy_set_cb12(hObject, attribFlag,
734 rgbAttribData);
735 break;
736 #ifdef TSS_BUILD_DELEGATION
737 case TSS_TSPATTRIB_POLICY_DELEGATION_INFO:
738 switch (subFlag) {
739 case TSS_TSPATTRIB_POLDEL_OWNERBLOB:
740 result = obj_policy_set_delegation_blob(hObject,
741 TSS_DELEGATIONTYPE_OWNER,
742 ulAttribDataSize, rgbAttribData);
743 break;
744 case TSS_TSPATTRIB_POLDEL_KEYBLOB:
745 result = obj_policy_set_delegation_blob(hObject,
746 TSS_DELEGATIONTYPE_KEY,
747 ulAttribDataSize, rgbAttribData);
748 break;
749 default:
750 result = TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
751 }
752 break;
753 #endif
754 default:
755 return TSPERR(TSS_E_INVALID_ATTRIB_FLAG);
756 break;
757 }
758 } else if (obj_is_hash(hObject)) {
759 #ifdef TSS_BUILD_HASH_LIST
760 if (attribFlag != TSS_TSPATTRIB_HASH_IDENTIFIER)
761 return TSPERR(TSS_E_INVALID_ATTRIB_FLAG);
762
763 if (subFlag != 0)
764 return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
765
766 result = obj_hash_set_value(hObject, ulAttribDataSize, rgbAttribData);
767 #endif
768 } else if (obj_is_tpm(hObject)) {
769 switch (attribFlag) {
770 case TSS_TSPATTRIB_TPM_CALLBACK_COLLATEIDENTITY:
771 case TSS_TSPATTRIB_TPM_CALLBACK_ACTIVATEIDENTITY:
772 result = obj_tpm_set_cb12(hObject, attribFlag,
773 rgbAttribData);
774 break;
775 case TSS_TSPATTRIB_TPM_CREDENTIAL:
776 if (subFlag == TSS_TPMATTRIB_EKCERT ||
777 subFlag == TSS_TPMATTRIB_TPM_CC ||
778 subFlag == TSS_TPMATTRIB_PLATFORMCERT ||
779 subFlag == TSS_TPMATTRIB_PLATFORM_CC) {
780 result = obj_tpm_set_cred(hObject, subFlag,
781 ulAttribDataSize, rgbAttribData);
782 } else {
783 return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
784 }
785 break;
786 default:
787 return TSPERR(TSS_E_INVALID_ATTRIB_FLAG);
788 break;
789 }
790 } else if (obj_is_migdata(hObject)) {
791 #ifdef TSS_BUILD_CMK
792 switch (attribFlag) {
793 case TSS_MIGATTRIB_MIGRATIONBLOB:
794 switch (subFlag) {
795 case TSS_MIGATTRIB_MIG_MSALIST_PUBKEY_BLOB:
796 case TSS_MIGATTRIB_MIG_AUTHORITY_PUBKEY_BLOB:
797 case TSS_MIGATTRIB_MIG_DESTINATION_PUBKEY_BLOB:
798 case TSS_MIGATTRIB_MIG_SOURCE_PUBKEY_BLOB:
799 result = obj_migdata_set_migrationblob(hObject, subFlag,
800 ulAttribDataSize, rgbAttribData);
801 break;
802 default:
803 return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
804 }
805 break;
806 case TSS_MIGATTRIB_MIGRATIONTICKET:
807 if (subFlag != 0)
808 return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
809 result = obj_migdata_set_ticket_blob(hObject, ulAttribDataSize, rgbAttribData);
810 break;
811 case TSS_MIGATTRIB_AUTHORITY_DATA:
812 switch (subFlag) {
813 case TSS_MIGATTRIB_AUTHORITY_DIGEST:
814 case TSS_MIGATTRIB_AUTHORITY_APPROVAL_HMAC:
815 case TSS_MIGATTRIB_AUTHORITY_MSALIST:
816 result = obj_migdata_set_authoritydata(hObject, subFlag,
817 ulAttribDataSize, rgbAttribData);
818 break;
819 default:
820 return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
821 }
822 break;
823 case TSS_MIGATTRIB_MIG_AUTH_DATA:
824 switch (subFlag) {
825 case TSS_MIGATTRIB_MIG_AUTH_AUTHORITY_DIGEST:
826 case TSS_MIGATTRIB_MIG_AUTH_DESTINATION_DIGEST:
827 case TSS_MIGATTRIB_MIG_AUTH_SOURCE_DIGEST:
828 result = obj_migdata_set_migauthdata(hObject, subFlag,
829 ulAttribDataSize, rgbAttribData);
830 break;
831 default:
832 return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
833 }
834 break;
835 case TSS_MIGATTRIB_TICKET_DATA:
836 switch (subFlag) {
837 case TSS_MIGATTRIB_TICKET_SIG_DIGEST:
838 case TSS_MIGATTRIB_TICKET_SIG_VALUE:
839 case TSS_MIGATTRIB_TICKET_SIG_TICKET:
840 case TSS_MIGATTRIB_TICKET_RESTRICT_TICKET:
841 result = obj_migdata_set_ticketdata(hObject, subFlag,
842 ulAttribDataSize, rgbAttribData);
843 break;
844 default:
845 return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
846 }
847 break;
848 default:
849 return TSPERR(TSS_E_INVALID_ATTRIB_FLAG);
850 break;
851 }
852 #endif
853 } else {
854 if (obj_is_pcrs(hObject) || obj_is_context(hObject))
855 result = TSPERR(TSS_E_BAD_PARAMETER);
856 #ifdef TSS_BUILD_NV
857 else if (obj_is_nvstore(hObject))
858 result = TSPERR(TSS_E_BAD_PARAMETER);
859 #endif
860 else
861 result = TSPERR(TSS_E_INVALID_HANDLE);
862 }
863
864 return result;
865 }
866
867 TSS_RESULT
Tspi_GetAttribData(TSS_HOBJECT hObject,TSS_FLAG attribFlag,TSS_FLAG subFlag,UINT32 * pulAttribDataSize,BYTE ** prgbAttribData)868 Tspi_GetAttribData(TSS_HOBJECT hObject, /* in */
869 TSS_FLAG attribFlag, /* in */
870 TSS_FLAG subFlag, /* in */
871 UINT32 * pulAttribDataSize, /* out */
872 BYTE ** prgbAttribData) /* out */
873 {
874 TSS_RESULT result;
875
876 if (pulAttribDataSize == NULL || prgbAttribData == NULL)
877 return TSPERR(TSS_E_BAD_PARAMETER);
878
879 if (obj_is_rsakey(hObject)) {
880 #ifdef TSS_BUILD_RSAKEY_LIST
881 if (attribFlag == TSS_TSPATTRIB_KEY_BLOB) {
882 if (subFlag == TSS_TSPATTRIB_KEYBLOB_BLOB) {
883 /* A TPM_KEY(12) structure, in blob form */
884 result = obj_rsakey_get_blob(hObject, pulAttribDataSize,
885 prgbAttribData);
886 } else if (subFlag == TSS_TSPATTRIB_KEYBLOB_PRIVATE_KEY) {
887 /* A blob, either encrypted or unencrypted */
888 result = obj_rsakey_get_priv_blob(hObject, pulAttribDataSize,
889 prgbAttribData);
890 } else if (subFlag == TSS_TSPATTRIB_KEYBLOB_PUBLIC_KEY) {
891 /* A TCPA_PUBKEY structure, in blob form */
892 result = obj_rsakey_get_pub_blob(hObject, pulAttribDataSize,
893 prgbAttribData);
894 } else {
895 return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
896 }
897 } else if (attribFlag == TSS_TSPATTRIB_KEY_INFO) {
898 if (subFlag != TSS_TSPATTRIB_KEYINFO_VERSION)
899 return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
900
901 result = obj_rsakey_get_version(hObject, pulAttribDataSize,
902 prgbAttribData);
903 } else if (attribFlag == TSS_TSPATTRIB_RSAKEY_INFO) {
904 if (subFlag == TSS_TSPATTRIB_KEYINFO_RSA_EXPONENT) {
905 result = obj_rsakey_get_exponent(hObject, pulAttribDataSize,
906 prgbAttribData);
907 } else if (subFlag == TSS_TSPATTRIB_KEYINFO_RSA_MODULUS) {
908 result = obj_rsakey_get_modulus(hObject, pulAttribDataSize,
909 prgbAttribData);
910 } else
911 return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
912 } else if (attribFlag == TSS_TSPATTRIB_KEY_UUID) {
913 if (subFlag)
914 return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
915
916 result = obj_rsakey_get_uuid(hObject, pulAttribDataSize, prgbAttribData);
917 } else if (attribFlag == TSS_TSPATTRIB_KEY_PCR) {
918 if (subFlag == TSS_TSPATTRIB_KEYPCR_DIGEST_ATCREATION ||
919 subFlag == TSS_TSPATTRIB_KEYPCR_DIGEST_ATRELEASE) {
920 result = obj_rsakey_get_pcr_digest(hObject, TSS_PCRS_STRUCT_INFO,
921 subFlag, pulAttribDataSize,
922 prgbAttribData);
923 } else if (subFlag == TSS_TSPATTRIB_KEYPCR_SELECTION) {
924 result = obj_rsakey_get_pcr_selection(hObject, TSS_PCRS_STRUCT_INFO,
925 subFlag, pulAttribDataSize,
926 prgbAttribData);
927 } else
928 return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
929 } else if (attribFlag == TSS_TSPATTRIB_KEY_PCR_LONG) {
930 if (subFlag == TSS_TSPATTRIB_KEYPCRLONG_DIGEST_ATCREATION ||
931 subFlag == TSS_TSPATTRIB_KEYPCRLONG_DIGEST_ATRELEASE) {
932 result = obj_rsakey_get_pcr_digest(hObject,
933 TSS_PCRS_STRUCT_INFO_LONG,
934 subFlag, pulAttribDataSize,
935 prgbAttribData);
936 } else if (subFlag == TSS_TSPATTRIB_KEYPCRLONG_CREATION_SELECTION ||
937 subFlag == TSS_TSPATTRIB_KEYPCRLONG_RELEASE_SELECTION) {
938 result = obj_rsakey_get_pcr_selection(hObject,
939 TSS_PCRS_STRUCT_INFO_LONG,
940 subFlag, pulAttribDataSize,
941 prgbAttribData);
942 } else
943 return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
944 #ifdef TSS_BUILD_CMK
945 } else if (attribFlag == TSS_TSPATTRIB_KEY_CMKINFO) {
946 if (subFlag == TSS_TSPATTRIB_KEYINFO_CMK_MA_APPROVAL) {
947 result = obj_rsakey_get_msa_approval(hObject, pulAttribDataSize,
948 prgbAttribData);
949 } else if (subFlag == TSS_TSPATTRIB_KEYINFO_CMK_MA_DIGEST) {
950 result = obj_rsakey_get_msa_digest(hObject, pulAttribDataSize,
951 prgbAttribData);
952 } else {
953 return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
954 }
955 #endif
956 } else
957 return TSPERR(TSS_E_INVALID_ATTRIB_FLAG);
958 #endif
959 #ifdef TSS_BUILD_NV
960 } else if (obj_is_nvstore(hObject)) {
961 if (attribFlag == TSS_TSPATTRIB_NV_PCR) {
962 switch (subFlag) {
963 case TSS_TSPATTRIB_NVPCR_READDIGESTATRELEASE:
964 if ((result = obj_nvstore_get_readdigestatrelease(hObject,
965 pulAttribDataSize,
966 prgbAttribData)))
967 return result;
968 break;
969 case TSS_TSPATTRIB_NVPCR_READPCRSELECTION:
970 if ((result = obj_nvstore_get_readpcrselection(
971 hObject,
972 pulAttribDataSize,
973 prgbAttribData)))
974 return result;
975 break;
976 case TSS_TSPATTRIB_NVPCR_WRITEDIGESTATRELEASE:
977 if ((result = obj_nvstore_get_writedigestatrelease(hObject,
978 pulAttribDataSize,
979 prgbAttribData)))
980 return result;
981 break;
982 case TSS_TSPATTRIB_NVPCR_WRITEPCRSELECTION:
983 if ((result = obj_nvstore_get_writepcrselection(hObject,
984 pulAttribDataSize,
985 prgbAttribData)))
986 return result;
987 break;
988 default:
989 return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
990 }
991 } else
992 return TSPERR(TSS_E_INVALID_ATTRIB_FLAG);
993 #endif
994 } else if (obj_is_encdata(hObject)) {
995 #ifdef TSS_BUILD_ENCDATA_LIST
996 if (attribFlag == TSS_TSPATTRIB_ENCDATA_BLOB) {
997 if (subFlag != TSS_TSPATTRIB_ENCDATABLOB_BLOB)
998 return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
999
1000 result = obj_encdata_get_data(hObject, pulAttribDataSize, prgbAttribData);
1001 } else if (attribFlag == TSS_TSPATTRIB_ENCDATA_PCR) {
1002 if (subFlag == TSS_TSPATTRIB_ENCDATAPCR_DIGEST_ATCREATION ||
1003 subFlag == TSS_TSPATTRIB_ENCDATAPCR_DIGEST_RELEASE) {
1004 result = obj_encdata_get_pcr_digest(hObject, TSS_PCRS_STRUCT_INFO,
1005 subFlag, pulAttribDataSize,
1006 prgbAttribData);
1007 } else if (subFlag == TSS_TSPATTRIB_ENCDATAPCR_SELECTION) {
1008 result = obj_encdata_get_pcr_selection(hObject,
1009 TSS_PCRS_STRUCT_INFO,
1010 subFlag, pulAttribDataSize,
1011 prgbAttribData);
1012 } else {
1013 return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
1014 }
1015 } else if (attribFlag == TSS_TSPATTRIB_ENCDATA_PCR_LONG) {
1016 if (subFlag == TSS_TSPATTRIB_ENCDATAPCRLONG_CREATION_SELECTION ||
1017 subFlag == TSS_TSPATTRIB_ENCDATAPCRLONG_RELEASE_SELECTION) {
1018 result = obj_encdata_get_pcr_selection(hObject,
1019 TSS_PCRS_STRUCT_INFO_LONG,
1020 subFlag, pulAttribDataSize,
1021 prgbAttribData);
1022 } else if (subFlag == TSS_TSPATTRIB_ENCDATAPCRLONG_DIGEST_ATCREATION ||
1023 subFlag == TSS_TSPATTRIB_ENCDATAPCRLONG_DIGEST_ATRELEASE) {
1024 result = obj_encdata_get_pcr_digest(hObject,
1025 TSS_PCRS_STRUCT_INFO_LONG,
1026 subFlag, pulAttribDataSize,
1027 prgbAttribData);
1028 } else {
1029 return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
1030 }
1031 } else {
1032 return TSPERR(TSS_E_INVALID_ATTRIB_FLAG);
1033 }
1034 #endif
1035 } else if (obj_is_context(hObject)) {
1036 if (attribFlag != TSS_TSPATTRIB_CONTEXT_MACHINE_NAME)
1037 return TSPERR(TSS_E_INVALID_ATTRIB_FLAG);
1038
1039 if ((result = obj_context_get_machine_name_attrib(hObject,
1040 pulAttribDataSize,
1041 prgbAttribData)))
1042 return result;
1043 } else if (obj_is_policy(hObject)) {
1044 switch (attribFlag) {
1045 case TSS_TSPATTRIB_POLICY_CALLBACK_HMAC:
1046 case TSS_TSPATTRIB_POLICY_CALLBACK_XOR_ENC:
1047 case TSS_TSPATTRIB_POLICY_CALLBACK_TAKEOWNERSHIP:
1048 case TSS_TSPATTRIB_POLICY_CALLBACK_CHANGEAUTHASYM:
1049 #ifdef TSS_BUILD_SEALX
1050 case TSS_TSPATTRIB_POLICY_CALLBACK_SEALX_MASK:
1051 #endif
1052 result = obj_policy_get_cb12(hObject, attribFlag,
1053 pulAttribDataSize, prgbAttribData);
1054 break;
1055 case TSS_TSPATTRIB_POLICY_POPUPSTRING:
1056 if ((result = obj_policy_get_string(hObject, pulAttribDataSize,
1057 prgbAttribData)))
1058 return result;
1059 break;
1060 #ifdef TSS_BUILD_DELEGATION
1061 case TSS_TSPATTRIB_POLICY_DELEGATION_INFO:
1062 switch (subFlag) {
1063 case TSS_TSPATTRIB_POLDEL_OWNERBLOB:
1064 result = obj_policy_get_delegation_blob(hObject,
1065 TSS_DELEGATIONTYPE_OWNER,
1066 pulAttribDataSize, prgbAttribData);
1067 break;
1068 case TSS_TSPATTRIB_POLDEL_KEYBLOB:
1069 result = obj_policy_get_delegation_blob(hObject,
1070 TSS_DELEGATIONTYPE_KEY,
1071 pulAttribDataSize, prgbAttribData);
1072 break;
1073 default:
1074 return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
1075 }
1076 break;
1077 case TSS_TSPATTRIB_POLICY_DELEGATION_PCR:
1078 switch (subFlag) {
1079 case TSS_TSPATTRIB_POLDELPCR_DIGESTATRELEASE:
1080 result = obj_policy_get_delegation_pcr_digest(hObject,
1081 pulAttribDataSize, prgbAttribData);
1082 break;
1083 case TSS_TSPATTRIB_POLDELPCR_SELECTION:
1084 result = obj_policy_get_delegation_pcr_selection(hObject,
1085 pulAttribDataSize, prgbAttribData);
1086 break;
1087 default:
1088 return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
1089 }
1090 break;
1091 #endif
1092 default:
1093 result = TSPERR(TSS_E_INVALID_ATTRIB_FLAG);
1094 break;
1095 }
1096 } else if (obj_is_tpm(hObject)) {
1097 switch (attribFlag) {
1098 case TSS_TSPATTRIB_TPM_CALLBACK_COLLATEIDENTITY:
1099 case TSS_TSPATTRIB_TPM_CALLBACK_ACTIVATEIDENTITY:
1100 result = obj_tpm_get_cb12(hObject, attribFlag,
1101 pulAttribDataSize, prgbAttribData);
1102 break;
1103 default:
1104 return TSPERR(TSS_E_INVALID_ATTRIB_FLAG);
1105 break;
1106 }
1107 } else if (obj_is_migdata(hObject)) {
1108 #ifdef TSS_BUILD_CMK
1109 switch (attribFlag) {
1110 case TSS_MIGATTRIB_MIGRATIONBLOB:
1111 switch (subFlag) {
1112 case TSS_MIGATTRIB_MIG_XOR_BLOB:
1113 result = obj_migdata_get_migrationblob(hObject, subFlag,
1114 pulAttribDataSize, prgbAttribData);
1115 break;
1116 default:
1117 return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
1118 }
1119 break;
1120 case TSS_MIGATTRIB_AUTHORITY_DATA:
1121 switch (subFlag) {
1122 case TSS_MIGATTRIB_AUTHORITY_DIGEST:
1123 case TSS_MIGATTRIB_AUTHORITY_APPROVAL_HMAC:
1124 case TSS_MIGATTRIB_AUTHORITY_MSALIST:
1125 result = obj_migdata_get_authoritydata(hObject, subFlag,
1126 pulAttribDataSize, prgbAttribData);
1127 break;
1128 default:
1129 return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
1130 }
1131 break;
1132 case TSS_MIGATTRIB_MIG_AUTH_DATA:
1133 switch (subFlag) {
1134 case TSS_MIGATTRIB_MIG_AUTH_AUTHORITY_DIGEST:
1135 case TSS_MIGATTRIB_MIG_AUTH_DESTINATION_DIGEST:
1136 case TSS_MIGATTRIB_MIG_AUTH_SOURCE_DIGEST:
1137 result = obj_migdata_get_migauthdata(hObject, subFlag,
1138 pulAttribDataSize, prgbAttribData);
1139 break;
1140 default:
1141 return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
1142 }
1143 break;
1144 case TSS_MIGATTRIB_TICKET_DATA:
1145 switch (subFlag) {
1146 case TSS_MIGATTRIB_TICKET_SIG_TICKET:
1147 result = obj_migdata_get_ticketdata(hObject, subFlag,
1148 pulAttribDataSize, prgbAttribData);
1149 break;
1150 default:
1151 return TSPERR(TSS_E_INVALID_ATTRIB_SUBFLAG);
1152 }
1153 break;
1154 default:
1155 return TSPERR(TSS_E_INVALID_ATTRIB_FLAG);
1156 break;
1157 }
1158 #endif
1159 } else {
1160 if (obj_is_hash(hObject) || obj_is_pcrs(hObject))
1161 result = TSPERR(TSS_E_BAD_PARAMETER);
1162 else
1163 result = TSPERR(TSS_E_INVALID_HANDLE);
1164 }
1165
1166 return result;
1167 }
1168
1169