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 29TSS_RESULT 30Tspi_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 300TSS_RESULT 301Tspi_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 651TSS_RESULT 652Tspi_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 867TSS_RESULT 868Tspi_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