diff options
Diffstat (limited to 'src/tcs/tcsi_pcr.c')
-rw-r--r-- | src/tcs/tcsi_pcr.c | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/src/tcs/tcsi_pcr.c b/src/tcs/tcsi_pcr.c new file mode 100644 index 0000000..2cb97e3 --- /dev/null +++ b/src/tcs/tcsi_pcr.c @@ -0,0 +1,134 @@ + +/* + * Licensed Materials - Property of IBM + * + * trousers - An open source TCG Software Stack + * + * (C) Copyright International Business Machines Corp. 2004 + * (C) Christian Kummer 2007 + * + */ + + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <inttypes.h> + +#include "trousers/tss.h" +#include "trousers_types.h" +#include "tcs_tsp.h" +#include "tcsps.h" +#include "tcs_utils.h" +#include "tcs_int_literals.h" +#include "capabilities.h" +#include "tcslog.h" +#include "req_mgr.h" +#include "tcsd_wrap.h" +#include "tcsd.h" + + +TSS_RESULT +TCSP_Extend_Internal(TCS_CONTEXT_HANDLE hContext, /* in */ + TCPA_PCRINDEX pcrNum, /* in */ + TCPA_DIGEST inDigest, /* in */ + TCPA_PCRVALUE * outDigest) /* out */ +{ + UINT64 offset = 0; + TSS_RESULT result; + UINT32 paramSize; + BYTE txBlob[TSS_TPM_TXBLOB_SIZE]; + + LogDebug("Entering Extend"); + if ((result = ctx_verify_context(hContext))) + return result; + + /* PCRs are numbered 0 - (NUM_PCRS - 1), thus the >= */ + if (pcrNum >= tpm_metrics.num_pcrs) + return TCSERR(TSS_E_BAD_PARAMETER); + + if (tcsd_options.kernel_pcrs & (1 << pcrNum)) { + LogInfo("PCR %d is configured to be kernel controlled. Extend request denied.", + pcrNum); + return TCSERR(TSS_E_FAIL); + } + + if (tcsd_options.firmware_pcrs & (1 << pcrNum)) { + LogInfo("PCR %d is configured to be firmware controlled. Extend request denied.", + pcrNum); + return TCSERR(TSS_E_FAIL); + } + + if ((result = tpm_rqu_build(TPM_ORD_Extend, &offset, txBlob, pcrNum, TPM_DIGEST_SIZE, + inDigest.digest, NULL, NULL))) + return result; + + if ((result = req_mgr_submit_req(txBlob))) + return result; + + result = UnloadBlob_Header(txBlob, ¶mSize); + if (!result) { + result = tpm_rsp_parse(TPM_ORD_Extend, txBlob, paramSize, NULL, outDigest->digest); + } + LogResult("Extend", result); + return result; +} + +TSS_RESULT +TCSP_PcrRead_Internal(TCS_CONTEXT_HANDLE hContext, /* in */ + TCPA_PCRINDEX pcrNum, /* in */ + TCPA_PCRVALUE * outDigest) /* out */ +{ + UINT64 offset = 0; + TSS_RESULT result; + UINT32 paramSize; + BYTE txBlob[TSS_TPM_TXBLOB_SIZE]; + + LogDebug("Entering PCRRead"); + + if ((result = ctx_verify_context(hContext))) + return result; + + /* PCRs are numbered 0 - (NUM_PCRS - 1), thus the >= */ + if (pcrNum >= tpm_metrics.num_pcrs) + return TCSERR(TSS_E_BAD_PARAMETER); + + if ((result = tpm_rqu_build(TPM_ORD_PcrRead, &offset, txBlob, pcrNum, NULL))) + return result; + + if ((result = req_mgr_submit_req(txBlob))) + return result; + + result = UnloadBlob_Header(txBlob, ¶mSize); + if (!result) { + result = tpm_rsp_parse(TPM_ORD_PcrRead, txBlob, paramSize, NULL, outDigest->digest); + } + LogResult("PCR Read", result); + return result; +} + +TSS_RESULT +TCSP_PcrReset_Internal(TCS_CONTEXT_HANDLE hContext, /* in */ + UINT32 pcrDataSizeIn, /* in */ + BYTE * pcrDataIn) /* in */ +{ + UINT64 offset = 0; + TSS_RESULT result; + UINT32 paramSize; + BYTE txBlob[TSS_TPM_TXBLOB_SIZE]; + + LogDebug("Entering PCRReset"); + + if ((result = ctx_verify_context(hContext))) + return result; + + if ((result = tpm_rqu_build(TPM_ORD_PCR_Reset, &offset, txBlob, pcrDataSizeIn, pcrDataIn))) + return result; + + if ((result = req_mgr_submit_req(txBlob))) + return result; + + result = UnloadBlob_Header(txBlob, ¶mSize); + LogResult("PCR Reset", result); + return result; +} |