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

/*
 * crypto.c
 *
 * This file implements the NSSCKFWCryptoOperation type and methods.
 */

#ifndef CK_T
#include "ck.h"
#endif /* CK_T */

/*
 * NSSCKFWCryptoOperation
 *
 *  -- create/destroy --
 *  nssCKFWCrytoOperation_Create
 *  nssCKFWCryptoOperation_Destroy
 *
 *  -- implement public accessors --
 *  nssCKFWCryptoOperation_GetMDCryptoOperation
 *  nssCKFWCryptoOperation_GetType
 *
 *  -- private accessors --
 *
 *  -- module fronts --
 * nssCKFWCryptoOperation_GetFinalLength
 * nssCKFWCryptoOperation_GetOperationLength
 * nssCKFWCryptoOperation_Final
 * nssCKFWCryptoOperation_Update
 * nssCKFWCryptoOperation_DigestUpdate
 * nssCKFWCryptoOperation_UpdateFinal
 */

struct NSSCKFWCryptoOperationStr {
    /* NSSArena *arena; */
    NSSCKMDCryptoOperation *mdOperation;
    NSSCKMDSession *mdSession;
    NSSCKFWSession *fwSession;
    NSSCKMDToken *mdToken;
    NSSCKFWToken *fwToken;
    NSSCKMDInstance *mdInstance;
    NSSCKFWInstance *fwInstance;
    NSSCKFWCryptoOperationType type;
};

/*
 *  nssCKFWCrytoOperation_Create
 */
NSS_EXTERN NSSCKFWCryptoOperation *
nssCKFWCryptoOperation_Create(
    NSSCKMDCryptoOperation *mdOperation,
    NSSCKMDSession *mdSession,
    NSSCKFWSession *fwSession,
    NSSCKMDToken *mdToken,
    NSSCKFWToken *fwToken,
    NSSCKMDInstance *mdInstance,
    NSSCKFWInstance *fwInstance,
    NSSCKFWCryptoOperationType type,
    CK_RV *pError)
{
    NSSCKFWCryptoOperation *fwOperation;
    fwOperation = nss_ZNEW(NULL, NSSCKFWCryptoOperation);
    if (!fwOperation) {
        *pError = CKR_HOST_MEMORY;
        return (NSSCKFWCryptoOperation *)NULL;
    }
    fwOperation->mdOperation = mdOperation;
    fwOperation->mdSession = mdSession;
    fwOperation->fwSession = fwSession;
    fwOperation->mdToken = mdToken;
    fwOperation->fwToken = fwToken;
    fwOperation->mdInstance = mdInstance;
    fwOperation->fwInstance = fwInstance;
    fwOperation->type = type;
    return fwOperation;
}

/*
 *  nssCKFWCryptoOperation_Destroy
 */
NSS_EXTERN void
nssCKFWCryptoOperation_Destroy(
    NSSCKFWCryptoOperation *fwOperation)
{
    if ((NSSCKMDCryptoOperation *)NULL != fwOperation->mdOperation) {
        if (fwOperation->mdOperation->Destroy) {
            fwOperation->mdOperation->Destroy(
                fwOperation->mdOperation,
                fwOperation,
                fwOperation->mdInstance,
                fwOperation->fwInstance);
        }
    }
    nss_ZFreeIf(fwOperation);
}

/*
 *  nssCKFWCryptoOperation_GetMDCryptoOperation
 */
NSS_EXTERN NSSCKMDCryptoOperation *
nssCKFWCryptoOperation_GetMDCryptoOperation(
    NSSCKFWCryptoOperation *fwOperation)
{
    return fwOperation->mdOperation;
}

/*
 *  nssCKFWCryptoOperation_GetType
 */
NSS_EXTERN NSSCKFWCryptoOperationType
nssCKFWCryptoOperation_GetType(
    NSSCKFWCryptoOperation *fwOperation)
{
    return fwOperation->type;
}

/*
 * nssCKFWCryptoOperation_GetFinalLength
 */
NSS_EXTERN CK_ULONG
nssCKFWCryptoOperation_GetFinalLength(
    NSSCKFWCryptoOperation *fwOperation,
    CK_RV *pError)
{
    if (!fwOperation->mdOperation->GetFinalLength) {
        *pError = CKR_FUNCTION_FAILED;
        return 0;
    }
    return fwOperation->mdOperation->GetFinalLength(
        fwOperation->mdOperation,
        fwOperation,
        fwOperation->mdSession,
        fwOperation->fwSession,
        fwOperation->mdToken,
        fwOperation->fwToken,
        fwOperation->mdInstance,
        fwOperation->fwInstance,
        pError);
}

/*
 * nssCKFWCryptoOperation_GetOperationLength
 */
NSS_EXTERN CK_ULONG
nssCKFWCryptoOperation_GetOperationLength(
    NSSCKFWCryptoOperation *fwOperation,
    NSSItem *inputBuffer,
    CK_RV *pError)
{
    if (!fwOperation->mdOperation->GetOperationLength) {
        *pError = CKR_FUNCTION_FAILED;
        return 0;
    }
    return fwOperation->mdOperation->GetOperationLength(
        fwOperation->mdOperation,
        fwOperation,
        fwOperation->mdSession,
        fwOperation->fwSession,
        fwOperation->mdToken,
        fwOperation->fwToken,
        fwOperation->mdInstance,
        fwOperation->fwInstance,
        inputBuffer,
        pError);
}

/*
 * nssCKFWCryptoOperation_Final
 */
NSS_EXTERN CK_RV
nssCKFWCryptoOperation_Final(
    NSSCKFWCryptoOperation *fwOperation,
    NSSItem *outputBuffer)
{
    if (!fwOperation->mdOperation->Final) {
        return CKR_FUNCTION_FAILED;
    }
    return fwOperation->mdOperation->Final(
        fwOperation->mdOperation,
        fwOperation,
        fwOperation->mdSession,
        fwOperation->fwSession,
        fwOperation->mdToken,
        fwOperation->fwToken,
        fwOperation->mdInstance,
        fwOperation->fwInstance,
        outputBuffer);
}

/*
 * nssCKFWCryptoOperation_Update
 */
NSS_EXTERN CK_RV
nssCKFWCryptoOperation_Update(
    NSSCKFWCryptoOperation *fwOperation,
    NSSItem *inputBuffer,
    NSSItem *outputBuffer)
{
    if (!fwOperation->mdOperation->Update) {
        return CKR_FUNCTION_FAILED;
    }
    return fwOperation->mdOperation->Update(
        fwOperation->mdOperation,
        fwOperation,
        fwOperation->mdSession,
        fwOperation->fwSession,
        fwOperation->mdToken,
        fwOperation->fwToken,
        fwOperation->mdInstance,
        fwOperation->fwInstance,
        inputBuffer,
        outputBuffer);
}

/*
 * nssCKFWCryptoOperation_DigestUpdate
 */
NSS_EXTERN CK_RV
nssCKFWCryptoOperation_DigestUpdate(
    NSSCKFWCryptoOperation *fwOperation,
    NSSItem *inputBuffer)
{
    if (!fwOperation->mdOperation->DigestUpdate) {
        return CKR_FUNCTION_FAILED;
    }
    return fwOperation->mdOperation->DigestUpdate(
        fwOperation->mdOperation,
        fwOperation,
        fwOperation->mdSession,
        fwOperation->fwSession,
        fwOperation->mdToken,
        fwOperation->fwToken,
        fwOperation->mdInstance,
        fwOperation->fwInstance,
        inputBuffer);
}

/*
 * nssCKFWCryptoOperation_DigestKey
 */
NSS_EXTERN CK_RV
nssCKFWCryptoOperation_DigestKey(
    NSSCKFWCryptoOperation *fwOperation,
    NSSCKFWObject *fwObject /* Key */
    )
{
    NSSCKMDObject *mdObject;

    if (!fwOperation->mdOperation->DigestKey) {
        return CKR_FUNCTION_FAILED;
    }
    mdObject = nssCKFWObject_GetMDObject(fwObject);
    return fwOperation->mdOperation->DigestKey(
        fwOperation->mdOperation,
        fwOperation,
        fwOperation->mdToken,
        fwOperation->fwToken,
        fwOperation->mdInstance,
        fwOperation->fwInstance,
        mdObject,
        fwObject);
}

/*
 * nssCKFWCryptoOperation_UpdateFinal
 */
NSS_EXTERN CK_RV
nssCKFWCryptoOperation_UpdateFinal(
    NSSCKFWCryptoOperation *fwOperation,
    NSSItem *inputBuffer,
    NSSItem *outputBuffer)
{
    if (!fwOperation->mdOperation->UpdateFinal) {
        return CKR_FUNCTION_FAILED;
    }
    return fwOperation->mdOperation->UpdateFinal(
        fwOperation->mdOperation,
        fwOperation,
        fwOperation->mdSession,
        fwOperation->fwSession,
        fwOperation->mdToken,
        fwOperation->fwToken,
        fwOperation->mdInstance,
        fwOperation->fwInstance,
        inputBuffer,
        outputBuffer);
}

/*
 * nssCKFWCryptoOperation_UpdateCombo
 */
NSS_EXTERN CK_RV
nssCKFWCryptoOperation_UpdateCombo(
    NSSCKFWCryptoOperation *fwOperation,
    NSSCKFWCryptoOperation *fwPeerOperation,
    NSSItem *inputBuffer,
    NSSItem *outputBuffer)
{
    if (!fwOperation->mdOperation->UpdateCombo) {
        return CKR_FUNCTION_FAILED;
    }
    return fwOperation->mdOperation->UpdateCombo(
        fwOperation->mdOperation,
        fwOperation,
        fwPeerOperation->mdOperation,
        fwPeerOperation,
        fwOperation->mdSession,
        fwOperation->fwSession,
        fwOperation->mdToken,
        fwOperation->fwToken,
        fwOperation->mdInstance,
        fwOperation->fwInstance,
        inputBuffer,
        outputBuffer);
}
