diff -r 000000000000 -r 164170e6151a cms/src/CCMSCertificateChoices.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cms/src/CCMSCertificateChoices.cpp Tue Jan 26 15:20:08 2010 +0200 @@ -0,0 +1,326 @@ +/* +* 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 "CCMSCertificateChoices.h" +#include "CCMSX509Certificate.h" +#include "CCMSX509AttributeCertificate.h" +#include +#include + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CCMSCertificateChoices::CCMSCertificateChoices +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +EXPORT_C CCMSCertificateChoices::CCMSCertificateChoices() + { + } + +// ----------------------------------------------------------------------------- +// CCMSCertificateChoices::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +EXPORT_C void CCMSCertificateChoices::ConstructL( + const CCMSX509Certificate& aCertificate ) + { + SetCertificateL( aCertificate ); + } + +// ----------------------------------------------------------------------------- +// CCMSCertificateChoices::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +EXPORT_C void CCMSCertificateChoices::ConstructL( + const CCMSX509AttributeCertificate& aAttrCert ) + { + SetAttrCertL( aAttrCert ); + } + +// ----------------------------------------------------------------------------- +// CCMSCertificateChoices::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +EXPORT_C CCMSCertificateChoices* CCMSCertificateChoices::NewL() + { + // creating with empty/default values + CCMSX509Certificate* certificate = CCMSX509Certificate::NewL( ); + CleanupStack::PushL( certificate ); + CCMSCertificateChoices* self = NewL( *certificate ); + CleanupStack::PopAndDestroy( certificate ); + return self; + } + +// ----------------------------------------------------------------------------- +// CCMSCertificateChoices::NewLC +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +EXPORT_C CCMSCertificateChoices* CCMSCertificateChoices::NewLC() + { + // creating with empty/default values + CCMSX509Certificate* certificate = CCMSX509Certificate::NewL( ); + CleanupStack::PushL( certificate ); + CCMSCertificateChoices* self = NewL( *certificate ); + CleanupStack::PopAndDestroy( certificate ); + CleanupStack::PushL( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CCMSCertificateChoices::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +EXPORT_C CCMSCertificateChoices* CCMSCertificateChoices::NewL( + const CCMSX509Certificate& aCertificate ) + { + CCMSCertificateChoices* self = NewLC( aCertificate ); + CleanupStack::Pop( self ); + + return self; + } + +// ----------------------------------------------------------------------------- +// CCMSCertificateChoices::NewLC +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +EXPORT_C CCMSCertificateChoices* CCMSCertificateChoices::NewLC( + const CCMSX509Certificate& aCertificate ) + { + CCMSCertificateChoices* self = + new( ELeave ) CCMSCertificateChoices(); + + CleanupStack::PushL( self ); + self->ConstructL( aCertificate ); + + return self; + } + +// ----------------------------------------------------------------------------- +// CCMSCertificateChoices::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +EXPORT_C CCMSCertificateChoices* CCMSCertificateChoices::NewL( + const CCMSX509AttributeCertificate& aAttrCert ) + { + CCMSCertificateChoices* self = NewLC( aAttrCert ); + CleanupStack::Pop( self ); + + return self; + } + +// ----------------------------------------------------------------------------- +// CCMSCertificateChoices::NewLC +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +EXPORT_C CCMSCertificateChoices* CCMSCertificateChoices::NewLC( + const CCMSX509AttributeCertificate& aAttrCert ) + { + CCMSCertificateChoices* self = + new( ELeave ) CCMSCertificateChoices(); + + CleanupStack::PushL( self ); + self->ConstructL( aAttrCert ); + + return self; + } + +// Destructor +CCMSCertificateChoices::~CCMSCertificateChoices() + { + delete iCertificate; + delete iAttrCert; + } + +// ----------------------------------------------------------------------------- +// CCMSCertificateChoices::DecodeL +// Decrypts raw data to this instance +// ----------------------------------------------------------------------------- +void CCMSCertificateChoices::DecodeL( const TDesC8& aRawData ) + { + + TASN1DecGeneric decGen( aRawData ); + decGen.InitL(); + switch( decGen.Tag() ) + { + case EASN1Sequence: + { + // check class and decode certificate + if( decGen.Class() != EUniversal ) + { + User::Leave( KErrArgument ); + } + CCMSX509Certificate* certificate = CCMSX509Certificate::NewL(); + CleanupStack::PushL( certificate ); + certificate->DecodeL( aRawData ); + delete iAttrCert; + iAttrCert = NULL; + delete iCertificate; + iCertificate = certificate; + CleanupStack::Pop( certificate ); + break; + } + case KCMSAttrCertTag: + { + // check class and decode attrCert + if( decGen.Class() != EContextSpecific ) + { + User::Leave( KErrArgument ); + } + CCMSX509AttributeCertificate* attrCert = + CCMSX509AttributeCertificate::NewL(); + CleanupStack::PushL( attrCert ); + attrCert->DecodeImplicitTagL( aRawData, KCMSAttrCertTag ); + delete iCertificate; + iCertificate = NULL; + delete iAttrCert; + iAttrCert = attrCert; + CleanupStack::Pop( attrCert ); + break; + } + default: + { + User::Leave( KErrArgument ); + } + } + } + +// ----------------------------------------------------------------------------- +// CCMSCertificateChoices::EncodeL +// Encrypts this instance to descriptor +// ----------------------------------------------------------------------------- + +void CCMSCertificateChoices::EncodeL( HBufC8*& aResult ) const + { + CASN1EncBase* root = EncoderLC(); + + // encode the object in a DER encoding + HBufC8* der = HBufC8::NewMaxLC( root->LengthDER() ); + TPtr8 pder( der->Des() ); + TUint pos = 0; + root->WriteDERL( pder, pos ); + CleanupStack::Pop( der ); + aResult = der; + + CleanupStack::PopAndDestroy( root ); + } + +// ----------------------------------------------------------------------------- +// CCMSCertificateChoices::EncoderLC +// Returns ASN1 encoder for this instance +// ----------------------------------------------------------------------------- + +CASN1EncBase* CCMSCertificateChoices::EncoderLC() const + { + if( iCertificate ) + { + return iCertificate->EncoderLC(); + } + else + { + CASN1EncBase* encoder = iAttrCert->EncoderLC(); + encoder->SetTag( KCMSAttrCertTag ); + return encoder; + } + } + +// ----------------------------------------------------------------------------- +// CCMSCertificateChoices::Certificate +// certificate getter. +// ----------------------------------------------------------------------------- +EXPORT_C const CCMSX509Certificate* +CCMSCertificateChoices::Certificate() const + { + return iCertificate; + } + +// ----------------------------------------------------------------------------- +// CCMSCertificateChoices::AttrCert +// attrCert getter. +// ----------------------------------------------------------------------------- +EXPORT_C const CCMSX509AttributeCertificate* +CCMSCertificateChoices::AttrCert() const + { + return iAttrCert; + } + +// ----------------------------------------------------------------------------- +// CCMSCertificateChoices::SetCertificateL +// Certificate setter +// ----------------------------------------------------------------------------- +EXPORT_C void CCMSCertificateChoices::SetCertificateL( + const CCMSX509Certificate& aCertificate ) + { + CCMSX509Certificate* certificate = CCMSX509Certificate::NewL( + aCertificate.SerialNumber(), + aCertificate.Signature(), + aCertificate.Issuer(), + aCertificate.Validity(), + aCertificate.Subject(), + aCertificate.SubjectPublicKeyInfo(), + aCertificate.AlgorithmIdentifier(), + aCertificate.Encrypted() ); + CleanupStack::PushL( certificate ); + certificate->SetVersion( aCertificate.Version() ); + const TDesC8* issuerUniqueIdentifier = aCertificate.IssuerUniqueIdentifier(); + if( issuerUniqueIdentifier ) + { + certificate->SetIssuerUniqueIdentifierL( *issuerUniqueIdentifier ); + } + const TDesC8* subjectUniqueIdentifier = + aCertificate.SubjectUniqueIdentifier(); + if( subjectUniqueIdentifier ) + { + certificate->SetSubjectUniqueIdentifierL( *subjectUniqueIdentifier ); + } + delete iAttrCert; + iAttrCert = NULL; + delete iCertificate; + iCertificate = certificate; + CleanupStack::Pop( certificate ); + } + +// ----------------------------------------------------------------------------- +// CCMSCertificateChoices::SetAttrCertL +// AttrCert setter +// ----------------------------------------------------------------------------- +EXPORT_C void CCMSCertificateChoices::SetAttrCertL( + const CCMSX509AttributeCertificate& aAttrCert ) + { + CCMSX509AttributeCertificate* attrCert = CCMSX509AttributeCertificate::NewL( + aAttrCert.Info(), + aAttrCert.AlgorithmIdentifier(), + aAttrCert.Encrypted() ); + delete iCertificate; + iCertificate = NULL; + delete iAttrCert; + iAttrCert = attrCert; + } + +// End of File