sl@0: /*
sl@0: * Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0: * All rights reserved.
sl@0: * This component and the accompanying materials are made available
sl@0: * under the terms of the License "Eclipse Public License v1.0"
sl@0: * which accompanies this distribution, and is available
sl@0: * at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0: *
sl@0: * Initial Contributors:
sl@0: * Nokia Corporation - initial contribution.
sl@0: *
sl@0: * Contributors:
sl@0: *
sl@0: * Description: 
sl@0: *
sl@0: */
sl@0: 
sl@0: 
sl@0: #include <padding.h>
sl@0: #include "tpaddingSSLv3.h"
sl@0: #include <securityerr.h>
sl@0: 
sl@0: CTestPadSSLv3::CTestPadSSLv3()
sl@0: 	{
sl@0:    SetTestStepName(KPadSSLv3);
sl@0: 	}
sl@0: 
sl@0: CTestPadSSLv3::~CTestPadSSLv3()
sl@0: 	{
sl@0: 	}
sl@0: 
sl@0: TVerdict CTestPadSSLv3::doTestStepL()
sl@0: 	{
sl@0:     SetTestStepResult(EPass);
sl@0:     __UHEAP_MARK;
sl@0: 
sl@0: 	INFO_PRINTF1(_L("Test of padding with type SSLv3"));
sl@0: 
sl@0: 	TInt blockSize;
sl@0:     TInt textSize;
sl@0: 
sl@0: 	if (!GetStringFromConfig(ConfigSection(), _L("TestCaseName"), iTestCaseName))
sl@0:  		{
sl@0:  		INFO_PRINTF1(_L("Could not find TestCaseName in tpadSSLv3.ini"));
sl@0:       	return EFail;
sl@0:  		}
sl@0:    
sl@0:     if (!GetIntFromConfig(ConfigSection(), _L("BlockSize"), blockSize))
sl@0:  		{
sl@0:  		INFO_PRINTF1(_L("Could not find blocksize in tpadSSLv3.ini"));
sl@0:       	return EFail;
sl@0:  		}
sl@0:  		
sl@0:   	if(iTestCaseName.Compare(_L("CipherAES_CBC"))==0 || iTestCaseName.Compare(_L("CipherDES_CBC"))==0 || iTestCaseName.Compare(_L("CipherRC2_CBC"))==0)
sl@0:  		{
sl@0:  		TestSSLv3Padding(blockSize);
sl@0:  		}
sl@0:  	else
sl@0:  		{
sl@0:  		if (!GetIntFromConfig(ConfigSection(), _L("TextSize"), textSize))
sl@0:    			{
sl@0:       		INFO_PRINTF1(_L("Could not find TextSize in tpadSSLv3.ini"));
sl@0:       		return EFail;
sl@0:    			}
sl@0:    		if (!GetStringFromConfig(ConfigSection(), _L("ExpectedResult"), iExpectedResult))
sl@0:  			{
sl@0:  			INFO_PRINTF1(_L("Could not find TextSize in tpadSSLv3.ini"));
sl@0:       		return EFail;
sl@0:  			}
sl@0:  		TestSSLv3CorruptPadding(blockSize, textSize);	
sl@0:  		}
sl@0: 	__UHEAP_MARKEND;
sl@0: 	return TestStepResult();
sl@0: 	}
sl@0: 
sl@0: void CTestPadSSLv3::TestSSLv3Padding(TInt aBlockSize)
sl@0: 	{
sl@0: 	CPaddingSSLv3 *padding = CPaddingSSLv3::NewLC(aBlockSize);
sl@0: 
sl@0: 	for (TInt i = 0 ; i <= aBlockSize; i++)
sl@0: 		{
sl@0: 		HBufC8 *padInData = HBufC8::NewLC(i);
sl@0: 		HBufC8 *padOutData = HBufC8::NewLC(i+(aBlockSize-i%aBlockSize));
sl@0: 		TPtr8 in(padInData->Des());
sl@0: 		TPtr8 out(padOutData->Des());
sl@0: 		TInt j;
sl@0:       
sl@0: 		for (j = 0; j < i; j++)
sl@0: 			{
sl@0: 			TInt text('a'+j%25);
sl@0: 			in.Append(text);
sl@0: 			}
sl@0: 		TRAPD(err, padding->DoPadL(in, out));
sl@0: 		INFO_PRINTF3(_L("The error returned for input size %d is %d"), i, err);
sl@0: 		TEST(err == KErrNone);
sl@0: 
sl@0: 		TInt totalLength = out.Length();
sl@0: 		TInt paddingLength = aBlockSize - in.Length()%aBlockSize;
sl@0: 		// Test that the total length is a multiple of blockSize
sl@0: 		TEST((totalLength % aBlockSize) == 0);
sl@0:       
sl@0: 		// Test that the padding bytes are equal in value to the paddingLength,
sl@0: 		// ie, if padding length is 5 the 5 last octets in the out array should be 0x05
sl@0: 		// This is according to RFC2246 (TLS1.0). The padding content in SSL3.0 is arbitrary.
sl@0: 		for (TInt i = paddingLength; i > 0 ; i--)
sl@0: 			{
sl@0: 			TEST(out[out.Length()-i] == paddingLength - 1);
sl@0: 			}
sl@0: 
sl@0: 		// Test that the data has not been corrupted
sl@0: 		TEST(in == out.Left(out.Length() - paddingLength));
sl@0:       
sl@0: 		CleanupStack::PopAndDestroy(2, padInData); // padInData, padOutData
sl@0: 		}
sl@0: 	CleanupStack::PopAndDestroy(padding);
sl@0: 	}
sl@0: 
sl@0: void CTestPadSSLv3::TestSSLv3CorruptPadding(TInt aBlockSize, TInt aTextSize)
sl@0: 	{
sl@0: 	CPaddingSSLv3 *padding = CPaddingSSLv3::NewLC(aBlockSize);
sl@0: 
sl@0: 	HBufC8 *padInData = HBufC8::NewLC(aTextSize);
sl@0: 	TInt paddingBytes = 0;
sl@0: 	//If BlockSize is 0, Divide by 0 is undefined
sl@0: 	if(aBlockSize != 0)
sl@0: 		{
sl@0: 		paddingBytes = (aBlockSize - aTextSize % aBlockSize);
sl@0: 		}
sl@0: 	HBufC8 *padOutData = HBufC8::NewLC(aTextSize + paddingBytes);
sl@0: 	TPtr8 in(padInData->Des());
sl@0: 	TPtr8 out(padOutData->Des());
sl@0: 	TInt j;
sl@0:       
sl@0: 	for (j = 0; j < aTextSize; j++)
sl@0:    		{
sl@0: 	 	TInt text('a'+j%25);
sl@0: 	 	in.Append(text);
sl@0:       	}
sl@0: 	TRAPD(err, padding->DoPadL(in, out));
sl@0:   
sl@0: 	if(iExpectedResult.Compare(_L("CorruptBlockSize")) ==0)
sl@0:  		{
sl@0:  		TEST(err == KErrArgument);
sl@0:  		}
sl@0: 	else if(iExpectedResult.Compare(_L("Valid")) ==0)
sl@0:  		{
sl@0:  		TEST(err == KErrNone);
sl@0:  		}
sl@0: 	else if(iExpectedResult.Compare(_L("InvalidPadding")) == 0)
sl@0: 		{
sl@0: 		TEST(err == KErrInvalidPadding);
sl@0: 		}	
sl@0: 
sl@0: 	TInt totalLength = out.Length();
sl@0: 	TInt paddingLength = 0;
sl@0: 	//If BlockSize is 0, Divide by 0 is undefined
sl@0: 	if(aBlockSize != 0)
sl@0: 		{
sl@0:       	paddingLength = aBlockSize - in.Length()%aBlockSize;
sl@0: 		}
sl@0: 	//If BlockSize is 0, Divide by 0 is undefined
sl@0: 	if(aBlockSize != 0)
sl@0: 		{
sl@0:    		// Test that the total length is a multiple of blockSize
sl@0: 		TEST((totalLength % aBlockSize) == 0);
sl@0: 		}
sl@0:       
sl@0: 	// Test that the padding bytes are equal in value to the paddingLength,
sl@0: 	// ie, if padding length is 5 the 5 last octets in the out array should be 0x05
sl@0: 	// This is according to RFC2246 (TLS1.0). The padding content in SSL3.0 is arbitrary.
sl@0: 	for (TInt i = paddingLength; i > 0 ; i--)
sl@0: 		{
sl@0: 	 	TEST(out[out.Length()-i] == paddingLength - 1);
sl@0:       	}
sl@0: 
sl@0: 	if(aBlockSize > 0)
sl@0:    		{
sl@0:    		// Test that the data has not been corrupted
sl@0:    		TEST(in == out.Left(out.Length() - paddingLength));
sl@0:    		}
sl@0:           
sl@0: 	CleanupStack::PopAndDestroy(2, padInData); // padInData, padOutData
sl@0: 	CleanupStack::PopAndDestroy(padding);
sl@0: 	}
sl@0: 
sl@0: CTestUnpadSSLv3::CTestUnpadSSLv3()
sl@0: 	{
sl@0: 	SetTestStepName(KUnpadSSLv3);
sl@0: 	}
sl@0: 
sl@0: CTestUnpadSSLv3::~CTestUnpadSSLv3()
sl@0: 	{
sl@0: 	}
sl@0: 
sl@0: TVerdict CTestUnpadSSLv3::doTestStepL()
sl@0: 	{
sl@0: 	SetTestStepResult(EPass);
sl@0: 	__UHEAP_MARK;
sl@0: 
sl@0: 	INFO_PRINTF1(_L("Test of unpadding with type SSLv3"));
sl@0: 
sl@0: 	TInt blockSize;
sl@0: 	TInt textSize;
sl@0: 	if (!GetIntFromConfig(ConfigSection(), _L("BlockSize"), blockSize))
sl@0:  		{
sl@0:  		INFO_PRINTF1(_L("Could not find blocksize in tpadSSLv3.ini"));
sl@0:       	return EFail;
sl@0:  		}
sl@0:  		
sl@0:  	if (!GetStringFromConfig(ConfigSection(), _L("TestCaseName"), iTestCaseName))
sl@0:  		{
sl@0:  		INFO_PRINTF1(_L("Could not find TestCaseName in tpadSSLv3.ini"));
sl@0:       	return EFail;
sl@0:  		}	
sl@0:  	
sl@0:  	if(iTestCaseName.Compare(_L("CipherAES_CBC"))==0 || iTestCaseName.Compare(_L("CipherDES_CBC"))==0 || iTestCaseName.Compare(_L("CipherRC2_CBC"))==0)
sl@0:  		{
sl@0:  		TestSSLv3Unpadding(blockSize);
sl@0:  		}
sl@0:  	else
sl@0:  		{
sl@0:  		if (!GetIntFromConfig(ConfigSection(), _L("TextSize"), textSize))
sl@0:    			{
sl@0:       		INFO_PRINTF1(_L("Could not find TextSize in tpadSSLv3.ini"));
sl@0:       		return EFail;
sl@0:    			}
sl@0:    			
sl@0:    		if (!GetStringFromConfig(ConfigSection(), _L("ExpectedResult"), iExpectedResult))
sl@0:  			{
sl@0:  			INFO_PRINTF1(_L("Could not find TextSize in tpadSSLv3.ini"));
sl@0:       		return EFail;
sl@0:  			}
sl@0:  		TestSSLv3CorruptUnpadding(blockSize, textSize);	
sl@0:  		}
sl@0: 
sl@0: 	__UHEAP_MARKEND;
sl@0: 	return TestStepResult();
sl@0: 	}
sl@0: 
sl@0: void CTestUnpadSSLv3::TestSSLv3Unpadding(TInt aBlockSize)
sl@0: 	{
sl@0: 	CPaddingSSLv3 *padding = CPaddingSSLv3::NewLC(aBlockSize);
sl@0: 
sl@0: 	for (TInt i = 0 ; i <= aBlockSize; i++)
sl@0: 		{
sl@0: 		HBufC8 *padInData = HBufC8::NewLC(i+(aBlockSize - i%aBlockSize));
sl@0: 		HBufC8 *padOutData = HBufC8::NewLC(i);
sl@0: 		HBufC8 *padCompareData = HBufC8::NewLC(i);
sl@0: 		TPtr8 in(padInData->Des());
sl@0: 		TPtr8 out(padOutData->Des());
sl@0: 		TPtr8 comp(padCompareData->Des());
sl@0: 		TInt j;
sl@0:       
sl@0: 		// build up a padded string here
sl@0: 		for (j = 0; j < i; j++)
sl@0: 			{
sl@0: 			TInt text('a'+j%25);
sl@0: 			in.Append(text);
sl@0: 			}
sl@0: 		comp.Append(in);
sl@0:       
sl@0: 		TInt paddingBytes = aBlockSize - i%aBlockSize;
sl@0: 		in.SetLength(in.Length() + paddingBytes);
sl@0: 
sl@0: 		// pad with arbitary data, to test unpadding of SSL 3.0 padded data
sl@0: 		in[in.Length()-1] = (TUint8) (paddingBytes - 1);
sl@0: 		for (j = 2; j <= paddingBytes; j++)
sl@0: 			{
sl@0: 			in[in.Length()-j] = (TUint8) ('a' + j%25);
sl@0: 			}
sl@0: 		TRAPD(err, padding->UnPadL(in, out));
sl@0: 		INFO_PRINTF3(_L("The error returned for input size %d is %d"), i, err);
sl@0: 		TEST(err == KErrNone);
sl@0: 
sl@0: 		// test if the unpadding was correct.
sl@0: 		TEST(out == comp);
sl@0:       
sl@0: 		CleanupStack::PopAndDestroy(3, padInData); // padInData, padOutData, padCompareData
sl@0: 		}
sl@0: 	CleanupStack::PopAndDestroy(padding);
sl@0: 	}
sl@0: 
sl@0: void CTestUnpadSSLv3::TestSSLv3CorruptUnpadding(TInt aBlockSize, TInt aTextSize)
sl@0: 	{
sl@0: 	CPaddingSSLv3 *padding = CPaddingSSLv3::NewLC(aBlockSize);
sl@0:    
sl@0: 	TInt paddingBytes = 0;
sl@0: 	//If BlockSize is 0, Divide by 0 is undefined
sl@0: 	if(aBlockSize != 0)
sl@0:    		{
sl@0:    		paddingBytes = aBlockSize - aTextSize%aBlockSize;
sl@0:    		}
sl@0: 	HBufC8 *padInData = HBufC8::NewLC(aTextSize+ paddingBytes);
sl@0: 	HBufC8 *padOutData = HBufC8::NewLC(aTextSize);
sl@0: 	HBufC8 *padCompareData = HBufC8::NewLC(aTextSize);
sl@0: 	TPtr8 in(padInData->Des());
sl@0: 	TPtr8 out(padOutData->Des());
sl@0: 	TPtr8 comp(padCompareData->Des());
sl@0: 	TInt j;
sl@0:    
sl@0: 	if(in.Length() < aTextSize)
sl@0: 		{
sl@0: 		for (j = 0; j < in.Length(); j++)
sl@0:    			{
sl@0: 	 		TInt text('a'+j%25);
sl@0: 	 		in.Append(text);
sl@0:       		}
sl@0: 		}
sl@0: 	else
sl@0: 		{
sl@0: 		// build up a padded string here
sl@0: 		for (j = 0; j < aTextSize; j++)
sl@0:    			{
sl@0: 	 		TInt text('a'+j%25);
sl@0: 	 		in.Append(text);
sl@0:       		}
sl@0: 		}
sl@0: 	comp.Append(in);
sl@0:    
sl@0: 	in.SetLength(in.Length() + paddingBytes);
sl@0: 
sl@0: 	if(aBlockSize > 0)
sl@0:   		{
sl@0:    		// pad with arbitary data, to test unpadding of SSL 3.0 padded data
sl@0:    		in[in.Length()-1] = (TUint8) (paddingBytes - 1);
sl@0:    		for (j = 2; j <= paddingBytes; j++)
sl@0:    			{
sl@0: 	 		in[in.Length()-j] = (TUint8) ('a' + j%25);
sl@0:       		}
sl@0:   		 }  
sl@0: 	TRAPD(err, padding->UnPadL(in, out));
sl@0:    
sl@0:     if(iExpectedResult.Compare(_L("CorruptBlockSize")) ==0)
sl@0:  		{
sl@0:  		TEST(err == KErrArgument);
sl@0:  		}
sl@0: 	else if(iExpectedResult.Compare(_L("Valid")) ==0)
sl@0:  		{
sl@0:  		TEST(err == KErrNone);
sl@0:  		}
sl@0: 	else if(iExpectedResult.Compare(_L("InvalidPadding")) == 0)
sl@0: 		{
sl@0: 		TEST(err == KErrInvalidPadding);
sl@0: 		}
sl@0: 	// test if the unpadding was correct.
sl@0: 	TEST(out == comp);
sl@0: 	CleanupStack::PopAndDestroy(3, padInData); // padInData, padOutData, padCompareData
sl@0: 	CleanupStack::PopAndDestroy(padding);
sl@0: 	}