/* * Licensed Materials - Property of IBM * * trousers - An open source TCG Software Stack * * (C) Copyright International Business Machines Corp. 2007 * */ #include #include #include #include #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" #ifdef TSS_BUILD_TRANSPORT TSS_RESULT Transport_NV_DefineOrReleaseSpace(TSS_HCONTEXT tspContext, /* in */ UINT32 cPubInfoSize, /* in */ BYTE* pPubInfo, /* in */ TCPA_ENCAUTH encAuth, /* in */ TPM_AUTH* pAuth) /* in, out */ { TSS_RESULT result; UINT32 dataLen; UINT64 offset; TCS_HANDLE handlesLen = 0; BYTE *data; if ((result = obj_context_transport_init(tspContext))) return result; LogDebugFn("Executing in a transport session"); dataLen = sizeof(TCPA_ENCAUTH) + cPubInfoSize; if ((data = malloc(dataLen)) == NULL) { LogError("malloc of %u bytes failed", dataLen); return TSPERR(TSS_E_OUTOFMEMORY); } offset = 0; Trspi_LoadBlob(&offset, cPubInfoSize, data, pPubInfo); Trspi_LoadBlob(&offset, TPM_SHA1_160_HASH_LEN, data, encAuth.authdata); result = obj_context_transport_execute(tspContext, TPM_ORD_NV_DefineSpace, dataLen, data, NULL, &handlesLen, NULL, pAuth, NULL, NULL, NULL); free(data); return result; } TSS_RESULT Transport_NV_WriteValue(TSS_HCONTEXT tspContext, /* in */ TSS_NV_INDEX hNVStore, /* in */ UINT32 offset, /* in */ UINT32 ulDataLength, /* in */ BYTE* rgbDataToWrite, /* in */ TPM_AUTH* privAuth) /* in, out */ { TSS_RESULT result; UINT32 dataLen; UINT64 offset64; TCS_HANDLE handlesLen = 0; BYTE *data; if ((result = obj_context_transport_init(tspContext))) return result; LogDebugFn("Executing in a transport session"); dataLen = sizeof(TSS_NV_INDEX) + (2 * sizeof(UINT32)) + ulDataLength; if ((data = malloc(dataLen)) == NULL) { LogError("malloc of %u bytes failed", dataLen); return TSPERR(TSS_E_OUTOFMEMORY); } offset64 = 0; Trspi_LoadBlob_UINT32(&offset64, hNVStore, data); Trspi_LoadBlob_UINT32(&offset64, offset, data); Trspi_LoadBlob_UINT32(&offset64, ulDataLength, data); Trspi_LoadBlob(&offset64, ulDataLength, data, rgbDataToWrite); result = obj_context_transport_execute(tspContext, TPM_ORD_NV_WriteValue, dataLen, data, NULL, &handlesLen, NULL, privAuth, NULL, NULL, NULL); free(data); return result; } TSS_RESULT Transport_NV_WriteValueAuth(TSS_HCONTEXT tspContext, /* in */ TSS_NV_INDEX hNVStore, /* in */ UINT32 offset, /* in */ UINT32 ulDataLength, /* in */ BYTE* rgbDataToWrite, /* in */ TPM_AUTH* NVAuth) /* in, out */ { TSS_RESULT result; UINT32 dataLen; UINT64 offset64; TCS_HANDLE handlesLen = 0; BYTE *data; if ((result = obj_context_transport_init(tspContext))) return result; LogDebugFn("Executing in a transport session"); dataLen = sizeof(TSS_NV_INDEX) + (2 * sizeof(UINT32)) + ulDataLength; if ((data = malloc(dataLen)) == NULL) { LogError("malloc of %u bytes failed", dataLen); return TSPERR(TSS_E_OUTOFMEMORY); } offset64 = 0; Trspi_LoadBlob_UINT32(&offset64, hNVStore, data); Trspi_LoadBlob_UINT32(&offset64, offset, data); Trspi_LoadBlob_UINT32(&offset64, ulDataLength, data); Trspi_LoadBlob(&offset64, ulDataLength, data, rgbDataToWrite); result = obj_context_transport_execute(tspContext, TPM_ORD_NV_WriteValueAuth, dataLen, data, NULL, &handlesLen, NULL, NVAuth, NULL, NULL, NULL); free(data); return result; } TSS_RESULT Transport_NV_ReadValue(TSS_HCONTEXT tspContext, /* in */ TSS_NV_INDEX hNVStore, /* in */ UINT32 offset, /* in */ UINT32* pulDataLength, /* in, out */ TPM_AUTH* privAuth, /* in, out */ BYTE** rgbDataRead) /* out */ { TSS_RESULT result; UINT32 dataLen, decLen; UINT64 offset64; TCS_HANDLE handlesLen = 0; BYTE *data, *dec; if ((result = obj_context_transport_init(tspContext))) return result; LogDebugFn("Executing in a transport session"); dataLen = sizeof(TSS_NV_INDEX) + sizeof(UINT32) + *pulDataLength; if ((data = malloc(dataLen)) == NULL) { LogError("malloc of %u bytes failed", dataLen); return TSPERR(TSS_E_OUTOFMEMORY); } offset64 = 0; Trspi_LoadBlob_UINT32(&offset64, hNVStore, data); Trspi_LoadBlob_UINT32(&offset64, offset, data); Trspi_LoadBlob_UINT32(&offset64, *pulDataLength, data); if ((result = obj_context_transport_execute(tspContext, TPM_ORD_NV_ReadValue, dataLen, data, NULL, &handlesLen, NULL, privAuth, NULL, &decLen, &dec))) { free(data); return result; } free(data); offset64 = 0; Trspi_UnloadBlob_UINT32(&offset64, pulDataLength, dec); if ((*rgbDataRead = malloc(*pulDataLength)) == NULL) { free(dec); LogError("malloc of %u bytes failed", *pulDataLength); *pulDataLength = 0; return TSPERR(TSS_E_OUTOFMEMORY); } Trspi_UnloadBlob(&offset64, *pulDataLength, dec, *rgbDataRead); free(dec); return result; } TSS_RESULT Transport_NV_ReadValueAuth(TSS_HCONTEXT tspContext, /* in */ TSS_NV_INDEX hNVStore, /* in */ UINT32 offset, /* in */ UINT32* pulDataLength, /* in, out */ TPM_AUTH* NVAuth, /* in, out */ BYTE** rgbDataRead) /* out */ { TSS_RESULT result; UINT32 dataLen, decLen; UINT64 offset64; TCS_HANDLE handlesLen = 0; BYTE *data, *dec; if ((result = obj_context_transport_init(tspContext))) return result; LogDebugFn("Executing in a transport session"); dataLen = sizeof(TSS_NV_INDEX) + sizeof(UINT32) + *pulDataLength; if ((data = malloc(dataLen)) == NULL) { LogError("malloc of %u bytes failed", dataLen); return TSPERR(TSS_E_OUTOFMEMORY); } offset64 = 0; Trspi_LoadBlob_UINT32(&offset64, hNVStore, data); Trspi_LoadBlob_UINT32(&offset64, offset, data); Trspi_LoadBlob_UINT32(&offset64, *pulDataLength, data); if ((result = obj_context_transport_execute(tspContext, TPM_ORD_NV_ReadValueAuth, dataLen, data, NULL, &handlesLen, NULL, NVAuth, NULL, &decLen, &dec))) { free(data); return result; } free(data); offset64 = 0; Trspi_UnloadBlob_UINT32(&offset64, pulDataLength, dec); if ((*rgbDataRead = malloc(*pulDataLength)) == NULL) { free(dec); LogError("malloc of %u bytes failed", *pulDataLength); *pulDataLength = 0; return TSPERR(TSS_E_OUTOFMEMORY); } Trspi_UnloadBlob(&offset64, *pulDataLength, dec, *rgbDataRead); free(dec); return result; } #endif