pkiutilities/DeviceToken/Inc/DevCertOpenedKeysSrv.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 DevCertOpenedKeysSrv
*
*/



#ifndef __DEVCERTOPENEDKEYSSRV_H__
#define __DEVCERTOPENEDKEYSSRV_H__

#include "DevCertKeyDataManager.h"
#include "DevTokenDataTypes.h"

class CRSAPrivateKey;
class CRSASignature;
class CDSAPrivateKey;
class CDSASignature;
class CDevTokenDHParams;
class CDHPublicKey;
class CDevCertKeyStoreServer;

/**
 * DevToken Server side
 * Abstract base class for performing crypto operations on keys.
 * 
 *  @lib
 *  @since S60 v3.2
 */
class CDevCertOpenedKeySrv : public CActive
    {
    public:
    
        /**
         * Factory function for creating CDevCertOpenedKeySrv-derived classes.
         * 
         * @param aKeyData representing the key
         * @param aType Type of opened key
         * @param aMessage IPC message
         * @param aKeyDataMan Key data manager
         * @return new object of CDevCertOpenedKeySrv
         */
        static CDevCertOpenedKeySrv* NewL(const CDevCertKeyData& aKeyData, TUid aType, const RMessage2& aMessage,
                                          CDevCertKeyDataManager& aKeyDataMan );
        
        virtual ~CDevCertOpenedKeySrv();

         /**
         * Returns the object's human-readable label.
         * 
         * @param 
         * @return the object's human-readable label
         */
        const TDesC& Label() const;
        
        /**
         * Returns the key's handle so we can identifiy it.
         * 
         * @param 
         * @return the hadnle of key
         */
        TInt Handle() const;

        /**
         * The type of opened key.
         * 
         * @param 
         * @return the uid of opened key
         */
        virtual TUid Type() const = 0;

    protected:
        
        CDevCertOpenedKeySrv(const CDevCertKeyData& aKeyData, CDevCertKeyDataManager& aKeyDataMan );
        
        void DoOperation(TRequestStatus& aStatus);
        
        // Methods supplied by derived classes
        
    protected:
    
        /**
         * The key algorithm this operation applies to
         * 
         * @param
         * @return
         */
        virtual CDevTokenKeyInfo::EKeyAlgorithm Algorithm() const = 0;

        /**
         * The key usage required to perform this operation
         * 
         * @param
         * @return
         */
        virtual TKeyUsagePKCS15 RequiredUsage() const = 0;
        
        /**
         * Load the private key data
         * 
         * @param aStream used to read data
         * @return
         */
        virtual void ReadPrivateKeyL(RReadStream& aStream) = 0;
        
        /**
         * Perform the operation, called from RunL
         * 
         * @param 
         * @return
         */
        virtual void PerformOperationL() = 0;
        
        /**
         * Clean up, called after normal end error completion
         * 
         * @param 
         * @return
         */
        virtual void Cleanup() = 0;

    private:
        enum TState
            {
            EIdle,
            EOperation
            };
            
        // from CActive
        
        virtual void RunL();
        
        virtual TInt RunError(TInt aError);
        
        virtual void DoCancel();

    private:
        
        void ConstructL(const RMessage2& aMessage);
        
        void CheckKeyL(const CDevTokenKeyInfo& aKeyInfo, const RMessage2& aMessage);
        
        void Complete(TInt aError);

    private:
        
        const CDevCertKeyData&  iKeyData;
        
        CDevCertKeyDataManager& iKeyDataMan;
        
        HBufC*         iLabel;
        
        TState         iState;
        
        TRequestStatus*    iClientStatus;

    protected:
        
        TBool        iKeyRead;
    };


/**
 * DevToken Server side
 * class for performing crypto operations on RSA keys.
 *
 *  @lib
 *  @since S60 v3.2
 */
class CDevCertRSARepudiableSignerSrv : public CDevCertOpenedKeySrv
    {
    public:
        
        CDevCertRSARepudiableSignerSrv(const CDevCertKeyData& aKeyData, CDevCertKeyDataManager& aKeyDataMan );
        
        ~CDevCertRSARepudiableSignerSrv();
        
        void Sign(const TDesC8& aPlaintext, CRSASignature*& aSignature, TRequestStatus& aStatus);

    private:
        
        virtual TUid Type() const;
        
        virtual CDevTokenKeyInfo::EKeyAlgorithm Algorithm() const;
        
        virtual TKeyUsagePKCS15 RequiredUsage() const;
        
        virtual void ReadPrivateKeyL(RReadStream& aStream);
        
        virtual void PerformOperationL();
        
        virtual void Cleanup();

    private:
        
        CRSAPrivateKey* iPrivateKey;
        
        TPtrC8      iPlaintext;
        
        CRSASignature** iSignaturePtr;  
    };


/**
 * DevToken Server side
 * class for performing crypto operations on DSA keys.
 *
 *  @lib
 *  @since S60 v3.2
 */
class CDevCertDSARepudiableSignerSrv : public CDevCertOpenedKeySrv
    {
    public:
        
        CDevCertDSARepudiableSignerSrv(const CDevCertKeyData& aKeyData, CDevCertKeyDataManager& aKeyDataMan );
        
        ~CDevCertDSARepudiableSignerSrv();
        
        void Sign(const TDesC8& aPlaintext, CDSASignature*& aSignature, TRequestStatus& aStatus);

    private: 
        
        virtual TUid Type() const;
        
        virtual CDevTokenKeyInfo::EKeyAlgorithm Algorithm() const;
        
        virtual TKeyUsagePKCS15 RequiredUsage() const;
        
        virtual void ReadPrivateKeyL(RReadStream& aStream);
        
        virtual void PerformOperationL();
        
        virtual void Cleanup();

    private:
        
        CDSAPrivateKey* iPrivateKey;
        
        TPtrC8      iPlaintext;
        
        CDSASignature** iSignaturePtr;  
    };


/**
 * DevToken Server side
 * class for performing decrypt operations on RSA keys.
 *
 *  @lib
 *  @since S60 v3.2
 */
class CDevCertRSADecryptorSrv : public CDevCertOpenedKeySrv
    {
    public:
        
        CDevCertRSADecryptorSrv(const CDevCertKeyData& aKeyData, CDevCertKeyDataManager& aKeyDataMan );
        
        ~CDevCertRSADecryptorSrv();
        
        void Decrypt(const TDesC8& aCiphertext, HBufC8*&, TRequestStatus& aStatus);

    private:
        
        virtual TUid Type() const;
        
        virtual CDevTokenKeyInfo::EKeyAlgorithm Algorithm() const;
        
        virtual TKeyUsagePKCS15 RequiredUsage() const;
        
        virtual void ReadPrivateKeyL(RReadStream& aStream);
        
        virtual void PerformOperationL();
        
        virtual void Cleanup();

    private:
        
        CRSAPrivateKey* iPrivateKey;
        
        TPtrC8      iCiphertext;
        
        HBufC8**    iPlaintextPtr;
    };


/**
 * DevToken Server side
 * class for performing crypto operations on DH keys.
 *
 *  @lib
 *  @since S60 v3.2
 */
class CDevCertDHAgreementSrv : public CDevCertOpenedKeySrv
    {
    public:
    
        CDevCertDHAgreementSrv(const CDevCertKeyData& aKeyData, CDevCertKeyDataManager& aKeyDataMan );
        
        ~CDevCertDHAgreementSrv();
        
        void PublicKey(CDevTokenDHParams& aParameters, RInteger& aPublicKey, TRequestStatus& aStatus);
        
        void Agree(CDHPublicKey& aY, HBufC8*& aAgreedKey, TRequestStatus& aStatus);

    private:
        
        virtual TUid Type() const;
        
        virtual CDevTokenKeyInfo::EKeyAlgorithm Algorithm() const;
        
        virtual TKeyUsagePKCS15 RequiredUsage() const;
        
        virtual void ReadPrivateKeyL(RReadStream& aStream);
        
        virtual void PerformOperationL();
        
        virtual void Cleanup();

    private:
        
        void DoPublicKeyL();
        
        void DoAgreeL();

    enum TDHState
        {
        EIdle,
        EPublicKey,
        EAgree
        };

    private:
        
        RInteger    iKey;
        
        TDHState    iDHState;
        
        // For public key operation
        CDevTokenDHParams*    iPKParams;
        
        RInteger*     iPKPublicKeyPtr;
        
        // For agree key operation
        CDHPublicKey* iAKPublicKey;
        
        HBufC8**    iAKAgreedKeyPtr;
    };

#endif  //__DEVCERTOPENEDKEYSSRV_H__

//EOF