networksecurity/tlsprovider/Test/src/TlsProvTestSteps4.cpp
changeset 0 af10295192d8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/networksecurity/tlsprovider/Test/src/TlsProvTestSteps4.cpp	Tue Jan 26 15:23:49 2010 +0200
@@ -0,0 +1,1511 @@
+// Copyright (c) 2003-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:
+//
+
+#include "TlsProvTestStep.h"
+#include <test/testexecutelog.h>
+#include <hash.h>
+
+
+
+#define KTLSCachingTimeout  200 
+
+TVerdict CTlsProvTestActive::doTest4_0L( CTlsProvStep* aStep )
+	{
+	
+	CTlsTestRandom rnd;
+	
+	SetThreadRandomL( &rnd );
+		
+	CTLSProvider* tlsProvider = CTLSProvider::ConnectL();
+	
+	RArray<TTLSCipherSuite> userCipherSuiteList;
+	iStatus = KRequestPending;
+	tlsProvider->CipherSuitesL( userCipherSuiteList ,iStatus);	
+	
+	SetActive();
+	CActiveScheduler::Start();
+	
+	CTLSSession* sessionObj = NULL;
+	
+	CTlsCryptoAttributes* tlsCryptoAttributes = tlsProvider->Attributes();
+			
+	HBufC8* encServerCert = NULL;
+	
+	TInt res = StandardTestInitL(aStep, tlsCryptoAttributes, encServerCert);
+	if( res  < 0 )
+		{
+		iLogInfo.Copy( _L("	4.0:  problems with test data files") );
+		return EFail;
+		}
+	
+				
+	CX509Certificate* serverCert = NULL;
+	iStatus = KRequestPending;
+	tlsProvider->VerifyServerCertificate( encServerCert->Des(), serverCert, iStatus);
+	SetActive();
+	CActiveScheduler::Start();
+	
+	serverCert = CX509Certificate::NewL(encServerCert->Des()); //- remove when VerifyServerCertificate ready
+		
+	
+	
+	HBufC8* clientKeyExch = NULL;
+	
+	iStatus = KRequestPending;
+	tlsProvider->CreateL( sessionObj,
+						iStatus);	
+	SetActive();
+	CActiveScheduler::Start();	
+	
+		
+	// check that ClientKeyExch is not NULL
+	if ( (iStatus.Int() != KErrNone ) || (NULL == sessionObj) )
+		{
+		iLogInfo.Copy( _L("	4.0:  CTLSProvider::Create failed") );
+		return EInconclusive;
+		}
+	
+	iStatus = KRequestPending;
+	sessionObj->ClientKeyExchange(clientKeyExch, iStatus);
+	SetActive();
+	CActiveScheduler::Start();
+	
+	// check that ClientKeyExch is not NULL
+	if ( (NULL == clientKeyExch) || ( 0 == clientKeyExch->Length()) ) 
+		{
+		iLogInfo.Copy( _L("	4.0:  CTLSSession::ClientKeyExchange failed") );
+		return EInconclusive;
+		}
+		
+	if( EFalse == CacheSessionL( aStep, sessionObj) )
+		return EInconclusive;
+			
+	iStatus = KRequestPending;
+	CX509Certificate* cert;
+	sessionObj->ServerCertificate( cert, iStatus );
+		
+	SetActive();
+	CActiveScheduler::Start();
+	
+	
+	
+	if ( KErrNone != iStatus.Int() )
+		{
+		iLogInfo.Copy( _L("	4.0:  CTLSSession::ServerCertificte - returned with error") );
+		return EFail;
+		}
+	
+	//compare retrieved cert with original one:
+	if ( cert->IsEqualL( *serverCert ) == EFalse  ) 
+		{
+		iLogInfo.Copy( _L("	4.0:  retrieved certificate doesn't match") );
+		return EFail;
+		}
+	
+	iLogInfo.Copy( _L("	4.0:  OK") );
+	
+	delete tlsProvider;	
+	delete sessionObj;
+	
+	return EPass;
+	
+	} 	
+
+
+
+TVerdict CTlsProvTestActive::doTest4_1L( CTlsProvStep* aStep )
+	{
+	
+	CTlsTestRandom rnd;
+	
+	SetThreadRandomL( &rnd );
+	
+	RArray<TTLSCipherSuite> userCipherSuiteList;
+	CTLSProvider* tlsProvider = CTLSProvider::ConnectL();
+	
+	iStatus = KRequestPending;
+	tlsProvider->CipherSuitesL( userCipherSuiteList ,iStatus);	
+	SetActive();
+	CActiveScheduler::Start();
+	
+			
+	CTLSSession* sessionObj;
+	
+	CTlsCryptoAttributes* tlsCryptoAttributes = tlsProvider->Attributes();
+		
+	HBufC8* encServerCert = NULL;
+	
+	TInt res = StandardTestInitL(aStep, tlsCryptoAttributes, encServerCert);
+		
+	if( res  < 0 )
+		{
+		iLogInfo.Copy( _L("	4.1:  problems with test data files") );
+		return EFail;
+		}
+	tlsCryptoAttributes->iSessionNameAndID.iServerName.iAddress.Copy( KServer2 );
+	tlsCryptoAttributes->iNegotiatedProtocol.iMajor = 3;
+	tlsCryptoAttributes->iNegotiatedProtocol.iMinor = 0; 
+	
+	tlsCryptoAttributes->iProposedProtocol.iMajor = 3;
+	tlsCryptoAttributes->iProposedProtocol.iMinor = 0; 
+		
+		
+	CX509Certificate* serverCert = NULL;
+	iStatus = KRequestPending;
+	tlsProvider->VerifyServerCertificate( encServerCert->Des(), serverCert, iStatus);
+	SetActive();
+	CActiveScheduler::Start();
+	
+		
+	tlsCryptoAttributes->iClientAuthenticate = EFalse; 
+	tlsCryptoAttributes->iDialogNonAttendedMode = ETrue;
+	
+	
+	HBufC8* clientKeyExch = NULL;
+	
+	iStatus = KRequestPending;
+	tlsProvider->CreateL( sessionObj,
+						iStatus);	
+	SetActive();
+	CActiveScheduler::Start();	
+	
+	// check that ClientKeyExch is not NULL
+	if ( (iStatus.Int() != KErrNone ) || (NULL == sessionObj) )
+		{
+		iLogInfo.Copy( _L("	4.1:  CTLSProvider::Create failed") );
+		return EInconclusive;
+		}
+		
+		
+	iStatus = KRequestPending;
+	sessionObj->ClientKeyExchange(clientKeyExch, iStatus);
+	SetActive();
+	CActiveScheduler::Start();
+	
+	// check that ClientKeyExch is not NULL
+	if ( (NULL == clientKeyExch) || ( 0 == clientKeyExch->Length()) ) 
+		{
+		iLogInfo.Copy( _L("	4.1:  CTLSSession::ClientKeyExchange failed") );
+		return EInconclusive;
+		}
+		
+	if( EFalse == CacheSessionL( aStep, sessionObj) )
+		return EInconclusive;
+			
+	TTLSSessionId sessionId;
+	
+	iStatus = KRequestPending;
+	tlsProvider->GetSessionL(
+		tlsCryptoAttributes->iSessionNameAndID.iServerName,
+		sessionId,
+		iStatus );
+		
+		
+	SetActive();
+	CActiveScheduler::Start();
+	
+	
+	
+	if ( KErrNone != iStatus.Int() )
+		{
+		iLogInfo.Copy( _L("	4.1:  CTLSProvider::GetSession - returned with error") );
+		return EFail;
+		}
+	
+	if (  0 != sessionId.Compare( 
+								tlsCryptoAttributes->iSessionNameAndID.iSessionId ) ) 
+		{
+		iLogInfo.Copy( _L("	4.1:  CTLSProvider::GetSession - BAD session id") );
+		return EFail;
+		}
+		
+		
+	iLogInfo.Copy( _L("	4.1:  OK") );
+	
+			
+	return EPass;
+	
+	} 
+
+	
+
+TVerdict CTlsProvTestActive::doTest4_2L( CTlsProvStep* aStep )
+	{
+	
+	CTlsTestRandom rnd;
+	
+	SetThreadRandomL( &rnd );
+	
+	RArray<TTLSCipherSuite> userCipherSuiteList;
+	CTLSProvider* tlsProvider = CTLSProvider::ConnectL();
+	CTLSProvider* tlsProvider2 = CTLSProvider::ConnectL();
+			
+	iStatus = KRequestPending;
+	tlsProvider->CipherSuitesL( userCipherSuiteList ,iStatus);	
+	SetActive();
+	CActiveScheduler::Start();
+	
+			
+	CTLSSession* sessionObj;
+	CTLSSession* sessionObj2;
+			
+	CTlsCryptoAttributes* tlsCryptoAttributes = tlsProvider->Attributes();
+	
+	HBufC8* encServerCert = NULL;
+	
+	TInt res = StandardTestInitL(aStep, tlsCryptoAttributes, encServerCert);
+	if( res  < 0 )
+		{
+		iLogInfo.Copy( _L("	4.2:  problems with test data files (1)") );
+		return EFail;
+		}
+			
+	CX509Certificate* serverCert = NULL;
+	iStatus = KRequestPending;
+	tlsProvider->VerifyServerCertificate( encServerCert->Des(), serverCert, iStatus);
+	SetActive();
+	CActiveScheduler::Start();
+			
+		
+	HBufC8* clientKeyExch = NULL;
+	
+	iStatus = KRequestPending;
+	tlsProvider->CreateL( sessionObj,
+						iStatus);	
+	SetActive();
+	CActiveScheduler::Start();	
+	
+	// check that ClientKeyExch is not NULL
+	if ( (iStatus.Int() != KErrNone ) || (NULL == sessionObj) )
+		{
+		iLogInfo.Copy( _L("	4.2:  CTLSProvider::Create failed") );
+		return EInconclusive;
+		}
+		
+	iStatus = KRequestPending;
+	sessionObj->ClientKeyExchange(clientKeyExch, iStatus);
+	SetActive();
+	CActiveScheduler::Start();
+	
+	// check that ClientKeyExch is not NULL
+	if ( (NULL == clientKeyExch) || ( 0 == clientKeyExch->Length()) ) 
+		{
+		iLogInfo.Copy( _L("	4.2:  CTLSSession::ClientKeyExchange failed") );
+		return EInconclusive;
+		}
+		
+	if( EFalse == CacheSessionL( aStep, sessionObj) )
+		return EInconclusive;
+			
+		
+	//
+	// entry 2
+	
+	delete clientKeyExch;	
+	clientKeyExch = NULL;
+	
+	aStep->GetStringFromConfig(aStep->ConfigSection(),_L("SSLServerRnd"),aStep->iServerRnd);
+	aStep->GetStringFromConfig(aStep->ConfigSection(),_L("SSLClientRnd"),aStep->iClientRnd);
+	aStep->GetStringFromConfig(aStep->ConfigSection(),_L("SSLKeyParams1"),aStep->iKeyParam1);
+	aStep->GetStringFromConfig(aStep->ConfigSection(),_L("SSLKeyParams2"),aStep->iKeyParam2);
+	aStep->GetStringFromConfig(aStep->ConfigSection(),_L("SSLKeyParams3"),aStep->iKeyParam3);
+	aStep->GetStringFromConfig(aStep->ConfigSection(),_L("SSLServerCert"),aStep->iServerCertChain);
+	aStep->GetStringFromConfig(aStep->ConfigSection(),_L("SSLHandshakeMsgsServer"),aStep->iHandshakeMsgsServer);
+	aStep->GetStringFromConfig(aStep->ConfigSection(),_L("SSLSrvFinishedCheckOutput"),aStep->iSrvFinishedCheckOutput);
+	aStep->GetStringFromConfig(aStep->ConfigSection(),_L("SSLPremaster"),aStep->iPremaster);
+	
+	RFs fs;
+	if ( KErrNone != fs.Connect() )
+		{
+		iLogInfo.Copy( _L("	4.2:  problems with file system (2)") );
+		return EFail;
+		}
+		
+	CFileMan* fMan = CFileMan::NewL( fs );
+	
+	TDriveUnit sysDrive (RFs::GetSystemDrive());
+	TBuf<128> fileName (sysDrive.Name());
+	fileName.Append(_L("\\Premaster.bin"));
+	
+	fMan->Delete(fileName);
+	fMan->Copy( aStep->iPremaster,	fileName, CFileMan::EOverWrite );
+	fs.Close();	
+			
+	
+	RArray<TTLSCipherSuite> userCipherSuiteList2;
+	iStatus = KRequestPending;
+	tlsProvider2->CipherSuitesL( userCipherSuiteList2 ,iStatus);	
+	SetActive();
+	CActiveScheduler::Start();
+	
+	CTlsCryptoAttributes* tlsCryptoAttributes2 = tlsProvider2->Attributes();
+		
+	tlsCryptoAttributes2->iSessionNameAndID.iServerName.iAddress.Copy( KServer1 );
+	tlsCryptoAttributes2->iSessionNameAndID.iServerName.iPort = 10;
+	tlsCryptoAttributes2->iSessionNameAndID.iSessionId.Copy( KSessionId2 );
+	 
+	
+	tlsCryptoAttributes2->iCompressionMethod = ENullCompression;
+	tlsCryptoAttributes2->iCurrentCipherSuite.iHiByte = 0;
+	tlsCryptoAttributes2->iCurrentCipherSuite.iLoByte = 3;
+	
+		
+	tlsCryptoAttributes2->iNegotiatedProtocol.iMajor = 3;
+	tlsCryptoAttributes2->iNegotiatedProtocol.iMinor = 0; 
+	
+	tlsCryptoAttributes2->iProposedProtocol.iMajor = 3;
+	tlsCryptoAttributes2->iProposedProtocol.iMinor = 0; 
+	
+		
+	tlsCryptoAttributes2->iPublicKeyParams->iKeyType = ERsa;
+	
+	tlsCryptoAttributes2->iClientAuthenticate = EFalse; 
+	tlsCryptoAttributes2->iDialogNonAttendedMode = ETrue;
+	
+		
+	delete encServerCert;
+	encServerCert = NULL;
+	
+	res = aStep->ReadDataForCreateL(tlsCryptoAttributes2, encServerCert);
+	if( res  < 0 )
+		{
+		iLogInfo.Copy( _L("	4.2:  problems with test data files (2)") );
+		return EFail;
+		}
+	
+		
+	delete serverCert;
+	serverCert = NULL;
+	iStatus = KRequestPending;
+	tlsProvider2->VerifyServerCertificate( encServerCert->Des(), serverCert, iStatus);
+	SetActive();
+	CActiveScheduler::Start();
+	
+	
+	iStatus = KRequestPending;
+	tlsProvider2->CreateL( sessionObj2,
+						iStatus);	
+	SetActive();
+	CActiveScheduler::Start();	
+	
+	// check that ClientKeyExch is not NULL
+	if ( (iStatus.Int() != KErrNone ) || (NULL == sessionObj2) ) 
+		{
+		iLogInfo.Copy( _L("	4.2:  CTLSProvider::Create failed") );
+		return EInconclusive;
+		}
+		
+	iStatus = KRequestPending;
+	sessionObj2->ClientKeyExchange(clientKeyExch, iStatus);
+	SetActive();
+	CActiveScheduler::Start();
+	
+	// check that ClientKeyExch is not NULL
+	if ( (NULL == clientKeyExch) || ( 0 == clientKeyExch->Length()) ) 
+		{
+		iLogInfo.Copy( _L("	4.2:  CTLSSession::ClientKeyExchange failed (4)") );
+		return EInconclusive;
+		}
+		
+	delete clientKeyExch;	
+	clientKeyExch = NULL;
+	
+	if( EFalse == CacheSessionL( aStep, sessionObj2) )
+		return EInconclusive;
+	
+	
+	// entry 2 inserted
+	//
+	
+	//
+			
+		
+	TTLSSessionId sessionId;
+	
+	CTLSProvider* tlsProvider3 = CTLSProvider::ConnectL();
+	
+	RArray<TTLSCipherSuite> userCipherSuiteList3;
+	iStatus = KRequestPending;
+	tlsProvider3->CipherSuitesL( userCipherSuiteList3 ,iStatus);	
+	SetActive();
+	CActiveScheduler::Start();
+	
+	CTlsCryptoAttributes* tlsCryptoAttributes3 = tlsProvider3->Attributes();
+		
+	tlsCryptoAttributes3->iCurrentCipherSuite.iHiByte = 0;
+	tlsCryptoAttributes3->iCurrentCipherSuite.iLoByte = 3;
+	
+		
+	tlsCryptoAttributes3->iNegotiatedProtocol.iMajor = 3;
+	tlsCryptoAttributes3->iNegotiatedProtocol.iMinor = 0; 
+	
+	tlsCryptoAttributes3->iProposedProtocol.iMajor = 3;
+	tlsCryptoAttributes3->iProposedProtocol.iMinor = 0; 
+	TTLSSessionNameAndID sessionNameAndID;
+	sessionNameAndID.iServerName.iAddress.Copy( KServer1 );
+	sessionNameAndID.iServerName.iPort = 10;
+			
+		
+	iStatus = KRequestPending;
+	tlsProvider3->GetSessionL(
+		sessionNameAndID.iServerName,
+		sessionId,
+		iStatus );
+		
+	SetActive();
+	CActiveScheduler::Start();
+	
+		
+	if ( KErrNone != iStatus.Int() )
+		{
+		iLogInfo.Copy( _L("	4.2:  CTLSProvider::GetSession - returned with error") );
+		return EFail;
+		}
+	
+	
+	if (  0 != sessionId.Compare( tlsCryptoAttributes2->iSessionNameAndID.iSessionId ) ) 
+		{
+		iLogInfo.Copy( _L("	4.2:  CTLSProvider::GetSession - BAD session id") );
+		return EFail;
+		}
+		
+		
+	return EPass;
+	
+	} 	
+
+TVerdict CTlsProvTestActive::doTest4_3L( CTlsProvStep* aStep )
+	{
+	
+	CTlsTestRandom rnd;
+	
+	SetThreadRandomL( &rnd );
+	
+	aStep->GetStringFromConfig(aStep->ConfigSection(),_L("ServerRnd"),aStep->iServerRnd);
+	aStep->GetStringFromConfig(aStep->ConfigSection(),_L("ClientRnd"),aStep->iClientRnd);
+	aStep->GetStringFromConfig(aStep->ConfigSection(),_L("KeyParams1"),aStep->iKeyParam1);
+	aStep->GetStringFromConfig(aStep->ConfigSection(),_L("KeyParams2"),aStep->iKeyParam2);
+	aStep->GetStringFromConfig(aStep->ConfigSection(),_L("KeyParams3"),aStep->iKeyParam3);
+	aStep->GetStringFromConfig(aStep->ConfigSection(),_L("ServerCert"),aStep->iServerCertChain);
+	aStep->GetStringFromConfig(aStep->ConfigSection(),_L("HandshakeMsgsServer"),aStep->iHandshakeMsgsServer);
+	aStep->GetStringFromConfig(aStep->ConfigSection(),_L("SrvFinishedCheckOutput"),aStep->iSrvFinishedCheckOutput);
+	aStep->GetStringFromConfig(aStep->ConfigSection(),_L("Premaster"),aStep->iPremaster);
+	
+	RArray<TTLSCipherSuite> userCipherSuiteList;
+	CTLSProvider* tlsProvider = CTLSProvider::ConnectL();
+	
+	iStatus = KRequestPending;
+	tlsProvider->CipherSuitesL( userCipherSuiteList ,iStatus);	
+	SetActive();
+	CActiveScheduler::Start();
+		
+	TTLSSessionNameAndID sessionNameAndID;
+	sessionNameAndID.iServerName.iAddress.Copy( KServer3 );
+	sessionNameAndID.iServerName.iPort = 20;
+			
+	TTLSSessionId sessionId;
+	
+	iStatus = KRequestPending;
+	tlsProvider->GetSessionL(
+		sessionNameAndID.iServerName,
+		sessionId,
+		iStatus );
+		
+	SetActive();
+	CActiveScheduler::Start();
+	
+	if ( 0 != sessionId.Length()  )
+		{
+		iLogInfo.Copy( _L("	4.3:  CTLSProvider::GetSession - wrong error code returned") );
+		return EFail;
+		}
+		
+	// now lets insert some entries and try again
+	
+	CTlsCryptoAttributes* tlsCryptoAttributes = tlsProvider->Attributes();
+		
+	tlsCryptoAttributes->iSessionNameAndID.iServerName.iPort = 10;
+		 
+	tlsCryptoAttributes->iDialogNonAttendedMode = ETrue;
+	tlsCryptoAttributes->iCompressionMethod = ENullCompression;
+	tlsCryptoAttributes->iCurrentCipherSuite.iHiByte = 0;
+	tlsCryptoAttributes->iCurrentCipherSuite.iLoByte = 5; 
+	
+		
+	tlsCryptoAttributes->iNegotiatedProtocol.iMajor = 3;
+	tlsCryptoAttributes->iNegotiatedProtocol.iMinor = 1; 
+	
+	tlsCryptoAttributes->iProposedProtocol.iMajor = 3;
+	tlsCryptoAttributes->iProposedProtocol.iMinor = 1; 
+	
+	
+	tlsCryptoAttributes->iPublicKeyParams = NULL;
+	
+			
+	HBufC8* encServerCert = NULL;
+	
+		
+	TInt res = aStep->ReadDataForCreateL(tlsCryptoAttributes, encServerCert);
+	if( res  < 0 )
+		{
+		iLogInfo.Copy( _L("	4.3:  problems with test data files") );
+		return EFail;
+		}
+		
+	CX509Certificate* serverCert = NULL;
+	iStatus = KRequestPending;
+	tlsProvider->VerifyServerCertificate( encServerCert->Des(), serverCert, iStatus);
+	SetActive();
+	CActiveScheduler::Start();
+			
+	tlsCryptoAttributes->iClientAuthenticate = EFalse; 
+	tlsCryptoAttributes->iDialogNonAttendedMode = ETrue;
+	
+	
+	tlsCryptoAttributes->iSessionNameAndID.iServerName.iAddress.Copy( KServer1 );
+	tlsCryptoAttributes->iSessionNameAndID.iSessionId.Append( KSessionId1 );
+	
+	CTLSSession* sessionObj = NULL;
+	HBufC8* clientKeyExch = NULL;
+	
+	iStatus = KRequestPending;
+	tlsProvider->CreateL( sessionObj,
+						iStatus);	
+	SetActive();
+	CActiveScheduler::Start();
+	
+	delete serverCert;
+	serverCert = NULL;
+	
+	// check that ClientKeyExch is not NULL
+	if ( (iStatus.Int() != KErrNone ) || (NULL == sessionObj) )
+		{
+		iLogInfo.Copy( _L("	4.3:  CTLSProvider::Create failed") );
+		return EInconclusive;
+		}
+		
+	iStatus = KRequestPending;
+	sessionObj->ClientKeyExchange(clientKeyExch, iStatus);
+	SetActive();
+	CActiveScheduler::Start();
+	
+	// check that ClientKeyExch is not NULL
+	if ( (NULL == clientKeyExch) || ( 0 == clientKeyExch->Length()) ) 
+		{
+		iLogInfo.Copy( _L("	4.3:  CTLSSession::ClientKeyExchange failed") );
+		return EInconclusive;
+		}
+		
+	if( EFalse == CacheSessionL( aStep, sessionObj) )
+		return EInconclusive;
+		
+	// now lets try to retrieve invalid session
+	iStatus = KRequestPending;
+	tlsProvider->GetSessionL(
+		sessionNameAndID.iServerName,
+		sessionId,
+		iStatus );
+		
+	SetActive();
+	CActiveScheduler::Start();
+	
+	if ( ( 0 != sessionId.Length() ) )
+		{
+		iLogInfo.Copy( _L("	4.3:  CTLSProvider::GetSession - wrong error code returned") );
+		return EFail;
+		}
+	
+	iLogInfo.Copy( _L("	4.3:  OK") );
+	
+	return EPass;
+	
+	} 	
+	
+
+TVerdict CTlsProvTestActive::doTest4_4L( CTlsProvStep* aStep )
+	{
+	CTlsTestRandom rnd;
+	
+	SetThreadRandomL( &rnd );
+				
+	RArray<TTLSCipherSuite> userCipherSuiteList;
+	CTLSProvider* tlsProvider = CTLSProvider::ConnectL();
+	CTLSProvider* tlsProvider2 = CTLSProvider::ConnectL();
+	CTLSProvider* tlsProvider3 = CTLSProvider::ConnectL();
+	CTLSProvider* tlsProvider4 = CTLSProvider::ConnectL();
+		
+	iStatus = KRequestPending;
+	tlsProvider->CipherSuitesL( userCipherSuiteList ,iStatus);	
+	SetActive();
+	CActiveScheduler::Start();
+	
+			
+	CTLSSession* sessionObj;
+	CTLSSession* sessionObj2;
+	CTLSSession* sessionObj3;
+	CTLSSession* sessionObj4;
+		
+	CTlsCryptoAttributes* tlsCryptoAttributes = tlsProvider->Attributes();
+	
+	HBufC8* encServerCert = NULL;
+	
+	TInt res = StandardTestInitL(aStep, tlsCryptoAttributes, encServerCert);
+	if( res  < 0 )
+		{
+		iLogInfo.Copy( _L("	4.4:  problems with test data files (1)") );
+		return EFail;
+		}
+			
+	CX509Certificate* serverCert = NULL;
+	iStatus = KRequestPending;
+	tlsProvider->VerifyServerCertificate( encServerCert->Des(), serverCert, iStatus);
+	SetActive();
+	CActiveScheduler::Start();
+	
+		
+		
+	HBufC8* clientKeyExch = NULL;
+	
+	iStatus = KRequestPending;
+	tlsProvider->CreateL( sessionObj,
+						iStatus);	
+	SetActive();
+	CActiveScheduler::Start();	
+	
+	// check that ClientKeyExch is not NULL
+	if ( (iStatus.Int() != KErrNone ) || (NULL == sessionObj) )
+		{
+		iLogInfo.Copy( _L("	4.4:  CTLSProvider::Create failed") );
+		return EInconclusive;
+		}
+		
+	iStatus = KRequestPending;
+	sessionObj->ClientKeyExchange(clientKeyExch, iStatus);
+	SetActive();
+	CActiveScheduler::Start();
+	
+	// check that ClientKeyExch is not NULL
+	if ( (NULL == clientKeyExch) || ( 0 == clientKeyExch->Length()) ) 
+		{
+		iLogInfo.Copy( _L("	4.4:  CTLSSession::ClientKeyExchange failed") );
+		return EInconclusive;
+		}
+		
+	if( EFalse == CacheSessionL( aStep, sessionObj) )
+		return EInconclusive;
+			
+	//
+	// entry 2 - diferent sever but same session id
+	
+	delete clientKeyExch;	
+	clientKeyExch = NULL;
+	
+	RArray<TTLSCipherSuite> userCipherSuiteList2;
+	iStatus = KRequestPending;
+	tlsProvider2->CipherSuitesL( userCipherSuiteList2 ,iStatus);	
+	SetActive();
+	CActiveScheduler::Start();
+	
+	CTlsCryptoAttributes* tlsCryptoAttributes2 = tlsProvider2->Attributes();
+		
+	delete encServerCert;
+	encServerCert = NULL;
+	res = StandardTestInitL(aStep, tlsCryptoAttributes2, encServerCert);
+	if( res  < 0 )
+		{
+		iLogInfo.Copy( _L("	4.4:  problems with test data files (2)") );
+		return EFail;
+		}
+	tlsCryptoAttributes2->iSessionNameAndID.iServerName.iAddress.Copy( KServer2 );
+	
+	delete serverCert;
+	serverCert = NULL;
+	iStatus = KRequestPending;
+	tlsProvider2->VerifyServerCertificate( encServerCert->Des(), serverCert, iStatus);
+	SetActive();
+	CActiveScheduler::Start();
+	
+	
+	iStatus = KRequestPending;
+	tlsProvider2->CreateL( sessionObj2,
+						iStatus);	
+	SetActive();
+	CActiveScheduler::Start();	
+	
+	// check that ClientKeyExch is not NULL
+	if ( (iStatus.Int() != KErrNone ) || (NULL == sessionObj2) )
+		{
+		iLogInfo.Copy( _L("	4.4:  CTLSProvider::Create failed") );
+		return EInconclusive;
+		}
+		
+	iStatus = KRequestPending;
+	sessionObj2->ClientKeyExchange(clientKeyExch, iStatus);
+	SetActive();
+	CActiveScheduler::Start();
+	
+	// check that ClientKeyExch is not NULL
+	if ( (NULL == clientKeyExch) || ( 0 == clientKeyExch->Length()) ) 
+		{
+		iLogInfo.Copy( _L("	4.4:  CTLSSession::ClientKeyExchange failed") );
+		return EInconclusive;
+		}
+			
+	if( EFalse == CacheSessionL( aStep, sessionObj2) )
+		return EInconclusive;
+	
+	// entry 2 
+	//
+	
+	//
+	// entry 3
+	
+	delete clientKeyExch;	
+	clientKeyExch = NULL;
+	
+	RArray<TTLSCipherSuite> userCipherSuiteList3;
+	iStatus = KRequestPending;
+	tlsProvider3->CipherSuitesL( userCipherSuiteList3 ,iStatus);	
+	SetActive();
+	CActiveScheduler::Start();
+		
+	CTlsCryptoAttributes* tlsCryptoAttributes3 = tlsProvider3->Attributes();
+	
+	delete encServerCert;
+	encServerCert = NULL;
+		
+	res = StandardTestInitL(aStep, tlsCryptoAttributes3, encServerCert);
+	if( res  < 0 )
+		{
+		iLogInfo.Copy( _L("	4.4:  problems with test data files (3)") );
+		return EFail;
+		}
+	tlsCryptoAttributes3->iSessionNameAndID.iServerName.iAddress.Copy( KServer2 );
+	tlsCryptoAttributes3->iSessionNameAndID.iSessionId.Copy( KSessionId3 );	
+	
+	delete serverCert;
+	serverCert = NULL;
+	iStatus = KRequestPending;
+	tlsProvider3->VerifyServerCertificate( encServerCert->Des(), serverCert, iStatus);
+	SetActive();
+	CActiveScheduler::Start();
+	
+	
+	iStatus = KRequestPending;
+	tlsProvider3->CreateL( sessionObj3,
+						iStatus);	
+	SetActive();
+	CActiveScheduler::Start();	
+	
+	// check that ClientKeyExch is not NULL
+	if ( (iStatus.Int() != KErrNone ) || (NULL == sessionObj3) ) 
+		{
+		iLogInfo.Copy( _L("	4.4:  CTLSProvider::Create failed") );
+		return EInconclusive;
+		}
+		
+		
+	iStatus = KRequestPending;
+	sessionObj3->ClientKeyExchange(clientKeyExch, iStatus);
+	SetActive();
+	CActiveScheduler::Start();
+	
+	// check that ClientKeyExch is not NULL
+	if ( (NULL == clientKeyExch) || ( 0 == clientKeyExch->Length()) ) 
+		{
+		iLogInfo.Copy( _L("	4.4:  CTLSSession::ClientKeyExchange failed") );
+		return EInconclusive;
+		}
+		
+	if( EFalse == CacheSessionL( aStep, sessionObj3) )
+		return EInconclusive;
+	
+	// entry 3 inserted
+	//
+	
+	//
+	// entry 4
+	
+	delete clientKeyExch;	
+	clientKeyExch = NULL;
+	
+	aStep->GetStringFromConfig(aStep->ConfigSection(),_L("SSLServerRnd"),aStep->iServerRnd);
+	aStep->GetStringFromConfig(aStep->ConfigSection(),_L("SSLClientRnd"),aStep->iClientRnd);
+	aStep->GetStringFromConfig(aStep->ConfigSection(),_L("SSLKeyParams1"),aStep->iKeyParam1);
+	aStep->GetStringFromConfig(aStep->ConfigSection(),_L("SSLKeyParams2"),aStep->iKeyParam2);
+	aStep->GetStringFromConfig(aStep->ConfigSection(),_L("SSLKeyParams3"),aStep->iKeyParam3);
+	aStep->GetStringFromConfig(aStep->ConfigSection(),_L("SSLServerCert"),aStep->iServerCertChain);
+	aStep->GetStringFromConfig(aStep->ConfigSection(),_L("SSLHandshakeMsgsServer"),aStep->iHandshakeMsgsServer);
+	aStep->GetStringFromConfig(aStep->ConfigSection(),_L("SSLSrvFinishedCheckOutput"),aStep->iSrvFinishedCheckOutput);
+	aStep->GetStringFromConfig(aStep->ConfigSection(),_L("SSLPremaster"),aStep->iPremaster);
+	
+	RFs fs;
+	if ( KErrNone != fs.Connect() )
+		{
+		iLogInfo.Copy( _L("	4.4:  problems with file system (4)") );
+		return EFail;
+		}
+		
+	CFileMan* fMan = CFileMan::NewL( fs );
+	TDriveUnit sysDrive (RFs::GetSystemDrive());
+	TBuf<128> fileName (sysDrive.Name());
+	fileName.Append(_L("\\Premaster.bin"));
+	
+	fMan->Delete(fileName);
+	fMan->Copy( aStep->iPremaster,	fileName, CFileMan::EOverWrite );
+	fs.Close();	
+			
+	
+	RArray<TTLSCipherSuite> userCipherSuiteList4;
+	iStatus = KRequestPending;
+	tlsProvider4->CipherSuitesL( userCipherSuiteList4 ,iStatus);	
+	SetActive();
+	CActiveScheduler::Start();
+	
+	CTlsCryptoAttributes* tlsCryptoAttributes4 = tlsProvider4->Attributes();
+		
+	tlsCryptoAttributes4->iSessionNameAndID.iServerName.iAddress.Copy( KServer2 );
+	tlsCryptoAttributes4->iSessionNameAndID.iServerName.iPort = 10;
+	tlsCryptoAttributes4->iSessionNameAndID.iSessionId.Append( KSessionId4 );
+	 
+	
+	tlsCryptoAttributes4->iCompressionMethod = ENullCompression;
+	tlsCryptoAttributes4->iCurrentCipherSuite.iHiByte = 0;
+	tlsCryptoAttributes4->iCurrentCipherSuite.iLoByte = 3;
+	
+		
+	tlsCryptoAttributes4->iNegotiatedProtocol.iMajor = 3;
+	tlsCryptoAttributes4->iNegotiatedProtocol.iMinor = 0; 
+	
+	tlsCryptoAttributes4->iProposedProtocol.iMajor = 3;
+	tlsCryptoAttributes4->iProposedProtocol.iMinor = 0; 
+	
+		
+	tlsCryptoAttributes4->iPublicKeyParams->iKeyType = ERsa;
+	
+	tlsCryptoAttributes4->iClientAuthenticate = EFalse; 
+	tlsCryptoAttributes4->iDialogNonAttendedMode = ETrue;
+	
+	
+	delete encServerCert;
+	encServerCert = NULL;
+	
+	res = aStep->ReadDataForCreateL(tlsCryptoAttributes4, encServerCert);
+	if( res  < 0 )
+		{
+		iLogInfo.Copy( _L("	4.4:  problems with test data files (4)") );
+		return EFail;
+		}
+	
+		
+	delete serverCert;
+	serverCert = NULL;
+	iStatus = KRequestPending;
+	tlsProvider4->VerifyServerCertificate( encServerCert->Des(), serverCert, iStatus);
+	SetActive();
+	CActiveScheduler::Start();
+	
+	
+	iStatus = KRequestPending;
+	tlsProvider4->CreateL( sessionObj4,
+						iStatus);	
+	SetActive();
+	CActiveScheduler::Start();	
+	
+	// check that ClientKeyExch is not NULL
+	if ( (iStatus.Int() != KErrNone ) || (NULL == sessionObj4) ) 
+		{
+		iLogInfo.Copy( _L("	4.4:  CTLSProvider::Create failed") );
+		return EInconclusive;
+		}
+		
+	iStatus = KRequestPending;
+	sessionObj4->ClientKeyExchange(clientKeyExch, iStatus);
+	SetActive();
+	CActiveScheduler::Start();
+	
+	// check that ClientKeyExch is not NULL
+	if ( (NULL == clientKeyExch) || ( 0 == clientKeyExch->Length()) ) 
+		{
+		iLogInfo.Copy( _L("	4.4:  CTLSSession::ClientKeyExchange failed (4)") );
+		return EInconclusive;
+		}
+		
+	delete clientKeyExch;	
+	clientKeyExch = NULL;
+	
+	if( EFalse == CacheSessionL( aStep, sessionObj4) )
+		return EInconclusive;
+	
+	
+	// entry 4 inserted
+	//
+	
+		
+	TTLSSessionId sessionId;		
+	//case A:
+	
+	
+	iStatus = KRequestPending;
+	tlsProvider4->GetSessionL(
+		tlsCryptoAttributes->iSessionNameAndID.iServerName,
+		sessionId, 
+		iStatus );
+		
+		
+	SetActive();
+	CActiveScheduler::Start();
+	
+	if ( ( 0 != sessionId.Length() ) )
+		{
+		iLogInfo.Copy( _L("	4.4:  A: CTLSProvider::GetSession - found session: BAD") );
+		return EFail;
+		}
+		
+	//case B:
+		
+	CTLSProvider* tlsProvider5 = CTLSProvider::ConnectL();
+	
+	
+	CTlsCryptoAttributes* tlsCryptoAttributes5 = tlsProvider5->Attributes();
+		
+	
+	tlsCryptoAttributes5->iNegotiatedProtocol.iMajor = 3;
+	tlsCryptoAttributes5->iNegotiatedProtocol.iMinor = 1; 
+	
+	tlsCryptoAttributes5->iProposedProtocol.iMajor = 2;
+	tlsCryptoAttributes5->iProposedProtocol.iMinor = 0; 
+	
+	TTLSSessionNameAndID sessionNameAndID;
+	sessionNameAndID.iServerName.iAddress.Copy( KServer2 );
+	sessionNameAndID.iServerName.iPort = 10;
+			
+	iStatus = KRequestPending;
+	tlsProvider5->GetSessionL(
+		sessionNameAndID.iServerName,
+		sessionId,
+		iStatus );
+		
+	SetActive();
+	CActiveScheduler::Start();
+	
+	if ( 0 != sessionId.Length()  )
+		{
+		iLogInfo.Copy( _L("	4.4: B: CTLSProvider::GetSession - found session: BAD") );
+		return EFail;
+		}
+		
+	
+	//case C (positive):
+		
+	tlsCryptoAttributes5->iCurrentCipherSuite.iHiByte = 0;
+	tlsCryptoAttributes5->iCurrentCipherSuite.iLoByte = 3;
+	
+		
+	tlsCryptoAttributes5->iNegotiatedProtocol.iMajor = 3;
+	tlsCryptoAttributes5->iNegotiatedProtocol.iMinor = 0; 
+	
+	tlsCryptoAttributes5->iProposedProtocol.iMajor = 3;
+	tlsCryptoAttributes5->iProposedProtocol.iMinor = 0; 
+	
+	iStatus = KRequestPending;
+	tlsProvider5->GetSessionL(
+		sessionNameAndID.iServerName,
+		sessionId,
+		iStatus );
+		
+	SetActive();
+	CActiveScheduler::Start();
+	
+	if ( ( 0 == sessionId.Length() ) )
+		{
+		iLogInfo.Copy( _L("	4.4:  C: CTLSProvider::GetSession - failed") );
+		return EFail;
+		}
+	
+	tlsCryptoAttributes5->iCurrentCipherSuite.iHiByte = 0;
+	tlsCryptoAttributes5->iCurrentCipherSuite.iLoByte = 3;
+	
+		
+	tlsCryptoAttributes5->iNegotiatedProtocol.iMajor = 3;
+	tlsCryptoAttributes5->iNegotiatedProtocol.iMinor = 1; 
+	
+	tlsCryptoAttributes5->iProposedProtocol.iMajor = 3;
+	tlsCryptoAttributes5->iProposedProtocol.iMinor = 1; 
+	
+	iStatus = KRequestPending;
+	tlsProvider5->GetSessionL(
+		sessionNameAndID.iServerName,
+		sessionId,
+		iStatus );
+		
+	SetActive();
+	CActiveScheduler::Start();
+	
+	if ( ( 0 == sessionId.Length() ) )
+		{
+		iLogInfo.Copy( _L("	4.4:  D: CTLSProvider::GetSession - failed") );
+		return EFail;
+		}
+	
+	
+	iLogInfo.Copy( _L("	4.4:  OK") );	
+	
+	delete tlsProvider;	
+	delete tlsProvider2;
+	delete tlsProvider3;
+	delete tlsProvider4;
+	delete tlsProvider5;
+	delete sessionObj;
+	delete sessionObj2;	
+	delete sessionObj3;	
+	delete sessionObj4;	
+		
+	return EPass;
+	
+	} 	
+	
+
+
+TVerdict CTlsProvTestActive::doTest4_5L( CTlsProvStep* aStep )
+	{
+	CTlsTestRandom rnd;
+	
+	SetThreadRandomL( &rnd );
+	
+	RArray<TTLSCipherSuite> userCipherSuiteList;
+	CTLSProvider* tlsProvider = CTLSProvider::ConnectL();
+	
+	iStatus = KRequestPending;
+	tlsProvider->CipherSuitesL( userCipherSuiteList ,iStatus);	
+	SetActive();
+	CActiveScheduler::Start();
+	
+			
+	CTLSSession* sessionObj;
+	
+	CTlsCryptoAttributes* tlsCryptoAttributes = tlsProvider->Attributes();
+	HBufC8* encServerCert = NULL;	
+		
+	TInt res =  StandardTestInitL(aStep, tlsCryptoAttributes, encServerCert);
+	if( res  < 0 )
+		{
+		iLogInfo.Copy( _L("	4.5:  problems with test data files") );
+		return EFail;
+		}
+	tlsCryptoAttributes->iSessionNameAndID.iSessionId.Copy( KSessionId2 );
+		
+	CX509Certificate* serverCert = NULL;
+	iStatus = KRequestPending;
+	tlsProvider->VerifyServerCertificate( encServerCert->Des(), serverCert, iStatus);
+	SetActive();
+	CActiveScheduler::Start();
+	
+	HBufC8* clientKeyExch = NULL;
+	
+	iStatus = KRequestPending;
+	tlsProvider->CreateL( sessionObj,
+						iStatus);	
+	SetActive();
+	CActiveScheduler::Start();	
+	
+	// check that ClientKeyExch is not NULL
+	if ( (iStatus.Int() != KErrNone ) || (NULL == sessionObj) )
+		{
+		iLogInfo.Copy( _L("	4.5:  CTLSProvider::Create failed") );
+		return EInconclusive;
+		}
+		
+	iStatus = KRequestPending;
+	sessionObj->ClientKeyExchange(clientKeyExch, iStatus);
+	SetActive();
+	CActiveScheduler::Start();
+	
+	// check that ClientKeyExch is not NULL
+	if ( (NULL == clientKeyExch) || ( 0 == clientKeyExch->Length()) ) 
+		{
+		iLogInfo.Copy( _L("	4.5:  CTLSSession::ClientKeyExchange failed") );
+		return EInconclusive;
+		}
+		
+	if( EFalse == CacheSessionL( aStep, sessionObj) )
+		return EInconclusive;
+	
+		
+	TTLSSessionNameAndID sessionNameAndId;
+	
+	sessionNameAndId.iServerName.iAddress.Copy( KServer1 );
+	sessionNameAndId.iServerName.iPort = 10;
+	sessionNameAndId.iSessionId.Append( KSessionId2 );
+	 
+	
+	iStatus = KRequestPending;
+	tlsProvider->ClearSessionCacheL( 
+			sessionNameAndId, 
+			iStatus);
+	SetActive();
+	CActiveScheduler::Start();
+	
+	if ( (KErrNone != iStatus.Int()) )
+		{
+		iLogInfo.Copy( _L("	4.5:  CTLSProvider::ClearSessionCache - failed") );
+		return EFail;
+		}
+	
+	
+	TTLSSessionId sessionId;
+	
+	iStatus = KRequestPending;
+	tlsProvider->GetSessionL(
+		sessionNameAndId.iServerName,
+		sessionId,
+		iStatus );
+		
+		
+	SetActive();
+	CActiveScheduler::Start();
+		
+	if ( ( 0 != sessionId.Length() ) )
+		{
+		iLogInfo.Copy( _L("	4.5:  session cleared but STILL in cache") );
+		return EFail;
+		}
+	
+	
+	iLogInfo.Copy( _L("	4.5:  OK") );
+	
+	
+	return EPass;
+	
+	} 	
+
+
+TVerdict CTlsProvTestActive::doTest4_6L( CTlsProvStep* aStep )
+	{
+	CTlsTestRandom rnd;
+	
+	SetThreadRandomL( &rnd ); 
+	
+	RArray<TTLSCipherSuite> userCipherSuiteList;
+	CTLSProvider* tlsProvider = CTLSProvider::ConnectL();
+	CTLSProvider* tlsProvider2 = CTLSProvider::ConnectL();
+	CTLSProvider* tlsProvider3 = CTLSProvider::ConnectL();
+	
+	CTLSSession* sessionObj;
+	CTLSSession* sessionObj2;
+	CTLSSession* sessionObj3;
+	
+		
+	iStatus = KRequestPending;
+	tlsProvider->CipherSuitesL( userCipherSuiteList ,iStatus);	
+	SetActive();
+	CActiveScheduler::Start();
+				
+	
+	CTlsCryptoAttributes* tlsCryptoAttributes = tlsProvider->Attributes();
+		
+	HBufC8* encServerCert = NULL;
+		
+	TInt res =  StandardTestInitL(aStep, tlsCryptoAttributes, encServerCert);
+	if( res  < 0 )
+		{
+		iLogInfo.Copy( _L("	4.6:  problems with test data files") );
+		return EFail;
+		}
+		
+	CX509Certificate* serverCert = NULL;
+	iStatus = KRequestPending;
+	tlsProvider->VerifyServerCertificate( encServerCert->Des(), serverCert, iStatus);
+	SetActive();
+	CActiveScheduler::Start();
+	
+		
+	HBufC8* clientKeyExch = NULL;
+	
+	iStatus = KRequestPending;
+	tlsProvider->CreateL( sessionObj,
+						iStatus);	
+	SetActive();
+	CActiveScheduler::Start();	
+	
+	// check that ClientKeyExch is not NULL
+	if ( (iStatus.Int() != KErrNone ) || (NULL == sessionObj) ) 
+		{
+		iLogInfo.Copy( _L("	4.6:  CTLSProvider::Create failed") );
+		return EInconclusive;
+		}
+		
+	iStatus = KRequestPending;
+	sessionObj->ClientKeyExchange(clientKeyExch, iStatus);
+	SetActive();
+	CActiveScheduler::Start();
+	
+	// check that ClientKeyExch is not NULL
+	if ( (NULL == clientKeyExch) || ( 0 == clientKeyExch->Length()) ) 
+		{
+		iLogInfo.Copy( _L("	4.6:  CTLSSession::ClientKeyExchange failed") );
+		return EInconclusive;
+		}
+	
+	
+	if( EFalse == CacheSessionL( aStep, sessionObj) )
+		return EInconclusive;
+		
+		
+				
+	//
+	// entry 2 
+	
+	delete clientKeyExch;	
+	clientKeyExch = NULL;
+		
+	
+	CTlsCryptoAttributes* tlsCryptoAttributes2 = tlsProvider2->Attributes();
+	
+	delete encServerCert;
+	encServerCert = NULL;	
+		
+	res = StandardTestInitL(aStep, tlsCryptoAttributes2, encServerCert);
+	if( res  < 0 )
+		{
+		iLogInfo.Copy( _L("	4.6:  problems with test data files") );
+		return EFail;
+		}
+	tlsCryptoAttributes2->iSessionNameAndID.iSessionId.Copy( KSessionId2 );
+	
+	RArray<TTLSCipherSuite> userCipherSuiteList2;
+	iStatus = KRequestPending;
+	tlsProvider2->CipherSuitesL( userCipherSuiteList2 ,iStatus);	
+	SetActive();
+	CActiveScheduler::Start();
+	
+	delete serverCert;
+	serverCert = NULL;
+	iStatus = KRequestPending;
+	tlsProvider2->VerifyServerCertificate( encServerCert->Des(), serverCert, iStatus);
+	SetActive();
+	CActiveScheduler::Start();
+		
+	iStatus = KRequestPending;
+	tlsProvider2->CreateL( sessionObj2,
+						iStatus);	
+	SetActive();
+	CActiveScheduler::Start();	
+	
+	// check that ClientKeyExch is not NULL
+	if ( (iStatus.Int() != KErrNone ) || (NULL == sessionObj2) ) 
+		{
+		iLogInfo.Copy( _L("	4.6:  CTLSProvider::Create failed") );
+		return EInconclusive;
+		}
+		
+	iStatus = KRequestPending;
+	sessionObj2->ClientKeyExchange(clientKeyExch, iStatus);
+	SetActive();
+	CActiveScheduler::Start();
+	
+	// check that ClientKeyExch is not NULL
+	if ( (NULL == clientKeyExch) || ( 0 == clientKeyExch->Length()) ) 
+		{
+		iLogInfo.Copy( _L("	4.6:  CTLSSession::ClientKeyExchange failed") );
+		return EInconclusive;
+		}
+		
+	delete clientKeyExch;	
+	clientKeyExch = NULL;
+	
+	
+	if( EFalse == CacheSessionL( aStep, sessionObj2) )
+		return EInconclusive;
+	
+	// entry 2 
+	//
+	
+	
+	//
+	// entry 3
+	
+	delete clientKeyExch;	
+	clientKeyExch = NULL;
+	
+	RArray<TTLSCipherSuite> userCipherSuiteList3;
+		
+	iStatus = KRequestPending;
+	tlsProvider3->CipherSuitesL( userCipherSuiteList3 ,iStatus);	
+	SetActive();
+	CActiveScheduler::Start();
+	
+		
+	
+	aStep->GetStringFromConfig(aStep->ConfigSection(),_L("ServerRnd2"),aStep->iServerRnd);
+	aStep->GetStringFromConfig(aStep->ConfigSection(),_L("ClientRnd2"),aStep->iClientRnd);
+	aStep->GetStringFromConfig(aStep->ConfigSection(),_L("KeyParams1_2"),aStep->iKeyParam1);
+	aStep->GetStringFromConfig(aStep->ConfigSection(),_L("KeyParams2_2"),aStep->iKeyParam2);
+	aStep->GetStringFromConfig(aStep->ConfigSection(),_L("KeyParams3_2"),aStep->iKeyParam3);
+	aStep->GetStringFromConfig(aStep->ConfigSection(),_L("ServerCert2"),aStep->iServerCertChain);
+	aStep->GetStringFromConfig(aStep->ConfigSection(),_L("ClientKeyExch2"),aStep->iClientKeyExch);
+		
+	CTlsCryptoAttributes* tlsCryptoAttributes3 = tlsProvider3->Attributes();
+	
+	tlsCryptoAttributes3->iClientAuthenticate = EFalse;
+	tlsCryptoAttributes3->iDialogNonAttendedMode = ETrue;
+	
+	tlsCryptoAttributes3->iSessionNameAndID.iServerName.iAddress.Copy( KServer1 );
+	tlsCryptoAttributes3->iSessionNameAndID.iServerName.iPort = 10;
+	tlsCryptoAttributes3->iSessionNameAndID.iSessionId.Append( KSessionId3 );
+	 
+	
+	tlsCryptoAttributes3->iCompressionMethod = ENullCompression;
+	tlsCryptoAttributes3->iCurrentCipherSuite.iHiByte = 0;
+	tlsCryptoAttributes3->iCurrentCipherSuite.iLoByte = 0x16;
+	
+		
+	tlsCryptoAttributes3->iNegotiatedProtocol.iMajor = 3;
+	tlsCryptoAttributes3->iNegotiatedProtocol.iMinor = 1; 
+	
+	tlsCryptoAttributes3->iProposedProtocol.iMajor = 3;
+	tlsCryptoAttributes3->iProposedProtocol.iMinor = 1; 
+		
+		
+	tlsCryptoAttributes3->iPublicKeyParams->iKeyType = EDHE;
+		
+	
+	tlsCryptoAttributes3->iClientAuthenticate = EFalse; 
+	tlsCryptoAttributes3->iDialogNonAttendedMode = ETrue;
+	
+	delete encServerCert;
+	encServerCert = NULL;	
+	
+	res = aStep->ReadDataForCreateL(tlsCryptoAttributes3, encServerCert);
+			
+	if( res  < 0 )
+		{
+		iLogInfo.Copy( _L("	4.6:  problems with test data files") );
+		return EFail;
+		}
+	
+	delete serverCert;
+	serverCert = NULL;
+	iStatus = KRequestPending;
+	tlsProvider3->VerifyServerCertificate( encServerCert->Des(), serverCert, iStatus);
+	SetActive();
+	CActiveScheduler::Start();
+	
+	iStatus = KRequestPending;
+	tlsProvider3->CreateL( sessionObj3,
+						iStatus);	
+	SetActive();
+	CActiveScheduler::Start();	
+	
+	HBufC8* clientKeyExchFromFile = NULL;
+	res = aStep->ReadClientKeyExchL( clientKeyExchFromFile );
+	if( res  < 0 )
+		{
+		iLogInfo.Copy( _L("	4.6:  problems with test data files (client key exchange)") );
+		return EFail;
+		}
+			
+	// check that ClientKeyExch is not NULL
+	if ( (iStatus.Int() != KErrNone ) || (NULL == sessionObj3) )
+		{
+		iLogInfo.Copy( _L("	4.6:  CTLSProvider::Create failed") );
+		return EInconclusive;
+		}
+		
+		
+	iStatus = KRequestPending;
+	sessionObj3->ClientKeyExchange(clientKeyExch, iStatus);
+	SetActive();
+	CActiveScheduler::Start();
+		
+		
+	// check that ClientKeyExch is not NULL
+	if (  0 != clientKeyExchFromFile->Compare( clientKeyExch->Des() )  )
+		{
+		iLogInfo.Copy( _L("	4.6:  Client key exchange BAD (3, DHE)") );
+		return EInconclusive;
+		}
+	
+	// session should have been cached up to now but not set to resumable yet -
+	// and it's left unresumable to check whether will be cleared after cache 
+	// entries lifetime timeout
+	
+	//  entry 3
+	//
+				
+	// before timeout:
+	
+	TTLSSessionId sessionId;
+	
+	iStatus = KRequestPending;
+	tlsProvider2->GetSessionL(
+		tlsCryptoAttributes->iSessionNameAndID.iServerName,
+		sessionId,
+		iStatus );
+		
+		
+	SetActive();
+	CActiveScheduler::Start();
+	
+	if ( ( 0 == sessionId.Length() ) )
+		{
+		iLogInfo.Copy( _L("	4.6:  Before timeout: CTLSProvider::GetSession - returned nothing") );
+		return EFail;
+		}
+		
+		
+	// wait for timeout:
+	RTimer timer;
+	timer.CreateLocal();
+	TTimeIntervalMicroSeconds32 waitTime( 1000000*(KTLSCachingTimeout + 5));
+	timer.After( iStatus, waitTime);
+	SetActive();
+	CActiveScheduler::Start();	
+	
+	// after timeout
+	sessionId.Zero();	
+	
+	iStatus = KRequestPending;
+	tlsProvider2->GetSessionL(
+		tlsCryptoAttributes->iSessionNameAndID.iServerName,
+		sessionId, 
+		iStatus );
+		
+		
+	SetActive();
+	CActiveScheduler::Start();
+	
+	if ( ( 0 != sessionId.Length() ) )
+		{
+		iLogInfo.Copy( _L("	4.6:  After timeout: CTLSProvider::GetSession - cache NOT empty") );
+		return EFail;
+		}
+	
+		
+	iLogInfo.Copy( _L("	4.6:  OK") );	
+	
+	delete tlsProvider;	
+	delete tlsProvider2;
+	delete tlsProvider3;
+	
+	delete sessionObj;
+	delete sessionObj2;		
+	delete sessionObj3;		
+	
+	return EPass;
+			
+	} 
+	
+