/* * Licensed Materials - Property of IBM * * trousers - An open source TCG Software Stack * * (C) Copyright International Business Machines Corp. 2007 * */ #include #include #include #include "trousers/tss.h" #include "trousers_types.h" #include "tcs_tsp.h" #include "tcs_utils.h" #include "tcs_int_literals.h" #include "capabilities.h" #include "tcslog.h" #include "tcsps.h" #include "req_mgr.h" TSS_RESULT TCSP_ReadCounter_Internal(TCS_CONTEXT_HANDLE hContext, TSS_COUNTER_ID idCounter, TPM_COUNTER_VALUE* counterValue) { TSS_RESULT result; UINT32 paramSize; UINT64 offset = 0; BYTE txBlob[TSS_TPM_TXBLOB_SIZE]; if ((result = ctx_verify_context(hContext))) return result; if ((result = tpm_rqu_build(TPM_ORD_ReadCounter, &offset, txBlob, idCounter, NULL))) return result; if ((result = req_mgr_submit_req(txBlob))) goto out; if ((result = UnloadBlob_Header(txBlob, ¶mSize))) { LogDebugFn("TPM_ReadCounter failed: rc=0x%x", result); goto out; } if (!result) { result = tpm_rsp_parse(TPM_ORD_ReadCounter, txBlob, paramSize, NULL, counterValue, NULL); } out: return result; } TSS_RESULT TCSP_CreateCounter_Internal(TCS_CONTEXT_HANDLE hContext, UINT32 LabelSize, BYTE* pLabel, TPM_ENCAUTH CounterAuth, TPM_AUTH* pOwnerAuth, TSS_COUNTER_ID* idCounter, TPM_COUNTER_VALUE* counterValue) { TSS_RESULT result; UINT32 paramSize; UINT64 offset = 0; BYTE txBlob[TSS_TPM_TXBLOB_SIZE]; if (LabelSize != 4) { LogDebugFn("BAD_PARAMETER: LabelSize != 4"); return TCSERR(TSS_E_BAD_PARAMETER); } if ((result = ctx_verify_context(hContext))) return result; if ((result = auth_mgr_check(hContext, &pOwnerAuth->AuthHandle))) return result; if ((result = tpm_rqu_build(TPM_ORD_CreateCounter, &offset, txBlob, CounterAuth.authdata, LabelSize, pLabel, pOwnerAuth))) return result; if ((result = req_mgr_submit_req(txBlob))) goto out; if ((result = UnloadBlob_Header(txBlob, ¶mSize))) { LogDebugFn("TPM_CreateCounter failed: rc=0x%x", result); goto out; } if (!result) { result = tpm_rsp_parse(TPM_ORD_CreateCounter, txBlob, paramSize, idCounter, counterValue, pOwnerAuth); } out: return result; } TSS_RESULT TCSP_IncrementCounter_Internal(TCS_CONTEXT_HANDLE hContext, TSS_COUNTER_ID idCounter, TPM_AUTH* pCounterAuth, TPM_COUNTER_VALUE* counterValue) { TSS_RESULT result; UINT32 paramSize; UINT64 offset = 0; BYTE txBlob[TSS_TPM_TXBLOB_SIZE]; if ((result = ctx_verify_context(hContext))) return result; if ((result = auth_mgr_check(hContext, &pCounterAuth->AuthHandle))) return result; if ((result = tpm_rqu_build(TPM_ORD_IncrementCounter, &offset, txBlob, idCounter, pCounterAuth))) return result; if ((result = req_mgr_submit_req(txBlob))) goto out; if ((result = UnloadBlob_Header(txBlob, ¶mSize))) { LogDebugFn("UnloadBlob_Header failed: rc=0x%x", result); goto out; } if (!result) { result = tpm_rsp_parse(TPM_ORD_IncrementCounter, txBlob, paramSize, NULL, counterValue, pCounterAuth); } out: return result; } TSS_RESULT TCSP_ReleaseCounter_Internal(TCS_CONTEXT_HANDLE hContext, TSS_COUNTER_ID idCounter, TPM_AUTH* pCounterAuth) { TSS_RESULT result; UINT32 paramSize; UINT64 offset = 0; BYTE txBlob[TSS_TPM_TXBLOB_SIZE]; if ((result = ctx_verify_context(hContext))) return result; if ((result = auth_mgr_check(hContext, &pCounterAuth->AuthHandle))) return result; if ((result = tpm_rqu_build(TPM_ORD_ReleaseCounter, &offset, txBlob, idCounter, pCounterAuth))) return result; if ((result = req_mgr_submit_req(txBlob))) goto out; if ((result = UnloadBlob_Header(txBlob, ¶mSize))) { LogDebugFn("UnloadBlob_Header failed: rc=0x%x", result); goto out; } if (!result) { result = tpm_rsp_parse(TPM_ORD_ReleaseCounter, txBlob, paramSize, pCounterAuth); } out: return result; } TSS_RESULT TCSP_ReleaseCounterOwner_Internal(TCS_CONTEXT_HANDLE hContext, TSS_COUNTER_ID idCounter, TPM_AUTH* pOwnerAuth) { TSS_RESULT result; UINT32 paramSize; UINT64 offset = 0; BYTE txBlob[TSS_TPM_TXBLOB_SIZE]; if ((result = ctx_verify_context(hContext))) return result; if ((result = auth_mgr_check(hContext, &pOwnerAuth->AuthHandle))) return result; if ((result = tpm_rqu_build(TPM_ORD_ReleaseCounterOwner, &offset, txBlob, idCounter, pOwnerAuth))) return result; if ((result = req_mgr_submit_req(txBlob))) goto out; if ((result = UnloadBlob_Header(txBlob, ¶mSize))) { LogDebugFn("UnloadBlob_Header failed: rc=0x%x", result); goto out; } if (!result) { result = tpm_rsp_parse(TPM_ORD_ReleaseCounterOwner, txBlob, paramSize, pOwnerAuth); } out: return result; }