First public contribution.
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
231 test.Printf(_L("\r\n"));
234 User::Leave(KErrGeneral);
237 void VectorTestL(CMessageDigest* aMD,const TDesC& aFilename)
239 test.Next(_L("Test Vector tests - original API"));
240 TBool finished=EFalse;
241 TBool testSuccess = ETrue;
242 CTestData* data = CTestData::NewL(aFilename);
243 CleanupStack::PushL(data);
247 switch (data->Type())
249 case CTestData::EMessage:
253 //This is added to read large input data from the files.
254 case CTestData::EFileName:
256 CMessageDigest* md=aMD->ReplicateL();
257 CleanupStack::PushL(md);
259 //get the filename from the .dat file
260 HBufC8* filename = (*data)[1];
261 User::LeaveIfNull(filename);
262 CleanupStack::PushL(filename);
264 HBufC8* output= (*data)[2];
265 User::LeaveIfNull(output);
266 CleanupStack::PushL(output);
269 HBufC16* inputFileName = CnvUtfConverter::ConvertToUnicodeFromUtf8L(*filename);
273 CleanupClosePushL(fs);
274 User::LeaveIfError(fs.Connect());
275 TDriveUnit sysDrive(fs.GetSystemDrive());
276 TBuf<24> filePath (sysDrive.Name());
277 filePath.Append(_L("\\thash\\"));
278 User::LeaveIfError(fs.SetSessionPath(filePath));
279 CleanupClosePushL(file);
280 User::LeaveIfError(file.Open(fs,*inputFileName,EFileShareAny|EFileRead));
284 HBufC8* fileContents=HBufC8::NewMaxL(size);
286 TPtr8 ptr=fileContents->Des();
287 User::LeaveIfError(file.Read(ptr));
288 CleanupStack::PopAndDestroy(2, &fs);
289 CleanupStack::PushL(fileContents);
290 delete inputFileName;
292 TPtrC8 digest = md->Hash(*fileContents);
293 if (digest!=(*output))
295 test.Next(_L("Digest Not Equal"));
296 testSuccess = EFalse;
301 TPtrC8 digest2 = md->Hash(*fileContents);
302 if (digest2!=(*output))
304 testSuccess = EFalse;
307 // Now try this in 2 half sections (just a quick check)
310 TInt inputLen = fileContents->Length();
313 TInt leftHandLen = inputLen/2;
314 TPtrC8 left = fileContents->Left(leftHandLen);
315 TPtrC8 right = fileContents->Right(inputLen - leftHandLen);
317 TPtrC8 halfDigest = md->Hash(left);
318 if (halfDigest.Size()==0) // Unnecessary test, but removes
319 User::Leave(KErrAbort); // a warning about not using halfDigest
321 TPtrC8 wholeDigest = md->Hash(right);
323 if (wholeDigest!=(*output))
325 testSuccess = EFalse;
330 if (md->Final(*fileContents)!=(*output))
332 testSuccess = EFalse;
335 // Now try this in 2 half sections (just a quick check)
337 inputLen = fileContents->Length();
340 TInt leftHandLen = inputLen/2;
341 TPtrC8 left = fileContents->Left(leftHandLen);
342 TPtrC8 right = fileContents->Right(inputLen - leftHandLen);
345 TPtrC8 wholeDigest = md->Final(right);
347 if (wholeDigest!=(*output))
349 testSuccess = EFalse;
352 CleanupStack::PopAndDestroy(4, md);//md,filename,output,fileContents
356 case CTestData::EData:
358 CMessageDigest* md=aMD->ReplicateL();
359 CleanupStack::PushL(md);
361 HBufC8* input = (*data)[0];
362 User::LeaveIfNull(input);
363 CleanupStack::PushL(input);
365 HBufC8* output= (*data)[1];
366 User::LeaveIfNull(output);
367 CleanupStack::PushL(output);
371 TPtrC8 digest = md->Hash(*input);
372 if (digest!=(*output))
374 testSuccess = EFalse;
379 TPtrC8 digest2 = md->Hash(*input);
380 if (digest2!=(*output))
382 testSuccess = EFalse;
385 // Now try this in 2 half sections (just a quick check)
388 TInt inputLen = input->Length();
391 TInt leftHandLen = inputLen/2;
392 TPtrC8 left = input->Left(leftHandLen);
393 TPtrC8 right = input->Right(inputLen - leftHandLen);
395 TPtrC8 halfDigest = md->Hash(left);
396 if (halfDigest.Size()==0) // Unnecessary test, but removes
397 User::Leave(KErrAbort); // a warning about not using halfDigest
399 TPtrC8 wholeDigest = md->Hash(right);
401 if (wholeDigest!=(*output))
403 testSuccess = EFalse;
407 ///////////////////////////////////////////////////////////////
408 // Now test the new API - Update/Final functions
409 ///////////////////////////////////////////////////////////////
411 if (md->Final(*input)!=(*output))
413 testSuccess = EFalse;
416 // Now try this in 2 half sections (just a quick check)
418 inputLen = input->Length();
421 TInt leftHandLen = inputLen/2;
422 TPtrC8 left = input->Left(leftHandLen);
423 TPtrC8 right = input->Right(inputLen - leftHandLen);
426 TPtrC8 wholeDigest = md->Final(right);
428 if (wholeDigest!=(*output))
430 testSuccess = EFalse;
433 CleanupStack::PopAndDestroy(3);
436 case CTestData::EFinished:
440 test.Printf(_L("Error in data file\r\n"));
445 CleanupStack::PopAndDestroy(data);
448 User::Leave(KErrGeneral);
451 void OOMTestL(CMessageDigest* aMD)
453 test.Next(_L("Out of memory test"));
454 TInt err = KErrNoMemory;
457 while (err!=KErrNone)
460 __UHEAP_FAILNEXT(nextFailure);
461 TRAP(err,FunctionalityTestL(aMD));
469 void HMACVectorTestL(CMessageDigest* aMD,const TDesC& aFilename)
471 test.Next(_L("HMAC Test Vector tests"));
472 CTestData* data = CTestData::NewL(aFilename);
473 CleanupStack::PushL(data);
475 TBool finished=EFalse;
476 TBool testSuccess = ETrue;
480 switch (data->Type())
482 case CTestData::EMessage:
486 case CTestData::EFileName:
488 //get the filename from the .dat file
489 HBufC8* filename = (*data)[1];
490 User::LeaveIfNull(filename);
491 CleanupStack::PushL(filename);
493 HBufC8* key= (*data)[2];
494 User::LeaveIfNull(key);
495 CleanupStack::PushL(key);
497 HBufC16* inputFileName = CnvUtfConverter::ConvertToUnicodeFromUtf8L(*filename);
499 HBufC8* output = (*data)[3];
500 User::LeaveIfNull(output);
501 CleanupStack::PushL(output);
508 CleanupClosePushL(fs);
509 User::LeaveIfError(fs.Connect());
510 TDriveUnit sysDrive(fs.GetSystemDrive());
511 TBuf<24> filePath (sysDrive.Name());
512 filePath.Append(_L("\\thash\\"));
513 User::LeaveIfError(fs.SetSessionPath(filePath));
514 CleanupClosePushL(file);
515 User::LeaveIfError(file.Open(fs,*inputFileName,EFileShareAny|EFileRead));
519 HBufC8* fileContents=HBufC8::NewMaxL(size);
521 TPtr8 ptr=fileContents->Des();
522 User::LeaveIfError(file.Read(ptr));
523 CleanupStack::PopAndDestroy(2, &fs);
524 CleanupStack::PushL(fileContents);
525 delete inputFileName;
527 CMessageDigest* temp = aMD->ReplicateL();
528 CleanupStack::PushL(temp);
529 CMessageDigest* md = CHMAC::NewL(*key, temp);
530 CleanupStack::Pop(temp); // Now owned by md
532 TPtrC8 digest = md->Hash(*fileContents);
533 if (digest!=(*output))
535 testSuccess = EFalse;
538 // Now try this in 2 half sections (just a quick check)
541 TInt inputLen = fileContents->Length();
544 TInt leftHandLen = inputLen/2;
545 TPtrC8 left = fileContents->Left(leftHandLen);
546 TPtrC8 right = fileContents->Right(inputLen - leftHandLen);
548 TPtrC8 halfDigest = md->Hash(left);
549 if (halfDigest.Size()==0) // Unnecessary test, but removes
550 User::Leave(KErrAbort); // a warning about not using halfDigest
551 TPtrC8 wholeDigest = md->Hash(right);
553 if (wholeDigest!=(*output))
555 testSuccess = EFalse;
560 TPtrC8 finalDigest = md->Final(*fileContents);
561 if (finalDigest!=(*output))
563 testSuccess = EFalse;
566 // Now try this in 2 half sections (just a quick check)
569 inputLen = fileContents->Length();
572 TInt leftHandLen = inputLen/2;
573 TPtrC8 left = fileContents->Left(leftHandLen);
574 TPtrC8 right = fileContents->Right(inputLen - leftHandLen);
577 TPtrC8 wholeDigest = md->Final(right);
579 if (wholeDigest!=(*output))
581 testSuccess = EFalse;
586 CleanupStack::PopAndDestroy(4, filename); // filename, key, output,fileContents
589 case CTestData::EData:
591 HBufC8* input = (*data)[0];
592 User::LeaveIfNull(input);
593 CleanupStack::PushL(input);
595 HBufC8* key = (*data)[1];
596 User::LeaveIfNull(key);
597 CleanupStack::PushL(key);
599 HBufC8* output = (*data)[2];
600 User::LeaveIfNull(output);
601 CleanupStack::PushL(output);
607 CMessageDigest* temp = aMD->ReplicateL();
608 CleanupStack::PushL(temp);
609 CMessageDigest* md = CHMAC::NewL(*key, temp);
610 CleanupStack::Pop(temp); // Now owned by md
612 TPtrC8 digest = md->Hash(*input);
613 if (digest!=(*output))
615 testSuccess = EFalse;
618 // Now try this in 2 half sections (just a quick check)
621 TInt inputLen = input->Length();
624 TInt leftHandLen = inputLen/2;
625 TPtrC8 left = input->Left(leftHandLen);
626 TPtrC8 right = input->Right(inputLen - leftHandLen);
628 TPtrC8 halfDigest = md->Hash(left);
629 if (halfDigest.Size()==0) // Unnecessary test, but removes
630 User::Leave(KErrAbort); // a warning about not using halfDigest
631 TPtrC8 wholeDigest = md->Hash(right);
633 if (wholeDigest!=(*output))
635 testSuccess = EFalse;
639 ///////////////////////////////////////////////////////////////
640 // Now test the new API - Update/Final functions
641 ///////////////////////////////////////////////////////////////
643 TPtrC8 finalDigest = md->Final(*input);
644 if (finalDigest!=(*output))
646 testSuccess = EFalse;
649 // Now try this in 2 half sections (just a quick check)
652 inputLen = input->Length();
655 TInt leftHandLen = inputLen/2;
656 TPtrC8 left = input->Left(leftHandLen);
657 TPtrC8 right = input->Right(inputLen - leftHandLen);
660 TPtrC8 wholeDigest = md->Final(right);
662 if (wholeDigest!=(*output))
664 testSuccess = EFalse;
668 CleanupStack::PopAndDestroy(3); // input, key, output
671 case CTestData::EFinished:
675 test.Printf(_L("Error in data file\r\n"));
680 CleanupStack::PopAndDestroy(data);
683 User::Leave(KErrGeneral);
686 void HMACTestsL(CMessageDigest* aMD,const TDesC& aFilename, const TDesC& aHashType)
688 TBuf<0x40> formattable;
689 formattable.Format(_L("HMAC Tests for %S"), &aHashType);
690 test.Next(formattable);
691 CMessageDigest* temp = aMD->ReplicateL();
692 CleanupStack::PushL(temp);
693 CHMAC* hmac=CHMAC::NewL(_L8("aaaaaaaa"), temp);
694 CleanupStack::Pop(temp);
695 CleanupStack::PushL(hmac);
697 // For each of the available digests
698 FunctionalityTestL(hmac); //JCS for now
699 HMACVectorTestL(aMD,aFilename);
702 CleanupStack::PopAndDestroy(hmac);
710 CleanupStack::PushL(md2);
712 FunctionalityTestL(md2);
714 VectorTestL(md2,_L("md2.dat"));
718 CleanupStack::PopAndDestroy(md2);
720 // Problem reported by Jal Panvel, 17-12-1999.
721 // Report by email, CSHA1::Hash() returning zero length descriptor
723 // This was caused by failure to set internal hash descriptor length on setup, this
724 // problem was present in all hashes except MD2 which set it up correctly.
726 test.Next(_L("Fixed bugs Tests"));
728 CleanupStack::PushL(md2);
729 TPtrC8 data(_L8("The quick brown fox jumped over the lazy dog"));
731 hash = md2->Hash(data);
732 test(hash.Length() == md2->HashSize());
734 HMACTestsL(md2,_L("hmacmd2.dat"), _L("md2"));
735 CleanupStack::PopAndDestroy(md2);
742 CleanupStack::PushL(md5);
744 FunctionalityTestL(md5);
746 VectorTestL(md5,_L("md5.dat"));
750 CleanupStack::PopAndDestroy(md5);
751 test.Next(_L("Fixed bugs Tests"));
752 // Problem reported by Jal Panvel, 17-12-1999.
753 // Report by email, CSHA1::Hash() returning zero length descriptor
755 // This was caused by failure to set internal hash descriptor length on setup, this
756 // problem was present in all hashes except MD2 which set it up correctly.
758 CMD5* md = CMD5::NewL();
759 CleanupStack::PushL(md);
760 TPtrC8 data(_L8("The quick brown fox jumped over the lazy dog"));
762 hash = md->Hash(data);
763 test(hash.Length() == md->HashSize());
765 HMACTestsL(md5,_L("hmacmd5.dat"), _L("md5"));
766 CleanupStack::PopAndDestroy(md);
768 // Test for DEF001510 "TLS - Receives Disconnect Indication during hands..."
769 CMD5* testHasher = CMD5::NewL();
770 CleanupStack::PushL(testHasher);
771 TPtrC8 client(_L8("D652CA1A6154D8303C16C055E424A5ACF3EBAB94284CD9B05B85C0D0F0B8E7A4"));
772 TPtrC8 server(_L8("3E3E56059EFEE4F8C5B05C76128C4C84916DF9E935510C3C063454856FF29FF8"));
774 HBufC8* clientData = client.AllocLC();
775 HBufC8* serverData = server.AllocLC();
780 testHasher->Hash(*clientData);
781 testHasher->Hash(*serverData);
784 md5buf.Copy(testHasher->Hash(TPtrC8(0,0)));
788 // Now hash in one chunk
789 TPtrC8 all(_L8("D652CA1A6154D8303C16C055E424A5ACF3EBAB94284CD9B05B85C0D0F0B8E7A43E3E56059EFEE4F8C5B05C76128C4C84916DF9E935510C3C063454856FF29FF8"));
790 HBufC8* allData = all.AllocLC();
794 allbuf = testHasher->Hash(*allData);
795 test(allbuf.Compare(md5buf)==0);
796 CleanupStack::PopAndDestroy(4, testHasher);
799 // Test for the MD4 Message Digest Algorithm API's
804 CleanupStack::PushL(md4);
806 FunctionalityTestL(md4);
808 VectorTestL(md4,_L("md4.dat"));
812 CleanupStack::PopAndDestroy(md4);
814 //Test to check the Hash Size.
815 CMD4* md = CMD4::NewL();
816 CleanupStack::PushL(md);
817 TPtrC8 data(_L8("The quick brown fox jumped over the lazy dog"));
819 hash = md->Hash(data);
820 test(hash.Length() == md->HashSize());
822 HMACTestsL(md,_L("hmacmd4.dat"), _L("md4"));
823 CleanupStack::PopAndDestroy(md);
825 //Tests carried for other Message Digest Algorithms copied(SHA1 and MD5)
826 //Here Input Data is given in two parts and as a whole and the digest generated is compared.
827 CMD4* testHasher = CMD4::NewL();
828 CleanupStack::PushL(testHasher);
829 TPtrC8 client(_L8("D652CA1A6154D8303C16C055E424A5ACF3EBAB94284CD9B05B85C0D0F0B8E7A4"));
830 TPtrC8 server(_L8("3E3E56059EFEE4F8C5B05C76128C4C84916DF9E935510C3C063454856FF29FF8"));
832 HBufC8* clientData = client.AllocLC();
833 HBufC8* serverData = server.AllocLC();
838 testHasher->Hash(*clientData);
839 testHasher->Hash(*serverData);
842 md4buf.Copy(testHasher->Hash(TPtrC8(0,0)));
846 // Now hash in one chunk
847 TPtrC8 all(_L8("D652CA1A6154D8303C16C055E424A5ACF3EBAB94284CD9B05B85C0D0F0B8E7A43E3E56059EFEE4F8C5B05C76128C4C84916DF9E935510C3C063454856FF29FF8"));
848 HBufC8* allData = all.AllocLC();
852 allbuf = testHasher->Hash(*allData);
853 test(allbuf.Compare(md4buf)==0);
854 CleanupStack::PopAndDestroy(4, testHasher);
856 //Tests for the Factory Method CMessageDigestFactory
857 CMessageDigest* messageDigest = CMessageDigestFactory::NewDigestLC(CMessageDigest::EMD4);
858 VectorTestL(messageDigest,_L("md4.dat"));
859 CleanupStack::PopAndDestroy(messageDigest);
867 CleanupStack::PushL(sha);
869 VectorTestL(sha,_L("sha1.dat"));
871 FunctionalityTestL(sha);
875 CleanupStack::PopAndDestroy(sha);
877 test.Next(_L("Fixed bugs Tests"));
878 // Problem reported by Jal Panvel, 17-12-1999.
879 // Report by email, CSHA1::Hash() returning zero length descriptor
881 // This was caused by failure to set internal hash descriptor length on setup, this
882 // problem was present in all hashes except MD2 which set it up correctly.
886 CleanupStack::PushL(sha);
887 TPtrC8 data(_L8("The quick brown fox jumped over the lazy dog"));
889 hash = sha->Hash(data);
890 test(hash.Length() == sha->HashSize());
893 // Test for DEF001510 "TLS - Receives Disconnect Indication during hands..."
894 CSHA1* testHasher = CSHA1::NewL();
895 CleanupStack::PushL(testHasher);
896 TPtrC8 client(_L8("D652CA1A6154D8303C16C055E424A5ACF3EBAB94284CD9B05B85C0D0F0B8E7A4"));
897 TPtrC8 server(_L8("3E3E56059EFEE4F8C5B05C76128C4C84916DF9E935510C3C063454856FF29FF8"));
899 HBufC8* clientData = client.AllocLC();
900 HBufC8* serverData = server.AllocLC();
905 // Hash in 2 portions
908 clientbuf = testHasher->Hash(*clientData);
909 serverbuf = testHasher->Hash(*serverData);
912 shabuf.Copy(testHasher->Hash(TPtrC8(0,0)));
915 // Now hash in one chunk
916 TPtrC8 all(_L8("D652CA1A6154D8303C16C055E424A5ACF3EBAB94284CD9B05B85C0D0F0B8E7A43E3E56059EFEE4F8C5B05C76128C4C84916DF9E935510C3C063454856FF29FF8"));
917 HBufC8* allData = all.AllocLC();
921 allbuf = testHasher->Hash(*allData);
923 test(allbuf.Compare(shabuf)==0);
924 CleanupStack::PopAndDestroy(4, testHasher);
926 // Test hashing non-word aligned data - used to crash on arm
927 TPtrC8 nonAlignedData = data.Mid(1);
928 hash = sha->Final(nonAlignedData);
929 test(hash.Length() == sha->HashSize());
933 HMACTestsL(sha,_L("hmacsha1.dat"), _L("sha1"));
934 CleanupStack::PopAndDestroy(); // sha
937 void ExecuteHashTestsL(CMessageDigest* aMD, const TDesC& aVector, const TDesC& aHMACVector, const TDesC& aHashType)
939 VectorTestL(aMD, aVector);
940 FunctionalityTestL(aMD);
944 test.Next(_L("Fixed bugs Tests"));
946 _LIT8(KTest1Data, "The quick brown fox jumped over the lazy dog");
947 TBuf8<KMaxHashSize> hash;
948 hash = aMD->Hash(KTest1Data());
949 test(hash.Length() == aMD->HashSize());
952 // Test for DEF001510 "TLS - Receives Disconnect Indication during hands..."
953 _LIT8(KClientData, "D652CA1A6154D8303C16C055E424A5ACF3EBAB94284CD9B05B85C0D0F0B8E7A4");
954 _LIT8(KServerData, "3E3E56059EFEE4F8C5B05C76128C4C84916DF9E935510C3C063454856FF29FF8");
956 HBufC8* clientData = KClientData().AllocLC();
957 HBufC8* serverData = KServerData().AllocLC();
962 // Hash in 2 portions
963 aMD->Hash(*clientData);
964 aMD->Hash(*serverData);
966 CleanupStack::PopAndDestroy(2, clientData);
968 TBuf8<KMaxHashSize> shabuf;
969 shabuf.Copy(aMD->Hash(KNullDesC8()));
972 // Now hash in one chunk
973 _LIT8(KAllData, "D652CA1A6154D8303C16C055E424A5ACF3EBAB94284CD9B05B85C0D0F0B8E7A43E3E56059EFEE4F8C5B05C76128C4C84916DF9E935510C3C063454856FF29FF8");
974 HBufC8* allData = KAllData().AllocLC();
977 TBuf8<KMaxHashSize> allbuf;
978 allbuf = aMD->Hash(*allData);
980 test(allbuf.Compare(shabuf)==0);
981 CleanupStack::PopAndDestroy(allData);
983 // Test hashing non-word aligned data - used to crash on arm
984 TPtrC8 nonAlignedData = KTest1Data().Mid(1);
985 hash = aMD->Final(nonAlignedData);
986 test(hash.Length() == aMD->HashSize());
990 HMACTestsL(aMD, aHMACVector, aHashType);
993 _LIT(K224Algo, "SHA-224.dat");
994 _LIT(K256Algo, "SHA-256.dat");
995 _LIT(K384Algo, "SHA-384.dat");
996 _LIT(K512Algo, "SHA-512.dat");
997 _LIT(K224Vector, "sha224.dat");
998 _LIT(K256Vector, "sha256.dat");
999 _LIT(K384Vector, "sha384.dat");
1000 _LIT(K512Vector, "sha512.dat");
1001 _LIT(K224HmacVector, "hmacsha224.dat");
1002 _LIT(K256HmacVector, "hmacsha256.dat");
1003 _LIT(K384HmacVector, "hmacsha384.dat");
1004 _LIT(K512HmacVector, "hmacsha512.dat");
1006 const TDesC* gNames[] =
1023 void SHA2TestsL(CMessageDigest::THashId aHashId)
1025 CMessageDigest* md = CMessageDigestFactory::NewDigestLC(aHashId);
1026 TInt pos = aHashId - CMessageDigest::ESHA224;
1028 ExecuteHashTestsL(md, *gNames[pos], *gNames[pos+1], *gNames[pos+2]);
1029 CleanupStack::PopAndDestroy(md);
1032 void HashTests(void)
1034 TInt32 testsFailed=0, testCount=0;
1036 test.Start(_L("SHA1 Tests"));
1037 TRAPD(r, SHA1TestsL());
1041 test.Printf(_L("\r\nSHA1 Tests failed error code = %d\r\n\r\n"),r);
1045 test.Start(_L("SHA-224 Tests"));
1046 TRAP(r, SHA2TestsL(CMessageDigest::ESHA224));
1050 test.Printf(_L("\r\nSHA-224 Tests failed error code = %d\r\n\r\n"),r);
1054 test.Start(_L("SHA-256 Tests"));
1055 TRAP(r, SHA2TestsL(CMessageDigest::ESHA256));
1059 test.Printf(_L("\r\nSHA-256 Tests failed error code = %d\r\n\r\n"),r);
1063 test.Start(_L("SHA-384 Tests"));
1064 TRAP(r, SHA2TestsL(CMessageDigest::ESHA384));
1068 test.Printf(_L("\r\nSHA-384 Tests failed error code = %d\r\n\r\n"),r);
1072 test.Start(_L("SHA-512 Tests"));
1073 TRAP(r, SHA2TestsL(CMessageDigest::ESHA512));
1077 test.Printf(_L("\r\nSHA-512 Tests failed error code = %d\r\n\r\n"),r);
1081 test.Start(_L("MD5 Tests"));
1082 TRAP(r, MD5TestsL());
1086 test.Printf(_L("\r\nMD5 Tests failed error code = %d\r\n\r\n"),r);
1090 test.Start(_L("MD2 Tests"));
1091 TRAP(r, MD2TestsL());
1095 test.Printf(_L("\r\nMD2 Tests failed error code = %d\r\n\r\n"),r);
1099 //MD4 Message Digest Algorithm Tests
1100 test.Start(_L("MD4 Tests"));
1101 TRAP(r, MD4TestsL());
1105 test.Printf(_L("\r\nMD4 Tests failed error code = %d\r\n\r\n"),r);
1109 test.Printf(_L("\r\n%d tests failed out of %d \r\n"),testsFailed,testCount);
1112 test(testsFailed==0);
1116 GLDEF_C TInt E32Main(void)
1119 CTrapCleanup* cleanup;
1120 cleanup=CTrapCleanup::New();
1122 test.Start(_L(" @SYMTestCaseID:SEC-CRYPTO-HASH-0001 Hash Algorithm Tests "));
1123 CTestConsole* con=NULL;
1124 TRAPD(ret, con=CTestConsole::NewL(test.Console()));
1133 file=new (ELeave) RFile;
1135 TDriveUnit sysDrive (fs.GetSystemDrive());
1136 TDriveName driveName(sysDrive.Name());
1137 TBuf<24> hashLogFile (driveName);
1138 hashLogFile.Append(_L("\\HashLog.txt"));
1140 file->Replace(fs,hashLogFile,EFileShareAny|EFileWrite);
1141 con->SetLogFile(file);
1143 test.SetConsole(con);