/* * nssCKFWInstance_CreateSessionHandle * */ NSS_IMPLEMENT CK_SESSION_HANDLE nssCKFWInstance_CreateSessionHandle( NSSCKFWInstance *fwInstance, NSSCKFWSession *fwSession, CK_RV *pError) { CK_SESSION_HANDLE hSession; #ifdef NSSDEBUG if (!pError) { return (CK_SESSION_HANDLE)0; } *pError = nssCKFWInstance_verifyPointer(fwInstance); if (CKR_OK != *pError) { return (CK_SESSION_HANDLE)0; } #endif /* NSSDEBUG */ *pError = nssCKFWMutex_Lock(fwInstance->mutex); if (CKR_OK != *pError) { return (CK_SESSION_HANDLE)0; } hSession = ++(fwInstance->lastSessionHandle); /* Alan would say I should unlock for this call. */ *pError = nssCKFWSession_SetHandle(fwSession, hSession); if (CKR_OK != *pError) { goto done; } *pError = nssCKFWHash_Add(fwInstance->sessionHandleHash, (const void *)hSession, (const void *)fwSession); if (CKR_OK != *pError) { hSession = (CK_SESSION_HANDLE)0; goto done; } done: nssCKFWMutex_Unlock(fwInstance->mutex); return hSession; }
/* * nssCKFWInstance_CreateObjectHandle * */ NSS_IMPLEMENT CK_OBJECT_HANDLE nssCKFWInstance_CreateObjectHandle( NSSCKFWInstance *fwInstance, NSSCKFWObject *fwObject, CK_RV *pError) { CK_OBJECT_HANDLE hObject; #ifdef NSSDEBUG if (!pError) { return (CK_OBJECT_HANDLE)0; } *pError = nssCKFWInstance_verifyPointer(fwInstance); if (CKR_OK != *pError) { return (CK_OBJECT_HANDLE)0; } #endif /* NSSDEBUG */ *pError = nssCKFWMutex_Lock(fwInstance->mutex); if (CKR_OK != *pError) { return (CK_OBJECT_HANDLE)0; } hObject = ++(fwInstance->lastObjectHandle); *pError = nssCKFWObject_SetHandle(fwObject, hObject); if (CKR_OK != *pError) { hObject = (CK_OBJECT_HANDLE)0; goto done; } *pError = nssCKFWHash_Add(fwInstance->objectHandleHash, (const void *)hObject, (const void *)fwObject); if (CKR_OK != *pError) { hObject = (CK_OBJECT_HANDLE)0; goto done; } done: (void)nssCKFWMutex_Unlock(fwInstance->mutex); return hObject; }
/* * 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; }
/* * nssCKMDSessionObject_Create * */ NSS_IMPLEMENT NSSCKMDObject * nssCKMDSessionObject_Create ( NSSCKFWToken *fwToken, NSSArena *arena, CK_ATTRIBUTE_PTR attributes, CK_ULONG ulCount, CK_RV *pError ) { NSSCKMDObject *mdObject = (NSSCKMDObject *)NULL; nssCKMDSessionObject *mdso = (nssCKMDSessionObject *)NULL; CK_ULONG i; nssCKFWHash *hash; *pError = CKR_OK; mdso = nss_ZNEW(arena, nssCKMDSessionObject); if (!mdso) { goto loser; } mdso->arena = arena; mdso->n = ulCount; mdso->attributes = nss_ZNEWARRAY(arena, NSSItem, ulCount); if (!mdso->attributes) { goto loser; } mdso->types = nss_ZNEWARRAY(arena, CK_ATTRIBUTE_TYPE, ulCount); if (!mdso->types) { goto loser; } for( i = 0; i < ulCount; i++ ) { mdso->types[i] = attributes[i].type; mdso->attributes[i].size = attributes[i].ulValueLen; mdso->attributes[i].data = nss_ZAlloc(arena, attributes[i].ulValueLen); if (!mdso->attributes[i].data) { goto loser; } (void)nsslibc_memcpy(mdso->attributes[i].data, attributes[i].pValue, attributes[i].ulValueLen); } mdObject = nss_ZNEW(arena, NSSCKMDObject); if (!mdObject) { goto loser; } mdObject->etc = (void *)mdso; mdObject->Finalize = nss_ckmdSessionObject_Finalize; mdObject->Destroy = nss_ckmdSessionObject_Destroy; mdObject->IsTokenObject = nss_ckmdSessionObject_IsTokenObject; mdObject->GetAttributeCount = nss_ckmdSessionObject_GetAttributeCount; mdObject->GetAttributeTypes = nss_ckmdSessionObject_GetAttributeTypes; mdObject->GetAttributeSize = nss_ckmdSessionObject_GetAttributeSize; mdObject->GetAttribute = nss_ckmdSessionObject_GetAttribute; mdObject->SetAttribute = nss_ckmdSessionObject_SetAttribute; mdObject->GetObjectSize = nss_ckmdSessionObject_GetObjectSize; hash = nssCKFWToken_GetSessionObjectHash(fwToken); if (!hash) { *pError = CKR_GENERAL_ERROR; goto loser; } mdso->hash = hash; *pError = nssCKFWHash_Add(hash, mdObject, mdObject); if( CKR_OK != *pError ) { goto loser; } #ifdef DEBUG if(( *pError = nss_ckmdSessionObject_add_pointer(mdObject)) != CKR_OK ) { goto loser; } #endif /* DEBUG */ return mdObject; loser: if (mdso) { if (mdso->attributes) { for( i = 0; i < ulCount; i++ ) { nss_ZFreeIf(mdso->attributes[i].data); } nss_ZFreeIf(mdso->attributes); } nss_ZFreeIf(mdso->types); nss_ZFreeIf(mdso); } nss_ZFreeIf(mdObject); if (*pError == CKR_OK) { *pError = CKR_HOST_MEMORY; } return (NSSCKMDObject *)NULL; }