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
25 TSS_RESULT
Transport_CreateMaintenanceArchive(TSS_HCONTEXT tspContext,TSS_BOOL generateRandom,TPM_AUTH * ownerAuth,UINT32 * randomSize,BYTE ** random,UINT32 * archiveSize,BYTE ** archive)26 Transport_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
78 TSS_RESULT
Transport_LoadMaintenanceArchive(TSS_HCONTEXT tspContext,UINT32 dataInSize,BYTE * dataIn,TPM_AUTH * ownerAuth,UINT32 * dataOutSize,BYTE ** dataOut)79 Transport_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
111 TSS_RESULT
Transport_KillMaintenanceFeature(TSS_HCONTEXT tspContext,TPM_AUTH * ownerAuth)112 Transport_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
127 TSS_RESULT
Transport_LoadManuMaintPub(TSS_HCONTEXT tspContext,TCPA_NONCE antiReplay,UINT32 PubKeySize,BYTE * PubKey,TCPA_DIGEST * checksum)128 Transport_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
169 TSS_RESULT
Transport_ReadManuMaintPub(TSS_HCONTEXT tspContext,TCPA_NONCE antiReplay,TCPA_DIGEST * checksum)170 Transport_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