| |
| /* |
| * Licensed Materials - Property of IBM |
| * |
| * trousers - An open source TCG Software Stack |
| * |
| * (C) Copyright International Business Machines Corp. 2004 |
| * |
| */ |
| |
| |
| #include <stdlib.h> |
| #include <stdio.h> |
| #include <string.h> |
| #include <inttypes.h> |
| |
| #include "trousers/tss.h" |
| #include "trousers_types.h" |
| #include "tcs_tsp.h" |
| #include "tcsps.h" |
| #include "tcs_utils.h" |
| #include "tcs_int_literals.h" |
| #include "capabilities.h" |
| #include "tcslog.h" |
| #include "req_mgr.h" |
| #include "tcsd_wrap.h" |
| #include "tcsd.h" |
| |
| |
| TSS_RESULT |
| TCSP_DaaJoin_internal(TCS_CONTEXT_HANDLE hContext, /* in */ |
| TPM_HANDLE handle, /* in */ |
| BYTE stage, /* in */ |
| UINT32 inputSize0, /* in */ |
| BYTE *inputData0, /* in */ |
| UINT32 inputSize1, /* in */ |
| BYTE *inputData1, /* in */ |
| TPM_AUTH * ownerAuth, /* in, out */ |
| UINT32 *outputSize, /* out */ |
| BYTE **outputData) /* out */ |
| { |
| UINT64 offset = 0; |
| UINT32 paramSize; |
| TSS_RESULT result; |
| BYTE txBlob[TSS_TPM_TXBLOB_SIZE]; |
| |
| LogDebugFn("Enter"); |
| if ( (result = ctx_verify_context(hContext)) != TSS_SUCCESS) |
| return result; |
| if( (result = auth_mgr_check(hContext, &ownerAuth->AuthHandle)) != TSS_SUCCESS) |
| goto done; |
| |
| #if 0 |
| offset = 10; |
| LoadBlob_UINT32( &offset, handle, txBlob); |
| LogDebug("load BYTE: stage: %x", stage); |
| LoadBlob( &offset, sizeof(BYTE), txBlob, &stage); |
| |
| LogDebug("load UNIT32: inputSize0: %x (oldOffset=%" PRIu64 ")", inputSize0, offset); |
| LoadBlob_UINT32(&offset, inputSize0, txBlob); |
| LogDebug("load Data: inputData0: %X (oldOffset=%" PRIu64 ")", (int)inputData0, offset); |
| LoadBlob(&offset, inputSize0, txBlob, inputData0); |
| LogDebug("load UINT32: inputSize1:%x (oldOffset=%" PRIu64 ")", inputSize1, offset); |
| LoadBlob_UINT32(&offset, inputSize1, txBlob); |
| if( inputSize1>0) { |
| LogDebug("load Data: inputData1: %X (oldOffset=%" PRIu64 ")", (int)inputData1, offset); |
| LoadBlob(&offset, inputSize1, txBlob, inputData1); |
| } |
| LogDebug("load Auth: ownerAuth: %X (oldOffset=%" PRIu64 ")", (int)ownerAuth, offset); |
| LoadBlob_Auth(&offset, txBlob, ownerAuth); |
| |
| LogDebug("load Header: ordinal: %X (oldOffset=%" PRIu64 ")", TPM_ORD_DAA_Join, offset); |
| LoadBlob_Header(TPM_TAG_RQU_AUTH1_COMMAND, offset, TPM_ORD_DAA_Join, txBlob); |
| #else |
| if ((result = tpm_rqu_build_checked(TPM_ORD_DAA_Join, &offset, TSS_TPM_TXBLOB_SIZE, txBlob, handle, stage, inputSize0, |
| inputData0, inputSize1, inputData1, ownerAuth))) |
| goto done; |
| #endif |
| |
| LogDebug("req_mgr_submit_req (oldOffset=%" PRIu64 ")", offset); |
| if ((result = req_mgr_submit_req(txBlob))) |
| goto done; |
| |
| result = UnloadBlob_Header(txBlob, ¶mSize); |
| LogDebug("UnloadBlob (paramSize=%d) result=%d", paramSize, result); |
| if (!result) { |
| #if 0 |
| offset = 10; |
| UnloadBlob_UINT32( &offset, outputSize, txBlob); |
| LogDebug("Unload outputSize=%d", *outputSize); |
| *outputData = malloc(*outputSize); |
| if( *outputData == NULL) { |
| LogError("malloc of %u bytes failed.", *outputSize); |
| result = TCSERR(TSS_E_OUTOFMEMORY); |
| goto done; |
| } |
| LogDebug("Unload outputData"); |
| UnloadBlob( &offset, *outputSize, txBlob, *outputData); |
| LogDebug("Unload Auth"); |
| UnloadBlob_Auth(&offset, txBlob, ownerAuth); |
| #else |
| result = tpm_rsp_parse(TPM_ORD_DAA_Join, txBlob, paramSize, outputSize, outputData, |
| ownerAuth); |
| #endif |
| } |
| done: |
| LogDebug("Leaving DaaJoin with result:%d", result); |
| auth_mgr_release_auth(ownerAuth, NULL, hContext); |
| return result; |
| } |
| |
| TSS_RESULT TCSP_DaaSign_internal(TCS_CONTEXT_HANDLE hContext, /* in */ |
| TPM_HANDLE handle, /* in */ |
| BYTE stage, /* in */ |
| UINT32 inputSize0, /* in */ |
| BYTE *inputData0, /* in */ |
| UINT32 inputSize1, /* in */ |
| BYTE *inputData1, /* in */ |
| TPM_AUTH * ownerAuth, /* in, out */ |
| UINT32 *outputSize, /* out */ |
| BYTE **outputData) /* out */ |
| { |
| UINT64 offset = 0; |
| UINT32 paramSize; |
| TSS_RESULT result; |
| BYTE txBlob[TSS_TPM_TXBLOB_SIZE]; |
| |
| LogDebugFn("Enter"); |
| if ( (result = ctx_verify_context(hContext)) != TSS_SUCCESS) |
| return result; |
| |
| if( (result = auth_mgr_check(hContext, &ownerAuth->AuthHandle)) != TSS_SUCCESS) |
| goto done; |
| |
| #if 0 |
| offset = 10; |
| LoadBlob_UINT32( &offset, handle, txBlob); |
| LogDebug("load BYTE: stage: %x", stage); |
| LoadBlob( &offset, sizeof(BYTE), txBlob, &stage); |
| |
| LogDebug("load UNIT32: inputSize0: %x (oldOffset=%" PRIu64 ")", inputSize0, offset); |
| LoadBlob_UINT32(&offset, inputSize0, txBlob); |
| LogDebug("load Data: inputData0: %X (oldOffset=%" PRIu64 ")", (int)inputData0, offset); |
| LoadBlob(&offset, inputSize0, txBlob, inputData0); |
| LogDebug("load UINT32: inputSize1:%x (oldOffset=%" PRIu64 ")", inputSize1, offset); |
| LoadBlob_UINT32(&offset, inputSize1, txBlob); |
| if( inputSize1>0) { |
| LogDebug("load Data: inputData1: %X (oldOffset=%" PRIu64 ")", (int)inputData1, offset); |
| LoadBlob(&offset, inputSize1, txBlob, inputData1); |
| } |
| LogDebug("load Auth: ownerAuth: %X (oldOffset=%" PRIu64 ")", (int)ownerAuth, offset); |
| LoadBlob_Auth(&offset, txBlob, ownerAuth); |
| |
| LogDebug("load Header: ordinal: %X (oldOffset=%" PRIu64 ")", TPM_ORD_DAA_Sign, offset); |
| LoadBlob_Header(TPM_TAG_RQU_AUTH1_COMMAND, offset, TPM_ORD_DAA_Sign, txBlob); |
| #else |
| if ((result = tpm_rqu_build_checked(TPM_ORD_DAA_Sign, &offset, TSS_TPM_TXBLOB_SIZE, txBlob, handle, stage, inputSize0, |
| inputData0, inputSize1, inputData1, ownerAuth))) |
| goto done; |
| #endif |
| |
| LogDebug("req_mgr_submit_req (oldOffset=%" PRIu64 ")", offset); |
| if ((result = req_mgr_submit_req(txBlob))) goto done; |
| |
| result = UnloadBlob_Header(txBlob, ¶mSize); |
| LogDebug("UnloadBlob (paramSize=%d) result=%d", paramSize, result); |
| if (!result) { |
| #if 0 |
| offset = 10; |
| UnloadBlob_UINT32( &offset, outputSize, txBlob); |
| LogDebug("Unload outputSize=%d", *outputSize); |
| *outputData = malloc(*outputSize); |
| if( *outputData == NULL) { |
| LogError("malloc of %u bytes failed.", *outputSize); |
| result = TCSERR(TSS_E_OUTOFMEMORY); |
| goto done; |
| } |
| LogDebug("Unload outputData"); |
| UnloadBlob(&offset, *outputSize, txBlob, *outputData); |
| LogDebug("Unload Auth"); |
| UnloadBlob_Auth(&offset, txBlob, ownerAuth); |
| #else |
| result = tpm_rsp_parse(TPM_ORD_DAA_Sign, txBlob, paramSize, outputSize, outputData, |
| ownerAuth); |
| #endif |
| } |
| done: |
| LogDebug("Leaving DaaSign with result:%d", result); |
| auth_mgr_release_auth(ownerAuth, NULL, hContext); |
| return result; |
| } |
| |