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, ¶mSize); 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, ¶mSize); 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