xref: /netbsd-src/crypto/external/cpl/trousers/dist/src/tspi/tspi_pcr_extend.c (revision 2d5f7628c5531eb583b9313ac2fd1cf8582b4479)
1 
2 /*
3  * Licensed Materials - Property of IBM
4  *
5  * trousers - An open source TCG Software Stack
6  *
7  * (C) Copyright International Business Machines Corp. 2004-2006
8  * (C) Christian Kummer 2007
9  *
10  */
11 
12 #include <stdlib.h>
13 #include <stdio.h>
14 #include <string.h>
15 #include <inttypes.h>
16 
17 #include "trousers/tss.h"
18 #include "trousers/trousers.h"
19 #include "trousers_types.h"
20 #include "spi_utils.h"
21 #include "capabilities.h"
22 #include "tsplog.h"
23 #include "obj.h"
24 
25 
26 TSS_RESULT
Tspi_TPM_PcrExtend(TSS_HTPM hTPM,UINT32 ulPcrIndex,UINT32 ulPcrDataLength,BYTE * pbPcrData,TSS_PCR_EVENT * pPcrEvent,UINT32 * pulPcrValueLength,BYTE ** prgbPcrValue)27 Tspi_TPM_PcrExtend(TSS_HTPM hTPM,		/* in */
28 		   UINT32 ulPcrIndex,		/* in */
29 		   UINT32 ulPcrDataLength,	/* in */
30 		   BYTE *pbPcrData,		/* in */
31 		   TSS_PCR_EVENT *pPcrEvent,	/* in */
32 		   UINT32 * pulPcrValueLength,	/* out */
33 		   BYTE ** prgbPcrValue)	/* out */
34 {
35 	TCPA_PCRVALUE outDigest;
36 	TSS_RESULT result;
37 	BYTE *extendData;
38 	TPM_DIGEST digest;
39 	UINT32 number;
40 	TSS_HCONTEXT tspContext;
41 	Trspi_HashCtx hashCtx;
42 
43 	if (pulPcrValueLength == NULL || prgbPcrValue == NULL)
44 		return TSPERR(TSS_E_BAD_PARAMETER);
45 
46 	if (ulPcrDataLength > 0 && pbPcrData == NULL)
47 		return TSPERR(TSS_E_BAD_PARAMETER);
48 
49 	if ((result = obj_tpm_get_tsp_context(hTPM, &tspContext)))
50 		return result;
51 
52 	if (pPcrEvent) {
53 		/* Create data to extend according to the TSS 1.2 spec section 2.6.2
54 		 * 'TSS_PCR_EVENT', in the 'rgbPcrValue' parameter description. */
55 		result = Trspi_HashInit(&hashCtx, TSS_HASH_SHA1);
56 		result |= Trspi_Hash_UINT32(&hashCtx, ulPcrIndex);
57 		result |= Trspi_HashUpdate(&hashCtx, ulPcrDataLength, pbPcrData);
58 		result |= Trspi_Hash_UINT32(&hashCtx, pPcrEvent->eventType);
59 		result |= Trspi_HashUpdate(&hashCtx, pPcrEvent->ulEventLength, pPcrEvent->rgbEvent);
60 		if ((result |= Trspi_HashFinal(&hashCtx, (BYTE *)&digest.digest)))
61 			return result;
62 
63 		extendData = (BYTE *)&digest.digest;
64 	} else {
65 		if (ulPcrDataLength != TPM_SHA1_160_HASH_LEN)
66 			return TSPERR(TSS_E_BAD_PARAMETER);
67 
68 		extendData = pbPcrData;
69 	}
70 
71 	if ((result = TCS_API(tspContext)->Extend(tspContext, ulPcrIndex, *(TPM_DIGEST *)extendData,
72 						  &outDigest)))
73 		return result;
74 
75 	/* log the event structure if its passed in */
76 	if (pPcrEvent) {
77 		/* Set the PCR index in the event struct */
78 		pPcrEvent->ulPcrIndex = ulPcrIndex;
79 
80 		if ((pPcrEvent->rgbPcrValue = calloc_tspi(tspContext,
81 							  TPM_SHA1_160_HASH_LEN)) == NULL) {
82 			LogError("malloc of %d bytes failed.", TPM_SHA1_160_HASH_LEN);
83 			return TSPERR(TSS_E_OUTOFMEMORY);
84 		}
85 
86 		memcpy(pPcrEvent->rgbPcrValue, (BYTE *)&digest.digest, TPM_SHA1_160_HASH_LEN);
87 		pPcrEvent->ulPcrValueLength = TPM_SHA1_160_HASH_LEN;
88 
89 		/* Set the version info in the event struct */
90 		memcpy(&pPcrEvent->versionInfo, &VERSION_1_1, sizeof(TCPA_VERSION));
91 
92 		if ((result = RPC_LogPcrEvent(tspContext, *pPcrEvent, &number)))
93 			return result;
94 	}
95 
96 	*prgbPcrValue = calloc_tspi(tspContext, sizeof(TPM_PCRVALUE));
97 	if (*prgbPcrValue == NULL) {
98 		LogError("malloc of %zd bytes failed.", sizeof(TPM_PCRVALUE));
99 		return TSPERR(TSS_E_OUTOFMEMORY);
100 	}
101 
102 	memcpy(*prgbPcrValue, &outDigest, sizeof(TPM_PCRVALUE));
103 	*pulPcrValueLength = sizeof(TPM_PCRVALUE);
104 
105 	return result;
106 }
107 
108 TSS_RESULT
Tspi_TPM_PcrRead(TSS_HTPM hTPM,UINT32 ulPcrIndex,UINT32 * pulPcrValueLength,BYTE ** prgbPcrValue)109 Tspi_TPM_PcrRead(TSS_HTPM hTPM,			/* in */
110 		 UINT32 ulPcrIndex,		/* in */
111 		 UINT32 *pulPcrValueLength,	/* out */
112 		 BYTE **prgbPcrValue)		/* out */
113 {
114 	TCPA_PCRVALUE outDigest;
115 	TSS_RESULT result;
116 	TSS_HCONTEXT tspContext;
117 
118 	if (pulPcrValueLength == NULL || prgbPcrValue == NULL)
119 		return TSPERR(TSS_E_BAD_PARAMETER);
120 
121 	if ((result = obj_tpm_get_tsp_context(hTPM, &tspContext)))
122 		return result;
123 
124 	if ((result = TCS_API(tspContext)->PcrRead(tspContext, ulPcrIndex, &outDigest)))
125 		return result;
126 
127 	*prgbPcrValue = calloc_tspi(tspContext, sizeof(TCPA_PCRVALUE));
128 	if (*prgbPcrValue == NULL) {
129 		LogError("malloc of %zd bytes failed.", sizeof(TCPA_PCRVALUE));
130 		return TSPERR(TSS_E_OUTOFMEMORY);
131 	}
132 	memcpy(*prgbPcrValue, outDigest.digest, sizeof(TCPA_PCRVALUE));
133 	*pulPcrValueLength = sizeof(TCPA_PCRVALUE);
134 
135 	return TSS_SUCCESS;
136 }
137 
138 TSS_RESULT
Tspi_TPM_PcrReset(TSS_HTPM hTPM,TSS_HPCRS hPcrComposite)139 Tspi_TPM_PcrReset(TSS_HTPM hTPM,                 /* in */
140 		  TSS_HPCRS hPcrComposite)       /* in */
141 {
142 	TSS_RESULT result;
143 	TSS_HCONTEXT tspContext;
144 	UINT32 pcrDataSize;
145 	BYTE pcrData[16];
146 
147 	if (!hPcrComposite)
148 		return TSPERR(TSS_E_BAD_PARAMETER);
149 
150 	if ((result = obj_tpm_get_tsp_context(hTPM, &tspContext)))
151 		return result;
152 
153 	if ((result = obj_pcrs_get_selection(hPcrComposite, &pcrDataSize, pcrData)))
154 		return result;
155 
156 	return TCS_API(tspContext)->PcrReset(tspContext, pcrDataSize, pcrData);
157 }
158 
159