summaryrefslogtreecommitdiff
path: root/src/tspi/tsp_aik.c
diff options
context:
space:
mode:
authorIgor Pashev <pashev.igor@gmail.com>2012-11-25 14:36:20 +0000
committerIgor Pashev <pashev.igor@gmail.com>2012-11-25 14:36:20 +0000
commitc3649a2def02c41d837ae1f79dda729ccb91e677 (patch)
treebea46dff212fdef977fe9094a70a939e8cc21885 /src/tspi/tsp_aik.c
downloadtrousers-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.c143
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
+