wim/WimPlugin/inc/WimKeyStore.h
changeset 0 164170e6151a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wim/WimPlugin/inc/WimKeyStore.h	Tue Jan 26 15:20:08 2010 +0200
@@ -0,0 +1,383 @@
+/*
+* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  An implementation of single key store interface
+*
+*/
+
+
+#ifndef CWIMKEYSTORE_H
+#define CWIMKEYSTORE_H
+
+//  INCLUDES
+
+#include <mctkeystore.h>
+#include <e32base.h>
+
+// FORWARD DECLARATION
+
+class CWimKeyDetails;
+class MCTAuthenticationObjectList;
+class CWimToken;
+class CWimPin;
+class CWimRSASigner;
+
+
+// CLASS DECLARATION
+
+/**
+*  Represents read only key store.
+*
+*  @lib   WimPlugin
+*  @since Series60 2.1
+*/
+
+class CWimKeyStore : public CActive, public MCTKeyStore 
+    {
+    public: // Constructor and destructor
+
+        /**
+        * Constructor
+        * @param  aToken   (IN) A reference to current token
+        * @return An instance of this class
+        */
+        static CWimKeyStore* NewL( CWimToken& aToken );
+    public: // Function from base class MCTTokenInterface
+        
+        /**
+        * Returns a reference to current token
+        * @return A Reference to current token
+        */
+        MCTToken& Token();
+
+    public: // Functions from base class MKeyStore
+        
+        /**
+        * Lists all the keys in the store that match the filter
+        * The caller of this function owns all given parameters
+        * @param  aKeys    (OUT) An array to which the returned keys 
+        *         are appended.
+        * @param  aFilter  (IN) A filter controlling which keys are returned
+        * @param  aStatus  (IN/OUT) This will be completed with the final 
+        *         status code. Caller should set it to value TRequestPending
+        *         KErrNone, if no errors detected. Note: if no keys are found,
+        *         it is also KErrNone
+        *         KErrArgument, if aKeys array is NULL
+        *         KErrHardwareNotAvailable, if Wim card suddenly removed
+        *         Any other system wide error code (e.g. KErrNoMemory)
+        * @return void
+        */
+        void List( RMPointerArray<CCTKeyInfo>& aKeys, 
+                   const TCTKeyAttributeFilter& aFilter, 
+                   TRequestStatus& aStatus );
+
+        /**
+        * Cancels an ongoing List operation
+        * @return void
+        */
+        void CancelList();
+
+        /**
+        * Retrieves a reference to pointer of key depending on given 
+        * handle (aHandle). The caller of this function owns all given 
+        * parameters.
+        * @param  aHandle   The handle of the required key.
+        * @param  aInfo     The returned key info.
+        * @param  aStatus   Async request notification.
+        *         KErrNone, if no errors detected
+        *         KErrArgument, if aHandle is not current token's handle
+        *         KErrNotFound, if aInfo not found
+        *         KErrHardwareNotAvailable, if Wim card suddenly removed
+        *         Any other system wide error code (e.g. KErrNoMemory)
+        * @return void
+        */
+        void GetKeyInfo( TCTTokenObjectHandle aHandle, 
+                         CCTKeyInfo*& aInfo,
+                         TRequestStatus& aStatus );
+
+        /**
+        * Cancels an ongoing GetKeyInfo operation
+        * @return void
+        */
+        void CancelGetKeyInfo();
+
+        /** 
+        * Open an RSA key for signing
+        * @param aHandle The handle of the key to be opened
+        * This must be the handle of a RSA key on this store that is
+        * usable for signing by this process or the operation will fail.
+        * @param aSigner The returned signer object
+        * @param aStatus Asynchronous request notification.
+        * @return void
+        */
+        void Open( const TCTTokenObjectHandle& aHandle, 
+                   MRSASigner*& aSigner,
+                   TRequestStatus& aStatus );
+        
+        /** 
+        * Open a DSA key for signing
+        * @param aHandle -The handle of the key to be opened
+        * This must be the handle of a DSA key on this store that is
+        * usable by this process for signing or the operation will fail.
+        * @param aSigner -The returned signer object
+        * @param aStatus -Asynchronous request notification.
+        * @return void
+        */
+        void Open( const TCTTokenObjectHandle& aHandle, 
+                   MDSASigner*& aSigner, 
+                   TRequestStatus& aStatus );
+
+        /** 
+        * Open a RSA key for private decryption
+        * @param aHandle -The handle of the key to be opened
+        * This must be the handle of a RSA key on this store that is
+        * usable by this process for decryption or the operation will fail.
+        * @param aDecryptor -The returned decryptor object
+        * @param aStatus -Asynchronous request notification.
+        * @return void
+        */
+        void Open( const TCTTokenObjectHandle& aHandle, 
+                   MCTDecryptor*& aDecryptor,
+                   TRequestStatus& aStatus );
+
+        /** 
+        * Open a DH key for key agreement
+        * @param aHandle -The handle of the key to be opened
+        * This must be the handle of a DH key on this store that is
+        * usable by this process for decryption or the operation will fail.
+        * @param aDH    -The returned agreement object
+        * @param aStatus -Asynchronous request notification.
+        * @return void
+        */
+        void Open( const TCTTokenObjectHandle& aHandle, 
+                   MCTDH*& aDH, 
+                   TRequestStatus& aStatus );
+
+        /** 
+        * Cancels an ongoing Open operation
+        * @return void
+        */
+        void CancelOpen();
+
+        /** 
+        * Returns the public key in DER-encoded ASN-1
+        * @param aHandle    -The handle of the key to be opened
+        * @param aPublicKey -returned key
+        * @param aStatus    -Asynchronous request notification.
+        * @return void
+        */
+        void ExportPublic( const TCTTokenObjectHandle& aHandle,
+                           HBufC8*& aPublicKey,
+                           TRequestStatus& aStatus );
+        
+        /**  
+        * Cancels an ongoing Export operation
+        * @return void
+        */
+        void CancelExportPublic();
+
+       
+        /** 
+        * Perform signing operation.
+        * @param  aObject -The handle of signer object. 
+        * @param  aDigest -The data to be signed.   
+        * @param  aSignature -The returned signature. This remains owned
+        *         by the signer, and is valid until the signer is released or
+        *         until the next Sign.
+        * @param aStatus -Async status notification
+        * @return void
+        */ 
+        void NonRepudiableRSASign( const TCTTokenObjectHandle& aObject, 
+                                   const TDesC8& aDigest, 
+                                   CRSASignature*& aSignature, 
+                                   TRequestStatus& aStatus );
+
+    protected:  // From base class MCTTokenInterface
+        
+        virtual void DoRelease();
+
+    private: // Constructors
+
+        /**
+        * Default constructor
+        * @param  aToken   (IN) A reference to current token
+        */
+        CWimKeyStore( CWimToken& aToken );
+
+        // Second phase constructor
+        void ConstructL();
+
+        // Destructor
+        virtual ~CWimKeyStore();
+
+    private:
+
+        /**
+        * Starts initialization on this class.
+        * @return void
+        */
+        void Initialize();
+
+        /**
+        * Creates one key info for list or get key info operation
+        * @param   aIndex (IN) An index value of current key info in
+        *          the internal array
+        * @return  A pointer to created key info
+        */
+
+        CCTKeyInfo* CreateKeyInfoL( TInt aIndex );
+
+        /**
+        * Leavable function to filter keys in list operation.
+        * @return void
+        */
+        void DoFilterKeysL();
+
+        /**
+        * Leavable function for key creation.
+        * @param   aHandle (IN) Handle of desired authentication object.
+        * @return  A pointer to created authentication object
+        */
+        MCTAuthenticationObject* MakeAuthObjectL( TInt aHandle );
+
+        /**
+        * Returns boolean value true or false indicating if token is removed
+        * @return  Boolean value: true, if token removed, false if not
+        */
+        TBool TokenRemoved();
+
+        
+        /**
+        * Checks if token is removed or is this object active
+        * @return  Boolean value: true if allowed, false if not
+        */
+        TBool EnteringAllowed( TRequestStatus& aStatus );
+
+
+    private: // From base class CActive
+
+        void RunL();
+        
+        /** 
+        * Leaves in RunL are handled here.
+        * @param  aError  Leaving code
+        * @return An integer that should be KErrNone if leave was handled.
+        */
+        TInt RunError( TInt aError );
+        
+        void DoCancel();
+
+    private: // Data
+
+        // A reference to current token of this interface
+        CWimToken& iToken;
+
+        // State flag for RunL
+        enum TPhase
+            {
+            EIdle,
+            EOpenAuthObjectsInterface,
+            EListAuthObjects,
+            EGetKeyList,
+            ECheckGetKeyList,
+            EFilterKeys,
+            EGetKey,
+            ECreateRSASignerObject,
+            EStartNonRepudiableRSASign,
+            ESignCompleted,
+            EStartExportPublicKey,
+            EExportPublicKeyDone
+            };
+
+        // Flag for internal state machine
+        TPhase iPhase;
+
+        // Flag for internal state machine
+        TPhase iPhaseOriginal;
+
+        // The pointed object acts as a converter between
+        // CWimCertStore/CWimKeyStore interface and WimClient
+        // This class owns the pointed object
+        CWimKeyDetails* iCWimKeyDetails;
+
+        // Used for saving caller status in asynchronous call
+        // This class don't own the pointed object
+        TRequestStatus* iOriginalRequestStatus;
+
+        // Temporal array for key info pointers
+        // This array is used to append key infos in List operation
+        // This class don't own the pointed objects
+        RPointerArray<CCTKeyInfo>* iKeyList;
+
+        // Temporal array for key infos. 
+        // This array is used to fetch key infos from WimClient.
+        RPointerArray<CCTKeyInfo> iKeyInfos;
+
+        // Used with list operation to filter keys
+        TCTKeyAttributeFilter iKeyFilter;   
+
+        // Index for going through all keys asynchronously 
+        // in list operation.
+        TInt iKeyIndex;
+
+        // Used to fetch one key info from wimclient
+        // This class don't own the pointed object.
+        CCTKeyInfo** iInfo;
+
+        // Key value for key object. Used in asynchronous call of
+        // getting one key info.
+        TInt iHandle;
+        
+        // Array for key info keys fetched from wimclient
+        CArrayFixFlat<TUint8>* iKeyNumbers;
+
+        // Array of pointers to PIN-NRs.This class don't own the pointed
+        // objects
+        const CArrayPtrFlat<CWimPin>* iPinNRs; 
+
+        // Is key list done or not already. Set to true value in the first
+        // key list.
+        TBool iListDone;
+
+        //Signer object, which is returned to caller. Not Owned.
+        CWimRSASigner*              iSigner;
+              
+        //Handle stored during opening new RSA signer object.
+        TCTTokenObjectHandle        iOpenSigninKeyHandle;
+
+        //Buffer, which holds received signature from server. Owned.
+        HBufC8*                     iSignature;
+        
+        //Signature object which is filled with data received from server.
+        //Not owned.
+        CRSASignature**              iRSASignature; 
+        
+        //Buffer used to contain KeyId in Sign and public key export
+        //operations. Owned.
+        HBufC8*                     iKeyId;
+
+        //Buffer to hold public key data during public key export. Not Owned.
+        HBufC8*                     iPublicKey;
+
+        // The index of exported key
+        TInt                        iExportKeyIdIndex;
+        
+        TInt                        iRSAKeyIdIndex;
+        
+        const TDesC8*               iDigest;
+        
+    };
+
+#endif      // CWIMKEYSTORE_H   
+            
+// End of File