diff -r 970c0057d9bc -r de46a57f75fb crypto/weakcrypto/test/tpadding/tpaddingSSLv3.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/crypto/weakcrypto/test/tpadding/tpaddingSSLv3.cpp Thu Jun 24 15:39:07 2010 +0530 @@ -0,0 +1,349 @@ +/* +* Copyright (c) 2004-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 +#include "tpaddingSSLv3.h" +#include + +CTestPadSSLv3::CTestPadSSLv3() + { + SetTestStepName(KPadSSLv3); + } + +CTestPadSSLv3::~CTestPadSSLv3() + { + } + +TVerdict CTestPadSSLv3::doTestStepL() + { + SetTestStepResult(EPass); + __UHEAP_MARK; + + INFO_PRINTF1(_L("Test of padding with type SSLv3")); + + TInt blockSize; + TInt textSize; + + if (!GetStringFromConfig(ConfigSection(), _L("TestCaseName"), iTestCaseName)) + { + INFO_PRINTF1(_L("Could not find TestCaseName in tpadSSLv3.ini")); + return EFail; + } + + if (!GetIntFromConfig(ConfigSection(), _L("BlockSize"), blockSize)) + { + INFO_PRINTF1(_L("Could not find blocksize in tpadSSLv3.ini")); + return EFail; + } + + if(iTestCaseName.Compare(_L("CipherAES_CBC"))==0 || iTestCaseName.Compare(_L("CipherDES_CBC"))==0 || iTestCaseName.Compare(_L("CipherRC2_CBC"))==0) + { + TestSSLv3Padding(blockSize); + } + else + { + if (!GetIntFromConfig(ConfigSection(), _L("TextSize"), textSize)) + { + INFO_PRINTF1(_L("Could not find TextSize in tpadSSLv3.ini")); + return EFail; + } + if (!GetStringFromConfig(ConfigSection(), _L("ExpectedResult"), iExpectedResult)) + { + INFO_PRINTF1(_L("Could not find TextSize in tpadSSLv3.ini")); + return EFail; + } + TestSSLv3CorruptPadding(blockSize, textSize); + } + __UHEAP_MARKEND; + return TestStepResult(); + } + +void CTestPadSSLv3::TestSSLv3Padding(TInt aBlockSize) + { + CPaddingSSLv3 *padding = CPaddingSSLv3::NewLC(aBlockSize); + + for (TInt i = 0 ; i <= aBlockSize; i++) + { + HBufC8 *padInData = HBufC8::NewLC(i); + HBufC8 *padOutData = HBufC8::NewLC(i+(aBlockSize-i%aBlockSize)); + TPtr8 in(padInData->Des()); + TPtr8 out(padOutData->Des()); + TInt j; + + for (j = 0; j < i; j++) + { + TInt text('a'+j%25); + in.Append(text); + } + TRAPD(err, padding->DoPadL(in, out)); + INFO_PRINTF3(_L("The error returned for input size %d is %d"), i, err); + TEST(err == KErrNone); + + TInt totalLength = out.Length(); + TInt paddingLength = aBlockSize - in.Length()%aBlockSize; + // Test that the total length is a multiple of blockSize + TEST((totalLength % aBlockSize) == 0); + + // Test that the padding bytes are equal in value to the paddingLength, + // ie, if padding length is 5 the 5 last octets in the out array should be 0x05 + // This is according to RFC2246 (TLS1.0). The padding content in SSL3.0 is arbitrary. + for (TInt i = paddingLength; i > 0 ; i--) + { + TEST(out[out.Length()-i] == paddingLength - 1); + } + + // Test that the data has not been corrupted + TEST(in == out.Left(out.Length() - paddingLength)); + + CleanupStack::PopAndDestroy(2, padInData); // padInData, padOutData + } + CleanupStack::PopAndDestroy(padding); + } + +void CTestPadSSLv3::TestSSLv3CorruptPadding(TInt aBlockSize, TInt aTextSize) + { + CPaddingSSLv3 *padding = CPaddingSSLv3::NewLC(aBlockSize); + + HBufC8 *padInData = HBufC8::NewLC(aTextSize); + TInt paddingBytes = 0; + //If BlockSize is 0, Divide by 0 is undefined + if(aBlockSize != 0) + { + paddingBytes = (aBlockSize - aTextSize % aBlockSize); + } + HBufC8 *padOutData = HBufC8::NewLC(aTextSize + paddingBytes); + TPtr8 in(padInData->Des()); + TPtr8 out(padOutData->Des()); + TInt j; + + for (j = 0; j < aTextSize; j++) + { + TInt text('a'+j%25); + in.Append(text); + } + TRAPD(err, padding->DoPadL(in, out)); + + if(iExpectedResult.Compare(_L("CorruptBlockSize")) ==0) + { + TEST(err == KErrArgument); + } + else if(iExpectedResult.Compare(_L("Valid")) ==0) + { + TEST(err == KErrNone); + } + else if(iExpectedResult.Compare(_L("InvalidPadding")) == 0) + { + TEST(err == KErrInvalidPadding); + } + + TInt totalLength = out.Length(); + TInt paddingLength = 0; + //If BlockSize is 0, Divide by 0 is undefined + if(aBlockSize != 0) + { + paddingLength = aBlockSize - in.Length()%aBlockSize; + } + //If BlockSize is 0, Divide by 0 is undefined + if(aBlockSize != 0) + { + // Test that the total length is a multiple of blockSize + TEST((totalLength % aBlockSize) == 0); + } + + // Test that the padding bytes are equal in value to the paddingLength, + // ie, if padding length is 5 the 5 last octets in the out array should be 0x05 + // This is according to RFC2246 (TLS1.0). The padding content in SSL3.0 is arbitrary. + for (TInt i = paddingLength; i > 0 ; i--) + { + TEST(out[out.Length()-i] == paddingLength - 1); + } + + if(aBlockSize > 0) + { + // Test that the data has not been corrupted + TEST(in == out.Left(out.Length() - paddingLength)); + } + + CleanupStack::PopAndDestroy(2, padInData); // padInData, padOutData + CleanupStack::PopAndDestroy(padding); + } + +CTestUnpadSSLv3::CTestUnpadSSLv3() + { + SetTestStepName(KUnpadSSLv3); + } + +CTestUnpadSSLv3::~CTestUnpadSSLv3() + { + } + +TVerdict CTestUnpadSSLv3::doTestStepL() + { + SetTestStepResult(EPass); + __UHEAP_MARK; + + INFO_PRINTF1(_L("Test of unpadding with type SSLv3")); + + TInt blockSize; + TInt textSize; + if (!GetIntFromConfig(ConfigSection(), _L("BlockSize"), blockSize)) + { + INFO_PRINTF1(_L("Could not find blocksize in tpadSSLv3.ini")); + return EFail; + } + + if (!GetStringFromConfig(ConfigSection(), _L("TestCaseName"), iTestCaseName)) + { + INFO_PRINTF1(_L("Could not find TestCaseName in tpadSSLv3.ini")); + return EFail; + } + + if(iTestCaseName.Compare(_L("CipherAES_CBC"))==0 || iTestCaseName.Compare(_L("CipherDES_CBC"))==0 || iTestCaseName.Compare(_L("CipherRC2_CBC"))==0) + { + TestSSLv3Unpadding(blockSize); + } + else + { + if (!GetIntFromConfig(ConfigSection(), _L("TextSize"), textSize)) + { + INFO_PRINTF1(_L("Could not find TextSize in tpadSSLv3.ini")); + return EFail; + } + + if (!GetStringFromConfig(ConfigSection(), _L("ExpectedResult"), iExpectedResult)) + { + INFO_PRINTF1(_L("Could not find TextSize in tpadSSLv3.ini")); + return EFail; + } + TestSSLv3CorruptUnpadding(blockSize, textSize); + } + + __UHEAP_MARKEND; + return TestStepResult(); + } + +void CTestUnpadSSLv3::TestSSLv3Unpadding(TInt aBlockSize) + { + CPaddingSSLv3 *padding = CPaddingSSLv3::NewLC(aBlockSize); + + for (TInt i = 0 ; i <= aBlockSize; i++) + { + HBufC8 *padInData = HBufC8::NewLC(i+(aBlockSize - i%aBlockSize)); + HBufC8 *padOutData = HBufC8::NewLC(i); + HBufC8 *padCompareData = HBufC8::NewLC(i); + TPtr8 in(padInData->Des()); + TPtr8 out(padOutData->Des()); + TPtr8 comp(padCompareData->Des()); + TInt j; + + // build up a padded string here + for (j = 0; j < i; j++) + { + TInt text('a'+j%25); + in.Append(text); + } + comp.Append(in); + + TInt paddingBytes = aBlockSize - i%aBlockSize; + in.SetLength(in.Length() + paddingBytes); + + // pad with arbitary data, to test unpadding of SSL 3.0 padded data + in[in.Length()-1] = (TUint8) (paddingBytes - 1); + for (j = 2; j <= paddingBytes; j++) + { + in[in.Length()-j] = (TUint8) ('a' + j%25); + } + TRAPD(err, padding->UnPadL(in, out)); + INFO_PRINTF3(_L("The error returned for input size %d is %d"), i, err); + TEST(err == KErrNone); + + // test if the unpadding was correct. + TEST(out == comp); + + CleanupStack::PopAndDestroy(3, padInData); // padInData, padOutData, padCompareData + } + CleanupStack::PopAndDestroy(padding); + } + +void CTestUnpadSSLv3::TestSSLv3CorruptUnpadding(TInt aBlockSize, TInt aTextSize) + { + CPaddingSSLv3 *padding = CPaddingSSLv3::NewLC(aBlockSize); + + TInt paddingBytes = 0; + //If BlockSize is 0, Divide by 0 is undefined + if(aBlockSize != 0) + { + paddingBytes = aBlockSize - aTextSize%aBlockSize; + } + HBufC8 *padInData = HBufC8::NewLC(aTextSize+ paddingBytes); + HBufC8 *padOutData = HBufC8::NewLC(aTextSize); + HBufC8 *padCompareData = HBufC8::NewLC(aTextSize); + TPtr8 in(padInData->Des()); + TPtr8 out(padOutData->Des()); + TPtr8 comp(padCompareData->Des()); + TInt j; + + if(in.Length() < aTextSize) + { + for (j = 0; j < in.Length(); j++) + { + TInt text('a'+j%25); + in.Append(text); + } + } + else + { + // build up a padded string here + for (j = 0; j < aTextSize; j++) + { + TInt text('a'+j%25); + in.Append(text); + } + } + comp.Append(in); + + in.SetLength(in.Length() + paddingBytes); + + if(aBlockSize > 0) + { + // pad with arbitary data, to test unpadding of SSL 3.0 padded data + in[in.Length()-1] = (TUint8) (paddingBytes - 1); + for (j = 2; j <= paddingBytes; j++) + { + in[in.Length()-j] = (TUint8) ('a' + j%25); + } + } + TRAPD(err, padding->UnPadL(in, out)); + + if(iExpectedResult.Compare(_L("CorruptBlockSize")) ==0) + { + TEST(err == KErrArgument); + } + else if(iExpectedResult.Compare(_L("Valid")) ==0) + { + TEST(err == KErrNone); + } + else if(iExpectedResult.Compare(_L("InvalidPadding")) == 0) + { + TEST(err == KErrInvalidPadding); + } + // test if the unpadding was correct. + TEST(out == comp); + CleanupStack::PopAndDestroy(3, padInData); // padInData, padOutData, padCompareData + CleanupStack::PopAndDestroy(padding); + }