diff options
author | Igor Pashev <pashev.igor@gmail.com> | 2012-11-25 14:36:20 +0000 |
---|---|---|
committer | Igor Pashev <pashev.igor@gmail.com> | 2012-11-25 14:36:20 +0000 |
commit | c3649a2def02c41d837ae1f79dda729ccb91e677 (patch) | |
tree | bea46dff212fdef977fe9094a70a939e8cc21885 /src/tspi/tsp_aik.c | |
download | trousers-upstream.tar.gz |
Imported Upstream version 0.3.9upstream/0.3.9upstream
Diffstat (limited to 'src/tspi/tsp_aik.c')
-rw-r--r-- | src/tspi/tsp_aik.c | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/src/tspi/tsp_aik.c b/src/tspi/tsp_aik.c new file mode 100644 index 0000000..ead4134 --- /dev/null +++ b/src/tspi/tsp_aik.c @@ -0,0 +1,143 @@ + +/* + * Licensed Materials - Property of IBM + * + * trousers - An open source TCG Software Stack + * + * (C) Copyright International Business Machines Corp. 2007 + * + */ + + +#include <stdlib.h> +#include <string.h> +#include <limits.h> + +#include "trousers/tss.h" +#include "trousers/trousers.h" +#include "trousers_types.h" +#include "spi_utils.h" +#include "capabilities.h" +#include "tsplog.h" +#include "obj.h" + + +#ifdef TSS_BUILD_TRANSPORT +TSS_RESULT +Transport_ActivateTPMIdentity(TSS_HCONTEXT tspContext, + TCS_KEY_HANDLE idKey, /* in */ + UINT32 blobSize, /* in */ + BYTE * blob, /* in */ + TPM_AUTH * idKeyAuth, /* in, out */ + TPM_AUTH * ownerAuth, /* in, out */ + UINT32 * SymmetricKeySize, /* out */ + BYTE ** SymmetricKey) /* out */ +{ + TSS_RESULT result; + UINT32 handlesLen, decLen; + TCS_HANDLE *handles, handle; + TPM_DIGEST pubKeyHash; + Trspi_HashCtx hashCtx; + BYTE *dec; + + if ((result = obj_context_transport_init(tspContext))) + return result; + + LogDebugFn("Executing in a transport session"); + + if ((result = obj_tcskey_get_pubkeyhash(idKey, pubKeyHash.digest))) + return result; + + result = Trspi_HashInit(&hashCtx, TSS_HASH_SHA1); + result |= Trspi_Hash_DIGEST(&hashCtx, pubKeyHash.digest); + if ((result |= Trspi_HashFinal(&hashCtx, pubKeyHash.digest))) + return result; + + handlesLen = 1; + handle = idKey; + handles = &handle; + + if ((result = obj_context_transport_execute(tspContext, TPM_ORD_ActivateIdentity, blobSize, + blob, &pubKeyHash, &handlesLen, &handles, + idKeyAuth, ownerAuth, &decLen, &dec))) + return result; + + *SymmetricKeySize = decLen; + *SymmetricKey = dec; + + return result; +} + +TSS_RESULT +Transport_MakeIdentity2(TSS_HCONTEXT tspContext, + TCPA_ENCAUTH identityAuth, /* in */ + TCPA_CHOSENID_HASH IDLabel_PrivCAHash, /* in */ + UINT32 idKeyInfoSize, /* in */ + BYTE * idKeyInfo, /* in */ + TPM_AUTH * pSrkAuth, /* in, out */ + TPM_AUTH * pOwnerAuth, /* in, out */ + UINT32 * idKeySize, /* out */ + BYTE ** idKey, /* out */ + UINT32 * pcIdentityBindingSize, /* out */ + BYTE ** prgbIdentityBinding) /* out */ +{ + UINT64 offset; + TSS_RESULT result; + UINT32 handlesLen = 0, decLen, dataLen; + BYTE *dec, *data; + + if ((result = obj_context_transport_init(tspContext))) + return result; + + LogDebugFn("Executing in a transport session"); + + dataLen = sizeof(TCPA_ENCAUTH) + sizeof(TCPA_CHOSENID_HASH) + idKeyInfoSize; + if ((data = malloc(dataLen)) == NULL) { + LogError("malloc of %u bytes failed", dataLen); + return TSPERR(TSS_E_OUTOFMEMORY); + } + + offset = 0; + Trspi_LoadBlob(&offset, sizeof(TCPA_ENCAUTH), data, identityAuth.authdata); + Trspi_LoadBlob(&offset, sizeof(TCPA_CHOSENID_HASH), data, IDLabel_PrivCAHash.digest); + Trspi_LoadBlob(&offset, idKeyInfoSize, data, idKeyInfo); + + if ((result = obj_context_transport_execute(tspContext, TPM_ORD_MakeIdentity, dataLen, + data, NULL, &handlesLen, NULL, pSrkAuth, + pOwnerAuth, &decLen, &dec))) { + free(data); + return result; + } + free(data); + + offset = 0; + UnloadBlob_TSS_KEY(&offset, dec, NULL); + *idKeySize = offset; + + if ((*idKey = malloc(*idKeySize)) == NULL) { + free(dec); + LogError("malloc of %u bytes failed", *idKeySize); + *idKeySize = 0; + return TSPERR(TSS_E_OUTOFMEMORY); + } + + offset = 0; + Trspi_UnloadBlob(&offset, *idKeySize, dec, *idKey); + + Trspi_UnloadBlob_UINT32(&offset, pcIdentityBindingSize, dec); + if ((*prgbIdentityBinding = malloc(*pcIdentityBindingSize)) == NULL) { + free(dec); + free(*idKey); + *idKey = NULL; + *idKeySize = 0; + LogError("malloc of %u bytes failed", *pcIdentityBindingSize); + *pcIdentityBindingSize = 0; + return TSPERR(TSS_E_OUTOFMEMORY); + } + Trspi_UnloadBlob(&offset, *pcIdentityBindingSize, dec, *prgbIdentityBinding); + free(dec); + + return result; +} +#endif + |