Update contrib.
2 * Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
4 * This component and the accompanying materials are made available
5 * under the terms of the License "Eclipse Public License v1.0"
6 * which accompanies this distribution, and is available
7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
9 * Initial Contributors:
10 * Nokia Corporation - initial contribution.
23 #include "hashtestutils.h"
26 TBool gInOOMTest=EFalse;
28 RTest test(_L("Hash Tests"));
30 const TInt KMaxHashSize = 64; // Hash size in bytes
32 void Hex(HBufC8& aString)
34 TPtr8 ptr=aString.Des();
35 if (aString.Length()%2)
41 for (i=0;i<aString.Length();i+=2)
44 tmp=(TUint8)(aString[i]-(aString[i]>'9'?('A'-10):'0'));
46 tmp|=(TUint8)(aString[i+1]-(aString[i+1]>'9'?('A'-10):'0'));
49 ptr.SetLength(aString.Length()/2);
53 {// Pointless function to print a dot
67 void FunctionalityTestL(CMessageDigest* aMD)
70 test.Next(_L("Functionality test - original API"));
72 const TInt maxbuffersize=1024;
82 buffersize=maxbuffersize;
86 TBool testSuccess = ETrue;
88 TBuf8<maxbuffersize> buf(maxbuffersize);
89 for (;i<buffersize;i++)
94 for (i=0;i<buffersize;i+=increment)
116 TPtrC8 ptr=buf.Left(i);
117 TPtrC8 ptr2=buf.Left(j);
118 TPtrC8 ptr3=buf.Mid(j,i-j);
120 CMessageDigest* first=aMD->ReplicateL();
121 CleanupStack::PushL(first);
122 TPtrC8 firstFinal = first->Hash(ptr);
126 TPtrC8 aMDFinal = aMD->Final();
128 CMessageDigest* second=aMD->ReplicateL();
129 CleanupStack::PushL(second);
132 CMessageDigest* third=second->CopyL();
133 CleanupStack::PushL(third);
135 TPtrC8 secondFinal = second->Hash(ptr3);
137 if (aMDFinal!=firstFinal)
139 testSuccess = EFalse;
142 if (firstFinal!=secondFinal)
144 testSuccess = EFalse;
147 TPtrC8 thirdFinal = third->Hash(ptr3);
148 if (firstFinal!=thirdFinal)
150 testSuccess = EFalse;
152 CleanupStack::PopAndDestroy(3); // first, second, third
156 ///////////////////////////////////////////////////////////////
157 // Now test the new API - Update/Final functions
158 ///////////////////////////////////////////////////////////////
160 test.Next(_L("\rFunctionality test - calls added API functions Final & Update"));
162 for (i=0;i<buffersize;i++)
167 for (i=0;i<buffersize;i+=increment)
188 TPtrC8 ptr=buf.Left(i);
189 TPtrC8 ptr2=buf.Left(j);
190 TPtrC8 ptr3=buf.Mid(j,i-j);
192 CMessageDigest* first=aMD->ReplicateL();
193 CleanupStack::PushL(first);
198 CMessageDigest* second=aMD->ReplicateL();
199 CleanupStack::PushL(second);
200 second->Update(ptr2);
202 CMessageDigest* third=second->CopyL();
203 CleanupStack::PushL(third);
206 second->Update(ptr3);
208 TPtrC8 aMDFinal = aMD->Final();
209 TPtrC8 firstFinal = first->Final();
210 TPtrC8 secondFinal = second->Final();
211 TPtrC8 thirdFinal = third->Final();
213 if (aMDFinal!=firstFinal)
215 testSuccess = EFalse;
218 if (firstFinal!=secondFinal)
220 testSuccess = EFalse;
223 if (firstFinal!=thirdFinal)
225 testSuccess = EFalse;
228 CleanupStack::PopAndDestroy(3); // first, second, third
233 test.Printf(_L("\r\n"));
236 User::Leave(KErrGeneral);
239 void VectorTestL(CMessageDigest* aMD,const TDesC& aFilename)
241 test.Next(_L("Test Vector tests - original API"));
242 TBool finished=EFalse;
243 TBool testSuccess = ETrue;
244 //aFilename is a .dat file which contains the message and the corresponding digest
245 CTestData* data = CTestData::NewL(aFilename);
246 CleanupStack::PushL(data);
250 switch (data->Type())
252 case CTestData::EMessage:
256 //This is added to read large input data from the files.
257 case CTestData::EFileName:
259 CMessageDigest* md=aMD->ReplicateL();
260 CleanupStack::PushL(md);
262 //get the filename from the .dat file
263 HBufC8* filename = (*data)[1];
264 User::LeaveIfNull(filename);
265 CleanupStack::PushL(filename);
267 HBufC8* output= (*data)[2];
268 User::LeaveIfNull(output);
269 CleanupStack::PushL(output);
272 HBufC16* inputFileName = CnvUtfConverter::ConvertToUnicodeFromUtf8L(*filename);
276 CleanupClosePushL(fs);
277 User::LeaveIfError(fs.Connect());
278 TDriveUnit sysDrive(fs.GetSystemDrive());
279 TBuf<24> filePath (sysDrive.Name());
280 filePath.Append(_L("\\thash\\"));
281 User::LeaveIfError(fs.SetSessionPath(filePath));
282 CleanupClosePushL(file);
283 User::LeaveIfError(file.Open(fs,*inputFileName,EFileShareAny|EFileRead));
288 HBufC8* fileContents=HBufC8::NewMaxL(size);
290 TPtr8 ptr=fileContents->Des();
291 User::LeaveIfError(file.Read(ptr));
292 CleanupStack::PopAndDestroy(2, &fs);
293 CleanupStack::PushL(fileContents);
294 delete inputFileName;
296 TPtrC8 digest = md->Hash(*fileContents);
297 if (digest!=(*output))
299 testSuccess = EFalse;
304 TPtrC8 digest2 = md->Hash(*fileContents);
305 if (digest2!=(*output))
307 testSuccess = EFalse;
310 // Now try this in 2 half sections (just a quick check)
313 TInt inputLen = fileContents->Length();
316 TInt leftHandLen = inputLen/2;
317 TPtrC8 left = fileContents->Left(leftHandLen);
318 TPtrC8 right = fileContents->Right(inputLen - leftHandLen);
320 TPtrC8 halfDigest = md->Hash(left);
321 if (halfDigest.Size()==0) // Unnecessary test, but removes
322 User::Leave(KErrAbort); // a warning about not using halfDigest
324 TPtrC8 wholeDigest = md->Hash(right);
326 if (wholeDigest!=(*output))
328 testSuccess = EFalse;
333 if (md->Final(*fileContents)!=(*output))
335 testSuccess = EFalse;
338 // Now try this in 2 half sections (just a quick check)
340 inputLen = fileContents->Length();
343 TInt leftHandLen = inputLen/2;
344 TPtrC8 left = fileContents->Left(leftHandLen);
345 TPtrC8 right = fileContents->Right(inputLen - leftHandLen);
348 TPtrC8 wholeDigest = md->Final(right);
350 if (wholeDigest!=(*output))
352 testSuccess = EFalse;
355 CleanupStack::PopAndDestroy(4, md);//md,filename,output,fileContents
359 case CTestData::EData:
361 CMessageDigest* md=aMD->ReplicateL();
362 CleanupStack::PushL(md);
364 HBufC8* input = (*data)[0];
365 User::LeaveIfNull(input);
366 CleanupStack::PushL(input);
368 HBufC8* output= (*data)[1];
369 User::LeaveIfNull(output);
370 CleanupStack::PushL(output);
374 //call the Hash function of the Algorithm.
375 TPtrC8 digest = md->Hash(*input);
376 //Compare the digest generated with the output(digest) expected.
377 if (digest!=(*output))
379 testSuccess = EFalse;
382 //check the Reset() function.
385 TPtrC8 digest2 = md->Hash(*input);
386 if (digest2!=(*output))
388 testSuccess = EFalse;
391 // Now try this in 2 half sections (just a quick check)
394 TInt inputLen = input->Length();
397 TInt leftHandLen = inputLen/2;
398 TPtrC8 left = input->Left(leftHandLen);
399 TPtrC8 right = input->Right(inputLen - leftHandLen);
401 TPtrC8 halfDigest = md->Hash(left);
402 if (halfDigest.Size()==0) // Unnecessary test, but removes
403 User::Leave(KErrAbort); // a warning about not using halfDigest
405 TPtrC8 wholeDigest = md->Hash(right);
407 if (wholeDigest!=(*output))
409 testSuccess = EFalse;
413 ///////////////////////////////////////////////////////////////
414 // Now test the new API - Update/Final functions
415 ///////////////////////////////////////////////////////////////
417 if (md->Final(*input)!=(*output))
419 testSuccess = EFalse;
422 // Now try this in 2 half sections (just a quick check)
424 inputLen = input->Length();
427 TInt leftHandLen = inputLen/2;
428 TPtrC8 left = input->Left(leftHandLen);
429 TPtrC8 right = input->Right(inputLen - leftHandLen);
432 TPtrC8 wholeDigest = md->Final(right);
434 if (wholeDigest!=(*output))
436 testSuccess = EFalse;
439 CleanupStack::PopAndDestroy(3);
442 case CTestData::EFinished:
446 test.Printf(_L("Error in data file\r\n"));
451 CleanupStack::PopAndDestroy(data);
454 User::Leave(KErrGeneral);
457 void OOMTestL(CMessageDigest* aMD)
459 test.Next(_L("Out of memory test"));
460 TInt err = KErrNoMemory;
463 while (err!=KErrNone)
466 __UHEAP_FAILNEXT(nextFailure);
467 TRAP(err,FunctionalityTestL(aMD));
475 void HMACVectorTestL(CMessageDigest* aMD,const TDesC& aFilename)
477 test.Next(_L("HMAC Test Vector tests"));
478 CTestData* data = CTestData::NewL(aFilename);
479 CleanupStack::PushL(data);
481 TBool finished=EFalse;
482 TBool testSuccess = ETrue;
486 switch (data->Type())
488 case CTestData::EMessage:
492 case CTestData::EFileName:
494 //get the filename from the .dat file
495 HBufC8* filename = (*data)[1];
496 User::LeaveIfNull(filename);
497 CleanupStack::PushL(filename);
499 HBufC8* key= (*data)[2];
500 User::LeaveIfNull(key);
501 CleanupStack::PushL(key);
503 HBufC16* inputFileName = CnvUtfConverter::ConvertToUnicodeFromUtf8L(*filename);
505 HBufC8* output = (*data)[3];
506 User::LeaveIfNull(output);
507 CleanupStack::PushL(output);
514 CleanupClosePushL(fs);
515 User::LeaveIfError(fs.Connect());
516 TDriveUnit sysDrive(fs.GetSystemDrive());
517 TBuf<24> filePath (sysDrive.Name());
518 filePath.Append(_L("\\thash\\"));
519 User::LeaveIfError(fs.SetSessionPath(filePath));
520 CleanupClosePushL(file);
521 User::LeaveIfError(file.Open(fs,*inputFileName,EFileShareAny|EFileRead));
525 HBufC8* fileContents=HBufC8::NewMaxL(size);
527 TPtr8 ptr=fileContents->Des();
528 User::LeaveIfError(file.Read(ptr));
529 CleanupStack::PopAndDestroy(2, &fs);
530 CleanupStack::PushL(fileContents);
531 delete inputFileName;
533 CMessageDigest* temp = aMD->ReplicateL();
534 CleanupStack::PushL(temp);
535 CMessageDigest* md = CHMAC::NewL(*key, temp);
536 CleanupStack::Pop(temp); // Now owned by md
538 TPtrC8 digest = md->Hash(*fileContents);
539 if (digest!=(*output))
541 testSuccess = EFalse;
544 // Now try this in 2 half sections (just a quick check)
547 TInt inputLen = fileContents->Length();
550 TInt leftHandLen = inputLen/2;
551 TPtrC8 left = fileContents->Left(leftHandLen);
552 TPtrC8 right = fileContents->Right(inputLen - leftHandLen);
554 TPtrC8 halfDigest = md->Hash(left);
555 if (halfDigest.Size()==0) // Unnecessary test, but removes
556 User::Leave(KErrAbort); // a warning about not using halfDigest
557 TPtrC8 wholeDigest = md->Hash(right);
559 if (wholeDigest!=(*output))
561 testSuccess = EFalse;
566 TPtrC8 finalDigest = md->Final(*fileContents);
567 if (finalDigest!=(*output))
569 testSuccess = EFalse;
572 // Now try this in 2 half sections (just a quick check)
575 inputLen = fileContents->Length();
578 TInt leftHandLen = inputLen/2;
579 TPtrC8 left = fileContents->Left(leftHandLen);
580 TPtrC8 right = fileContents->Right(inputLen - leftHandLen);
583 TPtrC8 wholeDigest = md->Final(right);
585 if (wholeDigest!=(*output))
587 testSuccess = EFalse;
591 CleanupStack::PopAndDestroy(4, filename); // filename, key, output,fileContents
594 case CTestData::EData:
596 HBufC8* input = (*data)[0];
597 User::LeaveIfNull(input);
598 CleanupStack::PushL(input);
600 HBufC8* key = (*data)[1];
601 User::LeaveIfNull(key);
602 CleanupStack::PushL(key);
604 HBufC8* output = (*data)[2];
605 User::LeaveIfNull(output);
606 CleanupStack::PushL(output);
612 CMessageDigest* temp = aMD->ReplicateL();
613 CleanupStack::PushL(temp);
614 CMessageDigest* md = CHMAC::NewL(*key, temp);
615 CleanupStack::Pop(temp); // Now owned by md
617 TPtrC8 digest = md->Hash(*input);
618 if (digest!=(*output))
620 testSuccess = EFalse;
623 // Now try this in 2 half sections (just a quick check)
626 TInt inputLen = input->Length();
629 TInt leftHandLen = inputLen/2;
630 TPtrC8 left = input->Left(leftHandLen);
631 TPtrC8 right = input->Right(inputLen - leftHandLen);
633 TPtrC8 halfDigest = md->Hash(left);
634 if (halfDigest.Size()==0) // Unnecessary test, but removes
635 User::Leave(KErrAbort); // a warning about not using halfDigest
636 TPtrC8 wholeDigest = md->Hash(right);
638 if (wholeDigest!=(*output))
640 testSuccess = EFalse;
644 ///////////////////////////////////////////////////////////////
645 // Now test the new API - Update/Final functions
646 ///////////////////////////////////////////////////////////////
648 TPtrC8 finalDigest = md->Final(*input);
649 if (finalDigest!=(*output))
651 testSuccess = EFalse;
654 // Now try this in 2 half sections (just a quick check)
657 inputLen = input->Length();
660 TInt leftHandLen = inputLen/2;
661 TPtrC8 left = input->Left(leftHandLen);
662 TPtrC8 right = input->Right(inputLen - leftHandLen);
665 TPtrC8 wholeDigest = md->Final(right);
667 if (wholeDigest!=(*output))
669 testSuccess = EFalse;
673 CleanupStack::PopAndDestroy(3); // input, key, output
676 case CTestData::EFinished:
680 test.Printf(_L("Error in data file\r\n"));
685 CleanupStack::PopAndDestroy(data);
688 User::Leave(KErrGeneral);
691 void HMACTestsL(CMessageDigest* aMD,const TDesC& aFilename, const TDesC& aHashType)
693 TBuf<0x40> formattable;
694 formattable.Format(_L("HMAC Tests for %S"), &aHashType);
695 test.Next(formattable);
696 CMessageDigest* temp = aMD->ReplicateL();
697 CleanupStack::PushL(temp);
698 CHMAC* hmac=CHMAC::NewL(_L8("aaaaaaaa"), temp);
699 CleanupStack::Pop(temp);
700 CleanupStack::PushL(hmac);
702 // For each of the available digests
703 FunctionalityTestL(hmac); //JCS for now
704 HMACVectorTestL(aMD,aFilename);
707 CleanupStack::PopAndDestroy(hmac);
714 CleanupStack::PushL(md2);
716 FunctionalityTestL(md2);
718 VectorTestL(md2,_L("md2.dat"));
722 CleanupStack::PopAndDestroy(md2);
724 // Problem reported by Jal Panvel, 17-12-1999.
725 // Report by email, CSHA1::Hash() returning zero length descriptor
727 // This was caused by failure to set internal hash descriptor length on setup, this
728 // problem was present in all hashes except MD2 which set it up correctly.
730 test.Next(_L("Fixed bugs Tests"));
732 CleanupStack::PushL(md2);
733 TPtrC8 data(_L8("The quick brown fox jumped over the lazy dog"));
735 hash = md2->Hash(data);
736 test(hash.Length() == md2->HashSize());
738 HMACTestsL(md2,_L("hmacmd2.dat"), _L("md2"));
739 CleanupStack::PopAndDestroy(md2);
746 CleanupStack::PushL(md5);
748 FunctionalityTestL(md5);
750 VectorTestL(md5,_L("md5.dat"));
754 CleanupStack::PopAndDestroy(md5);
755 test.Next(_L("Fixed bugs Tests"));
756 // Problem reported by Jal Panvel, 17-12-1999.
757 // Report by email, CSHA1::Hash() returning zero length descriptor
759 // This was caused by failure to set internal hash descriptor length on setup, this
760 // problem was present in all hashes except MD2 which set it up correctly.
762 CMD5* md = CMD5::NewL();
763 CleanupStack::PushL(md);
764 TPtrC8 data(_L8("The quick brown fox jumped over the lazy dog"));
766 hash = md->Hash(data);
767 test(hash.Length() == md->HashSize());
769 HMACTestsL(md,_L("hmacmd5.dat"), _L("md5"));
770 CleanupStack::PopAndDestroy(md);
772 // Test for DEF001510 "TLS - Receives Disconnect Indication during hands..."
773 CMD5* testHasher = CMD5::NewL();
774 CleanupStack::PushL(testHasher);
775 TPtrC8 client(_L8("D652CA1A6154D8303C16C055E424A5ACF3EBAB94284CD9B05B85C0D0F0B8E7A4"));
776 TPtrC8 server(_L8("3E3E56059EFEE4F8C5B05C76128C4C84916DF9E935510C3C063454856FF29FF8"));
778 HBufC8* clientData = client.AllocLC();
779 HBufC8* serverData = server.AllocLC();
784 testHasher->Hash(*clientData);
785 testHasher->Hash(*serverData);
788 md5buf.Copy(testHasher->Hash(TPtrC8(0,0)));
792 // Now hash in one chunk
793 TPtrC8 all(_L8("D652CA1A6154D8303C16C055E424A5ACF3EBAB94284CD9B05B85C0D0F0B8E7A43E3E56059EFEE4F8C5B05C76128C4C84916DF9E935510C3C063454856FF29FF8"));
794 HBufC8* allData = all.AllocLC();
798 allbuf = testHasher->Hash(*allData);
799 test(allbuf.Compare(md5buf)==0);
800 CleanupStack::PopAndDestroy(4, testHasher);
808 CleanupStack::PushL(md4);
810 FunctionalityTestL(md4);
812 VectorTestL(md4,_L("md4.dat"));
816 CleanupStack::PopAndDestroy(md4);
818 //Copied the tests carried out for other Digest generating algorithms (MD5, SHA1)
819 CMD4* md = CMD4::NewL();
820 CleanupStack::PushL(md);
821 TPtrC8 data(_L8("The quick brown fox jumped over the lazy dog"));
823 hash = md->Hash(data);
824 test(hash.Length() == md->HashSize());
826 HMACTestsL(md,_L("hmacmd4.dat"), _L("md4"));
827 CleanupStack::PopAndDestroy(md);
829 CMD4* testHasher = CMD4::NewL();
830 CleanupStack::PushL(testHasher);
831 TPtrC8 client(_L8("D652CA1A6154D8303C16C055E424A5ACF3EBAB94284CD9B05B85C0D0F0B8E7A4"));
832 TPtrC8 server(_L8("3E3E56059EFEE4F8C5B05C76128C4C84916DF9E935510C3C063454856FF29FF8"));
834 HBufC8* clientData = client.AllocLC();
835 HBufC8* serverData = server.AllocLC();
840 testHasher->Hash(*clientData);
841 testHasher->Hash(*serverData);
844 md4buf.Copy(testHasher->Hash(TPtrC8(0,0)));
848 // Now hash in one chunk
849 TPtrC8 all(_L8("D652CA1A6154D8303C16C055E424A5ACF3EBAB94284CD9B05B85C0D0F0B8E7A43E3E56059EFEE4F8C5B05C76128C4C84916DF9E935510C3C063454856FF29FF8"));
850 HBufC8* allData = all.AllocLC();
854 allbuf = testHasher->Hash(*allData);
855 test(allbuf.Compare(md4buf)==0);
856 CleanupStack::PopAndDestroy(4, testHasher);
858 //Tests for the Factory Method CMessageDigestFactory
859 CMessageDigest* messageDigest = CMessageDigestFactory::NewDigestLC(CMessageDigest::EMD4);
860 VectorTestL(messageDigest,_L("md4.dat"));
861 CleanupStack::PopAndDestroy(messageDigest);
870 CleanupStack::PushL(sha);
872 VectorTestL(sha,_L("sha1.dat"));
874 FunctionalityTestL(sha);
878 CleanupStack::PopAndDestroy(sha);
880 test.Next(_L("Fixed bugs Tests"));
881 // Problem reported by Jal Panvel, 17-12-1999.
882 // Report by email, CSHA1::Hash() returning zero length descriptor
884 // This was caused by failure to set internal hash descriptor length on setup, this
885 // problem was present in all hashes except MD2 which set it up correctly.
889 CleanupStack::PushL(sha);
890 TPtrC8 data(_L8("The quick brown fox jumped over the lazy dog"));
892 hash = sha->Hash(data);
893 test(hash.Length() == sha->HashSize());
896 // Test for DEF001510 "TLS - Receives Disconnect Indication during hands..."
897 CSHA1* testHasher = CSHA1::NewL();
898 CleanupStack::PushL(testHasher);
899 TPtrC8 client(_L8("D652CA1A6154D8303C16C055E424A5ACF3EBAB94284CD9B05B85C0D0F0B8E7A4"));
900 TPtrC8 server(_L8("3E3E56059EFEE4F8C5B05C76128C4C84916DF9E935510C3C063454856FF29FF8"));
902 HBufC8* clientData = client.AllocLC();
903 HBufC8* serverData = server.AllocLC();
908 // Hash in 2 portions
911 clientbuf = testHasher->Hash(*clientData);
912 serverbuf = testHasher->Hash(*serverData);
915 shabuf.Copy(testHasher->Hash(TPtrC8(0,0)));
918 // Now hash in one chunk
919 TPtrC8 all(_L8("D652CA1A6154D8303C16C055E424A5ACF3EBAB94284CD9B05B85C0D0F0B8E7A43E3E56059EFEE4F8C5B05C76128C4C84916DF9E935510C3C063454856FF29FF8"));
920 HBufC8* allData = all.AllocLC();
924 allbuf = testHasher->Hash(*allData);
926 test(allbuf.Compare(shabuf)==0);
927 CleanupStack::PopAndDestroy(4, testHasher);
929 // Test hashing non-word aligned data - used to crash on arm
930 TPtrC8 nonAlignedData = data.Mid(1);
931 hash = sha->Final(nonAlignedData);
932 test(hash.Length() == sha->HashSize());
936 HMACTestsL(sha,_L("hmacsha1.dat"), _L("sha1"));
937 CleanupStack::PopAndDestroy(); // sha
940 void ExecuteSha2TestsL(CMessageDigest* aMD, const TDesC& aVector, const TDesC& aHMACVector, const TDesC& aHashType)
942 VectorTestL(aMD, aVector);
943 FunctionalityTestL(aMD);
947 test.Next(_L("Fixed bugs Tests"));
949 _LIT8(KTest1Data, "The quick brown fox jumped over the lazy dog");
950 TBuf8<KMaxHashSize> hash;
951 hash = aMD->Hash(KTest1Data());
952 test(hash.Length() == aMD->HashSize());
955 _LIT8(KClientData, "D652CA1A6154D8303C16C055E424A5ACF3EBAB94284CD9B05B85C0D0F0B8E7A4");
956 _LIT8(KServerData, "3E3E56059EFEE4F8C5B05C76128C4C84916DF9E935510C3C063454856FF29FF8");
958 HBufC8* clientData = KClientData().AllocLC();
959 HBufC8* serverData = KServerData().AllocLC();
964 // Hash in 2 portions
965 aMD->Hash(*clientData);
966 aMD->Hash(*serverData);
968 CleanupStack::PopAndDestroy(2, clientData);
970 TBuf8<KMaxHashSize> shabuf;
971 shabuf.Copy(aMD->Hash(KNullDesC8()));
974 // Now hash in one chunk
975 _LIT8(KAllData, "D652CA1A6154D8303C16C055E424A5ACF3EBAB94284CD9B05B85C0D0F0B8E7A43E3E56059EFEE4F8C5B05C76128C4C84916DF9E935510C3C063454856FF29FF8");
976 HBufC8* allData = KAllData().AllocLC();
979 TBuf8<KMaxHashSize> allbuf;
980 allbuf = aMD->Hash(*allData);
982 test(allbuf.Compare(shabuf)==0);
983 CleanupStack::PopAndDestroy(allData);
985 // Test hashing non-word aligned data - used to crash on arm
986 TPtrC8 nonAlignedData = KTest1Data().Mid(1);
987 hash = aMD->Final(nonAlignedData);
988 test(hash.Length() == aMD->HashSize());
992 HMACTestsL(aMD, aHMACVector, aHashType);
995 _LIT(K224Algo, "SHA-224.dat");
996 _LIT(K256Algo, "SHA-256.dat");
997 _LIT(K384Algo, "SHA-384.dat");
998 _LIT(K512Algo, "SHA-512.dat");
999 _LIT(K224Vector, "sha224.dat");
1000 _LIT(K256Vector, "sha256.dat");
1001 _LIT(K384Vector, "sha384.dat");
1002 _LIT(K512Vector, "sha512.dat");
1003 _LIT(K224HmacVector, "hmacsha224.dat");
1004 _LIT(K256HmacVector, "hmacsha256.dat");
1005 _LIT(K384HmacVector, "hmacsha384.dat");
1006 _LIT(K512HmacVector, "hmacsha512.dat");
1008 const TDesC* gNames[] =
1025 void SHA2TestsL(CMessageDigest::THashId aHashId)
1027 CMessageDigest* md = CMessageDigestFactory::NewDigestLC(aHashId);
1028 TInt pos = aHashId - CMessageDigest::ESHA224;
1030 ExecuteSha2TestsL (md, *gNames[pos], *gNames[pos+1], *gNames[pos+2]);
1031 CleanupStack::PopAndDestroy(md);
1034 void HashTests(void)
1036 TInt32 testsFailed=0, testCount=0;
1038 test.Start(_L("MD4 Tests"));
1039 TRAPD(r, MD4TestsL());
1043 test.Printf(_L("\r\nMD4 Tests failed error code =%d\r\n\r\n"),r);
1047 test.Start(_L("SHA1 Tests"));
1048 TRAP(r, SHA1TestsL());
1052 test.Printf(_L("\r\nSHA1 Tests failed error code =%d\r\n\r\n"),r);
1056 test.Start(_L("SHA-224 Tests"));
1057 TRAP(r, SHA2TestsL(CMessageDigest::ESHA224));
1061 test.Printf(_L("\r\nSHA-224 Tests failed error code =%d\r\n\r\n"),r);
1065 test.Start(_L("SHA-256 Tests"));
1066 TRAP(r, SHA2TestsL(CMessageDigest::ESHA256));
1070 test.Printf(_L("\r\nSHA-256 Tests failed error code =%d\r\n\r\n"),r);
1074 test.Start(_L("SHA-384 Tests"));
1075 TRAP(r, SHA2TestsL(CMessageDigest::ESHA384));
1079 test.Printf(_L("\r\nSHA-384 Tests failed error code =%d\r\n\r\n"),r);
1083 test.Start(_L("SHA-512 Tests"));
1084 TRAP(r, SHA2TestsL(CMessageDigest::ESHA512));
1088 test.Printf(_L("\r\nSHA-512 Tests failed error code =%d\r\n\r\n"),r);
1092 test.Start(_L("MD5 Tests"));
1093 TRAP(r, MD5TestsL());
1097 test.Printf(_L("\r\nMD5 Tests failed error code =%d\r\n\r\n"),r);
1101 test.Start(_L("MD2 Tests"));
1102 TRAP(r, MD2TestsL());
1106 test.Printf(_L("\r\nMD2 Tests failed error code =%d\r\n\r\n"),r);
1110 test.Printf(_L("\r\n%d tests failed out of %d \r\n"),testsFailed,testCount);
1111 test(testsFailed==0);
1115 GLDEF_C TInt E32Main(void)
1118 CTrapCleanup* cleanup;
1119 cleanup=CTrapCleanup::New();
1121 test.Start(_L(" @SYMTestCaseID:SEC-CRYPTOSPI-HASH-0035 Hash Algorithm Tests "));
1122 CTestConsole* con=NULL;
1123 TRAPD(ret, con=CTestConsole::NewL(test.Console()));
1132 file=new (ELeave) RFile;
1134 TDriveUnit sysDrive (fs.GetSystemDrive());
1135 TBuf<24> hashLogFile (sysDrive.Name());
1136 hashLogFile.Append(_L("\\HashLog.txt"));
1138 file->Replace(fs,hashLogFile,EFileShareAny|EFileWrite);
1139 con->SetLogFile(file);
1141 test.SetConsole(con);