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
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
29TSS_RESULT
30TCSP_CreateMaintenanceArchive_Internal(TCS_CONTEXT_HANDLE hContext,	/* in */
31				       TSS_BOOL generateRandom,	/* in */
32				       TPM_AUTH * ownerAuth,	/* in, out */
33				       UINT32 * randomSize,	/* out */
34				       BYTE ** random,	/* out */
35				       UINT32 * archiveSize,	/* out */
36				       BYTE ** archive)	/* out */
37{
38	TSS_RESULT result;
39	UINT32 paramSize;
40	UINT64 offset = 0;
41	BYTE txBlob[TSS_TPM_TXBLOB_SIZE];
42
43	LogDebug("Create Main Archive");
44
45	if ((result = ctx_verify_context(hContext)))
46		goto done;
47
48	if ((result = auth_mgr_check(hContext, &ownerAuth->AuthHandle)))
49		goto done;
50
51	if ((result = tpm_rqu_build(TPM_ORD_CreateMaintenanceArchive, &offset, txBlob,
52				    generateRandom, ownerAuth)))
53		goto done;
54
55	if ((result = req_mgr_submit_req(txBlob)))
56		goto done;
57
58	result = UnloadBlob_Header(txBlob, &paramSize);
59	if (!result) {
60		result = tpm_rsp_parse(TPM_ORD_CreateMaintenanceArchive, txBlob, paramSize,
61				       randomSize, random, archiveSize, archive, ownerAuth);
62	}
63	LogResult("Create Main Archive", result);
64done:
65	auth_mgr_release_auth(ownerAuth, NULL, hContext);
66	return result;
67}
68
69TSS_RESULT
70TCSP_LoadMaintenanceArchive_Internal(TCS_CONTEXT_HANDLE hContext,	/* in */
71				     UINT32 dataInSize,	/* in */
72				     BYTE * dataIn,	/* in */
73				     TPM_AUTH * ownerAuth,	/* in, out */
74				     UINT32 * dataOutSize,	/* out */
75				     BYTE ** dataOut)	/* out */
76{
77	TSS_RESULT result;
78	UINT32 paramSize;
79	UINT64 offset = 0;
80	BYTE txBlob[TSS_TPM_TXBLOB_SIZE];
81
82	LogDebug("Load Maint Archive");
83
84	if ((result = ctx_verify_context(hContext)))
85		goto done;
86
87	if ((result = auth_mgr_check(hContext, &ownerAuth->AuthHandle)))
88		goto done;
89
90	if ((result = tpm_rqu_build(TPM_ORD_LoadMaintenanceArchive, &offset, txBlob, dataInSize,
91				    dataInSize, dataIn, ownerAuth, NULL)))
92		return result;
93
94	if ((result = req_mgr_submit_req(txBlob)))
95		goto done;
96
97	result = UnloadBlob_Header(txBlob, &paramSize);
98	if (!result) {
99		result = tpm_rsp_parse(TPM_ORD_LoadMaintenanceArchive, txBlob, paramSize,
100				       dataOutSize, dataOut, ownerAuth, NULL);
101	}
102	LogResult("Load Maint Archive", result);
103done:
104	auth_mgr_release_auth(ownerAuth, NULL, hContext);
105	return result;
106}
107
108TSS_RESULT
109TCSP_KillMaintenanceFeature_Internal(TCS_CONTEXT_HANDLE hContext,	/* in */
110				     TPM_AUTH * ownerAuth)	/* in, out */
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		goto done;
119
120	if ((result = auth_mgr_check(hContext, &ownerAuth->AuthHandle)))
121		goto done;
122
123	if ((result = tpm_rqu_build(TPM_ORD_KillMaintenanceFeature, &offset, txBlob, ownerAuth)))
124		return result;
125
126	if ((result = req_mgr_submit_req(txBlob)))
127		goto done;
128
129	result = UnloadBlob_Header(txBlob, &paramSize);
130
131	if (!result) {
132		result = tpm_rsp_parse(TPM_ORD_KillMaintenanceFeature, txBlob, paramSize,
133				       ownerAuth);
134	}
135done:
136	auth_mgr_release_auth(ownerAuth, NULL, hContext);
137	return result;
138}
139
140TSS_RESULT
141TCSP_LoadManuMaintPub_Internal(TCS_CONTEXT_HANDLE hContext,	/* in */
142			       TCPA_NONCE antiReplay,	/* in */
143			       UINT32 PubKeySize,	/* in */
144			       BYTE * PubKey,	/* in */
145			       TCPA_DIGEST * checksum)	/* out */
146{
147	TSS_RESULT result;
148	UINT32 paramSize;
149	UINT64 offset = 0;
150	BYTE txBlob[TSS_TPM_TXBLOB_SIZE];
151
152	LogDebug("Entering Load Manu Maint Pub");
153
154	if ((result = tpm_rqu_build(TPM_ORD_LoadManuMaintPub, &offset, txBlob, TPM_NONCE_SIZE,
155				    antiReplay.nonce, PubKeySize, PubKey, NULL)))
156		return result;
157
158	if ((result = req_mgr_submit_req(txBlob)))
159		return result;
160
161	result = UnloadBlob_Header(txBlob, &paramSize);
162	if (!result) {
163		result = tpm_rsp_parse(TPM_ORD_LoadManuMaintPub, txBlob, paramSize, NULL,
164				       checksum->digest);
165	}
166	LogResult("Load Manu Maint Pub", result);
167	return result;
168}
169
170TSS_RESULT
171TCSP_ReadManuMaintPub_Internal(TCS_CONTEXT_HANDLE hContext,	/* in */
172			       TCPA_NONCE antiReplay,	/* in */
173			       TCPA_DIGEST * checksum)	/* out */
174{
175	TSS_RESULT result;
176	UINT32 paramSize;
177	UINT64 offset = 0;
178	BYTE txBlob[TSS_TPM_TXBLOB_SIZE];
179
180	LogDebug("Entering Read Manu Maint Pub");
181
182	if ((result = tpm_rqu_build(TPM_ORD_ReadManuMaintPub, &offset, txBlob, TPM_NONCE_SIZE,
183				    antiReplay.nonce)))
184		return result;
185
186	if ((result = req_mgr_submit_req(txBlob)))
187		return result;
188
189	result = UnloadBlob_Header(txBlob, &paramSize);
190	if (!result) {
191		result = tpm_rsp_parse(TPM_ORD_ReadManuMaintPub, txBlob, paramSize, NULL,
192				       checksum->digest);
193	}
194	LogResult("Read Manu Maint Pub", result);
195	return result;
196}
197
198