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