178064Sume 278064Sume/* 355505Sshin * Licensed Materials - Property of IBM 455505Sshin * 576175Sschweikh * trousers - An open source TCG Software Stack 655505Sshin * 755505Sshin * (C) Copyright International Business Machines Corp. 2004 855505Sshin * (C) Christian Kummer 2007 955505Sshin * 1055505Sshin */ 1155505Sshin 1255505Sshin 1355505Sshin#include <stdlib.h> 1455505Sshin#include <stdio.h> 1555505Sshin#include <string.h> 1655505Sshin#include <inttypes.h> 1776175Sschweikh 1855505Sshin#include "trousers/tss.h" 1955505Sshin#include "trousers_types.h" 2055505Sshin#include "tcs_tsp.h" 2155505Sshin#include "tcsps.h" 2255505Sshin#include "tcs_utils.h" 2355505Sshin#include "tcs_int_literals.h" 2455505Sshin#include "capabilities.h" 2555505Sshin#include "tcslog.h" 2655505Sshin#include "req_mgr.h" 2755505Sshin#include "tcsd_wrap.h" 2855505Sshin#include "tcsd.h" 2955505Sshin 30141580Sru 3155505SshinTSS_RESULT 32231852SbzTCSP_Extend_Internal(TCS_CONTEXT_HANDLE hContext, /* in */ 3355505Sshin TCPA_PCRINDEX pcrNum, /* in */ 3456194Sasmodai TCPA_DIGEST inDigest, /* in */ 3555505Sshin TCPA_PCRVALUE * outDigest) /* out */ 3655505Sshin{ 3778064Sume UINT64 offset = 0; 3855505Sshin TSS_RESULT result; 3983934Sbrooks UINT32 paramSize; 4055505Sshin BYTE txBlob[TSS_TPM_TXBLOB_SIZE]; 4155505Sshin 4255505Sshin LogDebug("Entering Extend"); 4378064Sume if ((result = ctx_verify_context(hContext))) 4478064Sume return result; 4555505Sshin 4658084Sshin /* PCRs are numbered 0 - (NUM_PCRS - 1), thus the >= */ 4755505Sshin if (pcrNum >= tpm_metrics.num_pcrs) 4897451Sbrooks return TCSERR(TSS_E_BAD_PARAMETER); 4997451Sbrooks 5097451Sbrooks if (tcsd_options.kernel_pcrs & (1 << pcrNum)) { 5197451Sbrooks LogInfo("PCR %d is configured to be kernel controlled. Extend request denied.", 5297451Sbrooks pcrNum); 5397451Sbrooks return TCSERR(TSS_E_FAIL); 5497451Sbrooks } 5597451Sbrooks 5697451Sbrooks if (tcsd_options.firmware_pcrs & (1 << pcrNum)) { 5797451Sbrooks LogInfo("PCR %d is configured to be firmware controlled. Extend request denied.", 5897451Sbrooks pcrNum); 5997451Sbrooks return TCSERR(TSS_E_FAIL); 6078064Sume } 61231852Sbz 6255505Sshin if ((result = tpm_rqu_build(TPM_ORD_Extend, &offset, txBlob, pcrNum, TPM_DIGEST_SIZE, 6355505Sshin inDigest.digest, NULL, NULL))) 6478064Sume return result; 65201870Sbrueffer 66201870Sbrueffer if ((result = req_mgr_submit_req(txBlob))) 6755505Sshin return result; 68201870Sbrueffer 69201870Sbrueffer result = UnloadBlob_Header(txBlob, ¶mSize); 7055505Sshin if (!result) { 7178064Sume result = tpm_rsp_parse(TPM_ORD_Extend, txBlob, paramSize, NULL, outDigest->digest); 7255505Sshin } 7378064Sume LogResult("Extend", result); 7455505Sshin return result; 7555505Sshin} 7657798Snik 7755505SshinTSS_RESULT 7855505SshinTCSP_PcrRead_Internal(TCS_CONTEXT_HANDLE hContext, /* in */ 7955505Sshin TCPA_PCRINDEX pcrNum, /* in */ 8056179Sasmodai TCPA_PCRVALUE * outDigest) /* out */ 8155505Sshin{ 82201870Sbrueffer UINT64 offset = 0; 8355505Sshin TSS_RESULT result; 84201870Sbrueffer UINT32 paramSize; 8555505Sshin BYTE txBlob[TSS_TPM_TXBLOB_SIZE]; 86201870Sbrueffer 8755505Sshin LogDebug("Entering PCRRead"); 8855505Sshin 89201870Sbrueffer if ((result = ctx_verify_context(hContext))) 9055505Sshin return result; 9178064Sume 9255505Sshin /* PCRs are numbered 0 - (NUM_PCRS - 1), thus the >= */ 9355505Sshin if (pcrNum >= tpm_metrics.num_pcrs) 9455505Sshin return TCSERR(TSS_E_BAD_PARAMETER); 95201870Sbrueffer 9655505Sshin if ((result = tpm_rqu_build(TPM_ORD_PcrRead, &offset, txBlob, pcrNum, NULL))) 9755505Sshin return result; 98201870Sbrueffer 9955505Sshin if ((result = req_mgr_submit_req(txBlob))) 100201870Sbrueffer return result; 101201870Sbrueffer 102201870Sbrueffer result = UnloadBlob_Header(txBlob, ¶mSize); 10355505Sshin if (!result) { 10455505Sshin result = tpm_rsp_parse(TPM_ORD_PcrRead, txBlob, paramSize, NULL, outDigest->digest); 10555505Sshin } 10655505Sshin LogResult("PCR Read", result); 10755505Sshin return result; 108201870Sbrueffer} 10955505Sshin 11055505SshinTSS_RESULT 11178064SumeTCSP_PcrReset_Internal(TCS_CONTEXT_HANDLE hContext, /* in */ 11255505Sshin UINT32 pcrDataSizeIn, /* in */ 113201870Sbrueffer BYTE * pcrDataIn) /* in */ 11455505Sshin{ 11555505Sshin UINT64 offset = 0; 11655505Sshin TSS_RESULT result; 117201870Sbrueffer UINT32 paramSize; 11855505Sshin BYTE txBlob[TSS_TPM_TXBLOB_SIZE]; 11955505Sshin 12055505Sshin LogDebug("Entering PCRReset"); 12155505Sshin 12255505Sshin if ((result = ctx_verify_context(hContext))) 12355505Sshin return result; 12456179Sasmodai 12578064Sume if ((result = tpm_rqu_build(TPM_ORD_PCR_Reset, &offset, txBlob, pcrDataSizeIn, pcrDataIn))) 12678064Sume return result; 12778064Sume 12878064Sume if ((result = req_mgr_submit_req(txBlob))) 129145358Ssuz return result; 13078064Sume 13155505Sshin result = UnloadBlob_Header(txBlob, ¶mSize); 132201870Sbrueffer LogResult("PCR Reset", result); 13355505Sshin return result; 134} 135