2
* The contents of this file are subject to the Mozilla Public
3
* License Version 1.1 (the "License"); you may not use this file
4
* except in compliance with the License. You may obtain a copy of
5
* the License at http://www.mozilla.org/MPL/
7
* Software distributed under the License is distributed on an "AS
8
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
9
* implied. See the License for the specific language governing
10
* rights and limitations under the License.
12
* The Original Code is the Netscape security libraries.
14
* The Initial Developer of the Original Code is Netscape
15
* Communications Corporation. Portions created by Netscape are
16
* Copyright (C) 1994-2000 Netscape Communications Corporation. All
21
* Alternatively, the contents of this file may be used under the
22
* terms of the GNU General Public License Version 2 or later (the
23
* "GPL"), in which case the provisions of the GPL are applicable
24
* instead of those above. If you wish to allow use of your
25
* version of this file only under the terms of the GPL and not to
26
* allow others to use your version of this file under the MPL,
27
* indicate your decision by deleting the provisions above and
28
* replace them with the notice and other provisions required by
29
* the GPL. If you do not delete the provisions above, a recipient
30
* may use your version of this file under either the MPL or the
35
static const char CVS_ID[] = "@(#) $RCSfile: sessobj.c,v $ $Revision: 1.10 $ $Date: 2002/04/05 19:38:03 $ $Name: FIREFOX_1_0_RELEASE $";
41
* This file contains an NSSCKMDObject implementation for session
42
* objects. The framework uses this implementation to manage
43
* session objects when a Module doesn't wish to be bothered.
51
* nssCKMDSessionObject
54
* nssCKMDSessionObject_Create
57
* nss_ckmdSessionObject_Finalize
58
* nss_ckmdSessionObject_IsTokenObject
59
* nss_ckmdSessionObject_GetAttributeCount
60
* nss_ckmdSessionObject_GetAttributeTypes
61
* nss_ckmdSessionObject_GetAttributeSize
62
* nss_ckmdSessionObject_GetAttribute
63
* nss_ckmdSessionObject_SetAttribute
64
* nss_ckmdSessionObject_GetObjectSize
67
struct nssCKMDSessionObjectStr {
71
CK_ATTRIBUTE_TYPE_PTR types;
74
typedef struct nssCKMDSessionObjectStr nssCKMDSessionObject;
78
* But first, the pointer-tracking stuff.
80
* NOTE: the pointer-tracking support in NSS/base currently relies
81
* upon NSPR's CallOnce support. That, however, relies upon NSPR's
82
* locking, which is tied into the runtime. We need a pointer-tracker
83
* implementation that uses the locks supplied through C_Initialize.
84
* That support, however, can be filled in later. So for now, I'll
85
* just do this routines as no-ops.
89
nss_ckmdSessionObject_add_pointer
91
const NSSCKMDObject *mdObject
98
nss_ckmdSessionObject_remove_pointer
100
const NSSCKMDObject *mdObject
108
nss_ckmdSessionObject_verifyPointer
110
const NSSCKMDObject *mdObject
120
* We must forward-declare these routines
123
nss_ckmdSessionObject_Finalize
125
NSSCKMDObject *mdObject,
126
NSSCKFWObject *fwObject,
127
NSSCKMDSession *mdSession,
128
NSSCKFWSession *fwSession,
129
NSSCKMDToken *mdToken,
130
NSSCKFWToken *fwToken,
131
NSSCKMDInstance *mdInstance,
132
NSSCKFWInstance *fwInstance
136
nss_ckmdSessionObject_Destroy
138
NSSCKMDObject *mdObject,
139
NSSCKFWObject *fwObject,
140
NSSCKMDSession *mdSession,
141
NSSCKFWSession *fwSession,
142
NSSCKMDToken *mdToken,
143
NSSCKFWToken *fwToken,
144
NSSCKMDInstance *mdInstance,
145
NSSCKFWInstance *fwInstance
149
nss_ckmdSessionObject_IsTokenObject
151
NSSCKMDObject *mdObject,
152
NSSCKFWObject *fwObject,
153
NSSCKMDSession *mdSession,
154
NSSCKFWSession *fwSession,
155
NSSCKMDToken *mdToken,
156
NSSCKFWToken *fwToken,
157
NSSCKMDInstance *mdInstance,
158
NSSCKFWInstance *fwInstance
162
nss_ckmdSessionObject_GetAttributeCount
164
NSSCKMDObject *mdObject,
165
NSSCKFWObject *fwObject,
166
NSSCKMDSession *mdSession,
167
NSSCKFWSession *fwSession,
168
NSSCKMDToken *mdToken,
169
NSSCKFWToken *fwToken,
170
NSSCKMDInstance *mdInstance,
171
NSSCKFWInstance *fwInstance,
176
nss_ckmdSessionObject_GetAttributeTypes
178
NSSCKMDObject *mdObject,
179
NSSCKFWObject *fwObject,
180
NSSCKMDSession *mdSession,
181
NSSCKFWSession *fwSession,
182
NSSCKMDToken *mdToken,
183
NSSCKFWToken *fwToken,
184
NSSCKMDInstance *mdInstance,
185
NSSCKFWInstance *fwInstance,
186
CK_ATTRIBUTE_TYPE_PTR typeArray,
191
nss_ckmdSessionObject_GetAttributeSize
193
NSSCKMDObject *mdObject,
194
NSSCKFWObject *fwObject,
195
NSSCKMDSession *mdSession,
196
NSSCKFWSession *fwSession,
197
NSSCKMDToken *mdToken,
198
NSSCKFWToken *fwToken,
199
NSSCKMDInstance *mdInstance,
200
NSSCKFWInstance *fwInstance,
201
CK_ATTRIBUTE_TYPE attribute,
206
nss_ckmdSessionObject_GetAttribute
208
NSSCKMDObject *mdObject,
209
NSSCKFWObject *fwObject,
210
NSSCKMDSession *mdSession,
211
NSSCKFWSession *fwSession,
212
NSSCKMDToken *mdToken,
213
NSSCKFWToken *fwToken,
214
NSSCKMDInstance *mdInstance,
215
NSSCKFWInstance *fwInstance,
216
CK_ATTRIBUTE_TYPE attribute,
221
nss_ckmdSessionObject_SetAttribute
223
NSSCKMDObject *mdObject,
224
NSSCKFWObject *fwObject,
225
NSSCKMDSession *mdSession,
226
NSSCKFWSession *fwSession,
227
NSSCKMDToken *mdToken,
228
NSSCKFWToken *fwToken,
229
NSSCKMDInstance *mdInstance,
230
NSSCKFWInstance *fwInstance,
231
CK_ATTRIBUTE_TYPE attribute,
236
nss_ckmdSessionObject_GetObjectSize
238
NSSCKMDObject *mdObject,
239
NSSCKFWObject *fwObject,
240
NSSCKMDSession *mdSession,
241
NSSCKFWSession *fwSession,
242
NSSCKMDToken *mdToken,
243
NSSCKFWToken *fwToken,
244
NSSCKMDInstance *mdInstance,
245
NSSCKFWInstance *fwInstance,
250
* nssCKMDSessionObject_Create
253
NSS_IMPLEMENT NSSCKMDObject *
254
nssCKMDSessionObject_Create
256
NSSCKFWToken *fwToken,
258
CK_ATTRIBUTE_PTR attributes,
263
NSSCKMDObject *mdObject = (NSSCKMDObject *)NULL;
264
nssCKMDSessionObject *mdso = (nssCKMDSessionObject *)NULL;
268
mdso = nss_ZNEW(arena, nssCKMDSessionObject);
269
if( (nssCKMDSessionObject *)NULL == mdso ) {
275
mdso->attributes = nss_ZNEWARRAY(arena, NSSItem, ulCount);
276
if( (NSSItem *)NULL == mdso->attributes ) {
280
mdso->types = nss_ZNEWARRAY(arena, CK_ATTRIBUTE_TYPE, ulCount);
282
for( i = 0; i < ulCount; i++ ) {
283
mdso->types[i] = attributes[i].type;
284
mdso->attributes[i].size = attributes[i].ulValueLen;
285
mdso->attributes[i].data = nss_ZAlloc(arena, attributes[i].ulValueLen);
286
if( (void *)NULL == mdso->attributes[i].data ) {
289
(void)nsslibc_memcpy(mdso->attributes[i].data, attributes[i].pValue,
290
attributes[i].ulValueLen);
293
mdObject = nss_ZNEW(arena, NSSCKMDObject);
294
if( (NSSCKMDObject *)NULL == mdObject ) {
298
mdObject->etc = (void *)mdso;
299
mdObject->Finalize = nss_ckmdSessionObject_Finalize;
300
mdObject->Destroy = nss_ckmdSessionObject_Destroy;
301
mdObject->IsTokenObject = nss_ckmdSessionObject_IsTokenObject;
302
mdObject->GetAttributeCount = nss_ckmdSessionObject_GetAttributeCount;
303
mdObject->GetAttributeTypes = nss_ckmdSessionObject_GetAttributeTypes;
304
mdObject->GetAttributeSize = nss_ckmdSessionObject_GetAttributeSize;
305
mdObject->GetAttribute = nss_ckmdSessionObject_GetAttribute;
306
mdObject->SetAttribute = nss_ckmdSessionObject_SetAttribute;
307
mdObject->GetObjectSize = nss_ckmdSessionObject_GetObjectSize;
309
hash = nssCKFWToken_GetSessionObjectHash(fwToken);
310
if( (nssCKFWHash *)NULL == hash ) {
311
*pError = CKR_GENERAL_ERROR;
317
*pError = nssCKFWHash_Add(hash, mdObject, mdObject);
318
if( CKR_OK != *pError ) {
323
if( CKR_OK != nss_ckmdSessionObject_add_pointer(mdObject) ) {
332
if( (nssCKMDSessionObject *)NULL != mdso ) {
333
if( (NSSItem *)NULL != mdso->attributes ) {
334
for( i = 0; i < ulCount; i++ ) {
335
nss_ZFreeIf(mdso->attributes[i].data);
338
nss_ZFreeIf(mdso->attributes);
341
nss_ZFreeIf(mdso->types);
345
nss_ZFreeIf(mdObject);
346
*pError = CKR_HOST_MEMORY;
347
return (NSSCKMDObject *)NULL;
351
* nss_ckmdSessionObject_Finalize
355
nss_ckmdSessionObject_Finalize
357
NSSCKMDObject *mdObject,
358
NSSCKFWObject *fwObject,
359
NSSCKMDSession *mdSession,
360
NSSCKFWSession *fwSession,
361
NSSCKMDToken *mdToken,
362
NSSCKFWToken *fwToken,
363
NSSCKMDInstance *mdInstance,
364
NSSCKFWInstance *fwInstance
367
/* This shouldn't ever be called */
372
* nss_ckmdSessionObject_Destroy
377
nss_ckmdSessionObject_Destroy
379
NSSCKMDObject *mdObject,
380
NSSCKFWObject *fwObject,
381
NSSCKMDSession *mdSession,
382
NSSCKFWSession *fwSession,
383
NSSCKMDToken *mdToken,
384
NSSCKFWToken *fwToken,
385
NSSCKMDInstance *mdInstance,
386
NSSCKFWInstance *fwInstance
390
CK_RV error = CKR_OK;
391
#endif /* NSSDEBUG */
392
nssCKMDSessionObject *mdso;
396
error = nss_ckmdSessionObject_verifyPointer(mdObject);
397
if( CKR_OK != error ) {
400
#endif /* NSSDEBUG */
402
mdso = (nssCKMDSessionObject *)mdObject->etc;
404
nssCKFWHash_Remove(mdso->hash, mdObject);
406
for( i = 0; i < mdso->n; i++ ) {
407
nss_ZFreeIf(mdso->attributes[i].data);
409
nss_ZFreeIf(mdso->attributes);
410
nss_ZFreeIf(mdso->types);
412
nss_ZFreeIf(mdObject);
415
(void)nss_ckmdSessionObject_remove_pointer(mdObject);
422
* nss_ckmdSessionObject_IsTokenObject
427
nss_ckmdSessionObject_IsTokenObject
429
NSSCKMDObject *mdObject,
430
NSSCKFWObject *fwObject,
431
NSSCKMDSession *mdSession,
432
NSSCKFWSession *fwSession,
433
NSSCKMDToken *mdToken,
434
NSSCKFWToken *fwToken,
435
NSSCKMDInstance *mdInstance,
436
NSSCKFWInstance *fwInstance
440
if( CKR_OK != nss_ckmdSessionObject_verifyPointer(mdObject) ) {
443
#endif /* NSSDEBUG */
446
* This implementation is only ever used for session objects.
452
* nss_ckmdSessionObject_GetAttributeCount
456
nss_ckmdSessionObject_GetAttributeCount
458
NSSCKMDObject *mdObject,
459
NSSCKFWObject *fwObject,
460
NSSCKMDSession *mdSession,
461
NSSCKFWSession *fwSession,
462
NSSCKMDToken *mdToken,
463
NSSCKFWToken *fwToken,
464
NSSCKMDInstance *mdInstance,
465
NSSCKFWInstance *fwInstance,
469
nssCKMDSessionObject *obj;
472
if( (CK_RV *)NULL == pError ) {
476
*pError = nss_ckmdSessionObject_verifyPointer(mdObject);
477
if( CKR_OK != *pError ) {
481
/* We could even check all the other arguments, for sanity. */
482
#endif /* NSSDEBUG */
484
obj = (nssCKMDSessionObject *)mdObject->etc;
490
* nss_ckmdSessionObject_GetAttributeTypes
494
nss_ckmdSessionObject_GetAttributeTypes
496
NSSCKMDObject *mdObject,
497
NSSCKFWObject *fwObject,
498
NSSCKMDSession *mdSession,
499
NSSCKFWSession *fwSession,
500
NSSCKMDToken *mdToken,
501
NSSCKFWToken *fwToken,
502
NSSCKMDInstance *mdInstance,
503
NSSCKFWInstance *fwInstance,
504
CK_ATTRIBUTE_TYPE_PTR typeArray,
509
CK_RV error = CKR_OK;
510
#endif /* NSSDEBUG */
511
nssCKMDSessionObject *obj;
514
error = nss_ckmdSessionObject_verifyPointer(mdObject);
515
if( CKR_OK != error ) {
519
/* We could even check all the other arguments, for sanity. */
520
#endif /* NSSDEBUG */
522
obj = (nssCKMDSessionObject *)mdObject->etc;
524
if( ulCount < obj->n ) {
525
return CKR_BUFFER_TOO_SMALL;
528
(void)nsslibc_memcpy(typeArray, obj->types,
529
sizeof(CK_ATTRIBUTE_TYPE) * obj->n);
535
* nss_ckmdSessionObject_GetAttributeSize
539
nss_ckmdSessionObject_GetAttributeSize
541
NSSCKMDObject *mdObject,
542
NSSCKFWObject *fwObject,
543
NSSCKMDSession *mdSession,
544
NSSCKFWSession *fwSession,
545
NSSCKMDToken *mdToken,
546
NSSCKFWToken *fwToken,
547
NSSCKMDInstance *mdInstance,
548
NSSCKFWInstance *fwInstance,
549
CK_ATTRIBUTE_TYPE attribute,
553
nssCKMDSessionObject *obj;
557
if( (CK_RV *)NULL == pError ) {
561
*pError = nss_ckmdSessionObject_verifyPointer(mdObject);
562
if( CKR_OK != *pError ) {
566
/* We could even check all the other arguments, for sanity. */
567
#endif /* NSSDEBUG */
569
obj = (nssCKMDSessionObject *)mdObject->etc;
571
for( i = 0; i < obj->n; i++ ) {
572
if( attribute == obj->types[i] ) {
573
return (CK_ULONG)(obj->attributes[i].size);
577
*pError = CKR_ATTRIBUTE_TYPE_INVALID;
582
* nss_ckmdSessionObject_GetAttribute
586
nss_ckmdSessionObject_GetAttribute
588
NSSCKMDObject *mdObject,
589
NSSCKFWObject *fwObject,
590
NSSCKMDSession *mdSession,
591
NSSCKFWSession *fwSession,
592
NSSCKMDToken *mdToken,
593
NSSCKFWToken *fwToken,
594
NSSCKMDInstance *mdInstance,
595
NSSCKFWInstance *fwInstance,
596
CK_ATTRIBUTE_TYPE attribute,
601
nssCKMDSessionObject *obj;
604
item.needsFreeing = PR_FALSE;
607
if( (CK_RV *)NULL == pError ) {
611
*pError = nss_ckmdSessionObject_verifyPointer(mdObject);
612
if( CKR_OK != *pError ) {
616
/* We could even check all the other arguments, for sanity. */
617
#endif /* NSSDEBUG */
619
obj = (nssCKMDSessionObject *)mdObject->etc;
621
for( i = 0; i < obj->n; i++ ) {
622
if( attribute == obj->types[i] ) {
623
item.item = &obj->attributes[i];
628
*pError = CKR_ATTRIBUTE_TYPE_INVALID;
633
* nss_ckmdSessionObject_SetAttribute
638
* Okay, so this implementation sucks. It doesn't support removing
639
* an attribute (if value == NULL), and could be more graceful about
640
* memory. It should allow "blank" slots in the arrays, with some
641
* invalid attribute type, and then it could support removal much
642
* more easily. Do this later.
645
nss_ckmdSessionObject_SetAttribute
647
NSSCKMDObject *mdObject,
648
NSSCKFWObject *fwObject,
649
NSSCKMDSession *mdSession,
650
NSSCKFWSession *fwSession,
651
NSSCKMDToken *mdToken,
652
NSSCKFWToken *fwToken,
653
NSSCKMDInstance *mdInstance,
654
NSSCKFWInstance *fwInstance,
655
CK_ATTRIBUTE_TYPE attribute,
659
nssCKMDSessionObject *obj;
663
CK_ATTRIBUTE_TYPE_PTR rt;
666
#endif /* NSSDEBUG */
669
error = nss_ckmdSessionObject_verifyPointer(mdObject);
670
if( CKR_OK != error ) {
674
/* We could even check all the other arguments, for sanity. */
675
#endif /* NSSDEBUG */
677
obj = (nssCKMDSessionObject *)mdObject->etc;
679
n.size = value->size;
680
n.data = nss_ZAlloc(obj->arena, n.size);
681
if( (void *)NULL == n.data ) {
682
return CKR_HOST_MEMORY;
684
(void)nsslibc_memcpy(n.data, value->data, n.size);
686
for( i = 0; i < obj->n; i++ ) {
687
if( attribute == obj->types[i] ) {
688
nss_ZFreeIf(obj->attributes[i].data);
689
obj->attributes[i] = n;
698
ra = (NSSItem *)nss_ZRealloc(obj->attributes, sizeof(NSSItem) * (obj->n + 1));
699
if( (NSSItem *)NULL == ra ) {
701
return CKR_HOST_MEMORY;
704
rt = (CK_ATTRIBUTE_TYPE_PTR)nss_ZRealloc(obj->types, (obj->n + 1));
705
if( (CK_ATTRIBUTE_TYPE_PTR)NULL == rt ) {
707
obj->attributes = (NSSItem *)nss_ZRealloc(ra, sizeof(NSSItem) * obj->n);
708
if( (NSSItem *)NULL == obj->attributes ) {
709
return CKR_GENERAL_ERROR;
711
return CKR_HOST_MEMORY;
714
obj->attributes = ra;
716
obj->attributes[obj->n] = n;
717
obj->types[obj->n] = attribute;
724
* nss_ckmdSessionObject_GetObjectSize
728
nss_ckmdSessionObject_GetObjectSize
730
NSSCKMDObject *mdObject,
731
NSSCKFWObject *fwObject,
732
NSSCKMDSession *mdSession,
733
NSSCKFWSession *fwSession,
734
NSSCKMDToken *mdToken,
735
NSSCKFWToken *fwToken,
736
NSSCKMDInstance *mdInstance,
737
NSSCKFWInstance *fwInstance,
741
nssCKMDSessionObject *obj;
743
CK_ULONG rv = (CK_ULONG)0;
746
if( (CK_RV *)NULL == pError ) {
750
*pError = nss_ckmdSessionObject_verifyPointer(mdObject);
751
if( CKR_OK != *pError ) {
755
/* We could even check all the other arguments, for sanity. */
756
#endif /* NSSDEBUG */
758
obj = (nssCKMDSessionObject *)mdObject->etc;
760
for( i = 0; i < obj->n; i++ ) {
761
rv += obj->attributes[i].size;
764
rv += sizeof(NSSItem) * obj->n;
765
rv += sizeof(CK_ATTRIBUTE_TYPE) * obj->n;
766
rv += sizeof(nssCKMDSessionObject);
772
* nssCKMDFindSessionObjects
775
* nssCKMDFindSessionObjects_Create
778
* nss_ckmdFindSessionObjects_Final
779
* nss_ckmdFindSessionObjects_Next
783
struct nodeStr *next;
784
NSSCKMDObject *mdObject;
787
struct nssCKMDFindSessionObjectsStr {
790
CK_ATTRIBUTE_PTR pTemplate;
792
struct nodeStr *list;
796
typedef struct nssCKMDFindSessionObjectsStr nssCKMDFindSessionObjects;
800
* But first, the pointer-tracking stuff.
802
* NOTE: the pointer-tracking support in NSS/base currently relies
803
* upon NSPR's CallOnce support. That, however, relies upon NSPR's
804
* locking, which is tied into the runtime. We need a pointer-tracker
805
* implementation that uses the locks supplied through C_Initialize.
806
* That support, however, can be filled in later. So for now, I'll
807
* just do this routines as no-ops.
811
nss_ckmdFindSessionObjects_add_pointer
813
const NSSCKMDFindObjects *mdFindObjects
820
nss_ckmdFindSessionObjects_remove_pointer
822
const NSSCKMDFindObjects *mdFindObjects
830
nss_ckmdFindSessionObjects_verifyPointer
832
const NSSCKMDFindObjects *mdFindObjects
842
* We must forward-declare these routines.
845
nss_ckmdFindSessionObjects_Final
847
NSSCKMDFindObjects *mdFindObjects,
848
NSSCKFWFindObjects *fwFindObjects,
849
NSSCKMDSession *mdSession,
850
NSSCKFWSession *fwSession,
851
NSSCKMDToken *mdToken,
852
NSSCKFWToken *fwToken,
853
NSSCKMDInstance *mdInstance,
854
NSSCKFWInstance *fwInstance
857
static NSSCKMDObject *
858
nss_ckmdFindSessionObjects_Next
860
NSSCKMDFindObjects *mdFindObjects,
861
NSSCKFWFindObjects *fwFindObjects,
862
NSSCKMDSession *mdSession,
863
NSSCKFWSession *fwSession,
864
NSSCKMDToken *mdToken,
865
NSSCKFWToken *fwToken,
866
NSSCKMDInstance *mdInstance,
867
NSSCKFWInstance *fwInstance,
880
if( a->size != ulValueLen ) {
884
if( PR_TRUE == nsslibc_memequal(a->data, pValue, ulValueLen, (PRStatus *)NULL) ) {
892
* Our hashtable iterator
902
NSSCKMDObject *mdObject = (NSSCKMDObject *)value;
903
nssCKMDSessionObject *mdso = (nssCKMDSessionObject *)mdObject->etc;
904
nssCKMDFindSessionObjects *mdfso = (nssCKMDFindSessionObjects *)closure;
906
struct nodeStr *node;
908
if( CKR_OK != mdfso->error ) {
912
for( i = 0; i < mdfso->ulCount; i++ ) {
913
CK_ATTRIBUTE_PTR p = &mdfso->pTemplate[i];
915
for( j = 0; j < mdso->n; j++ ) {
916
if( mdso->types[j] == p->type ) {
917
if( !items_match(&mdso->attributes[j], p->pValue, p->ulValueLen) ) {
926
/* Attribute not found */
932
node = nss_ZNEW(mdfso->arena, struct nodeStr);
933
if( (struct nodeStr *)NULL == node ) {
934
mdfso->error = CKR_HOST_MEMORY;
938
node->mdObject = mdObject;
939
node->next = mdfso->list;
946
* nssCKMDFindSessionObjects_Create
949
NSS_IMPLEMENT NSSCKMDFindObjects *
950
nssCKMDFindSessionObjects_Create
952
NSSCKFWToken *fwToken,
953
CK_ATTRIBUTE_PTR pTemplate,
959
nssCKMDFindSessionObjects *mdfso;
961
NSSCKMDFindObjects *rv;
964
if( (CK_RV *)NULL == pError ) {
965
return (NSSCKMDFindObjects *)NULL;
968
*pError = nssCKFWToken_verifyPointer(fwToken);
969
if( CKR_OK != *pError ) {
970
return (NSSCKMDFindObjects *)NULL;
973
if( (CK_ATTRIBUTE_PTR)NULL == pTemplate ) {
974
*pError = CKR_ARGUMENTS_BAD;
975
return (NSSCKMDFindObjects *)NULL;
977
#endif /* NSSDEBUG */
979
hash = nssCKFWToken_GetSessionObjectHash(fwToken);
980
if( (nssCKFWHash *)NULL == hash ) {
981
*pError= CKR_GENERAL_ERROR;
982
return (NSSCKMDFindObjects *)NULL;
985
arena = NSSArena_Create();
986
if( (NSSArena *)NULL == arena ) {
987
*pError = CKR_HOST_MEMORY;
988
return (NSSCKMDFindObjects *)NULL;
991
mdfso = nss_ZNEW(arena, nssCKMDFindSessionObjects);
992
if( (nssCKMDFindSessionObjects *)NULL == mdfso ) {
993
NSSArena_Destroy(arena);
994
*pError = CKR_HOST_MEMORY;
995
return (NSSCKMDFindObjects *)NULL;
998
rv = nss_ZNEW(arena, NSSCKMDFindObjects);
1000
mdfso->error = CKR_OK;
1001
mdfso->pTemplate = pTemplate;
1002
mdfso->ulCount = ulCount;
1005
nssCKFWHash_Iterate(hash, findfcn, mdfso);
1007
if( CKR_OK != mdfso->error ) {
1008
NSSArena_Destroy(arena);
1009
*pError = CKR_HOST_MEMORY;
1010
return (NSSCKMDFindObjects *)NULL;
1013
rv->etc = (void *)mdfso;
1014
rv->Final = nss_ckmdFindSessionObjects_Final;
1015
rv->Next = nss_ckmdFindSessionObjects_Next;
1018
if( (*pError = nss_ckmdFindSessionObjects_add_pointer(rv)) != CKR_OK ) {
1019
NSSArena_Destroy(arena);
1020
return (NSSCKMDFindObjects *)NULL;
1023
mdfso->arena = arena;
1029
nss_ckmdFindSessionObjects_Final
1031
NSSCKMDFindObjects *mdFindObjects,
1032
NSSCKFWFindObjects *fwFindObjects,
1033
NSSCKMDSession *mdSession,
1034
NSSCKFWSession *fwSession,
1035
NSSCKMDToken *mdToken,
1036
NSSCKFWToken *fwToken,
1037
NSSCKMDInstance *mdInstance,
1038
NSSCKFWInstance *fwInstance
1041
nssCKMDFindSessionObjects *mdfso;
1044
if( CKR_OK != nss_ckmdFindSessionObjects_verifyPointer(mdFindObjects) ) {
1047
#endif /* NSSDEBUG */
1049
mdfso = (nssCKMDFindSessionObjects *)mdFindObjects->etc;
1050
if (mdfso->arena) NSSArena_Destroy(mdfso->arena);
1053
(void)nss_ckmdFindSessionObjects_remove_pointer(mdFindObjects);
1059
static NSSCKMDObject *
1060
nss_ckmdFindSessionObjects_Next
1062
NSSCKMDFindObjects *mdFindObjects,
1063
NSSCKFWFindObjects *fwFindObjects,
1064
NSSCKMDSession *mdSession,
1065
NSSCKFWSession *fwSession,
1066
NSSCKMDToken *mdToken,
1067
NSSCKFWToken *fwToken,
1068
NSSCKMDInstance *mdInstance,
1069
NSSCKFWInstance *fwInstance,
1074
nssCKMDFindSessionObjects *mdfso;
1075
NSSCKMDObject *rv = (NSSCKMDObject *)NULL;
1078
if( CKR_OK != nss_ckmdFindSessionObjects_verifyPointer(mdFindObjects) ) {
1079
return (NSSCKMDObject *)NULL;
1081
#endif /* NSSDEBUG */
1083
mdfso = (nssCKMDFindSessionObjects *)mdFindObjects->etc;
1085
while( (NSSCKMDObject *)NULL == rv ) {
1086
if( (struct nodeStr *)NULL == mdfso->list ) {
1088
return (NSSCKMDObject *)NULL;
1091
if( nssCKFWHash_Exists(mdfso->hash, mdfso->list->mdObject) ) {
1092
rv = mdfso->list->mdObject;
1095
mdfso->list = mdfso->list->next;