cryptoservices/certificateandkeymgmt/tadditionalstores/Test1certstore.cpp
changeset 8 35751d3474b7
parent 0 2c201484c85f
--- a/cryptoservices/certificateandkeymgmt/tadditionalstores/Test1certstore.cpp	Tue Jul 21 01:04:32 2009 +0100
+++ b/cryptoservices/certificateandkeymgmt/tadditionalstores/Test1certstore.cpp	Thu Sep 10 14:01:51 2009 +0300
@@ -1,936 +1,941 @@
-/*
-* Copyright (c) 1998-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 "test1certstore.h"
-#include "tadditionalstoremappings.h"
-#include <signed.h>
-#include <x509cert.h>
-#include <wtlscert.h>
-#include <x509keys.h>
-#include <implementationproxy.h>
-
-
-_LIT(KName1, "Test store 1");
-_LIT(KName2, "Test store 2");
-
-
-//////////////////////////////////////////////////////////////////////////////////////////
-//CFileCertStore
-/////////////////////////////////////////////////////////////////////////////////////////
-
-CTest1CertStore* CTest1CertStore::NewL(RFs& aFs,
-									   CTest1CertStoreToken& aToken, 
-									   const TDesC& aFileName,
-									   TFileMode aMode)
-	{
-	CTest1CertStore* self = new(ELeave) CTest1CertStore(aToken, aFs);
-	CleanupStack::PushL(self);
-	self->ConstructL(aFileName, aMode);
-	CleanupStack::Pop(self);
-	return self;
-	}
-
-MCTToken& CTest1CertStore::Token()
-	{
-	return iToken;
-	}
-
-void CTest1CertStore::DoRelease()
-	{
-	if (iToken.Label() == KName1)
-		{
-		iToken.iRefCountInterface--;
-		if (!iToken.iRefCountInterface)
-			{
-			delete this;
-			}
-		}
-	else if (iToken.Label() == KName2)
-		{
-		iToken.iRefCountInterface2--;
-		if (!iToken.iRefCountInterface2)
-			{
-			delete this;
-			}
-		}
-	}
-
-void CTest1CertStore::List(RMPointerArray<CCTCertInfo>& aCertInfos,
-						  const CCertAttributeFilter& aFilter,
-						  TRequestStatus& aStatus)
-	{
-	iOriginalRequestStatus = &aStatus;
-	aStatus = KRequestPending;
-	
-	iCertInfos = &aCertInfos;
-	iFilter = &aFilter;
-
-	//Iinitialize the ketstore and then list the key info
-	if (iFilter->iKeyUsage != EX509UsageAll)
-		{
-		// We have to initialize the unified key store
-		TRAPD(err, iUnifiedKeyStore = CUnifiedKeyStore::NewL(iFs));
-		if (err != KErrNone)
-			{
-			User::RequestComplete(iOriginalRequestStatus, err);
-			iOriginalRequestStatus = 0;
-			}
-		else
-			{
-			iUnifiedKeyStore->Initialize(iStatus);
-			iState = EGetKeyInfos;
-			SetActive();
-			}
-		}
-	else
-		{
-		iState = EList;
-		TRequestStatus* status = &iStatus;
-		User::RequestComplete(status, KErrNone);
-		SetActive();
-		}
-	}
-
-void CTest1CertStore::CancelList()
-	{
-	Cancel();
-	}
-
-void CTest1CertStore::GetCert(CCTCertInfo*& aCertInfo,
-							 const TCTTokenObjectHandle& aHandle,
-							 TRequestStatus& aStatus)
-	{
-	TInt err = KErrNotFound;
-	if ((aHandle.iTokenHandle == iToken.Handle()) &&
-		(aHandle.iObjectId < iCerts->Count()))
-		{
-		TRAP(err, aCertInfo = CCTCertInfo::NewL(iCerts->Entry(aHandle.iObjectId)));
-		}
-	TRequestStatus* status = &aStatus;
-	User::RequestComplete(status, err);
-	}
-
-void CTest1CertStore::CancelGetCert()
-	{
-	// Nothing to do because GetCert is not asynchronous.
-	}
-
-void CTest1CertStore::Applications(const CCTCertInfo& aCertInfo,
-								  RArray<TUid>& aApplications,
-								  TRequestStatus& aStatus)
-	{
-	TInt err = KErrNone;
-	TInt index = iCerts->Index(aCertInfo);
-	if (index != KErrNotFound)
-		{
-		const RArray<TUid>& apps = iCerts->Mapping(index)->CertificateApps();
-		TInt end = apps.Count();
-		for (TInt i = 0; (i < end) && (err == KErrNone); i++)
-			{
-			err = aApplications.Append(apps[i]);
-			}
-		}
-	else
-		{
-		err = index;
-		}
-	if (err != KErrNone)
-		{
-		aApplications.Reset();
-		}
-	TRequestStatus* status = &aStatus;
-	User::RequestComplete(status, err);
-	}
-
-void CTest1CertStore::CancelApplications()
-	{
-	}
-
-void CTest1CertStore::IsApplicable(const CCTCertInfo& aCertInfo,
-								  TUid aApplication, 
-								  TBool& aIsApplicable,
-								  TRequestStatus& aStatus)
-	{
-	TInt index = iCerts->Index(aCertInfo);
-	if (index != KErrNotFound)
-		{
-		const RArray<TUid>& apps = iCerts->Mapping(index)->CertificateApps();
-		TInt end = apps.Count();
-		TInt i;
-		for (i = 0; i < end; i++)
-			{
-			if (apps[i] == aApplication)
-				{
-				break;
-				}
-			}
-		if (i == end)
-			{
-			aIsApplicable = EFalse;
-			}
-		else
-			{
-			aIsApplicable = ETrue;
-			}
-		index = KErrNone;
-		}
-	
-	TRequestStatus* status = &aStatus;
-	User::RequestComplete(status, index);
-	}
-
-void CTest1CertStore::CancelIsApplicable()
-	{
-	// Nothing to do because IsApplicable is not asynchronous.
-	}
-
-void CTest1CertStore::Trusted(const CCTCertInfo& aCertInfo,
-							 TBool& aTrusted, 
-							 TRequestStatus& aStatus)
-	{	
-	TInt index = iCerts->Index(aCertInfo);
-	if (index != KErrNotFound)
-		{
-		aTrusted = iCerts->Mapping(index)->Trusted();
-		index = KErrNone;
-		}
-	
-	TRequestStatus* status = &aStatus;
-	User::RequestComplete(status, index);
-	}
-
-void CTest1CertStore::CancelTrusted()
-	{
-	// Nothing to do because Trusted is not asynchronous.
-	}
-
-void CTest1CertStore::Retrieve(const CCTCertInfo& aCertInfo,
-							  TDes8& aCertificate,
-							  TRequestStatus& aStatus)
-	{
-#ifdef CERTSTORE_SOFTWARE_ASYNCH
-	// perform an asynchronous retrieval of the certificate
-	iOriginalRequestStatus = &aStatus;
-	aStatus = KRequestPending;
-
-	iAsynchCertInfo = &aCertInfo;
-	iAsynchCertificate = &aCertificate;
-
-	iState = ERetrieve;
-	TRequestStatus* status = &iStatus;
-	User::RequestComplete(status, KErrNone);
-	SetActive();
-#else
-	RetrieveNow(aCertInfo,aCertificate,aStatus);
-#endif
-	}
-
-void CTest1CertStore::RetrieveNow(const CCTCertInfo& aCertInfo,
-							  TDes8& aCertificate,
-							  TRequestStatus& aStatus)
-	{
-	TRequestStatus* status = &aStatus;
-	TInt err;
-	TInt index = iCerts->Index(aCertInfo);
-	if (index == KErrNotFound)
-		{
-		err = KErrNotFound;
-		}
-	else
-		{
-		CFileCertStoreMapping* mapping = NULL;
-		mapping = iCerts->Mapping(index);
-		err = index;
-		if (mapping)
-			{
-			TRAP(err, DoLoadL(aCertificate, *mapping));
-			}
-		}
-	User::RequestComplete(status, err);
-	}
-
-void CTest1CertStore::CancelRetrieve()
-	{
-	}
-
-
-void CTest1CertStore::Capabilities(const CCTCertInfo& /*aCertInfo*/, TCapabilitySet& /*aCapbilitiesOut*/,
-								  TRequestStatus& aStatus)
-	{
-	// currently not supported
-	TRequestStatus* status = &aStatus;
-	User::RequestComplete(status, KErrNotSupported);
-	}
-
-void CTest1CertStore::CancelCapabilities()
-	{
-	// Nothing to do because Capabilities is not asynchronous.
-	}
-
-void CTest1CertStore::IsMandatory(const CCTCertInfo& /*aCertInfo*/, TBool& /*aMandatoryOut*/,
-								 TRequestStatus& aStatus)
-	{
-	// currently not supported
-	TRequestStatus* status = &aStatus;
-	User::RequestComplete(status, KErrNotSupported);
-	}
-
-void CTest1CertStore::CancelIsMandatory()
-	{
-	// Nothing to do because IsMandatory is not asynchronous.
-	}
-
-
-void CTest1CertStore::Remove(const CCTCertInfo& aCertInfo, TRequestStatus& aStatus)
-	{
-	// This removes the certificate from the file store.
-	TRAPD(err, DoRemoveL(aCertInfo));
-	TRequestStatus* status = &aStatus;
-	User::RequestComplete(status, err);
-	}
-
-void CTest1CertStore::CancelRemove()
-	{
-	}
-
-
-void CTest1CertStore::SetApplicability(const CCTCertInfo& aCertInfo,
-									  const RArray<TUid>& aTrusters,
-									  TRequestStatus& aStatus)
-	{
-	TRAPD(err, DoSetApplicabilityL(aCertInfo, aTrusters));
-	TRequestStatus* status = &aStatus;
-	User::RequestComplete(status, err);
-	}
-
-
-void CTest1CertStore::CancelSetApplicability()
-	{
-	}
-
-void CTest1CertStore::SetTrust(const CCTCertInfo& aCertInfo, 
-							  TBool aTrusted, 
-							  TRequestStatus& aStatus)
-	{
-	TRAPD(err, DoSetTrustL(aCertInfo, aTrusted));
-	TRequestStatus* status = &aStatus;
-	User::RequestComplete(status, err);
-	}
-
-void CTest1CertStore::CancelSetTrust()
-	{
-	// Nothing to do because SetTrust is not asynchronous.
-	}
-
-void CTest1CertStore::SetCapabilities(const CCTCertInfo& /*aCertInfo*/, const TCapabilitySet& /*aCapabilities*/, 
-									 TRequestStatus& aStatus)
-	{
-	// currently not supported
-	TRequestStatus* status = &aStatus;
-	User::RequestComplete(status, KErrNotSupported);
-	}
-
-void CTest1CertStore::CancelSetCapabilities()
-	{
-	// Nothing to do because SetCapabilities is not asynchronous.
-	}
-
-void CTest1CertStore::SetMandatory(const CCTCertInfo& /*aCertInfo*/, TBool /*aMandatory*/,
-								  TRequestStatus& aStatus)
-	{
-	// currently not supported
-	TRequestStatus* status = &aStatus;
-	User::RequestComplete(status, KErrNotSupported);
-	}
-
-void CTest1CertStore::CancelSetMandatory()
-	{
-	// Nothing to do because SetMandatory is not asynchronous.
-	}
-
-
-void CTest1CertStore::RevertStore(TAny* aStore)
-	{
-	//this is a CleanupItem
-	CPermanentFileStore* store = REINTERPRET_CAST(CPermanentFileStore*, aStore);
-	store->Revert();
-	}
-
-
-void CTest1CertStore::DeleteFile(TAny* aThis)
-	{
-	CTest1CertStore* self = REINTERPRET_CAST(CTest1CertStore*, aThis);
-	TDriveUnit sysDrive (RFs::GetSystemDrive());
-	TDriveName driveName(sysDrive.Name());
-	TBuf<128> certStoreDefaultFullPath (driveName);
-	certStoreDefaultFullPath.Append(_L("\\system\\data\\cacerts.dat"));
-	self->iFile.Close();
-	self->iFs.Delete(certStoreDefaultFullPath);
-	}
-
-
-
-CTest1CertStore::~CTest1CertStore()
-	{
-	Cancel();
-
-	if (iStore != NULL)
-		{
-#ifdef _DEBUG
-#else		
-		TInt err;
-		TRAP(err, iStore->ReclaimL());
-		TRAP(err, iStore->CompactL());
-		if (err == KErrNone)
-			{
-			TRAP(err, iStore->CommitL());
-			}
-#endif
-		delete iStore;
-		}
-
-	iFile.Close();
-	delete iCerts;
-
-	iKeyInfos.Close();
-
-	delete iUnifiedKeyStore;
-	}
-
-
-void CTest1CertStore::DoSetApplicabilityL(const CCTCertInfo& aCertInfo,
-										 const RArray<TUid>& aTrusters)
-	{
-	TInt index = iCerts->Index(aCertInfo);
-	if (index == KErrNotFound)
-		{
-		User::Leave(index);
-		}
-	
-	CFileCertStoreMapping* mapping = iCerts->Mapping(index);
-	const RArray<TUid>& trusters = mapping->CertificateApps(); //oldEntry->Trusters();
-	RArray<TUid>* oldTrusters = new(ELeave) RArray<TUid>();
-	CleanupStack::PushL(oldTrusters);
-	CleanupClosePushL(*oldTrusters);
-	TInt iEnd = trusters.Count();
-	TInt i;
-	for (i = 0; i < iEnd; i++)
-		{
-		User::LeaveIfError(oldTrusters->Append(trusters[i]));
-		}
-
-	RArray<TUid>* newTrusters = new (ELeave) RArray<TUid>;
-	CleanupStack::PushL(newTrusters);
-	CleanupClosePushL(*newTrusters);
-	for (i = 0 ; i < aTrusters.Count() ; ++i)
-		{
-		User::LeaveIfError(newTrusters->Append(aTrusters[i]));		
-		}
-
-	mapping->SetCertificateApps(newTrusters);
-	CleanupStack::Pop(2, newTrusters);
-
-	TRAPD(err, UpdateStoreL());
-	CleanupStack::Pop(2);	// *oldTrusters, oldTrusters
-	if (err != KErrNone)
-		{
-		// If there is an error, we undo the change in oldEntry
-		mapping->SetCertificateApps(oldTrusters);
-		}
-	else
-		{
-		oldTrusters->Close();
-		delete oldTrusters;
-		}
-	}
-
-
-void CTest1CertStore::DoSetTrustL(const CCTCertInfo& aCertInfo,
-								 TBool aTrusted)
-	{
-	TInt index = iCerts->Index(aCertInfo);
-	if (index == KErrNotFound)
-		{
-		User::Leave(index);
-		}
-	CFileCertStoreMapping* mapping = iCerts->Mapping(index);
-	TBool oldValue = mapping->Trusted();
-	mapping->SetTrusted(aTrusted);
-	TRAPD(err, UpdateStoreL());
-	if (err != KErrNone)
-		{
-		// If there is an error, we undo the change in oldEntry
-		mapping->SetTrusted(oldValue);
-		}
-	}
-
-void CTest1CertStore::Add(const TDesC& aLabel,
-						 TCertificateFormat aFormat,
-						 TCertificateOwnerType aCertificateOwnerType,
-						 const TKeyIdentifier* aSubjectKeyId,
-						 const TKeyIdentifier* aIssuerKeyId,
-						 const TDesC8& aCert, 
-						 TRequestStatus& aStatus)
-	{
-	TRAPD(err, DoAddL(aLabel, aFormat, aCertificateOwnerType, aSubjectKeyId,
-		aIssuerKeyId, aCert));
-	TRequestStatus* status = &aStatus;
-	User::RequestComplete(status, err);
-	}
-
-void CTest1CertStore::CancelAdd()
-	{
-	Cancel();
-	}
-
-void CTest1CertStore::DoAddL(const TDesC& aLabel,
-							TCertificateFormat aFormat,
-							TCertificateOwnerType aCertificateOwnerType,
-							const TKeyIdentifier* aSubjectKeyId,
-							const TKeyIdentifier* aIssuerKeyId,
-							const TDesC8& aCert)
-	{
-	TKeyIdentifier subjectKeyId;
-	switch (aFormat)
-		{
-		case EX509Certificate:
-			if (!aSubjectKeyId)
-				{
-				CCertificate* cert = CX509Certificate::NewLC(aCert);
-				subjectKeyId = cert->KeyIdentifierL();
-				aSubjectKeyId = &subjectKeyId;
-				CleanupStack::PopAndDestroy(cert);
-				}
-			break;
-	
-		case EWTLSCertificate:
-			if (!aSubjectKeyId)
-				{
-				CCertificate* cert = CWTLSCertificate::NewLC(aCert);
-				subjectKeyId = cert->KeyIdentifierL();
-				aSubjectKeyId = &subjectKeyId;
-				CleanupStack::PopAndDestroy(cert);
-				}
-			break;
-
-		case EX509CertificateUrl:
-			if (!aSubjectKeyId)
-				{
-				User::Leave(KErrArgument);
-				}
-			break;
-
-		default:
-			User::Leave(KErrNotSupported);	
-			break;
-		}
-
-
-	TInt iend = iCerts->Count();
-	for (TInt i = 0; i < iend; i++)
-		{
-		if (iCerts->Entry(i).Label() == aLabel)
-			{
-			User::Leave(KErrBadName);
-			}
-		}
-
-	CCTCertInfo* entry = CCTCertInfo::NewL(aLabel, aFormat, 
-		aCertificateOwnerType, aCert.Length(), aSubjectKeyId, aIssuerKeyId, iToken, iCerts->Count());
-	// AddCertL takes ownership of entry no matter what happens.
-	AddCertL(entry, aCert, *iCerts);
-	}
-
-/*void CFileCertStore::AddUserCertL(const CCertificate& aCert, 
-								  const TDesC& aLabel,
-								  TCertificateFormat aFormat, 
-								  const TKeyIdentifier& aIssuerKeyHash, 
-								  const TKeyIdentifier& aSubjectKeyHash)
-	{
-	if (aFormat != EX509Certificate)
-		{
-		User::Leave(KErrNotSupported);
-		}
-
-	TInt iend = iUserCerts->Count();
-	for (TInt i = 0; i < iend; i++)
-		{
-		if (iUserCerts->Entry(i).Label() == aLabel)
-			{
-			User::Leave(KErrBadName);
-			}
-		}
-
-	// We compute the subject key hash using the information contained in the certificate
-	const CSubjectPublicKeyInfo& key = aCert.PublicKey();
-	CX509RSAPublicKey* rsaKey = CX509RSAPublicKey::NewLC(key.KeyData());
-#ifdef SYMBIAN_CRYPTO	
-	const TInteger& modulus = rsaKey->Modulus();
-#else
-	const CInteger& modulus = rsaKey->Modulus();
-#endif
-	HBufC8* modulusBuffer = modulus.BufferLC();
-
-	CSHA1* sha1 = CSHA1::NewL();
-	CleanupStack::PushL(sha1);
-	
-	TPtrC8 hash = sha1->Hash(*modulusBuffer);
-
-
-	TKeyIdentifier keyId;
-	keyId = hash;
-
-	CleanupStack::PopAndDestroy(3);	// rsaKey, modulusBuffer, sha1
-
-	// If the caller supplied a aSubjectKeyHash, we must compare it with the computed
-	// value and ensure they are the same
-	if ((aSubjectKeyHash != KNullDesC8) && (aSubjectKeyHash != keyId))
-		{
-		User::Leave(KErrArgument);
-		}
-	
-	CCTCertInfo* entry = CCTCertInfo::NewL(aLabel, 
-		*this, EX509Certificate, aCert.Encoding().Length(), keyId, aIssuerKeyHash);
-	AddCertL(entry, aCert, *iUserCerts);
-	}*/
-
-/*void CFileCertStore::AddUserCertURLL(const TDesC8& aCert, 
-									 const TDesC& aLabel,
-									 const TKeyIdentifier& aIssuerKeyHash, 
-									 const TKeyIdentifier& aSubjectKeyHash)
-	{
-	TInt iEnd = iUserCerts->Count();
-	for (TInt i = 0; i < iEnd; i++)
-		{
-		if (iUserCerts->Entry(i).Label() == aLabel)
-			{
-			User::Leave(KErrBadName);
-			}
-		}
-
-	CCTCertInfo* entry = CCTCertInfo::NewL(aLabel, 
-		*this, EX509CertificateUrl, aCert.Length(), aSubjectKeyHash, aIssuerKeyHash);
-	AddCertL(entry, aCert, *iUserCerts);
-	}*/
-
-void CTest1CertStore::AddCertL(CCTCertInfo* aCertInfo,
-							  const TDesC8& aCert,
-							  CFileCertStoreMappings& aMappings)
-	{
-	CleanupReleasePushL(*aCertInfo);
-//create the mapping object		
-	CFileCertStoreMapping* mapping = CFileCertStoreMapping::NewL();
-	mapping->SetEntry(aCertInfo);
-	CleanupStack::Pop();//aEntry, mapping has taken ownership
-	CleanupStack::PushL(mapping);
-
-	TCleanupItem cleanupStore(CTest1CertStore::RevertStore, iStore);//store will revert() if a leave occurs
-	CleanupStack::PushL(cleanupStore);
-
-//store cert
-	RStoreWriteStream stream;
-	TStreamId certId = stream.CreateLC(*iStore);//stream for cert
-	stream.WriteL(aCert);
-	stream.CommitL();
-	CleanupStack::PopAndDestroy();//stream
-	mapping->SetId(certId);
-
-//add mapping to mappings, & store mappings
-	aMappings.AddL(mapping); //takes ownership
-	CleanupStack::Pop();//mapping; mappings has taken ownership
-
-//Update the mapping. if error, remove the entry.
-	TRAPD(err, aMappings.ReplaceL());
-	if (err == KErrNone)
-		{
-		TRAP(err, iStore->CommitL());
-		if (err != KErrNone)
-			{
-			aMappings.Remove(*mapping->Entry());
-			User::Leave(err);
-			}
-		}
-	else
-		{
-		//oom tests pass currently
-		aMappings.Remove(*mapping->Entry());
-		User::Leave(err);
-		}
-	CleanupStack::Pop();//revert store
-	}
-
-void CTest1CertStore::UpdateStoreL()
-	{
-//tries to write out the new cacerts to the file
-	TCleanupItem cleanupStore(RevertStore, iStore);//store will revert() if a leave occurs
-	CleanupStack::PushL(cleanupStore);
-	iCerts->ReplaceL();
-	iStore->CommitL();
-	CleanupStack::Pop();//revert store
-	}
-
-
-
-
-
-void CTest1CertStore::DoLoadL(TDes8& aCertificate, CFileCertStoreMapping& aMapping) const
-	{
-	RStoreReadStream stream;
-	stream.OpenLC(*iStore, aMapping.Id());
-	CCTCertInfo* entry = aMapping.Entry();
-	stream.ReadL(aCertificate, entry->Size());
-	CleanupStack::PopAndDestroy();//stream
-	}
-
-void CTest1CertStore::DoRemoveL(const CCTCertInfo& aCertInfo)
-	{
-	switch(aCertInfo.CertificateFormat())
-		{
-		case EWTLSCertificate://must be a CA cert
-		case EX509CertificateUrl:
-		case EX509Certificate:
-			User::LeaveIfError(iCerts->SetTempRemove(aCertInfo, ETrue));
-			break;
-			
-		default:
-			{
-			User::Leave(KErrNotSupported);
-			}
-		}
-	TRAPD(err, UpdateStoreL());
-	if (err != KErrNone)
-		{
-		User::LeaveIfError(iCerts->SetTempRemove(aCertInfo, EFalse));
-		}
-	else
-		{
-		User::LeaveIfError(iCerts->Remove(aCertInfo));	
-		}
-	}
-
-//private functions
-CTest1CertStore::CTest1CertStore(CTest1CertStoreToken& aToken, RFs& aFs)
-	: CActive(EPriorityNormal), iToken(aToken), iFs(aFs)
-	{
-	CActiveScheduler::Add(this);
-	}
-
-void CTest1CertStore::ConstructL(const TDesC& aFileName, TFileMode aMode)
-	{
-	iStore = OpenStoreL(aFileName, aMode);
-	RestoreL();
-	}
-
-void CTest1CertStore::RestoreL()
-	{
-	TStreamId caCertEntryStreamId;
-	RStoreReadStream stream;
-	stream.OpenLC(*iStore, iStore->Root());
-
-	stream >> caCertEntryStreamId;
-	CleanupStack::PopAndDestroy();//stream
-
-	iCerts = CFileCertStoreMappings::NewL(caCertEntryStreamId, *iStore);
-	RStoreReadStream caCertEntryStream;
-	caCertEntryStream.OpenLC(*iStore, caCertEntryStreamId);
-
-	TInt caCount = caCertEntryStream.ReadInt32L();
-	for (TInt i = 0; i < caCount; i++)
-		{
-		CFileCertStoreMapping* caCertMapping = CFileCertStoreMapping::NewL();
-		CleanupStack::PushL(caCertMapping);
-		CCTCertInfo* caCertEntry = CCTCertInfo::NewLC(caCertEntryStream, iToken);
-		caCertMapping->SetEntry(caCertEntry);
-		CleanupStack::Pop();//caCertEntry
-		// Read the CertificateApps uids
-		RArray<TUid>* certificateApps = new(ELeave) RArray<TUid>();
-		CleanupStack::PushL(certificateApps);
-		CleanupClosePushL(*certificateApps);
-		TInt count = caCertEntryStream.ReadInt32L();
-		for (TInt j = 0; j < count; j++)
-			{
-			TUid id;
-			caCertEntryStream >> id;
-			User::LeaveIfError(certificateApps->Append(id));
-			}
-		CleanupStack::Pop(2);	// *certificateApps, certificateApps
-		caCertMapping->SetCertificateApps(certificateApps);
-		TBool trusted = caCertEntryStream.ReadUint8L();
-		caCertMapping->SetTrusted(trusted);
-		TStreamId caCertStreamId;
-		caCertEntryStream >> caCertStreamId;
-		caCertMapping->SetId(caCertStreamId);
-		iCerts->AddL(caCertMapping);
-		CleanupStack::Pop();//caCertMapping
-		}
-	CleanupStack::PopAndDestroy();//caCertStream
-	}
-
-
-
-
-
-CPermanentFileStore* CTest1CertStore::OpenStoreLC(const TDesC& aFileName, TFileMode aMode)
-	{
-//this function creates, opens and returns a permanent file store in KCertStorePath,
-//on the drive letter passed in, leaving it on the cleanup stack. 
-//if the store isn't found it returns NULL
-	TInt err = iFile.Open(iFs, aFileName, aMode); 	
-    if (err == KErrNone)
-		{
-		CPermanentFileStore* store = CPermanentFileStore::FromLC(iFile);
-		return store;
-		}
-	else
-		{
-		User::Leave(err);
-		}
-	return NULL;
-	}
-
-CPermanentFileStore* CTest1CertStore::OpenStoreL(const TDesC& aFileName, TFileMode aMode)
-	{
-	CPermanentFileStore* store = NULL;
-	store = OpenStoreLC(aFileName, aMode);	
-	CleanupStack::Pop(store);
-	return store;
-	}
-
-void CTest1CertStore::RunL()
-	{
-	switch (iState)
-		{
-	case EGetKeyInfos:
-		iKeyFilter.iUsage = KeyUsageX509ToPKCS15Private(iFilter->iKeyUsage);
-		iUnifiedKeyStore->List(iKeyInfos, iKeyFilter, iStatus);
-		iState = EList;
-		SetActive();
-		break;
-
-	case ERetrieve:
-		// Asynch Retrieve 
-		RetrieveNow(*iAsynchCertInfo,*iAsynchCertificate,*iOriginalRequestStatus);
-		break;
-
-	case EList:
-		{	
-		TInt count = iCerts->Count();
-		for (TInt index = 0; index < count; index++)
-			{
-			const CCTCertInfo& certInfo = iCerts->Entry(index);
-			
-			TBool accept = ETrue;
-			if (iFilter->iUidIsSet)
-				{
-				accept = iCerts->Mapping(index)->IsApplicable(iFilter->iUid);
-				}
-			if (iFilter->iFormatIsSet && accept)
-				{
-				accept = (iFilter->iFormat == certInfo.CertificateFormat());
-				}
-			if (iFilter->iOwnerTypeIsSet && accept)
-				{
-				accept = (iFilter->iOwnerType == certInfo.CertificateOwnerType());
-				}
-			if ((iFilter->iSubjectKeyId != KNullDesC8) && accept)
-				{
-				accept = (iFilter->iSubjectKeyId == certInfo.SubjectKeyId());
-				}
-			
-			if (accept)
-				{
-				// Fill in the cert hash.
-				// (This returns an incorrect hard-coded value, which allows 
-				// the test code to check that the store is being treated
-				// correctly as a hardware store, as it'll behave differently
-				// to if it returned the correct hashes.)
-				_LIT8(KHash, "\x70\xe4\xf4\x54\x5f\x8e\xe6\xf2\xbd\x4e\x76\x2b\x8d\xa1\x83\xd8\xe0\x5d\x4a\x7d");
-				CCTCertInfo* copy = CCTCertInfo::NewLC(
-					certInfo.Label(), certInfo.CertificateFormat(),
-					certInfo.CertificateOwnerType(), certInfo.Size(),
-					&certInfo.SubjectKeyId(), &certInfo.IssuerKeyId(),
-					certInfo.Token(), certInfo.Handle().iObjectId,
-					ETrue, &KHash);
-				User::LeaveIfError(iCertInfos->Append(copy));
-				CleanupStack::Pop();
-				}
-			}
-		iKeyInfos.Close();
-		delete iUnifiedKeyStore;
-		iUnifiedKeyStore = 0;
-		User::RequestComplete(iOriginalRequestStatus, KErrNone);
-		}
-		break;
-
-	default:
-		// ignore the undefined operations
-		break;
-		}
-	}
-
-void CTest1CertStore::DoCancel()
-	{
-	if (iUnifiedKeyStore)
-		{
-		if (iState == EGetKeyInfos)
-			{
-			iUnifiedKeyStore->CancelInitialize();
-			}
-		else if (iState == EList)
-			{
-			iUnifiedKeyStore->CancelList();
-			}
-		iState = EList;
-		iKeyInfos.Close();
-		delete iUnifiedKeyStore;
-		iUnifiedKeyStore = 0;
-		}
-	User::RequestComplete(iOriginalRequestStatus, KErrCancel);
-	}
-
-const TImplementationProxy ImplementationTable[] =
-	{
-#ifdef CERTSTORE_SOFTWARE_ASYNCH
-		IMPLEMENTATION_PROXY_ENTRY(0x101FF738, CTest1CertStoreTokenType::NewL)
-#else
-	#ifdef CERTSTORE_HARDWARE_SIM
-		IMPLEMENTATION_PROXY_ENTRY(0x10206846, CTest1CertStoreTokenType::NewL)
-	#else
-		#ifdef CERTSTORE_HARDWARE_WIM
-			IMPLEMENTATION_PROXY_ENTRY(0x10206847, CTest1CertStoreTokenType::NewL)
-		#else
-			#ifdef CERTSTORE_HARDWARE_UICC
-				IMPLEMENTATION_PROXY_ENTRY(0x10206848, CTest1CertStoreTokenType::NewL)
- 			#else
-				#ifdef CERTSTORE_DEVICE_IMMUTABLE
-					IMPLEMENTATION_PROXY_ENTRY(0x102077C3, CTest1CertStoreTokenType::NewL)
-				#else
-					IMPLEMENTATION_PROXY_ENTRY(0x101F5279, CTest1CertStoreTokenType::NewL)
-				#endif
- 			#endif
-		#endif
-	#endif
-#endif
-	};
-
-EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount)
-	{
-	aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy);
-
-	return ImplementationTable;
-	}
+/*
+* Copyright (c) 1998-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 "test1certstore.h"
+#include "tadditionalstoremappings.h"
+#include <signed.h>
+#include <x509cert.h>
+#include <wtlscert.h>
+#include <x509keys.h>
+#include <ecom/implementationproxy.h>
+
+
+_LIT(KName1, "Test store 1");
+_LIT(KName2, "Test store 2");
+
+
+//////////////////////////////////////////////////////////////////////////////////////////
+//CFileCertStore
+/////////////////////////////////////////////////////////////////////////////////////////
+
+CTest1CertStore* CTest1CertStore::NewL(RFs& aFs,
+									   CTest1CertStoreToken& aToken, 
+									   const TDesC& aFileName,
+									   TFileMode aMode)
+	{
+	CTest1CertStore* self = new(ELeave) CTest1CertStore(aToken, aFs);
+	CleanupStack::PushL(self);
+	self->ConstructL(aFileName, aMode);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+MCTToken& CTest1CertStore::Token()
+	{
+	return iToken;
+	}
+
+void CTest1CertStore::DoRelease()
+	{
+	if (iToken.Label() == KName1)
+		{
+		iToken.iRefCountInterface--;
+		if (!iToken.iRefCountInterface)
+			{
+			delete this;
+			}
+		}
+	else if (iToken.Label() == KName2)
+		{
+		iToken.iRefCountInterface2--;
+		if (!iToken.iRefCountInterface2)
+			{
+			delete this;
+			}
+		}
+	}
+
+void CTest1CertStore::List(RMPointerArray<CCTCertInfo>& aCertInfos,
+						  const CCertAttributeFilter& aFilter,
+						  TRequestStatus& aStatus)
+	{
+	iOriginalRequestStatus = &aStatus;
+	aStatus = KRequestPending;
+	
+	iCertInfos = &aCertInfos;
+	iFilter = &aFilter;
+
+	//Iinitialize the ketstore and then list the key info
+	if (iFilter->iKeyUsage != EX509UsageAll)
+		{
+		// We have to initialize the unified key store
+		TRAPD(err, iUnifiedKeyStore = CUnifiedKeyStore::NewL(iFs));
+		if (err != KErrNone)
+			{
+			User::RequestComplete(iOriginalRequestStatus, err);
+			iOriginalRequestStatus = 0;
+			}
+		else
+			{
+			iUnifiedKeyStore->Initialize(iStatus);
+			iState = EGetKeyInfos;
+			SetActive();
+			}
+		}
+	else
+		{
+		iState = EList;
+		TRequestStatus* status = &iStatus;
+		User::RequestComplete(status, KErrNone);
+		SetActive();
+		}
+	}
+
+void CTest1CertStore::CancelList()
+	{
+	Cancel();
+	}
+
+void CTest1CertStore::GetCert(CCTCertInfo*& aCertInfo,
+							 const TCTTokenObjectHandle& aHandle,
+							 TRequestStatus& aStatus)
+	{
+	TInt err = KErrNotFound;
+	if ((aHandle.iTokenHandle == iToken.Handle()) &&
+		(aHandle.iObjectId < iCerts->Count()))
+		{
+		TRAP(err, aCertInfo = CCTCertInfo::NewL(iCerts->Entry(aHandle.iObjectId)));
+		}
+	TRequestStatus* status = &aStatus;
+	User::RequestComplete(status, err);
+	}
+
+void CTest1CertStore::CancelGetCert()
+	{
+	// Nothing to do because GetCert is not asynchronous.
+	}
+
+void CTest1CertStore::Applications(const CCTCertInfo& aCertInfo,
+								  RArray<TUid>& aApplications,
+								  TRequestStatus& aStatus)
+	{
+	TInt err = KErrNone;
+	TInt index = iCerts->Index(aCertInfo);
+	if (index != KErrNotFound)
+		{
+		const RArray<TUid>& apps = iCerts->Mapping(index)->CertificateApps();
+		TInt end = apps.Count();
+		for (TInt i = 0; (i < end) && (err == KErrNone); i++)
+			{
+			err = aApplications.Append(apps[i]);
+			}
+		}
+	else
+		{
+		err = index;
+		}
+	if (err != KErrNone)
+		{
+		aApplications.Reset();
+		}
+	TRequestStatus* status = &aStatus;
+	User::RequestComplete(status, err);
+	}
+
+void CTest1CertStore::CancelApplications()
+	{
+	}
+
+void CTest1CertStore::IsApplicable(const CCTCertInfo& aCertInfo,
+								  TUid aApplication, 
+								  TBool& aIsApplicable,
+								  TRequestStatus& aStatus)
+	{
+	TInt index = iCerts->Index(aCertInfo);
+	if (index != KErrNotFound)
+		{
+		const RArray<TUid>& apps = iCerts->Mapping(index)->CertificateApps();
+		TInt end = apps.Count();
+		TInt i;
+		for (i = 0; i < end; i++)
+			{
+			if (apps[i] == aApplication)
+				{
+				break;
+				}
+			}
+		if (i == end)
+			{
+			aIsApplicable = EFalse;
+			}
+		else
+			{
+			aIsApplicable = ETrue;
+			}
+		index = KErrNone;
+		}
+	
+	TRequestStatus* status = &aStatus;
+	User::RequestComplete(status, index);
+	}
+
+void CTest1CertStore::CancelIsApplicable()
+	{
+	// Nothing to do because IsApplicable is not asynchronous.
+	}
+
+void CTest1CertStore::Trusted(const CCTCertInfo& aCertInfo,
+							 TBool& aTrusted, 
+							 TRequestStatus& aStatus)
+	{	
+	TInt index = iCerts->Index(aCertInfo);
+	if (index != KErrNotFound)
+		{
+		aTrusted = iCerts->Mapping(index)->Trusted();
+		index = KErrNone;
+		}
+	
+	TRequestStatus* status = &aStatus;
+	User::RequestComplete(status, index);
+	}
+
+void CTest1CertStore::CancelTrusted()
+	{
+	// Nothing to do because Trusted is not asynchronous.
+	}
+
+void CTest1CertStore::Retrieve(const CCTCertInfo& aCertInfo,
+							  TDes8& aCertificate,
+							  TRequestStatus& aStatus)
+	{
+#ifdef CERTSTORE_SOFTWARE_ASYNCH
+	// perform an asynchronous retrieval of the certificate
+	iOriginalRequestStatus = &aStatus;
+	aStatus = KRequestPending;
+
+	iAsynchCertInfo = &aCertInfo;
+	iAsynchCertificate = &aCertificate;
+
+	iState = ERetrieve;
+	TRequestStatus* status = &iStatus;
+	User::RequestComplete(status, KErrNone);
+	SetActive();
+#else
+	RetrieveNow(aCertInfo,aCertificate,aStatus);
+#endif
+	}
+
+void CTest1CertStore::RetrieveNow(const CCTCertInfo& aCertInfo,
+							  TDes8& aCertificate,
+							  TRequestStatus& aStatus)
+	{
+	TRequestStatus* status = &aStatus;
+	TInt err;
+	TInt index = iCerts->Index(aCertInfo);
+	if (index == KErrNotFound)
+		{
+		err = KErrNotFound;
+		}
+	else
+		{
+		CFileCertStoreMapping* mapping = NULL;
+		mapping = iCerts->Mapping(index);
+		err = index;
+		if (mapping)
+			{
+			TRAP(err, DoLoadL(aCertificate, *mapping));
+			}
+		}
+	User::RequestComplete(status, err);
+	}
+
+void CTest1CertStore::CancelRetrieve()
+	{
+	}
+
+
+void CTest1CertStore::Capabilities(const CCTCertInfo& /*aCertInfo*/, TCapabilitySet& /*aCapbilitiesOut*/,
+								  TRequestStatus& aStatus)
+	{
+	// currently not supported
+	TRequestStatus* status = &aStatus;
+	User::RequestComplete(status, KErrNotSupported);
+	}
+
+void CTest1CertStore::CancelCapabilities()
+	{
+	// Nothing to do because Capabilities is not asynchronous.
+	}
+
+void CTest1CertStore::IsMandatory(const CCTCertInfo& /*aCertInfo*/, TBool& /*aMandatoryOut*/,
+								 TRequestStatus& aStatus)
+	{
+	// currently not supported
+	TRequestStatus* status = &aStatus;
+	User::RequestComplete(status, KErrNotSupported);
+	}
+
+void CTest1CertStore::CancelIsMandatory()
+	{
+	// Nothing to do because IsMandatory is not asynchronous.
+	}
+
+
+void CTest1CertStore::Remove(const CCTCertInfo& aCertInfo, TRequestStatus& aStatus)
+	{
+	// This removes the certificate from the file store.
+	TRAPD(err, DoRemoveL(aCertInfo));
+	TRequestStatus* status = &aStatus;
+	User::RequestComplete(status, err);
+	}
+
+void CTest1CertStore::CancelRemove()
+	{
+	}
+
+
+void CTest1CertStore::SetApplicability(const CCTCertInfo& aCertInfo,
+									  const RArray<TUid>& aTrusters,
+									  TRequestStatus& aStatus)
+	{
+	TRAPD(err, DoSetApplicabilityL(aCertInfo, aTrusters));
+	TRequestStatus* status = &aStatus;
+	User::RequestComplete(status, err);
+	}
+
+
+void CTest1CertStore::CancelSetApplicability()
+	{
+	}
+
+void CTest1CertStore::SetTrust(const CCTCertInfo& aCertInfo, 
+							  TBool aTrusted, 
+							  TRequestStatus& aStatus)
+	{
+	TRAPD(err, DoSetTrustL(aCertInfo, aTrusted));
+	TRequestStatus* status = &aStatus;
+	User::RequestComplete(status, err);
+	}
+
+void CTest1CertStore::CancelSetTrust()
+	{
+	// Nothing to do because SetTrust is not asynchronous.
+	}
+
+void CTest1CertStore::SetCapabilities(const CCTCertInfo& /*aCertInfo*/, const TCapabilitySet& /*aCapabilities*/, 
+									 TRequestStatus& aStatus)
+	{
+	// currently not supported
+	TRequestStatus* status = &aStatus;
+	User::RequestComplete(status, KErrNotSupported);
+	}
+
+void CTest1CertStore::CancelSetCapabilities()
+	{
+	// Nothing to do because SetCapabilities is not asynchronous.
+	}
+
+void CTest1CertStore::SetMandatory(const CCTCertInfo& /*aCertInfo*/, TBool /*aMandatory*/,
+								  TRequestStatus& aStatus)
+	{
+	// currently not supported
+	TRequestStatus* status = &aStatus;
+	User::RequestComplete(status, KErrNotSupported);
+	}
+
+void CTest1CertStore::CancelSetMandatory()
+	{
+	// Nothing to do because SetMandatory is not asynchronous.
+	}
+
+
+void CTest1CertStore::RevertStore(TAny* aStore)
+	{
+	//this is a CleanupItem
+	CPermanentFileStore* store = REINTERPRET_CAST(CPermanentFileStore*, aStore);
+	store->Revert();
+	}
+
+
+void CTest1CertStore::DeleteFile(TAny* aThis)
+	{
+	CTest1CertStore* self = REINTERPRET_CAST(CTest1CertStore*, aThis);
+	TDriveUnit sysDrive (RFs::GetSystemDrive());
+	TDriveName driveName(sysDrive.Name());
+	TBuf<128> certStoreDefaultFullPath (driveName);
+	certStoreDefaultFullPath.Append(_L("\\system\\data\\cacerts.dat"));
+	self->iFile.Close();
+	self->iFs.Delete(certStoreDefaultFullPath);
+	}
+
+
+
+CTest1CertStore::~CTest1CertStore()
+	{
+	Cancel();
+
+	if (iStore != NULL)
+		{
+#ifdef _DEBUG
+#else		
+		TInt err;
+		TRAP(err, iStore->ReclaimL());
+		TRAP(err, iStore->CompactL());
+		if (err == KErrNone)
+			{
+			TRAP(err, iStore->CommitL());
+			}
+#endif
+		delete iStore;
+		}
+
+	iFile.Close();
+	delete iCerts;
+
+	iKeyInfos.Close();
+
+	delete iUnifiedKeyStore;
+	}
+
+
+void CTest1CertStore::DoSetApplicabilityL(const CCTCertInfo& aCertInfo,
+										 const RArray<TUid>& aTrusters)
+	{
+	TInt index = iCerts->Index(aCertInfo);
+	if (index == KErrNotFound)
+		{
+		User::Leave(index);
+		}
+	
+	CFileCertStoreMapping* mapping = iCerts->Mapping(index);
+	const RArray<TUid>& trusters = mapping->CertificateApps(); //oldEntry->Trusters();
+	RArray<TUid>* oldTrusters = new(ELeave) RArray<TUid>();
+	CleanupStack::PushL(oldTrusters);
+	CleanupClosePushL(*oldTrusters);
+	TInt iEnd = trusters.Count();
+	TInt i;
+	for (i = 0; i < iEnd; i++)
+		{
+		User::LeaveIfError(oldTrusters->Append(trusters[i]));
+		}
+
+	RArray<TUid>* newTrusters = new (ELeave) RArray<TUid>;
+	CleanupStack::PushL(newTrusters);
+	CleanupClosePushL(*newTrusters);
+	for (i = 0 ; i < aTrusters.Count() ; ++i)
+		{
+		User::LeaveIfError(newTrusters->Append(aTrusters[i]));		
+		}
+
+	mapping->SetCertificateApps(newTrusters);
+	CleanupStack::Pop(2, newTrusters);
+
+	TRAPD(err, UpdateStoreL());
+	CleanupStack::Pop(2);	// *oldTrusters, oldTrusters
+	if (err != KErrNone)
+		{
+		// If there is an error, we undo the change in oldEntry
+		mapping->SetCertificateApps(oldTrusters);
+		}
+	else
+		{
+		oldTrusters->Close();
+		delete oldTrusters;
+		}
+	}
+
+
+void CTest1CertStore::DoSetTrustL(const CCTCertInfo& aCertInfo,
+								 TBool aTrusted)
+	{
+	TInt index = iCerts->Index(aCertInfo);
+	if (index == KErrNotFound)
+		{
+		User::Leave(index);
+		}
+	CFileCertStoreMapping* mapping = iCerts->Mapping(index);
+	TBool oldValue = mapping->Trusted();
+	mapping->SetTrusted(aTrusted);
+	TRAPD(err, UpdateStoreL());
+	if (err != KErrNone)
+		{
+		// If there is an error, we undo the change in oldEntry
+		mapping->SetTrusted(oldValue);
+		}
+	}
+
+void CTest1CertStore::Add(const TDesC& aLabel,
+						 TCertificateFormat aFormat,
+						 TCertificateOwnerType aCertificateOwnerType,
+						 const TKeyIdentifier* aSubjectKeyId,
+						 const TKeyIdentifier* aIssuerKeyId,
+						 const TDesC8& aCert, 
+						 TRequestStatus& aStatus)
+	{
+	TRAPD(err, DoAddL(aLabel, aFormat, aCertificateOwnerType, aSubjectKeyId,
+		aIssuerKeyId, aCert));
+	TRequestStatus* status = &aStatus;
+	User::RequestComplete(status, err);
+	}
+
+void CTest1CertStore::CancelAdd()
+	{
+	Cancel();
+	}
+
+void CTest1CertStore::DoAddL(const TDesC& aLabel,
+							TCertificateFormat aFormat,
+							TCertificateOwnerType aCertificateOwnerType,
+							const TKeyIdentifier* aSubjectKeyId,
+							const TKeyIdentifier* aIssuerKeyId,
+							const TDesC8& aCert)
+	{
+	TKeyIdentifier subjectKeyId;
+	switch (aFormat)
+		{
+		case EX509Certificate:
+			if (!aSubjectKeyId)
+				{
+				CCertificate* cert = CX509Certificate::NewLC(aCert);
+				subjectKeyId = cert->KeyIdentifierL();
+				aSubjectKeyId = &subjectKeyId;
+				CleanupStack::PopAndDestroy(cert);
+				}
+			break;
+	
+		case EWTLSCertificate:
+			if (!aSubjectKeyId)
+				{
+				CCertificate* cert = CWTLSCertificate::NewLC(aCert);
+				subjectKeyId = cert->KeyIdentifierL();
+				aSubjectKeyId = &subjectKeyId;
+				CleanupStack::PopAndDestroy(cert);
+				}
+			break;
+
+		case EX509CertificateUrl:
+			if (!aSubjectKeyId)
+				{
+				User::Leave(KErrArgument);
+				}
+			break;
+
+		default:
+			User::Leave(KErrNotSupported);	
+			break;
+		}
+
+
+	TInt iend = iCerts->Count();
+	for (TInt i = 0; i < iend; i++)
+		{
+		if (iCerts->Entry(i).Label() == aLabel)
+			{
+			User::Leave(KErrBadName);
+			}
+		}
+
+	CCTCertInfo* entry = CCTCertInfo::NewL(aLabel, aFormat, 
+		aCertificateOwnerType, aCert.Length(), aSubjectKeyId, aIssuerKeyId, iToken, iCerts->Count());
+	// AddCertL takes ownership of entry no matter what happens.
+	AddCertL(entry, aCert, *iCerts);
+	}
+
+/*void CFileCertStore::AddUserCertL(const CCertificate& aCert, 
+								  const TDesC& aLabel,
+								  TCertificateFormat aFormat, 
+								  const TKeyIdentifier& aIssuerKeyHash, 
+								  const TKeyIdentifier& aSubjectKeyHash)
+	{
+	if (aFormat != EX509Certificate)
+		{
+		User::Leave(KErrNotSupported);
+		}
+
+	TInt iend = iUserCerts->Count();
+	for (TInt i = 0; i < iend; i++)
+		{
+		if (iUserCerts->Entry(i).Label() == aLabel)
+			{
+			User::Leave(KErrBadName);
+			}
+		}
+
+	// We compute the subject key hash using the information contained in the certificate
+	const CSubjectPublicKeyInfo& key = aCert.PublicKey();
+	CX509RSAPublicKey* rsaKey = CX509RSAPublicKey::NewLC(key.KeyData());
+#ifdef SYMBIAN_CRYPTO	
+	const TInteger& modulus = rsaKey->Modulus();
+#else
+	const CInteger& modulus = rsaKey->Modulus();
+#endif
+	HBufC8* modulusBuffer = modulus.BufferLC();
+
+	CSHA1* sha1 = CSHA1::NewL();
+	CleanupStack::PushL(sha1);
+	
+	TPtrC8 hash = sha1->Hash(*modulusBuffer);
+
+
+	TKeyIdentifier keyId;
+	keyId = hash;
+
+	CleanupStack::PopAndDestroy(3);	// rsaKey, modulusBuffer, sha1
+
+	// If the caller supplied a aSubjectKeyHash, we must compare it with the computed
+	// value and ensure they are the same
+	if ((aSubjectKeyHash != KNullDesC8) && (aSubjectKeyHash != keyId))
+		{
+		User::Leave(KErrArgument);
+		}
+	
+	CCTCertInfo* entry = CCTCertInfo::NewL(aLabel, 
+		*this, EX509Certificate, aCert.Encoding().Length(), keyId, aIssuerKeyHash);
+	AddCertL(entry, aCert, *iUserCerts);
+	}*/
+
+/*void CFileCertStore::AddUserCertURLL(const TDesC8& aCert, 
+									 const TDesC& aLabel,
+									 const TKeyIdentifier& aIssuerKeyHash, 
+									 const TKeyIdentifier& aSubjectKeyHash)
+	{
+	TInt iEnd = iUserCerts->Count();
+	for (TInt i = 0; i < iEnd; i++)
+		{
+		if (iUserCerts->Entry(i).Label() == aLabel)
+			{
+			User::Leave(KErrBadName);
+			}
+		}
+
+	CCTCertInfo* entry = CCTCertInfo::NewL(aLabel, 
+		*this, EX509CertificateUrl, aCert.Length(), aSubjectKeyHash, aIssuerKeyHash);
+	AddCertL(entry, aCert, *iUserCerts);
+	}*/
+
+void CTest1CertStore::AddCertL(CCTCertInfo* aCertInfo,
+							  const TDesC8& aCert,
+							  CFileCertStoreMappings& aMappings)
+	{
+	CleanupReleasePushL(*aCertInfo);
+//create the mapping object		
+	CFileCertStoreMapping* mapping = CFileCertStoreMapping::NewL();
+	mapping->SetEntry(aCertInfo);
+	CleanupStack::Pop();//aEntry, mapping has taken ownership
+	CleanupStack::PushL(mapping);
+
+	TCleanupItem cleanupStore(CTest1CertStore::RevertStore, iStore);//store will revert() if a leave occurs
+	CleanupStack::PushL(cleanupStore);
+
+//store cert
+	RStoreWriteStream stream;
+	TStreamId certId = stream.CreateLC(*iStore);//stream for cert
+	stream.WriteL(aCert);
+	stream.CommitL();
+	CleanupStack::PopAndDestroy();//stream
+	mapping->SetId(certId);
+
+//add mapping to mappings, & store mappings
+	aMappings.AddL(mapping); //takes ownership
+	CleanupStack::Pop();//mapping; mappings has taken ownership
+
+//Update the mapping. if error, remove the entry.
+	TRAPD(err, aMappings.ReplaceL());
+	if (err == KErrNone)
+		{
+		TRAP(err, iStore->CommitL());
+		if (err != KErrNone)
+			{
+			aMappings.Remove(*mapping->Entry());
+			User::Leave(err);
+			}
+		}
+	else
+		{
+		//oom tests pass currently
+		aMappings.Remove(*mapping->Entry());
+		User::Leave(err);
+		}
+	CleanupStack::Pop();//revert store
+	}
+
+void CTest1CertStore::UpdateStoreL()
+	{
+//tries to write out the new cacerts to the file
+	TCleanupItem cleanupStore(RevertStore, iStore);//store will revert() if a leave occurs
+	CleanupStack::PushL(cleanupStore);
+	iCerts->ReplaceL();
+	iStore->CommitL();
+	CleanupStack::Pop();//revert store
+	}
+
+
+
+
+
+void CTest1CertStore::DoLoadL(TDes8& aCertificate, CFileCertStoreMapping& aMapping) const
+	{
+	RStoreReadStream stream;
+	stream.OpenLC(*iStore, aMapping.Id());
+	CCTCertInfo* entry = aMapping.Entry();
+	stream.ReadL(aCertificate, entry->Size());
+	CleanupStack::PopAndDestroy();//stream
+	}
+
+void CTest1CertStore::DoRemoveL(const CCTCertInfo& aCertInfo)
+	{
+	switch(aCertInfo.CertificateFormat())
+		{
+		case EWTLSCertificate://must be a CA cert
+		case EX509CertificateUrl:
+		case EX509Certificate:
+			User::LeaveIfError(iCerts->SetTempRemove(aCertInfo, ETrue));
+			break;
+			
+		default:
+			{
+			User::Leave(KErrNotSupported);
+			}
+		}
+	TRAPD(err, UpdateStoreL());
+	if (err != KErrNone)
+		{
+		User::LeaveIfError(iCerts->SetTempRemove(aCertInfo, EFalse));
+		}
+	else
+		{
+		User::LeaveIfError(iCerts->Remove(aCertInfo));	
+		}
+	}
+
+//private functions
+CTest1CertStore::CTest1CertStore(CTest1CertStoreToken& aToken, RFs& aFs)
+	: CActive(EPriorityNormal), iToken(aToken), iFs(aFs)
+	{
+	CActiveScheduler::Add(this);
+	}
+
+void CTest1CertStore::ConstructL(const TDesC& aFileName, TFileMode aMode)
+	{
+	iStore = OpenStoreL(aFileName, aMode);
+	RestoreL();
+	}
+
+void CTest1CertStore::RestoreL()
+	{
+	TStreamId caCertEntryStreamId;
+	RStoreReadStream stream;
+	stream.OpenLC(*iStore, iStore->Root());
+
+	stream >> caCertEntryStreamId;
+	CleanupStack::PopAndDestroy();//stream
+
+	iCerts = CFileCertStoreMappings::NewL(caCertEntryStreamId, *iStore);
+	RStoreReadStream caCertEntryStream;
+	caCertEntryStream.OpenLC(*iStore, caCertEntryStreamId);
+
+	TInt caCount = caCertEntryStream.ReadInt32L();
+	for (TInt i = 0; i < caCount; i++)
+		{
+		CFileCertStoreMapping* caCertMapping = CFileCertStoreMapping::NewL();
+		CleanupStack::PushL(caCertMapping);
+		CCTCertInfo* caCertEntry = CCTCertInfo::NewLC(caCertEntryStream, iToken);
+		caCertMapping->SetEntry(caCertEntry);
+		CleanupStack::Pop();//caCertEntry
+		// Read the CertificateApps uids
+		RArray<TUid>* certificateApps = new(ELeave) RArray<TUid>();
+		CleanupStack::PushL(certificateApps);
+		CleanupClosePushL(*certificateApps);
+		TInt count = caCertEntryStream.ReadInt32L();
+		for (TInt j = 0; j < count; j++)
+			{
+			TUid id;
+			caCertEntryStream >> id;
+			User::LeaveIfError(certificateApps->Append(id));
+			}
+		CleanupStack::Pop(2);	// *certificateApps, certificateApps
+		caCertMapping->SetCertificateApps(certificateApps);
+		TBool trusted = caCertEntryStream.ReadUint8L();
+		caCertMapping->SetTrusted(trusted);
+		TStreamId caCertStreamId;
+		caCertEntryStream >> caCertStreamId;
+		caCertMapping->SetId(caCertStreamId);
+		iCerts->AddL(caCertMapping);
+		CleanupStack::Pop();//caCertMapping
+		}
+	CleanupStack::PopAndDestroy();//caCertStream
+	}
+
+
+
+
+
+CPermanentFileStore* CTest1CertStore::OpenStoreLC(const TDesC& aFileName, TFileMode aMode)
+	{
+//this function creates, opens and returns a permanent file store in KCertStorePath,
+//on the drive letter passed in, leaving it on the cleanup stack. 
+//if the store isn't found it returns NULL
+	TInt err = iFile.Open(iFs, aFileName, aMode); 	
+    if (err == KErrNone)
+		{
+		CPermanentFileStore* store = CPermanentFileStore::FromLC(iFile);
+		return store;
+		}
+	else
+		{
+		User::Leave(err);
+		}
+	return NULL;
+	}
+
+CPermanentFileStore* CTest1CertStore::OpenStoreL(const TDesC& aFileName, TFileMode aMode)
+	{
+	CPermanentFileStore* store = NULL;
+	store = OpenStoreLC(aFileName, aMode);	
+	CleanupStack::Pop(store);
+	return store;
+	}
+
+void CTest1CertStore::RunL()
+	{
+	switch (iState)
+		{
+	case EGetKeyInfos:
+		iKeyFilter.iUsage = KeyUsageX509ToPKCS15Private(iFilter->iKeyUsage);
+		iUnifiedKeyStore->List(iKeyInfos, iKeyFilter, iStatus);
+		iState = EList;
+		SetActive();
+		break;
+
+	case ERetrieve:
+		// Asynch Retrieve 
+		RetrieveNow(*iAsynchCertInfo,*iAsynchCertificate,*iOriginalRequestStatus);
+		break;
+
+	case EList:
+		{	
+		TInt count = iCerts->Count();
+		for (TInt index = 0; index < count; index++)
+			{
+			const CCTCertInfo& certInfo = iCerts->Entry(index);
+			
+			TBool accept = ETrue;
+			if (iFilter->iUidIsSet)
+				{
+				accept = iCerts->Mapping(index)->IsApplicable(iFilter->iUid);
+				}
+			if (iFilter->iFormatIsSet && accept)
+				{
+				accept = (iFilter->iFormat == certInfo.CertificateFormat());
+				}
+			if (iFilter->iOwnerTypeIsSet && accept)
+				{
+				accept = (iFilter->iOwnerType == certInfo.CertificateOwnerType());
+				}
+			if ((iFilter->iSubjectKeyId != KNullDesC8) && accept)
+				{
+				accept = (iFilter->iSubjectKeyId == certInfo.SubjectKeyId());
+				}
+			
+			if (accept)
+				{
+				// Fill in the cert hash.
+				// (This returns an incorrect hard-coded value, which allows 
+				// the test code to check that the store is being treated
+				// correctly as a hardware store, as it'll behave differently
+				// to if it returned the correct hashes.)
+				_LIT8(KHash, "\x70\xe4\xf4\x54\x5f\x8e\xe6\xf2\xbd\x4e\x76\x2b\x8d\xa1\x83\xd8\xe0\x5d\x4a\x7d");
+				CCTCertInfo* copy = CCTCertInfo::NewLC(
+					certInfo.Label(), certInfo.CertificateFormat(),
+					certInfo.CertificateOwnerType(), certInfo.Size(),
+					&certInfo.SubjectKeyId(), &certInfo.IssuerKeyId(),
+					certInfo.Token(), certInfo.Handle().iObjectId,
+					ETrue, &KHash);
+				User::LeaveIfError(iCertInfos->Append(copy));
+				CleanupStack::Pop();
+				}
+			}
+		iKeyInfos.Close();
+		delete iUnifiedKeyStore;
+		iUnifiedKeyStore = 0;
+		User::RequestComplete(iOriginalRequestStatus, KErrNone);
+		}
+		break;
+
+	default:
+		// ignore the undefined operations
+		break;
+		}
+	}
+
+void CTest1CertStore::DoCancel()
+	{
+	if (iUnifiedKeyStore)
+		{
+		if (iState == EGetKeyInfos)
+			{
+			iUnifiedKeyStore->CancelInitialize();
+			}
+		else if (iState == EList)
+			{
+			iUnifiedKeyStore->CancelList();
+			}
+		iState = EList;
+		iKeyInfos.Close();
+		delete iUnifiedKeyStore;
+		iUnifiedKeyStore = 0;
+		}
+	User::RequestComplete(iOriginalRequestStatus, KErrCancel);
+	}
+
+const TImplementationProxy ImplementationTable[] =
+	{
+#ifdef CERTSTORE_SOFTWARE_ASYNCH
+		IMPLEMENTATION_PROXY_ENTRY(0x101FF738, CTest1CertStoreTokenType::NewL)
+#else
+	#ifdef CERTSTORE_HARDWARE_SIM
+		IMPLEMENTATION_PROXY_ENTRY(0x10206846, CTest1CertStoreTokenType::NewL)
+	#else
+		#ifdef CERTSTORE_HARDWARE_WIM
+			IMPLEMENTATION_PROXY_ENTRY(0x10206847, CTest1CertStoreTokenType::NewL)
+		#else
+			#ifdef CERTSTORE_HARDWARE_UICC
+				IMPLEMENTATION_PROXY_ENTRY(0x10206848, CTest1CertStoreTokenType::NewL)
+ 			#else
+				#ifdef CERTSTORE_DEVICE_IMMUTABLE
+					IMPLEMENTATION_PROXY_ENTRY(0x102077C3, CTest1CertStoreTokenType::NewL)
+				#else
+					IMPLEMENTATION_PROXY_ENTRY(0x101F5279, CTest1CertStoreTokenType::NewL)
+				#endif
+ 			#endif
+		#endif
+	#endif
+#endif
+	};
+
+EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount)
+	{
+	aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy);
+
+	return ImplementationTable;
+	}
+
+
+
+
+