Home | History | Annotate | Line # | Download | only in tcstp
      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-2007
      8  *
      9  */
     10 
     11 #include <stdlib.h>
     12 #include <stdio.h>
     13 #include <syslog.h>
     14 #include <string.h>
     15 #include <netdb.h>
     16 
     17 #include "trousers/tss.h"
     18 #include "trousers_types.h"
     19 #include "tcs_tsp.h"
     20 #include "tcs_utils.h"
     21 #include "tcs_int_literals.h"
     22 #include "capabilities.h"
     23 #include "tcslog.h"
     24 #include "tcsd_wrap.h"
     25 #include "tcsd.h"
     26 #include "tcs_utils.h"
     27 #include "rpc_tcstp_tcs.h"
     28 
     29 
     30 TSS_RESULT
     31 tcs_wrap_Quote2(struct tcsd_thread_data *data)
     32 {
     33 	/* Data to be forwarded to the next level */
     34 	TCS_CONTEXT_HANDLE hContext;
     35 	TCS_KEY_HANDLE hKey;
     36 	TCPA_NONCE antiReplay;
     37 	UINT32 pcrDataSizeIn;
     38 	BYTE *pcrDataIn;
     39 	TSS_BOOL addVersion;
     40 	TPM_AUTH privAuth;  /* in/out */
     41 	TPM_AUTH *pPrivAuth;
     42 
     43 	UINT32 pcrDataSizeOut;
     44 	BYTE *pcrDataOut;
     45 
     46 	UINT32 versionInfoSize;
     47 	BYTE * versionInfo;
     48 
     49 	UINT32 sigSize;
     50 	BYTE *sig;
     51 	TSS_RESULT result;
     52 
     53 	int i;
     54 
     55 	if (getData(TCSD_PACKET_TYPE_UINT32, 0, &hContext, 0, &data->comm))
     56 		return TCSERR(TSS_E_INTERNAL_ERROR);
     57 
     58 	if ((result = ctx_verify_context(hContext)))
     59 		goto done;
     60 
     61 	LogDebugFn("thread %ld context %x", THREAD_ID, hContext);
     62 
     63 	if (getData(TCSD_PACKET_TYPE_UINT32, 1, &hKey, 0, &data->comm))
     64 		return TCSERR(TSS_E_INTERNAL_ERROR);
     65 	if (getData(TCSD_PACKET_TYPE_NONCE, 2, &antiReplay, 0, &data->comm))
     66 		return TCSERR(TSS_E_INTERNAL_ERROR);
     67 	if (getData(TCSD_PACKET_TYPE_UINT32, 3, &pcrDataSizeIn, 0, &data->comm))
     68 		return TCSERR(TSS_E_INTERNAL_ERROR);
     69 	pcrDataIn = (BYTE *)calloc(1, pcrDataSizeIn);
     70 	if (pcrDataIn == NULL) {
     71 		LogError("malloc of %u bytes failed.", pcrDataSizeIn);
     72 		return TCSERR(TSS_E_OUTOFMEMORY);
     73 	}
     74 	if (getData(TCSD_PACKET_TYPE_PBYTE, 4, pcrDataIn, pcrDataSizeIn, &data->comm)) {
     75 		free(pcrDataIn);
     76 		return TCSERR(TSS_E_INTERNAL_ERROR);
     77 	}
     78 	if (getData(TCSD_PACKET_TYPE_BOOL,5,&addVersion, 0, &data->comm)) {
     79 		free(pcrDataIn);
     80 		return TCSERR(TSS_E_INTERNAL_ERROR);
     81 	}
     82 	result = getData(TCSD_PACKET_TYPE_AUTH, 6, &privAuth, 0, &data->comm);
     83 	if (result == TSS_TCP_RPC_BAD_PACKET_TYPE)
     84 		pPrivAuth = NULL;
     85 	else if (result) {
     86 		free(pcrDataIn);
     87 		return result;
     88 	} else
     89 		pPrivAuth = &privAuth;
     90 
     91 	MUTEX_LOCK(tcsp_lock);
     92 
     93 	result = TCSP_Quote2_Internal(hContext, hKey, antiReplay, pcrDataSizeIn, pcrDataIn,
     94 				     addVersion,pPrivAuth, &pcrDataSizeOut, &pcrDataOut, &versionInfoSize,
     95 				     &versionInfo,&sigSize, &sig);
     96 
     97 	MUTEX_UNLOCK(tcsp_lock);
     98 	free(pcrDataIn);
     99 
    100 	if (result == TSS_SUCCESS) {
    101 		i = 0;
    102 
    103 		initData(&data->comm,7); /* Add versionInfoSize and versionInfo */
    104 		if (pPrivAuth != NULL) {
    105 			if (setData(TCSD_PACKET_TYPE_AUTH, i++, pPrivAuth, 0, &data->comm)) {
    106 				free(pcrDataOut);
    107 				/* It's a null pointer when addVersion == FALSE */
    108 				if (addVersion)
    109 					free(versionInfo);
    110 				free(sig);
    111 				return TCSERR(TSS_E_INTERNAL_ERROR);
    112 			}
    113 		}
    114 		if (setData(TCSD_PACKET_TYPE_UINT32, i++, &pcrDataSizeOut, 0, &data->comm)) {
    115 			free(pcrDataOut);
    116 			if (addVersion)
    117 				free(versionInfo);
    118 			free(sig);
    119 			return TCSERR(TSS_E_INTERNAL_ERROR);
    120 		}
    121 		if (setData(TCSD_PACKET_TYPE_PBYTE, i++, pcrDataOut, pcrDataSizeOut, &data->comm)) {
    122 			free(pcrDataOut);
    123 			if (addVersion)
    124 				free(versionInfo);
    125 			free(sig);
    126 			return TCSERR(TSS_E_INTERNAL_ERROR);
    127 		}
    128 		if (setData(TCSD_PACKET_TYPE_UINT32, i++, &versionInfoSize, 0, &data->comm)) {
    129 			free(pcrDataOut);
    130 			free(versionInfo);
    131 			free(sig);
    132 			return TCSERR(TSS_E_INTERNAL_ERROR);
    133 		}
    134 		if (versionInfoSize > 0){
    135 			if (setData(TCSD_PACKET_TYPE_PBYTE, i++, versionInfo, versionInfoSize, &data->comm)) {
    136 				free(pcrDataOut);
    137 				free(versionInfo);
    138 				free(sig);
    139 				return TCSERR(TSS_E_INTERNAL_ERROR);
    140 			}
    141 		}
    142 		if (setData(TCSD_PACKET_TYPE_UINT32, i++, &sigSize, 0, &data->comm)) {
    143 			free(pcrDataOut);
    144 			if (addVersion)
    145 				free(versionInfo);
    146 			free(sig);
    147 			return TCSERR(TSS_E_INTERNAL_ERROR);
    148 		}
    149 		if (setData(TCSD_PACKET_TYPE_PBYTE, i++, sig, sigSize, &data->comm)) {
    150 			free(pcrDataOut);
    151 			if (addVersion)
    152 				free(versionInfo);
    153 			free(sig);
    154 			return TCSERR(TSS_E_INTERNAL_ERROR);
    155 		}
    156 
    157 		free(pcrDataOut);
    158 		if (versionInfoSize >0)
    159 			free(versionInfo);
    160 		free(sig);
    161 	} else
    162 done:		initData(&data->comm, 0);
    163 
    164 	data->comm.hdr.u.result = result;
    165 	return TSS_SUCCESS;
    166 }
    167