| Index: mozilla/security/nss/lib/ckfw/object.c
|
| ===================================================================
|
| --- mozilla/security/nss/lib/ckfw/object.c (revision 191424)
|
| +++ mozilla/security/nss/lib/ckfw/object.c (working copy)
|
| @@ -1,1027 +0,0 @@
|
| -/* This Source Code Form is subject to the terms of the Mozilla Public
|
| - * License, v. 2.0. If a copy of the MPL was not distributed with this
|
| - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
| -
|
| -#ifdef DEBUG
|
| -static const char CVS_ID[] = "@(#) $RCSfile: object.c,v $ $Revision: 1.17 $ $Date: 2012/04/25 14:49:28 $";
|
| -#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_RV
|
| -object_add_pointer
|
| -(
|
| - const NSSCKFWObject *fwObject
|
| -)
|
| -{
|
| - return CKR_OK;
|
| -}
|
| -
|
| -static CK_RV
|
| -object_remove_pointer
|
| -(
|
| - const NSSCKFWObject *fwObject
|
| -)
|
| -{
|
| - return CKR_OK;
|
| -}
|
| -
|
| -NSS_IMPLEMENT CK_RV
|
| -nssCKFWObject_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 (!pError) {
|
| - return (NSSCKFWObject *)NULL;
|
| - }
|
| -
|
| - if( PR_SUCCESS != nssArena_verifyPointer(arena) ) {
|
| - *pError = CKR_ARGUMENTS_BAD;
|
| - return (NSSCKFWObject *)NULL;
|
| - }
|
| -#endif /* NSSDEBUG */
|
| -
|
| - if (!fwToken) {
|
| - *pError = CKR_ARGUMENTS_BAD;
|
| - return (NSSCKFWObject *)NULL;
|
| - }
|
| - mdObjectHash = nssCKFWToken_GetMDObjectHash(fwToken);
|
| - if (!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 (!fwObject) {
|
| - *pError = CKR_HOST_MEMORY;
|
| - return (NSSCKFWObject *)NULL;
|
| - }
|
| -
|
| - fwObject->arena = arena;
|
| - fwObject->mdObject = mdObject;
|
| - fwObject->fwSession = fwSession;
|
| -
|
| - if (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 (!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 void
|
| -nssCKFWObject_Finalize
|
| -(
|
| - NSSCKFWObject *fwObject,
|
| - PRBool removeFromHash
|
| -)
|
| -{
|
| - nssCKFWHash *mdObjectHash;
|
| -
|
| -#ifdef NSSDEBUG
|
| - if( CKR_OK != nssCKFWObject_verifyPointer(fwObject) ) {
|
| - return;
|
| - }
|
| -#endif /* NSSDEBUG */
|
| -
|
| - (void)nssCKFWMutex_Destroy(fwObject->mutex);
|
| -
|
| - if (fwObject->mdObject->Finalize) {
|
| - fwObject->mdObject->Finalize(fwObject->mdObject, fwObject,
|
| - fwObject->mdSession, fwObject->fwSession, fwObject->mdToken,
|
| - fwObject->fwToken, fwObject->mdInstance, fwObject->fwInstance);
|
| - }
|
| -
|
| - if (removeFromHash) {
|
| - mdObjectHash = nssCKFWToken_GetMDObjectHash(fwObject->fwToken);
|
| - if (mdObjectHash) {
|
| - nssCKFWHash_Remove(mdObjectHash, fwObject->mdObject);
|
| - }
|
| - }
|
| -
|
| - if (fwObject->fwSession) {
|
| - nssCKFWSession_DeregisterSessionObject(fwObject->fwSession, fwObject);
|
| - }
|
| - nss_ZFreeIf(fwObject);
|
| -
|
| -#ifdef DEBUG
|
| - (void)object_remove_pointer(fwObject);
|
| -#endif /* DEBUG */
|
| -
|
| - return;
|
| -}
|
| -
|
| -/*
|
| - * nssCKFWObject_Destroy
|
| - *
|
| - */
|
| -NSS_IMPLEMENT void
|
| -nssCKFWObject_Destroy
|
| -(
|
| - NSSCKFWObject *fwObject
|
| -)
|
| -{
|
| - nssCKFWHash *mdObjectHash;
|
| -
|
| -#ifdef NSSDEBUG
|
| - if( CKR_OK != nssCKFWObject_verifyPointer(fwObject) ) {
|
| - return;
|
| - }
|
| -#endif /* NSSDEBUG */
|
| -
|
| - (void)nssCKFWMutex_Destroy(fwObject->mutex);
|
| -
|
| - if (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 (mdObjectHash) {
|
| - nssCKFWHash_Remove(mdObjectHash, fwObject->mdObject);
|
| - }
|
| -
|
| - if (fwObject->fwSession) {
|
| - 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 (!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_RV
|
| -nssCKFWObject_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_HANDLE
|
| -nssCKFWObject_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_BBOOL
|
| -nssCKFWObject_IsTokenObject
|
| -(
|
| - NSSCKFWObject *fwObject
|
| -)
|
| -{
|
| - CK_BBOOL b = CK_FALSE;
|
| -
|
| -#ifdef NSSDEBUG
|
| - if( CKR_OK != nssCKFWObject_verifyPointer(fwObject) ) {
|
| - return CK_FALSE;
|
| - }
|
| -#endif /* NSSDEBUG */
|
| -
|
| - if (!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 (!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:
|
| - return b;
|
| -}
|
| -
|
| -/*
|
| - * nssCKFWObject_GetAttributeCount
|
| - *
|
| - */
|
| -NSS_IMPLEMENT CK_ULONG
|
| -nssCKFWObject_GetAttributeCount
|
| -(
|
| - NSSCKFWObject *fwObject,
|
| - CK_RV *pError
|
| -)
|
| -{
|
| - CK_ULONG rv;
|
| -
|
| -#ifdef NSSDEBUG
|
| - if (!pError) {
|
| - return (CK_ULONG)0;
|
| - }
|
| -
|
| - *pError = nssCKFWObject_verifyPointer(fwObject);
|
| - if( CKR_OK != *pError ) {
|
| - return (CK_ULONG)0;
|
| - }
|
| -#endif /* NSSDEBUG */
|
| -
|
| - if (!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_RV
|
| -nssCKFWObject_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 (!fwObject->mdObject->GetAttributeTypes) {
|
| - 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_ULONG
|
| -nssCKFWObject_GetAttributeSize
|
| -(
|
| - NSSCKFWObject *fwObject,
|
| - CK_ATTRIBUTE_TYPE attribute,
|
| - CK_RV *pError
|
| -)
|
| -{
|
| - CK_ULONG rv;
|
| -
|
| -#ifdef NSSDEBUG
|
| - if (!pError) {
|
| - return (CK_ULONG)0;
|
| - }
|
| -
|
| - *pError = nssCKFWObject_verifyPointer(fwObject);
|
| - if( CKR_OK != *pError ) {
|
| - return (CK_ULONG)0;
|
| - }
|
| -#endif /* NSSDEBUG */
|
| -
|
| - if (!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;
|
| - NSSCKFWItem mdItem;
|
| -
|
| -#ifdef NSSDEBUG
|
| - if (!pError) {
|
| - return (NSSItem *)NULL;
|
| - }
|
| -
|
| - *pError = nssCKFWObject_verifyPointer(fwObject);
|
| - if( CKR_OK != *pError ) {
|
| - return (NSSItem *)NULL;
|
| - }
|
| -#endif /* NSSDEBUG */
|
| -
|
| - if (!fwObject->mdObject->GetAttribute) {
|
| - *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 (!mdItem.item) {
|
| - if( CKR_OK == *pError ) {
|
| - *pError = CKR_GENERAL_ERROR;
|
| - }
|
| -
|
| - goto done;
|
| - }
|
| -
|
| - if (!itemOpt) {
|
| - rv = nss_ZNEW(arenaOpt, NSSItem);
|
| - if (!rv) {
|
| - *pError = CKR_HOST_MEMORY;
|
| - goto done;
|
| - }
|
| - } else {
|
| - rv = itemOpt;
|
| - }
|
| -
|
| - if (!rv->data) {
|
| - rv->size = mdItem.item->size;
|
| - rv->data = nss_ZAlloc(arenaOpt, rv->size);
|
| - if (!rv->data) {
|
| - *pError = CKR_HOST_MEMORY;
|
| - if (!itemOpt) {
|
| - nss_ZFreeIf(rv);
|
| - }
|
| - rv = (NSSItem *)NULL;
|
| - goto done;
|
| - }
|
| - } else {
|
| - if( rv->size >= mdItem.item->size ) {
|
| - rv->size = mdItem.item->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.item->data, rv->size);
|
| -
|
| - if (PR_TRUE == mdItem.needsFreeing) {
|
| - PR_ASSERT(fwObject->mdObject->FreeAttribute);
|
| - if (fwObject->mdObject->FreeAttribute) {
|
| - *pError = fwObject->mdObject->FreeAttribute(&mdItem);
|
| - }
|
| - }
|
| -
|
| - done:
|
| - (void)nssCKFWMutex_Unlock(fwObject->mutex);
|
| - return rv;
|
| -}
|
| -
|
| -/*
|
| - * nssCKFWObject_SetAttribute
|
| - *
|
| - */
|
| -NSS_IMPLEMENT CK_RV
|
| -nssCKFWObject_SetAttribute
|
| -(
|
| - NSSCKFWObject *fwObject,
|
| - NSSCKFWSession *fwSession,
|
| - 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(fwSession, fwObject,
|
| - &a, 1, &error);
|
| - if (!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(fwSession, fwObject);
|
| - } else {
|
| - /*
|
| - * New one is a token object, except since we "stole" the fwObject, it's
|
| - * in the list. Remove it.
|
| - */
|
| - if (fwObject->fwSession) {
|
| - 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 (!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_ULONG
|
| -nssCKFWObject_GetObjectSize
|
| -(
|
| - NSSCKFWObject *fwObject,
|
| - CK_RV *pError
|
| -)
|
| -{
|
| - CK_ULONG rv;
|
| -
|
| -#ifdef NSSDEBUG
|
| - if (!pError) {
|
| - return (CK_ULONG)0;
|
| - }
|
| -
|
| - *pError = nssCKFWObject_verifyPointer(fwObject);
|
| - if( CKR_OK != *pError ) {
|
| - return (CK_ULONG)0;
|
| - }
|
| -#endif /* NSSDEBUG */
|
| -
|
| - if (!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 (!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_BBOOL
|
| -NSSCKFWObject_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_ULONG
|
| -NSSCKFWObject_GetAttributeCount
|
| -(
|
| - NSSCKFWObject *fwObject,
|
| - CK_RV *pError
|
| -)
|
| -{
|
| -#ifdef DEBUG
|
| - if (!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_RV
|
| -NSSCKFWObject_GetAttributeTypes
|
| -(
|
| - NSSCKFWObject *fwObject,
|
| - CK_ATTRIBUTE_TYPE_PTR typeArray,
|
| - CK_ULONG ulCount
|
| -)
|
| -{
|
| -#ifdef DEBUG
|
| - CK_RV error = CKR_OK;
|
| -
|
| - 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_ULONG
|
| -NSSCKFWObject_GetAttributeSize
|
| -(
|
| - NSSCKFWObject *fwObject,
|
| - CK_ATTRIBUTE_TYPE attribute,
|
| - CK_RV *pError
|
| -)
|
| -{
|
| -#ifdef DEBUG
|
| - if (!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 (!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_ULONG
|
| -NSSCKFWObject_GetObjectSize
|
| -(
|
| - NSSCKFWObject *fwObject,
|
| - CK_RV *pError
|
| -)
|
| -{
|
| -#ifdef DEBUG
|
| - if (!pError) {
|
| - return (CK_ULONG)0;
|
| - }
|
| -
|
| - *pError = nssCKFWObject_verifyPointer(fwObject);
|
| - if( CKR_OK != *pError ) {
|
| - return (CK_ULONG)0;
|
| - }
|
| -#endif /* DEBUG */
|
| -
|
| - return nssCKFWObject_GetObjectSize(fwObject, pError);
|
| -}
|
|
|