3
* Licensed Materials - Property of IBM
5
* trousers - An open source TCG Software Stack
7
* (C) Copyright International Business Machines Corp. 2004-2006
17
#include "trousers/tss.h"
18
#include "spi_internal_types.h"
19
#include "tcs_internal_types.h"
21
#include "tcs_utils.h"
22
#include "tcs_int_literals.h"
23
#include "capabilities.h"
25
#include "tcsd_wrap.h"
27
#include "tcs_utils.h"
29
pthread_mutex_t tcsp_lock = PTHREAD_MUTEX_INITIALIZER;
32
LoadBlob_Auth_Special(UINT64 *offset, BYTE *blob, TPM_AUTH *auth)
34
LoadBlob(offset, TCPA_SHA1BASED_NONCE_LEN, blob, auth->NonceEven.nonce, NULL);
35
LoadBlob_BOOL(offset, auth->fContinueAuthSession, blob, NULL);
36
LoadBlob(offset, TCPA_SHA1BASED_NONCE_LEN, blob, (BYTE *)&auth->HMAC, NULL);
40
UnloadBlob_Auth_Special(UINT64 *offset, BYTE *blob, TPM_AUTH *auth)
42
UnloadBlob_UINT32(offset, &auth->AuthHandle, blob, NULL);
43
UnloadBlob(offset, TCPA_SHA1BASED_NONCE_LEN, blob, auth->NonceOdd.nonce, NULL);
44
UnloadBlob_BOOL(offset, &auth->fContinueAuthSession, blob, NULL);
45
UnloadBlob(offset, TCPA_SHA1BASED_NONCE_LEN, blob, (BYTE *)&auth->HMAC, NULL);
49
LoadBlob_KM_KEYINFO(UINT64 *offset, BYTE *blob, TSS_KM_KEYINFO *info)
51
LoadBlob_VERSION(offset, blob, (TCPA_VERSION *)&(info->versionInfo));
52
LoadBlob_UUID(offset, blob, info->keyUUID);
53
LoadBlob_UUID(offset, blob, info->parentKeyUUID);
54
LoadBlob_BYTE(offset, info->bAuthDataUsage, blob, NULL);
55
LoadBlob_BOOL(offset, info->fIsLoaded, blob, NULL);
56
LoadBlob_UINT32(offset, info->ulVendorDataLength, blob, NULL);
57
LoadBlob(offset, info->ulVendorDataLength, blob, info->rgbVendorData, NULL);
61
UnloadBlob_KM_KEYINFO(UINT64 *offset, BYTE *blob, TSS_KM_KEYINFO *info)
63
UnloadBlob_VERSION(offset, blob, (TCPA_VERSION *)&(info->versionInfo));
64
UnloadBlob_UUID(offset, blob, &info->keyUUID);
65
UnloadBlob_UUID(offset, blob, &info->parentKeyUUID);
66
UnloadBlob_BYTE(offset, blob, &info->bAuthDataUsage, NULL);
67
UnloadBlob_BOOL(offset, &info->fIsLoaded, blob, NULL);
68
UnloadBlob_UINT32(offset, &info->ulVendorDataLength, blob, NULL);
69
UnloadBlob(offset, info->ulVendorDataLength, info->rgbVendorData, blob, NULL);
73
LoadBlob_LOADKEY_INFO(UINT64 *offset, BYTE *blob, TCS_LOADKEY_INFO *info)
75
LoadBlob_UUID(offset, blob, info->keyUUID);
76
LoadBlob_UUID(offset, blob, info->parentKeyUUID);
77
LoadBlob(offset, TCPA_DIGEST_SIZE, blob, info->paramDigest.digest, NULL);
78
LoadBlob_UINT32(offset, info->authData.AuthHandle, blob, NULL);
79
LoadBlob(offset, TCPA_NONCE_SIZE, blob, info->authData.NonceOdd.nonce, NULL);
80
LoadBlob(offset, TCPA_NONCE_SIZE, blob, info->authData.NonceEven.nonce, NULL);
81
LoadBlob_BOOL(offset, info->authData.fContinueAuthSession, blob, NULL);
82
LoadBlob(offset, TCPA_AUTHDATA_SIZE, blob, (BYTE *)&info->authData.HMAC, NULL);
86
UnloadBlob_LOADKEY_INFO(UINT64 *offset, BYTE *blob, TCS_LOADKEY_INFO *info)
88
UnloadBlob_UUID(offset, blob, &info->keyUUID);
89
UnloadBlob_UUID(offset, blob, &info->parentKeyUUID);
90
UnloadBlob(offset, TCPA_DIGEST_SIZE, blob, info->paramDigest.digest, NULL);
91
UnloadBlob_UINT32(offset, &info->authData.AuthHandle, blob, NULL);
92
UnloadBlob(offset, TCPA_NONCE_SIZE, blob, (BYTE *)&info->authData.NonceOdd.nonce, NULL);
93
UnloadBlob(offset, TCPA_NONCE_SIZE, blob, (BYTE *)&info->authData.NonceEven.nonce, NULL);
94
UnloadBlob_BOOL(offset, &info->authData.fContinueAuthSession, blob, NULL);
95
UnloadBlob(offset, TCPA_DIGEST_SIZE, blob, (BYTE *)&info->authData.HMAC, NULL);
99
LoadBlob_PCR_EVENT(UINT64 *offset, BYTE *blob, TSS_PCR_EVENT *event)
101
LoadBlob_VERSION(offset, blob, (TCPA_VERSION *)&(event->versionInfo));
102
LoadBlob_UINT32(offset, event->ulPcrIndex, blob, NULL);
103
LoadBlob_UINT32(offset, event->eventType, blob, NULL);
105
LoadBlob_UINT32(offset, event->ulPcrValueLength, blob, NULL);
106
if (event->ulPcrValueLength > 0)
107
LoadBlob(offset, event->ulPcrValueLength, blob, event->rgbPcrValue, NULL);
109
LoadBlob_UINT32(offset, event->ulEventLength, blob, NULL);
110
if (event->ulEventLength > 0)
111
LoadBlob(offset, event->ulEventLength, blob, event->rgbEvent, NULL);
116
UnloadBlob_PCR_EVENT(UINT64 *offset, BYTE *blob, TSS_PCR_EVENT *event)
118
UnloadBlob_VERSION(offset, blob, (TCPA_VERSION *)&(event->versionInfo));
119
UnloadBlob_UINT32(offset, &event->ulPcrIndex, blob, NULL);
120
UnloadBlob_UINT32(offset, &event->eventType, blob, NULL);
122
UnloadBlob_UINT32(offset, &event->ulPcrValueLength, blob, NULL);
123
if (event->ulPcrValueLength > 0) {
124
event->rgbPcrValue = malloc(event->ulPcrValueLength);
125
if (event->rgbPcrValue == NULL) {
126
LogError("malloc of %d bytes failed.", event->ulPcrValueLength);
127
return TCSERR(TSS_E_OUTOFMEMORY);
130
UnloadBlob(offset, event->ulPcrValueLength, blob, event->rgbPcrValue, NULL);
132
event->rgbPcrValue = NULL;
135
UnloadBlob_UINT32(offset, &event->ulEventLength, blob, NULL);
136
if (event->ulEventLength > 0) {
137
event->rgbEvent = malloc(event->ulEventLength);
138
if (event->rgbEvent == NULL) {
139
LogError("malloc of %d bytes failed.", event->ulEventLength);
140
free(event->rgbPcrValue);
141
return TCSERR(TSS_E_OUTOFMEMORY);
144
UnloadBlob(offset, event->ulEventLength, blob, event->rgbEvent, NULL);
146
event->rgbEvent = NULL;
153
initData(struct tcsd_comm_data *comm, int parm_count)
155
/* min packet size should be the size of the header */
156
memset(&comm->hdr, 0, sizeof(struct tcsd_packet_hdr));
157
comm->hdr.packet_size = sizeof(struct tcsd_packet_hdr);
158
if (parm_count > 0) {
159
comm->hdr.type_offset = sizeof(struct tcsd_packet_hdr);
160
comm->hdr.parm_offset = comm->hdr.type_offset +
161
(sizeof(TCSD_PACKET_TYPE) * parm_count);
162
comm->hdr.packet_size = comm->hdr.parm_offset;
165
memset(comm->buf, 0, comm->buf_size);
169
loadData(UINT64 *offset, TCSD_PACKET_TYPE data_type, void *data, int data_size, BYTE *blob)
172
case TCSD_PACKET_TYPE_BYTE:
173
LoadBlob_BYTE(offset, *((BYTE *) (data)), blob, NULL);
175
case TCSD_PACKET_TYPE_BOOL:
176
LoadBlob_BOOL(offset, *((TSS_BOOL *) (data)), blob, NULL);
178
case TCSD_PACKET_TYPE_UINT16:
179
LoadBlob_UINT16(offset, *((UINT16 *) (data)), blob, NULL);
181
case TCSD_PACKET_TYPE_UINT32:
182
LoadBlob_UINT32(offset, *((UINT32 *) (data)), blob, NULL);
184
case TCSD_PACKET_TYPE_PBYTE:
185
LoadBlob(offset, data_size, blob, data, NULL);
187
case TCSD_PACKET_TYPE_NONCE:
188
LoadBlob(offset, sizeof(TCPA_NONCE), blob, ((TCPA_NONCE *)data)->nonce, NULL);
190
case TCSD_PACKET_TYPE_DIGEST:
191
LoadBlob(offset, sizeof(TCPA_DIGEST), blob, ((TCPA_DIGEST *)data)->digest, NULL);
193
case TCSD_PACKET_TYPE_AUTH:
194
LoadBlob_Auth_Special(offset, blob, ((TPM_AUTH *)data));
196
case TCSD_PACKET_TYPE_UUID:
197
LoadBlob_UUID(offset, blob, *((TSS_UUID *)data));
199
case TCSD_PACKET_TYPE_ENCAUTH:
200
LoadBlob(offset, sizeof(TCPA_ENCAUTH), blob, ((TCPA_ENCAUTH *)data)->authdata, NULL);
202
case TCSD_PACKET_TYPE_VERSION:
203
LoadBlob_VERSION(offset, blob, ((TCPA_VERSION *)data));
205
case TCSD_PACKET_TYPE_KM_KEYINFO:
206
LoadBlob_KM_KEYINFO(offset, blob, ((TSS_KM_KEYINFO *)data));
208
case TCSD_PACKET_TYPE_LOADKEY_INFO:
209
LoadBlob_LOADKEY_INFO(offset, blob, ((TCS_LOADKEY_INFO *)data));
211
case TCSD_PACKET_TYPE_PCR_EVENT:
212
LoadBlob_PCR_EVENT(offset, blob, ((TSS_PCR_EVENT *)data));
215
LogError("TCSD packet type unknown! (0x%x)", data_type & 0xff);
216
return TCSERR(TSS_E_INTERNAL_ERROR);
223
setData(TCSD_PACKET_TYPE dataType, int index, void *theData, int theDataSize, struct tcsd_comm_data *comm)
225
UINT64 old_offset, offset;
227
TCSD_PACKET_TYPE *type;
229
/* Calculate the size of the area needed (use NULL for blob address) */
231
if ((result = loadData(&offset, dataType, theData, theDataSize, NULL)) != TSS_SUCCESS)
233
if (((int)comm->hdr.packet_size + (int)offset) < 0) {
234
LogError("Too much data to be transmitted!");
235
return TCSERR(TSS_E_INTERNAL_ERROR);
237
if (((int)comm->hdr.packet_size + (int)offset) > comm->buf_size) {
238
/* reallocate the buffer */
240
int buffer_size = comm->hdr.packet_size + offset;
242
static int realloc_scalar = 1;
244
realloc_scalar *= TCSD_COMMBUF_REALLOC_SCALAR;
246
if (((int)offset * realloc_scalar) + buffer_size < 0)
247
buffer_size = INT_MAX;
249
buffer_size += (int)offset * realloc_scalar;
251
LogDebug("Increasing communication buffer by %d bytes.",
252
(int)offset * realloc_scalar);
254
LogDebug("Increasing communication buffer to %d bytes.", buffer_size);
255
buffer = realloc(comm->buf, buffer_size);
256
if (buffer == NULL) {
257
LogError("realloc of %d bytes failed.", buffer_size);
258
return TCSERR(TSS_E_INTERNAL_ERROR);
260
comm->buf_size = buffer_size;
264
offset = old_offset = comm->hdr.parm_offset + comm->hdr.parm_size;
265
if ((result = loadData(&offset, dataType, theData, theDataSize, comm->buf)) != TSS_SUCCESS)
267
type = (TCSD_PACKET_TYPE *)(comm->buf + comm->hdr.type_offset) + index;
269
comm->hdr.type_size += sizeof(TCSD_PACKET_TYPE);
270
comm->hdr.parm_size += (offset - old_offset);
272
comm->hdr.packet_size = offset;
273
comm->hdr.num_parms++;
279
getData(TCSD_PACKET_TYPE dataType, int index, void *theData, int theDataSize, struct tcsd_comm_data *comm)
282
UINT64 old_offset, offset;
283
TCSD_PACKET_TYPE *type = (TCSD_PACKET_TYPE *)(comm->buf + comm->hdr.type_offset) +
286
if ((UINT32)index >= comm->hdr.num_parms || dataType != *type) {
287
LogDebug("Data type of TCS packet element %d doesn't match.", index);
288
return TSS_TCP_RPC_BAD_PACKET_TYPE;
290
old_offset = offset = comm->hdr.parm_offset;
292
case TCSD_PACKET_TYPE_BYTE:
293
UnloadBlob_BYTE(&offset, (BYTE *) (theData), comm->buf, NULL);
295
case TCSD_PACKET_TYPE_BOOL:
296
UnloadBlob_BOOL(&offset, (TSS_BOOL *) (theData), comm->buf, NULL);
298
case TCSD_PACKET_TYPE_UINT16:
299
UnloadBlob_UINT16(&offset, (UINT16 *) (theData), comm->buf, NULL);
301
case TCSD_PACKET_TYPE_UINT32:
302
UnloadBlob_UINT32(&offset, (UINT32 *) (theData), comm->buf, NULL);
304
case TCSD_PACKET_TYPE_PBYTE:
305
UnloadBlob(&offset, theDataSize, comm->buf, theData, NULL);
307
case TCSD_PACKET_TYPE_NONCE:
308
UnloadBlob(&offset, sizeof(TCPA_NONCE), comm->buf,
309
((TCPA_NONCE *) (theData))->nonce, NULL);
311
case TCSD_PACKET_TYPE_DIGEST:
312
UnloadBlob(&offset, sizeof(TCPA_DIGEST), comm->buf,
313
((TCPA_DIGEST *) (theData))->digest, NULL);
315
case TCSD_PACKET_TYPE_AUTH:
316
UnloadBlob_Auth_Special(&offset, comm->buf, ((TPM_AUTH *) theData));
318
case TCSD_PACKET_TYPE_UUID:
319
UnloadBlob_UUID(&offset, comm->buf, (TSS_UUID *) theData);
321
case TCSD_PACKET_TYPE_ENCAUTH:
322
UnloadBlob(&offset, sizeof(TCPA_ENCAUTH), comm->buf,
323
((TCPA_ENCAUTH *) theData)->authdata, NULL);
325
case TCSD_PACKET_TYPE_VERSION:
326
UnloadBlob_VERSION(&offset, comm->buf, ((TCPA_VERSION *) theData));
328
case TCSD_PACKET_TYPE_KM_KEYINFO:
329
UnloadBlob_KM_KEYINFO(&offset, comm->buf, ((TSS_KM_KEYINFO*)theData));
331
case TCSD_PACKET_TYPE_LOADKEY_INFO:
332
UnloadBlob_LOADKEY_INFO(&offset, comm->buf, ((TCS_LOADKEY_INFO *)theData));
334
case TCSD_PACKET_TYPE_PCR_EVENT:
335
if ((result = UnloadBlob_PCR_EVENT(&offset, comm->buf, ((TSS_PCR_EVENT *)theData))))
339
LogError("TCSD packet type unknown! (0x%x)", dataType & 0xff);
340
return TCSERR(TSS_E_INTERNAL_ERROR);
342
comm->hdr.parm_offset = offset;
343
comm->hdr.parm_size -= (offset - old_offset);
349
tcs_wrap_Error(struct tcsd_thread_data *data)
351
LogError("%s reached.", __FUNCTION__);
353
initData(&data->comm, 0);
355
data->comm.hdr.u.result = TCSERR(TSS_E_FAIL);
361
tcs_wrap_OpenContext(struct tcsd_thread_data *data)
363
TCS_CONTEXT_HANDLE hContext;
366
LogDebug("thread %x servicing a %s request", (UINT32)pthread_self(), __FUNCTION__);
368
result = TCS_OpenContext_Internal(&hContext);
369
if (result == TSS_SUCCESS) {
370
initData(&data->comm, 1);
371
if (setData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
372
return TCSERR(TSS_E_INTERNAL_ERROR);
374
/* Set the context in the thread's object. Later, if something goes wrong
375
* and the connection can't be closed cleanly, we'll still have a reference
376
* to what resources need to be freed. */
377
data->context = hContext;
379
initData(&data->comm, 0);
381
data->comm.hdr.u.result = result;
387
tcs_wrap_GetRandom(struct tcsd_thread_data *data)
389
TCS_CONTEXT_HANDLE hContext;
390
UINT32 bytesRequested;
391
BYTE *randomBytes = NULL;
394
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
395
return TCSERR(TSS_E_INTERNAL_ERROR);
397
LogDebug("thread %x context %x: %s", (UINT32)pthread_self(), hContext, __FUNCTION__);
399
if (getData(TCSD_PACKET_TYPE_UINT32, 1, &bytesRequested, 0, &data->comm))
400
return TCSERR(TSS_E_INTERNAL_ERROR);
402
pthread_mutex_lock(&tcsp_lock);
404
result = TCSP_GetRandom_Internal(hContext, &bytesRequested, &randomBytes);
406
pthread_mutex_unlock(&tcsp_lock);
408
if (result == TSS_SUCCESS) {
409
initData(&data->comm, 2);
410
if (setData(TCSD_PACKET_TYPE_UINT32, 0, &bytesRequested, 0, &data->comm)) {
412
return TCSERR(TSS_E_INTERNAL_ERROR);
414
if (setData(TCSD_PACKET_TYPE_PBYTE, 1, randomBytes, bytesRequested, &data->comm)) {
416
return TCSERR(TSS_E_INTERNAL_ERROR);
420
initData(&data->comm, 0);
422
data->comm.hdr.u.result = result;
428
tcs_wrap_CreateEndorsementKeyPair(struct tcsd_thread_data *data)
430
TCS_CONTEXT_HANDLE hContext;
431
TCPA_NONCE antiReplay;
436
TCPA_DIGEST checksum;
439
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
440
return TCSERR(TSS_E_INTERNAL_ERROR);
442
LogDebug("thread %x context %x: %s", (UINT32)pthread_self(), hContext, __FUNCTION__);
444
if (getData(TCSD_PACKET_TYPE_NONCE, 1, &antiReplay, 0, &data->comm))
445
return TCSERR(TSS_E_INTERNAL_ERROR);
447
if (getData(TCSD_PACKET_TYPE_UINT32, 2, &eKPtrSize, 0, &data->comm))
448
return TCSERR(TSS_E_INTERNAL_ERROR);
453
eKPtr = calloc(1, eKPtrSize);
455
LogError("malloc of %d bytes failed.", eKPtrSize);
456
return TCSERR(TSS_E_OUTOFMEMORY);
458
if (getData(TCSD_PACKET_TYPE_PBYTE, 3, eKPtr, eKPtrSize, &data->comm)) {
460
return TCSERR(TSS_E_INTERNAL_ERROR);
464
pthread_mutex_lock(&tcsp_lock);
466
result = TCSP_CreateEndorsementKeyPair_Internal(hContext, antiReplay, eKPtrSize, eKPtr, &eKSize, &eK, &checksum);
468
pthread_mutex_unlock(&tcsp_lock);
472
if (result == TSS_SUCCESS) {
473
initData(&data->comm, 3);
474
if (setData(TCSD_PACKET_TYPE_UINT32, 0, &eKSize, 0, &data->comm)) {
476
return TCSERR(TSS_E_INTERNAL_ERROR);
478
if (setData(TCSD_PACKET_TYPE_PBYTE, 1, eK, eKSize, &data->comm)) {
480
return TCSERR(TSS_E_INTERNAL_ERROR);
483
if (setData(TCSD_PACKET_TYPE_DIGEST, 2, &checksum, 0, &data->comm))
484
return TCSERR(TSS_E_INTERNAL_ERROR);
487
initData(&data->comm, 0);
489
data->comm.hdr.u.result = result;
495
tcs_wrap_ReadPubek(struct tcsd_thread_data *data)
497
TCS_CONTEXT_HANDLE hContext;
498
TCPA_NONCE antiReplay;
501
TCPA_DIGEST checksum;
504
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
505
return TCSERR(TSS_E_INTERNAL_ERROR);
507
LogDebug("thread %x context %x: %s", (UINT32)pthread_self(), hContext, __FUNCTION__);
509
if (getData(TCSD_PACKET_TYPE_NONCE, 1, &antiReplay, 0, &data->comm))
510
return TCSERR(TSS_E_INTERNAL_ERROR);
512
pthread_mutex_lock(&tcsp_lock);
514
result = TCSP_ReadPubek_Internal(hContext, antiReplay, &pubEKSize, &pubEK,
517
pthread_mutex_unlock(&tcsp_lock);
519
if (result == TSS_SUCCESS) {
520
initData(&data->comm, 3);
521
if (setData(TCSD_PACKET_TYPE_UINT32, 0, &pubEKSize, 0, &data->comm)) {
523
return TCSERR(TSS_E_INTERNAL_ERROR);
525
if (setData(TCSD_PACKET_TYPE_PBYTE, 1, pubEK, pubEKSize, &data->comm)) {
527
return TCSERR(TSS_E_INTERNAL_ERROR);
530
if (setData(TCSD_PACKET_TYPE_DIGEST, 2, &checksum, 0, &data->comm))
531
return TCSERR(TSS_E_INTERNAL_ERROR);
533
initData(&data->comm, 0);
535
data->comm.hdr.u.result = result;
541
tcs_wrap_OwnerReadPubek(struct tcsd_thread_data *data)
543
TCS_CONTEXT_HANDLE hContext;
549
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
550
return TCSERR(TSS_E_INTERNAL_ERROR);
552
LogDebug("thread %x context %x: %s", (UINT32)pthread_self(), hContext, __FUNCTION__);
554
if (getData(TCSD_PACKET_TYPE_AUTH, 1, &auth, 0, &data->comm))
555
return TCSERR(TSS_E_INTERNAL_ERROR);
557
pthread_mutex_lock(&tcsp_lock);
559
result = TCSP_OwnerReadPubek_Internal(hContext, &auth, &pubEKSize, &pubEK);
561
pthread_mutex_unlock(&tcsp_lock);
563
if (result == TSS_SUCCESS) {
564
initData(&data->comm, 3);
565
if (setData(TCSD_PACKET_TYPE_AUTH, 0, &auth, 0, &data->comm)) {
567
return TCSERR(TSS_E_INTERNAL_ERROR);
569
if (setData(TCSD_PACKET_TYPE_UINT32, 1, &pubEKSize, 0, &data->comm)) {
571
return TCSERR(TSS_E_INTERNAL_ERROR);
573
if (setData(TCSD_PACKET_TYPE_PBYTE, 2, pubEK, pubEKSize, &data->comm)) {
575
return TCSERR(TSS_E_INTERNAL_ERROR);
579
initData(&data->comm, 0);
581
data->comm.hdr.u.result = result;
587
tcs_wrap_DisablePubekRead(struct tcsd_thread_data *data)
589
TCS_CONTEXT_HANDLE hContext;
593
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
594
return TCSERR(TSS_E_INTERNAL_ERROR);
596
LogDebug("thread %x context %x: %s", (UINT32)pthread_self(), hContext, __FUNCTION__);
598
if (getData(TCSD_PACKET_TYPE_AUTH, 1, &auth, 0, &data->comm))
599
return TCSERR(TSS_E_INTERNAL_ERROR);
601
pthread_mutex_lock(&tcsp_lock);
603
result = TCSP_DisablePubekRead_Internal(hContext, &auth);
605
pthread_mutex_unlock(&tcsp_lock);
607
if (result == TSS_SUCCESS) {
608
initData(&data->comm, 1);
609
if (setData(TCSD_PACKET_TYPE_AUTH, 0, &auth, 0, &data->comm))
610
return TCSERR(TSS_E_INTERNAL_ERROR);
612
initData(&data->comm, 0);
614
data->comm.hdr.u.result = result;
620
tcs_wrap_CloseContext(struct tcsd_thread_data *data)
622
TCS_CONTEXT_HANDLE hContext;
625
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
626
return TCSERR(TSS_E_INTERNAL_ERROR);
628
LogDebug("thread %x context %x: %s", (UINT32)pthread_self(), hContext, __FUNCTION__);
630
result = TCS_CloseContext_Internal(hContext);
632
/* This will signal the thread that the connection has been closed cleanly */
633
if (result == TSS_SUCCESS)
634
data->context = NULL_TCS_HANDLE;
636
initData(&data->comm, 0);
638
data->comm.hdr.u.result = result;
644
tcs_wrap_EvictKey(struct tcsd_thread_data *data)
646
TCS_CONTEXT_HANDLE hContext;
650
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
651
return TCSERR(TSS_E_INTERNAL_ERROR);
653
LogDebug("thread %x context %x: %s", (UINT32)pthread_self(), hContext, __FUNCTION__);
655
if (getData(TCSD_PACKET_TYPE_UINT32, 1, &hKey, 0, &data->comm))
656
return TCSERR(TSS_E_INTERNAL_ERROR);
658
pthread_mutex_lock(&tcsp_lock);
660
result = key_mgr_evict(hContext, hKey);
662
pthread_mutex_unlock(&tcsp_lock);
664
initData(&data->comm, 0);
666
data->comm.hdr.u.result = result;
672
tcs_wrap_GetPubkey(struct tcsd_thread_data *data)
674
TCS_CONTEXT_HANDLE hContext;
683
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
684
return TCSERR(TSS_E_INTERNAL_ERROR);
686
LogDebug("thread %x context %x: %s", (UINT32)pthread_self(), hContext, __FUNCTION__);
688
if (getData(TCSD_PACKET_TYPE_UINT32, 1, &hKey, 0, &data->comm))
689
return TCSERR(TSS_E_INTERNAL_ERROR);
691
result = getData(TCSD_PACKET_TYPE_AUTH, 2, &auth, 0, &data->comm);
692
if (result == TSS_TCP_RPC_BAD_PACKET_TYPE)
695
return TCSERR(TSS_E_INTERNAL_ERROR);
699
pthread_mutex_lock(&tcsp_lock);
701
result = TCSP_GetPubKey_Internal(hContext, hKey, pAuth, &pubKeySize, &pubKey);
703
pthread_mutex_unlock(&tcsp_lock);
705
if (result == TSS_SUCCESS) {
707
initData(&data->comm, 3);
709
if (setData(TCSD_PACKET_TYPE_AUTH, i++, pAuth, 0, &data->comm)) {
711
return TCSERR(TSS_E_INTERNAL_ERROR);
713
if (setData(TCSD_PACKET_TYPE_UINT32, i++, &pubKeySize, 0, &data->comm)) {
715
return TCSERR(TSS_E_INTERNAL_ERROR);
717
if (setData(TCSD_PACKET_TYPE_PBYTE, i++, pubKey, pubKeySize, &data->comm)) {
719
return TCSERR(TSS_E_INTERNAL_ERROR);
723
initData(&data->comm, 0);
725
data->comm.hdr.u.result = result;
731
tcs_wrap_OIAP(struct tcsd_thread_data *data)
733
TCS_CONTEXT_HANDLE hContext;
734
TCS_AUTHHANDLE authHandle;
738
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
739
return TCSERR(TSS_E_INTERNAL_ERROR);
741
LogDebug("thread %x context %x: %s", (UINT32)pthread_self(), hContext, __FUNCTION__);
743
pthread_mutex_lock(&tcsp_lock);
745
result = auth_mgr_oiap(hContext, &authHandle, &n0);
747
pthread_mutex_unlock(&tcsp_lock);
749
if (result == TSS_SUCCESS) {
750
initData(&data->comm, 2);
751
if (setData(TCSD_PACKET_TYPE_UINT32, 0, &authHandle, 0, &data->comm))
752
return TCSERR(TSS_E_INTERNAL_ERROR);
753
if (setData(TCSD_PACKET_TYPE_NONCE, 1, &n0, 0, &data->comm))
754
return TCSERR(TSS_E_INTERNAL_ERROR);
756
initData(&data->comm, 0);
758
data->comm.hdr.u.result = result;
764
tcs_wrap_TerminateHandle(struct tcsd_thread_data *data)
766
TCS_CONTEXT_HANDLE hContext;
767
TCS_AUTHHANDLE authHandle;
770
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
771
return TCSERR(TSS_E_INTERNAL_ERROR);
773
LogDebug("thread %x context %x: %s", (UINT32)pthread_self(), hContext, __FUNCTION__);
775
if (getData(TCSD_PACKET_TYPE_UINT32, 1, &authHandle, 0, &data->comm))
776
return TCSERR(TSS_E_INTERNAL_ERROR);
778
pthread_mutex_lock(&tcsp_lock);
780
result = TCSP_TerminateHandle_Internal(hContext, authHandle);
782
pthread_mutex_unlock(&tcsp_lock);
784
initData(&data->comm, 0);
786
data->comm.hdr.u.result = result;
792
tcs_wrap_Extend(struct tcsd_thread_data *data)
794
TCS_CONTEXT_HANDLE hContext;
796
TCPA_DIGEST inDigest;
798
TCPA_DIGEST outDigest;
800
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
801
return TCSERR(TSS_E_INTERNAL_ERROR);
803
LogDebug("thread %x context %x: %s", (UINT32)pthread_self(), hContext, __FUNCTION__);
805
if (getData(TCSD_PACKET_TYPE_UINT32, 1, &pcrIndex, 0, &data->comm))
806
return TCSERR(TSS_E_INTERNAL_ERROR);
807
if (getData(TCSD_PACKET_TYPE_DIGEST, 2, &inDigest, 0, &data->comm))
808
return TCSERR(TSS_E_INTERNAL_ERROR);
810
pthread_mutex_lock(&tcsp_lock);
812
result = TCSP_Extend_Internal(hContext, pcrIndex, inDigest, &outDigest);
814
pthread_mutex_unlock(&tcsp_lock);
816
if (result == TSS_SUCCESS) {
817
initData(&data->comm, 1);
818
if (setData(TCSD_PACKET_TYPE_DIGEST, 0, &outDigest, 0, &data->comm))
819
return TCSERR(TSS_E_INTERNAL_ERROR);
821
initData(&data->comm, 0);
823
data->comm.hdr.u.result = result;
829
tcs_wrap_PcrRead(struct tcsd_thread_data *data)
831
TCS_CONTEXT_HANDLE hContext;
836
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
837
return TCSERR(TSS_E_INTERNAL_ERROR);
839
LogDebug("thread %x context %x: %s", (UINT32)pthread_self(), hContext, __FUNCTION__);
841
if (getData(TCSD_PACKET_TYPE_UINT32, 1, &pcrIndex, 0, &data->comm))
842
return TCSERR(TSS_E_INTERNAL_ERROR);
844
pthread_mutex_lock(&tcsp_lock);
846
result = TCSP_PcrRead_Internal(hContext, pcrIndex, &digest);
848
pthread_mutex_unlock(&tcsp_lock);
850
if (result == TSS_SUCCESS) {
851
initData(&data->comm, 1);
852
if (setData(TCSD_PACKET_TYPE_DIGEST, 0, &digest, 0, &data->comm))
853
return TCSERR(TSS_E_INTERNAL_ERROR);
855
initData(&data->comm, 0);
857
data->comm.hdr.u.result = result;
863
tcs_wrap_GetCapability(struct tcsd_thread_data *data)
865
TCS_CONTEXT_HANDLE hContext;
866
TCPA_CAPABILITY_AREA capArea;
873
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
874
return TCSERR(TSS_E_INTERNAL_ERROR);
876
LogDebug("thread %x context %x: %s", (UINT32)pthread_self(), hContext, __FUNCTION__);
878
if (getData(TCSD_PACKET_TYPE_UINT32, 1, &capArea, 0, &data->comm))
879
return TCSERR(TSS_E_INTERNAL_ERROR);
880
if (getData(TCSD_PACKET_TYPE_UINT32, 2, &subCapSize, 0, &data->comm))
881
return TCSERR(TSS_E_INTERNAL_ERROR);
886
subCap = calloc(1, subCapSize);
887
if (subCap == NULL) {
888
LogError("malloc of %d bytes failed.", subCapSize);
889
return TCSERR(TSS_E_OUTOFMEMORY);
891
if (getData(TCSD_PACKET_TYPE_PBYTE, 3, subCap, subCapSize, &data->comm)) {
893
return TCSERR(TSS_E_INTERNAL_ERROR);
897
pthread_mutex_lock(&tcsp_lock);
899
result = TCSP_GetCapability_Internal(hContext, capArea, subCapSize, subCap,
902
pthread_mutex_unlock(&tcsp_lock);
906
if (result == TSS_SUCCESS) {
907
initData(&data->comm, 2);
908
if (setData(TCSD_PACKET_TYPE_UINT32, 0, &respSize, 0, &data->comm)) {
910
return TCSERR(TSS_E_INTERNAL_ERROR);
912
if (setData(TCSD_PACKET_TYPE_PBYTE, 1, resp, respSize, &data->comm)) {
914
return TCSERR(TSS_E_INTERNAL_ERROR);
918
initData(&data->comm, 0);
920
data->comm.hdr.u.result = result;
926
tcs_wrap_GetCapabilityOwner(struct tcsd_thread_data *data)
928
TCS_CONTEXT_HANDLE hContext;
930
TCPA_VERSION version;
935
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
936
return TCSERR(TSS_E_INTERNAL_ERROR);
938
LogDebug("thread %x context %x: %s", (UINT32)pthread_self(), hContext, __FUNCTION__);
940
if (getData(TCSD_PACKET_TYPE_AUTH, 1, &ownerAuth, 0, &data->comm))
941
return TCSERR(TSS_E_INTERNAL_ERROR);
943
pthread_mutex_lock(&tcsp_lock);
945
result = TCSP_GetCapabilityOwner_Internal(hContext, &ownerAuth, &version,
948
pthread_mutex_unlock(&tcsp_lock);
950
if (result == TSS_SUCCESS) {
951
initData(&data->comm, 4);
952
if (setData(TCSD_PACKET_TYPE_VERSION, 0, &version, 0, &data->comm))
953
return TCSERR(TSS_E_INTERNAL_ERROR);
954
if (setData(TCSD_PACKET_TYPE_UINT32, 1, &nonVol, 0, &data->comm))
955
return TCSERR(TSS_E_INTERNAL_ERROR);
956
if (setData(TCSD_PACKET_TYPE_UINT32, 2, &vol, 0, &data->comm))
957
return TCSERR(TSS_E_INTERNAL_ERROR);
958
if (setData(TCSD_PACKET_TYPE_AUTH, 3, &ownerAuth, 0, &data->comm))
959
return TCSERR(TSS_E_INTERNAL_ERROR);
961
initData(&data->comm, 0);
963
data->comm.hdr.u.result = result;
969
tcs_wrap_TCSGetCapability(struct tcsd_thread_data *data)
971
TCS_CONTEXT_HANDLE hContext;
972
TCPA_CAPABILITY_AREA capArea;
979
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
980
return TCSERR(TSS_E_INTERNAL_ERROR);
982
LogDebug("thread %x context %x: %s", (UINT32)pthread_self(), hContext, __FUNCTION__);
984
if (getData(TCSD_PACKET_TYPE_UINT32, 1, &capArea, 0, &data->comm))
985
return TCSERR(TSS_E_INTERNAL_ERROR);
986
if (getData(TCSD_PACKET_TYPE_UINT32, 2, &subCapSize, 0, &data->comm))
987
return TCSERR(TSS_E_INTERNAL_ERROR);
989
subCap = calloc(1, subCapSize);
990
if (subCap == NULL) {
991
LogError("malloc of %d bytes failed.", subCapSize);
992
return TCSERR(TSS_E_OUTOFMEMORY);
994
if (getData(TCSD_PACKET_TYPE_PBYTE, 3, subCap, subCapSize, &data->comm)) {
996
return TCSERR(TSS_E_INTERNAL_ERROR);
999
result = TCS_GetCapability_Internal(hContext, capArea, subCapSize, subCap,
1003
if (result == TSS_SUCCESS) {
1004
initData(&data->comm, 2);
1005
if (setData(TCSD_PACKET_TYPE_UINT32, 0, &respSize, 0, &data->comm)) {
1007
return TCSERR(TSS_E_INTERNAL_ERROR);
1009
if (setData(TCSD_PACKET_TYPE_PBYTE, 1, resp, respSize, &data->comm)) {
1011
return TCSERR(TSS_E_INTERNAL_ERROR);
1015
initData(&data->comm, 0);
1017
data->comm.hdr.u.result = result;
1023
tcs_wrap_PhysicalSetDeactivated(struct tcsd_thread_data *data)
1025
TCS_CONTEXT_HANDLE hContext;
1029
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
1030
return TCSERR(TSS_E_INTERNAL_ERROR);
1032
LogDebug("thread %x context %x: %s", (UINT32)pthread_self(), hContext, __FUNCTION__);
1034
if (getData(TCSD_PACKET_TYPE_BOOL, 1, &state, 0, &data->comm))
1035
return TCSERR(TSS_E_INTERNAL_ERROR);
1037
pthread_mutex_lock(&tcsp_lock);
1039
result = TCSP_PhysicalSetDeactivated_Internal(hContext, state);
1041
pthread_mutex_unlock(&tcsp_lock);
1043
initData(&data->comm, 0);
1045
data->comm.hdr.u.result = result;
1051
tcs_wrap_TakeOwnership(struct tcsd_thread_data *data)
1053
TCS_CONTEXT_HANDLE hContext;
1055
UINT32 encOwnerAuthSize;
1057
UINT32 encSrkAuthSize;
1067
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
1068
return TCSERR(TSS_E_INTERNAL_ERROR);
1070
LogDebug("thread %x context %x: %s", (UINT32)pthread_self(), hContext, __FUNCTION__);
1072
if (getData(TCSD_PACKET_TYPE_UINT16, 1, &protocolID, 0, &data->comm))
1073
return TCSERR(TSS_E_INTERNAL_ERROR);
1074
if (getData(TCSD_PACKET_TYPE_UINT32, 2, &encOwnerAuthSize, 0, &data->comm))
1075
return TCSERR(TSS_E_INTERNAL_ERROR);
1076
encOwnerAuth = calloc(1, encOwnerAuthSize);
1077
if (encOwnerAuth == NULL) {
1078
LogError("malloc of %d bytes failed.", encOwnerAuthSize);
1079
return TCSERR(TSS_E_OUTOFMEMORY);
1081
if (getData(TCSD_PACKET_TYPE_PBYTE, 3, encOwnerAuth, encOwnerAuthSize, &data->comm)) {
1083
return TCSERR(TSS_E_INTERNAL_ERROR);
1085
if (getData(TCSD_PACKET_TYPE_UINT32, 4, &encSrkAuthSize, 0, &data->comm)) {
1087
return TCSERR(TSS_E_INTERNAL_ERROR);
1089
encSrkAuth = calloc(1, encSrkAuthSize);
1090
if (encSrkAuth == NULL) {
1091
LogError("malloc of %d bytes failed.", encSrkAuthSize);
1093
return TCSERR(TSS_E_INTERNAL_ERROR);
1095
if (getData(TCSD_PACKET_TYPE_PBYTE, 5, encSrkAuth, encSrkAuthSize, &data->comm)) {
1098
return TCSERR(TSS_E_INTERNAL_ERROR);
1100
if (getData(TCSD_PACKET_TYPE_UINT32, 6, &srkInfoSize, 0, &data->comm)) {
1103
return TCSERR(TSS_E_INTERNAL_ERROR);
1106
srkInfo = calloc(1, srkInfoSize);
1107
if (srkInfo == NULL) {
1108
LogError("malloc of %d bytes failed.", srkInfoSize);
1111
return TCSERR(TSS_E_INTERNAL_ERROR);
1113
if (getData(TCSD_PACKET_TYPE_PBYTE, 7, srkInfo, srkInfoSize, &data->comm)) {
1117
return TCSERR(TSS_E_INTERNAL_ERROR);
1119
if (getData(TCSD_PACKET_TYPE_AUTH, 8, &ownerAuth, 0, &data->comm)) {
1123
return TCSERR(TSS_E_INTERNAL_ERROR);
1126
pthread_mutex_lock(&tcsp_lock);
1128
result = TCSP_TakeOwnership_Internal(hContext, protocolID, encOwnerAuthSize,
1129
encOwnerAuth, encSrkAuthSize,
1130
encSrkAuth, srkInfoSize, srkInfo,
1131
&ownerAuth, &srkKeySize, &srkKey);
1133
pthread_mutex_unlock(&tcsp_lock);
1139
if (result == TSS_SUCCESS) {
1140
initData(&data->comm, 3);
1141
if (setData(TCSD_PACKET_TYPE_AUTH, 0, &ownerAuth, 0, &data->comm)) {
1143
return TCSERR(TSS_E_INTERNAL_ERROR);
1145
if (setData(TCSD_PACKET_TYPE_UINT32, 1, &srkKeySize, 0, &data->comm)) {
1147
return TCSERR(TSS_E_INTERNAL_ERROR);
1149
if (setData(TCSD_PACKET_TYPE_PBYTE, 2, srkKey, srkKeySize, &data->comm)) {
1151
return TCSERR(TSS_E_INTERNAL_ERROR);
1155
initData(&data->comm, 0);
1157
data->comm.hdr.u.result = result;
1163
tcs_wrap_OwnerClear(struct tcsd_thread_data *data)
1165
TCS_CONTEXT_HANDLE hContext;
1169
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
1170
return TCSERR(TSS_E_INTERNAL_ERROR);
1172
LogDebug("thread %x context %x: %s", (UINT32)pthread_self(), hContext, __FUNCTION__);
1174
if (getData(TCSD_PACKET_TYPE_AUTH, 1, &auth, 0, &data->comm))
1175
return TCSERR(TSS_E_INTERNAL_ERROR);
1177
pthread_mutex_lock(&tcsp_lock);
1179
result = TCSP_OwnerClear_Internal(hContext, &auth);
1181
pthread_mutex_unlock(&tcsp_lock);
1183
if (result == TSS_SUCCESS) {
1184
initData(&data->comm, 1);
1185
if (setData(TCSD_PACKET_TYPE_AUTH, 0, &auth, 0, &data->comm))
1186
return TCSERR(TSS_E_INTERNAL_ERROR);
1188
initData(&data->comm, 0);
1190
data->comm.hdr.u.result = result;
1196
tcs_wrap_DisableOwnerClear(struct tcsd_thread_data *data)
1198
TCS_CONTEXT_HANDLE hContext;
1202
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
1203
return TCSERR(TSS_E_INTERNAL_ERROR);
1205
LogDebug("thread %x context %x: %s", (UINT32)pthread_self(), hContext, __FUNCTION__);
1207
if (getData(TCSD_PACKET_TYPE_AUTH, 1, &auth, 0, &data->comm))
1208
return TCSERR(TSS_E_INTERNAL_ERROR);
1210
pthread_mutex_lock(&tcsp_lock);
1212
result = TCSP_DisableOwnerClear_Internal(hContext, &auth);
1214
pthread_mutex_unlock(&tcsp_lock);
1216
if (result == TSS_SUCCESS) {
1217
initData(&data->comm, 1);
1218
if (setData(TCSD_PACKET_TYPE_AUTH, 0, &auth, 0, &data->comm))
1219
return TCSERR(TSS_E_INTERNAL_ERROR);
1221
initData(&data->comm, 0);
1223
data->comm.hdr.u.result = result;
1229
tcs_wrap_ForceClear(struct tcsd_thread_data *data)
1231
TCS_CONTEXT_HANDLE hContext;
1234
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
1235
return TCSERR(TSS_E_INTERNAL_ERROR);
1237
LogDebug("thread %x context %x: %s", (UINT32)pthread_self(), hContext, __FUNCTION__);
1239
pthread_mutex_lock(&tcsp_lock);
1241
result = TCSP_ForceClear_Internal(hContext);
1243
pthread_mutex_unlock(&tcsp_lock);
1245
initData(&data->comm, 0);
1247
data->comm.hdr.u.result = result;
1253
tcs_wrap_DisableForceClear(struct tcsd_thread_data *data)
1255
TCS_CONTEXT_HANDLE hContext;
1258
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
1259
return TCSERR(TSS_E_INTERNAL_ERROR);
1261
LogDebug("thread %x context %x: %s", (UINT32)pthread_self(), hContext, __FUNCTION__);
1263
pthread_mutex_lock(&tcsp_lock);
1265
result = TCSP_DisableForceClear_Internal(hContext);
1267
pthread_mutex_unlock(&tcsp_lock);
1269
initData(&data->comm, 0);
1271
data->comm.hdr.u.result = result;
1277
tcs_wrap_PhysicalEnable(struct tcsd_thread_data *data)
1279
TCS_CONTEXT_HANDLE hContext;
1282
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
1283
return TCSERR(TSS_E_INTERNAL_ERROR);
1285
LogDebug("thread %x context %x: %s", (UINT32)pthread_self(), hContext, __FUNCTION__);
1287
pthread_mutex_lock(&tcsp_lock);
1289
result = TCSP_PhysicalEnable_Internal(hContext);
1291
pthread_mutex_unlock(&tcsp_lock);
1293
initData(&data->comm, 0);
1295
data->comm.hdr.u.result = result;
1301
tcs_wrap_RegisterKey(struct tcsd_thread_data *data)
1303
TCS_CONTEXT_HANDLE hContext;
1304
TSS_UUID WrappingKeyUUID;
1312
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
1313
return TCSERR(TSS_E_INTERNAL_ERROR);
1315
LogDebug("thread %x context %x: %s", (UINT32)pthread_self(), hContext, __FUNCTION__);
1317
if (getData(TCSD_PACKET_TYPE_UUID, 1, &WrappingKeyUUID, 0, &data->comm))
1318
return TCSERR(TSS_E_INTERNAL_ERROR);
1319
if (getData(TCSD_PACKET_TYPE_UUID, 2, &KeyUUID, 0, &data->comm))
1320
return TCSERR(TSS_E_INTERNAL_ERROR);
1321
if (getData(TCSD_PACKET_TYPE_UINT32, 3, &cKeySize, 0, &data->comm))
1322
return TCSERR(TSS_E_INTERNAL_ERROR);
1324
rgbKey = calloc(1, cKeySize);
1325
if (rgbKey == NULL) {
1326
LogError("malloc of %d bytes failed.", cKeySize);
1327
return TCSERR(TSS_E_OUTOFMEMORY);
1329
if (getData(TCSD_PACKET_TYPE_PBYTE, 4, rgbKey, cKeySize, &data->comm)) {
1331
return TCSERR(TSS_E_INTERNAL_ERROR);
1333
if (getData(TCSD_PACKET_TYPE_UINT32, 5, &cVendorData, 0, &data->comm)) {
1335
return TCSERR(TSS_E_INTERNAL_ERROR);
1338
if (cVendorData == 0)
1339
gbVendorData = NULL;
1341
gbVendorData = calloc(1, cVendorData);
1342
if (gbVendorData == NULL) {
1343
LogError("malloc of %d bytes failed.", cVendorData);
1345
return TCSERR(TSS_E_OUTOFMEMORY);
1348
if (getData(TCSD_PACKET_TYPE_PBYTE, 6, gbVendorData, cVendorData, &data->comm)) {
1351
return TCSERR(TSS_E_INTERNAL_ERROR);
1355
result = TCS_RegisterKey_Internal(hContext, &WrappingKeyUUID, &KeyUUID,
1356
cKeySize, rgbKey, cVendorData,
1361
initData(&data->comm, 0);
1363
data->comm.hdr.u.result = result;
1369
tcs_wrap_UnregisterKey(struct tcsd_thread_data *data)
1371
TCS_CONTEXT_HANDLE hContext;
1375
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
1376
return TCSERR(TSS_E_INTERNAL_ERROR);
1378
LogDebug("thread %x context %x: %s", (UINT32)pthread_self(), hContext, __FUNCTION__);
1380
if (getData(TCSD_PACKET_TYPE_UUID, 1, &uuid, 0, &data->comm))
1381
return TCSERR(TSS_E_INTERNAL_ERROR);
1383
result = TCSP_UnregisterKey_Internal(hContext, uuid);
1385
initData(&data->comm, 0);
1387
data->comm.hdr.u.result = result;
1393
tcs_wrap_GetRegisteredKeyBlob(struct tcsd_thread_data *data)
1395
TCS_CONTEXT_HANDLE hContext;
1401
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
1402
return TCSERR(TSS_E_INTERNAL_ERROR);
1404
LogDebug("thread %x context %x: %s", (UINT32)pthread_self(), hContext, __FUNCTION__);
1406
if (getData(TCSD_PACKET_TYPE_UUID, 1, &uuid, 0, &data->comm))
1407
return TCSERR(TSS_E_INTERNAL_ERROR);
1409
result = TCS_GetRegisteredKeyBlob_Internal(hContext, &uuid, &pcKeySize,
1411
if (result == TSS_SUCCESS) {
1412
initData(&data->comm, 2);
1413
if (setData(TCSD_PACKET_TYPE_UINT32, 0, &pcKeySize, 0, &data->comm)) {
1415
return TCSERR(TSS_E_INTERNAL_ERROR);
1417
if (setData(TCSD_PACKET_TYPE_PBYTE, 1, prgbKey, pcKeySize, &data->comm)) {
1419
return TCSERR(TSS_E_INTERNAL_ERROR);
1423
initData(&data->comm, 0);
1425
data->comm.hdr.u.result = result;
1431
tcs_wrap_LoadKeyByBlob(struct tcsd_thread_data *data)
1433
TCS_CONTEXT_HANDLE hContext;
1434
TCS_KEY_HANDLE hUnwrappingKey;
1435
UINT32 cWrappedKeyBlob;
1436
BYTE *rgbWrappedKeyBlob;
1440
TCS_KEY_HANDLE phKeyTCSI;
1441
TCS_KEY_HANDLE phKeyHMAC;
1447
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
1448
return TCSERR(TSS_E_INTERNAL_ERROR);
1450
LogDebug("thread %x context %x: %s", (UINT32)pthread_self(), hContext, __FUNCTION__);
1452
if (getData(TCSD_PACKET_TYPE_UINT32, 1, &hUnwrappingKey, 0, &data->comm))
1453
return TCSERR(TSS_E_INTERNAL_ERROR);
1454
if (getData(TCSD_PACKET_TYPE_UINT32, 2, &cWrappedKeyBlob, 0, &data->comm))
1455
return TCSERR(TSS_E_INTERNAL_ERROR);
1457
rgbWrappedKeyBlob = calloc(1, cWrappedKeyBlob);
1458
if (rgbWrappedKeyBlob == NULL) {
1459
LogError("malloc of %d bytes failed.", cWrappedKeyBlob);
1460
return TCSERR(TSS_E_OUTOFMEMORY);
1462
if (getData(TCSD_PACKET_TYPE_PBYTE, 3, rgbWrappedKeyBlob, cWrappedKeyBlob, &data->comm)) {
1463
free(rgbWrappedKeyBlob);
1464
return TCSERR(TSS_E_INTERNAL_ERROR);
1466
result = getData(TCSD_PACKET_TYPE_AUTH, 4, &auth, 0, &data->comm);
1467
if (result == TSS_TCP_RPC_BAD_PACKET_TYPE)
1470
free(rgbWrappedKeyBlob);
1471
return TCSERR(TSS_E_INTERNAL_ERROR);
1475
pthread_mutex_lock(&tcsp_lock);
1477
result = key_mgr_load_by_blob(hContext, hUnwrappingKey, cWrappedKeyBlob, rgbWrappedKeyBlob,
1478
pAuth, &phKeyTCSI, &phKeyHMAC);
1481
result = ctx_mark_key_loaded(hContext, phKeyTCSI);
1483
pthread_mutex_unlock(&tcsp_lock);
1485
free(rgbWrappedKeyBlob);
1487
if (result == TSS_SUCCESS) {
1489
initData(&data->comm, 3);
1490
if (pAuth != NULL) {
1491
if (setData(TCSD_PACKET_TYPE_AUTH, i++, pAuth, 0, &data->comm))
1492
return TCSERR(TSS_E_INTERNAL_ERROR);
1494
if (setData(TCSD_PACKET_TYPE_UINT32, i++, &phKeyTCSI, 0, &data->comm))
1495
return TCSERR(TSS_E_INTERNAL_ERROR);
1496
if (setData(TCSD_PACKET_TYPE_UINT32, i++, &phKeyHMAC, 0, &data->comm))
1497
return TCSERR(TSS_E_INTERNAL_ERROR);
1499
initData(&data->comm, 0);
1501
data->comm.hdr.u.result = result;
1507
tcs_wrap_LoadKeyByUUID(struct tcsd_thread_data *data)
1509
TCS_CONTEXT_HANDLE hContext;
1511
TCS_LOADKEY_INFO info, *pInfo;
1512
TCS_KEY_HANDLE phKeyTCSI;
1515
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
1516
return TCSERR(TSS_E_INTERNAL_ERROR);
1518
LogDebug("thread %x context %x: %s", (UINT32)pthread_self(), hContext, __FUNCTION__);
1520
if (getData(TCSD_PACKET_TYPE_UUID, 1, &uuid, 0, &data->comm))
1521
return TCSERR(TSS_E_INTERNAL_ERROR);
1523
result = getData(TCSD_PACKET_TYPE_LOADKEY_INFO, 2, &info, 0, &data->comm);
1524
if (result == TSS_TCP_RPC_BAD_PACKET_TYPE)
1527
return TCSERR(TSS_E_INTERNAL_ERROR);
1531
pthread_mutex_lock(&tcsp_lock);
1533
result = key_mgr_load_by_uuid(hContext, &uuid, pInfo, &phKeyTCSI);
1535
pthread_mutex_unlock(&tcsp_lock);
1537
if (result == TSS_SUCCESS) {
1538
initData(&data->comm, 2);
1539
if (setData(TCSD_PACKET_TYPE_UINT32, 0, &phKeyTCSI, 0, &data->comm))
1540
return TCSERR(TSS_E_INTERNAL_ERROR);
1541
if (pInfo != NULL) {
1542
if (setData(TCSD_PACKET_TYPE_LOADKEY_INFO, 1, pInfo, 0, &data->comm))
1543
return TCSERR(TSS_E_INTERNAL_ERROR);
1546
if (result == TCSERR(TCS_E_KM_LOADFAILED) && pInfo != NULL) {
1547
initData(&data->comm, 1);
1548
if (setData(TCSD_PACKET_TYPE_LOADKEY_INFO, 0, pInfo, 0, &data->comm))
1549
return TCSERR(TSS_E_INTERNAL_ERROR);
1551
initData(&data->comm, 0);
1554
data->comm.hdr.u.result = result;
1560
tcs_wrap_OSAP(struct tcsd_thread_data *data)
1562
TCS_CONTEXT_HANDLE hContext;
1563
TCPA_ENTITY_TYPE entityType;
1565
TCPA_NONCE nonceOddOSAP;
1567
TCS_AUTHHANDLE authHandle;
1568
TCPA_NONCE nonceEven;
1569
TCPA_NONCE nonceEvenOSAP;
1572
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
1573
return TCSERR(TSS_E_INTERNAL_ERROR);
1575
LogDebug("thread %x context %x: %s", (UINT32)pthread_self(), hContext, __FUNCTION__);
1577
if (getData(TCSD_PACKET_TYPE_UINT16, 1, &entityType, 0, &data->comm))
1578
return TCSERR(TSS_E_INTERNAL_ERROR);
1579
if (getData(TCSD_PACKET_TYPE_UINT32, 2, &entityValue, 0, &data->comm))
1580
return TCSERR(TSS_E_INTERNAL_ERROR);
1581
if (getData(TCSD_PACKET_TYPE_NONCE, 3, &nonceOddOSAP, 0, &data->comm))
1582
return TCSERR(TSS_E_INTERNAL_ERROR);
1584
pthread_mutex_lock(&tcsp_lock);
1586
result = auth_mgr_osap(hContext, entityType, entityValue, nonceOddOSAP,
1587
&authHandle, &nonceEven, &nonceEvenOSAP);
1589
pthread_mutex_unlock(&tcsp_lock);
1591
if (result == TSS_SUCCESS) {
1592
initData(&data->comm, 3);
1593
if (setData(TCSD_PACKET_TYPE_UINT32, 0, &authHandle, 0, &data->comm))
1594
return TCSERR(TSS_E_INTERNAL_ERROR);
1595
if (setData(TCSD_PACKET_TYPE_NONCE, 1, &nonceEven, 0, &data->comm))
1596
return TCSERR(TSS_E_INTERNAL_ERROR);
1597
if (setData(TCSD_PACKET_TYPE_NONCE, 2, &nonceEvenOSAP, 0, &data->comm))
1598
return TCSERR(TSS_E_INTERNAL_ERROR);
1600
initData(&data->comm, 0);
1602
data->comm.hdr.u.result = result;
1608
tcs_wrap_Sign(struct tcsd_thread_data *data)
1610
TCS_CONTEXT_HANDLE hContext;
1611
TCS_KEY_HANDLE hKey;
1612
UINT32 areaToSignSize;
1624
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
1625
return TCSERR(TSS_E_INTERNAL_ERROR);
1627
LogDebug("thread %x context %x: %s", (UINT32)pthread_self(), hContext, __FUNCTION__);
1629
if (getData(TCSD_PACKET_TYPE_UINT32, 1, &hKey, 0, &data->comm))
1630
return TCSERR(TSS_E_INTERNAL_ERROR);
1631
if (getData(TCSD_PACKET_TYPE_UINT32, 2, &areaToSignSize, 0, &data->comm))
1632
return TCSERR(TSS_E_INTERNAL_ERROR);
1634
areaToSign = calloc(1, areaToSignSize);
1635
if (areaToSign == NULL) {
1636
LogError("malloc of %d bytes failed.", areaToSignSize);
1637
return TCSERR(TSS_E_OUTOFMEMORY);
1639
if (getData(TCSD_PACKET_TYPE_PBYTE, 3, areaToSign, areaToSignSize, &data->comm)) {
1641
return TCSERR(TSS_E_INTERNAL_ERROR);
1643
result = getData(TCSD_PACKET_TYPE_AUTH, 4, &auth, 0, &data->comm);
1644
if (result == TSS_TCP_RPC_BAD_PACKET_TYPE)
1648
return TCSERR(TSS_E_INTERNAL_ERROR);
1652
pthread_mutex_lock(&tcsp_lock);
1654
result = TCSP_Sign_Internal(hContext, hKey, areaToSignSize, areaToSign,
1655
pAuth, &sigSize, &sig);
1657
pthread_mutex_unlock(&tcsp_lock);
1661
if (result == TSS_SUCCESS) {
1663
initData(&data->comm, 3);
1664
if (pAuth != NULL) {
1665
if (setData(TCSD_PACKET_TYPE_AUTH, i++, &auth, 0, &data->comm)) {
1667
return TCSERR(TSS_E_INTERNAL_ERROR);
1670
if (setData(TCSD_PACKET_TYPE_UINT32, i++, &sigSize, 0, &data->comm)) {
1672
return TCSERR(TSS_E_INTERNAL_ERROR);
1674
if (setData(TCSD_PACKET_TYPE_PBYTE, i++, sig, sigSize, &data->comm)) {
1676
return TCSERR(TSS_E_INTERNAL_ERROR);
1680
initData(&data->comm, 0);
1682
data->comm.hdr.u.result = result;
1688
tcs_wrap_DirWriteAuth(struct tcsd_thread_data *data)
1691
TSS_HCONTEXT hContext;
1692
TCPA_DIRINDEX dirIndex;
1693
TCPA_DIGEST dirDigest;
1696
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
1697
return TCSERR(TSS_E_INTERNAL_ERROR);
1699
LogDebug("thread %x context %x: %s", (UINT32)pthread_self(), hContext, __FUNCTION__);
1701
if (getData(TCSD_PACKET_TYPE_UINT32, 1, &dirIndex, 0, &data->comm))
1702
return TCSERR(TSS_E_INTERNAL_ERROR);
1703
if (getData(TCSD_PACKET_TYPE_DIGEST, 2, &dirDigest, 0, &data->comm))
1704
return TCSERR(TSS_E_INTERNAL_ERROR);
1705
if (getData(TCSD_PACKET_TYPE_AUTH, 3, &auth, 0, &data->comm))
1706
return TCSERR(TSS_E_INTERNAL_ERROR);
1708
pthread_mutex_lock(&tcsp_lock);
1710
result = TCSP_DirWriteAuth_Internal(hContext, dirIndex, dirDigest, &auth);
1712
pthread_mutex_unlock(&tcsp_lock);
1714
if (result == TSS_SUCCESS) {
1715
initData(&data->comm, 1);
1716
if (setData(TCSD_PACKET_TYPE_AUTH, 0, &auth, 0, &data->comm))
1717
return TCSERR(TSS_E_INTERNAL_ERROR);
1719
initData(&data->comm, 0);
1721
data->comm.hdr.u.result = result;
1727
tcs_wrap_DirRead(struct tcsd_thread_data *data)
1730
TSS_HCONTEXT hContext;
1731
TCPA_DIRINDEX dirIndex;
1732
TCPA_DIRVALUE dirValue;
1734
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
1735
return TCSERR(TSS_E_INTERNAL_ERROR);
1737
LogDebug("thread %x context %x: %s", (UINT32)pthread_self(), hContext, __FUNCTION__);
1739
if (getData(TCSD_PACKET_TYPE_UINT32, 1, &dirIndex, 0, &data->comm))
1740
return TCSERR(TSS_E_INTERNAL_ERROR);
1742
pthread_mutex_lock(&tcsp_lock);
1744
result = TCSP_DirRead_Internal(hContext, dirIndex, &dirValue);
1746
pthread_mutex_unlock(&tcsp_lock);
1748
if (result == TSS_SUCCESS) {
1749
initData(&data->comm, 1);
1750
if (setData(TCSD_PACKET_TYPE_DIGEST, 0, &dirValue, 0, &data->comm))
1751
return TCSERR(TSS_E_INTERNAL_ERROR);
1753
initData(&data->comm, 0);
1755
data->comm.hdr.u.result = result;
1761
tcs_wrap_Seal(struct tcsd_thread_data *data)
1764
TCS_CONTEXT_HANDLE hContext;
1765
TCS_KEY_HANDLE keyHandle;
1766
TCPA_ENCAUTH KeyUsageAuth;
1767
UINT32 PCRInfoSize, inDataSize;
1768
BYTE *PCRInfo = NULL, *inData = NULL;
1769
TPM_AUTH emptyAuth, pubAuth, *pAuth;
1775
memset(&emptyAuth, 0, sizeof(TPM_AUTH));
1776
memset(&pubAuth, 0, sizeof(TPM_AUTH));
1778
if (getData(TCSD_PACKET_TYPE_UINT32, i++, &hContext, 0, &data->comm))
1779
return TCSERR(TSS_E_INTERNAL_ERROR);
1781
LogDebug("thread %x context %x: %s", (UINT32)pthread_self(), hContext, __FUNCTION__);
1783
if (getData(TCSD_PACKET_TYPE_UINT32, i++, &keyHandle, 0, &data->comm))
1784
return TCSERR(TSS_E_INTERNAL_ERROR);
1785
if (getData(TCSD_PACKET_TYPE_ENCAUTH, i++, &KeyUsageAuth, 0, &data->comm))
1786
return TCSERR(TSS_E_INTERNAL_ERROR);
1787
if (getData(TCSD_PACKET_TYPE_UINT32, i++, &PCRInfoSize, 0, &data->comm))
1788
return TCSERR(TSS_E_INTERNAL_ERROR);
1790
if (PCRInfoSize > 0) {
1791
PCRInfo = calloc(1, PCRInfoSize);
1792
if (PCRInfo == NULL) {
1793
LogError("malloc of %u bytes failed.", PCRInfoSize);
1794
return TCSERR(TSS_E_OUTOFMEMORY);
1797
if (getData(TCSD_PACKET_TYPE_PBYTE, i++, PCRInfo, PCRInfoSize, &data->comm)) {
1799
return TCSERR(TSS_E_INTERNAL_ERROR);
1803
if (getData(TCSD_PACKET_TYPE_UINT32, i++, &inDataSize, 0, &data->comm)) {
1805
return TCSERR(TSS_E_INTERNAL_ERROR);
1808
if (inDataSize > 0) {
1809
inData = calloc(1, inDataSize);
1810
if (inData == NULL) {
1811
LogError("malloc of %u bytes failed.", inDataSize);
1813
return TCSERR(TSS_E_OUTOFMEMORY);
1816
if (getData(TCSD_PACKET_TYPE_PBYTE, i++, inData, inDataSize, &data->comm)) {
1819
return TCSERR(TSS_E_INTERNAL_ERROR);
1823
result = getData(TCSD_PACKET_TYPE_AUTH, i++, &pubAuth, 0, &data->comm);
1824
if (result == TSS_TCP_RPC_BAD_PACKET_TYPE)
1829
return TCSERR(TSS_E_INTERNAL_ERROR);
1833
pthread_mutex_lock(&tcsp_lock);
1835
result = TCSP_Seal_Internal(hContext, keyHandle, KeyUsageAuth, PCRInfoSize, PCRInfo,
1836
inDataSize, inData, pAuth, &outDataSize, &outData);
1838
pthread_mutex_unlock(&tcsp_lock);
1843
if (result == TSS_SUCCESS) {
1844
initData(&data->comm, 3);
1845
if (pAuth != NULL) {
1846
if (setData(TCSD_PACKET_TYPE_AUTH, 0, pAuth, 0, &data->comm)) {
1848
return TCSERR(TSS_E_INTERNAL_ERROR);
1852
if (setData(TCSD_PACKET_TYPE_UINT32, 1, &outDataSize, 0, &data->comm)) {
1854
return TCSERR(TSS_E_INTERNAL_ERROR);
1856
if (setData(TCSD_PACKET_TYPE_PBYTE, 2, outData, outDataSize, &data->comm)) {
1858
return TCSERR(TSS_E_INTERNAL_ERROR);
1862
initData(&data->comm, 0);
1864
data->comm.hdr.u.result = result;
1870
tcs_wrap_UnSeal(struct tcsd_thread_data *data)
1872
TCS_CONTEXT_HANDLE hContext;
1873
TCS_KEY_HANDLE parentHandle;
1877
TPM_AUTH parentAuth, dataAuth, emptyAuth;
1878
TPM_AUTH *pParentAuth, *pDataAuth;
1884
memset(&emptyAuth, 0, sizeof(TPM_AUTH));
1886
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
1887
return TCSERR(TSS_E_INTERNAL_ERROR);
1889
LogDebug("thread %x context %x: %s", (UINT32)pthread_self(), hContext, __FUNCTION__);
1891
if (getData(TCSD_PACKET_TYPE_UINT32, 1, &parentHandle, 0, &data->comm))
1892
return TCSERR(TSS_E_INTERNAL_ERROR);
1893
if (getData(TCSD_PACKET_TYPE_UINT32, 2, &inDataSize, 0, &data->comm))
1894
return TCSERR(TSS_E_INTERNAL_ERROR);
1896
inData = calloc(1, inDataSize);
1897
if (inData == NULL) {
1898
LogError("malloc of %d bytes failed.", inDataSize);
1899
return TCSERR(TSS_E_OUTOFMEMORY);
1902
if (getData(TCSD_PACKET_TYPE_PBYTE, 3, inData, inDataSize, &data->comm)) {
1904
return TCSERR(TSS_E_INTERNAL_ERROR);
1907
if (getData(TCSD_PACKET_TYPE_AUTH, 4, &parentAuth, 0, &data->comm)) {
1909
return TCSERR(TSS_E_INTERNAL_ERROR);
1911
if (!memcmp(&emptyAuth, &parentAuth, sizeof(TPM_AUTH)))
1914
pParentAuth = &parentAuth;
1916
if (getData(TCSD_PACKET_TYPE_AUTH, 5, &dataAuth, 0, &data->comm)) {
1918
return TCSERR(TSS_E_INTERNAL_ERROR);
1921
result = getData(TCSD_PACKET_TYPE_AUTH, 4, &parentAuth, 0, &data->comm);
1922
if (result == TSS_TCP_RPC_BAD_PACKET_TYPE)
1926
return TCSERR(TSS_E_INTERNAL_ERROR);
1928
pParentAuth = &parentAuth;
1930
result = getData(TCSD_PACKET_TYPE_AUTH, 5, &dataAuth, 0, &data->comm);
1931
if (result == TSS_TCP_RPC_BAD_PACKET_TYPE) {
1932
pDataAuth = pParentAuth;
1934
} else if (result) {
1936
return TCSERR(TSS_E_INTERNAL_ERROR);
1938
pDataAuth = &dataAuth;
1940
pthread_mutex_lock(&tcsp_lock);
1942
result = TCSP_Unseal_Internal(hContext, parentHandle, inDataSize, inData,
1943
pParentAuth, pDataAuth, &outDataSize, &outData);
1945
pthread_mutex_unlock(&tcsp_lock);
1949
if (result == TSS_SUCCESS) {
1950
initData(&data->comm, 4);
1951
if (pParentAuth != NULL) {
1952
if (setData(TCSD_PACKET_TYPE_AUTH, 0, pParentAuth, 0, &data->comm)) {
1954
return TCSERR(TSS_E_INTERNAL_ERROR);
1957
if (setData(TCSD_PACKET_TYPE_AUTH, 0, &emptyAuth, 0, &data->comm)) {
1959
return TCSERR(TSS_E_INTERNAL_ERROR);
1963
if (setData(TCSD_PACKET_TYPE_AUTH, 1, &dataAuth, 0, &data->comm)) {
1965
return TCSERR(TSS_E_INTERNAL_ERROR);
1967
if (setData(TCSD_PACKET_TYPE_UINT32, 2, &outDataSize, 0, &data->comm)) {
1969
return TCSERR(TSS_E_INTERNAL_ERROR);
1971
if (setData(TCSD_PACKET_TYPE_PBYTE, 3, outData, outDataSize, &data->comm)) {
1973
return TCSERR(TSS_E_INTERNAL_ERROR);
1977
initData(&data->comm, 0);
1979
data->comm.hdr.u.result = result;
1985
tcs_wrap_UnBind(struct tcsd_thread_data *data)
1987
TCS_CONTEXT_HANDLE hContext;
1988
TCS_KEY_HANDLE keyHandle;
1993
TPM_AUTH *pPrivAuth;
2001
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
2002
return TCSERR(TSS_E_INTERNAL_ERROR);
2004
LogDebug("thread %x context %x: %s", (UINT32)pthread_self(), hContext, __FUNCTION__);
2006
if (getData(TCSD_PACKET_TYPE_UINT32, 1, &keyHandle, 0, &data->comm))
2007
return TCSERR(TSS_E_INTERNAL_ERROR);
2008
if (getData(TCSD_PACKET_TYPE_UINT32, 2, &inDataSize, 0, &data->comm))
2009
return TCSERR(TSS_E_INTERNAL_ERROR);
2011
inData = calloc(1, inDataSize);
2012
if (inData == NULL) {
2013
LogError("malloc of %d bytes failed.", inDataSize);
2014
return TCSERR(TSS_E_OUTOFMEMORY);
2016
if (getData(TCSD_PACKET_TYPE_PBYTE, 3, inData, inDataSize, &data->comm)) {
2018
return TCSERR(TSS_E_INTERNAL_ERROR);
2021
if (getData(TCSD_PACKET_TYPE_AUTH, 4, &privAuth, 0, &data->comm))
2024
pPrivAuth = &privAuth;
2026
result = getData(TCSD_PACKET_TYPE_AUTH, 4, &privAuth, 0, &data->comm);
2027
if (result == TSS_TCP_RPC_BAD_PACKET_TYPE)
2031
return TCSERR(TSS_E_INTERNAL_ERROR);
2033
pPrivAuth = &privAuth;
2035
pthread_mutex_lock(&tcsp_lock);
2037
result = TCSP_UnBind_Internal(hContext, keyHandle, inDataSize, inData,
2038
pPrivAuth, &outDataSize, &outData);
2040
pthread_mutex_unlock(&tcsp_lock);
2044
if (result == TSS_SUCCESS) {
2046
initData(&data->comm, 3);
2047
if (pPrivAuth != NULL) {
2048
if (setData(TCSD_PACKET_TYPE_AUTH, i++, pPrivAuth, 0, &data->comm))
2049
return TCSERR(TSS_E_INTERNAL_ERROR);
2051
if (setData(TCSD_PACKET_TYPE_UINT32, i++, &outDataSize, 0, &data->comm))
2052
return TCSERR(TSS_E_INTERNAL_ERROR);
2053
if (setData(TCSD_PACKET_TYPE_PBYTE, i++, outData, outDataSize, &data->comm))
2054
return TCSERR(TSS_E_INTERNAL_ERROR);
2057
initData(&data->comm, 0);
2059
data->comm.hdr.u.result = result;
2065
tcs_wrap_StirRandom(struct tcsd_thread_data *data)
2067
TCS_CONTEXT_HANDLE hContext;
2072
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
2073
return TCSERR(TSS_E_INTERNAL_ERROR);
2075
LogDebug("thread %x context %x: %s", (UINT32)pthread_self(), hContext, __FUNCTION__);
2077
if (getData(TCSD_PACKET_TYPE_UINT32, 1, &inDataSize, 0, &data->comm))
2078
return TCSERR(TSS_E_INTERNAL_ERROR);
2080
inData = calloc(1, inDataSize);
2081
if (inData == NULL) {
2082
LogError("malloc of %d bytes failed.", inDataSize);
2083
return TCSERR(TSS_E_OUTOFMEMORY);
2085
if (getData(TCSD_PACKET_TYPE_PBYTE, 2, inData, inDataSize, &data->comm)) {
2087
return TCSERR(TSS_E_INTERNAL_ERROR);
2090
pthread_mutex_lock(&tcsp_lock);
2092
result = TCSP_StirRandom_Internal(hContext, inDataSize, inData);
2094
pthread_mutex_unlock(&tcsp_lock);
2098
initData(&data->comm, 0);
2100
data->comm.hdr.u.result = result;
2106
tcs_wrap_CreateWrapKey(struct tcsd_thread_data *data)
2108
TCS_CONTEXT_HANDLE hContext;
2109
TCS_KEY_HANDLE hWrappingKey;
2110
TCPA_ENCAUTH KeyUsageAuth;
2111
TCPA_ENCAUTH KeyMigrationAuth;
2121
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
2122
return TCSERR(TSS_E_INTERNAL_ERROR);
2124
LogDebug("thread %x context %x: %s", (UINT32)pthread_self(), hContext, __FUNCTION__);
2126
if (getData(TCSD_PACKET_TYPE_UINT32, 1, &hWrappingKey, 0, &data->comm))
2127
return TCSERR(TSS_E_INTERNAL_ERROR);
2128
if (getData(TCSD_PACKET_TYPE_ENCAUTH, 2, &KeyUsageAuth, 0, &data->comm))
2129
return TCSERR(TSS_E_INTERNAL_ERROR);
2130
if (getData(TCSD_PACKET_TYPE_ENCAUTH, 3, &KeyMigrationAuth, 0, &data->comm))
2131
return TCSERR(TSS_E_INTERNAL_ERROR);
2132
if (getData(TCSD_PACKET_TYPE_UINT32, 4, &keyInfoSize, 0, &data->comm))
2133
return TCSERR(TSS_E_INTERNAL_ERROR);
2135
keyInfo = calloc(1, keyInfoSize);
2136
if (keyInfo == NULL) {
2137
LogError("malloc of %d bytes failed.", keyInfoSize);
2138
return TCSERR(TSS_E_OUTOFMEMORY);
2140
if (getData(TCSD_PACKET_TYPE_PBYTE, 5, keyInfo, keyInfoSize, &data->comm)) {
2142
return TCSERR(TSS_E_INTERNAL_ERROR);
2144
if (getData(TCSD_PACKET_TYPE_AUTH, 6, &pAuth, 0, &data->comm)) {
2146
return TCSERR(TSS_E_INTERNAL_ERROR);
2149
pthread_mutex_lock(&tcsp_lock);
2151
result = TCSP_CreateWrapKey_Internal(hContext, hWrappingKey, KeyUsageAuth,
2152
KeyMigrationAuth, keyInfoSize, keyInfo,
2153
&keyDataSize, &keyData, &pAuth);
2155
pthread_mutex_unlock(&tcsp_lock);
2158
if (result == TSS_SUCCESS) {
2159
initData(&data->comm, 3);
2160
if (setData(TCSD_PACKET_TYPE_UINT32, 0, &keyDataSize, 0, &data->comm)) {
2162
return TCSERR(TSS_E_INTERNAL_ERROR);
2164
if (setData(TCSD_PACKET_TYPE_PBYTE, 1, keyData, keyDataSize, &data->comm)) {
2166
return TCSERR(TSS_E_INTERNAL_ERROR);
2169
if (setData(TCSD_PACKET_TYPE_AUTH, 2, &pAuth, 0, &data->comm))
2170
return TCSERR(TSS_E_INTERNAL_ERROR);
2172
initData(&data->comm, 0);
2174
data->comm.hdr.u.result = result;
2180
tcs_wrap_ChangeAuth(struct tcsd_thread_data *data)
2182
TCS_CONTEXT_HANDLE hContext;
2183
TCS_KEY_HANDLE parentHandle;
2184
TCPA_PROTOCOL_ID protocolID;
2185
TCPA_ENCAUTH newAuth;
2186
TCPA_ENTITY_TYPE entityType;
2191
TPM_AUTH entityAuth;
2197
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
2198
return TCSERR(TSS_E_INTERNAL_ERROR);
2200
LogDebug("thread %x context %x: %s", (UINT32)pthread_self(), hContext, __FUNCTION__);
2202
if (getData(TCSD_PACKET_TYPE_UINT32, 1, &parentHandle, 0, &data->comm))
2203
return TCSERR(TSS_E_INTERNAL_ERROR);
2204
if (getData(TCSD_PACKET_TYPE_UINT16, 2, &protocolID, 0, &data->comm))
2205
return TCSERR(TSS_E_INTERNAL_ERROR);
2206
if (getData(TCSD_PACKET_TYPE_ENCAUTH, 3, &newAuth, 0, &data->comm))
2207
return TCSERR(TSS_E_INTERNAL_ERROR);
2208
if (getData(TCSD_PACKET_TYPE_UINT16, 4, &entityType, 0, &data->comm))
2209
return TCSERR(TSS_E_INTERNAL_ERROR);
2210
if (getData(TCSD_PACKET_TYPE_UINT32, 5, &encDataSize, 0, &data->comm))
2211
return TCSERR(TSS_E_INTERNAL_ERROR);
2212
encData = calloc(1, encDataSize);
2213
if (encData == NULL) {
2214
LogError("malloc of %d bytes failed.", encDataSize);
2215
return TCSERR(TSS_E_OUTOFMEMORY);
2217
if (getData(TCSD_PACKET_TYPE_PBYTE, 6, encData, encDataSize, &data->comm)) {
2219
return TCSERR(TSS_E_INTERNAL_ERROR);
2221
if (getData(TCSD_PACKET_TYPE_AUTH, 7, &ownerAuth, 0, &data->comm)) {
2223
return TCSERR(TSS_E_INTERNAL_ERROR);
2225
if (getData(TCSD_PACKET_TYPE_AUTH, 8, &entityAuth, 0, &data->comm)) {
2227
return TCSERR(TSS_E_INTERNAL_ERROR);
2230
pthread_mutex_lock(&tcsp_lock);
2232
result = TCSP_ChangeAuth_Internal(hContext, parentHandle, protocolID,
2233
newAuth, entityType, encDataSize, encData,
2234
&ownerAuth, &entityAuth, &outDataSize,
2237
pthread_mutex_unlock(&tcsp_lock);
2240
if (result == TSS_SUCCESS) {
2241
initData(&data->comm, 4);
2242
if (setData(TCSD_PACKET_TYPE_AUTH, 0, &ownerAuth, 0, &data->comm)) {
2244
return TCSERR(TSS_E_INTERNAL_ERROR);
2246
if (setData(TCSD_PACKET_TYPE_AUTH, 1, &entityAuth, 0, &data->comm)) {
2248
return TCSERR(TSS_E_INTERNAL_ERROR);
2250
if (setData(TCSD_PACKET_TYPE_UINT32, 2, &outDataSize, 0, &data->comm)) {
2252
return TCSERR(TSS_E_INTERNAL_ERROR);
2254
if (setData(TCSD_PACKET_TYPE_PBYTE, 3, outData, outDataSize, &data->comm)) {
2256
return TCSERR(TSS_E_INTERNAL_ERROR);
2260
initData(&data->comm, 0);
2262
data->comm.hdr.u.result = result;
2268
tcs_wrap_ChangeAuthOwner(struct tcsd_thread_data *data)
2271
TCS_CONTEXT_HANDLE hContext;
2272
TCPA_PROTOCOL_ID protocolID;
2273
TCPA_ENCAUTH newAuth;
2274
TCPA_ENTITY_TYPE entityType;
2279
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
2280
return TCSERR(TSS_E_INTERNAL_ERROR);
2282
LogDebug("thread %x context %x: %s", (UINT32)pthread_self(), hContext, __FUNCTION__);
2284
if (getData(TCSD_PACKET_TYPE_UINT16, 1, &protocolID, 0, &data->comm))
2285
return TCSERR(TSS_E_INTERNAL_ERROR);
2286
if (getData(TCSD_PACKET_TYPE_ENCAUTH, 2, &newAuth, 0, &data->comm))
2287
return TCSERR(TSS_E_INTERNAL_ERROR);
2288
if (getData(TCSD_PACKET_TYPE_UINT16, 3, &entityType, 0, &data->comm))
2289
return TCSERR(TSS_E_INTERNAL_ERROR);
2290
if (getData(TCSD_PACKET_TYPE_AUTH, 4, &ownerAuth, 0, &data->comm))
2291
return TCSERR(TSS_E_INTERNAL_ERROR);
2293
pthread_mutex_lock(&tcsp_lock);
2295
result = TCSP_ChangeAuthOwner_Internal(hContext, protocolID, newAuth,
2296
entityType, &ownerAuth);
2298
pthread_mutex_unlock(&tcsp_lock);
2300
if (result == TSS_SUCCESS) {
2301
initData(&data->comm, 1);
2302
if (setData(TCSD_PACKET_TYPE_AUTH, 0, &ownerAuth, 0, &data->comm))
2303
return TCSERR(TSS_E_INTERNAL_ERROR);
2305
initData(&data->comm, 0);
2307
data->comm.hdr.u.result = result;
2313
tcs_wrap_Quote(struct tcsd_thread_data *data)
2315
TCS_CONTEXT_HANDLE hContext;
2316
TCS_KEY_HANDLE hKey;
2317
TCPA_NONCE antiReplay;
2318
UINT32 pcrDataSizeIn;
2322
TPM_AUTH *pPrivAuth;
2324
UINT32 pcrDataSizeOut;
2332
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
2333
return TCSERR(TSS_E_INTERNAL_ERROR);
2335
LogDebug("thread %x context %x: %s", (UINT32)pthread_self(), hContext, __FUNCTION__);
2337
if (getData(TCSD_PACKET_TYPE_UINT32, 1, &hKey, 0, &data->comm))
2338
return TCSERR(TSS_E_INTERNAL_ERROR);
2339
if (getData(TCSD_PACKET_TYPE_NONCE, 2, &antiReplay, 0, &data->comm))
2340
return TCSERR(TSS_E_INTERNAL_ERROR);
2341
if (getData(TCSD_PACKET_TYPE_UINT32, 3, &pcrDataSizeIn, 0, &data->comm))
2342
return TCSERR(TSS_E_INTERNAL_ERROR);
2343
pcrDataIn = (BYTE *)calloc(1, pcrDataSizeIn);
2344
if (pcrDataIn == NULL) {
2345
LogError("malloc of %d bytes failed.", pcrDataSizeIn);
2346
return TCSERR(TSS_E_OUTOFMEMORY);
2348
if (getData(TCSD_PACKET_TYPE_PBYTE, 4, pcrDataIn, pcrDataSizeIn, &data->comm)) {
2350
return TCSERR(TSS_E_INTERNAL_ERROR);
2353
if (getData(TCSD_PACKET_TYPE_AUTH, 5, &privAuth, 0, &data->comm))
2356
pPrivAuth = &privAuth;
2358
result = getData(TCSD_PACKET_TYPE_AUTH, 5, &privAuth, 0, &data->comm);
2359
if (result == TSS_TCP_RPC_BAD_PACKET_TYPE)
2363
return TCSERR(TSS_E_INTERNAL_ERROR);
2365
pPrivAuth = &privAuth;
2368
pthread_mutex_lock(&tcsp_lock);
2370
result = TCSP_Quote_Internal(hContext, hKey, antiReplay, pcrDataSizeIn,
2371
pcrDataIn, pPrivAuth, &pcrDataSizeOut,
2372
&pcrDataOut, &sigSize, &sig);
2374
pthread_mutex_unlock(&tcsp_lock);
2377
if (result == TSS_SUCCESS) {
2379
initData(&data->comm, 5);
2380
if (pPrivAuth != NULL) {
2381
if (setData(TCSD_PACKET_TYPE_AUTH, i++, pPrivAuth, 0, &data->comm)) {
2384
return TCSERR(TSS_E_INTERNAL_ERROR);
2387
if (setData(TCSD_PACKET_TYPE_UINT32, i++, &pcrDataSizeOut, 0, &data->comm)) {
2390
return TCSERR(TSS_E_INTERNAL_ERROR);
2392
if (setData(TCSD_PACKET_TYPE_PBYTE, i++, pcrDataOut, pcrDataSizeOut, &data->comm)) {
2395
return TCSERR(TSS_E_INTERNAL_ERROR);
2397
if (setData(TCSD_PACKET_TYPE_UINT32, i++, &sigSize, 0, &data->comm)) {
2400
return TCSERR(TSS_E_INTERNAL_ERROR);
2402
if (setData(TCSD_PACKET_TYPE_PBYTE, i++, sig, sigSize, &data->comm)) {
2405
return TCSERR(TSS_E_INTERNAL_ERROR);
2411
initData(&data->comm, 0);
2413
data->comm.hdr.u.result = result;
2419
tcs_wrap_MakeIdentity(struct tcsd_thread_data *data)
2421
TCS_CONTEXT_HANDLE hContext;
2422
TCPA_ENCAUTH identityAuth;
2423
TCPA_CHOSENID_HASH privCAHash;
2424
UINT32 idKeyInfoSize;
2425
BYTE *idKeyInfo = NULL;
2427
TPM_AUTH auth1, auth2;
2428
TPM_AUTH *pSRKAuth, *pOwnerAuth;
2432
UINT32 pcIDBindSize;
2433
BYTE *prgbIDBind = NULL;
2435
BYTE *prgbEC = NULL;
2436
UINT32 pcPlatCredSize;
2437
BYTE *prgbPlatCred = NULL;
2438
UINT32 pcConfCredSize;
2439
BYTE *prgbConfCred = NULL;
2444
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
2445
return TCSERR(TSS_E_INTERNAL_ERROR);
2447
LogDebug("thread %x context %x: %s", (UINT32)pthread_self(), hContext, __FUNCTION__);
2449
if (getData(TCSD_PACKET_TYPE_ENCAUTH, 1, &identityAuth, 0, &data->comm))
2450
return TCSERR(TSS_E_INTERNAL_ERROR);
2451
if (getData(TCSD_PACKET_TYPE_DIGEST, 2, &privCAHash, 0, &data->comm))
2452
return TCSERR(TSS_E_INTERNAL_ERROR);
2454
if (getData(TCSD_PACKET_TYPE_UINT32, 3, &idKeyInfoSize, 0, &data->comm))
2455
return TCSERR(TSS_E_INTERNAL_ERROR);
2456
idKeyInfo = (BYTE *) calloc(1, idKeyInfoSize);
2457
if (idKeyInfo == NULL) {
2458
LogError("malloc of %d bytes failed.", idKeyInfoSize);
2459
return TCSERR(TSS_E_OUTOFMEMORY);
2461
if (getData(TCSD_PACKET_TYPE_PBYTE, 4, idKeyInfo, idKeyInfoSize, &data->comm)) {
2463
return TCSERR(TSS_E_INTERNAL_ERROR);
2465
if (getData(TCSD_PACKET_TYPE_AUTH, 5, &auth1, 0, &data->comm)) {
2467
return TCSERR(TSS_E_INTERNAL_ERROR);
2470
/* if the next one is missing, then the previous was really the owner auth */
2471
if (getData(TCSD_PACKET_TYPE_AUTH, 6, &ownerAuth, 0, &data->comm)) {
2472
LogDebug("Failed to get ownerAuth. SRK auth is really NULL "
2473
"and single auth is ownerAuth");
2475
memcpy(&ownerAuth, &srkAuth, sizeof (TPM_AUTH));
2477
LogDebug("two Auth");
2478
pSRKAuth = &srkAuth;
2481
result = getData(TCSD_PACKET_TYPE_AUTH, 6, &auth2, 0, &data->comm);
2482
if (result == TSS_TCP_RPC_BAD_PACKET_TYPE) {
2483
pOwnerAuth = &auth1;
2485
} else if (result) {
2487
return TCSERR(TSS_E_INTERNAL_ERROR);
2489
pOwnerAuth = &auth2;
2494
pthread_mutex_lock(&tcsp_lock);
2496
result = TCSP_MakeIdentity_Internal(hContext, identityAuth, privCAHash,
2497
idKeyInfoSize, idKeyInfo, pSRKAuth,
2498
pOwnerAuth, &idKeySize, &idKey,
2499
&pcIDBindSize, &prgbIDBind, &pcECSize,
2500
&prgbEC, &pcPlatCredSize, &prgbPlatCred,
2501
&pcConfCredSize, &prgbConfCred);
2503
pthread_mutex_unlock(&tcsp_lock);
2507
if (result == TSS_SUCCESS) {
2509
initData(&data->comm, 12);
2511
if (setData(TCSD_PACKET_TYPE_AUTH, i++, pSRKAuth, 0, &data->comm))
2512
goto internal_error;
2514
if (setData(TCSD_PACKET_TYPE_AUTH, i++, pOwnerAuth, 0, &data->comm))
2515
goto internal_error;
2516
if (setData(TCSD_PACKET_TYPE_UINT32, i++, &idKeySize, 0, &data->comm))
2517
goto internal_error;
2518
if (setData(TCSD_PACKET_TYPE_PBYTE, i++, idKey, idKeySize, &data->comm))
2519
goto internal_error;
2520
if (setData(TCSD_PACKET_TYPE_UINT32, i++, &pcIDBindSize, 0, &data->comm))
2521
goto internal_error;
2522
if (setData(TCSD_PACKET_TYPE_PBYTE, i++, prgbIDBind, pcIDBindSize, &data->comm))
2523
goto internal_error;
2524
if (setData(TCSD_PACKET_TYPE_UINT32, i++, &pcECSize, 0, &data->comm))
2525
goto internal_error;
2526
if (setData(TCSD_PACKET_TYPE_PBYTE, i++, prgbEC, pcECSize, &data->comm))
2527
goto internal_error;
2528
if (setData(TCSD_PACKET_TYPE_UINT32, i++, &pcPlatCredSize, 0, &data->comm))
2529
goto internal_error;
2530
if (setData(TCSD_PACKET_TYPE_PBYTE, i++, prgbPlatCred, pcPlatCredSize, &data->comm))
2531
goto internal_error;
2532
if (setData(TCSD_PACKET_TYPE_UINT32, i++, &pcConfCredSize, 0, &data->comm))
2533
goto internal_error;
2534
if (setData(TCSD_PACKET_TYPE_PBYTE, i++, prgbConfCred, pcConfCredSize, &data->comm))
2535
goto internal_error;
2543
initData(&data->comm, 0);
2545
data->comm.hdr.u.result = result;
2555
return TCSERR(TSS_E_INTERNAL_ERROR);
2559
tcs_wrap_EnumRegisteredKeys(struct tcsd_thread_data *data)
2561
TCS_CONTEXT_HANDLE hContext;
2562
TSS_UUID uuid, *pUuid;
2563
UINT32 cKeyHierarchySize;
2564
TSS_KM_KEYINFO *pKeyHierarchy;
2569
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
2570
return TCSERR(TSS_E_INTERNAL_ERROR);
2572
LogDebug("thread %x context %x: %s", (UINT32)pthread_self(), hContext, __FUNCTION__);
2575
if (getData(TCSD_PACKET_TYPE_UUID , 1, &uuid, 0, &data->comm))
2580
result = getData(TCSD_PACKET_TYPE_UUID , 1, &uuid, 0, &data->comm);
2581
if (result == TSS_TCP_RPC_BAD_PACKET_TYPE)
2584
return TCSERR(TSS_E_INTERNAL_ERROR);
2588
result = TCS_EnumRegisteredKeys_Internal(
2593
if (result == TSS_SUCCESS) {
2595
initData(&data->comm, 1 + cKeyHierarchySize);
2596
if (setData(TCSD_PACKET_TYPE_UINT32, i++, &cKeyHierarchySize, 0, &data->comm)) {
2597
free(pKeyHierarchy);
2598
return TCSERR(TSS_E_INTERNAL_ERROR);
2601
for (j = 0; j < cKeyHierarchySize; j++) {
2602
if (setData(TCSD_PACKET_TYPE_KM_KEYINFO, i++, &pKeyHierarchy[j], 0, &data->comm)) {
2603
free(pKeyHierarchy);
2604
return TCSERR(TSS_E_INTERNAL_ERROR);
2607
free(pKeyHierarchy);
2609
initData(&data->comm, 0);
2611
data->comm.hdr.u.result = result;
2617
tcs_wrap_LogPcrEvent(struct tcsd_thread_data *data)
2619
TCS_CONTEXT_HANDLE hContext;
2620
TSS_PCR_EVENT event;
2625
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
2626
return TCSERR(TSS_E_INTERNAL_ERROR);
2628
LogDebug("thread %x context %x: %s", (UINT32)pthread_self(), hContext, __FUNCTION__);
2630
if (getData(TCSD_PACKET_TYPE_PCR_EVENT , 1, &event, 0, &data->comm))
2631
return TCSERR(TSS_E_INTERNAL_ERROR);
2633
result = TCS_LogPcrEvent_Internal(hContext, event, &number);
2634
if (result == TSS_SUCCESS) {
2635
initData(&data->comm, 1);
2636
if (setData(TCSD_PACKET_TYPE_UINT32, 0, &number, 0, &data->comm))
2637
return TCSERR(TSS_E_INTERNAL_ERROR);
2639
initData(&data->comm, 0);
2641
data->comm.hdr.u.result = result;
2647
tcs_wrap_GetPcrEvent(struct tcsd_thread_data *data)
2649
TCS_CONTEXT_HANDLE hContext;
2650
TSS_PCR_EVENT *pEvent = NULL;
2652
UINT32 pcrIndex, number, totalSize;
2655
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
2656
return TCSERR(TSS_E_INTERNAL_ERROR);
2658
LogDebug("thread %x context %x: %s", (UINT32)pthread_self(), hContext, __FUNCTION__);
2660
if (getData(TCSD_PACKET_TYPE_UINT32, 1, &pcrIndex, 0, &data->comm))
2661
return TCSERR(TSS_E_INTERNAL_ERROR);
2663
if (getData(TCSD_PACKET_TYPE_UINT32, 2, &number, 0, &data->comm))
2664
return TCSERR(TSS_E_INTERNAL_ERROR);
2666
if (getData(TCSD_PACKET_TYPE_BYTE, 3, &lengthOnly, 0, &data->comm))
2667
return TCSERR(TSS_E_INTERNAL_ERROR);
2670
result = TCS_GetPcrEvent_Internal(hContext, pcrIndex, &number, NULL);
2672
result = TCS_GetPcrEvent_Internal(hContext, pcrIndex, &number, &pEvent);
2674
if (result == TSS_SUCCESS) {
2675
if (lengthOnly == FALSE)
2676
totalSize = get_pcr_event_size(pEvent);
2680
initData(&data->comm, 2);
2681
if (setData(TCSD_PACKET_TYPE_UINT32, 0, &number, 0, &data->comm)) {
2682
if (lengthOnly == FALSE)
2683
free_external_events(1, pEvent);
2685
return TCSERR(TSS_E_INTERNAL_ERROR);
2688
if (lengthOnly == FALSE) {
2689
if (setData(TCSD_PACKET_TYPE_PCR_EVENT, 1, pEvent, 0, &data->comm)) {
2690
free_external_events(1, pEvent);
2692
return TCSERR(TSS_E_INTERNAL_ERROR);
2694
free_external_events(1, pEvent);
2698
initData(&data->comm, 0);
2700
data->comm.hdr.u.result = result;
2706
tcs_wrap_GetPcrEventsByPcr(struct tcsd_thread_data *data)
2708
TCS_CONTEXT_HANDLE hContext;
2709
TSS_PCR_EVENT *ppEvents = NULL;
2711
UINT32 firstEvent, eventCount, totalSize, pcrIndex, i, j;
2713
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
2714
return TCSERR(TSS_E_INTERNAL_ERROR);
2716
LogDebug("thread %x context %x: %s", (UINT32)pthread_self(), hContext, __FUNCTION__);
2718
if (getData(TCSD_PACKET_TYPE_UINT32, 1, &pcrIndex, 0, &data->comm))
2719
return TCSERR(TSS_E_INTERNAL_ERROR);
2721
if (getData(TCSD_PACKET_TYPE_UINT32, 2, &firstEvent, 0, &data->comm))
2722
return TCSERR(TSS_E_INTERNAL_ERROR);
2724
if (getData(TCSD_PACKET_TYPE_UINT32, 3, &eventCount, 0, &data->comm))
2725
return TCSERR(TSS_E_INTERNAL_ERROR);
2727
result = TCS_GetPcrEventsByPcr_Internal(hContext, pcrIndex, firstEvent, &eventCount, &ppEvents);
2728
if (result == TSS_SUCCESS) {
2729
for (i = 0, totalSize = 0; i < eventCount; i++)
2730
totalSize += get_pcr_event_size(&(ppEvents[i]));
2732
initData(&data->comm, 1 + eventCount);
2733
if (setData(TCSD_PACKET_TYPE_UINT32, 0, &eventCount, 0, &data->comm)) {
2734
free_external_events(eventCount, ppEvents);
2736
return TCSERR(TSS_E_INTERNAL_ERROR);
2740
for (j = 0; j < eventCount; j++) {
2741
if (setData(TCSD_PACKET_TYPE_PCR_EVENT, i++, &(ppEvents[j]), 0, &data->comm)) {
2742
free_external_events(eventCount, ppEvents);
2744
return TCSERR(TSS_E_INTERNAL_ERROR);
2748
free_external_events(eventCount, ppEvents);
2751
initData(&data->comm, 0);
2753
data->comm.hdr.u.result = result;
2759
tcs_wrap_GetPcrEventLog(struct tcsd_thread_data *data)
2761
TCS_CONTEXT_HANDLE hContext;
2762
TSS_PCR_EVENT *ppEvents;
2764
UINT32 eventCount, totalSize, i, j;
2766
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
2767
return TCSERR(TSS_E_INTERNAL_ERROR);
2769
LogDebug("thread %x context %x: %s", (UINT32)pthread_self(), hContext, __FUNCTION__);
2771
result = TCS_GetPcrEventLog_Internal(hContext, &eventCount, &ppEvents);
2772
if (result == TSS_SUCCESS) {
2773
for (i = 0, totalSize = 0; i < eventCount; i++)
2774
totalSize += get_pcr_event_size(&(ppEvents[i]));
2776
initData(&data->comm, 1 + eventCount);
2777
if (setData(TCSD_PACKET_TYPE_UINT32, 0, &eventCount, 0, &data->comm)) {
2778
free_external_events(eventCount, ppEvents);
2780
return TCSERR(TSS_E_INTERNAL_ERROR);
2784
for (j = 0; j < eventCount; j++) {
2785
if (setData(TCSD_PACKET_TYPE_PCR_EVENT, i++, &(ppEvents[j]), 0, &data->comm)) {
2786
free_external_events(eventCount, ppEvents);
2788
return TCSERR(TSS_E_INTERNAL_ERROR);
2792
free_external_events(eventCount, ppEvents);
2795
initData(&data->comm, 0);
2797
data->comm.hdr.u.result = result;
2803
tcs_wrap_SelfTestFull(struct tcsd_thread_data *data)
2805
TCS_CONTEXT_HANDLE hContext;
2808
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
2809
return TCSERR(TSS_E_INTERNAL_ERROR);
2811
LogDebug("thread %x servicing a %s request", (UINT32)pthread_self(), __FUNCTION__);
2813
pthread_mutex_lock(&tcsp_lock);
2815
result = TCSP_SelfTestFull_Internal(hContext);
2817
pthread_mutex_unlock(&tcsp_lock);
2819
initData(&data->comm, 0);
2821
data->comm.hdr.u.result = result;
2827
tcs_wrap_CertifySelfTest(struct tcsd_thread_data *data)
2829
TCS_CONTEXT_HANDLE hContext;
2832
BYTE *sigData = NULL;
2833
TCS_KEY_HANDLE hKey;
2834
TCPA_NONCE antiReplay;
2836
TPM_AUTH *pPrivAuth;
2839
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
2840
return TCSERR(TSS_E_INTERNAL_ERROR);
2842
LogDebug("thread %x servicing a %s request", (UINT32)pthread_self(), __FUNCTION__);
2843
if (getData(TCSD_PACKET_TYPE_UINT32, 1, &hKey, 0, &data->comm))
2844
return TCSERR(TSS_E_INTERNAL_ERROR);
2845
if (getData(TCSD_PACKET_TYPE_NONCE, 2, &antiReplay, 0, &data->comm))
2846
return TCSERR(TSS_E_INTERNAL_ERROR);
2848
if (getData(TCSD_PACKET_TYPE_AUTH, 3, &privAuth, 0, &data->comm))
2851
pPrivAuth = &privAuth;
2853
result = getData(TCSD_PACKET_TYPE_AUTH, 3, &privAuth, 0, &data->comm);
2854
if (result == TSS_TCP_RPC_BAD_PACKET_TYPE)
2857
return TCSERR(TSS_E_INTERNAL_ERROR);
2859
pPrivAuth = &privAuth;
2862
pthread_mutex_lock(&tcsp_lock);
2864
result = TCSP_CertifySelfTest_Internal(hContext, hKey, antiReplay, pPrivAuth, &sigSize, &sigData);
2866
pthread_mutex_unlock(&tcsp_lock);
2868
if (result == TSS_SUCCESS) {
2870
initData(&data->comm, 3);
2871
if (pPrivAuth != NULL) {
2872
if (setData(TCSD_PACKET_TYPE_AUTH, i++, pPrivAuth, 0, &data->comm)) {
2874
return TCSERR(TSS_E_INTERNAL_ERROR);
2878
if (setData(TCSD_PACKET_TYPE_UINT32, i++, &sigSize, 0, &data->comm)) {
2880
return TCSERR(TSS_E_INTERNAL_ERROR);
2882
if (setData(TCSD_PACKET_TYPE_PBYTE, i++, sigData, sigSize, &data->comm)) {
2884
return TCSERR(TSS_E_INTERNAL_ERROR);
2888
initData(&data->comm, 0);
2890
data->comm.hdr.u.result = result;
2896
tcs_wrap_GetTestResult(struct tcsd_thread_data *data)
2898
TCS_CONTEXT_HANDLE hContext;
2900
UINT32 resultDataSize;
2901
BYTE *resultData = NULL;
2903
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
2904
return TCSERR(TSS_E_INTERNAL_ERROR);
2906
LogDebug("thread %x servicing a %s request", (UINT32)pthread_self(), __FUNCTION__);
2908
pthread_mutex_lock(&tcsp_lock);
2910
result = TCSP_GetTestResult_Internal(hContext, &resultDataSize, &resultData);
2912
pthread_mutex_unlock(&tcsp_lock);
2914
if (result == TSS_SUCCESS) {
2915
initData(&data->comm, 2);
2916
if (setData(TCSD_PACKET_TYPE_UINT32, 0, &resultDataSize, 0, &data->comm)) {
2918
return TCSERR(TSS_E_INTERNAL_ERROR);
2920
if (setData(TCSD_PACKET_TYPE_PBYTE, 1, resultData, resultDataSize, &data->comm)) {
2922
return TCSERR(TSS_E_INTERNAL_ERROR);
2926
initData(&data->comm, 0);
2928
data->comm.hdr.u.result = result;
2934
tcs_wrap_SetOwnerInstall(struct tcsd_thread_data *data)
2936
TCS_CONTEXT_HANDLE hContext;
2940
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
2941
return TCSERR(TSS_E_INTERNAL_ERROR);
2943
LogDebug("thread %x context %x: %s", (UINT32)pthread_self(), hContext, __FUNCTION__);
2945
if (getData(TCSD_PACKET_TYPE_BOOL, 1, &state, 0, &data->comm))
2946
return TCSERR(TSS_E_INTERNAL_ERROR);
2948
pthread_mutex_lock(&tcsp_lock);
2950
result = TCSP_SetOwnerInstall_Internal(hContext, state);
2952
pthread_mutex_unlock(&tcsp_lock);
2954
initData(&data->comm, 0);
2956
data->comm.hdr.u.result = result;
2962
tcs_wrap_OwnerSetDisable(struct tcsd_thread_data *data)
2964
TCS_CONTEXT_HANDLE hContext;
2965
TSS_BOOL disableState;
2969
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
2970
return TCSERR(TSS_E_INTERNAL_ERROR);
2972
LogDebug("thread %x context %x: %s", (UINT32)pthread_self(), hContext, __FUNCTION__);
2974
if (getData(TCSD_PACKET_TYPE_BOOL, 1, &disableState, 0, &data->comm))
2975
return TCSERR(TSS_E_INTERNAL_ERROR);
2977
if (getData(TCSD_PACKET_TYPE_AUTH, 2, &ownerAuth, 0, &data->comm))
2978
return TCSERR(TSS_E_INTERNAL_ERROR);
2980
pthread_mutex_lock(&tcsp_lock);
2982
result = TCSP_OwnerSetDisable_Internal(hContext, disableState, &ownerAuth);
2984
pthread_mutex_unlock(&tcsp_lock);
2986
if (result == TSS_SUCCESS) {
2987
initData(&data->comm, 1);
2988
if (setData(TCSD_PACKET_TYPE_AUTH, 0, &ownerAuth, 0, &data->comm))
2989
return TCSERR(TSS_E_INTERNAL_ERROR);
2991
initData(&data->comm, 0);
2993
data->comm.hdr.u.result = result;
2999
tcs_wrap_PhysicalDisable(struct tcsd_thread_data *data)
3001
TCS_CONTEXT_HANDLE hContext;
3004
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
3005
return TCSERR(TSS_E_INTERNAL_ERROR);
3007
LogDebug("thread %x context %x: %s", (UINT32)pthread_self(), hContext, __FUNCTION__);
3009
pthread_mutex_lock(&tcsp_lock);
3011
result = TCSP_PhysicalDisable_Internal(hContext);
3013
pthread_mutex_unlock(&tcsp_lock);
3015
initData(&data->comm, 0);
3017
data->comm.hdr.u.result = result;
3023
tcs_wrap_PhysicalPresence(struct tcsd_thread_data *data)
3025
TCS_CONTEXT_HANDLE hContext;
3027
TCPA_PHYSICAL_PRESENCE phyPresFlags;
3029
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
3030
return TCSERR(TSS_E_INTERNAL_ERROR);
3032
LogDebug("thread %x context %x: %s", (UINT32)pthread_self(), hContext, __FUNCTION__);
3034
if (getData(TCSD_PACKET_TYPE_UINT16, 1, &phyPresFlags, 0, &data->comm))
3035
return TCSERR(TSS_E_INTERNAL_ERROR);
3037
pthread_mutex_lock(&tcsp_lock);
3039
result = TCSP_PhysicalPresence_Internal(hContext, phyPresFlags);
3041
pthread_mutex_unlock(&tcsp_lock);
3043
initData(&data->comm, 0);
3045
data->comm.hdr.u.result = result;
3051
tcs_wrap_SetTempDeactivated(struct tcsd_thread_data *data)
3053
TCS_CONTEXT_HANDLE hContext;
3056
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
3057
return TCSERR(TSS_E_INTERNAL_ERROR);
3059
LogDebug("thread %x context %x: %s", (UINT32)pthread_self(), hContext, __FUNCTION__);
3061
pthread_mutex_lock(&tcsp_lock);
3063
result = TCSP_SetTempDeactivated_Internal(hContext);
3065
pthread_mutex_unlock(&tcsp_lock);
3067
initData(&data->comm, 0);
3069
data->comm.hdr.u.result = result;
3075
tcs_wrap_CertifyKey(struct tcsd_thread_data *data)
3077
TCS_CONTEXT_HANDLE hContext;
3078
TCS_KEY_HANDLE certHandle, keyHandle;
3079
TPM_AUTH *pCertAuth = NULL, *pKeyAuth = NULL, certAuth, keyAuth, nullAuth;
3080
UINT32 CertifyInfoSize, outDataSize;
3081
BYTE *CertifyInfo, *outData;
3082
TCPA_NONCE antiReplay;
3085
memset(&nullAuth, 0, sizeof(TPM_AUTH));
3086
memset(&certAuth, 0, sizeof(TPM_AUTH));
3087
memset(&keyAuth, 0, sizeof(TPM_AUTH));
3089
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
3090
return TCSERR(TSS_E_INTERNAL_ERROR);
3092
LogDebug("thread %x context %x: %s", (UINT32)pthread_self(), hContext, __FUNCTION__);
3094
if (getData(TCSD_PACKET_TYPE_UINT32, 1, &certHandle, 0, &data->comm))
3095
return TCSERR(TSS_E_INTERNAL_ERROR);
3096
if (getData(TCSD_PACKET_TYPE_UINT32, 2, &keyHandle, 0, &data->comm))
3097
return TCSERR(TSS_E_INTERNAL_ERROR);
3098
if (getData(TCSD_PACKET_TYPE_NONCE, 3, &antiReplay, 0, &data->comm))
3099
return TCSERR(TSS_E_INTERNAL_ERROR);
3101
if (getData(TCSD_PACKET_TYPE_AUTH, 4, &certAuth, 0, &data->comm))
3102
return TCSERR(TSS_E_INTERNAL_ERROR);
3103
if (getData(TCSD_PACKET_TYPE_AUTH, 5, &keyAuth, 0, &data->comm))
3104
return TCSERR(TSS_E_INTERNAL_ERROR);
3106
if (memcmp(&nullAuth, &certAuth, sizeof(TPM_AUTH)))
3107
pCertAuth = &certAuth;
3109
if (memcmp(&nullAuth, &keyAuth, sizeof(TPM_AUTH)))
3110
pKeyAuth = &keyAuth;
3112
pthread_mutex_lock(&tcsp_lock);
3114
result = TCSP_CertifyKey_Internal(hContext, certHandle, keyHandle,
3115
antiReplay, pCertAuth, pKeyAuth, &CertifyInfoSize,
3116
&CertifyInfo, &outDataSize, &outData);
3118
pthread_mutex_unlock(&tcsp_lock);
3120
if (result == TSS_SUCCESS) {
3122
initData(&data->comm, 6);
3124
if (setData(TCSD_PACKET_TYPE_AUTH, i++, pCertAuth, 0, &data->comm)) {
3127
return TCSERR(TSS_E_INTERNAL_ERROR);
3131
if (setData(TCSD_PACKET_TYPE_AUTH, i++, pKeyAuth, 0, &data->comm)) {
3134
return TCSERR(TSS_E_INTERNAL_ERROR);
3137
if (setData(TCSD_PACKET_TYPE_UINT32, i++, &CertifyInfoSize, 0, &data->comm)) {
3140
return TCSERR(TSS_E_INTERNAL_ERROR);
3142
if (setData(TCSD_PACKET_TYPE_PBYTE, i++, CertifyInfo, CertifyInfoSize, &data->comm)) {
3145
return TCSERR(TSS_E_INTERNAL_ERROR);
3148
if (setData(TCSD_PACKET_TYPE_UINT32, i++, &outDataSize, 0, &data->comm)) {
3150
return TCSERR(TSS_E_INTERNAL_ERROR);
3152
if (setData(TCSD_PACKET_TYPE_PBYTE, i++, outData, outDataSize, &data->comm)) {
3154
return TCSERR(TSS_E_INTERNAL_ERROR);
3158
initData(&data->comm, 0);
3160
data->comm.hdr.u.result = result;
3166
tcs_wrap_GetRegisteredKeyByPublicInfo(struct tcsd_thread_data *data)
3168
TCS_CONTEXT_HANDLE hContext;
3170
UINT32 algId, ulPublicInfoLength, keySize;
3171
BYTE *rgbPublicInfo, *keyBlob;
3173
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
3174
return TCSERR(TSS_E_INTERNAL_ERROR);
3176
LogDebug("thread %x context %x: %s", (UINT32)pthread_self(), hContext, __FUNCTION__);
3178
if (getData(TCSD_PACKET_TYPE_UINT32, 1, &algId, 0, &data->comm))
3179
return TCSERR(TSS_E_INTERNAL_ERROR);
3180
if (getData(TCSD_PACKET_TYPE_UINT32, 2, &ulPublicInfoLength, 0, &data->comm))
3181
return TCSERR(TSS_E_INTERNAL_ERROR);
3183
rgbPublicInfo = (BYTE *)calloc(1, ulPublicInfoLength);
3184
if (rgbPublicInfo == NULL) {
3185
LogError("malloc of %d bytes failed.", ulPublicInfoLength);
3186
return TCSERR(TSS_E_INTERNAL_ERROR);
3188
if (getData(TCSD_PACKET_TYPE_PBYTE, 3, rgbPublicInfo, ulPublicInfoLength, &data->comm)) {
3189
free(rgbPublicInfo);
3190
return TCSERR(TSS_E_INTERNAL_ERROR);
3193
pthread_mutex_lock(&tcsp_lock);
3195
result = TCSP_GetRegisteredKeyByPublicInfo_Internal(hContext, algId,
3196
ulPublicInfoLength, rgbPublicInfo, &keySize, &keyBlob);
3198
pthread_mutex_unlock(&tcsp_lock);
3200
free(rgbPublicInfo);
3201
if (result == TSS_SUCCESS) {
3202
initData(&data->comm, 2);
3203
if (setData(TCSD_PACKET_TYPE_UINT32, 0, &keySize, 0, &data->comm)) {
3205
return TCSERR(TSS_E_INTERNAL_ERROR);
3207
if (setData(TCSD_PACKET_TYPE_PBYTE, 1, keyBlob, keySize, &data->comm)) {
3209
return TCSERR(TSS_E_INTERNAL_ERROR);
3213
initData(&data->comm, 0);
3215
data->comm.hdr.u.result = result;
3221
tcs_wrap_ActivateIdentity(struct tcsd_thread_data *data)
3223
TCS_CONTEXT_HANDLE hContext;
3224
TCS_KEY_HANDLE idKeyHandle;
3225
TPM_AUTH *pIdKeyAuth = NULL, *pOwnerAuth = NULL, auth1, auth2;
3226
UINT32 SymmetricKeySize, blobSize;
3227
BYTE *SymmetricKey, *blob;
3230
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
3231
return TCSERR(TSS_E_INTERNAL_ERROR);
3233
LogDebug("thread %x context %x: %s", (UINT32)pthread_self(), hContext, __FUNCTION__);
3235
if (getData(TCSD_PACKET_TYPE_UINT32, 1, &idKeyHandle, 0, &data->comm))
3236
return TCSERR(TSS_E_INTERNAL_ERROR);
3237
if (getData(TCSD_PACKET_TYPE_UINT32, 2, &blobSize, 0, &data->comm))
3238
return TCSERR(TSS_E_INTERNAL_ERROR);
3240
if ((blob = malloc(blobSize)) == NULL)
3241
return TCSERR(TSS_E_OUTOFMEMORY);
3243
if (getData(TCSD_PACKET_TYPE_PBYTE, 3, blob, blobSize, &data->comm)) {
3245
return TCSERR(TSS_E_INTERNAL_ERROR);
3248
if (getData(TCSD_PACKET_TYPE_AUTH, 4, &auth1, 0, &data->comm)) {
3250
return TCSERR(TSS_E_INTERNAL_ERROR);
3253
if (getData(TCSD_PACKET_TYPE_AUTH, 5, &auth2, 0, &data->comm)) {
3254
LogDebugFn("No auth for identity key");
3255
pOwnerAuth = &auth1;
3257
pIdKeyAuth = &auth1;
3258
pOwnerAuth = &auth2;
3261
result = getData(TCSD_PACKET_TYPE_AUTH, 5, &auth2, 0, &data->comm);
3262
if (result == TSS_TCP_RPC_BAD_PACKET_TYPE)
3263
pOwnerAuth = &auth1;
3266
return TCSERR(TSS_E_INTERNAL_ERROR);
3268
pIdKeyAuth = &auth1;
3269
pOwnerAuth = &auth2;
3272
pthread_mutex_lock(&tcsp_lock);
3274
result = TCSP_ActivateTPMIdentity_Internal(hContext, idKeyHandle, blobSize,
3275
blob, pIdKeyAuth, pOwnerAuth,
3279
pthread_mutex_unlock(&tcsp_lock);
3283
if (result == TSS_SUCCESS) {
3285
initData(&data->comm, 4);
3287
if (setData(TCSD_PACKET_TYPE_AUTH, i++, pIdKeyAuth, 0, &data->comm)) {
3289
return TCSERR(TSS_E_INTERNAL_ERROR);
3292
if (setData(TCSD_PACKET_TYPE_AUTH, i++, pOwnerAuth, 0, &data->comm)) {
3294
return TCSERR(TSS_E_INTERNAL_ERROR);
3296
if (setData(TCSD_PACKET_TYPE_UINT32, i++, &SymmetricKeySize, 0, &data->comm)) {
3298
return TCSERR(TSS_E_INTERNAL_ERROR);
3300
if (setData(TCSD_PACKET_TYPE_PBYTE, i++, SymmetricKey, SymmetricKeySize, &data->comm)) {
3302
return TCSERR(TSS_E_INTERNAL_ERROR);
3306
initData(&data->comm, 0);
3308
data->comm.hdr.u.result = result;
3314
tcs_wrap_CreateMigrationBlob(struct tcsd_thread_data *data)
3316
TCS_CONTEXT_HANDLE hContext;
3318
TCS_KEY_HANDLE parentHandle;
3319
TSS_MIGRATE_SCHEME migrationType;
3320
UINT32 MigrationKeyAuthSize, encDataSize, randomSize, outDataSize;
3321
BYTE *MigrationKeyAuth, *encData, *random, *outData;
3322
TPM_AUTH auth1, auth2, *pParentAuth, *pEntityAuth;
3324
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
3325
return TCSERR(TSS_E_INTERNAL_ERROR);
3327
LogDebugFn("thread %x context %x", (UINT32)pthread_self(), hContext);
3329
if (getData(TCSD_PACKET_TYPE_UINT32, 1, &parentHandle, 0, &data->comm))
3330
return TCSERR(TSS_E_INTERNAL_ERROR);
3331
if (getData(TCSD_PACKET_TYPE_UINT16, 2, &migrationType, 0, &data->comm))
3332
return TCSERR(TSS_E_INTERNAL_ERROR);
3334
if (getData(TCSD_PACKET_TYPE_UINT32, 3, &MigrationKeyAuthSize, 0, &data->comm))
3335
return TCSERR(TSS_E_INTERNAL_ERROR);
3337
MigrationKeyAuth = (BYTE *)malloc(MigrationKeyAuthSize);
3338
if (MigrationKeyAuth == NULL) {
3339
LogError("malloc of %d bytes failed.", MigrationKeyAuthSize);
3340
return TCSERR(TSS_E_INTERNAL_ERROR);
3342
if (getData(TCSD_PACKET_TYPE_PBYTE, 4, MigrationKeyAuth, MigrationKeyAuthSize, &data->comm)) {
3343
free(MigrationKeyAuth);
3344
return TCSERR(TSS_E_INTERNAL_ERROR);
3347
if (getData(TCSD_PACKET_TYPE_UINT32, 5, &encDataSize, 0, &data->comm)) {
3348
free(MigrationKeyAuth);
3349
return TCSERR(TSS_E_INTERNAL_ERROR);
3352
encData = (BYTE *)malloc(encDataSize);
3353
if (encData == NULL) {
3354
free(MigrationKeyAuth);
3355
LogError("malloc of %d bytes failed.", encDataSize);
3356
return TCSERR(TSS_E_INTERNAL_ERROR);
3358
if (getData(TCSD_PACKET_TYPE_PBYTE, 6, encData, encDataSize, &data->comm)) {
3359
free(MigrationKeyAuth);
3361
return TCSERR(TSS_E_INTERNAL_ERROR);
3364
if (getData(TCSD_PACKET_TYPE_AUTH, 7, &auth1, 0, &data->comm)) {
3365
free(MigrationKeyAuth);
3367
return TCSERR(TSS_E_INTERNAL_ERROR);
3370
if (getData(TCSD_PACKET_TYPE_AUTH, 8, &auth2, 0, &data->comm)) {
3371
/* If loading the 2nd auth fails, the first one was entity auth */
3373
pEntityAuth = &auth1;
3375
/* If loading the 2nd auth succeeds, the first one was parent auth */
3376
pParentAuth = &auth1;
3377
pEntityAuth = &auth2;
3380
pthread_mutex_lock(&tcsp_lock);
3382
result = TCSP_CreateMigrationBlob_Internal(hContext, parentHandle, migrationType,
3383
MigrationKeyAuthSize, MigrationKeyAuth,
3384
encDataSize, encData, pParentAuth, pEntityAuth,
3385
&randomSize, &random, &outDataSize, &outData);
3387
pthread_mutex_unlock(&tcsp_lock);
3389
free(MigrationKeyAuth);
3391
if (result == TSS_SUCCESS) {
3393
initData(&data->comm, 6);
3395
if (setData(TCSD_PACKET_TYPE_AUTH, i++, pParentAuth, 0, &data->comm)) {
3398
return TCSERR(TSS_E_INTERNAL_ERROR);
3402
if (setData(TCSD_PACKET_TYPE_AUTH, i++, pEntityAuth, 0, &data->comm)) {
3405
return TCSERR(TSS_E_INTERNAL_ERROR);
3408
if (setData(TCSD_PACKET_TYPE_UINT32, i++, &randomSize, 0, &data->comm)) {
3411
return TCSERR(TSS_E_INTERNAL_ERROR);
3413
if (randomSize > 0) {
3414
if (setData(TCSD_PACKET_TYPE_PBYTE, i++, random, randomSize, &data->comm)) {
3417
return TCSERR(TSS_E_INTERNAL_ERROR);
3421
if (setData(TCSD_PACKET_TYPE_UINT32, i++, &outDataSize, 0, &data->comm)) {
3424
return TCSERR(TSS_E_INTERNAL_ERROR);
3426
if (setData(TCSD_PACKET_TYPE_PBYTE, i++, outData, outDataSize, &data->comm)) {
3429
return TCSERR(TSS_E_INTERNAL_ERROR);
3435
initData(&data->comm, 0);
3437
data->comm.hdr.u.result = result;
3443
tcs_wrap_ConvertMigrationBlob(struct tcsd_thread_data *data)
3445
TCS_CONTEXT_HANDLE hContext;
3447
TCS_KEY_HANDLE parentHandle;
3448
UINT32 outDataSize, randomSize, inDataSize;
3449
BYTE *outData, *random, *inData;
3450
TPM_AUTH parentAuth, *pParentAuth;
3452
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
3453
return TCSERR(TSS_E_INTERNAL_ERROR);
3455
LogDebugFn("thread %x context %x", (UINT32)pthread_self(), hContext);
3457
if (getData(TCSD_PACKET_TYPE_UINT32, 1, &parentHandle, 0, &data->comm))
3458
return TCSERR(TSS_E_INTERNAL_ERROR);
3460
if (getData(TCSD_PACKET_TYPE_UINT32, 2, &inDataSize, 0, &data->comm))
3461
return TCSERR(TSS_E_INTERNAL_ERROR);
3463
inData = (BYTE *)malloc(inDataSize);
3464
if (inData == NULL) {
3465
LogError("malloc of %d bytes failed.", inDataSize);
3466
return TCSERR(TSS_E_INTERNAL_ERROR);
3468
if (getData(TCSD_PACKET_TYPE_PBYTE, 3, inData, inDataSize, &data->comm)) {
3470
return TCSERR(TSS_E_INTERNAL_ERROR);
3473
if (getData(TCSD_PACKET_TYPE_UINT32, 4, &randomSize, 0, &data->comm)) {
3475
return TCSERR(TSS_E_INTERNAL_ERROR);
3478
random = (BYTE *)malloc(randomSize);
3479
if (random == NULL) {
3481
LogError("malloc of %d bytes failed.", randomSize);
3482
return TCSERR(TSS_E_INTERNAL_ERROR);
3484
if (getData(TCSD_PACKET_TYPE_PBYTE, 5, random, randomSize, &data->comm)) {
3487
return TCSERR(TSS_E_INTERNAL_ERROR);
3490
if (getData(TCSD_PACKET_TYPE_AUTH, 6, &parentAuth, 0, &data->comm))
3493
pParentAuth = &parentAuth;
3496
pthread_mutex_lock(&tcsp_lock);
3498
result = TCSP_ConvertMigrationBlob_Internal(hContext, parentHandle, inDataSize, inData,
3499
randomSize, random, pParentAuth, &outDataSize,
3502
pthread_mutex_unlock(&tcsp_lock);
3506
if (result == TSS_SUCCESS) {
3508
initData(&data->comm, 3);
3510
if (setData(TCSD_PACKET_TYPE_AUTH, i++, pParentAuth, 0, &data->comm)) {
3512
return TCSERR(TSS_E_INTERNAL_ERROR);
3516
if (setData(TCSD_PACKET_TYPE_UINT32, i++, &outDataSize, 0, &data->comm)) {
3518
return TCSERR(TSS_E_INTERNAL_ERROR);
3520
if (setData(TCSD_PACKET_TYPE_PBYTE, i++, outData, outDataSize, &data->comm)) {
3522
return TCSERR(TSS_E_INTERNAL_ERROR);
3527
initData(&data->comm, 0);
3529
data->comm.hdr.u.result = result;
3535
tcs_wrap_AuthorizeMigrationKey(struct tcsd_thread_data *data)
3537
TCS_CONTEXT_HANDLE hContext;
3539
TSS_MIGRATE_SCHEME migrateScheme;
3540
UINT32 MigrationKeySize, MigrationKeyAuthSize;
3541
BYTE *MigrationKey, *MigrationKeyAuth;
3544
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
3545
return TCSERR(TSS_E_INTERNAL_ERROR);
3547
LogDebugFn("thread %x context %x", (UINT32)pthread_self(), hContext);
3549
if (getData(TCSD_PACKET_TYPE_UINT16, 1, &migrateScheme, 0, &data->comm))
3550
return TCSERR(TSS_E_INTERNAL_ERROR);
3552
if (getData(TCSD_PACKET_TYPE_UINT32, 2, &MigrationKeySize, 0, &data->comm))
3553
return TCSERR(TSS_E_INTERNAL_ERROR);
3555
MigrationKey = (BYTE *)malloc(MigrationKeySize);
3556
if (MigrationKey == NULL) {
3557
LogError("malloc of %d bytes failed.", MigrationKeySize);
3558
return TCSERR(TSS_E_INTERNAL_ERROR);
3560
if (getData(TCSD_PACKET_TYPE_PBYTE, 3, MigrationKey, MigrationKeySize, &data->comm)) {
3562
return TCSERR(TSS_E_INTERNAL_ERROR);
3565
if (getData(TCSD_PACKET_TYPE_AUTH, 4, &ownerAuth, 0, &data->comm)) {
3567
return TCSERR(TSS_E_INTERNAL_ERROR);
3570
pthread_mutex_lock(&tcsp_lock);
3572
result = TCSP_AuthorizeMigrationKey_Internal(hContext, migrateScheme, MigrationKeySize,
3573
MigrationKey, &ownerAuth,
3574
&MigrationKeyAuthSize, &MigrationKeyAuth);
3576
pthread_mutex_unlock(&tcsp_lock);
3579
if (result == TSS_SUCCESS) {
3580
initData(&data->comm, 3);
3581
if (setData(TCSD_PACKET_TYPE_AUTH, 0, &ownerAuth, 0, &data->comm)) {
3582
free(MigrationKeyAuth);
3583
return TCSERR(TSS_E_INTERNAL_ERROR);
3586
if (setData(TCSD_PACKET_TYPE_UINT32, 1, &MigrationKeyAuthSize, 0, &data->comm)) {
3587
free(MigrationKeyAuth);
3588
return TCSERR(TSS_E_INTERNAL_ERROR);
3590
if (setData(TCSD_PACKET_TYPE_PBYTE, 2, MigrationKeyAuth, MigrationKeyAuthSize,
3592
free(MigrationKeyAuth);
3593
return TCSERR(TSS_E_INTERNAL_ERROR);
3596
free(MigrationKeyAuth);
3598
initData(&data->comm, 0);
3600
data->comm.hdr.u.result = result;
3606
tcs_wrap_KillMaintenanceFeature(struct tcsd_thread_data *data)
3608
TCS_CONTEXT_HANDLE hContext;
3612
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
3613
return TCSERR(TSS_E_INTERNAL_ERROR);
3615
LogDebugFn("thread %x context %x", (UINT32)pthread_self(), hContext);
3617
if (getData(TCSD_PACKET_TYPE_AUTH, 1, &ownerAuth, 0, &data->comm))
3618
return TCSERR(TSS_E_INTERNAL_ERROR);
3620
pthread_mutex_lock(&tcsp_lock);
3622
result = TCSP_KillMaintenanceFeature_Internal(hContext, &ownerAuth);
3624
pthread_mutex_unlock(&tcsp_lock);
3626
if (result == TSS_SUCCESS) {
3627
initData(&data->comm, 1);
3628
if (setData(TCSD_PACKET_TYPE_AUTH, 0, &ownerAuth, 0, &data->comm))
3629
return TCSERR(TSS_E_INTERNAL_ERROR);
3631
initData(&data->comm, 0);
3633
data->comm.hdr.u.result = result;
3639
tcs_wrap_CreateMaintenanceArchive(struct tcsd_thread_data *data)
3641
TCS_CONTEXT_HANDLE hContext;
3644
TSS_BOOL generateRandom;
3645
UINT32 randomSize, archiveSize;
3646
BYTE *random, *archive;
3648
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
3649
return TCSERR(TSS_E_INTERNAL_ERROR);
3651
LogDebugFn("thread %x context %x", (UINT32)pthread_self(), hContext);
3653
if (getData(TCSD_PACKET_TYPE_BOOL, 1, &generateRandom, 0, &data->comm))
3654
return TCSERR(TSS_E_INTERNAL_ERROR);
3656
if (getData(TCSD_PACKET_TYPE_AUTH, 2, &ownerAuth, 0, &data->comm))
3657
return TCSERR(TSS_E_INTERNAL_ERROR);
3659
pthread_mutex_lock(&tcsp_lock);
3661
result = TCSP_CreateMaintenanceArchive_Internal(hContext, generateRandom, &ownerAuth,
3662
&randomSize, &random, &archiveSize,
3665
pthread_mutex_unlock(&tcsp_lock);
3667
if (result == TSS_SUCCESS) {
3668
initData(&data->comm, 5);
3669
if (setData(TCSD_PACKET_TYPE_AUTH, 0, &ownerAuth, 0, &data->comm)) {
3672
return TCSERR(TSS_E_INTERNAL_ERROR);
3675
if (setData(TCSD_PACKET_TYPE_UINT32, 1, &randomSize, 0, &data->comm)) {
3678
return TCSERR(TSS_E_INTERNAL_ERROR);
3680
if (setData(TCSD_PACKET_TYPE_PBYTE, 2, random, randomSize, &data->comm)) {
3683
return TCSERR(TSS_E_INTERNAL_ERROR);
3686
if (setData(TCSD_PACKET_TYPE_UINT32, 3, &archiveSize, 0, &data->comm)) {
3689
return TCSERR(TSS_E_INTERNAL_ERROR);
3691
if (setData(TCSD_PACKET_TYPE_PBYTE, 4, archive, archiveSize, &data->comm)) {
3694
return TCSERR(TSS_E_INTERNAL_ERROR);
3700
initData(&data->comm, 0);
3702
data->comm.hdr.u.result = result;
3708
tcs_wrap_LoadMaintenanceArchive(struct tcsd_thread_data *data)
3710
TCS_CONTEXT_HANDLE hContext;
3713
UINT32 dataInSize, dataOutSize;
3714
BYTE *dataIn, *dataOut;
3716
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
3717
return TCSERR(TSS_E_INTERNAL_ERROR);
3719
LogDebugFn("thread %x context %x", (UINT32)pthread_self(), hContext);
3721
if (getData(TCSD_PACKET_TYPE_UINT32, 1, &dataInSize, 0, &data->comm))
3722
return TCSERR(TSS_E_INTERNAL_ERROR);
3724
dataIn = (BYTE *)malloc(dataInSize);
3725
if (dataIn == NULL) {
3726
LogError("malloc of %d bytes failed.", dataInSize);
3727
return TCSERR(TSS_E_INTERNAL_ERROR);
3729
if (getData(TCSD_PACKET_TYPE_PBYTE, 2, dataIn, dataInSize, &data->comm)) {
3731
return TCSERR(TSS_E_INTERNAL_ERROR);
3734
if (getData(TCSD_PACKET_TYPE_AUTH, 3, &ownerAuth, 0, &data->comm)) {
3736
return TCSERR(TSS_E_INTERNAL_ERROR);
3739
pthread_mutex_lock(&tcsp_lock);
3741
result = TCSP_LoadMaintenanceArchive_Internal(hContext, dataInSize, dataIn, &ownerAuth,
3742
&dataOutSize, &dataOut);
3744
pthread_mutex_unlock(&tcsp_lock);
3747
if (result == TSS_SUCCESS) {
3748
initData(&data->comm, 3);
3749
if (setData(TCSD_PACKET_TYPE_AUTH, 0, &ownerAuth, 0, &data->comm)) {
3751
return TCSERR(TSS_E_INTERNAL_ERROR);
3754
if (setData(TCSD_PACKET_TYPE_UINT32, 1, &dataOutSize, 0, &data->comm)) {
3756
return TCSERR(TSS_E_INTERNAL_ERROR);
3758
if (setData(TCSD_PACKET_TYPE_PBYTE, 2, dataOut, dataOutSize, &data->comm)) {
3760
return TCSERR(TSS_E_INTERNAL_ERROR);
3765
initData(&data->comm, 0);
3767
data->comm.hdr.u.result = result;
3773
tcs_wrap_LoadManuMaintPub(struct tcsd_thread_data *data)
3775
TCS_CONTEXT_HANDLE hContext;
3779
TCPA_NONCE antiReplay;
3780
TCPA_DIGEST checksum;
3782
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
3783
return TCSERR(TSS_E_INTERNAL_ERROR);
3785
LogDebugFn("thread %x context %x", (UINT32)pthread_self(), hContext);
3787
if (getData(TCSD_PACKET_TYPE_NONCE, 1, &antiReplay, 0, &data->comm))
3788
return TCSERR(TSS_E_INTERNAL_ERROR);
3790
if (getData(TCSD_PACKET_TYPE_UINT32, 2, &pubKeySize, 0, &data->comm))
3791
return TCSERR(TSS_E_INTERNAL_ERROR);
3793
pubKey = (BYTE *)malloc(pubKeySize);
3794
if (pubKey == NULL) {
3795
LogError("malloc of %d bytes failed.", pubKeySize);
3796
return TCSERR(TSS_E_INTERNAL_ERROR);
3799
if (getData(TCSD_PACKET_TYPE_PBYTE, 3, pubKey, pubKeySize, &data->comm)) {
3801
return TCSERR(TSS_E_INTERNAL_ERROR);
3804
pthread_mutex_lock(&tcsp_lock);
3806
result = TCSP_LoadManuMaintPub_Internal(hContext, antiReplay, pubKeySize, pubKey,
3809
pthread_mutex_unlock(&tcsp_lock);
3812
if (result == TSS_SUCCESS) {
3814
*hdr = calloc(1, size + sizeof(TCPA_DIGEST));
3816
LogError("malloc of %zu bytes failed.", size + sizeof(TCPA_DIGEST));
3817
return TCSERR(TSS_E_OUTOFMEMORY);
3820
if (setData(TCSD_PACKET_TYPE_DIGEST, 0, &checksum, 0, *hdr)) {
3822
return TCSERR(TSS_E_INTERNAL_ERROR);
3825
initData(&data->comm, 1);
3826
if (setData(TCSD_PACKET_TYPE_DIGEST, 0, &checksum, 0, &data->comm))
3827
return TCSERR(TSS_E_INTERNAL_ERROR);
3831
*hdr = calloc(1, size);
3833
LogError("malloc of %u bytes failed.", size);
3834
return TCSERR(TSS_E_OUTOFMEMORY);
3836
(*hdr)->packet_size = size;
3838
initData(&data->comm, 0);
3842
(*hdr)->result = result;
3844
data->comm.hdr.u.result = result;
3851
tcs_wrap_ReadManuMaintPub(struct tcsd_thread_data *data,
3852
struct tsp_packet *tsp_data,
3853
struct tcsd_packet_hdr **hdr)
3855
TCS_CONTEXT_HANDLE hContext;
3857
TCPA_NONCE antiReplay;
3858
TCPA_DIGEST checksum;
3859
UINT32 size = sizeof(struct tcsd_packet_hdr);
3861
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, tsp_data))
3862
return TCSERR(TSS_E_INTERNAL_ERROR);
3864
LogDebugFn("thread %x context %x", (UINT32)pthread_self(), hContext);
3866
if (getData(TCSD_PACKET_TYPE_NONCE, 1, &antiReplay, 0, tsp_data))
3867
return TCSERR(TSS_E_INTERNAL_ERROR);
3869
pthread_mutex_lock(&tcsp_lock);
3871
result = TCSP_ReadManuMaintPub_Internal(hContext, antiReplay, &checksum);
3873
pthread_mutex_unlock(&tcsp_lock);
3875
if (result == TSS_SUCCESS) {
3876
*hdr = calloc(1, size + sizeof(TCPA_DIGEST));
3878
LogError("malloc of %zu bytes failed.", size + sizeof(TCPA_DIGEST));
3879
return TCSERR(TSS_E_OUTOFMEMORY);
3882
if (setData(TCSD_PACKET_TYPE_DIGEST, 0, &checksum, 0, *hdr)) {
3884
return TCSERR(TSS_E_INTERNAL_ERROR);
3887
*hdr = calloc(1, size);
3889
LogError("malloc of %u bytes failed.", size);
3890
return TCSERR(TSS_E_OUTOFMEMORY);
3892
(*hdr)->packet_size = size;
3894
(*hdr)->result = result;
3900
tcs_wrap_ReadManuMaintPub(struct tcsd_thread_data *data)
3902
TCS_CONTEXT_HANDLE hContext;
3904
TCPA_NONCE antiReplay;
3905
TCPA_DIGEST checksum;
3907
if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
3908
return TCSERR(TSS_E_INTERNAL_ERROR);
3910
LogDebugFn("thread %x context %x", (UINT32)pthread_self(), hContext);
3912
if (getData(TCSD_PACKET_TYPE_NONCE, 1, &antiReplay, 0, &data->comm))
3913
return TCSERR(TSS_E_INTERNAL_ERROR);
3915
pthread_mutex_lock(&tcsp_lock);
3917
result = TCSP_ReadManuMaintPub_Internal(hContext, antiReplay, &checksum);
3919
pthread_mutex_unlock(&tcsp_lock);
3921
if (result == TSS_SUCCESS) {
3922
initData(&data->comm, 1);
3923
if (setData(TCSD_PACKET_TYPE_DIGEST, 0, &checksum, 0, &data->comm))
3924
return TCSERR(TSS_E_INTERNAL_ERROR);
3926
initData(&data->comm, 0);
3928
data->comm.hdr.u.result = result;
3935
typedef struct tdDispatchTable {
3936
TSS_RESULT (*Func) (struct tcsd_thread_data *);
3940
DispatchTable tcs_func_table[TCSD_MAX_NUM_ORDS] = {
3941
{tcs_wrap_Error,"Error"}, /* 0 */
3942
{tcs_wrap_OpenContext,"OpenContext"},
3943
{tcs_wrap_CloseContext,"CloseContext"},
3944
{tcs_wrap_Error,"Error"},
3945
{tcs_wrap_TCSGetCapability,"TCSGetCapability"},
3946
{tcs_wrap_RegisterKey,"RegisterKey"}, /* 5 */
3947
{tcs_wrap_UnregisterKey,"UnregisterKey"},
3948
{tcs_wrap_EnumRegisteredKeys,"EnumRegisteredKeys"},
3949
{tcs_wrap_Error,"Error"},
3950
{tcs_wrap_GetRegisteredKeyBlob,"GetRegisteredKeyBlob"},
3951
{tcs_wrap_GetRegisteredKeyByPublicInfo,"GetRegisteredKeyByPublicInfo"}, /* 10 */
3952
{tcs_wrap_LoadKeyByBlob,"LoadKeyByBlob"},
3953
{tcs_wrap_LoadKeyByUUID,"LoadKeyByUUID"},
3954
{tcs_wrap_EvictKey,"EvictKey"},
3955
{tcs_wrap_CreateWrapKey,"CreateWrapKey"},
3956
{tcs_wrap_GetPubkey,"GetPubkey"}, /* 15 */
3957
{tcs_wrap_MakeIdentity,"MakeIdentity"},
3958
{tcs_wrap_LogPcrEvent,"LogPcrEvent"},
3959
{tcs_wrap_GetPcrEvent,"GetPcrEvent"},
3960
{tcs_wrap_GetPcrEventsByPcr,"GetPcrEventsByPcr"},
3961
{tcs_wrap_GetPcrEventLog,"GetPcrEventLog"}, /* 20 */
3962
{tcs_wrap_SetOwnerInstall,"SetOwnerInstall"},
3963
{tcs_wrap_TakeOwnership,"TakeOwnership"},
3964
{tcs_wrap_OIAP,"OIAP"},
3965
{tcs_wrap_OSAP,"OSAP"},
3966
{tcs_wrap_ChangeAuth,"ChangeAuth"}, /* 25 */
3967
{tcs_wrap_ChangeAuthOwner,"ChangeAuthOwner"},
3968
{tcs_wrap_Error,"Error"},
3969
{tcs_wrap_Error,"Error"},
3970
{tcs_wrap_TerminateHandle,"TerminateHandle"},
3971
{tcs_wrap_ActivateIdentity,"ActivateIdentity"}, /* 30 */
3972
{tcs_wrap_Extend,"Extend"},
3973
{tcs_wrap_PcrRead,"PcrRead"},
3974
{tcs_wrap_Quote,"Quote"},
3975
{tcs_wrap_DirWriteAuth,"DirWriteAuth"},
3976
{tcs_wrap_DirRead,"DirRead"}, /* 35 */
3977
{tcs_wrap_Seal,"Seal"},
3978
{tcs_wrap_UnSeal,"UnSeal"},
3979
{tcs_wrap_UnBind,"UnBind"},
3980
{tcs_wrap_CreateMigrationBlob,"CreateMigrationBlob"},
3981
{tcs_wrap_ConvertMigrationBlob,"ConvertMigrationBlob"}, /* 40 */
3982
{tcs_wrap_AuthorizeMigrationKey,"AuthorizeMigrationKey"},
3983
{tcs_wrap_CertifyKey,"CertifyKey"},
3984
{tcs_wrap_Sign,"Sign"},
3985
{tcs_wrap_GetRandom,"GetRandom"},
3986
{tcs_wrap_StirRandom,"StirRandom"}, /* 45 */
3987
{tcs_wrap_GetCapability,"GetCapability"},
3988
{tcs_wrap_Error,"Error"},
3989
{tcs_wrap_GetCapabilityOwner,"GetCapabilityOwner"},
3990
{tcs_wrap_CreateEndorsementKeyPair,"CreateEndorsementKeyPair"},
3991
{tcs_wrap_ReadPubek,"ReadPubek"}, /* 50 */
3992
{tcs_wrap_DisablePubekRead,"DisablePubekRead"},
3993
{tcs_wrap_OwnerReadPubek,"OwnerReadPubek"},
3994
{tcs_wrap_SelfTestFull,"SelfTestFull"},
3995
{tcs_wrap_CertifySelfTest,"CertifySelfTest"},
3996
{tcs_wrap_Error,"Error"}, /* 55 */
3997
{tcs_wrap_GetTestResult,"GetTestResult"},
3998
{tcs_wrap_OwnerSetDisable,"OwnerSetDisable"},
3999
{tcs_wrap_OwnerClear,"OwnerClear"},
4000
{tcs_wrap_DisableOwnerClear,"DisableOwnerClear"},
4001
{tcs_wrap_ForceClear,"ForceClear"}, /* 60 */
4002
{tcs_wrap_DisableForceClear,"DisableForceClear"},
4003
{tcs_wrap_PhysicalDisable,"PhysicalDisable"},
4004
{tcs_wrap_PhysicalEnable,"PhysicalEnable"},
4005
{tcs_wrap_PhysicalSetDeactivated,"PhysicalSetDeactivated"},
4006
{tcs_wrap_SetTempDeactivated,"SetTempDeactivated"}, /* 65 */
4007
{tcs_wrap_PhysicalPresence,"PhysicalPresence"},
4008
{tcs_wrap_Error,"Error"},
4009
{tcs_wrap_Error,"Error"},
4010
{tcs_wrap_CreateMaintenanceArchive,"CreateMaintenanceArchive"},
4011
{tcs_wrap_LoadMaintenanceArchive,"LoadMaintenanceArchive"}, /* 70 */
4012
{tcs_wrap_KillMaintenanceFeature,"KillMaintenanceFeature"},
4013
{tcs_wrap_LoadManuMaintPub,"LoadManuMaintPub"},
4014
{tcs_wrap_ReadManuMaintPub,"ReadManuMaintPub"}
4018
access_control(struct tcsd_thread_data *thread_data)
4021
struct hostent *local_hostent = NULL;
4023
if ((local_hostent = gethostbyname("localhost")) == NULL) {
4024
LogError("Error resolving localhost: %s", hstrerror(h_errno));
4028
/* if the request comes from localhost, or is in the accepted ops list,
4030
if (!strncmp(thread_data->hostname, local_hostent->h_name,
4031
MIN((size_t)local_hostent->h_length, strlen(thread_data->hostname)))) {
4034
while (tcsd_options.remote_ops[i]) {
4035
if ((UINT32)tcsd_options.remote_ops[i] == thread_data->comm.hdr.u.ordinal) {
4036
LogInfo("Accepted %s operation from %s",
4037
tcs_func_table[thread_data->comm.hdr.u.ordinal].name,
4038
thread_data->hostname);
4049
dispatchCommand(struct tcsd_thread_data *data)
4054
/* First, check the ordinal bounds */
4055
if (data->comm.hdr.u.ordinal >= TCSD_MAX_NUM_ORDS) {
4056
LogError("Illegal TCSD Ordinal");
4057
return TCSERR(TSS_E_FAIL);
4060
LogDebug("Dispatching ordinal %u", data->comm.hdr.u.ordinal);
4061
if (access_control(data)) {
4062
LogWarn("Denied %s operation from %s",
4063
tcs_func_table[data->comm.hdr.u.ordinal].name, data->hostname);
4065
/* set platform header */
4066
memset(&data->comm.hdr, 0, sizeof(data->comm.hdr));
4067
data->comm.hdr.packet_size = sizeof(struct tcsd_packet_hdr);
4068
data->comm.hdr.u.result = TCSERR(TSS_E_FAIL);
4070
/* set the comm buffer */
4071
memset(data->comm.buf, 0, data->comm.buf_size);
4073
LoadBlob_UINT32(&offset, data->comm.hdr.packet_size, data->comm.buf, NULL);
4074
LoadBlob_UINT32(&offset, data->comm.hdr.u.result, data->comm.buf, NULL);
4080
if ((result = tcs_func_table[data->comm.hdr.u.ordinal].Func(data)) == TSS_SUCCESS) {
4081
/* set the comm buffer */
4083
LoadBlob_UINT32(&offset, data->comm.hdr.packet_size, data->comm.buf, NULL);
4084
LoadBlob_UINT32(&offset, data->comm.hdr.u.result, data->comm.buf, NULL);
4085
LoadBlob_UINT32(&offset, data->comm.hdr.num_parms, data->comm.buf, NULL);
4086
LoadBlob_UINT32(&offset, data->comm.hdr.type_size, data->comm.buf, NULL);
4087
LoadBlob_UINT32(&offset, data->comm.hdr.type_offset, data->comm.buf, NULL);
4088
LoadBlob_UINT32(&offset, data->comm.hdr.parm_size, data->comm.buf, NULL);
4089
LoadBlob_UINT32(&offset, data->comm.hdr.parm_offset, data->comm.buf, NULL);
4096
getTCSDPacket(struct tcsd_thread_data *data)
4098
/* make sure the all the data is present */
4099
if (data->comm.hdr.num_parms > 0 &&
4100
data->comm.hdr.packet_size !=
4101
(UINT32)(data->comm.hdr.parm_offset + data->comm.hdr.parm_size))
4102
return TSPERR(TSS_E_INTERNAL_ERROR);
4104
/* dispatch the command to the TCS */
4105
return dispatchCommand(data);