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 + -
显示快捷键?