sessobj.c

来自「支持SSL v2/v3, TLS, PKCS #5, PKCS #7, PKCS」· C语言 代码 · 共 1,092 行 · 第 1/2 页

C
1,092
字号
  CK_ATTRIBUTE_TYPE attribute,  CK_RV *pError){  nssCKMDSessionObject *obj;  CK_ULONG i;#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;  for( i = 0; i < obj->n; i++ ) {    if( attribute == obj->types[i] ) {      return (CK_ULONG)(obj->attributes[i].size);    }  }  *pError = CKR_ATTRIBUTE_TYPE_INVALID;  return 0;}/* * nss_ckmdSessionObject_GetAttribute * */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){  nssCKMDSessionObject *obj;  CK_ULONG i;#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;  for( i = 0; i < obj->n; i++ ) {    if( attribute == obj->types[i] ) {      return &obj->attributes[i];    }  }  *pError = CKR_ATTRIBUTE_TYPE_INVALID;  return 0;}/* * nss_ckmdSessionObject_SetAttribute * *//* * Okay, so this implementation sucks.  It doesn't support removing * an attribute (if value == NULL), and could be more graceful about * memory.  It should allow "blank" slots in the arrays, with some * invalid attribute type, and then it could support removal much * more easily.  Do this later. */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){  nssCKMDSessionObject *obj;  CK_ULONG i;  NSSItem n;  NSSItem *ra;  CK_ATTRIBUTE_TYPE_PTR rt;#ifdef NSSDEBUG  CK_RV error;#endif /* NSSDEBUG */#ifdef NSSDEBUG  error = nss_ckmdSessionObject_verifyPointer(mdObject);  if( CKR_OK != error ) {    return 0;  }  /* We could even check all the other arguments, for sanity. */#endif /* NSSDEBUG */  obj = (nssCKMDSessionObject *)mdObject->etc;  n.size = value->size;  n.data = nss_ZAlloc(obj->arena, n.size);  if( (void *)NULL == n.data ) {    return CKR_HOST_MEMORY;  }  (void)nsslibc_memcpy(n.data, value->data, n.size);  for( i = 0; i < obj->n; i++ ) {    if( attribute == obj->types[i] ) {      nss_ZFreeIf(obj->attributes[i].data);      obj->attributes[i] = n;      return CKR_OK;    }  }  /*   * It's new.   */  ra = (NSSItem *)nss_ZRealloc(obj->attributes, sizeof(NSSItem) * (obj->n + 1));  if( (NSSItem *)NULL == ra ) {    nss_ZFreeIf(n.data);    return CKR_HOST_MEMORY;  }  rt = (CK_ATTRIBUTE_TYPE_PTR)nss_ZRealloc(obj->types, (obj->n + 1));  if( (CK_ATTRIBUTE_TYPE_PTR)NULL == rt ) {    nss_ZFreeIf(n.data);    obj->attributes = (NSSItem *)nss_ZRealloc(ra, sizeof(NSSItem) * obj->n);    if( (NSSItem *)NULL == obj->attributes ) {      return CKR_GENERAL_ERROR;    }    return CKR_HOST_MEMORY;  }  obj->attributes = ra;  obj->types = rt;  obj->attributes[obj->n] = n;  obj->types[obj->n] = attribute;  obj->n++;  return CKR_OK;}/* * nss_ckmdSessionObject_GetObjectSize * */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 *obj;  CK_ULONG i;  CK_ULONG rv = (CK_ULONG)0;#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;  for( i = 0; i < obj->n; i++ ) {    rv += obj->attributes[i].size;  }  rv += sizeof(NSSItem) * obj->n;  rv += sizeof(CK_ATTRIBUTE_TYPE) * obj->n;  rv += sizeof(nssCKMDSessionObject);  return rv;}/* * nssCKMDFindSessionObjects * *  -- create -- *  nssCKMDFindSessionObjects_Create * *  -- EPV calls -- *  nss_ckmdFindSessionObjects_Final *  nss_ckmdFindSessionObjects_Next */struct nodeStr {  struct nodeStr *next;  NSSCKMDObject *mdObject;};struct nssCKMDFindSessionObjectsStr {  NSSArena *arena;  CK_RV error;  CK_ATTRIBUTE_PTR pTemplate;  CK_ULONG ulCount;  struct nodeStr *list;  nssCKFWHash *hash;};typedef struct nssCKMDFindSessionObjectsStr nssCKMDFindSessionObjects;#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_ckmdFindSessionObjects_add_pointer(  const NSSCKMDFindObjects *mdFindObjects){  return CKR_OK;}static CK_RVnss_ckmdFindSessionObjects_remove_pointer(  const NSSCKMDFindObjects *mdFindObjects){  return CKR_OK;}static CK_RVnss_ckmdFindSessionObjects_verifyPointer(  const NSSCKMDFindObjects *mdFindObjects){  return CKR_OK;}#endif /* DEBUG *//* * We must forward-declare these routines. */static voidnss_ckmdFindSessionObjects_Final(  NSSCKMDFindObjects *mdFindObjects,  NSSCKFWFindObjects *fwFindObjects,  NSSCKMDSession *mdSession,  NSSCKFWSession *fwSession,  NSSCKMDToken *mdToken,  NSSCKFWToken *fwToken,  NSSCKMDInstance *mdInstance,  NSSCKFWInstance *fwInstance);static NSSCKMDObject *nss_ckmdFindSessionObjects_Next(  NSSCKMDFindObjects *mdFindObjects,  NSSCKFWFindObjects *fwFindObjects,  NSSCKMDSession *mdSession,  NSSCKFWSession *fwSession,  NSSCKMDToken *mdToken,  NSSCKFWToken *fwToken,  NSSCKMDInstance *mdInstance,  NSSCKFWInstance *fwInstance,  NSSArena *arena,  CK_RV *pError);static CK_BBOOLitems_match(  NSSItem *a,  CK_VOID_PTR pValue,  CK_ULONG ulValueLen){  if( a->size != ulValueLen ) {    return CK_FALSE;  }  if( PR_TRUE == nsslibc_memequal(a->data, pValue, ulValueLen, (PRStatus *)NULL) ) {    return CK_TRUE;  } else {    return CK_FALSE;  }}/* * Our hashtable iterator */static voidfindfcn(  const void *key,  void *value,  void *closure){  NSSCKMDObject *mdObject = (NSSCKMDObject *)value;  nssCKMDSessionObject *mdso = (nssCKMDSessionObject *)mdObject->etc;  nssCKMDFindSessionObjects *mdfso = (nssCKMDFindSessionObjects *)closure;  CK_ULONG i, j;  struct nodeStr *node;  if( CKR_OK != mdfso->error ) {    return;  }  for( i = 0; i < mdfso->ulCount; i++ ) {    CK_ATTRIBUTE_PTR p = &mdfso->pTemplate[i];    for( j = 0; j < mdso->n; j++ ) {      if( mdso->types[j] == p->type ) {        if( !items_match(&mdso->attributes[j], p->pValue, p->ulValueLen) ) {          return;        } else {          break;        }      }    }    if( j == mdso->n ) {      /* Attribute not found */      return;    }  }  /* Matches */  node = nss_ZNEW(mdfso->arena, struct nodeStr);  if( (struct nodeStr *)NULL == node ) {    mdfso->error = CKR_HOST_MEMORY;    return;  }  node->mdObject = mdObject;  node->next = mdfso->list;  mdfso->list = node;  return;}/* * nssCKMDFindSessionObjects_Create * */NSS_IMPLEMENT NSSCKMDFindObjects *nssCKMDFindSessionObjects_Create(  NSSCKFWToken *fwToken,  CK_ATTRIBUTE_PTR pTemplate,  CK_ULONG ulCount,  CK_RV *pError){  NSSArena *arena;  nssCKMDFindSessionObjects *mdfso;  nssCKFWHash *hash;  NSSCKMDFindObjects *rv;#ifdef NSSDEBUG  if( (CK_RV *)NULL == pError ) {    return (NSSCKMDFindObjects *)NULL;  }  *pError = nssCKFWToken_verifyPointer(fwToken);  if( CKR_OK != *pError ) {    return (NSSCKMDFindObjects *)NULL;  }  if( (CK_ATTRIBUTE_PTR)NULL == pTemplate ) {    *pError = CKR_ARGUMENTS_BAD;    return (NSSCKMDFindObjects *)NULL;  }#endif /* NSSDEBUG */  hash = nssCKFWToken_GetSessionObjectHash(fwToken);  if( (nssCKFWHash *)NULL == hash ) {    *pError= CKR_GENERAL_ERROR;    return (NSSCKMDFindObjects *)NULL;  }  arena = NSSArena_Create();  if( (NSSArena *)NULL == arena ) {    *pError = CKR_HOST_MEMORY;    return (NSSCKMDFindObjects *)NULL;  }  mdfso = nss_ZNEW(arena, nssCKMDFindSessionObjects);  if( (nssCKMDFindSessionObjects *)NULL == mdfso ) {    NSSArena_Destroy(arena);    *pError = CKR_HOST_MEMORY;    return (NSSCKMDFindObjects *)NULL;  }  rv = nss_ZNEW(arena, NSSCKMDFindObjects);  mdfso->error = CKR_OK;  mdfso->pTemplate = pTemplate;  mdfso->ulCount = ulCount;  mdfso->hash = hash;  nssCKFWHash_Iterate(hash, findfcn, mdfso);  if( CKR_OK != mdfso->error ) {    NSSArena_Destroy(arena);    *pError = CKR_HOST_MEMORY;    return (NSSCKMDFindObjects *)NULL;  }  rv->etc = (void *)mdfso;  rv->Final = nss_ckmdFindSessionObjects_Final;  rv->Next = nss_ckmdFindSessionObjects_Next;#ifdef DEBUG  if( *pError != nss_ckmdFindSessionObjects_add_pointer(rv) ) {    NSSArena_Destroy(arena);    return (NSSCKMDFindObjects *)NULL;  }#endif /* DEBUG */      mdfso->arena = arena;  return rv;}static voidnss_ckmdFindSessionObjects_Final(  NSSCKMDFindObjects *mdFindObjects,  NSSCKFWFindObjects *fwFindObjects,  NSSCKMDSession *mdSession,  NSSCKFWSession *fwSession,  NSSCKMDToken *mdToken,  NSSCKFWToken *fwToken,  NSSCKMDInstance *mdInstance,  NSSCKFWInstance *fwInstance){  nssCKMDFindSessionObjects *mdfso;#ifdef NSSDEBUG  if( CKR_OK != nss_ckmdFindSessionObjects_verifyPointer(mdFindObjects) ) {    return;  }#endif /* NSSDEBUG */  mdfso = (nssCKMDFindSessionObjects *)mdFindObjects->etc;  if (mdfso->arena) NSSArena_Destroy(mdfso->arena);#ifdef DEBUG  (void)nss_ckmdFindSessionObjects_remove_pointer(mdFindObjects);#endif /* DEBUG */  return;}static NSSCKMDObject *nss_ckmdFindSessionObjects_Next(  NSSCKMDFindObjects *mdFindObjects,  NSSCKFWFindObjects *fwFindObjects,  NSSCKMDSession *mdSession,  NSSCKFWSession *fwSession,  NSSCKMDToken *mdToken,  NSSCKFWToken *fwToken,  NSSCKMDInstance *mdInstance,  NSSCKFWInstance *fwInstance,  NSSArena *arena,  CK_RV *pError){  nssCKMDFindSessionObjects *mdfso;  NSSCKMDObject *rv = (NSSCKMDObject *)NULL;#ifdef NSSDEBUG  if( CKR_OK != nss_ckmdFindSessionObjects_verifyPointer(mdFindObjects) ) {    return (NSSCKMDObject *)NULL;  }#endif /* NSSDEBUG */  mdfso = (nssCKMDFindSessionObjects *)mdFindObjects->etc;  while( (NSSCKMDObject *)NULL == rv ) {    if( (struct nodeStr *)NULL == mdfso->list ) {      *pError = CKR_OK;      return (NSSCKMDObject *)NULL;    }    if( nssCKFWHash_Exists(mdfso->hash, mdfso->list->mdObject) ) {      rv = mdfso->list->mdObject;    }    mdfso->list = mdfso->list->next;  }  return rv;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?