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
27 TSS_RESULT
TCSP_ReadCounter_Internal(TCS_CONTEXT_HANDLE hContext,TSS_COUNTER_ID idCounter,TPM_COUNTER_VALUE * counterValue)28 TCSP_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, ¶mSize))) {
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
56 out:
57 return result;
58 }
59
60 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)61 TCSP_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, ¶mSize))) {
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
102 out:
103 return result;
104 }
105
106 TSS_RESULT
TCSP_IncrementCounter_Internal(TCS_CONTEXT_HANDLE hContext,TSS_COUNTER_ID idCounter,TPM_AUTH * pCounterAuth,TPM_COUNTER_VALUE * counterValue)107 TCSP_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, ¶mSize))) {
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 }
139 out:
140 return result;
141 }
142
143 TSS_RESULT
TCSP_ReleaseCounter_Internal(TCS_CONTEXT_HANDLE hContext,TSS_COUNTER_ID idCounter,TPM_AUTH * pCounterAuth)144 TCSP_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, ¶mSize))) {
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 }
174 out:
175 return result;
176 }
177
178 TSS_RESULT
TCSP_ReleaseCounterOwner_Internal(TCS_CONTEXT_HANDLE hContext,TSS_COUNTER_ID idCounter,TPM_AUTH * pOwnerAuth)179 TCSP_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, ¶mSize))) {
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 }
209 out:
210 return result;
211 }
212
213