3
* Licensed Materials - Property of IBM
5
* trousers - An open source TCG Software Stack
7
* (C) Copyright International Business Machines Corp. 2007
17
#include "trousers/tss.h"
18
#include "trousers/trousers.h"
19
#include "trousers_types.h"
20
#include "spi_utils.h"
21
#include "capabilities.h"
24
#include "tsp_delegate.h"
27
delfamily_free(void *data)
29
struct tr_delfamily_obj *delfamily = (struct tr_delfamily_obj *)data;
35
obj_is_delfamily(TSS_HOBJECT hObject)
37
TSS_BOOL answer = FALSE;
39
if ((obj_list_get_obj(&delfamily_list, hObject))) {
41
obj_list_put(&delfamily_list);
48
obj_delfamily_add(TSS_HCONTEXT hContext, TSS_HOBJECT *phObject)
51
struct tr_delfamily_obj *delfamily = calloc(1, sizeof(struct tr_delfamily_obj));
53
if (delfamily == NULL) {
54
LogError("malloc of %zd bytes failed.",
55
sizeof(struct tr_delfamily_obj));
56
return TSPERR(TSS_E_OUTOFMEMORY);
59
if ((result = obj_list_add(&delfamily_list, hContext, 0, delfamily, phObject))) {
68
obj_delfamily_remove(TSS_HDELFAMILY hFamily, TSS_HOBJECT hObject)
70
TSS_HCONTEXT hContext;
73
if (obj_is_tpm(hObject)) {
74
if ((result = obj_tpm_get_tsp_context((TSS_HTPM)hObject, &hContext)))
77
hContext = (TSS_HCONTEXT)hObject;
79
if ((result = obj_list_remove(&delfamily_list, &delfamily_free, hFamily, hContext)))
86
obj_delfamily_find_by_familyid(TSS_HOBJECT hObject, UINT32 familyID, TSS_HDELFAMILY *hFamily)
88
TSS_HCONTEXT hContext;
89
struct tsp_object *obj, *prev = NULL;
90
struct obj_list *list = &delfamily_list;
91
struct tr_delfamily_obj *delfamily;
93
pthread_mutex_lock(&list->lock);
95
*hFamily = NULL_HDELFAMILY;
97
if (obj_is_tpm(hObject)) {
98
if (obj_tpm_get_tsp_context((TSS_HTPM)hObject, &hContext))
101
hContext = (TSS_HCONTEXT)hObject;
103
for (obj = list->head; obj; prev = obj, obj = obj->next) {
104
if (obj->tspContext != hContext)
107
delfamily = (struct tr_delfamily_obj *)obj->data;
108
if (delfamily->familyID == familyID) {
109
*hFamily = obj->handle;
114
pthread_mutex_unlock(&list->lock);
118
obj_delfamily_get_tsp_context(TSS_HDELFAMILY hFamily, TSS_HCONTEXT *hContext)
120
struct tsp_object *obj;
122
if ((obj = obj_list_get_obj(&delfamily_list, hFamily)) == NULL)
123
return TSPERR(TSS_E_INVALID_HANDLE);
125
*hContext = obj->tspContext;
127
obj_list_put(&delfamily_list);
133
obj_delfamily_set_locked(TSS_HDELFAMILY hFamily, TSS_BOOL state, TSS_BOOL setInTpm)
135
struct tsp_object *obj;
136
struct tr_delfamily_obj *delfamily;
141
BYTE *outData = NULL;
143
TSS_RESULT result = TSS_SUCCESS;
145
if ((obj = obj_list_get_obj(&delfamily_list, hFamily)) == NULL)
146
return TSPERR(TSS_E_INVALID_HANDLE);
148
delfamily = (struct tr_delfamily_obj *)obj->data;
151
if ((result = obj_tpm_get(obj->tspContext, &hTpm)))
155
Trspi_LoadBlob_BOOL(&offset, state, opData);
157
if ((result = do_delegate_manage(hTpm, delfamily->familyID, TPM_FAMILY_ADMIN,
158
opDataSize, opData, &outDataSize, &outData)))
163
delfamily->stateFlags |= TSS_DELFAMILY_FLAGS_STATE_LOCKED;
165
delfamily->stateFlags &= ~TSS_DELFAMILY_FLAGS_STATE_LOCKED;
168
obj_list_put(&delfamily_list);
176
obj_delfamily_get_locked(TSS_HDELFAMILY hFamily, TSS_BOOL *state)
178
struct tsp_object *obj;
179
struct tr_delfamily_obj *delfamily;
181
if ((obj = obj_list_get_obj(&delfamily_list, hFamily)) == NULL)
182
return TSPERR(TSS_E_INVALID_HANDLE);
184
delfamily = (struct tr_delfamily_obj *)obj->data;
186
*state = (delfamily->stateFlags & TSS_DELFAMILY_FLAGS_STATE_LOCKED) ? TRUE : FALSE;
188
obj_list_put(&delfamily_list);
194
obj_delfamily_set_enabled(TSS_HDELFAMILY hFamily, TSS_BOOL state, TSS_BOOL setInTpm)
196
struct tsp_object *obj;
197
struct tr_delfamily_obj *delfamily;
202
BYTE *outData = NULL;
204
TSS_RESULT result = TSS_SUCCESS;
206
if ((obj = obj_list_get_obj(&delfamily_list, hFamily)) == NULL)
207
return TSPERR(TSS_E_INVALID_HANDLE);
209
delfamily = (struct tr_delfamily_obj *)obj->data;
212
if ((result = obj_tpm_get(obj->tspContext, &hTpm)))
216
Trspi_LoadBlob_BOOL(&offset, state, opData);
218
if ((result = do_delegate_manage(hTpm, delfamily->familyID, TPM_FAMILY_ENABLE,
219
opDataSize, opData, &outDataSize, &outData)))
224
delfamily->stateFlags |= TSS_DELFAMILY_FLAGS_STATE_ENABLED;
226
delfamily->stateFlags &= ~TSS_DELFAMILY_FLAGS_STATE_ENABLED;
229
obj_list_put(&delfamily_list);
237
obj_delfamily_get_enabled(TSS_HDELFAMILY hFamily, TSS_BOOL *state)
239
struct tsp_object *obj;
240
struct tr_delfamily_obj *delfamily;
242
if ((obj = obj_list_get_obj(&delfamily_list, hFamily)) == NULL)
243
return TSPERR(TSS_E_INVALID_HANDLE);
245
delfamily = (struct tr_delfamily_obj *)obj->data;
247
*state = (delfamily->stateFlags & TSS_DELFAMILY_FLAGS_STATE_ENABLED) ? TRUE : FALSE;
249
obj_list_put(&delfamily_list);
255
obj_delfamily_set_vercount(TSS_HDELFAMILY hFamily, UINT32 verCount)
257
struct tsp_object *obj;
258
struct tr_delfamily_obj *delfamily;
260
if ((obj = obj_list_get_obj(&delfamily_list, hFamily)) == NULL)
261
return TSPERR(TSS_E_INVALID_HANDLE);
263
delfamily = (struct tr_delfamily_obj *)obj->data;
265
delfamily->verCount = verCount;
267
obj_list_put(&delfamily_list);
273
obj_delfamily_get_vercount(TSS_HDELFAMILY hFamily, UINT32 *verCount)
275
struct tsp_object *obj;
276
struct tr_delfamily_obj *delfamily;
278
if ((obj = obj_list_get_obj(&delfamily_list, hFamily)) == NULL)
279
return TSPERR(TSS_E_INVALID_HANDLE);
281
delfamily = (struct tr_delfamily_obj *)obj->data;
283
*verCount = delfamily->verCount;
285
obj_list_put(&delfamily_list);
291
obj_delfamily_set_familyid(TSS_HDELFAMILY hFamily, UINT32 familyID)
293
struct tsp_object *obj;
294
struct tr_delfamily_obj *delfamily;
296
if ((obj = obj_list_get_obj(&delfamily_list, hFamily)) == NULL)
297
return TSPERR(TSS_E_INVALID_HANDLE);
299
delfamily = (struct tr_delfamily_obj *)obj->data;
301
delfamily->familyID = familyID;
303
obj_list_put(&delfamily_list);
309
obj_delfamily_get_familyid(TSS_HDELFAMILY hFamily, UINT32 *familyID)
311
struct tsp_object *obj;
312
struct tr_delfamily_obj *delfamily;
314
if ((obj = obj_list_get_obj(&delfamily_list, hFamily)) == NULL)
315
return TSPERR(TSS_E_INVALID_HANDLE);
317
delfamily = (struct tr_delfamily_obj *)obj->data;
319
*familyID = delfamily->familyID;
321
obj_list_put(&delfamily_list);
327
obj_delfamily_set_label(TSS_HDELFAMILY hFamily, BYTE label)
329
struct tsp_object *obj;
330
struct tr_delfamily_obj *delfamily;
332
if ((obj = obj_list_get_obj(&delfamily_list, hFamily)) == NULL)
333
return TSPERR(TSS_E_INVALID_HANDLE);
335
delfamily = (struct tr_delfamily_obj *)obj->data;
337
delfamily->label = label;
339
obj_list_put(&delfamily_list);
345
obj_delfamily_get_label(TSS_HDELFAMILY hFamily, BYTE *label)
347
struct tsp_object *obj;
348
struct tr_delfamily_obj *delfamily;
350
if ((obj = obj_list_get_obj(&delfamily_list, hFamily)) == NULL)
351
return TSPERR(TSS_E_INVALID_HANDLE);
353
delfamily = (struct tr_delfamily_obj *)obj->data;
355
*label = delfamily->label;
357
obj_list_put(&delfamily_list);