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-2006 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_ChangeAuth(struct tcsd_thread_data *data) 32 { 33 TCS_CONTEXT_HANDLE hContext; 34 TCS_KEY_HANDLE parentHandle; 35 TCPA_PROTOCOL_ID protocolID; 36 TCPA_ENCAUTH newAuth; 37 TCPA_ENTITY_TYPE entityType; 38 UINT32 encDataSize; 39 BYTE *encData; 40 41 TPM_AUTH ownerAuth; 42 TPM_AUTH entityAuth; 43 44 UINT32 outDataSize; 45 BYTE *outData; 46 TSS_RESULT result; 47 48 if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm)) 49 return TCSERR(TSS_E_INTERNAL_ERROR); 50 51 if ((result = ctx_verify_context(hContext))) 52 goto done; 53 54 LogDebugFn("thread %ld context %x", THREAD_ID, hContext); 55 56 if (getData(TCSD_PACKET_TYPE_UINT32, 1, &parentHandle, 0, &data->comm)) 57 return TCSERR(TSS_E_INTERNAL_ERROR); 58 if (getData(TCSD_PACKET_TYPE_UINT16, 2, &protocolID, 0, &data->comm)) 59 return TCSERR(TSS_E_INTERNAL_ERROR); 60 if (getData(TCSD_PACKET_TYPE_ENCAUTH, 3, &newAuth, 0, &data->comm)) 61 return TCSERR(TSS_E_INTERNAL_ERROR); 62 if (getData(TCSD_PACKET_TYPE_UINT16, 4, &entityType, 0, &data->comm)) 63 return TCSERR(TSS_E_INTERNAL_ERROR); 64 if (getData(TCSD_PACKET_TYPE_UINT32, 5, &encDataSize, 0, &data->comm)) 65 return TCSERR(TSS_E_INTERNAL_ERROR); 66 encData = calloc(1, encDataSize); 67 if (encData == NULL) { 68 LogError("malloc of %d bytes failed.", encDataSize); 69 return TCSERR(TSS_E_OUTOFMEMORY); 70 } 71 if (getData(TCSD_PACKET_TYPE_PBYTE, 6, encData, encDataSize, &data->comm)) { 72 free(encData); 73 return TCSERR(TSS_E_INTERNAL_ERROR); 74 } 75 if (getData(TCSD_PACKET_TYPE_AUTH, 7, &ownerAuth, 0, &data->comm)) { 76 free(encData); 77 return TCSERR(TSS_E_INTERNAL_ERROR); 78 } 79 if (getData(TCSD_PACKET_TYPE_AUTH, 8, &entityAuth, 0, &data->comm)) { 80 free(encData); 81 return TCSERR(TSS_E_INTERNAL_ERROR); 82 } 83 84 MUTEX_LOCK(tcsp_lock); 85 86 result = TCSP_ChangeAuth_Internal(hContext, parentHandle, protocolID, newAuth, entityType, 87 encDataSize, encData, &ownerAuth, &entityAuth, 88 &outDataSize, &outData); 89 90 MUTEX_UNLOCK(tcsp_lock); 91 free(encData); 92 if (result == TSS_SUCCESS) { 93 initData(&data->comm, 4); 94 if (setData(TCSD_PACKET_TYPE_AUTH, 0, &ownerAuth, 0, &data->comm)) { 95 free(outData); 96 return TCSERR(TSS_E_INTERNAL_ERROR); 97 } 98 if (setData(TCSD_PACKET_TYPE_AUTH, 1, &entityAuth, 0, &data->comm)) { 99 free(outData); 100 return TCSERR(TSS_E_INTERNAL_ERROR); 101 } 102 if (setData(TCSD_PACKET_TYPE_UINT32, 2, &outDataSize, 0, &data->comm)) { 103 free(outData); 104 return TCSERR(TSS_E_INTERNAL_ERROR); 105 } 106 if (setData(TCSD_PACKET_TYPE_PBYTE, 3, outData, outDataSize, &data->comm)) { 107 free(outData); 108 return TCSERR(TSS_E_INTERNAL_ERROR); 109 } 110 free(outData); 111 } else 112 done: initData(&data->comm, 0); 113 114 data->comm.hdr.u.result = result; 115 return TSS_SUCCESS; 116 } 117 118 TSS_RESULT 119 tcs_wrap_ChangeAuthOwner(struct tcsd_thread_data *data) 120 { 121 122 TCS_CONTEXT_HANDLE hContext; 123 TCPA_PROTOCOL_ID protocolID; 124 TCPA_ENCAUTH newAuth; 125 TCPA_ENTITY_TYPE entityType; 126 127 TPM_AUTH ownerAuth; 128 TSS_RESULT result; 129 130 if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm)) 131 return TCSERR(TSS_E_INTERNAL_ERROR); 132 133 if ((result = ctx_verify_context(hContext))) 134 goto done; 135 136 LogDebugFn("thread %ld context %x", THREAD_ID, hContext); 137 138 if (getData(TCSD_PACKET_TYPE_UINT16, 1, &protocolID, 0, &data->comm)) 139 return TCSERR(TSS_E_INTERNAL_ERROR); 140 if (getData(TCSD_PACKET_TYPE_ENCAUTH, 2, &newAuth, 0, &data->comm)) 141 return TCSERR(TSS_E_INTERNAL_ERROR); 142 if (getData(TCSD_PACKET_TYPE_UINT16, 3, &entityType, 0, &data->comm)) 143 return TCSERR(TSS_E_INTERNAL_ERROR); 144 if (getData(TCSD_PACKET_TYPE_AUTH, 4, &ownerAuth, 0, &data->comm)) 145 return TCSERR(TSS_E_INTERNAL_ERROR); 146 147 MUTEX_LOCK(tcsp_lock); 148 149 result = TCSP_ChangeAuthOwner_Internal(hContext, protocolID, newAuth, entityType, 150 &ownerAuth); 151 152 MUTEX_UNLOCK(tcsp_lock); 153 154 if (result == TSS_SUCCESS) { 155 initData(&data->comm, 1); 156 if (setData(TCSD_PACKET_TYPE_AUTH, 0, &ownerAuth, 0, &data->comm)) { 157 return TCSERR(TSS_E_INTERNAL_ERROR); 158 } 159 } else 160 done: initData(&data->comm, 0); 161 162 data->comm.hdr.u.result = result; 163 return TSS_SUCCESS; 164 } 165