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 26TSS_RESULT 27Transport_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 71TSS_RESULT 72Transport_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