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 sl@0: #include "tpaddingSSLv3.h" sl@0: #include 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->PadL(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->PadL(in, out)); sl@0: 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: //Skip the check of padded data if the padding is unsuccessful(no padding is done), sl@0: //otherwise we'll get panic on erroneous operations on output descriptor. sl@0: if(err != KErrNone) sl@0: { sl@0: CleanupStack::PopAndDestroy(2, padInData); // padInData, padOutData sl@0: CleanupStack::PopAndDestroy(padding); sl@0: return; 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: }