Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(149)

Side by Side Diff: mozilla/security/nss/lib/ckfw/sessobj.c

Issue 14249009: Change the NSS and NSPR source tree to the new directory structure to be (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/deps/third_party/nss/
Patch Set: Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « mozilla/security/nss/lib/ckfw/session.c ('k') | mozilla/security/nss/lib/ckfw/slot.c » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(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 }
OLDNEW
« no previous file with comments | « mozilla/security/nss/lib/ckfw/session.c ('k') | mozilla/security/nss/lib/ckfw/slot.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698