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 <string.h>
     14 #include <limits.h>
     15 
     16 #include "trousers/tss.h"
     17 #include "trousers/trousers.h"
     18 #include "trousers_types.h"
     19 #include "spi_utils.h"
     20 #include "capabilities.h"
     21 #include "tsplog.h"
     22 #include "obj.h"
     23 
     24 
     25 #ifdef TSS_BUILD_TRANSPORT
     26 TSS_RESULT
     27 Transport_ActivateTPMIdentity(TSS_HCONTEXT tspContext,
     28 			      TCS_KEY_HANDLE idKey,        /* in */
     29 			      UINT32 blobSize,     /* in */
     30 			      BYTE * blob, /* in */
     31 			      TPM_AUTH * idKeyAuth,        /* in, out */
     32 			      TPM_AUTH * ownerAuth,        /* in, out */
     33 			      UINT32 * SymmetricKeySize,   /* out */
     34 			      BYTE ** SymmetricKey)        /* out */
     35 {
     36 	TSS_RESULT result;
     37 	UINT32 handlesLen, decLen;
     38 	TCS_HANDLE *handles, handle;
     39 	TPM_DIGEST pubKeyHash;
     40 	Trspi_HashCtx hashCtx;
     41 	BYTE *dec;
     42 
     43 	if ((result = obj_context_transport_init(tspContext)))
     44 		return result;
     45 
     46 	LogDebugFn("Executing in a transport session");
     47 
     48 	if ((result = obj_tcskey_get_pubkeyhash(idKey, pubKeyHash.digest)))
     49 		return result;
     50 
     51 	result = Trspi_HashInit(&hashCtx, TSS_HASH_SHA1);
     52 	result |= Trspi_Hash_DIGEST(&hashCtx, pubKeyHash.digest);
     53 	if ((result |= Trspi_HashFinal(&hashCtx, pubKeyHash.digest)))
     54 		return result;
     55 
     56 	handlesLen = 1;
     57 	handle = idKey;
     58 	handles = &handle;
     59 
     60 	if ((result = obj_context_transport_execute(tspContext, TPM_ORD_ActivateIdentity, blobSize,
     61 						    blob, &pubKeyHash, &handlesLen, &handles,
     62 						    idKeyAuth, ownerAuth, &decLen, &dec)))
     63 		return result;
     64 
     65 	*SymmetricKeySize = decLen;
     66 	*SymmetricKey = dec;
     67 
     68 	return result;
     69 }
     70 
     71 TSS_RESULT
     72 Transport_MakeIdentity2(TSS_HCONTEXT tspContext,
     73 			TCPA_ENCAUTH identityAuth, /* in */
     74 			TCPA_CHOSENID_HASH IDLabel_PrivCAHash,     /* in */
     75 			UINT32 idKeyInfoSize,      /* in */
     76 			BYTE * idKeyInfo,  /* in */
     77 			TPM_AUTH * pSrkAuth,       /* in, out */
     78 			TPM_AUTH * pOwnerAuth,     /* in, out */
     79 			UINT32 * idKeySize,        /* out */
     80 			BYTE ** idKey,     /* out */
     81 			UINT32 * pcIdentityBindingSize,    /* out */
     82 			BYTE ** prgbIdentityBinding)       /* out */
     83 {
     84 	UINT64 offset;
     85 	TSS_RESULT result;
     86 	UINT32 handlesLen = 0, decLen, dataLen;
     87 	BYTE *dec, *data;
     88 
     89 	if ((result = obj_context_transport_init(tspContext)))
     90 		return result;
     91 
     92 	LogDebugFn("Executing in a transport session");
     93 
     94 	dataLen = sizeof(TCPA_ENCAUTH) + sizeof(TCPA_CHOSENID_HASH) + idKeyInfoSize;
     95 	if ((data = malloc(dataLen)) == NULL) {
     96 		LogError("malloc of %u bytes failed", dataLen);
     97 		return TSPERR(TSS_E_OUTOFMEMORY);
     98 	}
     99 
    100 	offset = 0;
    101 	Trspi_LoadBlob(&offset, sizeof(TCPA_ENCAUTH), data, identityAuth.authdata);
    102 	Trspi_LoadBlob(&offset, sizeof(TCPA_CHOSENID_HASH), data, IDLabel_PrivCAHash.digest);
    103 	Trspi_LoadBlob(&offset, idKeyInfoSize, data, idKeyInfo);
    104 
    105 	if ((result = obj_context_transport_execute(tspContext, TPM_ORD_MakeIdentity, dataLen,
    106 						    data, NULL, &handlesLen, NULL, pSrkAuth,
    107 						    pOwnerAuth, &decLen, &dec))) {
    108 		free(data);
    109 		return result;
    110 	}
    111 	free(data);
    112 
    113 	offset = 0;
    114 	UnloadBlob_TSS_KEY(&offset, dec, NULL);
    115 	*idKeySize = offset;
    116 
    117 	if ((*idKey = malloc(*idKeySize)) == NULL) {
    118 		free(dec);
    119 		LogError("malloc of %u bytes failed", *idKeySize);
    120 		*idKeySize = 0;
    121 		return TSPERR(TSS_E_OUTOFMEMORY);
    122 	}
    123 
    124 	offset = 0;
    125 	Trspi_UnloadBlob(&offset, *idKeySize, dec, *idKey);
    126 
    127 	Trspi_UnloadBlob_UINT32(&offset, pcIdentityBindingSize, dec);
    128 	if ((*prgbIdentityBinding = malloc(*pcIdentityBindingSize)) == NULL) {
    129 		free(dec);
    130 		free(*idKey);
    131 		*idKey = NULL;
    132 		*idKeySize = 0;
    133 		LogError("malloc of %u bytes failed", *pcIdentityBindingSize);
    134 		*pcIdentityBindingSize = 0;
    135 		return TSPERR(TSS_E_OUTOFMEMORY);
    136 	}
    137 	Trspi_UnloadBlob(&offset, *pcIdentityBindingSize, dec, *prgbIdentityBinding);
    138 	free(dec);
    139 
    140 	return result;
    141 }
    142 #endif
    143 
    144