Home | History | Annotate | Line # | Download | only in tcs
      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
     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 
    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