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