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, ¶mSize);
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, ¶mSize);
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, ¶mSize);
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, ¶mSize);
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, ¶mSize);
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