sessobj.c
来自「支持SSL v2/v3, TLS, PKCS #5, PKCS #7, PKCS」· C语言 代码 · 共 1,092 行 · 第 1/2 页
C
1,092 行
/* * The contents of this file are subject to the Mozilla Public * License Version 1.1 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or * implied. See the License for the specific language governing * rights and limitations under the License. * * The Original Code is the Netscape security libraries. * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are * Copyright (C) 1994-2000 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the * terms of the GNU General Public License Version 2 or later (the * "GPL"), in which case the provisions of the GPL are applicable * instead of those above. If you wish to allow use of your * version of this file only under the terms of the GPL and not to * allow others to use your version of this file under the MPL, * indicate your decision by deleting the provisions above and * replace them with the notice and other provisions required by * the GPL. If you do not delete the provisions above, a recipient * may use your version of this file under either the MPL or the * GPL. */#ifdef DEBUGstatic const char CVS_ID[] = "@(#) $RCSfile: sessobj.c,v $ $Revision: 1.5 $ $Date: 2000/09/06 22:23:56 $ $Name: NSS_3_1_1_RTM $";#endif /* DEBUG *//* * sessobj.c * * This file contains an NSSCKMDObject implementation for session * objects. The framework uses this implementation to manage * session objects when a Module doesn't wish to be bothered. */#ifndef CK_T#include "ck.h"#endif /* CK_T *//* * nssCKMDSessionObject * * -- create -- * nssCKMDSessionObject_Create * * -- EPV calls -- * nss_ckmdSessionObject_Finalize * nss_ckmdSessionObject_IsTokenObject * nss_ckmdSessionObject_GetAttributeCount * nss_ckmdSessionObject_GetAttributeTypes * nss_ckmdSessionObject_GetAttributeSize * nss_ckmdSessionObject_GetAttribute * nss_ckmdSessionObject_SetAttribute * nss_ckmdSessionObject_GetObjectSize */struct nssCKMDSessionObjectStr { CK_ULONG n; NSSArena *arena; NSSItem *attributes; CK_ATTRIBUTE_TYPE_PTR types; nssCKFWHash *hash;};typedef struct nssCKMDSessionObjectStr nssCKMDSessionObject;#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_RVnss_ckmdSessionObject_add_pointer( const NSSCKMDObject *mdObject){ return CKR_OK;}static CK_RVnss_ckmdSessionObject_remove_pointer( const NSSCKMDObject *mdObject){ return CKR_OK;}static CK_RVnss_ckmdSessionObject_verifyPointer( const NSSCKMDObject *mdObject){ return CKR_OK;}#endif /* DEBUG *//* * We must forward-declare these routines */static voidnss_ckmdSessionObject_Finalize( NSSCKMDObject *mdObject, NSSCKFWObject *fwObject, NSSCKMDSession *mdSession, NSSCKFWSession *fwSession, NSSCKMDToken *mdToken, NSSCKFWToken *fwToken, NSSCKMDInstance *mdInstance, NSSCKFWInstance *fwInstance);static CK_RVnss_ckmdSessionObject_Destroy( NSSCKMDObject *mdObject, NSSCKFWObject *fwObject, NSSCKMDSession *mdSession, NSSCKFWSession *fwSession, NSSCKMDToken *mdToken, NSSCKFWToken *fwToken, NSSCKMDInstance *mdInstance, NSSCKFWInstance *fwInstance);static CK_BBOOLnss_ckmdSessionObject_IsTokenObject( NSSCKMDObject *mdObject, NSSCKFWObject *fwObject, NSSCKMDSession *mdSession, NSSCKFWSession *fwSession, NSSCKMDToken *mdToken, NSSCKFWToken *fwToken, NSSCKMDInstance *mdInstance, NSSCKFWInstance *fwInstance);static CK_ULONGnss_ckmdSessionObject_GetAttributeCount( NSSCKMDObject *mdObject, NSSCKFWObject *fwObject, NSSCKMDSession *mdSession, NSSCKFWSession *fwSession, NSSCKMDToken *mdToken, NSSCKFWToken *fwToken, NSSCKMDInstance *mdInstance, NSSCKFWInstance *fwInstance, CK_RV *pError);static CK_RVnss_ckmdSessionObject_GetAttributeTypes( NSSCKMDObject *mdObject, NSSCKFWObject *fwObject, NSSCKMDSession *mdSession, NSSCKFWSession *fwSession, NSSCKMDToken *mdToken, NSSCKFWToken *fwToken, NSSCKMDInstance *mdInstance, NSSCKFWInstance *fwInstance, CK_ATTRIBUTE_TYPE_PTR typeArray, CK_ULONG ulCount);static CK_ULONGnss_ckmdSessionObject_GetAttributeSize( NSSCKMDObject *mdObject, NSSCKFWObject *fwObject, NSSCKMDSession *mdSession, NSSCKFWSession *fwSession, NSSCKMDToken *mdToken, NSSCKFWToken *fwToken, NSSCKMDInstance *mdInstance, NSSCKFWInstance *fwInstance, CK_ATTRIBUTE_TYPE attribute, CK_RV *pError);static NSSItem *nss_ckmdSessionObject_GetAttribute( NSSCKMDObject *mdObject, NSSCKFWObject *fwObject, NSSCKMDSession *mdSession, NSSCKFWSession *fwSession, NSSCKMDToken *mdToken, NSSCKFWToken *fwToken, NSSCKMDInstance *mdInstance, NSSCKFWInstance *fwInstance, CK_ATTRIBUTE_TYPE attribute, CK_RV *pError);static CK_RVnss_ckmdSessionObject_SetAttribute( NSSCKMDObject *mdObject, NSSCKFWObject *fwObject, NSSCKMDSession *mdSession, NSSCKFWSession *fwSession, NSSCKMDToken *mdToken, NSSCKFWToken *fwToken, NSSCKMDInstance *mdInstance, NSSCKFWInstance *fwInstance, CK_ATTRIBUTE_TYPE attribute, NSSItem *value);static CK_ULONGnss_ckmdSessionObject_GetObjectSize( NSSCKMDObject *mdObject, NSSCKFWObject *fwObject, NSSCKMDSession *mdSession, NSSCKFWSession *fwSession, NSSCKMDToken *mdToken, NSSCKFWToken *fwToken, NSSCKMDInstance *mdInstance, NSSCKFWInstance *fwInstance, CK_RV *pError);/* * 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; mdso = nss_ZNEW(arena, nssCKMDSessionObject); if( (nssCKMDSessionObject *)NULL == mdso ) { goto loser; } mdso->arena = arena; mdso->n = ulCount; mdso->attributes = nss_ZNEWARRAY(arena, NSSItem, ulCount); if( (NSSItem *)NULL == mdso->attributes ) { goto loser; } mdso->types = nss_ZNEWARRAY(arena, CK_ATTRIBUTE_TYPE, ulCount); 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( (void *)NULL == 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( (NSSCKMDObject *)NULL == 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( (nssCKFWHash *)NULL == 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( CKR_OK != nss_ckmdSessionObject_add_pointer(mdObject) ) { goto loser; }#endif /* DEBUG */ *pError = CKR_OK; return mdObject; loser: if( (nssCKMDSessionObject *)NULL != mdso ) { if( (NSSItem *)NULL != 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); *pError = CKR_HOST_MEMORY; return (NSSCKMDObject *)NULL;}/* * nss_ckmdSessionObject_Finalize * */static voidnss_ckmdSessionObject_Finalize( NSSCKMDObject *mdObject, NSSCKFWObject *fwObject, NSSCKMDSession *mdSession, NSSCKFWSession *fwSession, NSSCKMDToken *mdToken, NSSCKFWToken *fwToken, NSSCKMDInstance *mdInstance, NSSCKFWInstance *fwInstance){ /* This shouldn't ever be called */ return;}/* * nss_ckmdSessionObject_Destroy * */static CK_RVnss_ckmdSessionObject_Destroy( NSSCKMDObject *mdObject, NSSCKFWObject *fwObject, NSSCKMDSession *mdSession, NSSCKFWSession *fwSession, NSSCKMDToken *mdToken, NSSCKFWToken *fwToken, NSSCKMDInstance *mdInstance, NSSCKFWInstance *fwInstance){#ifdef NSSDEBUG CK_RV error = CKR_OK;#endif /* NSSDEBUG */ nssCKMDSessionObject *mdso; CK_ULONG i;#ifdef NSSDEBUG error = nss_ckmdSessionObject_verifyPointer(mdObject); if( CKR_OK != error ) { return error; }#endif /* NSSDEBUG */ mdso = (nssCKMDSessionObject *)mdObject->etc; nssCKFWHash_Remove(mdso->hash, mdObject); for( i = 0; i < mdso->n; i++ ) { nss_ZFreeIf(mdso->attributes[i].data); } nss_ZFreeIf(mdso->attributes); nss_ZFreeIf(mdso->types); nss_ZFreeIf(mdso); nss_ZFreeIf(mdObject);#ifdef DEBUG (void)nss_ckmdSessionObject_remove_pointer(mdObject);#endif /* DEBUG */ return CKR_OK;}/* * nss_ckmdSessionObject_IsTokenObject * */static CK_BBOOLnss_ckmdSessionObject_IsTokenObject( NSSCKMDObject *mdObject, NSSCKFWObject *fwObject, NSSCKMDSession *mdSession, NSSCKFWSession *fwSession, NSSCKMDToken *mdToken, NSSCKFWToken *fwToken, NSSCKMDInstance *mdInstance, NSSCKFWInstance *fwInstance){#ifdef NSSDEBUG if( CKR_OK != nss_ckmdSessionObject_verifyPointer(mdObject) ) { return CK_FALSE; }#endif /* NSSDEBUG */ /* * This implementation is only ever used for session objects. */ return CK_FALSE;}/* * nss_ckmdSessionObject_GetAttributeCount * */static CK_ULONGnss_ckmdSessionObject_GetAttributeCount( NSSCKMDObject *mdObject, NSSCKFWObject *fwObject, NSSCKMDSession *mdSession, NSSCKFWSession *fwSession, NSSCKMDToken *mdToken, NSSCKFWToken *fwToken, NSSCKMDInstance *mdInstance, NSSCKFWInstance *fwInstance, CK_RV *pError){ nssCKMDSessionObject *obj;#ifdef NSSDEBUG if( (CK_RV *)NULL == pError ) { return 0; } *pError = nss_ckmdSessionObject_verifyPointer(mdObject); if( CKR_OK != *pError ) { return 0; } /* We could even check all the other arguments, for sanity. */#endif /* NSSDEBUG */ obj = (nssCKMDSessionObject *)mdObject->etc; return obj->n;}/* * nss_ckmdSessionObject_GetAttributeTypes * */static CK_RVnss_ckmdSessionObject_GetAttributeTypes( NSSCKMDObject *mdObject, NSSCKFWObject *fwObject, NSSCKMDSession *mdSession, NSSCKFWSession *fwSession, NSSCKMDToken *mdToken, NSSCKFWToken *fwToken, NSSCKMDInstance *mdInstance, NSSCKFWInstance *fwInstance, CK_ATTRIBUTE_TYPE_PTR typeArray, CK_ULONG ulCount){#ifdef NSSDEBUG CK_RV error = CKR_OK;#endif /* NSSDEBUG */ nssCKMDSessionObject *obj;#ifdef NSSDEBUG error = nss_ckmdSessionObject_verifyPointer(mdObject); if( CKR_OK != error ) { return error; } /* We could even check all the other arguments, for sanity. */#endif /* NSSDEBUG */ obj = (nssCKMDSessionObject *)mdObject->etc; if( ulCount < obj->n ) { return CKR_BUFFER_TOO_SMALL; } (void)nsslibc_memcpy(typeArray, obj->types, sizeof(CK_ATTRIBUTE_TYPE) * obj->n); return CKR_OK;}/* * nss_ckmdSessionObject_GetAttributeSize * */static CK_ULONGnss_ckmdSessionObject_GetAttributeSize( NSSCKMDObject *mdObject, NSSCKFWObject *fwObject, NSSCKMDSession *mdSession, NSSCKFWSession *fwSession, NSSCKMDToken *mdToken, NSSCKFWToken *fwToken, NSSCKMDInstance *mdInstance, NSSCKFWInstance *fwInstance,
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?