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
28 TSS_RESULT
RPC_SelfTestFull_TP(struct host_table_entry * hte)29 RPC_SelfTestFull_TP(struct host_table_entry *hte)
30 {
31 TSS_RESULT result;
32
33 initData(&hte->comm, 1);
34 hte->comm.hdr.u.ordinal = TCSD_ORD_SELFTESTFULL;
35 LogDebugFn("TCS Context: 0x%x", hte->tcsContext);
36
37 if (setData(TCSD_PACKET_TYPE_UINT32, 0, &hte->tcsContext, 0, &hte->comm))
38 return TSPERR(TSS_E_INTERNAL_ERROR);
39
40 result = sendTCSDPacket(hte);
41
42 if (result == TSS_SUCCESS)
43 result = hte->comm.hdr.u.result;
44
45 return result;
46 }
47
48 TSS_RESULT
RPC_CertifySelfTest_TP(struct host_table_entry * hte,TCS_KEY_HANDLE keyHandle,TCPA_NONCE antiReplay,TPM_AUTH * privAuth,UINT32 * sigSize,BYTE ** sig)49 RPC_CertifySelfTest_TP(struct host_table_entry *hte,
50 TCS_KEY_HANDLE keyHandle, /* in */
51 TCPA_NONCE antiReplay, /* in */
52 TPM_AUTH * privAuth, /* in, out */
53 UINT32 * sigSize, /* out */
54 BYTE ** sig) /* out */
55 {
56 TSS_RESULT result;
57 int i;
58
59 initData(&hte->comm, 4);
60 hte->comm.hdr.u.ordinal = TCSD_ORD_CERTIFYSELFTEST;
61 LogDebugFn("TCS Context: 0x%x", hte->tcsContext);
62
63 if (setData(TCSD_PACKET_TYPE_UINT32, 0, &hte->tcsContext, 0, &hte->comm))
64 return TSPERR(TSS_E_INTERNAL_ERROR);
65 if (setData(TCSD_PACKET_TYPE_UINT32, 1, &keyHandle, 0, &hte->comm))
66 return TSPERR(TSS_E_INTERNAL_ERROR);
67 if (setData(TCSD_PACKET_TYPE_NONCE, 2, &antiReplay, 0, &hte->comm))
68 return TSPERR(TSS_E_INTERNAL_ERROR);
69
70 if (privAuth) {
71 if (setData(TCSD_PACKET_TYPE_AUTH, 3, privAuth, 0, &hte->comm))
72 return TSPERR(TSS_E_INTERNAL_ERROR);
73 }
74
75 result = sendTCSDPacket(hte);
76
77 if (result == TSS_SUCCESS)
78 result = hte->comm.hdr.u.result;
79
80 if (result == TSS_SUCCESS) {
81 i = 0;
82 if (privAuth) {
83 if (getData(TCSD_PACKET_TYPE_AUTH, i++, privAuth, 0, &hte->comm)) {
84 LogDebug("privAuth");
85 result = TSPERR(TSS_E_INTERNAL_ERROR);
86 goto done;
87 }
88 }
89 if (getData(TCSD_PACKET_TYPE_UINT32, i++, sigSize, 0, &hte->comm)) {
90 LogDebug("sigSize");
91 result = TSPERR(TSS_E_INTERNAL_ERROR);
92 goto done;
93 }
94 *sig = (BYTE *) malloc(*sigSize);
95 if (*sig == NULL) {
96 LogError("malloc of %u bytes failed.", *sigSize);
97 result = TSPERR(TSS_E_OUTOFMEMORY);
98 goto done;
99 }
100 if (getData(TCSD_PACKET_TYPE_PBYTE, i++, *sig, *sigSize, &hte->comm)) {
101 LogDebug("sig");
102 free(*sig);
103 result = TSPERR(TSS_E_INTERNAL_ERROR);
104 }
105 }
106
107 done:
108 return result;
109 }
110
111 TSS_RESULT
RPC_GetTestResult_TP(struct host_table_entry * hte,UINT32 * outDataSize,BYTE ** outData)112 RPC_GetTestResult_TP(struct host_table_entry *hte,
113 UINT32 * outDataSize, /* out */
114 BYTE ** outData) /* out */
115 {
116 TSS_RESULT result;
117
118 initData(&hte->comm, 1);
119 hte->comm.hdr.u.ordinal = TCSD_ORD_GETTESTRESULT;
120 LogDebugFn("TCS Context: 0x%x", hte->tcsContext);
121
122 LogDebug("RPC_GetTestResult_TP");
123 if (setData(TCSD_PACKET_TYPE_UINT32, 0, &hte->tcsContext, 0, &hte->comm))
124 return TSPERR(TSS_E_INTERNAL_ERROR);
125
126 result = sendTCSDPacket(hte);
127
128 if (result == TSS_SUCCESS)
129 result = hte->comm.hdr.u.result;
130
131 if (result == TSS_SUCCESS) {
132 LogDebug("sendTCSDPacket succeeded");
133 if (getData(TCSD_PACKET_TYPE_UINT32, 0, outDataSize, 0, &hte->comm)) {
134 result = TSPERR(TSS_E_INTERNAL_ERROR);
135 goto done;
136 }
137
138 *outData = malloc(*outDataSize);
139 if (*outData == NULL) {
140 LogError("malloc of %u bytes failed.", *outDataSize);
141 result = TSPERR(TSS_E_OUTOFMEMORY);
142 goto done;
143 }
144
145 if (getData(TCSD_PACKET_TYPE_PBYTE, 1, *outData, *outDataSize, &hte->comm)) {
146 free(*outData);
147 *outData = NULL;
148 result = TSPERR(TSS_E_INTERNAL_ERROR);
149 }
150 }
151 LogDebug("RPC_GetTestResult_TP exit");
152
153 done:
154 return result;
155 }
156