cryptoservices/certificateandkeymgmt/twtlscert/ValidateTest.cpp
changeset 8 35751d3474b7
parent 0 2c201484c85f
--- a/cryptoservices/certificateandkeymgmt/twtlscert/ValidateTest.cpp	Tue Jul 21 01:04:32 2009 +0100
+++ b/cryptoservices/certificateandkeymgmt/twtlscert/ValidateTest.cpp	Thu Sep 10 14:01:51 2009 +0300
@@ -1,589 +1,590 @@
-/*
-* 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 "ValidateTest.h"
-#include "t_input.h"
-#include <ecom.h>
-
-_LIT(KPath, "");
-_LIT(KChainStart, "<chain>");
-_LIT(KDateIssuedStart, "<dateissued>");
-_LIT(KIOStart, "<io>");
-
-CTestAction* CValidateTest::NewL(RFs& aFs, CConsoleBase& aConsole, 
-		Output& aOut, const TTestActionSpec& aTestActionSpec)
-	{
-	CTestAction* self = CValidateTest::NewLC(aFs, aConsole, aOut, aTestActionSpec);
-	CleanupStack::Pop(self);
-	return self;
-	}
-
-CTestAction* CValidateTest::NewLC(RFs& aFs, CConsoleBase& aConsole, 
-		Output& aOut, const TTestActionSpec& aTestActionSpec)
-	{
-	CValidateTest* self = new(ELeave) CValidateTest(aFs, aConsole, aOut);
-	CleanupStack::PushL(self);
-	self->ConstructL(aTestActionSpec);
-	return self;
-	}
-
-
-void CValidateTest::TestValidation(TRequestStatus& aStatus)
-	{
-	iOriginalRequestStatus = &aStatus;
-	aStatus = KRequestPending;
-
-	iState = EInit;
-	TRequestStatus* status = &aStatus;
-	User::RequestComplete(status, KErrNone);
-	}
-
-CValidateTest::CValidateTest(RFs& aFs, 
-								 CConsoleBase& aConsole,
-								 Output& aOut)
-: CTestAction(aConsole, aOut), iFs(aFs)
-	{
-	}
-
-void CValidateTest::ConstructL(const TTestActionSpec& aTestActionSpec)
-	{
-	CTestAction::ConstructL(aTestActionSpec);
-	iValidationResult = CWTLSValidationResult::NewL();
-	HBufC* aBody = HBufC::NewLC(aTestActionSpec.iActionBody.Length());
-	aBody->Des().Copy(aTestActionSpec.iActionBody);
-	// creates the test chan validation object
-	iTestChain = CTestChainValidate::NewL();
-	TPtrC chainBuf = Input::ParseElement(*aBody, KChainStart);
-	
-	iTestChain->AddChainL(chainBuf);
-	TPtrC ioDateIssued = Input::ParseElement(*aBody, KDateIssuedStart);
-	iTestChain->AddDateIssued(ioDateIssued);
-	TPtrC ioBuf = Input::ParseElement(*aBody, KIOStart);
-	iTestChain->AddIOL(ioBuf);
-
-	CleanupStack::PopAndDestroy(aBody);
-	}
-
-CValidateTest::~CValidateTest()
-	{
-	delete iTestChain;
-	delete iCertUtils;
-	delete iValidationResult;
-	delete iChain;
-	REComSession::FinalClose();
-	}
-
-void CValidateTest::DoPerformPrerequisite(TRequestStatus& aStatus)
-	{
-	TInt err = KErrNone;
-	
-	switch (iState)
-		{
-		case EInit:
-			iResult = ETrue;
-			__ASSERT_DEBUG(!iCertUtils, User::Panic(_L("TWTLSCertTest"), 1));
-			iCertUtils = CCertUtils::NewL(iFs);
-			TRAP(err, HandleEInitL(aStatus));
-			break;
-
-		case EValidationStoreInitStoreManager1:
-			TRAP(err, HandleEValidationInitStoreManager1L(aStatus));
-			iActionState = EAction;
-			break;		
-		case EValidationStoreDepopulateStore1:
-		case EValidationStorePopulateStoreRoots:
-		case EValidationStorePopulateStoreExtras:
-		case EValidationStoreValidate:
-		case EValidationStoreValidated:
-		case EValidationStoreInitStoreManager2:
-		case EValidationStoreDepopulateStore2:
-		case EValidationStoreEnd:
-		case EValidationSuppliedInit:
-		case EValidationSuppliedValidate:
-		case EValidationSuppliedValidated:
-		case EFinished:
-			break;	//	Nothing to do, for compiler
-		}
-	}
-
-void CValidateTest::DoPerformPostrequisite(TRequestStatus& aStatus)
-	{
-	TInt err = KErrNone;
-
-	switch (iState)
-		{
-	case EInit:
-	case EValidationStoreInitStoreManager1:
-	case EValidationStoreDepopulateStore1:
-	case EValidationStorePopulateStoreRoots:
-	case EValidationStorePopulateStoreExtras:
-	case EValidationStoreValidate:
-	case EValidationStoreValidated:
-	case EValidationStoreInitStoreManager2:
-	case EValidationStoreDepopulateStore2:
-	case EValidationStoreEnd:
-		break;	//	Nothing to do, for compiler
-	case EValidationSuppliedInit:
-			{
-			iConsole.Printf(_L("started with supplied certs...\n"));
-			iOut.writeString(_L("started with supplied certs..."));
-			iOut.writeNewLine();
-
-			iState = EValidationSuppliedValidate;
-			TRequestStatus* status = &aStatus;
-			User::RequestComplete(status, KErrNone);
-			}
-			break;
-
-		case EValidationSuppliedValidate:
-			{
-			HBufC8* encodedCerts = ReadFilesLC(*iTestChain->iServerCerts);
-
-			if(!encodedCerts)
-				{
-				TRequestStatus* status = &aStatus;
-				iFinished = ETrue;
-				User::RequestComplete(status, KErrNone);
-				}
-			else
-				{
-				TInt certCount = iTestChain->iRootCerts->MdcaCount();
-				CArrayPtrFlat<CWTLSCertificate>* roots = 
-					new(ELeave) CArrayPtrFlat<CWTLSCertificate>(1);
-				TCleanupItem cleanup(CleanupCertArray, roots);
-				CleanupStack::PushL(cleanup);
-				for (TInt i = 0; i < certCount; i++)
-					{
-					// build the root certificates array including all the candidates.
-					HBufC8* encCert = 
-						ReadFileLC(iTestChain->iRootCerts->MdcaPoint(i));
-					CWTLSCertificate* cert = CWTLSCertificate::NewLC(encCert->Des());
-					roots->AppendL(cert);
-					CleanupStack::Pop();	// cert
-					CleanupStack::PopAndDestroy();	// encCert
-					}
-
-				__ASSERT_DEBUG(!iChain, User::Panic(_L("CValidateTest"), 1));
-				iChain = CWTLSCertChain::NewL(iFs, *encodedCerts, *roots);
-
-				CleanupStack::PopAndDestroy(2);	// encodedCerts, roots
-
-				TDateTime dt(2000, EJuly, 0, 0, 0, 0, 0);
-				if(iTestChain->iDateIssued == 1)
-					{
-					dt.SetYear(2002);
-					}
-				iTime = dt;
-				
-				iChain->ValidateL(*iValidationResult, iTime, aStatus);
-				iState = EValidationSuppliedValidated;
-				}
-			}
-			break;
-
-		case EValidationSuppliedValidated:
-			{
-			delete iChain;
-			iChain = 0;
-			TWTLSValidationStatus* expectedStatus = iTestChain->iError;
-			const TWTLSValidationStatus& actualStatus = iValidationResult->Error();
-
-			iOut.writeString(_L("Expected Error = "));
-			WriteError(expectedStatus->iReason);
-			iOut.writeNewLine();
-
-			iOut.writeString(_L("Actual Error = "));
-			WriteError(actualStatus.iReason);
-			iOut.writeNewLine();
-					
-			TInt wCount = iTestChain->iWarnings->Count();
-			iOut.writeString(_L("Expected Warnings = "));
-			iOut.writeNewLine();
-			for (TInt i = 0; i < wCount; i++)
-				{
-				TWTLSValidationStatus warning = iTestChain->iWarnings->At(i);
-				WriteError(warning.iReason);
-				iOut.writeNewLine();
-				}
-
-			iOut.writeString(_L("Actual Warnings = "));
-			iOut.writeNewLine();
-			const CArrayFixFlat<TWTLSValidationStatus>& warnings = 
-				iValidationResult->Warnings();
-			wCount = warnings.Count();
-			for (TInt j = 0; j < wCount; j++)
-				{
-				TWTLSValidationStatus warning = warnings.At(j);
-				WriteError(warning.iReason);
-				iOut.writeNewLine();
-				}
-			iOut.writeNewLine();
-
-			if(expectedStatus->iReason != actualStatus.iReason)
-				{
-				iConsole.Printf(_L("FAILED!!!!\n"));
-				iOut.writeString(_L("FAILED!!!!"));
-				iOut.writeNewLine();
-				iResult = EFalse;
-				}
-		
-			// End of validatewith supplied
-			if (err != KErrNone)
-				{
-				iOut.writeString(_L("Failed: leave code = "));
-				iOut.writeNum(err);
-				iOut.writeNewLine();
-				}
-
-			iState = EFinished;
-			TRequestStatus* status = &aStatus;
-			User::RequestComplete(status, KErrNone);
-			}
-			break;
-
-		case EFinished:
-			{
-			TTime end;
-			end.HomeTime();
-			TTimeIntervalMicroSeconds intervalMS = end.MicroSecondsFrom(iStart);
-			iConsole.Printf(_L("Time taken = %d milliseconds\n"), (intervalMS.Int64()/1000));
-	
-			TRequestStatus* status = &aStatus;
-			iFinished = ETrue;
-			User::RequestComplete(status, KErrNone);
-			}
-			break;
-		}
-	}
-
-void CValidateTest::PerformAction(TRequestStatus& aStatus)
-	{
-	TRequestStatus* status = &aStatus;
-
-	switch (iState)
-		{
-		case EValidationStoreDepopulateStore1:
-			{
-			iCertUtils->RemoveCertsL(aStatus);
-			iState = EValidationStorePopulateStoreRoots;
-			break;
-			}
-
-		case EValidationStorePopulateStoreRoots:
-			{
-			TUid uid = { 1 };
-			TRAP_IGNORE(iCertUtils->RemoveApplicationL(uid));
-			iCertUtils->AddApplicationL(_L("testwtls"), uid);
-			iCertUtils->AddCACertsL(*iTestChain->iRootCerts, 
-				*iTestChain->iRootLabels, EWTLSCertificate, 1, KPath, aStatus);
-			iState = EValidationStorePopulateStoreExtras;
-			break;
-			}
-
-		case EValidationStorePopulateStoreExtras:
-			{
-			iCertUtils->AddCACertsL(*iTestChain->iExtraCerts, 
-				*iTestChain->iExtraLabels, EWTLSCertificate, 2, KPath, aStatus);
-			iState = EValidationStoreValidate;
-			break;
-			}
-
-		case EValidationStoreValidate:
-			{
-			HBufC8* encodedCerts = ReadFilesLC(*iTestChain->iServerCerts);
-
-			TUid testUid = TUid::Uid(1);
-
-			if(!encodedCerts)
-				{
-				TRequestStatus* status = &aStatus;
-				iFinished = ETrue;
-				User::RequestComplete(status, KErrNone);
-				}
-			else
-				{
-				__ASSERT_DEBUG(!iChain, User::Panic(_L("CValidateTest"), 1));
-				iChain = CWTLSCertChain::NewL(iFs, *encodedCerts, testUid);
-				CleanupStack::PopAndDestroy();	// encodedCerts
-
-				TDateTime dt(2000, EJuly, 0, 0, 0, 0, 0);
-				if(iTestChain->iDateIssued == 1)
-					{
-					dt.SetYear(2002);
-					}
-				iTime = dt;
-
-				TRAP_IGNORE(iChain->ValidateL(*iValidationResult, iTime, aStatus));
-				iState = EValidationStoreValidated;
-				};
-			break;
-			}
-			
-		case EValidationStoreValidated:
-			{
-			TInt count = iChain->Count();
-			if (count > 0)
-				{
-				iOut.writeString(_L("EE certificate = "));
-				const CWTLSCertificate& eeCert = iChain->Cert(0);
-				HBufC* eeSubject = eeCert.SubjectL();
-				CleanupStack::PushL(eeSubject);
-				iOut.writeString(*eeSubject);
-				CleanupStack::PopAndDestroy();
-				iOut.writeNewLine();
-				for (TInt i = 1; i < count - 1; i++)
-					{
-					iOut.writeString(_L("Intermediate certificate = "));
-					const CWTLSCertificate& iCert = iChain->Cert(i);
-					HBufC* subject = iCert.SubjectL();
-					CleanupStack::PushL(subject);
-					iOut.writeString(*subject);
-					CleanupStack::PopAndDestroy();
-					iOut.writeNewLine();	
-					}
-				iOut.writeString(_L("Root certificate = "));
-				const CWTLSCertificate& rCert = iChain->Cert(count-1);
-				HBufC* rSubject = rCert.SubjectL();
-				CleanupStack::PushL(rSubject);
-				iOut.writeString(*rSubject);
-				CleanupStack::PopAndDestroy();
-				iOut.writeNewLine();	
-				}
-
-			TWTLSValidationStatus* expectedStatus = iTestChain->iError;
-			const TWTLSValidationStatus& actualStatus = iValidationResult->Error();
-
-			iOut.writeString(_L("Expected Error = "));
-			WriteError(expectedStatus->iReason);
-			iOut.writeNewLine();
-
-			iOut.writeString(_L("Actual Error = "));
-			WriteError(actualStatus.iReason);
-			iOut.writeNewLine();
-			
-			TInt wCount = iTestChain->iWarnings->Count();
-			iOut.writeString(_L("Expected Warnings = "));
-			iOut.writeNewLine();
-			for (TInt i = 0; i < wCount; i++)
-				{
-				TWTLSValidationStatus warning = iTestChain->iWarnings->At(i);
-				WriteError(warning.iReason);
-				iOut.writeNewLine();
-				}
-
-			iOut.writeString(_L("Actual Warnings = "));
-			iOut.writeNewLine();
-			const CArrayFixFlat<TWTLSValidationStatus>& warnings = 
-				iValidationResult->Warnings();
-			wCount = warnings.Count();
-			for (TInt j = 0; j < wCount; j++)
-				{
-				TWTLSValidationStatus warning = warnings.At(j);
-				WriteError(warning.iReason);
-				iOut.writeNewLine();
-				}
-			iOut.writeNewLine();
-			
-			if(expectedStatus->iReason != actualStatus.iReason)
-				{
-				iConsole.Printf(_L("FAILED!!!!\n"));
-				iOut.writeString(_L("FAILED!!!!"));
-				iOut.writeNewLine();
-				iResult = EFalse;
-				}
-
-			// End of DoValidate
-			iState = EValidationStoreInitStoreManager2;				
-			User::RequestComplete(status, KErrNone);
-			delete iChain;
-			iChain = 0;
-			break;
-			}
-
-		case EValidationStoreInitStoreManager2:
-			{
-			User::RequestComplete(status, KErrNone);
-			iState = EValidationStoreDepopulateStore2;
-			break;
-			}
-
-		case EValidationStoreDepopulateStore2:
-			{
-			iCertUtils->RemoveCertsL(aStatus);
-			TUid uid = { 1 };
-			iCertUtils->RemoveApplicationL(uid);
-			iState = EValidationStoreEnd;
-			break;
-			}
-
-		case EValidationStoreEnd:
-			{
-			iState = EValidationSuppliedInit;
-			iActionState = EPostrequisite;
-			User::RequestComplete(status, KErrNone);
-			break;
-			}
-		case EInit:
-		case EValidationStoreInitStoreManager1:
-		case EValidationSuppliedInit:
-		case EValidationSuppliedValidate:
-		case EValidationSuppliedValidated:
-		case EFinished:
-			break;	//	Nothing to do, for compiler
-		}
-	}
-
-HBufC8* CValidateTest::ReadFileLC(const TDesC& aFilename)
-	{
-	RFile file;
-	User::LeaveIfError(file.Open(iFs, aFilename, EFileRead));
-	CleanupClosePushL(file);
-	TInt size;
-	file.Size(size);
-	CleanupStack::PopAndDestroy(1);//fileClose
-
-	HBufC8* res = HBufC8::NewLC(size);
-	TPtr8 p(res->Des());
-	p.SetLength(size);
-
-	RFileReadStream stream;
-	User::LeaveIfError(stream.Open(iFs, aFilename, EFileStream));
-	CleanupClosePushL(stream);
-	stream.ReadL(p, size);
-	CleanupStack::PopAndDestroy();//streamClose...bleurgh
-	return res;
-	}
-
-
-HBufC8* CValidateTest::ReadFilesLC(CDesCArray& aServerCerts)
-	{
-	TInt count = aServerCerts.MdcaCount();
-	TInt totalSize = 0;
-	TInt i;
-
-	for (i = 0; i < count; i++)
-		{
-		TPtrC filename = aServerCerts.MdcaPoint(i);
-		RFile file;
-		TRAPD(err, file.Open(iFs, filename, EFileRead));
-		if(err != KErrNone)
-			{
-			HBufC *failedToLoad = filename.AllocLC();
-			SetScriptError(EFileNotFound, failedToLoad->Des());
-			CleanupStack::PopAndDestroy(2);//fsclose, fileClose	
-			return(NULL);
-			};
-		CleanupClosePushL(file);
-		TInt size;
-		file.Size(size);
-		CleanupStack::PopAndDestroy(1);	//	fileClose
-		totalSize += size;
-		}
-
-	HBufC8* res = HBufC8::NewLC(totalSize);
-	TPtr8 pRes = res->Des();
-	for (i = 0; i < count; i++)
-		{
-		HBufC8* cert = ReadFileLC(aServerCerts.MdcaPoint(i));
-		pRes.Append(cert->Des());
-		CleanupStack::PopAndDestroy();//cert
-		}
-	return res;
-	}
-
-void CValidateTest::WriteError(TValidationError aError)
-	{
-	switch(aError)
-		{
-		//errors
-		case EValidatedOK:
-			{
-			iOut.writeString(_L("Validated OK"));
-			break;
-			}
-		case EChainHasNoRoot:
-			{
-			iOut.writeString(_L("No trusted root found"));
-			break;
-			}
-		case ESignatureInvalid:
-			{
-			iOut.writeString(_L("Signature invalid"));
-			break;
-			}
-		case EDateOutOfRange:
-			{
-			iOut.writeString(_L("Date out of range"));
-			break;
-			}
-		case ENamesDontChain:
-			{
-			iOut.writeString(_L("Names don't chain"));
-			break;
-			}
-		case ENotCACert:
-			{
-			iOut.writeString(_L("Cert not authorised to sign other certs"));
-			break;
-			}
-
-		default:
-			{
-			iOut.writeString(_L("Unknown"));
-			break;
-			}
-		}
-	}
-
-void CValidateTest::CleanupCertArray(TAny* aCertArray)
-	{
-	CArrayPtrFlat<CWTLSCertificate>* certs = REINTERPRET_CAST(CArrayPtrFlat<CWTLSCertificate>*, aCertArray);
-	certs->ResetAndDestroy();
-	delete certs;
-	}
-
-void CValidateTest::HandleEInitL(TRequestStatus& aStatus)
-	{
-	iConsole.Printf(_L("Chain validation tests...\n"));
-	iStart.HomeTime();
-
-	iConsole.Printf(_L("started with store...\n"));
-	iOut.writeString(_L("started with store..."));
-	iOut.writeNewLine();
-
-	iState = EValidationStoreInitStoreManager1;
-	TRequestStatus* status = &aStatus;
-	User::RequestComplete(status, KErrNone);
-	}
-
-void CValidateTest::HandleEValidationInitStoreManager1L(TRequestStatus& aStatus)
-	{
-	TRequestStatus* status = &aStatus;
-	User::RequestComplete(status, KErrNone);
-	iState = EValidationStoreDepopulateStore1;
-	}
-
-
-void CValidateTest::DoReportAction()
-	{
-	}
-
-void CValidateTest::DoCheckResult(TInt /*aError*/)
-	{
-	}
+/*
+* 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 "ValidateTest.h"
+#include "t_input.h"
+#include <ecom/ecom.h>
+
+_LIT(KPath, "");
+_LIT(KChainStart, "<chain>");
+_LIT(KDateIssuedStart, "<dateissued>");
+_LIT(KIOStart, "<io>");
+
+CTestAction* CValidateTest::NewL(RFs& aFs, CConsoleBase& aConsole, 
+		Output& aOut, const TTestActionSpec& aTestActionSpec)
+	{
+	CTestAction* self = CValidateTest::NewLC(aFs, aConsole, aOut, aTestActionSpec);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CTestAction* CValidateTest::NewLC(RFs& aFs, CConsoleBase& aConsole, 
+		Output& aOut, const TTestActionSpec& aTestActionSpec)
+	{
+	CValidateTest* self = new(ELeave) CValidateTest(aFs, aConsole, aOut);
+	CleanupStack::PushL(self);
+	self->ConstructL(aTestActionSpec);
+	return self;
+	}
+
+
+void CValidateTest::TestValidation(TRequestStatus& aStatus)
+	{
+	iOriginalRequestStatus = &aStatus;
+	aStatus = KRequestPending;
+
+	iState = EInit;
+	TRequestStatus* status = &aStatus;
+	User::RequestComplete(status, KErrNone);
+	}
+
+CValidateTest::CValidateTest(RFs& aFs, 
+								 CConsoleBase& aConsole,
+								 Output& aOut)
+: CTestAction(aConsole, aOut), iFs(aFs)
+	{
+	}
+
+void CValidateTest::ConstructL(const TTestActionSpec& aTestActionSpec)
+	{
+	CTestAction::ConstructL(aTestActionSpec);
+	iValidationResult = CWTLSValidationResult::NewL();
+	HBufC* aBody = HBufC::NewLC(aTestActionSpec.iActionBody.Length());
+	aBody->Des().Copy(aTestActionSpec.iActionBody);
+	// creates the test chan validation object
+	iTestChain = CTestChainValidate::NewL();
+	TPtrC chainBuf = Input::ParseElement(*aBody, KChainStart);
+	
+	iTestChain->AddChainL(chainBuf);
+	TPtrC ioDateIssued = Input::ParseElement(*aBody, KDateIssuedStart);
+	iTestChain->AddDateIssued(ioDateIssued);
+	TPtrC ioBuf = Input::ParseElement(*aBody, KIOStart);
+	iTestChain->AddIOL(ioBuf);
+
+	CleanupStack::PopAndDestroy(aBody);
+	}
+
+CValidateTest::~CValidateTest()
+	{
+	delete iTestChain;
+	delete iCertUtils;
+	delete iValidationResult;
+	delete iChain;
+	REComSession::FinalClose();
+	}
+
+void CValidateTest::DoPerformPrerequisite(TRequestStatus& aStatus)
+	{
+	TInt err = KErrNone;
+	
+	switch (iState)
+		{
+		case EInit:
+			iResult = ETrue;
+			__ASSERT_DEBUG(!iCertUtils, User::Panic(_L("TWTLSCertTest"), 1));
+			iCertUtils = CCertUtils::NewL(iFs);
+			TRAP(err, HandleEInitL(aStatus));
+			break;
+
+		case EValidationStoreInitStoreManager1:
+			TRAP(err, HandleEValidationInitStoreManager1L(aStatus));
+			iActionState = EAction;
+			break;		
+		case EValidationStoreDepopulateStore1:
+		case EValidationStorePopulateStoreRoots:
+		case EValidationStorePopulateStoreExtras:
+		case EValidationStoreValidate:
+		case EValidationStoreValidated:
+		case EValidationStoreInitStoreManager2:
+		case EValidationStoreDepopulateStore2:
+		case EValidationStoreEnd:
+		case EValidationSuppliedInit:
+		case EValidationSuppliedValidate:
+		case EValidationSuppliedValidated:
+		case EFinished:
+			break;	//	Nothing to do, for compiler
+		}
+	}
+
+void CValidateTest::DoPerformPostrequisite(TRequestStatus& aStatus)
+	{
+	TInt err = KErrNone;
+
+	switch (iState)
+		{
+	case EInit:
+	case EValidationStoreInitStoreManager1:
+	case EValidationStoreDepopulateStore1:
+	case EValidationStorePopulateStoreRoots:
+	case EValidationStorePopulateStoreExtras:
+	case EValidationStoreValidate:
+	case EValidationStoreValidated:
+	case EValidationStoreInitStoreManager2:
+	case EValidationStoreDepopulateStore2:
+	case EValidationStoreEnd:
+		break;	//	Nothing to do, for compiler
+	case EValidationSuppliedInit:
+			{
+			iConsole.Printf(_L("started with supplied certs...\n"));
+			iOut.writeString(_L("started with supplied certs..."));
+			iOut.writeNewLine();
+
+			iState = EValidationSuppliedValidate;
+			TRequestStatus* status = &aStatus;
+			User::RequestComplete(status, KErrNone);
+			}
+			break;
+
+		case EValidationSuppliedValidate:
+			{
+			HBufC8* encodedCerts = ReadFilesLC(*iTestChain->iServerCerts);
+
+			if(!encodedCerts)
+				{
+				TRequestStatus* status = &aStatus;
+				iFinished = ETrue;
+				User::RequestComplete(status, KErrNone);
+				}
+			else
+				{
+				TInt certCount = iTestChain->iRootCerts->MdcaCount();
+				CArrayPtrFlat<CWTLSCertificate>* roots = 
+					new(ELeave) CArrayPtrFlat<CWTLSCertificate>(1);
+				TCleanupItem cleanup(CleanupCertArray, roots);
+				CleanupStack::PushL(cleanup);
+				for (TInt i = 0; i < certCount; i++)
+					{
+					// build the root certificates array including all the candidates.
+					HBufC8* encCert = 
+						ReadFileLC(iTestChain->iRootCerts->MdcaPoint(i));
+					CWTLSCertificate* cert = CWTLSCertificate::NewLC(encCert->Des());
+					roots->AppendL(cert);
+					CleanupStack::Pop();	// cert
+					CleanupStack::PopAndDestroy();	// encCert
+					}
+
+				__ASSERT_DEBUG(!iChain, User::Panic(_L("CValidateTest"), 1));
+				iChain = CWTLSCertChain::NewL(iFs, *encodedCerts, *roots);
+
+				CleanupStack::PopAndDestroy(2);	// encodedCerts, roots
+
+				TDateTime dt(2000, EJuly, 0, 0, 0, 0, 0);
+				if(iTestChain->iDateIssued == 1)
+					{
+					dt.SetYear(2002);
+					}
+				iTime = dt;
+				
+				iChain->ValidateL(*iValidationResult, iTime, aStatus);
+				iState = EValidationSuppliedValidated;
+				}
+			}
+			break;
+
+		case EValidationSuppliedValidated:
+			{
+			delete iChain;
+			iChain = 0;
+			TWTLSValidationStatus* expectedStatus = iTestChain->iError;
+			const TWTLSValidationStatus& actualStatus = iValidationResult->Error();
+
+			iOut.writeString(_L("Expected Error = "));
+			WriteError(expectedStatus->iReason);
+			iOut.writeNewLine();
+
+			iOut.writeString(_L("Actual Error = "));
+			WriteError(actualStatus.iReason);
+			iOut.writeNewLine();
+					
+			TInt wCount = iTestChain->iWarnings->Count();
+			iOut.writeString(_L("Expected Warnings = "));
+			iOut.writeNewLine();
+			for (TInt i = 0; i < wCount; i++)
+				{
+				TWTLSValidationStatus warning = iTestChain->iWarnings->At(i);
+				WriteError(warning.iReason);
+				iOut.writeNewLine();
+				}
+
+			iOut.writeString(_L("Actual Warnings = "));
+			iOut.writeNewLine();
+			const CArrayFixFlat<TWTLSValidationStatus>& warnings = 
+				iValidationResult->Warnings();
+			wCount = warnings.Count();
+			for (TInt j = 0; j < wCount; j++)
+				{
+				TWTLSValidationStatus warning = warnings.At(j);
+				WriteError(warning.iReason);
+				iOut.writeNewLine();
+				}
+			iOut.writeNewLine();
+
+			if(expectedStatus->iReason != actualStatus.iReason)
+				{
+				iConsole.Printf(_L("FAILED!!!!\n"));
+				iOut.writeString(_L("FAILED!!!!"));
+				iOut.writeNewLine();
+				iResult = EFalse;
+				}
+		
+			// End of validatewith supplied
+			if (err != KErrNone)
+				{
+				iOut.writeString(_L("Failed: leave code = "));
+				iOut.writeNum(err);
+				iOut.writeNewLine();
+				}
+
+			iState = EFinished;
+			TRequestStatus* status = &aStatus;
+			User::RequestComplete(status, KErrNone);
+			}
+			break;
+
+		case EFinished:
+			{
+			TTime end;
+			end.HomeTime();
+			TTimeIntervalMicroSeconds intervalMS = end.MicroSecondsFrom(iStart);
+			iConsole.Printf(_L("Time taken = %d milliseconds\n"), (intervalMS.Int64()/1000));
+	
+			TRequestStatus* status = &aStatus;
+			iFinished = ETrue;
+			User::RequestComplete(status, KErrNone);
+			}
+			break;
+		}
+	}
+
+void CValidateTest::PerformAction(TRequestStatus& aStatus)
+	{
+	TRequestStatus* status = &aStatus;
+
+	switch (iState)
+		{
+		case EValidationStoreDepopulateStore1:
+			{
+			iCertUtils->RemoveCertsL(aStatus);
+			iState = EValidationStorePopulateStoreRoots;
+			break;
+			}
+
+		case EValidationStorePopulateStoreRoots:
+			{
+			TUid uid = { 1 };
+			TRAP_IGNORE(iCertUtils->RemoveApplicationL(uid));
+			iCertUtils->AddApplicationL(_L("testwtls"), uid);
+			iCertUtils->AddCACertsL(*iTestChain->iRootCerts, 
+				*iTestChain->iRootLabels, EWTLSCertificate, 1, KPath, aStatus);
+			iState = EValidationStorePopulateStoreExtras;
+			break;
+			}
+
+		case EValidationStorePopulateStoreExtras:
+			{
+			iCertUtils->AddCACertsL(*iTestChain->iExtraCerts, 
+				*iTestChain->iExtraLabels, EWTLSCertificate, 2, KPath, aStatus);
+			iState = EValidationStoreValidate;
+			break;
+			}
+
+		case EValidationStoreValidate:
+			{
+			HBufC8* encodedCerts = ReadFilesLC(*iTestChain->iServerCerts);
+
+			TUid testUid = TUid::Uid(1);
+
+			if(!encodedCerts)
+				{
+				TRequestStatus* status = &aStatus;
+				iFinished = ETrue;
+				User::RequestComplete(status, KErrNone);
+				}
+			else
+				{
+				__ASSERT_DEBUG(!iChain, User::Panic(_L("CValidateTest"), 1));
+				iChain = CWTLSCertChain::NewL(iFs, *encodedCerts, testUid);
+				CleanupStack::PopAndDestroy();	// encodedCerts
+
+				TDateTime dt(2000, EJuly, 0, 0, 0, 0, 0);
+				if(iTestChain->iDateIssued == 1)
+					{
+					dt.SetYear(2002);
+					}
+				iTime = dt;
+
+				TRAP_IGNORE(iChain->ValidateL(*iValidationResult, iTime, aStatus));
+				iState = EValidationStoreValidated;
+				};
+			break;
+			}
+			
+		case EValidationStoreValidated:
+			{
+			TInt count = iChain->Count();
+			if (count > 0)
+				{
+				iOut.writeString(_L("EE certificate = "));
+				const CWTLSCertificate& eeCert = iChain->Cert(0);
+				HBufC* eeSubject = eeCert.SubjectL();
+				CleanupStack::PushL(eeSubject);
+				iOut.writeString(*eeSubject);
+				CleanupStack::PopAndDestroy();
+				iOut.writeNewLine();
+				for (TInt i = 1; i < count - 1; i++)
+					{
+					iOut.writeString(_L("Intermediate certificate = "));
+					const CWTLSCertificate& iCert = iChain->Cert(i);
+					HBufC* subject = iCert.SubjectL();
+					CleanupStack::PushL(subject);
+					iOut.writeString(*subject);
+					CleanupStack::PopAndDestroy();
+					iOut.writeNewLine();	
+					}
+				iOut.writeString(_L("Root certificate = "));
+				const CWTLSCertificate& rCert = iChain->Cert(count-1);
+				HBufC* rSubject = rCert.SubjectL();
+				CleanupStack::PushL(rSubject);
+				iOut.writeString(*rSubject);
+				CleanupStack::PopAndDestroy();
+				iOut.writeNewLine();	
+				}
+
+			TWTLSValidationStatus* expectedStatus = iTestChain->iError;
+			const TWTLSValidationStatus& actualStatus = iValidationResult->Error();
+
+			iOut.writeString(_L("Expected Error = "));
+			WriteError(expectedStatus->iReason);
+			iOut.writeNewLine();
+
+			iOut.writeString(_L("Actual Error = "));
+			WriteError(actualStatus.iReason);
+			iOut.writeNewLine();
+			
+			TInt wCount = iTestChain->iWarnings->Count();
+			iOut.writeString(_L("Expected Warnings = "));
+			iOut.writeNewLine();
+			for (TInt i = 0; i < wCount; i++)
+				{
+				TWTLSValidationStatus warning = iTestChain->iWarnings->At(i);
+				WriteError(warning.iReason);
+				iOut.writeNewLine();
+				}
+
+			iOut.writeString(_L("Actual Warnings = "));
+			iOut.writeNewLine();
+			const CArrayFixFlat<TWTLSValidationStatus>& warnings = 
+				iValidationResult->Warnings();
+			wCount = warnings.Count();
+			for (TInt j = 0; j < wCount; j++)
+				{
+				TWTLSValidationStatus warning = warnings.At(j);
+				WriteError(warning.iReason);
+				iOut.writeNewLine();
+				}
+			iOut.writeNewLine();
+			
+			if(expectedStatus->iReason != actualStatus.iReason)
+				{
+				iConsole.Printf(_L("FAILED!!!!\n"));
+				iOut.writeString(_L("FAILED!!!!"));
+				iOut.writeNewLine();
+				iResult = EFalse;
+				}
+
+			// End of DoValidate
+			iState = EValidationStoreInitStoreManager2;				
+			User::RequestComplete(status, KErrNone);
+			delete iChain;
+			iChain = 0;
+			break;
+			}
+
+		case EValidationStoreInitStoreManager2:
+			{
+			User::RequestComplete(status, KErrNone);
+			iState = EValidationStoreDepopulateStore2;
+			break;
+			}
+
+		case EValidationStoreDepopulateStore2:
+			{
+			iCertUtils->RemoveCertsL(aStatus);
+			TUid uid = { 1 };
+			iCertUtils->RemoveApplicationL(uid);
+			iState = EValidationStoreEnd;
+			break;
+			}
+
+		case EValidationStoreEnd:
+			{
+			iState = EValidationSuppliedInit;
+			iActionState = EPostrequisite;
+			User::RequestComplete(status, KErrNone);
+			break;
+			}
+		case EInit:
+		case EValidationStoreInitStoreManager1:
+		case EValidationSuppliedInit:
+		case EValidationSuppliedValidate:
+		case EValidationSuppliedValidated:
+		case EFinished:
+			break;	//	Nothing to do, for compiler
+		}
+	}
+
+HBufC8* CValidateTest::ReadFileLC(const TDesC& aFilename)
+	{
+	RFile file;
+	User::LeaveIfError(file.Open(iFs, aFilename, EFileRead));
+	CleanupClosePushL(file);
+	TInt size;
+	file.Size(size);
+	CleanupStack::PopAndDestroy(1);//fileClose
+
+	HBufC8* res = HBufC8::NewLC(size);
+	TPtr8 p(res->Des());
+	p.SetLength(size);
+
+	RFileReadStream stream;
+	User::LeaveIfError(stream.Open(iFs, aFilename, EFileStream));
+	CleanupClosePushL(stream);
+	stream.ReadL(p, size);
+	CleanupStack::PopAndDestroy();//streamClose...bleurgh
+	return res;
+	}
+
+
+HBufC8* CValidateTest::ReadFilesLC(CDesCArray& aServerCerts)
+	{
+	TInt count = aServerCerts.MdcaCount();
+	TInt totalSize = 0;
+	TInt i;
+
+	for (i = 0; i < count; i++)
+		{
+		TPtrC filename = aServerCerts.MdcaPoint(i);
+		RFile file;
+		TRAPD(err, file.Open(iFs, filename, EFileRead));
+		if(err != KErrNone)
+			{
+			HBufC *failedToLoad = filename.AllocLC();
+			SetScriptError(EFileNotFound, failedToLoad->Des());
+			CleanupStack::PopAndDestroy(2);//fsclose, fileClose	
+			return(NULL);
+			};
+		CleanupClosePushL(file);
+		TInt size;
+		file.Size(size);
+		CleanupStack::PopAndDestroy(1);	//	fileClose
+		totalSize += size;
+		}
+
+	HBufC8* res = HBufC8::NewLC(totalSize);
+	TPtr8 pRes = res->Des();
+	for (i = 0; i < count; i++)
+		{
+		HBufC8* cert = ReadFileLC(aServerCerts.MdcaPoint(i));
+		pRes.Append(cert->Des());
+		CleanupStack::PopAndDestroy();//cert
+		}
+	return res;
+	}
+
+void CValidateTest::WriteError(TValidationError aError)
+	{
+	switch(aError)
+		{
+		//errors
+		case EValidatedOK:
+			{
+			iOut.writeString(_L("Validated OK"));
+			break;
+			}
+		case EChainHasNoRoot:
+			{
+			iOut.writeString(_L("No trusted root found"));
+			break;
+			}
+		case ESignatureInvalid:
+			{
+			iOut.writeString(_L("Signature invalid"));
+			break;
+			}
+		case EDateOutOfRange:
+			{
+			iOut.writeString(_L("Date out of range"));
+			break;
+			}
+		case ENamesDontChain:
+			{
+			iOut.writeString(_L("Names don't chain"));
+			break;
+			}
+		case ENotCACert:
+			{
+			iOut.writeString(_L("Cert not authorised to sign other certs"));
+			break;
+			}
+
+		default:
+			{
+			iOut.writeString(_L("Unknown"));
+			break;
+			}
+		}
+	}
+
+void CValidateTest::CleanupCertArray(TAny* aCertArray)
+	{
+	CArrayPtrFlat<CWTLSCertificate>* certs = REINTERPRET_CAST(CArrayPtrFlat<CWTLSCertificate>*, aCertArray);
+	certs->ResetAndDestroy();
+	delete certs;
+	}
+
+void CValidateTest::HandleEInitL(TRequestStatus& aStatus)
+	{
+	iConsole.Printf(_L("Chain validation tests...\n"));
+	iStart.HomeTime();
+
+	iConsole.Printf(_L("started with store...\n"));
+	iOut.writeString(_L("started with store..."));
+	iOut.writeNewLine();
+
+	iState = EValidationStoreInitStoreManager1;
+	TRequestStatus* status = &aStatus;
+	User::RequestComplete(status, KErrNone);
+	}
+
+void CValidateTest::HandleEValidationInitStoreManager1L(TRequestStatus& aStatus)
+	{
+	TRequestStatus* status = &aStatus;
+	User::RequestComplete(status, KErrNone);
+	iState = EValidationStoreDepopulateStore1;
+	}
+
+
+void CValidateTest::DoReportAction()
+	{
+	}
+
+void CValidateTest::DoCheckResult(TInt /*aError*/)
+	{
+	}
+