3
* Licensed Materials - Property of IBM
5
* trousers - An open source TCG Software Stack
7
* (C) Copyright International Business Machines Corp. 2004-2007
17
#include "trousers/tss.h"
18
#include "trousers_types.h"
20
#include "tcs_utils.h"
21
#include "tcs_int_literals.h"
22
#include "capabilities.h"
24
#include "tcsd_wrap.h"
26
#include "tcs_utils.h"
27
#include "rpc_tcstp_tcs.h"
31
tcs_wrap_CreateEndorsementKeyPair(struct tcsd_thread_data *data)
33
TCS_CONTEXT_HANDLE hContext;
34
TCPA_NONCE antiReplay;
42
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
43
return TCSERR(TSS_E_INTERNAL_ERROR);
45
LogDebugFn("thread %zd context %x", THREAD_ID, hContext);
47
if (getData(TCSD_PACKET_TYPE_NONCE, 1, &antiReplay, 0, &data->comm))
48
return TCSERR(TSS_E_INTERNAL_ERROR);
50
if (getData(TCSD_PACKET_TYPE_UINT32, 2, &eKPtrSize, 0, &data->comm))
51
return TCSERR(TSS_E_INTERNAL_ERROR);
53
eKPtr = calloc(1, eKPtrSize);
55
LogError("malloc of %u bytes failed.", eKPtrSize);
56
return TCSERR(TSS_E_OUTOFMEMORY);
58
if (getData(TCSD_PACKET_TYPE_PBYTE, 3, eKPtr, eKPtrSize, &data->comm)) {
60
return TCSERR(TSS_E_INTERNAL_ERROR);
63
MUTEX_LOCK(tcsp_lock);
65
result = TCSP_CreateEndorsementKeyPair_Internal(hContext, antiReplay, eKPtrSize, eKPtr,
66
&eKSize, &eK, &checksum);
68
MUTEX_UNLOCK(tcsp_lock);
72
if (result == TSS_SUCCESS) {
73
initData(&data->comm, 3);
74
if (setData(TCSD_PACKET_TYPE_UINT32, 0, &eKSize, 0, &data->comm)) {
76
return TCSERR(TSS_E_INTERNAL_ERROR);
78
if (setData(TCSD_PACKET_TYPE_PBYTE, 1, eK, eKSize, &data->comm)) {
80
return TCSERR(TSS_E_INTERNAL_ERROR);
83
if (setData(TCSD_PACKET_TYPE_DIGEST, 2, &checksum, 0, &data->comm)) {
84
return TCSERR(TSS_E_INTERNAL_ERROR);
87
initData(&data->comm, 0);
89
data->comm.hdr.u.result = result;
94
tcs_wrap_ReadPubek(struct tcsd_thread_data *data)
96
TCS_CONTEXT_HANDLE hContext;
97
TCPA_NONCE antiReplay;
100
TCPA_DIGEST checksum;
103
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
104
return TCSERR(TSS_E_INTERNAL_ERROR);
106
LogDebugFn("thread %zd context %x", THREAD_ID, hContext);
108
if (getData(TCSD_PACKET_TYPE_NONCE, 1, &antiReplay, 0, &data->comm))
109
return TCSERR(TSS_E_INTERNAL_ERROR);
111
MUTEX_LOCK(tcsp_lock);
113
result = TCSP_ReadPubek_Internal(hContext, antiReplay, &pubEKSize, &pubEK, &checksum);
115
MUTEX_UNLOCK(tcsp_lock);
117
if (result == TSS_SUCCESS) {
118
initData(&data->comm, 3);
119
if (setData(TCSD_PACKET_TYPE_UINT32, 0, &pubEKSize, 0, &data->comm)) {
121
return TCSERR(TSS_E_INTERNAL_ERROR);
123
if (setData(TCSD_PACKET_TYPE_PBYTE, 1, pubEK, pubEKSize, &data->comm)) {
125
return TCSERR(TSS_E_INTERNAL_ERROR);
128
if (setData(TCSD_PACKET_TYPE_DIGEST, 2, &checksum, 0, &data->comm)) {
129
return TCSERR(TSS_E_INTERNAL_ERROR);
132
initData(&data->comm, 0);
134
data->comm.hdr.u.result = result;
139
tcs_wrap_OwnerReadPubek(struct tcsd_thread_data *data)
141
TCS_CONTEXT_HANDLE hContext;
147
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
148
return TCSERR(TSS_E_INTERNAL_ERROR);
150
LogDebugFn("thread %zd context %x", THREAD_ID, hContext);
152
if (getData(TCSD_PACKET_TYPE_AUTH, 1, &auth, 0, &data->comm))
153
return TCSERR(TSS_E_INTERNAL_ERROR);
155
MUTEX_LOCK(tcsp_lock);
157
result = TCSP_OwnerReadPubek_Internal(hContext, &auth, &pubEKSize, &pubEK);
159
MUTEX_UNLOCK(tcsp_lock);
161
if (result == TSS_SUCCESS) {
162
initData(&data->comm, 3);
163
if (setData(TCSD_PACKET_TYPE_AUTH, 0, &auth, 0, &data->comm)) {
165
return TCSERR(TSS_E_INTERNAL_ERROR);
167
if (setData(TCSD_PACKET_TYPE_UINT32, 1, &pubEKSize, 0, &data->comm)) {
169
return TCSERR(TSS_E_INTERNAL_ERROR);
171
if (setData(TCSD_PACKET_TYPE_PBYTE, 2, pubEK, pubEKSize, &data->comm)) {
173
return TCSERR(TSS_E_INTERNAL_ERROR);
177
initData(&data->comm, 0);
179
data->comm.hdr.u.result = result;
184
tcs_wrap_DisablePubekRead(struct tcsd_thread_data *data)
186
TCS_CONTEXT_HANDLE hContext;
190
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
191
return TCSERR(TSS_E_INTERNAL_ERROR);
193
LogDebugFn("thread %zd context %x", THREAD_ID, hContext);
195
if (getData(TCSD_PACKET_TYPE_AUTH, 1, &auth, 0, &data->comm))
196
return TCSERR(TSS_E_INTERNAL_ERROR);
198
MUTEX_LOCK(tcsp_lock);
200
result = TCSP_DisablePubekRead_Internal(hContext, &auth);
202
MUTEX_UNLOCK(tcsp_lock);
204
if (result == TSS_SUCCESS) {
205
initData(&data->comm, 1);
206
if (setData(TCSD_PACKET_TYPE_AUTH, 0, &auth, 0, &data->comm)) {
207
return TCSERR(TSS_E_INTERNAL_ERROR);
210
initData(&data->comm, 0);
212
data->comm.hdr.u.result = result;
217
tcs_wrap_CreateRevocableEndorsementKeyPair(struct tcsd_thread_data *data)
219
TCS_CONTEXT_HANDLE hContext;
220
TPM_NONCE antiReplay;
223
TSS_BOOL genResetAuth;
224
TPM_DIGEST eKResetAuth;
230
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
231
return TCSERR(TSS_E_INTERNAL_ERROR);
233
LogDebugFn("thread %zd context %x", THREAD_ID, hContext);
235
if (getData(TCSD_PACKET_TYPE_NONCE, 1, &antiReplay, 0, &data->comm))
236
return TCSERR(TSS_E_INTERNAL_ERROR);
238
if (getData(TCSD_PACKET_TYPE_UINT32, 2, &eKPtrSize, 0, &data->comm))
239
return TCSERR(TSS_E_INTERNAL_ERROR);
241
eKPtr = calloc(1, eKPtrSize);
243
LogError("malloc of %d bytes failed.", eKPtrSize);
244
return TCSERR(TSS_E_OUTOFMEMORY);
246
if (getData(TCSD_PACKET_TYPE_PBYTE, 3, eKPtr, eKPtrSize, &data->comm)) {
248
return TCSERR(TSS_E_INTERNAL_ERROR);
251
if (getData(TCSD_PACKET_TYPE_BOOL, 4, &genResetAuth, 0, &data->comm)) {
253
return TCSERR(TSS_E_INTERNAL_ERROR);
256
if (getData(TCSD_PACKET_TYPE_DIGEST, 5, &eKResetAuth, 0, &data->comm)) {
258
return TCSERR(TSS_E_INTERNAL_ERROR);
261
MUTEX_LOCK(tcsp_lock);
263
result = TCSP_CreateRevocableEndorsementKeyPair_Internal(hContext, antiReplay,
264
eKPtrSize, eKPtr, genResetAuth, &eKResetAuth, &eKSize, &eK, &checksum);
266
MUTEX_UNLOCK(tcsp_lock);
270
if (result == TSS_SUCCESS) {
271
initData(&data->comm, 4);
272
if (setData(TCSD_PACKET_TYPE_DIGEST, 0, &eKResetAuth, 0, &data->comm)) {
274
return TCSERR(TSS_E_INTERNAL_ERROR);
276
if (setData(TCSD_PACKET_TYPE_UINT32, 1, &eKSize, 0, &data->comm)) {
278
return TCSERR(TSS_E_INTERNAL_ERROR);
280
if (setData(TCSD_PACKET_TYPE_PBYTE, 2, eK, eKSize, &data->comm)) {
282
return TCSERR(TSS_E_INTERNAL_ERROR);
285
if (setData(TCSD_PACKET_TYPE_DIGEST, 3, &checksum, 0, &data->comm)) {
286
return TCSERR(TSS_E_INTERNAL_ERROR);
289
initData(&data->comm, 0);
291
data->comm.hdr.u.result = result;
297
tcs_wrap_RevokeEndorsementKeyPair(struct tcsd_thread_data *data)
299
TCS_CONTEXT_HANDLE hContext;
300
TPM_DIGEST eKResetAuth;
303
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
304
return TCSERR(TSS_E_INTERNAL_ERROR);
306
LogDebugFn("thread %zd context %x", THREAD_ID, hContext);
308
if (getData(TCSD_PACKET_TYPE_DIGEST, 1, &eKResetAuth, 0, &data->comm))
309
return TCSERR(TSS_E_INTERNAL_ERROR);
311
MUTEX_LOCK(tcsp_lock);
313
result = TCSP_RevokeEndorsementKeyPair_Internal(hContext, eKResetAuth);
315
MUTEX_UNLOCK(tcsp_lock);
317
initData(&data->comm, 0);
319
data->comm.hdr.u.result = result;