1 2/* 3 * Licensed Materials - Property of IBM 4 * 5 * trousers - An open source TCG Software Stack 6 * 7 * (C) Copyright International Business Machines Corp. 2004-2007 8 * 9 */ 10 11#include <stdlib.h> 12#include <stdio.h> 13#include <syslog.h> 14#include <string.h> 15#include <netdb.h> 16 17#include "trousers/tss.h" 18#include "trousers_types.h" 19#include "tcs_tsp.h" 20#include "tcs_utils.h" 21#include "tcs_int_literals.h" 22#include "capabilities.h" 23#include "tcslog.h" 24#include "tcsd_wrap.h" 25#include "tcsd.h" 26#include "tcs_utils.h" 27#include "rpc_tcstp_tcs.h" 28 29 30TSS_RESULT 31tcs_wrap_ReadCurrentTicks(struct tcsd_thread_data *data) 32{ 33 TCS_CONTEXT_HANDLE hContext; 34 UINT32 pulCurrentTime; 35 BYTE *prgbCurrentTime; 36 TSS_RESULT result; 37 38 if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm)) 39 return TCSERR(TSS_E_INTERNAL_ERROR); 40 41 LogDebugFn("thread %ld context %x", THREAD_ID, hContext); 42 43 MUTEX_LOCK(tcsp_lock); 44 45 result = TCSP_ReadCurrentTicks_Internal(hContext, &pulCurrentTime, &prgbCurrentTime); 46 47 MUTEX_UNLOCK(tcsp_lock); 48 49 if (result == TSS_SUCCESS) { 50 initData(&data->comm, 2); 51 if (setData(TCSD_PACKET_TYPE_UINT32, 0, &pulCurrentTime, 0, &data->comm)) { 52 free(prgbCurrentTime); 53 return TCSERR(TSS_E_INTERNAL_ERROR); 54 } 55 if (setData(TCSD_PACKET_TYPE_PBYTE, 1, prgbCurrentTime, pulCurrentTime, 56 &data->comm)) { 57 free(prgbCurrentTime); 58 return TCSERR(TSS_E_INTERNAL_ERROR); 59 } 60 free(prgbCurrentTime); 61 } else 62 initData(&data->comm, 0); 63 64 data->comm.hdr.u.result = result; 65 return TSS_SUCCESS; 66} 67 68TSS_RESULT 69tcs_wrap_TickStampBlob(struct tcsd_thread_data *data) 70{ 71 TCS_CONTEXT_HANDLE hContext; 72 TCS_KEY_HANDLE hKey; 73 TPM_AUTH auth, *pAuth; 74 TPM_NONCE nonce; 75 TPM_DIGEST digest; 76 UINT32 sigSize, tcSize, i; 77 BYTE *sig, *tc; 78 TSS_RESULT result; 79 80 if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm)) 81 return TCSERR(TSS_E_INTERNAL_ERROR); 82 83 if ((result = ctx_verify_context(hContext))) 84 goto done; 85 86 LogDebugFn("thread %ld context %x", THREAD_ID, hContext); 87 88 if (getData(TCSD_PACKET_TYPE_UINT32, 1, &hKey, 0, &data->comm)) 89 return TCSERR(TSS_E_INTERNAL_ERROR); 90 if (getData(TCSD_PACKET_TYPE_NONCE, 2, &nonce, 0, &data->comm)) 91 return TCSERR(TSS_E_INTERNAL_ERROR); 92 if (getData(TCSD_PACKET_TYPE_DIGEST, 3, &digest, 0, &data->comm)) 93 return TCSERR(TSS_E_INTERNAL_ERROR); 94 if (getData(TCSD_PACKET_TYPE_AUTH, 4, &auth, 0, &data->comm)) 95 pAuth = NULL; 96 else 97 pAuth = &auth; 98 99 MUTEX_LOCK(tcsp_lock); 100 101 result = TCSP_TickStampBlob_Internal(hContext, hKey, &nonce, &digest, pAuth, &sigSize, &sig, 102 &tcSize, &tc); 103 104 MUTEX_UNLOCK(tcsp_lock); 105 106 if (result == TSS_SUCCESS) { 107 initData(&data->comm, 5); 108 i = 0; 109 if (pAuth) { 110 if (setData(TCSD_PACKET_TYPE_AUTH, i++, pAuth, 0, &data->comm)) { 111 free(sig); 112 free(tc); 113 return TCSERR(TSS_E_INTERNAL_ERROR); 114 } 115 } 116 if (setData(TCSD_PACKET_TYPE_UINT32, i++, &sigSize, 0, &data->comm)) { 117 free(sig); 118 free(tc); 119 return TCSERR(TSS_E_INTERNAL_ERROR); 120 } 121 if (setData(TCSD_PACKET_TYPE_PBYTE, i++, sig, sigSize, &data->comm)) { 122 free(sig); 123 free(tc); 124 return TCSERR(TSS_E_INTERNAL_ERROR); 125 } 126 if (setData(TCSD_PACKET_TYPE_UINT32, i++, &tcSize, 0, &data->comm)) { 127 free(sig); 128 free(tc); 129 return TCSERR(TSS_E_INTERNAL_ERROR); 130 } 131 if (setData(TCSD_PACKET_TYPE_PBYTE, i++, tc, tcSize, &data->comm)) { 132 free(sig); 133 free(tc); 134 return TCSERR(TSS_E_INTERNAL_ERROR); 135 } 136 } else 137done: initData(&data->comm, 0); 138 139 data->comm.hdr.u.result = result; 140 return TSS_SUCCESS; 141} 142