1210284Sjmallett 2232812Sjmallett/* 3215990Sjmallett * Licensed Materials - Property of IBM 4210284Sjmallett * 5210284Sjmallett * trousers - An open source TCG Software Stack 6215990Sjmallett * 7215990Sjmallett * (C) Copyright International Business Machines Corp. 2004-2006 8215990Sjmallett * 9210284Sjmallett */ 10215990Sjmallett 11215990Sjmallett#include <stdlib.h> 12210284Sjmallett#include <stdio.h> 13215990Sjmallett#include <syslog.h> 14215990Sjmallett#include <string.h> 15215990Sjmallett#include <netdb.h> 16215990Sjmallett 17210284Sjmallett#include "trousers/tss.h" 18232812Sjmallett#include "trousers_types.h" 19215990Sjmallett#include "tcs_tsp.h" 20215990Sjmallett#include "tcs_utils.h" 21215990Sjmallett#include "tcs_int_literals.h" 22210284Sjmallett#include "capabilities.h" 23215990Sjmallett#include "tcslog.h" 24215990Sjmallett#include "tcsd_wrap.h" 25215990Sjmallett#include "tcsd.h" 26215990Sjmallett#include "tcs_utils.h" 27210284Sjmallett#include "rpc_tcstp_tcs.h" 28215990Sjmallett 29232812Sjmallett 30215990SjmallettTSS_RESULT 31215990Sjmalletttcs_wrap_UnBind(struct tcsd_thread_data *data) 32215990Sjmallett{ 33215990Sjmallett TCS_CONTEXT_HANDLE hContext; 34215990Sjmallett TCS_KEY_HANDLE keyHandle; 35215990Sjmallett UINT32 inDataSize; 36215990Sjmallett BYTE *inData; 37215990Sjmallett 38215990Sjmallett TPM_AUTH privAuth; 39210284Sjmallett TPM_AUTH *pPrivAuth; 40210284Sjmallett 41210284Sjmallett UINT32 outDataSize; 42210284Sjmallett BYTE *outData; 43210284Sjmallett TSS_RESULT result; 44210284Sjmallett 45210284Sjmallett int i; 46210284Sjmallett 47210284Sjmallett if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm)) 48210284Sjmallett return TCSERR(TSS_E_INTERNAL_ERROR); 49210284Sjmallett 50210284Sjmallett if ((result = ctx_verify_context(hContext))) 51210284Sjmallett goto done; 52210284Sjmallett 53210284Sjmallett LogDebugFn("thread %ld context %x", THREAD_ID, hContext); 54210284Sjmallett 55232812Sjmallett if (getData(TCSD_PACKET_TYPE_UINT32, 1, &keyHandle, 0, &data->comm)) 56210284Sjmallett return TCSERR(TSS_E_INTERNAL_ERROR); 57210284Sjmallett if (getData(TCSD_PACKET_TYPE_UINT32, 2, &inDataSize, 0, &data->comm)) 58210284Sjmallett return TCSERR(TSS_E_INTERNAL_ERROR); 59210284Sjmallett 60210284Sjmallett inData = calloc(1, inDataSize); 61210284Sjmallett if (inData == NULL) { 62210284Sjmallett LogError("malloc of %u bytes failed.", inDataSize); 63210284Sjmallett return TCSERR(TSS_E_OUTOFMEMORY); 64210284Sjmallett } 65210284Sjmallett if (getData(TCSD_PACKET_TYPE_PBYTE, 3, inData, inDataSize, &data->comm)) { 66210284Sjmallett free(inData); 67210284Sjmallett return TCSERR(TSS_E_INTERNAL_ERROR); 68210284Sjmallett } 69210284Sjmallett 70210284Sjmallett result = getData(TCSD_PACKET_TYPE_AUTH, 4, &privAuth, 0, &data->comm); 71210284Sjmallett if (result == TSS_TCP_RPC_BAD_PACKET_TYPE) 72210284Sjmallett pPrivAuth = NULL; 73210284Sjmallett else if (result) { 74210284Sjmallett free(inData); 75210284Sjmallett return result; 76210284Sjmallett } else 77210284Sjmallett pPrivAuth = &privAuth; 78210284Sjmallett 79210284Sjmallett MUTEX_LOCK(tcsp_lock); 80210284Sjmallett 81210284Sjmallett result = TCSP_UnBind_Internal(hContext, keyHandle, inDataSize, inData, 82210284Sjmallett pPrivAuth, &outDataSize, &outData); 83210284Sjmallett 84210284Sjmallett MUTEX_UNLOCK(tcsp_lock); 85210284Sjmallett free(inData); 86210284Sjmallett 87210284Sjmallett if (result == TSS_SUCCESS) { 88210284Sjmallett i = 0; 89210284Sjmallett initData(&data->comm, 3); 90232812Sjmallett if (pPrivAuth != NULL) { 91210284Sjmallett if (setData(TCSD_PACKET_TYPE_AUTH, i++, pPrivAuth, 0, &data->comm)) { 92210284Sjmallett return TCSERR(TSS_E_INTERNAL_ERROR); 93210284Sjmallett } 94210284Sjmallett } 95210284Sjmallett if (setData(TCSD_PACKET_TYPE_UINT32, i++, &outDataSize, 0, &data->comm)) { 96215990Sjmallett return TCSERR(TSS_E_INTERNAL_ERROR); 97210284Sjmallett } 98210284Sjmallett if (setData(TCSD_PACKET_TYPE_PBYTE, i++, outData, outDataSize, &data->comm)) { 99215990Sjmallett return TCSERR(TSS_E_INTERNAL_ERROR); 100210284Sjmallett } 101210284Sjmallett free(outData); 102210284Sjmallett } else 103210284Sjmallettdone: initData(&data->comm, 0); 104210284Sjmallett 105210284Sjmallett data->comm.hdr.u.result = result; 106210284Sjmallett 107210284Sjmallett return TSS_SUCCESS; 108210284Sjmallett} 109210284Sjmallett