/* 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); }