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 sl@0: #include "tpaddingPKCS1.h" sl@0: sl@0: CTestPadPKCS1::CTestPadPKCS1() sl@0: { sl@0: SetTestStepName(KPadPKCS1); sl@0: } sl@0: sl@0: CTestPadPKCS1::~CTestPadPKCS1() sl@0: { sl@0: } sl@0: sl@0: TVerdict CTestPadPKCS1::doTestStepL() sl@0: { sl@0: sl@0: __UHEAP_MARK; sl@0: sl@0: INFO_PRINTF1(_L("Test of PKCS1 signature padding")); sl@0: sl@0: SetTestStepResult(EPass); sl@0: INFO_PRINTF1(_L("Blocksize 512")); sl@0: TestPKCS1SignaturePadding(512); sl@0: sl@0: SetTestStepResult(EPass); sl@0: INFO_PRINTF1(_L("Blocksize 1024")); sl@0: TestPKCS1SignaturePadding(1024); sl@0: sl@0: SetTestStepResult(EPass); sl@0: INFO_PRINTF1(_L("Blocksize 2048")); sl@0: TestPKCS1SignaturePadding(2048); sl@0: sl@0: INFO_PRINTF1(_L("Test of PKCS1 encryption padding")); sl@0: sl@0: SetTestStepResult(EPass); sl@0: INFO_PRINTF1(_L("Blocksize 512")); sl@0: TestPKCS1EncryptionPadding(512); sl@0: sl@0: SetTestStepResult(EPass); sl@0: INFO_PRINTF1(_L("Blocksize 1024")); sl@0: TestPKCS1EncryptionPadding(1024); sl@0: sl@0: SetTestStepResult(EPass); sl@0: INFO_PRINTF1(_L("Blocksize 2048")); sl@0: TestPKCS1EncryptionPadding(2048); sl@0: sl@0: sl@0: __UHEAP_MARKEND; sl@0: return TestStepResult(); sl@0: } sl@0: sl@0: void CTestPadPKCS1::TestPKCS1SignaturePadding(TInt aBlockSize) sl@0: { sl@0: CPaddingPKCS1Signature *padding = CPaddingPKCS1Signature::NewLC(aBlockSize); sl@0: /* sl@0: * The length of the data D shall not be more than k-11 octets, sl@0: * which is positive since the length k of the modulus is at sl@0: * least 12 octets. sl@0: */ sl@0: TInt noDataBytes = aBlockSize-11; sl@0: sl@0: for (TInt i = 0; i <= noDataBytes; i++) sl@0: { sl@0: HBufC8 *inData = HBufC8::NewLC(noDataBytes); sl@0: HBufC8 *outData = HBufC8::NewLC(aBlockSize); sl@0: TPtr8 in(inData->Des()); sl@0: TPtr8 out(outData->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: sl@0: TRAPD(err, padding->DoPadL(in, out)); sl@0: TEST(err == KErrNone); sl@0: sl@0: // check the padding. sl@0: // should have the following syntax: sl@0: // 00 || 01 || PS || 00 || D where PS is the padding octects of value 0xff sl@0: sl@0: TEST(out[0] == 0 && out[1] == 1); sl@0: sl@0: TInt endOfPadding = aBlockSize - 1 - in.Length(); sl@0: for (j = 2; j < endOfPadding; j++) sl@0: { sl@0: TEST(out[j]==0xff); sl@0: sl@0: } sl@0: // Check for the delimiter sl@0: TEST(out[endOfPadding] == 0); sl@0: // Check that the rest of the data is not corrupted sl@0: TInt startOfData = aBlockSize - in.Length(); sl@0: TEST(in == out.Mid(startOfData)); sl@0: CleanupStack::PopAndDestroy(2, inData); // inData, outData sl@0: } sl@0: TestStepResult() ? INFO_PRINTF1(_L("Test failed")) : INFO_PRINTF1(_L("Test passed")); sl@0: CleanupStack::PopAndDestroy(); // padding sl@0: } sl@0: sl@0: void CTestPadPKCS1::TestPKCS1EncryptionPadding(TInt aBlockSize) sl@0: { sl@0: CPaddingPKCS1Encryption *padding = CPaddingPKCS1Encryption::NewLC(aBlockSize); sl@0: /* sl@0: * The length of the data D shall not be more than k-11 octets, sl@0: * which is positive since the length k of the modulus is at sl@0: * least 12 octets. sl@0: */ sl@0: TInt noDataBytes = aBlockSize-11; sl@0: sl@0: for (TInt i = 0; i <= noDataBytes; i++) sl@0: { sl@0: HBufC8 *inData = HBufC8::NewLC(noDataBytes); sl@0: HBufC8 *outData = HBufC8::NewLC(aBlockSize); sl@0: TPtr8 in(inData->Des()); sl@0: TPtr8 out(outData->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: sl@0: TRAPD(err, padding->DoPadL(in, out)); sl@0: TEST(err == KErrNone); sl@0: // check the padding. sl@0: // should have the following syntax: sl@0: // 00 || 02 || PS || 00 || D where PS is the padding octects containing random data sl@0: sl@0: TEST(out[0] == 0 && out[1] == 2); sl@0: sl@0: TInt endOfPadding = aBlockSize - 1 - in.Length(); sl@0: for (j = 2; j < endOfPadding; j++) sl@0: { sl@0: TEST(out[j]!=0); sl@0: sl@0: } sl@0: // Check for the delimiter sl@0: TEST(out[endOfPadding] == 0); sl@0: sl@0: // Check that the rest of the data is not corrupted sl@0: TInt startOfData = aBlockSize - in.Length(); sl@0: TEST(in == out.Mid(startOfData)); sl@0: CleanupStack::PopAndDestroy(2, inData); // inData, outData sl@0: } sl@0: TestStepResult() ? INFO_PRINTF1(_L("Test failed")) : INFO_PRINTF1(_L("Test passed")); sl@0: CleanupStack::PopAndDestroy(); // padding sl@0: } sl@0: sl@0: sl@0: CTestUnpadPKCS1::CTestUnpadPKCS1() sl@0: { sl@0: SetTestStepName(KUnpadPKCS1); sl@0: } sl@0: sl@0: CTestUnpadPKCS1::~CTestUnpadPKCS1() sl@0: { sl@0: } sl@0: sl@0: TVerdict CTestUnpadPKCS1::doTestStepL() sl@0: { sl@0: __UHEAP_MARK; sl@0: sl@0: INFO_PRINTF1(_L("Test of PKCS1 signature unpadding")); sl@0: INFO_PRINTF1(_L("Blocksize 512")); sl@0: SetTestStepResult(EPass); sl@0: TestPKCS1SignatureUnpadding(512); sl@0: INFO_PRINTF1(_L("Blocksize 1024")); sl@0: SetTestStepResult(EPass); sl@0: TestPKCS1SignatureUnpadding(1024); sl@0: INFO_PRINTF1(_L("Blocksize 2048")); sl@0: SetTestStepResult(EPass); sl@0: TestPKCS1SignatureUnpadding(2048); sl@0: sl@0: INFO_PRINTF1(_L("Test of PKCS1 encryption unpadding")); sl@0: INFO_PRINTF1(_L("Blocksize 512")); sl@0: SetTestStepResult(EPass); sl@0: TestPKCS1EncryptionUnpadding(512); sl@0: INFO_PRINTF1(_L("Blocksize 1024")); sl@0: SetTestStepResult(EPass); sl@0: TestPKCS1EncryptionUnpadding(1024); sl@0: INFO_PRINTF1(_L("Blocksize 2048")); sl@0: SetTestStepResult(EPass); sl@0: TestPKCS1EncryptionUnpadding(2048); sl@0: sl@0: __UHEAP_MARKEND; sl@0: return TestStepResult(); sl@0: } sl@0: sl@0: void CTestUnpadPKCS1::TestPKCS1SignatureUnpadding(TInt aBlockSize) sl@0: { sl@0: CPaddingPKCS1Signature *padding = CPaddingPKCS1Signature::NewLC(aBlockSize); sl@0: /* sl@0: * The length of the data D shall not be more than k-11 octets, sl@0: * which is positive since the length k of the modulus is at sl@0: * least 12 octets. sl@0: */ sl@0: TInt noDataBytes = aBlockSize-11; sl@0: sl@0: for (TInt i = 0; i <= noDataBytes; i++) sl@0: { sl@0: HBufC8 *inData = HBufC8::NewLC(aBlockSize); sl@0: HBufC8 *outData = HBufC8::NewLC(noDataBytes); sl@0: HBufC8 *compData = HBufC8::NewLC(noDataBytes); sl@0: TPtr8 in(inData->Des()); sl@0: TPtr8 out(outData->Des()); sl@0: TPtr8 comp(compData->Des()); sl@0: sl@0: TInt endOfPadding = aBlockSize - 1 - i; sl@0: in.SetLength(endOfPadding+1); sl@0: in[0] = 0; sl@0: in[1] = 1; sl@0: TInt j; sl@0: for (j = 2; j < endOfPadding; j++) sl@0: { sl@0: in[j] = 0xff; sl@0: } sl@0: in[endOfPadding] = 0; // delimiter 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: comp.Append(text); sl@0: } sl@0: sl@0: TRAPD(err, padding->UnPadL(in, out)); sl@0: TEST(err == KErrNone); sl@0: sl@0: TEST(out == comp); sl@0: sl@0: TEST(out.Length() == i); sl@0: sl@0: sl@0: CleanupStack::PopAndDestroy(3, inData); // inData, outData, compData sl@0: } sl@0: TestStepResult() ? INFO_PRINTF1(_L("Test failed")) : INFO_PRINTF1(_L("Test passed")); sl@0: CleanupStack::PopAndDestroy(); // padding sl@0: } sl@0: sl@0: void CTestUnpadPKCS1::TestPKCS1EncryptionUnpadding(TInt aBlockSize) sl@0: { sl@0: CPaddingPKCS1Encryption *padding = CPaddingPKCS1Encryption::NewLC(aBlockSize); sl@0: /* sl@0: * "The length of the data D shall not be more than k-11 octets, sl@0: * which is positive since the length k of the modulus is at sl@0: * least 12 octets." sl@0: */ sl@0: TInt noDataBytes = aBlockSize-11; sl@0: for (TInt i = 0; i <= noDataBytes; i++) sl@0: { sl@0: HBufC8 *inData = HBufC8::NewLC(aBlockSize); sl@0: HBufC8 *outData = HBufC8::NewLC(noDataBytes); sl@0: HBufC8 *compData = HBufC8::NewLC(noDataBytes); sl@0: TPtr8 in(inData->Des()); sl@0: TPtr8 out(outData->Des()); sl@0: TPtr8 comp(compData->Des()); sl@0: sl@0: TInt endOfPadding = aBlockSize - 1 - i; sl@0: in.SetLength(endOfPadding+1); sl@0: in[0] = 0; sl@0: in[1] = 2; sl@0: TBuf8<256> rnd(256); sl@0: GenerateRandomBytesL(rnd); sl@0: sl@0: TInt k = 2; sl@0: TInt j = 0; sl@0: while (k < endOfPadding) sl@0: { sl@0: if (rnd[j%256]) sl@0: { sl@0: in[k++] = rnd[j%256]; sl@0: } sl@0: sl@0: if (++j%256 == 0) sl@0: { sl@0: GenerateRandomBytesL(rnd); sl@0: } sl@0: } sl@0: in[endOfPadding] = 0; // delimiter 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: comp.Append(text); sl@0: } sl@0: sl@0: TRAPD(err, padding->UnPadL(in, out)); sl@0: TEST(err == KErrNone); sl@0: sl@0: TEST(out == comp); sl@0: sl@0: TEST(out.Length() == i); sl@0: sl@0: sl@0: CleanupStack::PopAndDestroy(3, inData); // inData, outData, compData sl@0: } sl@0: TestStepResult() ? INFO_PRINTF1(_L("Test failed")) : INFO_PRINTF1(_L("Test passed")); sl@0: CleanupStack::PopAndDestroy(); // padding sl@0: }