|
1 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
2 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
4 |
|
5 #include "ckdbm.h" |
|
6 |
|
7 static void |
|
8 nss_dbm_mdSession_Close |
|
9 ( |
|
10 NSSCKMDSession *mdSession, |
|
11 NSSCKFWSession *fwSession, |
|
12 NSSCKMDToken *mdToken, |
|
13 NSSCKFWToken *fwToken, |
|
14 NSSCKMDInstance *mdInstance, |
|
15 NSSCKFWInstance *fwInstance |
|
16 ) |
|
17 { |
|
18 nss_dbm_session_t *session = (nss_dbm_session_t *)mdSession->etc; |
|
19 |
|
20 struct nss_dbm_dbt_node *w; |
|
21 |
|
22 /* Lock */ |
|
23 { |
|
24 if( CKR_OK != NSSCKFWMutex_Lock(session->list_lock) ) { |
|
25 return; |
|
26 } |
|
27 |
|
28 w = session->session_objects; |
|
29 session->session_objects = (struct nss_dbm_dbt_node *)NULL; /* sanity */ |
|
30 |
|
31 (void)NSSCKFWMutex_Unlock(session->list_lock); |
|
32 } |
|
33 |
|
34 for( ; (struct nss_dbm_dbt_node *)NULL != w; w = w->next ) { |
|
35 (void)nss_dbm_db_delete_object(w->dbt); |
|
36 } |
|
37 } |
|
38 |
|
39 static CK_ULONG |
|
40 nss_dbm_mdSession_GetDeviceError |
|
41 ( |
|
42 NSSCKMDSession *mdSession, |
|
43 NSSCKFWSession *fwSession, |
|
44 NSSCKMDToken *mdToken, |
|
45 NSSCKFWToken *fwToken, |
|
46 NSSCKMDInstance *mdInstance, |
|
47 NSSCKFWInstance *fwInstance |
|
48 ) |
|
49 { |
|
50 nss_dbm_session_t *session = (nss_dbm_session_t *)mdSession->etc; |
|
51 return session->deviceError; |
|
52 } |
|
53 |
|
54 /* Login isn't needed */ |
|
55 /* Logout isn't needed */ |
|
56 /* InitPIN is irrelevant */ |
|
57 /* SetPIN is irrelevant */ |
|
58 /* GetOperationStateLen is irrelevant */ |
|
59 /* GetOperationState is irrelevant */ |
|
60 /* SetOperationState is irrelevant */ |
|
61 |
|
62 static NSSCKMDObject * |
|
63 nss_dbm_mdSession_CreateObject |
|
64 ( |
|
65 NSSCKMDSession *mdSession, |
|
66 NSSCKFWSession *fwSession, |
|
67 NSSCKMDToken *mdToken, |
|
68 NSSCKFWToken *fwToken, |
|
69 NSSCKMDInstance *mdInstance, |
|
70 NSSCKFWInstance *fwInstance, |
|
71 NSSArena *handyArenaPointer, |
|
72 CK_ATTRIBUTE_PTR pTemplate, |
|
73 CK_ULONG ulAttributeCount, |
|
74 CK_RV *pError |
|
75 ) |
|
76 { |
|
77 nss_dbm_session_t *session = (nss_dbm_session_t *)mdSession->etc; |
|
78 nss_dbm_token_t *token = (nss_dbm_token_t *)mdToken->etc; |
|
79 CK_ULONG i; |
|
80 CK_BBOOL isToken = CK_FALSE; /* defaults to false */ |
|
81 NSSCKMDObject *rv; |
|
82 struct nss_dbm_dbt_node *node = (struct nss_dbm_dbt_node *)NULL; |
|
83 nss_dbm_object_t *object; |
|
84 nss_dbm_db_t *which_db; |
|
85 |
|
86 /* This framework should really pass this to me */ |
|
87 for( i = 0; i < ulAttributeCount; i++ ) { |
|
88 if( CKA_TOKEN == pTemplate[i].type ) { |
|
89 isToken = *(CK_BBOOL *)pTemplate[i].pValue; |
|
90 break; |
|
91 } |
|
92 } |
|
93 |
|
94 object = nss_ZNEW(handyArenaPointer, nss_dbm_object_t); |
|
95 if( (nss_dbm_object_t *)NULL == object ) { |
|
96 *pError = CKR_HOST_MEMORY; |
|
97 return (NSSCKMDObject *)NULL; |
|
98 } |
|
99 |
|
100 object->arena = handyArenaPointer; |
|
101 which_db = isToken ? token->slot->token_db : token->session_db; |
|
102 |
|
103 /* Do this before the actual database call; it's easier to recover from */ |
|
104 rv = nss_dbm_mdObject_factory(object, pError); |
|
105 if( (NSSCKMDObject *)NULL == rv ) { |
|
106 return (NSSCKMDObject *)NULL; |
|
107 } |
|
108 |
|
109 if( CK_FALSE == isToken ) { |
|
110 node = nss_ZNEW(session->arena, struct nss_dbm_dbt_node); |
|
111 if( (struct nss_dbm_dbt_node *)NULL == node ) { |
|
112 *pError = CKR_HOST_MEMORY; |
|
113 return (NSSCKMDObject *)NULL; |
|
114 } |
|
115 } |
|
116 |
|
117 object->handle = nss_dbm_db_create_object(handyArenaPointer, which_db, |
|
118 pTemplate, ulAttributeCount, |
|
119 pError, &session->deviceError); |
|
120 if( (nss_dbm_dbt_t *)NULL == object->handle ) { |
|
121 return (NSSCKMDObject *)NULL; |
|
122 } |
|
123 |
|
124 if( CK_FALSE == isToken ) { |
|
125 node->dbt = object->handle; |
|
126 /* Lock */ |
|
127 { |
|
128 *pError = NSSCKFWMutex_Lock(session->list_lock); |
|
129 if( CKR_OK != *pError ) { |
|
130 (void)nss_dbm_db_delete_object(object->handle); |
|
131 return (NSSCKMDObject *)NULL; |
|
132 } |
|
133 |
|
134 node->next = session->session_objects; |
|
135 session->session_objects = node; |
|
136 |
|
137 *pError = NSSCKFWMutex_Unlock(session->list_lock); |
|
138 } |
|
139 } |
|
140 |
|
141 return rv; |
|
142 } |
|
143 |
|
144 /* CopyObject isn't needed; the framework will use CreateObject */ |
|
145 |
|
146 static NSSCKMDFindObjects * |
|
147 nss_dbm_mdSession_FindObjectsInit |
|
148 ( |
|
149 NSSCKMDSession *mdSession, |
|
150 NSSCKFWSession *fwSession, |
|
151 NSSCKMDToken *mdToken, |
|
152 NSSCKFWToken *fwToken, |
|
153 NSSCKMDInstance *mdInstance, |
|
154 NSSCKFWInstance *fwInstance, |
|
155 CK_ATTRIBUTE_PTR pTemplate, |
|
156 CK_ULONG ulAttributeCount, |
|
157 CK_RV *pError |
|
158 ) |
|
159 { |
|
160 nss_dbm_session_t *session = (nss_dbm_session_t *)mdSession->etc; |
|
161 nss_dbm_token_t *token = (nss_dbm_token_t *)mdToken->etc; |
|
162 NSSArena *arena; |
|
163 nss_dbm_find_t *find; |
|
164 NSSCKMDFindObjects *rv; |
|
165 |
|
166 arena = NSSArena_Create(); |
|
167 if( (NSSArena *)NULL == arena ) { |
|
168 *pError = CKR_HOST_MEMORY; |
|
169 goto loser; |
|
170 } |
|
171 |
|
172 find = nss_ZNEW(arena, nss_dbm_find_t); |
|
173 if( (nss_dbm_find_t *)NULL == find ) { |
|
174 *pError = CKR_HOST_MEMORY; |
|
175 goto loser; |
|
176 } |
|
177 |
|
178 find->arena = arena; |
|
179 find->list_lock = NSSCKFWInstance_CreateMutex(fwInstance, arena, pError); |
|
180 if( (NSSCKFWMutex *)NULL == find->list_lock ) { |
|
181 goto loser; |
|
182 } |
|
183 |
|
184 *pError = nss_dbm_db_find_objects(find, token->slot->token_db, pTemplate, |
|
185 ulAttributeCount, &session->deviceError); |
|
186 if( CKR_OK != *pError ) { |
|
187 goto loser; |
|
188 } |
|
189 |
|
190 *pError = nss_dbm_db_find_objects(find, token->session_db, pTemplate, |
|
191 ulAttributeCount, &session->deviceError); |
|
192 if( CKR_OK != *pError ) { |
|
193 goto loser; |
|
194 } |
|
195 |
|
196 rv = nss_dbm_mdFindObjects_factory(find, pError); |
|
197 if( (NSSCKMDFindObjects *)NULL == rv ) { |
|
198 goto loser; |
|
199 } |
|
200 |
|
201 return rv; |
|
202 |
|
203 loser: |
|
204 if( (NSSArena *)NULL != arena ) { |
|
205 (void)NSSArena_Destroy(arena); |
|
206 } |
|
207 |
|
208 return (NSSCKMDFindObjects *)NULL; |
|
209 } |
|
210 |
|
211 /* SeedRandom is irrelevant */ |
|
212 /* GetRandom is irrelevant */ |
|
213 |
|
214 NSS_IMPLEMENT NSSCKMDSession * |
|
215 nss_dbm_mdSession_factory |
|
216 ( |
|
217 nss_dbm_token_t *token, |
|
218 NSSCKFWSession *fwSession, |
|
219 NSSCKFWInstance *fwInstance, |
|
220 CK_BBOOL rw, |
|
221 CK_RV *pError |
|
222 ) |
|
223 { |
|
224 NSSArena *arena; |
|
225 nss_dbm_session_t *session; |
|
226 NSSCKMDSession *rv; |
|
227 |
|
228 arena = NSSCKFWSession_GetArena(fwSession, pError); |
|
229 |
|
230 session = nss_ZNEW(arena, nss_dbm_session_t); |
|
231 if( (nss_dbm_session_t *)NULL == session ) { |
|
232 *pError = CKR_HOST_MEMORY; |
|
233 return (NSSCKMDSession *)NULL; |
|
234 } |
|
235 |
|
236 rv = nss_ZNEW(arena, NSSCKMDSession); |
|
237 if( (NSSCKMDSession *)NULL == rv ) { |
|
238 *pError = CKR_HOST_MEMORY; |
|
239 return (NSSCKMDSession *)NULL; |
|
240 } |
|
241 |
|
242 session->arena = arena; |
|
243 session->token = token; |
|
244 session->list_lock = NSSCKFWInstance_CreateMutex(fwInstance, arena, pError); |
|
245 if( (NSSCKFWMutex *)NULL == session->list_lock ) { |
|
246 return (NSSCKMDSession *)NULL; |
|
247 } |
|
248 |
|
249 rv->etc = (void *)session; |
|
250 rv->Close = nss_dbm_mdSession_Close; |
|
251 rv->GetDeviceError = nss_dbm_mdSession_GetDeviceError; |
|
252 /* Login isn't needed */ |
|
253 /* Logout isn't needed */ |
|
254 /* InitPIN is irrelevant */ |
|
255 /* SetPIN is irrelevant */ |
|
256 /* GetOperationStateLen is irrelevant */ |
|
257 /* GetOperationState is irrelevant */ |
|
258 /* SetOperationState is irrelevant */ |
|
259 rv->CreateObject = nss_dbm_mdSession_CreateObject; |
|
260 /* CopyObject isn't needed; the framework will use CreateObject */ |
|
261 rv->FindObjectsInit = nss_dbm_mdSession_FindObjectsInit; |
|
262 rv->null = NULL; |
|
263 |
|
264 return rv; |
|
265 } |