summaryrefslogtreecommitdiff
path: root/src/tcs/tcs_seal.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/tcs/tcs_seal.c')
-rw-r--r--src/tcs/tcs_seal.c84
1 files changed, 84 insertions, 0 deletions
diff --git a/src/tcs/tcs_seal.c b/src/tcs/tcs_seal.c
new file mode 100644
index 0000000..e021948
--- /dev/null
+++ b/src/tcs/tcs_seal.c
@@ -0,0 +1,84 @@
+
+/*
+ * Licensed Materials - Property of IBM
+ *
+ * trousers - An open source TCG Software Stack
+ *
+ * (C) Copyright International Business Machines Corp. 2004-2006
+ *
+ */
+
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/mman.h>
+#include <fcntl.h>
+#include <errno.h>
+
+#include "trousers/tss.h"
+#include "trousers_types.h"
+#include "tcs_tsp.h"
+#include "tcs_utils.h"
+#include "tcslog.h"
+
+
+TSS_RESULT
+UnloadBlob_STORED_DATA(UINT64 *offset, BYTE *blob, TCPA_STORED_DATA *data)
+{
+ if (!data) {
+ UINT32 size;
+
+ UnloadBlob_VERSION(offset, blob, NULL);
+
+ UnloadBlob_UINT32(offset, &size, blob);
+
+ if (size > 0)
+ UnloadBlob(offset, size, blob, NULL);
+
+ UnloadBlob_UINT32(offset, &size, blob);
+
+ if (size > 0)
+ UnloadBlob(offset, size, blob, NULL);
+
+ return TSS_SUCCESS;
+ }
+
+ UnloadBlob_VERSION(offset, blob, (TPM_VERSION *)&data->ver);
+
+ UnloadBlob_UINT32(offset, &data->sealInfoSize, blob);
+
+ if (data->sealInfoSize > 0) {
+ data->sealInfo = (BYTE *)calloc(1, data->sealInfoSize);
+ if (data->sealInfo == NULL) {
+ LogError("malloc of %u bytes failed.", data->sealInfoSize);
+ data->sealInfoSize = 0;
+ return TCSERR(TSS_E_OUTOFMEMORY);
+ }
+ UnloadBlob(offset, data->sealInfoSize, blob, data->sealInfo);
+ } else {
+ data->sealInfo = NULL;
+ }
+
+ UnloadBlob_UINT32(offset, &data->encDataSize, blob);
+
+ if (data->encDataSize > 0) {
+ data->encData = (BYTE *)calloc(1, data->encDataSize);
+ if (data->encData == NULL) {
+ LogError("malloc of %u bytes failed.", data->encDataSize);
+ data->encDataSize = 0;
+ free(data->sealInfo);
+ data->sealInfo = NULL;
+ data->sealInfoSize = 0;
+ return TCSERR(TSS_E_OUTOFMEMORY);
+ }
+ UnloadBlob(offset, data->encDataSize, blob, data->encData);
+ } else {
+ data->encData = NULL;
+ }
+
+ return TSS_SUCCESS;
+}