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 30 TSS_RESULT 31 tcs_wrap_Quote2(struct tcsd_thread_data *data) 32 { 33 /* Data to be forwarded to the next level */ 34 TCS_CONTEXT_HANDLE hContext; 35 TCS_KEY_HANDLE hKey; 36 TCPA_NONCE antiReplay; 37 UINT32 pcrDataSizeIn; 38 BYTE *pcrDataIn; 39 TSS_BOOL addVersion; 40 TPM_AUTH privAuth; /* in/out */ 41 TPM_AUTH *pPrivAuth; 42 43 UINT32 pcrDataSizeOut; 44 BYTE *pcrDataOut; 45 46 UINT32 versionInfoSize; 47 BYTE * versionInfo; 48 49 UINT32 sigSize; 50 BYTE *sig; 51 TSS_RESULT result; 52 53 int i; 54 55 if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm)) 56 return TCSERR(TSS_E_INTERNAL_ERROR); 57 58 if ((result = ctx_verify_context(hContext))) 59 goto done; 60 61 LogDebugFn("thread %ld context %x", THREAD_ID, hContext); 62 63 if (getData(TCSD_PACKET_TYPE_UINT32, 1, &hKey, 0, &data->comm)) 64 return TCSERR(TSS_E_INTERNAL_ERROR); 65 if (getData(TCSD_PACKET_TYPE_NONCE, 2, &antiReplay, 0, &data->comm)) 66 return TCSERR(TSS_E_INTERNAL_ERROR); 67 if (getData(TCSD_PACKET_TYPE_UINT32, 3, &pcrDataSizeIn, 0, &data->comm)) 68 return TCSERR(TSS_E_INTERNAL_ERROR); 69 pcrDataIn = (BYTE *)calloc(1, pcrDataSizeIn); 70 if (pcrDataIn == NULL) { 71 LogError("malloc of %u bytes failed.", pcrDataSizeIn); 72 return TCSERR(TSS_E_OUTOFMEMORY); 73 } 74 if (getData(TCSD_PACKET_TYPE_PBYTE, 4, pcrDataIn, pcrDataSizeIn, &data->comm)) { 75 free(pcrDataIn); 76 return TCSERR(TSS_E_INTERNAL_ERROR); 77 } 78 if (getData(TCSD_PACKET_TYPE_BOOL,5,&addVersion, 0, &data->comm)) { 79 free(pcrDataIn); 80 return TCSERR(TSS_E_INTERNAL_ERROR); 81 } 82 result = getData(TCSD_PACKET_TYPE_AUTH, 6, &privAuth, 0, &data->comm); 83 if (result == TSS_TCP_RPC_BAD_PACKET_TYPE) 84 pPrivAuth = NULL; 85 else if (result) { 86 free(pcrDataIn); 87 return result; 88 } else 89 pPrivAuth = &privAuth; 90 91 MUTEX_LOCK(tcsp_lock); 92 93 result = TCSP_Quote2_Internal(hContext, hKey, antiReplay, pcrDataSizeIn, pcrDataIn, 94 addVersion,pPrivAuth, &pcrDataSizeOut, &pcrDataOut, &versionInfoSize, 95 &versionInfo,&sigSize, &sig); 96 97 MUTEX_UNLOCK(tcsp_lock); 98 free(pcrDataIn); 99 100 if (result == TSS_SUCCESS) { 101 i = 0; 102 103 initData(&data->comm,7); /* Add versionInfoSize and versionInfo */ 104 if (pPrivAuth != NULL) { 105 if (setData(TCSD_PACKET_TYPE_AUTH, i++, pPrivAuth, 0, &data->comm)) { 106 free(pcrDataOut); 107 /* It's a null pointer when addVersion == FALSE */ 108 if (addVersion) 109 free(versionInfo); 110 free(sig); 111 return TCSERR(TSS_E_INTERNAL_ERROR); 112 } 113 } 114 if (setData(TCSD_PACKET_TYPE_UINT32, i++, &pcrDataSizeOut, 0, &data->comm)) { 115 free(pcrDataOut); 116 if (addVersion) 117 free(versionInfo); 118 free(sig); 119 return TCSERR(TSS_E_INTERNAL_ERROR); 120 } 121 if (setData(TCSD_PACKET_TYPE_PBYTE, i++, pcrDataOut, pcrDataSizeOut, &data->comm)) { 122 free(pcrDataOut); 123 if (addVersion) 124 free(versionInfo); 125 free(sig); 126 return TCSERR(TSS_E_INTERNAL_ERROR); 127 } 128 if (setData(TCSD_PACKET_TYPE_UINT32, i++, &versionInfoSize, 0, &data->comm)) { 129 free(pcrDataOut); 130 free(versionInfo); 131 free(sig); 132 return TCSERR(TSS_E_INTERNAL_ERROR); 133 } 134 if (versionInfoSize > 0){ 135 if (setData(TCSD_PACKET_TYPE_PBYTE, i++, versionInfo, versionInfoSize, &data->comm)) { 136 free(pcrDataOut); 137 free(versionInfo); 138 free(sig); 139 return TCSERR(TSS_E_INTERNAL_ERROR); 140 } 141 } 142 if (setData(TCSD_PACKET_TYPE_UINT32, i++, &sigSize, 0, &data->comm)) { 143 free(pcrDataOut); 144 if (addVersion) 145 free(versionInfo); 146 free(sig); 147 return TCSERR(TSS_E_INTERNAL_ERROR); 148 } 149 if (setData(TCSD_PACKET_TYPE_PBYTE, i++, sig, sigSize, &data->comm)) { 150 free(pcrDataOut); 151 if (addVersion) 152 free(versionInfo); 153 free(sig); 154 return TCSERR(TSS_E_INTERNAL_ERROR); 155 } 156 157 free(pcrDataOut); 158 if (versionInfoSize >0) 159 free(versionInfo); 160 free(sig); 161 } else 162 done: initData(&data->comm, 0); 163 164 data->comm.hdr.u.result = result; 165 return TSS_SUCCESS; 166 } 167