1723e4046Schristos 
2723e4046Schristos /*
3723e4046Schristos  * Licensed Materials - Property of IBM
4723e4046Schristos  *
5723e4046Schristos  * trousers - An open source TCG Software Stack
6723e4046Schristos  *
7723e4046Schristos  * (C) Copyright International Business Machines Corp. 2004-2006
8723e4046Schristos  *
9723e4046Schristos  */
10723e4046Schristos 
11723e4046Schristos #include <stdlib.h>
12723e4046Schristos #include <stdio.h>
13723e4046Schristos #include <syslog.h>
14723e4046Schristos #include <string.h>
15723e4046Schristos #include <netdb.h>
16723e4046Schristos 
17723e4046Schristos #include "trousers/tss.h"
18723e4046Schristos #include "trousers_types.h"
19723e4046Schristos #include "tcs_tsp.h"
20723e4046Schristos #include "tcs_utils.h"
21723e4046Schristos #include "tcs_int_literals.h"
22723e4046Schristos #include "capabilities.h"
23723e4046Schristos #include "tcslog.h"
24723e4046Schristos #include "tcsd_wrap.h"
25723e4046Schristos #include "tcsd.h"
26723e4046Schristos #include "tcs_utils.h"
27723e4046Schristos #include "rpc_tcstp_tcs.h"
28723e4046Schristos 
29723e4046Schristos 
30723e4046Schristos TSS_RESULT
tcs_wrap_DaaJoin(struct tcsd_thread_data * data)31723e4046Schristos tcs_wrap_DaaJoin(struct tcsd_thread_data *data)
32723e4046Schristos {
33723e4046Schristos 	TCS_CONTEXT_HANDLE hContext;
34723e4046Schristos 	TPM_HANDLE hDAA;
35723e4046Schristos 	BYTE stage;
36723e4046Schristos 	UINT32 inputSize0, inputSize1, outputSize, i;
37723e4046Schristos 	BYTE *inputData0 = NULL, *inputData1 = NULL,*outputData;
38723e4046Schristos 	TSS_RESULT result;
39723e4046Schristos 	TPM_AUTH ownerAuth, *pOwnerAuth;
40723e4046Schristos 
41723e4046Schristos 	if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
42723e4046Schristos 		return TCSERR(TSS_E_INTERNAL_ERROR);
43723e4046Schristos 
44*0861b331Schristos 	if ((result = ctx_verify_context(hContext)))
45*0861b331Schristos 		goto done;
46*0861b331Schristos 
47723e4046Schristos 	if (getData(TCSD_PACKET_TYPE_UINT32, 1, &hDAA, 0, &data->comm))
48723e4046Schristos 		return TCSERR(TSS_E_INTERNAL_ERROR);
49723e4046Schristos 	LogDebugFn("thread %ld hDAA %x", THREAD_ID, hDAA);
50723e4046Schristos 
51723e4046Schristos 	if (getData(TCSD_PACKET_TYPE_BYTE, 2, &stage, 0, &data->comm))
52723e4046Schristos 		return TCSERR(TSS_E_INTERNAL_ERROR);
53723e4046Schristos 	LogDebug("getData 2 (stage=%d)", (int)stage);
54723e4046Schristos 
55723e4046Schristos 	if (getData(TCSD_PACKET_TYPE_UINT32, 3, &inputSize0, 0, &data->comm))
56723e4046Schristos 		return TCSERR(TSS_E_INTERNAL_ERROR);
57723e4046Schristos 	LogDebug("getData 3  inputSize0=%d", inputSize0);
58723e4046Schristos 
59723e4046Schristos 	inputData0 = calloc(1, inputSize0);
60723e4046Schristos 	if (inputData0 == NULL) {
61723e4046Schristos 		LogError("malloc of %d bytes failed.", inputSize0);
62723e4046Schristos 		return TCSERR(TSS_E_OUTOFMEMORY);
63723e4046Schristos 	}
64723e4046Schristos 
65723e4046Schristos 	LogDebug("getData 4 inputData0");
66723e4046Schristos 	if (getData(TCSD_PACKET_TYPE_PBYTE, 4, inputData0, inputSize0, &data->comm)) {
67723e4046Schristos 		free(inputData0);
68723e4046Schristos 		return TCSERR(TSS_E_INTERNAL_ERROR);
69723e4046Schristos 	}
70723e4046Schristos 
71723e4046Schristos 	LogDebug("getData 5");
72723e4046Schristos 	if (getData(TCSD_PACKET_TYPE_UINT32, 5, &inputSize1, 0, &data->comm)) {
73723e4046Schristos 		free( inputData0);
74723e4046Schristos 		return TCSERR(TSS_E_INTERNAL_ERROR);
75723e4046Schristos 	}
76723e4046Schristos 	LogDebug("getData 5  inputSize1=%d", inputSize1);
77723e4046Schristos 
78723e4046Schristos 	if( inputSize1 > 0) {
79723e4046Schristos 		inputData1 = calloc(1, inputSize1);
80723e4046Schristos 		if (inputData1 == NULL) {
81723e4046Schristos 			LogError("malloc of %d bytes failed.", inputSize1);
82723e4046Schristos 			free( inputData0);
83723e4046Schristos 			return TCSERR(TSS_E_OUTOFMEMORY);
84723e4046Schristos 		}
85723e4046Schristos 
86723e4046Schristos 		LogDebug("getData 6 inputData1");
87723e4046Schristos 		if (getData(TCSD_PACKET_TYPE_PBYTE, 6, inputData1, inputSize1, &data->comm)) {
88723e4046Schristos 			free(inputData0);
89723e4046Schristos 			free(inputData1);
90723e4046Schristos 			return TCSERR(TSS_E_INTERNAL_ERROR);
91723e4046Schristos 		}
92723e4046Schristos 	}
93723e4046Schristos 
94723e4046Schristos 	LogDebug("getData 7");
95723e4046Schristos 	if (getData(TCSD_PACKET_TYPE_AUTH, 7, &ownerAuth, 0, &data->comm)) {
96723e4046Schristos 		pOwnerAuth = NULL;
97723e4046Schristos 	} else {
98723e4046Schristos 		pOwnerAuth = &ownerAuth;
99723e4046Schristos 	}
100723e4046Schristos 
101723e4046Schristos 	MUTEX_LOCK(tcsp_lock);
102723e4046Schristos 
103723e4046Schristos 	result = TCSP_DaaJoin_internal(hContext, hDAA, stage, inputSize0, inputData0, inputSize1,
104723e4046Schristos 				       inputData1, pOwnerAuth, &outputSize, &outputData);
105723e4046Schristos 
106723e4046Schristos 	MUTEX_UNLOCK(tcsp_lock);
107723e4046Schristos 
108723e4046Schristos 	free(inputData0);
109723e4046Schristos 	if( inputData1 != NULL) free(inputData1);
110723e4046Schristos 
111723e4046Schristos 	if (result == TSS_SUCCESS) {
112723e4046Schristos 		i = 0;
113723e4046Schristos 		initData(&data->comm, 3);
114723e4046Schristos 		if ( pOwnerAuth) {
115723e4046Schristos 			if (setData(TCSD_PACKET_TYPE_AUTH, i++, pOwnerAuth, 0, &data->comm)) {
116723e4046Schristos 				free(outputData);
117723e4046Schristos 				return TCSERR(TSS_E_INTERNAL_ERROR);
118723e4046Schristos 			}
119723e4046Schristos 		}
120723e4046Schristos 		if (setData(TCSD_PACKET_TYPE_UINT32, i++, &outputSize, 0, &data->comm)) {
121723e4046Schristos 			free(outputData);
122723e4046Schristos 			return TCSERR(TSS_E_INTERNAL_ERROR);
123723e4046Schristos 		}
124723e4046Schristos 		if (setData(TCSD_PACKET_TYPE_PBYTE, i++, outputData, outputSize, &data->comm)) {
125723e4046Schristos 			free(outputData);
126723e4046Schristos 			return TCSERR(TSS_E_INTERNAL_ERROR);
127723e4046Schristos 		}
128723e4046Schristos 		free(outputData);
129723e4046Schristos 	} else
130*0861b331Schristos done:		initData(&data->comm, 0);
131723e4046Schristos 
132723e4046Schristos 	data->comm.hdr.u.result = result;
133723e4046Schristos 	return TSS_SUCCESS;
134723e4046Schristos }
135723e4046Schristos 
136723e4046Schristos TSS_RESULT
tcs_wrap_DaaSign(struct tcsd_thread_data * data)137723e4046Schristos tcs_wrap_DaaSign(struct tcsd_thread_data *data)
138723e4046Schristos {
139723e4046Schristos 	TCS_CONTEXT_HANDLE hContext;
140723e4046Schristos 	TPM_HANDLE hDAA;
141723e4046Schristos 	BYTE stage;
142723e4046Schristos 	UINT32 inputSize0, inputSize1, outputSize, i;
143723e4046Schristos 	BYTE *inputData0 = NULL, *inputData1 = NULL,*outputData;
144723e4046Schristos 	TSS_RESULT result;
145723e4046Schristos 	TPM_AUTH ownerAuth, *pOwnerAuth;
146723e4046Schristos 
147723e4046Schristos 	if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
148723e4046Schristos 		return TCSERR(TSS_E_INTERNAL_ERROR);
149723e4046Schristos 
150*0861b331Schristos 	if ((result = ctx_verify_context(hContext)))
151*0861b331Schristos 		goto done;
152*0861b331Schristos 
153723e4046Schristos 	if (getData(TCSD_PACKET_TYPE_UINT32, 1, &hDAA, 0, &data->comm))
154723e4046Schristos 		return TCSERR(TSS_E_INTERNAL_ERROR);
155723e4046Schristos 	LogDebugFn("thread %ld hDAA %x", THREAD_ID, hDAA);
156723e4046Schristos 
157723e4046Schristos 	if (getData(TCSD_PACKET_TYPE_BYTE, 2, &stage, 0, &data->comm))
158723e4046Schristos 		return TCSERR(TSS_E_INTERNAL_ERROR);
159723e4046Schristos 	LogDebugFn("getData 2 (stage=%d)", (int)stage);
160723e4046Schristos 
161723e4046Schristos 	if (getData(TCSD_PACKET_TYPE_UINT32, 3, &inputSize0, 0, &data->comm))
162723e4046Schristos 		return TCSERR(TSS_E_INTERNAL_ERROR);
163723e4046Schristos 	LogDebug("getData 3  inputSize0=%d", inputSize0);
164723e4046Schristos 
165723e4046Schristos 	inputData0 = calloc(1, inputSize0);
166723e4046Schristos 	if (inputData0 == NULL) {
167723e4046Schristos 		LogError("malloc of %d bytes failed.", inputSize0);
168723e4046Schristos 		return TCSERR(TSS_E_OUTOFMEMORY);
169723e4046Schristos 	}
170723e4046Schristos 
171723e4046Schristos 	LogDebug("getData 4 inputData0");
172723e4046Schristos 	if (getData(TCSD_PACKET_TYPE_PBYTE, 4, inputData0, inputSize0, &data->comm)) {
173723e4046Schristos 		free(inputData0);
174723e4046Schristos 		return TCSERR(TSS_E_INTERNAL_ERROR);
175723e4046Schristos 	}
176723e4046Schristos 
177723e4046Schristos 	LogDebug("getData 5");
178723e4046Schristos 	if (getData(TCSD_PACKET_TYPE_UINT32, 5, &inputSize1, 0, &data->comm)) {
179723e4046Schristos 		free( inputData0);
180723e4046Schristos 		return TCSERR(TSS_E_INTERNAL_ERROR);
181723e4046Schristos 	}
182723e4046Schristos 	LogDebug("getData 5  inputSize1=%d", inputSize1);
183723e4046Schristos 
184723e4046Schristos 	if( inputSize1 > 0) {
185723e4046Schristos 		inputData1 = calloc(1, inputSize1);
186723e4046Schristos 		if (inputData1 == NULL) {
187723e4046Schristos 			LogError("malloc of %d bytes failed.", inputSize1);
188723e4046Schristos 			free( inputData0);
189723e4046Schristos 			return TCSERR(TSS_E_OUTOFMEMORY);
190723e4046Schristos 		}
191723e4046Schristos 
192723e4046Schristos 		LogDebug("getData 6 inputData1");
193723e4046Schristos 		if (getData(TCSD_PACKET_TYPE_PBYTE, 6, inputData1, inputSize1, &data->comm)) {
194723e4046Schristos 			free(inputData0);
195723e4046Schristos 			free(inputData1);
196723e4046Schristos 			return TCSERR(TSS_E_INTERNAL_ERROR);
197723e4046Schristos 		}
198723e4046Schristos 	}
199723e4046Schristos 
200723e4046Schristos 	LogDebug("getData 7");
201723e4046Schristos 	if (getData(TCSD_PACKET_TYPE_AUTH, 7, &ownerAuth, 0, &data->comm)) {
202723e4046Schristos 		pOwnerAuth = NULL;
203723e4046Schristos 	} else {
204723e4046Schristos 		pOwnerAuth = &ownerAuth;
205723e4046Schristos 	}
206723e4046Schristos 
207723e4046Schristos 	LogDebugFn("-> TCSP_DaaSign_internal");
208723e4046Schristos 
209723e4046Schristos 	MUTEX_LOCK(tcsp_lock);
210723e4046Schristos 
211723e4046Schristos 	result = TCSP_DaaSign_internal(hContext, hDAA, stage, inputSize0, inputData0, inputSize1,
212723e4046Schristos 				       inputData1, pOwnerAuth, &outputSize, &outputData);
213723e4046Schristos 
214723e4046Schristos 	MUTEX_UNLOCK(tcsp_lock);
215723e4046Schristos 
216723e4046Schristos 	LogDebugFn("<- TCSP_DaaSign_internal");
217723e4046Schristos 
218723e4046Schristos 	free(inputData0);
219723e4046Schristos 	if( inputData1 != NULL) free(inputData1);
220723e4046Schristos 
221723e4046Schristos 	if (result == TSS_SUCCESS) {
222723e4046Schristos 		i = 0;
223723e4046Schristos 		initData(&data->comm, 3);
224723e4046Schristos 		if ( pOwnerAuth) {
225723e4046Schristos 			if (setData(TCSD_PACKET_TYPE_AUTH, i++, pOwnerAuth, 0, &data->comm)) {
226723e4046Schristos 				free(outputData);
227723e4046Schristos 				return TCSERR(TSS_E_INTERNAL_ERROR);
228723e4046Schristos 			}
229723e4046Schristos 		}
230723e4046Schristos 		if (setData(TCSD_PACKET_TYPE_UINT32, i++, &outputSize, 0, &data->comm)) {
231723e4046Schristos 			free(outputData);
232723e4046Schristos 			return TCSERR(TSS_E_INTERNAL_ERROR);
233723e4046Schristos 		}
234723e4046Schristos 		if (setData(TCSD_PACKET_TYPE_PBYTE, i++, outputData, outputSize, &data->comm)) {
235723e4046Schristos 			free(outputData);
236723e4046Schristos 			return TCSERR(TSS_E_INTERNAL_ERROR);
237723e4046Schristos 		}
238723e4046Schristos 		free(outputData);
239723e4046Schristos 	} else
240*0861b331Schristos done:		initData(&data->comm, 0);
241723e4046Schristos 
242723e4046Schristos 	data->comm.hdr.u.result = result;
243723e4046Schristos 	return TSS_SUCCESS;
244723e4046Schristos }
245