xref: /netbsd-src/crypto/external/cpl/trousers/dist/src/tspi/rpc/tcstp/rpc_daa.c (revision 2d5f7628c5531eb583b9313ac2fd1cf8582b4479)
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_DaaJoin_TP(struct host_table_entry * hte,TPM_HANDLE handle,BYTE stage,UINT32 inputSize0,BYTE * inputData0,UINT32 inputSize1,BYTE * inputData1,TPM_AUTH * ownerAuth,UINT32 * outputSize,BYTE ** outputData)29 RPC_DaaJoin_TP(struct host_table_entry *hte,
30 		TPM_HANDLE handle, // in
31 		BYTE stage, // in
32 		UINT32 inputSize0, // in
33 		BYTE* inputData0, // in
34 		UINT32 inputSize1, // in
35 		BYTE* inputData1, // in
36 		TPM_AUTH* ownerAuth, // in/out
37 		UINT32* outputSize, // out
38 		BYTE** outputData) // out
39 {
40 	TSS_RESULT result;
41 	UINT32 i;
42 
43 	LogDebugFn("stage=%d", stage);
44 	initData(&hte->comm, 8);
45 	hte->comm.hdr.u.ordinal = TCSD_ORD_DAAJOIN;
46 	LogDebugFn("TCS Context: 0x%x", hte->tcsContext);
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, &handle, 0, &hte->comm))
50 		return TSPERR(TSS_E_INTERNAL_ERROR);
51 	if (setData(TCSD_PACKET_TYPE_BYTE, 2, &stage, 0, &hte->comm))
52 		return TSPERR(TSS_E_INTERNAL_ERROR);
53 	if (setData(TCSD_PACKET_TYPE_UINT32, 3, &inputSize0, 0, &hte->comm))
54 		return TSPERR(TSS_E_INTERNAL_ERROR);
55 	LogDebugFn("inputSize0=<network>=%d <host>=%d", inputSize0, inputSize0);
56 	if (setData(TCSD_PACKET_TYPE_PBYTE, 4, inputData0, inputSize0, &hte->comm))
57 		return TSPERR(TSS_E_INTERNAL_ERROR);
58 	if (setData(TCSD_PACKET_TYPE_UINT32, 5, &inputSize1, 0, &hte->comm))
59 		return TSPERR(TSS_E_INTERNAL_ERROR);
60 	LogDebugFn("inputSize1=<network>=%d <host>=%d", inputSize1, inputSize1);
61 	if (setData(TCSD_PACKET_TYPE_PBYTE, 6, inputData1, inputSize1, &hte->comm))
62 		return TSPERR(TSS_E_INTERNAL_ERROR);
63 	if( ownerAuth) {
64 		if (setData(TCSD_PACKET_TYPE_AUTH, 7, ownerAuth, 0, &hte->comm))
65 			return TSPERR(TSS_E_INTERNAL_ERROR);
66 	}
67 
68 	result = sendTCSDPacket(hte);
69 	if (result == TSS_SUCCESS)
70 		result = hte->comm.hdr.u.result;
71 
72 	if (result == TSS_SUCCESS) {
73 		i = 0;
74 		LogDebugFn("getData outputSize");
75 
76 		if( ownerAuth) {
77 			if (getData(TCSD_PACKET_TYPE_AUTH, i++, ownerAuth, 0, &hte->comm)) {
78 				result = TSPERR(TSS_E_INTERNAL_ERROR);
79 				goto done;
80 			}
81 		}
82 		if (getData(TCSD_PACKET_TYPE_UINT32, i++, outputSize, 0, &hte->comm)) {
83 			result = TSPERR(TSS_E_INTERNAL_ERROR);
84 			goto done;
85 		}
86 		*outputData = (BYTE *) malloc(*outputSize);
87 		if (*outputData == NULL) {
88 			LogError("malloc of %u bytes failed.", *outputSize);
89 			result = TSPERR(TSS_E_OUTOFMEMORY);
90 			goto done;
91 		}
92 		LogDebugFn("getData outputData (outputSize=%u)", *outputSize);
93 		if (getData(TCSD_PACKET_TYPE_PBYTE, i++, *outputData, *outputSize, &hte->comm)) {
94 			free(*outputData);
95 			*outputData = NULL;
96 			result = TSPERR(TSS_E_INTERNAL_ERROR);
97 			goto done;
98 		}
99 	}
100 
101 done:
102 	LogDebugFn("result=%u", result);
103 	return result;
104 }
105 
106 TSS_RESULT
RPC_DaaSign_TP(struct host_table_entry * hte,TPM_HANDLE handle,BYTE stage,UINT32 inputSize0,BYTE * inputData0,UINT32 inputSize1,BYTE * inputData1,TPM_AUTH * ownerAuth,UINT32 * outputSize,BYTE ** outputData)107 RPC_DaaSign_TP(struct host_table_entry *hte,
108 		TPM_HANDLE handle, // in
109 		BYTE stage, // in
110 		UINT32 inputSize0, // in
111 		BYTE* inputData0, // in
112 		UINT32 inputSize1, // in
113 		BYTE* inputData1, // in
114 		TPM_AUTH* ownerAuth, // in/out
115 		UINT32* outputSize, // out
116 		BYTE** outputData) // out
117 {
118 	TSS_RESULT result;
119 	UINT32 i;
120 
121 	LogDebugFn("stage=%d", stage);
122 	initData(&hte->comm, 8);
123 	hte->comm.hdr.u.ordinal = TCSD_ORD_DAASIGN;
124 	LogDebugFn("TCS Context: 0x%x", hte->tcsContext);
125 	if (setData(TCSD_PACKET_TYPE_UINT32, 0, &hte->tcsContext, 0, &hte->comm))
126 		return TSPERR(TSS_E_INTERNAL_ERROR);
127 	if (setData(TCSD_PACKET_TYPE_UINT32, 1, &handle, 0, &hte->comm))
128 		return TSPERR(TSS_E_INTERNAL_ERROR);
129 	if (setData(TCSD_PACKET_TYPE_BYTE, 2, &stage, 0, &hte->comm))
130 		return TSPERR(TSS_E_INTERNAL_ERROR);
131 	if (setData(TCSD_PACKET_TYPE_UINT32, 3, &inputSize0, 0, &hte->comm))
132 		return TSPERR(TSS_E_INTERNAL_ERROR);
133 	LogDebugFn("inputSize0=<network>=%d <host>=%d", inputSize0, inputSize0);
134 	if (setData(TCSD_PACKET_TYPE_PBYTE, 4, inputData0, inputSize0, &hte->comm))
135 		return TSPERR(TSS_E_INTERNAL_ERROR);
136 	if (setData(TCSD_PACKET_TYPE_UINT32, 5, &inputSize1, 0, &hte->comm))
137 		return TSPERR(TSS_E_INTERNAL_ERROR);
138 	LogDebugFn("inputSize1=<network>=%d <host>=%d", inputSize1, inputSize1);
139 	if (setData(TCSD_PACKET_TYPE_PBYTE, 6, inputData1, inputSize1, &hte->comm))
140 		return TSPERR(TSS_E_INTERNAL_ERROR);
141 	if( ownerAuth) {
142 		if (setData(TCSD_PACKET_TYPE_AUTH, 7, ownerAuth, 0, &hte->comm))
143 			return TSPERR(TSS_E_INTERNAL_ERROR);
144 	}
145 	LogDebugFn("sendTCSDPacket: 0x%x", (int)hte);
146 	result = sendTCSDPacket(hte);
147 	//
148 	if (result == TSS_SUCCESS)
149 		result = hte->comm.hdr.u.result;
150 	//
151 	if (result == TSS_SUCCESS) {
152 		i = 0;
153 		LogDebugFn("getData outputSize");
154 
155 		if( ownerAuth) {
156 			if (getData(TCSD_PACKET_TYPE_AUTH, i++, ownerAuth, 0, &hte->comm)) {
157 				result = TSPERR(TSS_E_INTERNAL_ERROR);
158 				goto done;
159 			}
160 		}
161 		if (getData(TCSD_PACKET_TYPE_UINT32, i++, outputSize, 0, &hte->comm)) {
162 			result = TSPERR(TSS_E_INTERNAL_ERROR);
163 			goto done;
164 		}
165 		*outputData = (BYTE *) malloc(*outputSize);
166 		if (*outputData == NULL) {
167 			LogError("malloc of %u bytes failed.", *outputSize);
168 			result = TSPERR(TSS_E_OUTOFMEMORY);
169 			goto done;
170 		}
171 		LogDebugFn("getData outputData (outputSize=%d)", *outputSize);
172 		if (getData(TCSD_PACKET_TYPE_PBYTE, i++, *outputData, *outputSize, &hte->comm)) {
173 			free(*outputData);
174 			*outputData = NULL;
175 			result = TSPERR(TSS_E_INTERNAL_ERROR);
176 			goto done;
177 		}
178 	}
179 
180 done:
181 	LogDebugFn("result=%u", result);
182 	return result;
183 }
184 
185