⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 object.c

📁 支持SSL v2/v3, TLS, PKCS #5, PKCS #7, PKCS #11, PKCS #12, S/MIME, X.509v3证书等安全协议或标准的开发库编译用到NSPR
💻 C
📖 第 1 页 / 共 2 页
字号:
    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 + -