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, 2007
8  *
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_types.h"
19 #include "tcs_tsp.h"
20 #include "tcsps.h"
21 #include "tcs_utils.h"
22 #include "tcs_int_literals.h"
23 #include "capabilities.h"
24 #include "tcslog.h"
25 #include "req_mgr.h"
26 #include "tcsd_wrap.h"
27 #include "tcsd.h"
28 
29 TSS_RESULT
TCSP_SetOwnerInstall_Internal(TCS_CONTEXT_HANDLE hContext,TSS_BOOL state)30 TCSP_SetOwnerInstall_Internal(TCS_CONTEXT_HANDLE hContext,	/* in */
31 			      TSS_BOOL state)	/* in  */
32 {
33 	UINT64 offset = 0;
34 	UINT32 paramSize;
35 	TSS_RESULT result;
36 	BYTE txBlob[TSS_TPM_TXBLOB_SIZE];
37 
38 	LogDebug("Entering SetOwnerInstall");
39 	if ((result = ctx_verify_context(hContext)))
40 		return result;
41 
42 	if ((result = tpm_rqu_build(TPM_ORD_SetOwnerInstall, &offset, txBlob, state, NULL)))
43 		return result;
44 
45 	if ((result = req_mgr_submit_req(txBlob)))
46 		return result;
47 
48 	result = UnloadBlob_Header(txBlob, &paramSize);
49 	LogResult("SetOwnerInstall", result);
50 	return result;
51 }
52 
53 TSS_RESULT
TCSP_OwnerSetDisable_Internal(TCS_CONTEXT_HANDLE hContext,TSS_BOOL disableState,TPM_AUTH * ownerAuth)54 TCSP_OwnerSetDisable_Internal(TCS_CONTEXT_HANDLE hContext,	/* in */
55 			      TSS_BOOL disableState,	/* in */
56 			      TPM_AUTH * ownerAuth)	/* in, out */
57 {
58 	UINT64 offset = 0;
59 	UINT32 paramSize;
60 	TSS_RESULT result;
61 	BYTE txBlob[TSS_TPM_TXBLOB_SIZE];
62 
63 	if ((result = ctx_verify_context(hContext)))
64 		goto done;
65 
66 	if ((result = auth_mgr_check(hContext, &ownerAuth->AuthHandle)))
67 		goto done;
68 
69 	if ((result = tpm_rqu_build(TPM_ORD_OwnerSetDisable, &offset, txBlob, disableState,
70 				    ownerAuth)))
71 		goto done;
72 
73 	if ((result = req_mgr_submit_req(txBlob)))
74 		goto done;
75 
76 	result = UnloadBlob_Header(txBlob, &paramSize);
77 	if (!result) {
78 		result = tpm_rsp_parse(TPM_ORD_OwnerSetDisable, txBlob, paramSize, ownerAuth);
79 	}
80 done:
81 	auth_mgr_release_auth(ownerAuth, NULL, hContext);
82 	return result;
83 }
84 
85 TSS_RESULT
TCSP_DisableOwnerClear_Internal(TCS_CONTEXT_HANDLE hContext,TPM_AUTH * ownerAuth)86 TCSP_DisableOwnerClear_Internal(TCS_CONTEXT_HANDLE hContext,	/* in */
87 				TPM_AUTH * ownerAuth)	/* in, out */
88 {
89 	UINT64 offset = 0;
90 	UINT32 paramSize;
91 	TSS_RESULT result;
92 	BYTE txBlob[TSS_TPM_TXBLOB_SIZE];
93 
94 	LogDebug("Entering DisableownerClear");
95 
96 	if ((result = ctx_verify_context(hContext)))
97 		goto done;
98 
99 	if ((result = auth_mgr_check(hContext, &ownerAuth->AuthHandle)))
100 		goto done;
101 
102 	if ((result = tpm_rqu_build(TPM_ORD_DisableOwnerClear, &offset, txBlob, ownerAuth)))
103 		goto done;
104 
105 	if ((result = req_mgr_submit_req(txBlob)))
106 		goto done;
107 
108 	result = UnloadBlob_Header(txBlob, &paramSize);
109 	if (!result) {
110 		result = tpm_rsp_parse(TPM_ORD_DisableOwnerClear, txBlob, paramSize, ownerAuth);
111 	}
112 	LogResult("DisableOwnerClear", result);
113 done:
114 	auth_mgr_release_auth(ownerAuth, NULL, hContext);
115 	return result;
116 }
117 
118 TSS_RESULT
TCSP_ForceClear_Internal(TCS_CONTEXT_HANDLE hContext)119 TCSP_ForceClear_Internal(TCS_CONTEXT_HANDLE hContext)	/* in */
120 {
121 	UINT64 offset = 0;
122 	UINT32 paramSize;
123 	TSS_RESULT result;
124 	BYTE txBlob[TSS_TPM_TXBLOB_SIZE];
125 
126 	LogDebug("Entering Force Clear");
127 	if ((result = ctx_verify_context(hContext)))
128 		return result;
129 
130 	if ((result = tpm_rqu_build(TPM_ORD_ForceClear, &offset, txBlob, NULL)))
131 		return result;
132 
133 	if ((result = req_mgr_submit_req(txBlob)))
134 		return result;
135 
136 	result = UnloadBlob_Header(txBlob, &paramSize);
137 	LogResult("Force Clear", result);
138 	return result;
139 }
140 
141 TSS_RESULT
TCSP_DisableForceClear_Internal(TCS_CONTEXT_HANDLE hContext)142 TCSP_DisableForceClear_Internal(TCS_CONTEXT_HANDLE hContext)	/* in */
143 {
144 	UINT64 offset = 0;
145 	UINT32 paramSize;
146 	TSS_RESULT result;
147 	BYTE txBlob[TSS_TPM_TXBLOB_SIZE];
148 
149 	LogDebug("Entering Disable Force Clear");
150 	if ((result = ctx_verify_context(hContext)))
151 		return result;
152 
153 	if ((result = tpm_rqu_build(TPM_ORD_DisableForceClear, &offset, txBlob, NULL)))
154 		return result;
155 
156 	if ((result = req_mgr_submit_req(txBlob)))
157 		return result;
158 
159 	result = UnloadBlob_Header(txBlob, &paramSize);
160 	LogResult("Disable Force Clear", result);
161 	return result;
162 }
163 
164 TSS_RESULT
TCSP_PhysicalPresence_Internal(TCS_CONTEXT_HANDLE hContext,TCPA_PHYSICAL_PRESENCE fPhysicalPresence)165 TCSP_PhysicalPresence_Internal(TCS_CONTEXT_HANDLE hContext, /* in */
166 			TCPA_PHYSICAL_PRESENCE fPhysicalPresence) /* in */
167 {
168 	UINT64 offset = 0;
169 	UINT32 paramSize;
170 	TSS_RESULT result = TCSERR(TSS_E_NOTIMPL);
171 	BYTE txBlob[TSS_TPM_TXBLOB_SIZE];
172 	char runlevel;
173 
174 	runlevel = platform_get_runlevel();
175 
176 	if (runlevel != 's' && runlevel != 'S' && runlevel != '1') {
177 		LogInfo("Physical Presence command denied: Must be in single"
178 				" user mode.");
179 		return TCSERR(TSS_E_NOTIMPL);
180 	}
181 
182 	if ((result = ctx_verify_context(hContext)))
183 		return result;
184 
185 	if ((result = tpm_rqu_build(TSC_ORD_PhysicalPresence, &offset, txBlob, fPhysicalPresence)))
186 		return result;
187 
188 	if ((result = req_mgr_submit_req(txBlob)))
189 		return result;
190 
191 	return UnloadBlob_Header(txBlob, &paramSize);
192 }
193 
194 TSS_RESULT
TCSP_PhysicalDisable_Internal(TCS_CONTEXT_HANDLE hContext)195 TCSP_PhysicalDisable_Internal(TCS_CONTEXT_HANDLE hContext)	/* in */
196 {
197 	UINT64 offset = 0;
198 	UINT32 paramSize;
199 	TSS_RESULT result;
200 	BYTE txBlob[TSS_TPM_TXBLOB_SIZE];
201 
202 	LogDebug("Entering Physical Disable");
203 	if ((result = ctx_verify_context(hContext)))
204 		return result;
205 
206 	if ((result = tpm_rqu_build(TPM_ORD_PhysicalDisable, &offset, txBlob, NULL)))
207 		return result;
208 
209 	if ((result = req_mgr_submit_req(txBlob)))
210 		return result;
211 
212 	result = UnloadBlob_Header(txBlob, &paramSize);
213 	LogResult("Physical Disable", result);
214 
215 	return result;
216 }
217 
218 TSS_RESULT
TCSP_PhysicalEnable_Internal(TCS_CONTEXT_HANDLE hContext)219 TCSP_PhysicalEnable_Internal(TCS_CONTEXT_HANDLE hContext)	/* in */
220 {
221 	UINT64 offset = 0;
222 	TSS_RESULT result;
223 	UINT32 paramSize;
224 	BYTE txBlob[TSS_TPM_TXBLOB_SIZE];
225 
226 	LogDebug("Entering Physical Enable");
227 	if ((result = ctx_verify_context(hContext)))
228 		return result;
229 
230 	if ((result = tpm_rqu_build(TPM_ORD_PhysicalEnable, &offset, txBlob, NULL)))
231 		return result;
232 
233 	if ((result = req_mgr_submit_req(txBlob)))
234 		return result;
235 
236 	result = UnloadBlob_Header(txBlob, &paramSize);
237 	LogResult("Physical Enable", result);
238 
239 	return result;
240 }
241 
242 TSS_RESULT
TCSP_PhysicalSetDeactivated_Internal(TCS_CONTEXT_HANDLE hContext,TSS_BOOL state)243 TCSP_PhysicalSetDeactivated_Internal(TCS_CONTEXT_HANDLE hContext,	/* in */
244 				     TSS_BOOL state)	/* in */
245 {
246 	UINT64 offset = 0;
247 	UINT32 paramSize;
248 	TSS_RESULT result;
249 	BYTE txBlob[TSS_TPM_TXBLOB_SIZE];
250 
251 	LogDebug("Entering Physical Set Deactivated");
252 	if ((result = ctx_verify_context(hContext)))
253 		return result;
254 
255 	if ((result = tpm_rqu_build(TPM_ORD_PhysicalSetDeactivated, &offset, txBlob, state, NULL)))
256 		return result;
257 
258 	if ((result = req_mgr_submit_req(txBlob)))
259 		return result;
260 
261 	result = UnloadBlob_Header(txBlob, &paramSize);
262 	LogResult("PhysicalSetDeactivated", result);
263 	return result;
264 }
265 
266 TSS_RESULT
TCSP_SetTempDeactivated_Internal(TCS_CONTEXT_HANDLE hContext)267 TCSP_SetTempDeactivated_Internal(TCS_CONTEXT_HANDLE hContext)	/* in */
268 {
269 	UINT64 offset = 0;
270 	UINT32 paramSize;
271 	TSS_RESULT result;
272 	BYTE txBlob[TSS_TPM_TXBLOB_SIZE];
273 
274 	LogDebug("Entering Set Temp Deactivated");
275 	if ((result = ctx_verify_context(hContext)))
276 		return result;
277 
278 	if ((result = tpm_rqu_build(TPM_ORD_SetTempDeactivated, &offset, txBlob, NULL)))
279 		return result;
280 
281 	if ((result = req_mgr_submit_req(txBlob)))
282 		return result;
283 
284 	result = UnloadBlob_Header(txBlob, &paramSize);
285 	LogResult("SetTempDeactivated", result);
286 
287 	return result;
288 }
289 
290 #ifdef TSS_BUILD_TSS12
291 TSS_RESULT
TCSP_SetTempDeactivated2_Internal(TCS_CONTEXT_HANDLE hContext,TPM_AUTH * operatorAuth)292 TCSP_SetTempDeactivated2_Internal(TCS_CONTEXT_HANDLE hContext,	/* in */
293 				  TPM_AUTH * operatorAuth)	/* in, out */
294 {
295 	UINT64 offset = 0;
296 	UINT32 paramSize;
297 	TSS_RESULT result;
298 	BYTE txBlob[TSS_TPM_TXBLOB_SIZE];
299 
300 	LogDebug("Entering Set Temp Deactivated2");
301 	if ((result = ctx_verify_context(hContext)))
302 		return result;
303 
304 	if (operatorAuth) {
305 		if ((result = auth_mgr_check(hContext, &operatorAuth->AuthHandle)))
306 			return result;
307 	}
308 
309 	if ((result = tpm_rqu_build(TPM_ORD_SetTempDeactivated, &offset, txBlob, operatorAuth)))
310 		goto done;
311 
312 	if ((result = req_mgr_submit_req(txBlob)))
313 		goto done;
314 
315 	result = UnloadBlob_Header(txBlob, &paramSize);
316 
317 	if (!result) {
318 			result = tpm_rsp_parse(TPM_ORD_SetTempDeactivated, txBlob, paramSize,
319 					       operatorAuth);
320 	}
321 
322 	LogResult("SetTempDeactivated2", result);
323 
324 done:
325 	auth_mgr_release_auth(operatorAuth, NULL, hContext);
326 
327 	return result;
328 }
329 #endif
330 
331 TSS_RESULT
TCSP_FieldUpgrade_Internal(TCS_CONTEXT_HANDLE hContext,UINT32 dataInSize,BYTE * dataIn,UINT32 * dataOutSize,BYTE ** dataOut,TPM_AUTH * ownerAuth)332 TCSP_FieldUpgrade_Internal(TCS_CONTEXT_HANDLE hContext,	/* in */
333 			   UINT32 dataInSize,	/* in */
334 			   BYTE * dataIn,	/* in */
335 			   UINT32 * dataOutSize,	/* out */
336 			   BYTE ** dataOut,	/* out */
337 			   TPM_AUTH * ownerAuth)	/* in, out */
338 {
339 	TSS_RESULT result;
340 	UINT32 paramSize;
341 	UINT64 offset = 0;
342 	BYTE txBlob[TSS_TPM_TXBLOB_SIZE];
343 
344 	LogDebug("Field Upgrade");
345 
346 	if ((result = ctx_verify_context(hContext)))
347 		goto done;
348 
349 	if ((result = auth_mgr_check(hContext, &ownerAuth->AuthHandle)))
350 		goto done;
351 
352 	if ((result = tpm_rqu_build(TPM_ORD_FieldUpgrade, &offset, txBlob, dataInSize, dataInSize,
353 				    dataIn, ownerAuth, NULL)))
354 		return result;
355 
356 	if ((result = req_mgr_submit_req(txBlob)))
357 		goto done;
358 
359 	result = UnloadBlob_Header(txBlob, &paramSize);
360 
361 	if (!result) {
362 		result = tpm_rsp_parse(TPM_ORD_FieldUpgrade, txBlob, paramSize, dataOutSize,
363 				       dataOut, ownerAuth);
364 	}
365 	LogResult("Field Upgrade", result);
366 done:
367 	auth_mgr_release_auth(ownerAuth, NULL, hContext);
368 	return result;
369 }
370 
371 TSS_RESULT
TCSP_SetRedirection_Internal(TCS_CONTEXT_HANDLE hContext,TCS_KEY_HANDLE keyHandle,UINT32 c1,UINT32 c2,TPM_AUTH * privAuth)372 TCSP_SetRedirection_Internal(TCS_CONTEXT_HANDLE hContext,	/* in */
373 			     TCS_KEY_HANDLE keyHandle,	/* in */
374 			     UINT32 c1,	/* in */
375 			     UINT32 c2,	/* in */
376 			     TPM_AUTH * privAuth)	/* in, out */
377 {
378 	TSS_RESULT result;
379 	UINT32 paramSize;
380 	UINT64 offset = 0;
381 	TCPA_KEY_HANDLE keySlot;
382 	BYTE txBlob[TSS_TPM_TXBLOB_SIZE];
383 
384 	LogDebug("Set Redirection");
385 
386 	if ((result = ctx_verify_context(hContext)))
387 		goto done;
388 
389 	if (privAuth != NULL) {
390 		if ((result = auth_mgr_check(hContext, &privAuth->AuthHandle)))
391 			goto done;
392 	}
393 
394 	if ((result = ensureKeyIsLoaded(hContext, keyHandle, &keySlot))) {
395 		result = TCSERR(TSS_E_FAIL);
396 		goto done;
397 	}
398 
399 	if ((result = tpm_rqu_build(TPM_ORD_SetRedirection, &offset, txBlob, keySlot, c1, c2,
400 				    privAuth)))
401 		goto done;
402 
403 	if ((result = req_mgr_submit_req(txBlob)))
404 		goto done;
405 
406 	result = UnloadBlob_Header(txBlob, &paramSize);
407 
408 	if (!result) {
409 		result = tpm_rsp_parse(TPM_ORD_SetRedirection, txBlob, paramSize, privAuth);
410 	}
411 	LogResult("Set Redirection", result);
412 done:
413 	auth_mgr_release_auth(privAuth, NULL, hContext);
414 	return result;
415 }
416 
417 #ifdef TSS_BUILD_TSS12
418 TSS_RESULT
TCSP_ResetLockValue_Internal(TCS_CONTEXT_HANDLE hContext,TPM_AUTH * ownerAuth)419 TCSP_ResetLockValue_Internal(TCS_CONTEXT_HANDLE hContext,	/* in */
420 			     TPM_AUTH * ownerAuth)	/* in, out */
421 {
422 	UINT64 offset = 0;
423 	UINT32 paramSize;
424 	TSS_RESULT result;
425 	BYTE txBlob[TSS_TPM_TXBLOB_SIZE];
426 
427 	if ((result = ctx_verify_context(hContext)))
428 		goto done;
429 
430 	if ((result = auth_mgr_check(hContext, &ownerAuth->AuthHandle)))
431 		goto done;
432 
433 	if ((result = tpm_rqu_build(TPM_ORD_ResetLockValue, &offset, txBlob, ownerAuth)))
434 		return result;
435 
436 	if ((result = req_mgr_submit_req(txBlob)))
437 		goto done;
438 
439 	result = UnloadBlob_Header(txBlob, &paramSize);
440 	if (!result) {
441 		result = tpm_rsp_parse(TPM_ORD_ResetLockValue, txBlob, paramSize, ownerAuth);
442 	}
443 
444 done:
445 	auth_mgr_release_auth(ownerAuth, NULL, hContext);
446 	return result;
447 }
448 
449 TSS_RESULT
TCSP_FlushSpecific_Common(UINT32 tpmResHandle,TPM_RESOURCE_TYPE resourceType)450 TCSP_FlushSpecific_Common(UINT32 tpmResHandle, TPM_RESOURCE_TYPE resourceType)
451 {
452 	UINT64 offset = 0;
453 	UINT32 paramSize;
454 	TSS_RESULT result;
455 	BYTE txBlob[TSS_TPM_TXBLOB_SIZE];
456 
457 	if ((result = tpm_rqu_build(TPM_ORD_FlushSpecific, &offset, txBlob, tpmResHandle,
458 				    resourceType)))
459 		return result;
460 
461 	if ((result = req_mgr_submit_req(txBlob)))
462 		return result;
463 
464 	result = UnloadBlob_Header(txBlob, &paramSize);
465 	if (!result) {
466 		result = tpm_rsp_parse(TPM_ORD_FlushSpecific, txBlob, paramSize, NULL);
467 	}
468 
469 	return result;
470 }
471 
472 TSS_RESULT
TCSP_FlushSpecific_Internal(TCS_CONTEXT_HANDLE hContext,TCS_HANDLE hResHandle,TPM_RESOURCE_TYPE resourceType)473 TCSP_FlushSpecific_Internal(TCS_CONTEXT_HANDLE hContext,	/* in */
474 			    TCS_HANDLE hResHandle,	/* in */
475 			    TPM_RESOURCE_TYPE resourceType) /* in */
476 {
477 	UINT32 tpmResHandle;
478 	TSS_RESULT result;
479 
480 	if ((result = ctx_verify_context(hContext)))
481 		return result;
482 
483 	switch (resourceType) {
484 		case TPM_RT_KEY:
485 			if ((result = get_slot_lite(hContext, hResHandle, &tpmResHandle)))
486 				return result;
487 
488 			if ((result = ctx_remove_key_loaded(hContext, hResHandle)))
489 				return result;
490 
491 			if ((result = key_mgr_dec_ref_count(hResHandle)))
492 				return result;
493 			break;
494 		case TPM_RT_AUTH:
495 			if ((result = auth_mgr_check(hContext, &hResHandle)))
496 				return result;
497 
498 			auth_mgr_release_auth_handle(hResHandle, hContext, FALSE);
499 			/* fall through */
500 		case TPM_RT_TRANS:
501 		case TPM_RT_DAA_TPM:
502 			tpmResHandle = hResHandle;
503 			break;
504 		case TPM_RT_CONTEXT:
505 			result = TCSERR(TSS_E_NOTIMPL);
506 			goto done;
507 		default:
508 			LogDebugFn("Unknown resource type: 0x%x", resourceType);
509 			goto done;
510 	}
511 
512 	result = TCSP_FlushSpecific_Common(tpmResHandle, resourceType);
513 
514 done:
515 	return result;
516 }
517 #endif
518 
519