Home | History | Annotate | Line # | Download | only in rpc
      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 <syslog.h>
     14 #include <unistd.h>
     15 
     16 #include "trousers/tss.h"
     17 #include "trousers_types.h"
     18 #include "trousers_types.h"
     19 #include "spi_utils.h"
     20 #include "hosttable.h"
     21 #include "tsplog.h"
     22 #include "rpc_tcstp_tsp.h"
     23 #include "obj_context.h"
     24 
     25 
     26 TSS_RESULT
     27 RPC_Error(TSS_HCONTEXT tspContext, ...)
     28 {
     29 	LogDebugFn("Context: 0x%x", tspContext);
     30 	return TSPERR(TSS_E_INTERNAL_ERROR);
     31 }
     32 
     33 TSS_RESULT
     34 RPC_OpenContext(TSS_HCONTEXT tspContext, BYTE *hostname, int type)
     35 {
     36 	TSS_RESULT result;
     37 	TCS_CONTEXT_HANDLE tcsContext;
     38 	struct host_table_entry *entry;
     39 	UINT32 tpm_version;
     40 
     41 	/* __tspi_add_table_entry() will make sure an entry doesn't already exist for this tsp context */
     42 	if ((result = __tspi_add_table_entry(tspContext, hostname, type, &entry)))
     43 		return result;
     44 
     45 	switch (type) {
     46 		case CONNECTION_TYPE_TCP_PERSISTANT:
     47 			if ((result = RPC_OpenContext_TP(entry, &tpm_version, &tcsContext)))
     48 				remove_table_entry(tspContext);
     49 			else {
     50 				entry->tcsContext = tcsContext;
     51 				if (obj_context_set_tpm_version(tspContext, tpm_version)) {
     52 					remove_table_entry(tspContext);
     53 					result = TSPERR(TSS_E_INTERNAL_ERROR);
     54 				}
     55 			}
     56 			return result;
     57 		default:
     58 			break;
     59 	}
     60 
     61 	return TSPERR(TSS_E_INTERNAL_ERROR);
     62 }
     63 
     64 TSS_RESULT RPC_GetRegisteredKeyByPublicInfo(TSS_HCONTEXT tspContext,
     65 					    TCPA_ALGORITHM_ID algID, /* in */
     66 					    UINT32 ulPublicInfoLength, /* in */
     67 					    BYTE * rgbPublicInfo, /* in */
     68 					    UINT32 * keySize, BYTE ** keyBlob)
     69 {
     70 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
     71 	struct host_table_entry *entry = get_table_entry(tspContext);
     72 
     73 	if (entry == NULL)
     74 		return TSPERR(TSS_E_NO_CONNECTION);
     75 
     76 	switch (entry->type) {
     77 		case CONNECTION_TYPE_TCP_PERSISTANT:
     78 			result = RPC_GetRegisteredKeyByPublicInfo_TP(entry, algID,
     79 								     ulPublicInfoLength,
     80 								     rgbPublicInfo, keySize,
     81 								     keyBlob);
     82 			break;
     83 		default:
     84 			break;
     85 	}
     86 
     87 	put_table_entry(entry);
     88 
     89 	return result;
     90 }
     91 
     92 TSS_RESULT RPC_CloseContext(TSS_HCONTEXT tspContext)	/* in */
     93 {
     94 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
     95 	struct host_table_entry *entry = get_table_entry(tspContext);
     96 
     97 	if (entry == NULL)
     98 		return TSPERR(TSS_E_NO_CONNECTION);
     99 
    100 	switch (entry->type) {
    101 		case CONNECTION_TYPE_TCP_PERSISTANT:
    102 			if ((result = RPC_CloseContext_TP(entry)) == TSS_SUCCESS) {
    103 				close(entry->socket);
    104 				remove_table_entry(tspContext);
    105 			}
    106 			break;
    107 		default:
    108 			break;
    109 	}
    110 
    111 	if (result != TSS_SUCCESS)
    112 		put_table_entry(entry);
    113 
    114 	return result;
    115 }
    116 
    117 TSS_RESULT RPC_FreeMemory(TSS_HCONTEXT tspContext,	/* in */
    118 			  BYTE * pMemory)	/* in */
    119 {
    120 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
    121 	struct host_table_entry *entry = get_table_entry(tspContext);
    122 
    123 	if (entry == NULL)
    124 		return TSPERR(TSS_E_NO_CONNECTION);
    125 
    126 	switch (entry->type) {
    127 		case CONNECTION_TYPE_TCP_PERSISTANT:
    128 			result = RPC_FreeMemory_TP(entry, pMemory);
    129 			break;
    130 		default:
    131 			break;
    132 	}
    133 
    134 	put_table_entry(entry);
    135 
    136 	return result;
    137 }
    138 
    139 TSS_RESULT RPC_LogPcrEvent(TSS_HCONTEXT tspContext,	/* in */
    140 			   TSS_PCR_EVENT Event,	/* in */
    141 			   UINT32 * pNumber)	/* out */
    142 {
    143 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
    144 	struct host_table_entry *entry = get_table_entry(tspContext);
    145 
    146 	if (entry == NULL)
    147 		return TSPERR(TSS_E_NO_CONNECTION);
    148 
    149 	switch (entry->type) {
    150 		case CONNECTION_TYPE_TCP_PERSISTANT:
    151 			result = RPC_LogPcrEvent_TP(entry, Event, pNumber);
    152 			break;
    153 		default:
    154 			break;
    155 	}
    156 
    157 	put_table_entry(entry);
    158 
    159 	return result;
    160 }
    161 
    162 TSS_RESULT RPC_GetPcrEvent(TSS_HCONTEXT tspContext,	/* in */
    163 			   UINT32 PcrIndex,	/* in */
    164 			   UINT32 * pNumber,	/* in, out */
    165 			   TSS_PCR_EVENT ** ppEvent)	/* out */
    166 {
    167 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
    168 	struct host_table_entry *entry = get_table_entry(tspContext);
    169 
    170 	if (entry == NULL)
    171 		return TSPERR(TSS_E_NO_CONNECTION);
    172 
    173 	switch (entry->type) {
    174 		case CONNECTION_TYPE_TCP_PERSISTANT:
    175 		result =
    176 			RPC_GetPcrEvent_TP(entry, PcrIndex, pNumber, ppEvent);
    177 			break;
    178 		default:
    179 			break;
    180 	}
    181 
    182 	put_table_entry(entry);
    183 
    184 	return result;
    185 }
    186 
    187 TSS_RESULT RPC_GetPcrEventsByPcr(TSS_HCONTEXT tspContext,	/* in */
    188 				 UINT32 PcrIndex,	/* in */
    189 				 UINT32 FirstEvent,	/* in */
    190 				 UINT32 * pEventCount,	/* in,out */
    191 				 TSS_PCR_EVENT ** ppEvents)	/* out */
    192 {
    193 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
    194 	struct host_table_entry *entry = get_table_entry(tspContext);
    195 
    196 	if (entry == NULL)
    197 		return TSPERR(TSS_E_NO_CONNECTION);
    198 
    199 	switch (entry->type) {
    200 		case CONNECTION_TYPE_TCP_PERSISTANT:
    201 			result = RPC_GetPcrEventsByPcr_TP(entry, PcrIndex, FirstEvent,
    202 							  pEventCount, ppEvents);
    203 			break;
    204 		default:
    205 			break;
    206 	}
    207 
    208 	put_table_entry(entry);
    209 
    210 	return result;
    211 }
    212 
    213 TSS_RESULT RPC_GetPcrEventLog(TSS_HCONTEXT tspContext,	/* in */
    214 			      UINT32 * pEventCount,	/* out */
    215 			      TSS_PCR_EVENT ** ppEvents)	/* out */
    216 {
    217 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
    218 	struct host_table_entry *entry = get_table_entry(tspContext);
    219 
    220 	if (entry == NULL)
    221 		return TSPERR(TSS_E_NO_CONNECTION);
    222 
    223 	switch (entry->type) {
    224 		case CONNECTION_TYPE_TCP_PERSISTANT:
    225 			result = RPC_GetPcrEventLog_TP(entry, pEventCount, ppEvents);
    226 			break;
    227 		default:
    228 			break;
    229 	}
    230 
    231 	put_table_entry(entry);
    232 
    233 	return result;
    234 }
    235 
    236 TSS_RESULT RPC_RegisterKey(TSS_HCONTEXT tspContext,	/* in */
    237 			   TSS_UUID WrappingKeyUUID,	/* in */
    238 			   TSS_UUID KeyUUID,	/* in */
    239 			   UINT32 cKeySize,	/* in */
    240 			   BYTE * rgbKey,	/* in */
    241 			   UINT32 cVendorData,	/* in */
    242 			   BYTE * gbVendorData)	/* in */
    243 {
    244 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
    245 	struct host_table_entry *entry = get_table_entry(tspContext);
    246 
    247 	if (entry == NULL)
    248 		return TSPERR(TSS_E_NO_CONNECTION);
    249 
    250 	switch (entry->type) {
    251 		case CONNECTION_TYPE_TCP_PERSISTANT:
    252 			result = RPC_RegisterKey_TP(entry, WrappingKeyUUID, KeyUUID, cKeySize,
    253 						    rgbKey, cVendorData, gbVendorData);
    254 			break;
    255 		default:
    256 			break;
    257 	}
    258 
    259 	put_table_entry(entry);
    260 
    261 	return result;
    262 }
    263 
    264 TSS_RESULT RPC_UnregisterKey(TSS_HCONTEXT tspContext,	/* in */
    265 			     TSS_UUID KeyUUID)	/* in */
    266 {
    267 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
    268 	struct host_table_entry *entry = get_table_entry(tspContext);
    269 
    270 	if (entry == NULL)
    271 		return TSPERR(TSS_E_NO_CONNECTION);
    272 
    273 	switch (entry->type) {
    274 		case CONNECTION_TYPE_TCP_PERSISTANT:
    275 			result = RPC_UnregisterKey_TP(entry, KeyUUID);
    276 			break;
    277 		default:
    278 			break;
    279 	}
    280 
    281 	put_table_entry(entry);
    282 
    283 	return result;
    284 }
    285 
    286 TSS_RESULT RPC_EnumRegisteredKeys(TSS_HCONTEXT tspContext,	/* in */
    287 				  TSS_UUID * pKeyUUID,	/* in */
    288 				  UINT32 * pcKeyHierarchySize,	/* out */
    289 				  TSS_KM_KEYINFO ** ppKeyHierarchy)	/* out */
    290 {
    291 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
    292 	struct host_table_entry *entry = get_table_entry(tspContext);
    293 
    294 	if (entry == NULL)
    295 		return TSPERR(TSS_E_NO_CONNECTION);
    296 
    297 	switch (entry->type) {
    298 		case CONNECTION_TYPE_TCP_PERSISTANT:
    299 			result = RPC_EnumRegisteredKeys_TP(entry, pKeyUUID, pcKeyHierarchySize,
    300 							   ppKeyHierarchy);
    301 			break;
    302 		default:
    303 			break;
    304 	}
    305 
    306 	put_table_entry(entry);
    307 
    308 	return result;
    309 }
    310 
    311 TSS_RESULT RPC_EnumRegisteredKeys2(TSS_HCONTEXT tspContext,	/* in */
    312 				   TSS_UUID * pKeyUUID,	/* in */
    313 				   UINT32 * pcKeyHierarchySize,	/* out */
    314 				   TSS_KM_KEYINFO2 ** ppKeyHierarchy)	/* out */
    315 {
    316 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
    317 	struct host_table_entry *entry = get_table_entry(tspContext);
    318 
    319 	if (entry == NULL)
    320 		return TSPERR(TSS_E_NO_CONNECTION);
    321 
    322 	switch (entry->type) {
    323 		case CONNECTION_TYPE_TCP_PERSISTANT:
    324 			result = RPC_EnumRegisteredKeys2_TP(entry, pKeyUUID, pcKeyHierarchySize,
    325 							    ppKeyHierarchy);
    326 			break;
    327 		default:
    328 			break;
    329 	}
    330 
    331 	put_table_entry(entry);
    332 
    333 	return result;
    334 }
    335 
    336 
    337 TSS_RESULT RPC_GetRegisteredKey(TSS_HCONTEXT tspContext,	/* in */
    338 				TSS_UUID KeyUUID,	/* in */
    339 				TSS_KM_KEYINFO ** ppKeyInfo)	/* out */
    340 {
    341 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
    342 	struct host_table_entry *entry = get_table_entry(tspContext);
    343 
    344 	if (entry == NULL)
    345 		return TSPERR(TSS_E_NO_CONNECTION);
    346 
    347 	switch (entry->type) {
    348 		case CONNECTION_TYPE_TCP_PERSISTANT:
    349 			result = RPC_GetRegisteredKey_TP(entry, KeyUUID, ppKeyInfo);
    350 			break;
    351 		default:
    352 			break;
    353 	}
    354 
    355 	put_table_entry(entry);
    356 
    357 	return result;
    358 }
    359 
    360 TSS_RESULT RPC_GetRegisteredKeyBlob(TSS_HCONTEXT tspContext,	/* in */
    361 				    TSS_UUID KeyUUID,	/* in */
    362 				    UINT32 * pcKeySize,	/* out */
    363 				    BYTE ** prgbKey)	/* out */
    364 {
    365 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
    366 	struct host_table_entry *entry = get_table_entry(tspContext);
    367 
    368 	if (entry == NULL)
    369 		return TSPERR(TSS_E_NO_CONNECTION);
    370 
    371 	switch (entry->type) {
    372 		case CONNECTION_TYPE_TCP_PERSISTANT:
    373 			result = RPC_GetRegisteredKeyBlob_TP(entry, KeyUUID, pcKeySize, prgbKey);
    374 			break;
    375 		default:
    376 			break;
    377 	}
    378 
    379 	put_table_entry(entry);
    380 
    381 	return result;
    382 }
    383 
    384 TSS_RESULT RPC_LoadKeyByBlob(TSS_HCONTEXT tspContext,	/* in */
    385 			     TCS_KEY_HANDLE hUnwrappingKey,	/* in */
    386 			     UINT32 cWrappedKeyBlobSize,	/* in */
    387 			     BYTE * rgbWrappedKeyBlob,	/* in */
    388 			     TPM_AUTH * pAuth,	/* in, out */
    389 			     TCS_KEY_HANDLE * phKeyTCSI,	/* out */
    390 			     TCS_KEY_HANDLE * phKeyHMAC)	/* out */
    391 {
    392 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
    393 	struct host_table_entry *entry = get_table_entry(tspContext);
    394 
    395 	if (entry == NULL)
    396 		return TSPERR(TSS_E_NO_CONNECTION);
    397 
    398 	switch (entry->type) {
    399 		case CONNECTION_TYPE_TCP_PERSISTANT:
    400 			result = RPC_LoadKeyByBlob_TP(entry, hUnwrappingKey, cWrappedKeyBlobSize,
    401 						      rgbWrappedKeyBlob, pAuth, phKeyTCSI,
    402 						      phKeyHMAC);
    403 			break;
    404 		default:
    405 			break;
    406 	}
    407 
    408 	put_table_entry(entry);
    409 
    410 	return result;
    411 }
    412 
    413 TSS_RESULT RPC_LoadKeyByUUID(TSS_HCONTEXT tspContext,	/* in */
    414 			     TSS_UUID KeyUUID,	/* in */
    415 			     TCS_LOADKEY_INFO * pLoadKeyInfo,	/* in, out */
    416 			     TCS_KEY_HANDLE * phKeyTCSI)	/* out */
    417 {
    418 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
    419 	struct host_table_entry *entry = get_table_entry(tspContext);
    420 
    421 	if (entry == NULL)
    422 		return TSPERR(TSS_E_NO_CONNECTION);
    423 
    424 	switch (entry->type) {
    425 		case CONNECTION_TYPE_TCP_PERSISTANT:
    426 			result = RPC_LoadKeyByUUID_TP(entry, KeyUUID, pLoadKeyInfo, phKeyTCSI);
    427 			break;
    428 		default:
    429 			break;
    430 	}
    431 
    432 	put_table_entry(entry);
    433 
    434 	return result;
    435 }
    436 
    437 TSS_RESULT RPC_EvictKey(TSS_HCONTEXT tspContext,	/* in */
    438 			TCS_KEY_HANDLE hKey)	/* in */
    439 {
    440 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
    441 	struct host_table_entry *entry = get_table_entry(tspContext);
    442 
    443 	if (entry == NULL)
    444 		return TSPERR(TSS_E_NO_CONNECTION);
    445 
    446 	switch (entry->type) {
    447 		case CONNECTION_TYPE_TCP_PERSISTANT:
    448 			result = RPC_EvictKey_TP(entry, hKey);
    449 			break;
    450 		default:
    451 			break;
    452 	}
    453 
    454 	put_table_entry(entry);
    455 
    456 	return result;
    457 }
    458 
    459 TSS_RESULT RPC_CreateWrapKey(TSS_HCONTEXT tspContext,	/* in */
    460 			     TCS_KEY_HANDLE hWrappingKey,	/* in */
    461 			     TCPA_ENCAUTH *KeyUsageAuth,	/* in */
    462 			     TCPA_ENCAUTH *KeyMigrationAuth,	/* in */
    463 			     UINT32 keyInfoSize,	/* in */
    464 			     BYTE * keyInfo,	/* in */
    465 			     UINT32 * keyDataSize,	/* out */
    466 			     BYTE ** keyData,	/* out */
    467 			     TPM_AUTH * pAuth)	/* in, out */
    468 {
    469 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
    470 	struct host_table_entry *entry = get_table_entry(tspContext);
    471 
    472 	if (entry == NULL)
    473 		return TSPERR(TSS_E_NO_CONNECTION);
    474 
    475 	switch (entry->type) {
    476 		case CONNECTION_TYPE_TCP_PERSISTANT:
    477 			result = RPC_CreateWrapKey_TP(entry, hWrappingKey, KeyUsageAuth,
    478 						      KeyMigrationAuth, keyInfoSize, keyInfo,
    479 						      keyDataSize, keyData, pAuth);
    480 			break;
    481 		default:
    482 			break;
    483 	}
    484 
    485 	put_table_entry(entry);
    486 
    487 	return result;
    488 }
    489 
    490 TSS_RESULT RPC_GetPubKey(TSS_HCONTEXT tspContext,	/* in */
    491 			 TCS_KEY_HANDLE hKey,	/* in */
    492 			 TPM_AUTH * pAuth,	/* in, out */
    493 			 UINT32 * pcPubKeySize,	/* out */
    494 			 BYTE ** prgbPubKey)	/* out */
    495 {
    496 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
    497 	struct host_table_entry *entry = get_table_entry(tspContext);
    498 
    499 	if (entry == NULL)
    500 		return TSPERR(TSS_E_NO_CONNECTION);
    501 
    502 	switch (entry->type) {
    503 		case CONNECTION_TYPE_TCP_PERSISTANT:
    504 			result = RPC_GetPubKey_TP(entry, hKey, pAuth, pcPubKeySize, prgbPubKey);
    505 			break;
    506 		default:
    507 			break;
    508 	}
    509 
    510 	put_table_entry(entry);
    511 
    512 	return result;
    513 }
    514 
    515 TSS_RESULT RPC_MakeIdentity(TSS_HCONTEXT tspContext,	/* in */
    516 			    TCPA_ENCAUTH identityAuth,	/* in */
    517 			    TCPA_CHOSENID_HASH IDLabel_PrivCAHash,	/* in */
    518 			    UINT32 idKeyInfoSize,	/* in */
    519 			    BYTE * idKeyInfo,	/* in */
    520 			    TPM_AUTH * pSrkAuth,	/* in, out */
    521 			    TPM_AUTH * pOwnerAuth,	/* in, out */
    522 			    UINT32 * idKeySize,	/* out */
    523 			    BYTE ** idKey,	/* out */
    524 			    UINT32 * pcIdentityBindingSize,	/* out */
    525 			    BYTE ** prgbIdentityBinding,	/* out */
    526 			    UINT32 * pcEndorsementCredentialSize,	/* out */
    527 			    BYTE ** prgbEndorsementCredential,	/* out */
    528 			    UINT32 * pcPlatformCredentialSize,	/* out */
    529 			    BYTE ** prgbPlatformCredential,	/* out */
    530 			    UINT32 * pcConformanceCredentialSize,	/* out */
    531 			    BYTE ** prgbConformanceCredential)	/* out */
    532 {
    533 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
    534 	struct host_table_entry *entry = get_table_entry(tspContext);
    535 
    536 	if (entry == NULL)
    537 		return TSPERR(TSS_E_NO_CONNECTION);
    538 
    539 	switch (entry->type) {
    540 		case CONNECTION_TYPE_TCP_PERSISTANT:
    541 			result = RPC_MakeIdentity_TP(entry, identityAuth,
    542 						     IDLabel_PrivCAHash, idKeyInfoSize, idKeyInfo,
    543 						     pSrkAuth, pOwnerAuth, idKeySize, idKey,
    544 						     pcIdentityBindingSize, prgbIdentityBinding,
    545 						     pcEndorsementCredentialSize,
    546 						     prgbEndorsementCredential,
    547 						     pcPlatformCredentialSize,
    548 						     prgbPlatformCredential,
    549 						     pcConformanceCredentialSize,
    550 						     prgbConformanceCredential);
    551 			break;
    552 		default:
    553 			break;
    554 	}
    555 
    556 	put_table_entry(entry);
    557 
    558 	return result;
    559 }
    560 
    561 #ifdef TSS_BUILD_TSS12
    562 TSS_RESULT RPC_GetCredential(TSS_HCONTEXT tspContext,	/* in */
    563 			     UINT32 ulCredentialType,          /* in */
    564 			     UINT32 ulCredentialAccessMode,    /* in */
    565 			     UINT32 * pulCredentialSize,       /* out */
    566 			     BYTE ** prgbCredentialData)	/* out */
    567 {
    568 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
    569 	struct host_table_entry *entry = get_table_entry(tspContext);
    570 
    571 	if (entry == NULL)
    572 		return TSPERR(TSS_E_NO_CONNECTION);
    573 
    574 	switch (entry->type) {
    575 		case CONNECTION_TYPE_TCP_PERSISTANT:
    576 			result = RPC_GetCredential_TP(entry, ulCredentialType,
    577 						      ulCredentialAccessMode, pulCredentialSize,
    578 						      prgbCredentialData);
    579 			break;
    580 		default:
    581 			break;
    582 	}
    583 
    584 	put_table_entry(entry);
    585 
    586 	return result;
    587 }
    588 #endif
    589 
    590 TSS_RESULT RPC_SetOwnerInstall(TSS_HCONTEXT tspContext,	/* in */
    591 			       TSS_BOOL state)	/* in */
    592 {
    593 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
    594 	struct host_table_entry *entry = get_table_entry(tspContext);
    595 
    596 	if (entry == NULL)
    597 		return TSPERR(TSS_E_NO_CONNECTION);
    598 
    599 	switch (entry->type) {
    600 		case CONNECTION_TYPE_TCP_PERSISTANT:
    601 			result = RPC_SetOwnerInstall_TP(entry, state);
    602 			break;
    603 		default:
    604 			break;
    605 	}
    606 
    607 	put_table_entry(entry);
    608 
    609 	return result;
    610 }
    611 
    612 TSS_RESULT RPC_TakeOwnership(TSS_HCONTEXT tspContext,	/* in */
    613 			     UINT16 protocolID,	/* in */
    614 			     UINT32 encOwnerAuthSize,	/* in */
    615 			     BYTE * encOwnerAuth,	/* in */
    616 			     UINT32 encSrkAuthSize,	/* in */
    617 			     BYTE * encSrkAuth,	/* in */
    618 			     UINT32 srkInfoSize,	/* in */
    619 			     BYTE * srkInfo,	/* in */
    620 			     TPM_AUTH * ownerAuth,	/* in, out */
    621 			     UINT32 * srkKeySize,
    622 			     BYTE ** srkKey)
    623 {
    624 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
    625 	struct host_table_entry *entry = get_table_entry(tspContext);
    626 
    627 	if (entry == NULL)
    628 		return TSPERR(TSS_E_NO_CONNECTION);
    629 
    630 	switch (entry->type) {
    631 		case CONNECTION_TYPE_TCP_PERSISTANT:
    632 			result = RPC_TakeOwnership_TP(entry, protocolID,
    633 						      encOwnerAuthSize, encOwnerAuth,
    634 						      encSrkAuthSize, encSrkAuth, srkInfoSize,
    635 						      srkInfo, ownerAuth, srkKeySize, srkKey);
    636 			break;
    637 		default:
    638 			break;
    639 	}
    640 
    641 	put_table_entry(entry);
    642 
    643 	return result;
    644 }
    645 
    646 TSS_RESULT RPC_OIAP(TSS_HCONTEXT tspContext,	/* in */
    647 		    TCS_AUTHHANDLE * authHandle,	/* out */
    648 		    TCPA_NONCE * nonce0)	/* out */
    649 {
    650 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
    651 	struct host_table_entry *entry = get_table_entry(tspContext);
    652 
    653 	if (entry == NULL)
    654 		return TSPERR(TSS_E_NO_CONNECTION);
    655 
    656 	switch (entry->type) {
    657 		case CONNECTION_TYPE_TCP_PERSISTANT:
    658 			result = RPC_OIAP_TP(entry, authHandle, nonce0);
    659 			break;
    660 		default:
    661 			break;
    662 	}
    663 
    664 	put_table_entry(entry);
    665 
    666 	return result;
    667 }
    668 
    669 TSS_RESULT RPC_OSAP(TSS_HCONTEXT tspContext,	/* in */
    670 		    TCPA_ENTITY_TYPE entityType,	/* in */
    671 		    UINT32 entityValue,	/* in */
    672 		    TPM_NONCE *nonceOddOSAP,	/* in */
    673 		    TCS_AUTHHANDLE * authHandle,	/* out */
    674 		    TCPA_NONCE * nonceEven,	/* out */
    675 		    TCPA_NONCE * nonceEvenOSAP)	/* out */
    676 {
    677 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
    678 	struct host_table_entry *entry = get_table_entry(tspContext);
    679 
    680 	if (entry == NULL)
    681 		return TSPERR(TSS_E_NO_CONNECTION);
    682 
    683 	switch (entry->type) {
    684 		case CONNECTION_TYPE_TCP_PERSISTANT:
    685 			result = RPC_OSAP_TP(entry, entityType, entityValue, nonceOddOSAP,
    686 					     authHandle, nonceEven, nonceEvenOSAP);
    687 			break;
    688 		default:
    689 			break;
    690 	}
    691 
    692 	put_table_entry(entry);
    693 
    694 	return result;
    695 }
    696 
    697 TSS_RESULT RPC_ChangeAuth(TSS_HCONTEXT tspContext,	/* in */
    698 			  TCS_KEY_HANDLE parentHandle,	/* in */
    699 			  TCPA_PROTOCOL_ID protocolID,	/* in */
    700 			  TCPA_ENCAUTH *newAuth,	/* in */
    701 			  TCPA_ENTITY_TYPE entityType,	/* in */
    702 			  UINT32 encDataSize,	/* in */
    703 			  BYTE * encData,	/* in */
    704 			  TPM_AUTH * ownerAuth,	/* in, out */
    705 			  TPM_AUTH * entityAuth,	/* in, out */
    706 			  UINT32 * outDataSize,	/* out */
    707 			  BYTE ** outData)	/* out */
    708 {
    709 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
    710 	struct host_table_entry *entry = get_table_entry(tspContext);
    711 
    712 	if (entry == NULL)
    713 		return TSPERR(TSS_E_NO_CONNECTION);
    714 
    715 	switch (entry->type) {
    716 		case CONNECTION_TYPE_TCP_PERSISTANT:
    717 			result = RPC_ChangeAuth_TP(entry, parentHandle, protocolID, newAuth,
    718 						   entityType, encDataSize, encData, ownerAuth,
    719 						   entityAuth, outDataSize, outData);
    720 			break;
    721 		default:
    722 			break;
    723 	}
    724 
    725 	put_table_entry(entry);
    726 
    727 	return result;
    728 }
    729 
    730 TSS_RESULT RPC_ChangeAuthOwner(TSS_HCONTEXT tspContext,	/* in */
    731 				TCPA_PROTOCOL_ID protocolID,	/* in */
    732 				TCPA_ENCAUTH *newAuth,	/* in */
    733 				TCPA_ENTITY_TYPE entityType,	/* in */
    734 				TPM_AUTH * ownerAuth)	/* in, out */
    735 {
    736 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
    737 	struct host_table_entry *entry = get_table_entry(tspContext);
    738 
    739 	if (entry == NULL)
    740 		return TSPERR(TSS_E_NO_CONNECTION);
    741 
    742 	switch (entry->type) {
    743 		case CONNECTION_TYPE_TCP_PERSISTANT:
    744 			result = RPC_ChangeAuthOwner_TP(entry, protocolID, newAuth, entityType,
    745 							ownerAuth);
    746 			break;
    747 		default:
    748 			break;
    749 	}
    750 
    751 	put_table_entry(entry);
    752 
    753 	return result;
    754 }
    755 
    756 TSS_RESULT RPC_ChangeAuthAsymStart(TSS_HCONTEXT tspContext,	/* in */
    757 				   TCS_KEY_HANDLE idHandle,	/* in */
    758 				   TCPA_NONCE antiReplay,	/* in */
    759 				   UINT32 KeySizeIn,	/* in */
    760 				   BYTE * KeyDataIn,	/* in */
    761 				   TPM_AUTH * pAuth,	/* in, out */
    762 				   UINT32 * KeySizeOut,	/* out */
    763 				   BYTE ** KeyDataOut,	/* out */
    764 				   UINT32 * CertifyInfoSize,	/* out */
    765 				   BYTE ** CertifyInfo,	/* out */
    766 				   UINT32 * sigSize,	/* out */
    767 				   BYTE ** sig,	/* out */
    768 				   TCS_KEY_HANDLE * ephHandle)	/* out */
    769 {
    770 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
    771 	struct host_table_entry *entry = get_table_entry(tspContext);
    772 
    773 	if (entry == NULL)
    774 		return TSPERR(TSS_E_NO_CONNECTION);
    775 
    776 	switch (entry->type) {
    777 		case CONNECTION_TYPE_TCP_PERSISTANT:
    778 			result = RPC_ChangeAuthAsymStart_TP(entry, idHandle, antiReplay,
    779 							    KeySizeIn, KeyDataIn, pAuth,
    780 							    KeySizeOut, KeyDataOut,
    781 							    CertifyInfoSize, CertifyInfo, sigSize,
    782 							    sig, ephHandle);
    783 			break;
    784 		default:
    785 			break;
    786 	}
    787 
    788 	put_table_entry(entry);
    789 
    790 	return result;
    791 }
    792 
    793 TSS_RESULT RPC_ChangeAuthAsymFinish(TSS_HCONTEXT tspContext,	/* in */
    794 				    TCS_KEY_HANDLE parentHandle,	/* in */
    795 				    TCS_KEY_HANDLE ephHandle,	/* in */
    796 				    TCPA_ENTITY_TYPE entityType,	/* in */
    797 				    TCPA_HMAC newAuthLink,	/* in */
    798 				    UINT32 newAuthSize,	/* in */
    799 				    BYTE * encNewAuth,	/* in */
    800 				    UINT32 encDataSizeIn,	/* in */
    801 				    BYTE * encDataIn,	/* in */
    802 				    TPM_AUTH * ownerAuth,	/* in, out */
    803 				    UINT32 * encDataSizeOut,	/* out */
    804 				    BYTE ** encDataOut,	/* out */
    805 				    TCPA_SALT_NONCE * saltNonce,	/* out */
    806 				    TCPA_DIGEST * changeProof)	/* out */
    807 {
    808 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
    809 	struct host_table_entry *entry = get_table_entry(tspContext);
    810 
    811 	if (entry == NULL)
    812 		return TSPERR(TSS_E_NO_CONNECTION);
    813 
    814 	switch (entry->type) {
    815 		case CONNECTION_TYPE_TCP_PERSISTANT:
    816 			result = RPC_ChangeAuthAsymFinish_TP(entry, parentHandle, ephHandle,
    817 							     entityType, newAuthLink,
    818 							     newAuthSize, encNewAuth,
    819 							     encDataSizeIn, encDataIn, ownerAuth,
    820 							     encDataSizeOut, encDataOut, saltNonce,
    821 							     changeProof);
    822 			break;
    823 		default:
    824 			break;
    825 	}
    826 
    827 	put_table_entry(entry);
    828 
    829 	return result;
    830 }
    831 
    832 TSS_RESULT RPC_TerminateHandle(TSS_HCONTEXT tspContext,	/* in */
    833 			       TCS_AUTHHANDLE handle)	/* in */
    834 {
    835 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
    836 	struct host_table_entry *entry = get_table_entry(tspContext);
    837 
    838 	if (entry == NULL)
    839 		return TSPERR(TSS_E_NO_CONNECTION);
    840 
    841 	switch (entry->type) {
    842 		case CONNECTION_TYPE_TCP_PERSISTANT:
    843 			result = RPC_TerminateHandle_TP(entry, handle);
    844 			break;
    845 		default:
    846 			break;
    847 	}
    848 
    849 	put_table_entry(entry);
    850 
    851 	return result;
    852 }
    853 
    854 TSS_RESULT RPC_ActivateTPMIdentity(TSS_HCONTEXT tspContext,	/* in */
    855 				   TCS_KEY_HANDLE idKey,	/* in */
    856 				   UINT32 blobSize,	/* in */
    857 				   BYTE * blob,	/* in */
    858 				   TPM_AUTH * idKeyAuth,	/* in, out */
    859 				   TPM_AUTH * ownerAuth,	/* in, out */
    860 				   UINT32 * SymmetricKeySize,	/* out */
    861 				   BYTE ** SymmetricKey)	/* out */
    862 {
    863 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
    864 	struct host_table_entry *entry = get_table_entry(tspContext);
    865 
    866 	if (entry == NULL)
    867 		return TSPERR(TSS_E_NO_CONNECTION);
    868 
    869 	switch (entry->type) {
    870 		case CONNECTION_TYPE_TCP_PERSISTANT:
    871 			result = RPC_ActivateTPMIdentity_TP(entry, idKey, blobSize, blob, idKeyAuth,
    872 							    ownerAuth, SymmetricKeySize,
    873 							    SymmetricKey);
    874 			break;
    875 		default:
    876 			break;
    877 	}
    878 
    879 	put_table_entry(entry);
    880 
    881 	return result;
    882 }
    883 
    884 TSS_RESULT RPC_Extend(TSS_HCONTEXT tspContext,	/* in */
    885 		      TCPA_PCRINDEX pcrNum,	/* in */
    886 		      TCPA_DIGEST inDigest,	/* in */
    887 		      TCPA_PCRVALUE * outDigest)	/* out */
    888 {
    889 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
    890 	struct host_table_entry *entry = get_table_entry(tspContext);
    891 
    892 	if (entry == NULL)
    893 		return TSPERR(TSS_E_NO_CONNECTION);
    894 
    895 	switch (entry->type) {
    896 		case CONNECTION_TYPE_TCP_PERSISTANT:
    897 			result = RPC_Extend_TP(entry, pcrNum, inDigest, outDigest);
    898 			break;
    899 		default:
    900 			break;
    901 	}
    902 
    903 	put_table_entry(entry);
    904 
    905 	return result;
    906 }
    907 
    908 TSS_RESULT RPC_PcrRead(TSS_HCONTEXT tspContext,	/* in */
    909 		       TCPA_PCRINDEX pcrNum,	/* in */
    910 		       TCPA_PCRVALUE * outDigest)	/* out */
    911 {
    912 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
    913 	struct host_table_entry *entry = get_table_entry(tspContext);
    914 
    915 	if (entry == NULL)
    916 		return TSPERR(TSS_E_NO_CONNECTION);
    917 
    918 	switch (entry->type) {
    919 		case CONNECTION_TYPE_TCP_PERSISTANT:
    920 			result = RPC_PcrRead_TP(entry, pcrNum, outDigest);
    921 			break;
    922 		default:
    923 			break;
    924 	}
    925 
    926 	put_table_entry(entry);
    927 
    928 	return result;
    929 }
    930 
    931 TSS_RESULT RPC_PcrReset(TSS_HCONTEXT tspContext,	/* in */
    932 			UINT32 pcrDataSizeIn,		/* in */
    933 			BYTE * pcrDataIn)		/* in */
    934 {
    935 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
    936 	struct host_table_entry *entry = get_table_entry(tspContext);
    937 
    938 	if (entry == NULL)
    939 		return TSPERR(TSS_E_NO_CONNECTION);
    940 
    941 	switch (entry->type) {
    942 		case CONNECTION_TYPE_TCP_PERSISTANT:
    943 			result = RPC_PcrReset_TP(entry, pcrDataSizeIn, pcrDataIn);
    944 			break;
    945 		default:
    946 			break;
    947 	}
    948 
    949 	put_table_entry(entry);
    950 
    951 	return result;
    952 }
    953 
    954 
    955 TSS_RESULT RPC_Quote(TSS_HCONTEXT tspContext,	/* in */
    956 		     TCS_KEY_HANDLE keyHandle,	/* in */
    957 		     TCPA_NONCE *antiReplay,	/* in */
    958 		     UINT32 pcrDataSizeIn,	/* in */
    959 		     BYTE * pcrDataIn,	/* in */
    960 		     TPM_AUTH * privAuth,	/* in, out */
    961 		     UINT32 * pcrDataSizeOut,	/* out */
    962 		     BYTE ** pcrDataOut,	/* out */
    963 		     UINT32 * sigSize,	/* out */
    964 		     BYTE ** sig)	/* out */
    965 {
    966 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
    967 	struct host_table_entry *entry = get_table_entry(tspContext);
    968 
    969 	if (entry == NULL)
    970 		return TSPERR(TSS_E_NO_CONNECTION);
    971 
    972 	switch (entry->type) {
    973 		case CONNECTION_TYPE_TCP_PERSISTANT:
    974 			result = RPC_Quote_TP(entry, keyHandle, antiReplay, pcrDataSizeIn,
    975 					      pcrDataIn, privAuth, pcrDataSizeOut, pcrDataOut,
    976 					      sigSize, sig);
    977 			break;
    978 		default:
    979 			break;
    980 	}
    981 
    982 	put_table_entry(entry);
    983 
    984 	return result;
    985 }
    986 
    987 #ifdef TSS_BUILD_TSS12
    988 TSS_RESULT RPC_Quote2(TSS_HCONTEXT tspContext, /* in */
    989 		      TCS_KEY_HANDLE keyHandle, /* in */
    990 		      TCPA_NONCE *antiReplay, /* in */
    991 		      UINT32 pcrDataSizeIn, /* in */
    992 		      BYTE * pcrDataIn, /* in */
    993 		      TSS_BOOL addVersion, /* in */
    994 		      TPM_AUTH * privAuth, /* in,out */
    995 		      UINT32 * pcrDataSizeOut, /* out */
    996 		      BYTE ** pcrDataOut, /* out */
    997 		      UINT32 * versionInfoSize, /* out */
    998 		      BYTE ** versionInfo, /* out */
    999 		      UINT32 * sigSize, /* out */
   1000 		      BYTE ** sig) /* out */
   1001 {
   1002 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   1003 	struct host_table_entry *entry = get_table_entry(tspContext);
   1004 
   1005 	if (entry == NULL)
   1006 		return TSPERR(TSS_E_NO_CONNECTION);
   1007 
   1008 	switch (entry->type) {
   1009 	case CONNECTION_TYPE_TCP_PERSISTANT:
   1010 		result = RPC_Quote2_TP(entry, keyHandle, antiReplay, pcrDataSizeIn, pcrDataIn,
   1011 				       addVersion,privAuth, pcrDataSizeOut, pcrDataOut,
   1012 				       versionInfoSize, versionInfo,sigSize, sig);
   1013 		break;
   1014 	default:
   1015 		break;
   1016 	}
   1017 
   1018 	put_table_entry(entry);
   1019 
   1020 	return result;
   1021 }
   1022 #endif
   1023 
   1024 TSS_RESULT RPC_DirWriteAuth(TSS_HCONTEXT tspContext,	/* in */
   1025 			    TCPA_DIRINDEX dirIndex,	/* in */
   1026 			    TCPA_DIRVALUE *newContents,	/* in */
   1027 			    TPM_AUTH * ownerAuth)	/* in, out */
   1028 {
   1029 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   1030 	struct host_table_entry *entry = get_table_entry(tspContext);
   1031 
   1032 	if (entry == NULL)
   1033 		return TSPERR(TSS_E_NO_CONNECTION);
   1034 
   1035 	switch (entry->type) {
   1036 		case CONNECTION_TYPE_TCP_PERSISTANT:
   1037 			result = RPC_DirWriteAuth_TP(entry, dirIndex, newContents, ownerAuth);
   1038 			break;
   1039 		default:
   1040 			break;
   1041 	}
   1042 
   1043 	put_table_entry(entry);
   1044 
   1045 	return result;
   1046 }
   1047 
   1048 TSS_RESULT RPC_DirRead(TSS_HCONTEXT tspContext,	/* in */
   1049 		       TCPA_DIRINDEX dirIndex,	/* in */
   1050 		       TCPA_DIRVALUE * dirValue)	/* out */
   1051 {
   1052 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   1053 	struct host_table_entry *entry = get_table_entry(tspContext);
   1054 
   1055 	if (entry == NULL)
   1056 		return TSPERR(TSS_E_NO_CONNECTION);
   1057 
   1058 	switch (entry->type) {
   1059 		case CONNECTION_TYPE_TCP_PERSISTANT:
   1060 			result = RPC_DirRead_TP(entry, dirIndex, dirValue);
   1061 			break;
   1062 		default:
   1063 			break;
   1064 	}
   1065 
   1066 	put_table_entry(entry);
   1067 
   1068 	return result;
   1069 }
   1070 
   1071 TSS_RESULT RPC_Seal(TSS_HCONTEXT tspContext,	/* in */
   1072 		    TCS_KEY_HANDLE keyHandle,	/* in */
   1073 		    TCPA_ENCAUTH *encAuth,	/* in */
   1074 		    UINT32 pcrInfoSize,	/* in */
   1075 		    BYTE * PcrInfo,	/* in */
   1076 		    UINT32 inDataSize,	/* in */
   1077 		    BYTE * inData,	/* in */
   1078 		    TPM_AUTH * pubAuth,	/* in, out */
   1079 		    UINT32 * SealedDataSize,	/* out */
   1080 		    BYTE ** SealedData)	/* out */
   1081 {
   1082 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   1083 	struct host_table_entry *entry = get_table_entry(tspContext);
   1084 
   1085 	if (entry == NULL)
   1086 		return TSPERR(TSS_E_NO_CONNECTION);
   1087 
   1088 	switch (entry->type) {
   1089 		case CONNECTION_TYPE_TCP_PERSISTANT:
   1090 			result = RPC_Seal_TP(entry, keyHandle, encAuth, pcrInfoSize, PcrInfo,
   1091 					     inDataSize, inData, pubAuth, SealedDataSize,
   1092 					     SealedData);
   1093 			break;
   1094 		default:
   1095 			break;
   1096 	}
   1097 
   1098 	put_table_entry(entry);
   1099 
   1100 	return result;
   1101 }
   1102 
   1103 #ifdef TSS_BUILD_SEALX
   1104 TSS_RESULT RPC_Sealx(TSS_HCONTEXT tspContext,	/* in */
   1105 		     TCS_KEY_HANDLE keyHandle,	/* in */
   1106 		     TCPA_ENCAUTH *encAuth,	/* in */
   1107 		     UINT32 pcrInfoSize,	/* in */
   1108 		     BYTE * PcrInfo,	/* in */
   1109 		     UINT32 inDataSize,	/* in */
   1110 		     BYTE * inData,	/* in */
   1111 		     TPM_AUTH * pubAuth,	/* in, out */
   1112 		     UINT32 * SealedDataSize,	/* out */
   1113 		     BYTE ** SealedData)	/* out */
   1114 {
   1115 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   1116 	struct host_table_entry *entry = get_table_entry(tspContext);
   1117 
   1118 	if (entry == NULL)
   1119 		return TSPERR(TSS_E_NO_CONNECTION);
   1120 
   1121 	switch (entry->type) {
   1122 		case CONNECTION_TYPE_TCP_PERSISTANT:
   1123 			result = RPC_Sealx_TP(entry, keyHandle, encAuth, pcrInfoSize, PcrInfo,
   1124 					      inDataSize, inData, pubAuth, SealedDataSize,
   1125 					      SealedData);
   1126 			break;
   1127 		default:
   1128 			break;
   1129 	}
   1130 
   1131 	put_table_entry(entry);
   1132 
   1133 	return result;
   1134 }
   1135 #endif
   1136 
   1137 TSS_RESULT RPC_Unseal(TSS_HCONTEXT tspContext,	/* in */
   1138 		      TCS_KEY_HANDLE parentHandle,	/* in */
   1139 		      UINT32 SealedDataSize,	/* in */
   1140 		      BYTE * SealedData,	/* in */
   1141 		      TPM_AUTH * parentAuth,	/* in, out */
   1142 		      TPM_AUTH * dataAuth,	/* in, out */
   1143 		      UINT32 * DataSize,	/* out */
   1144 		      BYTE ** Data)	/* out */
   1145 {
   1146 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   1147 	struct host_table_entry *entry = get_table_entry(tspContext);
   1148 
   1149 	if (entry == NULL)
   1150 		return TSPERR(TSS_E_NO_CONNECTION);
   1151 
   1152 	switch (entry->type) {
   1153 		case CONNECTION_TYPE_TCP_PERSISTANT:
   1154 			result = RPC_Unseal_TP(entry, parentHandle, SealedDataSize, SealedData,
   1155 					       parentAuth, dataAuth, DataSize, Data);
   1156 			break;
   1157 		default:
   1158 			break;
   1159 	}
   1160 
   1161 	put_table_entry(entry);
   1162 
   1163 	return result;
   1164 }
   1165 
   1166 TSS_RESULT RPC_UnBind(TSS_HCONTEXT tspContext,	/* in */
   1167 		       TCS_KEY_HANDLE keyHandle,	/* in */
   1168 		       UINT32 inDataSize,	/* in */
   1169 		       BYTE * inData,	/* in */
   1170 		       TPM_AUTH * privAuth,	/* in, out */
   1171 		       UINT32 * outDataSize,	/* out */
   1172 		       BYTE ** outData)	/* out */
   1173 {
   1174 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   1175 	struct host_table_entry *entry = get_table_entry(tspContext);
   1176 
   1177 	if (entry == NULL)
   1178 		return TSPERR(TSS_E_NO_CONNECTION);
   1179 
   1180 	switch (entry->type) {
   1181 		case CONNECTION_TYPE_TCP_PERSISTANT:
   1182 			result = RPC_UnBind_TP(entry, keyHandle, inDataSize, inData, privAuth,
   1183 					       outDataSize, outData);
   1184 			break;
   1185 		default:
   1186 			break;
   1187 	}
   1188 
   1189 	put_table_entry(entry);
   1190 
   1191 	return result;
   1192 }
   1193 
   1194 TSS_RESULT RPC_CreateMigrationBlob(TSS_HCONTEXT tspContext,	/* in */
   1195 				   TCS_KEY_HANDLE parentHandle,	/* in */
   1196 				   TCPA_MIGRATE_SCHEME migrationType,	/* in */
   1197 				   UINT32 MigrationKeyAuthSize,	/* in */
   1198 				   BYTE * MigrationKeyAuth,	/* in */
   1199 				   UINT32 encDataSize,	/* in */
   1200 				   BYTE * encData,	/* in */
   1201 				   TPM_AUTH * parentAuth,	/* in, out */
   1202 				   TPM_AUTH * entityAuth,	/* in, out */
   1203 				   UINT32 * randomSize,	/* out */
   1204 				   BYTE ** random,	/* out */
   1205 				   UINT32 * outDataSize,	/* out */
   1206 				   BYTE ** outData)	/* out */
   1207 {
   1208 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   1209 	struct host_table_entry *entry = get_table_entry(tspContext);
   1210 
   1211 	if (entry == NULL)
   1212 		return TSPERR(TSS_E_NO_CONNECTION);
   1213 
   1214 	switch (entry->type) {
   1215 		case CONNECTION_TYPE_TCP_PERSISTANT:
   1216 			result = RPC_CreateMigrationBlob_TP(entry, parentHandle,
   1217 							    migrationType, MigrationKeyAuthSize,
   1218 							    MigrationKeyAuth, encDataSize, encData,
   1219 							    parentAuth, entityAuth, randomSize,
   1220 							    random, outDataSize, outData);
   1221 			break;
   1222 		default:
   1223 			break;
   1224 	}
   1225 
   1226 	put_table_entry(entry);
   1227 
   1228 	return result;
   1229 }
   1230 
   1231 TSS_RESULT RPC_ConvertMigrationBlob(TSS_HCONTEXT tspContext,	/* in */
   1232 				    TCS_KEY_HANDLE parentHandle,	/* in */
   1233 				    UINT32 inDataSize,	/* in */
   1234 				    BYTE * inData,	/* in */
   1235 				    UINT32 randomSize,	/* in */
   1236 				    BYTE * random,	/* in */
   1237 				    TPM_AUTH * parentAuth,	/* in, out */
   1238 				    UINT32 * outDataSize,	/* out */
   1239 				    BYTE ** outData)	/* out */
   1240 {
   1241 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   1242 	struct host_table_entry *entry = get_table_entry(tspContext);
   1243 
   1244 	if (entry == NULL)
   1245 		return TSPERR(TSS_E_NO_CONNECTION);
   1246 
   1247 	switch (entry->type) {
   1248 		case CONNECTION_TYPE_TCP_PERSISTANT:
   1249 			result = RPC_ConvertMigrationBlob_TP(entry, parentHandle,
   1250 							     inDataSize, inData, randomSize,
   1251 							     random, parentAuth, outDataSize,
   1252 							     outData);
   1253 			break;
   1254 		default:
   1255 			break;
   1256 	}
   1257 
   1258 	put_table_entry(entry);
   1259 
   1260 	return result;
   1261 }
   1262 
   1263 TSS_RESULT RPC_AuthorizeMigrationKey(TSS_HCONTEXT tspContext,	/* in */
   1264 				     TCPA_MIGRATE_SCHEME migrateScheme,	/* in */
   1265 				     UINT32 MigrationKeySize,	/* in */
   1266 				     BYTE * MigrationKey,	/* in */
   1267 				     TPM_AUTH * ownerAuth,	/* in, out */
   1268 				     UINT32 * MigrationKeyAuthSize,	/* out */
   1269 				     BYTE ** MigrationKeyAuth)	/* out */
   1270 {
   1271 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   1272 	struct host_table_entry *entry = get_table_entry(tspContext);
   1273 
   1274 	if (entry == NULL)
   1275 		return TSPERR(TSS_E_NO_CONNECTION);
   1276 
   1277 	switch (entry->type) {
   1278 		case CONNECTION_TYPE_TCP_PERSISTANT:
   1279 			result = RPC_AuthorizeMigrationKey_TP(entry, migrateScheme,
   1280 							      MigrationKeySize, MigrationKey,
   1281 							      ownerAuth, MigrationKeyAuthSize,
   1282 							      MigrationKeyAuth);
   1283 			break;
   1284 		default:
   1285 			break;
   1286 	}
   1287 
   1288 	put_table_entry(entry);
   1289 
   1290 	return result;
   1291 }
   1292 
   1293 TSS_RESULT RPC_CertifyKey(TSS_HCONTEXT tspContext,	/* in */
   1294 			  TCS_KEY_HANDLE certHandle,	/* in */
   1295 			  TCS_KEY_HANDLE keyHandle,	/* in */
   1296 			  TPM_NONCE * antiReplay,	/* in */
   1297 			  TPM_AUTH * certAuth,	/* in, out */
   1298 			  TPM_AUTH * keyAuth,	/* in, out */
   1299 			  UINT32 * CertifyInfoSize,	/* out */
   1300 			  BYTE ** CertifyInfo,	/* out */
   1301 			  UINT32 * outDataSize,	/* out */
   1302 			  BYTE ** outData)	/* out */
   1303 {
   1304 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   1305 	struct host_table_entry *entry = get_table_entry(tspContext);
   1306 
   1307 	if (entry == NULL)
   1308 		return TSPERR(TSS_E_NO_CONNECTION);
   1309 
   1310 	switch (entry->type) {
   1311 		case CONNECTION_TYPE_TCP_PERSISTANT:
   1312 			result = RPC_CertifyKey_TP(entry, certHandle, keyHandle, antiReplay,
   1313 						   certAuth, keyAuth, CertifyInfoSize, CertifyInfo,
   1314 						   outDataSize, outData);
   1315 			break;
   1316 		default:
   1317 			break;
   1318 	}
   1319 
   1320 	put_table_entry(entry);
   1321 
   1322 	return result;
   1323 }
   1324 
   1325 TSS_RESULT RPC_Sign(TSS_HCONTEXT tspContext,	/* in */
   1326 		    TCS_KEY_HANDLE keyHandle,	/* in */
   1327 		    UINT32 areaToSignSize,	/* in */
   1328 		    BYTE * areaToSign,	/* in */
   1329 		    TPM_AUTH * privAuth,	/* in, out */
   1330 		    UINT32 * sigSize,	/* out */
   1331 		    BYTE ** sig)	/* out */
   1332 {
   1333 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   1334 	struct host_table_entry *entry = get_table_entry(tspContext);
   1335 
   1336 	if (entry == NULL)
   1337 		return TSPERR(TSS_E_NO_CONNECTION);
   1338 
   1339 	switch (entry->type) {
   1340 		case CONNECTION_TYPE_TCP_PERSISTANT:
   1341 			result = RPC_Sign_TP(entry, keyHandle, areaToSignSize, areaToSign, privAuth,
   1342 					     sigSize, sig);
   1343 			break;
   1344 		default:
   1345 			break;
   1346 	}
   1347 
   1348 	put_table_entry(entry);
   1349 
   1350 	return result;
   1351 }
   1352 
   1353 TSS_RESULT RPC_GetRandom(TSS_HCONTEXT tspContext,	/* in */
   1354 			 UINT32 bytesRequested,	/* in */
   1355 			 BYTE ** randomBytes)	/* out */
   1356 {
   1357 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   1358 	struct host_table_entry *entry = get_table_entry(tspContext);
   1359 
   1360 	if (entry == NULL)
   1361 		return TSPERR(TSS_E_NO_CONNECTION);
   1362 
   1363 	switch (entry->type) {
   1364 		case CONNECTION_TYPE_TCP_PERSISTANT:
   1365 			result = RPC_GetRandom_TP(entry, bytesRequested, randomBytes);
   1366 			break;
   1367 		default:
   1368 			break;
   1369 	}
   1370 
   1371 	put_table_entry(entry);
   1372 
   1373 	return result;
   1374 }
   1375 
   1376 TSS_RESULT RPC_StirRandom(TSS_HCONTEXT tspContext,	/* in */
   1377 			  UINT32 inDataSize,	/* in */
   1378 			  BYTE * inData)	/* in */
   1379 {
   1380 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   1381 	struct host_table_entry *entry = get_table_entry(tspContext);
   1382 
   1383 	if (entry == NULL)
   1384 		return TSPERR(TSS_E_NO_CONNECTION);
   1385 
   1386 	switch (entry->type) {
   1387 		case CONNECTION_TYPE_TCP_PERSISTANT:
   1388 			result = RPC_StirRandom_TP(entry, inDataSize, inData);
   1389 			break;
   1390 		default:
   1391 			break;
   1392 	}
   1393 
   1394 	put_table_entry(entry);
   1395 
   1396 	return result;
   1397 }
   1398 
   1399 TSS_RESULT RPC_GetTPMCapability(TSS_HCONTEXT tspContext,	/* in */
   1400 			        TCPA_CAPABILITY_AREA capArea,	/* in */
   1401 			        UINT32 subCapSize,	/* in */
   1402 			        BYTE * subCap,	/* in */
   1403 			        UINT32 * respSize,	/* out */
   1404 			        BYTE ** resp)	/* out */
   1405 {
   1406 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   1407 	struct host_table_entry *entry = get_table_entry(tspContext);
   1408 
   1409 	if (entry == NULL)
   1410 		return TSPERR(TSS_E_NO_CONNECTION);
   1411 
   1412 	switch (entry->type) {
   1413 		case CONNECTION_TYPE_TCP_PERSISTANT:
   1414 			result = RPC_GetTPMCapability_TP(entry, capArea, subCapSize, subCap,
   1415 							 respSize, resp);
   1416 			break;
   1417 		default:
   1418 			break;
   1419 	}
   1420 
   1421 	put_table_entry(entry);
   1422 
   1423 	return result;
   1424 }
   1425 
   1426 TSS_RESULT RPC_SetCapability(TSS_HCONTEXT tspContext,	/* in */
   1427 			     TCPA_CAPABILITY_AREA capArea,	/* in */
   1428 			     UINT32 subCapSize,	/* in */
   1429 			     BYTE * subCap,	/* in */
   1430 			     UINT32 valueSize,	/* in */
   1431 			     BYTE * value,	/* in */
   1432 			     TPM_AUTH *ownerAuth) /* in, out */
   1433 {
   1434 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   1435 	struct host_table_entry *entry = get_table_entry(tspContext);
   1436 
   1437 	if (entry == NULL)
   1438 		return TSPERR(TSS_E_NO_CONNECTION);
   1439 
   1440 	switch (entry->type) {
   1441 		case CONNECTION_TYPE_TCP_PERSISTANT:
   1442 			result = RPC_SetCapability_TP(entry, capArea, subCapSize, subCap,
   1443 						      valueSize, value, ownerAuth);
   1444 			break;
   1445 		default:
   1446 			break;
   1447 	}
   1448 
   1449 	put_table_entry(entry);
   1450 
   1451 	return result;
   1452 }
   1453 
   1454 TSS_RESULT RPC_GetCapability(TSS_HCONTEXT tspContext,	/* in */
   1455 			     TCPA_CAPABILITY_AREA capArea,	/* in */
   1456 			     UINT32 subCapSize,	/* in */
   1457 			     BYTE * subCap,	/* in */
   1458 			     UINT32 * respSize,	/* out */
   1459 			     BYTE ** resp)	/* out */
   1460 {
   1461 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   1462 	struct host_table_entry *entry = get_table_entry(tspContext);
   1463 
   1464 	if (entry == NULL)
   1465 		return TSPERR(TSS_E_NO_CONNECTION);
   1466 
   1467 	switch (entry->type) {
   1468 		case CONNECTION_TYPE_TCP_PERSISTANT:
   1469 			result = RPC_GetCapability_TP(entry, capArea, subCapSize, subCap, respSize,
   1470 						      resp);
   1471 			break;
   1472 		default:
   1473 			break;
   1474 	}
   1475 
   1476 	put_table_entry(entry);
   1477 
   1478 	return result;
   1479 }
   1480 
   1481 TSS_RESULT RPC_GetCapabilitySigned(TSS_HCONTEXT tspContext,	/* in */
   1482 				   TCS_KEY_HANDLE keyHandle,	/* in */
   1483 				   TCPA_NONCE antiReplay,	/* in */
   1484 				   TCPA_CAPABILITY_AREA capArea,	/* in */
   1485 				   UINT32 subCapSize,	/* in */
   1486 				   BYTE * subCap,	/* in */
   1487 				   TPM_AUTH * privAuth,	/* in, out */
   1488 				   TCPA_VERSION * Version,	/* out */
   1489 				   UINT32 * respSize,	/* out */
   1490 				   BYTE ** resp,	/* out */
   1491 				   UINT32 * sigSize,	/* out */
   1492 				   BYTE ** sig)	/* out */
   1493 {
   1494 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   1495 	struct host_table_entry *entry = get_table_entry(tspContext);
   1496 
   1497 	if (entry == NULL)
   1498 		return TSPERR(TSS_E_NO_CONNECTION);
   1499 
   1500 	switch (entry->type) {
   1501 		case CONNECTION_TYPE_TCP_PERSISTANT:
   1502 			result = RPC_GetCapabilitySigned_TP(entry, keyHandle, antiReplay, capArea,
   1503 							    subCapSize, subCap, privAuth, Version,
   1504 							    respSize, resp, sigSize, sig);
   1505 			break;
   1506 		default:
   1507 			break;
   1508 	}
   1509 
   1510 	put_table_entry(entry);
   1511 
   1512 	return result;
   1513 }
   1514 
   1515 TSS_RESULT RPC_GetCapabilityOwner(TSS_HCONTEXT tspContext,	/* in */
   1516 				  TPM_AUTH * pOwnerAuth,	/* out */
   1517 				  TCPA_VERSION * pVersion,	/* out */
   1518 				  UINT32 * pNonVolatileFlags,	/* out */
   1519 				  UINT32 * pVolatileFlags)	/* out */
   1520 {
   1521 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   1522 	struct host_table_entry *entry = get_table_entry(tspContext);
   1523 
   1524 	if (entry == NULL)
   1525 		return TSPERR(TSS_E_NO_CONNECTION);
   1526 
   1527 	switch (entry->type) {
   1528 		case CONNECTION_TYPE_TCP_PERSISTANT:
   1529 			result = RPC_GetCapabilityOwner_TP(entry, pOwnerAuth, pVersion,
   1530 							   pNonVolatileFlags, pVolatileFlags);
   1531 			break;
   1532 		default:
   1533 			break;
   1534 	}
   1535 
   1536 	put_table_entry(entry);
   1537 
   1538 	return result;
   1539 }
   1540 
   1541 TSS_RESULT RPC_CreateEndorsementKeyPair(TSS_HCONTEXT tspContext,	/* in */
   1542 					TCPA_NONCE antiReplay,	/* in */
   1543 					UINT32 endorsementKeyInfoSize,	/* in */
   1544 					BYTE * endorsementKeyInfo,	/* in */
   1545 					UINT32 * endorsementKeySize,	/* out */
   1546 					BYTE ** endorsementKey,	/* out */
   1547 					TCPA_DIGEST * checksum)	/* out */
   1548 {
   1549 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   1550 	struct host_table_entry *entry = get_table_entry(tspContext);
   1551 
   1552 	if (entry == NULL)
   1553 		return TSPERR(TSS_E_NO_CONNECTION);
   1554 
   1555 	switch (entry->type) {
   1556 		case CONNECTION_TYPE_TCP_PERSISTANT:
   1557 			result = RPC_CreateEndorsementKeyPair_TP(entry, antiReplay,
   1558 								 endorsementKeyInfoSize,
   1559 								 endorsementKeyInfo,
   1560 								 endorsementKeySize,
   1561 								 endorsementKey, checksum);
   1562 			break;
   1563 		default:
   1564 			break;
   1565 	}
   1566 
   1567 	put_table_entry(entry);
   1568 
   1569 	return result;
   1570 }
   1571 
   1572 TSS_RESULT RPC_ReadPubek(TSS_HCONTEXT tspContext,	/* in */
   1573 			 TCPA_NONCE antiReplay,	/* in */
   1574 			 UINT32 * pubEndorsementKeySize,	/* out */
   1575 			 BYTE ** pubEndorsementKey,	/* out */
   1576 			 TCPA_DIGEST * checksum)	/* out */
   1577 {
   1578 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   1579 	struct host_table_entry *entry = get_table_entry(tspContext);
   1580 
   1581 	if (entry == NULL)
   1582 		return TSPERR(TSS_E_NO_CONNECTION);
   1583 
   1584 	switch (entry->type) {
   1585 		case CONNECTION_TYPE_TCP_PERSISTANT:
   1586 			result = RPC_ReadPubek_TP(entry, antiReplay, pubEndorsementKeySize,
   1587 						  pubEndorsementKey, checksum);
   1588 			break;
   1589 		default:
   1590 			break;
   1591 	}
   1592 
   1593 	put_table_entry(entry);
   1594 
   1595 	return result;
   1596 }
   1597 
   1598 TSS_RESULT RPC_DisablePubekRead(TSS_HCONTEXT tspContext,	/* in */
   1599 				TPM_AUTH * ownerAuth)	/* in, out */
   1600 {
   1601 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   1602 	struct host_table_entry *entry = get_table_entry(tspContext);
   1603 
   1604 	if (entry == NULL)
   1605 		return TSPERR(TSS_E_NO_CONNECTION);
   1606 
   1607 	switch (entry->type) {
   1608 		case CONNECTION_TYPE_TCP_PERSISTANT:
   1609 			result = RPC_DisablePubekRead_TP(entry, ownerAuth);
   1610 			break;
   1611 		default:
   1612 			break;
   1613 	}
   1614 
   1615 	put_table_entry(entry);
   1616 
   1617 	return result;
   1618 }
   1619 
   1620 TSS_RESULT RPC_OwnerReadPubek(TSS_HCONTEXT tspContext,	/* in */
   1621 			      TPM_AUTH * ownerAuth,	/* in, out */
   1622 			      UINT32 * pubEndorsementKeySize,	/* out */
   1623 			      BYTE ** pubEndorsementKey)	/* out */
   1624 {
   1625 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   1626 	struct host_table_entry *entry = get_table_entry(tspContext);
   1627 
   1628 	if (entry == NULL)
   1629 		return TSPERR(TSS_E_NO_CONNECTION);
   1630 
   1631 	switch (entry->type) {
   1632 		case CONNECTION_TYPE_TCP_PERSISTANT:
   1633 			result = RPC_OwnerReadPubek_TP(entry, ownerAuth, pubEndorsementKeySize,
   1634 						       pubEndorsementKey);
   1635 			break;
   1636 		default:
   1637 			break;
   1638 	}
   1639 
   1640 	put_table_entry(entry);
   1641 
   1642 	return result;
   1643 }
   1644 
   1645 #ifdef TSS_BUILD_TSS12
   1646 TSS_RESULT RPC_CreateRevocableEndorsementKeyPair(TSS_HCONTEXT tspContext,	/* in */
   1647 						 TPM_NONCE antiReplay,		/* in */
   1648 						 UINT32 endorsementKeyInfoSize,/* in */
   1649 						 BYTE * endorsementKeyInfo,	/* in */
   1650 						 TSS_BOOL genResetAuth,	/* in */
   1651 						 TPM_DIGEST * eKResetAuth,	/* in, out */
   1652 						 UINT32 * endorsementKeySize,	/* out */
   1653 						 BYTE ** endorsementKey,	/* out */
   1654 						 TPM_DIGEST * checksum)	/* out */
   1655 {
   1656 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   1657 	struct host_table_entry *entry = get_table_entry(tspContext);
   1658 
   1659 	if (entry == NULL)
   1660 		return TSPERR(TSS_E_NO_CONNECTION);
   1661 
   1662 	switch (entry->type) {
   1663 		case CONNECTION_TYPE_TCP_PERSISTANT:
   1664 			result = RPC_CreateRevocableEndorsementKeyPair_TP(entry, antiReplay,
   1665 									  endorsementKeyInfoSize,
   1666 									  endorsementKeyInfo,
   1667 									  genResetAuth,
   1668 									  eKResetAuth,
   1669 									  endorsementKeySize,
   1670 									  endorsementKey, checksum);
   1671 			break;
   1672 		default:
   1673 			break;
   1674 	}
   1675 
   1676 	put_table_entry(entry);
   1677 
   1678 	return result;
   1679 }
   1680 
   1681 TSS_RESULT RPC_RevokeEndorsementKeyPair(TSS_HCONTEXT tspContext,	/* in */
   1682 					TPM_DIGEST *EKResetAuth)	/* in */
   1683 {
   1684 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   1685 	struct host_table_entry *entry = get_table_entry(tspContext);
   1686 
   1687 	if (entry == NULL)
   1688 		return TSPERR(TSS_E_NO_CONNECTION);
   1689 
   1690 	switch (entry->type) {
   1691 		case CONNECTION_TYPE_TCP_PERSISTANT:
   1692 			result = RPC_RevokeEndorsementKeyPair_TP(entry, EKResetAuth);
   1693 			break;
   1694 		default:
   1695 			break;
   1696 	}
   1697 
   1698 	put_table_entry(entry);
   1699 
   1700 	return result;
   1701 }
   1702 #endif
   1703 
   1704 TSS_RESULT RPC_SelfTestFull(TSS_HCONTEXT tspContext)	/* in */
   1705 {
   1706 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   1707 	struct host_table_entry *entry = get_table_entry(tspContext);
   1708 
   1709 	if (entry == NULL)
   1710 		return TSPERR(TSS_E_NO_CONNECTION);
   1711 
   1712 	switch (entry->type) {
   1713 		case CONNECTION_TYPE_TCP_PERSISTANT:
   1714 			result = RPC_SelfTestFull_TP(entry);
   1715 			break;
   1716 		default:
   1717 			break;
   1718 	}
   1719 
   1720 	put_table_entry(entry);
   1721 
   1722 	return result;
   1723 }
   1724 
   1725 TSS_RESULT RPC_CertifySelfTest(TSS_HCONTEXT tspContext,	/* in */
   1726 			       TCS_KEY_HANDLE keyHandle,	/* in */
   1727 			       TCPA_NONCE antiReplay,	/* in */
   1728 			       TPM_AUTH * privAuth,	/* in, out */
   1729 			       UINT32 * sigSize,	/* out */
   1730 			       BYTE ** sig)	/* out */
   1731 {
   1732 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   1733 	struct host_table_entry *entry = get_table_entry(tspContext);
   1734 
   1735 	if (entry == NULL)
   1736 		return TSPERR(TSS_E_NO_CONNECTION);
   1737 
   1738 	switch (entry->type) {
   1739 		case CONNECTION_TYPE_TCP_PERSISTANT:
   1740 			result = RPC_CertifySelfTest_TP(entry, keyHandle, antiReplay, privAuth,
   1741 							sigSize, sig);
   1742 			break;
   1743 		default:
   1744 			break;
   1745 	}
   1746 
   1747 	put_table_entry(entry);
   1748 
   1749 	return result;
   1750 }
   1751 
   1752 TSS_RESULT RPC_GetTestResult(TSS_HCONTEXT tspContext,	/* in */
   1753 			     UINT32 * outDataSize,	/* out */
   1754 			     BYTE ** outData)	/* out */
   1755 {
   1756 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   1757 	struct host_table_entry *entry = get_table_entry(tspContext);
   1758 
   1759 	if (entry == NULL)
   1760 		return TSPERR(TSS_E_NO_CONNECTION);
   1761 
   1762 	switch (entry->type) {
   1763 		case CONNECTION_TYPE_TCP_PERSISTANT:
   1764 			result = RPC_GetTestResult_TP(entry, outDataSize, outData);
   1765 			break;
   1766 		default:
   1767 			break;
   1768 	}
   1769 
   1770 	put_table_entry(entry);
   1771 
   1772 	return result;
   1773 }
   1774 
   1775 TSS_RESULT RPC_OwnerSetDisable(TSS_HCONTEXT tspContext,	/* in */
   1776 			       TSS_BOOL disableState,	/* in */
   1777 			       TPM_AUTH * ownerAuth)	/* in, out */
   1778 {
   1779 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   1780 	struct host_table_entry *entry = get_table_entry(tspContext);
   1781 
   1782 	if (entry == NULL)
   1783 		return TSPERR(TSS_E_NO_CONNECTION);
   1784 
   1785 	switch (entry->type) {
   1786 		case CONNECTION_TYPE_TCP_PERSISTANT:
   1787 			result = RPC_OwnerSetDisable_TP(entry, disableState, ownerAuth);
   1788 			break;
   1789 		default:
   1790 			break;
   1791 	}
   1792 
   1793 	put_table_entry(entry);
   1794 
   1795 	return result;
   1796 }
   1797 
   1798 #ifdef TSS_BUILD_TSS12
   1799 TSS_RESULT RPC_ResetLockValue(TSS_HCONTEXT tspContext,	/* in */
   1800 			      TPM_AUTH * ownerAuth)	/* in, out */
   1801 {
   1802 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   1803 	struct host_table_entry *entry = get_table_entry(tspContext);
   1804 
   1805 	if (entry == NULL)
   1806 		return TSPERR(TSS_E_NO_CONNECTION);
   1807 
   1808 	switch (entry->type) {
   1809 		case CONNECTION_TYPE_TCP_PERSISTANT:
   1810 			result = RPC_ResetLockValue_TP(entry, ownerAuth);
   1811 			break;
   1812 		default:
   1813 			break;
   1814 	}
   1815 
   1816 	put_table_entry(entry);
   1817 
   1818 	return result;
   1819 }
   1820 #endif
   1821 
   1822 TSS_RESULT RPC_OwnerClear(TSS_HCONTEXT tspContext,	/* in */
   1823 			  TPM_AUTH * ownerAuth)	/* in, out */
   1824 {
   1825 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   1826 	struct host_table_entry *entry = get_table_entry(tspContext);
   1827 
   1828 	if (entry == NULL)
   1829 		return TSPERR(TSS_E_NO_CONNECTION);
   1830 
   1831 	switch (entry->type) {
   1832 		case CONNECTION_TYPE_TCP_PERSISTANT:
   1833 			result = RPC_OwnerClear_TP(entry, ownerAuth);
   1834 			break;
   1835 		default:
   1836 			break;
   1837 	}
   1838 
   1839 	put_table_entry(entry);
   1840 
   1841 	return result;
   1842 }
   1843 
   1844 TSS_RESULT RPC_DisableOwnerClear(TSS_HCONTEXT tspContext,	/* in */
   1845 				 TPM_AUTH * ownerAuth)	/* in, out */
   1846 {
   1847 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   1848 	struct host_table_entry *entry = get_table_entry(tspContext);
   1849 
   1850 	if (entry == NULL)
   1851 		return TSPERR(TSS_E_NO_CONNECTION);
   1852 
   1853 	switch (entry->type) {
   1854 		case CONNECTION_TYPE_TCP_PERSISTANT:
   1855 			result = RPC_DisableOwnerClear_TP(entry, ownerAuth);
   1856 			break;
   1857 		default:
   1858 			break;
   1859 	}
   1860 
   1861 	put_table_entry(entry);
   1862 
   1863 	return result;
   1864 }
   1865 
   1866 TSS_RESULT RPC_ForceClear(TSS_HCONTEXT tspContext)	/* in */
   1867 {
   1868 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   1869 	struct host_table_entry *entry = get_table_entry(tspContext);
   1870 
   1871 	if (entry == NULL)
   1872 		return TSPERR(TSS_E_NO_CONNECTION);
   1873 
   1874 	switch (entry->type) {
   1875 		case CONNECTION_TYPE_TCP_PERSISTANT:
   1876 			result = RPC_ForceClear_TP(entry);
   1877 			break;
   1878 		default:
   1879 			break;
   1880 	}
   1881 
   1882 	put_table_entry(entry);
   1883 
   1884 	return result;
   1885 }
   1886 
   1887 TSS_RESULT RPC_DisableForceClear(TSS_HCONTEXT tspContext)	/* in */
   1888 {
   1889 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   1890 	struct host_table_entry *entry = get_table_entry(tspContext);
   1891 
   1892 	if (entry == NULL)
   1893 		return TSPERR(TSS_E_NO_CONNECTION);
   1894 
   1895 	switch (entry->type) {
   1896 		case CONNECTION_TYPE_TCP_PERSISTANT:
   1897 			result = RPC_DisableForceClear_TP(entry);
   1898 			break;
   1899 		default:
   1900 			break;
   1901 	}
   1902 
   1903 	put_table_entry(entry);
   1904 
   1905 	return result;
   1906 }
   1907 
   1908 TSS_RESULT RPC_PhysicalDisable(TSS_HCONTEXT tspContext)	/* in */
   1909 {
   1910 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   1911 	struct host_table_entry *entry = get_table_entry(tspContext);
   1912 
   1913 	if (entry == NULL)
   1914 		return TSPERR(TSS_E_NO_CONNECTION);
   1915 
   1916 	switch (entry->type) {
   1917 		case CONNECTION_TYPE_TCP_PERSISTANT:
   1918 			result = RPC_PhysicalDisable_TP(entry);
   1919 			break;
   1920 		default:
   1921 			break;
   1922 	}
   1923 
   1924 	put_table_entry(entry);
   1925 
   1926 	return result;
   1927 }
   1928 
   1929 TSS_RESULT RPC_PhysicalEnable(TSS_HCONTEXT tspContext)	/* in */
   1930 {
   1931 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   1932 	struct host_table_entry *entry = get_table_entry(tspContext);
   1933 
   1934 	if (entry == NULL)
   1935 		return TSPERR(TSS_E_NO_CONNECTION);
   1936 
   1937 	switch (entry->type) {
   1938 		case CONNECTION_TYPE_TCP_PERSISTANT:
   1939 			result = RPC_PhysicalEnable_TP(entry);
   1940 			break;
   1941 		default:
   1942 			break;
   1943 	}
   1944 
   1945 	put_table_entry(entry);
   1946 
   1947 	return result;
   1948 }
   1949 
   1950 TSS_RESULT RPC_PhysicalSetDeactivated(TSS_HCONTEXT tspContext,	/* in */
   1951 				      TSS_BOOL state)	/* in */
   1952 {
   1953 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   1954 	struct host_table_entry *entry = get_table_entry(tspContext);
   1955 
   1956 	if (entry == NULL)
   1957 		return TSPERR(TSS_E_NO_CONNECTION);
   1958 
   1959 	switch (entry->type) {
   1960 		case CONNECTION_TYPE_TCP_PERSISTANT:
   1961 			result = RPC_PhysicalSetDeactivated_TP(entry, state);
   1962 			break;
   1963 		default:
   1964 			break;
   1965 	}
   1966 
   1967 	put_table_entry(entry);
   1968 
   1969 	return result;
   1970 }
   1971 
   1972 TSS_RESULT RPC_PhysicalPresence(TSS_HCONTEXT tspContext,	/* in */
   1973 				TCPA_PHYSICAL_PRESENCE fPhysicalPresence)	/* in */
   1974 {
   1975 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   1976 	struct host_table_entry *entry = get_table_entry(tspContext);
   1977 
   1978 	if (entry == NULL)
   1979 		return TSPERR(TSS_E_NO_CONNECTION);
   1980 
   1981 	switch (entry->type) {
   1982 		case CONNECTION_TYPE_TCP_PERSISTANT:
   1983 			result = RPC_PhysicalPresence_TP(entry, fPhysicalPresence);
   1984 			break;
   1985 		default:
   1986 			break;
   1987 	}
   1988 
   1989 	put_table_entry(entry);
   1990 
   1991 	return result;
   1992 }
   1993 
   1994 TSS_RESULT RPC_SetTempDeactivated(TSS_HCONTEXT tspContext)	/* in */
   1995 {
   1996 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   1997 	struct host_table_entry *entry = get_table_entry(tspContext);
   1998 
   1999 	if (entry == NULL)
   2000 		return TSPERR(TSS_E_NO_CONNECTION);
   2001 
   2002 	switch (entry->type) {
   2003 		case CONNECTION_TYPE_TCP_PERSISTANT:
   2004 			result = RPC_SetTempDeactivated_TP(entry);
   2005 			break;
   2006 		default:
   2007 			break;
   2008 	}
   2009 
   2010 	put_table_entry(entry);
   2011 
   2012 	return result;
   2013 }
   2014 
   2015 #ifdef TSS_BUILD_TSS12
   2016 TSS_RESULT RPC_SetTempDeactivated2(TSS_HCONTEXT tspContext,	/* in */
   2017 				   TPM_AUTH *operatorAuth)	/* in, out */
   2018 {
   2019 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   2020 	struct host_table_entry *entry = get_table_entry(tspContext);
   2021 
   2022 	if (entry == NULL)
   2023 		return TSPERR(TSS_E_NO_CONNECTION);
   2024 
   2025 	switch (entry->type) {
   2026 		case CONNECTION_TYPE_TCP_PERSISTANT:
   2027 			result = RPC_SetTempDeactivated2_TP(entry, operatorAuth);
   2028 			break;
   2029 		default:
   2030 			break;
   2031 	}
   2032 
   2033 	put_table_entry(entry);
   2034 
   2035 	return result;
   2036 }
   2037 #endif
   2038 
   2039 TSS_RESULT RPC_FieldUpgrade(TSS_HCONTEXT tspContext,	/* in */
   2040 			    UINT32 dataInSize,	/* in */
   2041 			    BYTE * dataIn,	/* in */
   2042 			    UINT32 * dataOutSize,	/* out */
   2043 			    BYTE ** dataOut,	/* out */
   2044 			    TPM_AUTH * ownerAuth)	/* in, out */
   2045 {
   2046 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   2047 	struct host_table_entry *entry = get_table_entry(tspContext);
   2048 
   2049 	if (entry == NULL)
   2050 		return TSPERR(TSS_E_NO_CONNECTION);
   2051 
   2052 	switch (entry->type) {
   2053 		case CONNECTION_TYPE_TCP_PERSISTANT:
   2054 			result = (UINT32) TSPERR(TSS_E_INTERNAL_ERROR);
   2055 			break;
   2056 		default:
   2057 			break;
   2058 	}
   2059 
   2060 	put_table_entry(entry);
   2061 
   2062 	return result;
   2063 }
   2064 
   2065 TSS_RESULT RPC_SetRedirection(TSS_HCONTEXT tspContext,	/* in */
   2066 			      TCS_KEY_HANDLE keyHandle,	/* in */
   2067 			      UINT32 c1,	/* in */
   2068 			      UINT32 c2,	/* in */
   2069 			      TPM_AUTH * privAuth)	/* in, out */
   2070 {
   2071 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   2072 	struct host_table_entry *entry = get_table_entry(tspContext);
   2073 
   2074 	if (entry == NULL)
   2075 		return TSPERR(TSS_E_NO_CONNECTION);
   2076 
   2077 	switch (entry->type) {
   2078 		case CONNECTION_TYPE_TCP_PERSISTANT:
   2079 			result = (UINT32) TSPERR(TSS_E_INTERNAL_ERROR);
   2080 			break;
   2081 		default:
   2082 			break;
   2083 	}
   2084 
   2085 	put_table_entry(entry);
   2086 
   2087 	return result;
   2088 }
   2089 
   2090 TSS_RESULT RPC_CreateMaintenanceArchive(TSS_HCONTEXT tspContext,	/* in */
   2091 					TSS_BOOL generateRandom,	/* in */
   2092 					TPM_AUTH * ownerAuth,	/* in, out */
   2093 					UINT32 * randomSize,	/* out */
   2094 					BYTE ** random,	/* out */
   2095 					UINT32 * archiveSize,	/* out */
   2096 					BYTE ** archive)	/* out */
   2097 {
   2098 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   2099 	struct host_table_entry *entry = get_table_entry(tspContext);
   2100 
   2101 	if (entry == NULL)
   2102 		return TSPERR(TSS_E_NO_CONNECTION);
   2103 
   2104 	switch (entry->type) {
   2105 		case CONNECTION_TYPE_TCP_PERSISTANT:
   2106 			result = RPC_CreateMaintenanceArchive_TP(entry, generateRandom, ownerAuth,
   2107 								 randomSize, random, archiveSize,
   2108 								 archive);
   2109 			break;
   2110 		default:
   2111 			break;
   2112 	}
   2113 
   2114 	put_table_entry(entry);
   2115 
   2116 	return result;
   2117 }
   2118 
   2119 TSS_RESULT RPC_LoadMaintenanceArchive(TSS_HCONTEXT tspContext,	/* in */
   2120 				      UINT32 dataInSize,	/* in */
   2121 				      BYTE * dataIn, /* in */
   2122 				      TPM_AUTH * ownerAuth,	/* in, out */
   2123 				      UINT32 * dataOutSize,	/* out */
   2124 				      BYTE ** dataOut)	/* out */
   2125 {
   2126 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   2127 	struct host_table_entry *entry = get_table_entry(tspContext);
   2128 
   2129 	if (entry == NULL)
   2130 		return TSPERR(TSS_E_NO_CONNECTION);
   2131 
   2132 	switch (entry->type) {
   2133 		case CONNECTION_TYPE_TCP_PERSISTANT:
   2134 			result = RPC_LoadMaintenanceArchive_TP(entry, dataInSize, dataIn, ownerAuth,
   2135 							       dataOutSize, dataOut);
   2136 			break;
   2137 		default:
   2138 			break;
   2139 	}
   2140 
   2141 	put_table_entry(entry);
   2142 
   2143 	return result;
   2144 }
   2145 
   2146 TSS_RESULT RPC_KillMaintenanceFeature(TSS_HCONTEXT tspContext,	/* in */
   2147 				      TPM_AUTH * ownerAuth)	/* in, out */
   2148 {
   2149 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   2150 	struct host_table_entry *entry = get_table_entry(tspContext);
   2151 
   2152 	if (entry == NULL)
   2153 		return TSPERR(TSS_E_NO_CONNECTION);
   2154 
   2155 	switch (entry->type) {
   2156 		case CONNECTION_TYPE_TCP_PERSISTANT:
   2157 			result = RPC_KillMaintenanceFeature_TP(entry, ownerAuth);
   2158 			break;
   2159 		default:
   2160 			break;
   2161 	}
   2162 
   2163 	put_table_entry(entry);
   2164 
   2165 	return result;
   2166 }
   2167 
   2168 TSS_RESULT RPC_LoadManuMaintPub(TSS_HCONTEXT tspContext,	/* in */
   2169 				TCPA_NONCE antiReplay,	/* in */
   2170 				UINT32 PubKeySize,	/* in */
   2171 				BYTE * PubKey,	/* in */
   2172 				TCPA_DIGEST * checksum)	/* out */
   2173 {
   2174 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   2175 	struct host_table_entry *entry = get_table_entry(tspContext);
   2176 
   2177 	if (entry == NULL)
   2178 		return TSPERR(TSS_E_NO_CONNECTION);
   2179 
   2180 	switch (entry->type) {
   2181 		case CONNECTION_TYPE_TCP_PERSISTANT:
   2182 			result = RPC_LoadManuMaintPub_TP(entry, antiReplay, PubKeySize, PubKey,
   2183 							 checksum);
   2184 			break;
   2185 		default:
   2186 			break;
   2187 	}
   2188 
   2189 	put_table_entry(entry);
   2190 
   2191 	return result;
   2192 }
   2193 
   2194 TSS_RESULT RPC_ReadManuMaintPub(TSS_HCONTEXT tspContext,	/* in */
   2195 				TCPA_NONCE antiReplay,	/* in */
   2196 				TCPA_DIGEST * checksum)	/* out */
   2197 {
   2198 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   2199 	struct host_table_entry *entry = get_table_entry(tspContext);
   2200 
   2201 	if (entry == NULL)
   2202 		return TSPERR(TSS_E_NO_CONNECTION);
   2203 
   2204 	switch (entry->type) {
   2205 		case CONNECTION_TYPE_TCP_PERSISTANT:
   2206 			result = RPC_ReadManuMaintPub_TP(entry, antiReplay, checksum);
   2207 			break;
   2208 		default:
   2209 			break;
   2210 	}
   2211 
   2212 	put_table_entry(entry);
   2213 
   2214 	return result;
   2215 }
   2216 
   2217 #ifdef TSS_BUILD_DAA
   2218 TSS_RESULT
   2219 RPC_DaaJoin(TSS_HCONTEXT tspContext,	/* in */
   2220 	    TPM_HANDLE daa_session,		/* in */
   2221 	    BYTE stage,			/* in */
   2222 	    UINT32 inputSize0,			/* in */
   2223 	    BYTE* inputData0,			/* in */
   2224 	    UINT32 inputSize1,			/* in */
   2225 	    BYTE* inputData1,			/* in */
   2226 	    TPM_AUTH* ownerAuth,		/* in, out */
   2227 	    UINT32* outputSize,		/* out */
   2228 	    BYTE** outputData)			/* out */
   2229 {
   2230 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   2231 	struct host_table_entry *entry = get_table_entry(tspContext);
   2232 
   2233 	if (entry == NULL)
   2234 		return TSPERR(TSS_E_NO_CONNECTION);
   2235 
   2236 	switch (entry->type) {
   2237 		case CONNECTION_TYPE_TCP_PERSISTANT:
   2238 			result = RPC_DaaJoin_TP(entry, daa_session, stage, inputSize0, inputData0,
   2239 						inputSize1, inputData1, ownerAuth, outputSize,
   2240 						outputData);
   2241 			break;
   2242 		default:
   2243 			break;
   2244 	}
   2245 
   2246 	put_table_entry(entry);
   2247 
   2248 	return result;
   2249 
   2250 }
   2251 
   2252 TSS_RESULT
   2253 RPC_DaaSign(TSS_HCONTEXT tspContext,	/* in */
   2254 	    TPM_HANDLE daa_session,		/* in */
   2255 	    BYTE stage,			/* in */
   2256 	    UINT32 inputSize0,			/* in */
   2257 	    BYTE* inputData0,			/* in */
   2258 	    UINT32 inputSize1,			/* in */
   2259 	    BYTE* inputData1,			/* in */
   2260 	    TPM_AUTH* ownerAuth,		/* in, out */
   2261 	    UINT32* outputSize,		/* out */
   2262 	    BYTE** outputData)			/* out */
   2263 {
   2264 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   2265 	struct host_table_entry *entry = get_table_entry(tspContext);
   2266 
   2267 	if (entry == NULL)
   2268 		return TSPERR(TSS_E_NO_CONNECTION);
   2269 
   2270 	switch (entry->type) {
   2271 		case CONNECTION_TYPE_TCP_PERSISTANT:
   2272 			result = RPC_DaaSign_TP(entry, daa_session, stage, inputSize0, inputData0,
   2273 						inputSize1, inputData1, ownerAuth, outputSize,
   2274 						outputData);
   2275 			break;
   2276 		default:
   2277 			break;
   2278 	}
   2279 
   2280 	put_table_entry(entry);
   2281 
   2282 	return result;
   2283 }
   2284 #endif
   2285 
   2286 #ifdef TSS_BUILD_COUNTER
   2287 TSS_RESULT
   2288 RPC_ReadCounter(TSS_HCONTEXT       tspContext,		/* in */
   2289 		TSS_COUNTER_ID     idCounter,		/* in */
   2290 		TPM_COUNTER_VALUE* counterValue)	/* out */
   2291 {
   2292 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   2293 	struct host_table_entry *entry = get_table_entry(tspContext);
   2294 
   2295 	if (entry == NULL)
   2296 		return TSPERR(TSS_E_NO_CONNECTION);
   2297 
   2298 	switch (entry->type) {
   2299 		case CONNECTION_TYPE_TCP_PERSISTANT:
   2300 			result = RPC_ReadCounter_TP(entry, idCounter, counterValue);
   2301 			break;
   2302 		default:
   2303 			break;
   2304 	}
   2305 
   2306 	put_table_entry(entry);
   2307 
   2308 	return result;
   2309 }
   2310 
   2311 TSS_RESULT
   2312 RPC_CreateCounter(TSS_HCONTEXT       tspContext,	/* in */
   2313 		  UINT32             LabelSize,	/* in (=4) */
   2314 		  BYTE*              pLabel,		/* in */
   2315 		  TPM_ENCAUTH        CounterAuth,	/* in */
   2316 		  TPM_AUTH*          pOwnerAuth,	/* in, out */
   2317 		  TSS_COUNTER_ID*    idCounter,	/* out */
   2318 		  TPM_COUNTER_VALUE* counterValue)	/* out */
   2319 {
   2320 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   2321 	struct host_table_entry *entry = get_table_entry(tspContext);
   2322 
   2323 	if (entry == NULL)
   2324 		return TSPERR(TSS_E_NO_CONNECTION);
   2325 
   2326 	switch (entry->type) {
   2327 		case CONNECTION_TYPE_TCP_PERSISTANT:
   2328 			result = RPC_CreateCounter_TP(entry, LabelSize, pLabel, CounterAuth,
   2329 						      pOwnerAuth, idCounter, counterValue);
   2330 			break;
   2331 		default:
   2332 			break;
   2333 	}
   2334 
   2335 	put_table_entry(entry);
   2336 
   2337 	return result;
   2338 }
   2339 
   2340 TSS_RESULT
   2341 RPC_IncrementCounter(TSS_HCONTEXT       tspContext,	/* in */
   2342 		     TSS_COUNTER_ID     idCounter,	/* in */
   2343 		     TPM_AUTH*          pCounterAuth,	/* in, out */
   2344 		     TPM_COUNTER_VALUE* counterValue)	/* out */
   2345 {
   2346 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   2347 	struct host_table_entry *entry = get_table_entry(tspContext);
   2348 
   2349 	if (entry == NULL)
   2350 		return TSPERR(TSS_E_NO_CONNECTION);
   2351 
   2352 	switch (entry->type) {
   2353 		case CONNECTION_TYPE_TCP_PERSISTANT:
   2354 			result = RPC_IncrementCounter_TP(entry, idCounter, pCounterAuth,
   2355 							 counterValue);
   2356 			break;
   2357 		default:
   2358 			break;
   2359 	}
   2360 
   2361 	put_table_entry(entry);
   2362 
   2363 	return result;
   2364 }
   2365 
   2366 TSS_RESULT
   2367 RPC_ReleaseCounter(TSS_HCONTEXT   tspContext,		/* in */
   2368 		   TSS_COUNTER_ID idCounter,		/* in */
   2369 		   TPM_AUTH*      pCounterAuth)	/* in, out */
   2370 {
   2371 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   2372 	struct host_table_entry *entry = get_table_entry(tspContext);
   2373 
   2374 	if (entry == NULL)
   2375 		return TSPERR(TSS_E_NO_CONNECTION);
   2376 
   2377 	switch (entry->type) {
   2378 		case CONNECTION_TYPE_TCP_PERSISTANT:
   2379 			result = RPC_ReleaseCounter_TP(entry, idCounter, pCounterAuth);
   2380 			break;
   2381 		default:
   2382 			break;
   2383 	}
   2384 
   2385 	put_table_entry(entry);
   2386 
   2387 	return result;
   2388 }
   2389 
   2390 TSS_RESULT
   2391 RPC_ReleaseCounterOwner(TSS_HCONTEXT   tspContext,	/* in */
   2392 			TSS_COUNTER_ID idCounter,	/* in */
   2393 			TPM_AUTH*      pOwnerAuth)	/* in, out */
   2394 {
   2395 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   2396 	struct host_table_entry *entry = get_table_entry(tspContext);
   2397 
   2398 	if (entry == NULL)
   2399 		return TSPERR(TSS_E_NO_CONNECTION);
   2400 
   2401 	switch (entry->type) {
   2402 		case CONNECTION_TYPE_TCP_PERSISTANT:
   2403 			result = RPC_ReleaseCounterOwner_TP(entry, idCounter, pOwnerAuth);
   2404 			break;
   2405 		default:
   2406 			break;
   2407 	}
   2408 
   2409 	put_table_entry(entry);
   2410 
   2411 	return result;
   2412 }
   2413 #endif
   2414 
   2415 #ifdef TSS_BUILD_TICK
   2416 TSS_RESULT
   2417 RPC_ReadCurrentTicks(TSS_HCONTEXT tspContext,		/* in */
   2418 		     UINT32*      pulCurrentTime,	/* out */
   2419 		     BYTE**       prgbCurrentTime)	/* out */
   2420 {
   2421 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   2422 	struct host_table_entry *entry = get_table_entry(tspContext);
   2423 
   2424 	if (entry == NULL)
   2425 		return TSPERR(TSS_E_NO_CONNECTION);
   2426 
   2427 	switch (entry->type) {
   2428 		case CONNECTION_TYPE_TCP_PERSISTANT:
   2429 			result = RPC_ReadCurrentTicks_TP(entry, pulCurrentTime, prgbCurrentTime);
   2430 			break;
   2431 		default:
   2432 			break;
   2433 	}
   2434 
   2435 	put_table_entry(entry);
   2436 
   2437 	return result;
   2438 }
   2439 
   2440 TSS_RESULT
   2441 RPC_TickStampBlob(TSS_HCONTEXT   tspContext,		/* in */
   2442 		  TCS_KEY_HANDLE hKey,			/* in */
   2443 		  TPM_NONCE*     antiReplay,		/* in */
   2444 		  TPM_DIGEST*    digestToStamp,	/* in */
   2445 		  TPM_AUTH*      privAuth,		/* in, out */
   2446 		  UINT32*        pulSignatureLength,	/* out */
   2447 		  BYTE**         prgbSignature,	/* out */
   2448 		  UINT32*        pulTickCountLength,	/* out */
   2449 		  BYTE**         prgbTickCount)	/* out */
   2450 {
   2451 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   2452 	struct host_table_entry *entry = get_table_entry(tspContext);
   2453 
   2454 	if (entry == NULL)
   2455 		return TSPERR(TSS_E_NO_CONNECTION);
   2456 
   2457 	switch (entry->type) {
   2458 		case CONNECTION_TYPE_TCP_PERSISTANT:
   2459 			result = RPC_TickStampBlob_TP(entry, hKey, antiReplay, digestToStamp,
   2460 						      privAuth, pulSignatureLength,
   2461 						      prgbSignature, pulTickCountLength,
   2462 						      prgbTickCount);
   2463 			break;
   2464 		default:
   2465 			break;
   2466 	}
   2467 
   2468 	put_table_entry(entry);
   2469 
   2470 	return result;
   2471 }
   2472 #endif
   2473 
   2474 #ifdef TSS_BUILD_TRANSPORT
   2475 TSS_RESULT
   2476 RPC_EstablishTransport(TSS_HCONTEXT            tspContext,
   2477 		       UINT32                  ulTransControlFlags,
   2478 		       TCS_KEY_HANDLE          hEncKey,
   2479 		       UINT32                  ulTransSessionInfoSize,
   2480 		       BYTE*                   rgbTransSessionInfo,
   2481 		       UINT32                  ulSecretSize,
   2482 		       BYTE*                   rgbSecret,
   2483 		       TPM_AUTH*               pEncKeyAuth,		/* in, out */
   2484 		       TPM_MODIFIER_INDICATOR* pbLocality,
   2485 		       TCS_HANDLE*             hTransSession,
   2486 		       UINT32*                 ulCurrentTicksSize,
   2487 		       BYTE**                  prgbCurrentTicks,
   2488 		       TPM_NONCE*              pTransNonce)
   2489 {
   2490 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   2491 	struct host_table_entry *entry = get_table_entry(tspContext);
   2492 
   2493 	if (entry == NULL)
   2494 		return TSPERR(TSS_E_NO_CONNECTION);
   2495 
   2496 	switch (entry->type) {
   2497 		case CONNECTION_TYPE_TCP_PERSISTANT:
   2498 			result = RPC_EstablishTransport_TP(entry, ulTransControlFlags, hEncKey,
   2499 							   ulTransSessionInfoSize,
   2500 							   rgbTransSessionInfo, ulSecretSize,
   2501 							   rgbSecret, pEncKeyAuth, pbLocality,
   2502 							   hTransSession, ulCurrentTicksSize,
   2503 							   prgbCurrentTicks, pTransNonce);
   2504 			break;
   2505 		default:
   2506 			break;
   2507 	}
   2508 
   2509 	put_table_entry(entry);
   2510 
   2511 	return result;
   2512 }
   2513 
   2514 
   2515 TSS_RESULT
   2516 RPC_ExecuteTransport(TSS_HCONTEXT            tspContext,
   2517 		     TPM_COMMAND_CODE        unWrappedCommandOrdinal,
   2518 		     UINT32                  ulWrappedCmdParamInSize,
   2519 		     BYTE*                   rgbWrappedCmdParamIn,
   2520 		     UINT32*                 pulHandleListSize,	/* in, out */
   2521 		     TCS_HANDLE**            rghHandles,		/* in, out */
   2522 		     TPM_AUTH*               pWrappedCmdAuth1,		/* in, out */
   2523 		     TPM_AUTH*               pWrappedCmdAuth2,		/* in, out */
   2524 		     TPM_AUTH*               pTransAuth,		/* in, out */
   2525 		     UINT64*                 punCurrentTicks,
   2526 		     TPM_MODIFIER_INDICATOR* pbLocality,
   2527 		     TPM_RESULT*             pulWrappedCmdReturnCode,
   2528 		     UINT32*                 ulWrappedCmdParamOutSize,
   2529 		     BYTE**                  rgbWrappedCmdParamOut)
   2530 {
   2531 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   2532 	struct host_table_entry *entry = get_table_entry(tspContext);
   2533 
   2534 	if (entry == NULL)
   2535 		return TSPERR(TSS_E_NO_CONNECTION);
   2536 
   2537 	switch (entry->type) {
   2538 		case CONNECTION_TYPE_TCP_PERSISTANT:
   2539 			result = RPC_ExecuteTransport_TP(entry, unWrappedCommandOrdinal,
   2540 							 ulWrappedCmdParamInSize,
   2541 							 rgbWrappedCmdParamIn, pulHandleListSize,
   2542 							 rghHandles, pWrappedCmdAuth1,
   2543 							 pWrappedCmdAuth2, pTransAuth,
   2544 							 punCurrentTicks, pbLocality,
   2545 							 pulWrappedCmdReturnCode,
   2546 							 ulWrappedCmdParamOutSize,
   2547 							 rgbWrappedCmdParamOut);
   2548 			break;
   2549 		default:
   2550 			break;
   2551 	}
   2552 
   2553 	put_table_entry(entry);
   2554 
   2555 	return result;
   2556 }
   2557 
   2558 TSS_RESULT
   2559 RPC_ReleaseTransportSigned(TSS_HCONTEXT            tspContext,
   2560 			   TCS_KEY_HANDLE          hSignatureKey,
   2561 			   TPM_NONCE*              AntiReplayNonce,
   2562 			   TPM_AUTH*               pKeyAuth,		/* in, out */
   2563 			   TPM_AUTH*               pTransAuth,		/* in, out */
   2564 			   TPM_MODIFIER_INDICATOR* pbLocality,
   2565 			   UINT32*                 pulCurrentTicksSize,
   2566 			   BYTE**                  prgbCurrentTicks,
   2567 			   UINT32*                 pulSignatureSize,
   2568 			   BYTE**                  prgbSignature)
   2569 {
   2570 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   2571 	struct host_table_entry *entry = get_table_entry(tspContext);
   2572 
   2573 	if (entry == NULL)
   2574 		return TSPERR(TSS_E_NO_CONNECTION);
   2575 
   2576 	switch (entry->type) {
   2577 		case CONNECTION_TYPE_TCP_PERSISTANT:
   2578 			result = RPC_ReleaseTransportSigned_TP(entry, hSignatureKey,
   2579 							       AntiReplayNonce, pKeyAuth,
   2580 							       pTransAuth, pbLocality,
   2581 							       pulCurrentTicksSize,
   2582 							       prgbCurrentTicks, pulSignatureSize,
   2583 							       prgbSignature);
   2584 			break;
   2585 		default:
   2586 			break;
   2587 	}
   2588 
   2589 	put_table_entry(entry);
   2590 
   2591 	return result;
   2592 }
   2593 #endif
   2594 
   2595 #ifdef TSS_BUILD_NV
   2596 TSS_RESULT
   2597 RPC_NV_DefineOrReleaseSpace(TSS_HCONTEXT hContext,	/* in */
   2598 			    UINT32 cPubInfoSize,	/* in */
   2599 			    BYTE* pPubInfo,		/* in */
   2600 			    TCPA_ENCAUTH encAuth,	/* in */
   2601 			    TPM_AUTH* pAuth)		/* in, out */
   2602 {
   2603 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   2604 	struct host_table_entry *entry = get_table_entry(hContext);
   2605 
   2606 	if (entry == NULL)
   2607 		return TSPERR(TSS_E_NO_CONNECTION);
   2608 
   2609 	switch (entry->type) {
   2610 		case CONNECTION_TYPE_TCP_PERSISTANT:
   2611 			result = RPC_NV_DefineOrReleaseSpace_TP(entry, cPubInfoSize, pPubInfo,
   2612 								encAuth, pAuth);
   2613 			break;
   2614 		default:
   2615 			break;
   2616 	}
   2617 
   2618 	put_table_entry(entry);
   2619 
   2620 	return result;
   2621 }
   2622 
   2623 TSS_RESULT
   2624 RPC_NV_WriteValue(TSS_HCONTEXT hContext,	/* in */
   2625 		  TSS_NV_INDEX hNVStore,	/* in */
   2626 		  UINT32 offset,		/* in */
   2627 		  UINT32 ulDataLength,		/* in */
   2628 		  BYTE* rgbDataToWrite,	/* in */
   2629 		  TPM_AUTH* privAuth)		/* in, out */
   2630 {
   2631 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   2632 	struct host_table_entry *entry = get_table_entry(hContext);
   2633 
   2634 	if (entry == NULL)
   2635 		return TSPERR(TSS_E_NO_CONNECTION);
   2636 
   2637 	switch (entry->type) {
   2638 		case CONNECTION_TYPE_TCP_PERSISTANT:
   2639 			result = RPC_NV_WriteValue_TP(entry, hNVStore, offset, ulDataLength,
   2640 						      rgbDataToWrite, privAuth);
   2641 			break;
   2642 		default:
   2643 			break;
   2644 	}
   2645 
   2646 	put_table_entry(entry);
   2647 
   2648 	return result;
   2649 }
   2650 
   2651 
   2652 TSS_RESULT
   2653 RPC_NV_WriteValueAuth(TSS_HCONTEXT hContext,	/* in */
   2654 		      TSS_NV_INDEX hNVStore,		/* in */
   2655 		      UINT32 offset,			/* in */
   2656 		      UINT32 ulDataLength,		/* in */
   2657 		      BYTE* rgbDataToWrite,		/* in */
   2658 		      TPM_AUTH* NVAuth)		/* in, out */
   2659 {
   2660 
   2661 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   2662 	struct host_table_entry *entry = get_table_entry(hContext);
   2663 
   2664 	if (entry == NULL)
   2665 		return TSPERR(TSS_E_NO_CONNECTION);
   2666 
   2667 	switch (entry->type) {
   2668 		case CONNECTION_TYPE_TCP_PERSISTANT:
   2669 			result = RPC_NV_WriteValueAuth_TP(entry, hNVStore, offset, ulDataLength,
   2670 							  rgbDataToWrite, NVAuth);
   2671 			break;
   2672 		default:
   2673 			break;
   2674 	}
   2675 
   2676 	put_table_entry(entry);
   2677 
   2678 	return result;
   2679 }
   2680 
   2681 
   2682 TSS_RESULT
   2683 RPC_NV_ReadValue(TSS_HCONTEXT hContext,	/* in */
   2684 		 TSS_NV_INDEX hNVStore,	/* in */
   2685 		 UINT32 offset,		/* in */
   2686 		 UINT32* pulDataLength,	/* in, out */
   2687 		 TPM_AUTH* privAuth,		/* in, out */
   2688 		 BYTE** rgbDataRead)		/* out */
   2689 {
   2690 
   2691 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   2692 	struct host_table_entry *entry = get_table_entry(hContext);
   2693 
   2694 	if (entry == NULL)
   2695 		return TSPERR(TSS_E_NO_CONNECTION);
   2696 
   2697 	switch (entry->type) {
   2698 		case CONNECTION_TYPE_TCP_PERSISTANT:
   2699 			result = RPC_NV_ReadValue_TP(entry, hNVStore, offset, pulDataLength,
   2700 						     privAuth, rgbDataRead);
   2701 			break;
   2702 		default:
   2703 			break;
   2704 	}
   2705 
   2706 	put_table_entry(entry);
   2707 
   2708 	return result;
   2709 }
   2710 
   2711 TSS_RESULT
   2712 RPC_NV_ReadValueAuth(TSS_HCONTEXT hContext,	/* in */
   2713 		     TSS_NV_INDEX hNVStore,    /* in */
   2714 		     UINT32 offset,		/* in */
   2715 		     UINT32* pulDataLength,    /* in, out */
   2716 		     TPM_AUTH* NVAuth,		/* in, out */
   2717 		     BYTE** rgbDataRead)       /* out */
   2718 {
   2719 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   2720 	struct host_table_entry *entry = get_table_entry(hContext);
   2721 
   2722 	if (entry == NULL)
   2723 		return TSPERR(TSS_E_NO_CONNECTION);
   2724 
   2725 	switch (entry->type) {
   2726 		case CONNECTION_TYPE_TCP_PERSISTANT:
   2727 			result = RPC_NV_ReadValueAuth_TP(entry, hNVStore, offset, pulDataLength,
   2728 							 NVAuth, rgbDataRead);
   2729 			break;
   2730 		default:
   2731 			break;
   2732 	}
   2733 
   2734 	put_table_entry(entry);
   2735 
   2736 	return result;
   2737 }
   2738 #endif
   2739 
   2740 #ifdef TSS_BUILD_AUDIT
   2741 TSS_RESULT
   2742 RPC_SetOrdinalAuditStatus(TSS_HCONTEXT hContext,	/* in */
   2743 			  TPM_AUTH *ownerAuth,		/* in/out */
   2744 			  UINT32 ulOrdinal,		/* in */
   2745 			  TSS_BOOL bAuditState)	/* in */
   2746 {
   2747 	TSS_RESULT result = TSS_SUCCESS;
   2748 	struct host_table_entry *entry = get_table_entry(hContext);
   2749 
   2750 	if (entry == NULL)
   2751 		return TSPERR(TSS_E_NO_CONNECTION);
   2752 
   2753 	switch (entry->type) {
   2754 		case CONNECTION_TYPE_TCP_PERSISTANT:
   2755 			result = RPC_SetOrdinalAuditStatus_TP(entry, ownerAuth, ulOrdinal,
   2756 							      bAuditState);
   2757 			break;
   2758 		default:
   2759 			break;
   2760 	}
   2761 
   2762 	put_table_entry(entry);
   2763 
   2764 	return result;
   2765 }
   2766 
   2767 TSS_RESULT
   2768 RPC_GetAuditDigest(TSS_HCONTEXT hContext,	/* in */
   2769 		   UINT32 startOrdinal,		/* in */
   2770 		   TPM_DIGEST *auditDigest,		/* out */
   2771 		   UINT32 *counterValueSize,		/* out */
   2772 		   BYTE **counterValue,		/* out */
   2773 		   TSS_BOOL *more,			/* out */
   2774 		   UINT32 *ordSize,			/* out */
   2775 		   UINT32 **ordList)			/* out */
   2776 {
   2777 	TSS_RESULT result = TSS_SUCCESS;
   2778 	struct host_table_entry *entry = get_table_entry(hContext);
   2779 
   2780 	if (entry == NULL)
   2781 		return TSPERR(TSS_E_NO_CONNECTION);
   2782 
   2783 	switch (entry->type) {
   2784 		case CONNECTION_TYPE_TCP_PERSISTANT:
   2785 			result = RPC_GetAuditDigest_TP(entry, startOrdinal, auditDigest,
   2786 						       counterValueSize, counterValue, more,
   2787 						       ordSize, ordList);
   2788 			break;
   2789 		default:
   2790 			break;
   2791 	}
   2792 
   2793 	put_table_entry(entry);
   2794 
   2795 	return result;
   2796 }
   2797 
   2798 TSS_RESULT
   2799 RPC_GetAuditDigestSigned(TSS_HCONTEXT hContext,		/* in */
   2800 			 TCS_KEY_HANDLE keyHandle,	/* in */
   2801 			 TSS_BOOL closeAudit,		/* in */
   2802 			 TPM_NONCE *antiReplay,		/* in */
   2803 			 TPM_AUTH *privAuth,		/* in/out */
   2804 			 UINT32 *counterValueSize,	/* out */
   2805 			 BYTE **counterValue,		/* out */
   2806 			 TPM_DIGEST *auditDigest,	/* out */
   2807 			 TPM_DIGEST *ordinalDigest,	/* out */
   2808 			 UINT32 *sigSize,		/* out */
   2809 			 BYTE **sig)			/* out */
   2810 {
   2811 	TSS_RESULT result = TSS_SUCCESS;
   2812 	struct host_table_entry *entry = get_table_entry(hContext);
   2813 
   2814 	if (entry == NULL)
   2815 		return TSPERR(TSS_E_NO_CONNECTION);
   2816 
   2817 	switch (entry->type) {
   2818 		case CONNECTION_TYPE_TCP_PERSISTANT:
   2819 			result = RPC_GetAuditDigestSigned_TP(entry, keyHandle, closeAudit,
   2820 							     antiReplay, privAuth,
   2821 							     counterValueSize, counterValue,
   2822 							     auditDigest, ordinalDigest,
   2823 							     sigSize, sig);
   2824 			break;
   2825 		default:
   2826 			break;
   2827 	}
   2828 
   2829 	put_table_entry(entry);
   2830 
   2831 	return result;
   2832 }
   2833 #endif
   2834 
   2835 #ifdef TSS_BUILD_TSS12
   2836 TSS_RESULT
   2837 RPC_SetOperatorAuth(TSS_HCONTEXT hContext,	/* in */
   2838 		    TCPA_SECRET *operatorAuth)		/* in */
   2839 {
   2840 	TSS_RESULT result = TSS_SUCCESS;
   2841 	struct host_table_entry *entry = get_table_entry(hContext);
   2842 
   2843 	if (entry == NULL)
   2844 		return TSPERR(TSS_E_NO_CONNECTION);
   2845 
   2846 	switch (entry->type) {
   2847 		case CONNECTION_TYPE_TCP_PERSISTANT:
   2848 			result = RPC_SetOperatorAuth_TP(entry, operatorAuth);
   2849 			break;
   2850 		default:
   2851 			break;
   2852 	}
   2853 
   2854 	put_table_entry(entry);
   2855 
   2856 	return result;
   2857 }
   2858 
   2859 TSS_RESULT
   2860 RPC_OwnerReadInternalPub(TSS_HCONTEXT hContext,	/* in */
   2861 			 TCS_KEY_HANDLE hKey,		/* in */
   2862 			 TPM_AUTH* pOwnerAuth,		/* in, out */
   2863 			 UINT32* punPubKeySize,	/* out */
   2864 			 BYTE** ppbPubKeyData)		/* out */
   2865 {
   2866 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   2867 	struct host_table_entry *entry = get_table_entry(hContext);
   2868 
   2869 	if (entry == NULL)
   2870 		return TSPERR(TSS_E_NO_CONNECTION);
   2871 
   2872 	switch (entry->type) {
   2873 		case CONNECTION_TYPE_TCP_PERSISTANT:
   2874 			result = RPC_OwnerReadInternalPub_TP(entry, hKey, pOwnerAuth, punPubKeySize,
   2875 							     ppbPubKeyData);
   2876 			break;
   2877 		default:
   2878 			break;
   2879 	}
   2880 
   2881 	put_table_entry(entry);
   2882 
   2883 	return result;
   2884 }
   2885 #endif
   2886 
   2887 #ifdef TSS_BUILD_DELEGATION
   2888 TSS_RESULT
   2889 RPC_Delegate_Manage(TSS_HCONTEXT hContext,		/* in */
   2890 		    TPM_FAMILY_ID familyID,		/* in */
   2891 		    TPM_FAMILY_OPERATION opFlag,	/* in */
   2892 		    UINT32 opDataSize,			/* in */
   2893 		    BYTE *opData,			/* in */
   2894 		    TPM_AUTH *ownerAuth,		/* in, out */
   2895 		    UINT32 *retDataSize,		/* out */
   2896 		    BYTE **retData)			/* out */
   2897 {
   2898 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   2899 	struct host_table_entry *entry = get_table_entry(hContext);
   2900 
   2901 	if (entry == NULL)
   2902 		return TSPERR(TSS_E_NO_CONNECTION);
   2903 
   2904 	switch (entry->type) {
   2905 		case CONNECTION_TYPE_TCP_PERSISTANT:
   2906 			result = RPC_Delegate_Manage_TP(entry, familyID, opFlag, opDataSize, opData,
   2907 							ownerAuth, retDataSize, retData);
   2908 			break;
   2909 		default:
   2910 			break;
   2911 	}
   2912 
   2913 	put_table_entry(entry);
   2914 
   2915 	return result;
   2916 }
   2917 
   2918 TSS_RESULT
   2919 RPC_Delegate_CreateKeyDelegation(TSS_HCONTEXT hContext,		/* in */
   2920 				 TCS_KEY_HANDLE hKey,		/* in */
   2921 				 UINT32 publicInfoSize,		/* in */
   2922 				 BYTE *publicInfo,		/* in */
   2923 				 TPM_ENCAUTH *encDelAuth,	/* in */
   2924 				 TPM_AUTH *keyAuth,		/* in, out */
   2925 				 UINT32 *blobSize,		/* out */
   2926 				 BYTE **blob)			/* out */
   2927 {
   2928 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   2929 	struct host_table_entry *entry = get_table_entry(hContext);
   2930 
   2931 	if (entry == NULL)
   2932 		return TSPERR(TSS_E_NO_CONNECTION);
   2933 
   2934 	switch (entry->type) {
   2935 		case CONNECTION_TYPE_TCP_PERSISTANT:
   2936 			result = RPC_Delegate_CreateKeyDelegation_TP(entry, hKey, publicInfoSize,
   2937 								     publicInfo, encDelAuth,
   2938 								     keyAuth, blobSize, blob);
   2939 			break;
   2940 		default:
   2941 			break;
   2942 	}
   2943 
   2944 	put_table_entry(entry);
   2945 
   2946 	return result;
   2947 }
   2948 
   2949 TSS_RESULT
   2950 RPC_Delegate_CreateOwnerDelegation(TSS_HCONTEXT hContext,	/* in */
   2951 				   TSS_BOOL increment,		/* in */
   2952 				   UINT32 publicInfoSize,	/* in */
   2953 				   BYTE *publicInfo,		/* in */
   2954 				   TPM_ENCAUTH *encDelAuth,	/* in */
   2955 				   TPM_AUTH *ownerAuth,		/* in, out */
   2956 				   UINT32 *blobSize,		/* out */
   2957 				   BYTE **blob)			/* out */
   2958 {
   2959 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   2960 	struct host_table_entry *entry = get_table_entry(hContext);
   2961 
   2962 	if (entry == NULL)
   2963 		return TSPERR(TSS_E_NO_CONNECTION);
   2964 
   2965 	switch (entry->type) {
   2966 		case CONNECTION_TYPE_TCP_PERSISTANT:
   2967 			result = RPC_Delegate_CreateOwnerDelegation_TP(entry, increment,
   2968 								       publicInfoSize, publicInfo,
   2969 								       encDelAuth, ownerAuth,
   2970 								       blobSize, blob);
   2971 			break;
   2972 		default:
   2973 			break;
   2974 	}
   2975 
   2976 	put_table_entry(entry);
   2977 
   2978 	return result;
   2979 }
   2980 
   2981 TSS_RESULT
   2982 RPC_Delegate_LoadOwnerDelegation(TSS_HCONTEXT hContext,	/* in */
   2983 				 TPM_DELEGATE_INDEX index,	/* in */
   2984 				 UINT32 blobSize,		/* in */
   2985 				 BYTE *blob,			/* in */
   2986 				 TPM_AUTH *ownerAuth)		/* in, out */
   2987 {
   2988 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   2989 	struct host_table_entry *entry = get_table_entry(hContext);
   2990 
   2991 	if (entry == NULL)
   2992 		return TSPERR(TSS_E_NO_CONNECTION);
   2993 
   2994 	switch (entry->type) {
   2995 		case CONNECTION_TYPE_TCP_PERSISTANT:
   2996 			result = RPC_Delegate_LoadOwnerDelegation_TP(entry, index, blobSize, blob,
   2997 								     ownerAuth);
   2998 			break;
   2999 		default:
   3000 			break;
   3001 	}
   3002 
   3003 	put_table_entry(entry);
   3004 
   3005 	return result;
   3006 }
   3007 
   3008 TSS_RESULT
   3009 RPC_Delegate_ReadTable(TSS_HCONTEXT hContext,		/* in */
   3010 		       UINT32 *familyTableSize,		/* out */
   3011 		       BYTE **familyTable,		/* out */
   3012 		       UINT32 *delegateTableSize,	/* out */
   3013 		       BYTE **delegateTable)		/* out */
   3014 {
   3015 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   3016 	struct host_table_entry *entry = get_table_entry(hContext);
   3017 
   3018 	if (entry == NULL)
   3019 		return TSPERR(TSS_E_NO_CONNECTION);
   3020 
   3021 	switch (entry->type) {
   3022 		case CONNECTION_TYPE_TCP_PERSISTANT:
   3023 			result = RPC_Delegate_ReadTable_TP(entry, familyTableSize, familyTable,
   3024 							   delegateTableSize, delegateTable);
   3025 			break;
   3026 		default:
   3027 			break;
   3028 	}
   3029 
   3030 	put_table_entry(entry);
   3031 
   3032 	return result;
   3033 }
   3034 
   3035 TSS_RESULT
   3036 RPC_Delegate_UpdateVerificationCount(TSS_HCONTEXT hContext,	/* in */
   3037 				     UINT32 inputSize,		/* in */
   3038 				     BYTE *input,		/* in */
   3039 				     TPM_AUTH *ownerAuth,	/* in, out */
   3040 				     UINT32 *outputSize,	/* out */
   3041 				     BYTE **output)		/* out */
   3042 {
   3043 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   3044 	struct host_table_entry *entry = get_table_entry(hContext);
   3045 
   3046 	if (entry == NULL)
   3047 		return TSPERR(TSS_E_NO_CONNECTION);
   3048 
   3049 	switch (entry->type) {
   3050 		case CONNECTION_TYPE_TCP_PERSISTANT:
   3051 			result = RPC_Delegate_UpdateVerificationCount_TP(entry, inputSize, input,
   3052 									 ownerAuth, outputSize,
   3053 									 output);
   3054 			break;
   3055 		default:
   3056 			break;
   3057 	}
   3058 
   3059 	put_table_entry(entry);
   3060 
   3061 	return result;
   3062 }
   3063 
   3064 TSS_RESULT
   3065 RPC_Delegate_VerifyDelegation(TSS_HCONTEXT hContext,	/* in */
   3066 			      UINT32 delegateSize,	/* in */
   3067 			      BYTE *delegate)		/* in */
   3068 {
   3069 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   3070 	struct host_table_entry *entry = get_table_entry(hContext);
   3071 
   3072 	if (entry == NULL)
   3073 		return TSPERR(TSS_E_NO_CONNECTION);
   3074 
   3075 	switch (entry->type) {
   3076 		case CONNECTION_TYPE_TCP_PERSISTANT:
   3077 			result = RPC_Delegate_VerifyDelegation_TP(entry, delegateSize, delegate);
   3078 			break;
   3079 		default:
   3080 			break;
   3081 	}
   3082 
   3083 	put_table_entry(entry);
   3084 
   3085 	return result;
   3086 }
   3087 
   3088 TSS_RESULT
   3089 RPC_DSAP(TSS_HCONTEXT hContext,		/* in */
   3090 	 TPM_ENTITY_TYPE entityType,	/* in */
   3091 	 TCS_KEY_HANDLE keyHandle,	/* in */
   3092 	 TPM_NONCE *nonceOddDSAP,	/* in */
   3093 	 UINT32 entityValueSize,	/* in */
   3094 	 BYTE * entityValue,		/* in */
   3095 	 TCS_AUTHHANDLE *authHandle,	/* out */
   3096 	 TPM_NONCE *nonceEven,		/* out */
   3097 	 TPM_NONCE *nonceEvenDSAP)	/* out */
   3098 {
   3099 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   3100 	struct host_table_entry *entry = get_table_entry(hContext);
   3101 
   3102 	if (entry == NULL)
   3103 		return TSPERR(TSS_E_NO_CONNECTION);
   3104 
   3105 	switch (entry->type) {
   3106 		case CONNECTION_TYPE_TCP_PERSISTANT:
   3107 			result = RPC_DSAP_TP(entry, entityType, keyHandle, nonceOddDSAP,
   3108 					     entityValueSize, entityValue, authHandle, nonceEven,
   3109 					     nonceEvenDSAP);
   3110 			break;
   3111 		default:
   3112 			break;
   3113 	}
   3114 
   3115 	put_table_entry(entry);
   3116 
   3117 	return result;
   3118 }
   3119 
   3120 #endif
   3121 
   3122 #ifdef TSS_BUILD_CMK
   3123 TSS_RESULT
   3124 RPC_CMK_SetRestrictions(TSS_HCONTEXT hContext,	/* in */
   3125 			TSS_CMK_DELEGATE restriction,	/* in */
   3126 			TPM_AUTH *ownerAuth)		/* in, out */
   3127 {
   3128 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   3129 	struct host_table_entry *entry = get_table_entry(hContext);
   3130 
   3131 	if (entry == NULL)
   3132 		return TSPERR(TSS_E_NO_CONNECTION);
   3133 
   3134 	switch (entry->type) {
   3135 		case CONNECTION_TYPE_TCP_PERSISTANT:
   3136 			result = RPC_CMK_SetRestrictions_TP(entry, restriction, ownerAuth);
   3137 			break;
   3138 		default:
   3139 			break;
   3140 	}
   3141 
   3142 	put_table_entry(entry);
   3143 
   3144 	return result;
   3145 }
   3146 
   3147 TSS_RESULT
   3148 RPC_CMK_ApproveMA(TSS_HCONTEXT hContext,		/* in */
   3149 		  TPM_DIGEST migAuthorityDigest,	/* in */
   3150 		  TPM_AUTH *ownerAuth,			/* in, out */
   3151 		  TPM_HMAC *migAuthorityApproval)	/* out */
   3152 {
   3153 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   3154 	struct host_table_entry *entry = get_table_entry(hContext);
   3155 
   3156 	if (entry == NULL)
   3157 		return TSPERR(TSS_E_NO_CONNECTION);
   3158 
   3159 	switch (entry->type) {
   3160 		case CONNECTION_TYPE_TCP_PERSISTANT:
   3161 			result = RPC_CMK_ApproveMA_TP(entry, migAuthorityDigest, ownerAuth,
   3162 					migAuthorityApproval);
   3163 			break;
   3164 		default:
   3165 			break;
   3166 	}
   3167 
   3168 	put_table_entry(entry);
   3169 
   3170 	return result;
   3171 }
   3172 
   3173 TSS_RESULT
   3174 RPC_CMK_CreateKey(TSS_HCONTEXT hContext,		/* in */
   3175 		  TCS_KEY_HANDLE hWrappingKey,		/* in */
   3176 		  TPM_ENCAUTH *keyUsageAuth,		/* in */
   3177 		  TPM_HMAC *migAuthorityApproval,	/* in */
   3178 		  TPM_DIGEST *migAuthorityDigest,	/* in */
   3179 		  UINT32 *keyDataSize,			/* in, out */
   3180 		  BYTE **keyData,			/* in, out */
   3181 		  TPM_AUTH *pAuth)			/* in, out */
   3182 {
   3183 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   3184 	struct host_table_entry *entry = get_table_entry(hContext);
   3185 
   3186 	if (entry == NULL)
   3187 		return TSPERR(TSS_E_NO_CONNECTION);
   3188 
   3189 	switch (entry->type) {
   3190 		case CONNECTION_TYPE_TCP_PERSISTANT:
   3191 			result = RPC_CMK_CreateKey_TP(entry, hWrappingKey, keyUsageAuth,
   3192 					migAuthorityApproval, migAuthorityDigest, keyDataSize,
   3193 					keyData, pAuth);
   3194 			break;
   3195 		default:
   3196 			break;
   3197 	}
   3198 
   3199 	put_table_entry(entry);
   3200 
   3201 	return result;
   3202 }
   3203 
   3204 TSS_RESULT
   3205 RPC_CMK_CreateTicket(TSS_HCONTEXT hContext,	/* in */
   3206 		     UINT32 publicVerifyKeySize,	/* in */
   3207 		     BYTE *publicVerifyKey,		/* in */
   3208 		     TPM_DIGEST signedData,		/* in */
   3209 		     UINT32 sigValueSize,		/* in */
   3210 		     BYTE *sigValue,			/* in */
   3211 		     TPM_AUTH *ownerAuth,		/* in, out */
   3212 		     TPM_HMAC *sigTicket)		/* out */
   3213 {
   3214 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   3215 	struct host_table_entry *entry = get_table_entry(hContext);
   3216 
   3217 	if (entry == NULL)
   3218 		return TSPERR(TSS_E_NO_CONNECTION);
   3219 
   3220 	switch (entry->type) {
   3221 		case CONNECTION_TYPE_TCP_PERSISTANT:
   3222 			result = RPC_CMK_CreateTicket_TP(entry, publicVerifyKeySize,
   3223 					publicVerifyKey, signedData, sigValueSize, sigValue,
   3224 					ownerAuth, sigTicket);
   3225 			break;
   3226 		default:
   3227 			break;
   3228 	}
   3229 
   3230 	put_table_entry(entry);
   3231 
   3232 	return result;
   3233 }
   3234 
   3235 TSS_RESULT
   3236 RPC_CMK_CreateBlob(TSS_HCONTEXT hContext,	/* in */
   3237 		   TCS_KEY_HANDLE hParentKey,		/* in */
   3238 		   TSS_MIGRATE_SCHEME migrationType,	/* in */
   3239 		   UINT32 migKeyAuthSize,		/* in */
   3240 		   BYTE *migKeyAuth,			/* in */
   3241 		   TPM_DIGEST pubSourceKeyDigest,	/* in */
   3242 		   UINT32 msaListSize,			/* in */
   3243 		   BYTE *msaList,			/* in */
   3244 		   UINT32 restrictTicketSize,		/* in */
   3245 		   BYTE *restrictTicket,		/* in */
   3246 		   UINT32 sigTicketSize,		/* in */
   3247 		   BYTE *sigTicket,			/* in */
   3248 		   UINT32 encDataSize,			/* in */
   3249 		   BYTE *encData,			/* in */
   3250 		   TPM_AUTH *pAuth,			/* in, out */
   3251 		   UINT32 *randomSize,			/* out */
   3252 		   BYTE **random,			/* out */
   3253 		   UINT32 *outDataSize,			/* out */
   3254 		   BYTE **outData)			/* out */
   3255 {
   3256 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   3257 	struct host_table_entry *entry = get_table_entry(hContext);
   3258 
   3259 	if (entry == NULL)
   3260 		return TSPERR(TSS_E_NO_CONNECTION);
   3261 
   3262 	switch (entry->type) {
   3263 		case CONNECTION_TYPE_TCP_PERSISTANT:
   3264 			result = RPC_CMK_CreateBlob_TP(entry, hParentKey, migrationType,
   3265 					migKeyAuthSize, migKeyAuth, pubSourceKeyDigest,
   3266 					msaListSize, msaList, restrictTicketSize, restrictTicket,
   3267 					sigTicketSize, sigTicket, encDataSize, encData, pAuth,
   3268 					randomSize, random, outDataSize, outData);
   3269 			break;
   3270 		default:
   3271 			break;
   3272 	}
   3273 
   3274 	put_table_entry(entry);
   3275 
   3276 	return result;
   3277 }
   3278 
   3279 TSS_RESULT
   3280 RPC_CMK_ConvertMigration(TSS_HCONTEXT hContext,	/* in */
   3281 			 TCS_KEY_HANDLE hParentHandle,	/* in */
   3282 			 TPM_CMK_AUTH restrictTicket,	/* in */
   3283 			 TPM_HMAC sigTicket,		/* in */
   3284 			 UINT32 keyDataSize,		/* in */
   3285 			 BYTE *keyData,			/* in */
   3286 			 UINT32 msaListSize,		/* in */
   3287 			 BYTE *msaList,			/* in */
   3288 			 UINT32 randomSize,		/* in */
   3289 			 BYTE *random,			/* in */
   3290 			 TPM_AUTH *pAuth,		/* in, out */
   3291 			 UINT32 *outDataSize,		/* out */
   3292 			 BYTE **outData)		/* out */
   3293 {
   3294 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   3295 	struct host_table_entry *entry = get_table_entry(hContext);
   3296 
   3297 	if (entry == NULL)
   3298 		return TSPERR(TSS_E_NO_CONNECTION);
   3299 
   3300 	switch (entry->type) {
   3301 		case CONNECTION_TYPE_TCP_PERSISTANT:
   3302 			result = RPC_CMK_ConvertMigration_TP(entry, hParentHandle, restrictTicket,
   3303 					sigTicket, keyDataSize, keyData, msaListSize, msaList,
   3304 					randomSize, random, pAuth, outDataSize, outData);
   3305 			break;
   3306 		default:
   3307 			break;
   3308 	}
   3309 
   3310 	put_table_entry(entry);
   3311 
   3312 	return result;
   3313 }
   3314 #endif
   3315 
   3316 #ifdef TSS_BUILD_TSS12
   3317 TSS_RESULT
   3318 RPC_FlushSpecific(TSS_HCONTEXT hContext, /* in */
   3319 		  TCS_HANDLE hResHandle, /* in */
   3320 		  TPM_RESOURCE_TYPE resourceType) /* in */
   3321 {
   3322 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   3323 	struct host_table_entry *entry = get_table_entry(hContext);
   3324 
   3325 	if (entry == NULL)
   3326 		return TSPERR(TSS_E_NO_CONNECTION);
   3327 
   3328 	switch (entry->type) {
   3329 		case CONNECTION_TYPE_TCP_PERSISTANT:
   3330 			result = RPC_FlushSpecific_TP(entry, hResHandle, resourceType);
   3331 			break;
   3332 		default:
   3333 			break;
   3334 	}
   3335 
   3336 	put_table_entry(entry);
   3337 
   3338 	return result;
   3339 }
   3340 
   3341 TSS_RESULT
   3342 RPC_KeyControlOwner(TCS_CONTEXT_HANDLE hContext,		/* in */
   3343 		    TCS_KEY_HANDLE     hKey,			/* in */
   3344 		    UINT32             ulPublicInfoLength,	/* in */
   3345 		    BYTE*              rgbPublicInfo,		/* in */
   3346 		    UINT32             attribName,		/* in */
   3347 		    TSS_BOOL           attribValue,		/* in */
   3348 		    TPM_AUTH*          pOwnerAuth,		/* in, out */
   3349 		    TSS_UUID*          pUuidData)		/* out */
   3350 
   3351 {
   3352 	TSS_RESULT result = (TSS_E_INTERNAL_ERROR | TSS_LAYER_TSP);
   3353 	struct host_table_entry *entry = get_table_entry(hContext);
   3354 
   3355 	if (entry == NULL)
   3356 		return TSPERR(TSS_E_NO_CONNECTION);
   3357 
   3358 	switch (entry->type) {
   3359 		case CONNECTION_TYPE_TCP_PERSISTANT:
   3360 			result = RPC_KeyControlOwner_TP(entry, hKey,
   3361 							ulPublicInfoLength,
   3362 							rgbPublicInfo,
   3363 							attribName,
   3364 							attribValue,
   3365 							pOwnerAuth,
   3366 							pUuidData);
   3367 			break;
   3368 		default:
   3369 			break;
   3370 	}
   3371 
   3372 	put_table_entry(entry);
   3373 
   3374 	return result;
   3375 }
   3376 #endif
   3377 
   3378