1
2 /*
3 * Licensed Materials - Property of IBM
4 *
5 * trousers - An open source TCG Software Stack
6 *
7 * (C) Copyright International Business Machines Corp. 2006, 2007
8 *
9 */
10
11
12 #include <stdlib.h>
13 #include <stdio.h>
14 #include <errno.h>
15 #include <string.h>
16
17 #include "trousers/tss.h"
18 #include "trousers/trousers.h"
19 #include "trousers_types.h"
20 #include "spi_utils.h"
21 #include "capabilities.h"
22 #include "tsplog.h"
23 #include "obj.h"
24
25 /*
26 * adds a new daa object to the daa list with TSP context tspContext
27 */
28 TSS_RESULT
obj_daa_add(TSS_HCONTEXT tspContext,TSS_HOBJECT * phObject)29 obj_daa_add(TSS_HCONTEXT tspContext, TSS_HOBJECT *phObject)
30 {
31 TSS_RESULT result;
32 struct tr_daa_obj *daa = calloc(1, sizeof(struct tr_daa_obj));
33
34 if (daa == NULL) {
35 LogError("malloc of %d bytes failed.", sizeof(struct tr_daa_obj));
36 return TSPERR(TSS_E_OUTOFMEMORY);
37 }
38
39 if ((result = obj_list_add(&daa_list, tspContext, 0, daa, phObject))) {
40 free(daa);
41 return result;
42 }
43
44 return TSS_SUCCESS;
45 }
46
47 void
daa_free(void * data)48 daa_free(void *data)
49 {
50 struct tr_daa_obj *daa = (struct tr_daa_obj *)data;
51
52 /* free all pointers in the tr_daa_obj object here */
53 free(daa);
54 }
55
56 /*
57 * remove DAA object hObject from the DAA list
58 */
59 TSS_RESULT
obj_daa_remove(TSS_HOBJECT hObject,TSS_HCONTEXT tspContext)60 obj_daa_remove(TSS_HOBJECT hObject, TSS_HCONTEXT tspContext)
61 {
62 TSS_RESULT result;
63
64 if ((result = obj_list_remove(&daa_list, &daa_free, hObject, tspContext)))
65 return result;
66
67 return TSS_SUCCESS;
68 }
69
70 TSS_BOOL
obj_is_daa(TSS_HOBJECT hObject)71 obj_is_daa(TSS_HOBJECT hObject)
72 {
73 TSS_BOOL answer = FALSE;
74
75 if ((obj_list_get_obj(&daa_list, hObject))) {
76 answer = TRUE;
77 obj_list_put(&daa_list);
78 }
79
80 return answer;
81 }
82
83 TSS_RESULT
obj_daa_get_tsp_context(TSS_HDAA hDaa,TSS_HCONTEXT * tspContext)84 obj_daa_get_tsp_context(TSS_HDAA hDaa, TSS_HCONTEXT *tspContext)
85 {
86 struct tsp_object *obj;
87
88 if ((obj = obj_list_get_obj(&daa_list, hDaa)) == NULL)
89 return TSPERR(TSS_E_INVALID_HANDLE);
90
91 *tspContext = obj->tspContext;
92
93 obj_list_put(&daa_list);
94
95 return TSS_SUCCESS;
96 }
97
98 static TSS_RESULT
obj_daa_get_and_lock_data(TSS_HDAA hDaa,struct tr_daa_obj ** daa)99 obj_daa_get_and_lock_data(TSS_HDAA hDaa, struct tr_daa_obj **daa)
100 {
101 struct tsp_object *obj;
102
103 if ((obj = obj_list_get_obj(&daa_list, hDaa)) == NULL)
104 return TSPERR(TSS_E_INVALID_HANDLE);
105 *daa = obj->data;
106 return TSS_SUCCESS;
107 }
108
109 TSS_RESULT
obj_daa_get_handle_tpm(TSS_HDAA hDAA,TPM_HANDLE * hTPM)110 obj_daa_get_handle_tpm(TSS_HDAA hDAA, TPM_HANDLE *hTPM) {
111 struct tr_daa_obj *daa_struct;
112 TSS_RESULT result;
113
114 if( (result = obj_daa_get_and_lock_data( hDAA, &daa_struct)) != TSS_SUCCESS) return result;
115 *hTPM = daa_struct->tpm_handle;
116 obj_list_put(&daa_list);
117 return TSS_SUCCESS;
118 }
119
120 TSS_RESULT
obj_daa_set_handle_tpm(TSS_HDAA hDAA,TPM_HANDLE hTPM)121 obj_daa_set_handle_tpm(TSS_HDAA hDAA, TPM_HANDLE hTPM) {
122 struct tr_daa_obj *daa_struct;
123 TSS_RESULT result;
124
125 if( (result = obj_daa_get_and_lock_data( hDAA, &daa_struct)) != TSS_SUCCESS) return result;
126 daa_struct->tpm_handle = hTPM;
127 obj_list_put(&daa_list);
128 return TSS_SUCCESS;
129 }
130
131 TSS_RESULT
obj_daa_get_session_handle(TSS_HDAA hDAA,UINT32 * session_handle)132 obj_daa_get_session_handle(TSS_HDAA hDAA, UINT32 *session_handle) {
133 struct tr_daa_obj *daa_struct;
134 TSS_RESULT result;
135
136 if( (result = obj_daa_get_and_lock_data( hDAA, &daa_struct)) != TSS_SUCCESS) return result;
137 *session_handle = daa_struct->session_handle;
138 obj_list_put(&daa_list);
139 return TSS_SUCCESS;
140 }
141
142 TSS_RESULT
obj_daa_set_session_handle(TSS_HDAA hDAA,UINT32 session_handle)143 obj_daa_set_session_handle(TSS_HDAA hDAA, UINT32 session_handle) {
144 struct tr_daa_obj *daa_struct;
145 TSS_RESULT result;
146
147 if( (result = obj_daa_get_and_lock_data( hDAA, &daa_struct)) != TSS_SUCCESS) return result;
148 daa_struct->session_handle = session_handle;
149 obj_list_put(&daa_list);
150 return TSS_SUCCESS;
151 }
152