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