OLD | NEW |
1 /* This Source Code Form is subject to the terms of the Mozilla Public | 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 | 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/. */ | 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
4 | 4 |
5 /* | 5 /* |
6 * object.c | 6 * object.c |
7 * | 7 * |
8 * This file implements the NSSCKFWObject type and methods. | 8 * This file implements the NSSCKFWObject type and methods. |
9 */ | 9 */ |
10 | 10 |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
43 * nssCKFWObject_IsTokenObject | 43 * nssCKFWObject_IsTokenObject |
44 * nssCKFWObject_GetAttributeCount | 44 * nssCKFWObject_GetAttributeCount |
45 * nssCKFWObject_GetAttributeTypes | 45 * nssCKFWObject_GetAttributeTypes |
46 * nssCKFWObject_GetAttributeSize | 46 * nssCKFWObject_GetAttributeSize |
47 * nssCKFWObject_GetAttribute | 47 * nssCKFWObject_GetAttribute |
48 * nssCKFWObject_SetAttribute | 48 * nssCKFWObject_SetAttribute |
49 * nssCKFWObject_GetObjectSize | 49 * nssCKFWObject_GetObjectSize |
50 */ | 50 */ |
51 | 51 |
52 struct NSSCKFWObjectStr { | 52 struct NSSCKFWObjectStr { |
53 NSSCKFWMutex *mutex; /* merely to serialise the MDObject calls */ | 53 NSSCKFWMutex *mutex; /* merely to serialise the MDObject calls */ |
54 NSSArena *arena; | 54 NSSArena *arena; |
55 NSSCKMDObject *mdObject; | 55 NSSCKMDObject *mdObject; |
56 NSSCKMDSession *mdSession; | 56 NSSCKMDSession *mdSession; |
57 NSSCKFWSession *fwSession; | 57 NSSCKFWSession *fwSession; |
58 NSSCKMDToken *mdToken; | 58 NSSCKMDToken *mdToken; |
59 NSSCKFWToken *fwToken; | 59 NSSCKFWToken *fwToken; |
60 NSSCKMDInstance *mdInstance; | 60 NSSCKMDInstance *mdInstance; |
61 NSSCKFWInstance *fwInstance; | 61 NSSCKFWInstance *fwInstance; |
62 CK_OBJECT_HANDLE hObject; | 62 CK_OBJECT_HANDLE hObject; |
63 }; | 63 }; |
64 | 64 |
65 #ifdef DEBUG | 65 #ifdef DEBUG |
66 /* | 66 /* |
67 * But first, the pointer-tracking stuff. | 67 * But first, the pointer-tracking stuff. |
68 * | 68 * |
69 * NOTE: the pointer-tracking support in NSS/base currently relies | 69 * NOTE: the pointer-tracking support in NSS/base currently relies |
70 * upon NSPR's CallOnce support. That, however, relies upon NSPR's | 70 * upon NSPR's CallOnce support. That, however, relies upon NSPR's |
71 * locking, which is tied into the runtime. We need a pointer-tracker | 71 * locking, which is tied into the runtime. We need a pointer-tracker |
72 * implementation that uses the locks supplied through C_Initialize. | 72 * implementation that uses the locks supplied through C_Initialize. |
73 * That support, however, can be filled in later. So for now, I'll | 73 * That support, however, can be filled in later. So for now, I'll |
74 * just do this routines as no-ops. | 74 * just do this routines as no-ops. |
75 */ | 75 */ |
76 | 76 |
77 static CK_RV | 77 static CK_RV |
78 object_add_pointer | 78 object_add_pointer( |
79 ( | 79 const NSSCKFWObject *fwObject) |
80 const NSSCKFWObject *fwObject | |
81 ) | |
82 { | 80 { |
83 return CKR_OK; | 81 return CKR_OK; |
84 } | 82 } |
85 | 83 |
86 static CK_RV | 84 static CK_RV |
87 object_remove_pointer | 85 object_remove_pointer( |
88 ( | 86 const NSSCKFWObject *fwObject) |
89 const NSSCKFWObject *fwObject | |
90 ) | |
91 { | 87 { |
92 return CKR_OK; | 88 return CKR_OK; |
93 } | 89 } |
94 | 90 |
95 NSS_IMPLEMENT CK_RV | 91 NSS_IMPLEMENT CK_RV |
96 nssCKFWObject_verifyPointer | 92 nssCKFWObject_verifyPointer( |
97 ( | 93 const NSSCKFWObject *fwObject) |
98 const NSSCKFWObject *fwObject | |
99 ) | |
100 { | 94 { |
101 return CKR_OK; | 95 return CKR_OK; |
102 } | 96 } |
103 | 97 |
104 #endif /* DEBUG */ | 98 #endif /* DEBUG */ |
105 | 99 |
106 | |
107 /* | 100 /* |
108 * nssCKFWObject_Create | 101 * nssCKFWObject_Create |
109 * | 102 * |
110 */ | 103 */ |
111 NSS_IMPLEMENT NSSCKFWObject * | 104 NSS_IMPLEMENT NSSCKFWObject * |
112 nssCKFWObject_Create | 105 nssCKFWObject_Create( |
113 ( | 106 NSSArena *arena, |
114 NSSArena *arena, | 107 NSSCKMDObject *mdObject, |
115 NSSCKMDObject *mdObject, | 108 NSSCKFWSession *fwSession, |
116 NSSCKFWSession *fwSession, | 109 NSSCKFWToken *fwToken, |
117 NSSCKFWToken *fwToken, | 110 NSSCKFWInstance *fwInstance, |
118 NSSCKFWInstance *fwInstance, | 111 CK_RV *pError) |
119 CK_RV *pError | |
120 ) | |
121 { | 112 { |
122 NSSCKFWObject *fwObject; | 113 NSSCKFWObject *fwObject; |
123 nssCKFWHash *mdObjectHash; | 114 nssCKFWHash *mdObjectHash; |
124 | 115 |
125 #ifdef NSSDEBUG | 116 #ifdef NSSDEBUG |
126 if (!pError) { | 117 if (!pError) { |
127 return (NSSCKFWObject *)NULL; | 118 return (NSSCKFWObject *)NULL; |
128 } | 119 } |
129 | 120 |
130 if( PR_SUCCESS != nssArena_verifyPointer(arena) ) { | 121 if (PR_SUCCESS != nssArena_verifyPointer(arena)) { |
131 *pError = CKR_ARGUMENTS_BAD; | 122 *pError = CKR_ARGUMENTS_BAD; |
132 return (NSSCKFWObject *)NULL; | 123 return (NSSCKFWObject *)NULL; |
133 } | 124 } |
134 #endif /* NSSDEBUG */ | 125 #endif /* NSSDEBUG */ |
135 | 126 |
136 if (!fwToken) { | 127 if (!fwToken) { |
137 *pError = CKR_ARGUMENTS_BAD; | 128 *pError = CKR_ARGUMENTS_BAD; |
138 return (NSSCKFWObject *)NULL; | 129 return (NSSCKFWObject *)NULL; |
139 } | 130 } |
140 mdObjectHash = nssCKFWToken_GetMDObjectHash(fwToken); | 131 mdObjectHash = nssCKFWToken_GetMDObjectHash(fwToken); |
141 if (!mdObjectHash) { | 132 if (!mdObjectHash) { |
142 *pError = CKR_GENERAL_ERROR; | 133 *pError = CKR_GENERAL_ERROR; |
143 return (NSSCKFWObject *)NULL; | 134 return (NSSCKFWObject *)NULL; |
144 } | 135 } |
145 | 136 |
146 if( nssCKFWHash_Exists(mdObjectHash, mdObject) ) { | 137 if (nssCKFWHash_Exists(mdObjectHash, mdObject)) { |
147 fwObject = nssCKFWHash_Lookup(mdObjectHash, mdObject); | 138 fwObject = nssCKFWHash_Lookup(mdObjectHash, mdObject); |
148 return fwObject; | 139 return fwObject; |
149 } | 140 } |
150 | 141 |
151 fwObject = nss_ZNEW(arena, NSSCKFWObject); | 142 fwObject = nss_ZNEW(arena, NSSCKFWObject); |
152 if (!fwObject) { | 143 if (!fwObject) { |
153 *pError = CKR_HOST_MEMORY; | 144 *pError = CKR_HOST_MEMORY; |
154 return (NSSCKFWObject *)NULL; | 145 return (NSSCKFWObject *)NULL; |
155 } | 146 } |
156 | 147 |
157 fwObject->arena = arena; | 148 fwObject->arena = arena; |
158 fwObject->mdObject = mdObject; | 149 fwObject->mdObject = mdObject; |
159 fwObject->fwSession = fwSession; | 150 fwObject->fwSession = fwSession; |
160 | 151 |
161 if (fwSession) { | 152 if (fwSession) { |
162 fwObject->mdSession = nssCKFWSession_GetMDSession(fwSession); | 153 fwObject->mdSession = nssCKFWSession_GetMDSession(fwSession); |
163 } | 154 } |
164 | 155 |
165 fwObject->fwToken = fwToken; | 156 fwObject->fwToken = fwToken; |
166 fwObject->mdToken = nssCKFWToken_GetMDToken(fwToken); | 157 fwObject->mdToken = nssCKFWToken_GetMDToken(fwToken); |
167 fwObject->fwInstance = fwInstance; | 158 fwObject->fwInstance = fwInstance; |
168 fwObject->mdInstance = nssCKFWInstance_GetMDInstance(fwInstance); | 159 fwObject->mdInstance = nssCKFWInstance_GetMDInstance(fwInstance); |
169 fwObject->mutex = nssCKFWInstance_CreateMutex(fwInstance, arena, pError); | 160 fwObject->mutex = nssCKFWInstance_CreateMutex(fwInstance, arena, pError); |
170 if (!fwObject->mutex) { | 161 if (!fwObject->mutex) { |
171 if( CKR_OK == *pError ) { | 162 if (CKR_OK == *pError) { |
172 *pError = CKR_GENERAL_ERROR; | 163 *pError = CKR_GENERAL_ERROR; |
| 164 } |
| 165 nss_ZFreeIf(fwObject); |
| 166 return (NSSCKFWObject *)NULL; |
173 } | 167 } |
174 nss_ZFreeIf(fwObject); | |
175 return (NSSCKFWObject *)NULL; | |
176 } | |
177 | 168 |
178 *pError = nssCKFWHash_Add(mdObjectHash, mdObject, fwObject); | 169 *pError = nssCKFWHash_Add(mdObjectHash, mdObject, fwObject); |
179 if( CKR_OK != *pError ) { | 170 if (CKR_OK != *pError) { |
180 nss_ZFreeIf(fwObject); | 171 nss_ZFreeIf(fwObject); |
181 return (NSSCKFWObject *)NULL; | 172 return (NSSCKFWObject *)NULL; |
182 } | 173 } |
183 | 174 |
184 #ifdef DEBUG | 175 #ifdef DEBUG |
185 *pError = object_add_pointer(fwObject); | 176 *pError = object_add_pointer(fwObject); |
186 if( CKR_OK != *pError ) { | 177 if (CKR_OK != *pError) { |
187 nssCKFWHash_Remove(mdObjectHash, mdObject); | 178 nssCKFWHash_Remove(mdObjectHash, mdObject); |
188 nss_ZFreeIf(fwObject); | 179 nss_ZFreeIf(fwObject); |
189 return (NSSCKFWObject *)NULL; | 180 return (NSSCKFWObject *)NULL; |
190 } | 181 } |
191 #endif /* DEBUG */ | 182 #endif /* DEBUG */ |
192 | 183 |
193 *pError = CKR_OK; | 184 *pError = CKR_OK; |
194 return fwObject; | 185 return fwObject; |
195 } | 186 } |
196 | 187 |
197 /* | 188 /* |
198 * nssCKFWObject_Finalize | 189 * nssCKFWObject_Finalize |
199 * | 190 * |
200 */ | 191 */ |
201 NSS_IMPLEMENT void | 192 NSS_IMPLEMENT void |
202 nssCKFWObject_Finalize | 193 nssCKFWObject_Finalize( |
203 ( | 194 NSSCKFWObject *fwObject, |
204 NSSCKFWObject *fwObject, | 195 PRBool removeFromHash) |
205 PRBool removeFromHash | |
206 ) | |
207 { | 196 { |
208 nssCKFWHash *mdObjectHash; | 197 nssCKFWHash *mdObjectHash; |
209 | 198 |
210 #ifdef NSSDEBUG | 199 #ifdef NSSDEBUG |
211 if( CKR_OK != nssCKFWObject_verifyPointer(fwObject) ) { | 200 if (CKR_OK != nssCKFWObject_verifyPointer(fwObject)) { |
212 return; | 201 return; |
213 } | 202 } |
214 #endif /* NSSDEBUG */ | 203 #endif /* NSSDEBUG */ |
215 | 204 |
216 (void)nssCKFWMutex_Destroy(fwObject->mutex); | 205 (void)nssCKFWMutex_Destroy(fwObject->mutex); |
217 | 206 |
218 if (fwObject->mdObject->Finalize) { | 207 if (fwObject->mdObject->Finalize) { |
219 fwObject->mdObject->Finalize(fwObject->mdObject, fwObject, | 208 fwObject->mdObject->Finalize(fwObject->mdObject, fwObject, |
220 fwObject->mdSession, fwObject->fwSession, fwObject->mdToken, | 209 fwObject->mdSession, fwObject->fwSession, f
wObject->mdToken, |
221 fwObject->fwToken, fwObject->mdInstance, fwObject->fwInstance); | 210 fwObject->fwToken, fwObject->mdInstance, fw
Object->fwInstance); |
222 } | 211 } |
223 | 212 |
224 if (removeFromHash) { | 213 if (removeFromHash) { |
225 mdObjectHash = nssCKFWToken_GetMDObjectHash(fwObject->fwToken); | 214 mdObjectHash = nssCKFWToken_GetMDObjectHash(fwObject->fwToken); |
226 if (mdObjectHash) { | 215 if (mdObjectHash) { |
227 nssCKFWHash_Remove(mdObjectHash, fwObject->mdObject); | 216 nssCKFWHash_Remove(mdObjectHash, fwObject->mdObject); |
| 217 } |
228 } | 218 } |
229 } | |
230 | 219 |
231 if (fwObject->fwSession) { | 220 if (fwObject->fwSession) { |
232 nssCKFWSession_DeregisterSessionObject(fwObject->fwSession, fwObject); | 221 nssCKFWSession_DeregisterSessionObject(fwObject->fwSession, fwObject); |
233 } | 222 } |
234 nss_ZFreeIf(fwObject); | 223 nss_ZFreeIf(fwObject); |
235 | 224 |
236 #ifdef DEBUG | 225 #ifdef DEBUG |
237 (void)object_remove_pointer(fwObject); | 226 (void)object_remove_pointer(fwObject); |
238 #endif /* DEBUG */ | 227 #endif /* DEBUG */ |
239 | 228 |
240 return; | 229 return; |
241 } | 230 } |
242 | 231 |
243 /* | 232 /* |
244 * nssCKFWObject_Destroy | 233 * nssCKFWObject_Destroy |
245 * | 234 * |
246 */ | 235 */ |
247 NSS_IMPLEMENT void | 236 NSS_IMPLEMENT void |
248 nssCKFWObject_Destroy | 237 nssCKFWObject_Destroy( |
249 ( | 238 NSSCKFWObject *fwObject) |
250 NSSCKFWObject *fwObject | |
251 ) | |
252 { | 239 { |
253 nssCKFWHash *mdObjectHash; | 240 nssCKFWHash *mdObjectHash; |
254 | 241 |
255 #ifdef NSSDEBUG | 242 #ifdef NSSDEBUG |
256 if( CKR_OK != nssCKFWObject_verifyPointer(fwObject) ) { | 243 if (CKR_OK != nssCKFWObject_verifyPointer(fwObject)) { |
257 return; | 244 return; |
258 } | 245 } |
259 #endif /* NSSDEBUG */ | 246 #endif /* NSSDEBUG */ |
260 | 247 |
261 (void)nssCKFWMutex_Destroy(fwObject->mutex); | 248 (void)nssCKFWMutex_Destroy(fwObject->mutex); |
262 | 249 |
263 if (fwObject->mdObject->Destroy) { | 250 if (fwObject->mdObject->Destroy) { |
264 fwObject->mdObject->Destroy(fwObject->mdObject, fwObject, | 251 fwObject->mdObject->Destroy(fwObject->mdObject, fwObject, |
265 fwObject->mdSession, fwObject->fwSession, fwObject->mdToken, | 252 fwObject->mdSession, fwObject->fwSession, fw
Object->mdToken, |
266 fwObject->fwToken, fwObject->mdInstance, fwObject->fwInstance); | 253 fwObject->fwToken, fwObject->mdInstance, fwO
bject->fwInstance); |
267 } | 254 } |
268 | 255 |
269 mdObjectHash = nssCKFWToken_GetMDObjectHash(fwObject->fwToken); | 256 mdObjectHash = nssCKFWToken_GetMDObjectHash(fwObject->fwToken); |
270 if (mdObjectHash) { | 257 if (mdObjectHash) { |
271 nssCKFWHash_Remove(mdObjectHash, fwObject->mdObject); | 258 nssCKFWHash_Remove(mdObjectHash, fwObject->mdObject); |
272 } | 259 } |
273 | 260 |
274 if (fwObject->fwSession) { | 261 if (fwObject->fwSession) { |
275 nssCKFWSession_DeregisterSessionObject(fwObject->fwSession, fwObject); | 262 nssCKFWSession_DeregisterSessionObject(fwObject->fwSession, fwObject); |
276 } | 263 } |
277 nss_ZFreeIf(fwObject); | 264 nss_ZFreeIf(fwObject); |
278 | 265 |
279 #ifdef DEBUG | 266 #ifdef DEBUG |
280 (void)object_remove_pointer(fwObject); | 267 (void)object_remove_pointer(fwObject); |
281 #endif /* DEBUG */ | 268 #endif /* DEBUG */ |
282 | 269 |
283 return; | 270 return; |
284 } | 271 } |
285 | 272 |
286 /* | 273 /* |
287 * nssCKFWObject_GetMDObject | 274 * nssCKFWObject_GetMDObject |
288 * | 275 * |
289 */ | 276 */ |
290 NSS_IMPLEMENT NSSCKMDObject * | 277 NSS_IMPLEMENT NSSCKMDObject * |
291 nssCKFWObject_GetMDObject | 278 nssCKFWObject_GetMDObject( |
292 ( | 279 NSSCKFWObject *fwObject) |
293 NSSCKFWObject *fwObject | |
294 ) | |
295 { | 280 { |
296 #ifdef NSSDEBUG | 281 #ifdef NSSDEBUG |
297 if( CKR_OK != nssCKFWObject_verifyPointer(fwObject) ) { | 282 if (CKR_OK != nssCKFWObject_verifyPointer(fwObject)) { |
298 return (NSSCKMDObject *)NULL; | 283 return (NSSCKMDObject *)NULL; |
299 } | 284 } |
300 #endif /* NSSDEBUG */ | 285 #endif /* NSSDEBUG */ |
301 | 286 |
302 return fwObject->mdObject; | 287 return fwObject->mdObject; |
303 } | 288 } |
304 | 289 |
305 /* | 290 /* |
306 * nssCKFWObject_GetArena | 291 * nssCKFWObject_GetArena |
307 * | 292 * |
308 */ | 293 */ |
309 NSS_IMPLEMENT NSSArena * | 294 NSS_IMPLEMENT NSSArena * |
310 nssCKFWObject_GetArena | 295 nssCKFWObject_GetArena( |
311 ( | 296 NSSCKFWObject *fwObject, |
312 NSSCKFWObject *fwObject, | 297 CK_RV *pError) |
313 CK_RV *pError | |
314 ) | |
315 { | 298 { |
316 #ifdef NSSDEBUG | 299 #ifdef NSSDEBUG |
317 if (!pError) { | 300 if (!pError) { |
318 return (NSSArena *)NULL; | 301 return (NSSArena *)NULL; |
319 } | 302 } |
320 | 303 |
321 *pError = nssCKFWObject_verifyPointer(fwObject); | 304 *pError = nssCKFWObject_verifyPointer(fwObject); |
322 if( CKR_OK != *pError ) { | 305 if (CKR_OK != *pError) { |
323 return (NSSArena *)NULL; | 306 return (NSSArena *)NULL; |
324 } | 307 } |
325 #endif /* NSSDEBUG */ | 308 #endif /* NSSDEBUG */ |
326 | 309 |
327 return fwObject->arena; | 310 return fwObject->arena; |
328 } | 311 } |
329 | 312 |
330 /* | 313 /* |
331 * nssCKFWObject_SetHandle | 314 * nssCKFWObject_SetHandle |
332 * | 315 * |
333 */ | 316 */ |
334 NSS_IMPLEMENT CK_RV | 317 NSS_IMPLEMENT CK_RV |
335 nssCKFWObject_SetHandle | 318 nssCKFWObject_SetHandle( |
336 ( | 319 NSSCKFWObject *fwObject, |
337 NSSCKFWObject *fwObject, | 320 CK_OBJECT_HANDLE hObject) |
338 CK_OBJECT_HANDLE hObject | |
339 ) | |
340 { | 321 { |
341 #ifdef NSSDEBUG | 322 #ifdef NSSDEBUG |
342 CK_RV error = CKR_OK; | 323 CK_RV error = CKR_OK; |
343 #endif /* NSSDEBUG */ | 324 #endif /* NSSDEBUG */ |
344 | 325 |
345 #ifdef NSSDEBUG | 326 #ifdef NSSDEBUG |
346 error = nssCKFWObject_verifyPointer(fwObject); | 327 error = nssCKFWObject_verifyPointer(fwObject); |
347 if( CKR_OK != error ) { | 328 if (CKR_OK != error) { |
348 return error; | 329 return error; |
349 } | 330 } |
350 #endif /* NSSDEBUG */ | 331 #endif /* NSSDEBUG */ |
351 | 332 |
352 if( (CK_OBJECT_HANDLE)0 != fwObject->hObject ) { | 333 if ((CK_OBJECT_HANDLE)0 != fwObject->hObject) { |
353 return CKR_GENERAL_ERROR; | 334 return CKR_GENERAL_ERROR; |
354 } | 335 } |
355 | 336 |
356 fwObject->hObject = hObject; | 337 fwObject->hObject = hObject; |
357 | 338 |
358 return CKR_OK; | 339 return CKR_OK; |
359 } | 340 } |
360 | 341 |
361 /* | 342 /* |
362 * nssCKFWObject_GetHandle | 343 * nssCKFWObject_GetHandle |
363 * | 344 * |
364 */ | 345 */ |
365 NSS_IMPLEMENT CK_OBJECT_HANDLE | 346 NSS_IMPLEMENT CK_OBJECT_HANDLE |
366 nssCKFWObject_GetHandle | 347 nssCKFWObject_GetHandle( |
367 ( | 348 NSSCKFWObject *fwObject) |
368 NSSCKFWObject *fwObject | |
369 ) | |
370 { | 349 { |
371 #ifdef NSSDEBUG | 350 #ifdef NSSDEBUG |
372 if( CKR_OK != nssCKFWObject_verifyPointer(fwObject) ) { | 351 if (CKR_OK != nssCKFWObject_verifyPointer(fwObject)) { |
373 return (CK_OBJECT_HANDLE)0; | 352 return (CK_OBJECT_HANDLE)0; |
374 } | 353 } |
375 #endif /* NSSDEBUG */ | 354 #endif /* NSSDEBUG */ |
376 | 355 |
377 return fwObject->hObject; | 356 return fwObject->hObject; |
378 } | 357 } |
379 | 358 |
380 /* | 359 /* |
381 * nssCKFWObject_IsTokenObject | 360 * nssCKFWObject_IsTokenObject |
382 * | 361 * |
383 */ | 362 */ |
384 NSS_IMPLEMENT CK_BBOOL | 363 NSS_IMPLEMENT CK_BBOOL |
385 nssCKFWObject_IsTokenObject | 364 nssCKFWObject_IsTokenObject( |
386 ( | 365 NSSCKFWObject *fwObject) |
387 NSSCKFWObject *fwObject | |
388 ) | |
389 { | 366 { |
390 CK_BBOOL b = CK_FALSE; | 367 CK_BBOOL b = CK_FALSE; |
391 | 368 |
392 #ifdef NSSDEBUG | 369 #ifdef NSSDEBUG |
393 if( CKR_OK != nssCKFWObject_verifyPointer(fwObject) ) { | 370 if (CKR_OK != nssCKFWObject_verifyPointer(fwObject)) { |
394 return CK_FALSE; | 371 return CK_FALSE; |
395 } | 372 } |
396 #endif /* NSSDEBUG */ | 373 #endif /* NSSDEBUG */ |
397 | 374 |
398 if (!fwObject->mdObject->IsTokenObject) { | 375 if (!fwObject->mdObject->IsTokenObject) { |
399 NSSItem item; | 376 NSSItem item; |
400 NSSItem *pItem; | 377 NSSItem *pItem; |
401 CK_RV rv = CKR_OK; | 378 CK_RV rv = CKR_OK; |
402 | 379 |
403 item.data = (void *)&b; | 380 item.data = (void *)&b; |
404 item.size = sizeof(b); | 381 item.size = sizeof(b); |
405 | 382 |
406 pItem = nssCKFWObject_GetAttribute(fwObject, CKA_TOKEN, &item, | 383 pItem = nssCKFWObject_GetAttribute(fwObject, CKA_TOKEN, &item, |
407 (NSSArena *)NULL, &rv); | 384 (NSSArena *)NULL, &rv); |
408 if (!pItem) { | 385 if (!pItem) { |
409 /* Error of some type */ | 386 /* Error of some type */ |
410 b = CK_FALSE; | 387 b = CK_FALSE; |
411 goto done; | 388 goto done; |
| 389 } |
| 390 |
| 391 goto done; |
412 } | 392 } |
413 | 393 |
414 goto done; | 394 b = fwObject->mdObject->IsTokenObject(fwObject->mdObject, fwObject, |
415 } | 395 fwObject->mdSession, fwObject->fwSessi
on, fwObject->mdToken, |
| 396 fwObject->fwToken, fwObject->mdInstanc
e, fwObject->fwInstance); |
416 | 397 |
417 b = fwObject->mdObject->IsTokenObject(fwObject->mdObject, fwObject, | 398 done: |
418 fwObject->mdSession, fwObject->fwSession, fwObject->mdToken, | 399 return b; |
419 fwObject->fwToken, fwObject->mdInstance, fwObject->fwInstance); | |
420 | |
421 done: | |
422 return b; | |
423 } | 400 } |
424 | 401 |
425 /* | 402 /* |
426 * nssCKFWObject_GetAttributeCount | 403 * nssCKFWObject_GetAttributeCount |
427 * | 404 * |
428 */ | 405 */ |
429 NSS_IMPLEMENT CK_ULONG | 406 NSS_IMPLEMENT CK_ULONG |
430 nssCKFWObject_GetAttributeCount | 407 nssCKFWObject_GetAttributeCount( |
431 ( | 408 NSSCKFWObject *fwObject, |
432 NSSCKFWObject *fwObject, | 409 CK_RV *pError) |
433 CK_RV *pError | |
434 ) | |
435 { | 410 { |
436 CK_ULONG rv; | 411 CK_ULONG rv; |
437 | 412 |
438 #ifdef NSSDEBUG | 413 #ifdef NSSDEBUG |
439 if (!pError) { | 414 if (!pError) { |
440 return (CK_ULONG)0; | 415 return (CK_ULONG)0; |
441 } | 416 } |
442 | 417 |
443 *pError = nssCKFWObject_verifyPointer(fwObject); | 418 *pError = nssCKFWObject_verifyPointer(fwObject); |
444 if( CKR_OK != *pError ) { | 419 if (CKR_OK != *pError) { |
445 return (CK_ULONG)0; | 420 return (CK_ULONG)0; |
446 } | 421 } |
447 #endif /* NSSDEBUG */ | 422 #endif /* NSSDEBUG */ |
448 | 423 |
449 if (!fwObject->mdObject->GetAttributeCount) { | 424 if (!fwObject->mdObject->GetAttributeCount) { |
450 *pError = CKR_GENERAL_ERROR; | 425 *pError = CKR_GENERAL_ERROR; |
451 return (CK_ULONG)0; | 426 return (CK_ULONG)0; |
452 } | 427 } |
453 | 428 |
454 *pError = nssCKFWMutex_Lock(fwObject->mutex); | 429 *pError = nssCKFWMutex_Lock(fwObject->mutex); |
455 if( CKR_OK != *pError ) { | 430 if (CKR_OK != *pError) { |
456 return (CK_ULONG)0; | 431 return (CK_ULONG)0; |
457 } | 432 } |
458 | 433 |
459 rv = fwObject->mdObject->GetAttributeCount(fwObject->mdObject, fwObject, | 434 rv = fwObject->mdObject->GetAttributeCount(fwObject->mdObject, fwObject, |
460 fwObject->mdSession, fwObject->fwSession, fwObject->mdToken, | 435 fwObject->mdSession, fwObject->fw
Session, fwObject->mdToken, |
461 fwObject->fwToken, fwObject->mdInstance, fwObject->fwInstance, | 436 fwObject->fwToken, fwObject->mdIn
stance, fwObject->fwInstance, |
462 pError); | 437 pError); |
463 | 438 |
464 (void)nssCKFWMutex_Unlock(fwObject->mutex); | 439 (void)nssCKFWMutex_Unlock(fwObject->mutex); |
465 return rv; | 440 return rv; |
466 } | 441 } |
467 | 442 |
468 /* | 443 /* |
469 * nssCKFWObject_GetAttributeTypes | 444 * nssCKFWObject_GetAttributeTypes |
470 * | 445 * |
471 */ | 446 */ |
472 NSS_IMPLEMENT CK_RV | 447 NSS_IMPLEMENT CK_RV |
473 nssCKFWObject_GetAttributeTypes | 448 nssCKFWObject_GetAttributeTypes( |
474 ( | 449 NSSCKFWObject *fwObject, |
475 NSSCKFWObject *fwObject, | 450 CK_ATTRIBUTE_TYPE_PTR typeArray, |
476 CK_ATTRIBUTE_TYPE_PTR typeArray, | 451 CK_ULONG ulCount) |
477 CK_ULONG ulCount | |
478 ) | |
479 { | 452 { |
480 CK_RV error = CKR_OK; | 453 CK_RV error = CKR_OK; |
481 | 454 |
482 #ifdef NSSDEBUG | 455 #ifdef NSSDEBUG |
483 error = nssCKFWObject_verifyPointer(fwObject); | 456 error = nssCKFWObject_verifyPointer(fwObject); |
484 if( CKR_OK != error ) { | 457 if (CKR_OK != error) { |
485 return error; | 458 return error; |
486 } | 459 } |
487 | 460 |
488 if( (CK_ATTRIBUTE_TYPE_PTR)NULL == typeArray ) { | 461 if ((CK_ATTRIBUTE_TYPE_PTR)NULL == typeArray) { |
489 return CKR_ARGUMENTS_BAD; | 462 return CKR_ARGUMENTS_BAD; |
490 } | 463 } |
491 #endif /* NSSDEBUG */ | 464 #endif /* NSSDEBUG */ |
492 | 465 |
493 if (!fwObject->mdObject->GetAttributeTypes) { | 466 if (!fwObject->mdObject->GetAttributeTypes) { |
494 return CKR_GENERAL_ERROR; | 467 return CKR_GENERAL_ERROR; |
495 } | 468 } |
496 | 469 |
497 error = nssCKFWMutex_Lock(fwObject->mutex); | 470 error = nssCKFWMutex_Lock(fwObject->mutex); |
498 if( CKR_OK != error ) { | 471 if (CKR_OK != error) { |
| 472 return error; |
| 473 } |
| 474 |
| 475 error = fwObject->mdObject->GetAttributeTypes(fwObject->mdObject, fwObject, |
| 476 fwObject->mdSession, fwObject-
>fwSession, fwObject->mdToken, |
| 477 fwObject->fwToken, fwObject->m
dInstance, fwObject->fwInstance, |
| 478 typeArray, ulCount); |
| 479 |
| 480 (void)nssCKFWMutex_Unlock(fwObject->mutex); |
499 return error; | 481 return error; |
500 } | |
501 | |
502 error = fwObject->mdObject->GetAttributeTypes(fwObject->mdObject, fwObject, | |
503 fwObject->mdSession, fwObject->fwSession, fwObject->mdToken, | |
504 fwObject->fwToken, fwObject->mdInstance, fwObject->fwInstance, | |
505 typeArray, ulCount); | |
506 | |
507 (void)nssCKFWMutex_Unlock(fwObject->mutex); | |
508 return error; | |
509 } | 482 } |
510 | 483 |
511 /* | 484 /* |
512 * nssCKFWObject_GetAttributeSize | 485 * nssCKFWObject_GetAttributeSize |
513 * | 486 * |
514 */ | 487 */ |
515 NSS_IMPLEMENT CK_ULONG | 488 NSS_IMPLEMENT CK_ULONG |
516 nssCKFWObject_GetAttributeSize | 489 nssCKFWObject_GetAttributeSize( |
517 ( | 490 NSSCKFWObject *fwObject, |
518 NSSCKFWObject *fwObject, | 491 CK_ATTRIBUTE_TYPE attribute, |
519 CK_ATTRIBUTE_TYPE attribute, | 492 CK_RV *pError) |
520 CK_RV *pError | |
521 ) | |
522 { | 493 { |
523 CK_ULONG rv; | 494 CK_ULONG rv; |
524 | 495 |
525 #ifdef NSSDEBUG | 496 #ifdef NSSDEBUG |
526 if (!pError) { | 497 if (!pError) { |
527 return (CK_ULONG)0; | 498 return (CK_ULONG)0; |
528 } | 499 } |
529 | 500 |
530 *pError = nssCKFWObject_verifyPointer(fwObject); | 501 *pError = nssCKFWObject_verifyPointer(fwObject); |
531 if( CKR_OK != *pError ) { | 502 if (CKR_OK != *pError) { |
532 return (CK_ULONG)0; | 503 return (CK_ULONG)0; |
533 } | 504 } |
534 #endif /* NSSDEBUG */ | 505 #endif /* NSSDEBUG */ |
535 | 506 |
536 if (!fwObject->mdObject->GetAttributeSize) { | 507 if (!fwObject->mdObject->GetAttributeSize) { |
537 *pError = CKR_GENERAL_ERROR; | 508 *pError = CKR_GENERAL_ERROR; |
538 return (CK_ULONG )0; | 509 return (CK_ULONG)0; |
539 } | 510 } |
540 | 511 |
541 *pError = nssCKFWMutex_Lock(fwObject->mutex); | 512 *pError = nssCKFWMutex_Lock(fwObject->mutex); |
542 if( CKR_OK != *pError ) { | 513 if (CKR_OK != *pError) { |
543 return (CK_ULONG)0; | 514 return (CK_ULONG)0; |
544 } | 515 } |
545 | 516 |
546 rv = fwObject->mdObject->GetAttributeSize(fwObject->mdObject, fwObject, | 517 rv = fwObject->mdObject->GetAttributeSize(fwObject->mdObject, fwObject, |
547 fwObject->mdSession, fwObject->fwSession, fwObject->mdToken, | 518 fwObject->mdSession, fwObject->fwS
ession, fwObject->mdToken, |
548 fwObject->fwToken, fwObject->mdInstance, fwObject->fwInstance, | 519 fwObject->fwToken, fwObject->mdIns
tance, fwObject->fwInstance, |
549 attribute, pError); | 520 attribute, pError); |
550 | 521 |
551 (void)nssCKFWMutex_Unlock(fwObject->mutex); | 522 (void)nssCKFWMutex_Unlock(fwObject->mutex); |
552 return rv; | 523 return rv; |
553 } | 524 } |
554 | 525 |
555 /* | 526 /* |
556 * nssCKFWObject_GetAttribute | 527 * nssCKFWObject_GetAttribute |
557 * | 528 * |
558 * Usual NSS allocation rules: | 529 * Usual NSS allocation rules: |
559 * If itemOpt is not NULL, it will be returned; otherwise an NSSItem | 530 * If itemOpt is not NULL, it will be returned; otherwise an NSSItem |
560 * will be allocated. If itemOpt is not NULL but itemOpt->data is, | 531 * will be allocated. If itemOpt is not NULL but itemOpt->data is, |
561 * the buffer will be allocated; otherwise, the buffer will be used. | 532 * the buffer will be allocated; otherwise, the buffer will be used. |
562 * Any allocations will come from the optional arena, if one is | 533 * Any allocations will come from the optional arena, if one is |
563 * specified. | 534 * specified. |
564 */ | 535 */ |
565 NSS_IMPLEMENT NSSItem * | 536 NSS_IMPLEMENT NSSItem * |
566 nssCKFWObject_GetAttribute | 537 nssCKFWObject_GetAttribute( |
567 ( | 538 NSSCKFWObject *fwObject, |
568 NSSCKFWObject *fwObject, | 539 CK_ATTRIBUTE_TYPE attribute, |
569 CK_ATTRIBUTE_TYPE attribute, | 540 NSSItem *itemOpt, |
570 NSSItem *itemOpt, | 541 NSSArena *arenaOpt, |
571 NSSArena *arenaOpt, | 542 CK_RV *pError) |
572 CK_RV *pError | |
573 ) | |
574 { | 543 { |
575 NSSItem *rv = (NSSItem *)NULL; | 544 NSSItem *rv = (NSSItem *)NULL; |
576 NSSCKFWItem mdItem; | 545 NSSCKFWItem mdItem; |
577 | 546 |
578 #ifdef NSSDEBUG | 547 #ifdef NSSDEBUG |
579 if (!pError) { | 548 if (!pError) { |
580 return (NSSItem *)NULL; | 549 return (NSSItem *)NULL; |
581 } | 550 } |
582 | 551 |
583 *pError = nssCKFWObject_verifyPointer(fwObject); | 552 *pError = nssCKFWObject_verifyPointer(fwObject); |
584 if( CKR_OK != *pError ) { | 553 if (CKR_OK != *pError) { |
585 return (NSSItem *)NULL; | 554 return (NSSItem *)NULL; |
586 } | 555 } |
587 #endif /* NSSDEBUG */ | 556 #endif /* NSSDEBUG */ |
588 | 557 |
589 if (!fwObject->mdObject->GetAttribute) { | 558 if (!fwObject->mdObject->GetAttribute) { |
590 *pError = CKR_GENERAL_ERROR; | 559 *pError = CKR_GENERAL_ERROR; |
591 return (NSSItem *)NULL; | 560 return (NSSItem *)NULL; |
592 } | |
593 | |
594 *pError = nssCKFWMutex_Lock(fwObject->mutex); | |
595 if( CKR_OK != *pError ) { | |
596 return (NSSItem *)NULL; | |
597 } | |
598 | |
599 mdItem = fwObject->mdObject->GetAttribute(fwObject->mdObject, fwObject, | |
600 fwObject->mdSession, fwObject->fwSession, fwObject->mdToken, | |
601 fwObject->fwToken, fwObject->mdInstance, fwObject->fwInstance, | |
602 attribute, pError); | |
603 | |
604 if (!mdItem.item) { | |
605 if( CKR_OK == *pError ) { | |
606 *pError = CKR_GENERAL_ERROR; | |
607 } | 561 } |
608 | 562 |
609 goto done; | 563 *pError = nssCKFWMutex_Lock(fwObject->mutex); |
610 } | 564 if (CKR_OK != *pError) { |
| 565 return (NSSItem *)NULL; |
| 566 } |
611 | 567 |
612 if (!itemOpt) { | 568 mdItem = fwObject->mdObject->GetAttribute(fwObject->mdObject, fwObject, |
613 rv = nss_ZNEW(arenaOpt, NSSItem); | 569 fwObject->mdSession, fwObject->fwS
ession, fwObject->mdToken, |
614 if (!rv) { | 570 fwObject->fwToken, fwObject->mdIns
tance, fwObject->fwInstance, |
615 *pError = CKR_HOST_MEMORY; | 571 attribute, pError); |
616 goto done; | 572 |
| 573 if (!mdItem.item) { |
| 574 if (CKR_OK == *pError) { |
| 575 *pError = CKR_GENERAL_ERROR; |
| 576 } |
| 577 |
| 578 goto done; |
617 } | 579 } |
618 } else { | |
619 rv = itemOpt; | |
620 } | |
621 | 580 |
622 if (!rv->data) { | 581 if (!itemOpt) { |
623 rv->size = mdItem.item->size; | 582 rv = nss_ZNEW(arenaOpt, NSSItem); |
624 rv->data = nss_ZAlloc(arenaOpt, rv->size); | 583 if (!rv) { |
| 584 *pError = CKR_HOST_MEMORY; |
| 585 goto done; |
| 586 } |
| 587 } else { |
| 588 rv = itemOpt; |
| 589 } |
| 590 |
625 if (!rv->data) { | 591 if (!rv->data) { |
626 *pError = CKR_HOST_MEMORY; | 592 rv->size = mdItem.item->size; |
627 if (!itemOpt) { | 593 rv->data = nss_ZAlloc(arenaOpt, rv->size); |
628 nss_ZFreeIf(rv); | 594 if (!rv->data) { |
629 } | 595 *pError = CKR_HOST_MEMORY; |
630 rv = (NSSItem *)NULL; | 596 if (!itemOpt) { |
631 goto done; | 597 nss_ZFreeIf(rv); |
| 598 } |
| 599 rv = (NSSItem *)NULL; |
| 600 goto done; |
| 601 } |
| 602 } else { |
| 603 if (rv->size >= mdItem.item->size) { |
| 604 rv->size = mdItem.item->size; |
| 605 } else { |
| 606 *pError = CKR_BUFFER_TOO_SMALL; |
| 607 /* Should we set rv->size to mdItem->size? */ |
| 608 /* rv can't have been allocated */ |
| 609 rv = (NSSItem *)NULL; |
| 610 goto done; |
| 611 } |
632 } | 612 } |
633 } else { | 613 |
634 if( rv->size >= mdItem.item->size ) { | 614 (void)nsslibc_memcpy(rv->data, mdItem.item->data, rv->size); |
635 rv->size = mdItem.item->size; | 615 |
636 } else { | 616 if (PR_TRUE == mdItem.needsFreeing) { |
637 *pError = CKR_BUFFER_TOO_SMALL; | 617 PR_ASSERT(fwObject->mdObject->FreeAttribute); |
638 /* Should we set rv->size to mdItem->size? */ | 618 if (fwObject->mdObject->FreeAttribute) { |
639 /* rv can't have been allocated */ | 619 *pError = fwObject->mdObject->FreeAttribute(&mdItem); |
640 rv = (NSSItem *)NULL; | 620 } |
641 goto done; | |
642 } | 621 } |
643 } | |
644 | 622 |
645 (void)nsslibc_memcpy(rv->data, mdItem.item->data, rv->size); | 623 done: |
646 | 624 (void)nssCKFWMutex_Unlock(fwObject->mutex); |
647 if (PR_TRUE == mdItem.needsFreeing) { | 625 return rv; |
648 PR_ASSERT(fwObject->mdObject->FreeAttribute); | |
649 if (fwObject->mdObject->FreeAttribute) { | |
650 *pError = fwObject->mdObject->FreeAttribute(&mdItem); | |
651 } | |
652 } | |
653 | |
654 done: | |
655 (void)nssCKFWMutex_Unlock(fwObject->mutex); | |
656 return rv; | |
657 } | 626 } |
658 | 627 |
659 /* | 628 /* |
660 * nssCKFWObject_SetAttribute | 629 * nssCKFWObject_SetAttribute |
661 * | 630 * |
662 */ | 631 */ |
663 NSS_IMPLEMENT CK_RV | 632 NSS_IMPLEMENT CK_RV |
664 nssCKFWObject_SetAttribute | 633 nssCKFWObject_SetAttribute( |
665 ( | 634 NSSCKFWObject *fwObject, |
666 NSSCKFWObject *fwObject, | 635 NSSCKFWSession *fwSession, |
667 NSSCKFWSession *fwSession, | 636 CK_ATTRIBUTE_TYPE attribute, |
668 CK_ATTRIBUTE_TYPE attribute, | 637 NSSItem *value) |
669 NSSItem *value | |
670 ) | |
671 { | 638 { |
672 CK_RV error = CKR_OK; | 639 CK_RV error = CKR_OK; |
673 | 640 |
674 #ifdef NSSDEBUG | 641 #ifdef NSSDEBUG |
675 error = nssCKFWObject_verifyPointer(fwObject); | 642 error = nssCKFWObject_verifyPointer(fwObject); |
676 if( CKR_OK != error ) { | 643 if (CKR_OK != error) { |
677 return error; | 644 return error; |
678 } | 645 } |
679 #endif /* NSSDEBUG */ | 646 #endif /* NSSDEBUG */ |
680 | 647 |
681 if( CKA_TOKEN == attribute ) { | 648 if (CKA_TOKEN == attribute) { |
682 /* | 649 /* |
683 * We're changing from a session object to a token object or | 650 * We're changing from a session object to a token object or |
684 * vice-versa. | 651 * vice-versa. |
685 */ | 652 */ |
686 | 653 |
687 CK_ATTRIBUTE a; | 654 CK_ATTRIBUTE a; |
688 NSSCKFWObject *newFwObject; | 655 NSSCKFWObject *newFwObject; |
689 NSSCKFWObject swab; | 656 NSSCKFWObject swab; |
690 | 657 |
691 a.type = CKA_TOKEN; | 658 a.type = CKA_TOKEN; |
692 a.pValue = value->data; | 659 a.pValue = value->data; |
693 a.ulValueLen = value->size; | 660 a.ulValueLen = value->size; |
694 | 661 |
695 newFwObject = nssCKFWSession_CopyObject(fwSession, fwObject, | 662 newFwObject = nssCKFWSession_CopyObject(fwSession, fwObject, |
696 &a, 1, &error); | 663 &a, 1, &error); |
697 if (!newFwObject) { | 664 if (!newFwObject) { |
698 if( CKR_OK == error ) { | 665 if (CKR_OK == error) { |
699 error = CKR_GENERAL_ERROR; | 666 error = CKR_GENERAL_ERROR; |
700 } | 667 } |
701 return error; | 668 return error; |
| 669 } |
| 670 |
| 671 /* |
| 672 * Actually, I bet the locking is worse than this.. this part of |
| 673 * the code could probably use some scrutiny and reworking. |
| 674 */ |
| 675 error = nssCKFWMutex_Lock(fwObject->mutex); |
| 676 if (CKR_OK != error) { |
| 677 nssCKFWObject_Destroy(newFwObject); |
| 678 return error; |
| 679 } |
| 680 |
| 681 error = nssCKFWMutex_Lock(newFwObject->mutex); |
| 682 if (CKR_OK != error) { |
| 683 nssCKFWMutex_Unlock(fwObject->mutex); |
| 684 nssCKFWObject_Destroy(newFwObject); |
| 685 return error; |
| 686 } |
| 687 |
| 688 /* |
| 689 * Now, we have our new object, but it has a new fwObject pointer, |
| 690 * while we have to keep the existing one. So quick swap the contents. |
| 691 */ |
| 692 swab = *fwObject; |
| 693 *fwObject = *newFwObject; |
| 694 *newFwObject = swab; |
| 695 |
| 696 /* But keep the mutexes the same */ |
| 697 swab.mutex = fwObject->mutex; |
| 698 fwObject->mutex = newFwObject->mutex; |
| 699 newFwObject->mutex = swab.mutex; |
| 700 |
| 701 (void)nssCKFWMutex_Unlock(newFwObject->mutex); |
| 702 (void)nssCKFWMutex_Unlock(fwObject->mutex); |
| 703 |
| 704 /* |
| 705 * Either remove or add this to the list of session objects |
| 706 */ |
| 707 |
| 708 if (CK_FALSE == *(CK_BBOOL *)value->data) { |
| 709 /* |
| 710 * New one is a session object, except since we "stole" the fwObject
, it's |
| 711 * not in the list. Add it. |
| 712 */ |
| 713 nssCKFWSession_RegisterSessionObject(fwSession, fwObject); |
| 714 } else { |
| 715 /* |
| 716 * New one is a token object, except since we "stole" the fwObject,
it's |
| 717 * in the list. Remove it. |
| 718 */ |
| 719 if (fwObject->fwSession) { |
| 720 nssCKFWSession_DeregisterSessionObject(fwObject->fwSession, fwOb
ject); |
| 721 } |
| 722 } |
| 723 |
| 724 /* |
| 725 * Now delete the old object. Remember the names have changed. |
| 726 */ |
| 727 nssCKFWObject_Destroy(newFwObject); |
| 728 |
| 729 return CKR_OK; |
| 730 } else { |
| 731 /* |
| 732 * An "ordinary" change. |
| 733 */ |
| 734 if (!fwObject->mdObject->SetAttribute) { |
| 735 /* We could fake it with copying, like above.. later */ |
| 736 return CKR_ATTRIBUTE_READ_ONLY; |
| 737 } |
| 738 |
| 739 error = nssCKFWMutex_Lock(fwObject->mutex); |
| 740 if (CKR_OK != error) { |
| 741 return error; |
| 742 } |
| 743 |
| 744 error = fwObject->mdObject->SetAttribute(fwObject->mdObject, fwObject, |
| 745 fwObject->mdSession, fwObject->
fwSession, fwObject->mdToken, |
| 746 fwObject->fwToken, fwObject->md
Instance, fwObject->fwInstance, |
| 747 attribute, value); |
| 748 |
| 749 (void)nssCKFWMutex_Unlock(fwObject->mutex); |
| 750 |
| 751 return error; |
702 } | 752 } |
703 | |
704 /* | |
705 * Actually, I bet the locking is worse than this.. this part of | |
706 * the code could probably use some scrutiny and reworking. | |
707 */ | |
708 error = nssCKFWMutex_Lock(fwObject->mutex); | |
709 if( CKR_OK != error ) { | |
710 nssCKFWObject_Destroy(newFwObject); | |
711 return error; | |
712 } | |
713 | |
714 error = nssCKFWMutex_Lock(newFwObject->mutex); | |
715 if( CKR_OK != error ) { | |
716 nssCKFWMutex_Unlock(fwObject->mutex); | |
717 nssCKFWObject_Destroy(newFwObject); | |
718 return error; | |
719 } | |
720 | |
721 /* | |
722 * Now, we have our new object, but it has a new fwObject pointer, | |
723 * while we have to keep the existing one. So quick swap the contents. | |
724 */ | |
725 swab = *fwObject; | |
726 *fwObject = *newFwObject; | |
727 *newFwObject = swab; | |
728 | |
729 /* But keep the mutexes the same */ | |
730 swab.mutex = fwObject->mutex; | |
731 fwObject->mutex = newFwObject->mutex; | |
732 newFwObject->mutex = swab.mutex; | |
733 | |
734 (void)nssCKFWMutex_Unlock(newFwObject->mutex); | |
735 (void)nssCKFWMutex_Unlock(fwObject->mutex); | |
736 | |
737 /* | |
738 * Either remove or add this to the list of session objects | |
739 */ | |
740 | |
741 if( CK_FALSE == *(CK_BBOOL *)value->data ) { | |
742 /* | |
743 * New one is a session object, except since we "stole" the fwObject, it's | |
744 * not in the list. Add it. | |
745 */ | |
746 nssCKFWSession_RegisterSessionObject(fwSession, fwObject); | |
747 } else { | |
748 /* | |
749 * New one is a token object, except since we "stole" the fwObject, it's | |
750 * in the list. Remove it. | |
751 */ | |
752 if (fwObject->fwSession) { | |
753 nssCKFWSession_DeregisterSessionObject(fwObject->fwSession, fwObject); | |
754 } | |
755 } | |
756 | |
757 /* | |
758 * Now delete the old object. Remember the names have changed. | |
759 */ | |
760 nssCKFWObject_Destroy(newFwObject); | |
761 | |
762 return CKR_OK; | |
763 } else { | |
764 /* | |
765 * An "ordinary" change. | |
766 */ | |
767 if (!fwObject->mdObject->SetAttribute) { | |
768 /* We could fake it with copying, like above.. later */ | |
769 return CKR_ATTRIBUTE_READ_ONLY; | |
770 } | |
771 | |
772 error = nssCKFWMutex_Lock(fwObject->mutex); | |
773 if( CKR_OK != error ) { | |
774 return error; | |
775 } | |
776 | |
777 error = fwObject->mdObject->SetAttribute(fwObject->mdObject, fwObject, | |
778 fwObject->mdSession, fwObject->fwSession, fwObject->mdToken, | |
779 fwObject->fwToken, fwObject->mdInstance, fwObject->fwInstance, | |
780 attribute, value); | |
781 | |
782 (void)nssCKFWMutex_Unlock(fwObject->mutex); | |
783 | |
784 return error; | |
785 } | |
786 } | 753 } |
787 | 754 |
788 /* | 755 /* |
789 * nssCKFWObject_GetObjectSize | 756 * nssCKFWObject_GetObjectSize |
790 * | 757 * |
791 */ | 758 */ |
792 NSS_IMPLEMENT CK_ULONG | 759 NSS_IMPLEMENT CK_ULONG |
793 nssCKFWObject_GetObjectSize | 760 nssCKFWObject_GetObjectSize( |
794 ( | 761 NSSCKFWObject *fwObject, |
795 NSSCKFWObject *fwObject, | 762 CK_RV *pError) |
796 CK_RV *pError | |
797 ) | |
798 { | 763 { |
799 CK_ULONG rv; | 764 CK_ULONG rv; |
800 | 765 |
801 #ifdef NSSDEBUG | 766 #ifdef NSSDEBUG |
802 if (!pError) { | 767 if (!pError) { |
803 return (CK_ULONG)0; | 768 return (CK_ULONG)0; |
804 } | 769 } |
805 | 770 |
806 *pError = nssCKFWObject_verifyPointer(fwObject); | 771 *pError = nssCKFWObject_verifyPointer(fwObject); |
807 if( CKR_OK != *pError ) { | 772 if (CKR_OK != *pError) { |
808 return (CK_ULONG)0; | 773 return (CK_ULONG)0; |
809 } | 774 } |
810 #endif /* NSSDEBUG */ | 775 #endif /* NSSDEBUG */ |
811 | 776 |
812 if (!fwObject->mdObject->GetObjectSize) { | 777 if (!fwObject->mdObject->GetObjectSize) { |
813 *pError = CKR_INFORMATION_SENSITIVE; | 778 *pError = CKR_INFORMATION_SENSITIVE; |
814 return (CK_ULONG)0; | 779 return (CK_ULONG)0; |
815 } | 780 } |
816 | 781 |
817 *pError = nssCKFWMutex_Lock(fwObject->mutex); | 782 *pError = nssCKFWMutex_Lock(fwObject->mutex); |
818 if( CKR_OK != *pError ) { | 783 if (CKR_OK != *pError) { |
819 return (CK_ULONG)0; | 784 return (CK_ULONG)0; |
820 } | 785 } |
821 | 786 |
822 rv = fwObject->mdObject->GetObjectSize(fwObject->mdObject, fwObject, | 787 rv = fwObject->mdObject->GetObjectSize(fwObject->mdObject, fwObject, |
823 fwObject->mdSession, fwObject->fwSession, fwObject->mdToken, | 788 fwObject->mdSession, fwObject->fwSess
ion, fwObject->mdToken, |
824 fwObject->fwToken, fwObject->mdInstance, fwObject->fwInstance, | 789 fwObject->fwToken, fwObject->mdInstan
ce, fwObject->fwInstance, |
825 pError); | 790 pError); |
826 | 791 |
827 (void)nssCKFWMutex_Unlock(fwObject->mutex); | 792 (void)nssCKFWMutex_Unlock(fwObject->mutex); |
828 return rv; | 793 return rv; |
829 } | 794 } |
830 | 795 |
831 /* | 796 /* |
832 * NSSCKFWObject_GetMDObject | 797 * NSSCKFWObject_GetMDObject |
833 * | 798 * |
834 */ | 799 */ |
835 NSS_IMPLEMENT NSSCKMDObject * | 800 NSS_IMPLEMENT NSSCKMDObject * |
836 NSSCKFWObject_GetMDObject | 801 NSSCKFWObject_GetMDObject( |
837 ( | 802 NSSCKFWObject *fwObject) |
838 NSSCKFWObject *fwObject | |
839 ) | |
840 { | 803 { |
841 #ifdef DEBUG | 804 #ifdef DEBUG |
842 if( CKR_OK != nssCKFWObject_verifyPointer(fwObject) ) { | 805 if (CKR_OK != nssCKFWObject_verifyPointer(fwObject)) { |
843 return (NSSCKMDObject *)NULL; | 806 return (NSSCKMDObject *)NULL; |
844 } | 807 } |
845 #endif /* DEBUG */ | 808 #endif /* DEBUG */ |
846 | 809 |
847 return nssCKFWObject_GetMDObject(fwObject); | 810 return nssCKFWObject_GetMDObject(fwObject); |
848 } | 811 } |
849 | 812 |
850 /* | 813 /* |
851 * NSSCKFWObject_GetArena | 814 * NSSCKFWObject_GetArena |
852 * | 815 * |
853 */ | 816 */ |
854 NSS_IMPLEMENT NSSArena * | 817 NSS_IMPLEMENT NSSArena * |
855 NSSCKFWObject_GetArena | 818 NSSCKFWObject_GetArena( |
856 ( | 819 NSSCKFWObject *fwObject, |
857 NSSCKFWObject *fwObject, | 820 CK_RV *pError) |
858 CK_RV *pError | |
859 ) | |
860 { | 821 { |
861 #ifdef DEBUG | 822 #ifdef DEBUG |
862 if (!pError) { | 823 if (!pError) { |
863 return (NSSArena *)NULL; | 824 return (NSSArena *)NULL; |
864 } | 825 } |
865 | 826 |
866 *pError = nssCKFWObject_verifyPointer(fwObject); | 827 *pError = nssCKFWObject_verifyPointer(fwObject); |
867 if( CKR_OK != *pError ) { | 828 if (CKR_OK != *pError) { |
868 return (NSSArena *)NULL; | 829 return (NSSArena *)NULL; |
869 } | 830 } |
870 #endif /* DEBUG */ | 831 #endif /* DEBUG */ |
871 | 832 |
872 return nssCKFWObject_GetArena(fwObject, pError); | 833 return nssCKFWObject_GetArena(fwObject, pError); |
873 } | 834 } |
874 | 835 |
875 /* | 836 /* |
876 * NSSCKFWObject_IsTokenObject | 837 * NSSCKFWObject_IsTokenObject |
877 * | 838 * |
878 */ | 839 */ |
879 NSS_IMPLEMENT CK_BBOOL | 840 NSS_IMPLEMENT CK_BBOOL |
880 NSSCKFWObject_IsTokenObject | 841 NSSCKFWObject_IsTokenObject( |
881 ( | 842 NSSCKFWObject *fwObject) |
882 NSSCKFWObject *fwObject | |
883 ) | |
884 { | 843 { |
885 #ifdef DEBUG | 844 #ifdef DEBUG |
886 if( CKR_OK != nssCKFWObject_verifyPointer(fwObject) ) { | 845 if (CKR_OK != nssCKFWObject_verifyPointer(fwObject)) { |
887 return CK_FALSE; | 846 return CK_FALSE; |
888 } | 847 } |
889 #endif /* DEBUG */ | 848 #endif /* DEBUG */ |
890 | 849 |
891 return nssCKFWObject_IsTokenObject(fwObject); | 850 return nssCKFWObject_IsTokenObject(fwObject); |
892 } | 851 } |
893 | 852 |
894 /* | 853 /* |
895 * NSSCKFWObject_GetAttributeCount | 854 * NSSCKFWObject_GetAttributeCount |
896 * | 855 * |
897 */ | 856 */ |
898 NSS_IMPLEMENT CK_ULONG | 857 NSS_IMPLEMENT CK_ULONG |
899 NSSCKFWObject_GetAttributeCount | 858 NSSCKFWObject_GetAttributeCount( |
900 ( | 859 NSSCKFWObject *fwObject, |
901 NSSCKFWObject *fwObject, | 860 CK_RV *pError) |
902 CK_RV *pError | |
903 ) | |
904 { | 861 { |
905 #ifdef DEBUG | 862 #ifdef DEBUG |
906 if (!pError) { | 863 if (!pError) { |
907 return (CK_ULONG)0; | 864 return (CK_ULONG)0; |
908 } | 865 } |
909 | 866 |
910 *pError = nssCKFWObject_verifyPointer(fwObject); | 867 *pError = nssCKFWObject_verifyPointer(fwObject); |
911 if( CKR_OK != *pError ) { | 868 if (CKR_OK != *pError) { |
912 return (CK_ULONG)0; | 869 return (CK_ULONG)0; |
913 } | 870 } |
914 #endif /* DEBUG */ | 871 #endif /* DEBUG */ |
915 | 872 |
916 return nssCKFWObject_GetAttributeCount(fwObject, pError); | 873 return nssCKFWObject_GetAttributeCount(fwObject, pError); |
917 } | 874 } |
918 | 875 |
919 /* | 876 /* |
920 * NSSCKFWObject_GetAttributeTypes | 877 * NSSCKFWObject_GetAttributeTypes |
921 * | 878 * |
922 */ | 879 */ |
923 NSS_IMPLEMENT CK_RV | 880 NSS_IMPLEMENT CK_RV |
924 NSSCKFWObject_GetAttributeTypes | 881 NSSCKFWObject_GetAttributeTypes( |
925 ( | 882 NSSCKFWObject *fwObject, |
926 NSSCKFWObject *fwObject, | 883 CK_ATTRIBUTE_TYPE_PTR typeArray, |
927 CK_ATTRIBUTE_TYPE_PTR typeArray, | 884 CK_ULONG ulCount) |
928 CK_ULONG ulCount | |
929 ) | |
930 { | 885 { |
931 #ifdef DEBUG | 886 #ifdef DEBUG |
932 CK_RV error = CKR_OK; | 887 CK_RV error = CKR_OK; |
933 | 888 |
934 error = nssCKFWObject_verifyPointer(fwObject); | 889 error = nssCKFWObject_verifyPointer(fwObject); |
935 if( CKR_OK != error ) { | 890 if (CKR_OK != error) { |
936 return error; | 891 return error; |
937 } | 892 } |
938 | 893 |
939 if( (CK_ATTRIBUTE_TYPE_PTR)NULL == typeArray ) { | 894 if ((CK_ATTRIBUTE_TYPE_PTR)NULL == typeArray) { |
940 return CKR_ARGUMENTS_BAD; | 895 return CKR_ARGUMENTS_BAD; |
941 } | 896 } |
942 #endif /* DEBUG */ | 897 #endif /* DEBUG */ |
943 | 898 |
944 return nssCKFWObject_GetAttributeTypes(fwObject, typeArray, ulCount); | 899 return nssCKFWObject_GetAttributeTypes(fwObject, typeArray, ulCount); |
945 } | 900 } |
946 | 901 |
947 /* | 902 /* |
948 * NSSCKFWObject_GetAttributeSize | 903 * NSSCKFWObject_GetAttributeSize |
949 * | 904 * |
950 */ | 905 */ |
951 NSS_IMPLEMENT CK_ULONG | 906 NSS_IMPLEMENT CK_ULONG |
952 NSSCKFWObject_GetAttributeSize | 907 NSSCKFWObject_GetAttributeSize( |
953 ( | 908 NSSCKFWObject *fwObject, |
954 NSSCKFWObject *fwObject, | 909 CK_ATTRIBUTE_TYPE attribute, |
955 CK_ATTRIBUTE_TYPE attribute, | 910 CK_RV *pError) |
956 CK_RV *pError | |
957 ) | |
958 { | 911 { |
959 #ifdef DEBUG | 912 #ifdef DEBUG |
960 if (!pError) { | 913 if (!pError) { |
961 return (CK_ULONG)0; | 914 return (CK_ULONG)0; |
962 } | 915 } |
963 | 916 |
964 *pError = nssCKFWObject_verifyPointer(fwObject); | 917 *pError = nssCKFWObject_verifyPointer(fwObject); |
965 if( CKR_OK != *pError ) { | 918 if (CKR_OK != *pError) { |
966 return (CK_ULONG)0; | 919 return (CK_ULONG)0; |
967 } | 920 } |
968 #endif /* DEBUG */ | 921 #endif /* DEBUG */ |
969 | 922 |
970 return nssCKFWObject_GetAttributeSize(fwObject, attribute, pError); | 923 return nssCKFWObject_GetAttributeSize(fwObject, attribute, pError); |
971 } | 924 } |
972 | 925 |
973 /* | 926 /* |
974 * NSSCKFWObject_GetAttribute | 927 * NSSCKFWObject_GetAttribute |
975 * | 928 * |
976 */ | 929 */ |
977 NSS_IMPLEMENT NSSItem * | 930 NSS_IMPLEMENT NSSItem * |
978 NSSCKFWObject_GetAttribute | 931 NSSCKFWObject_GetAttribute( |
979 ( | 932 NSSCKFWObject *fwObject, |
980 NSSCKFWObject *fwObject, | 933 CK_ATTRIBUTE_TYPE attribute, |
981 CK_ATTRIBUTE_TYPE attribute, | 934 NSSItem *itemOpt, |
982 NSSItem *itemOpt, | 935 NSSArena *arenaOpt, |
983 NSSArena *arenaOpt, | 936 CK_RV *pError) |
984 CK_RV *pError | |
985 ) | |
986 { | 937 { |
987 #ifdef DEBUG | 938 #ifdef DEBUG |
988 if (!pError) { | 939 if (!pError) { |
989 return (NSSItem *)NULL; | 940 return (NSSItem *)NULL; |
990 } | 941 } |
991 | 942 |
992 *pError = nssCKFWObject_verifyPointer(fwObject); | 943 *pError = nssCKFWObject_verifyPointer(fwObject); |
993 if( CKR_OK != *pError ) { | 944 if (CKR_OK != *pError) { |
994 return (NSSItem *)NULL; | 945 return (NSSItem *)NULL; |
995 } | 946 } |
996 #endif /* DEBUG */ | 947 #endif /* DEBUG */ |
997 | 948 |
998 return nssCKFWObject_GetAttribute(fwObject, attribute, itemOpt, arenaOpt, pErr
or); | 949 return nssCKFWObject_GetAttribute(fwObject, attribute, itemOpt, arenaOpt, pE
rror); |
999 } | 950 } |
1000 | 951 |
1001 /* | 952 /* |
1002 * NSSCKFWObject_GetObjectSize | 953 * NSSCKFWObject_GetObjectSize |
1003 * | 954 * |
1004 */ | 955 */ |
1005 NSS_IMPLEMENT CK_ULONG | 956 NSS_IMPLEMENT CK_ULONG |
1006 NSSCKFWObject_GetObjectSize | 957 NSSCKFWObject_GetObjectSize( |
1007 ( | 958 NSSCKFWObject *fwObject, |
1008 NSSCKFWObject *fwObject, | 959 CK_RV *pError) |
1009 CK_RV *pError | |
1010 ) | |
1011 { | 960 { |
1012 #ifdef DEBUG | 961 #ifdef DEBUG |
1013 if (!pError) { | 962 if (!pError) { |
1014 return (CK_ULONG)0; | 963 return (CK_ULONG)0; |
1015 } | 964 } |
1016 | 965 |
1017 *pError = nssCKFWObject_verifyPointer(fwObject); | 966 *pError = nssCKFWObject_verifyPointer(fwObject); |
1018 if( CKR_OK != *pError ) { | 967 if (CKR_OK != *pError) { |
1019 return (CK_ULONG)0; | 968 return (CK_ULONG)0; |
1020 } | 969 } |
1021 #endif /* DEBUG */ | 970 #endif /* DEBUG */ |
1022 | 971 |
1023 return nssCKFWObject_GetObjectSize(fwObject, pError); | 972 return nssCKFWObject_GetObjectSize(fwObject, pError); |
1024 } | 973 } |
OLD | NEW |