Home | History | Annotate | Line # | Download | only in tspi
      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. 2007
      8  *
      9  */
     10 
     11 
     12 #include <stdlib.h>
     13 #include <stdio.h>
     14 #include <string.h>
     15 
     16 #include "trousers/tss.h"
     17 #include "trousers/trousers.h"
     18 #include "trousers_types.h"
     19 #include "spi_utils.h"
     20 #include "obj.h"
     21 #include "tsplog.h"
     22 #include "authsess.h"
     23 
     24 
     25 #ifdef TSS_BUILD_SEALX
     26 TSS_RESULT
     27 sealx_mask_cb(PVOID lpAppData,
     28 	      TSS_HKEY hEncKey,
     29 	      TSS_HENCDATA hEncData,
     30 	      TSS_ALGORITHM_ID algId,
     31 	      UINT32 ulSizeNonces,
     32 	      BYTE *rgbNonceEven,
     33 	      BYTE *rgbNonceOdd,
     34 	      BYTE *rgbNonceEvenOSAP,
     35 	      BYTE *rgbNonceOddOSAP,
     36 	      UINT32 ulDataLength,
     37 	      BYTE *rgbDataToMask,
     38 	      BYTE *rgbMaskedData)
     39 {
     40 	UINT32 mgf1SeedLen, sharedSecretLen = sizeof(TPM_DIGEST);
     41 	BYTE *mgf1Seed, *mgf1Buffer;
     42 	UINT32 i;
     43 	TSS_RESULT result;
     44 	struct authsess *sess = (struct authsess *)lpAppData;
     45 
     46 	mgf1SeedLen = (ulSizeNonces * 2) + strlen("XOR") + sharedSecretLen;
     47 	if ((mgf1Seed = (BYTE *)calloc(1, mgf1SeedLen)) == NULL) {
     48 		LogError("malloc of %u bytes failed.", mgf1SeedLen);
     49 		return TSPERR(TSS_E_OUTOFMEMORY);
     50 	}
     51 	mgf1Buffer = mgf1Seed;
     52 	memcpy(mgf1Buffer, rgbNonceEven, ulSizeNonces);
     53 	mgf1Buffer += ulSizeNonces;
     54 	memcpy(mgf1Buffer, rgbNonceOdd, ulSizeNonces);
     55 	mgf1Buffer += ulSizeNonces;
     56 	memcpy(mgf1Buffer, "XOR", strlen("XOR"));
     57 	mgf1Buffer += strlen("XOR");
     58 	memcpy(mgf1Buffer, sess->sharedSecret.digest, sharedSecretLen);
     59 
     60 	if ((result = Trspi_MGF1(TSS_HASH_SHA1, mgf1SeedLen, mgf1Seed, ulDataLength,
     61 				 rgbMaskedData)))
     62 		goto done;
     63 
     64 	for (i = 0; i < ulDataLength; i++)
     65 		rgbMaskedData[i] ^= rgbDataToMask[i];
     66 
     67 done:
     68 	free(mgf1Seed);
     69 
     70 	return result;
     71 }
     72 #endif
     73 
     74 #ifdef TSS_BUILD_TRANSPORT
     75 TSS_RESULT
     76 Transport_Seal(TSS_HCONTEXT tspContext,    /* in */
     77 	       TCS_KEY_HANDLE keyHandle,   /* in */
     78 	       TCPA_ENCAUTH *encAuth,       /* in */
     79 	       UINT32 pcrInfoSize, /* in */
     80 	       BYTE * PcrInfo,     /* in */
     81 	       UINT32 inDataSize,  /* in */
     82 	       BYTE * inData,      /* in */
     83 	       TPM_AUTH * pubAuth, /* in, out */
     84 	       UINT32 * SealedDataSize,    /* out */
     85 	       BYTE ** SealedData) /* out */
     86 {
     87 	TSS_RESULT result;
     88 	UINT32 handlesLen, decLen, dataLen;
     89 	TCS_HANDLE *handles, handle;
     90 	TPM_DIGEST pubKeyHash;
     91 	Trspi_HashCtx hashCtx;
     92 	UINT64 offset;
     93 	BYTE *data, *dec;
     94 
     95 
     96 	if ((result = obj_context_transport_init(tspContext)))
     97 		return result;
     98 
     99 	LogDebugFn("Executing in a transport session");
    100 
    101 	if ((result = obj_tcskey_get_pubkeyhash(keyHandle, pubKeyHash.digest)))
    102 		return result;
    103 
    104 	result = Trspi_HashInit(&hashCtx, TSS_HASH_SHA1);
    105 	result |= Trspi_Hash_DIGEST(&hashCtx, pubKeyHash.digest);
    106 	if ((result |= Trspi_HashFinal(&hashCtx, pubKeyHash.digest)))
    107 		return result;
    108 
    109 	handlesLen = 1;
    110 	handle = keyHandle;
    111 	handles = &handle;
    112 
    113 	dataLen = (2 * sizeof(UINT32)) + sizeof(TPM_ENCAUTH) + pcrInfoSize + inDataSize;
    114 	if ((data = malloc(dataLen)) == NULL) {
    115 		LogError("malloc of %u bytes failed", dataLen);
    116 		return TSPERR(TSS_E_OUTOFMEMORY);
    117 	}
    118 
    119 	offset = 0;
    120 	Trspi_LoadBlob_DIGEST(&offset, data, (TPM_DIGEST *)encAuth);
    121 	Trspi_LoadBlob_UINT32(&offset, pcrInfoSize, data);
    122 	Trspi_LoadBlob(&offset, pcrInfoSize, data, PcrInfo);
    123 	Trspi_LoadBlob_UINT32(&offset, inDataSize, data);
    124 	Trspi_LoadBlob(&offset, inDataSize, data, inData);
    125 
    126 	if ((result = obj_context_transport_execute(tspContext, TPM_ORD_Seal, dataLen, data,
    127 						    &pubKeyHash, &handlesLen, &handles, pubAuth,
    128 						    NULL, &decLen, &dec)))
    129 		return result;
    130 
    131 	*SealedDataSize = decLen;
    132 	*SealedData = dec;
    133 
    134 	return result;
    135 }
    136 
    137 TSS_RESULT
    138 Transport_Sealx(TSS_HCONTEXT tspContext,   /* in */
    139 		TCS_KEY_HANDLE keyHandle,  /* in */
    140 		TCPA_ENCAUTH *encAuth,      /* in */
    141 		UINT32 pcrInfoSize,        /* in */
    142 		BYTE * PcrInfo,    /* in */
    143 		UINT32 inDataSize, /* in */
    144 		BYTE * inData,     /* in */
    145 		TPM_AUTH * pubAuth,        /* in, out */
    146 		UINT32 * SealedDataSize,   /* out */
    147 		BYTE ** SealedData)        /* out */
    148 {
    149 	TSS_RESULT result;
    150 	UINT32 handlesLen, decLen, dataLen;
    151 	TCS_HANDLE *handles, handle;
    152 	TPM_DIGEST pubKeyHash;
    153 	Trspi_HashCtx hashCtx;
    154 	UINT64 offset;
    155 	BYTE *data, *dec;
    156 
    157 
    158 	if ((result = obj_context_transport_init(tspContext)))
    159 		return result;
    160 
    161 	LogDebugFn("Executing in a transport session");
    162 
    163 	if ((result = obj_tcskey_get_pubkeyhash(keyHandle, pubKeyHash.digest)))
    164 		return result;
    165 
    166 	result = Trspi_HashInit(&hashCtx, TSS_HASH_SHA1);
    167 	result |= Trspi_Hash_DIGEST(&hashCtx, pubKeyHash.digest);
    168 	if ((result |= Trspi_HashFinal(&hashCtx, pubKeyHash.digest)))
    169 		return result;
    170 
    171 	handlesLen = 1;
    172 	handle = keyHandle;
    173 	handles = &handle;
    174 
    175 	dataLen = (2 * sizeof(UINT32)) + sizeof(TPM_ENCAUTH) + pcrInfoSize + inDataSize;
    176 	if ((data = malloc(dataLen)) == NULL) {
    177 		LogError("malloc of %u bytes failed", dataLen);
    178 		return TSPERR(TSS_E_OUTOFMEMORY);
    179 	}
    180 
    181 	offset = 0;
    182 	Trspi_LoadBlob(&offset, sizeof(TPM_ENCAUTH), data, encAuth->authdata);
    183 	Trspi_LoadBlob_UINT32(&offset, pcrInfoSize, data);
    184 	Trspi_LoadBlob(&offset, pcrInfoSize, data, PcrInfo);
    185 	Trspi_LoadBlob_UINT32(&offset, inDataSize, data);
    186 	Trspi_LoadBlob(&offset, inDataSize, data, inData);
    187 
    188 	if ((result = obj_context_transport_execute(tspContext, TPM_ORD_Sealx, dataLen, data,
    189 						    &pubKeyHash, &handlesLen, &handles, pubAuth,
    190 						    NULL, &decLen, &dec)))
    191 		return result;
    192 
    193 	*SealedDataSize = decLen;
    194 	*SealedData = dec;
    195 
    196 	return result;
    197 }
    198 
    199 TSS_RESULT
    200 Transport_Unseal(TSS_HCONTEXT tspContext,  /* in */
    201 		 TCS_KEY_HANDLE parentHandle,      /* in */
    202 		 UINT32 SealedDataSize,    /* in */
    203 		 BYTE * SealedData,        /* in */
    204 		 TPM_AUTH * parentAuth,    /* in, out */
    205 		 TPM_AUTH * dataAuth,      /* in, out */
    206 		 UINT32 * DataSize,        /* out */
    207 		 BYTE ** Data)     /* out */
    208 {
    209 	UINT64 offset;
    210 	TSS_RESULT result;
    211 	UINT32 handlesLen, decLen;
    212 	TCS_HANDLE *handles, handle;
    213 	TPM_DIGEST pubKeyHash;
    214 	Trspi_HashCtx hashCtx;
    215 	BYTE *dec;
    216 
    217 
    218 	if ((result = obj_context_transport_init(tspContext)))
    219 		return result;
    220 
    221 	LogDebugFn("Executing in a transport session");
    222 
    223 	if ((result = obj_tcskey_get_pubkeyhash(parentHandle, pubKeyHash.digest)))
    224 		return result;
    225 
    226 	result = Trspi_HashInit(&hashCtx, TSS_HASH_SHA1);
    227 	result |= Trspi_Hash_DIGEST(&hashCtx, pubKeyHash.digest);
    228 	if ((result |= Trspi_HashFinal(&hashCtx, pubKeyHash.digest)))
    229 		return result;
    230 
    231 	handlesLen = 1;
    232 	handle = parentHandle;
    233 	handles = &handle;
    234 
    235 	if ((result = obj_context_transport_execute(tspContext, TPM_ORD_Unseal, SealedDataSize,
    236 						    SealedData, &pubKeyHash, &handlesLen, &handles,
    237 						    parentAuth, dataAuth, &decLen, &dec)))
    238 		return result;
    239 
    240 	offset = 0;
    241 	Trspi_UnloadBlob_UINT32(&offset, DataSize, dec);
    242 
    243 	if ((*Data = malloc(*DataSize)) == NULL) {
    244 		free(dec);
    245 		LogError("malloc of %u bytes failed", *DataSize);
    246 		return TSPERR(TSS_E_OUTOFMEMORY);
    247 	}
    248 	Trspi_UnloadBlob(&offset, *DataSize, dec, *Data);
    249 
    250 	free(dec);
    251 
    252 	return result;
    253 }
    254 #endif
    255