📄 object.c
字号:
/* * The contents of this file are subject to the Mozilla Public * License Version 1.1 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or * implied. See the License for the specific language governing * rights and limitations under the License. * * The Original Code is the Netscape security libraries. * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are * Copyright (C) 1994-2000 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the * terms of the GNU General Public License Version 2 or later (the * "GPL"), in which case the provisions of the GPL are applicable * instead of those above. If you wish to allow use of your * version of this file only under the terms of the GPL and not to * allow others to use your version of this file under the MPL, * indicate your decision by deleting the provisions above and * replace them with the notice and other provisions required by * the GPL. If you do not delete the provisions above, a recipient * may use your version of this file under either the MPL or the * GPL. */#ifdef DEBUGstatic const char CVS_ID[] = "@(#) $RCSfile: object.c,v $ $Revision: 1.4 $ $Date: 2000/05/16 01:54:45 $ $Name: NSS_3_1_1_RTM $";#endif /* DEBUG *//* * object.c * * This file implements the NSSCKFWObject type and methods. */#ifndef CK_T#include "ck.h"#endif /* CK_T *//* * NSSCKFWObject * * -- create/destroy -- * nssCKFWObject_Create * nssCKFWObject_Finalize * nssCKFWObject_Destroy * * -- public accessors -- * NSSCKFWObject_GetMDObject * NSSCKFWObject_GetArena * NSSCKFWObject_IsTokenObject * NSSCKFWObject_GetAttributeCount * NSSCKFWObject_GetAttributeTypes * NSSCKFWObject_GetAttributeSize * NSSCKFWObject_GetAttribute * NSSCKFWObject_SetAttribute * NSSCKFWObject_GetObjectSize * * -- implement public accessors -- * nssCKFWObject_GetMDObject * nssCKFWObject_GetArena * * -- private accessors -- * nssCKFWObject_SetHandle * nssCKFWObject_GetHandle * * -- module fronts -- * nssCKFWObject_IsTokenObject * nssCKFWObject_GetAttributeCount * nssCKFWObject_GetAttributeTypes * nssCKFWObject_GetAttributeSize * nssCKFWObject_GetAttribute * nssCKFWObject_SetAttribute * nssCKFWObject_GetObjectSize */struct NSSCKFWObjectStr { NSSCKFWMutex *mutex; /* merely to serialise the MDObject calls */ NSSArena *arena; NSSCKMDObject *mdObject; NSSCKMDSession *mdSession; NSSCKFWSession *fwSession; NSSCKMDToken *mdToken; NSSCKFWToken *fwToken; NSSCKMDInstance *mdInstance; NSSCKFWInstance *fwInstance; CK_OBJECT_HANDLE hObject;};#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_RVobject_add_pointer( const NSSCKFWObject *fwObject){ return CKR_OK;}static CK_RVobject_remove_pointer( const NSSCKFWObject *fwObject){ return CKR_OK;}NSS_IMPLEMENT CK_RVnssCKFWObject_verifyPointer( const NSSCKFWObject *fwObject){ return CKR_OK;}#endif /* DEBUG *//* * nssCKFWObject_Create * */NSS_IMPLEMENT NSSCKFWObject *nssCKFWObject_Create( NSSArena *arena, NSSCKMDObject *mdObject, NSSCKFWSession *fwSession, NSSCKFWToken *fwToken, NSSCKFWInstance *fwInstance, CK_RV *pError){ NSSCKFWObject *fwObject; nssCKFWHash *mdObjectHash;#ifdef NSSDEBUG if( (CK_RV *)NULL == pError ) { return (NSSCKFWObject *)NULL; } if( PR_SUCCESS != nssArena_verifyPointer(arena) ) { *pError = CKR_ARGUMENTS_BAD; return (NSSCKFWObject *)NULL; }#endif /* NSSDEBUG */ mdObjectHash = nssCKFWToken_GetMDObjectHash(fwToken); if( (nssCKFWHash *)NULL == mdObjectHash ) { *pError = CKR_GENERAL_ERROR; return (NSSCKFWObject *)NULL; } if( nssCKFWHash_Exists(mdObjectHash, mdObject) ) { fwObject = nssCKFWHash_Lookup(mdObjectHash, mdObject); return fwObject; } fwObject = nss_ZNEW(arena, NSSCKFWObject); if( (NSSCKFWObject *)NULL == fwObject ) { *pError = CKR_HOST_MEMORY; return (NSSCKFWObject *)NULL; } fwObject->arena = arena; fwObject->mdObject = mdObject; fwObject->fwSession = fwSession; if( (NSSCKFWSession *)NULL != fwSession ) { fwObject->mdSession = nssCKFWSession_GetMDSession(fwSession); } fwObject->fwToken = fwToken; if( (NSSCKFWToken *)NULL != fwToken ) { fwObject->mdToken = nssCKFWToken_GetMDToken(fwToken); } fwObject->fwInstance = fwInstance; fwObject->mdInstance = nssCKFWInstance_GetMDInstance(fwInstance); fwObject->mutex = nssCKFWInstance_CreateMutex(fwInstance, arena, pError); if( (NSSCKFWMutex *)NULL == fwObject->mutex ) { if( CKR_OK == *pError ) { *pError = CKR_GENERAL_ERROR; } return (NSSCKFWObject *)NULL; } *pError = nssCKFWHash_Add(mdObjectHash, mdObject, fwObject); if( CKR_OK != *pError ) { nss_ZFreeIf(fwObject); return (NSSCKFWObject *)NULL; }#ifdef DEBUG *pError = object_add_pointer(fwObject); if( CKR_OK != *pError ) { nssCKFWHash_Remove(mdObjectHash, mdObject); nss_ZFreeIf(fwObject); return (NSSCKFWObject *)NULL; }#endif /* DEBUG */ *pError = CKR_OK; return fwObject;}/* * nssCKFWObject_Finalize * */NSS_IMPLEMENT voidnssCKFWObject_Finalize( NSSCKFWObject *fwObject){ nssCKFWHash *mdObjectHash;#ifdef NSSDEBUG if( CKR_OK != nssCKFWObject_verifyPointer(fwObject) ) { return; }#endif /* NSSDEBUG */ (void)nssCKFWMutex_Destroy(fwObject->mutex); if( (void *)NULL != (void *)fwObject->mdObject->Finalize ) { fwObject->mdObject->Finalize(fwObject->mdObject, fwObject, fwObject->mdSession, fwObject->fwSession, fwObject->mdToken, fwObject->fwToken, fwObject->mdInstance, fwObject->fwInstance); } mdObjectHash = nssCKFWToken_GetMDObjectHash(fwObject->fwToken); if( (nssCKFWHash *)NULL != mdObjectHash ) { nssCKFWHash_Remove(mdObjectHash, fwObject->mdObject); } nssCKFWSession_DeregisterSessionObject(fwObject->fwSession, fwObject); nss_ZFreeIf(fwObject);#ifdef DEBUG (void)object_remove_pointer(fwObject);#endif /* DEBUG */ return;}/* * nssCKFWObject_Destroy * */NSS_IMPLEMENT voidnssCKFWObject_Destroy( NSSCKFWObject *fwObject){ nssCKFWHash *mdObjectHash;#ifdef NSSDEBUG if( CKR_OK != nssCKFWObject_verifyPointer(fwObject) ) { return; }#endif /* NSSDEBUG */ (void)nssCKFWMutex_Destroy(fwObject->mutex); if( (void *)NULL != (void *)fwObject->mdObject->Destroy ) { fwObject->mdObject->Destroy(fwObject->mdObject, fwObject, fwObject->mdSession, fwObject->fwSession, fwObject->mdToken, fwObject->fwToken, fwObject->mdInstance, fwObject->fwInstance); } mdObjectHash = nssCKFWToken_GetMDObjectHash(fwObject->fwToken); if( (nssCKFWHash *)NULL != mdObjectHash ) { nssCKFWHash_Remove(mdObjectHash, fwObject->mdObject); } nssCKFWSession_DeregisterSessionObject(fwObject->fwSession, fwObject); nss_ZFreeIf(fwObject);#ifdef DEBUG (void)object_remove_pointer(fwObject);#endif /* DEBUG */ return;}/* * nssCKFWObject_GetMDObject * */NSS_IMPLEMENT NSSCKMDObject *nssCKFWObject_GetMDObject( NSSCKFWObject *fwObject){#ifdef NSSDEBUG if( CKR_OK != nssCKFWObject_verifyPointer(fwObject) ) { return (NSSCKMDObject *)NULL; }#endif /* NSSDEBUG */ return fwObject->mdObject;}/* * nssCKFWObject_GetArena * */NSS_IMPLEMENT NSSArena *nssCKFWObject_GetArena( NSSCKFWObject *fwObject, CK_RV *pError){#ifdef NSSDEBUG if( (CK_RV *)NULL == pError ) { return (NSSArena *)NULL; } *pError = nssCKFWObject_verifyPointer(fwObject); if( CKR_OK != *pError ) { return (NSSArena *)NULL; }#endif /* NSSDEBUG */ return fwObject->arena;}/* * nssCKFWObject_SetHandle * */NSS_IMPLEMENT CK_RVnssCKFWObject_SetHandle( NSSCKFWObject *fwObject, CK_OBJECT_HANDLE hObject){#ifdef NSSDEBUG CK_RV error = CKR_OK;#endif /* NSSDEBUG */#ifdef NSSDEBUG error = nssCKFWObject_verifyPointer(fwObject); if( CKR_OK != error ) { return error; }#endif /* NSSDEBUG */ if( (CK_OBJECT_HANDLE)0 != fwObject->hObject ) { return CKR_GENERAL_ERROR; } fwObject->hObject = hObject; return CKR_OK;}/* * nssCKFWObject_GetHandle * */NSS_IMPLEMENT CK_OBJECT_HANDLEnssCKFWObject_GetHandle( NSSCKFWObject *fwObject){#ifdef NSSDEBUG if( CKR_OK != nssCKFWObject_verifyPointer(fwObject) ) { return (CK_OBJECT_HANDLE)0; }#endif /* NSSDEBUG */ return fwObject->hObject;}/* * nssCKFWObject_IsTokenObject * */NSS_IMPLEMENT CK_BBOOLnssCKFWObject_IsTokenObject( NSSCKFWObject *fwObject){ CK_BBOOL b = CK_FALSE;#ifdef NSSDEBUG if( CKR_OK != nssCKFWObject_verifyPointer(fwObject) ) { return CK_FALSE; }#endif /* NSSDEBUG */ if( CKR_OK != nssCKFWMutex_Lock(fwObject->mutex) ) { return CK_FALSE; } if( (void *)NULL == (void *)fwObject->mdObject->IsTokenObject ) { NSSItem item; NSSItem *pItem; CK_RV rv = CKR_OK; item.data = (void *)&b; item.size = sizeof(b); pItem = nssCKFWObject_GetAttribute(fwObject, CKA_TOKEN, &item, (NSSArena *)NULL, &rv); if( (NSSItem *)NULL == pItem ) { /* Error of some type */ b = CK_FALSE; goto done; } goto done; } b = fwObject->mdObject->IsTokenObject(fwObject->mdObject, fwObject, fwObject->mdSession, fwObject->fwSession, fwObject->mdToken, fwObject->fwToken, fwObject->mdInstance, fwObject->fwInstance); done: (void)nssCKFWMutex_Unlock(fwObject->mutex); return b;}/* * nssCKFWObject_GetAttributeCount * */NSS_IMPLEMENT CK_ULONGnssCKFWObject_GetAttributeCount( NSSCKFWObject *fwObject, CK_RV *pError){ CK_ULONG rv;#ifdef NSSDEBUG if( (CK_RV *)NULL == pError ) { return (CK_ULONG)0; } *pError = nssCKFWObject_verifyPointer(fwObject); if( CKR_OK != *pError ) { return (CK_ULONG)0; }#endif /* NSSDEBUG */ if( (void *)NULL == (void *)fwObject->mdObject->GetAttributeCount ) { *pError = CKR_GENERAL_ERROR; return (CK_ULONG)0; } *pError = nssCKFWMutex_Lock(fwObject->mutex); if( CKR_OK != *pError ) { return (CK_ULONG)0; } rv = fwObject->mdObject->GetAttributeCount(fwObject->mdObject, fwObject, fwObject->mdSession, fwObject->fwSession, fwObject->mdToken, fwObject->fwToken, fwObject->mdInstance, fwObject->fwInstance, pError); (void)nssCKFWMutex_Unlock(fwObject->mutex); return rv;}/* * nssCKFWObject_GetAttributeTypes * */NSS_IMPLEMENT CK_RVnssCKFWObject_GetAttributeTypes( NSSCKFWObject *fwObject, CK_ATTRIBUTE_TYPE_PTR typeArray, CK_ULONG ulCount){ CK_RV error = CKR_OK;#ifdef NSSDEBUG error = nssCKFWObject_verifyPointer(fwObject); if( CKR_OK != error ) { return error; } if( (CK_ATTRIBUTE_TYPE_PTR)NULL == typeArray ) { return CKR_ARGUMENTS_BAD; }#endif /* NSSDEBUG */ if( (void *)NULL == (void *)fwObject->mdObject->GetAttributeTypes ) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -