summaryrefslogtreecommitdiff
path: root/src/tspi/tsp_caps.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/tspi/tsp_caps.c')
-rw-r--r--src/tspi/tsp_caps.c176
1 files changed, 176 insertions, 0 deletions
diff --git a/src/tspi/tsp_caps.c b/src/tspi/tsp_caps.c
new file mode 100644
index 0000000..f06fbd6
--- /dev/null
+++ b/src/tspi/tsp_caps.c
@@ -0,0 +1,176 @@
+
+/*
+ * 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/mman.h>
+#include <errno.h>
+
+#include "trousers/tss.h"
+#include "trousers/trousers.h"
+#include "trousers_types.h"
+#include "trousers_types.h"
+#include "spi_utils.h"
+#include "capabilities.h"
+#include "tsplog.h"
+#include "obj.h"
+
+
+TSS_RESULT
+internal_GetCap(TSS_HCONTEXT tspContext, TSS_FLAG capArea, UINT32 subCap,
+ UINT32 * respSize, BYTE ** respData)
+{
+ UINT64 offset = 0;
+ TSS_VERSION v = INTERNAL_CAP_VERSION;
+ TSS_BOOL bValue = FALSE;
+ UINT32 u32value = 0;
+
+ switch (capArea) {
+ case TSS_TSPCAP_VERSION:
+ if ((*respData = calloc_tspi(tspContext, sizeof(TSS_VERSION))) == NULL) {
+ LogError("malloc of %zd bytes failed", sizeof(TSS_VERSION));
+ return TSPERR(TSS_E_OUTOFMEMORY);
+ }
+
+ Trspi_LoadBlob_TSS_VERSION(&offset, *respData, v);
+ *respSize = offset;
+ break;
+ case TSS_TSPCAP_ALG:
+ switch (subCap) {
+ case TSS_ALG_RSA:
+ *respSize = sizeof(TSS_BOOL);
+ bValue = INTERNAL_CAP_TSP_ALG_RSA;
+ break;
+ case TSS_ALG_AES:
+ *respSize = sizeof(TSS_BOOL);
+ bValue = INTERNAL_CAP_TSP_ALG_AES;
+ break;
+ case TSS_ALG_SHA:
+ *respSize = sizeof(TSS_BOOL);
+ bValue = INTERNAL_CAP_TSP_ALG_SHA;
+ break;
+ case TSS_ALG_HMAC:
+ *respSize = sizeof(TSS_BOOL);
+ bValue = INTERNAL_CAP_TSP_ALG_HMAC;
+ break;
+ case TSS_ALG_DES:
+ *respSize = sizeof(TSS_BOOL);
+ bValue = INTERNAL_CAP_TSP_ALG_DES;
+ break;
+ case TSS_ALG_3DES:
+ *respSize = sizeof(TSS_BOOL);
+ bValue = INTERNAL_CAP_TSP_ALG_3DES;
+ break;
+ case TSS_ALG_DEFAULT:
+ *respSize = sizeof(UINT32);
+ u32value = INTERNAL_CAP_TSP_ALG_DEFAULT;
+ break;
+ case TSS_ALG_DEFAULT_SIZE:
+ *respSize = sizeof(UINT32);
+ u32value = INTERNAL_CAP_TSP_ALG_DEFAULT_SIZE;
+ break;
+ default:
+ LogError("Unknown TSP subCap: %u", subCap);
+ return TSPERR(TSS_E_BAD_PARAMETER);
+ }
+
+ if ((*respData = calloc_tspi(tspContext, *respSize)) == NULL) {
+ LogError("malloc of %u bytes failed", *respSize);
+ return TSPERR(TSS_E_OUTOFMEMORY);
+ }
+
+ if (*respSize == sizeof(TSS_BOOL))
+ *(TSS_BOOL *)respData = bValue;
+ else
+ *(UINT32 *)respData = u32value;
+ break;
+ case TSS_TSPCAP_PERSSTORAGE:
+ if ((*respData = calloc_tspi(tspContext, sizeof(TSS_BOOL))) == NULL) {
+ LogError("malloc of %zd bytes failed", sizeof(TSS_BOOL));
+ return TSPERR(TSS_E_OUTOFMEMORY);
+ }
+
+ *respSize = sizeof(TSS_BOOL);
+ (*respData)[0] = INTERNAL_CAP_TSP_PERSSTORAGE;
+ break;
+ case TSS_TSPCAP_RETURNVALUE_INFO:
+ if (subCap != TSS_TSPCAP_PROP_RETURNVALUE_INFO)
+ return TSPERR(TSS_E_BAD_PARAMETER);
+
+ if ((*respData = calloc_tspi(tspContext, sizeof(UINT32))) == NULL) {
+ LogError("malloc of %zd bytes failed", sizeof(UINT32));
+ return TSPERR(TSS_E_OUTOFMEMORY);
+ }
+
+ *respSize = sizeof(UINT32);
+ *(UINT32 *)(*respData) = INTERNAL_CAP_TSP_RETURNVALUE_INFO;
+ break;
+ case TSS_TSPCAP_PLATFORM_INFO:
+ switch (subCap) {
+ case TSS_TSPCAP_PLATFORM_TYPE:
+ if ((*respData = calloc_tspi(tspContext, sizeof(UINT32))) == NULL) {
+ LogError("malloc of %zd bytes failed", sizeof(UINT32));
+ return TSPERR(TSS_E_OUTOFMEMORY);
+ }
+
+ *respSize = sizeof(UINT32);
+ *(UINT32 *)(*respData) = INTERNAL_CAP_TSP_PLATFORM_TYPE;
+ break;
+ case TSS_TSPCAP_PLATFORM_VERSION:
+ if ((*respData = calloc_tspi(tspContext, sizeof(UINT32))) == NULL) {
+ LogError("malloc of %zd bytes failed", sizeof(UINT32));
+ return TSPERR(TSS_E_OUTOFMEMORY);
+ }
+
+ *respSize = sizeof(UINT32);
+ *(UINT32 *)(*respData) = INTERNAL_CAP_TSP_PLATFORM_VERSION;
+ break;
+ default:
+ return TSPERR(TSS_E_BAD_PARAMETER);
+ }
+ case TSS_TSPCAP_MANUFACTURER:
+ switch (subCap) {
+ case TSS_TSPCAP_PROP_MANUFACTURER_ID:
+ if ((*respData = calloc_tspi(tspContext, sizeof(UINT32))) == NULL) {
+ LogError("malloc of %zd bytes failed", sizeof(UINT32));
+ return TSPERR(TSS_E_OUTOFMEMORY);
+ }
+
+ *respSize = sizeof(UINT32);
+ *(UINT32 *)(*respData) = INTERNAL_CAP_MANUFACTURER_ID;
+ break;
+ case TSS_TSPCAP_PROP_MANUFACTURER_STR:
+ {
+ BYTE str[] = INTERNAL_CAP_MANUFACTURER_STR;
+
+ if ((*respData = calloc_tspi(tspContext,
+ INTERNAL_CAP_MANUFACTURER_STR_LEN)) == NULL) {
+ LogError("malloc of %d bytes failed",
+ INTERNAL_CAP_MANUFACTURER_STR_LEN);
+ return TSPERR(TSS_E_OUTOFMEMORY);
+ }
+
+ *respSize = INTERNAL_CAP_MANUFACTURER_STR_LEN;
+ memcpy(*respData, str, INTERNAL_CAP_MANUFACTURER_STR_LEN);
+ break;
+ }
+ default:
+ return TSPERR(TSS_E_BAD_PARAMETER);
+ }
+ default:
+ return TSPERR(TSS_E_BAD_PARAMETER);
+ }
+
+ return TSS_SUCCESS;
+}