cryptoservices/certificateandkeymgmt/pkcs7/pkcs7encrypteddataobject.cpp
changeset 8 35751d3474b7
parent 0 2c201484c85f
--- a/cryptoservices/certificateandkeymgmt/pkcs7/pkcs7encrypteddataobject.cpp	Tue Jul 21 01:04:32 2009 +0100
+++ b/cryptoservices/certificateandkeymgmt/pkcs7/pkcs7encrypteddataobject.cpp	Thu Sep 10 14:01:51 2009 +0300
@@ -1,222 +1,223 @@
-/*
-* Copyright (c) 2005-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 "pkcs7encrypteddataobject.h"
-
-/** The last character in the PKCS7 EncryptedData OID */
-const TInt KPkcs7EncryptedData = 6;
-
-EXPORT_C CPKCS7EncryptedDataObject* CPKCS7EncryptedDataObject::NewL(const CPKCS7ContentInfo& aContentInfo)
-	{
-	CPKCS7EncryptedDataObject* self = new (ELeave) CPKCS7EncryptedDataObject();
-	CleanupStack::PushL(self);
-	self->ConstructL(aContentInfo);
-	CleanupStack::Pop(self);
-	return self;	
-	}
-
-CPKCS7EncryptedDataObject::CPKCS7EncryptedDataObject(void)
-	{
-	}
-
-CPKCS7EncryptedDataObject::~CPKCS7EncryptedDataObject()
-	{
-	delete iEncryptParams;
-	}
-
-EXPORT_C TInt CPKCS7EncryptedDataObject::Version() const
-	{
-	return iVersion;
-	}
-	
-EXPORT_C CPKCS7EncryptedDataObject::TContentType CPKCS7EncryptedDataObject::ContentType() const
-	{
-	return iContentType;
-	}
-	
-EXPORT_C const TDesC8& CPKCS7EncryptedDataObject::EncryptedContentInfoData() const
-	{
-	return iEncryptedContent;
-	}	
-
-EXPORT_C const CPBEncryptParms& CPKCS7EncryptedDataObject::EncryptParams() const
-	{
-	return *iEncryptParams;
-	}
-
-CPBEncryptParms* CPKCS7EncryptedDataObject::DecodeContentEncryptionAlgorithmL(const TDesC8& aBinaryData) const
-	{
-	TASN1DecGeneric seqGen(aBinaryData);
-	seqGen.InitL();
-	if (seqGen.Tag() != EASN1Sequence || seqGen.Class() != EUniversal)
-		{
-		User::Leave(KErrArgument);
-		}
-	
-    TPtrC8 theContent(seqGen.Encoding());
-    CPBEncryptParms* encryptParams =  TASN1DecPKCS5::DecodeDERL(theContent);
-    return encryptParams;
-	}	
-
-EXPORT_C HBufC8* CPKCS7EncryptedDataObject::DecryptDataL(const TDesC& aPassword) const
-	{
-	CPBEncryptElement* encryptElement;
-    HBufC8* pkcs12Pwd = PKCS12KDF::GeneratePasswordLC(aPassword);
-    if(iEncryptParams->Kdf() == CPBEncryptParms::EKdfPkcs12)
-		{
-	 	TPtrC8 iv = iEncryptParams->IV();
-	    HBufC8* ivValue = HBufC8::NewMaxLC(iv.Length());
-	    TPtr8 encryptKeyBuf = ivValue->Des();
-
-	 	switch(iEncryptParams->Cipher())	
-			{
-	 		case ECipherARC4_128:
-	 		case ECipherARC4_40:
-	 			{
-	 	    	//derive only key it is unnecessary to derive an IV for RC4
-	 	    	break;
-	 			}
-			case ECipher3DES_CBC:
-			case ECipher2Key3DES_CBC:
-			case ECipherRC2_CBC_128_16:	 
-			case ECipherRC2_CBC_40_5:	
-				{
-				PKCS12KDF::DeriveKeyL(encryptKeyBuf, PKCS12KDF::EIDByteIV, *pkcs12Pwd, iEncryptParams->Salt(), iEncryptParams->Iterations());
-				iEncryptParams->SetIV(encryptKeyBuf);
-		    	break;
-				}
-			default:
-				{
-		    	User::Leave(KErrNotSupported);
-		    	break;
-				}
-	 		}
-	 	CleanupStack::PopAndDestroy(ivValue);
-		// Create the decryptor	
-		encryptElement = CPBEncryptElement::NewLC(*pkcs12Pwd, *iEncryptParams);
-		}
-	else
-		{
-		TPBPassword password(aPassword);
-		// Create the decryptor	
-		encryptElement = CPBEncryptElement::NewLC(password.Password(), *iEncryptParams);	
-		}
-	 
-	CPBDecryptor* decryptor = encryptElement->NewDecryptLC();
-   	
-	TPtrC8 encryptedKey(iEncryptedContent);
-	TUint encryptLength = encryptedKey.Length();
-	TUint maxDecryptLength = decryptor->MaxOutputLength(encryptLength);
-	
-	if ( maxDecryptLength <= 0 )
-		{
-		User::Leave(KErrGeneral);		
-		}
-	
-	HBufC8* decryptedContent = HBufC8::NewLC(maxDecryptLength);
-	TPtr8 dcDes(decryptedContent->Des());
-	decryptor->Process(encryptedKey, dcDes);
-	CleanupStack::Pop(decryptedContent);
-	CleanupStack::PopAndDestroy(3, pkcs12Pwd); // pkcs12Pwd, encryptElement, decryptor
-   	return decryptedContent;
-   	}
-
- void CPKCS7EncryptedDataObject::ConstructL(const CPKCS7ContentInfo& aContentInfo)
-	{
-	if(aContentInfo.ContentType() != KPkcs7EncryptedData)
-		{
-		User::Leave(KErrArgument);
-		}
-    
-	// EncryptedData SEQUENCE
-	TASN1DecGeneric decGen(aContentInfo.ContentData());
-	decGen.InitL();
-	if(decGen.Tag() != EASN1Sequence || decGen.Class() != EUniversal)
-		{
-	    User::Leave(KErrArgument);
-		}
-    TASN1DecSequence seq1;
-    CArrayPtrFlat<TASN1DecGeneric>* EncryptedDataContents = seq1.DecodeDERLC(decGen);       					
-			    
-	// Both version and encryptedContentInfo should be present
-	if (EncryptedDataContents->Count() != 2)
-		{
-		User::Leave(KErrArgument);
-		}
-		            
-	// VERSION
-	// version is the syntax version number. It shall be 0 for this version of the standard
-	const TASN1DecGeneric* EncryptedDataContentsAt0 = EncryptedDataContents->At(0);
-	if(EncryptedDataContentsAt0->Tag() != EASN1Integer || EncryptedDataContentsAt0->Class() != EUniversal)
-		{
-		User::Leave(KErrArgument);
-		}
-	 
-	TASN1DecInteger intDecoder;
-	iVersion = intDecoder.DecodeDERShortL(*EncryptedDataContentsAt0);
-	if (iVersion != 0)
-		{
-	    User::Leave(KErrArgument);		
-	    }
-		                
-    // ENCRYPTED CONTENT INFO a SEQUENCE
-    const TASN1DecGeneric* EncryptedDataContentsAt1 = EncryptedDataContents->At(1);
-	if (EncryptedDataContentsAt1->Tag() != EASN1Sequence || EncryptedDataContentsAt1->Class() != EUniversal)
-		{
-	    User::Leave(KErrArgument);
-	    }		               
-	TASN1DecSequence seq2;
-    CArrayPtrFlat<TASN1DecGeneric>* EncryptedContentInfo = seq2.DecodeDERLC(*EncryptedDataContentsAt1);       
-		        
-    // CONTENT TYPE IDENTIFIED BY AN OBJECT IDENTIFIER
-	// Gets the oid
-	TASN1DecObjectIdentifier ContentTypeoidDec;
-	HBufC* contentType = ContentTypeoidDec.DecodeDERL(*EncryptedContentInfo->At(0));
-	if(contentType->Compare(KPkcs7DataOID()) == 0)
-		{
-		iContentType = EPkcs7Data;
-		}
-	else
-		{
-		User::Leave(KErrNotSupported);
-		}
-	delete contentType;	        
-	// CONTENT ENCRYPTION ALGORITHM
-	// Get the Cipher used and the encoded params in it
-    iEncryptParams = DecodeContentEncryptionAlgorithmL(EncryptedContentInfo->At(1)->Encoding());
-                
-    // ENCRYPTED CONTENT
-	// This is an OPTIONAL field
-	TInt encryptedContentInfoCount = EncryptedContentInfo->Count();
-	if(encryptedContentInfoCount == 3)
-		{
-		TASN1DecGeneric decOctetString(*EncryptedContentInfo->At(2));
-		decOctetString.InitL();
-	    iEncryptedContent.Set(decOctetString.GetContentDER());
-	   	}
-	else if(encryptedContentInfoCount > 3 || encryptedContentInfoCount < 2)
-	    {
-	    User::Leave(KErrArgument);
-	    }
-	else if(encryptedContentInfoCount == 2)
-		{
-		iEncryptedContent.Set(KNullDesC8());
-		}
-
-	CleanupStack::PopAndDestroy(2, EncryptedDataContents); //EncryptedDataContents, EncryptedContentInfo    	
-	}
+/*
+* Copyright (c) 2005-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 "pkcs7encrypteddataobject.h"
+
+/** The last character in the PKCS7 EncryptedData OID */
+const TInt KPkcs7EncryptedData = 6;
+
+EXPORT_C CPKCS7EncryptedDataObject* CPKCS7EncryptedDataObject::NewL(const CPKCS7ContentInfo& aContentInfo)
+	{
+	CPKCS7EncryptedDataObject* self = new (ELeave) CPKCS7EncryptedDataObject();
+	CleanupStack::PushL(self);
+	self->ConstructL(aContentInfo);
+	CleanupStack::Pop(self);
+	return self;	
+	}
+
+CPKCS7EncryptedDataObject::CPKCS7EncryptedDataObject(void)
+	{
+	}
+
+CPKCS7EncryptedDataObject::~CPKCS7EncryptedDataObject()
+	{
+	delete iEncryptParams;
+	}
+
+EXPORT_C TInt CPKCS7EncryptedDataObject::Version() const
+	{
+	return iVersion;
+	}
+	
+EXPORT_C CPKCS7EncryptedDataObject::TContentType CPKCS7EncryptedDataObject::ContentType() const
+	{
+	return iContentType;
+	}
+	
+EXPORT_C const TDesC8& CPKCS7EncryptedDataObject::EncryptedContentInfoData() const
+	{
+	return iEncryptedContent;
+	}	
+
+EXPORT_C const CPBEncryptParms& CPKCS7EncryptedDataObject::EncryptParams() const
+	{
+	return *iEncryptParams;
+	}
+
+CPBEncryptParms* CPKCS7EncryptedDataObject::DecodeContentEncryptionAlgorithmL(const TDesC8& aBinaryData) const
+	{
+	TASN1DecGeneric seqGen(aBinaryData);
+	seqGen.InitL();
+	if (seqGen.Tag() != EASN1Sequence || seqGen.Class() != EUniversal)
+		{
+		User::Leave(KErrArgument);
+		}
+	
+    TPtrC8 theContent(seqGen.Encoding());
+    CPBEncryptParms* encryptParams =  TASN1DecPKCS5::DecodeDERL(theContent);
+    return encryptParams;
+	}	
+
+EXPORT_C HBufC8* CPKCS7EncryptedDataObject::DecryptDataL(const TDesC& aPassword) const
+	{
+	CPBEncryptElement* encryptElement;
+    HBufC8* pkcs12Pwd = PKCS12KDF::GeneratePasswordLC(aPassword);
+    if(iEncryptParams->Kdf() == CPBEncryptParms::EKdfPkcs12)
+		{
+	 	TPtrC8 iv = iEncryptParams->IV();
+	    HBufC8* ivValue = HBufC8::NewMaxLC(iv.Length());
+	    TPtr8 encryptKeyBuf = ivValue->Des();
+
+	 	switch(iEncryptParams->Cipher())	
+			{
+	 		case ECipherARC4_128:
+	 		case ECipherARC4_40:
+	 			{
+	 	    	//derive only key it is unnecessary to derive an IV for RC4
+	 	    	break;
+	 			}
+			case ECipher3DES_CBC:
+			case ECipher2Key3DES_CBC:
+			case ECipherRC2_CBC_128_16:	 
+			case ECipherRC2_CBC_40_5:	
+				{
+				PKCS12KDF::DeriveKeyL(encryptKeyBuf, PKCS12KDF::EIDByteIV, *pkcs12Pwd, iEncryptParams->Salt(), iEncryptParams->Iterations());
+				iEncryptParams->SetIV(encryptKeyBuf);
+		    	break;
+				}
+			default:
+				{
+		    	User::Leave(KErrNotSupported);
+		    	break;
+				}
+	 		}
+	 	CleanupStack::PopAndDestroy(ivValue);
+		// Create the decryptor	
+		encryptElement = CPBEncryptElement::NewLC(*pkcs12Pwd, *iEncryptParams);
+		}
+	else
+		{
+		TPBPassword password(aPassword);
+		// Create the decryptor	
+		encryptElement = CPBEncryptElement::NewLC(password.Password(), *iEncryptParams);	
+		}
+	 
+	CPBDecryptor* decryptor = encryptElement->NewDecryptLC();
+   	
+	TPtrC8 encryptedKey(iEncryptedContent);
+	TUint encryptLength = encryptedKey.Length();
+	TUint maxDecryptLength = decryptor->MaxOutputLength(encryptLength);
+	
+	if ( maxDecryptLength <= 0 )
+		{
+		User::Leave(KErrGeneral);		
+		}
+	
+	HBufC8* decryptedContent = HBufC8::NewLC(maxDecryptLength);
+	TPtr8 dcDes(decryptedContent->Des());
+	decryptor->Process(encryptedKey, dcDes);
+	CleanupStack::Pop(decryptedContent);
+	CleanupStack::PopAndDestroy(3, pkcs12Pwd); // pkcs12Pwd, encryptElement, decryptor
+   	return decryptedContent;
+   	}
+
+ void CPKCS7EncryptedDataObject::ConstructL(const CPKCS7ContentInfo& aContentInfo)
+	{
+	if(aContentInfo.ContentType() != KPkcs7EncryptedData)
+		{
+		User::Leave(KErrArgument);
+		}
+    
+	// EncryptedData SEQUENCE
+	TASN1DecGeneric decGen(aContentInfo.ContentData());
+	decGen.InitL();
+	if(decGen.Tag() != EASN1Sequence || decGen.Class() != EUniversal)
+		{
+	    User::Leave(KErrArgument);
+		}
+    TASN1DecSequence seq1;
+    CArrayPtrFlat<TASN1DecGeneric>* EncryptedDataContents = seq1.DecodeDERLC(decGen);       					
+			    
+	// Both version and encryptedContentInfo should be present
+	if (EncryptedDataContents->Count() != 2)
+		{
+		User::Leave(KErrArgument);
+		}
+		            
+	// VERSION
+	// version is the syntax version number. It shall be 0 for this version of the standard
+	const TASN1DecGeneric* EncryptedDataContentsAt0 = EncryptedDataContents->At(0);
+	if(EncryptedDataContentsAt0->Tag() != EASN1Integer || EncryptedDataContentsAt0->Class() != EUniversal)
+		{
+		User::Leave(KErrArgument);
+		}
+	 
+	TASN1DecInteger intDecoder;
+	iVersion = intDecoder.DecodeDERShortL(*EncryptedDataContentsAt0);
+	if (iVersion != 0)
+		{
+	    User::Leave(KErrArgument);		
+	    }
+		                
+    // ENCRYPTED CONTENT INFO a SEQUENCE
+    const TASN1DecGeneric* EncryptedDataContentsAt1 = EncryptedDataContents->At(1);
+	if (EncryptedDataContentsAt1->Tag() != EASN1Sequence || EncryptedDataContentsAt1->Class() != EUniversal)
+		{
+	    User::Leave(KErrArgument);
+	    }		               
+	TASN1DecSequence seq2;
+    CArrayPtrFlat<TASN1DecGeneric>* EncryptedContentInfo = seq2.DecodeDERLC(*EncryptedDataContentsAt1);       
+		        
+    // CONTENT TYPE IDENTIFIED BY AN OBJECT IDENTIFIER
+	// Gets the oid
+	TASN1DecObjectIdentifier ContentTypeoidDec;
+	HBufC* contentType = ContentTypeoidDec.DecodeDERL(*EncryptedContentInfo->At(0));
+	if(contentType->Compare(KPkcs7DataOID()) == 0)
+		{
+		iContentType = EPkcs7Data;
+		}
+	else
+		{
+		User::Leave(KErrNotSupported);
+		}
+	delete contentType;	        
+	// CONTENT ENCRYPTION ALGORITHM
+	// Get the Cipher used and the encoded params in it
+    iEncryptParams = DecodeContentEncryptionAlgorithmL(EncryptedContentInfo->At(1)->Encoding());
+                
+    // ENCRYPTED CONTENT
+	// This is an OPTIONAL field
+	TInt encryptedContentInfoCount = EncryptedContentInfo->Count();
+	if(encryptedContentInfoCount == 3)
+		{
+		TASN1DecGeneric decOctetString(*EncryptedContentInfo->At(2));
+		decOctetString.InitL();
+	    iEncryptedContent.Set(decOctetString.GetContentDER());
+	   	}
+	else if(encryptedContentInfoCount > 3 || encryptedContentInfoCount < 2)
+	    {
+	    User::Leave(KErrArgument);
+	    }
+	else if(encryptedContentInfoCount == 2)
+		{
+		iEncryptedContent.Set(KNullDesC8());
+		}
+
+	CleanupStack::PopAndDestroy(2, EncryptedDataContents); //EncryptedDataContents, EncryptedContentInfo    	
+	}
+