Home | History | Annotate | Line # | Download | only in tspi
      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
     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
    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
    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
    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