📄 object.c
字号:
return CKR_GENERAL_ERROR; } error = nssCKFWMutex_Lock(fwObject->mutex); if( CKR_OK != error ) { return error; } error = fwObject->mdObject->GetAttributeTypes(fwObject->mdObject, fwObject, fwObject->mdSession, fwObject->fwSession, fwObject->mdToken, fwObject->fwToken, fwObject->mdInstance, fwObject->fwInstance, typeArray, ulCount); (void)nssCKFWMutex_Unlock(fwObject->mutex); return error;}/* * nssCKFWObject_GetAttributeSize * */NSS_IMPLEMENT CK_ULONGnssCKFWObject_GetAttributeSize( NSSCKFWObject *fwObject, CK_ATTRIBUTE_TYPE attribute, 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->GetAttributeSize ) { *pError = CKR_GENERAL_ERROR; return (CK_ULONG )0; } *pError = nssCKFWMutex_Lock(fwObject->mutex); if( CKR_OK != *pError ) { return (CK_ULONG)0; } rv = fwObject->mdObject->GetAttributeSize(fwObject->mdObject, fwObject, fwObject->mdSession, fwObject->fwSession, fwObject->mdToken, fwObject->fwToken, fwObject->mdInstance, fwObject->fwInstance, attribute, pError); (void)nssCKFWMutex_Unlock(fwObject->mutex); return rv;}/* * nssCKFWObject_GetAttribute * * Usual NSS allocation rules: * If itemOpt is not NULL, it will be returned; otherwise an NSSItem * will be allocated. If itemOpt is not NULL but itemOpt->data is, * the buffer will be allocated; otherwise, the buffer will be used. * Any allocations will come from the optional arena, if one is * specified. */NSS_IMPLEMENT NSSItem *nssCKFWObject_GetAttribute( NSSCKFWObject *fwObject, CK_ATTRIBUTE_TYPE attribute, NSSItem *itemOpt, NSSArena *arenaOpt, CK_RV *pError){ NSSItem *rv = (NSSItem *)NULL; NSSItem *mdItem;#ifdef NSSDEBUG if( (CK_RV *)NULL == pError ) { return (NSSItem *)NULL; } *pError = nssCKFWObject_verifyPointer(fwObject); if( CKR_OK != *pError ) { return (NSSItem *)NULL; }#endif /* NSSDEBUG */ if( (void *)NULL == (void *)fwObject->mdObject->GetAttributeSize ) { *pError = CKR_GENERAL_ERROR; return (NSSItem *)NULL; } *pError = nssCKFWMutex_Lock(fwObject->mutex); if( CKR_OK != *pError ) { return (NSSItem *)NULL; } mdItem = fwObject->mdObject->GetAttribute(fwObject->mdObject, fwObject, fwObject->mdSession, fwObject->fwSession, fwObject->mdToken, fwObject->fwToken, fwObject->mdInstance, fwObject->fwInstance, attribute, pError); if( (NSSItem *)NULL == mdItem ) { if( CKR_OK == *pError ) { *pError = CKR_GENERAL_ERROR; } goto done; } if( (NSSItem *)NULL == itemOpt ) { rv = nss_ZNEW(arenaOpt, NSSItem); if( (NSSItem *)NULL == rv ) { *pError = CKR_HOST_MEMORY; goto done; } } else { rv = itemOpt; } if( (void *)NULL == rv->data ) { rv->size = mdItem->size; rv->data = nss_ZAlloc(arenaOpt, rv->size); if( (void *)NULL == rv->data ) { *pError = CKR_HOST_MEMORY; if( (NSSItem *)NULL == itemOpt ) { nss_ZFreeIf(rv); } rv = (NSSItem *)NULL; goto done; } } else { if( rv->size >= mdItem->size ) { rv->size = mdItem->size; } else { *pError = CKR_BUFFER_TOO_SMALL; /* Should we set rv->size to mdItem->size? */ /* rv can't have been allocated */ rv = (NSSItem *)NULL; goto done; } } (void)nsslibc_memcpy(rv->data, mdItem->data, rv->size); done: (void)nssCKFWMutex_Unlock(fwObject->mutex); return rv;}/* * nssCKFWObject_SetAttribute * */NSS_IMPLEMENT CK_RVnssCKFWObject_SetAttribute( NSSCKFWObject *fwObject, CK_ATTRIBUTE_TYPE attribute, NSSItem *value){ CK_RV error = CKR_OK;#ifdef NSSDEBUG error = nssCKFWObject_verifyPointer(fwObject); if( CKR_OK != error ) { return error; }#endif /* NSSDEBUG */ if( CKA_TOKEN == attribute ) { /* * We're changing from a session object to a token object or * vice-versa. */ CK_ATTRIBUTE a; NSSCKFWObject *newFwObject; NSSCKFWObject swab; a.type = CKA_TOKEN; a.pValue = value->data; a.ulValueLen = value->size; newFwObject = nssCKFWSession_CopyObject(fwObject->fwSession, fwObject, &a, 1, &error); if( (NSSCKFWObject *)NULL == newFwObject ) { if( CKR_OK == error ) { error = CKR_GENERAL_ERROR; } return error; } /* * Actually, I bet the locking is worse than this.. this part of * the code could probably use some scrutiny and reworking. */ error = nssCKFWMutex_Lock(fwObject->mutex); if( CKR_OK != error ) { nssCKFWObject_Destroy(newFwObject); return error; } error = nssCKFWMutex_Lock(newFwObject->mutex); if( CKR_OK != error ) { nssCKFWMutex_Unlock(fwObject->mutex); nssCKFWObject_Destroy(newFwObject); return error; } /* * Now, we have our new object, but it has a new fwObject pointer, * while we have to keep the existing one. So quick swap the contents. */ swab = *fwObject; *fwObject = *newFwObject; *newFwObject = swab; /* But keep the mutexes the same */ swab.mutex = fwObject->mutex; fwObject->mutex = newFwObject->mutex; newFwObject->mutex = swab.mutex; (void)nssCKFWMutex_Unlock(newFwObject->mutex); (void)nssCKFWMutex_Unlock(fwObject->mutex); /* * Either remove or add this to the list of session objects */ if( CK_FALSE == *(CK_BBOOL *)value->data ) { /* * New one is a session object, except since we "stole" the fwObject, it's * not in the list. Add it. */ nssCKFWSession_RegisterSessionObject(fwObject->fwSession, fwObject); } else { /* * New one is a token object, except since we "stole" the fwObject, it's * in the list. Remove it. */ nssCKFWSession_DeregisterSessionObject(fwObject->fwSession, fwObject); } /* * Now delete the old object. Remember the names have changed. */ nssCKFWObject_Destroy(newFwObject); return CKR_OK; } else { /* * An "ordinary" change. */ if( (void *)NULL == (void *)fwObject->mdObject->SetAttribute ) { /* We could fake it with copying, like above.. later */ return CKR_ATTRIBUTE_READ_ONLY; } error = nssCKFWMutex_Lock(fwObject->mutex); if( CKR_OK != error ) { return error; } error = fwObject->mdObject->SetAttribute(fwObject->mdObject, fwObject, fwObject->mdSession, fwObject->fwSession, fwObject->mdToken, fwObject->fwToken, fwObject->mdInstance, fwObject->fwInstance, attribute, value); (void)nssCKFWMutex_Unlock(fwObject->mutex); return error; }}/* * nssCKFWObject_GetObjectSize * */NSS_IMPLEMENT CK_ULONGnssCKFWObject_GetObjectSize( 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->GetObjectSize ) { *pError = CKR_INFORMATION_SENSITIVE; return (CK_ULONG)0; } *pError = nssCKFWMutex_Lock(fwObject->mutex); if( CKR_OK != *pError ) { return (CK_ULONG)0; } rv = fwObject->mdObject->GetObjectSize(fwObject->mdObject, fwObject, fwObject->mdSession, fwObject->fwSession, fwObject->mdToken, fwObject->fwToken, fwObject->mdInstance, fwObject->fwInstance, pError); (void)nssCKFWMutex_Unlock(fwObject->mutex); return rv;}/* * NSSCKFWObject_GetMDObject * */NSS_IMPLEMENT NSSCKMDObject *NSSCKFWObject_GetMDObject( NSSCKFWObject *fwObject){#ifdef DEBUG if( CKR_OK != nssCKFWObject_verifyPointer(fwObject) ) { return (NSSCKMDObject *)NULL; }#endif /* DEBUG */ return nssCKFWObject_GetMDObject(fwObject);}/* * NSSCKFWObject_GetArena * */NSS_IMPLEMENT NSSArena *NSSCKFWObject_GetArena( NSSCKFWObject *fwObject, CK_RV *pError){#ifdef DEBUG if( (CK_RV *)NULL == pError ) { return (NSSArena *)NULL; } *pError = nssCKFWObject_verifyPointer(fwObject); if( CKR_OK != *pError ) { return (NSSArena *)NULL; }#endif /* DEBUG */ return nssCKFWObject_GetArena(fwObject, pError);}/* * NSSCKFWObject_IsTokenObject * */NSS_IMPLEMENT CK_BBOOLNSSCKFWObject_IsTokenObject( NSSCKFWObject *fwObject){#ifdef DEBUG if( CKR_OK != nssCKFWObject_verifyPointer(fwObject) ) { return CK_FALSE; }#endif /* DEBUG */ return nssCKFWObject_IsTokenObject(fwObject);}/* * NSSCKFWObject_GetAttributeCount * */NSS_IMPLEMENT CK_ULONGNSSCKFWObject_GetAttributeCount( NSSCKFWObject *fwObject, CK_RV *pError){#ifdef DEBUG if( (CK_RV *)NULL == pError ) { return (CK_ULONG)0; } *pError = nssCKFWObject_verifyPointer(fwObject); if( CKR_OK != *pError ) { return (CK_ULONG)0; }#endif /* DEBUG */ return nssCKFWObject_GetAttributeCount(fwObject, pError);}/* * NSSCKFWObject_GetAttributeTypes * */NSS_IMPLEMENT CK_RVNSSCKFWObject_GetAttributeTypes( NSSCKFWObject *fwObject, CK_ATTRIBUTE_TYPE_PTR typeArray, CK_ULONG ulCount){ CK_RV error = CKR_OK;#ifdef DEBUG error = nssCKFWObject_verifyPointer(fwObject); if( CKR_OK != error ) { return error; } if( (CK_ATTRIBUTE_TYPE_PTR)NULL == typeArray ) { return CKR_ARGUMENTS_BAD; }#endif /* DEBUG */ return nssCKFWObject_GetAttributeTypes(fwObject, typeArray, ulCount);}/* * NSSCKFWObject_GetAttributeSize * */NSS_IMPLEMENT CK_ULONGNSSCKFWObject_GetAttributeSize( NSSCKFWObject *fwObject, CK_ATTRIBUTE_TYPE attribute, CK_RV *pError){#ifdef DEBUG if( (CK_RV *)NULL == pError ) { return (CK_ULONG)0; } *pError = nssCKFWObject_verifyPointer(fwObject); if( CKR_OK != *pError ) { return (CK_ULONG)0; }#endif /* DEBUG */ return nssCKFWObject_GetAttributeSize(fwObject, attribute, pError);}/* * NSSCKFWObject_GetAttribute * */NSS_IMPLEMENT NSSItem *NSSCKFWObject_GetAttribute( NSSCKFWObject *fwObject, CK_ATTRIBUTE_TYPE attribute, NSSItem *itemOpt, NSSArena *arenaOpt, CK_RV *pError){#ifdef DEBUG if( (CK_RV *)NULL == pError ) { return (NSSItem *)NULL; } *pError = nssCKFWObject_verifyPointer(fwObject); if( CKR_OK != *pError ) { return (NSSItem *)NULL; }#endif /* DEBUG */ return nssCKFWObject_GetAttribute(fwObject, attribute, itemOpt, arenaOpt, pError);}/* * NSSCKFWObject_GetObjectSize * */NSS_IMPLEMENT CK_ULONGNSSCKFWObject_GetObjectSize( NSSCKFWObject *fwObject, CK_RV *pError){#ifdef DEBUG if( (CK_RV *)NULL == pError ) { return (CK_ULONG)0; } *pError = nssCKFWObject_verifyPointer(fwObject); if( CKR_OK != *pError ) { return (CK_ULONG)0; }#endif /* DEBUG */ return nssCKFWObject_GetObjectSize(fwObject, pError);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -