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