diff options
Diffstat (limited to 'src/tspi/tsp_transport.c')
-rw-r--r-- | src/tspi/tsp_transport.c | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/src/tspi/tsp_transport.c b/src/tspi/tsp_transport.c new file mode 100644 index 0000000..1fa6611 --- /dev/null +++ b/src/tspi/tsp_transport.c @@ -0,0 +1,88 @@ + +/* + * Licensed Materials - Property of IBM + * + * trousers - An open source TCG Software Stack + * + * (C) Copyright International Business Machines Corp. 2004-2007 + * + */ + + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> + +#include "trousers/tss.h" +#include "trousers/trousers.h" +#include "trousers_types.h" +#include "spi_utils.h" +#include "capabilities.h" +#include "tsplog.h" +#include "obj.h" + + +TSS_RESULT +Transport_LoadKeyByBlob(TSS_HCONTEXT hContext, + TPM_COMMAND_CODE ordinal, + TSS_HKEY hParentKey, + UINT32 ulBlobLength, + BYTE* rgbBlobData, + TPM_AUTH* pAuth, + TCS_KEY_HANDLE* phKey, + TPM_KEY_HANDLE* phSlot) +{ + TSS_RESULT result; + UINT32 handleListSize, decLen; + TCS_KEY_HANDLE hTCSParentKey; + TCS_HANDLE *handleList; + BYTE *dec = NULL; + TPM_DIGEST pubKeyHash; + Trspi_HashCtx hashCtx; + + + if ((result = obj_context_transport_init(hContext)) == TSS_TSPATTRIB_DISABLE_TRANSPORT) { + if ((result = obj_rsakey_get_tcs_handle(hParentKey, &hTCSParentKey))) + return result; + + return TCSP_LoadKeyByBlob(hContext, hTCSParentKey, ulBlobLength, rgbBlobData, pAuth, + phKey, phSlot); + } else if (result != TSS_TSPATTRIB_ENABLE_TRANSPORT) + return result; + + LogDebugFn("Executing in a transport session"); + + if ((result = obj_rsakey_get_transport_attribs(hParentKey, &hTCSParentKey, &pubKeyHash))) + return result; + + result = Trspi_HashInit(&hashCtx, TSS_HASH_SHA1); + result |= Trspi_Hash_DIGEST(&hashCtx, pubKeyHash.digest); + if ((result |= Trspi_HashFinal(&hashCtx, pubKeyHash.digest))) + return result; + + /* Call ExecuteTransport */ + handleListSize = 1; + if ((handleList = malloc(sizeof(TCS_HANDLE))) == NULL) { + LogError("malloc of %zd bytes failed", sizeof(TCS_HANDLE)); + return TSPERR(TSS_E_OUTOFMEMORY); + } + + *handleList = hTCSParentKey; + + if ((result = obj_context_transport_execute(hContext, ordinal, ulBlobLength, + rgbBlobData, &pubKeyHash, &handleListSize, + &handleList, pAuth, NULL, &decLen, &dec))) { + free(handleList); + return result; + } + + if (handleListSize == 1) + *phKey = *(TCS_KEY_HANDLE *)handleList; + else + result = TSPERR(TSS_E_INTERNAL_ERROR); + + free(handleList); + free(dec); + + return result; +} |