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#include <stdlib.h>
12#include <stdio.h>
13#include <string.h>
14#include <inttypes.h>
15
16#include "trousers/tss.h"
17#include "trousers/trousers.h"
18#include "trousers_types.h"
19#include "spi_utils.h"
20#include "capabilities.h"
21#include "tsplog.h"
22#include "obj.h"
23
24#ifdef TSS_BUILD_TRANSPORT
25TSS_RESULT
26Transport_CreateMaintenanceArchive(TSS_HCONTEXT tspContext,	/* in */
27				   TSS_BOOL generateRandom,	/* in */
28				   TPM_AUTH * ownerAuth,	/* in, out */
29				   UINT32 * randomSize,	/* out */
30				   BYTE ** random,	/* out */
31				   UINT32 * archiveSize,	/* out */
32				   BYTE ** archive)	/* out */
33{
34	UINT64 offset;
35	TSS_RESULT result;
36	UINT32 handlesLen = 0, decLen;
37	BYTE *dec;
38
39	if ((result = obj_context_transport_init(tspContext)))
40		return result;
41
42	LogDebugFn("Executing in a transport session");
43
44	if ((result = obj_context_transport_execute(tspContext, TPM_ORD_CreateMaintenanceArchive,
45						    sizeof(TSS_BOOL), (BYTE *)&generateRandom, NULL,
46						    &handlesLen, NULL, ownerAuth, NULL, &decLen,
47						    &dec)))
48		return result;
49
50	offset = 0;
51	Trspi_UnloadBlob_UINT32(&offset, randomSize, dec);
52	if (*randomSize > 0) {
53		if ((*random = malloc(*randomSize)) == NULL) {
54			*randomSize = 0;
55			free(dec);
56			LogError("malloc of %u bytes failed", *randomSize);
57			return TSPERR(TSS_E_OUTOFMEMORY);
58		}
59		Trspi_UnloadBlob(&offset, *randomSize, dec, *random);
60	}
61
62	Trspi_UnloadBlob_UINT32(&offset, archiveSize, dec);
63	if ((*archive = malloc(*archiveSize)) == NULL) {
64		free(*random);
65		*random = NULL;
66		*randomSize = 0;
67		free(dec);
68		LogError("malloc of %u bytes failed", *archiveSize);
69		*archiveSize = 0;
70		return TSPERR(TSS_E_OUTOFMEMORY);
71	}
72	Trspi_UnloadBlob(&offset, *archiveSize, dec, *archive);
73	free(dec);
74
75	return result;
76}
77
78TSS_RESULT
79Transport_LoadMaintenanceArchive(TSS_HCONTEXT tspContext,	/* in */
80				 UINT32 dataInSize,	/* in */
81				 BYTE * dataIn, /* in */
82				 TPM_AUTH * ownerAuth,	/* in, out */
83				 UINT32 * dataOutSize,	/* out */
84				 BYTE ** dataOut)	/* out */
85{
86	UINT64 offset;
87	TSS_RESULT result;
88	UINT32 handlesLen = 0, decLen;
89	BYTE *dec;
90
91
92	if ((result = obj_context_transport_init(tspContext)))
93		return result;
94
95	LogDebugFn("Executing in a transport session");
96
97	if ((result = obj_context_transport_execute(tspContext, TPM_ORD_LoadMaintenanceArchive,
98						    dataInSize, dataIn, NULL, &handlesLen, NULL,
99						    ownerAuth, NULL, &decLen, &dec)))
100		return result;
101
102	offset = 0;
103	Trspi_UnloadBlob_UINT32(&offset, dataOutSize, dec);
104
105	/* sacrifice 4 bytes */
106	*dataOut = &dec[offset];
107
108	return result;
109}
110
111TSS_RESULT
112Transport_KillMaintenanceFeature(TSS_HCONTEXT tspContext,	/* in */
113				 TPM_AUTH * ownerAuth)	/* in, out */
114{
115	TSS_RESULT result;
116	UINT32 handlesLen = 0;
117
118	if ((result = obj_context_transport_init(tspContext)))
119		return result;
120
121	LogDebugFn("Executing in a transport session");
122
123	return obj_context_transport_execute(tspContext, TPM_ORD_KillMaintenanceFeature, 0, NULL,
124					     NULL, &handlesLen, NULL, ownerAuth, NULL, NULL, NULL);
125}
126
127TSS_RESULT
128Transport_LoadManuMaintPub(TSS_HCONTEXT tspContext,	/* in */
129			   TCPA_NONCE antiReplay,	/* in */
130			   UINT32 PubKeySize,	/* in */
131			   BYTE * PubKey,	/* in */
132			   TCPA_DIGEST * checksum)	/* out */
133{
134	UINT64 offset;
135	TSS_RESULT result;
136	UINT32 handlesLen = 0, dataLen, decLen;
137	BYTE *data, *dec;
138
139	if ((result = obj_context_transport_init(tspContext)))
140		return result;
141
142	LogDebugFn("Executing in a transport session");
143
144	dataLen = sizeof(TCPA_NONCE) + PubKeySize;
145	if ((data = malloc(dataLen)) == NULL) {
146		LogError("malloc of %u bytes failed", dataLen);
147		return TSPERR(TSS_E_OUTOFMEMORY);
148	}
149
150	offset = 0;
151	Trspi_LoadBlob(&offset, TPM_SHA1_160_HASH_LEN, data, antiReplay.nonce);
152	Trspi_LoadBlob(&offset, PubKeySize, data, PubKey);
153
154	if ((result = obj_context_transport_execute(tspContext, TPM_ORD_LoadManuMaintPub,
155						    dataLen, data, NULL, &handlesLen, NULL, NULL,
156						    NULL, &decLen, &dec))) {
157		free(data);
158		return result;
159	}
160	free(data);
161
162	offset = 0;
163	Trspi_UnloadBlob_DIGEST(&offset, dec, checksum);
164	free(dec);
165
166	return result;
167}
168
169TSS_RESULT
170Transport_ReadManuMaintPub(TSS_HCONTEXT tspContext,	/* in */
171			   TCPA_NONCE antiReplay,	/* in */
172			   TCPA_DIGEST * checksum)	/* out */
173{
174	UINT64 offset;
175	TSS_RESULT result;
176	UINT32 handlesLen = 0, decLen;
177	BYTE *dec;
178
179	if ((result = obj_context_transport_init(tspContext)))
180		return result;
181
182	LogDebugFn("Executing in a transport session");
183
184	if ((result = obj_context_transport_execute(tspContext, TPM_ORD_ReadManuMaintPub,
185						    sizeof(TCPA_NONCE), antiReplay.nonce, NULL,
186						    &handlesLen, NULL, NULL, NULL, &decLen,
187						    &dec)))
188		return result;
189
190	offset = 0;
191	Trspi_UnloadBlob_DIGEST(&offset, dec, checksum);
192	free(dec);
193
194	return result;
195}
196#endif
197
198