cryptoservices/filebasedcertificateandkeystores/test/tkeystore/t_open.cpp
changeset 15 da2ae96f639b
parent 8 35751d3474b7
child 19 cd501b96611d
--- a/cryptoservices/filebasedcertificateandkeystores/test/tkeystore/t_open.cpp	Fri Oct 02 13:15:59 2009 +0300
+++ b/cryptoservices/filebasedcertificateandkeystores/test/tkeystore/t_open.cpp	Mon Oct 12 10:17:04 2009 +0300
@@ -26,6 +26,13 @@
 #include <x509keys.h>
 #include <asymmetrickeys.h>
 
+#if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC))
+#include <cryptospidef.h>
+#include "cryptoasymmetriccipherapi.h"
+#include "cryptosignatureapi.h"
+#include <cryptospi/cryptoparams.h>
+#endif // SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT && SYMBIAN_ENABLE_SDP_ECC && SYMBIAN_ENABLE_SDP_ECC
+
 /*static*/ CTestAction* COpenKey::NewL(RFs& aFs, CConsoleBase& aConsole, Output& aOut, const TTestActionSpec& aTestActionSpec)
 {
 	CTestAction* self = COpenKey::NewLC(aFs, aConsole, aOut, aTestActionSpec);
@@ -43,6 +50,10 @@
 
 COpenKey::~COpenKey()
 {
+#if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC))
+    delete iSigner;
+    delete iDecrypt;
+#endif
 	iKeys.Close();
 }
 
@@ -67,8 +78,8 @@
 			ASSERT(keyStore);	//	Flag it up
 			
 			TInt keyCount = iKeys.Count();
-
 			TInt i;
+			
 			for (i = 0; i < keyCount; i++)
 				{
 				CCTKeyInfo* keyInfo = iKeys[i];
@@ -89,61 +100,97 @@
 					case EDH:
 						keyStore->Open(*keyInfo, iDH, aStatus);
 						break;
+					#if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC))
+					case EECC:
+						{
+						ASSERT(iHardwareType);
+						if(iOperationType == ESigning)
+							{
+							keyStore->Open(keyInfo->Handle(),iSigner,aStatus);
+							}
+						if(iOperationType == EDecryption)
+							{
+							keyStore->Open(keyInfo->Handle(),iDecrypt,aStatus);
+							}
+						break;
+						}
+					#endif // SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT && SYMBIAN_ENABLE_SDP_ECC
 						}
 					break;
 					}
 				}
-			iState = EFinished;
 			if (i == keyCount)
 				{
 				TRequestStatus* status = &aStatus;
 				User::RequestComplete(status, KErrNotFound);
 				}
+				
+			iState = EFinished;
+			
 		}
 		break;
 
 		case EFinished:
 			{
+			TInt completionCode = aStatus.Int();
 			HBufC* label = 0;
 			iKeys.Close();
 			if (aStatus.Int() == KErrNone)
 				{
 				switch (iType)
 					{
-				case ERSASign:
-					if (iRSASigner)
+					case ERSASign:
+						if (iRSASigner)
+							{
+							label = iRSASigner->Label().AllocLC();
+							iRSASigner->Release();
+							}
+						break;
+					case EDSASign:
+						if (iDSASigner)
+							{
+							label = iDSASigner->Label().AllocLC();
+							iDSASigner->Release();
+							}
+						break;
+					case EDecrypt:
+						if (iDecryptor)
+							{
+							label = iDecryptor->Label().AllocLC();
+							iDecryptor->Release();
+							}
+					case EDH:
+						if (iDH)
+							{
+							label = iDH->Label().AllocLC();
+							iDH->Release();
+							}
+						break;
+	#if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC))
+					case EECC:
 						{
-						label = iRSASigner->Label().AllocLC();
-						iRSASigner->Release();
-						}
-					break;
-				case EDSASign:
-					if (iDSASigner)
-						{
-						label = iDSASigner->Label().AllocLC();
-						iDSASigner->Release();
+						ASSERT(iHardwareType);
+						if(iOperationType == ESigning && iSigner == NULL
+								|| iOperationType == EDecryption && iDecrypt == NULL)
+							{
+							completionCode = KErrGeneral;
+							}
+						break;
 						}
-					break;
-				case EDecrypt:
-					if (iDecryptor)
-						{
-						label = iDecryptor->Label().AllocLC();
-						iDecryptor->Release();
-						}
-				case EDH:
-					if (iDH)
-						{
-						label = iDH->Label().AllocLC();
-						iDH->Release();
-						}
-					break;
+#endif // SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT && SYMBIAN_ENABLE_SDP_ECC
+				} // switch
+#if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC))
+				if(iHardwareType == 0)
+#endif // SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT && SYMBIAN_ENABLE_SDP_ECC
+					{
+					if (*label != *iLabel)
+						aStatus = KErrBadName;
+					CleanupStack::PopAndDestroy(label);
 					}
-				if (*label != *iLabel)
-					aStatus = KErrBadName;
-				CleanupStack::PopAndDestroy(label);
 				}
 			TRequestStatus* status = &aStatus;
-			User::RequestComplete(status, aStatus.Int());
+			User::RequestComplete(status, completionCode);
+
 			if (aStatus.Int()==iExpectedResult)
 				{
 				iResult = ETrue;
@@ -206,6 +253,12 @@
 		iDH->Release();
 		iDH = NULL;
 		}
+#if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC))
+    delete iSigner;
+    iSigner = NULL;
+    delete iDecrypt;
+    iDecrypt = NULL;
+#endif // SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT && SYMBIAN_ENABLE_SDP_ECC
 	}
 
 void COpenKey::DoReportAction()
@@ -257,30 +310,23 @@
 	{
 	TInt pos = 0, err = 0;
 	CKeyStoreTestAction::ConstructL(aTestActionSpec);
-	SetKeyType(Input::ParseElement(aTestActionSpec.iActionBody, KOpenStart, KOpenEnd, pos, err));
+	
+#if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC))
+	pos = 0;
+	TPtrC8 operationType = Input::ParseElement(aTestActionSpec.iActionBody, KOperationTypeStart, KOperationTypeEnd, pos, err);
+	if(operationType.Compare(_L8("sign")) == 0)
+		{
+		iOperationType = ESigning;
+		}
+	else if (operationType.Compare(_L8("decrypt")) == 0)
+		{
+		iOperationType = EDecryption;
+		}
+#endif // SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT && SYMBIAN_ENABLE_SDP_ECC
+	
 	iState = EListKeysPreOpen;
 
 	}
-void COpenKey::SetKeyType(const TDesC8& aKeyType)
-{
-	if (aKeyType.Compare(KAlgRSA)==0)
-	{
-		iType = ERSASign;
-	}
-	else if (aKeyType.Compare(KAlgDSA)==0)
-	{
-		iType = EDSASign;
-	}
-	else if (aKeyType.Compare(KDecryptUsage)==0)
-	{
-		iType = EDecrypt;
-	}
-	else if (aKeyType.Compare(KAlgDH)==0)
-	{
-		iType = EDH;
-	}
-}
-
 
 ////////////////////////////////////
 // CSign
@@ -308,6 +354,10 @@
 	delete iRSASignature;
 	delete iDSASignature;
 	delete iHash;
+#if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC))
+    delete iSigner;
+    delete iSpiSignature;
+#endif // SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT && SYMBIAN_ENABLE_SDP_ECC
 }
 
 void CSign::PerformAction(TRequestStatus& aStatus)
@@ -319,34 +369,33 @@
 		}
 		
 	switch (iState)
-	{	
+		{	
 		case EListKeysPreOpen:
-		{            
+			{            
 			CUnifiedKeyStore* keyStore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
 			ASSERT(keyStore);	//	Flag it up
 			if (keyStore)
 				keyStore->List(iKeys, iFilter, aStatus);
-			
 			iState = EOpenKey;
-		}
-		break;
+
+			}
+			break;
 		
 		case EOpenKey:
-		{
+			{
 			CUnifiedKeyStore* keyStore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
-				ASSERT(keyStore);	//	Flag it up
-				
-				TInt keyCount = iKeys.Count();
+			ASSERT(keyStore);	//	Flag it up
+            TInt keyCount = iKeys.Count();
 
-				TInt i;
-				for (i = 0; i < keyCount; i++)
-					{
-					CCTKeyInfo* keyInfo = iKeys[i];
+            TInt i;
+            for (i = 0; i < keyCount; i++)
+                {
+                CCTKeyInfo* keyInfo = iKeys[i];
 
-					if (keyInfo->Label() == *iLabel)
-						{
-						switch (iType)
-							{
+                if (keyInfo->Label() == *iLabel)
+                    {
+                    switch (iType)
+                        {
 						case ERSASign:
 							keyStore->Open(*keyInfo, iRSASigner, aStatus);
 							break;
@@ -356,17 +405,34 @@
 						case EDH:
 						case EDecrypt:
 							break;	//	Nothing to do, for the compiler
+						
+						#if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC))
+						case EECC:
+							{
+							iTokenHandle = keyInfo->Handle();
+							if(iHardwareType == 0)
+								{
+								keyStore->Open(iTokenHandle, iSigner, aStatus);
+								}
+							else
+								{
+								TRequestStatus* status = &aStatus;
+								User::RequestComplete(status, KErrNone);
+								}
 							}
-						break;
-						}
-					}
-				iState = ESign;
-				if (i == keyCount)
+							break;
+						#endif // SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT && SYMBIAN_ENABLE_SDP_ECC
+                        }
+                    } // if
+                if (i == keyCount)
 					{
 					TRequestStatus* status = &aStatus;
 					User::RequestComplete(status, KErrNotFound);
-					}					
-				}
+					}		
+                }// for
+			iState = ESign;
+						
+		}
 		break;
 
 		case ESign:
@@ -403,6 +469,39 @@
 					}
 				}
 				break;
+#if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC))
+                case EECC:
+                    {
+                    TRAPD(err, iSpiSignature = CryptoSpi::CCryptoParams::NewL());
+                    if(err == KErrNone)
+                        {
+                        if(iHardwareType)
+                            {
+                            CUnifiedKeyStore* keyStore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
+                            ASSERT(keyStore);   //  Flag it up
+                            keyStore->Sign(iTokenHandle, *iReadText, iSpiSignature, aStatus);
+                            }
+                        else
+                            {
+                            if(iSigner)
+                                {
+                                TRAP(err, iSigner->SignL(*iReadText, *iSpiSignature));
+                                aStatus = err;
+                                }
+                            TRequestStatus* status = &aStatus;
+                            User::RequestComplete(status, aStatus.Int());
+                            }
+                        }
+                    else
+                        {
+                        aStatus = err;
+                        TRequestStatus* status = &aStatus;
+                        User::RequestComplete(status, aStatus.Int());
+                        }
+                    }
+                break;
+#endif // SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT && SYMBIAN_ENABLE_SDP_ECC
+
 				default:
 					ASSERT(EFalse);
 			}					
@@ -410,10 +509,12 @@
 		}
 		break;
 
+	
 		case EExportPublic:
 			{
 			CUnifiedKeyStore* keyStore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
-			ASSERT(keyStore);	//	Flag it up				
+			ASSERT(keyStore);   //  Flag it up              
+
 			TInt keyCount = iKeys.Count();
 			TInt i;
 			for (i = 0; i < keyCount; i++)
@@ -426,15 +527,23 @@
 
 					switch (iType)
 						{
-					case ERSASign:
-						keyStore->ExportPublic(iExportHandle, iExportedPublicKey,  aStatus);
-						break;
-					case EDSASign:
-						keyStore->ExportPublic(iExportHandle, iExportedPublicKey,  aStatus); 
-						break;
-					case EDH:
-					case EDecrypt:
-						break;	//	Nothing to do, for the compiler
+						case ERSASign:
+							keyStore->ExportPublic(iExportHandle, iExportedPublicKey,  aStatus);
+							break;
+						case EDSASign:
+							keyStore->ExportPublic(iExportHandle, iExportedPublicKey,  aStatus); 
+							break;
+						case EDH:
+						case EDecrypt:
+							break;	//	Nothing to do, for the compiler
+#if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC))
+						case EECC:
+							{
+							keyStore->ExportPublic(iExportHandle, iExportedPublicKey, aStatus);
+							iState = EVerify;
+							}
+							break;
+#endif // SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT && SYMBIAN_ENABLE_SDP_ECC
 						}
 					break;
 					}
@@ -459,8 +568,11 @@
 				if (keyInfo->Label() == *iLabel)
 					{
 					iExportHandle = keyInfo->Handle();
-					CX509SubjectPublicKeyInfo* ki = 
-						CX509SubjectPublicKeyInfo::NewLC(*iExportedPublicKey);
+					CX509SubjectPublicKeyInfo* ki = NULL;
+#if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC))
+					if(iType != EECC)
+#endif // SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT && SYMBIAN_ENABLE_SDP_ECC
+						ki = CX509SubjectPublicKeyInfo::NewLC(*iExportedPublicKey);
 
 					switch (iType)
 						{
@@ -514,13 +626,44 @@
 						CleanupStack::PopAndDestroy(key);
 						}
 						break;
+				
+#if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC))
+					case EECC:
+						{
+						iVerifyResult = EFalse;
+						if (iSpiSignature && iSpiSignature->IsPresent(CryptoSpi::KEccKeyTypeUid))
+							{
+							TDesC8* actualSignature = NULL;
+							TRAPD(err, actualSignature = const_cast<TDesC8*>(&(iSpiSignature->GetTDesC8L(CryptoSpi::KEccKeyTypeUid))));
+							if(err == KErrNone)
+							    {
+							    if(iExportedPublicKey->Des() == *actualSignature)
+							        {
+							        iVerifyResult = ETrue;
+							        }
+							    }
+							else
+							    {
+							    aStatus = err;
+							    }
+							}
+						_LIT(KReturned, "Returned... ");
+						iOut.writeString(KReturned);
+						iOut.writeNewLine();
+						}
+					break;
+#endif // SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT && SYMBIAN_ENABLE_SDP_ECC	
 					default:
 						ASSERT(EFalse);
 
 						}
-					CleanupStack::PopAndDestroy(ki);
+#if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC))
+					if(iType != EECC)
+#endif // SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT && SYMBIAN_ENABLE_SDP_ECC
+						CleanupStack::PopAndDestroy(ki);
 					}
 				}
+
 			iState = EFinished;
 			TRequestStatus* status = &aStatus;
 			if (!iVerifyResult)		
@@ -535,7 +678,7 @@
 					aStatus = KErrGeneral;
 					}
 				}
-			User::RequestComplete(status, aStatus.Int());					
+			User::RequestComplete(status, aStatus.Int());
 			}
 			break;
 		
@@ -576,7 +719,6 @@
 		default:
 			ASSERT(EFalse);	
 	}
-
 }
 
 void CSign::PerformCancel()
@@ -641,6 +783,12 @@
 	iRSASignature = NULL;
 	delete iDSASignature;
 	iDSASignature = NULL;
+#if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC))
+	delete iSigner;
+	iSigner = NULL;
+	delete iSpiSignature;
+	iSpiSignature = NULL;
+#endif // SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT && SYMBIAN_ENABLE_SDP_ECC
 	}
 
 void CSign::DoReportAction()
@@ -693,34 +841,13 @@
 {
 	CKeyStoreTestAction::ConstructL(aTestActionSpec);
 
-	SetKeyType(Input::ParseElement(aTestActionSpec.iActionBody, KOpenStart));	
 	SetDigestSignL(Input::ParseElement(aTestActionSpec.iActionBody, KSignDigestStart));
 	SetSignText(Input::ParseElement(aTestActionSpec.iActionBody, KTextStart, KTextEnd));
 
 	iFilter.iPolicyFilter = TCTKeyAttributeFilter::EAllKeys;
 	
 	iState = EListKeysPreOpen;
-}
-
-
-void CSign::SetKeyType(const TDesC8& aKeyType)
-{
-	if (aKeyType.Compare(KAlgRSA)==0)
-	{
-		iType = ERSASign;
-	}
-	else if (aKeyType.Compare(KAlgDSA)==0)
-	{
-		iType = EDSASign;
-	}
-	else if (aKeyType.Compare(KDecryptUsage)==0)
-	{
-		iType = EDecrypt;
-	}
-	else if (aKeyType.Compare(KAlgDH)==0)
-	{
-		iType = EDH;
-	}
+		
 }
 
 void CSign::SetDigestSignL(const TDesC8& aSignDigestDesc)
@@ -771,6 +898,9 @@
 	delete iReadText;
 	delete iPlainText;
 	delete iPublic;
+#if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC))
+    delete iDecrypt;
+#endif
 }
 
 void CDecrypt::PerformAction(TRequestStatus& aStatus)
@@ -784,23 +914,22 @@
 	switch (iState)
 	{	
 		case EListKeysPreOpen:
-		{//	Currently uses the first store, change to check the script for a specific store
+			{//	Currently uses the first store, change to check the script for a specific store
 			CUnifiedKeyStore* keyStore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
 			ASSERT(keyStore);	//	Flag it up
 			if (keyStore)
 				keyStore->List(iKeys, iFilter, aStatus);
-			
+				
 			iState = EOpenKey;
-		}
+			}
 		break;
 		
 		case EOpenKey:
 		{
 			CUnifiedKeyStore* keyStore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
 			ASSERT(keyStore);	//	Flag it up
-			
+
 			TInt keyCount = iKeys.Count();
-
 			TInt i;
 			for (i = 0; i < keyCount; i++)
 				{
@@ -808,10 +937,33 @@
 
 				if (keyInfo->Label() == *iLabel)
 					{
-					keyStore->Open(*keyInfo, iDecryptor, aStatus);
+					switch(iType)
+						{
+#if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC))
+						case EECC:
+						if(iHardwareType == 0)
+							{
+							keyStore->Open(keyInfo->Handle(), iDecrypt, aStatus);
+							}
+						else if(iHardwareType == 1 )
+							{
+							/**
+							 * Call the decrypt of hardware directly. iPlainText 
+							 * would be populated.
+							 */
+							keyStore->Decrypt(keyInfo->Handle(), *iReadText, iPlainText, aStatus);
+							}
+						break;
+#endif // SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT && SYMBIAN_ENABLE_SDP_ECC
+					default:
+						{
+						keyStore->Open(*keyInfo, iDecryptor, aStatus);
+						}
+					} // switch
 					break;
-					}
-				}
+					} // if
+				} // for
+			
 			iState = EExportPublic;
 			if (i == keyCount)
 				{
@@ -837,10 +989,10 @@
 
 			CUnifiedKeyStore* keyStore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
 			ASSERT(keyStore);	//	Flag it up
-			
+
 			TInt keyCount = iKeys.Count();
-
 			TInt i;
+			
 			for (i = 0; i < keyCount; i++)
 				{
 				CCTKeyInfo* keyInfo = iKeys[i];
@@ -872,52 +1024,121 @@
 				User::RequestComplete(status, aStatus.Int());
 				break;
 				}
-
-			CX509SubjectPublicKeyInfo* ki = 
-				CX509SubjectPublicKeyInfo::NewLC(*iPublic);
-
-			TX509KeyFactory factory; 
-			CRSAPublicKey* key = factory.RSAPublicKeyL(ki->KeyData());
-			CleanupStack::PushL(key);
-						
-		//	Encrypt with public key
-			CRSAPKCS1v15Encryptor* encryptor = CRSAPKCS1v15Encryptor::NewLC(*key);
-			HBufC8* cipherText = HBufC8::NewLC(encryptor->MaxOutputLength());
-			TPtr8 cipherTextPtr = cipherText->Des();
+			switch(iType)
+				{
+#if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC))
+				case EECC:
+					{
+					if(iHardwareType)
+						{
+						if(*iPlainText == *iPublic)
+							{
+							aStatus = KErrNone;
+							}
+						else
+							{
+							aStatus = KErrGeneral;
+							}
+						}
+					else
+						{
+                        aStatus = KErrGeneral;
+                        if (iDecrypt)
+                            {
+                            HBufC8* decryptedText = NULL;
+                            TRAPD(err, decryptedText = HBufC8::NewL(iDecrypt->GetMaximumOutputLengthL()));
+                            
+                            if (err == KErrNone)
+                                {
+                                CleanupStack::PushL(decryptedText);
+                                TPtr8 decryptedTextPtr = decryptedText->Des();
 
-			encryptor->EncryptL(*iReadText, cipherTextPtr);
-			
-		//	Now decrypt again
-			iPlainText = HBufC8::NewMaxL(100);
-			iPlainTextPtr.Set(iPlainText->Des());
-			iDecryptor->Decrypt(*cipherText, iPlainTextPtr, aStatus);
-			
-			CleanupStack::PopAndDestroy(cipherText);
-			CleanupStack::PopAndDestroy(encryptor);
-			CleanupStack::PopAndDestroy(key);
-			CleanupStack::PopAndDestroy(ki);
-			
-			iState = EFinished;
-			}
-			break;
+                                TRAP(err, (iDecrypt->ProcessL(*iReadText, decryptedTextPtr)));
+                                if(err != KErrNone)
+                                    {
+                                    aStatus = err;
+                                    }
+                                if ((err == KErrNone) && (decryptedTextPtr
+                                        == iPublic->Des()))
+                                    {
+                                    aStatus = KErrNone;
+                                    }
+                                CleanupStack::PopAndDestroy(decryptedText);
+                                }
+                            else
+                                {
+                                aStatus = err;
+                                }
+                            }
+                        }
+					iState = EFinished;
+					TRequestStatus* status = &aStatus;
+					User::RequestComplete(status, aStatus.Int());
+					}
+					break;
+#endif // SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT && SYMBIAN_ENABLE_SDP_ECC
+				default:
+					{
+					CX509SubjectPublicKeyInfo* ki = 
+						CX509SubjectPublicKeyInfo::NewLC(*iPublic);
+		
+					TX509KeyFactory factory; 
+					CRSAPublicKey* key = factory.RSAPublicKeyL(ki->KeyData());
+					CleanupStack::PushL(key);
+								
+				//	Encrypt with public key
+					CRSAPKCS1v15Encryptor* encryptor = CRSAPKCS1v15Encryptor::NewLC(*key);
+					HBufC8* cipherText = HBufC8::NewLC(encryptor->MaxOutputLength());
+					TPtr8 cipherTextPtr = cipherText->Des();
+		
+					encryptor->EncryptL(*iReadText, cipherTextPtr);
+					
+				//	Now decrypt again
+					iPlainText = HBufC8::NewMaxL(100);
+					iPlainTextPtr.Set(iPlainText->Des());
+					iDecryptor->Decrypt(*cipherText, iPlainTextPtr, aStatus);
+					
+					CleanupStack::PopAndDestroy(cipherText);
+					CleanupStack::PopAndDestroy(encryptor);
+					CleanupStack::PopAndDestroy(key);
+					CleanupStack::PopAndDestroy(ki);
+					
+					iState = EFinished;
+					}
+				} // switch
+		}
+		break;
 
 		case EFinished:
 			{
-			if (aStatus == KErrNone && (!iPlainText || 
-										*iPlainText != *iReadText))
+#if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC))
+			if(iType == EECC)
 				{
-				aStatus = KErrGeneral;	//	Decryption failed
+				iActionState = EPostrequisite;
+				iResult = (aStatus.Int() == iExpectedResult);
+					
+				TRequestStatus* status = &aStatus;
+				User::RequestComplete(status, aStatus.Int());
 				}
-			
-			iActionState = EPostrequisite;
-			iResult = (aStatus.Int() == iExpectedResult);
-			
-			if (iDecryptor)
+			else
+#endif // SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT && SYMBIAN_ENABLE_SDP_ECC
 				{
-				iDecryptor->Release();
+				if (aStatus == KErrNone && (!iPlainText || 
+											*iPlainText != *iReadText))
+					{
+					aStatus = KErrGeneral;	//	Decryption failed
+					}
+				
+				iActionState = EPostrequisite;
+				iResult = (aStatus.Int() == iExpectedResult);
+				
+				if (iDecryptor)
+					{
+					iDecryptor->Release();
+					}
+				TRequestStatus* status = &aStatus;
+				User::RequestComplete(status, aStatus.Int());
 				}
-			TRequestStatus* status = &aStatus;
-			User::RequestComplete(status, aStatus.Int());
 		}
 		break;
 		default:
@@ -968,16 +1189,18 @@
 	iPlainText = NULL;
 	delete iPublic;
 	iPublic = NULL;
+#if (defined(SYMBIAN_ENABLE_SDP_WMDRM_SUPPORT) && defined(SYMBIAN_ENABLE_SDP_ECC))
+    delete iDecrypt;
+    iDecrypt = NULL;
+#endif
 	}
 
 void CDecrypt::DoReportAction()
-{
+	{
 	_LIT(KSigning, "Decrypting... ");
 	iOut.writeString(KSigning);
 	iOut.writeNewLine();
-//	iOut.writeString(*iReadText);
-//	iOut.writeNewLine();
-}
+	}
 
 void CDecrypt::DoCheckResult(TInt aError)
 {