pkiutilities/DeviceToken/Src/KeyStore/Server/DevCertKeyStreamUtils.cpp
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:   Implementation of DevCertKeyStreamUtils
*
*/


#include <asymmetrickeys.h>
#include "DevCertKeyStreamUtils.h"
#include "DevCertKeyEncryptor.h"

// ======== GLOBAL FUNCTIONS ========

// ---------------------------------------------------------------------------
// ExternalizeL()
// RSA Public Key
// ---------------------------------------------------------------------------
//
void ExternalizeL(const CRSAPublicKey& aKey, RWriteStream& aStream)
    {
    aStream << aKey.N() << aKey.E();
    }


// ---------------------------------------------------------------------------
// ExternalizeL()
// RSA Private Key
// ---------------------------------------------------------------------------
//
void ExternalizeL(const CRSAPrivateKey& aData, RWriteStream& aStream)
    {
    CDevCertKeyEncryptor* encryptor = CDevCertKeyEncryptor::NewLC();
    if( encryptor->IsPluginExistL() )
        {
        MKeyEncryptor* encrypt = encryptor->CreateImplementationL();  

        //aStream << aData.N();
        EncryptAndStoreL(aData.N(), aStream, encrypt );

        // Check the incoming RSA private key (standard or CRT) 
        TRSAPrivateKeyType keyType = aData.PrivateKeyType();
        aStream.WriteInt32L((TInt32)keyType);

        if (EStandard==keyType)
            {
            const CRSAPrivateKeyStandard& key = static_cast<const CRSAPrivateKeyStandard&>(aData);
            //aStream << key.D();
            EncryptAndStoreL(key.D(), aStream, encrypt );
            }
        else if (EStandardCRT==keyType)
            {
            const CRSAPrivateKeyCRT& key = static_cast<const CRSAPrivateKeyCRT&>(aData);
            //aStream << key.P() << key.Q() << key.DP() << key.DQ() << key.QInv();
            EncryptAndStoreL(key.P(), aStream, encrypt );
            EncryptAndStoreL(key.Q(), aStream, encrypt );
            EncryptAndStoreL(key.DP(), aStream, encrypt );
            EncryptAndStoreL(key.DQ(), aStream, encrypt );
            EncryptAndStoreL(key.QInv(), aStream, encrypt );
            }
        else
            { 
            User::Leave(KErrNotSupported);
            }   
        }
    else
        {
        aStream << aData.N();

        // Check the incoming RSA private key (standard or CRT) 
        TRSAPrivateKeyType keyType = aData.PrivateKeyType();
        aStream.WriteInt32L((TInt32)keyType);

        if (EStandard==keyType)
            {
            const CRSAPrivateKeyStandard& key = static_cast<const CRSAPrivateKeyStandard&>(aData);
            aStream << key.D();
            }
        else if (EStandardCRT==keyType)
            {
            const CRSAPrivateKeyCRT& key = static_cast<const CRSAPrivateKeyCRT&>(aData);
            aStream << key.P() << key.Q() << key.DP() << key.DQ() << key.QInv();
            }
        else
            { 
            User::Leave(KErrNotSupported);
            }
        } 
    CleanupStack::PopAndDestroy( encryptor );        
    }


// ---------------------------------------------------------------------------
// ExternalizeL()
// DSA Public Key
// ---------------------------------------------------------------------------
//
void ExternalizeL(const CDSAPublicKey& aKey, RWriteStream& aStream)
    {
    aStream << aKey.P() << aKey.Q() << aKey.G() << aKey.Y();
    }


// ---------------------------------------------------------------------------
// ExternalizeL()
// DSA Private Key
// ---------------------------------------------------------------------------
//
void ExternalizeL(const CDSAPrivateKey& aKey, RWriteStream& aStream)
    {
    CDevCertKeyEncryptor* encryptor = CDevCertKeyEncryptor::NewLC();
    if( encryptor->IsPluginExistL() )
        {
        MKeyEncryptor* encrypt = encryptor->CreateImplementationL();  
        //aStream << aKey.P() << aKey.Q() << aKey.G() << aKey.X();
        EncryptAndStoreL(aKey.P(), aStream, encrypt );
        EncryptAndStoreL(aKey.Q(), aStream, encrypt );
        EncryptAndStoreL(aKey.G(), aStream, encrypt );
        EncryptAndStoreL(aKey.X(), aStream, encrypt );
        }
    else
        {
        aStream << aKey.P() << aKey.Q() << aKey.G() << aKey.X();  
        }
    CleanupStack::PopAndDestroy(encryptor);        
    }


// ---------------------------------------------------------------------------
// CreateL()
// RSA Public key
// ---------------------------------------------------------------------------
//
void CreateL(RReadStream& aStream, CRSAPublicKey*& aOut)
    {
    RInteger N, keyPublicExp;
    CreateLC(aStream, N);
    CreateLC(aStream, keyPublicExp);

    aOut = CRSAPublicKey::NewL(N, keyPublicExp);

    CleanupStack::Pop(2, &N); // keyPublicExp, N
    }


// ---------------------------------------------------------------------------
// CreateL()
// RSA Private key
// ---------------------------------------------------------------------------
//
void CreateL(RReadStream& aStream, CRSAPrivateKey*& aOut)
    {
    CDevCertKeyEncryptor* encryptor = CDevCertKeyEncryptor::NewLC();
    if( encryptor->IsPluginExistL() )
        {
        MKeyEncryptor* encrypt = encryptor->CreateImplementationL();

        RInteger privateN;
        DecryptAndCreateLC(aStream, privateN, encrypt);

        TRSAPrivateKeyType keyType = EStandard;
        keyType = (TRSAPrivateKeyType)aStream.ReadInt32L();

        if (EStandard==keyType)
            {
            RInteger D;
            DecryptAndCreateLC(aStream, D, encrypt);

            aOut = CRSAPrivateKeyStandard::NewL(privateN, D);

            CleanupStack::Pop(&D);
            }
        else if (EStandardCRT==keyType)
            {
            RInteger p, q, dP, dQ, qInv;
            DecryptAndCreateLC(aStream, p, encrypt);
            DecryptAndCreateLC(aStream, q, encrypt);
            DecryptAndCreateLC(aStream, dP, encrypt);
            DecryptAndCreateLC(aStream, dQ, encrypt);
            DecryptAndCreateLC(aStream, qInv, encrypt);

            aOut = CRSAPrivateKeyCRT::NewL(privateN, p, q, dP, dQ, qInv);

            CleanupStack::Pop(5, &p);
            }
        else
            {
            User::Leave(KErrNotSupported);
            }

        CleanupStack::Pop(&privateN);
        }
    else
        {
        RInteger privateN;
        CreateLC(aStream, privateN);

        TRSAPrivateKeyType keyType = EStandard;
        keyType = (TRSAPrivateKeyType)aStream.ReadInt32L();

        if (EStandard==keyType)
            {
            RInteger D;
            CreateLC(aStream, D);

            aOut = CRSAPrivateKeyStandard::NewL(privateN, D);

            CleanupStack::Pop(&D);
            }
        else if (EStandardCRT==keyType)
            {
            RInteger p, q, dP, dQ, qInv;
            CreateLC(aStream, p);
            CreateLC(aStream, q);
            CreateLC(aStream, dP);
            CreateLC(aStream, dQ);
            CreateLC(aStream, qInv);

            aOut = CRSAPrivateKeyCRT::NewL(privateN, p, q, dP, dQ, qInv);

            CleanupStack::Pop(5, &p);
            }
        else
            {
            User::Leave(KErrNotSupported);
            }

        CleanupStack::Pop(&privateN); 
        } 
    CleanupStack::PopAndDestroy(encryptor);       
    }


// ---------------------------------------------------------------------------
// CreateL()
// DSA Public key
// ---------------------------------------------------------------------------
//
void CreateL(RReadStream& aStream, CDSAPublicKey*& aOut)
    {
    RInteger P, Q, G, Y;
    CreateLC(aStream, P);
    CreateLC(aStream, Q);
    CreateLC(aStream, G);
    CreateLC(aStream, Y);

    aOut = CDSAPublicKey::NewL(P, Q, G, Y);

    CleanupStack::Pop(4, &P);
    }


// ---------------------------------------------------------------------------
// CreateL()
// DSA Private key
// ---------------------------------------------------------------------------
//
void CreateL(RReadStream& aStream, CDSAPrivateKey*& aOut)
    {
    CDevCertKeyEncryptor* encryptor = CDevCertKeyEncryptor::NewLC();
    if( encryptor->IsPluginExistL() )
        {
        MKeyEncryptor* encrypt = encryptor->CreateImplementationL();
        RInteger P, Q, G, X;
        DecryptAndCreateLC(aStream, P, encrypt);
        DecryptAndCreateLC(aStream, Q, encrypt);
        DecryptAndCreateLC(aStream, G, encrypt);
        DecryptAndCreateLC(aStream, X, encrypt);

        aOut = CDSAPrivateKey::NewL(P, Q, G, X);

        CleanupStack::Pop(4, &P);
        }
    else
        {
        RInteger P, Q, G, X;
        CreateLC(aStream, P);
        CreateLC(aStream, Q);
        CreateLC(aStream, G);
        CreateLC(aStream, X);

        aOut = CDSAPrivateKey::NewL(P, Q, G, X);

        CleanupStack::Pop(4, &P); 
        }
    CleanupStack::PopAndDestroy(encryptor);        
    }

//EOF