cryptoservices/certificateandkeymgmt/pkcs7/pkcs7contentinfo_v2.cpp
changeset 0 2c201484c85f
child 8 35751d3474b7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cryptoservices/certificateandkeymgmt/pkcs7/pkcs7contentinfo_v2.cpp	Wed Jul 08 11:25:26 2009 +0100
@@ -0,0 +1,148 @@
+/*
+* Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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 "pkcs7contentinfo_v2.h"
+#include "pkcs7asn1.h"
+
+EXPORT_C CPKCS7ContentInfo* CPKCS7ContentInfo::NewL(const TDesC8& aRawData)
+	{
+	CPKCS7ContentInfo* self = new (ELeave) CPKCS7ContentInfo();
+	CleanupStack::PushL(self);
+	self->ConstructL(aRawData);
+	CleanupStack::Pop(self);
+	return self;	
+	}
+
+CPKCS7ContentInfo::~CPKCS7ContentInfo()
+	{
+	}
+
+EXPORT_C CPKCS7ContentInfo::TContentInfoType CPKCS7ContentInfo::ContentType() const
+	{
+	return iContentType;
+	}
+
+EXPORT_C const TPtrC8 CPKCS7ContentInfo::ContentData() const
+	{
+	return iContentData;	
+	}
+
+CPKCS7ContentInfo::CPKCS7ContentInfo(void)
+	{
+	}
+
+void CPKCS7ContentInfo::ConstructL(const TDesC8& aRawData)
+	{  
+	const TInt minItems = 1;	// Must have OID
+	const TInt maxItems = 2;	// May have data
+
+	CArrayPtr<TASN1DecGeneric>* contentInfo = PKCS7ASN1::DecodeSequenceLC(aRawData, minItems, maxItems);
+
+    const TASN1DecGeneric* contentInfoAt0 = contentInfo->At(0);
+	// Checks its a oid id
+	if(contentInfoAt0->Tag()==EASN1ObjectIdentifier || contentInfoAt0->Class() == EUniversal)
+		{
+		// Gets the oid
+		TASN1DecObjectIdentifier oidDec;
+		HBufC* oidVal = oidDec.DecodeDERL(*contentInfo->At(0));
+		CleanupStack::PushL(oidVal);
+		// Data itself is optional so make sure its there
+		if(contentInfo->Count() == 2)
+			{
+			const TASN1DecGeneric* contentInfoAt1 = contentInfo->At(1);
+			if ( contentInfoAt1->Tag() == 0 || contentInfoAt1->Class() == EContextSpecific )
+				{
+				TASN1DecGeneric decGen(contentInfoAt1->GetContentDER());
+				decGen.InitL();
+	            if(*oidVal == KPkcs7DataOID)
+					{
+					// ContentData is OctetString if ContentType is Data
+					if(decGen.Tag() == EASN1OctetString)   
+						{
+						iContentData.Set(decGen.GetContentDER()); 
+						}
+					else
+						{
+						User::Leave(KErrArgument);
+						}
+					}
+				else
+					{
+					iContentData.Set(decGen.Encoding());
+					}
+				}
+			}
+		else
+			{
+			iContentData.Set(KNullDesC8());
+			}
+		// Checks if it is data OID.
+		if(*oidVal == KPkcs7DataOID)
+			{
+			// The Content Type is indicated by an Integer.
+			// Here if Content Type is equal to Data then,it is represented by 1
+			// 1 indicates the numeric value of last element in the PKCS7 Data OID.
+			iContentType = EContentTypeData;
+			}
+		else if(*oidVal == KPkcs7SignedDataOID)
+			{
+			// The Content Type is indicated by an Integer.
+			// Here if Content Type is equal to SignedData then,it is represented by 2
+			// 2 indicates the numeric value of last element in the PKCS7 SignedData OID.
+			iContentType = EContentTypeSignedData;
+			}
+		else if(*oidVal == KPkcs7EnvelopedDataOID) 
+			{
+			// The Content Type is indicated by an Integer.
+			// Here if Content Type is equal to EnvelopedData then,it is represented by 3.
+			// 3 indicates the numeric value of last element in the PKCS7 EnvelopedData OID.
+			iContentType = EContentTypeEnvelopedData;
+			}
+		else if(*oidVal == KPkcs7SignedAndEnvelopedDataOID)
+			{
+			// The Content Type is indicated by an Integer.
+			// Here if Content Type is equal to SignedAndEnvelopedData then,it is represented by 4.
+			// 4 indicates the numeric value of last element in the PKCS7 SignedAndEnvelopedData OID.
+			iContentType = EContentTypeSignedAndEnvelopedData;
+			}
+		else if(*oidVal == KPkcs7DigestedDataOID)
+			{
+			// The Content Type is indicated by an Integer.
+			// Here if Content Type is equal to DigestedData then,it is represented by 5.
+			// 5 indicates the numeric value of last element in the PKCS7 DigestedData OID.
+			iContentType = EContentTypeDigestedData;
+			}
+		else if(*oidVal == KPkcs7EncryptedDataOID)
+			{
+			// The Content Type is indicated by an Integer.
+			// Here if Content Type is equal to EncryptedData then,it is represented by 6
+			// 6 indicates the numeric value of last element in the PKCS7 EncryptedData OID.
+			iContentType = EContentTypeEncryptedData;
+			}
+		else
+			{
+			User::Leave(KErrNotSupported);
+			}
+		CleanupStack::PopAndDestroy(oidVal);
+		}
+	else
+		{
+		User::Leave(KErrArgument);
+		}
+	CleanupStack::PopAndDestroy(contentInfo);
+	}