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, &paramSize);
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, &paramSize);
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, &paramSize);
132201870Sbrueffer	LogResult("PCR Reset", result);
13355505Sshin	return result;
134}
135