networksecurity/tlsprovider/Test/tlstest2/getrandomstep.cpp
changeset 0 af10295192d8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/networksecurity/tlsprovider/Test/tlstest2/getrandomstep.cpp	Tue Jan 26 15:23:49 2010 +0200
@@ -0,0 +1,143 @@
+// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+/**
+ @file getrandomstep.cpp
+ @internalTechnology
+*/
+#include "getrandomstep.h"
+#include <tlsprovinterface.h>
+#include <tlstypedef.h>
+
+_LIT(KEpochDate, "19700000:");
+
+CGetRandomStep::CGetRandomStep()
+	{
+	SetTestStepName(KGetRandomStep);
+	}
+	
+TVerdict CGetRandomStep::doTestStepPreambleL()
+	{
+	ConstructL();
+	return EPass;
+	}
+
+TVerdict CGetRandomStep::doTestStepL()
+	{
+	// Get three buffers of random...
+	TBuf8<KTLSServerClientRandomLen> random1;
+	TBuf8<KTLSServerClientRandomLen> random2;
+	TBuf8<KTLSServerClientRandomLen> random3;
+	
+	
+	INFO_PRINTF1(_L("Invoking TLS Provider - Generate Random"));
+	
+	Provider()->GenerateRandom(random1);
+	Provider()->GenerateRandom(random2);
+	Provider()->GenerateRandom(random3);
+	
+	// check all the buffers are of sane length
+	if (random1.Length() != KTLSServerClientRandomLen ||
+		random2.Length() != KTLSServerClientRandomLen ||
+		random3.Length() != KTLSServerClientRandomLen)
+		{
+		INFO_PRINTF1(_L("Failed! Not all random buffers are of the required length!"));
+		SetTestStepResult(EFail);
+		return TestStepResult();
+		}
+	
+	// check the timestamps on the data are all roughly sane....
+	
+	TTime now;
+	now.UniversalTime();
+	TTime epoch(KEpochDate);
+	
+	TUint stamp1 = GetTimestamp(random1);
+	TUint stamp2 = GetTimestamp(random2);
+	TUint stamp3 = GetTimestamp(random3); 
+	
+	if (stamp1 > stamp2 || stamp2 > stamp3)
+		{
+		INFO_PRINTF1(_L("Failed! Timestamps suggest an insane clock!"));
+		// uh oh, timestamps are going backwards...
+		SetTestStepResult(EFail);
+		return TestStepResult();
+		}
+		
+	// check all the time stamps are within a sane interval from "now"
+	TTime time1 = epoch + TTimeIntervalSeconds(stamp1);
+	TTime time2 = epoch + TTimeIntervalSeconds(stamp2);
+	TTime time3 = epoch + TTimeIntervalSeconds(stamp3);
+	
+	// read the interval from the config file...
+	TInt interval(0);
+	if (!GetIntFromConfig(ConfigSection(), KMaxTimestampInterval, interval))
+		{
+		User::Leave(KErrNotFound);
+		}
+	
+	TTimeIntervalSeconds interval1;
+	TInt err1 = now.SecondsFrom(time1, interval1);
+	TTimeIntervalSeconds interval2;
+	TInt err2 = now.SecondsFrom(time2, interval2);
+	TTimeIntervalSeconds interval3;
+	TInt err3 = now.SecondsFrom(time3, interval3);
+	
+	if (err1 != KErrNone || err2 != KErrNone || err3 != KErrNone)
+		{
+		INFO_PRINTF1(_L("Failed! Could not get time intervals from 'now'!"));
+		SetTestStepResult(EFail);
+		return TestStepResult();
+		}
+		
+	if (interval1.Int() > interval ||
+		interval2.Int() > interval ||
+		interval3.Int() > interval)
+		{
+		// Looks like the timestamp algorithm is bad.
+		INFO_PRINTF1(_L("Failed! Clock appears to be running far too fast!"));
+		SetTestStepResult(EFail);
+		return TestStepResult();
+		}
+		
+	// now, check the random portion of the data... 
+	// just make sure it isn't all the same string...
+	
+	TPtrC8 ptr1 = random1.Mid(4);
+	TPtrC8 ptr2 = random2.Mid(4);
+	TPtrC8 ptr3 = random3.Mid(4);
+	
+	if (ptr1 == ptr2 || ptr2 == ptr3 || ptr3 == ptr1)
+		{
+		INFO_PRINTF1(_L("Failed! Random data isn't actually random!"));
+		SetTestStepResult(EFail);
+		return TestStepResult();
+		}
+		
+	INFO_PRINTF1(_L("Test step passed."));
+	SetTestStepResult(EPass);
+	return TestStepResult();
+	}
+	
+TUint CGetRandomStep::GetTimestamp(const TDesC8& aRandom)
+	{
+	TUint ret = aRandom[0];
+	for (TInt i = 1; i < 4; ++i)
+		{
+		ret <<= 8;
+		ret += aRandom[i];
+		}
+	return ret;
+	}