cryptoservices/certificateandkeymgmt/tcertstore/T_unifiedcertstoreadd.cpp
changeset 8 35751d3474b7
parent 0 2c201484c85f
child 48 eb9b28acd381
--- a/cryptoservices/certificateandkeymgmt/tcertstore/T_unifiedcertstoreadd.cpp	Tue Jul 21 01:04:32 2009 +0100
+++ b/cryptoservices/certificateandkeymgmt/tcertstore/T_unifiedcertstoreadd.cpp	Thu Sep 10 14:01:51 2009 +0300
@@ -1,807 +1,809 @@
-/*
-* Copyright (c) 2004-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 "t_unifiedcertstoreadd.h"
-#include "t_certstoredefs.h"
-#include "t_input.h"
-#include "t_certstoreout.h"
-#include <mctwritablecertstore.h>
-
-CTestAction* CAddCertificate::NewL(RFs& aFs,
-								   CConsoleBase& aConsole, 
-								   Output& aOut, 
-								   const TTestActionSpec& aTestActionSpec)
-	{
-	CAddCertificate* self = new(ELeave) CAddCertificate(aFs, aConsole, aOut);
-	CleanupStack::PushL(self);
-	self->ConstructL(aTestActionSpec);
-	CleanupStack::Pop(self);
-	return self;
-	}
-
-CAddCertificate::~CAddCertificate()
-	{
-	delete iCertificate;
-	delete iCertificateURL;
-	delete iCertificateContent;
-	delete iCertificateLabel;
-	}
-
-void CAddCertificate::PerformAction(TRequestStatus& aStatus)
-	{
-	switch (iState)
-		{
-		case EAdding:
-			{
- 			if (iNotificationSubscribed)
- 				{
- 				if (!iNotifier)
- 					{
- 					iNotifier = CCertStoreChangeNotifier::NewL(iNotifierFlag);
- 					iNotifier->StartNotification();
- 					}
- 				iState = ECheckNotification;
- 				}
- 			else
- 				{
- 				iState = EFinished;
- 				}
-			MCTWritableCertStore& store = UnifiedCertStore().WritableCertStore(iStoreIndex);
-			
-			TKeyIdentifier* issuerKeyId = &iIssuerKeyId;
-			TKeyIdentifier* subjectKeyId = &iSubjectKeyId;
-			
-			ASSERT(iCertificateLabel);
-			
-			// Use the Add() with Deletable param if Deletable flag present in test data
-			if (iDeletableFlagPresent)
-				{
-				store.Add(*iCertificateLabel, iCertificateFormat, iOwnerType,
-						  subjectKeyId, issuerKeyId, *iCertificateContent, 
-						  iDeletable, aStatus);
-				}
-			// otherwise, use the original Add()
-			else 
-				{
-				store.Add(*iCertificateLabel, iCertificateFormat, iOwnerType,
-						  subjectKeyId, issuerKeyId, *iCertificateContent, aStatus);
-				}
-			}
-			break;
- 		case ECheckNotification:
- 			{
- 			TInt ret=KErrNone;
- 			if (!iNotifierFlag)
- 				{
- 				ret=KErrGeneral;
- 				}
- 			iState = EFinished;
- 			TRequestStatus* status = &aStatus;
- 			User::RequestComplete(status, ret);
- 			
- 			break;
- 			}
-		case EFinished:
-			{
-			if (aStatus == iExpectedResult)
-				{
-				iResult = ETrue;
-				}
-			else
-				{
-				iResult = EFalse;
-				}
-
-            if (aStatus != KErrNoMemory)
-                {
-                iFinished = ETrue;
-                }
-            
-			TRequestStatus* status = &aStatus;
-			User::RequestComplete(status, aStatus.Int());
-			}
-			break;
-
-		default:
-			User::Invariant();
-			break;
-		}
-	}
-
-void CAddCertificate::PerformCancel()
-	{
-	switch (iState)
-		{
-	case ECheckNotification:
-	case EFinished:	
-		{
-		MCTWritableCertStore& store = UnifiedCertStore().WritableCertStore(iStoreIndex);
-		store.CancelAdd();
-		break;
-		}
-	default:
-		break;
-		}
-	}
-
-void CAddCertificate::AfterOOMFailure()
-	{
-	}
-
-void CAddCertificate::Reset()
-	{
-	iState = EAdding;
-	}
-
-void CAddCertificate::DoReportAction()
-	{
-	iOut.writeString(_L("Adding certificate..."));
-	iOut.writeNewLine();
-	iOut.writeString(_L("\tLabel = "));
-	iOut.writeString(*iCertificateLabel);
-	iOut.writeNewLine();
-	iOut.writeString(_L("\tOwner type = "));
-	WriteOwnerType();
-	WriteFormat();
-	iOut.writeString(_L("\tSubjectKeyId:  "));
-	iOut.writeOctetString(iSubjectKeyId);
-	iOut.writeNewLine();
-	iOut.writeString(_L("\tDeletable = "));
-	iDeletable ? iOut.writeString(KTrue) : iOut.writeString(KFalse);
-	iOut.writeNewLine();
-	iOut.writeNewLine();
-	}
-
-void CAddCertificate::WriteFormat()
-	{
-	iOut.writeString(_L("\tFormat = "));
-	switch (iCertificateFormat)
-		{
-		case EX509Certificate:
-			iOut.writeString(_L("X.509\n"));
-			break;
-			
-		case EWTLSCertificate:
-			iOut.writeString(_L("WTLS\n"));
-			break;
-			
-		case EX509CertificateUrl:
-			iOut.writeString(_L("X.509 URL\n"));
-			break;
-			
-		case EWTLSCertificateUrl:
-			iOut.writeString(_L("WTLS URL\n"));
-			break;
-			
-		default:
-			iOut.writeString(_L("Unknown format\n"));
-			break;
-		}
-	}
-
-void CAddCertificate::WriteOwnerType()
-	{
-	switch (iOwnerType)
-		{
-		case ECACertificate:
-			iOut.writeString(_L("CA\n"));
-			break;
-			
-		case EUserCertificate:
-			iOut.writeString(_L("User"));
-			break;
-			
-		case EPeerCertificate:
-			iOut.writeString(_L("Peer"));
-			break;
-
-		default:
-			iOut.writeString(_L("Unknown"));
-			break;
-		}
-	}
-	
-CAddCertificate::CAddCertificate(RFs& aFs, CConsoleBase& aConsole,
-								 Output& aOut)
-: CSubscriberAction(aFs, aConsole, aOut), iState(EAdding), 
-  iDeletable(ETrue), iDeletableFlagPresent(EFalse)
-	{
-	}
-
-void CAddCertificate::ConstructL(const TTestActionSpec& aTestActionSpec)
-	{
-	CSubscriberAction::ConstructL(aTestActionSpec);
-
-	SetCertFormatL(Input::ParseElement(aTestActionSpec.iActionBody, KCertFormatStart));
-	SetCertOwnerTypeL(Input::ParseElement(aTestActionSpec.iActionBody, KCertOwnerTypeStart));
-	SetCertLabelL(Input::ParseElement(aTestActionSpec.iActionBody, KCertLabelStart));
-	SetKeyId(iIssuerKeyId, Input::ParseElement(aTestActionSpec.iActionBody, KIssuerKeyStart));
-	SetKeyId(iSubjectKeyId, Input::ParseElement(aTestActionSpec.iActionBody, KSubjectKeyStart));
-	SetStoreToUse(Input::ParseElement(aTestActionSpec.iActionBody, KStoreToUseStart));
-
-	TPtrC8 certFileOrURL = Input::ParseElement(aTestActionSpec.iActionBody, KCertFileStart);
-
-	SetCertificateContentL(certFileOrURL);
-
-	if (iCertificateFormat == EX509CertificateUrl ||
-		iCertificateFormat == EWTLSCertificateUrl)
-		{
-		iCertificateURL = certFileOrURL.AllocL();
-		}
-	else
-		{
-		ConstructCertL(certFileOrURL);
-		}
-		
-	// check for a possible deletable flag value for the certificate
-	TInt err = KErrNone;
-	TInt pos = 0;
-	const TDesC8& deletableStr = Input::ParseElement(aTestActionSpec.iActionBody, 
-														KDeletableStart,
-														KDeletableEnd,
-														pos,
-														err);
-
-	// set the deletable attribute if a value was found for the certificate
-	if (err == KErrNone)
-		{
-		SetDeletable(deletableStr);
-		}
-
-	// Setting the expected result
-	HBufC* result = HBufC::NewLC(aTestActionSpec.iActionResult.Length());
-	TPtr(result->Des()).Copy(aTestActionSpec.iActionResult);
-	Input::GetExpectedResultL(Input::ParseElement(*result, KReturnStart, KReturnEnd), iExpectedResult);
-	CleanupStack::PopAndDestroy(result);
-	}
-
-void CAddCertificate::SetKeyId(TKeyIdentifier& aKeyIdentifier, const TDesC8& aKeyInfo)
-	{
-	TInt size = aKeyInfo.Length();
-	for (TInt i = 0; i < size; i += 2)
-		{
-		TInt a = (aKeyInfo[i+1] >= 'a') ? (aKeyInfo[i+1] - 'a' + 10) : (aKeyInfo[i+1] - '0');
-		TInt b = (aKeyInfo[i] >= 'a') ? (aKeyInfo[i] - 'a' + 10) : (aKeyInfo[i] - '0');
-		aKeyIdentifier.Append(a  + b * 16);
-		}
-	}
-
-void CAddCertificate::SetCertFormatL(const TDesC8& aFormat)
-	{
-	if (aFormat == KX509)
-		{
-		iCertificateFormat = EX509Certificate;
-		}
-	else if (aFormat == KWTLS)
-		{
-		iCertificateFormat = EWTLSCertificate;
-		}
-	else if (aFormat == KX509URL)
-		{
-		iCertificateFormat = EX509CertificateUrl;
-		}
-	else if (aFormat == KWTLSURL)
-		{
-		iCertificateFormat = EWTLSCertificateUrl;
-		}
-	else if (aFormat == KUnknown)
-		{
-		iCertificateFormat = EUnknownCertificate;
-		}
-	else
-		{
-		iOut.write(_L("Unknown cert format: "));
-		iOut.writeString(aFormat);
-		iOut.writeNewLine();		   
-		User::Leave(KErrArgument);
-		}
-	}
-
-void CAddCertificate::SetCertOwnerTypeL(const TDesC8& aOwnerType)
-	{
-	if (aOwnerType == KCACert)
-		{
-		iOwnerType = ECACertificate;
-		}
-	else if (aOwnerType == KUserCert)
-		{
-		iOwnerType = EUserCertificate;
-		}
-	else if (aOwnerType == KPeerCert)
-		{
-		iOwnerType = EPeerCertificate;
-		}
-	else if (aOwnerType == KUnknown)
-		{
-		// set dummy bogus owner type
-		iOwnerType = static_cast<TCertificateOwnerType>(EPeerCertificate + 1);
-		}
-	else
-		{
-		iOut.write(_L("Unknown cert owner type: "));
-		iOut.writeString(aOwnerType);
-		iOut.writeNewLine();		   
-		User::Leave(KErrArgument);
-		}
-	}
-
-void CAddCertificate::SetCertLabelL(const TDesC8& aLabel)
-	{
-	delete iCertificateLabel;
-	iCertificateLabel = NULL;
-	iCertificateLabel = HBufC::NewL(aLabel.Length());
-	TPtr ptr = iCertificateLabel->Des();
-	ptr.Copy(aLabel);
-	}
-
-void CAddCertificate::SetStoreToUse(const TDesC8& aStoreToUse)
-	{
-	TLex8 lex(aStoreToUse);
-	lex.Val(iStoreIndex);
-	}
-
-void CAddCertificate::SetCertificateContentL(const TDesC8& aFileName)
-	{
-	TFileName fileName;
-	fileName.Copy(aFileName);
-	RFs fs; 
-	User::LeaveIfError(fs.Connect());
-	CleanupClosePushL(fs);
-	__ASSERT_DEBUG(!iCertificateContent, User::Panic(_L("CAddCertificate"), 1));
-	TRAPD(err, iCertificateContent = Input::ReadFileL(fileName, fs));
-	if (err != KErrNone)
-		{
-		iConsole.Printf(_L("Error reading file : "));
-		iConsole.Printf(fileName);
-		iConsole.Printf(_L("\n"));
-		User::Leave(err);
-		}
-	CleanupStack::PopAndDestroy();	// fs
-	}
-
-void CAddCertificate::SetDeletable(const TDesC8& aDeletable)
-	{
-	iDeletableFlagPresent = ETrue;
-	if (aDeletable.Compare(KTrue)==0)
-		{
-		iDeletable = ETrue;
-		}
-	else
-		{
-		iDeletable = EFalse;
-		}
-	}
-
-void CAddCertificate::ConstructCertL(const TDesC8& aCert)
-	{
-	TFileName filename;
-	filename.Copy(aCert);
-	RFs fs; 
-	User::LeaveIfError(fs.Connect());
-	CleanupClosePushL(fs);
-	HBufC8* certBuf = 0;
-	TRAPD(err, certBuf = Input::ReadFileL(filename, fs));
-	if (err != KErrNone)
-		{
-		iConsole.Printf(_L("Error reading file : "));
-		iConsole.Printf(filename);
-		iConsole.Printf(_L("\n"));
-		User::Leave(err);
-		}
-	CleanupStack::PushL(certBuf);
-	switch (iCertificateFormat)
-		{
-		case EX509Certificate:
-			iCertificate = CX509Certificate::NewL(*certBuf);
-			break;
-			
-		case EWTLSCertificate:
-			iCertificate = CWTLSCertificate::NewL(*certBuf);
-			break;
-			
-		default:
-			// Unknown format - do nothing
-			break;
-		}
-	CleanupStack::PopAndDestroy(2);
-	}
-
-void CAddCertificate::DoCheckResult(TInt aError)
-	{
-	
-	if (iFinished)
-		{
-		if (iResult )
-			{
-			if (iExpectedResult == KErrNone )
-				{
-				iConsole.Write(_L("\tcertificate added successfully\n"));
-				iOut.writeString(_L("\tcertificate added successfully"));
-				}
-			else	
-				{
-				iConsole.Write(_L("\tcertificate not added.\n"));
-				iOut.writeString(_L("\tcertificate not added."));
-				}
-			iOut.writeNewLine();
-			iOut.writeNewLine();
-			}
-		else if( !iResult)
-			{
-			if(iExpectedResult == KErrNone )
-				{
-				iConsole.Write(_L("\tcertificate not added\n"));
-				iOut.writeString(_L("\tcertificate not added"));	
-				}
-			else
-				{
-				iConsole.Write(_L("\tcertificate should not be added\n"));
-				iOut.writeString(_L("\tcertificate should not be added"));
-				}
-			iOut.writeNewLine();
-			iOut.writeString(_L("\t"));
-			iOut.writeError(aError);
-			if (aError == KErrBadName)
-				{
-				iOut.writeString(_L(" Check that the label is unique"));
-				}
-			iOut.writeNewLine();
-			iOut.writeNewLine();
-			}
-		}	
-	}
-//////////////////////////////////////////////////////////
-//	Key import, from keystore for adding user certificates
-//////////////////////////////////////////////////////////
-
-CTestAction* CImportKey::NewL(RFs& aFs, 
-							CConsoleBase& aConsole, 
-							Output& aOut,
-							const TTestActionSpec& aTestActionSpec)
-{
-	CTestAction* self = CImportKey::NewLC(aFs, aConsole, aOut, aTestActionSpec);
-	CleanupStack::Pop(self);
-	return self;
-}
-
-CTestAction* CImportKey::NewLC(RFs& aFs,
-							CConsoleBase& aConsole, 
-							Output& aOut,
-							const TTestActionSpec& aTestActionSpec)
-{
-	CImportKey* self = new (ELeave) CImportKey(aFs, aConsole, aOut);
-	CleanupStack::PushL(self);
-	self->ConstructL(aTestActionSpec);
-	return self;
-}
-
-CImportKey::~CImportKey()
-{
-	delete iLabel;
-	delete iKeyData;
-	if (iKeyInfo)
-		{
-		iKeyInfo->Release();
-		}
-	delete iUnifiedKeyStore;
-	iFs.Close();
-}
-
-CImportKey::CImportKey(RFs& aFs, CConsoleBase& aConsole, Output& aOut)
-:	CCertStoreTestAction(aFs, aConsole, aOut),
-	iState(EInitialise)
-{}
-
-
-void CImportKey::ConstructL(const TTestActionSpec& aTestActionSpec)
-{
-	User::LeaveIfError(iFs.Connect());
-
-	CCertStoreTestAction::ConstructL(aTestActionSpec);
-
-	TInt err = KErrNone;
-	TInt pos = 0;
-	SetKeyDataFileL(Input::ParseElement(aTestActionSpec.iActionBody, KImportDataFile, KImportDataFileEnd, pos, err));
-	for (;SetKeyUsage(Input::ParseElement(aTestActionSpec.iActionBody, KKeyUsageStart, KKeyUsageEnd, pos, err));)
-		;
-	
-	SetKeyLabel(Input::ParseElement(aTestActionSpec.iActionBody, KKeyLabelStart, KKeyLabelEnd, pos, err));
-	for (;SetKeyAccessType(Input::ParseElement(aTestActionSpec.iActionBody, KKeyAccessTypeStart, KKeyAccessTypeEnd, pos, err));)
-		;
-	
-	SetKeyPassphrase(Input::ParseElement(aTestActionSpec.iActionBody, KKeyPassphraseStart, KKeyPassphraseEnd, pos, err));
-		
-	pos = 0;
-	
-	HBufC* result = HBufC::NewLC(aTestActionSpec.iActionResult.Length());
-	TPtr(result->Des()).Copy(aTestActionSpec.iActionResult);
-	Input::GetExpectedResultL(Input::ParseElement(*result, KReturnStart, KReturnEnd), iExpectedResult);
-	CleanupStack::PopAndDestroy(result);
-}
-
-TBool CImportKey::SetKeyUsage(const TDesC8& aKeyUsage)
-	{
-	TBool ret = ETrue;
-	if (aKeyUsage.Compare(KAllKeyUsages)==0)
-		iUsage = EPKCS15UsageAll;
-	else if (aKeyUsage.Compare(KAllKeyUsagesButNR)==0)
-		iUsage |= (TKeyUsagePKCS15)(EPKCS15UsageSign) |
-			(TKeyUsagePKCS15)(EPKCS15UsageSignRecover) |
-			(TKeyUsagePKCS15)(EPKCS15UsageDecrypt);
-	else if (aKeyUsage.Compare(KDSAUsage)==0)
-		iUsage |= (TKeyUsagePKCS15)(EPKCS15UsageSign) |
-			(TKeyUsagePKCS15)(EPKCS15UsageSignRecover);
-	else if (aKeyUsage.Compare(KDerive)==0)
-		iUsage |= EPKCS15UsageDerive;
-	else if (aKeyUsage.Compare(KSign)==0)
-		iUsage |= EPKCS15UsageSign;
-	else if (aKeyUsage.Compare(KSignRecover)==0)
-		iUsage |= EPKCS15UsageSignRecover;
-	else if (aKeyUsage.Compare(KDecrypt)==0)
-		iUsage |= EPKCS15UsageDecrypt;
-	else if (aKeyUsage.Compare(KNR)==0)
-		iUsage |= EPKCS15UsageNonRepudiation;
-	else if (aKeyUsage.Compare(KEncipherAndSign)==0)
-		iUsage |= (TKeyUsagePKCS15)(EPKCS15UsageSign) |
-			(TKeyUsagePKCS15)(EPKCS15UsageSignRecover) |
-			(TKeyUsagePKCS15)(EPKCS15UsageUnwrap);
-	else
-		ret = EFalse;
-	return ret;
-	}
-
-void CImportKey::SetKeyLabel(const TDesC8& aKeyLabel)
-{
-	iLabel = HBufC::NewMax(aKeyLabel.Size());
-	if (iLabel)
-	{
-		TPtr theLabel(iLabel->Des());
-		theLabel.FillZ();
-		theLabel.Copy(aKeyLabel);
-	}
-}
-
-
-void CImportKey::SetKeyPassphrase(const TDesC8& aPassphrase)
-	{
-	// If the passphrase is empty, then use "clanger" by default.
-	_LIT8(KDefaultPassphrase, "clanger");
-	TPtrC8 phrase(KDefaultPassphrase());
-	if (aPassphrase.Length())
-		{
-		phrase.Set(aPassphrase);
-		}
-
-
-	RFs fs;
-	RFile file;
-	fs.Connect();
-	
-	// Write the passphrase straight to the file.
-	TDriveUnit sysDrive (fs.GetSystemDrive());
-	TBuf<24> fileName (sysDrive.Name());
-	fileName.Append(_L("\\password.txt"));
-	
-	file.Replace(fs, fileName, EFileWrite);
-	file.Write(phrase);
-	file.Close();
-	fs.Close();
-	}
-
-void CImportKey::SetKeyDataFileL(const TDesC8& aDes)
-{	
-//	Now the filename itself
-	TFileName fileName;
-	fileName.FillZ();
-	fileName.Copy(aDes);
-	
-	TDriveUnit sysDrive (RFs::GetSystemDrive());
-	TBuf<64> buf(sysDrive.Name());
-	buf.Append(_L("\\tcertstore\\data\\"));
-	buf.Append(fileName);
-		
-	RFile file;
-	TInt r = file.Open(iFs, buf, EFileRead);
-	if ( (r==KErrNotFound) || (r==KErrPathNotFound) )
-	{//	Not on c:, try z:
-		buf[0] = 'z';
-		r = file.Open(iFs, buf, EFileRead);
-	}
-
-	User::LeaveIfError(r);
-
-	CleanupClosePushL(file);
-
-	TInt fileSize = 0;
-	User::LeaveIfError(file.Size(fileSize));
-
-	if (fileSize > 0)
-	{
-		iKeyData = HBufC8::NewMaxL(fileSize);	
-		TPtr8 data(iKeyData->Des());
-		data.FillZ();
-		User::LeaveIfError(file.Read(data, fileSize));
-		CleanupStack::Pop(1);
-	}
-
-	file.Close();
-}
-
-TBool CImportKey::SetKeyAccessType(const TDesC8& aKeyAccessType)
-	{
-	TBool ret = ETrue;
-	if (aKeyAccessType.Compare(KExtractable)==0)
-		{
-		iAccessType |= CCTKeyInfo::EExtractable;
-		}
-	else if (aKeyAccessType.Compare(KSensitive)==0)
-		{
-		iAccessType |= CCTKeyInfo::ESensitive;
-		}
-	else if (aKeyAccessType.Compare(KAlwaysSensitive)==0)
-		{
-		iAccessType |= CCTKeyInfo::EAlwaysSensitive;
-		}
-	else if (aKeyAccessType.Compare(KNeverExtractable)==0)
-		{
-		iAccessType |= CCTKeyInfo::ENeverExtractable;
-		}
-	else if (aKeyAccessType.Compare(KLocal)==0)
-		{
-		iAccessType |= CCTKeyInfo::ELocal;
-		}
-	else
-		ret = EFalse;
-	return ret;
-	}
-
-void CImportKey::PerformAction(TRequestStatus& aStatus)
-{
-	TDriveUnit sysDrive (RFs::GetSystemDrive());
-	switch (iState)
-	{
-	case EInitialise:
-		{
-		if (iKeyInfo != NULL)
-			{
-			iKeyInfo->Release();
-			iKeyInfo = NULL;
-			}
-
-		// Delete t_secdlg files - this will then always answer "clanger" for the passphrase
-		    
-		TInt result;
-		TBuf<24> datFile(sysDrive.Name());
-		datFile.Append(_L("\\t_secdlg_in.dat"));
-		result = iFs.Delete(datFile);
-		
-		if (result != KErrNone && result != KErrNotFound)
-			{
-			TRequestStatus* status = &aStatus;
-			User::RequestComplete(status, result);
-			return;
-			}
-			
-		datFile.Copy(sysDrive.Name());
-		datFile.Append(_L("\\t_secdlg_out.dat"));
-		result = iFs.Delete(datFile);
-		
-		if (result != KErrNone && result != KErrNotFound)
-			{
-			TRequestStatus* status = &aStatus;
-			User::RequestComplete(status, result);
-			return;
-			}
-		
-		TRAP(result, iUnifiedKeyStore = CUnifiedKeyStore::NewL(iFs));
-		if ( (result==KErrNone) && (iUnifiedKeyStore) )
-			{
-				iUnifiedKeyStore->Initialize(aStatus);
-				iState = EImportKey;
-			}
-		else
-			{
-				aStatus = result;
-				iState = EFinished;
-			}
-		}
-		break;
-	case EImportKey:
-		{
-			if (KErrNone==aStatus.Int())
-			{
-			//	Currently uses the first store, change to check the script for a specific store
-				iUnifiedKeyStore->ImportKey(0, iKeyData->Des(), iUsage, *iLabel, iAccessType,
-											TTime(0), TTime(0), iKeyInfo, aStatus);			
-			}
-			else
-				{
-				// Errors get passed to next state
-				TRequestStatus* status = &aStatus;
-				User::RequestComplete(status, aStatus.Int());
-				}
-
-			iState = EFinished;
-		}
-		
-		break;
-		
-		case EFinished:
-		{
-			TRequestStatus* status = &aStatus;
-			User::RequestComplete(status, aStatus.Int());
-			if ( (aStatus == iExpectedResult) || (aStatus==KErrAlreadyExists) )
-			{
-				iResult = ETrue;
-			}
-			else
-			{
-				iResult = EFalse;
-			}
-			
-			iFinished = ETrue;
-		}
-		break;
-	}
-}
-
-void CImportKey::PerformCancel()
-{//	To do when test harness cancel comes back.  Currently cancel testing
-//	is performed in RunL with a set of flags and a separate active object
-}
-
-void CImportKey::Reset()
-{}
-
-void CImportKey::DoReportAction()
-{
-	_LIT(KImporting, "Importing key from keystore...");
-	iOut.writeString(KImporting);
-	TPtr theLabel(iLabel->Des());
-	iOut.writeString(theLabel);
-	iOut.writeNewLine();
-}
-
-
-void CImportKey::DoCheckResult(TInt aError)
-{
-	
-	if (iFinished)
-	{
-		if (aError == KErrNone)
-		{
-			_LIT(KSuccessful, "Key imported successfully\n");
-			iConsole.Write(KSuccessful);
-			iOut.writeString(KSuccessful);
-			iOut.writeNewLine();
-			iOut.writeNewLine();
-		}
-		else
-		{
-			if ( (aError!=iExpectedResult) && (aError!=KErrAlreadyExists) )
-			{
-				_LIT(KFailed, "!!!Key import failure!!!\n");
-				iConsole.Write(KFailed);
-				iOut.writeString(KFailed);
-			}
-			
-			iOut.writeNewLine();
-			iOut.writeNewLine();
-		}
-	}
-}
+/*
+* Copyright (c) 2004-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 "t_unifiedcertstoreadd.h"
+#include "t_certstoredefs.h"
+#include "t_input.h"
+#include "t_certstoreout.h"
+#include <mctwritablecertstore.h>
+
+CTestAction* CAddCertificate::NewL(RFs& aFs,
+								   CConsoleBase& aConsole, 
+								   Output& aOut, 
+								   const TTestActionSpec& aTestActionSpec)
+	{
+	CAddCertificate* self = new(ELeave) CAddCertificate(aFs, aConsole, aOut);
+	CleanupStack::PushL(self);
+	self->ConstructL(aTestActionSpec);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CAddCertificate::~CAddCertificate()
+	{
+	delete iCertificate;
+	delete iCertificateURL;
+	delete iCertificateContent;
+	delete iCertificateLabel;
+	}
+
+void CAddCertificate::PerformAction(TRequestStatus& aStatus)
+	{
+	switch (iState)
+		{
+		case EAdding:
+			{
+ 			if (iNotificationSubscribed)
+ 				{
+ 				if (!iNotifier)
+ 					{
+ 					iNotifier = CCertStoreChangeNotifier::NewL(iNotifierFlag);
+ 					iNotifier->StartNotification();
+ 					}
+ 				iState = ECheckNotification;
+ 				}
+ 			else
+ 				{
+ 				iState = EFinished;
+ 				}
+			MCTWritableCertStore& store = UnifiedCertStore().WritableCertStore(iStoreIndex);
+			
+			TKeyIdentifier* issuerKeyId = &iIssuerKeyId;
+			TKeyIdentifier* subjectKeyId = &iSubjectKeyId;
+			
+			ASSERT(iCertificateLabel);
+			
+			// Use the Add() with Deletable param if Deletable flag present in test data
+			if (iDeletableFlagPresent)
+				{
+				store.Add(*iCertificateLabel, iCertificateFormat, iOwnerType,
+						  subjectKeyId, issuerKeyId, *iCertificateContent, 
+						  iDeletable, aStatus);
+				}
+			// otherwise, use the original Add()
+			else 
+				{
+				store.Add(*iCertificateLabel, iCertificateFormat, iOwnerType,
+						  subjectKeyId, issuerKeyId, *iCertificateContent, aStatus);
+				}
+			}
+			break;
+ 		case ECheckNotification:
+ 			{
+  			iState = EFinished;
+ 			if (iNotifierFlag)
+	 			{
+ 				TRequestStatus* status = &aStatus;
+ 				User::RequestComplete(status, KErrNone);
+	 			}
+			else
+				{
+				iNotifier->SetCompleteStatus(&aStatus);
+				} 			
+ 			break;
+ 			}
+		case EFinished:
+			{
+			if (aStatus == iExpectedResult)
+				{
+				iResult = ETrue;
+				}
+			else
+				{
+				iResult = EFalse;
+				}
+
+            if (aStatus != KErrNoMemory)
+                {
+                iFinished = ETrue;
+                }
+            
+			TRequestStatus* status = &aStatus;
+			User::RequestComplete(status, aStatus.Int());
+			}
+			break;
+
+		default:
+			User::Invariant();
+			break;
+		}
+	}
+
+void CAddCertificate::PerformCancel()
+	{
+	switch (iState)
+		{
+	case ECheckNotification:
+	case EFinished:	
+		{
+		MCTWritableCertStore& store = UnifiedCertStore().WritableCertStore(iStoreIndex);
+		store.CancelAdd();
+		break;
+		}
+	default:
+		break;
+		}
+	}
+
+void CAddCertificate::AfterOOMFailure()
+	{
+	}
+
+void CAddCertificate::Reset()
+	{
+	iState = EAdding;
+	}
+
+void CAddCertificate::DoReportAction()
+	{
+	iOut.writeString(_L("Adding certificate..."));
+	iOut.writeNewLine();
+	iOut.writeString(_L("\tLabel = "));
+	iOut.writeString(*iCertificateLabel);
+	iOut.writeNewLine();
+	iOut.writeString(_L("\tOwner type = "));
+	WriteOwnerType();
+	WriteFormat();
+	iOut.writeString(_L("\tSubjectKeyId:  "));
+	iOut.writeOctetString(iSubjectKeyId);
+	iOut.writeNewLine();
+	iOut.writeString(_L("\tDeletable = "));
+	iDeletable ? iOut.writeString(KTrue) : iOut.writeString(KFalse);
+	iOut.writeNewLine();
+	iOut.writeNewLine();
+	}
+
+void CAddCertificate::WriteFormat()
+	{
+	iOut.writeString(_L("\tFormat = "));
+	switch (iCertificateFormat)
+		{
+		case EX509Certificate:
+			iOut.writeString(_L("X.509\n"));
+			break;
+			
+		case EWTLSCertificate:
+			iOut.writeString(_L("WTLS\n"));
+			break;
+			
+		case EX509CertificateUrl:
+			iOut.writeString(_L("X.509 URL\n"));
+			break;
+			
+		case EWTLSCertificateUrl:
+			iOut.writeString(_L("WTLS URL\n"));
+			break;
+			
+		default:
+			iOut.writeString(_L("Unknown format\n"));
+			break;
+		}
+	}
+
+void CAddCertificate::WriteOwnerType()
+	{
+	switch (iOwnerType)
+		{
+		case ECACertificate:
+			iOut.writeString(_L("CA\n"));
+			break;
+			
+		case EUserCertificate:
+			iOut.writeString(_L("User"));
+			break;
+			
+		case EPeerCertificate:
+			iOut.writeString(_L("Peer"));
+			break;
+
+		default:
+			iOut.writeString(_L("Unknown"));
+			break;
+		}
+	}
+	
+CAddCertificate::CAddCertificate(RFs& aFs, CConsoleBase& aConsole,
+								 Output& aOut)
+: CSubscriberAction(aFs, aConsole, aOut), iState(EAdding), 
+  iDeletable(ETrue), iDeletableFlagPresent(EFalse)
+	{
+	}
+
+void CAddCertificate::ConstructL(const TTestActionSpec& aTestActionSpec)
+	{
+	CSubscriberAction::ConstructL(aTestActionSpec);
+
+	SetCertFormatL(Input::ParseElement(aTestActionSpec.iActionBody, KCertFormatStart));
+	SetCertOwnerTypeL(Input::ParseElement(aTestActionSpec.iActionBody, KCertOwnerTypeStart));
+	SetCertLabelL(Input::ParseElement(aTestActionSpec.iActionBody, KCertLabelStart));
+	SetKeyId(iIssuerKeyId, Input::ParseElement(aTestActionSpec.iActionBody, KIssuerKeyStart));
+	SetKeyId(iSubjectKeyId, Input::ParseElement(aTestActionSpec.iActionBody, KSubjectKeyStart));
+	SetStoreToUse(Input::ParseElement(aTestActionSpec.iActionBody, KStoreToUseStart));
+
+	TPtrC8 certFileOrURL = Input::ParseElement(aTestActionSpec.iActionBody, KCertFileStart);
+
+	SetCertificateContentL(certFileOrURL);
+
+	if (iCertificateFormat == EX509CertificateUrl ||
+		iCertificateFormat == EWTLSCertificateUrl)
+		{
+		iCertificateURL = certFileOrURL.AllocL();
+		}
+	else
+		{
+		ConstructCertL(certFileOrURL);
+		}
+		
+	// check for a possible deletable flag value for the certificate
+	TInt err = KErrNone;
+	TInt pos = 0;
+	const TDesC8& deletableStr = Input::ParseElement(aTestActionSpec.iActionBody, 
+														KDeletableStart,
+														KDeletableEnd,
+														pos,
+														err);
+
+	// set the deletable attribute if a value was found for the certificate
+	if (err == KErrNone)
+		{
+		SetDeletable(deletableStr);
+		}
+
+	// Setting the expected result
+	HBufC* result = HBufC::NewLC(aTestActionSpec.iActionResult.Length());
+	TPtr(result->Des()).Copy(aTestActionSpec.iActionResult);
+	Input::GetExpectedResultL(Input::ParseElement(*result, KReturnStart, KReturnEnd), iExpectedResult);
+	CleanupStack::PopAndDestroy(result);
+	}
+
+void CAddCertificate::SetKeyId(TKeyIdentifier& aKeyIdentifier, const TDesC8& aKeyInfo)
+	{
+	TInt size = aKeyInfo.Length();
+	for (TInt i = 0; i < size; i += 2)
+		{
+		TInt a = (aKeyInfo[i+1] >= 'a') ? (aKeyInfo[i+1] - 'a' + 10) : (aKeyInfo[i+1] - '0');
+		TInt b = (aKeyInfo[i] >= 'a') ? (aKeyInfo[i] - 'a' + 10) : (aKeyInfo[i] - '0');
+		aKeyIdentifier.Append(a  + b * 16);
+		}
+	}
+
+void CAddCertificate::SetCertFormatL(const TDesC8& aFormat)
+	{
+	if (aFormat == KX509)
+		{
+		iCertificateFormat = EX509Certificate;
+		}
+	else if (aFormat == KWTLS)
+		{
+		iCertificateFormat = EWTLSCertificate;
+		}
+	else if (aFormat == KX509URL)
+		{
+		iCertificateFormat = EX509CertificateUrl;
+		}
+	else if (aFormat == KWTLSURL)
+		{
+		iCertificateFormat = EWTLSCertificateUrl;
+		}
+	else if (aFormat == KUnknown)
+		{
+		iCertificateFormat = EUnknownCertificate;
+		}
+	else
+		{
+		iOut.write(_L("Unknown cert format: "));
+		iOut.writeString(aFormat);
+		iOut.writeNewLine();		   
+		User::Leave(KErrArgument);
+		}
+	}
+
+void CAddCertificate::SetCertOwnerTypeL(const TDesC8& aOwnerType)
+	{
+	if (aOwnerType == KCACert)
+		{
+		iOwnerType = ECACertificate;
+		}
+	else if (aOwnerType == KUserCert)
+		{
+		iOwnerType = EUserCertificate;
+		}
+	else if (aOwnerType == KPeerCert)
+		{
+		iOwnerType = EPeerCertificate;
+		}
+	else if (aOwnerType == KUnknown)
+		{
+		// set dummy bogus owner type
+		iOwnerType = static_cast<TCertificateOwnerType>(EPeerCertificate + 1);
+		}
+	else
+		{
+		iOut.write(_L("Unknown cert owner type: "));
+		iOut.writeString(aOwnerType);
+		iOut.writeNewLine();		   
+		User::Leave(KErrArgument);
+		}
+	}
+
+void CAddCertificate::SetCertLabelL(const TDesC8& aLabel)
+	{
+	delete iCertificateLabel;
+	iCertificateLabel = NULL;
+	iCertificateLabel = HBufC::NewL(aLabel.Length());
+	TPtr ptr = iCertificateLabel->Des();
+	ptr.Copy(aLabel);
+	}
+
+void CAddCertificate::SetStoreToUse(const TDesC8& aStoreToUse)
+	{
+	TLex8 lex(aStoreToUse);
+	lex.Val(iStoreIndex);
+	}
+
+void CAddCertificate::SetCertificateContentL(const TDesC8& aFileName)
+	{
+	TFileName fileName;
+	fileName.Copy(aFileName);
+	RFs fs; 
+	User::LeaveIfError(fs.Connect());
+	CleanupClosePushL(fs);
+	__ASSERT_DEBUG(!iCertificateContent, User::Panic(_L("CAddCertificate"), 1));
+	TRAPD(err, iCertificateContent = Input::ReadFileL(fileName, fs));
+	if (err != KErrNone)
+		{
+		iConsole.Printf(_L("Error reading file : "));
+		iConsole.Printf(fileName);
+		iConsole.Printf(_L("\n"));
+		User::Leave(err);
+		}
+	CleanupStack::PopAndDestroy();	// fs
+	}
+
+void CAddCertificate::SetDeletable(const TDesC8& aDeletable)
+	{
+	iDeletableFlagPresent = ETrue;
+	if (aDeletable.Compare(KTrue)==0)
+		{
+		iDeletable = ETrue;
+		}
+	else
+		{
+		iDeletable = EFalse;
+		}
+	}
+
+void CAddCertificate::ConstructCertL(const TDesC8& aCert)
+	{
+	TFileName filename;
+	filename.Copy(aCert);
+	RFs fs; 
+	User::LeaveIfError(fs.Connect());
+	CleanupClosePushL(fs);
+	HBufC8* certBuf = 0;
+	TRAPD(err, certBuf = Input::ReadFileL(filename, fs));
+	if (err != KErrNone)
+		{
+		iConsole.Printf(_L("Error reading file : "));
+		iConsole.Printf(filename);
+		iConsole.Printf(_L("\n"));
+		User::Leave(err);
+		}
+	CleanupStack::PushL(certBuf);
+	switch (iCertificateFormat)
+		{
+		case EX509Certificate:
+			iCertificate = CX509Certificate::NewL(*certBuf);
+			break;
+			
+		case EWTLSCertificate:
+			iCertificate = CWTLSCertificate::NewL(*certBuf);
+			break;
+			
+		default:
+			// Unknown format - do nothing
+			break;
+		}
+	CleanupStack::PopAndDestroy(2);
+	}
+
+void CAddCertificate::DoCheckResult(TInt aError)
+	{
+	
+	if (iFinished)
+		{
+		if (iResult )
+			{
+			if (iExpectedResult == KErrNone )
+				{
+				iConsole.Write(_L("\tcertificate added successfully\n"));
+				iOut.writeString(_L("\tcertificate added successfully"));
+				}
+			else	
+				{
+				iConsole.Write(_L("\tcertificate not added.\n"));
+				iOut.writeString(_L("\tcertificate not added."));
+				}
+			iOut.writeNewLine();
+			iOut.writeNewLine();
+			}
+		else if( !iResult)
+			{
+			if(iExpectedResult == KErrNone )
+				{
+				iConsole.Write(_L("\tcertificate not added\n"));
+				iOut.writeString(_L("\tcertificate not added"));	
+				}
+			else
+				{
+				iConsole.Write(_L("\tcertificate should not be added\n"));
+				iOut.writeString(_L("\tcertificate should not be added"));
+				}
+			iOut.writeNewLine();
+			iOut.writeString(_L("\t"));
+			iOut.writeError(aError);
+			if (aError == KErrBadName)
+				{
+				iOut.writeString(_L(" Check that the label is unique"));
+				}
+			iOut.writeNewLine();
+			iOut.writeNewLine();
+			}
+		}	
+	}
+//////////////////////////////////////////////////////////
+//	Key import, from keystore for adding user certificates
+//////////////////////////////////////////////////////////
+
+CTestAction* CImportKey::NewL(RFs& aFs, 
+							CConsoleBase& aConsole, 
+							Output& aOut,
+							const TTestActionSpec& aTestActionSpec)
+{
+	CTestAction* self = CImportKey::NewLC(aFs, aConsole, aOut, aTestActionSpec);
+	CleanupStack::Pop(self);
+	return self;
+}
+
+CTestAction* CImportKey::NewLC(RFs& aFs,
+							CConsoleBase& aConsole, 
+							Output& aOut,
+							const TTestActionSpec& aTestActionSpec)
+{
+	CImportKey* self = new (ELeave) CImportKey(aFs, aConsole, aOut);
+	CleanupStack::PushL(self);
+	self->ConstructL(aTestActionSpec);
+	return self;
+}
+
+CImportKey::~CImportKey()
+{
+	delete iLabel;
+	delete iKeyData;
+	if (iKeyInfo)
+		{
+		iKeyInfo->Release();
+		}
+	delete iUnifiedKeyStore;
+	iFs.Close();
+}
+
+CImportKey::CImportKey(RFs& aFs, CConsoleBase& aConsole, Output& aOut)
+:	CCertStoreTestAction(aFs, aConsole, aOut),
+	iState(EInitialise)
+{}
+
+
+void CImportKey::ConstructL(const TTestActionSpec& aTestActionSpec)
+{
+	User::LeaveIfError(iFs.Connect());
+
+	CCertStoreTestAction::ConstructL(aTestActionSpec);
+
+	TInt err = KErrNone;
+	TInt pos = 0;
+	SetKeyDataFileL(Input::ParseElement(aTestActionSpec.iActionBody, KImportDataFile, KImportDataFileEnd, pos, err));
+	for (;SetKeyUsage(Input::ParseElement(aTestActionSpec.iActionBody, KKeyUsageStart, KKeyUsageEnd, pos, err));)
+		;
+	
+	SetKeyLabel(Input::ParseElement(aTestActionSpec.iActionBody, KKeyLabelStart, KKeyLabelEnd, pos, err));
+	for (;SetKeyAccessType(Input::ParseElement(aTestActionSpec.iActionBody, KKeyAccessTypeStart, KKeyAccessTypeEnd, pos, err));)
+		;
+	
+	SetKeyPassphrase(Input::ParseElement(aTestActionSpec.iActionBody, KKeyPassphraseStart, KKeyPassphraseEnd, pos, err));
+		
+	pos = 0;
+	
+	HBufC* result = HBufC::NewLC(aTestActionSpec.iActionResult.Length());
+	TPtr(result->Des()).Copy(aTestActionSpec.iActionResult);
+	Input::GetExpectedResultL(Input::ParseElement(*result, KReturnStart, KReturnEnd), iExpectedResult);
+	CleanupStack::PopAndDestroy(result);
+}
+
+TBool CImportKey::SetKeyUsage(const TDesC8& aKeyUsage)
+	{
+	TBool ret = ETrue;
+	if (aKeyUsage.Compare(KAllKeyUsages)==0)
+		iUsage = EPKCS15UsageAll;
+	else if (aKeyUsage.Compare(KAllKeyUsagesButNR)==0)
+		iUsage |= (TKeyUsagePKCS15)(EPKCS15UsageSign) |
+			(TKeyUsagePKCS15)(EPKCS15UsageSignRecover) |
+			(TKeyUsagePKCS15)(EPKCS15UsageDecrypt);
+	else if (aKeyUsage.Compare(KDSAUsage)==0)
+		iUsage |= (TKeyUsagePKCS15)(EPKCS15UsageSign) |
+			(TKeyUsagePKCS15)(EPKCS15UsageSignRecover);
+	else if (aKeyUsage.Compare(KDerive)==0)
+		iUsage |= EPKCS15UsageDerive;
+	else if (aKeyUsage.Compare(KSign)==0)
+		iUsage |= EPKCS15UsageSign;
+	else if (aKeyUsage.Compare(KSignRecover)==0)
+		iUsage |= EPKCS15UsageSignRecover;
+	else if (aKeyUsage.Compare(KDecrypt)==0)
+		iUsage |= EPKCS15UsageDecrypt;
+	else if (aKeyUsage.Compare(KNR)==0)
+		iUsage |= EPKCS15UsageNonRepudiation;
+	else if (aKeyUsage.Compare(KEncipherAndSign)==0)
+		iUsage |= (TKeyUsagePKCS15)(EPKCS15UsageSign) |
+			(TKeyUsagePKCS15)(EPKCS15UsageSignRecover) |
+			(TKeyUsagePKCS15)(EPKCS15UsageUnwrap);
+	else
+		ret = EFalse;
+	return ret;
+	}
+
+void CImportKey::SetKeyLabel(const TDesC8& aKeyLabel)
+{
+	iLabel = HBufC::NewMax(aKeyLabel.Size());
+	if (iLabel)
+	{
+		TPtr theLabel(iLabel->Des());
+		theLabel.FillZ();
+		theLabel.Copy(aKeyLabel);
+	}
+}
+
+
+void CImportKey::SetKeyPassphrase(const TDesC8& aPassphrase)
+	{
+	// If the passphrase is empty, then use "clanger" by default.
+	_LIT8(KDefaultPassphrase, "clanger");
+	TPtrC8 phrase(KDefaultPassphrase());
+	if (aPassphrase.Length())
+		{
+		phrase.Set(aPassphrase);
+		}
+
+
+	RFs fs;
+	RFile file;
+	fs.Connect();
+	
+	// Write the passphrase straight to the file.
+	TDriveUnit sysDrive (fs.GetSystemDrive());
+	TBuf<24> fileName (sysDrive.Name());
+	fileName.Append(_L("\\password.txt"));
+	
+	file.Replace(fs, fileName, EFileWrite);
+	file.Write(phrase);
+	file.Close();
+	fs.Close();
+	}
+
+void CImportKey::SetKeyDataFileL(const TDesC8& aDes)
+{	
+//	Now the filename itself
+	TFileName fileName;
+	fileName.FillZ();
+	fileName.Copy(aDes);
+	
+	TDriveUnit sysDrive (RFs::GetSystemDrive());
+	TBuf<64> buf(sysDrive.Name());
+	buf.Append(_L("\\tcertstore\\data\\"));
+	buf.Append(fileName);
+		
+	RFile file;
+	TInt r = file.Open(iFs, buf, EFileRead);
+	if ( (r==KErrNotFound) || (r==KErrPathNotFound) )
+	{//	Not on c:, try z:
+		buf[0] = 'z';
+		r = file.Open(iFs, buf, EFileRead);
+	}
+
+	User::LeaveIfError(r);
+
+	CleanupClosePushL(file);
+
+	TInt fileSize = 0;
+	User::LeaveIfError(file.Size(fileSize));
+
+	if (fileSize > 0)
+	{
+		iKeyData = HBufC8::NewMaxL(fileSize);	
+		TPtr8 data(iKeyData->Des());
+		data.FillZ();
+		User::LeaveIfError(file.Read(data, fileSize));
+		CleanupStack::Pop(1);
+	}
+
+	file.Close();
+}
+
+TBool CImportKey::SetKeyAccessType(const TDesC8& aKeyAccessType)
+	{
+	TBool ret = ETrue;
+	if (aKeyAccessType.Compare(KExtractable)==0)
+		{
+		iAccessType |= CCTKeyInfo::EExtractable;
+		}
+	else if (aKeyAccessType.Compare(KSensitive)==0)
+		{
+		iAccessType |= CCTKeyInfo::ESensitive;
+		}
+	else if (aKeyAccessType.Compare(KAlwaysSensitive)==0)
+		{
+		iAccessType |= CCTKeyInfo::EAlwaysSensitive;
+		}
+	else if (aKeyAccessType.Compare(KNeverExtractable)==0)
+		{
+		iAccessType |= CCTKeyInfo::ENeverExtractable;
+		}
+	else if (aKeyAccessType.Compare(KLocal)==0)
+		{
+		iAccessType |= CCTKeyInfo::ELocal;
+		}
+	else
+		ret = EFalse;
+	return ret;
+	}
+
+void CImportKey::PerformAction(TRequestStatus& aStatus)
+{
+	TDriveUnit sysDrive (RFs::GetSystemDrive());
+	switch (iState)
+	{
+	case EInitialise:
+		{
+		if (iKeyInfo != NULL)
+			{
+			iKeyInfo->Release();
+			iKeyInfo = NULL;
+			}
+
+		// Delete t_secdlg files - this will then always answer "clanger" for the passphrase
+		    
+		TInt result;
+		TBuf<24> datFile(sysDrive.Name());
+		datFile.Append(_L("\\t_secdlg_in.dat"));
+		result = iFs.Delete(datFile);
+		
+		if (result != KErrNone && result != KErrNotFound)
+			{
+			TRequestStatus* status = &aStatus;
+			User::RequestComplete(status, result);
+			return;
+			}
+			
+		datFile.Copy(sysDrive.Name());
+		datFile.Append(_L("\\t_secdlg_out.dat"));
+		result = iFs.Delete(datFile);
+		
+		if (result != KErrNone && result != KErrNotFound)
+			{
+			TRequestStatus* status = &aStatus;
+			User::RequestComplete(status, result);
+			return;
+			}
+		
+		TRAP(result, iUnifiedKeyStore = CUnifiedKeyStore::NewL(iFs));
+		if ( (result==KErrNone) && (iUnifiedKeyStore) )
+			{
+				iUnifiedKeyStore->Initialize(aStatus);
+				iState = EImportKey;
+			}
+		else
+			{
+				aStatus = result;
+				iState = EFinished;
+			}
+		}
+		break;
+	case EImportKey:
+		{
+			if (KErrNone==aStatus.Int())
+			{
+			//	Currently uses the first store, change to check the script for a specific store
+				iUnifiedKeyStore->ImportKey(0, iKeyData->Des(), iUsage, *iLabel, iAccessType,
+											TTime(0), TTime(0), iKeyInfo, aStatus);			
+			}
+			else
+				{
+				// Errors get passed to next state
+				TRequestStatus* status = &aStatus;
+				User::RequestComplete(status, aStatus.Int());
+				}
+
+			iState = EFinished;
+		}
+		
+		break;
+		
+		case EFinished:
+		{
+			TRequestStatus* status = &aStatus;
+			User::RequestComplete(status, aStatus.Int());
+			if ( (aStatus == iExpectedResult) || (aStatus==KErrAlreadyExists) )
+			{
+				iResult = ETrue;
+			}
+			else
+			{
+				iResult = EFalse;
+			}
+			
+			iFinished = ETrue;
+		}
+		break;
+	}
+}
+
+void CImportKey::PerformCancel()
+{//	To do when test harness cancel comes back.  Currently cancel testing
+//	is performed in RunL with a set of flags and a separate active object
+}
+
+void CImportKey::Reset()
+{}
+
+void CImportKey::DoReportAction()
+{
+	_LIT(KImporting, "Importing key from keystore...");
+	iOut.writeString(KImporting);
+	TPtr theLabel(iLabel->Des());
+	iOut.writeString(theLabel);
+	iOut.writeNewLine();
+}
+
+
+void CImportKey::DoCheckResult(TInt aError)
+{
+	
+	if (iFinished)
+	{
+		if (aError == KErrNone)
+		{
+			_LIT(KSuccessful, "Key imported successfully\n");
+			iConsole.Write(KSuccessful);
+			iOut.writeString(KSuccessful);
+			iOut.writeNewLine();
+			iOut.writeNewLine();
+		}
+		else
+		{
+			if ( (aError!=iExpectedResult) && (aError!=KErrAlreadyExists) )
+			{
+				_LIT(KFailed, "!!!Key import failure!!!\n");
+				iConsole.Write(KFailed);
+				iOut.writeString(KFailed);
+			}
+			
+			iOut.writeNewLine();
+			iOut.writeNewLine();
+		}
+	}
+}
+