diff options
author | Igor Pashev <pashev.igor@gmail.com> | 2012-11-25 14:36:20 +0000 |
---|---|---|
committer | Igor Pashev <pashev.igor@gmail.com> | 2012-11-25 14:36:20 +0000 |
commit | c3649a2def02c41d837ae1f79dda729ccb91e677 (patch) | |
tree | bea46dff212fdef977fe9094a70a939e8cc21885 /src/tspi/tspi_pcr_extend.c | |
download | trousers-c3649a2def02c41d837ae1f79dda729ccb91e677.tar.gz |
Imported Upstream version 0.3.9upstream/0.3.9upstream
Diffstat (limited to 'src/tspi/tspi_pcr_extend.c')
-rw-r--r-- | src/tspi/tspi_pcr_extend.c | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/src/tspi/tspi_pcr_extend.c b/src/tspi/tspi_pcr_extend.c new file mode 100644 index 0000000..6193fd2 --- /dev/null +++ b/src/tspi/tspi_pcr_extend.c @@ -0,0 +1,158 @@ + +/* + * Licensed Materials - Property of IBM + * + * trousers - An open source TCG Software Stack + * + * (C) Copyright International Business Machines Corp. 2004-2006 + * (C) Christian Kummer 2007 + * + */ + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <inttypes.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 +Tspi_TPM_PcrExtend(TSS_HTPM hTPM, /* in */ + UINT32 ulPcrIndex, /* in */ + UINT32 ulPcrDataLength, /* in */ + BYTE *pbPcrData, /* in */ + TSS_PCR_EVENT *pPcrEvent, /* in */ + UINT32 * pulPcrValueLength, /* out */ + BYTE ** prgbPcrValue) /* out */ +{ + TCPA_PCRVALUE outDigest; + TSS_RESULT result; + BYTE *extendData; + TPM_DIGEST digest; + UINT32 number; + TSS_HCONTEXT tspContext; + Trspi_HashCtx hashCtx; + + if (pulPcrValueLength == NULL || prgbPcrValue == NULL) + return TSPERR(TSS_E_BAD_PARAMETER); + + if (ulPcrDataLength > 0 && pbPcrData == NULL) + return TSPERR(TSS_E_BAD_PARAMETER); + + if ((result = obj_tpm_get_tsp_context(hTPM, &tspContext))) + return result; + + if (pPcrEvent) { + /* Create data to extend according to the TSS 1.2 spec section 2.6.2 + * 'TSS_PCR_EVENT', in the 'rgbPcrValue' parameter description. */ + result = Trspi_HashInit(&hashCtx, TSS_HASH_SHA1); + result |= Trspi_Hash_UINT32(&hashCtx, ulPcrIndex); + result |= Trspi_HashUpdate(&hashCtx, ulPcrDataLength, pbPcrData); + result |= Trspi_Hash_UINT32(&hashCtx, pPcrEvent->eventType); + result |= Trspi_HashUpdate(&hashCtx, pPcrEvent->ulEventLength, pPcrEvent->rgbEvent); + if ((result |= Trspi_HashFinal(&hashCtx, (BYTE *)&digest.digest))) + return result; + + extendData = (BYTE *)&digest.digest; + } else { + if (ulPcrDataLength != TPM_SHA1_160_HASH_LEN) + return TSPERR(TSS_E_BAD_PARAMETER); + + extendData = pbPcrData; + } + + if ((result = TCS_API(tspContext)->Extend(tspContext, ulPcrIndex, *(TPM_DIGEST *)extendData, + &outDigest))) + return result; + + /* log the event structure if its passed in */ + if (pPcrEvent) { + /* Set the PCR index in the event struct */ + pPcrEvent->ulPcrIndex = ulPcrIndex; + + if ((pPcrEvent->rgbPcrValue = calloc_tspi(tspContext, + TPM_SHA1_160_HASH_LEN)) == NULL) { + LogError("malloc of %d bytes failed.", TPM_SHA1_160_HASH_LEN); + return TSPERR(TSS_E_OUTOFMEMORY); + } + + memcpy(pPcrEvent->rgbPcrValue, (BYTE *)&digest.digest, TPM_SHA1_160_HASH_LEN); + pPcrEvent->ulPcrValueLength = TPM_SHA1_160_HASH_LEN; + + /* Set the version info in the event struct */ + memcpy(&pPcrEvent->versionInfo, &VERSION_1_1, sizeof(TCPA_VERSION)); + + if ((result = RPC_LogPcrEvent(tspContext, *pPcrEvent, &number))) + return result; + } + + *prgbPcrValue = calloc_tspi(tspContext, sizeof(TPM_PCRVALUE)); + if (*prgbPcrValue == NULL) { + LogError("malloc of %zd bytes failed.", sizeof(TPM_PCRVALUE)); + return TSPERR(TSS_E_OUTOFMEMORY); + } + + memcpy(*prgbPcrValue, &outDigest, sizeof(TPM_PCRVALUE)); + *pulPcrValueLength = sizeof(TPM_PCRVALUE); + + return result; +} + +TSS_RESULT +Tspi_TPM_PcrRead(TSS_HTPM hTPM, /* in */ + UINT32 ulPcrIndex, /* in */ + UINT32 *pulPcrValueLength, /* out */ + BYTE **prgbPcrValue) /* out */ +{ + TCPA_PCRVALUE outDigest; + TSS_RESULT result; + TSS_HCONTEXT tspContext; + + if (pulPcrValueLength == NULL || prgbPcrValue == NULL) + return TSPERR(TSS_E_BAD_PARAMETER); + + if ((result = obj_tpm_get_tsp_context(hTPM, &tspContext))) + return result; + + if ((result = TCS_API(tspContext)->PcrRead(tspContext, ulPcrIndex, &outDigest))) + return result; + + *prgbPcrValue = calloc_tspi(tspContext, sizeof(TCPA_PCRVALUE)); + if (*prgbPcrValue == NULL) { + LogError("malloc of %zd bytes failed.", sizeof(TCPA_PCRVALUE)); + return TSPERR(TSS_E_OUTOFMEMORY); + } + memcpy(*prgbPcrValue, outDigest.digest, sizeof(TCPA_PCRVALUE)); + *pulPcrValueLength = sizeof(TCPA_PCRVALUE); + + return TSS_SUCCESS; +} + +TSS_RESULT +Tspi_TPM_PcrReset(TSS_HTPM hTPM, /* in */ + TSS_HPCRS hPcrComposite) /* in */ +{ + TSS_RESULT result; + TSS_HCONTEXT tspContext; + UINT32 pcrDataSize; + BYTE pcrData[16]; + + if (!hPcrComposite) + return TSPERR(TSS_E_BAD_PARAMETER); + + if ((result = obj_tpm_get_tsp_context(hTPM, &tspContext))) + return result; + + if ((result = obj_pcrs_get_selection(hPcrComposite, &pcrDataSize, pcrData))) + return result; + + return TCS_API(tspContext)->PcrReset(tspContext, pcrDataSize, pcrData); +} + |