1
2/*
3 * Licensed Materials - Property of IBM
4 *
5 * trousers - An open source TCG Software Stack
6 *
7 * (C) Copyright International Business Machines Corp. 2004-2006
8 *
9 */
10
11#include <stdlib.h>
12#include <stdio.h>
13#include <string.h>
14#include <assert.h>
15
16#include "trousers/tss.h"
17#include "trousers/trousers.h"
18#include "trousers_types.h"
19#include "spi_utils.h"
20#include "capabilities.h"
21#include "tsplog.h"
22#include "hosttable.h"
23#include "tcsd_wrap.h"
24#include "obj.h"
25#include "rpc_tcstp_tsp.h"
26
27
28TSS_RESULT
29RPC_ChangeAuth_TP(struct host_table_entry *hte,
30			       TCS_KEY_HANDLE parentHandle,	/* in */
31			       TCPA_PROTOCOL_ID protocolID,	/* in */
32			       TCPA_ENCAUTH *newAuth,	/* in */
33			       TCPA_ENTITY_TYPE entityType,	/* in */
34			       UINT32 encDataSize,	/* in */
35			       BYTE * encData,	/* in */
36			       TPM_AUTH * ownerAuth,	/* in, out */
37			       TPM_AUTH * entityAuth,	/* in, out */
38			       UINT32 * outDataSize,	/* out */
39			       BYTE ** outData)	/* out */
40{
41	TSS_RESULT result;
42
43	initData(&hte->comm, 9);
44	hte->comm.hdr.u.ordinal = TCSD_ORD_CHANGEAUTH;
45	LogDebugFn("TCS Context: 0x%x", hte->tcsContext);
46
47	if (setData(TCSD_PACKET_TYPE_UINT32, 0, &hte->tcsContext, 0, &hte->comm))
48		return TSPERR(TSS_E_INTERNAL_ERROR);
49	if (setData(TCSD_PACKET_TYPE_UINT32, 1, &parentHandle, 0, &hte->comm))
50		return TSPERR(TSS_E_INTERNAL_ERROR);
51	if (setData(TCSD_PACKET_TYPE_UINT16, 2, &protocolID, 0, &hte->comm))
52		return TSPERR(TSS_E_INTERNAL_ERROR);
53	if (setData(TCSD_PACKET_TYPE_ENCAUTH, 3, newAuth, 0, &hte->comm))
54		return TSPERR(TSS_E_INTERNAL_ERROR);
55	if (setData(TCSD_PACKET_TYPE_UINT16, 4, &entityType, 0, &hte->comm))
56		return TSPERR(TSS_E_INTERNAL_ERROR);
57	if (setData(TCSD_PACKET_TYPE_UINT32, 5, &encDataSize, 0, &hte->comm))
58		return TSPERR(TSS_E_INTERNAL_ERROR);
59	if (setData(TCSD_PACKET_TYPE_PBYTE, 6, encData, encDataSize, &hte->comm))
60		return TSPERR(TSS_E_INTERNAL_ERROR);
61	if (setData(TCSD_PACKET_TYPE_AUTH, 7, ownerAuth, 0, &hte->comm))
62		return TSPERR(TSS_E_INTERNAL_ERROR);
63	if (setData(TCSD_PACKET_TYPE_AUTH, 8, entityAuth, 0, &hte->comm))
64		return TSPERR(TSS_E_INTERNAL_ERROR);
65
66	result = sendTCSDPacket(hte);
67
68	if (result == TSS_SUCCESS)
69		result = hte->comm.hdr.u.result;
70
71	if (result == TSS_SUCCESS) {
72		if (getData(TCSD_PACKET_TYPE_AUTH, 0, ownerAuth, 0, &hte->comm)) {
73			result = TSPERR(TSS_E_INTERNAL_ERROR);
74			goto done;
75		}
76		if (getData(TCSD_PACKET_TYPE_AUTH, 1, entityAuth, 0, &hte->comm)) {
77			result = TSPERR(TSS_E_INTERNAL_ERROR);
78			goto done;
79		}
80		if (getData(TCSD_PACKET_TYPE_UINT32, 2, outDataSize, 0, &hte->comm)) {
81			result = TSPERR(TSS_E_INTERNAL_ERROR);
82			goto done;
83		}
84
85		*outData = (BYTE *) malloc(*outDataSize);
86		if (*outData == NULL) {
87			LogError("malloc of %u bytes failed.", *outDataSize);
88			result = TSPERR(TSS_E_OUTOFMEMORY);
89			goto done;
90		}
91		if (getData(TCSD_PACKET_TYPE_PBYTE, 3, *outData, *outDataSize, &hte->comm)) {
92			free(*outData);
93			result = TSPERR(TSS_E_INTERNAL_ERROR);
94		}
95	}
96
97done:
98	return result;
99}
100
101TSS_RESULT
102RPC_ChangeAuthOwner_TP(struct host_table_entry *hte,
103				    TCPA_PROTOCOL_ID protocolID,	/* in */
104				    TCPA_ENCAUTH *newAuth,	/* in */
105				    TCPA_ENTITY_TYPE entityType,	/* in */
106				    TPM_AUTH * ownerAuth	/* in, out */
107    ) {
108	TSS_RESULT result;
109
110	initData(&hte->comm, 5);
111	hte->comm.hdr.u.ordinal = TCSD_ORD_CHANGEAUTHOWNER;
112	LogDebugFn("TCS Context: 0x%x", hte->tcsContext);
113
114	if (setData(TCSD_PACKET_TYPE_UINT32, 0, &hte->tcsContext, 0, &hte->comm))
115		return TSPERR(TSS_E_INTERNAL_ERROR);
116	if (setData(TCSD_PACKET_TYPE_UINT16, 1, &protocolID, 0, &hte->comm))
117		return TSPERR(TSS_E_INTERNAL_ERROR);
118	if (setData(TCSD_PACKET_TYPE_ENCAUTH, 2, newAuth, 0, &hte->comm))
119		return TSPERR(TSS_E_INTERNAL_ERROR);
120	if (setData(TCSD_PACKET_TYPE_UINT16, 3, &entityType, 0, &hte->comm))
121		return TSPERR(TSS_E_INTERNAL_ERROR);
122	if (setData(TCSD_PACKET_TYPE_AUTH, 4, ownerAuth, 0, &hte->comm))
123		return TSPERR(TSS_E_INTERNAL_ERROR);
124
125	result = sendTCSDPacket(hte);
126
127	if (result == TSS_SUCCESS)
128		result = hte->comm.hdr.u.result;
129
130	if (hte->comm.hdr.u.result == TSS_SUCCESS) {
131		if (getData(TCSD_PACKET_TYPE_AUTH, 0, ownerAuth, 0, &hte->comm))
132			result = TSPERR(TSS_E_INTERNAL_ERROR);
133	}
134
135	return result;
136}
137
138TSS_RESULT
139RPC_ChangeAuthAsymStart_TP(struct host_table_entry *hte,
140					TCS_KEY_HANDLE idHandle,	/* in */
141					TCPA_NONCE antiReplay,	/* in */
142					UINT32 KeySizeIn,	/* in */
143					BYTE * KeyDataIn,	/* in */
144					TPM_AUTH * pAuth,	/* in, out */
145					UINT32 * KeySizeOut,	/* out */
146					BYTE ** KeyDataOut,	/* out */
147					UINT32 * CertifyInfoSize,	/* out */
148					BYTE ** CertifyInfo,	/* out */
149					UINT32 * sigSize,	/* out */
150					BYTE ** sig,	/* out */
151					TCS_KEY_HANDLE * ephHandle	/* out */
152    ) {
153	return TSPERR(TSS_E_NOTIMPL);
154}
155
156TSS_RESULT
157RPC_ChangeAuthAsymFinish_TP(struct host_table_entry *hte,
158					 TCS_KEY_HANDLE parentHandle,	/* in */
159					 TCS_KEY_HANDLE ephHandle,	/* in */
160					 TCPA_ENTITY_TYPE entityType,	/* in */
161					 TCPA_HMAC newAuthLink,	/* in */
162					 UINT32 newAuthSize,	/* in */
163					 BYTE * encNewAuth,	/* in */
164					 UINT32 encDataSizeIn,	/* in */
165					 BYTE * encDataIn,	/* in */
166					 TPM_AUTH * ownerAuth,	/* in, out */
167					 UINT32 * encDataSizeOut,	/* out */
168					 BYTE ** encDataOut,	/* out */
169					 TCPA_SALT_NONCE * saltNonce,	/* out */
170					 TCPA_DIGEST * changeProof	/* out */
171    ) {
172	return TSPERR(TSS_E_NOTIMPL);
173}
174