cms/src/CCMSX509AttributeCertificateInfo.cpp
changeset 0 164170e6151a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cms/src/CCMSX509AttributeCertificateInfo.cpp	Tue Jan 26 15:20:08 2010 +0200
@@ -0,0 +1,676 @@
+/*
+* 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:  X.509 AttributeCertificateInfo type
+*
+*/
+
+
+// INCLUDE FILES
+#include    "CCMSX509AttributeCertificateInfo.h"
+#include "CCMSX509IssuerSerial.h"
+#include "CCMSX509GeneralNames.h"
+#include "CCMSX509AlgorithmIdentifier.h"
+#include "CCMSAttribute.h"
+#include <asn1dec.h>
+#include <asn1enc.h>
+
+// CONSTANTS
+const TInt KMinNumberOfSubModules = 6;
+const TInt KMaxNumberOfSubModules = 9;
+const TInt KValidityPeriodModuleCount = 2;
+const TInt KValidityNotBeforeIndex = 0;
+const TInt KValidityNotAfterIndex = 1;
+const TInt KDefaultGranularity = 1;
+const TInt KDefaultVersion = 0; // v1 == 0
+const TTagType KBaseCertificateIDTag = 0;
+const TTagType KSubjectNameTag = 1;
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// Destructor
+CCMSX509AttributeCertificateInfo::CAttributeCertificateData::
+~CAttributeCertificateData()
+    {
+	delete iBaseCertificateID;
+	delete iSubjectName;
+	delete iIssuer;
+	delete iSignature;
+
+ 	if( iAttributes )
+ 		{
+ 		iAttributes->ResetAndDestroy();
+		delete iAttributes;
+		}
+
+    delete iIssuerUniqueID;
+    }
+
+// -----------------------------------------------------------------------------
+// CCMSX509AttributeCertificateInfo::CCMSX509AttributeCertificateInfo
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CCMSX509AttributeCertificateInfo::CCMSX509AttributeCertificateInfo()
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CCMSX509AttributeCertificateInfo::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CCMSX509AttributeCertificateInfo::ConstructL(
+    const CCMSX509IssuerSerial& aBaseCertificateID,
+    const CCMSX509GeneralNames& aIssuer,
+    const CCMSX509AlgorithmIdentifier& aSignature,
+    const TInt aSerialNumber,
+    const TTime& aNotBeforeTime,
+    const TTime& aNotAfterTime,
+    const CArrayPtr< CCMSAttribute >& aAttributes )
+    {
+    iData = new( ELeave ) CAttributeCertificateData();
+    iData->iVersion = KDefaultVersion;
+    SetBaseCertificateIDL( aBaseCertificateID );
+    SetIssuerL( aIssuer );
+    SetSignatureL( aSignature );
+    SetSerialNumber( aSerialNumber );
+    SetNotBeforeTimeL( aNotBeforeTime );
+    SetNotAfterTimeL( aNotAfterTime );
+    SetAttributesL( aAttributes );
+    }
+
+// -----------------------------------------------------------------------------
+// CCMSX509AttributeCertificateInfo::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CCMSX509AttributeCertificateInfo::ConstructL(
+    const CCMSX509GeneralNames& aSubjectName,
+    const CCMSX509GeneralNames& aIssuer,
+    const CCMSX509AlgorithmIdentifier& aSignature,
+    const TInt aSerialNumber,
+    const TTime& aNotBeforeTime,
+    const TTime& aNotAfterTime,
+    const CArrayPtr< CCMSAttribute >& aAttributes )
+    {
+    iData = new( ELeave ) CAttributeCertificateData();
+    iData->iVersion = KDefaultVersion;
+    SetSubjectNameL( aSubjectName );
+    SetIssuerL( aIssuer );
+    SetSignatureL( aSignature );
+    SetSerialNumber( aSerialNumber );
+    SetNotBeforeTimeL( aNotBeforeTime );
+    SetNotAfterTimeL( aNotAfterTime );
+    SetAttributesL( aAttributes );
+    }
+
+// -----------------------------------------------------------------------------
+// CCMSX509AttributeCertificateInfo::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CCMSX509AttributeCertificateInfo::ConstructL( )
+    {
+    // creating empty/default values
+    CAttributeCertificateData* data = new( ELeave ) CAttributeCertificateData();
+    CleanupStack::PushL( data );
+    data->iVersion = KDefaultVersion;
+    data->iBaseCertificateID = CCMSX509IssuerSerial::NewL();
+    data->iIssuer = CCMSX509GeneralNames::NewL();
+    data->iSignature = CCMSX509AlgorithmIdentifier::NewL();
+    data->iNotBeforeTime.UniversalTime();
+    data->iNotAfterTime.UniversalTime();
+    data->iNotAfterTime+=TTimeIntervalYears( 1 );
+    data->iAttributes = new( ELeave ) CArrayPtrFlat< CCMSAttribute >( 1 );
+    CleanupStack::Pop( data );
+    iData = data;
+    }
+    
+
+// -----------------------------------------------------------------------------
+// CCMSX509AttributeCertificateInfo::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CCMSX509AttributeCertificateInfo*
+CCMSX509AttributeCertificateInfo::NewL()
+	{
+	// creating with empty values
+    CCMSX509AttributeCertificateInfo* self =
+        new( ELeave ) CCMSX509AttributeCertificateInfo();
+    CleanupStack::PushL( self );
+    self->ConstructL( );
+    CleanupStack::Pop( self );
+	return self;
+	}
+
+// -----------------------------------------------------------------------------
+// CCMSX509AttributeCertificateInfo::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CCMSX509AttributeCertificateInfo*
+CCMSX509AttributeCertificateInfo::NewL(
+    const CCMSX509IssuerSerial& aBaseCertificateID,
+    const CCMSX509GeneralNames& aIssuer,
+    const CCMSX509AlgorithmIdentifier& aSignature,
+    const TInt aSerialNumber,
+    const TTime& aNotBeforeTime,
+    const TTime& aNotAfterTime,
+    const CArrayPtr< CCMSAttribute >& aAttributes )
+    {
+    CCMSX509AttributeCertificateInfo* self =
+        new( ELeave ) CCMSX509AttributeCertificateInfo();
+    CleanupStack::PushL( self );
+    self->ConstructL( aBaseCertificateID, aIssuer, aSignature, aSerialNumber,
+                      aNotBeforeTime, aNotAfterTime,
+                      aAttributes );
+    CleanupStack::Pop();
+
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CCMSX509AttributeCertificateInfo::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CCMSX509AttributeCertificateInfo*
+CCMSX509AttributeCertificateInfo::NewL(
+    const CCMSX509GeneralNames& aSubjectName,
+    const CCMSX509GeneralNames& aIssuer,
+    const CCMSX509AlgorithmIdentifier& aSignature,
+    const TInt aSerialNumber,
+    const TTime& aNotBeforeTime,
+    const TTime& aNotAfterTime,
+    const CArrayPtr< CCMSAttribute >& aAttributes )
+    {
+    CCMSX509AttributeCertificateInfo* self =
+        new( ELeave ) CCMSX509AttributeCertificateInfo();
+    CleanupStack::PushL( self );
+    self->ConstructL( aSubjectName, aIssuer, aSignature, aSerialNumber,
+                      aNotBeforeTime, aNotAfterTime,
+                      aAttributes );
+    CleanupStack::Pop();
+
+    return self;
+    }
+
+// Destructor
+CCMSX509AttributeCertificateInfo::~CCMSX509AttributeCertificateInfo()
+    {
+	delete iData;
+    }
+
+// -----------------------------------------------------------------------------
+// CCMSX509AttributeCertificateInfo::DecodeL
+// Decrypts raw data to this instance
+// -----------------------------------------------------------------------------
+void CCMSX509AttributeCertificateInfo::DecodeL( const TDesC8& aRawData )
+	{
+    CAttributeCertificateData* data = new( ELeave ) CAttributeCertificateData();
+    CleanupStack::PushL( data );
+    
+    CArrayPtr< TASN1DecGeneric >* itemList = DecodeSequenceLC(
+        aRawData, KMinNumberOfSubModules, KMaxNumberOfSubModules );
+
+    TInt sequenceCounter = 0;
+    
+    // decode version
+    TASN1DecGeneric* version = itemList->At( sequenceCounter );
+    TASN1DecInteger intDecoder;
+    if( ( version->Tag() == EASN1Integer ) &&
+        ( version->Class() == EUniversal ) )
+        {
+        data->iVersion =
+            intDecoder.DecodeDERShortL( *version );
+        sequenceCounter++;
+        }
+    else
+        {
+        data->iVersion = KDefaultVersion;
+        }
+
+    // decode subject
+    TASN1DecGeneric* subject = itemList->At( sequenceCounter++ );
+    subject->InitL( );
+    TTagType subjectTag( subject->Tag() );
+    switch( subjectTag )
+        {
+        case KBaseCertificateIDTag:
+            {
+            data->iBaseCertificateID = CCMSX509IssuerSerial::NewL();
+            data->iBaseCertificateID->DecodeL( subject->GetContentDER() );
+            break;
+            }
+        case KSubjectNameTag:
+            {
+            data->iSubjectName = CCMSX509GeneralNames::NewL();
+            data->iSubjectName->DecodeL( subject->GetContentDER() );
+            break;
+            }
+        default:
+            {
+            User::Leave( KErrArgument );
+            }
+        }
+
+    // decode issuer
+    TASN1DecGeneric* issuer = itemList->At( sequenceCounter++ );
+    issuer->InitL();
+    data->iIssuer = CCMSX509GeneralNames::NewL();
+    data->iIssuer->DecodeL( issuer->Encoding() );
+
+    // decode signature
+    TASN1DecGeneric* signature = itemList->At( sequenceCounter++ );
+    signature->InitL();
+    data->iSignature = CCMSX509AlgorithmIdentifier::NewL();
+    data->iSignature->DecodeL( signature->Encoding() );
+
+    // decode serialNumber
+    data->iSerialNumber =
+        intDecoder.DecodeDERShortL( *( itemList->At( sequenceCounter++ ) ) );
+
+    // decode attCertValidityPeriod
+    TASN1DecGeneric* validityPeriodDecoder = itemList->At( sequenceCounter++ );
+    validityPeriodDecoder->InitL();
+    CArrayPtr< TASN1DecGeneric >* validityPeriod = DecodeSequenceLC(
+        validityPeriodDecoder->Encoding(), KValidityPeriodModuleCount,
+        KValidityPeriodModuleCount );
+    TASN1DecGeneralizedTime timeDecoder;
+    data->iNotBeforeTime = timeDecoder.DecodeDERL(
+        *( validityPeriod->At( KValidityNotBeforeIndex ) ) );
+    data->iNotAfterTime = timeDecoder.DecodeDERL(
+        *( validityPeriod->At( KValidityNotAfterIndex ) ) );
+    CleanupStack::PopAndDestroy( validityPeriod );
+
+    // decode attributes
+    TASN1DecGeneric* attributesDecoder = itemList->At( sequenceCounter++ );
+    attributesDecoder->InitL();
+    CArrayPtr< TASN1DecGeneric >* attributes = DecodeSequenceLC(
+        attributesDecoder->Encoding() );
+    TInt attributeCount = attributes->Count();
+    data->iAttributes = new( ELeave ) CArrayPtrFlat< CCMSAttribute >(
+        attributeCount ? attributeCount : KDefaultGranularity );
+    for( TInt i = 0; i < attributeCount; i++ )
+        {
+        TASN1DecGeneric* attributeDecoder = attributes->At( i );
+        attributeDecoder->InitL();
+        CCMSAttribute* attribute = CCMSAttribute::NewLC();
+        attribute->DecodeL( attributeDecoder->Encoding() );
+        data->iAttributes->AppendL( attribute );
+        CleanupStack::Pop( attribute );
+        }
+    CleanupStack::PopAndDestroy( attributes );
+    
+    // decode issuerUniqueID
+    if( itemList->Count() > sequenceCounter )
+        {
+        TASN1DecBitString bsDecoder;
+        data->iIssuerUniqueID = bsDecoder.ExtractOctetStringL(
+            *( itemList->At( sequenceCounter ) ) );
+        }
+
+    // all decoded, change state
+    CleanupStack::PopAndDestroy( itemList );
+    
+    delete iData;
+    iData = data;
+
+    CleanupStack::Pop( data );
+	}
+
+// -----------------------------------------------------------------------------
+// CCMSX509AttributeCertificateInfo::EncoderLC
+// Returns ASN1 encoder for this instance
+// -----------------------------------------------------------------------------
+
+CASN1EncBase* CCMSX509AttributeCertificateInfo::EncoderLC() const
+	{
+    CASN1EncSequence* root = CASN1EncSequence::NewLC();
+    
+    // encode version
+    CASN1EncInt* version = CASN1EncInt::NewLC( iData->iVersion );
+    root->AddAndPopChildL( version );
+    
+    // encode subject
+    CASN1EncBase* subject = NULL;
+    if( iData->iBaseCertificateID )
+        {
+        // encode baseCertificateID  [0]  IssuerSerial
+        CASN1EncBase* baseCertificateID =
+            iData->iBaseCertificateID->EncoderLC( );
+        CleanupStack::Pop( baseCertificateID );
+        subject = CASN1EncExplicitTag::NewLC(
+            baseCertificateID, KBaseCertificateIDTag );
+        }
+    else
+        {
+        // encode subjectName        [1]  GeneralNames
+        CASN1EncBase* subjectName = iData->iSubjectName->EncoderLC( );
+        CleanupStack::Pop( subjectName );
+        subject = CASN1EncExplicitTag::NewLC( subjectName, KSubjectNameTag );
+        }
+    root->AddAndPopChildL( subject );
+    
+    // encode issuer
+    CASN1EncBase* issuer = iData->iIssuer->EncoderLC();
+    root->AddAndPopChildL( issuer );
+    
+    // encode signature
+    CASN1EncBase* signature = iData->iSignature->EncoderLC();
+    root->AddAndPopChildL( signature );
+    
+    // encode serialNumber
+    CASN1EncInt* serialNumber = CASN1EncInt::NewLC( iData->iSerialNumber );
+    root->AddAndPopChildL( serialNumber );
+    
+    // encode attCertValidityPeriod
+    CASN1EncSequence* validityPeriod = CASN1EncSequence::NewLC( );
+    // encode notBeforeTime
+    CASN1EncGeneralizedTime* notBeforeTime =
+        CASN1EncGeneralizedTime::NewLC( iData->iNotBeforeTime );
+    validityPeriod->AddAndPopChildL( notBeforeTime );
+    //encode notAfterTime
+    CASN1EncGeneralizedTime* notAfterTime =
+        CASN1EncGeneralizedTime::NewLC( iData->iNotAfterTime );
+    validityPeriod->AddAndPopChildL( notAfterTime );
+    root->AddAndPopChildL( validityPeriod );
+    
+    // encode attributes             SEQUENCE OF Attribute
+    CASN1EncSequence* attributes = CASN1EncSequence::NewLC();
+    TInt attributeCount = iData->iAttributes->Count();
+    for( TInt i = 0; i < attributeCount; i++ )
+        {
+        CCMSAttribute* attribute = iData->iAttributes->At( i );
+        CASN1EncBase* attributeEncoder = attribute->EncoderLC( );
+        attributes->AddAndPopChildL( attributeEncoder );
+        }
+    root->AddAndPopChildL( attributes );
+    
+    // encode issuerUniqueID         UniqueIdentifier OPTIONAL
+    if( iData->iIssuerUniqueID )
+        {
+        CASN1EncBitString* uniqueID =
+            CASN1EncBitString::NewLC( *( iData->iIssuerUniqueID ) );
+        root->AddAndPopChildL( uniqueID );
+        }
+    
+    return root;
+	}
+
+// -----------------------------------------------------------------------------
+// CCMSX509AttributeCertificateInfo::Version()
+// Getter for Version
+// -----------------------------------------------------------------------------
+EXPORT_C TInt CCMSX509AttributeCertificateInfo::Version() const
+	{
+	return iData->iVersion;
+	}
+
+// -----------------------------------------------------------------------------
+// CCMSX509AttributeCertificateInfo::BaseCertificateID()
+// Getter for baseCertificateID
+// -----------------------------------------------------------------------------
+EXPORT_C const CCMSX509IssuerSerial*
+CCMSX509AttributeCertificateInfo::BaseCertificateID() const
+	{
+	return iData->iBaseCertificateID;
+	}
+
+// -----------------------------------------------------------------------------
+// CCMSX509AttributeCertificateInfo::SubjectName()
+// Getter for subjectName
+// -----------------------------------------------------------------------------
+EXPORT_C const CCMSX509GeneralNames*
+CCMSX509AttributeCertificateInfo::SubjectName() const
+	{
+	return iData->iSubjectName;
+	}
+
+// -----------------------------------------------------------------------------
+// CCMSX509AttributeCertificateInfo::Issuer()
+// Getter for Issuer
+// -----------------------------------------------------------------------------
+EXPORT_C const CCMSX509GeneralNames&
+CCMSX509AttributeCertificateInfo::Issuer() const
+	{
+	return *iData->iIssuer;
+	}
+
+// -----------------------------------------------------------------------------
+// CCMSX509AttributeCertificateInfo::Signature()
+// Getter for signature
+// -----------------------------------------------------------------------------
+EXPORT_C const CCMSX509AlgorithmIdentifier&
+CCMSX509AttributeCertificateInfo::Signature() const
+	{
+	return *iData->iSignature;
+	}
+
+// -----------------------------------------------------------------------------
+// CCMSX509AttributeCertificateInfo::SerialNumber()
+// Getter for serialNumber
+// -----------------------------------------------------------------------------
+EXPORT_C TInt
+CCMSX509AttributeCertificateInfo::SerialNumber() const
+	{
+	return iData->iSerialNumber;
+	}
+
+// -----------------------------------------------------------------------------
+// CCMSX509AttributeCertificateInfo::NotBeforeTime()
+// Getter for notBeforeTime
+// -----------------------------------------------------------------------------
+EXPORT_C const TTime& CCMSX509AttributeCertificateInfo::NotBeforeTime()	 const
+	{
+	return iData->iNotBeforeTime;
+	}
+
+// -----------------------------------------------------------------------------
+// CCMSX509AttributeCertificateInfo::NotAfterTime()
+// Getter for notAfterTime
+// -----------------------------------------------------------------------------
+EXPORT_C const TTime& CCMSX509AttributeCertificateInfo::NotAfterTime()	 const
+	{
+	return iData->iNotAfterTime;
+	}
+
+// -----------------------------------------------------------------------------
+// CCMSX509AttributeCertificateInfo::Attributes()
+// Getter for Attributes
+// -----------------------------------------------------------------------------
+EXPORT_C const CArrayPtr<CCMSAttribute>&
+CCMSX509AttributeCertificateInfo::Attributes() const
+	{
+	return *iData->iAttributes;
+	}
+
+// -----------------------------------------------------------------------------
+// CCMSX509AttributeCertificateInfo::IssuerUniqueID()
+// Getter for subjectName
+// -----------------------------------------------------------------------------
+EXPORT_C const TDesC8*
+CCMSX509AttributeCertificateInfo::IssuerUniqueID() const
+	{
+	return iData->iIssuerUniqueID;
+	}
+
+
+// -----------------------------------------------------------------------------
+// CCMSX509AttributeCertificateInfo::SetVersion()
+// Setter for version
+// -----------------------------------------------------------------------------
+EXPORT_C void CCMSX509AttributeCertificateInfo::SetVersion(
+    const TInt aVersion )
+	{
+	iData->iVersion = aVersion;
+	}
+
+// -----------------------------------------------------------------------------
+// CCMSX509AttributeCertificateInfo::SetBaseCertificateIDL()
+// Setter for baseCertificateID, deletes also subjectName
+// -----------------------------------------------------------------------------
+EXPORT_C void CCMSX509AttributeCertificateInfo::SetBaseCertificateIDL(
+    const CCMSX509IssuerSerial& aBaseCertificateID )
+	{
+    CCMSX509IssuerSerial* id = CCMSX509IssuerSerial::NewL(
+        aBaseCertificateID.Issuer(), aBaseCertificateID.Serial() );
+    CleanupStack::PushL( id );
+    const TDesC8* uid = aBaseCertificateID.IssuerUID();
+    if( uid )
+        {
+        id->SetIssuerUIDL( *uid );
+        }
+    CleanupStack::Pop( id );
+    delete iData->iBaseCertificateID;
+    iData->iBaseCertificateID = id;
+    delete iData->iSubjectName;
+    iData->iSubjectName = NULL;
+	}
+
+// -----------------------------------------------------------------------------
+// CCMSX509AttributeCertificateInfo::SetSubjectNameL()
+// Setter for subjectName, deletes also baseCertificateID
+// -----------------------------------------------------------------------------
+EXPORT_C void CCMSX509AttributeCertificateInfo::SetSubjectNameL(
+    const CCMSX509GeneralNames& aSubjectName )
+	{
+    CCMSX509GeneralNames* subjectName =
+        CCMSX509GeneralNames::NewL( aSubjectName );
+    delete iData->iSubjectName;
+    iData->iSubjectName = subjectName;
+    delete iData->iBaseCertificateID;
+    iData->iBaseCertificateID = NULL;
+	}
+
+// -----------------------------------------------------------------------------
+// CCMSX509AttributeCertificateInfo::SetIssuerL()
+// Setter for Issuer
+// -----------------------------------------------------------------------------
+EXPORT_C void CCMSX509AttributeCertificateInfo::SetIssuerL(
+    const CCMSX509GeneralNames& aIssuer )
+	{
+    CCMSX509GeneralNames* issuer = CCMSX509GeneralNames::NewL( aIssuer );
+    delete iData->iIssuer;
+    iData->iIssuer = issuer;
+	}
+
+// -----------------------------------------------------------------------------
+// CCMSX509AttributeCertificateInfo::SetSignatureL()
+// Setter for Signature
+// -----------------------------------------------------------------------------
+EXPORT_C void CCMSX509AttributeCertificateInfo::SetSignatureL(
+    const CCMSX509AlgorithmIdentifier& aSignature )
+	{
+    CCMSX509AlgorithmIdentifier* signature =
+        CCMSX509AlgorithmIdentifier::NewL( aSignature.AlgorithmIdentifier() );
+    CleanupStack::PushL( signature );
+    const CAlgorithmIdentifier* digestIdentifier =
+        aSignature.DigestAlgorithm();
+    if( digestIdentifier )
+        {
+        signature->SetDigestAlgorithmL( digestIdentifier );
+        }
+    CleanupStack::Pop( signature );
+    delete iData->iSignature;
+    iData->iSignature = signature;
+	}
+
+// -----------------------------------------------------------------------------
+// CCMSX509AttributeCertificateInfo::SetSerialNumber()
+// Setter for serialNumber
+// -----------------------------------------------------------------------------
+EXPORT_C void CCMSX509AttributeCertificateInfo::SetSerialNumber(
+    const TInt aSerialNumber )
+	{
+    iData->iSerialNumber = aSerialNumber;
+	}
+
+// -----------------------------------------------------------------------------
+// CCMSX509AttributeCertificateInfo::SetNotBeforeTimeL()
+// Setter for notBeforeTime
+// -----------------------------------------------------------------------------
+EXPORT_C void CCMSX509AttributeCertificateInfo::SetNotBeforeTimeL(
+	const TTime& aNotBeforeTime )
+	{
+    iData->iNotBeforeTime = aNotBeforeTime;
+	}
+
+// -----------------------------------------------------------------------------
+// CCMSX509AttributeCertificateInfo::SetNotAfterTimeL()
+// Setter for notAfterTime
+// -----------------------------------------------------------------------------
+EXPORT_C void CCMSX509AttributeCertificateInfo::SetNotAfterTimeL(
+	const TTime& aNotAfterTime )
+	{
+    iData->iNotAfterTime = aNotAfterTime;
+	}
+
+// -----------------------------------------------------------------------------
+// CCMSX509AttributeCertificateInfo::SetAttributesL()
+// Setter for attributes
+// -----------------------------------------------------------------------------
+EXPORT_C void CCMSX509AttributeCertificateInfo::SetAttributesL(
+	const CArrayPtr< CCMSAttribute >& aAttributes )
+	{
+    TInt attributeCount = aAttributes.Count();
+    CArrayPtr< CCMSAttribute >* attributes = NULL;
+    if( attributeCount > 0 )
+        {
+        attributes =
+            new( ELeave ) CArrayPtrFlat< CCMSAttribute >( attributeCount );
+        CleanupStack::PushL( attributes );
+        for( TInt i = 0; i < attributeCount; i++ )
+            {
+            const CCMSAttribute* origAttribute = aAttributes[ i ];
+            CCMSAttribute* attribute =
+                CCMSAttribute::NewLC( origAttribute->AttributeType(),
+                                      origAttribute->AttributeValues() );
+            attributes->AppendL( attribute );
+            }
+    
+        CleanupStack::Pop( attributeCount ); // all attributes
+        CleanupStack::Pop( attributes );
+        }
+    else
+        {
+        attributes =
+            new( ELeave ) CArrayPtrFlat< CCMSAttribute >( KDefaultGranularity );
+        }
+
+
+    if( iData->iAttributes )
+        {
+        iData->iAttributes->ResetAndDestroy();
+        delete iData->iAttributes;
+        }
+    iData->iAttributes = attributes;
+    
+	}
+
+// -----------------------------------------------------------------------------
+// CCMSX509AttributeCertificateInfo::SetIssuerUniqueIDL()
+// Setter for issuerUniqueID
+// -----------------------------------------------------------------------------
+EXPORT_C void CCMSX509AttributeCertificateInfo::SetIssuerUniqueIDL(
+	const TDesC8& aIssuerUniqueID )
+	{
+    HBufC8* uniqueId = aIssuerUniqueID.AllocL();
+    delete iData->iIssuerUniqueID;
+    iData->iIssuerUniqueID = uniqueId;
+	}
+
+//  End of File