sl@0: /* sl@0: * Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: * All rights reserved. sl@0: * This component and the accompanying materials are made available sl@0: * under the terms of the License "Eclipse Public License v1.0" sl@0: * which accompanies this distribution, and is available sl@0: * at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: * sl@0: * Initial Contributors: sl@0: * Nokia Corporation - initial contribution. sl@0: * sl@0: * Contributors: sl@0: * sl@0: * Description: sl@0: * COpenedKey, abstract base class for performing crypto operations on keys sl@0: * sl@0: */ sl@0: sl@0: sl@0: /** sl@0: @file sl@0: @internalTechnology sl@0: */ sl@0: sl@0: #ifndef __OpenedKeys_h__ sl@0: #define __OpenedKeys_h__ sl@0: sl@0: #include "CKeyDataManager.h" sl@0: #include "keystorepassphrase.h" sl@0: #include "fsdatatypes.h" sl@0: sl@0: #ifdef SYMBIAN_KEYSTORE_USE_AUTH_SERVER sl@0: #include <authserver/authclient.h> sl@0: #endif // SYMBIAN_KEYSTORE_USE_AUTH_SERVER sl@0: sl@0: class CRSAPrivateKey; sl@0: class CRSASignature; sl@0: class CDSAPrivateKey; sl@0: class CDSASignature; sl@0: class CDHParams; sl@0: class CDHPublicKey; sl@0: class CFSKeyStoreServer; sl@0: sl@0: class COpenedKey : public CActive sl@0: { sl@0: sl@0: protected: sl@0: enum TState sl@0: { sl@0: EIdle, sl@0: EGetPassphrase, sl@0: #ifdef SYMBIAN_KEYSTORE_USE_AUTH_SERVER sl@0: EDoAuthenticate, sl@0: EAuthenticate, sl@0: #endif // SYMBIAN_KEYSTORE_USE_AUTH_SERVER sl@0: }; sl@0: sl@0: public: sl@0: /** Factory function for creating COpenedKey-derived classes. */ sl@0: static COpenedKey* NewL(const CFileKeyData& aKeyData, TUid aType, const RMessage2& aMessage, sl@0: CFileKeyDataManager& aKeyDataMan, CPassphraseManager& aPassMan); sl@0: sl@0: virtual ~COpenedKey(); sl@0: sl@0: /** Returns the object's human-readable label */ sl@0: const TDesC& Label() const; sl@0: sl@0: /** Returns the key's handle so we can identifiy it. */ sl@0: TInt Handle() const; sl@0: sl@0: /// The type of opened key sl@0: virtual TUid Type() const = 0; sl@0: sl@0: protected: sl@0: COpenedKey(const CFileKeyData& aKeyData, CFileKeyDataManager& aKeyDataMan, CPassphraseManager& aPassMan); sl@0: void GetPassphrase(TRequestStatus& aStatus); sl@0: sl@0: // Methods supplied by derived classes sl@0: sl@0: /// The key algorithm this operation applies to sl@0: virtual CKeyInfo::EKeyAlgorithm Algorithm() const = 0; sl@0: /// The key usage required to perform this operation sl@0: virtual TKeyUsagePKCS15 RequiredUsage() const = 0; sl@0: /// Load the private key data sl@0: virtual void ReadPrivateKeyL(RReadStream& aStream) = 0; sl@0: /// Perform the operation, called from RunL sl@0: virtual void PerformOperationL() = 0; sl@0: /// Clean up, called after normal end error completion sl@0: virtual void Cleanup() = 0; sl@0: sl@0: #ifdef SYMBIAN_KEYSTORE_USE_AUTH_SERVER sl@0: protected: sl@0: void AuthenticateL(); sl@0: #endif // SYMBIAN_KEYSTORE_USE_AUTH_SERVER sl@0: sl@0: private: sl@0: virtual void RunL(); sl@0: virtual TInt RunError(TInt aError); sl@0: virtual void DoCancel(); sl@0: sl@0: private: sl@0: void ConstructL(const RMessage2& aMessage); sl@0: void CheckKeyL(const RMessage2& aMessage); sl@0: void Complete(TInt aError); sl@0: sl@0: private: sl@0: const CFileKeyData& iKeyData; sl@0: CFileKeyDataManager& iKeyDataMan; sl@0: CPassphraseManager& iPassMan; sl@0: HBufC* iLabel; sl@0: sl@0: CPassphrase* iPassphrase; sl@0: CKeyInfo* iKeyInfo; sl@0: #ifdef SYMBIAN_KEYSTORE_USE_AUTH_SERVER sl@0: AuthServer::CIdentity* iUserIdentity; sl@0: AuthServer::RAuthClient iAuthClient; sl@0: AuthServer::CAuthExpression* iExpression; sl@0: #endif // SYMBIAN_KEYSTORE_USE_AUTH_SERVER sl@0: protected: sl@0: TState iState; sl@0: TRequestStatus* iClientStatus; sl@0: TBool iKeyRead; sl@0: }; sl@0: sl@0: class CRSARepudiableSigner : public COpenedKey sl@0: { sl@0: public: sl@0: CRSARepudiableSigner(const CFileKeyData& aKeyData, CFileKeyDataManager& aKeyDataMan, CPassphraseManager& aPassMan); sl@0: ~CRSARepudiableSigner(); sl@0: void Sign(const TDesC8& aPlaintext, CRSASignature*& aSignature, TRequestStatus& aStatus); sl@0: sl@0: private: sl@0: virtual TUid Type() const; sl@0: virtual CKeyInfo::EKeyAlgorithm Algorithm() const; sl@0: virtual TKeyUsagePKCS15 RequiredUsage() const; sl@0: virtual void ReadPrivateKeyL(RReadStream& aStream); sl@0: virtual void PerformOperationL(); sl@0: virtual void Cleanup(); sl@0: sl@0: private: sl@0: CRSAPrivateKey* iPrivateKey; sl@0: TPtrC8 iPlaintext; sl@0: CRSASignature** iSignaturePtr; sl@0: }; sl@0: sl@0: class CDSARepudiableSigner : public COpenedKey sl@0: { sl@0: public: sl@0: CDSARepudiableSigner(const CFileKeyData& aKeyData, CFileKeyDataManager& aKeyDataMan, CPassphraseManager& aPassMan); sl@0: ~CDSARepudiableSigner(); sl@0: void Sign(const TDesC8& aPlaintext, CDSASignature*& aSignature, TRequestStatus& aStatus); sl@0: sl@0: private: sl@0: virtual TUid Type() const; sl@0: virtual CKeyInfo::EKeyAlgorithm Algorithm() const; sl@0: virtual TKeyUsagePKCS15 RequiredUsage() const; sl@0: virtual void ReadPrivateKeyL(RReadStream& aStream); sl@0: virtual void PerformOperationL(); sl@0: virtual void Cleanup(); sl@0: sl@0: private: sl@0: CDSAPrivateKey* iPrivateKey; sl@0: TPtrC8 iPlaintext; sl@0: CDSASignature** iSignaturePtr; sl@0: }; sl@0: sl@0: class CFSRSADecryptor : public COpenedKey sl@0: { sl@0: public: sl@0: CFSRSADecryptor(const CFileKeyData& aKeyData, CFileKeyDataManager& aKeyDataMan, CPassphraseManager& aPassMan); sl@0: ~CFSRSADecryptor(); sl@0: void Decrypt(const TDesC8& aCiphertext, HBufC8*&, TRequestStatus& aStatus); sl@0: sl@0: private: sl@0: virtual TUid Type() const; sl@0: virtual CKeyInfo::EKeyAlgorithm Algorithm() const; sl@0: virtual TKeyUsagePKCS15 RequiredUsage() const; sl@0: virtual void ReadPrivateKeyL(RReadStream& aStream); sl@0: virtual void PerformOperationL(); sl@0: virtual void Cleanup(); sl@0: sl@0: private: sl@0: CRSAPrivateKey* iPrivateKey; sl@0: TPtrC8 iCiphertext; sl@0: HBufC8** iPlaintextPtr; sl@0: }; sl@0: sl@0: class CDHAgreement : public COpenedKey sl@0: { sl@0: public: sl@0: CDHAgreement(const CFileKeyData& aKeyData, CFileKeyDataManager& aKeyDataMan, CPassphraseManager& aPassMan); sl@0: ~CDHAgreement(); sl@0: void PublicKey(CDHParams& aParameters, RInteger& aPublicKey, TRequestStatus& aStatus); sl@0: void Agree(CDHPublicKey& aY, HBufC8*& aAgreedKey, TRequestStatus& aStatus); sl@0: sl@0: private: sl@0: virtual TUid Type() const; sl@0: virtual CKeyInfo::EKeyAlgorithm Algorithm() const; sl@0: virtual TKeyUsagePKCS15 RequiredUsage() const; sl@0: virtual void ReadPrivateKeyL(RReadStream& aStream); sl@0: virtual void PerformOperationL(); sl@0: virtual void Cleanup(); sl@0: sl@0: private: sl@0: void DoPublicKeyL(); sl@0: void DoAgreeL(); sl@0: sl@0: enum TDHState sl@0: { sl@0: EIdle, sl@0: EPublicKey, sl@0: EAgree sl@0: }; sl@0: sl@0: private: sl@0: RInteger iKey; sl@0: TDHState iDHState; sl@0: // For public key operation sl@0: CDHParams* iPKParams; sl@0: RInteger* iPKPublicKeyPtr; sl@0: // For agree key operation sl@0: CDHPublicKey* iAKPublicKey; sl@0: HBufC8** iAKAgreedKeyPtr; sl@0: }; sl@0: sl@0: #endif