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. 2007
8 *
9 */
10
11
12#include <stdlib.h>
13#include <stdio.h>
14#include <string.h>
15
16#include "trousers/tss.h"
17#include "trousers_types.h"
18#include "tcs_tsp.h"
19#include "tcs_utils.h"
20#include "tcs_int_literals.h"
21#include "capabilities.h"
22#include "tcslog.h"
23#include "tcsps.h"
24#include "req_mgr.h"
25
26
27TSS_RESULT
28TCSP_ReadCounter_Internal(TCS_CONTEXT_HANDLE hContext,
29			  TSS_COUNTER_ID     idCounter,
30			  TPM_COUNTER_VALUE* counterValue)
31{
32	TSS_RESULT result;
33	UINT32 paramSize;
34	UINT64 offset = 0;
35	BYTE txBlob[TSS_TPM_TXBLOB_SIZE];
36
37	if ((result = ctx_verify_context(hContext)))
38		return result;
39
40	if ((result = tpm_rqu_build(TPM_ORD_ReadCounter, &offset, txBlob, idCounter, NULL)))
41		return result;
42
43	if ((result = req_mgr_submit_req(txBlob)))
44		goto out;
45
46	if ((result = UnloadBlob_Header(txBlob, &paramSize))) {
47		LogDebugFn("TPM_ReadCounter failed: rc=0x%x", result);
48		goto out;
49	}
50
51	if (!result) {
52		result = tpm_rsp_parse(TPM_ORD_ReadCounter, txBlob, paramSize, NULL, counterValue,
53				       NULL);
54	}
55
56out:
57	return result;
58}
59
60TSS_RESULT
61TCSP_CreateCounter_Internal(TCS_CONTEXT_HANDLE hContext,
62			    UINT32             LabelSize,
63			    BYTE*              pLabel,
64			    TPM_ENCAUTH        CounterAuth,
65			    TPM_AUTH*          pOwnerAuth,
66			    TSS_COUNTER_ID*    idCounter,
67			    TPM_COUNTER_VALUE* counterValue)
68{
69	TSS_RESULT result;
70	UINT32 paramSize;
71	UINT64 offset = 0;
72	BYTE txBlob[TSS_TPM_TXBLOB_SIZE];
73
74	if (LabelSize != 4) {
75		LogDebugFn("BAD_PARAMETER: LabelSize != 4");
76		return TCSERR(TSS_E_BAD_PARAMETER);
77	}
78
79	if ((result = ctx_verify_context(hContext)))
80		return result;
81
82	if ((result = auth_mgr_check(hContext, &pOwnerAuth->AuthHandle)))
83		return result;
84
85	if ((result = tpm_rqu_build(TPM_ORD_CreateCounter, &offset, txBlob, CounterAuth.authdata,
86				    LabelSize, pLabel, pOwnerAuth)))
87		return result;
88
89	if ((result = req_mgr_submit_req(txBlob)))
90		goto out;
91
92	if ((result = UnloadBlob_Header(txBlob, &paramSize))) {
93		LogDebugFn("TPM_CreateCounter failed: rc=0x%x", result);
94		goto out;
95	}
96
97	if (!result) {
98		result = tpm_rsp_parse(TPM_ORD_CreateCounter, txBlob, paramSize, idCounter,
99				       counterValue, pOwnerAuth);
100	}
101
102out:
103	return result;
104}
105
106TSS_RESULT
107TCSP_IncrementCounter_Internal(TCS_CONTEXT_HANDLE hContext,
108			       TSS_COUNTER_ID     idCounter,
109			       TPM_AUTH*          pCounterAuth,
110			       TPM_COUNTER_VALUE* counterValue)
111{
112	TSS_RESULT result;
113	UINT32 paramSize;
114	UINT64 offset = 0;
115	BYTE txBlob[TSS_TPM_TXBLOB_SIZE];
116
117	if ((result = ctx_verify_context(hContext)))
118		return result;
119
120	if ((result = auth_mgr_check(hContext, &pCounterAuth->AuthHandle)))
121		return result;
122
123	if ((result = tpm_rqu_build(TPM_ORD_IncrementCounter, &offset, txBlob, idCounter,
124				    pCounterAuth)))
125		return result;
126
127	if ((result = req_mgr_submit_req(txBlob)))
128		goto out;
129
130	if ((result = UnloadBlob_Header(txBlob, &paramSize))) {
131		LogDebugFn("UnloadBlob_Header failed: rc=0x%x", result);
132		goto out;
133	}
134
135	if (!result) {
136		result = tpm_rsp_parse(TPM_ORD_IncrementCounter, txBlob, paramSize, NULL,
137				       counterValue, pCounterAuth);
138	}
139out:
140	return result;
141}
142
143TSS_RESULT
144TCSP_ReleaseCounter_Internal(TCS_CONTEXT_HANDLE hContext,
145			     TSS_COUNTER_ID     idCounter,
146			     TPM_AUTH*          pCounterAuth)
147{
148	TSS_RESULT result;
149	UINT32 paramSize;
150	UINT64 offset = 0;
151	BYTE txBlob[TSS_TPM_TXBLOB_SIZE];
152
153	if ((result = ctx_verify_context(hContext)))
154		return result;
155
156	if ((result = auth_mgr_check(hContext, &pCounterAuth->AuthHandle)))
157		return result;
158
159	if ((result = tpm_rqu_build(TPM_ORD_ReleaseCounter, &offset, txBlob, idCounter,
160				    pCounterAuth)))
161		return result;
162
163	if ((result = req_mgr_submit_req(txBlob)))
164		goto out;
165
166	if ((result = UnloadBlob_Header(txBlob, &paramSize))) {
167		LogDebugFn("UnloadBlob_Header failed: rc=0x%x", result);
168		goto out;
169	}
170
171	if (!result) {
172		result = tpm_rsp_parse(TPM_ORD_ReleaseCounter, txBlob, paramSize, pCounterAuth);
173	}
174out:
175	return result;
176}
177
178TSS_RESULT
179TCSP_ReleaseCounterOwner_Internal(TCS_CONTEXT_HANDLE hContext,
180				  TSS_COUNTER_ID     idCounter,
181				  TPM_AUTH*          pOwnerAuth)
182{
183	TSS_RESULT result;
184	UINT32 paramSize;
185	UINT64 offset = 0;
186	BYTE txBlob[TSS_TPM_TXBLOB_SIZE];
187
188	if ((result = ctx_verify_context(hContext)))
189		return result;
190
191	if ((result = auth_mgr_check(hContext, &pOwnerAuth->AuthHandle)))
192		return result;
193
194	if ((result = tpm_rqu_build(TPM_ORD_ReleaseCounterOwner, &offset, txBlob, idCounter,
195				    pOwnerAuth)))
196		return result;
197
198	if ((result = req_mgr_submit_req(txBlob)))
199		goto out;
200
201	if ((result = UnloadBlob_Header(txBlob, &paramSize))) {
202		LogDebugFn("UnloadBlob_Header failed: rc=0x%x", result);
203		goto out;
204	}
205
206	if (!result) {
207		result = tpm_rsp_parse(TPM_ORD_ReleaseCounterOwner, txBlob, paramSize, pOwnerAuth);
208	}
209out:
210	return result;
211}
212
213