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_ChangeAuth(struct tcsd_thread_data * data)31723e4046Schristos tcs_wrap_ChangeAuth(struct tcsd_thread_data *data)
32723e4046Schristos {
33723e4046Schristos 	TCS_CONTEXT_HANDLE hContext;
34723e4046Schristos 	TCS_KEY_HANDLE parentHandle;
35723e4046Schristos 	TCPA_PROTOCOL_ID protocolID;
36723e4046Schristos 	TCPA_ENCAUTH newAuth;
37723e4046Schristos 	TCPA_ENTITY_TYPE entityType;
38723e4046Schristos 	UINT32 encDataSize;
39723e4046Schristos 	BYTE *encData;
40723e4046Schristos 
41723e4046Schristos 	TPM_AUTH ownerAuth;
42723e4046Schristos 	TPM_AUTH entityAuth;
43723e4046Schristos 
44723e4046Schristos 	UINT32 outDataSize;
45723e4046Schristos 	BYTE *outData;
46723e4046Schristos 	TSS_RESULT result;
47723e4046Schristos 
48723e4046Schristos 	if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
49723e4046Schristos 		return TCSERR(TSS_E_INTERNAL_ERROR);
50723e4046Schristos 
51*0861b331Schristos 	if ((result = ctx_verify_context(hContext)))
52*0861b331Schristos 		goto done;
53*0861b331Schristos 
54723e4046Schristos 	LogDebugFn("thread %ld context %x", THREAD_ID, hContext);
55723e4046Schristos 
56723e4046Schristos 	if (getData(TCSD_PACKET_TYPE_UINT32, 1, &parentHandle, 0, &data->comm))
57723e4046Schristos 		return TCSERR(TSS_E_INTERNAL_ERROR);
58723e4046Schristos 	if (getData(TCSD_PACKET_TYPE_UINT16, 2, &protocolID, 0, &data->comm))
59723e4046Schristos 		return TCSERR(TSS_E_INTERNAL_ERROR);
60723e4046Schristos 	if (getData(TCSD_PACKET_TYPE_ENCAUTH, 3, &newAuth, 0, &data->comm))
61723e4046Schristos 		return TCSERR(TSS_E_INTERNAL_ERROR);
62723e4046Schristos 	if (getData(TCSD_PACKET_TYPE_UINT16, 4, &entityType, 0, &data->comm))
63723e4046Schristos 		return TCSERR(TSS_E_INTERNAL_ERROR);
64723e4046Schristos 	if (getData(TCSD_PACKET_TYPE_UINT32, 5, &encDataSize, 0, &data->comm))
65723e4046Schristos 		return TCSERR(TSS_E_INTERNAL_ERROR);
66723e4046Schristos 	encData = calloc(1, encDataSize);
67723e4046Schristos 	if (encData == NULL) {
68723e4046Schristos 		LogError("malloc of %d bytes failed.", encDataSize);
69723e4046Schristos 		return TCSERR(TSS_E_OUTOFMEMORY);
70723e4046Schristos 	}
71723e4046Schristos 	if (getData(TCSD_PACKET_TYPE_PBYTE, 6, encData, encDataSize, &data->comm)) {
72723e4046Schristos 		free(encData);
73723e4046Schristos 		return TCSERR(TSS_E_INTERNAL_ERROR);
74723e4046Schristos 	}
75723e4046Schristos 	if (getData(TCSD_PACKET_TYPE_AUTH, 7, &ownerAuth, 0, &data->comm)) {
76723e4046Schristos 		free(encData);
77723e4046Schristos 		return TCSERR(TSS_E_INTERNAL_ERROR);
78723e4046Schristos 	}
79723e4046Schristos 	if (getData(TCSD_PACKET_TYPE_AUTH, 8, &entityAuth, 0, &data->comm)) {
80723e4046Schristos 		free(encData);
81723e4046Schristos 		return TCSERR(TSS_E_INTERNAL_ERROR);
82723e4046Schristos 	}
83723e4046Schristos 
84723e4046Schristos 	MUTEX_LOCK(tcsp_lock);
85723e4046Schristos 
86723e4046Schristos 	result = TCSP_ChangeAuth_Internal(hContext, parentHandle, protocolID, newAuth, entityType,
87723e4046Schristos 					  encDataSize, encData, &ownerAuth, &entityAuth,
88723e4046Schristos 					  &outDataSize, &outData);
89723e4046Schristos 
90723e4046Schristos 	MUTEX_UNLOCK(tcsp_lock);
91723e4046Schristos 	free(encData);
92723e4046Schristos 	if (result == TSS_SUCCESS) {
93723e4046Schristos 		initData(&data->comm, 4);
94723e4046Schristos 		if (setData(TCSD_PACKET_TYPE_AUTH, 0, &ownerAuth, 0, &data->comm)) {
95723e4046Schristos 			free(outData);
96723e4046Schristos 			return TCSERR(TSS_E_INTERNAL_ERROR);
97723e4046Schristos 		}
98723e4046Schristos 		if (setData(TCSD_PACKET_TYPE_AUTH, 1, &entityAuth, 0, &data->comm)) {
99723e4046Schristos 			free(outData);
100723e4046Schristos 			return TCSERR(TSS_E_INTERNAL_ERROR);
101723e4046Schristos 		}
102723e4046Schristos 		if (setData(TCSD_PACKET_TYPE_UINT32, 2, &outDataSize, 0, &data->comm)) {
103723e4046Schristos 			free(outData);
104723e4046Schristos 			return TCSERR(TSS_E_INTERNAL_ERROR);
105723e4046Schristos 		}
106723e4046Schristos 		if (setData(TCSD_PACKET_TYPE_PBYTE, 3, outData, outDataSize, &data->comm)) {
107723e4046Schristos 			free(outData);
108723e4046Schristos 			return TCSERR(TSS_E_INTERNAL_ERROR);
109723e4046Schristos 		}
110723e4046Schristos 		free(outData);
111723e4046Schristos 	} else
112*0861b331Schristos done:		initData(&data->comm, 0);
113723e4046Schristos 
114723e4046Schristos 	data->comm.hdr.u.result = result;
115723e4046Schristos 	return TSS_SUCCESS;
116723e4046Schristos }
117723e4046Schristos 
118723e4046Schristos TSS_RESULT
tcs_wrap_ChangeAuthOwner(struct tcsd_thread_data * data)119723e4046Schristos tcs_wrap_ChangeAuthOwner(struct tcsd_thread_data *data)
120723e4046Schristos {
121723e4046Schristos 
122723e4046Schristos 	TCS_CONTEXT_HANDLE hContext;
123723e4046Schristos 	TCPA_PROTOCOL_ID protocolID;
124723e4046Schristos 	TCPA_ENCAUTH newAuth;
125723e4046Schristos 	TCPA_ENTITY_TYPE entityType;
126723e4046Schristos 
127723e4046Schristos 	TPM_AUTH ownerAuth;
128723e4046Schristos 	TSS_RESULT result;
129723e4046Schristos 
130723e4046Schristos 	if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
131723e4046Schristos 		return TCSERR(TSS_E_INTERNAL_ERROR);
132723e4046Schristos 
133*0861b331Schristos 	if ((result = ctx_verify_context(hContext)))
134*0861b331Schristos 		goto done;
135*0861b331Schristos 
136723e4046Schristos 	LogDebugFn("thread %ld context %x", THREAD_ID, hContext);
137723e4046Schristos 
138723e4046Schristos 	if (getData(TCSD_PACKET_TYPE_UINT16, 1, &protocolID, 0, &data->comm))
139723e4046Schristos 		return TCSERR(TSS_E_INTERNAL_ERROR);
140723e4046Schristos 	if (getData(TCSD_PACKET_TYPE_ENCAUTH, 2, &newAuth, 0, &data->comm))
141723e4046Schristos 		return TCSERR(TSS_E_INTERNAL_ERROR);
142723e4046Schristos 	if (getData(TCSD_PACKET_TYPE_UINT16, 3, &entityType, 0, &data->comm))
143723e4046Schristos 		return TCSERR(TSS_E_INTERNAL_ERROR);
144723e4046Schristos 	if (getData(TCSD_PACKET_TYPE_AUTH, 4, &ownerAuth, 0, &data->comm))
145723e4046Schristos 		return TCSERR(TSS_E_INTERNAL_ERROR);
146723e4046Schristos 
147723e4046Schristos 	MUTEX_LOCK(tcsp_lock);
148723e4046Schristos 
149723e4046Schristos 	result = TCSP_ChangeAuthOwner_Internal(hContext, protocolID, newAuth, entityType,
150723e4046Schristos 					       &ownerAuth);
151723e4046Schristos 
152723e4046Schristos 	MUTEX_UNLOCK(tcsp_lock);
153723e4046Schristos 
154723e4046Schristos 	if (result == TSS_SUCCESS) {
155723e4046Schristos 		initData(&data->comm, 1);
156723e4046Schristos 		if (setData(TCSD_PACKET_TYPE_AUTH, 0, &ownerAuth, 0, &data->comm)) {
157723e4046Schristos 			return TCSERR(TSS_E_INTERNAL_ERROR);
158723e4046Schristos 		}
159723e4046Schristos 	} else
160*0861b331Schristos done:		initData(&data->comm, 0);
161723e4046Schristos 
162723e4046Schristos 	data->comm.hdr.u.result = result;
163723e4046Schristos 	return TSS_SUCCESS;
164723e4046Schristos }
165