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