diff options
Diffstat (limited to 'src/tcs/tcsi_daa.c')
-rw-r--r-- | src/tcs/tcsi_daa.c | 192 |
1 files changed, 192 insertions, 0 deletions
diff --git a/src/tcs/tcsi_daa.c b/src/tcs/tcsi_daa.c new file mode 100644 index 0000000..293f4b3 --- /dev/null +++ b/src/tcs/tcsi_daa.c @@ -0,0 +1,192 @@ + +/* + * 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(TPM_ORD_DAA_Join, &offset, 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(TPM_ORD_DAA_Sign, &offset, 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; +} + |