--- /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 <asn1dec.h>
+#include <asn1enc.h>
+
+
+// ============================ 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