cms/src/CCMSOriginatorIdentifierOrKey.cpp
changeset 0 164170e6151a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cms/src/CCMSOriginatorIdentifierOrKey.cpp	Tue Jan 26 15:20:08 2010 +0200
@@ -0,0 +1,422 @@
+/*
+* 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    "CCMSOriginatorIdentifierOrKey.h"
+#include "CCMSIssuerAndSerialNumber.h"
+#include "CCMSOriginatorPublicKey.h"
+#include <asn1dec.h>
+#include <asn1enc.h>
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CCMSOriginatorIdentifierOrKey::CCMSOriginatorIdentifierOrKey
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CCMSOriginatorIdentifierOrKey::CCMSOriginatorIdentifierOrKey()
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CCMSOriginatorIdentifierOrKey::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CCMSOriginatorIdentifierOrKey::ConstructL(
+    const CCMSIssuerAndSerialNumber& aIssuerAndSerialNumber )
+    {
+    SetIssuerAndSerialNumberL( aIssuerAndSerialNumber );
+    }
+
+// -----------------------------------------------------------------------------
+// CCMSOriginatorIdentifierOrKey::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CCMSOriginatorIdentifierOrKey::ConstructL(
+    const TDesC8& aSubjectKeyIdentifier )
+    {
+    SetSubjectKeyIdentifierL( aSubjectKeyIdentifier );
+    }
+
+// -----------------------------------------------------------------------------
+// CCMSOriginatorIdentifierOrKey::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CCMSOriginatorIdentifierOrKey::ConstructL(
+    const CCMSOriginatorPublicKey& aOriginatorKey )
+    {
+    SetOriginatorKeyL( aOriginatorKey );
+    }
+
+// -----------------------------------------------------------------------------
+// CCMSOriginatorIdentifierOrKey::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CCMSOriginatorIdentifierOrKey* CCMSOriginatorIdentifierOrKey::NewL()
+	{
+	// creating with empty/default values
+    CCMSIssuerAndSerialNumber* issuer = CCMSIssuerAndSerialNumber::NewL( );
+	CleanupStack::PushL( issuer );
+	CCMSOriginatorIdentifierOrKey* self = NewL( *issuer );
+	CleanupStack::PopAndDestroy( issuer );
+	return self;
+	}
+
+// -----------------------------------------------------------------------------
+// CCMSOriginatorIdentifierOrKey::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CCMSOriginatorIdentifierOrKey* CCMSOriginatorIdentifierOrKey::NewL(
+    const CCMSIssuerAndSerialNumber& aIssuerAndSerialNumber)
+    {
+    CCMSOriginatorIdentifierOrKey* self =
+    	new( ELeave ) CCMSOriginatorIdentifierOrKey();
+
+    CleanupStack::PushL( self );
+    self->ConstructL( aIssuerAndSerialNumber );
+    CleanupStack::Pop();
+
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CCMSOriginatorIdentifierOrKey::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CCMSOriginatorIdentifierOrKey* CCMSOriginatorIdentifierOrKey::NewL(
+    const TDesC8& aSubjectKeyIdentifier )
+    {
+    CCMSOriginatorIdentifierOrKey* self =
+    	new( ELeave ) CCMSOriginatorIdentifierOrKey();
+
+    CleanupStack::PushL( self );
+    self->ConstructL( aSubjectKeyIdentifier );
+    CleanupStack::Pop();
+
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CCMSOriginatorIdentifierOrKey::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CCMSOriginatorIdentifierOrKey* CCMSOriginatorIdentifierOrKey::NewL(
+    const CCMSOriginatorPublicKey& aOriginatorKey )
+    {
+    CCMSOriginatorIdentifierOrKey* self =
+    	new( ELeave ) CCMSOriginatorIdentifierOrKey();
+
+    CleanupStack::PushL( self );
+    self->ConstructL( aOriginatorKey );
+    CleanupStack::Pop();
+
+    return self;
+    }
+
+// Destructor
+CCMSOriginatorIdentifierOrKey::~CCMSOriginatorIdentifierOrKey()
+    {
+    delete iIssuerAndSerialNumber;
+    delete iSubjectKeyIdentifier;
+    delete iOriginatorKey;
+    }
+
+// -----------------------------------------------------------------------------
+// CCMSOriginatorIdentifierOrKey::DecodeL
+// Decrypts raw data to this instance
+// -----------------------------------------------------------------------------
+void CCMSOriginatorIdentifierOrKey::DecodeL( const TDesC8& aRawData )
+	{
+    TASN1DecGeneric decGen( aRawData );
+    decGen.InitL();
+    switch( decGen.Tag() )
+        {
+        case EASN1Sequence:
+            {
+            // check class and decode iasn
+            if( decGen.Class() != EUniversal )
+                {
+                User::Leave( KErrArgument );
+                }
+            CCMSIssuerAndSerialNumber* issuerAndSerialNumber =
+                CCMSIssuerAndSerialNumber::NewL();
+            CleanupStack::PushL( issuerAndSerialNumber );
+            issuerAndSerialNumber->DecodeL( aRawData );
+            DeleteOldValueAndChangeTypeL( EIssuerAndSerialNumber );
+            iIssuerAndSerialNumber = issuerAndSerialNumber;
+            CleanupStack::Pop( issuerAndSerialNumber );
+            break;
+            }
+        case ESubjectKeyIdentifier:
+            {
+            // check class and decode ski
+            if( decGen.Class() != EContextSpecific )
+                {
+                User::Leave( KErrArgument );
+                }
+            TASN1DecOctetString octetDecoder;
+            TInt pos = 0;
+            HBufC8* subjectKeyIdentifier =
+                octetDecoder.DecodeDERL( aRawData, pos );
+            CleanupStack::PushL( subjectKeyIdentifier );
+            DeleteOldValueAndChangeTypeL( ESubjectKeyIdentifier );
+            iSubjectKeyIdentifier = subjectKeyIdentifier;
+            CleanupStack::Pop( subjectKeyIdentifier );
+            break;
+            }
+        case EOriginatorKey:
+            {
+            // check class and decode originatorKey
+            if( decGen.Class() != EContextSpecific )
+                {
+                User::Leave( KErrArgument );
+                }
+            CCMSOriginatorPublicKey* originatorKey =
+                CCMSOriginatorPublicKey::NewL();
+            CleanupStack::PushL( originatorKey );
+            originatorKey->DecodeL( aRawData );
+            DeleteOldValueAndChangeTypeL( EOriginatorKey );
+            iOriginatorKey = originatorKey;
+            CleanupStack::Pop( originatorKey );
+            break;
+            }
+        default:
+            {
+            User::Leave( KErrArgument );
+            }
+        }
+	}
+
+// -----------------------------------------------------------------------------
+// CCMSOriginatorIdentifierOrKey::EncodeL
+// Encrypts this instance to descriptor
+// -----------------------------------------------------------------------------
+
+void CCMSOriginatorIdentifierOrKey::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 );
+	}
+
+// -----------------------------------------------------------------------------
+// CCMSOriginatorIdentifierOrKey::EncoderLC
+// Returns ASN1 encoder for this instance
+// -----------------------------------------------------------------------------
+
+CASN1EncBase* CCMSOriginatorIdentifierOrKey::EncoderLC() const
+	{
+    switch( iType )
+        {
+        case EIssuerAndSerialNumber:
+            {
+            return iIssuerAndSerialNumber->EncoderLC();
+            }
+        case ESubjectKeyIdentifier:
+            {
+            return EncoderSubjectKeyIdentifierLC();
+            }
+        case EOriginatorKey:
+            {
+            return EncoderOriginatorKeyLC();
+            }
+        default:
+            {
+            User::Leave( KErrCorrupt );
+			return NULL;
+            }
+        }
+	}
+
+// -----------------------------------------------------------------------------
+// CCMSOriginatorIdentifierOrKey::Type
+// Type getter.
+// -----------------------------------------------------------------------------
+EXPORT_C CCMSOriginatorIdentifierOrKey::TType
+CCMSOriginatorIdentifierOrKey::Type() const
+	{
+	return iType;
+	}
+
+// -----------------------------------------------------------------------------
+// CCMSOriginatorIdentifierOrKey::IssuerAndSerialNumberL
+// IssuerAndSerialNumber getter.
+// -----------------------------------------------------------------------------
+EXPORT_C const CCMSIssuerAndSerialNumber&
+CCMSOriginatorIdentifierOrKey::IssuerAndSerialNumberL() const
+	{
+    if( !iIssuerAndSerialNumber )
+        {
+        User::Leave( KErrNotFound );
+        }
+	return *iIssuerAndSerialNumber;
+	}
+
+// -----------------------------------------------------------------------------
+// CCMSOriginatorIdentifierOrKey::SubjectKeyIdentifierL
+// SubjectKeyIdentifier getter.
+// -----------------------------------------------------------------------------
+EXPORT_C const TDesC8&
+CCMSOriginatorIdentifierOrKey::SubjectKeyIdentifierL() const
+	{
+    if( !iSubjectKeyIdentifier )
+        {
+        User::Leave( KErrNotFound );
+        }
+	return *iSubjectKeyIdentifier;
+	}
+
+// -----------------------------------------------------------------------------
+// CCMSOriginatorIdentifierOrKey::SubjectKeyIdentifierL
+// SubjectKeyIdentifier getter.
+// -----------------------------------------------------------------------------
+EXPORT_C const CCMSOriginatorPublicKey&
+CCMSOriginatorIdentifierOrKey::OriginatorKeyL() const
+	{
+    if( !iOriginatorKey )
+        {
+        User::Leave( KErrNotFound );
+        }
+	return *iOriginatorKey;
+	}
+
+
+
+// -----------------------------------------------------------------------------
+// CCMSOriginatorIdentifierOrKey::SetIssuerAndSerialNumberL
+// IssuerAndSerialNumber setter
+// -----------------------------------------------------------------------------
+EXPORT_C void CCMSOriginatorIdentifierOrKey::SetIssuerAndSerialNumberL(
+	const CCMSIssuerAndSerialNumber& aIssuerAndSerialNumber )
+	{
+    CCMSIssuerAndSerialNumber* issuerAndSerialNumber =
+        CCMSIssuerAndSerialNumber::NewL(
+            aIssuerAndSerialNumber.IssuerName(),
+            aIssuerAndSerialNumber.SerialNumber() );
+    CleanupStack::PushL( issuerAndSerialNumber );
+    DeleteOldValueAndChangeTypeL( EIssuerAndSerialNumber );
+    iIssuerAndSerialNumber = issuerAndSerialNumber;
+    CleanupStack::Pop( issuerAndSerialNumber );
+	}
+
+// -----------------------------------------------------------------------------
+// CCMSOriginatorIdentifierOrKey::SetSubjectKeyIdentifierL
+// SubjectKeyIdentifier setter
+// -----------------------------------------------------------------------------
+EXPORT_C void CCMSOriginatorIdentifierOrKey::SetSubjectKeyIdentifierL(
+	const TDesC8& aSubjectKeyIdentifier )
+	{
+    HBufC8* subjectKeyIdentifier = aSubjectKeyIdentifier.AllocLC();
+    DeleteOldValueAndChangeTypeL( ESubjectKeyIdentifier );
+    iSubjectKeyIdentifier = subjectKeyIdentifier;
+    CleanupStack::Pop( subjectKeyIdentifier );
+	}
+
+// -----------------------------------------------------------------------------
+// CCMSOriginatorIdentifierOrKey::SetOriginatorKeyL
+// OriginatorKey setter
+// -----------------------------------------------------------------------------
+EXPORT_C void CCMSOriginatorIdentifierOrKey::SetOriginatorKeyL(
+	const CCMSOriginatorPublicKey& aOriginatorKey )
+	{
+    CCMSOriginatorPublicKey* originatorKey =
+        CCMSOriginatorPublicKey::NewLC( aOriginatorKey );
+    DeleteOldValueAndChangeTypeL( EOriginatorKey );
+    iOriginatorKey = originatorKey;
+    CleanupStack::Pop( originatorKey );
+	}
+
+// -----------------------------------------------------------------------------
+// CCMSOriginatorIdentifierOrKey::DeleteOldValueAndChangeType
+// Deletes old value and changes type
+// -----------------------------------------------------------------------------
+void CCMSOriginatorIdentifierOrKey::DeleteOldValueAndChangeTypeL(
+	CCMSOriginatorIdentifierOrKey::TType aNewType )
+	{
+    switch( iType )
+        {
+        case EIssuerAndSerialNumber:
+            {
+            delete iIssuerAndSerialNumber;
+            iIssuerAndSerialNumber = NULL;
+            break;
+            }
+        case ESubjectKeyIdentifier:
+            {
+            delete iSubjectKeyIdentifier;
+            iSubjectKeyIdentifier = NULL;
+            break;
+            }
+        case EOriginatorKey:
+            {
+            delete iOriginatorKey;
+            iOriginatorKey = NULL;
+            break;
+            }
+        default:
+            {
+            User::Leave( KErrCorrupt );
+            }
+        }
+    iType = aNewType;
+	}
+
+// -----------------------------------------------------------------------------
+// CCMSOriginatorIdentifierOrKey::EncoderSubjectKeyIdentifierLC
+// returns encoder for the subjectKeyIdentifier
+// -----------------------------------------------------------------------------
+CASN1EncBase*
+CCMSOriginatorIdentifierOrKey::EncoderSubjectKeyIdentifierLC() const
+	{
+    CASN1EncOctetString* subjectKeyIdentifier =
+        CASN1EncOctetString::NewLC( *iSubjectKeyIdentifier );
+    subjectKeyIdentifier->SetTag( ESubjectKeyIdentifier );
+
+	return subjectKeyIdentifier;
+	}
+
+// -----------------------------------------------------------------------------
+// CCMSOriginatorIdentifierOrKey::EncoderOriginatorKeyL
+// Returns encoder for the OriginatorKey value
+// -----------------------------------------------------------------------------
+CASN1EncBase* CCMSOriginatorIdentifierOrKey::EncoderOriginatorKeyLC() const
+	{
+    CASN1EncBase* originatorKey = iOriginatorKey->EncoderLC();
+    originatorKey->SetTag( EOriginatorKey );
+
+    return originatorKey;
+	}
+
+//  End of File