andre@0: /* This Source Code Form is subject to the terms of the Mozilla Public andre@0: * License, v. 2.0. If a copy of the MPL was not distributed with this andre@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ andre@0: andre@0: /* andre@0: * mechanism.c andre@0: * andre@0: * This file implements the NSSCKFWMechanism type and methods. andre@0: */ andre@0: andre@0: #ifndef CK_T andre@0: #include "ck.h" andre@0: #endif /* CK_T */ andre@0: andre@0: /* andre@0: * NSSCKFWMechanism andre@0: * andre@0: * -- create/destroy -- andre@0: * nssCKFWMechanism_Create andre@0: * nssCKFWMechanism_Destroy andre@0: * andre@0: * -- implement public accessors -- andre@0: * nssCKFWMechanism_GetMDMechanism andre@0: * nssCKFWMechanism_GetParameter andre@0: * andre@0: * -- private accessors -- andre@0: * andre@0: * -- module fronts -- andre@0: * nssCKFWMechanism_GetMinKeySize andre@0: * nssCKFWMechanism_GetMaxKeySize andre@0: * nssCKFWMechanism_GetInHardware andre@0: * nssCKFWMechanism_GetCanEncrypt andre@0: * nssCKFWMechanism_GetCanDecrypt andre@0: * nssCKFWMechanism_GetCanDigest andre@0: * nssCKFWMechanism_GetCanSign andre@0: * nssCKFWMechanism_GetCanSignRecover andre@0: * nssCKFWMechanism_GetCanVerify andre@0: * nssCKFWMechanism_GetCanGenerate andre@0: * nssCKFWMechanism_GetCanGenerateKeyPair andre@0: * nssCKFWMechanism_GetCanUnwrap andre@0: * nssCKFWMechanism_GetCanWrap andre@0: * nssCKFWMechanism_GetCanDerive andre@0: * nssCKFWMechanism_EncryptInit andre@0: * nssCKFWMechanism_DecryptInit andre@0: * nssCKFWMechanism_DigestInit andre@0: * nssCKFWMechanism_SignInit andre@0: * nssCKFWMechanism_VerifyInit andre@0: * nssCKFWMechanism_SignRecoverInit andre@0: * nssCKFWMechanism_VerifyRecoverInit andre@0: * nssCKFWMechanism_GenerateKey andre@0: * nssCKFWMechanism_GenerateKeyPair andre@0: * nssCKFWMechanism_GetWrapKeyLength andre@0: * nssCKFWMechanism_WrapKey andre@0: * nssCKFWMechanism_UnwrapKey andre@0: * nssCKFWMechanism_DeriveKey andre@0: */ andre@0: andre@0: andre@0: struct NSSCKFWMechanismStr { andre@0: NSSCKMDMechanism *mdMechanism; andre@0: NSSCKMDToken *mdToken; andre@0: NSSCKFWToken *fwToken; andre@0: NSSCKMDInstance *mdInstance; andre@0: NSSCKFWInstance *fwInstance; andre@0: }; andre@0: andre@0: /* andre@0: * nssCKFWMechanism_Create andre@0: * andre@0: */ andre@0: NSS_IMPLEMENT NSSCKFWMechanism * andre@0: nssCKFWMechanism_Create andre@0: ( andre@0: NSSCKMDMechanism *mdMechanism, andre@0: NSSCKMDToken *mdToken, andre@0: NSSCKFWToken *fwToken, andre@0: NSSCKMDInstance *mdInstance, andre@0: NSSCKFWInstance *fwInstance andre@0: ) andre@0: { andre@0: NSSCKFWMechanism *fwMechanism; andre@0: andre@0: andre@0: fwMechanism = nss_ZNEW(NULL, NSSCKFWMechanism); andre@0: if (!fwMechanism) { andre@0: return (NSSCKFWMechanism *)NULL; andre@0: } andre@0: fwMechanism->mdMechanism = mdMechanism; andre@0: fwMechanism->mdToken = mdToken; andre@0: fwMechanism->fwToken = fwToken; andre@0: fwMechanism->mdInstance = mdInstance; andre@0: fwMechanism->fwInstance = fwInstance; andre@0: return fwMechanism; andre@0: } andre@0: andre@0: /* andre@0: * nssCKFWMechanism_Destroy andre@0: * andre@0: */ andre@0: NSS_IMPLEMENT void andre@0: nssCKFWMechanism_Destroy andre@0: ( andre@0: NSSCKFWMechanism *fwMechanism andre@0: ) andre@0: { andre@0: /* destroy any fw resources held by nssCKFWMechanism (currently none) */ andre@0: andre@0: if (!fwMechanism->mdMechanism->Destroy) { andre@0: /* destroys it's parent as well */ andre@0: fwMechanism->mdMechanism->Destroy( andre@0: fwMechanism->mdMechanism, andre@0: fwMechanism, andre@0: fwMechanism->mdInstance, andre@0: fwMechanism->fwInstance); andre@0: } andre@0: /* if the Destroy function wasn't supplied, then the mechanism is 'static', andre@0: * and there is nothing to destroy */ andre@0: return; andre@0: } andre@0: andre@0: /* andre@0: * nssCKFWMechanism_GetMDMechanism andre@0: * andre@0: */ andre@0: NSS_IMPLEMENT NSSCKMDMechanism * andre@0: nssCKFWMechanism_GetMDMechanism andre@0: ( andre@0: NSSCKFWMechanism *fwMechanism andre@0: ) andre@0: { andre@0: return fwMechanism->mdMechanism; andre@0: } andre@0: andre@0: /* andre@0: * nssCKFWMechanism_GetMinKeySize andre@0: * andre@0: */ andre@0: NSS_IMPLEMENT CK_ULONG andre@0: nssCKFWMechanism_GetMinKeySize andre@0: ( andre@0: NSSCKFWMechanism *fwMechanism, andre@0: CK_RV *pError andre@0: ) andre@0: { andre@0: if (!fwMechanism->mdMechanism->GetMinKeySize) { andre@0: return 0; andre@0: } andre@0: andre@0: return fwMechanism->mdMechanism->GetMinKeySize(fwMechanism->mdMechanism, andre@0: fwMechanism, fwMechanism->mdToken, fwMechanism->fwToken, andre@0: fwMechanism->mdInstance, fwMechanism->fwInstance, pError); andre@0: } andre@0: andre@0: /* andre@0: * nssCKFWMechanism_GetMaxKeySize andre@0: * andre@0: */ andre@0: NSS_IMPLEMENT CK_ULONG andre@0: nssCKFWMechanism_GetMaxKeySize andre@0: ( andre@0: NSSCKFWMechanism *fwMechanism, andre@0: CK_RV *pError andre@0: ) andre@0: { andre@0: if (!fwMechanism->mdMechanism->GetMaxKeySize) { andre@0: return 0; andre@0: } andre@0: andre@0: return fwMechanism->mdMechanism->GetMaxKeySize(fwMechanism->mdMechanism, andre@0: fwMechanism, fwMechanism->mdToken, fwMechanism->fwToken, andre@0: fwMechanism->mdInstance, fwMechanism->fwInstance, pError); andre@0: } andre@0: andre@0: /* andre@0: * nssCKFWMechanism_GetInHardware andre@0: * andre@0: */ andre@0: NSS_IMPLEMENT CK_BBOOL andre@0: nssCKFWMechanism_GetInHardware andre@0: ( andre@0: NSSCKFWMechanism *fwMechanism, andre@0: CK_RV *pError andre@0: ) andre@0: { andre@0: if (!fwMechanism->mdMechanism->GetInHardware) { andre@0: return CK_FALSE; andre@0: } andre@0: andre@0: return fwMechanism->mdMechanism->GetInHardware(fwMechanism->mdMechanism, andre@0: fwMechanism, fwMechanism->mdToken, fwMechanism->fwToken, andre@0: fwMechanism->mdInstance, fwMechanism->fwInstance, pError); andre@0: } andre@0: andre@0: andre@0: /* andre@0: * the following are determined automatically by which of the cryptographic andre@0: * functions are defined for this mechanism. andre@0: */ andre@0: /* andre@0: * nssCKFWMechanism_GetCanEncrypt andre@0: * andre@0: */ andre@0: NSS_EXTERN CK_BBOOL andre@0: nssCKFWMechanism_GetCanEncrypt andre@0: ( andre@0: NSSCKFWMechanism *fwMechanism, andre@0: CK_RV *pError andre@0: ) andre@0: { andre@0: if (!fwMechanism->mdMechanism->EncryptInit) { andre@0: return CK_FALSE; andre@0: } andre@0: return CK_TRUE; andre@0: } andre@0: andre@0: /* andre@0: * nssCKFWMechanism_GetCanDecrypt andre@0: * andre@0: */ andre@0: NSS_EXTERN CK_BBOOL andre@0: nssCKFWMechanism_GetCanDecrypt andre@0: ( andre@0: NSSCKFWMechanism *fwMechanism, andre@0: CK_RV *pError andre@0: ) andre@0: { andre@0: if (!fwMechanism->mdMechanism->DecryptInit) { andre@0: return CK_FALSE; andre@0: } andre@0: return CK_TRUE; andre@0: } andre@0: andre@0: /* andre@0: * nssCKFWMechanism_GetCanDigest andre@0: * andre@0: */ andre@0: NSS_EXTERN CK_BBOOL andre@0: nssCKFWMechanism_GetCanDigest andre@0: ( andre@0: NSSCKFWMechanism *fwMechanism, andre@0: CK_RV *pError andre@0: ) andre@0: { andre@0: if (!fwMechanism->mdMechanism->DigestInit) { andre@0: return CK_FALSE; andre@0: } andre@0: return CK_TRUE; andre@0: } andre@0: andre@0: /* andre@0: * nssCKFWMechanism_GetCanSign andre@0: * andre@0: */ andre@0: NSS_EXTERN CK_BBOOL andre@0: nssCKFWMechanism_GetCanSign andre@0: ( andre@0: NSSCKFWMechanism *fwMechanism, andre@0: CK_RV *pError andre@0: ) andre@0: { andre@0: if (!fwMechanism->mdMechanism->SignInit) { andre@0: return CK_FALSE; andre@0: } andre@0: return CK_TRUE; andre@0: } andre@0: andre@0: /* andre@0: * nssCKFWMechanism_GetCanSignRecover andre@0: * andre@0: */ andre@0: NSS_EXTERN CK_BBOOL andre@0: nssCKFWMechanism_GetCanSignRecover andre@0: ( andre@0: NSSCKFWMechanism *fwMechanism, andre@0: CK_RV *pError andre@0: ) andre@0: { andre@0: if (!fwMechanism->mdMechanism->SignRecoverInit) { andre@0: return CK_FALSE; andre@0: } andre@0: return CK_TRUE; andre@0: } andre@0: andre@0: /* andre@0: * nssCKFWMechanism_GetCanVerify andre@0: * andre@0: */ andre@0: NSS_EXTERN CK_BBOOL andre@0: nssCKFWMechanism_GetCanVerify andre@0: ( andre@0: NSSCKFWMechanism *fwMechanism, andre@0: CK_RV *pError andre@0: ) andre@0: { andre@0: if (!fwMechanism->mdMechanism->VerifyInit) { andre@0: return CK_FALSE; andre@0: } andre@0: return CK_TRUE; andre@0: } andre@0: andre@0: /* andre@0: * nssCKFWMechanism_GetCanVerifyRecover andre@0: * andre@0: */ andre@0: NSS_EXTERN CK_BBOOL andre@0: nssCKFWMechanism_GetCanVerifyRecover andre@0: ( andre@0: NSSCKFWMechanism *fwMechanism, andre@0: CK_RV *pError andre@0: ) andre@0: { andre@0: if (!fwMechanism->mdMechanism->VerifyRecoverInit) { andre@0: return CK_FALSE; andre@0: } andre@0: return CK_TRUE; andre@0: } andre@0: andre@0: /* andre@0: * nssCKFWMechanism_GetCanGenerate andre@0: * andre@0: */ andre@0: NSS_EXTERN CK_BBOOL andre@0: nssCKFWMechanism_GetCanGenerate andre@0: ( andre@0: NSSCKFWMechanism *fwMechanism, andre@0: CK_RV *pError andre@0: ) andre@0: { andre@0: if (!fwMechanism->mdMechanism->GenerateKey) { andre@0: return CK_FALSE; andre@0: } andre@0: return CK_TRUE; andre@0: } andre@0: andre@0: /* andre@0: * nssCKFWMechanism_GetCanGenerateKeyPair andre@0: * andre@0: */ andre@0: NSS_EXTERN CK_BBOOL andre@0: nssCKFWMechanism_GetCanGenerateKeyPair andre@0: ( andre@0: NSSCKFWMechanism *fwMechanism, andre@0: CK_RV *pError andre@0: ) andre@0: { andre@0: if (!fwMechanism->mdMechanism->GenerateKeyPair) { andre@0: return CK_FALSE; andre@0: } andre@0: return CK_TRUE; andre@0: } andre@0: andre@0: /* andre@0: * nssCKFWMechanism_GetCanUnwrap andre@0: * andre@0: */ andre@0: NSS_EXTERN CK_BBOOL andre@0: nssCKFWMechanism_GetCanUnwrap andre@0: ( andre@0: NSSCKFWMechanism *fwMechanism, andre@0: CK_RV *pError andre@0: ) andre@0: { andre@0: if (!fwMechanism->mdMechanism->UnwrapKey) { andre@0: return CK_FALSE; andre@0: } andre@0: return CK_TRUE; andre@0: } andre@0: andre@0: /* andre@0: * nssCKFWMechanism_GetCanWrap andre@0: * andre@0: */ andre@0: NSS_EXTERN CK_BBOOL andre@0: nssCKFWMechanism_GetCanWrap andre@0: ( andre@0: NSSCKFWMechanism *fwMechanism, andre@0: CK_RV *pError andre@0: ) andre@0: { andre@0: if (!fwMechanism->mdMechanism->WrapKey) { andre@0: return CK_FALSE; andre@0: } andre@0: return CK_TRUE; andre@0: } andre@0: andre@0: /* andre@0: * nssCKFWMechanism_GetCanDerive andre@0: * andre@0: */ andre@0: NSS_EXTERN CK_BBOOL andre@0: nssCKFWMechanism_GetCanDerive andre@0: ( andre@0: NSSCKFWMechanism *fwMechanism, andre@0: CK_RV *pError andre@0: ) andre@0: { andre@0: if (!fwMechanism->mdMechanism->DeriveKey) { andre@0: return CK_FALSE; andre@0: } andre@0: return CK_TRUE; andre@0: } andre@0: andre@0: /* andre@0: * These are the actual crypto operations andre@0: */ andre@0: andre@0: /* andre@0: * nssCKFWMechanism_EncryptInit andre@0: * Start an encryption session. andre@0: */ andre@0: NSS_EXTERN CK_RV andre@0: nssCKFWMechanism_EncryptInit andre@0: ( andre@0: NSSCKFWMechanism *fwMechanism, andre@0: CK_MECHANISM *pMechanism, andre@0: NSSCKFWSession *fwSession, andre@0: NSSCKFWObject *fwObject andre@0: ) andre@0: { andre@0: NSSCKFWCryptoOperation *fwOperation; andre@0: NSSCKMDCryptoOperation *mdOperation; andre@0: NSSCKMDSession *mdSession; andre@0: NSSCKMDObject *mdObject; andre@0: CK_RV error = CKR_OK; andre@0: andre@0: andre@0: fwOperation = nssCKFWSession_GetCurrentCryptoOperation(fwSession, andre@0: NSSCKFWCryptoOperationState_EncryptDecrypt); andre@0: if (fwOperation) { andre@0: return CKR_OPERATION_ACTIVE; andre@0: } andre@0: andre@0: if (!fwMechanism->mdMechanism->EncryptInit) { andre@0: return CKR_FUNCTION_FAILED; andre@0: } andre@0: andre@0: mdSession = nssCKFWSession_GetMDSession(fwSession); andre@0: mdObject = nssCKFWObject_GetMDObject(fwObject); andre@0: mdOperation = fwMechanism->mdMechanism->EncryptInit( andre@0: fwMechanism->mdMechanism, andre@0: fwMechanism, andre@0: pMechanism, andre@0: mdSession, andre@0: fwSession, andre@0: fwMechanism->mdToken, andre@0: fwMechanism->fwToken, andre@0: fwMechanism->mdInstance, andre@0: fwMechanism->fwInstance, andre@0: mdObject, andre@0: fwObject, andre@0: &error andre@0: ); andre@0: if (!mdOperation) { andre@0: goto loser; andre@0: } andre@0: andre@0: fwOperation = nssCKFWCryptoOperation_Create(mdOperation, andre@0: mdSession, fwSession, fwMechanism->mdToken, fwMechanism->fwToken, andre@0: fwMechanism->mdInstance, fwMechanism->fwInstance, andre@0: NSSCKFWCryptoOperationType_Encrypt, &error); andre@0: if (fwOperation) { andre@0: nssCKFWSession_SetCurrentCryptoOperation(fwSession, fwOperation, andre@0: NSSCKFWCryptoOperationState_EncryptDecrypt); andre@0: } andre@0: andre@0: loser: andre@0: return error; andre@0: } andre@0: andre@0: /* andre@0: * nssCKFWMechanism_DecryptInit andre@0: * Start an encryption session. andre@0: */ andre@0: NSS_EXTERN CK_RV andre@0: nssCKFWMechanism_DecryptInit andre@0: ( andre@0: NSSCKFWMechanism *fwMechanism, andre@0: CK_MECHANISM *pMechanism, andre@0: NSSCKFWSession *fwSession, andre@0: NSSCKFWObject *fwObject andre@0: ) andre@0: { andre@0: NSSCKFWCryptoOperation *fwOperation; andre@0: NSSCKMDCryptoOperation *mdOperation; andre@0: NSSCKMDSession *mdSession; andre@0: NSSCKMDObject *mdObject; andre@0: CK_RV error = CKR_OK; andre@0: andre@0: andre@0: fwOperation = nssCKFWSession_GetCurrentCryptoOperation(fwSession, andre@0: NSSCKFWCryptoOperationState_EncryptDecrypt); andre@0: if (fwOperation) { andre@0: return CKR_OPERATION_ACTIVE; andre@0: } andre@0: andre@0: if (!fwMechanism->mdMechanism->DecryptInit) { andre@0: return CKR_FUNCTION_FAILED; andre@0: } andre@0: andre@0: mdSession = nssCKFWSession_GetMDSession(fwSession); andre@0: mdObject = nssCKFWObject_GetMDObject(fwObject); andre@0: mdOperation = fwMechanism->mdMechanism->DecryptInit( andre@0: fwMechanism->mdMechanism, andre@0: fwMechanism, andre@0: pMechanism, andre@0: mdSession, andre@0: fwSession, andre@0: fwMechanism->mdToken, andre@0: fwMechanism->fwToken, andre@0: fwMechanism->mdInstance, andre@0: fwMechanism->fwInstance, andre@0: mdObject, andre@0: fwObject, andre@0: &error andre@0: ); andre@0: if (!mdOperation) { andre@0: goto loser; andre@0: } andre@0: andre@0: fwOperation = nssCKFWCryptoOperation_Create(mdOperation, andre@0: mdSession, fwSession, fwMechanism->mdToken, fwMechanism->fwToken, andre@0: fwMechanism->mdInstance, fwMechanism->fwInstance, andre@0: NSSCKFWCryptoOperationType_Decrypt, &error); andre@0: if (fwOperation) { andre@0: nssCKFWSession_SetCurrentCryptoOperation(fwSession, fwOperation, andre@0: NSSCKFWCryptoOperationState_EncryptDecrypt); andre@0: } andre@0: andre@0: loser: andre@0: return error; andre@0: } andre@0: andre@0: /* andre@0: * nssCKFWMechanism_DigestInit andre@0: * Start an encryption session. andre@0: */ andre@0: NSS_EXTERN CK_RV andre@0: nssCKFWMechanism_DigestInit andre@0: ( andre@0: NSSCKFWMechanism *fwMechanism, andre@0: CK_MECHANISM *pMechanism, andre@0: NSSCKFWSession *fwSession andre@0: ) andre@0: { andre@0: NSSCKFWCryptoOperation *fwOperation; andre@0: NSSCKMDCryptoOperation *mdOperation; andre@0: NSSCKMDSession *mdSession; andre@0: CK_RV error = CKR_OK; andre@0: andre@0: andre@0: fwOperation = nssCKFWSession_GetCurrentCryptoOperation(fwSession, andre@0: NSSCKFWCryptoOperationState_Digest); andre@0: if (fwOperation) { andre@0: return CKR_OPERATION_ACTIVE; andre@0: } andre@0: andre@0: if (!fwMechanism->mdMechanism->DigestInit) { andre@0: return CKR_FUNCTION_FAILED; andre@0: } andre@0: andre@0: mdSession = nssCKFWSession_GetMDSession(fwSession); andre@0: mdOperation = fwMechanism->mdMechanism->DigestInit( andre@0: fwMechanism->mdMechanism, andre@0: fwMechanism, andre@0: pMechanism, andre@0: mdSession, andre@0: fwSession, andre@0: fwMechanism->mdToken, andre@0: fwMechanism->fwToken, andre@0: fwMechanism->mdInstance, andre@0: fwMechanism->fwInstance, andre@0: &error andre@0: ); andre@0: if (!mdOperation) { andre@0: goto loser; andre@0: } andre@0: andre@0: fwOperation = nssCKFWCryptoOperation_Create(mdOperation, andre@0: mdSession, fwSession, fwMechanism->mdToken, fwMechanism->fwToken, andre@0: fwMechanism->mdInstance, fwMechanism->fwInstance, andre@0: NSSCKFWCryptoOperationType_Digest, &error); andre@0: if (fwOperation) { andre@0: nssCKFWSession_SetCurrentCryptoOperation(fwSession, fwOperation, andre@0: NSSCKFWCryptoOperationState_Digest); andre@0: } andre@0: andre@0: loser: andre@0: return error; andre@0: } andre@0: andre@0: /* andre@0: * nssCKFWMechanism_SignInit andre@0: * Start an encryption session. andre@0: */ andre@0: NSS_EXTERN CK_RV andre@0: nssCKFWMechanism_SignInit andre@0: ( andre@0: NSSCKFWMechanism *fwMechanism, andre@0: CK_MECHANISM *pMechanism, andre@0: NSSCKFWSession *fwSession, andre@0: NSSCKFWObject *fwObject andre@0: ) andre@0: { andre@0: NSSCKFWCryptoOperation *fwOperation; andre@0: NSSCKMDCryptoOperation *mdOperation; andre@0: NSSCKMDSession *mdSession; andre@0: NSSCKMDObject *mdObject; andre@0: CK_RV error = CKR_OK; andre@0: andre@0: andre@0: fwOperation = nssCKFWSession_GetCurrentCryptoOperation(fwSession, andre@0: NSSCKFWCryptoOperationState_SignVerify); andre@0: if (fwOperation) { andre@0: return CKR_OPERATION_ACTIVE; andre@0: } andre@0: andre@0: if (!fwMechanism->mdMechanism->SignInit) { andre@0: return CKR_FUNCTION_FAILED; andre@0: } andre@0: andre@0: mdSession = nssCKFWSession_GetMDSession(fwSession); andre@0: mdObject = nssCKFWObject_GetMDObject(fwObject); andre@0: mdOperation = fwMechanism->mdMechanism->SignInit( andre@0: fwMechanism->mdMechanism, andre@0: fwMechanism, andre@0: pMechanism, andre@0: mdSession, andre@0: fwSession, andre@0: fwMechanism->mdToken, andre@0: fwMechanism->fwToken, andre@0: fwMechanism->mdInstance, andre@0: fwMechanism->fwInstance, andre@0: mdObject, andre@0: fwObject, andre@0: &error andre@0: ); andre@0: if (!mdOperation) { andre@0: goto loser; andre@0: } andre@0: andre@0: fwOperation = nssCKFWCryptoOperation_Create(mdOperation, andre@0: mdSession, fwSession, fwMechanism->mdToken, fwMechanism->fwToken, andre@0: fwMechanism->mdInstance, fwMechanism->fwInstance, andre@0: NSSCKFWCryptoOperationType_Sign, &error); andre@0: if (fwOperation) { andre@0: nssCKFWSession_SetCurrentCryptoOperation(fwSession, fwOperation, andre@0: NSSCKFWCryptoOperationState_SignVerify); andre@0: } andre@0: andre@0: loser: andre@0: return error; andre@0: } andre@0: andre@0: /* andre@0: * nssCKFWMechanism_VerifyInit andre@0: * Start an encryption session. andre@0: */ andre@0: NSS_EXTERN CK_RV andre@0: nssCKFWMechanism_VerifyInit andre@0: ( andre@0: NSSCKFWMechanism *fwMechanism, andre@0: CK_MECHANISM *pMechanism, andre@0: NSSCKFWSession *fwSession, andre@0: NSSCKFWObject *fwObject andre@0: ) andre@0: { andre@0: NSSCKFWCryptoOperation *fwOperation; andre@0: NSSCKMDCryptoOperation *mdOperation; andre@0: NSSCKMDSession *mdSession; andre@0: NSSCKMDObject *mdObject; andre@0: CK_RV error = CKR_OK; andre@0: andre@0: andre@0: fwOperation = nssCKFWSession_GetCurrentCryptoOperation(fwSession, andre@0: NSSCKFWCryptoOperationState_SignVerify); andre@0: if (fwOperation) { andre@0: return CKR_OPERATION_ACTIVE; andre@0: } andre@0: andre@0: if (!fwMechanism->mdMechanism->VerifyInit) { andre@0: return CKR_FUNCTION_FAILED; andre@0: } andre@0: andre@0: mdSession = nssCKFWSession_GetMDSession(fwSession); andre@0: mdObject = nssCKFWObject_GetMDObject(fwObject); andre@0: mdOperation = fwMechanism->mdMechanism->VerifyInit( andre@0: fwMechanism->mdMechanism, andre@0: fwMechanism, andre@0: pMechanism, andre@0: mdSession, andre@0: fwSession, andre@0: fwMechanism->mdToken, andre@0: fwMechanism->fwToken, andre@0: fwMechanism->mdInstance, andre@0: fwMechanism->fwInstance, andre@0: mdObject, andre@0: fwObject, andre@0: &error andre@0: ); andre@0: if (!mdOperation) { andre@0: goto loser; andre@0: } andre@0: andre@0: fwOperation = nssCKFWCryptoOperation_Create(mdOperation, andre@0: mdSession, fwSession, fwMechanism->mdToken, fwMechanism->fwToken, andre@0: fwMechanism->mdInstance, fwMechanism->fwInstance, andre@0: NSSCKFWCryptoOperationType_Verify, &error); andre@0: if (fwOperation) { andre@0: nssCKFWSession_SetCurrentCryptoOperation(fwSession, fwOperation, andre@0: NSSCKFWCryptoOperationState_SignVerify); andre@0: } andre@0: andre@0: loser: andre@0: return error; andre@0: } andre@0: andre@0: /* andre@0: * nssCKFWMechanism_SignRecoverInit andre@0: * Start an encryption session. andre@0: */ andre@0: NSS_EXTERN CK_RV andre@0: nssCKFWMechanism_SignRecoverInit andre@0: ( andre@0: NSSCKFWMechanism *fwMechanism, andre@0: CK_MECHANISM *pMechanism, andre@0: NSSCKFWSession *fwSession, andre@0: NSSCKFWObject *fwObject andre@0: ) andre@0: { andre@0: NSSCKFWCryptoOperation *fwOperation; andre@0: NSSCKMDCryptoOperation *mdOperation; andre@0: NSSCKMDSession *mdSession; andre@0: NSSCKMDObject *mdObject; andre@0: CK_RV error = CKR_OK; andre@0: andre@0: andre@0: fwOperation = nssCKFWSession_GetCurrentCryptoOperation(fwSession, andre@0: NSSCKFWCryptoOperationState_SignVerify); andre@0: if (fwOperation) { andre@0: return CKR_OPERATION_ACTIVE; andre@0: } andre@0: andre@0: if (!fwMechanism->mdMechanism->SignRecoverInit) { andre@0: return CKR_FUNCTION_FAILED; andre@0: } andre@0: andre@0: mdSession = nssCKFWSession_GetMDSession(fwSession); andre@0: mdObject = nssCKFWObject_GetMDObject(fwObject); andre@0: mdOperation = fwMechanism->mdMechanism->SignRecoverInit( andre@0: fwMechanism->mdMechanism, andre@0: fwMechanism, andre@0: pMechanism, andre@0: mdSession, andre@0: fwSession, andre@0: fwMechanism->mdToken, andre@0: fwMechanism->fwToken, andre@0: fwMechanism->mdInstance, andre@0: fwMechanism->fwInstance, andre@0: mdObject, andre@0: fwObject, andre@0: &error andre@0: ); andre@0: if (!mdOperation) { andre@0: goto loser; andre@0: } andre@0: andre@0: fwOperation = nssCKFWCryptoOperation_Create(mdOperation, andre@0: mdSession, fwSession, fwMechanism->mdToken, fwMechanism->fwToken, andre@0: fwMechanism->mdInstance, fwMechanism->fwInstance, andre@0: NSSCKFWCryptoOperationType_SignRecover, &error); andre@0: if (fwOperation) { andre@0: nssCKFWSession_SetCurrentCryptoOperation(fwSession, fwOperation, andre@0: NSSCKFWCryptoOperationState_SignVerify); andre@0: } andre@0: andre@0: loser: andre@0: return error; andre@0: } andre@0: andre@0: /* andre@0: * nssCKFWMechanism_VerifyRecoverInit andre@0: * Start an encryption session. andre@0: */ andre@0: NSS_EXTERN CK_RV andre@0: nssCKFWMechanism_VerifyRecoverInit andre@0: ( andre@0: NSSCKFWMechanism *fwMechanism, andre@0: CK_MECHANISM *pMechanism, andre@0: NSSCKFWSession *fwSession, andre@0: NSSCKFWObject *fwObject andre@0: ) andre@0: { andre@0: NSSCKFWCryptoOperation *fwOperation; andre@0: NSSCKMDCryptoOperation *mdOperation; andre@0: NSSCKMDSession *mdSession; andre@0: NSSCKMDObject *mdObject; andre@0: CK_RV error = CKR_OK; andre@0: andre@0: andre@0: fwOperation = nssCKFWSession_GetCurrentCryptoOperation(fwSession, andre@0: NSSCKFWCryptoOperationState_SignVerify); andre@0: if (fwOperation) { andre@0: return CKR_OPERATION_ACTIVE; andre@0: } andre@0: andre@0: if (!fwMechanism->mdMechanism->VerifyRecoverInit) { andre@0: return CKR_FUNCTION_FAILED; andre@0: } andre@0: andre@0: mdSession = nssCKFWSession_GetMDSession(fwSession); andre@0: mdObject = nssCKFWObject_GetMDObject(fwObject); andre@0: mdOperation = fwMechanism->mdMechanism->VerifyRecoverInit( andre@0: fwMechanism->mdMechanism, andre@0: fwMechanism, andre@0: pMechanism, andre@0: mdSession, andre@0: fwSession, andre@0: fwMechanism->mdToken, andre@0: fwMechanism->fwToken, andre@0: fwMechanism->mdInstance, andre@0: fwMechanism->fwInstance, andre@0: mdObject, andre@0: fwObject, andre@0: &error andre@0: ); andre@0: if (!mdOperation) { andre@0: goto loser; andre@0: } andre@0: andre@0: fwOperation = nssCKFWCryptoOperation_Create(mdOperation, andre@0: mdSession, fwSession, fwMechanism->mdToken, fwMechanism->fwToken, andre@0: fwMechanism->mdInstance, fwMechanism->fwInstance, andre@0: NSSCKFWCryptoOperationType_VerifyRecover, &error); andre@0: if (fwOperation) { andre@0: nssCKFWSession_SetCurrentCryptoOperation(fwSession, fwOperation, andre@0: NSSCKFWCryptoOperationState_SignVerify); andre@0: } andre@0: andre@0: loser: andre@0: return error; andre@0: } andre@0: andre@0: /* andre@0: * nssCKFWMechanism_GenerateKey andre@0: */ andre@0: NSS_EXTERN NSSCKFWObject * andre@0: nssCKFWMechanism_GenerateKey andre@0: ( andre@0: NSSCKFWMechanism *fwMechanism, andre@0: CK_MECHANISM_PTR pMechanism, andre@0: NSSCKFWSession *fwSession, andre@0: CK_ATTRIBUTE_PTR pTemplate, andre@0: CK_ULONG ulAttributeCount, andre@0: CK_RV *pError andre@0: ) andre@0: { andre@0: NSSCKMDSession *mdSession; andre@0: NSSCKMDObject *mdObject; andre@0: NSSCKFWObject *fwObject = NULL; andre@0: NSSArena *arena; andre@0: andre@0: if (!fwMechanism->mdMechanism->GenerateKey) { andre@0: *pError = CKR_FUNCTION_FAILED; andre@0: return (NSSCKFWObject *)NULL; andre@0: } andre@0: andre@0: arena = nssCKFWToken_GetArena(fwMechanism->fwToken, pError); andre@0: if (!arena) { andre@0: if (CKR_OK == *pError) { andre@0: *pError = CKR_GENERAL_ERROR; andre@0: } andre@0: return (NSSCKFWObject *)NULL; andre@0: } andre@0: andre@0: mdSession = nssCKFWSession_GetMDSession(fwSession); andre@0: mdObject = fwMechanism->mdMechanism->GenerateKey( andre@0: fwMechanism->mdMechanism, andre@0: fwMechanism, andre@0: pMechanism, andre@0: mdSession, andre@0: fwSession, andre@0: fwMechanism->mdToken, andre@0: fwMechanism->fwToken, andre@0: fwMechanism->mdInstance, andre@0: fwMechanism->fwInstance, andre@0: pTemplate, andre@0: ulAttributeCount, andre@0: pError); andre@0: andre@0: if (!mdObject) { andre@0: return (NSSCKFWObject *)NULL; andre@0: } andre@0: andre@0: fwObject = nssCKFWObject_Create(arena, mdObject, andre@0: fwSession, fwMechanism->fwToken, fwMechanism->fwInstance, pError); andre@0: andre@0: return fwObject; andre@0: } andre@0: andre@0: /* andre@0: * nssCKFWMechanism_GenerateKeyPair andre@0: */ andre@0: NSS_EXTERN CK_RV andre@0: nssCKFWMechanism_GenerateKeyPair andre@0: ( andre@0: NSSCKFWMechanism *fwMechanism, andre@0: CK_MECHANISM_PTR pMechanism, andre@0: NSSCKFWSession *fwSession, andre@0: CK_ATTRIBUTE_PTR pPublicKeyTemplate, andre@0: CK_ULONG ulPublicKeyAttributeCount, andre@0: CK_ATTRIBUTE_PTR pPrivateKeyTemplate, andre@0: CK_ULONG ulPrivateKeyAttributeCount, andre@0: NSSCKFWObject **fwPublicKeyObject, andre@0: NSSCKFWObject **fwPrivateKeyObject andre@0: ) andre@0: { andre@0: NSSCKMDSession *mdSession; andre@0: NSSCKMDObject *mdPublicKeyObject; andre@0: NSSCKMDObject *mdPrivateKeyObject; andre@0: NSSArena *arena; andre@0: CK_RV error = CKR_OK; andre@0: andre@0: if (!fwMechanism->mdMechanism->GenerateKeyPair) { andre@0: return CKR_FUNCTION_FAILED; andre@0: } andre@0: andre@0: arena = nssCKFWToken_GetArena(fwMechanism->fwToken, &error); andre@0: if (!arena) { andre@0: if (CKR_OK == error) { andre@0: error = CKR_GENERAL_ERROR; andre@0: } andre@0: return error; andre@0: } andre@0: andre@0: mdSession = nssCKFWSession_GetMDSession(fwSession); andre@0: error = fwMechanism->mdMechanism->GenerateKeyPair( andre@0: fwMechanism->mdMechanism, andre@0: fwMechanism, andre@0: pMechanism, andre@0: mdSession, andre@0: fwSession, andre@0: fwMechanism->mdToken, andre@0: fwMechanism->fwToken, andre@0: fwMechanism->mdInstance, andre@0: fwMechanism->fwInstance, andre@0: pPublicKeyTemplate, andre@0: ulPublicKeyAttributeCount, andre@0: pPrivateKeyTemplate, andre@0: ulPrivateKeyAttributeCount, andre@0: &mdPublicKeyObject, andre@0: &mdPrivateKeyObject); andre@0: andre@0: if (CKR_OK != error) { andre@0: return error; andre@0: } andre@0: andre@0: *fwPublicKeyObject = nssCKFWObject_Create(arena, mdPublicKeyObject, andre@0: fwSession, fwMechanism->fwToken, fwMechanism->fwInstance, &error); andre@0: if (!*fwPublicKeyObject) { andre@0: return error; andre@0: } andre@0: *fwPrivateKeyObject = nssCKFWObject_Create(arena, mdPrivateKeyObject, andre@0: fwSession, fwMechanism->fwToken, fwMechanism->fwInstance, &error); andre@0: andre@0: return error; andre@0: } andre@0: andre@0: /* andre@0: * nssCKFWMechanism_GetWrapKeyLength andre@0: */ andre@0: NSS_EXTERN CK_ULONG andre@0: nssCKFWMechanism_GetWrapKeyLength andre@0: ( andre@0: NSSCKFWMechanism *fwMechanism, andre@0: CK_MECHANISM_PTR pMechanism, andre@0: NSSCKFWSession *fwSession, andre@0: NSSCKFWObject *fwWrappingKeyObject, andre@0: NSSCKFWObject *fwKeyObject, andre@0: CK_RV *pError andre@0: ) andre@0: { andre@0: NSSCKMDSession *mdSession; andre@0: NSSCKMDObject *mdWrappingKeyObject; andre@0: NSSCKMDObject *mdKeyObject; andre@0: andre@0: if (!fwMechanism->mdMechanism->WrapKey) { andre@0: *pError = CKR_FUNCTION_FAILED; andre@0: return (CK_ULONG) 0; andre@0: } andre@0: andre@0: mdSession = nssCKFWSession_GetMDSession(fwSession); andre@0: mdWrappingKeyObject = nssCKFWObject_GetMDObject(fwWrappingKeyObject); andre@0: mdKeyObject = nssCKFWObject_GetMDObject(fwKeyObject); andre@0: return fwMechanism->mdMechanism->GetWrapKeyLength( andre@0: fwMechanism->mdMechanism, andre@0: fwMechanism, andre@0: pMechanism, andre@0: mdSession, andre@0: fwSession, andre@0: fwMechanism->mdToken, andre@0: fwMechanism->fwToken, andre@0: fwMechanism->mdInstance, andre@0: fwMechanism->fwInstance, andre@0: mdWrappingKeyObject, andre@0: fwWrappingKeyObject, andre@0: mdKeyObject, andre@0: fwKeyObject, andre@0: pError); andre@0: } andre@0: andre@0: /* andre@0: * nssCKFWMechanism_WrapKey andre@0: */ andre@0: NSS_EXTERN CK_RV andre@0: nssCKFWMechanism_WrapKey andre@0: ( andre@0: NSSCKFWMechanism *fwMechanism, andre@0: CK_MECHANISM_PTR pMechanism, andre@0: NSSCKFWSession *fwSession, andre@0: NSSCKFWObject *fwWrappingKeyObject, andre@0: NSSCKFWObject *fwKeyObject, andre@0: NSSItem *wrappedKey andre@0: ) andre@0: { andre@0: NSSCKMDSession *mdSession; andre@0: NSSCKMDObject *mdWrappingKeyObject; andre@0: NSSCKMDObject *mdKeyObject; andre@0: andre@0: if (!fwMechanism->mdMechanism->WrapKey) { andre@0: return CKR_FUNCTION_FAILED; andre@0: } andre@0: andre@0: mdSession = nssCKFWSession_GetMDSession(fwSession); andre@0: mdWrappingKeyObject = nssCKFWObject_GetMDObject(fwWrappingKeyObject); andre@0: mdKeyObject = nssCKFWObject_GetMDObject(fwKeyObject); andre@0: return fwMechanism->mdMechanism->WrapKey( andre@0: fwMechanism->mdMechanism, andre@0: fwMechanism, andre@0: pMechanism, andre@0: mdSession, andre@0: fwSession, andre@0: fwMechanism->mdToken, andre@0: fwMechanism->fwToken, andre@0: fwMechanism->mdInstance, andre@0: fwMechanism->fwInstance, andre@0: mdWrappingKeyObject, andre@0: fwWrappingKeyObject, andre@0: mdKeyObject, andre@0: fwKeyObject, andre@0: wrappedKey); andre@0: } andre@0: andre@0: /* andre@0: * nssCKFWMechanism_UnwrapKey andre@0: */ andre@0: NSS_EXTERN NSSCKFWObject * andre@0: nssCKFWMechanism_UnwrapKey andre@0: ( andre@0: NSSCKFWMechanism *fwMechanism, andre@0: CK_MECHANISM_PTR pMechanism, andre@0: NSSCKFWSession *fwSession, andre@0: NSSCKFWObject *fwWrappingKeyObject, andre@0: NSSItem *wrappedKey, andre@0: CK_ATTRIBUTE_PTR pTemplate, andre@0: CK_ULONG ulAttributeCount, andre@0: CK_RV *pError andre@0: ) andre@0: { andre@0: NSSCKMDSession *mdSession; andre@0: NSSCKMDObject *mdObject; andre@0: NSSCKMDObject *mdWrappingKeyObject; andre@0: NSSCKFWObject *fwObject = NULL; andre@0: NSSArena *arena; andre@0: andre@0: if (!fwMechanism->mdMechanism->UnwrapKey) { andre@0: /* we could simulate UnwrapKey using Decrypt and Create object, but andre@0: * 1) it's not clear that would work well, and 2) the low level token andre@0: * may want to restrict unwrap key for a reason, so just fail it it andre@0: * can't be done */ andre@0: *pError = CKR_FUNCTION_FAILED; andre@0: return (NSSCKFWObject *)NULL; andre@0: } andre@0: andre@0: arena = nssCKFWToken_GetArena(fwMechanism->fwToken, pError); andre@0: if (!arena) { andre@0: if (CKR_OK == *pError) { andre@0: *pError = CKR_GENERAL_ERROR; andre@0: } andre@0: return (NSSCKFWObject *)NULL; andre@0: } andre@0: andre@0: mdSession = nssCKFWSession_GetMDSession(fwSession); andre@0: mdWrappingKeyObject = nssCKFWObject_GetMDObject(fwWrappingKeyObject); andre@0: mdObject = fwMechanism->mdMechanism->UnwrapKey( andre@0: fwMechanism->mdMechanism, andre@0: fwMechanism, andre@0: pMechanism, andre@0: mdSession, andre@0: fwSession, andre@0: fwMechanism->mdToken, andre@0: fwMechanism->fwToken, andre@0: fwMechanism->mdInstance, andre@0: fwMechanism->fwInstance, andre@0: mdWrappingKeyObject, andre@0: fwWrappingKeyObject, andre@0: wrappedKey, andre@0: pTemplate, andre@0: ulAttributeCount, andre@0: pError); andre@0: andre@0: if (!mdObject) { andre@0: return (NSSCKFWObject *)NULL; andre@0: } andre@0: andre@0: fwObject = nssCKFWObject_Create(arena, mdObject, andre@0: fwSession, fwMechanism->fwToken, fwMechanism->fwInstance, pError); andre@0: andre@0: return fwObject; andre@0: } andre@0: andre@0: /* andre@0: * nssCKFWMechanism_DeriveKey andre@0: */ andre@0: NSS_EXTERN NSSCKFWObject * andre@0: nssCKFWMechanism_DeriveKey andre@0: ( andre@0: NSSCKFWMechanism *fwMechanism, andre@0: CK_MECHANISM_PTR pMechanism, andre@0: NSSCKFWSession *fwSession, andre@0: NSSCKFWObject *fwBaseKeyObject, andre@0: CK_ATTRIBUTE_PTR pTemplate, andre@0: CK_ULONG ulAttributeCount, andre@0: CK_RV *pError andre@0: ) andre@0: { andre@0: NSSCKMDSession *mdSession; andre@0: NSSCKMDObject *mdObject; andre@0: NSSCKMDObject *mdBaseKeyObject; andre@0: NSSCKFWObject *fwObject = NULL; andre@0: NSSArena *arena; andre@0: andre@0: if (!fwMechanism->mdMechanism->DeriveKey) { andre@0: *pError = CKR_FUNCTION_FAILED; andre@0: return (NSSCKFWObject *)NULL; andre@0: } andre@0: andre@0: arena = nssCKFWToken_GetArena(fwMechanism->fwToken, pError); andre@0: if (!arena) { andre@0: if (CKR_OK == *pError) { andre@0: *pError = CKR_GENERAL_ERROR; andre@0: } andre@0: return (NSSCKFWObject *)NULL; andre@0: } andre@0: andre@0: mdSession = nssCKFWSession_GetMDSession(fwSession); andre@0: mdBaseKeyObject = nssCKFWObject_GetMDObject(fwBaseKeyObject); andre@0: mdObject = fwMechanism->mdMechanism->DeriveKey( andre@0: fwMechanism->mdMechanism, andre@0: fwMechanism, andre@0: pMechanism, andre@0: mdSession, andre@0: fwSession, andre@0: fwMechanism->mdToken, andre@0: fwMechanism->fwToken, andre@0: fwMechanism->mdInstance, andre@0: fwMechanism->fwInstance, andre@0: mdBaseKeyObject, andre@0: fwBaseKeyObject, andre@0: pTemplate, andre@0: ulAttributeCount, andre@0: pError); andre@0: andre@0: if (!mdObject) { andre@0: return (NSSCKFWObject *)NULL; andre@0: } andre@0: andre@0: fwObject = nssCKFWObject_Create(arena, mdObject, andre@0: fwSession, fwMechanism->fwToken, fwMechanism->fwInstance, pError); andre@0: andre@0: return fwObject; andre@0: } andre@0: