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
30TSS_RESULT
31TCSP_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	}
106done:
107	LogDebug("Leaving DaaJoin with result:%d", result);
108	auth_mgr_release_auth(ownerAuth, NULL, hContext);
109	return result;
110}
111
112TSS_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	}
187done:
188	LogDebug("Leaving DaaSign with result:%d", result);
189	auth_mgr_release_auth(ownerAuth, NULL, hContext);
190	return result;
191}
192
193