os/security/crypto/weakcryptospi/test/tpadding/tpaddingPKCS7.cpp
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
/*
sl@0
     2
* Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     3
* All rights reserved.
sl@0
     4
* This component and the accompanying materials are made available
sl@0
     5
* under the terms of the License "Eclipse Public License v1.0"
sl@0
     6
* which accompanies this distribution, and is available
sl@0
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     8
*
sl@0
     9
* Initial Contributors:
sl@0
    10
* Nokia Corporation - initial contribution.
sl@0
    11
*
sl@0
    12
* Contributors:
sl@0
    13
*
sl@0
    14
* Description: 
sl@0
    15
*
sl@0
    16
*/
sl@0
    17
sl@0
    18
sl@0
    19
#include <random.h>
sl@0
    20
#include <padding.h>
sl@0
    21
#include <securityerr.h>
sl@0
    22
#include "tpaddingPKCS7.h"
sl@0
    23
#include <cryptopanic.h>
sl@0
    24
sl@0
    25
static void GenerateInput(TInt aBytes, TPtr8& in)
sl@0
    26
 	{
sl@0
    27
 	for (TInt j = 0; j < aBytes; j++)
sl@0
    28
 		{
sl@0
    29
 		TInt text('a'+j%25);
sl@0
    30
 		in.Append(text);
sl@0
    31
 		}
sl@0
    32
 	}
sl@0
    33
sl@0
    34
CTestPadPKCS7::CTestPadPKCS7()
sl@0
    35
	{
sl@0
    36
	SetTestStepName(KPadPKCS7);
sl@0
    37
	}
sl@0
    38
sl@0
    39
CTestPadPKCS7::~CTestPadPKCS7()
sl@0
    40
	{
sl@0
    41
	}
sl@0
    42
sl@0
    43
TVerdict CTestPadPKCS7::doTestStepL()
sl@0
    44
	{
sl@0
    45
	SetTestStepResult(EPass);
sl@0
    46
	__UHEAP_MARK;
sl@0
    47
   
sl@0
    48
	INFO_PRINTF1(_L("Test of PKCS7  padding"));
sl@0
    49
sl@0
    50
	for (TInt i = 1; i < 255; i++)
sl@0
    51
		{
sl@0
    52
		TestPKCS7Padding(i);
sl@0
    53
		}
sl@0
    54
  
sl@0
    55
	__UHEAP_MARKEND;
sl@0
    56
	return TestStepResult();
sl@0
    57
	}
sl@0
    58
sl@0
    59
sl@0
    60
void CTestPadPKCS7::TestPKCS7Padding(TInt aBlockSize)
sl@0
    61
	{
sl@0
    62
   	CPaddingPKCS7 *padding = CPaddingPKCS7::NewLC(aBlockSize);
sl@0
    63
	// Starts with zero input size(total block data is filled/padded with block size) 
sl@0
    64
	for (TInt i = 0 ; i <= aBlockSize; i++)
sl@0
    65
		{
sl@0
    66
		HBufC8 *padInData = HBufC8::NewLC(i);
sl@0
    67
		HBufC8 *padOutData = HBufC8::NewLC(i+(aBlockSize-i%aBlockSize));
sl@0
    68
		TPtr8 in(padInData->Des());
sl@0
    69
		TPtr8 out(padOutData->Des());
sl@0
    70
sl@0
    71
		GenerateInput(i, in);
sl@0
    72
		TRAPD(err, padding->PadL(in, out));
sl@0
    73
		
sl@0
    74
		TEST(err == KErrNone);
sl@0
    75
		
sl@0
    76
		TInt totalLength = out.Length();
sl@0
    77
		TUint paddingLength = aBlockSize - in.Length()%aBlockSize;
sl@0
    78
		// Test that the total length is a multiple of blockSize
sl@0
    79
		TEST((totalLength % aBlockSize) == 0);
sl@0
    80
      
sl@0
    81
		// Test that the padding bytes are equal in value to the paddingLength,
sl@0
    82
		// ie, if padding length is 5 the 5 last octets in the out array should be 0x05
sl@0
    83
		for (TInt j = paddingLength; j > 0 ; j--)
sl@0
    84
			{
sl@0
    85
			TEST(out[out.Length()-j] == paddingLength);
sl@0
    86
			}
sl@0
    87
      
sl@0
    88
		// Test that the data has not been corrupted
sl@0
    89
		TEST(in == out.Left(out.Length() - paddingLength));
sl@0
    90
		
sl@0
    91
		CleanupStack::PopAndDestroy(2, padInData); // padInData, padOutData
sl@0
    92
		}
sl@0
    93
	CleanupStack::PopAndDestroy(padding);
sl@0
    94
	}
sl@0
    95
   
sl@0
    96
CTestUnpadPKCS7::CTestUnpadPKCS7()
sl@0
    97
	{
sl@0
    98
   	SetTestStepName(KUnpadPKCS7);
sl@0
    99
	}
sl@0
   100
sl@0
   101
CTestUnpadPKCS7::~CTestUnpadPKCS7()
sl@0
   102
	{
sl@0
   103
	}
sl@0
   104
sl@0
   105
TVerdict CTestUnpadPKCS7::doTestStepL()
sl@0
   106
	{
sl@0
   107
	SetTestStepResult(EPass);
sl@0
   108
	__UHEAP_MARK;
sl@0
   109
sl@0
   110
	INFO_PRINTF1(_L("Test of PKCS7 unpadding"));
sl@0
   111
	for (TInt i = 1; i < 255; i++)
sl@0
   112
		{
sl@0
   113
		TestPKCS7Unpadding(i);
sl@0
   114
		}
sl@0
   115
sl@0
   116
	__UHEAP_MARKEND;
sl@0
   117
	return TestStepResult();
sl@0
   118
	}
sl@0
   119
sl@0
   120
sl@0
   121
void CTestUnpadPKCS7::TestPKCS7Unpadding(TInt aBlockSize)
sl@0
   122
	{
sl@0
   123
	CPaddingPKCS7 *padding = CPaddingPKCS7::NewLC(aBlockSize);
sl@0
   124
sl@0
   125
	// Input must be < aBlockSize otherwise this wouldn't be 
sl@0
   126
	// a padded block
sl@0
   127
	for (TInt i = 0 ; i < aBlockSize; i++)
sl@0
   128
		{
sl@0
   129
		// Input to un-padding should always be an entire block
sl@0
   130
		// for correctly data.
sl@0
   131
		HBufC8 *padInData = HBufC8::NewLC(aBlockSize);
sl@0
   132
		HBufC8 *padOutData = HBufC8::NewLC(i);
sl@0
   133
		HBufC8 *padCompareData = HBufC8::NewLC(i);
sl@0
   134
		TPtr8 in(padInData->Des());
sl@0
   135
		TPtr8 out(padOutData->Des());
sl@0
   136
		TPtr8 comp(padCompareData->Des());
sl@0
   137
sl@0
   138
		GenerateInput(i, in);
sl@0
   139
		comp.Copy(in);		
sl@0
   140
sl@0
   141
		in.SetLength(aBlockSize);
sl@0
   142
		TInt paddingBytes = aBlockSize - (i % aBlockSize);
sl@0
   143
		for (TInt j = 1; j <= paddingBytes; j++)
sl@0
   144
			{
sl@0
   145
			in[in.Length()-j] = (TUint8)paddingBytes;
sl@0
   146
			}
sl@0
   147
sl@0
   148
		TRAPD(err, padding->UnPadL(in, out));
sl@0
   149
		if (err != KErrNone)
sl@0
   150
			{
sl@0
   151
			INFO_PRINTF3(_L("The Error returned for block size %d is %d"), aBlockSize,err);
sl@0
   152
			}
sl@0
   153
		TEST(err == KErrNone); // Verify UnPadL leave code 
sl@0
   154
		TEST(out == comp); // Verify  UnPadL output data with expected data
sl@0
   155
		CleanupStack::PopAndDestroy(3, padInData); // padInData, padOutData, padCompareData
sl@0
   156
		}
sl@0
   157
	CleanupStack::PopAndDestroy(padding);
sl@0
   158
	}
sl@0
   159
sl@0
   160
 
sl@0
   161
CTestUnpadCorruptPKCS7::CTestUnpadCorruptPKCS7()
sl@0
   162
	{
sl@0
   163
	SetTestStepName(KUnpadCorruptPKCS7);
sl@0
   164
	}
sl@0
   165
 
sl@0
   166
CTestUnpadCorruptPKCS7::~CTestUnpadCorruptPKCS7()
sl@0
   167
	{
sl@0
   168
	}
sl@0
   169
 
sl@0
   170
TVerdict CTestUnpadCorruptPKCS7::doTestStepL()
sl@0
   171
 	{
sl@0
   172
 	SetTestStepResult(EPass);
sl@0
   173
 	__UHEAP_MARK;
sl@0
   174
 
sl@0
   175
 	TInt blockSize;
sl@0
   176
 	TInt textSize;
sl@0
   177
 	TInt paddingNum = 0;
sl@0
   178
 	
sl@0
   179
 	if (GetIntFromConfig(ConfigSection(), _L("blocksize"), blockSize))
sl@0
   180
 		{
sl@0
   181
 		if (GetIntFromConfig(ConfigSection(), _L("textsize"), textSize))
sl@0
   182
 			{
sl@0
   183
 			if (GetIntFromConfig(ConfigSection(), _L("paddingbyte"), paddingNum))
sl@0
   184
 				{
sl@0
   185
 				INFO_PRINTF1(_L("Test of PKCS7 unpadding with corrupt data"));
sl@0
   186
 				TUint8 paddingByte = Min(paddingNum, 255);
sl@0
   187
   				TestCorruptPKCS7Unpadding(blockSize, textSize, paddingByte);	  					
sl@0
   188
 				}				
sl@0
   189
 			else
sl@0
   190
 				{
sl@0
   191
 				ERR_PRINTF1(_L("Missing parameter - paddingbyte"));
sl@0
   192
 				}
sl@0
   193
 			}
sl@0
   194
 		else
sl@0
   195
 			{
sl@0
   196
 			ERR_PRINTF1(_L("Missing parameter - textsize"));
sl@0
   197
 			}
sl@0
   198
 		}
sl@0
   199
 	else
sl@0
   200
		{
sl@0
   201
 		ERR_PRINTF1(_L("Missing parameter - blocksize"));
sl@0
   202
 		}
sl@0
   203
 
sl@0
   204
 	__UHEAP_MARKEND;
sl@0
   205
 	return TestStepResult();
sl@0
   206
 	}
sl@0
   207
 
sl@0
   208
void CTestUnpadCorruptPKCS7::TestCorruptPKCS7Unpadding(TInt aBlockSize, TInt aTextSize, TUint8 aPaddingByte)
sl@0
   209
	{
sl@0
   210
 	CPaddingPKCS7 *padding = CPaddingPKCS7::NewLC(aBlockSize);
sl@0
   211
 	TInt paddingBytes = (aBlockSize - aTextSize % aBlockSize);
sl@0
   212
 	
sl@0
   213
	HBufC8 *padInData = HBufC8::NewLC(aTextSize + paddingBytes);
sl@0
   214
 	HBufC8 *padOutData = HBufC8::NewLC(aTextSize);
sl@0
   215
 	TPtr8 in(padInData->Des());
sl@0
   216
 	TPtr8 out(padOutData->Des());
sl@0
   217
 
sl@0
   218
 	GenerateInput(aTextSize, in);
sl@0
   219
 
sl@0
   220
 	in.SetLength(in.Length() + paddingBytes);
sl@0
   221
 	for (TInt j = 1; j <= paddingBytes; j++)
sl@0
   222
 		{
sl@0
   223
 		in[in.Length()-j] = (TUint8) aPaddingByte;
sl@0
   224
 		}
sl@0
   225
 
sl@0
   226
 	TRAPD(err, padding->UnPadL(in, out));
sl@0
   227
 	
sl@0
   228
 	if ( err == KErrInvalidPadding )
sl@0
   229
		{
sl@0
   230
  		INFO_PRINTF2(_L("The PKCS7 unpadding UnPadL method returned error is %d"), err);
sl@0
   231
  		TEST(err == KErrInvalidPadding);
sl@0
   232
  		SetTestStepResult(EPass);
sl@0
   233
  		}
sl@0
   234
	else if ( err == KErrNone )
sl@0
   235
		{
sl@0
   236
		TEST(err == KErrNone);
sl@0
   237
		}
sl@0
   238
	CleanupStack::PopAndDestroy(3, padding); // padding, padInData, padOutData
sl@0
   239
	}
sl@0
   240
sl@0
   241
CTestPaddingCorruptPKCS7::CTestPaddingCorruptPKCS7()
sl@0
   242
	{
sl@0
   243
	SetTestStepName(KPaddingCorruptPKCS7);
sl@0
   244
	}
sl@0
   245
 
sl@0
   246
CTestPaddingCorruptPKCS7::~CTestPaddingCorruptPKCS7()
sl@0
   247
	{
sl@0
   248
	}
sl@0
   249
 
sl@0
   250
TVerdict CTestPaddingCorruptPKCS7::doTestStepL()
sl@0
   251
 	{
sl@0
   252
 	SetTestStepResult(EPass);
sl@0
   253
 	__UHEAP_MARK;
sl@0
   254
 
sl@0
   255
 	TInt blockSize;
sl@0
   256
 	TInt textSize;
sl@0
   257
 	 	
sl@0
   258
 	if (GetIntFromConfig(ConfigSection(), _L("blocksize"), blockSize))
sl@0
   259
 		{
sl@0
   260
 		if (GetIntFromConfig(ConfigSection(), _L("textsize"), textSize))
sl@0
   261
 			{
sl@0
   262
 			INFO_PRINTF1(_L("Test of PKCS7 unpadding with corrupt data"));
sl@0
   263
   			TestCorruptPKCS7padding(blockSize, textSize);	  					
sl@0
   264
 			}
sl@0
   265
 		else
sl@0
   266
 			{
sl@0
   267
 			ERR_PRINTF1(_L("Missing parameter - textsize"));
sl@0
   268
 			}
sl@0
   269
 		}
sl@0
   270
 	else
sl@0
   271
		{
sl@0
   272
 		ERR_PRINTF1(_L("Missing parameter - blocksize"));
sl@0
   273
 		}
sl@0
   274
 
sl@0
   275
 	__UHEAP_MARKEND;
sl@0
   276
 	return TestStepResult();
sl@0
   277
 	}
sl@0
   278
 
sl@0
   279
void CTestPaddingCorruptPKCS7::TestCorruptPKCS7padding(TInt aBlockSize, TInt aTextSize)
sl@0
   280
	{
sl@0
   281
	CPaddingPKCS7 *padding = CPaddingPKCS7::NewLC(aBlockSize);
sl@0
   282
sl@0
   283
	TInt paddingBytes = 0;
sl@0
   284
	//Divide by 0 is undefined.
sl@0
   285
	if(aBlockSize != 0)
sl@0
   286
		{
sl@0
   287
		paddingBytes = aBlockSize - (aTextSize % aBlockSize);
sl@0
   288
		}
sl@0
   289
		
sl@0
   290
 	HBufC8 *padOutData = HBufC8::NewLC(aTextSize + paddingBytes);
sl@0
   291
 	HBufC8 *padInData = HBufC8::NewLC(aTextSize);
sl@0
   292
 	TPtr8 in(padInData->Des());
sl@0
   293
 	TPtr8 out(padOutData->Des());
sl@0
   294
 
sl@0
   295
 	GenerateInput(aTextSize, in);
sl@0
   296
 	TRAPD(err, padding->PadL(in, out));
sl@0
   297
sl@0
   298
	INFO_PRINTF2(_L("The PKCS7 padding PadL method returned error is %d"), err);
sl@0
   299
	
sl@0
   300
	//check expected result
sl@0
   301
	TPtrC expectedContent;
sl@0
   302
 	if (GetStringFromConfig(ConfigSection(), _L("case"), expectedContent))
sl@0
   303
 		{
sl@0
   304
 		if(expectedContent.Compare(_L("InvalidPadding")) ==0)
sl@0
   305
 			{
sl@0
   306
 			TEST(err == KErrInvalidPadding);
sl@0
   307
 			}
sl@0
   308
 		else if(expectedContent.Compare(_L("Valid")) ==0)
sl@0
   309
 			{
sl@0
   310
 			TEST(err == KErrNone);
sl@0
   311
 			}
sl@0
   312
 		else if(expectedContent.Compare(_L("CorruptBlockSize")) ==0)
sl@0
   313
 			{
sl@0
   314
 			TEST(err == KErrArgument);
sl@0
   315
 			}
sl@0
   316
 		}
sl@0
   317
 	
sl@0
   318
 	//skip the checking on padded data if padding is unsuccessful(no padding is done), 
sl@0
   319
 	//otherwise the erroneous operation on output descriptor will panic.
sl@0
   320
 	if(err != KErrNone)
sl@0
   321
 		{
sl@0
   322
 		CleanupStack::PopAndDestroy(3, padding);
sl@0
   323
 		return;
sl@0
   324
 		}
sl@0
   325
	
sl@0
   326
	TInt totalLength = out.Length();
sl@0
   327
	TInt inLength = in.Length();
sl@0
   328
	
sl@0
   329
	TUint paddingLength = 0;
sl@0
   330
	//Divide by 0 is undefined.
sl@0
   331
	if(aBlockSize != 0)
sl@0
   332
		{
sl@0
   333
		paddingLength = aBlockSize - inLength%aBlockSize;
sl@0
   334
		// Test that the total length is a multiple of blockSize
sl@0
   335
		TEST((totalLength % aBlockSize) == 0);
sl@0
   336
		}			
sl@0
   337
	
sl@0
   338
 	// Test that the padding bytes are equal in value to the paddingLength,
sl@0
   339
	// ie, if padding length is 5 the 5 last octets in the out array should be 0x05
sl@0
   340
	for (TInt j = paddingLength; j > 0 ; j--)
sl@0
   341
		{
sl@0
   342
		TEST(out[out.Length()-j] == paddingLength);
sl@0
   343
		}
sl@0
   344
sl@0
   345
	
sl@0
   346
 	
sl@0
   347
 	// Test that the data has not been corrupted
sl@0
   348
	TEST(in == out.Left(out.Length() - paddingLength));
sl@0
   349
 	
sl@0
   350
 	CleanupStack::PopAndDestroy(3, padding); // padInData, padOutData, padCompareData, padding
sl@0
   351
	}
sl@0
   352