sessobj.c
来自「支持SSL v2/v3, TLS, PKCS #5, PKCS #7, PKCS」· C语言 代码 · 共 1,092 行 · 第 1/2 页
C
1,092 行
CK_ATTRIBUTE_TYPE attribute, CK_RV *pError){ nssCKMDSessionObject *obj; CK_ULONG i;#ifdef NSSDEBUG if( (CK_RV *)NULL == pError ) { return 0; } *pError = nss_ckmdSessionObject_verifyPointer(mdObject); if( CKR_OK != *pError ) { return 0; } /* We could even check all the other arguments, for sanity. */#endif /* NSSDEBUG */ obj = (nssCKMDSessionObject *)mdObject->etc; for( i = 0; i < obj->n; i++ ) { if( attribute == obj->types[i] ) { return (CK_ULONG)(obj->attributes[i].size); } } *pError = CKR_ATTRIBUTE_TYPE_INVALID; return 0;}/* * nss_ckmdSessionObject_GetAttribute * */static NSSItem *nss_ckmdSessionObject_GetAttribute( NSSCKMDObject *mdObject, NSSCKFWObject *fwObject, NSSCKMDSession *mdSession, NSSCKFWSession *fwSession, NSSCKMDToken *mdToken, NSSCKFWToken *fwToken, NSSCKMDInstance *mdInstance, NSSCKFWInstance *fwInstance, CK_ATTRIBUTE_TYPE attribute, CK_RV *pError){ nssCKMDSessionObject *obj; CK_ULONG i;#ifdef NSSDEBUG if( (CK_RV *)NULL == pError ) { return 0; } *pError = nss_ckmdSessionObject_verifyPointer(mdObject); if( CKR_OK != *pError ) { return 0; } /* We could even check all the other arguments, for sanity. */#endif /* NSSDEBUG */ obj = (nssCKMDSessionObject *)mdObject->etc; for( i = 0; i < obj->n; i++ ) { if( attribute == obj->types[i] ) { return &obj->attributes[i]; } } *pError = CKR_ATTRIBUTE_TYPE_INVALID; return 0;}/* * nss_ckmdSessionObject_SetAttribute * *//* * Okay, so this implementation sucks. It doesn't support removing * an attribute (if value == NULL), and could be more graceful about * memory. It should allow "blank" slots in the arrays, with some * invalid attribute type, and then it could support removal much * more easily. Do this later. */static CK_RVnss_ckmdSessionObject_SetAttribute( NSSCKMDObject *mdObject, NSSCKFWObject *fwObject, NSSCKMDSession *mdSession, NSSCKFWSession *fwSession, NSSCKMDToken *mdToken, NSSCKFWToken *fwToken, NSSCKMDInstance *mdInstance, NSSCKFWInstance *fwInstance, CK_ATTRIBUTE_TYPE attribute, NSSItem *value){ nssCKMDSessionObject *obj; CK_ULONG i; NSSItem n; NSSItem *ra; CK_ATTRIBUTE_TYPE_PTR rt;#ifdef NSSDEBUG CK_RV error;#endif /* NSSDEBUG */#ifdef NSSDEBUG error = nss_ckmdSessionObject_verifyPointer(mdObject); if( CKR_OK != error ) { return 0; } /* We could even check all the other arguments, for sanity. */#endif /* NSSDEBUG */ obj = (nssCKMDSessionObject *)mdObject->etc; n.size = value->size; n.data = nss_ZAlloc(obj->arena, n.size); if( (void *)NULL == n.data ) { return CKR_HOST_MEMORY; } (void)nsslibc_memcpy(n.data, value->data, n.size); for( i = 0; i < obj->n; i++ ) { if( attribute == obj->types[i] ) { nss_ZFreeIf(obj->attributes[i].data); obj->attributes[i] = n; return CKR_OK; } } /* * It's new. */ ra = (NSSItem *)nss_ZRealloc(obj->attributes, sizeof(NSSItem) * (obj->n + 1)); if( (NSSItem *)NULL == ra ) { nss_ZFreeIf(n.data); return CKR_HOST_MEMORY; } rt = (CK_ATTRIBUTE_TYPE_PTR)nss_ZRealloc(obj->types, (obj->n + 1)); if( (CK_ATTRIBUTE_TYPE_PTR)NULL == rt ) { nss_ZFreeIf(n.data); obj->attributes = (NSSItem *)nss_ZRealloc(ra, sizeof(NSSItem) * obj->n); if( (NSSItem *)NULL == obj->attributes ) { return CKR_GENERAL_ERROR; } return CKR_HOST_MEMORY; } obj->attributes = ra; obj->types = rt; obj->attributes[obj->n] = n; obj->types[obj->n] = attribute; obj->n++; return CKR_OK;}/* * nss_ckmdSessionObject_GetObjectSize * */static CK_ULONGnss_ckmdSessionObject_GetObjectSize( NSSCKMDObject *mdObject, NSSCKFWObject *fwObject, NSSCKMDSession *mdSession, NSSCKFWSession *fwSession, NSSCKMDToken *mdToken, NSSCKFWToken *fwToken, NSSCKMDInstance *mdInstance, NSSCKFWInstance *fwInstance, CK_RV *pError){ nssCKMDSessionObject *obj; CK_ULONG i; CK_ULONG rv = (CK_ULONG)0;#ifdef NSSDEBUG if( (CK_RV *)NULL == pError ) { return 0; } *pError = nss_ckmdSessionObject_verifyPointer(mdObject); if( CKR_OK != *pError ) { return 0; } /* We could even check all the other arguments, for sanity. */#endif /* NSSDEBUG */ obj = (nssCKMDSessionObject *)mdObject->etc; for( i = 0; i < obj->n; i++ ) { rv += obj->attributes[i].size; } rv += sizeof(NSSItem) * obj->n; rv += sizeof(CK_ATTRIBUTE_TYPE) * obj->n; rv += sizeof(nssCKMDSessionObject); return rv;}/* * nssCKMDFindSessionObjects * * -- create -- * nssCKMDFindSessionObjects_Create * * -- EPV calls -- * nss_ckmdFindSessionObjects_Final * nss_ckmdFindSessionObjects_Next */struct nodeStr { struct nodeStr *next; NSSCKMDObject *mdObject;};struct nssCKMDFindSessionObjectsStr { NSSArena *arena; CK_RV error; CK_ATTRIBUTE_PTR pTemplate; CK_ULONG ulCount; struct nodeStr *list; nssCKFWHash *hash;};typedef struct nssCKMDFindSessionObjectsStr nssCKMDFindSessionObjects;#ifdef DEBUG/* * But first, the pointer-tracking stuff. * * NOTE: the pointer-tracking support in NSS/base currently relies * upon NSPR's CallOnce support. That, however, relies upon NSPR's * locking, which is tied into the runtime. We need a pointer-tracker * implementation that uses the locks supplied through C_Initialize. * That support, however, can be filled in later. So for now, I'll * just do this routines as no-ops. */static CK_RVnss_ckmdFindSessionObjects_add_pointer( const NSSCKMDFindObjects *mdFindObjects){ return CKR_OK;}static CK_RVnss_ckmdFindSessionObjects_remove_pointer( const NSSCKMDFindObjects *mdFindObjects){ return CKR_OK;}static CK_RVnss_ckmdFindSessionObjects_verifyPointer( const NSSCKMDFindObjects *mdFindObjects){ return CKR_OK;}#endif /* DEBUG *//* * We must forward-declare these routines. */static voidnss_ckmdFindSessionObjects_Final( NSSCKMDFindObjects *mdFindObjects, NSSCKFWFindObjects *fwFindObjects, NSSCKMDSession *mdSession, NSSCKFWSession *fwSession, NSSCKMDToken *mdToken, NSSCKFWToken *fwToken, NSSCKMDInstance *mdInstance, NSSCKFWInstance *fwInstance);static NSSCKMDObject *nss_ckmdFindSessionObjects_Next( NSSCKMDFindObjects *mdFindObjects, NSSCKFWFindObjects *fwFindObjects, NSSCKMDSession *mdSession, NSSCKFWSession *fwSession, NSSCKMDToken *mdToken, NSSCKFWToken *fwToken, NSSCKMDInstance *mdInstance, NSSCKFWInstance *fwInstance, NSSArena *arena, CK_RV *pError);static CK_BBOOLitems_match( NSSItem *a, CK_VOID_PTR pValue, CK_ULONG ulValueLen){ if( a->size != ulValueLen ) { return CK_FALSE; } if( PR_TRUE == nsslibc_memequal(a->data, pValue, ulValueLen, (PRStatus *)NULL) ) { return CK_TRUE; } else { return CK_FALSE; }}/* * Our hashtable iterator */static voidfindfcn( const void *key, void *value, void *closure){ NSSCKMDObject *mdObject = (NSSCKMDObject *)value; nssCKMDSessionObject *mdso = (nssCKMDSessionObject *)mdObject->etc; nssCKMDFindSessionObjects *mdfso = (nssCKMDFindSessionObjects *)closure; CK_ULONG i, j; struct nodeStr *node; if( CKR_OK != mdfso->error ) { return; } for( i = 0; i < mdfso->ulCount; i++ ) { CK_ATTRIBUTE_PTR p = &mdfso->pTemplate[i]; for( j = 0; j < mdso->n; j++ ) { if( mdso->types[j] == p->type ) { if( !items_match(&mdso->attributes[j], p->pValue, p->ulValueLen) ) { return; } else { break; } } } if( j == mdso->n ) { /* Attribute not found */ return; } } /* Matches */ node = nss_ZNEW(mdfso->arena, struct nodeStr); if( (struct nodeStr *)NULL == node ) { mdfso->error = CKR_HOST_MEMORY; return; } node->mdObject = mdObject; node->next = mdfso->list; mdfso->list = node; return;}/* * nssCKMDFindSessionObjects_Create * */NSS_IMPLEMENT NSSCKMDFindObjects *nssCKMDFindSessionObjects_Create( NSSCKFWToken *fwToken, CK_ATTRIBUTE_PTR pTemplate, CK_ULONG ulCount, CK_RV *pError){ NSSArena *arena; nssCKMDFindSessionObjects *mdfso; nssCKFWHash *hash; NSSCKMDFindObjects *rv;#ifdef NSSDEBUG if( (CK_RV *)NULL == pError ) { return (NSSCKMDFindObjects *)NULL; } *pError = nssCKFWToken_verifyPointer(fwToken); if( CKR_OK != *pError ) { return (NSSCKMDFindObjects *)NULL; } if( (CK_ATTRIBUTE_PTR)NULL == pTemplate ) { *pError = CKR_ARGUMENTS_BAD; return (NSSCKMDFindObjects *)NULL; }#endif /* NSSDEBUG */ hash = nssCKFWToken_GetSessionObjectHash(fwToken); if( (nssCKFWHash *)NULL == hash ) { *pError= CKR_GENERAL_ERROR; return (NSSCKMDFindObjects *)NULL; } arena = NSSArena_Create(); if( (NSSArena *)NULL == arena ) { *pError = CKR_HOST_MEMORY; return (NSSCKMDFindObjects *)NULL; } mdfso = nss_ZNEW(arena, nssCKMDFindSessionObjects); if( (nssCKMDFindSessionObjects *)NULL == mdfso ) { NSSArena_Destroy(arena); *pError = CKR_HOST_MEMORY; return (NSSCKMDFindObjects *)NULL; } rv = nss_ZNEW(arena, NSSCKMDFindObjects); mdfso->error = CKR_OK; mdfso->pTemplate = pTemplate; mdfso->ulCount = ulCount; mdfso->hash = hash; nssCKFWHash_Iterate(hash, findfcn, mdfso); if( CKR_OK != mdfso->error ) { NSSArena_Destroy(arena); *pError = CKR_HOST_MEMORY; return (NSSCKMDFindObjects *)NULL; } rv->etc = (void *)mdfso; rv->Final = nss_ckmdFindSessionObjects_Final; rv->Next = nss_ckmdFindSessionObjects_Next;#ifdef DEBUG if( *pError != nss_ckmdFindSessionObjects_add_pointer(rv) ) { NSSArena_Destroy(arena); return (NSSCKMDFindObjects *)NULL; }#endif /* DEBUG */ mdfso->arena = arena; return rv;}static voidnss_ckmdFindSessionObjects_Final( NSSCKMDFindObjects *mdFindObjects, NSSCKFWFindObjects *fwFindObjects, NSSCKMDSession *mdSession, NSSCKFWSession *fwSession, NSSCKMDToken *mdToken, NSSCKFWToken *fwToken, NSSCKMDInstance *mdInstance, NSSCKFWInstance *fwInstance){ nssCKMDFindSessionObjects *mdfso;#ifdef NSSDEBUG if( CKR_OK != nss_ckmdFindSessionObjects_verifyPointer(mdFindObjects) ) { return; }#endif /* NSSDEBUG */ mdfso = (nssCKMDFindSessionObjects *)mdFindObjects->etc; if (mdfso->arena) NSSArena_Destroy(mdfso->arena);#ifdef DEBUG (void)nss_ckmdFindSessionObjects_remove_pointer(mdFindObjects);#endif /* DEBUG */ return;}static NSSCKMDObject *nss_ckmdFindSessionObjects_Next( NSSCKMDFindObjects *mdFindObjects, NSSCKFWFindObjects *fwFindObjects, NSSCKMDSession *mdSession, NSSCKFWSession *fwSession, NSSCKMDToken *mdToken, NSSCKFWToken *fwToken, NSSCKMDInstance *mdInstance, NSSCKFWInstance *fwInstance, NSSArena *arena, CK_RV *pError){ nssCKMDFindSessionObjects *mdfso; NSSCKMDObject *rv = (NSSCKMDObject *)NULL;#ifdef NSSDEBUG if( CKR_OK != nss_ckmdFindSessionObjects_verifyPointer(mdFindObjects) ) { return (NSSCKMDObject *)NULL; }#endif /* NSSDEBUG */ mdfso = (nssCKMDFindSessionObjects *)mdFindObjects->etc; while( (NSSCKMDObject *)NULL == rv ) { if( (struct nodeStr *)NULL == mdfso->list ) { *pError = CKR_OK; return (NSSCKMDObject *)NULL; } if( nssCKFWHash_Exists(mdfso->hash, mdfso->list->mdObject) ) { rv = mdfso->list->mdObject; } mdfso->list = mdfso->list->next; } return rv;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?