cryptoservices/filebasedcertificateandkeystores/test/tkeystore/t_export.cpp
changeset 8 35751d3474b7
parent 0 2c201484c85f
child 41 9b5a3a9fddf8
--- a/cryptoservices/filebasedcertificateandkeystores/test/tkeystore/t_export.cpp	Tue Jul 21 01:04:32 2009 +0100
+++ b/cryptoservices/filebasedcertificateandkeystores/test/tkeystore/t_export.cpp	Thu Sep 10 14:01:51 2009 +0300
@@ -1,445 +1,443 @@
-/*
-* 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: 
-*
-*/
-
-
-
-
-/**
- @file
-*/
-  
-#include <e32base.h>
-#include "t_keystore_actions.h"
-#include "t_keystore_defs.h"
-#include "t_input.h"
-#include <asn1enc.h>
-#include <asn1dec.h>
-#include <x509cert.h>
-#include <x509keys.h>
-#include <pbe.h>
-#include <pbedata.h>
-
-
-const TInt KKeyStoreEmpty = -1199;
-const TInt KDefaultSaltSize = 16;
-const TInt KDefaultIVSize = 8;
-const TInt KDefaultIterations = 2048;
-
-/** The block size for the default PBE cipher */
-const TUint KDESBlockBytes = 8; 
-
-/////////////////////////////////////////////////////////////////////////////////
-// CExportKey
-/////////////////////////////////////////////////////////////////////////////////
-
-CTestAction* CExportKey::NewL(RFs& aFs, 
-							CConsoleBase& aConsole, 
-							Output& aOut,
-							const TTestActionSpec& aTestActionSpec)
-{
-	CTestAction* self = CExportKey::NewLC(aFs, aConsole, aOut, aTestActionSpec);
-	CleanupStack::Pop(self);
-	return self;
-}
-
-CTestAction* CExportKey::NewLC(RFs& aFs,
-							CConsoleBase& aConsole, 
-							Output& aOut,
-							const TTestActionSpec& aTestActionSpec)
-{
-	CExportKey* self = new (ELeave) CExportKey(aFs, aConsole, aOut);
-	CleanupStack::PushL(self);
-	self->ConstructL(aTestActionSpec);
-	return self;
-}
-
-CExportKey::~CExportKey()
-{
-	iKeys.Close();
-	if (iPbeParams)
-		{
-		delete iPbeParams;
-		}
-}
-
-CExportKey::CExportKey(RFs& aFs, CConsoleBase& aConsole, Output& aOut)
-:	CImportKey(aFs, aConsole, aOut), iEncrypted(EFalse)
-{
- 	iState = EExportKey;
-}
- 
-
-void CExportKey::ConstructL(const TTestActionSpec& aTestActionSpec)
-	{
-	CKeyStoreTestAction::ConstructL(aTestActionSpec);
-
-	TInt err = KErrNone;
-	TInt pos = 0;
-	SetKeyDataFileL(Input::ParseElement(aTestActionSpec.iActionBody, KExportDataFile, KExportDataFileEnd, pos, err));
-	SetKeyEncrypted(Input::ParseElement(aTestActionSpec.iActionBody, KExportEncrypted, KExportEncryptedEnd, pos, err));
-
-	// PBE parameters
-	TPtrC8 cipher = Input::ParseElement(aTestActionSpec.iActionBody, KExportEncryptedCipher, KExportEncryptedCipherEnd, pos, err);	
-
-	if (cipher != _L8("")) 
-		{
-		SetPBEParameters(cipher, KNullDesC8, KNullDesC8, -1);		
-		}
-	else 
-		{
-		// Create default PBE paramenters
-		CSystemRandom* rand = CSystemRandom::NewLC();
-		HBufC8* saltc = HBufC8::NewMaxLC(KDefaultSaltSize);           
-		TPtr8 salt(saltc->Des());
-		salt.FillZ(); 
-		rand->GenerateBytesL(salt);
-
-		HBufC8* ivc = HBufC8::NewMaxLC(KDESBlockBytes);          
-	
-		TPtr8 iv(ivc->Des());
-		iv.FillZ(); 
-		rand->GenerateBytesL(iv);	
-
-		ASSERT(!iPbeParams);
-		iPbeParams = CPBEncryptParms::NewL(ECipherDES_CBC, salt, iv, 2048); 
-        
-		CleanupStack::PopAndDestroy(3, rand);     // rand, saltc, ivc
-		}
-	}
-
-void CExportKey::SetKeyEncrypted(const TDesC8& aDes)
-{
-	TLex8 lex(aDes);
-	TInt encrypted = 0;
-	lex.Val(encrypted);
-	if (encrypted > 0)
-		iEncrypted = ETrue;
-	else
-		iEncrypted = EFalse;
-}
-
-void 	CExportKey::SetPBEParameters(const TDesC8& aCipher, const TDesC8& aSalt, const TDesC8& aIV, const TInt aIteration)
-	{
-	TPBECipher myCipher = ECipherDES_CBC;  // Default to DES
-	TInt iterations = KDefaultIterations;
-	HBufC8* salt = NULL;
-	HBufC8* iv = NULL;
-	
-	if (aCipher == _L8("ECipherRC2_CBC_40"))
-		{
-		myCipher = ECipherRC2_CBC_40;
-		}
-	if (aCipher == _L8("ECipherRC2_CBC_128"))
-		{
-		myCipher = ECipherRC2_CBC_128;
-		}
-	if (aCipher == _L8("ECipherRC2_CBC_40_16"))
-		{
-		myCipher = ECipherRC2_CBC_40_16;
-		}
-	if (aCipher == _L8("ECipherRC2_CBC_128_16"))
-		{
-		myCipher = ECipherRC2_CBC_128_16;
-		}
-	if (aCipher == _L8("ECipher3DES_CBC"))
-		{
-		myCipher = ECipher3DES_CBC;
- 		}
-	if (aCipher == _L8("ECipherDES_CBC"))
-		{
-		myCipher = ECipherDES_CBC;
- 		}
-	if (aCipher == _L8("ECipherAES_CBC_256"))
-		{
-		myCipher = ECipherAES_CBC_256;
- 		}
-	if (aCipher == _L8("ECipherAES_CBC_192"))
-		{
-		myCipher = ECipherAES_CBC_192;
- 		}
-	if (aCipher == _L8("ECipherAES_CBC_128"))
-		{
-		myCipher = ECipherAES_CBC_128;
- 		}
-
-	if (aSalt == KNullDesC8) 
- 		{
- 		salt = HBufC8::NewMaxLC(KDefaultSaltSize);
- 		}
-	else 
-		{
-		salt = aSalt.AllocLC();
-		}
-
- 	if (aIV == KNullDesC8) 
- 		{
- 		iv = HBufC8::NewMaxLC(KDefaultIVSize);
- 		}
-	else
-		{
-		iv = aIV.AllocLC();
-		}
-
- 	if (aIteration == -1)
- 		{
- 		iterations = KDefaultIterations; 
- 		} 		
-	else
-		{
-		iterations = aIteration;
-		}	
-
-	iPbeParams = CPBEncryptParms::NewL(myCipher, *salt, *iv, iterations); 
-
-	CleanupStack::PopAndDestroy(2, salt); //salt, iv
-	}
-
-void CExportKey::SetKeyDataFileL(const TDesC8& aDes)
-{
-//	First the private data path for this test	
-	_LIT(KRamDrive, "\\tkeystore\\data\\");
-	TDriveUnit sysDrive (RFs::GetSystemDrive());
-	iKeyDataFile = sysDrive.Name();
-	iKeyDataFile.Append(KRamDrive);
-	
-	TFileName buf;
-	buf.FillZ();
-	buf.Copy(aDes);
-	
-//	Now the filename itself
-	iKeyDataFile.Append(buf);
-}
-
-
-void CExportKey::PerformAction(TRequestStatus& aStatus)
-	{
-	switch (iState)
-		{
-	case EExportKey:
-		{
-		CUnifiedKeyStore* keyStore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
-
-		iFilter.iUsage = EPKCS15UsageAll;
-		keyStore->List(iKeys, iFilter, aStatus);
-				
-		iState = EListing;
-		}
-		
-		break;
-	case EListing:
-		{
-		switch(aStatus.Int())
-			{				
-			case KErrNone:
-				{
-
-				TInt keyIndex = -1; // The index of the key we want to export
-		
-				if (iKeys.Count() == 0)
-					{
-					iConsole.Printf(_L("keyStore empty!!"));
-					iState = EFinished;
-					TRequestStatus *status = &aStatus;
-					User::RequestComplete(status, KKeyStoreEmpty);			
-					break;
-					}
-			
-				// Select the key with the label we want!
-				for (TInt j = 0; j < iKeys.Count(); j++)
-					{
-					if (iKeys[j]->Label() == *iLabel) 
-						{
-						keyIndex = j;
-						break;
-						}
-					}
-		
-				if (keyIndex == -1)
-					{
-					// Not found
-					iState = EFinished;
-					TRequestStatus *status = &aStatus;
-					User::RequestComplete(status, KErrNotFound);
-					break;
-					}
-			
-				CUnifiedKeyStore* keyStore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
-				
-				if (iEncrypted) 
-					{
-					ASSERT(iPbeParams);
-					keyStore->ExportEncryptedKey(iKeys[keyIndex]->Handle(), *iPbeParams, iKeyData, aStatus);	
-					}
-				else 
-					{
-					keyStore->ExportKey(iKeys[keyIndex]->Handle(), iKeyData, aStatus);				
-					}
-	
-				iState = EIntermediate;
-				}
-				break;
-
-			default:
-				{
-				iConsole.Printf(_L("keyStore->ExportKey returned: %d\n"), aStatus.Int());
-				iState = EFinished;
-				TRequestStatus *status = &aStatus;
-				User::RequestComplete(status, aStatus.Int());
-				}
-				break;
-			}
-		break;	
-		}
-		
-	case EIntermediate:
-		{
-		switch(aStatus.Int())
-			{				
-			case KErrNone:
-				{	
-					iState = EFinished;            // All is well let's end this
-					TRAPD(err, WriteToFileL());                  // Write exported key to file
-					TRequestStatus *status = &aStatus;
-					User::RequestComplete(status, err);
-				}
-				break;
-			
-			default:
-				{
-				iConsole.Printf(_L("keyStore->ExportKey returned: %d\n"), aStatus.Int());
-				iState = EFinished;
-				TRequestStatus *status = &aStatus;
-				User::RequestComplete(status, aStatus.Int());
-				}
-			break;			
-			}
-		break;
-		}
-
-	case EFinished:
-		{
-		TRequestStatus* status = &aStatus;
-		User::RequestComplete(status, aStatus.Int());
-		if (aStatus == iExpectedResult)
-			{
-			iResult = ETrue;
-			}
-		else
-			{
-			iResult = EFalse;
-			}
-		iFinished = ETrue;
-		}
-		break;
-		}
-	}
-
-void CExportKey::WriteToFileL()
-	{
-	RFs theFs;
-	CleanupClosePushL(theFs);
-	User::LeaveIfError(theFs.Connect());
-		
-	RFile file;
-	TInt r = file.Replace(theFs, iKeyDataFile, EFileWrite);
-
-	User::LeaveIfError(r);
-
-	CleanupClosePushL(file);
-	
-	file.Write(*iKeyData);
-
-	file.Close();
-	theFs.Close();	
-	CleanupStack::PopAndDestroy(2, &theFs);
-	}
-
-void CExportKey::PerformCancel()
-    {
-    CUnifiedKeyStore* keystore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
-    ASSERT(keystore);
-    
-    switch (iState)
-        {
-        case EListing:
-            keystore->CancelList();
-            break;
-
-        case EIntermediate:
-			if (iEncrypted)
-				{
-				keystore->CancelExportEncryptedKey();
-				}
-			else
-				{
-				keystore->CancelExportKey();
-				}
-            break;
-
-        default:
-            break;
-        }
-    }
-
-void CExportKey::Reset()
-	{
-	iState = EExportKey;
-	iKeys.Close();
-	}
-
-void CExportKey::DoReportAction()
-{
-	_LIT(KExporting, "Exporting key...");
-	iOut.writeString(KExporting);
-	TPtr theLabel(iLabel->Des());
-	iOut.writeString(theLabel);
-	iOut.writeNewLine();
-}
-
-
-void CExportKey::DoCheckResult(TInt aError)
-{
-	if (iFinished)
-	{
-		if (aError == KErrNone)
-		{
-			_LIT(KSuccessful, "Key exported successfully\n");
-			iConsole.Write(KSuccessful);
-			iOut.writeString(KSuccessful);
-			iOut.writeNewLine();
-			iOut.writeNewLine();
-		}
-		else
-		{
-			if (aError!=iExpectedResult)
-			{
-				_LIT(KFailed, "!!!Key export failure!!!\n");
-				iConsole.Write(KFailed);
-				iOut.writeString(KFailed);
-			}
-			else
-			{
-				_LIT(KFailed, "Key export failed, but expected\n");
-				iConsole.Write(KFailed);
-				iOut.writeString(KFailed);
-			}
-
-			iOut.writeNewLine();
-			iOut.writeNewLine();
-		}
-	}
-}
+/*
+* 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: 
+*
+*/
+
+
+/**
+ @file
+*/
+  
+#include <e32base.h>
+#include "t_keystore_actions.h"
+#include "t_keystore_defs.h"
+#include "t_input.h"
+#include <asn1enc.h>
+#include <asn1dec.h>
+#include <x509cert.h>
+#include <x509keys.h>
+#include <pbe.h>
+#include <pbedata.h>
+
+
+const TInt KKeyStoreEmpty = -1199;
+const TInt KDefaultSaltSize = 16;
+const TInt KDefaultIVSize = 8;
+const TInt KDefaultIterations = 2048;
+
+/** The block size for the default PBE cipher */
+const TUint KDESBlockBytes = 8; 
+
+/////////////////////////////////////////////////////////////////////////////////
+// CExportKey
+/////////////////////////////////////////////////////////////////////////////////
+
+CTestAction* CExportKey::NewL(RFs& aFs, 
+							CConsoleBase& aConsole, 
+							Output& aOut,
+							const TTestActionSpec& aTestActionSpec)
+{
+	CTestAction* self = CExportKey::NewLC(aFs, aConsole, aOut, aTestActionSpec);
+	CleanupStack::Pop(self);
+	return self;
+}
+
+CTestAction* CExportKey::NewLC(RFs& aFs,
+							CConsoleBase& aConsole, 
+							Output& aOut,
+							const TTestActionSpec& aTestActionSpec)
+{
+	CExportKey* self = new (ELeave) CExportKey(aFs, aConsole, aOut);
+	CleanupStack::PushL(self);
+	self->ConstructL(aTestActionSpec);
+	return self;
+}
+
+CExportKey::~CExportKey()
+{
+	iKeys.Close();
+	if (iPbeParams)
+		{
+		delete iPbeParams;
+		}
+}
+
+CExportKey::CExportKey(RFs& aFs, CConsoleBase& aConsole, Output& aOut)
+:	CImportKey(aFs, aConsole, aOut), iEncrypted(EFalse)
+{
+ 	iState = EExportKey;
+}
+ 
+
+void CExportKey::ConstructL(const TTestActionSpec& aTestActionSpec)
+	{
+	CKeyStoreTestAction::ConstructL(aTestActionSpec);
+
+	TInt err = KErrNone;
+	TInt pos = 0;
+	SetKeyDataFile(Input::ParseElement(aTestActionSpec.iActionBody, KExportDataFile, KExportDataFileEnd, pos, err));
+	SetKeyEncrypted(Input::ParseElement(aTestActionSpec.iActionBody, KExportEncrypted, KExportEncryptedEnd, pos, err));
+
+	// PBE parameters
+	TPtrC8 cipher = Input::ParseElement(aTestActionSpec.iActionBody, KExportEncryptedCipher, KExportEncryptedCipherEnd, pos, err);	
+
+	if (cipher != _L8("")) 
+		{
+		SetPBEParametersL(cipher, KNullDesC8, KNullDesC8, -1);		
+		}
+	else 
+		{
+		// Create default PBE paramenters
+		CSystemRandom* rand = CSystemRandom::NewLC();
+		HBufC8* saltc = HBufC8::NewMaxLC(KDefaultSaltSize);           
+		TPtr8 salt(saltc->Des());
+		salt.FillZ(); 
+		rand->GenerateBytesL(salt);
+
+		HBufC8* ivc = HBufC8::NewMaxLC(KDESBlockBytes);          
+	
+		TPtr8 iv(ivc->Des());
+		iv.FillZ(); 
+		rand->GenerateBytesL(iv);	
+
+		ASSERT(!iPbeParams);
+		iPbeParams = CPBEncryptParms::NewL(ECipherDES_CBC, salt, iv, 2048); 
+        
+		CleanupStack::PopAndDestroy(3, rand);     // rand, saltc, ivc
+		}
+	}
+
+void CExportKey::SetKeyEncrypted(const TDesC8& aDes)
+{
+	TLex8 lex(aDes);
+	TInt encrypted = 0;
+	lex.Val(encrypted);
+	if (encrypted > 0)
+		iEncrypted = ETrue;
+	else
+		iEncrypted = EFalse;
+}
+
+void 	CExportKey::SetPBEParametersL(const TDesC8& aCipher, const TDesC8& aSalt, const TDesC8& aIV, const TInt aIteration)
+	{
+	TPBECipher myCipher = ECipherDES_CBC;  // Default to DES
+	TInt iterations = KDefaultIterations;
+	HBufC8* salt = NULL;
+	HBufC8* iv = NULL;
+	
+	if (aCipher == _L8("ECipherRC2_CBC_40"))
+		{
+		myCipher = ECipherRC2_CBC_40;
+		}
+	if (aCipher == _L8("ECipherRC2_CBC_128"))
+		{
+		myCipher = ECipherRC2_CBC_128;
+		}
+	if (aCipher == _L8("ECipherRC2_CBC_40_16"))
+		{
+		myCipher = ECipherRC2_CBC_40_16;
+		}
+	if (aCipher == _L8("ECipherRC2_CBC_128_16"))
+		{
+		myCipher = ECipherRC2_CBC_128_16;
+		}
+	if (aCipher == _L8("ECipher3DES_CBC"))
+		{
+		myCipher = ECipher3DES_CBC;
+ 		}
+	if (aCipher == _L8("ECipherDES_CBC"))
+		{
+		myCipher = ECipherDES_CBC;
+ 		}
+	if (aCipher == _L8("ECipherAES_CBC_256"))
+		{
+		myCipher = ECipherAES_CBC_256;
+ 		}
+	if (aCipher == _L8("ECipherAES_CBC_192"))
+		{
+		myCipher = ECipherAES_CBC_192;
+ 		}
+	if (aCipher == _L8("ECipherAES_CBC_128"))
+		{
+		myCipher = ECipherAES_CBC_128;
+ 		}
+
+	if (aSalt == KNullDesC8) 
+ 		{
+ 		salt = HBufC8::NewMaxLC(KDefaultSaltSize);
+ 		}
+	else 
+		{
+		salt = aSalt.AllocLC();
+		}
+
+ 	if (aIV == KNullDesC8) 
+ 		{
+ 		iv = HBufC8::NewMaxLC(KDefaultIVSize);
+ 		}
+	else
+		{
+		iv = aIV.AllocLC();
+		}
+
+ 	if (aIteration == -1)
+ 		{
+ 		iterations = KDefaultIterations; 
+ 		} 		
+	else
+		{
+		iterations = aIteration;
+		}	
+
+	iPbeParams = CPBEncryptParms::NewL(myCipher, *salt, *iv, iterations); 
+
+	CleanupStack::PopAndDestroy(2, salt); //salt, iv
+	}
+
+void CExportKey::SetKeyDataFile(const TDesC8& aDes)
+{
+//	First the private data path for this test	
+	_LIT(KRamDrive, "\\tkeystore\\data\\");
+	TDriveUnit sysDrive (RFs::GetSystemDrive());
+	iKeyDataFile = sysDrive.Name();
+	iKeyDataFile.Append(KRamDrive);
+	
+	TFileName buf;
+	buf.FillZ();
+	buf.Copy(aDes);
+	
+//	Now the filename itself
+	iKeyDataFile.Append(buf);
+}
+
+
+void CExportKey::PerformAction(TRequestStatus& aStatus)
+	{
+	switch (iState)
+		{
+	case EExportKey:
+		{
+		CUnifiedKeyStore* keyStore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
+
+		iFilter.iUsage = EPKCS15UsageAll;
+		keyStore->List(iKeys, iFilter, aStatus);
+				
+		iState = EListing;
+		}
+		
+		break;
+	case EListing:
+		{
+		switch(aStatus.Int())
+			{				
+			case KErrNone:
+				{
+
+				TInt keyIndex = -1; // The index of the key we want to export
+		
+				if (iKeys.Count() == 0)
+					{
+					iConsole.Printf(_L("keyStore empty!!"));
+					iState = EFinished;
+					TRequestStatus *status = &aStatus;
+					User::RequestComplete(status, KKeyStoreEmpty);			
+					break;
+					}
+			
+				// Select the key with the label we want!
+				for (TInt j = 0; j < iKeys.Count(); j++)
+					{
+					if (iKeys[j]->Label() == *iLabel) 
+						{
+						keyIndex = j;
+						break;
+						}
+					}
+		
+				if (keyIndex == -1)
+					{
+					// Not found
+					iState = EFinished;
+					TRequestStatus *status = &aStatus;
+					User::RequestComplete(status, KErrNotFound);
+					break;
+					}
+			
+				CUnifiedKeyStore* keyStore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
+				
+				if (iEncrypted) 
+					{
+					ASSERT(iPbeParams);
+					keyStore->ExportEncryptedKey(iKeys[keyIndex]->Handle(), *iPbeParams, iKeyData, aStatus);	
+					}
+				else 
+					{
+					keyStore->ExportKey(iKeys[keyIndex]->Handle(), iKeyData, aStatus);				
+					}
+	
+				iState = EIntermediate;
+				}
+				break;
+
+			default:
+				{
+				iConsole.Printf(_L("keyStore->ExportKey returned: %d\n"), aStatus.Int());
+				iState = EFinished;
+				TRequestStatus *status = &aStatus;
+				User::RequestComplete(status, aStatus.Int());
+				}
+				break;
+			}
+		break;	
+		}
+		
+	case EIntermediate:
+		{
+		switch(aStatus.Int())
+			{				
+			case KErrNone:
+				{	
+					iState = EFinished;            // All is well let's end this
+					TRAPD(err, WriteToFileL());                  // Write exported key to file
+					TRequestStatus *status = &aStatus;
+					User::RequestComplete(status, err);
+				}
+				break;
+			
+			default:
+				{
+				iConsole.Printf(_L("keyStore->ExportKey returned: %d\n"), aStatus.Int());
+				iState = EFinished;
+				TRequestStatus *status = &aStatus;
+				User::RequestComplete(status, aStatus.Int());
+				}
+			break;			
+			}
+		break;
+		}
+
+	case EFinished:
+		{
+		TRequestStatus* status = &aStatus;
+		User::RequestComplete(status, aStatus.Int());
+		if (aStatus == iExpectedResult)
+			{
+			iResult = ETrue;
+			}
+		else
+			{
+			iResult = EFalse;
+			}
+		iFinished = ETrue;
+		}
+		break;
+		}
+	}
+
+void CExportKey::WriteToFileL()
+	{
+	RFs theFs;
+	CleanupClosePushL(theFs);
+	User::LeaveIfError(theFs.Connect());
+		
+	RFile file;
+	TInt r = file.Replace(theFs, iKeyDataFile, EFileWrite);
+
+	User::LeaveIfError(r);
+
+	CleanupClosePushL(file);
+	
+	file.Write(*iKeyData);
+
+	file.Close();
+	theFs.Close();	
+	CleanupStack::PopAndDestroy(2, &theFs);
+	}
+
+void CExportKey::PerformCancel()
+    {
+    CUnifiedKeyStore* keystore = CSharedKeyStores::TheUnifiedKeyStores().operator[](iKeystore);
+    ASSERT(keystore);
+    
+    switch (iState)
+        {
+        case EListing:
+            keystore->CancelList();
+            break;
+
+        case EIntermediate:
+			if (iEncrypted)
+				{
+				keystore->CancelExportEncryptedKey();
+				}
+			else
+				{
+				keystore->CancelExportKey();
+				}
+            break;
+
+        default:
+            break;
+        }
+    }
+
+void CExportKey::Reset()
+	{
+	iState = EExportKey;
+	iKeys.Close();
+	}
+
+void CExportKey::DoReportAction()
+{
+	_LIT(KExporting, "Exporting key...");
+	iOut.writeString(KExporting);
+	TPtr theLabel(iLabel->Des());
+	iOut.writeString(theLabel);
+	iOut.writeNewLine();
+}
+
+
+void CExportKey::DoCheckResult(TInt aError)
+{
+	if (iFinished)
+	{
+		if (aError == KErrNone)
+		{
+			_LIT(KSuccessful, "Key exported successfully\n");
+			iConsole.Write(KSuccessful);
+			iOut.writeString(KSuccessful);
+			iOut.writeNewLine();
+			iOut.writeNewLine();
+		}
+		else
+		{
+			if (aError!=iExpectedResult)
+			{
+				_LIT(KFailed, "!!!Key export failure!!!\n");
+				iConsole.Write(KFailed);
+				iOut.writeString(KFailed);
+			}
+			else
+			{
+				_LIT(KFailed, "Key export failed, but expected\n");
+				iConsole.Write(KFailed);
+				iOut.writeString(KFailed);
+			}
+
+			iOut.writeNewLine();
+			iOut.writeNewLine();
+		}
+	}
+}