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
8  *
9  */
10 
11 
12 #include <stdlib.h>
13 #include <stdio.h>
14 #include <string.h>
15 #include <inttypes.h>
16 
17 #include "trousers/tss.h"
18 #include "trousers_types.h"
19 #include "tcs_tsp.h"
20 #include "tcsps.h"
21 #include "tcs_utils.h"
22 #include "tcs_int_literals.h"
23 #include "capabilities.h"
24 #include "tcslog.h"
25 #include "req_mgr.h"
26 #include "tcsd_wrap.h"
27 #include "tcsd.h"
28 
29 
30 TSS_RESULT
TCSP_DaaJoin_internal(TCS_CONTEXT_HANDLE hContext,TPM_HANDLE handle,BYTE stage,UINT32 inputSize0,BYTE * inputData0,UINT32 inputSize1,BYTE * inputData1,TPM_AUTH * ownerAuth,UINT32 * outputSize,BYTE ** outputData)31 TCSP_DaaJoin_internal(TCS_CONTEXT_HANDLE hContext, /* in */
32 		      TPM_HANDLE handle, /* in */
33 		      BYTE stage,               /* in */
34 		      UINT32 inputSize0,   /* in */
35 		      BYTE *inputData0,   /* in */
36 		      UINT32 inputSize1, /* in */
37 		      BYTE *inputData1, /* in */
38 		      TPM_AUTH * ownerAuth,	/* in, out */
39 		      UINT32 *outputSize, /* out */
40 		      BYTE **outputData)  /* out */
41 {
42 	UINT64 offset = 0;
43 	UINT32 paramSize;
44 	TSS_RESULT result;
45 	BYTE txBlob[TSS_TPM_TXBLOB_SIZE];
46 
47 	LogDebugFn("Enter");
48 	if ( (result = ctx_verify_context(hContext)) != TSS_SUCCESS)
49 		return result;
50 	if( (result = auth_mgr_check(hContext, &ownerAuth->AuthHandle)) != TSS_SUCCESS)
51 		goto done;
52 
53 #if 0
54 	offset = 10;
55 	LoadBlob_UINT32( &offset, handle, txBlob);
56 	LogDebug("load BYTE: stage: %x", stage);
57 	LoadBlob( &offset, sizeof(BYTE), txBlob, &stage);
58 
59 	LogDebug("load UNIT32: inputSize0: %x  (oldOffset=%" PRIu64 ")", inputSize0, offset);
60 	LoadBlob_UINT32(&offset, inputSize0, txBlob);
61 	LogDebug("load Data: inputData0: %X   (oldOffset=%" PRIu64 ")", (int)inputData0, offset);
62 	LoadBlob(&offset, inputSize0, txBlob, inputData0);
63 	LogDebug("load UINT32: inputSize1:%x  (oldOffset=%" PRIu64 ")", inputSize1, offset);
64 	LoadBlob_UINT32(&offset, inputSize1, txBlob);
65 	if( inputSize1>0) {
66 		LogDebug("load Data: inputData1: %X  (oldOffset=%" PRIu64 ")", (int)inputData1, offset);
67 		LoadBlob(&offset, inputSize1, txBlob, inputData1);
68 	}
69 	LogDebug("load Auth: ownerAuth: %X  (oldOffset=%" PRIu64 ")", (int)ownerAuth, offset);
70 	LoadBlob_Auth(&offset, txBlob, ownerAuth);
71 
72 	LogDebug("load Header: ordinal: %X  (oldOffset=%" PRIu64 ")", TPM_ORD_DAA_Join, offset);
73 	LoadBlob_Header(TPM_TAG_RQU_AUTH1_COMMAND, offset, TPM_ORD_DAA_Join, txBlob);
74 #else
75 	if ((result = tpm_rqu_build(TPM_ORD_DAA_Join, &offset, txBlob, handle, stage, inputSize0,
76 				    inputData0, inputSize1, inputData1, ownerAuth)))
77 		goto done;
78 #endif
79 
80 	LogDebug("req_mgr_submit_req  (oldOffset=%" PRIu64 ")", offset);
81 	if ((result = req_mgr_submit_req(txBlob)))
82 		goto done;
83 
84 	result = UnloadBlob_Header(txBlob, &paramSize);
85 	LogDebug("UnloadBlob  (paramSize=%d) result=%d", paramSize, result);
86 	if (!result) {
87 #if 0
88 		offset = 10;
89 		UnloadBlob_UINT32( &offset, outputSize, txBlob);
90 		LogDebug("Unload outputSize=%d", *outputSize);
91 		*outputData = malloc(*outputSize);
92 		if( *outputData == NULL) {
93 			LogError("malloc of %u bytes failed.", *outputSize);
94 			result = TCSERR(TSS_E_OUTOFMEMORY);
95 			goto done;
96 		}
97 		LogDebug("Unload outputData");
98 		UnloadBlob( &offset, *outputSize, txBlob, *outputData);
99 		LogDebug("Unload Auth");
100 		UnloadBlob_Auth(&offset, txBlob, ownerAuth);
101 #else
102 		result = tpm_rsp_parse(TPM_ORD_DAA_Join, txBlob, paramSize, outputSize, outputData,
103 				       ownerAuth);
104 #endif
105 	}
106 done:
107 	LogDebug("Leaving DaaJoin with result:%d", result);
108 	auth_mgr_release_auth(ownerAuth, NULL, hContext);
109 	return result;
110 }
111 
TCSP_DaaSign_internal(TCS_CONTEXT_HANDLE hContext,TPM_HANDLE handle,BYTE stage,UINT32 inputSize0,BYTE * inputData0,UINT32 inputSize1,BYTE * inputData1,TPM_AUTH * ownerAuth,UINT32 * outputSize,BYTE ** outputData)112 TSS_RESULT TCSP_DaaSign_internal(TCS_CONTEXT_HANDLE hContext, /* in */
113 				 TPM_HANDLE handle, /* in */
114 				 BYTE stage,               /* in */
115 				 UINT32 inputSize0,   /* in */
116 				 BYTE *inputData0,   /* in */
117 				 UINT32 inputSize1, /* in */
118 				 BYTE *inputData1, /* in */
119 				 TPM_AUTH * ownerAuth,	/* in, out */
120 				 UINT32 *outputSize, /* out */
121 				 BYTE **outputData)  /* out */
122 {
123 	UINT64 offset = 0;
124 	UINT32 paramSize;
125 	TSS_RESULT result;
126 	BYTE txBlob[TSS_TPM_TXBLOB_SIZE];
127 
128 	LogDebugFn("Enter");
129 	if ( (result = ctx_verify_context(hContext)) != TSS_SUCCESS)
130 		return result;
131 
132 	if( (result = auth_mgr_check(hContext, &ownerAuth->AuthHandle)) != TSS_SUCCESS)
133 		goto done;
134 
135 #if 0
136 	offset = 10;
137 	LoadBlob_UINT32( &offset, handle, txBlob);
138 	LogDebug("load BYTE: stage: %x", stage);
139 	LoadBlob( &offset, sizeof(BYTE), txBlob, &stage);
140 
141 	LogDebug("load UNIT32: inputSize0: %x  (oldOffset=%" PRIu64 ")", inputSize0, offset);
142 	LoadBlob_UINT32(&offset, inputSize0, txBlob);
143 	LogDebug("load Data: inputData0: %X   (oldOffset=%" PRIu64 ")", (int)inputData0, offset);
144 	LoadBlob(&offset, inputSize0, txBlob, inputData0);
145 	LogDebug("load UINT32: inputSize1:%x  (oldOffset=%" PRIu64 ")", inputSize1, offset);
146 	LoadBlob_UINT32(&offset, inputSize1, txBlob);
147 	if( inputSize1>0) {
148 		LogDebug("load Data: inputData1: %X  (oldOffset=%" PRIu64 ")", (int)inputData1, offset);
149 		LoadBlob(&offset, inputSize1, txBlob, inputData1);
150 	}
151 	LogDebug("load Auth: ownerAuth: %X  (oldOffset=%" PRIu64 ")", (int)ownerAuth, offset);
152 	LoadBlob_Auth(&offset, txBlob, ownerAuth);
153 
154 	LogDebug("load Header: ordinal: %X  (oldOffset=%" PRIu64 ")", TPM_ORD_DAA_Sign, offset);
155 	LoadBlob_Header(TPM_TAG_RQU_AUTH1_COMMAND, offset, TPM_ORD_DAA_Sign, txBlob);
156 #else
157 	if ((result = tpm_rqu_build(TPM_ORD_DAA_Sign, &offset, txBlob, handle, stage, inputSize0,
158 				    inputData0, inputSize1, inputData1, ownerAuth)))
159 		goto done;
160 #endif
161 
162 	LogDebug("req_mgr_submit_req  (oldOffset=%" PRIu64 ")", offset);
163 	if ((result = req_mgr_submit_req(txBlob))) goto done;
164 
165 	result = UnloadBlob_Header(txBlob, &paramSize);
166 	LogDebug("UnloadBlob  (paramSize=%d) result=%d", paramSize, result);
167 	if (!result) {
168 #if 0
169 		offset = 10;
170 		UnloadBlob_UINT32( &offset, outputSize, txBlob);
171 		LogDebug("Unload outputSize=%d", *outputSize);
172 		*outputData = malloc(*outputSize);
173 		if( *outputData == NULL) {
174 			LogError("malloc of %u bytes failed.", *outputSize);
175 			result = TCSERR(TSS_E_OUTOFMEMORY);
176 			goto done;
177 		}
178 		LogDebug("Unload outputData");
179 		UnloadBlob(&offset, *outputSize, txBlob, *outputData);
180 		LogDebug("Unload Auth");
181 		UnloadBlob_Auth(&offset, txBlob, ownerAuth);
182 #else
183 		result = tpm_rsp_parse(TPM_ORD_DAA_Sign, txBlob, paramSize, outputSize, outputData,
184 				       ownerAuth);
185 #endif
186 	}
187 done:
188 	LogDebug("Leaving DaaSign with result:%d", result);
189 	auth_mgr_release_auth(ownerAuth, NULL, hContext);
190 	return result;
191 }
192 
193