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

#include "builtins.h"

/*
 * builtins/session.c
 *
 * This file implements the NSSCKMDSession object for the
 * "builtin objects" cryptoki module.
 */

static NSSCKMDFindObjects *
builtins_mdSession_FindObjectsInit(
    NSSCKMDSession *mdSession,
    NSSCKFWSession *fwSession,
    NSSCKMDToken *mdToken,
    NSSCKFWToken *fwToken,
    NSSCKMDInstance *mdInstance,
    NSSCKFWInstance *fwInstance,
    CK_ATTRIBUTE_PTR pTemplate,
    CK_ULONG ulAttributeCount,
    CK_RV *pError)
{
    return nss_builtins_FindObjectsInit(fwSession, pTemplate, ulAttributeCount, pError);
}

NSS_IMPLEMENT NSSCKMDSession *
nss_builtins_CreateSession(
    NSSCKFWSession *fwSession,
    CK_RV *pError)
{
    NSSArena *arena;
    NSSCKMDSession *rv;

    arena = NSSCKFWSession_GetArena(fwSession, pError);
    if ((NSSArena *)NULL == arena) {
        return (NSSCKMDSession *)NULL;
    }

    rv = nss_ZNEW(arena, NSSCKMDSession);
    if ((NSSCKMDSession *)NULL == rv) {
        *pError = CKR_HOST_MEMORY;
        return (NSSCKMDSession *)NULL;
    }

    /*
     * rv was zeroed when allocated, so we only
     * need to set the non-zero members.
     */

    rv->etc = (void *)fwSession;
    /* rv->Close */
    /* rv->GetDeviceError */
    /* rv->Login */
    /* rv->Logout */
    /* rv->InitPIN */
    /* rv->SetPIN */
    /* rv->GetOperationStateLen */
    /* rv->GetOperationState */
    /* rv->SetOperationState */
    /* rv->CreateObject */
    /* rv->CopyObject */
    rv->FindObjectsInit = builtins_mdSession_FindObjectsInit;
    /* rv->SeedRandom */
    /* rv->GetRandom */
    /* rv->null */

    return rv;
}
