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