1*723e4046Schristos 
2*723e4046Schristos /*
3*723e4046Schristos  * Licensed Materials - Property of IBM
4*723e4046Schristos  *
5*723e4046Schristos  * trousers - An open source TCG Software Stack
6*723e4046Schristos  *
7*723e4046Schristos  * (C) Copyright International Business Machines Corp. 2004
8*723e4046Schristos  *
9*723e4046Schristos  */
10*723e4046Schristos 
11*723e4046Schristos 
12*723e4046Schristos #include <stdlib.h>
13*723e4046Schristos #include <stdio.h>
14*723e4046Schristos #include <string.h>
15*723e4046Schristos #include <inttypes.h>
16*723e4046Schristos 
17*723e4046Schristos #include "trousers/tss.h"
18*723e4046Schristos #include "trousers_types.h"
19*723e4046Schristos #include "tcs_tsp.h"
20*723e4046Schristos #include "tcsps.h"
21*723e4046Schristos #include "tcs_utils.h"
22*723e4046Schristos #include "tcs_int_literals.h"
23*723e4046Schristos #include "capabilities.h"
24*723e4046Schristos #include "tcslog.h"
25*723e4046Schristos #include "req_mgr.h"
26*723e4046Schristos #include "tcsd_wrap.h"
27*723e4046Schristos #include "tcsd.h"
28*723e4046Schristos 
29*723e4046Schristos TSS_RESULT
TCSP_CreateMaintenanceArchive_Internal(TCS_CONTEXT_HANDLE hContext,TSS_BOOL generateRandom,TPM_AUTH * ownerAuth,UINT32 * randomSize,BYTE ** random,UINT32 * archiveSize,BYTE ** archive)30*723e4046Schristos TCSP_CreateMaintenanceArchive_Internal(TCS_CONTEXT_HANDLE hContext,	/* in */
31*723e4046Schristos 				       TSS_BOOL generateRandom,	/* in */
32*723e4046Schristos 				       TPM_AUTH * ownerAuth,	/* in, out */
33*723e4046Schristos 				       UINT32 * randomSize,	/* out */
34*723e4046Schristos 				       BYTE ** random,	/* out */
35*723e4046Schristos 				       UINT32 * archiveSize,	/* out */
36*723e4046Schristos 				       BYTE ** archive)	/* out */
37*723e4046Schristos {
38*723e4046Schristos 	TSS_RESULT result;
39*723e4046Schristos 	UINT32 paramSize;
40*723e4046Schristos 	UINT64 offset = 0;
41*723e4046Schristos 	BYTE txBlob[TSS_TPM_TXBLOB_SIZE];
42*723e4046Schristos 
43*723e4046Schristos 	LogDebug("Create Main Archive");
44*723e4046Schristos 
45*723e4046Schristos 	if ((result = ctx_verify_context(hContext)))
46*723e4046Schristos 		goto done;
47*723e4046Schristos 
48*723e4046Schristos 	if ((result = auth_mgr_check(hContext, &ownerAuth->AuthHandle)))
49*723e4046Schristos 		goto done;
50*723e4046Schristos 
51*723e4046Schristos 	if ((result = tpm_rqu_build(TPM_ORD_CreateMaintenanceArchive, &offset, txBlob,
52*723e4046Schristos 				    generateRandom, ownerAuth)))
53*723e4046Schristos 		goto done;
54*723e4046Schristos 
55*723e4046Schristos 	if ((result = req_mgr_submit_req(txBlob)))
56*723e4046Schristos 		goto done;
57*723e4046Schristos 
58*723e4046Schristos 	result = UnloadBlob_Header(txBlob, &paramSize);
59*723e4046Schristos 	if (!result) {
60*723e4046Schristos 		result = tpm_rsp_parse(TPM_ORD_CreateMaintenanceArchive, txBlob, paramSize,
61*723e4046Schristos 				       randomSize, random, archiveSize, archive, ownerAuth);
62*723e4046Schristos 	}
63*723e4046Schristos 	LogResult("Create Main Archive", result);
64*723e4046Schristos done:
65*723e4046Schristos 	auth_mgr_release_auth(ownerAuth, NULL, hContext);
66*723e4046Schristos 	return result;
67*723e4046Schristos }
68*723e4046Schristos 
69*723e4046Schristos TSS_RESULT
TCSP_LoadMaintenanceArchive_Internal(TCS_CONTEXT_HANDLE hContext,UINT32 dataInSize,BYTE * dataIn,TPM_AUTH * ownerAuth,UINT32 * dataOutSize,BYTE ** dataOut)70*723e4046Schristos TCSP_LoadMaintenanceArchive_Internal(TCS_CONTEXT_HANDLE hContext,	/* in */
71*723e4046Schristos 				     UINT32 dataInSize,	/* in */
72*723e4046Schristos 				     BYTE * dataIn,	/* in */
73*723e4046Schristos 				     TPM_AUTH * ownerAuth,	/* in, out */
74*723e4046Schristos 				     UINT32 * dataOutSize,	/* out */
75*723e4046Schristos 				     BYTE ** dataOut)	/* out */
76*723e4046Schristos {
77*723e4046Schristos 	TSS_RESULT result;
78*723e4046Schristos 	UINT32 paramSize;
79*723e4046Schristos 	UINT64 offset = 0;
80*723e4046Schristos 	BYTE txBlob[TSS_TPM_TXBLOB_SIZE];
81*723e4046Schristos 
82*723e4046Schristos 	LogDebug("Load Maint Archive");
83*723e4046Schristos 
84*723e4046Schristos 	if ((result = ctx_verify_context(hContext)))
85*723e4046Schristos 		goto done;
86*723e4046Schristos 
87*723e4046Schristos 	if ((result = auth_mgr_check(hContext, &ownerAuth->AuthHandle)))
88*723e4046Schristos 		goto done;
89*723e4046Schristos 
90*723e4046Schristos 	if ((result = tpm_rqu_build(TPM_ORD_LoadMaintenanceArchive, &offset, txBlob, dataInSize,
91*723e4046Schristos 				    dataInSize, dataIn, ownerAuth, NULL)))
92*723e4046Schristos 		return result;
93*723e4046Schristos 
94*723e4046Schristos 	if ((result = req_mgr_submit_req(txBlob)))
95*723e4046Schristos 		goto done;
96*723e4046Schristos 
97*723e4046Schristos 	result = UnloadBlob_Header(txBlob, &paramSize);
98*723e4046Schristos 	if (!result) {
99*723e4046Schristos 		result = tpm_rsp_parse(TPM_ORD_LoadMaintenanceArchive, txBlob, paramSize,
100*723e4046Schristos 				       dataOutSize, dataOut, ownerAuth, NULL);
101*723e4046Schristos 	}
102*723e4046Schristos 	LogResult("Load Maint Archive", result);
103*723e4046Schristos done:
104*723e4046Schristos 	auth_mgr_release_auth(ownerAuth, NULL, hContext);
105*723e4046Schristos 	return result;
106*723e4046Schristos }
107*723e4046Schristos 
108*723e4046Schristos TSS_RESULT
TCSP_KillMaintenanceFeature_Internal(TCS_CONTEXT_HANDLE hContext,TPM_AUTH * ownerAuth)109*723e4046Schristos TCSP_KillMaintenanceFeature_Internal(TCS_CONTEXT_HANDLE hContext,	/* in */
110*723e4046Schristos 				     TPM_AUTH * ownerAuth)	/* in, out */
111*723e4046Schristos {
112*723e4046Schristos 	TSS_RESULT result;
113*723e4046Schristos 	UINT32 paramSize;
114*723e4046Schristos 	UINT64 offset = 0;
115*723e4046Schristos 	BYTE txBlob[TSS_TPM_TXBLOB_SIZE];
116*723e4046Schristos 
117*723e4046Schristos 	if ((result = ctx_verify_context(hContext)))
118*723e4046Schristos 		goto done;
119*723e4046Schristos 
120*723e4046Schristos 	if ((result = auth_mgr_check(hContext, &ownerAuth->AuthHandle)))
121*723e4046Schristos 		goto done;
122*723e4046Schristos 
123*723e4046Schristos 	if ((result = tpm_rqu_build(TPM_ORD_KillMaintenanceFeature, &offset, txBlob, ownerAuth)))
124*723e4046Schristos 		return result;
125*723e4046Schristos 
126*723e4046Schristos 	if ((result = req_mgr_submit_req(txBlob)))
127*723e4046Schristos 		goto done;
128*723e4046Schristos 
129*723e4046Schristos 	result = UnloadBlob_Header(txBlob, &paramSize);
130*723e4046Schristos 
131*723e4046Schristos 	if (!result) {
132*723e4046Schristos 		result = tpm_rsp_parse(TPM_ORD_KillMaintenanceFeature, txBlob, paramSize,
133*723e4046Schristos 				       ownerAuth);
134*723e4046Schristos 	}
135*723e4046Schristos done:
136*723e4046Schristos 	auth_mgr_release_auth(ownerAuth, NULL, hContext);
137*723e4046Schristos 	return result;
138*723e4046Schristos }
139*723e4046Schristos 
140*723e4046Schristos TSS_RESULT
TCSP_LoadManuMaintPub_Internal(TCS_CONTEXT_HANDLE hContext,TCPA_NONCE antiReplay,UINT32 PubKeySize,BYTE * PubKey,TCPA_DIGEST * checksum)141*723e4046Schristos TCSP_LoadManuMaintPub_Internal(TCS_CONTEXT_HANDLE hContext,	/* in */
142*723e4046Schristos 			       TCPA_NONCE antiReplay,	/* in */
143*723e4046Schristos 			       UINT32 PubKeySize,	/* in */
144*723e4046Schristos 			       BYTE * PubKey,	/* in */
145*723e4046Schristos 			       TCPA_DIGEST * checksum)	/* out */
146*723e4046Schristos {
147*723e4046Schristos 	TSS_RESULT result;
148*723e4046Schristos 	UINT32 paramSize;
149*723e4046Schristos 	UINT64 offset = 0;
150*723e4046Schristos 	BYTE txBlob[TSS_TPM_TXBLOB_SIZE];
151*723e4046Schristos 
152*723e4046Schristos 	LogDebug("Entering Load Manu Maint Pub");
153*723e4046Schristos 
154*723e4046Schristos 	if ((result = tpm_rqu_build(TPM_ORD_LoadManuMaintPub, &offset, txBlob, TPM_NONCE_SIZE,
155*723e4046Schristos 				    antiReplay.nonce, PubKeySize, PubKey, NULL)))
156*723e4046Schristos 		return result;
157*723e4046Schristos 
158*723e4046Schristos 	if ((result = req_mgr_submit_req(txBlob)))
159*723e4046Schristos 		return result;
160*723e4046Schristos 
161*723e4046Schristos 	result = UnloadBlob_Header(txBlob, &paramSize);
162*723e4046Schristos 	if (!result) {
163*723e4046Schristos 		result = tpm_rsp_parse(TPM_ORD_LoadManuMaintPub, txBlob, paramSize, NULL,
164*723e4046Schristos 				       checksum->digest);
165*723e4046Schristos 	}
166*723e4046Schristos 	LogResult("Load Manu Maint Pub", result);
167*723e4046Schristos 	return result;
168*723e4046Schristos }
169*723e4046Schristos 
170*723e4046Schristos TSS_RESULT
TCSP_ReadManuMaintPub_Internal(TCS_CONTEXT_HANDLE hContext,TCPA_NONCE antiReplay,TCPA_DIGEST * checksum)171*723e4046Schristos TCSP_ReadManuMaintPub_Internal(TCS_CONTEXT_HANDLE hContext,	/* in */
172*723e4046Schristos 			       TCPA_NONCE antiReplay,	/* in */
173*723e4046Schristos 			       TCPA_DIGEST * checksum)	/* out */
174*723e4046Schristos {
175*723e4046Schristos 	TSS_RESULT result;
176*723e4046Schristos 	UINT32 paramSize;
177*723e4046Schristos 	UINT64 offset = 0;
178*723e4046Schristos 	BYTE txBlob[TSS_TPM_TXBLOB_SIZE];
179*723e4046Schristos 
180*723e4046Schristos 	LogDebug("Entering Read Manu Maint Pub");
181*723e4046Schristos 
182*723e4046Schristos 	if ((result = tpm_rqu_build(TPM_ORD_ReadManuMaintPub, &offset, txBlob, TPM_NONCE_SIZE,
183*723e4046Schristos 				    antiReplay.nonce)))
184*723e4046Schristos 		return result;
185*723e4046Schristos 
186*723e4046Schristos 	if ((result = req_mgr_submit_req(txBlob)))
187*723e4046Schristos 		return result;
188*723e4046Schristos 
189*723e4046Schristos 	result = UnloadBlob_Header(txBlob, &paramSize);
190*723e4046Schristos 	if (!result) {
191*723e4046Schristos 		result = tpm_rsp_parse(TPM_ORD_ReadManuMaintPub, txBlob, paramSize, NULL,
192*723e4046Schristos 				       checksum->digest);
193*723e4046Schristos 	}
194*723e4046Schristos 	LogResult("Read Manu Maint Pub", result);
195*723e4046Schristos 	return result;
196*723e4046Schristos }
197*723e4046Schristos 
198