cryptoservices/certificateandkeymgmt/tx509/comparisontest.cpp
changeset 0 2c201484c85f
child 8 35751d3474b7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cryptoservices/certificateandkeymgmt/tx509/comparisontest.cpp	Wed Jul 08 11:25:26 2009 +0100
@@ -0,0 +1,216 @@
+/*
+* Copyright (c) 2008-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 "comparisontest.h"
+#include "t_input.h"
+#include "t_output.h"
+#include <s32file.h>
+#include <x509cert.h>
+
+_LIT8(KCertificate1Start,"<certificate1>");
+_LIT8(KCertificate2Start,"<certificate2>");
+_LIT8(KMatchExpectedStart, "<matchexpected>");
+
+CTestAction* CComparisonTest::NewL(RFs& aFs, CConsoleBase& aConsole, 
+		Output& aOut, const TTestActionSpec& aTestActionSpec)
+/**
+Factory method that creates a new CComparisonTest object.
+
+@param 	aFs		 		Shared file server session requried by base class
+@param 	aConsole 		The console used by the base class for logging
+@param	aOut	 		Output utilities for use by base class
+@param	aTestActionSpec	Parameters for this test	
+@return a new instance of a CComparisonTest
+*/
+	{
+	CTestAction* self = CComparisonTest::NewLC(aFs, aConsole, aOut, aTestActionSpec);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CTestAction* CComparisonTest::NewLC(RFs& aFs, CConsoleBase& aConsole, 
+		Output& aOut, const TTestActionSpec& aTestActionSpec)
+/**
+Factory method that creates a new CComparisonTest object and places the pointer
+to the this on the cleanup stack.
+@param 	aFs				Shared file server session requried by base class
+@param 	aConsole		The console used by the base class for logging
+@param	aOut	 		Output utilities for use by base class	
+@param	aTestActionSpec	Parameters for this test
+@return a new instance of a CComparisonTest
+*/
+	{
+	CComparisonTest* self = new(ELeave) CComparisonTest(aFs, aConsole, aOut);
+	CleanupStack::PushL(self);
+	self->ConstructL(aTestActionSpec);
+	return self;
+	}
+
+CComparisonTest::CComparisonTest(RFs& aFs, 
+								 CConsoleBase& aConsole,
+								 Output& aOut)
+: CTestAction(aConsole, aOut), iFs(aFs)
+/**
+Constructor
+@param	aFs			Shared file server session required by base-class
+@param	aConsole 	Console implemenation required by base class
+@param	aOut		Output utilities required by base class
+*/
+	{	
+	}
+
+void CComparisonTest::ConstructL(const TTestActionSpec& aTestActionSpec)
+/**
+Second phase constructor
+@param	aTestActionSpec		parameters for this test base
+*/
+	{
+	CTestAction::ConstructL(aTestActionSpec);
+	HBufC8* body = HBufC8::NewLC(aTestActionSpec.iActionBody.Length());
+	body->Des().Copy(aTestActionSpec.iActionBody);
+	
+	TPtrC8 cert1FileName = Input::ParseElement(*body, KCertificate1Start);
+	if (! cert1FileName.Length() > 0)
+		{
+		SetScriptError(ESyntax, _L("Missing tag: certificate1"));
+		iFinished = ETrue;
+		return;
+		}
+	
+	iCert1 = ReadCertificateL(cert1FileName);
+	
+	TPtrC8 cert2FileName = Input::ParseElement(*body, KCertificate2Start);
+	if (! cert2FileName.Length() > 0)
+		{
+		SetScriptError(ESyntax, _L("Missing tag: certificate1"));
+		iFinished = ETrue;
+		return;
+		}
+	iCert2 = ReadCertificateL(cert2FileName);	
+	iMatchExpected = Input::ParseElementBoolL(*body, KMatchExpectedStart);
+	CleanupStack::PopAndDestroy(body);
+	}
+
+CX509Certificate* CComparisonTest::ReadCertificateL(const TDesC8& aFileName)
+/**
+Reads an X.509 certificate from a file.
+@param	aFileName	The name of the certificate file.
+@return	A pointer to the new certificate object.
+*/
+	{
+	TFileName fn;
+	fn.Copy(aFileName);
+	
+	iOut.write(_L("Loading: %S\n"), &fn);
+	RFile file;
+	User::LeaveIfError(file.Open(iFs, fn, EFileRead | EFileShareReadersOnly));		
+	CleanupClosePushL(file);
+	TInt size;
+	User::LeaveIfError(file.Size(size));
+	RBuf8 buf;
+	buf.Create(size);
+	CleanupClosePushL(buf);
+	
+	User::LeaveIfError(file.Read(buf, size));
+	
+	CX509Certificate* cert = CX509Certificate::NewL(buf);
+	CleanupStack::PopAndDestroy(2, &file);
+	return cert;
+	}
+
+CComparisonTest::~CComparisonTest()
+/**
+Destructor
+*/
+	{
+	delete iCert1;
+	delete iCert2;
+	}
+
+void CComparisonTest::DoPerformPrerequisite(TRequestStatus& aStatus)
+	{
+	iActionState = EAction;
+	TRequestStatus* status = &aStatus;
+	User::RequestComplete(status, KErrNone);
+	}
+
+void CComparisonTest::DoPerformPostrequisite(TRequestStatus& aStatus)
+	{
+	TRequestStatus* status = &aStatus;
+	iFinished = ETrue;
+	User::RequestComplete(status, KErrNone);
+	}
+
+void CComparisonTest::PerformAction(TRequestStatus& aStatus)
+	{
+	TRAPD(err, DoActionL());
+	TRequestStatus* status = &aStatus;
+	iActionState = EPostrequisite;
+	User::RequestComplete(status, err);
+	}
+
+void CComparisonTest::DoActionL()
+/**
+Compares iCert1 and iCert2 using CX509Certificate::IsEqualL
+*/
+	{
+	HBufC* subject1 = iCert1->SubjectL();
+	CleanupStack::PushL(subject1);
+	HBufC* subject2 = iCert2->SubjectL();
+	CleanupStack::PushL(subject2);
+	
+	HBufC* issuer1 = iCert1->IssuerL();
+	CleanupStack::PushL(issuer1);
+	HBufC* issuer2 = iCert2->IssuerL();
+	CleanupStack::PushL(issuer2);
+	
+	iConsole.Printf(_L("Comparing certificates\n"));
+	iOut.write(_L("Comparing certificates\n"));
+
+	iConsole.Printf(_L("cert1:\n\tsubject: %S\n\tissuer %S\n"), subject1, issuer1);
+	iOut.write(_L("cert1:\n\tsubject: %S\n\tissuer %S\n"), subject1, issuer1);
+
+	iConsole.Printf(_L("cert2:\n\tsubject: %S\n\tissuer %S\n"), subject2, issuer2);
+	iOut.write(_L("cert2:\n\tsubject: %S issuer\n\t%S\n"), subject2, issuer2);
+	
+	TBool match = iCert1->IsEqualL(*iCert2);	
+	iConsole.Printf(_L("Match expected %d, result %d\n"), iMatchExpected, match);
+	iOut.write(_L("Match expected %d, result %d\n"), iMatchExpected, match);
+	
+	iResult = (match == iMatchExpected);
+
+	if (iResult)
+		{
+		iConsole.Printf(_L(" Success\n"));
+		iOut.writeString(_L(" Success\n"));
+		}
+	else
+		{
+		iConsole.Printf(_L(" Failed\n"));
+		iOut.writeString(_L(" Failed"));
+		};
+	CleanupStack::PopAndDestroy(4, subject1);
+	}
+
+void CComparisonTest::DoReportAction()
+	{
+	}
+
+void CComparisonTest::DoCheckResult(TInt /*aError*/)
+	{
+	}