OLD | NEW |
| (Empty) |
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 #ifdef DEBUG | |
6 static const char CVS_ID[] = "@(#) $RCSfile: sessobj.c,v $ $Revision: 1.16 $ $Da
te: 2012/04/25 14:49:28 $"; | |
7 #endif /* DEBUG */ | |
8 | |
9 /* | |
10 * sessobj.c | |
11 * | |
12 * This file contains an NSSCKMDObject implementation for session | |
13 * objects. The framework uses this implementation to manage | |
14 * session objects when a Module doesn't wish to be bothered. | |
15 */ | |
16 | |
17 #ifndef CK_T | |
18 #include "ck.h" | |
19 #endif /* CK_T */ | |
20 | |
21 /* | |
22 * nssCKMDSessionObject | |
23 * | |
24 * -- create -- | |
25 * nssCKMDSessionObject_Create | |
26 * | |
27 * -- EPV calls -- | |
28 * nss_ckmdSessionObject_Finalize | |
29 * nss_ckmdSessionObject_IsTokenObject | |
30 * nss_ckmdSessionObject_GetAttributeCount | |
31 * nss_ckmdSessionObject_GetAttributeTypes | |
32 * nss_ckmdSessionObject_GetAttributeSize | |
33 * nss_ckmdSessionObject_GetAttribute | |
34 * nss_ckmdSessionObject_SetAttribute | |
35 * nss_ckmdSessionObject_GetObjectSize | |
36 */ | |
37 | |
38 struct nssCKMDSessionObjectStr { | |
39 CK_ULONG n; | |
40 NSSArena *arena; | |
41 NSSItem *attributes; | |
42 CK_ATTRIBUTE_TYPE_PTR types; | |
43 nssCKFWHash *hash; | |
44 }; | |
45 typedef struct nssCKMDSessionObjectStr nssCKMDSessionObject; | |
46 | |
47 #ifdef DEBUG | |
48 /* | |
49 * But first, the pointer-tracking stuff. | |
50 * | |
51 * NOTE: the pointer-tracking support in NSS/base currently relies | |
52 * upon NSPR's CallOnce support. That, however, relies upon NSPR's | |
53 * locking, which is tied into the runtime. We need a pointer-tracker | |
54 * implementation that uses the locks supplied through C_Initialize. | |
55 * That support, however, can be filled in later. So for now, I'll | |
56 * just do this routines as no-ops. | |
57 */ | |
58 | |
59 static CK_RV | |
60 nss_ckmdSessionObject_add_pointer | |
61 ( | |
62 const NSSCKMDObject *mdObject | |
63 ) | |
64 { | |
65 return CKR_OK; | |
66 } | |
67 | |
68 static CK_RV | |
69 nss_ckmdSessionObject_remove_pointer | |
70 ( | |
71 const NSSCKMDObject *mdObject | |
72 ) | |
73 { | |
74 return CKR_OK; | |
75 } | |
76 | |
77 #ifdef NSS_DEBUG | |
78 static CK_RV | |
79 nss_ckmdSessionObject_verifyPointer | |
80 ( | |
81 const NSSCKMDObject *mdObject | |
82 ) | |
83 { | |
84 return CKR_OK; | |
85 } | |
86 #endif | |
87 | |
88 #endif /* DEBUG */ | |
89 | |
90 /* | |
91 * We must forward-declare these routines | |
92 */ | |
93 static void | |
94 nss_ckmdSessionObject_Finalize | |
95 ( | |
96 NSSCKMDObject *mdObject, | |
97 NSSCKFWObject *fwObject, | |
98 NSSCKMDSession *mdSession, | |
99 NSSCKFWSession *fwSession, | |
100 NSSCKMDToken *mdToken, | |
101 NSSCKFWToken *fwToken, | |
102 NSSCKMDInstance *mdInstance, | |
103 NSSCKFWInstance *fwInstance | |
104 ); | |
105 | |
106 static CK_RV | |
107 nss_ckmdSessionObject_Destroy | |
108 ( | |
109 NSSCKMDObject *mdObject, | |
110 NSSCKFWObject *fwObject, | |
111 NSSCKMDSession *mdSession, | |
112 NSSCKFWSession *fwSession, | |
113 NSSCKMDToken *mdToken, | |
114 NSSCKFWToken *fwToken, | |
115 NSSCKMDInstance *mdInstance, | |
116 NSSCKFWInstance *fwInstance | |
117 ); | |
118 | |
119 static CK_BBOOL | |
120 nss_ckmdSessionObject_IsTokenObject | |
121 ( | |
122 NSSCKMDObject *mdObject, | |
123 NSSCKFWObject *fwObject, | |
124 NSSCKMDSession *mdSession, | |
125 NSSCKFWSession *fwSession, | |
126 NSSCKMDToken *mdToken, | |
127 NSSCKFWToken *fwToken, | |
128 NSSCKMDInstance *mdInstance, | |
129 NSSCKFWInstance *fwInstance | |
130 ); | |
131 | |
132 static CK_ULONG | |
133 nss_ckmdSessionObject_GetAttributeCount | |
134 ( | |
135 NSSCKMDObject *mdObject, | |
136 NSSCKFWObject *fwObject, | |
137 NSSCKMDSession *mdSession, | |
138 NSSCKFWSession *fwSession, | |
139 NSSCKMDToken *mdToken, | |
140 NSSCKFWToken *fwToken, | |
141 NSSCKMDInstance *mdInstance, | |
142 NSSCKFWInstance *fwInstance, | |
143 CK_RV *pError | |
144 ); | |
145 | |
146 static CK_RV | |
147 nss_ckmdSessionObject_GetAttributeTypes | |
148 ( | |
149 NSSCKMDObject *mdObject, | |
150 NSSCKFWObject *fwObject, | |
151 NSSCKMDSession *mdSession, | |
152 NSSCKFWSession *fwSession, | |
153 NSSCKMDToken *mdToken, | |
154 NSSCKFWToken *fwToken, | |
155 NSSCKMDInstance *mdInstance, | |
156 NSSCKFWInstance *fwInstance, | |
157 CK_ATTRIBUTE_TYPE_PTR typeArray, | |
158 CK_ULONG ulCount | |
159 ); | |
160 | |
161 static CK_ULONG | |
162 nss_ckmdSessionObject_GetAttributeSize | |
163 ( | |
164 NSSCKMDObject *mdObject, | |
165 NSSCKFWObject *fwObject, | |
166 NSSCKMDSession *mdSession, | |
167 NSSCKFWSession *fwSession, | |
168 NSSCKMDToken *mdToken, | |
169 NSSCKFWToken *fwToken, | |
170 NSSCKMDInstance *mdInstance, | |
171 NSSCKFWInstance *fwInstance, | |
172 CK_ATTRIBUTE_TYPE attribute, | |
173 CK_RV *pError | |
174 ); | |
175 | |
176 static NSSCKFWItem | |
177 nss_ckmdSessionObject_GetAttribute | |
178 ( | |
179 NSSCKMDObject *mdObject, | |
180 NSSCKFWObject *fwObject, | |
181 NSSCKMDSession *mdSession, | |
182 NSSCKFWSession *fwSession, | |
183 NSSCKMDToken *mdToken, | |
184 NSSCKFWToken *fwToken, | |
185 NSSCKMDInstance *mdInstance, | |
186 NSSCKFWInstance *fwInstance, | |
187 CK_ATTRIBUTE_TYPE attribute, | |
188 CK_RV *pError | |
189 ); | |
190 | |
191 static CK_RV | |
192 nss_ckmdSessionObject_SetAttribute | |
193 ( | |
194 NSSCKMDObject *mdObject, | |
195 NSSCKFWObject *fwObject, | |
196 NSSCKMDSession *mdSession, | |
197 NSSCKFWSession *fwSession, | |
198 NSSCKMDToken *mdToken, | |
199 NSSCKFWToken *fwToken, | |
200 NSSCKMDInstance *mdInstance, | |
201 NSSCKFWInstance *fwInstance, | |
202 CK_ATTRIBUTE_TYPE attribute, | |
203 NSSItem *value | |
204 ); | |
205 | |
206 static CK_ULONG | |
207 nss_ckmdSessionObject_GetObjectSize | |
208 ( | |
209 NSSCKMDObject *mdObject, | |
210 NSSCKFWObject *fwObject, | |
211 NSSCKMDSession *mdSession, | |
212 NSSCKFWSession *fwSession, | |
213 NSSCKMDToken *mdToken, | |
214 NSSCKFWToken *fwToken, | |
215 NSSCKMDInstance *mdInstance, | |
216 NSSCKFWInstance *fwInstance, | |
217 CK_RV *pError | |
218 ); | |
219 | |
220 /* | |
221 * nssCKMDSessionObject_Create | |
222 * | |
223 */ | |
224 NSS_IMPLEMENT NSSCKMDObject * | |
225 nssCKMDSessionObject_Create | |
226 ( | |
227 NSSCKFWToken *fwToken, | |
228 NSSArena *arena, | |
229 CK_ATTRIBUTE_PTR attributes, | |
230 CK_ULONG ulCount, | |
231 CK_RV *pError | |
232 ) | |
233 { | |
234 NSSCKMDObject *mdObject = (NSSCKMDObject *)NULL; | |
235 nssCKMDSessionObject *mdso = (nssCKMDSessionObject *)NULL; | |
236 CK_ULONG i; | |
237 nssCKFWHash *hash; | |
238 | |
239 *pError = CKR_OK; | |
240 | |
241 mdso = nss_ZNEW(arena, nssCKMDSessionObject); | |
242 if (!mdso) { | |
243 goto loser; | |
244 } | |
245 | |
246 mdso->arena = arena; | |
247 mdso->n = ulCount; | |
248 mdso->attributes = nss_ZNEWARRAY(arena, NSSItem, ulCount); | |
249 if (!mdso->attributes) { | |
250 goto loser; | |
251 } | |
252 | |
253 mdso->types = nss_ZNEWARRAY(arena, CK_ATTRIBUTE_TYPE, ulCount); | |
254 if (!mdso->types) { | |
255 goto loser; | |
256 } | |
257 for( i = 0; i < ulCount; i++ ) { | |
258 mdso->types[i] = attributes[i].type; | |
259 mdso->attributes[i].size = attributes[i].ulValueLen; | |
260 mdso->attributes[i].data = nss_ZAlloc(arena, attributes[i].ulValueLen); | |
261 if (!mdso->attributes[i].data) { | |
262 goto loser; | |
263 } | |
264 (void)nsslibc_memcpy(mdso->attributes[i].data, attributes[i].pValue, | |
265 attributes[i].ulValueLen); | |
266 } | |
267 | |
268 mdObject = nss_ZNEW(arena, NSSCKMDObject); | |
269 if (!mdObject) { | |
270 goto loser; | |
271 } | |
272 | |
273 mdObject->etc = (void *)mdso; | |
274 mdObject->Finalize = nss_ckmdSessionObject_Finalize; | |
275 mdObject->Destroy = nss_ckmdSessionObject_Destroy; | |
276 mdObject->IsTokenObject = nss_ckmdSessionObject_IsTokenObject; | |
277 mdObject->GetAttributeCount = nss_ckmdSessionObject_GetAttributeCount; | |
278 mdObject->GetAttributeTypes = nss_ckmdSessionObject_GetAttributeTypes; | |
279 mdObject->GetAttributeSize = nss_ckmdSessionObject_GetAttributeSize; | |
280 mdObject->GetAttribute = nss_ckmdSessionObject_GetAttribute; | |
281 mdObject->SetAttribute = nss_ckmdSessionObject_SetAttribute; | |
282 mdObject->GetObjectSize = nss_ckmdSessionObject_GetObjectSize; | |
283 | |
284 hash = nssCKFWToken_GetSessionObjectHash(fwToken); | |
285 if (!hash) { | |
286 *pError = CKR_GENERAL_ERROR; | |
287 goto loser; | |
288 } | |
289 | |
290 mdso->hash = hash; | |
291 | |
292 *pError = nssCKFWHash_Add(hash, mdObject, mdObject); | |
293 if( CKR_OK != *pError ) { | |
294 goto loser; | |
295 } | |
296 | |
297 #ifdef DEBUG | |
298 if(( *pError = nss_ckmdSessionObject_add_pointer(mdObject)) != CKR_OK ) { | |
299 goto loser; | |
300 } | |
301 #endif /* DEBUG */ | |
302 | |
303 return mdObject; | |
304 | |
305 loser: | |
306 if (mdso) { | |
307 if (mdso->attributes) { | |
308 for( i = 0; i < ulCount; i++ ) { | |
309 nss_ZFreeIf(mdso->attributes[i].data); | |
310 } | |
311 nss_ZFreeIf(mdso->attributes); | |
312 } | |
313 nss_ZFreeIf(mdso->types); | |
314 nss_ZFreeIf(mdso); | |
315 } | |
316 | |
317 nss_ZFreeIf(mdObject); | |
318 if (*pError == CKR_OK) { | |
319 *pError = CKR_HOST_MEMORY; | |
320 } | |
321 return (NSSCKMDObject *)NULL; | |
322 } | |
323 | |
324 /* | |
325 * nss_ckmdSessionObject_Finalize | |
326 * | |
327 */ | |
328 static void | |
329 nss_ckmdSessionObject_Finalize | |
330 ( | |
331 NSSCKMDObject *mdObject, | |
332 NSSCKFWObject *fwObject, | |
333 NSSCKMDSession *mdSession, | |
334 NSSCKFWSession *fwSession, | |
335 NSSCKMDToken *mdToken, | |
336 NSSCKFWToken *fwToken, | |
337 NSSCKMDInstance *mdInstance, | |
338 NSSCKFWInstance *fwInstance | |
339 ) | |
340 { | |
341 /* This shouldn't ever be called */ | |
342 return; | |
343 } | |
344 | |
345 /* | |
346 * nss_ckmdSessionObject_Destroy | |
347 * | |
348 */ | |
349 | |
350 static CK_RV | |
351 nss_ckmdSessionObject_Destroy | |
352 ( | |
353 NSSCKMDObject *mdObject, | |
354 NSSCKFWObject *fwObject, | |
355 NSSCKMDSession *mdSession, | |
356 NSSCKFWSession *fwSession, | |
357 NSSCKMDToken *mdToken, | |
358 NSSCKFWToken *fwToken, | |
359 NSSCKMDInstance *mdInstance, | |
360 NSSCKFWInstance *fwInstance | |
361 ) | |
362 { | |
363 #ifdef NSSDEBUG | |
364 CK_RV error = CKR_OK; | |
365 #endif /* NSSDEBUG */ | |
366 nssCKMDSessionObject *mdso; | |
367 CK_ULONG i; | |
368 | |
369 #ifdef NSSDEBUG | |
370 error = nss_ckmdSessionObject_verifyPointer(mdObject); | |
371 if( CKR_OK != error ) { | |
372 return error; | |
373 } | |
374 #endif /* NSSDEBUG */ | |
375 | |
376 mdso = (nssCKMDSessionObject *)mdObject->etc; | |
377 | |
378 nssCKFWHash_Remove(mdso->hash, mdObject); | |
379 | |
380 for( i = 0; i < mdso->n; i++ ) { | |
381 nss_ZFreeIf(mdso->attributes[i].data); | |
382 } | |
383 nss_ZFreeIf(mdso->attributes); | |
384 nss_ZFreeIf(mdso->types); | |
385 nss_ZFreeIf(mdso); | |
386 nss_ZFreeIf(mdObject); | |
387 | |
388 #ifdef DEBUG | |
389 (void)nss_ckmdSessionObject_remove_pointer(mdObject); | |
390 #endif /* DEBUG */ | |
391 | |
392 return CKR_OK; | |
393 } | |
394 | |
395 /* | |
396 * nss_ckmdSessionObject_IsTokenObject | |
397 * | |
398 */ | |
399 | |
400 static CK_BBOOL | |
401 nss_ckmdSessionObject_IsTokenObject | |
402 ( | |
403 NSSCKMDObject *mdObject, | |
404 NSSCKFWObject *fwObject, | |
405 NSSCKMDSession *mdSession, | |
406 NSSCKFWSession *fwSession, | |
407 NSSCKMDToken *mdToken, | |
408 NSSCKFWToken *fwToken, | |
409 NSSCKMDInstance *mdInstance, | |
410 NSSCKFWInstance *fwInstance | |
411 ) | |
412 { | |
413 #ifdef NSSDEBUG | |
414 if( CKR_OK != nss_ckmdSessionObject_verifyPointer(mdObject) ) { | |
415 return CK_FALSE; | |
416 } | |
417 #endif /* NSSDEBUG */ | |
418 | |
419 /* | |
420 * This implementation is only ever used for session objects. | |
421 */ | |
422 return CK_FALSE; | |
423 } | |
424 | |
425 /* | |
426 * nss_ckmdSessionObject_GetAttributeCount | |
427 * | |
428 */ | |
429 static CK_ULONG | |
430 nss_ckmdSessionObject_GetAttributeCount | |
431 ( | |
432 NSSCKMDObject *mdObject, | |
433 NSSCKFWObject *fwObject, | |
434 NSSCKMDSession *mdSession, | |
435 NSSCKFWSession *fwSession, | |
436 NSSCKMDToken *mdToken, | |
437 NSSCKFWToken *fwToken, | |
438 NSSCKMDInstance *mdInstance, | |
439 NSSCKFWInstance *fwInstance, | |
440 CK_RV *pError | |
441 ) | |
442 { | |
443 nssCKMDSessionObject *obj; | |
444 | |
445 #ifdef NSSDEBUG | |
446 if (!pError) { | |
447 return 0; | |
448 } | |
449 | |
450 *pError = nss_ckmdSessionObject_verifyPointer(mdObject); | |
451 if( CKR_OK != *pError ) { | |
452 return 0; | |
453 } | |
454 | |
455 /* We could even check all the other arguments, for sanity. */ | |
456 #endif /* NSSDEBUG */ | |
457 | |
458 obj = (nssCKMDSessionObject *)mdObject->etc; | |
459 | |
460 return obj->n; | |
461 } | |
462 | |
463 /* | |
464 * nss_ckmdSessionObject_GetAttributeTypes | |
465 * | |
466 */ | |
467 static CK_RV | |
468 nss_ckmdSessionObject_GetAttributeTypes | |
469 ( | |
470 NSSCKMDObject *mdObject, | |
471 NSSCKFWObject *fwObject, | |
472 NSSCKMDSession *mdSession, | |
473 NSSCKFWSession *fwSession, | |
474 NSSCKMDToken *mdToken, | |
475 NSSCKFWToken *fwToken, | |
476 NSSCKMDInstance *mdInstance, | |
477 NSSCKFWInstance *fwInstance, | |
478 CK_ATTRIBUTE_TYPE_PTR typeArray, | |
479 CK_ULONG ulCount | |
480 ) | |
481 { | |
482 #ifdef NSSDEBUG | |
483 CK_RV error = CKR_OK; | |
484 #endif /* NSSDEBUG */ | |
485 nssCKMDSessionObject *obj; | |
486 | |
487 #ifdef NSSDEBUG | |
488 error = nss_ckmdSessionObject_verifyPointer(mdObject); | |
489 if( CKR_OK != error ) { | |
490 return error; | |
491 } | |
492 | |
493 /* We could even check all the other arguments, for sanity. */ | |
494 #endif /* NSSDEBUG */ | |
495 | |
496 obj = (nssCKMDSessionObject *)mdObject->etc; | |
497 | |
498 if( ulCount < obj->n ) { | |
499 return CKR_BUFFER_TOO_SMALL; | |
500 } | |
501 | |
502 (void)nsslibc_memcpy(typeArray, obj->types, | |
503 sizeof(CK_ATTRIBUTE_TYPE) * obj->n); | |
504 | |
505 return CKR_OK; | |
506 } | |
507 | |
508 /* | |
509 * nss_ckmdSessionObject_GetAttributeSize | |
510 * | |
511 */ | |
512 static CK_ULONG | |
513 nss_ckmdSessionObject_GetAttributeSize | |
514 ( | |
515 NSSCKMDObject *mdObject, | |
516 NSSCKFWObject *fwObject, | |
517 NSSCKMDSession *mdSession, | |
518 NSSCKFWSession *fwSession, | |
519 NSSCKMDToken *mdToken, | |
520 NSSCKFWToken *fwToken, | |
521 NSSCKMDInstance *mdInstance, | |
522 NSSCKFWInstance *fwInstance, | |
523 CK_ATTRIBUTE_TYPE attribute, | |
524 CK_RV *pError | |
525 ) | |
526 { | |
527 nssCKMDSessionObject *obj; | |
528 CK_ULONG i; | |
529 | |
530 #ifdef NSSDEBUG | |
531 if (!pError) { | |
532 return 0; | |
533 } | |
534 | |
535 *pError = nss_ckmdSessionObject_verifyPointer(mdObject); | |
536 if( CKR_OK != *pError ) { | |
537 return 0; | |
538 } | |
539 | |
540 /* We could even check all the other arguments, for sanity. */ | |
541 #endif /* NSSDEBUG */ | |
542 | |
543 obj = (nssCKMDSessionObject *)mdObject->etc; | |
544 | |
545 for( i = 0; i < obj->n; i++ ) { | |
546 if( attribute == obj->types[i] ) { | |
547 return (CK_ULONG)(obj->attributes[i].size); | |
548 } | |
549 } | |
550 | |
551 *pError = CKR_ATTRIBUTE_TYPE_INVALID; | |
552 return 0; | |
553 } | |
554 | |
555 /* | |
556 * nss_ckmdSessionObject_GetAttribute | |
557 * | |
558 */ | |
559 static NSSCKFWItem | |
560 nss_ckmdSessionObject_GetAttribute | |
561 ( | |
562 NSSCKMDObject *mdObject, | |
563 NSSCKFWObject *fwObject, | |
564 NSSCKMDSession *mdSession, | |
565 NSSCKFWSession *fwSession, | |
566 NSSCKMDToken *mdToken, | |
567 NSSCKFWToken *fwToken, | |
568 NSSCKMDInstance *mdInstance, | |
569 NSSCKFWInstance *fwInstance, | |
570 CK_ATTRIBUTE_TYPE attribute, | |
571 CK_RV *pError | |
572 ) | |
573 { | |
574 NSSCKFWItem item; | |
575 nssCKMDSessionObject *obj; | |
576 CK_ULONG i; | |
577 | |
578 item.needsFreeing = PR_FALSE; | |
579 item.item = NULL; | |
580 #ifdef NSSDEBUG | |
581 if (!pError) { | |
582 return item; | |
583 } | |
584 | |
585 *pError = nss_ckmdSessionObject_verifyPointer(mdObject); | |
586 if( CKR_OK != *pError ) { | |
587 return item; | |
588 } | |
589 | |
590 /* We could even check all the other arguments, for sanity. */ | |
591 #endif /* NSSDEBUG */ | |
592 | |
593 obj = (nssCKMDSessionObject *)mdObject->etc; | |
594 | |
595 for( i = 0; i < obj->n; i++ ) { | |
596 if( attribute == obj->types[i] ) { | |
597 item.item = &obj->attributes[i]; | |
598 return item; | |
599 } | |
600 } | |
601 | |
602 *pError = CKR_ATTRIBUTE_TYPE_INVALID; | |
603 return item; | |
604 } | |
605 | |
606 /* | |
607 * nss_ckmdSessionObject_SetAttribute | |
608 * | |
609 */ | |
610 | |
611 /* | |
612 * Okay, so this implementation sucks. It doesn't support removing | |
613 * an attribute (if value == NULL), and could be more graceful about | |
614 * memory. It should allow "blank" slots in the arrays, with some | |
615 * invalid attribute type, and then it could support removal much | |
616 * more easily. Do this later. | |
617 */ | |
618 static CK_RV | |
619 nss_ckmdSessionObject_SetAttribute | |
620 ( | |
621 NSSCKMDObject *mdObject, | |
622 NSSCKFWObject *fwObject, | |
623 NSSCKMDSession *mdSession, | |
624 NSSCKFWSession *fwSession, | |
625 NSSCKMDToken *mdToken, | |
626 NSSCKFWToken *fwToken, | |
627 NSSCKMDInstance *mdInstance, | |
628 NSSCKFWInstance *fwInstance, | |
629 CK_ATTRIBUTE_TYPE attribute, | |
630 NSSItem *value | |
631 ) | |
632 { | |
633 nssCKMDSessionObject *obj; | |
634 CK_ULONG i; | |
635 NSSItem n; | |
636 NSSItem *ra; | |
637 CK_ATTRIBUTE_TYPE_PTR rt; | |
638 #ifdef NSSDEBUG | |
639 CK_RV error; | |
640 #endif /* NSSDEBUG */ | |
641 | |
642 #ifdef NSSDEBUG | |
643 error = nss_ckmdSessionObject_verifyPointer(mdObject); | |
644 if( CKR_OK != error ) { | |
645 return 0; | |
646 } | |
647 | |
648 /* We could even check all the other arguments, for sanity. */ | |
649 #endif /* NSSDEBUG */ | |
650 | |
651 obj = (nssCKMDSessionObject *)mdObject->etc; | |
652 | |
653 n.size = value->size; | |
654 n.data = nss_ZAlloc(obj->arena, n.size); | |
655 if (!n.data) { | |
656 return CKR_HOST_MEMORY; | |
657 } | |
658 (void)nsslibc_memcpy(n.data, value->data, n.size); | |
659 | |
660 for( i = 0; i < obj->n; i++ ) { | |
661 if( attribute == obj->types[i] ) { | |
662 nss_ZFreeIf(obj->attributes[i].data); | |
663 obj->attributes[i] = n; | |
664 return CKR_OK; | |
665 } | |
666 } | |
667 | |
668 /* | |
669 * It's new. | |
670 */ | |
671 | |
672 ra = (NSSItem *)nss_ZRealloc(obj->attributes, sizeof(NSSItem) * (obj->n + 1)); | |
673 if (!ra) { | |
674 nss_ZFreeIf(n.data); | |
675 return CKR_HOST_MEMORY; | |
676 } | |
677 obj->attributes = ra; | |
678 | |
679 rt = (CK_ATTRIBUTE_TYPE_PTR)nss_ZRealloc(obj->types, | |
680 sizeof(CK_ATTRIBUTE_TYPE) * (obj->n + 1)); | |
681 if (!rt) { | |
682 nss_ZFreeIf(n.data); | |
683 return CKR_HOST_MEMORY; | |
684 } | |
685 | |
686 obj->types = rt; | |
687 obj->attributes[obj->n] = n; | |
688 obj->types[obj->n] = attribute; | |
689 obj->n++; | |
690 | |
691 return CKR_OK; | |
692 } | |
693 | |
694 /* | |
695 * nss_ckmdSessionObject_GetObjectSize | |
696 * | |
697 */ | |
698 static CK_ULONG | |
699 nss_ckmdSessionObject_GetObjectSize | |
700 ( | |
701 NSSCKMDObject *mdObject, | |
702 NSSCKFWObject *fwObject, | |
703 NSSCKMDSession *mdSession, | |
704 NSSCKFWSession *fwSession, | |
705 NSSCKMDToken *mdToken, | |
706 NSSCKFWToken *fwToken, | |
707 NSSCKMDInstance *mdInstance, | |
708 NSSCKFWInstance *fwInstance, | |
709 CK_RV *pError | |
710 ) | |
711 { | |
712 nssCKMDSessionObject *obj; | |
713 CK_ULONG i; | |
714 CK_ULONG rv = (CK_ULONG)0; | |
715 | |
716 #ifdef NSSDEBUG | |
717 if (!pError) { | |
718 return 0; | |
719 } | |
720 | |
721 *pError = nss_ckmdSessionObject_verifyPointer(mdObject); | |
722 if( CKR_OK != *pError ) { | |
723 return 0; | |
724 } | |
725 | |
726 /* We could even check all the other arguments, for sanity. */ | |
727 #endif /* NSSDEBUG */ | |
728 | |
729 obj = (nssCKMDSessionObject *)mdObject->etc; | |
730 | |
731 for( i = 0; i < obj->n; i++ ) { | |
732 rv += obj->attributes[i].size; | |
733 } | |
734 | |
735 rv += sizeof(NSSItem) * obj->n; | |
736 rv += sizeof(CK_ATTRIBUTE_TYPE) * obj->n; | |
737 rv += sizeof(nssCKMDSessionObject); | |
738 | |
739 return rv; | |
740 } | |
741 | |
742 /* | |
743 * nssCKMDFindSessionObjects | |
744 * | |
745 * -- create -- | |
746 * nssCKMDFindSessionObjects_Create | |
747 * | |
748 * -- EPV calls -- | |
749 * nss_ckmdFindSessionObjects_Final | |
750 * nss_ckmdFindSessionObjects_Next | |
751 */ | |
752 | |
753 struct nodeStr { | |
754 struct nodeStr *next; | |
755 NSSCKMDObject *mdObject; | |
756 }; | |
757 | |
758 struct nssCKMDFindSessionObjectsStr { | |
759 NSSArena *arena; | |
760 CK_RV error; | |
761 CK_ATTRIBUTE_PTR pTemplate; | |
762 CK_ULONG ulCount; | |
763 struct nodeStr *list; | |
764 nssCKFWHash *hash; | |
765 | |
766 }; | |
767 typedef struct nssCKMDFindSessionObjectsStr nssCKMDFindSessionObjects; | |
768 | |
769 #ifdef DEBUG | |
770 /* | |
771 * But first, the pointer-tracking stuff. | |
772 * | |
773 * NOTE: the pointer-tracking support in NSS/base currently relies | |
774 * upon NSPR's CallOnce support. That, however, relies upon NSPR's | |
775 * locking, which is tied into the runtime. We need a pointer-tracker | |
776 * implementation that uses the locks supplied through C_Initialize. | |
777 * That support, however, can be filled in later. So for now, I'll | |
778 * just do this routines as no-ops. | |
779 */ | |
780 | |
781 static CK_RV | |
782 nss_ckmdFindSessionObjects_add_pointer | |
783 ( | |
784 const NSSCKMDFindObjects *mdFindObjects | |
785 ) | |
786 { | |
787 return CKR_OK; | |
788 } | |
789 | |
790 static CK_RV | |
791 nss_ckmdFindSessionObjects_remove_pointer | |
792 ( | |
793 const NSSCKMDFindObjects *mdFindObjects | |
794 ) | |
795 { | |
796 return CKR_OK; | |
797 } | |
798 | |
799 #ifdef NSS_DEBUG | |
800 static CK_RV | |
801 nss_ckmdFindSessionObjects_verifyPointer | |
802 ( | |
803 const NSSCKMDFindObjects *mdFindObjects | |
804 ) | |
805 { | |
806 return CKR_OK; | |
807 } | |
808 #endif | |
809 | |
810 #endif /* DEBUG */ | |
811 | |
812 /* | |
813 * We must forward-declare these routines. | |
814 */ | |
815 static void | |
816 nss_ckmdFindSessionObjects_Final | |
817 ( | |
818 NSSCKMDFindObjects *mdFindObjects, | |
819 NSSCKFWFindObjects *fwFindObjects, | |
820 NSSCKMDSession *mdSession, | |
821 NSSCKFWSession *fwSession, | |
822 NSSCKMDToken *mdToken, | |
823 NSSCKFWToken *fwToken, | |
824 NSSCKMDInstance *mdInstance, | |
825 NSSCKFWInstance *fwInstance | |
826 ); | |
827 | |
828 static NSSCKMDObject * | |
829 nss_ckmdFindSessionObjects_Next | |
830 ( | |
831 NSSCKMDFindObjects *mdFindObjects, | |
832 NSSCKFWFindObjects *fwFindObjects, | |
833 NSSCKMDSession *mdSession, | |
834 NSSCKFWSession *fwSession, | |
835 NSSCKMDToken *mdToken, | |
836 NSSCKFWToken *fwToken, | |
837 NSSCKMDInstance *mdInstance, | |
838 NSSCKFWInstance *fwInstance, | |
839 NSSArena *arena, | |
840 CK_RV *pError | |
841 ); | |
842 | |
843 static CK_BBOOL | |
844 items_match | |
845 ( | |
846 NSSItem *a, | |
847 CK_VOID_PTR pValue, | |
848 CK_ULONG ulValueLen | |
849 ) | |
850 { | |
851 if( a->size != ulValueLen ) { | |
852 return CK_FALSE; | |
853 } | |
854 | |
855 if( PR_TRUE == nsslibc_memequal(a->data, pValue, ulValueLen, (PRStatus *)NULL)
) { | |
856 return CK_TRUE; | |
857 } else { | |
858 return CK_FALSE; | |
859 } | |
860 } | |
861 | |
862 /* | |
863 * Our hashtable iterator | |
864 */ | |
865 static void | |
866 findfcn | |
867 ( | |
868 const void *key, | |
869 void *value, | |
870 void *closure | |
871 ) | |
872 { | |
873 NSSCKMDObject *mdObject = (NSSCKMDObject *)value; | |
874 nssCKMDSessionObject *mdso = (nssCKMDSessionObject *)mdObject->etc; | |
875 nssCKMDFindSessionObjects *mdfso = (nssCKMDFindSessionObjects *)closure; | |
876 CK_ULONG i, j; | |
877 struct nodeStr *node; | |
878 | |
879 if( CKR_OK != mdfso->error ) { | |
880 return; | |
881 } | |
882 | |
883 for( i = 0; i < mdfso->ulCount; i++ ) { | |
884 CK_ATTRIBUTE_PTR p = &mdfso->pTemplate[i]; | |
885 | |
886 for( j = 0; j < mdso->n; j++ ) { | |
887 if( mdso->types[j] == p->type ) { | |
888 if( !items_match(&mdso->attributes[j], p->pValue, p->ulValueLen) ) { | |
889 return; | |
890 } else { | |
891 break; | |
892 } | |
893 } | |
894 } | |
895 | |
896 if( j == mdso->n ) { | |
897 /* Attribute not found */ | |
898 return; | |
899 } | |
900 } | |
901 | |
902 /* Matches */ | |
903 node = nss_ZNEW(mdfso->arena, struct nodeStr); | |
904 if( (struct nodeStr *)NULL == node ) { | |
905 mdfso->error = CKR_HOST_MEMORY; | |
906 return; | |
907 } | |
908 | |
909 node->mdObject = mdObject; | |
910 node->next = mdfso->list; | |
911 mdfso->list = node; | |
912 | |
913 return; | |
914 } | |
915 | |
916 /* | |
917 * nssCKMDFindSessionObjects_Create | |
918 * | |
919 */ | |
920 NSS_IMPLEMENT NSSCKMDFindObjects * | |
921 nssCKMDFindSessionObjects_Create | |
922 ( | |
923 NSSCKFWToken *fwToken, | |
924 CK_ATTRIBUTE_PTR pTemplate, | |
925 CK_ULONG ulCount, | |
926 CK_RV *pError | |
927 ) | |
928 { | |
929 NSSArena *arena; | |
930 nssCKMDFindSessionObjects *mdfso; | |
931 nssCKFWHash *hash; | |
932 NSSCKMDFindObjects *rv; | |
933 | |
934 #ifdef NSSDEBUG | |
935 if (!pError) { | |
936 return (NSSCKMDFindObjects *)NULL; | |
937 } | |
938 | |
939 *pError = nssCKFWToken_verifyPointer(fwToken); | |
940 if( CKR_OK != *pError ) { | |
941 return (NSSCKMDFindObjects *)NULL; | |
942 } | |
943 | |
944 if( (CK_ATTRIBUTE_PTR)NULL == pTemplate ) { | |
945 *pError = CKR_ARGUMENTS_BAD; | |
946 return (NSSCKMDFindObjects *)NULL; | |
947 } | |
948 #endif /* NSSDEBUG */ | |
949 | |
950 *pError = CKR_OK; | |
951 | |
952 hash = nssCKFWToken_GetSessionObjectHash(fwToken); | |
953 if (!hash) { | |
954 *pError= CKR_GENERAL_ERROR; | |
955 return (NSSCKMDFindObjects *)NULL; | |
956 } | |
957 | |
958 arena = NSSArena_Create(); | |
959 if (!arena) { | |
960 *pError = CKR_HOST_MEMORY; | |
961 return (NSSCKMDFindObjects *)NULL; | |
962 } | |
963 | |
964 mdfso = nss_ZNEW(arena, nssCKMDFindSessionObjects); | |
965 if (!mdfso) { | |
966 goto loser; | |
967 } | |
968 | |
969 rv = nss_ZNEW(arena, NSSCKMDFindObjects); | |
970 if(rv == NULL) { | |
971 goto loser; | |
972 } | |
973 | |
974 mdfso->error = CKR_OK; | |
975 mdfso->pTemplate = pTemplate; | |
976 mdfso->ulCount = ulCount; | |
977 mdfso->hash = hash; | |
978 | |
979 nssCKFWHash_Iterate(hash, findfcn, mdfso); | |
980 | |
981 if( CKR_OK != mdfso->error ) { | |
982 goto loser; | |
983 } | |
984 | |
985 rv->etc = (void *)mdfso; | |
986 rv->Final = nss_ckmdFindSessionObjects_Final; | |
987 rv->Next = nss_ckmdFindSessionObjects_Next; | |
988 | |
989 #ifdef DEBUG | |
990 if( (*pError = nss_ckmdFindSessionObjects_add_pointer(rv)) != CKR_OK ) { | |
991 goto loser; | |
992 } | |
993 #endif /* DEBUG */ | |
994 mdfso->arena = arena; | |
995 | |
996 return rv; | |
997 | |
998 loser: | |
999 if (arena) { | |
1000 NSSArena_Destroy(arena); | |
1001 } | |
1002 if (*pError == CKR_OK) { | |
1003 *pError = CKR_HOST_MEMORY; | |
1004 } | |
1005 return NULL; | |
1006 } | |
1007 | |
1008 static void | |
1009 nss_ckmdFindSessionObjects_Final | |
1010 ( | |
1011 NSSCKMDFindObjects *mdFindObjects, | |
1012 NSSCKFWFindObjects *fwFindObjects, | |
1013 NSSCKMDSession *mdSession, | |
1014 NSSCKFWSession *fwSession, | |
1015 NSSCKMDToken *mdToken, | |
1016 NSSCKFWToken *fwToken, | |
1017 NSSCKMDInstance *mdInstance, | |
1018 NSSCKFWInstance *fwInstance | |
1019 ) | |
1020 { | |
1021 nssCKMDFindSessionObjects *mdfso; | |
1022 | |
1023 #ifdef NSSDEBUG | |
1024 if( CKR_OK != nss_ckmdFindSessionObjects_verifyPointer(mdFindObjects) ) { | |
1025 return; | |
1026 } | |
1027 #endif /* NSSDEBUG */ | |
1028 | |
1029 mdfso = (nssCKMDFindSessionObjects *)mdFindObjects->etc; | |
1030 if (mdfso->arena) NSSArena_Destroy(mdfso->arena); | |
1031 | |
1032 #ifdef DEBUG | |
1033 (void)nss_ckmdFindSessionObjects_remove_pointer(mdFindObjects); | |
1034 #endif /* DEBUG */ | |
1035 | |
1036 return; | |
1037 } | |
1038 | |
1039 static NSSCKMDObject * | |
1040 nss_ckmdFindSessionObjects_Next | |
1041 ( | |
1042 NSSCKMDFindObjects *mdFindObjects, | |
1043 NSSCKFWFindObjects *fwFindObjects, | |
1044 NSSCKMDSession *mdSession, | |
1045 NSSCKFWSession *fwSession, | |
1046 NSSCKMDToken *mdToken, | |
1047 NSSCKFWToken *fwToken, | |
1048 NSSCKMDInstance *mdInstance, | |
1049 NSSCKFWInstance *fwInstance, | |
1050 NSSArena *arena, | |
1051 CK_RV *pError | |
1052 ) | |
1053 { | |
1054 nssCKMDFindSessionObjects *mdfso; | |
1055 NSSCKMDObject *rv = (NSSCKMDObject *)NULL; | |
1056 | |
1057 #ifdef NSSDEBUG | |
1058 if( CKR_OK != nss_ckmdFindSessionObjects_verifyPointer(mdFindObjects) ) { | |
1059 return (NSSCKMDObject *)NULL; | |
1060 } | |
1061 #endif /* NSSDEBUG */ | |
1062 | |
1063 mdfso = (nssCKMDFindSessionObjects *)mdFindObjects->etc; | |
1064 | |
1065 while (!rv) { | |
1066 if( (struct nodeStr *)NULL == mdfso->list ) { | |
1067 *pError = CKR_OK; | |
1068 return (NSSCKMDObject *)NULL; | |
1069 } | |
1070 | |
1071 if( nssCKFWHash_Exists(mdfso->hash, mdfso->list->mdObject) ) { | |
1072 rv = mdfso->list->mdObject; | |
1073 } | |
1074 | |
1075 mdfso->list = mdfso->list->next; | |
1076 } | |
1077 | |
1078 return rv; | |
1079 } | |
OLD | NEW |