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-2007
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_ReadCounter_TP(struct host_table_entry* hte,
30		    TSS_COUNTER_ID           idCounter,		/* in */
31		    TPM_COUNTER_VALUE*       counterValue)	/* out */
32{
33	TSS_RESULT result;
34
35	initData(&hte->comm, 2);
36	hte->comm.hdr.u.ordinal = TCSD_ORD_READCOUNTER;
37	LogDebugFn("IN: TCS Context: 0x%x", hte->tcsContext);
38
39	if (setData(TCSD_PACKET_TYPE_UINT32, 0, &hte->tcsContext, 0, &hte->comm))
40		return TSPERR(TSS_E_INTERNAL_ERROR);
41	if (setData(TCSD_PACKET_TYPE_UINT32, 1, &idCounter, 0, &hte->comm))
42		return TSPERR(TSS_E_INTERNAL_ERROR);
43
44	result = sendTCSDPacket(hte);
45
46	if (result == TSS_SUCCESS)
47		result = hte->comm.hdr.u.result;
48
49	if (result == TSS_SUCCESS) {
50		if (getData(TCSD_PACKET_TYPE_COUNTER_VALUE, 0, counterValue, 0, &hte->comm))
51			result = TSPERR(TSS_E_INTERNAL_ERROR);
52	}
53
54	return result;
55}
56
57TSS_RESULT
58RPC_CreateCounter_TP(struct host_table_entry* hte,
59		      UINT32                   LabelSize,	/* in (=4) */
60		      BYTE*                    pLabel,		/* in */
61		      TPM_ENCAUTH              CounterAuth,	/* in */
62		      TPM_AUTH*                pOwnerAuth,	/* in, out */
63		      TSS_COUNTER_ID*          idCounter,	/* out */
64		      TPM_COUNTER_VALUE*       counterValue)	/* out */
65{
66	TSS_RESULT result;
67
68	initData(&hte->comm, 5);
69	hte->comm.hdr.u.ordinal = TCSD_ORD_CREATECOUNTER;
70	LogDebugFn("IN: TCS Context: 0x%x", hte->tcsContext);
71
72	if (setData(TCSD_PACKET_TYPE_UINT32, 0, &hte->tcsContext, 0, &hte->comm))
73		return TSPERR(TSS_E_INTERNAL_ERROR);
74	if (setData(TCSD_PACKET_TYPE_UINT32, 1, &LabelSize, 0, &hte->comm))
75		return TSPERR(TSS_E_INTERNAL_ERROR);
76	if (setData(TCSD_PACKET_TYPE_PBYTE, 2, &pLabel, LabelSize, &hte->comm))
77		return TSPERR(TSS_E_INTERNAL_ERROR);
78	if (setData(TCSD_PACKET_TYPE_ENCAUTH, 3, &CounterAuth, 0, &hte->comm))
79		return TSPERR(TSS_E_INTERNAL_ERROR);
80	if (setData(TCSD_PACKET_TYPE_AUTH, 4, pOwnerAuth, 0, &hte->comm))
81		return TSPERR(TSS_E_INTERNAL_ERROR);
82
83	result = sendTCSDPacket(hte);
84
85	if (result == TSS_SUCCESS)
86		result = hte->comm.hdr.u.result;
87
88	if (result == TSS_SUCCESS) {
89		if (getData(TCSD_PACKET_TYPE_AUTH, 0, pOwnerAuth, 0, &hte->comm)) {
90			result = TSPERR(TSS_E_INTERNAL_ERROR);
91			goto done;
92		}
93		if (getData(TCSD_PACKET_TYPE_UINT32, 1, idCounter, 0, &hte->comm)) {
94			result = TSPERR(TSS_E_INTERNAL_ERROR);
95			goto done;
96		}
97		if (getData(TCSD_PACKET_TYPE_COUNTER_VALUE, 2, counterValue, 0, &hte->comm)) {
98			result = TSPERR(TSS_E_INTERNAL_ERROR);
99			goto done;
100		}
101	}
102done:
103	return result;
104}
105
106TSS_RESULT
107RPC_IncrementCounter_TP(struct host_table_entry* hte,
108			 TSS_COUNTER_ID           idCounter,	/* in */
109			 TPM_AUTH*                pCounterAuth,	/* in, out */
110			 TPM_COUNTER_VALUE*       counterValue)	/* out */
111{
112	TSS_RESULT result;
113
114	initData(&hte->comm, 3);
115	hte->comm.hdr.u.ordinal = TCSD_ORD_INCREMENTCOUNTER;
116	LogDebugFn("IN: TCS Context: 0x%x", hte->tcsContext);
117
118	if (setData(TCSD_PACKET_TYPE_UINT32, 0, &hte->tcsContext, 0, &hte->comm))
119		return TSPERR(TSS_E_INTERNAL_ERROR);
120	if (setData(TCSD_PACKET_TYPE_UINT32, 1, &idCounter, 0, &hte->comm))
121		return TSPERR(TSS_E_INTERNAL_ERROR);
122	if (setData(TCSD_PACKET_TYPE_AUTH, 2, pCounterAuth, 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 (result == TSS_SUCCESS) {
131		if (getData(TCSD_PACKET_TYPE_AUTH, 0, pCounterAuth, 0, &hte->comm)) {
132			result = TSPERR(TSS_E_INTERNAL_ERROR);
133			goto done;
134		}
135		if (getData(TCSD_PACKET_TYPE_COUNTER_VALUE, 1, counterValue, 0, &hte->comm)) {
136			result = TSPERR(TSS_E_INTERNAL_ERROR);
137			goto done;
138		}
139	}
140done:
141	return result;
142}
143
144TSS_RESULT
145RPC_ReleaseCounter_TP(struct host_table_entry* hte,
146		       TSS_COUNTER_ID           idCounter,	/* in */
147		       TPM_AUTH*                pCounterAuth)	/* in, out */
148{
149	TSS_RESULT result;
150
151	initData(&hte->comm, 3);
152	hte->comm.hdr.u.ordinal = TCSD_ORD_RELEASECOUNTER;
153	LogDebugFn("IN: TCS Context: 0x%x", hte->tcsContext);
154
155	if (setData(TCSD_PACKET_TYPE_UINT32, 0, &hte->tcsContext, 0, &hte->comm))
156		return TSPERR(TSS_E_INTERNAL_ERROR);
157	if (setData(TCSD_PACKET_TYPE_UINT32, 1, &idCounter, 0, &hte->comm))
158		return TSPERR(TSS_E_INTERNAL_ERROR);
159	if (setData(TCSD_PACKET_TYPE_AUTH, 2, pCounterAuth, 0, &hte->comm))
160		return TSPERR(TSS_E_INTERNAL_ERROR);
161
162	result = sendTCSDPacket(hte);
163
164	if (result == TSS_SUCCESS)
165		result = hte->comm.hdr.u.result;
166
167	if (result == TSS_SUCCESS) {
168		if (getData(TCSD_PACKET_TYPE_AUTH, 0, pCounterAuth, 0, &hte->comm))
169			result = TSPERR(TSS_E_INTERNAL_ERROR);
170	}
171
172	return result;
173}
174
175TSS_RESULT
176RPC_ReleaseCounterOwner_TP(struct host_table_entry* hte,
177			    TSS_COUNTER_ID           idCounter,		/* in */
178			    TPM_AUTH*                pOwnerAuth)	/* in, out */
179{
180	TSS_RESULT result;
181
182	initData(&hte->comm, 3);
183	hte->comm.hdr.u.ordinal = TCSD_ORD_RELEASECOUNTEROWNER;
184	LogDebugFn("IN: TCS Context: 0x%x", hte->tcsContext);
185
186	if (setData(TCSD_PACKET_TYPE_UINT32, 0, &hte->tcsContext, 0, &hte->comm))
187		return TSPERR(TSS_E_INTERNAL_ERROR);
188	if (setData(TCSD_PACKET_TYPE_UINT32, 1, &idCounter, 0, &hte->comm))
189		return TSPERR(TSS_E_INTERNAL_ERROR);
190	if (setData(TCSD_PACKET_TYPE_AUTH, 2, pOwnerAuth, 0, &hte->comm))
191		return TSPERR(TSS_E_INTERNAL_ERROR);
192
193	result = sendTCSDPacket(hte);
194
195	if (result == TSS_SUCCESS)
196		result = hte->comm.hdr.u.result;
197
198	if (result == TSS_SUCCESS) {
199		if (getData(TCSD_PACKET_TYPE_AUTH, 0, pOwnerAuth, 0, &hte->comm))
200			result = TSPERR(TSS_E_INTERNAL_ERROR);
201	}
202
203	return result;
204}
205