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 <string.h>
14
15 #include "trousers/tss.h"
16 #include "trousers/trousers.h"
17 #include "trousers_types.h"
18 #include "spi_utils.h"
19 #include "capabilities.h"
20 #include "tsplog.h"
21 #include "obj.h"
22
23
24 #ifdef TSS_BUILD_TRANSPORT
25 TSS_RESULT
Transport_GetCapabilityOwner(TSS_HCONTEXT tspContext,TPM_AUTH * pOwnerAuth,TCPA_VERSION * pVersion,UINT32 * pNonVolatileFlags,UINT32 * pVolatileFlags)26 Transport_GetCapabilityOwner(TSS_HCONTEXT tspContext, /* in */
27 TPM_AUTH * pOwnerAuth, /* in/out */
28 TCPA_VERSION * pVersion, /* out */
29 UINT32 * pNonVolatileFlags, /* out */
30 UINT32 * pVolatileFlags) /* out */
31 {
32 UINT64 offset;
33 TSS_RESULT result;
34 UINT32 handlesLen = 0, decLen;
35 BYTE *dec;
36
37 if ((result = obj_context_transport_init(tspContext)))
38 return result;
39
40 LogDebugFn("Executing in a transport session");
41
42 if ((result = obj_context_transport_execute(tspContext, TPM_ORD_GetCapabilityOwner, 0, NULL,
43 NULL, &handlesLen, NULL, pOwnerAuth, NULL,
44 &decLen, &dec)))
45 return result;
46
47 offset = 0;
48 Trspi_UnloadBlob_TCPA_VERSION(&offset, dec, pVersion);
49 Trspi_UnloadBlob_UINT32(&offset, pNonVolatileFlags, dec);
50 Trspi_UnloadBlob_UINT32(&offset, pVolatileFlags, dec);
51
52 free(dec);
53
54 return result;
55 }
56
57 TSS_RESULT
Transport_SetOwnerInstall(TSS_HCONTEXT tspContext,TSS_BOOL state)58 Transport_SetOwnerInstall(TSS_HCONTEXT tspContext, /* in */
59 TSS_BOOL state) /* in */
60 {
61 TSS_RESULT result;
62 UINT32 handlesLen = 0;
63
64 if ((result = obj_context_transport_init(tspContext)))
65 return result;
66
67 LogDebugFn("Executing in a transport session");
68
69 result = obj_context_transport_execute(tspContext, TPM_ORD_SetOwnerInstall,
70 sizeof(TSS_BOOL), (BYTE *)&state, NULL, &handlesLen,
71 NULL, NULL, NULL, NULL, NULL);
72
73 return result;
74 }
75
76 TSS_RESULT
Transport_DisableOwnerClear(TSS_HCONTEXT tspContext,TPM_AUTH * ownerAuth)77 Transport_DisableOwnerClear(TSS_HCONTEXT tspContext, /* in */
78 TPM_AUTH * ownerAuth) /* in, out */
79 {
80 TSS_RESULT result;
81 UINT32 handlesLen = 0;
82
83 if ((result = obj_context_transport_init(tspContext)))
84 return result;
85
86 LogDebugFn("Executing in a transport session");
87
88 result = obj_context_transport_execute(tspContext, TPM_ORD_DisableOwnerClear, 0, NULL, NULL,
89 &handlesLen, NULL, ownerAuth, NULL, NULL, NULL);
90
91 return result;
92 }
93
94 TSS_RESULT
Transport_DisableForceClear(TSS_HCONTEXT tspContext)95 Transport_DisableForceClear(TSS_HCONTEXT tspContext) /* in */
96 {
97 TSS_RESULT result;
98 UINT32 handlesLen = 0;
99
100 if ((result = obj_context_transport_init(tspContext)))
101 return result;
102
103 LogDebugFn("Executing in a transport session");
104
105 result = obj_context_transport_execute(tspContext, TPM_ORD_DisableForceClear, 0, NULL, NULL,
106 &handlesLen, NULL, NULL, NULL, NULL, NULL);
107
108 return result;
109 }
110
111 TSS_RESULT
Transport_OwnerSetDisable(TSS_HCONTEXT tspContext,TSS_BOOL disableState,TPM_AUTH * ownerAuth)112 Transport_OwnerSetDisable(TSS_HCONTEXT tspContext, /* in */
113 TSS_BOOL disableState, /* in */
114 TPM_AUTH * ownerAuth) /* in, out */
115 {
116 TSS_RESULT result;
117 UINT32 handlesLen = 0;
118
119 if ((result = obj_context_transport_init(tspContext)))
120 return result;
121
122 LogDebugFn("Executing in a transport session");
123
124 result = obj_context_transport_execute(tspContext, TPM_ORD_OwnerSetDisable,
125 sizeof(TSS_BOOL), (BYTE *)&disableState, NULL,
126 &handlesLen, NULL, ownerAuth, NULL, NULL, NULL);
127
128 return result;
129 }
130
131 TSS_RESULT
Transport_PhysicalDisable(TSS_HCONTEXT tspContext)132 Transport_PhysicalDisable(TSS_HCONTEXT tspContext) /* in */
133 {
134 TSS_RESULT result;
135 UINT32 handlesLen = 0;
136
137 if ((result = obj_context_transport_init(tspContext)))
138 return result;
139
140 LogDebugFn("Executing in a transport session");
141
142 result = obj_context_transport_execute(tspContext, TPM_ORD_PhysicalDisable, 0, NULL, NULL,
143 &handlesLen, NULL, NULL, NULL, NULL, NULL);
144
145 return result;
146 }
147
148 TSS_RESULT
Transport_PhysicalEnable(TSS_HCONTEXT tspContext)149 Transport_PhysicalEnable(TSS_HCONTEXT tspContext) /* in */
150 {
151 TSS_RESULT result;
152 UINT32 handlesLen = 0;
153
154 if ((result = obj_context_transport_init(tspContext)))
155 return result;
156
157 LogDebugFn("Executing in a transport session");
158
159 result = obj_context_transport_execute(tspContext, TPM_ORD_PhysicalEnable, 0, NULL, NULL,
160 &handlesLen, NULL, NULL, NULL, NULL, NULL);
161
162 return result;
163 }
164
165 TSS_RESULT
Transport_PhysicalSetDeactivated(TSS_HCONTEXT tspContext,TSS_BOOL state)166 Transport_PhysicalSetDeactivated(TSS_HCONTEXT tspContext, /* in */
167 TSS_BOOL state) /* in */
168 {
169 TSS_RESULT result;
170 UINT32 handlesLen = 0;
171
172 if ((result = obj_context_transport_init(tspContext)))
173 return result;
174
175 LogDebugFn("Executing in a transport session");
176
177 result = obj_context_transport_execute(tspContext, TPM_ORD_PhysicalSetDeactivated,
178 sizeof(TSS_BOOL), (BYTE *)&state, NULL, &handlesLen,
179 NULL, NULL, NULL, NULL, NULL);
180
181 return result;
182 }
183
184 TSS_RESULT
Transport_SetTempDeactivated(TSS_HCONTEXT tspContext)185 Transport_SetTempDeactivated(TSS_HCONTEXT tspContext) /* in */
186 {
187 TSS_RESULT result;
188 UINT32 handlesLen = 0;
189
190 if ((result = obj_context_transport_init(tspContext)))
191 return result;
192
193 LogDebugFn("Executing in a transport session");
194
195 result = obj_context_transport_execute(tspContext, TPM_ORD_SetTempDeactivated, 0, NULL,
196 NULL, &handlesLen, NULL, NULL, NULL, NULL, NULL);
197
198 return result;
199 }
200
201 TSS_RESULT
Transport_SetTempDeactivated2(TSS_HCONTEXT tspContext,TPM_AUTH * operatorAuth)202 Transport_SetTempDeactivated2(TSS_HCONTEXT tspContext, /* in */
203 TPM_AUTH *operatorAuth) /* in, out */
204 {
205 TSS_RESULT result;
206 UINT32 handlesLen = 0;
207
208 if ((result = obj_context_transport_init(tspContext)))
209 return result;
210
211 LogDebugFn("Executing in a transport session");
212
213 result = obj_context_transport_execute(tspContext, TPM_ORD_SetTempDeactivated, 0, NULL,
214 NULL, &handlesLen, NULL, operatorAuth, NULL, NULL,
215 NULL);
216
217 return result;
218 }
219
220 TSS_RESULT
Transport_DisablePubekRead(TSS_HCONTEXT tspContext,TPM_AUTH * ownerAuth)221 Transport_DisablePubekRead(TSS_HCONTEXT tspContext, /* in */
222 TPM_AUTH * ownerAuth) /* in, out */
223 {
224 TSS_RESULT result;
225 UINT32 handlesLen = 0;
226
227 if ((result = obj_context_transport_init(tspContext)))
228 return result;
229
230 LogDebugFn("Executing in a transport session");
231
232 result = obj_context_transport_execute(tspContext, TPM_ORD_DisablePubekRead, 0, NULL, NULL,
233 &handlesLen, NULL, ownerAuth, NULL, NULL, NULL);
234
235 return result;
236 }
237
238 TSS_RESULT
Transport_ResetLockValue(TSS_HCONTEXT tspContext,TPM_AUTH * ownerAuth)239 Transport_ResetLockValue(TSS_HCONTEXT tspContext, /* in */
240 TPM_AUTH * ownerAuth) /* in, out */
241 {
242 TSS_RESULT result;
243 UINT32 handlesLen = 0;
244
245 if ((result = obj_context_transport_init(tspContext)))
246 return result;
247
248 LogDebugFn("Executing in a transport session");
249
250 result = obj_context_transport_execute(tspContext, TPM_ORD_ResetLockValue, 0, NULL, NULL,
251 &handlesLen, NULL, ownerAuth, NULL, NULL, NULL);
252
253 return result;
254 }
255
256 TSS_RESULT
Transport_PhysicalPresence(TSS_HCONTEXT tspContext,TCPA_PHYSICAL_PRESENCE fPhysicalPresence)257 Transport_PhysicalPresence(TSS_HCONTEXT tspContext, /* in */
258 TCPA_PHYSICAL_PRESENCE fPhysicalPresence) /* in */
259 {
260 TSS_RESULT result;
261 UINT32 handlesLen = 0;
262
263 if ((result = obj_context_transport_init(tspContext)))
264 return result;
265
266 LogDebugFn("Executing in a transport session");
267
268 result = obj_context_transport_execute(tspContext, TSC_ORD_PhysicalPresence,
269 sizeof(TCPA_PHYSICAL_PRESENCE),
270 (BYTE *)&fPhysicalPresence, NULL, &handlesLen, NULL,
271 NULL, NULL, NULL, NULL);
272
273 return result;
274 }
275
276 TSS_RESULT
Transport_FlushSpecific(TSS_HCONTEXT tspContext,TCS_HANDLE hResHandle,TPM_RESOURCE_TYPE resourceType)277 Transport_FlushSpecific(TSS_HCONTEXT tspContext, /* in */
278 TCS_HANDLE hResHandle, /* in */
279 TPM_RESOURCE_TYPE resourceType) /* in */
280 {
281 UINT64 offset;
282 TSS_RESULT result;
283 UINT32 handlesLen = 1;
284 TCS_HANDLE *handles, handle;
285 BYTE data[sizeof(UINT32)];
286
287 if ((result = obj_context_transport_init(tspContext)))
288 return result;
289
290 LogDebugFn("Executing in a transport session");
291
292 handle = hResHandle;
293 handles = &handle;
294
295 offset = 0;
296 Trspi_LoadBlob_UINT32(&offset, resourceType, data);
297
298 result = obj_context_transport_execute(tspContext, TPM_ORD_FlushSpecific, sizeof(data),
299 data, NULL, &handlesLen, &handles, NULL, NULL, NULL,
300 NULL);
301
302 return result;
303 }
304 #endif
305
306