summaryrefslogtreecommitdiff
path: root/src/tspi/obj_delfamily.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/obj_delfamily.c
downloadtrousers-upstream.tar.gz
Imported Upstream version 0.3.9upstream/0.3.9upstream
Diffstat (limited to 'src/tspi/obj_delfamily.c')
-rw-r--r--src/tspi/obj_delfamily.c361
1 files changed, 361 insertions, 0 deletions
diff --git a/src/tspi/obj_delfamily.c b/src/tspi/obj_delfamily.c
new file mode 100644
index 0000000..340bd59
--- /dev/null
+++ b/src/tspi/obj_delfamily.c
@@ -0,0 +1,361 @@
+
+/*
+ * Licensed Materials - Property of IBM
+ *
+ * trousers - An open source TCG Software Stack
+ *
+ * (C) Copyright International Business Machines Corp. 2007
+ *
+ */
+
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <errno.h>
+#include <string.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"
+#include "tsp_delegate.h"
+
+void
+delfamily_free(void *data)
+{
+ struct tr_delfamily_obj *delfamily = (struct tr_delfamily_obj *)data;
+
+ free(delfamily);
+}
+
+TSS_BOOL
+obj_is_delfamily(TSS_HOBJECT hObject)
+{
+ TSS_BOOL answer = FALSE;
+
+ if ((obj_list_get_obj(&delfamily_list, hObject))) {
+ answer = TRUE;
+ obj_list_put(&delfamily_list);
+ }
+
+ return answer;
+}
+
+TSS_RESULT
+obj_delfamily_add(TSS_HCONTEXT hContext, TSS_HOBJECT *phObject)
+{
+ TSS_RESULT result;
+ struct tr_delfamily_obj *delfamily = calloc(1, sizeof(struct tr_delfamily_obj));
+
+ if (delfamily == NULL) {
+ LogError("malloc of %zd bytes failed.",
+ sizeof(struct tr_delfamily_obj));
+ return TSPERR(TSS_E_OUTOFMEMORY);
+ }
+
+ if ((result = obj_list_add(&delfamily_list, hContext, 0, delfamily, phObject))) {
+ free(delfamily);
+ return result;
+ }
+
+ return TSS_SUCCESS;
+}
+
+TSS_RESULT
+obj_delfamily_remove(TSS_HDELFAMILY hFamily, TSS_HOBJECT hObject)
+{
+ TSS_HCONTEXT hContext;
+ TSS_RESULT result;
+
+ if (obj_is_tpm(hObject)) {
+ if ((result = obj_tpm_get_tsp_context((TSS_HTPM)hObject, &hContext)))
+ return result;
+ } else
+ hContext = (TSS_HCONTEXT)hObject;
+
+ if ((result = obj_list_remove(&delfamily_list, &delfamily_free, hFamily, hContext)))
+ return result;
+
+ return TSS_SUCCESS;
+}
+
+void
+obj_delfamily_find_by_familyid(TSS_HOBJECT hObject, UINT32 familyID, TSS_HDELFAMILY *hFamily)
+{
+ TSS_HCONTEXT hContext;
+ struct tsp_object *obj;
+ struct obj_list *list = &delfamily_list;
+ struct tr_delfamily_obj *delfamily;
+
+ pthread_mutex_lock(&list->lock);
+
+ *hFamily = NULL_HDELFAMILY;
+
+ if (obj_is_tpm(hObject)) {
+ if (obj_tpm_get_tsp_context((TSS_HTPM)hObject, &hContext))
+ return;
+ } else
+ hContext = (TSS_HCONTEXT)hObject;
+
+ for (obj = list->head; obj; obj = obj->next) {
+ if (obj->tspContext != hContext)
+ continue;
+
+ delfamily = (struct tr_delfamily_obj *)obj->data;
+ if (delfamily->familyID == familyID) {
+ *hFamily = obj->handle;
+ break;
+ }
+ }
+
+ pthread_mutex_unlock(&list->lock);
+}
+
+TSS_RESULT
+obj_delfamily_get_tsp_context(TSS_HDELFAMILY hFamily, TSS_HCONTEXT *hContext)
+{
+ struct tsp_object *obj;
+
+ if ((obj = obj_list_get_obj(&delfamily_list, hFamily)) == NULL)
+ return TSPERR(TSS_E_INVALID_HANDLE);
+
+ *hContext = obj->tspContext;
+
+ obj_list_put(&delfamily_list);
+
+ return TSS_SUCCESS;
+}
+
+TSS_RESULT
+obj_delfamily_set_locked(TSS_HDELFAMILY hFamily, TSS_BOOL state, TSS_BOOL setInTpm)
+{
+ struct tsp_object *obj;
+ struct tr_delfamily_obj *delfamily;
+ TSS_HTPM hTpm;
+ UINT32 opDataSize;
+ BYTE opData[8];
+ UINT32 outDataSize;
+ BYTE *outData = NULL;
+ UINT64 offset;
+ TSS_RESULT result = TSS_SUCCESS;
+
+ if ((obj = obj_list_get_obj(&delfamily_list, hFamily)) == NULL)
+ return TSPERR(TSS_E_INVALID_HANDLE);
+
+ delfamily = (struct tr_delfamily_obj *)obj->data;
+
+ if (setInTpm) {
+ if ((result = obj_tpm_get(obj->tspContext, &hTpm)))
+ goto done;
+
+ offset = 0;
+ Trspi_LoadBlob_BOOL(&offset, state, opData);
+ opDataSize = offset;
+ if ((result = do_delegate_manage(hTpm, delfamily->familyID, TPM_FAMILY_ADMIN,
+ opDataSize, opData, &outDataSize, &outData)))
+ goto done;
+ }
+
+ if (state)
+ delfamily->stateFlags |= TSS_DELFAMILY_FLAGS_STATE_LOCKED;
+ else
+ delfamily->stateFlags &= ~TSS_DELFAMILY_FLAGS_STATE_LOCKED;
+
+done:
+ obj_list_put(&delfamily_list);
+
+ free(outData);
+
+ return result;
+}
+
+TSS_RESULT
+obj_delfamily_get_locked(TSS_HDELFAMILY hFamily, TSS_BOOL *state)
+{
+ struct tsp_object *obj;
+ struct tr_delfamily_obj *delfamily;
+
+ if ((obj = obj_list_get_obj(&delfamily_list, hFamily)) == NULL)
+ return TSPERR(TSS_E_INVALID_HANDLE);
+
+ delfamily = (struct tr_delfamily_obj *)obj->data;
+
+ *state = (delfamily->stateFlags & TSS_DELFAMILY_FLAGS_STATE_LOCKED) ? TRUE : FALSE;
+
+ obj_list_put(&delfamily_list);
+
+ return TSS_SUCCESS;
+}
+
+TSS_RESULT
+obj_delfamily_set_enabled(TSS_HDELFAMILY hFamily, TSS_BOOL state, TSS_BOOL setInTpm)
+{
+ struct tsp_object *obj;
+ struct tr_delfamily_obj *delfamily;
+ TSS_HTPM hTpm;
+ UINT32 opDataSize;
+ BYTE opData[8];
+ UINT32 outDataSize;
+ BYTE *outData = NULL;
+ UINT64 offset;
+ TSS_RESULT result = TSS_SUCCESS;
+
+ if ((obj = obj_list_get_obj(&delfamily_list, hFamily)) == NULL)
+ return TSPERR(TSS_E_INVALID_HANDLE);
+
+ delfamily = (struct tr_delfamily_obj *)obj->data;
+
+ if (setInTpm) {
+ if ((result = obj_tpm_get(obj->tspContext, &hTpm)))
+ goto done;
+
+ offset = 0;
+ Trspi_LoadBlob_BOOL(&offset, state, opData);
+ opDataSize = offset;
+ if ((result = do_delegate_manage(hTpm, delfamily->familyID, TPM_FAMILY_ENABLE,
+ opDataSize, opData, &outDataSize, &outData)))
+ goto done;
+ }
+
+ if (state)
+ delfamily->stateFlags |= TSS_DELFAMILY_FLAGS_STATE_ENABLED;
+ else
+ delfamily->stateFlags &= ~TSS_DELFAMILY_FLAGS_STATE_ENABLED;
+
+done:
+ obj_list_put(&delfamily_list);
+
+ free(outData);
+
+ return result;
+}
+
+TSS_RESULT
+obj_delfamily_get_enabled(TSS_HDELFAMILY hFamily, TSS_BOOL *state)
+{
+ struct tsp_object *obj;
+ struct tr_delfamily_obj *delfamily;
+
+ if ((obj = obj_list_get_obj(&delfamily_list, hFamily)) == NULL)
+ return TSPERR(TSS_E_INVALID_HANDLE);
+
+ delfamily = (struct tr_delfamily_obj *)obj->data;
+
+ *state = (delfamily->stateFlags & TSS_DELFAMILY_FLAGS_STATE_ENABLED) ? TRUE : FALSE;
+
+ obj_list_put(&delfamily_list);
+
+ return TSS_SUCCESS;
+}
+
+TSS_RESULT
+obj_delfamily_set_vercount(TSS_HDELFAMILY hFamily, UINT32 verCount)
+{
+ struct tsp_object *obj;
+ struct tr_delfamily_obj *delfamily;
+
+ if ((obj = obj_list_get_obj(&delfamily_list, hFamily)) == NULL)
+ return TSPERR(TSS_E_INVALID_HANDLE);
+
+ delfamily = (struct tr_delfamily_obj *)obj->data;
+
+ delfamily->verCount = verCount;
+
+ obj_list_put(&delfamily_list);
+
+ return TSS_SUCCESS;
+}
+
+TSS_RESULT
+obj_delfamily_get_vercount(TSS_HDELFAMILY hFamily, UINT32 *verCount)
+{
+ struct tsp_object *obj;
+ struct tr_delfamily_obj *delfamily;
+
+ if ((obj = obj_list_get_obj(&delfamily_list, hFamily)) == NULL)
+ return TSPERR(TSS_E_INVALID_HANDLE);
+
+ delfamily = (struct tr_delfamily_obj *)obj->data;
+
+ *verCount = delfamily->verCount;
+
+ obj_list_put(&delfamily_list);
+
+ return TSS_SUCCESS;
+}
+
+TSS_RESULT
+obj_delfamily_set_familyid(TSS_HDELFAMILY hFamily, UINT32 familyID)
+{
+ struct tsp_object *obj;
+ struct tr_delfamily_obj *delfamily;
+
+ if ((obj = obj_list_get_obj(&delfamily_list, hFamily)) == NULL)
+ return TSPERR(TSS_E_INVALID_HANDLE);
+
+ delfamily = (struct tr_delfamily_obj *)obj->data;
+
+ delfamily->familyID = familyID;
+
+ obj_list_put(&delfamily_list);
+
+ return TSS_SUCCESS;
+}
+
+TSS_RESULT
+obj_delfamily_get_familyid(TSS_HDELFAMILY hFamily, UINT32 *familyID)
+{
+ struct tsp_object *obj;
+ struct tr_delfamily_obj *delfamily;
+
+ if ((obj = obj_list_get_obj(&delfamily_list, hFamily)) == NULL)
+ return TSPERR(TSS_E_INVALID_HANDLE);
+
+ delfamily = (struct tr_delfamily_obj *)obj->data;
+
+ *familyID = delfamily->familyID;
+
+ obj_list_put(&delfamily_list);
+
+ return TSS_SUCCESS;
+}
+
+TSS_RESULT
+obj_delfamily_set_label(TSS_HDELFAMILY hFamily, BYTE label)
+{
+ struct tsp_object *obj;
+ struct tr_delfamily_obj *delfamily;
+
+ if ((obj = obj_list_get_obj(&delfamily_list, hFamily)) == NULL)
+ return TSPERR(TSS_E_INVALID_HANDLE);
+
+ delfamily = (struct tr_delfamily_obj *)obj->data;
+
+ delfamily->label = label;
+
+ obj_list_put(&delfamily_list);
+
+ return TSS_SUCCESS;
+}
+
+TSS_RESULT
+obj_delfamily_get_label(TSS_HDELFAMILY hFamily, BYTE *label)
+{
+ struct tsp_object *obj;
+ struct tr_delfamily_obj *delfamily;
+
+ if ((obj = obj_list_get_obj(&delfamily_list, hFamily)) == NULL)
+ return TSPERR(TSS_E_INVALID_HANDLE);
+
+ delfamily = (struct tr_delfamily_obj *)obj->data;
+
+ *label = delfamily->label;
+
+ obj_list_put(&delfamily_list);
+
+ return TSS_SUCCESS;
+}
+