pkiutilities/DeviceToken/Inc/DevCertKeyStoreServer.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 26 Jan 2010 15:20:08 +0200
changeset 0 164170e6151a
permissions -rw-r--r--
Revision: 201004

/*
* Copyright (c) 2006 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:   The header file of DevCertKeyStoreServer
*
*/



#ifndef __DEVCERTKEYSTORESERVER_H__
#define __DEVCERTKEYSTORESERVER_H__

#include <mctkeystoremanager.h>
#include <s32file.h>
#include <secdlg.h>

class CDecPKCS8Data;
class CDevCertRSARepudiableSigner;
class CDevCertDSARepudiableSigner;
class CDevCertRSADecryptor;
class CDevCertDHAgreement;
class CDevCertKeyCreator;
class CDevCertKeyData;
class CDevCertKeyDataManager;
class CDevCertOpenedKeySrv;
class CDevTokenKeyInfo;
class CDevCertKeyStoreSession;
class CDevCertKeyStoreConduit;

/** 
 * Server side implementation of keystore interfaces as an active object.
 * 
 *  @lib 
 *  @since S60 v3.2
 */
class CDevCertKeyStoreServer : public CActive
    {
    public:
        
        static CDevCertKeyStoreServer* NewL();
        
        virtual ~CDevCertKeyStoreServer();
        
        CDevCertKeyStoreSession* CreateSessionL();
        
        void RemoveSession(CDevCertKeyStoreSession& aSession);
        
        void ServiceRequestL(const RMessage2& aMessage, CDevCertKeyStoreSession& aSession);
    
    public:
        
        // For MKeyStore
        void ListL(const TCTKeyAttributeFilter& aFilter, RPointerArray<CDevTokenKeyInfo>& aKeys);
        
        void GetKeyInfoL(TInt aObjectId, CDevTokenKeyInfo*& aInfo);
        
        CDevCertOpenedKeySrv* OpenKeyL(TInt aHandle, TUid aOpenedKeyType);
        
        void ExportPublicL(TInt aObjectId, TDes8& aOut);
        
        TInt GetKeyLengthL(TInt aObjectId);
    
    public:
        
        // For MCTKeyStoreManager
        void CreateKey(CDevTokenKeyInfo& aReturnedKey, TRequestStatus& aStatus);
        
        void CancelCreateKey();
        
        void ImportKey(const TDesC8& aKey, CDevTokenKeyInfo& aReturnedKey, TBool aIsEncrypted,TRequestStatus& aStatus);
        
        void CancelImportKey();
        
        void ExportKey(TInt aObjectId, const TPtr8& aKey, TRequestStatus& aStatus); 
        
        void CancelExportKey();
        
        void DeleteKeyL(TInt aObjectId);
        
        void SetUsePolicyL(TInt aObjectId, const TSecurityPolicy& aPolicy);
        
        void SetManagementPolicyL(TInt aObjectId, const TSecurityPolicy& aPolicy);

    private:
        
        CDevCertKeyStoreServer();
        
        void ConstructL();
    
    private:
        
        //  From CActive
        void RunL();
        
        TInt RunError(TInt aError);
        
        void DoCancel();
    
    private:
        
        enum ECurrentAction
            {
            EIdle,
            EImportOpenPrivateStream,
            ECreateKeyCreate,
            ECreateKeyFinal,
            EImportKey, 
            EExportKey,
            EKeyCreated
            };

        /**
        * The operations that can create a new key, used by CheckKeyAttributes.
        */
        enum TNewKeyOperation
            {
            ENewKeyCreate,
            ENewKeyImportPlaintext
            };

    private:
    
        CDevCertKeyStoreServer(const CDevCertKeyStoreServer&);      //  No copying
    
        CDevCertKeyStoreServer& operator=(const CDevCertKeyStoreServer&); //  No copying
    
    private:

        TInt CheckKeyAttributes(CDevTokenKeyInfo& aKey, TNewKeyOperation aOp);
        
        TInt CheckKeyAlgorithmAndSize(CDevTokenKeyInfo& aKey);
        
        void DoCreateKeyL();
        
        void DoStoreKeyL();
        
        void DoImportKeyL();
        
        void DoExportKeyL(TInt aObjectId, const TPtr8& aKey, TRequestStatus& aStatus);
        
        void CompleteKeyExportL();
        
        void OpenPrivateStream();

    private:
    
        void PKCS8ToKeyL(CDecPKCS8Data* aPKCS8Data);
        
        TBool KeyMatchesFilterL(const CDevTokenKeyInfo& aInfo,
        
        const TCTKeyAttributeFilter& aFilter);
    
    private:
        
        CDevCertKeyDataManager* iKeyDataManager;
        
        CDevCertKeyStoreConduit* iConduit;
        
        RPointerArray<CDevCertKeyStoreSession> iSessions;
        
        const RMessage2* iMessage;    //The request currently being processed, not owned by us
        
        CDevCertKeyStoreSession* iSession;      // The session of the request being processed, not owned through here
        
        TRequestStatus* iCallerRequest;
        
        ECurrentAction iAction;
    
    private:
        
        CDevTokenKeyInfo* iKeyInfo;
        
        CDevCertKeyCreator* iKeyCreator;

        TPtr8 iExportBuf;

        TInt iObjectId;
    
        TPtrC8 iPKCS8Data;
        
        TBool iImportingEncryptedKey;
        
        TPINValue iPassword;
        
        const CDevCertKeyData* iKeyData;
    };

#endif  //  __CDevCertKeyStoreServer_H__

//EOF