os/security/crypto/weakcrypto/test/thash/thash.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
sl@0
     1
/*
sl@0
     2
* Copyright (c) 2005-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
/**
sl@0
    20
 @file
sl@0
    21
*/
sl@0
    22
sl@0
    23
#include "hashtestutils.h"
sl@0
    24
#include <utf.h>
sl@0
    25
sl@0
    26
TBool gInOOMTest=EFalse;
sl@0
    27
sl@0
    28
RTest test(_L("Hash Tests"));
sl@0
    29
sl@0
    30
const TInt KMaxHashSize = 64; // Hash size in bytes
sl@0
    31
sl@0
    32
void Hex(HBufC8& aString)
sl@0
    33
	{
sl@0
    34
	TPtr8 ptr=aString.Des();
sl@0
    35
	if (aString.Length()%2)
sl@0
    36
		{
sl@0
    37
		ptr.SetLength(0);
sl@0
    38
		return;
sl@0
    39
		}
sl@0
    40
	TInt i;
sl@0
    41
	for (i=0;i<aString.Length();i+=2)
sl@0
    42
		{
sl@0
    43
		TUint8 tmp;
sl@0
    44
		tmp=(TUint8)(aString[i]-(aString[i]>'9'?('A'-10):'0'));
sl@0
    45
		tmp*=16;
sl@0
    46
		tmp|=(TUint8)(aString[i+1]-(aString[i+1]>'9'?('A'-10):'0'));
sl@0
    47
		ptr[i/2]=tmp;
sl@0
    48
		}
sl@0
    49
	ptr.SetLength(aString.Length()/2);
sl@0
    50
	}
sl@0
    51
sl@0
    52
void Spin()
sl@0
    53
{//	Pointless function to print a dot
sl@0
    54
	if (gInOOMTest)
sl@0
    55
		{
sl@0
    56
		static TInt count=0;
sl@0
    57
		if (count++==100)
sl@0
    58
			{
sl@0
    59
			test.Printf(_L("o"));
sl@0
    60
			count=0;
sl@0
    61
			}
sl@0
    62
		return;
sl@0
    63
		}
sl@0
    64
	test.Printf(_L("."));
sl@0
    65
}
sl@0
    66
sl@0
    67
void FunctionalityTestL(CMessageDigest* aMD)
sl@0
    68
	{
sl@0
    69
	if (!gInOOMTest)
sl@0
    70
		test.Next(_L("Functionality test - original API"));
sl@0
    71
sl@0
    72
	const TInt maxbuffersize=1024;
sl@0
    73
	TInt buffersize;
sl@0
    74
	TInt increment;
sl@0
    75
	if (gInOOMTest)
sl@0
    76
		{
sl@0
    77
		buffersize=256;
sl@0
    78
		increment=6;
sl@0
    79
		}
sl@0
    80
	else
sl@0
    81
		{
sl@0
    82
		buffersize=maxbuffersize;
sl@0
    83
		increment=1;
sl@0
    84
		}
sl@0
    85
sl@0
    86
	TBool testSuccess = ETrue;
sl@0
    87
	TInt i = 0;
sl@0
    88
	TBuf8<maxbuffersize> buf(maxbuffersize);
sl@0
    89
	for (;i<buffersize;i++)
sl@0
    90
		{
sl@0
    91
		buf[i]=(TUint8)i;
sl@0
    92
		}
sl@0
    93
	
sl@0
    94
	for (i=0;i<buffersize;i+=increment)
sl@0
    95
		{
sl@0
    96
		TInt j;
sl@0
    97
		Spin();
sl@0
    98
		if (!gInOOMTest)
sl@0
    99
			{
sl@0
   100
			if (i>128)
sl@0
   101
				{
sl@0
   102
				increment=8;
sl@0
   103
				}
sl@0
   104
			}
sl@0
   105
		else
sl@0
   106
			{
sl@0
   107
			if (i>24)
sl@0
   108
				{
sl@0
   109
				increment=32;
sl@0
   110
				}
sl@0
   111
			}
sl@0
   112
sl@0
   113
		for (j=0;j<i;j+=16)
sl@0
   114
			{
sl@0
   115
			buf[0]=(TUint8)j;
sl@0
   116
			TPtrC8 ptr=buf.Left(i);
sl@0
   117
			TPtrC8 ptr2=buf.Left(j);
sl@0
   118
			TPtrC8 ptr3=buf.Mid(j,i-j);
sl@0
   119
sl@0
   120
			CMessageDigest* first=aMD->ReplicateL();
sl@0
   121
			CleanupStack::PushL(first);
sl@0
   122
			TPtrC8 firstFinal = first->Hash(ptr);
sl@0
   123
			
sl@0
   124
			aMD->Reset();
sl@0
   125
			aMD->Update(ptr);
sl@0
   126
			TPtrC8 aMDFinal = aMD->Final();
sl@0
   127
sl@0
   128
			CMessageDigest* second=aMD->ReplicateL();
sl@0
   129
			CleanupStack::PushL(second);
sl@0
   130
			second->Hash(ptr2);
sl@0
   131
			
sl@0
   132
			CMessageDigest* third=second->CopyL();
sl@0
   133
			CleanupStack::PushL(third);
sl@0
   134
			
sl@0
   135
			TPtrC8 secondFinal = second->Hash(ptr3);
sl@0
   136
			
sl@0
   137
			if (aMDFinal!=firstFinal)
sl@0
   138
				{
sl@0
   139
				testSuccess = EFalse;
sl@0
   140
				}
sl@0
   141
			
sl@0
   142
			if (firstFinal!=secondFinal)
sl@0
   143
				{
sl@0
   144
				testSuccess = EFalse;
sl@0
   145
				}
sl@0
   146
sl@0
   147
			TPtrC8 thirdFinal = third->Hash(ptr3);
sl@0
   148
			if (firstFinal!=thirdFinal)
sl@0
   149
				{
sl@0
   150
				testSuccess = EFalse;
sl@0
   151
				}
sl@0
   152
			CleanupStack::PopAndDestroy(3);		// first, second, third
sl@0
   153
			}
sl@0
   154
		}
sl@0
   155
	
sl@0
   156
///////////////////////////////////////////////////////////////
sl@0
   157
//	Now test the new API - Update/Final functions	
sl@0
   158
///////////////////////////////////////////////////////////////
sl@0
   159
	if (!gInOOMTest)
sl@0
   160
		test.Next(_L("\rFunctionality test - calls added API functions Final & Update"));
sl@0
   161
sl@0
   162
	for (i=0;i<buffersize;i++)
sl@0
   163
		{
sl@0
   164
		buf[i]=(TUint8)i;
sl@0
   165
		}
sl@0
   166
	
sl@0
   167
	for (i=0;i<buffersize;i+=increment)
sl@0
   168
		{
sl@0
   169
		TInt j;
sl@0
   170
		Spin();
sl@0
   171
		if (!gInOOMTest)
sl@0
   172
			{
sl@0
   173
			if (i>128)
sl@0
   174
				{
sl@0
   175
				increment=8;
sl@0
   176
				}
sl@0
   177
			}
sl@0
   178
		else
sl@0
   179
			{
sl@0
   180
			if (i>24)
sl@0
   181
				{
sl@0
   182
				increment=32;
sl@0
   183
				}
sl@0
   184
			}
sl@0
   185
		for (j=0;j<i;j+=16)
sl@0
   186
			{
sl@0
   187
			buf[0]=(TUint8)j;
sl@0
   188
			TPtrC8 ptr=buf.Left(i);
sl@0
   189
			TPtrC8 ptr2=buf.Left(j);
sl@0
   190
			TPtrC8 ptr3=buf.Mid(j,i-j);
sl@0
   191
			
sl@0
   192
			CMessageDigest* first=aMD->ReplicateL();
sl@0
   193
			CleanupStack::PushL(first);
sl@0
   194
			first->Update(ptr);
sl@0
   195
			
sl@0
   196
			aMD->Update(ptr);
sl@0
   197
sl@0
   198
			CMessageDigest* second=aMD->ReplicateL();
sl@0
   199
			CleanupStack::PushL(second);			
sl@0
   200
			second->Update(ptr2);
sl@0
   201
			
sl@0
   202
			CMessageDigest* third=second->CopyL();
sl@0
   203
			CleanupStack::PushL(third);
sl@0
   204
			third->Update(ptr3);
sl@0
   205
			
sl@0
   206
			second->Update(ptr3);
sl@0
   207
			
sl@0
   208
			TPtrC8 aMDFinal = aMD->Final();
sl@0
   209
			TPtrC8 firstFinal = first->Final();
sl@0
   210
			TPtrC8 secondFinal = second->Final();
sl@0
   211
			TPtrC8 thirdFinal = third->Final();
sl@0
   212
			
sl@0
   213
			if (aMDFinal!=firstFinal)
sl@0
   214
				{
sl@0
   215
				testSuccess = EFalse;
sl@0
   216
				}
sl@0
   217
sl@0
   218
			if (firstFinal!=secondFinal)
sl@0
   219
				{
sl@0
   220
				testSuccess = EFalse;
sl@0
   221
				}
sl@0
   222
			
sl@0
   223
			if (firstFinal!=thirdFinal)
sl@0
   224
				{
sl@0
   225
				testSuccess = EFalse;
sl@0
   226
				}
sl@0
   227
sl@0
   228
			CleanupStack::PopAndDestroy(3);		// first, second, third
sl@0
   229
			}
sl@0
   230
		}
sl@0
   231
	test.Printf(_L("\r\n"));
sl@0
   232
	
sl@0
   233
	if (!testSuccess)
sl@0
   234
		User::Leave(KErrGeneral);
sl@0
   235
	}
sl@0
   236
sl@0
   237
void VectorTestL(CMessageDigest* aMD,const TDesC& aFilename)
sl@0
   238
	{
sl@0
   239
	test.Next(_L("Test Vector tests - original API"));
sl@0
   240
	TBool finished=EFalse;
sl@0
   241
	TBool testSuccess = ETrue;
sl@0
   242
	CTestData* data = CTestData::NewL(aFilename);
sl@0
   243
	CleanupStack::PushL(data);
sl@0
   244
sl@0
   245
	while (!finished)
sl@0
   246
		{
sl@0
   247
		switch (data->Type())
sl@0
   248
			{
sl@0
   249
		case CTestData::EMessage:
sl@0
   250
			{
sl@0
   251
			break;
sl@0
   252
			}
sl@0
   253
		//This is added to read large input data from the files.
sl@0
   254
		case CTestData::EFileName:
sl@0
   255
			{
sl@0
   256
			CMessageDigest* md=aMD->ReplicateL();
sl@0
   257
			CleanupStack::PushL(md);
sl@0
   258
			
sl@0
   259
			//get the filename from the .dat file
sl@0
   260
			HBufC8* filename = (*data)[1];
sl@0
   261
			User::LeaveIfNull(filename);
sl@0
   262
			CleanupStack::PushL(filename);
sl@0
   263
			
sl@0
   264
			HBufC8* output= (*data)[2];
sl@0
   265
			User::LeaveIfNull(output);
sl@0
   266
			CleanupStack::PushL(output);
sl@0
   267
			Hex(*output);
sl@0
   268
			
sl@0
   269
			HBufC16* inputFileName = CnvUtfConverter::ConvertToUnicodeFromUtf8L(*filename);
sl@0
   270
			
sl@0
   271
			RFs fs;
sl@0
   272
			RFile file;
sl@0
   273
			CleanupClosePushL(fs);
sl@0
   274
			User::LeaveIfError(fs.Connect());
sl@0
   275
			TDriveUnit sysDrive(fs.GetSystemDrive());
sl@0
   276
			TBuf<24> filePath (sysDrive.Name());
sl@0
   277
			filePath.Append(_L("\\thash\\"));
sl@0
   278
			User::LeaveIfError(fs.SetSessionPath(filePath));
sl@0
   279
			CleanupClosePushL(file);
sl@0
   280
			User::LeaveIfError(file.Open(fs,*inputFileName,EFileShareAny|EFileRead));
sl@0
   281
			// read into iFile
sl@0
   282
			TInt size=0;
sl@0
   283
			file.Size(size);
sl@0
   284
			HBufC8* fileContents=HBufC8::NewMaxL(size);
sl@0
   285
			
sl@0
   286
			TPtr8 ptr=fileContents->Des();
sl@0
   287
			User::LeaveIfError(file.Read(ptr));
sl@0
   288
			CleanupStack::PopAndDestroy(2, &fs);
sl@0
   289
			CleanupStack::PushL(fileContents);
sl@0
   290
			delete inputFileName;
sl@0
   291
			
sl@0
   292
			TPtrC8 digest = md->Hash(*fileContents);
sl@0
   293
			if (digest!=(*output))	
sl@0
   294
				{
sl@0
   295
				test.Next(_L("Digest Not Equal"));
sl@0
   296
				testSuccess = EFalse;
sl@0
   297
				}
sl@0
   298
		
sl@0
   299
			md->Reset();
sl@0
   300
sl@0
   301
			TPtrC8 digest2 = md->Hash(*fileContents);
sl@0
   302
			if (digest2!=(*output))	
sl@0
   303
				{
sl@0
   304
				testSuccess = EFalse;
sl@0
   305
				}
sl@0
   306
sl@0
   307
		//	Now try this in 2 half sections (just a quick check)
sl@0
   308
			md->Reset();
sl@0
   309
			
sl@0
   310
			TInt inputLen = fileContents->Length();
sl@0
   311
			if (inputLen > 1)
sl@0
   312
				{
sl@0
   313
				TInt leftHandLen = inputLen/2;
sl@0
   314
				TPtrC8 left = fileContents->Left(leftHandLen);
sl@0
   315
				TPtrC8 right = fileContents->Right(inputLen - leftHandLen);
sl@0
   316
sl@0
   317
				TPtrC8 halfDigest = md->Hash(left);
sl@0
   318
				if (halfDigest.Size()==0)	//	Unnecessary test, but removes
sl@0
   319
					User::Leave(KErrAbort);	//	a warning about not using halfDigest
sl@0
   320
					
sl@0
   321
				TPtrC8 wholeDigest = md->Hash(right);
sl@0
   322
				
sl@0
   323
				if (wholeDigest!=(*output))	
sl@0
   324
					{
sl@0
   325
					testSuccess = EFalse;
sl@0
   326
					}			
sl@0
   327
				}
sl@0
   328
				
sl@0
   329
			md->Reset();
sl@0
   330
			if (md->Final(*fileContents)!=(*output))
sl@0
   331
				{
sl@0
   332
				testSuccess = EFalse;
sl@0
   333
				}
sl@0
   334
sl@0
   335
		//	Now try this in 2 half sections (just a quick check)
sl@0
   336
			md->Reset();
sl@0
   337
			inputLen = fileContents->Length();
sl@0
   338
			if (inputLen > 1)
sl@0
   339
				{
sl@0
   340
				TInt leftHandLen = inputLen/2;
sl@0
   341
				TPtrC8 left = fileContents->Left(leftHandLen);
sl@0
   342
				TPtrC8 right = fileContents->Right(inputLen - leftHandLen);
sl@0
   343
sl@0
   344
				md->Update(left);
sl@0
   345
				TPtrC8 wholeDigest = md->Final(right);
sl@0
   346
				
sl@0
   347
				if (wholeDigest!=(*output))	
sl@0
   348
					{
sl@0
   349
					testSuccess = EFalse;
sl@0
   350
					}			
sl@0
   351
				}
sl@0
   352
			CleanupStack::PopAndDestroy(4, md);//md,filename,output,fileContents
sl@0
   353
	
sl@0
   354
			break;
sl@0
   355
			}
sl@0
   356
		case CTestData::EData:
sl@0
   357
			{
sl@0
   358
			CMessageDigest* md=aMD->ReplicateL();
sl@0
   359
			CleanupStack::PushL(md);
sl@0
   360
			
sl@0
   361
			HBufC8* input = (*data)[0];
sl@0
   362
			User::LeaveIfNull(input);
sl@0
   363
			CleanupStack::PushL(input);
sl@0
   364
			
sl@0
   365
			HBufC8* output= (*data)[1];
sl@0
   366
			User::LeaveIfNull(output);
sl@0
   367
			CleanupStack::PushL(output);
sl@0
   368
			Hex(*input);
sl@0
   369
			Hex(*output);
sl@0
   370
sl@0
   371
			TPtrC8 digest = md->Hash(*input);
sl@0
   372
			if (digest!=(*output))	
sl@0
   373
				{
sl@0
   374
				testSuccess = EFalse;
sl@0
   375
				}
sl@0
   376
		
sl@0
   377
			md->Reset();
sl@0
   378
sl@0
   379
			TPtrC8 digest2 = md->Hash(*input);
sl@0
   380
			if (digest2!=(*output))	
sl@0
   381
				{
sl@0
   382
				testSuccess = EFalse;
sl@0
   383
				}
sl@0
   384
sl@0
   385
		//	Now try this in 2 half sections (just a quick check)
sl@0
   386
			md->Reset();
sl@0
   387
			
sl@0
   388
			TInt inputLen = input->Length();
sl@0
   389
			if (inputLen > 1)
sl@0
   390
				{
sl@0
   391
				TInt leftHandLen = inputLen/2;
sl@0
   392
				TPtrC8 left = input->Left(leftHandLen);
sl@0
   393
				TPtrC8 right = input->Right(inputLen - leftHandLen);
sl@0
   394
sl@0
   395
				TPtrC8 halfDigest = md->Hash(left);
sl@0
   396
				if (halfDigest.Size()==0)	//	Unnecessary test, but removes
sl@0
   397
					User::Leave(KErrAbort);	//	a warning about not using halfDigest
sl@0
   398
					
sl@0
   399
				TPtrC8 wholeDigest = md->Hash(right);
sl@0
   400
				
sl@0
   401
				if (wholeDigest!=(*output))	
sl@0
   402
					{
sl@0
   403
					testSuccess = EFalse;
sl@0
   404
					}			
sl@0
   405
				}
sl@0
   406
sl@0
   407
			///////////////////////////////////////////////////////////////
sl@0
   408
			//	Now test the new API - Update/Final functions	
sl@0
   409
			///////////////////////////////////////////////////////////////
sl@0
   410
			md->Reset();
sl@0
   411
			if (md->Final(*input)!=(*output))
sl@0
   412
				{
sl@0
   413
				testSuccess = EFalse;
sl@0
   414
				}
sl@0
   415
sl@0
   416
		//	Now try this in 2 half sections (just a quick check)
sl@0
   417
			md->Reset();
sl@0
   418
			inputLen = input->Length();
sl@0
   419
			if (inputLen > 1)
sl@0
   420
				{
sl@0
   421
				TInt leftHandLen = inputLen/2;
sl@0
   422
				TPtrC8 left = input->Left(leftHandLen);
sl@0
   423
				TPtrC8 right = input->Right(inputLen - leftHandLen);
sl@0
   424
sl@0
   425
				md->Update(left);
sl@0
   426
				TPtrC8 wholeDigest = md->Final(right);
sl@0
   427
				
sl@0
   428
				if (wholeDigest!=(*output))	
sl@0
   429
					{
sl@0
   430
					testSuccess = EFalse;
sl@0
   431
					}			
sl@0
   432
				}
sl@0
   433
			CleanupStack::PopAndDestroy(3);
sl@0
   434
			break;
sl@0
   435
			}
sl@0
   436
		case CTestData::EFinished:
sl@0
   437
			finished=ETrue;
sl@0
   438
			break;
sl@0
   439
		default:
sl@0
   440
			test.Printf(_L("Error in data file\r\n"));
sl@0
   441
			break;
sl@0
   442
			}
sl@0
   443
		};
sl@0
   444
sl@0
   445
	CleanupStack::PopAndDestroy(data);
sl@0
   446
	
sl@0
   447
	if (!testSuccess)
sl@0
   448
		User::Leave(KErrGeneral);
sl@0
   449
	}
sl@0
   450
sl@0
   451
void OOMTestL(CMessageDigest* aMD)
sl@0
   452
	{
sl@0
   453
	test.Next(_L("Out of memory test"));
sl@0
   454
	TInt err = KErrNoMemory;
sl@0
   455
	TInt nextFailure=0;
sl@0
   456
	gInOOMTest=ETrue;
sl@0
   457
	while (err!=KErrNone)
sl@0
   458
		{
sl@0
   459
		__UHEAP_MARK;
sl@0
   460
		__UHEAP_FAILNEXT(nextFailure);
sl@0
   461
		TRAP(err,FunctionalityTestL(aMD));		
sl@0
   462
		__UHEAP_MARKEND;
sl@0
   463
		nextFailure++;
sl@0
   464
		}
sl@0
   465
	__UHEAP_RESET;
sl@0
   466
	gInOOMTest=EFalse;
sl@0
   467
	}
sl@0
   468
sl@0
   469
void HMACVectorTestL(CMessageDigest* aMD,const TDesC& aFilename)
sl@0
   470
	{
sl@0
   471
	test.Next(_L("HMAC Test Vector tests"));
sl@0
   472
	CTestData* data = CTestData::NewL(aFilename);
sl@0
   473
	CleanupStack::PushL(data);
sl@0
   474
sl@0
   475
	TBool finished=EFalse;
sl@0
   476
	TBool testSuccess = ETrue;
sl@0
   477
	
sl@0
   478
	while (!finished)
sl@0
   479
		{
sl@0
   480
		switch (data->Type())
sl@0
   481
			{
sl@0
   482
		case CTestData::EMessage:
sl@0
   483
			{
sl@0
   484
			break;
sl@0
   485
			}
sl@0
   486
		case CTestData::EFileName:
sl@0
   487
			{
sl@0
   488
			//get the filename from the .dat file
sl@0
   489
			HBufC8* filename = (*data)[1];
sl@0
   490
			User::LeaveIfNull(filename);
sl@0
   491
			CleanupStack::PushL(filename);
sl@0
   492
			
sl@0
   493
			HBufC8* key= (*data)[2];
sl@0
   494
			User::LeaveIfNull(key);
sl@0
   495
			CleanupStack::PushL(key);
sl@0
   496
						
sl@0
   497
			HBufC16* inputFileName = CnvUtfConverter::ConvertToUnicodeFromUtf8L(*filename);
sl@0
   498
			
sl@0
   499
			HBufC8* output = (*data)[3];
sl@0
   500
			User::LeaveIfNull(output);
sl@0
   501
			CleanupStack::PushL(output);
sl@0
   502
			
sl@0
   503
			Hex(*key);
sl@0
   504
			Hex(*output);
sl@0
   505
			
sl@0
   506
			RFs fs;
sl@0
   507
			RFile file;
sl@0
   508
			CleanupClosePushL(fs);
sl@0
   509
			User::LeaveIfError(fs.Connect());
sl@0
   510
			TDriveUnit sysDrive(fs.GetSystemDrive());
sl@0
   511
			TBuf<24> filePath (sysDrive.Name());
sl@0
   512
			filePath.Append(_L("\\thash\\"));
sl@0
   513
			User::LeaveIfError(fs.SetSessionPath(filePath));
sl@0
   514
			CleanupClosePushL(file);
sl@0
   515
			User::LeaveIfError(file.Open(fs,*inputFileName,EFileShareAny|EFileRead));
sl@0
   516
			// read into iFile
sl@0
   517
			TInt size=0;
sl@0
   518
			file.Size(size);
sl@0
   519
			HBufC8* fileContents=HBufC8::NewMaxL(size);
sl@0
   520
			
sl@0
   521
			TPtr8 ptr=fileContents->Des();
sl@0
   522
			User::LeaveIfError(file.Read(ptr));
sl@0
   523
			CleanupStack::PopAndDestroy(2, &fs);
sl@0
   524
			CleanupStack::PushL(fileContents);
sl@0
   525
			delete inputFileName;
sl@0
   526
			
sl@0
   527
			CMessageDigest* temp = aMD->ReplicateL();
sl@0
   528
			CleanupStack::PushL(temp);
sl@0
   529
			CMessageDigest* md = CHMAC::NewL(*key, temp);
sl@0
   530
			CleanupStack::Pop(temp);	//	Now owned by md
sl@0
   531
			
sl@0
   532
			TPtrC8 digest = md->Hash(*fileContents);
sl@0
   533
			if (digest!=(*output))
sl@0
   534
				{
sl@0
   535
				testSuccess = EFalse;
sl@0
   536
				}
sl@0
   537
						
sl@0
   538
		//	Now try this in 2 half sections (just a quick check)
sl@0
   539
			md->Reset();
sl@0
   540
		
sl@0
   541
			TInt inputLen = fileContents->Length();
sl@0
   542
			if (inputLen > 1)
sl@0
   543
				{
sl@0
   544
				TInt leftHandLen = inputLen/2;
sl@0
   545
				TPtrC8 left = fileContents->Left(leftHandLen);
sl@0
   546
				TPtrC8 right = fileContents->Right(inputLen - leftHandLen);
sl@0
   547
sl@0
   548
				TPtrC8 halfDigest = md->Hash(left);
sl@0
   549
				if (halfDigest.Size()==0)	//	Unnecessary test, but removes
sl@0
   550
					User::Leave(KErrAbort);	//	a warning about not using halfDigest
sl@0
   551
				TPtrC8 wholeDigest = md->Hash(right);
sl@0
   552
				
sl@0
   553
				if (wholeDigest!=(*output))	
sl@0
   554
					{
sl@0
   555
					testSuccess = EFalse;
sl@0
   556
					}
sl@0
   557
				}
sl@0
   558
sl@0
   559
			md->Reset();
sl@0
   560
			TPtrC8 finalDigest = md->Final(*fileContents);
sl@0
   561
			if (finalDigest!=(*output))
sl@0
   562
				{
sl@0
   563
				testSuccess = EFalse;
sl@0
   564
				}			
sl@0
   565
sl@0
   566
		//	Now try this in 2 half sections (just a quick check)
sl@0
   567
			md->Reset();
sl@0
   568
		
sl@0
   569
			inputLen = fileContents->Length();
sl@0
   570
			if (inputLen > 1)
sl@0
   571
				{
sl@0
   572
				TInt leftHandLen = inputLen/2;
sl@0
   573
				TPtrC8 left = fileContents->Left(leftHandLen);
sl@0
   574
				TPtrC8 right = fileContents->Right(inputLen - leftHandLen);
sl@0
   575
sl@0
   576
				md->Update(left);
sl@0
   577
				TPtrC8 wholeDigest = md->Final(right);
sl@0
   578
				
sl@0
   579
				if (wholeDigest!=(*output))	
sl@0
   580
					{
sl@0
   581
					testSuccess = EFalse;
sl@0
   582
					}
sl@0
   583
				}
sl@0
   584
			delete md;
sl@0
   585
			
sl@0
   586
			CleanupStack::PopAndDestroy(4, filename);	//	filename, key, output,fileContents			
sl@0
   587
			break;
sl@0
   588
			}
sl@0
   589
		case CTestData::EData:
sl@0
   590
			{
sl@0
   591
			HBufC8* input = (*data)[0];
sl@0
   592
			User::LeaveIfNull(input);
sl@0
   593
			CleanupStack::PushL(input);
sl@0
   594
			
sl@0
   595
			HBufC8* key = (*data)[1];
sl@0
   596
			User::LeaveIfNull(key);
sl@0
   597
			CleanupStack::PushL(key);
sl@0
   598
			
sl@0
   599
			HBufC8* output = (*data)[2];
sl@0
   600
			User::LeaveIfNull(output);
sl@0
   601
			CleanupStack::PushL(output);
sl@0
   602
			
sl@0
   603
			Hex(*input);
sl@0
   604
			Hex(*key);
sl@0
   605
			Hex(*output);
sl@0
   606
			
sl@0
   607
			CMessageDigest* temp = aMD->ReplicateL();
sl@0
   608
			CleanupStack::PushL(temp);
sl@0
   609
			CMessageDigest* md = CHMAC::NewL(*key, temp);
sl@0
   610
			CleanupStack::Pop(temp);	//	Now owned by md
sl@0
   611
			
sl@0
   612
			TPtrC8 digest = md->Hash(*input);
sl@0
   613
			if (digest!=(*output))
sl@0
   614
				{
sl@0
   615
				testSuccess = EFalse;
sl@0
   616
				}
sl@0
   617
						
sl@0
   618
		//	Now try this in 2 half sections (just a quick check)
sl@0
   619
			md->Reset();
sl@0
   620
		
sl@0
   621
			TInt inputLen = input->Length();
sl@0
   622
			if (inputLen > 1)
sl@0
   623
				{
sl@0
   624
				TInt leftHandLen = inputLen/2;
sl@0
   625
				TPtrC8 left = input->Left(leftHandLen);
sl@0
   626
				TPtrC8 right = input->Right(inputLen - leftHandLen);
sl@0
   627
sl@0
   628
				TPtrC8 halfDigest = md->Hash(left);
sl@0
   629
				if (halfDigest.Size()==0)	//	Unnecessary test, but removes
sl@0
   630
					User::Leave(KErrAbort);	//	a warning about not using halfDigest
sl@0
   631
				TPtrC8 wholeDigest = md->Hash(right);
sl@0
   632
				
sl@0
   633
				if (wholeDigest!=(*output))	
sl@0
   634
					{
sl@0
   635
					testSuccess = EFalse;
sl@0
   636
					}
sl@0
   637
				}
sl@0
   638
sl@0
   639
///////////////////////////////////////////////////////////////
sl@0
   640
//	Now test the new API - Update/Final functions	
sl@0
   641
///////////////////////////////////////////////////////////////
sl@0
   642
			md->Reset();
sl@0
   643
			TPtrC8 finalDigest = md->Final(*input);
sl@0
   644
			if (finalDigest!=(*output))
sl@0
   645
				{
sl@0
   646
				testSuccess = EFalse;
sl@0
   647
				}			
sl@0
   648
sl@0
   649
		//	Now try this in 2 half sections (just a quick check)
sl@0
   650
			md->Reset();
sl@0
   651
		
sl@0
   652
			inputLen = input->Length();
sl@0
   653
			if (inputLen > 1)
sl@0
   654
				{
sl@0
   655
				TInt leftHandLen = inputLen/2;
sl@0
   656
				TPtrC8 left = input->Left(leftHandLen);
sl@0
   657
				TPtrC8 right = input->Right(inputLen - leftHandLen);
sl@0
   658
sl@0
   659
				md->Update(left);
sl@0
   660
				TPtrC8 wholeDigest = md->Final(right);
sl@0
   661
				
sl@0
   662
				if (wholeDigest!=(*output))	
sl@0
   663
					{
sl@0
   664
					testSuccess = EFalse;
sl@0
   665
					}
sl@0
   666
				}
sl@0
   667
			delete md;
sl@0
   668
			CleanupStack::PopAndDestroy(3);	//	input, key, output			
sl@0
   669
			break;
sl@0
   670
			}
sl@0
   671
		case CTestData::EFinished:
sl@0
   672
			finished=ETrue;
sl@0
   673
			break;
sl@0
   674
		default:
sl@0
   675
			test.Printf(_L("Error in data file\r\n"));
sl@0
   676
			break;
sl@0
   677
			}
sl@0
   678
		};
sl@0
   679
sl@0
   680
	CleanupStack::PopAndDestroy(data);
sl@0
   681
	
sl@0
   682
	if (!testSuccess)
sl@0
   683
		User::Leave(KErrGeneral);
sl@0
   684
	}
sl@0
   685
sl@0
   686
void HMACTestsL(CMessageDigest* aMD,const TDesC& aFilename, const TDesC& aHashType)
sl@0
   687
	{
sl@0
   688
	TBuf<0x40> formattable;
sl@0
   689
	formattable.Format(_L("HMAC Tests for %S"), &aHashType);
sl@0
   690
	test.Next(formattable);
sl@0
   691
	CMessageDigest* temp = aMD->ReplicateL();
sl@0
   692
	CleanupStack::PushL(temp);
sl@0
   693
	CHMAC* hmac=CHMAC::NewL(_L8("aaaaaaaa"), temp);
sl@0
   694
	CleanupStack::Pop(temp);
sl@0
   695
	CleanupStack::PushL(hmac);
sl@0
   696
	
sl@0
   697
//	For each of the available digests
sl@0
   698
	FunctionalityTestL(hmac);		//JCS for now
sl@0
   699
	HMACVectorTestL(aMD,aFilename);	
sl@0
   700
	OOMTestL(hmac);
sl@0
   701
		
sl@0
   702
	CleanupStack::PopAndDestroy(hmac);
sl@0
   703
	}
sl@0
   704
sl@0
   705
sl@0
   706
void MD2TestsL()
sl@0
   707
	{
sl@0
   708
	CMD2* md2;
sl@0
   709
	md2=CMD2::NewL();
sl@0
   710
	CleanupStack::PushL(md2);
sl@0
   711
sl@0
   712
	FunctionalityTestL(md2);
sl@0
   713
	
sl@0
   714
	VectorTestL(md2,_L("md2.dat"));
sl@0
   715
	
sl@0
   716
	OOMTestL(md2);
sl@0
   717
		
sl@0
   718
	CleanupStack::PopAndDestroy(md2);
sl@0
   719
sl@0
   720
// Problem reported by Jal Panvel, 17-12-1999.
sl@0
   721
// Report by email, CSHA1::Hash() returning zero length descriptor
sl@0
   722
// 
sl@0
   723
// This was caused by failure to set internal hash descriptor length on setup, this
sl@0
   724
// problem was present in all hashes except MD2 which set it up correctly.
sl@0
   725
// Fixed 17-12-1999.
sl@0
   726
	test.Next(_L("Fixed bugs Tests"));
sl@0
   727
	md2 = CMD2::NewL();
sl@0
   728
	CleanupStack::PushL(md2);
sl@0
   729
	TPtrC8 data(_L8("The quick brown fox jumped over the lazy dog"));
sl@0
   730
	TBuf8<128> hash;
sl@0
   731
	hash = md2->Hash(data);
sl@0
   732
	test(hash.Length() == md2->HashSize());
sl@0
   733
	
sl@0
   734
	HMACTestsL(md2,_L("hmacmd2.dat"), _L("md2"));
sl@0
   735
	CleanupStack::PopAndDestroy(md2);
sl@0
   736
	}
sl@0
   737
sl@0
   738
void MD5TestsL()
sl@0
   739
	{
sl@0
   740
	CMD5* md5;
sl@0
   741
	md5=CMD5::NewL();
sl@0
   742
	CleanupStack::PushL(md5);
sl@0
   743
sl@0
   744
	FunctionalityTestL(md5);
sl@0
   745
	
sl@0
   746
	VectorTestL(md5,_L("md5.dat"));
sl@0
   747
	
sl@0
   748
	OOMTestL(md5);
sl@0
   749
	
sl@0
   750
	CleanupStack::PopAndDestroy(md5);
sl@0
   751
	test.Next(_L("Fixed bugs Tests"));
sl@0
   752
// Problem reported by Jal Panvel, 17-12-1999.
sl@0
   753
// Report by email, CSHA1::Hash() returning zero length descriptor
sl@0
   754
// 
sl@0
   755
// This was caused by failure to set internal hash descriptor length on setup, this
sl@0
   756
// problem was present in all hashes except MD2 which set it up correctly.
sl@0
   757
// Fixed 17-12-1999.
sl@0
   758
	CMD5* md = CMD5::NewL();
sl@0
   759
	CleanupStack::PushL(md);
sl@0
   760
	TPtrC8 data(_L8("The quick brown fox jumped over the lazy dog"));
sl@0
   761
	TBuf8<128> hash;
sl@0
   762
	hash = md->Hash(data);
sl@0
   763
	test(hash.Length() == md->HashSize());
sl@0
   764
		
sl@0
   765
	HMACTestsL(md5,_L("hmacmd5.dat"), _L("md5"));
sl@0
   766
	CleanupStack::PopAndDestroy(md);
sl@0
   767
sl@0
   768
	//	Test for DEF001510 "TLS - Receives Disconnect Indication during hands..."
sl@0
   769
	CMD5* testHasher = CMD5::NewL();
sl@0
   770
	CleanupStack::PushL(testHasher);
sl@0
   771
	TPtrC8 client(_L8("D652CA1A6154D8303C16C055E424A5ACF3EBAB94284CD9B05B85C0D0F0B8E7A4"));
sl@0
   772
	TPtrC8 server(_L8("3E3E56059EFEE4F8C5B05C76128C4C84916DF9E935510C3C063454856FF29FF8"));
sl@0
   773
sl@0
   774
	HBufC8* clientData = client.AllocLC();
sl@0
   775
	HBufC8* serverData = server.AllocLC();
sl@0
   776
sl@0
   777
	Hex(*clientData);
sl@0
   778
	Hex(*serverData);
sl@0
   779
	
sl@0
   780
	testHasher->Hash(*clientData);
sl@0
   781
	testHasher->Hash(*serverData);
sl@0
   782
	
sl@0
   783
	TBuf8<32> md5buf;
sl@0
   784
	md5buf.Copy(testHasher->Hash(TPtrC8(0,0)));
sl@0
   785
sl@0
   786
	testHasher->Reset();
sl@0
   787
sl@0
   788
//	Now hash in one chunk
sl@0
   789
	TPtrC8 all(_L8("D652CA1A6154D8303C16C055E424A5ACF3EBAB94284CD9B05B85C0D0F0B8E7A43E3E56059EFEE4F8C5B05C76128C4C84916DF9E935510C3C063454856FF29FF8"));
sl@0
   790
	HBufC8* allData = all.AllocLC();
sl@0
   791
	Hex(*allData);
sl@0
   792
sl@0
   793
	TBuf8<32> allbuf;
sl@0
   794
	allbuf = testHasher->Hash(*allData);
sl@0
   795
	test(allbuf.Compare(md5buf)==0);
sl@0
   796
	CleanupStack::PopAndDestroy(4, testHasher);
sl@0
   797
	}
sl@0
   798
sl@0
   799
// Test for the MD4 Message Digest Algorithm API's	
sl@0
   800
void MD4TestsL()
sl@0
   801
	{
sl@0
   802
	CMD4* md4;
sl@0
   803
	md4=CMD4::NewL();
sl@0
   804
	CleanupStack::PushL(md4);
sl@0
   805
sl@0
   806
	FunctionalityTestL(md4);
sl@0
   807
	
sl@0
   808
	VectorTestL(md4,_L("md4.dat"));
sl@0
   809
	
sl@0
   810
	OOMTestL(md4);
sl@0
   811
	
sl@0
   812
	CleanupStack::PopAndDestroy(md4);
sl@0
   813
   
sl@0
   814
    //Test to check the Hash Size.
sl@0
   815
	CMD4* md = CMD4::NewL();
sl@0
   816
	CleanupStack::PushL(md);
sl@0
   817
	TPtrC8 data(_L8("The quick brown fox jumped over the lazy dog"));
sl@0
   818
	TBuf8<128> hash;
sl@0
   819
	hash = md->Hash(data);
sl@0
   820
	test(hash.Length() == md->HashSize());
sl@0
   821
		
sl@0
   822
	HMACTestsL(md,_L("hmacmd4.dat"), _L("md4"));
sl@0
   823
	CleanupStack::PopAndDestroy(md);
sl@0
   824
   
sl@0
   825
    //Tests carried for other Message Digest Algorithms copied(SHA1 and MD5)
sl@0
   826
    //Here Input Data is given in two parts and as a whole and the digest generated is compared.
sl@0
   827
	CMD4* testHasher = CMD4::NewL();
sl@0
   828
	CleanupStack::PushL(testHasher);
sl@0
   829
	TPtrC8 client(_L8("D652CA1A6154D8303C16C055E424A5ACF3EBAB94284CD9B05B85C0D0F0B8E7A4"));
sl@0
   830
	TPtrC8 server(_L8("3E3E56059EFEE4F8C5B05C76128C4C84916DF9E935510C3C063454856FF29FF8"));
sl@0
   831
sl@0
   832
	HBufC8* clientData = client.AllocLC();
sl@0
   833
	HBufC8* serverData = server.AllocLC();
sl@0
   834
sl@0
   835
	Hex(*clientData);
sl@0
   836
	Hex(*serverData);
sl@0
   837
	
sl@0
   838
	testHasher->Hash(*clientData);
sl@0
   839
	testHasher->Hash(*serverData);
sl@0
   840
	
sl@0
   841
	TBuf8<32> md4buf;
sl@0
   842
	md4buf.Copy(testHasher->Hash(TPtrC8(0,0)));
sl@0
   843
sl@0
   844
	testHasher->Reset();
sl@0
   845
sl@0
   846
//	Now hash in one chunk
sl@0
   847
	TPtrC8 all(_L8("D652CA1A6154D8303C16C055E424A5ACF3EBAB94284CD9B05B85C0D0F0B8E7A43E3E56059EFEE4F8C5B05C76128C4C84916DF9E935510C3C063454856FF29FF8"));
sl@0
   848
	HBufC8* allData = all.AllocLC();
sl@0
   849
	Hex(*allData);
sl@0
   850
sl@0
   851
	TBuf8<32> allbuf;
sl@0
   852
	allbuf = testHasher->Hash(*allData);
sl@0
   853
	test(allbuf.Compare(md4buf)==0);
sl@0
   854
	CleanupStack::PopAndDestroy(4, testHasher);
sl@0
   855
	
sl@0
   856
	//Tests for the Factory Method CMessageDigestFactory
sl@0
   857
	CMessageDigest* messageDigest = CMessageDigestFactory::NewDigestLC(CMessageDigest::EMD4);
sl@0
   858
    VectorTestL(messageDigest,_L("md4.dat"));
sl@0
   859
    CleanupStack::PopAndDestroy(messageDigest);
sl@0
   860
    }
sl@0
   861
sl@0
   862
sl@0
   863
void SHA1TestsL()
sl@0
   864
	{
sl@0
   865
	CSHA1* sha;
sl@0
   866
	sha=CSHA1::NewL();
sl@0
   867
	CleanupStack::PushL(sha);
sl@0
   868
sl@0
   869
	VectorTestL(sha,_L("sha1.dat"));
sl@0
   870
	
sl@0
   871
	FunctionalityTestL(sha);
sl@0
   872
	
sl@0
   873
	OOMTestL(sha);
sl@0
   874
		
sl@0
   875
	CleanupStack::PopAndDestroy(sha);
sl@0
   876
sl@0
   877
	test.Next(_L("Fixed bugs Tests"));	
sl@0
   878
// Problem reported by Jal Panvel, 17-12-1999.
sl@0
   879
// Report by email, CSHA1::Hash() returning zero length descriptor
sl@0
   880
// 
sl@0
   881
// This was caused by failure to set internal hash descriptor length on setup, this
sl@0
   882
// problem was present in all hashes except MD2 which set it up correctly.
sl@0
   883
// Fixed 17-12-1999.
sl@0
   884
sl@0
   885
	sha=CSHA1::NewL();
sl@0
   886
	CleanupStack::PushL(sha);
sl@0
   887
	TPtrC8 data(_L8("The quick brown fox jumped over the lazy dog"));
sl@0
   888
	TBuf8<128> hash;
sl@0
   889
	hash = sha->Hash(data);
sl@0
   890
	test(hash.Length() == sha->HashSize());
sl@0
   891
	sha->Reset();
sl@0
   892
	
sl@0
   893
	//	Test for DEF001510 "TLS - Receives Disconnect Indication during hands..."
sl@0
   894
	CSHA1* testHasher = CSHA1::NewL();
sl@0
   895
	CleanupStack::PushL(testHasher);
sl@0
   896
	TPtrC8 client(_L8("D652CA1A6154D8303C16C055E424A5ACF3EBAB94284CD9B05B85C0D0F0B8E7A4"));
sl@0
   897
	TPtrC8 server(_L8("3E3E56059EFEE4F8C5B05C76128C4C84916DF9E935510C3C063454856FF29FF8"));
sl@0
   898
sl@0
   899
	HBufC8* clientData = client.AllocLC();
sl@0
   900
	HBufC8* serverData = server.AllocLC();
sl@0
   901
sl@0
   902
	Hex(*clientData);
sl@0
   903
	Hex(*serverData);
sl@0
   904
sl@0
   905
//	Hash in 2 portions
sl@0
   906
	TBuf8<32> clientbuf;
sl@0
   907
	TBuf8<32> serverbuf;
sl@0
   908
	clientbuf = testHasher->Hash(*clientData);
sl@0
   909
	serverbuf = testHasher->Hash(*serverData);
sl@0
   910
	
sl@0
   911
	TBuf8<32> shabuf;
sl@0
   912
	shabuf.Copy(testHasher->Hash(TPtrC8(0,0)));
sl@0
   913
	testHasher->Reset();
sl@0
   914
sl@0
   915
//	Now hash in one chunk
sl@0
   916
	TPtrC8 all(_L8("D652CA1A6154D8303C16C055E424A5ACF3EBAB94284CD9B05B85C0D0F0B8E7A43E3E56059EFEE4F8C5B05C76128C4C84916DF9E935510C3C063454856FF29FF8"));
sl@0
   917
	HBufC8* allData = all.AllocLC();
sl@0
   918
	Hex(*allData);
sl@0
   919
sl@0
   920
	TBuf8<32> allbuf;
sl@0
   921
	allbuf = testHasher->Hash(*allData);
sl@0
   922
sl@0
   923
	test(allbuf.Compare(shabuf)==0);
sl@0
   924
	CleanupStack::PopAndDestroy(4, testHasher);
sl@0
   925
	
sl@0
   926
	// Test hashing non-word aligned data - used to crash on arm
sl@0
   927
	TPtrC8 nonAlignedData = data.Mid(1);
sl@0
   928
	hash = sha->Final(nonAlignedData);
sl@0
   929
	test(hash.Length() == sha->HashSize());
sl@0
   930
	sha->Reset();
sl@0
   931
	
sl@0
   932
//	Test end
sl@0
   933
	HMACTestsL(sha,_L("hmacsha1.dat"), _L("sha1"));
sl@0
   934
	CleanupStack::PopAndDestroy();		// sha
sl@0
   935
	}
sl@0
   936
sl@0
   937
void ExecuteHashTestsL(CMessageDigest* aMD, const TDesC& aVector, const TDesC& aHMACVector, const TDesC& aHashType)
sl@0
   938
	{
sl@0
   939
	VectorTestL(aMD, aVector);
sl@0
   940
	FunctionalityTestL(aMD);
sl@0
   941
	OOMTestL(aMD);
sl@0
   942
	aMD->Reset();
sl@0
   943
sl@0
   944
	test.Next(_L("Fixed bugs Tests"));	
sl@0
   945
sl@0
   946
	_LIT8(KTest1Data, "The quick brown fox jumped over the lazy dog");
sl@0
   947
	TBuf8<KMaxHashSize> hash;
sl@0
   948
	hash = aMD->Hash(KTest1Data());
sl@0
   949
	test(hash.Length() == aMD->HashSize());
sl@0
   950
	aMD->Reset();
sl@0
   951
	
sl@0
   952
	//	Test for DEF001510 "TLS - Receives Disconnect Indication during hands..."
sl@0
   953
	_LIT8(KClientData, "D652CA1A6154D8303C16C055E424A5ACF3EBAB94284CD9B05B85C0D0F0B8E7A4");
sl@0
   954
	_LIT8(KServerData, "3E3E56059EFEE4F8C5B05C76128C4C84916DF9E935510C3C063454856FF29FF8");
sl@0
   955
	
sl@0
   956
	HBufC8* clientData = KClientData().AllocLC();
sl@0
   957
	HBufC8* serverData = KServerData().AllocLC();
sl@0
   958
sl@0
   959
	Hex(*clientData);
sl@0
   960
	Hex(*serverData);
sl@0
   961
	
sl@0
   962
//	Hash in 2 portions
sl@0
   963
	aMD->Hash(*clientData);
sl@0
   964
	aMD->Hash(*serverData);
sl@0
   965
sl@0
   966
	CleanupStack::PopAndDestroy(2, clientData);
sl@0
   967
sl@0
   968
	TBuf8<KMaxHashSize> shabuf;
sl@0
   969
	shabuf.Copy(aMD->Hash(KNullDesC8()));
sl@0
   970
	aMD->Reset();
sl@0
   971
sl@0
   972
//	Now hash in one chunk
sl@0
   973
	_LIT8(KAllData, "D652CA1A6154D8303C16C055E424A5ACF3EBAB94284CD9B05B85C0D0F0B8E7A43E3E56059EFEE4F8C5B05C76128C4C84916DF9E935510C3C063454856FF29FF8");
sl@0
   974
	HBufC8* allData = KAllData().AllocLC();
sl@0
   975
	Hex(*allData);
sl@0
   976
sl@0
   977
	TBuf8<KMaxHashSize> allbuf;
sl@0
   978
	allbuf = aMD->Hash(*allData);
sl@0
   979
	
sl@0
   980
	test(allbuf.Compare(shabuf)==0);
sl@0
   981
	CleanupStack::PopAndDestroy(allData);
sl@0
   982
	
sl@0
   983
	// Test hashing non-word aligned data - used to crash on arm
sl@0
   984
	TPtrC8 nonAlignedData = KTest1Data().Mid(1);
sl@0
   985
	hash = aMD->Final(nonAlignedData);
sl@0
   986
	test(hash.Length() == aMD->HashSize());
sl@0
   987
	aMD->Reset();
sl@0
   988
	
sl@0
   989
//	Test end
sl@0
   990
	HMACTestsL(aMD, aHMACVector, aHashType);
sl@0
   991
	}
sl@0
   992
sl@0
   993
_LIT(K224Algo, "SHA-224.dat");
sl@0
   994
_LIT(K256Algo, "SHA-256.dat");
sl@0
   995
_LIT(K384Algo, "SHA-384.dat");
sl@0
   996
_LIT(K512Algo, "SHA-512.dat");
sl@0
   997
_LIT(K224Vector, "sha224.dat");
sl@0
   998
_LIT(K256Vector, "sha256.dat");
sl@0
   999
_LIT(K384Vector, "sha384.dat");
sl@0
  1000
_LIT(K512Vector, "sha512.dat");
sl@0
  1001
_LIT(K224HmacVector, "hmacsha224.dat");
sl@0
  1002
_LIT(K256HmacVector, "hmacsha256.dat");
sl@0
  1003
_LIT(K384HmacVector, "hmacsha384.dat");
sl@0
  1004
_LIT(K512HmacVector, "hmacsha512.dat");
sl@0
  1005
sl@0
  1006
const TDesC* gNames[] = 
sl@0
  1007
	{
sl@0
  1008
	&K224Vector(),
sl@0
  1009
	&K224HmacVector(),
sl@0
  1010
	&K224Algo(),
sl@0
  1011
	&K256Vector(),
sl@0
  1012
	&K256HmacVector(),
sl@0
  1013
	&K256Algo(),
sl@0
  1014
	&K384Vector(),
sl@0
  1015
	&K384HmacVector(),
sl@0
  1016
	&K384Algo(),
sl@0
  1017
	&K512Vector(),
sl@0
  1018
	&K512HmacVector(),
sl@0
  1019
	&K512Algo(),
sl@0
  1020
	};
sl@0
  1021
sl@0
  1022
sl@0
  1023
void SHA2TestsL(CMessageDigest::THashId aHashId)
sl@0
  1024
	{
sl@0
  1025
	CMessageDigest* md = CMessageDigestFactory::NewDigestLC(aHashId);
sl@0
  1026
	TInt pos = aHashId - CMessageDigest::ESHA224;
sl@0
  1027
	pos *= 3;
sl@0
  1028
	ExecuteHashTestsL(md, *gNames[pos], *gNames[pos+1], *gNames[pos+2]);
sl@0
  1029
	CleanupStack::PopAndDestroy(md);
sl@0
  1030
	}
sl@0
  1031
sl@0
  1032
void HashTests(void)
sl@0
  1033
	{
sl@0
  1034
	TInt32 testsFailed=0, testCount=0; 
sl@0
  1035
	
sl@0
  1036
	test.Start(_L("SHA1 Tests"));
sl@0
  1037
	TRAPD(r, SHA1TestsL());
sl@0
  1038
	++testCount;
sl@0
  1039
  if (r!=KErrNone)
sl@0
  1040
		{
sl@0
  1041
		test.Printf(_L("\r\nSHA1 Tests failed error code = %d\r\n\r\n"),r);
sl@0
  1042
		++testsFailed;
sl@0
  1043
		}
sl@0
  1044
	
sl@0
  1045
  test.Start(_L("SHA-224 Tests"));
sl@0
  1046
	TRAP(r, SHA2TestsL(CMessageDigest::ESHA224));
sl@0
  1047
	++testCount;
sl@0
  1048
	if (r!=KErrNone)
sl@0
  1049
		{
sl@0
  1050
		test.Printf(_L("\r\nSHA-224 Tests failed error code = %d\r\n\r\n"),r);
sl@0
  1051
		++testsFailed;
sl@0
  1052
		}
sl@0
  1053
sl@0
  1054
	test.Start(_L("SHA-256 Tests"));	
sl@0
  1055
	TRAP(r, SHA2TestsL(CMessageDigest::ESHA256));
sl@0
  1056
	++testCount;
sl@0
  1057
	if (r!=KErrNone)
sl@0
  1058
		{
sl@0
  1059
		test.Printf(_L("\r\nSHA-256 Tests failed error code = %d\r\n\r\n"),r);
sl@0
  1060
		++testsFailed;
sl@0
  1061
		}
sl@0
  1062
sl@0
  1063
	test.Start(_L("SHA-384 Tests"));	
sl@0
  1064
	TRAP(r, SHA2TestsL(CMessageDigest::ESHA384));
sl@0
  1065
	++testCount;
sl@0
  1066
	if (r!=KErrNone)
sl@0
  1067
		{
sl@0
  1068
		test.Printf(_L("\r\nSHA-384 Tests failed error code = %d\r\n\r\n"),r);
sl@0
  1069
		++testsFailed;
sl@0
  1070
		}
sl@0
  1071
sl@0
  1072
	test.Start(_L("SHA-512 Tests"));	
sl@0
  1073
	TRAP(r, SHA2TestsL(CMessageDigest::ESHA512));
sl@0
  1074
	++testCount;
sl@0
  1075
	if (r!=KErrNone)
sl@0
  1076
		{
sl@0
  1077
		test.Printf(_L("\r\nSHA-512 Tests failed error code = %d\r\n\r\n"),r);
sl@0
  1078
		++testsFailed;
sl@0
  1079
		}
sl@0
  1080
	
sl@0
  1081
	test.Start(_L("MD5 Tests"));
sl@0
  1082
	TRAP(r, MD5TestsL());
sl@0
  1083
  ++testCount;
sl@0
  1084
	if (r!=KErrNone)
sl@0
  1085
		{
sl@0
  1086
		test.Printf(_L("\r\nMD5 Tests failed error code = %d\r\n\r\n"),r);
sl@0
  1087
		++testsFailed;
sl@0
  1088
		}
sl@0
  1089
sl@0
  1090
	test.Start(_L("MD2 Tests"));
sl@0
  1091
	TRAP(r, MD2TestsL());
sl@0
  1092
  ++testCount;
sl@0
  1093
	if (r!=KErrNone)
sl@0
  1094
		{
sl@0
  1095
		test.Printf(_L("\r\nMD2 Tests failed error code = %d\r\n\r\n"),r);
sl@0
  1096
		++testsFailed;
sl@0
  1097
		}
sl@0
  1098
 
sl@0
  1099
	//MD4 Message Digest Algorithm Tests
sl@0
  1100
	test.Start(_L("MD4 Tests"));
sl@0
  1101
	TRAP(r, MD4TestsL());
sl@0
  1102
  ++testCount;
sl@0
  1103
	if (r!=KErrNone)
sl@0
  1104
		{
sl@0
  1105
		test.Printf(_L("\r\nMD4 Tests failed error code = %d\r\n\r\n"),r);
sl@0
  1106
		++testsFailed;
sl@0
  1107
		}
sl@0
  1108
sl@0
  1109
	test.Printf(_L("\r\n%d tests failed out of %d \r\n"),testsFailed,testCount);
sl@0
  1110
sl@0
  1111
sl@0
  1112
	test(testsFailed==0);
sl@0
  1113
	}
sl@0
  1114
sl@0
  1115
sl@0
  1116
GLDEF_C TInt E32Main(void)
sl@0
  1117
sl@0
  1118
	{
sl@0
  1119
	CTrapCleanup* cleanup;
sl@0
  1120
	cleanup=CTrapCleanup::New();
sl@0
  1121
		
sl@0
  1122
	test.Start(_L(" @SYMTestCaseID:SEC-CRYPTO-HASH-0001 Hash Algorithm Tests "));		 
sl@0
  1123
	CTestConsole* con=NULL;
sl@0
  1124
	TRAPD(ret, con=CTestConsole::NewL(test.Console()));
sl@0
  1125
	if(ret != KErrNone)
sl@0
  1126
		{
sl@0
  1127
		return ret;	
sl@0
  1128
		}
sl@0
  1129
	RFs fs;
sl@0
  1130
sl@0
  1131
	fs.Connect();
sl@0
  1132
	RFile* file;
sl@0
  1133
	file=new (ELeave) RFile;
sl@0
  1134
	
sl@0
  1135
	TDriveUnit sysDrive (fs.GetSystemDrive());
sl@0
  1136
	TDriveName driveName(sysDrive.Name());
sl@0
  1137
	TBuf<24> hashLogFile (driveName);
sl@0
  1138
	hashLogFile.Append(_L("\\HashLog.txt"));
sl@0
  1139
	
sl@0
  1140
	file->Replace(fs,hashLogFile,EFileShareAny|EFileWrite);
sl@0
  1141
	con->SetLogFile(file);
sl@0
  1142
	
sl@0
  1143
	test.SetConsole(con);
sl@0
  1144
	__UHEAP_MARK;
sl@0
  1145
	 HashTests();		
sl@0
  1146
	__UHEAP_MARKEND;
sl@0
  1147
sl@0
  1148
	test.End();
sl@0
  1149
	test.Close();
sl@0
  1150
	delete cleanup;
sl@0
  1151
	return(KErrNone);
sl@0
  1152
	}