diff -r 000000000000 -r 164170e6151a cms/src/CCMSX509Signed.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cms/src/CCMSX509Signed.cpp Tue Jan 26 15:20:08 2010 +0200 @@ -0,0 +1,199 @@ +/* +* Copyright (c) 2004 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: +* +*/ + + +// INCLUDE FILES +#include "CCMSX509Signed.h" +#include "CCMSX509AlgorithmIdentifier.h" +// CONSTANTS +const TInt KNumberOfSubModules = 3; + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CCMSX509Signed::CCMSX509Signed +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CCMSX509Signed::CCMSX509Signed( ) + { + } + +// ----------------------------------------------------------------------------- +// CCMSX509Signed::BaseConstructL +// Constructs the member variables. Makes copies. +// ----------------------------------------------------------------------------- +// +void CCMSX509Signed::BaseConstructL( + const CCMSX509AlgorithmIdentifier& aAlgorithmIdentifier, + const TDesC8& aEncrypted ) + { + SetAlgorithmIdentifierL( aAlgorithmIdentifier ); + SetEncryptedL( aEncrypted ); + } + +// ----------------------------------------------------------------------------- +// CCMSX509Signed::SignAndPopLC +// Creates a signed encoder. +// ----------------------------------------------------------------------------- +// +CASN1EncSequence* CCMSX509Signed::SignAndPopLC( + CASN1EncBase* aToBeSigned ) const + { + CASN1EncSequence* root = CASN1EncSequence::NewLC(); + + // encode toBeSigned + root->AddChildL( aToBeSigned ); + + CleanupStack::Pop( 2 ); // root, aToBeSigned + CleanupStack::PushL( root ); + + // encode algorithmIdentifier AlgorithmIdentifier + CASN1EncBase* algId = iAlgorithmIdentifier->EncoderLC( ); + root->AddAndPopChildL( algId ); + + // encode encrypted ENCRYPTED-HASH{ToBeSigned} + CASN1EncBitString* encrypted = CASN1EncBitString::NewLC( *iEncrypted ); + root->AddAndPopChildL( encrypted ); + + return root; + } + +// ----------------------------------------------------------------------------- +// CCMSX509Signed::DecodeSignatureL +// Decodes algorithmIdentifier and encrypted parts from the raw data. +// ----------------------------------------------------------------------------- +// +TASN1DecGeneric CCMSX509Signed::DecodeSignatureL( + const TDesC8& aRawData, + CCMSX509AlgorithmIdentifier*& aAlgorithmIdentifier, + HBufC8*& aEncrypted ) const + { + CArrayPtr< TASN1DecGeneric >* itemList = DecodeSequenceLC( + aRawData, KNumberOfSubModules, KNumberOfSubModules ); + + TASN1DecGeneric retVal = + DecodeSignatureArrayL( *itemList, aAlgorithmIdentifier, aEncrypted ); + + CleanupStack::PopAndDestroy( itemList ); + + return retVal; + } + +// ----------------------------------------------------------------------------- +// CCMSX509Signed::DecodeSignatureArrayL +// Decodes algorithmIdentifier and encrypted parts from the array. +// ----------------------------------------------------------------------------- +// +TASN1DecGeneric CCMSX509Signed::DecodeSignatureArrayL( + CArrayPtr< TASN1DecGeneric >& aItemArray, + CCMSX509AlgorithmIdentifier*& aAlgorithmIdentifier, + HBufC8*& aEncrypted ) const + { + TInt sequenceCounter = 0; + + // ToBeSigned will be returned + TASN1DecGeneric retVal( *aItemArray.At( sequenceCounter++ ) ); + + // decode algorithmIdentifier + CCMSX509AlgorithmIdentifier* algId = CCMSX509AlgorithmIdentifier::NewL( ); + CleanupStack::PushL( algId ); + algId->DecodeL( aItemArray.At( sequenceCounter++ )->Encoding() ); + + // decode encrypted + TASN1DecBitString bsDecoder; + HBufC8* encrypted = + bsDecoder.ExtractOctetStringL( *( aItemArray.At( sequenceCounter ) ) ); + + // change parameter pointers + aAlgorithmIdentifier = algId; + aEncrypted = encrypted; + CleanupStack::Pop( algId ); + + return retVal; + } + +// ----------------------------------------------------------------------------- +// CCMSX509Signed::~CCMSX509Signed +// Destructor +// ----------------------------------------------------------------------------- +// +CCMSX509Signed::~CCMSX509Signed() + { + delete iAlgorithmIdentifier; + delete iEncrypted; + } + +// ----------------------------------------------------------------------------- +// CCMSX509Signed::AlgorithmIdentifier +// algorithmIdentifier getter +// ----------------------------------------------------------------------------- +// +EXPORT_C const CCMSX509AlgorithmIdentifier& +CCMSX509Signed::AlgorithmIdentifier() const + { + return *iAlgorithmIdentifier; + } + +// ----------------------------------------------------------------------------- +// CCMSX509Signed::Encrypted +// encrypted getter +// ----------------------------------------------------------------------------- +// +EXPORT_C const TDesC8& CCMSX509Signed::Encrypted() const + { + return *iEncrypted; + } + +// ----------------------------------------------------------------------------- +// CCMSX509Signed::SetAlgorithmIdentifierL +// AlgorithmIdentifier setter +// ----------------------------------------------------------------------------- +// +EXPORT_C void CCMSX509Signed::SetAlgorithmIdentifierL( + const CCMSX509AlgorithmIdentifier& aAlgorithmIdentifier ) + { + CCMSX509AlgorithmIdentifier* algorithmIdentifier = + CCMSX509AlgorithmIdentifier::NewL( + aAlgorithmIdentifier.AlgorithmIdentifier() ); + CleanupStack::PushL( algorithmIdentifier ); + const CAlgorithmIdentifier* digestAlgorithm = + aAlgorithmIdentifier.DigestAlgorithm(); + if( digestAlgorithm ) + { + algorithmIdentifier->SetDigestAlgorithmL( digestAlgorithm ); + } + CleanupStack::Pop( algorithmIdentifier ); + delete iAlgorithmIdentifier; + iAlgorithmIdentifier = algorithmIdentifier; + } + +// ----------------------------------------------------------------------------- +// CCMSX509Signed::SetEncryptedL +// encrypted setter +// ----------------------------------------------------------------------------- +// +EXPORT_C void CCMSX509Signed::SetEncryptedL( + const TDesC8& aEncrypted ) + { + HBufC8* encrypted = aEncrypted.AllocL(); + delete iEncrypted; + iEncrypted = encrypted; + } + +// End of File