3
* Licensed Materials - Property of IBM
5
* trousers - An open source TCG Software Stack
7
* (C) Copyright International Business Machines Corp. 2005, 2006
18
#include "trousers/tss.h"
19
#include "trousers/trousers.h"
20
#include "spi_internal_types.h"
21
#include "spi_utils.h"
22
#include "capabilities.h"
28
obj_context_add(TSS_HOBJECT *phObject)
31
struct tr_context_obj *context = calloc(1, sizeof(struct tr_context_obj));
32
unsigned len = strlen(TSS_LOCALHOST_STRING) + 1;
34
if (context == NULL) {
35
LogError("malloc of %zd bytes failed.",
36
sizeof(struct tr_context_obj));
37
return TSPERR(TSS_E_OUTOFMEMORY);
41
context->silentMode = TSS_TSPATTRIB_CONTEXT_NOT_SILENT;
43
context->silentMode = TSS_TSPATTRIB_CONTEXT_SILENT;
45
if ((context->machineName = calloc(1, len)) == NULL) {
46
LogError("malloc of %d bytes failed", len);
48
return TSPERR(TSS_E_OUTOFMEMORY);
50
memcpy(context->machineName, TSS_LOCALHOST_STRING, len);
51
context->machineNameLength = len;
53
#ifndef TSS_SPEC_COMPLIANCE
54
context->hashMode = TSS_TSPATTRIB_HASH_MODE_NULL;
57
if ((result = obj_list_add(&context_list, NULL_HCONTEXT, 0, context, phObject))) {
62
if ((obj_policy_add(*phObject, TSS_POLICY_USAGE, &context->policy))) {
63
obj_close_context(*phObject);
64
return TSPERR(TSS_E_INTERNAL_ERROR);
71
obj_is_context(TSS_HOBJECT hObject)
73
TSS_BOOL answer = FALSE;
75
if ((obj_list_get_obj(&context_list, hObject))) {
77
obj_list_put(&context_list);
85
//obj_context_is_connected(TSS_HCONTEXT tspContext, TCS_CONTEXT_HANDLE *tcsContext)
86
obj_context_is_connected(TSS_HCONTEXT tspContext)
88
struct tsp_object *obj;
89
TSS_RESULT result = TSS_SUCCESS;
91
if ((obj = obj_list_get_obj(&context_list, tspContext)) == NULL)
92
return TSPERR(TSS_E_INVALID_HANDLE);
94
if (obj->tcsContext == NULL_HCONTEXT)
95
result = TSPERR(TSS_E_NO_CONNECTION);
97
//*tcsContext = obj->tcsContext;
99
obj_list_put(&context_list);
106
obj_context_get_policy(TSS_HCONTEXT tspContext, TSS_HPOLICY *phPolicy)
108
struct tsp_object *obj;
109
struct tr_context_obj *context;
111
if ((obj = obj_list_get_obj(&context_list, tspContext)) == NULL)
112
return TSPERR(TSS_E_INVALID_HANDLE);
114
context = (struct tr_context_obj *)obj->data;
115
*phPolicy = context->policy;
117
obj_list_put(&context_list);
123
obj_context_get_machine_name(TSS_HCONTEXT tspContext, UINT32 *size, BYTE **data)
125
struct tsp_object *obj;
126
struct tr_context_obj *context;
127
TSS_RESULT result = TSPERR(TSS_E_INVALID_HANDLE);
129
if ((obj = obj_list_get_obj(&context_list, tspContext)) == NULL)
130
return TSPERR(TSS_E_INVALID_HANDLE);
132
context = (struct tr_context_obj *)obj->data;
134
if (context->machineNameLength == 0) {
138
*data = calloc_tspi(obj->tspContext, context->machineNameLength);
140
LogError("malloc of %u bytes failed.",
141
context->machineNameLength);
142
result = TSPERR(TSS_E_OUTOFMEMORY);
145
*size = context->machineNameLength;
146
memcpy(*data, context->machineName, *size);
149
result = TSS_SUCCESS;
152
obj_list_put(&context_list);
157
/* This function converts the machine name to a TSS_UNICODE string before
158
* returning it, as Tspi_GetAttribData would like. We could do the conversion
159
* in Tspi_GetAttribData, but we don't have access to the TSP context there */
161
obj_context_get_machine_name_attrib(TSS_HCONTEXT tspContext, UINT32 *size,
164
struct tsp_object *obj;
165
struct tr_context_obj *context;
168
TSS_RESULT result = TSPERR(TSS_E_INVALID_HANDLE);
170
if ((obj = obj_list_get_obj(&context_list, tspContext)) == NULL)
171
return TSPERR(TSS_E_INVALID_HANDLE);
173
context = (struct tr_context_obj *)obj->data;
175
if (context->machineNameLength == 0) {
179
utf_size = context->machineNameLength;
180
utf_string = Trspi_Native_To_UNICODE(context->machineName,
182
if (utf_string == NULL) {
183
result = TSPERR(TSS_E_INTERNAL_ERROR);
187
*data = calloc_tspi(obj->tspContext, utf_size);
190
LogError("malloc of %u bytes failed.", utf_size);
191
result = TSPERR(TSS_E_OUTOFMEMORY);
195
memcpy(*data, utf_string, utf_size);
199
result = TSS_SUCCESS;
202
obj_list_put(&context_list);
208
obj_context_set_machine_name(TSS_HCONTEXT tspContext, BYTE *name, UINT32 len)
210
struct tsp_object *obj;
211
struct tr_context_obj *context;
213
if ((obj = obj_list_get_obj(&context_list, tspContext)) == NULL)
214
return TSPERR(TSS_E_INVALID_HANDLE);
216
context = (struct tr_context_obj *)obj->data;
218
free(context->machineName);
219
context->machineName = name;
220
context->machineNameLength = len;
222
obj_list_put(&context_list);
228
obj_context_is_silent(TSS_HCONTEXT tspContext)
230
struct tsp_object *obj;
231
struct tr_context_obj *context;
232
TSS_BOOL silent = FALSE;
234
if ((obj = obj_list_get_obj(&context_list, tspContext)) == NULL)
237
context = (struct tr_context_obj *)obj->data;
238
if (context->silentMode == TSS_TSPATTRIB_CONTEXT_SILENT)
241
obj_list_put(&context_list);
247
obj_context_set_policy(TSS_HCONTEXT tspContext, TSS_HPOLICY hPolicy)
249
struct tsp_object *obj;
250
struct tr_context_obj *context;
252
if ((obj = obj_list_get_obj(&context_list, tspContext)) == NULL)
253
return TSPERR(TSS_E_INVALID_HANDLE);
255
context = (struct tr_context_obj *)obj->data;
256
context->policy = hPolicy;
258
obj_list_put(&context_list);
264
obj_context_get_mode(TSS_HCONTEXT tspContext, UINT32 *mode)
266
struct tsp_object *obj;
267
struct tr_context_obj *context;
269
if ((obj = obj_list_get_obj(&context_list, tspContext)) == NULL)
270
return TSPERR(TSS_E_INVALID_HANDLE);
272
context = (struct tr_context_obj *)obj->data;
273
*mode = context->silentMode;
275
obj_list_put(&context_list);
281
obj_context_set_mode(TSS_HCONTEXT tspContext, UINT32 mode)
283
struct tsp_object *obj;
284
struct tr_context_obj *context;
286
if ((obj = obj_list_get_obj(&context_list, tspContext)) == NULL)
287
return TSPERR(TSS_E_INVALID_HANDLE);
289
context = (struct tr_context_obj *)obj->data;
290
context->silentMode = mode;
292
obj_list_put(&context_list);
297
/* search the list of all policies bound to context @tspContext. If
298
* one is found of type popup, return TRUE, else return FALSE. */
300
obj_context_has_popups(TSS_HCONTEXT tspContext)
302
struct tsp_object *obj;
303
struct tr_policy_obj *policy;
304
struct obj_list *list = &policy_list;
305
TSS_BOOL ret = FALSE;
307
pthread_mutex_lock(&list->lock);
309
for (obj = list->head; obj; obj = obj->next) {
310
if (obj->tspContext == tspContext) {
311
policy = (struct tr_policy_obj *)obj->data;
312
if (policy->SecretMode == TSS_SECRET_MODE_POPUP)
318
pthread_mutex_unlock(&list->lock);
323
#ifndef TSS_SPEC_COMPLIANCE
325
obj_context_get_hash_mode(TSS_HCONTEXT tspContext, UINT32 *mode)
327
struct tsp_object *obj;
328
struct tr_context_obj *context;
330
if ((obj = obj_list_get_obj(&context_list, tspContext)) == NULL)
331
return TSPERR(TSS_E_INVALID_HANDLE);
333
context = (struct tr_context_obj *)obj->data;
334
*mode = context->hashMode;
336
obj_list_put(&context_list);
342
obj_context_set_hash_mode(TSS_HCONTEXT tspContext, UINT32 mode)
344
struct tsp_object *obj;
345
struct tr_context_obj *context;
348
case TSS_TSPATTRIB_HASH_MODE_NULL:
349
case TSS_TSPATTRIB_HASH_MODE_NOT_NULL:
352
return TSPERR(TSS_E_INVALID_ATTRIB_DATA);
355
if ((obj = obj_list_get_obj(&context_list, tspContext)) == NULL)
356
return TSPERR(TSS_E_INVALID_HANDLE);
358
context = (struct tr_context_obj *)obj->data;
359
context->hashMode = mode;
361
obj_list_put(&context_list);