Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


Quelle  sessobj.c   Sprache: C

 
/* 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/. */


/*
 * 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_RV
nss_ckmdSessionObject_add_pointer(
    const NSSCKMDObject *mdObject)
{
    return CKR_OK;
}

static CK_RV
nss_ckmdSessionObject_remove_pointer(
    const NSSCKMDObject *mdObject)
{
    return CKR_OK;
}

#ifdef NSS_DEBUG
static CK_RV
nss_ckmdSessionObject_verifyPointer(
    const NSSCKMDObject *mdObject)
{
    return CKR_OK;
}
#endif

#endif /* DEBUG */

/*
 * We must forward-declare these routines
 */

static void
nss_ckmdSessionObject_Finalize(
    NSSCKMDObject *mdObject,
    NSSCKFWObject *fwObject,
    NSSCKMDSession *mdSession,
    NSSCKFWSession *fwSession,
    NSSCKMDToken *mdToken,
    NSSCKFWToken *fwToken,
    NSSCKMDInstance *mdInstance,
    NSSCKFWInstance *fwInstance);

static CK_RV
nss_ckmdSessionObject_Destroy(
    NSSCKMDObject *mdObject,
    NSSCKFWObject *fwObject,
    NSSCKMDSession *mdSession,
    NSSCKFWSession *fwSession,
    NSSCKMDToken *mdToken,
    NSSCKFWToken *fwToken,
    NSSCKMDInstance *mdInstance,
    NSSCKFWInstance *fwInstance);

static CK_BBOOL
nss_ckmdSessionObject_IsTokenObject(
    NSSCKMDObject *mdObject,
    NSSCKFWObject *fwObject,
    NSSCKMDSession *mdSession,
    NSSCKFWSession *fwSession,
    NSSCKMDToken *mdToken,
    NSSCKFWToken *fwToken,
    NSSCKMDInstance *mdInstance,
    NSSCKFWInstance *fwInstance);

static CK_ULONG
nss_ckmdSessionObject_GetAttributeCount(
    NSSCKMDObject *mdObject,
    NSSCKFWObject *fwObject,
    NSSCKMDSession *mdSession,
    NSSCKFWSession *fwSession,
    NSSCKMDToken *mdToken,
    NSSCKFWToken *fwToken,
    NSSCKMDInstance *mdInstance,
    NSSCKFWInstance *fwInstance,
    CK_RV *pError);

static CK_RV
nss_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_ULONG
nss_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 NSSCKFWItem
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_RV
nss_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_ULONG
nss_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;

    *pError = CKR_OK;

    mdso = nss_ZNEW(arena, nssCKMDSessionObject);
    if (!mdso) {
        goto loser;
    }

    mdso->arena = arena;
    mdso->n = ulCount;
    mdso->attributes = nss_ZNEWARRAY(arena, NSSItem, ulCount);
    if (!mdso->attributes) {
        goto loser;
    }

    mdso->types = nss_ZNEWARRAY(arena, CK_ATTRIBUTE_TYPE, ulCount);
    if (!mdso->types) {
        goto loser;
    }
    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 (!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 (!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 (!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 ((*pError = nss_ckmdSessionObject_add_pointer(mdObject)) != CKR_OK) {
        goto loser;
    }
#endif /* DEBUG */

    return mdObject;

loser:
    if (mdso) {
        if (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);
    if (*pError == CKR_OK) {
        *pError = CKR_HOST_MEMORY;
    }
    return (NSSCKMDObject *)NULL;
}

/*
 * nss_ckmdSessionObject_Finalize
 *
 */

static void
nss_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_RV
nss_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_BBOOL
nss_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_ULONG
nss_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 (!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_RV
nss_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_ULONG
nss_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)
{
    nssCKMDSessionObject *obj;
    CK_ULONG i;

#ifdef NSSDEBUG
    if (!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 NSSCKFWItem
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)
{
    NSSCKFWItem item;
    nssCKMDSessionObject *obj;
    CK_ULONG i;

    item.needsFreeing = PR_FALSE;
    item.item = NULL;
#ifdef NSSDEBUG
    if (!pError) {
        return item;
    }

    *pError = nss_ckmdSessionObject_verifyPointer(mdObject);
    if (CKR_OK != *pError) {
        return item;
    }

/* 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]) {
            item.item = &obj->attributes[i];
            return item;
        }
    }

    *pError = CKR_ATTRIBUTE_TYPE_INVALID;
    return item;
}

/*
 * 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_RV
nss_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 (!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 (!ra) {
        nss_ZFreeIf(n.data);
        return CKR_HOST_MEMORY;
    }
    obj->attributes = ra;

    rt = (CK_ATTRIBUTE_TYPE_PTR)nss_ZRealloc(obj->types,
                                             sizeof(CK_ATTRIBUTE_TYPE) * (obj->n + 1));
    if (!rt) {
        nss_ZFreeIf(n.data);
        return CKR_HOST_MEMORY;
    }

    obj->types = rt;
    obj->attributes[obj->n] = n;
    obj->types[obj->n] = attribute;
    obj->n++;

    return CKR_OK;
}

/*
 * nss_ckmdSessionObject_GetObjectSize
 *
 */

static CK_ULONG
nss_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 (!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_RV
nss_ckmdFindSessionObjects_add_pointer(
    const NSSCKMDFindObjects *mdFindObjects)
{
    return CKR_OK;
}

static CK_RV
nss_ckmdFindSessionObjects_remove_pointer(
    const NSSCKMDFindObjects *mdFindObjects)
{
    return CKR_OK;
}

#ifdef NSS_DEBUG
static CK_RV
nss_ckmdFindSessionObjects_verifyPointer(
    const NSSCKMDFindObjects *mdFindObjects)
{
    return CKR_OK;
}
#endif

#endif /* DEBUG */

/*
 * We must forward-declare these routines.
 */

static void
nss_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_BBOOL
items_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 void
findfcn(
    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 (!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 */

    *pError = CKR_OK;

    hash = nssCKFWToken_GetSessionObjectHash(fwToken);
    if (!hash) {
        *pError = CKR_GENERAL_ERROR;
        return (NSSCKMDFindObjects *)NULL;
    }

    arena = NSSArena_Create();
    if (!arena) {
        *pError = CKR_HOST_MEMORY;
        return (NSSCKMDFindObjects *)NULL;
    }

    mdfso = nss_ZNEW(arena, nssCKMDFindSessionObjects);
    if (!mdfso) {
        goto loser;
    }

    rv = nss_ZNEW(arena, NSSCKMDFindObjects);
    if (rv == NULL) {
        goto loser;
    }

    mdfso->error = CKR_OK;
    mdfso->pTemplate = pTemplate;
    mdfso->ulCount = ulCount;
    mdfso->hash = hash;

    nssCKFWHash_Iterate(hash, findfcn, mdfso);

    if (CKR_OK != mdfso->error) {
        goto loser;
    }

    rv->etc = (void *)mdfso;
    rv->Final = nss_ckmdFindSessionObjects_Final;
    rv->Next = nss_ckmdFindSessionObjects_Next;

#ifdef DEBUG
    if ((*pError = nss_ckmdFindSessionObjects_add_pointer(rv)) != CKR_OK) {
        goto loser;
    }
#endif /* DEBUG */
    mdfso->arena = arena;

    return rv;

loser:
    if (arena) {
        NSSArena_Destroy(arena);
    }
    if (*pError == CKR_OK) {
        *pError = CKR_HOST_MEMORY;
    }
    return NULL;
}

static void
nss_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 (!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;
}

Messung V0.5
C=95 H=79 G=87

¤ Dauer der Verarbeitung: 0.17 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge