xref: /netbsd-src/crypto/external/cpl/trousers/dist/src/tspi/rpc/tcstp/rpc_selftest.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_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