/* * nssCKFWInstance_DestroyObjectHandle * */ NSS_IMPLEMENT void nssCKFWInstance_DestroyObjectHandle( NSSCKFWInstance *fwInstance, CK_OBJECT_HANDLE hObject) { NSSCKFWObject *fwObject; #ifdef NSSDEBUG if (CKR_OK != nssCKFWInstance_verifyPointer(fwInstance)) { return; } #endif /* NSSDEBUG */ if (CKR_OK != nssCKFWMutex_Lock(fwInstance->mutex)) { return; } fwObject = (NSSCKFWObject *)nssCKFWHash_Lookup( fwInstance->objectHandleHash, (const void *)hObject); if (fwObject) { /* Assert(hObject = nssCKFWObject_GetHandle(fwObject)) */ nssCKFWHash_Remove(fwInstance->objectHandleHash, (const void *)hObject); (void)nssCKFWObject_SetHandle(fwObject, (CK_SESSION_HANDLE)0); } (void)nssCKFWMutex_Unlock(fwInstance->mutex); return; }
/* * nssCKFWInstance_ResolveObjectHandle * */ NSS_IMPLEMENT NSSCKFWObject * nssCKFWInstance_ResolveObjectHandle( NSSCKFWInstance *fwInstance, CK_OBJECT_HANDLE hObject) { NSSCKFWObject *fwObject; #ifdef NSSDEBUG if (CKR_OK != nssCKFWInstance_verifyPointer(fwInstance)) { return (NSSCKFWObject *)NULL; } #endif /* NSSDEBUG */ if (CKR_OK != nssCKFWMutex_Lock(fwInstance->mutex)) { return (NSSCKFWObject *)NULL; } fwObject = (NSSCKFWObject *)nssCKFWHash_Lookup( fwInstance->objectHandleHash, (const void *)hObject); /* Assert(hObject == nssCKFWObject_GetHandle(fwObject)) */ (void)nssCKFWMutex_Unlock(fwInstance->mutex); return fwObject; }
/* * nssCKFWInstance_DestroySessionHandle * */ NSS_IMPLEMENT void nssCKFWInstance_DestroySessionHandle( NSSCKFWInstance *fwInstance, CK_SESSION_HANDLE hSession) { NSSCKFWSession *fwSession; #ifdef NSSDEBUG if (CKR_OK != nssCKFWInstance_verifyPointer(fwInstance)) { return; } #endif /* NSSDEBUG */ if (CKR_OK != nssCKFWMutex_Lock(fwInstance->mutex)) { return; } fwSession = (NSSCKFWSession *)nssCKFWHash_Lookup( fwInstance->sessionHandleHash, (const void *)hSession); if (fwSession) { nssCKFWHash_Remove(fwInstance->sessionHandleHash, (const void *)hSession); nssCKFWSession_SetHandle(fwSession, (CK_SESSION_HANDLE)0); } (void)nssCKFWMutex_Unlock(fwInstance->mutex); return; }
/* * nssCKFWInstance_ResolveSessionHandle * */ NSS_IMPLEMENT NSSCKFWSession * nssCKFWInstance_ResolveSessionHandle( NSSCKFWInstance *fwInstance, CK_SESSION_HANDLE hSession) { NSSCKFWSession *fwSession; #ifdef NSSDEBUG if (CKR_OK != nssCKFWInstance_verifyPointer(fwInstance)) { return (NSSCKFWSession *)NULL; } #endif /* NSSDEBUG */ if (CKR_OK != nssCKFWMutex_Lock(fwInstance->mutex)) { return (NSSCKFWSession *)NULL; } fwSession = (NSSCKFWSession *)nssCKFWHash_Lookup( fwInstance->sessionHandleHash, (const void *)hSession); /* Assert(hSession == nssCKFWSession_GetHandle(fwSession)) */ (void)nssCKFWMutex_Unlock(fwInstance->mutex); return fwSession; }
/* * nssCKFWInstance_ReassignObjectHandle * */ NSS_IMPLEMENT CK_RV nssCKFWInstance_ReassignObjectHandle( NSSCKFWInstance *fwInstance, CK_OBJECT_HANDLE hObject, NSSCKFWObject *fwObject) { CK_RV error = CKR_OK; NSSCKFWObject *oldObject; #ifdef NSSDEBUG error = nssCKFWInstance_verifyPointer(fwInstance); if (CKR_OK != error) { return error; } #endif /* NSSDEBUG */ error = nssCKFWMutex_Lock(fwInstance->mutex); if (CKR_OK != error) { return error; } oldObject = (NSSCKFWObject *)nssCKFWHash_Lookup( fwInstance->objectHandleHash, (const void *)hObject); if (oldObject) { /* Assert(hObject == nssCKFWObject_GetHandle(oldObject) */ (void)nssCKFWObject_SetHandle(oldObject, (CK_SESSION_HANDLE)0); nssCKFWHash_Remove(fwInstance->objectHandleHash, (const void *)hObject); } error = nssCKFWObject_SetHandle(fwObject, hObject); if (CKR_OK != error) { goto done; } error = nssCKFWHash_Add(fwInstance->objectHandleHash, (const void *)hObject, (const void *)fwObject); done: (void)nssCKFWMutex_Unlock(fwInstance->mutex); return error; }
/* * 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 */ if( (NSSCKFWToken *)NULL == fwToken ) { *pError = CKR_ARGUMENTS_BAD; return (NSSCKFWObject *)NULL; } 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; 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; }