sl@0: /* sl@0: * Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: * All rights reserved. sl@0: * This component and the accompanying materials are made available sl@0: * under the terms of the License "Eclipse Public License v1.0" sl@0: * which accompanies this distribution, and is available sl@0: * at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: * sl@0: * Initial Contributors: sl@0: * Nokia Corporation - initial contribution. sl@0: * sl@0: * Contributors: sl@0: * sl@0: * Description: sl@0: * sl@0: */ sl@0: sl@0: sl@0: /** sl@0: @file sl@0: */ sl@0: sl@0: #include "hashtestutils.h" sl@0: #include sl@0: sl@0: TBool gInOOMTest=EFalse; sl@0: sl@0: RTest test(_L("Hash Tests")); sl@0: sl@0: const TInt KMaxHashSize = 64; // Hash size in bytes sl@0: sl@0: void Hex(HBufC8& aString) sl@0: { sl@0: TPtr8 ptr=aString.Des(); sl@0: if (aString.Length()%2) sl@0: { sl@0: ptr.SetLength(0); sl@0: return; sl@0: } sl@0: TInt i; sl@0: for (i=0;i'9'?('A'-10):'0')); sl@0: tmp*=16; sl@0: tmp|=(TUint8)(aString[i+1]-(aString[i+1]>'9'?('A'-10):'0')); sl@0: ptr[i/2]=tmp; sl@0: } sl@0: ptr.SetLength(aString.Length()/2); sl@0: } sl@0: sl@0: void Spin() sl@0: {// Pointless function to print a dot sl@0: if (gInOOMTest) sl@0: { sl@0: static TInt count=0; sl@0: if (count++==100) sl@0: { sl@0: test.Printf(_L("o")); sl@0: count=0; sl@0: } sl@0: return; sl@0: } sl@0: test.Printf(_L(".")); sl@0: } sl@0: sl@0: void FunctionalityTestL(CMessageDigest* aMD) sl@0: { sl@0: if (!gInOOMTest) sl@0: test.Next(_L("Functionality test - original API")); sl@0: sl@0: const TInt maxbuffersize=1024; sl@0: TInt buffersize; sl@0: TInt increment; sl@0: if (gInOOMTest) sl@0: { sl@0: buffersize=256; sl@0: increment=6; sl@0: } sl@0: else sl@0: { sl@0: buffersize=maxbuffersize; sl@0: increment=1; sl@0: } sl@0: sl@0: TBool testSuccess = ETrue; sl@0: TInt i = 0; sl@0: TBuf8 buf(maxbuffersize); sl@0: for (;i128) sl@0: { sl@0: increment=8; sl@0: } sl@0: } sl@0: else sl@0: { sl@0: if (i>24) sl@0: { sl@0: increment=32; sl@0: } sl@0: } sl@0: sl@0: for (j=0;jReplicateL(); sl@0: CleanupStack::PushL(first); sl@0: TPtrC8 firstFinal = first->Hash(ptr); sl@0: sl@0: aMD->Reset(); sl@0: aMD->Update(ptr); sl@0: TPtrC8 aMDFinal = aMD->Final(); sl@0: sl@0: CMessageDigest* second=aMD->ReplicateL(); sl@0: CleanupStack::PushL(second); sl@0: second->Hash(ptr2); sl@0: sl@0: CMessageDigest* third=second->CopyL(); sl@0: CleanupStack::PushL(third); sl@0: sl@0: TPtrC8 secondFinal = second->Hash(ptr3); sl@0: sl@0: if (aMDFinal!=firstFinal) sl@0: { sl@0: testSuccess = EFalse; sl@0: } sl@0: sl@0: if (firstFinal!=secondFinal) sl@0: { sl@0: testSuccess = EFalse; sl@0: } sl@0: sl@0: TPtrC8 thirdFinal = third->Hash(ptr3); sl@0: if (firstFinal!=thirdFinal) sl@0: { sl@0: testSuccess = EFalse; sl@0: } sl@0: CleanupStack::PopAndDestroy(3); // first, second, third sl@0: } sl@0: } sl@0: sl@0: /////////////////////////////////////////////////////////////// sl@0: // Now test the new API - Update/Final functions sl@0: /////////////////////////////////////////////////////////////// sl@0: if (!gInOOMTest) sl@0: test.Next(_L("\rFunctionality test - calls added API functions Final & Update")); sl@0: sl@0: for (i=0;i128) sl@0: { sl@0: increment=8; sl@0: } sl@0: } sl@0: else sl@0: { sl@0: if (i>24) sl@0: { sl@0: increment=32; sl@0: } sl@0: } sl@0: for (j=0;jReplicateL(); sl@0: CleanupStack::PushL(first); sl@0: first->Update(ptr); sl@0: sl@0: aMD->Update(ptr); sl@0: sl@0: CMessageDigest* second=aMD->ReplicateL(); sl@0: CleanupStack::PushL(second); sl@0: second->Update(ptr2); sl@0: sl@0: CMessageDigest* third=second->CopyL(); sl@0: CleanupStack::PushL(third); sl@0: third->Update(ptr3); sl@0: sl@0: second->Update(ptr3); sl@0: sl@0: TPtrC8 aMDFinal = aMD->Final(); sl@0: TPtrC8 firstFinal = first->Final(); sl@0: TPtrC8 secondFinal = second->Final(); sl@0: TPtrC8 thirdFinal = third->Final(); sl@0: sl@0: if (aMDFinal!=firstFinal) sl@0: { sl@0: testSuccess = EFalse; sl@0: } sl@0: sl@0: if (firstFinal!=secondFinal) sl@0: { sl@0: testSuccess = EFalse; sl@0: } sl@0: sl@0: if (firstFinal!=thirdFinal) sl@0: { sl@0: testSuccess = EFalse; sl@0: } sl@0: sl@0: CleanupStack::PopAndDestroy(3); // first, second, third sl@0: } sl@0: } sl@0: test.Printf(_L("\r\n")); sl@0: sl@0: if (!testSuccess) sl@0: User::Leave(KErrGeneral); sl@0: } sl@0: sl@0: void VectorTestL(CMessageDigest* aMD,const TDesC& aFilename) sl@0: { sl@0: test.Next(_L("Test Vector tests - original API")); sl@0: TBool finished=EFalse; sl@0: TBool testSuccess = ETrue; sl@0: CTestData* data = CTestData::NewL(aFilename); sl@0: CleanupStack::PushL(data); sl@0: sl@0: while (!finished) sl@0: { sl@0: switch (data->Type()) sl@0: { sl@0: case CTestData::EMessage: sl@0: { sl@0: break; sl@0: } sl@0: //This is added to read large input data from the files. sl@0: case CTestData::EFileName: sl@0: { sl@0: CMessageDigest* md=aMD->ReplicateL(); sl@0: CleanupStack::PushL(md); sl@0: sl@0: //get the filename from the .dat file sl@0: HBufC8* filename = (*data)[1]; sl@0: User::LeaveIfNull(filename); sl@0: CleanupStack::PushL(filename); sl@0: sl@0: HBufC8* output= (*data)[2]; sl@0: User::LeaveIfNull(output); sl@0: CleanupStack::PushL(output); sl@0: Hex(*output); sl@0: sl@0: HBufC16* inputFileName = CnvUtfConverter::ConvertToUnicodeFromUtf8L(*filename); sl@0: sl@0: RFs fs; sl@0: RFile file; sl@0: CleanupClosePushL(fs); sl@0: User::LeaveIfError(fs.Connect()); sl@0: TDriveUnit sysDrive(fs.GetSystemDrive()); sl@0: TBuf<24> filePath (sysDrive.Name()); sl@0: filePath.Append(_L("\\thash\\")); sl@0: User::LeaveIfError(fs.SetSessionPath(filePath)); sl@0: CleanupClosePushL(file); sl@0: User::LeaveIfError(file.Open(fs,*inputFileName,EFileShareAny|EFileRead)); sl@0: // read into iFile sl@0: TInt size=0; sl@0: file.Size(size); sl@0: HBufC8* fileContents=HBufC8::NewMaxL(size); sl@0: sl@0: TPtr8 ptr=fileContents->Des(); sl@0: User::LeaveIfError(file.Read(ptr)); sl@0: CleanupStack::PopAndDestroy(2, &fs); sl@0: CleanupStack::PushL(fileContents); sl@0: delete inputFileName; sl@0: sl@0: TPtrC8 digest = md->Hash(*fileContents); sl@0: if (digest!=(*output)) sl@0: { sl@0: test.Next(_L("Digest Not Equal")); sl@0: testSuccess = EFalse; sl@0: } sl@0: sl@0: md->Reset(); sl@0: sl@0: TPtrC8 digest2 = md->Hash(*fileContents); sl@0: if (digest2!=(*output)) sl@0: { sl@0: testSuccess = EFalse; sl@0: } sl@0: sl@0: // Now try this in 2 half sections (just a quick check) sl@0: md->Reset(); sl@0: sl@0: TInt inputLen = fileContents->Length(); sl@0: if (inputLen > 1) sl@0: { sl@0: TInt leftHandLen = inputLen/2; sl@0: TPtrC8 left = fileContents->Left(leftHandLen); sl@0: TPtrC8 right = fileContents->Right(inputLen - leftHandLen); sl@0: sl@0: TPtrC8 halfDigest = md->Hash(left); sl@0: if (halfDigest.Size()==0) // Unnecessary test, but removes sl@0: User::Leave(KErrAbort); // a warning about not using halfDigest sl@0: sl@0: TPtrC8 wholeDigest = md->Hash(right); sl@0: sl@0: if (wholeDigest!=(*output)) sl@0: { sl@0: testSuccess = EFalse; sl@0: } sl@0: } sl@0: sl@0: md->Reset(); sl@0: if (md->Final(*fileContents)!=(*output)) sl@0: { sl@0: testSuccess = EFalse; sl@0: } sl@0: sl@0: // Now try this in 2 half sections (just a quick check) sl@0: md->Reset(); sl@0: inputLen = fileContents->Length(); sl@0: if (inputLen > 1) sl@0: { sl@0: TInt leftHandLen = inputLen/2; sl@0: TPtrC8 left = fileContents->Left(leftHandLen); sl@0: TPtrC8 right = fileContents->Right(inputLen - leftHandLen); sl@0: sl@0: md->Update(left); sl@0: TPtrC8 wholeDigest = md->Final(right); sl@0: sl@0: if (wholeDigest!=(*output)) sl@0: { sl@0: testSuccess = EFalse; sl@0: } sl@0: } sl@0: CleanupStack::PopAndDestroy(4, md);//md,filename,output,fileContents sl@0: sl@0: break; sl@0: } sl@0: case CTestData::EData: sl@0: { sl@0: CMessageDigest* md=aMD->ReplicateL(); sl@0: CleanupStack::PushL(md); sl@0: sl@0: HBufC8* input = (*data)[0]; sl@0: User::LeaveIfNull(input); sl@0: CleanupStack::PushL(input); sl@0: sl@0: HBufC8* output= (*data)[1]; sl@0: User::LeaveIfNull(output); sl@0: CleanupStack::PushL(output); sl@0: Hex(*input); sl@0: Hex(*output); sl@0: sl@0: TPtrC8 digest = md->Hash(*input); sl@0: if (digest!=(*output)) sl@0: { sl@0: testSuccess = EFalse; sl@0: } sl@0: sl@0: md->Reset(); sl@0: sl@0: TPtrC8 digest2 = md->Hash(*input); sl@0: if (digest2!=(*output)) sl@0: { sl@0: testSuccess = EFalse; sl@0: } sl@0: sl@0: // Now try this in 2 half sections (just a quick check) sl@0: md->Reset(); sl@0: sl@0: TInt inputLen = input->Length(); sl@0: if (inputLen > 1) sl@0: { sl@0: TInt leftHandLen = inputLen/2; sl@0: TPtrC8 left = input->Left(leftHandLen); sl@0: TPtrC8 right = input->Right(inputLen - leftHandLen); sl@0: sl@0: TPtrC8 halfDigest = md->Hash(left); sl@0: if (halfDigest.Size()==0) // Unnecessary test, but removes sl@0: User::Leave(KErrAbort); // a warning about not using halfDigest sl@0: sl@0: TPtrC8 wholeDigest = md->Hash(right); sl@0: sl@0: if (wholeDigest!=(*output)) sl@0: { sl@0: testSuccess = EFalse; sl@0: } sl@0: } sl@0: sl@0: /////////////////////////////////////////////////////////////// sl@0: // Now test the new API - Update/Final functions sl@0: /////////////////////////////////////////////////////////////// sl@0: md->Reset(); sl@0: if (md->Final(*input)!=(*output)) sl@0: { sl@0: testSuccess = EFalse; sl@0: } sl@0: sl@0: // Now try this in 2 half sections (just a quick check) sl@0: md->Reset(); sl@0: inputLen = input->Length(); sl@0: if (inputLen > 1) sl@0: { sl@0: TInt leftHandLen = inputLen/2; sl@0: TPtrC8 left = input->Left(leftHandLen); sl@0: TPtrC8 right = input->Right(inputLen - leftHandLen); sl@0: sl@0: md->Update(left); sl@0: TPtrC8 wholeDigest = md->Final(right); sl@0: sl@0: if (wholeDigest!=(*output)) sl@0: { sl@0: testSuccess = EFalse; sl@0: } sl@0: } sl@0: CleanupStack::PopAndDestroy(3); sl@0: break; sl@0: } sl@0: case CTestData::EFinished: sl@0: finished=ETrue; sl@0: break; sl@0: default: sl@0: test.Printf(_L("Error in data file\r\n")); sl@0: break; sl@0: } sl@0: }; sl@0: sl@0: CleanupStack::PopAndDestroy(data); sl@0: sl@0: if (!testSuccess) sl@0: User::Leave(KErrGeneral); sl@0: } sl@0: sl@0: void OOMTestL(CMessageDigest* aMD) sl@0: { sl@0: test.Next(_L("Out of memory test")); sl@0: TInt err = KErrNoMemory; sl@0: TInt nextFailure=0; sl@0: gInOOMTest=ETrue; sl@0: while (err!=KErrNone) sl@0: { sl@0: __UHEAP_MARK; sl@0: __UHEAP_FAILNEXT(nextFailure); sl@0: TRAP(err,FunctionalityTestL(aMD)); sl@0: __UHEAP_MARKEND; sl@0: nextFailure++; sl@0: } sl@0: __UHEAP_RESET; sl@0: gInOOMTest=EFalse; sl@0: } sl@0: sl@0: void HMACVectorTestL(CMessageDigest* aMD,const TDesC& aFilename) sl@0: { sl@0: test.Next(_L("HMAC Test Vector tests")); sl@0: CTestData* data = CTestData::NewL(aFilename); sl@0: CleanupStack::PushL(data); sl@0: sl@0: TBool finished=EFalse; sl@0: TBool testSuccess = ETrue; sl@0: sl@0: while (!finished) sl@0: { sl@0: switch (data->Type()) sl@0: { sl@0: case CTestData::EMessage: sl@0: { sl@0: break; sl@0: } sl@0: case CTestData::EFileName: sl@0: { sl@0: //get the filename from the .dat file sl@0: HBufC8* filename = (*data)[1]; sl@0: User::LeaveIfNull(filename); sl@0: CleanupStack::PushL(filename); sl@0: sl@0: HBufC8* key= (*data)[2]; sl@0: User::LeaveIfNull(key); sl@0: CleanupStack::PushL(key); sl@0: sl@0: HBufC16* inputFileName = CnvUtfConverter::ConvertToUnicodeFromUtf8L(*filename); sl@0: sl@0: HBufC8* output = (*data)[3]; sl@0: User::LeaveIfNull(output); sl@0: CleanupStack::PushL(output); sl@0: sl@0: Hex(*key); sl@0: Hex(*output); sl@0: sl@0: RFs fs; sl@0: RFile file; sl@0: CleanupClosePushL(fs); sl@0: User::LeaveIfError(fs.Connect()); sl@0: TDriveUnit sysDrive(fs.GetSystemDrive()); sl@0: TBuf<24> filePath (sysDrive.Name()); sl@0: filePath.Append(_L("\\thash\\")); sl@0: User::LeaveIfError(fs.SetSessionPath(filePath)); sl@0: CleanupClosePushL(file); sl@0: User::LeaveIfError(file.Open(fs,*inputFileName,EFileShareAny|EFileRead)); sl@0: // read into iFile sl@0: TInt size=0; sl@0: file.Size(size); sl@0: HBufC8* fileContents=HBufC8::NewMaxL(size); sl@0: sl@0: TPtr8 ptr=fileContents->Des(); sl@0: User::LeaveIfError(file.Read(ptr)); sl@0: CleanupStack::PopAndDestroy(2, &fs); sl@0: CleanupStack::PushL(fileContents); sl@0: delete inputFileName; sl@0: sl@0: CMessageDigest* temp = aMD->ReplicateL(); sl@0: CleanupStack::PushL(temp); sl@0: CMessageDigest* md = CHMAC::NewL(*key, temp); sl@0: CleanupStack::Pop(temp); // Now owned by md sl@0: sl@0: TPtrC8 digest = md->Hash(*fileContents); sl@0: if (digest!=(*output)) sl@0: { sl@0: testSuccess = EFalse; sl@0: } sl@0: sl@0: // Now try this in 2 half sections (just a quick check) sl@0: md->Reset(); sl@0: sl@0: TInt inputLen = fileContents->Length(); sl@0: if (inputLen > 1) sl@0: { sl@0: TInt leftHandLen = inputLen/2; sl@0: TPtrC8 left = fileContents->Left(leftHandLen); sl@0: TPtrC8 right = fileContents->Right(inputLen - leftHandLen); sl@0: sl@0: TPtrC8 halfDigest = md->Hash(left); sl@0: if (halfDigest.Size()==0) // Unnecessary test, but removes sl@0: User::Leave(KErrAbort); // a warning about not using halfDigest sl@0: TPtrC8 wholeDigest = md->Hash(right); sl@0: sl@0: if (wholeDigest!=(*output)) sl@0: { sl@0: testSuccess = EFalse; sl@0: } sl@0: } sl@0: sl@0: md->Reset(); sl@0: TPtrC8 finalDigest = md->Final(*fileContents); sl@0: if (finalDigest!=(*output)) sl@0: { sl@0: testSuccess = EFalse; sl@0: } sl@0: sl@0: // Now try this in 2 half sections (just a quick check) sl@0: md->Reset(); sl@0: sl@0: inputLen = fileContents->Length(); sl@0: if (inputLen > 1) sl@0: { sl@0: TInt leftHandLen = inputLen/2; sl@0: TPtrC8 left = fileContents->Left(leftHandLen); sl@0: TPtrC8 right = fileContents->Right(inputLen - leftHandLen); sl@0: sl@0: md->Update(left); sl@0: TPtrC8 wholeDigest = md->Final(right); sl@0: sl@0: if (wholeDigest!=(*output)) sl@0: { sl@0: testSuccess = EFalse; sl@0: } sl@0: } sl@0: delete md; sl@0: sl@0: CleanupStack::PopAndDestroy(4, filename); // filename, key, output,fileContents sl@0: break; sl@0: } sl@0: case CTestData::EData: sl@0: { sl@0: HBufC8* input = (*data)[0]; sl@0: User::LeaveIfNull(input); sl@0: CleanupStack::PushL(input); sl@0: sl@0: HBufC8* key = (*data)[1]; sl@0: User::LeaveIfNull(key); sl@0: CleanupStack::PushL(key); sl@0: sl@0: HBufC8* output = (*data)[2]; sl@0: User::LeaveIfNull(output); sl@0: CleanupStack::PushL(output); sl@0: sl@0: Hex(*input); sl@0: Hex(*key); sl@0: Hex(*output); sl@0: sl@0: CMessageDigest* temp = aMD->ReplicateL(); sl@0: CleanupStack::PushL(temp); sl@0: CMessageDigest* md = CHMAC::NewL(*key, temp); sl@0: CleanupStack::Pop(temp); // Now owned by md sl@0: sl@0: TPtrC8 digest = md->Hash(*input); sl@0: if (digest!=(*output)) sl@0: { sl@0: testSuccess = EFalse; sl@0: } sl@0: sl@0: // Now try this in 2 half sections (just a quick check) sl@0: md->Reset(); sl@0: sl@0: TInt inputLen = input->Length(); sl@0: if (inputLen > 1) sl@0: { sl@0: TInt leftHandLen = inputLen/2; sl@0: TPtrC8 left = input->Left(leftHandLen); sl@0: TPtrC8 right = input->Right(inputLen - leftHandLen); sl@0: sl@0: TPtrC8 halfDigest = md->Hash(left); sl@0: if (halfDigest.Size()==0) // Unnecessary test, but removes sl@0: User::Leave(KErrAbort); // a warning about not using halfDigest sl@0: TPtrC8 wholeDigest = md->Hash(right); sl@0: sl@0: if (wholeDigest!=(*output)) sl@0: { sl@0: testSuccess = EFalse; sl@0: } sl@0: } sl@0: sl@0: /////////////////////////////////////////////////////////////// sl@0: // Now test the new API - Update/Final functions sl@0: /////////////////////////////////////////////////////////////// sl@0: md->Reset(); sl@0: TPtrC8 finalDigest = md->Final(*input); sl@0: if (finalDigest!=(*output)) sl@0: { sl@0: testSuccess = EFalse; sl@0: } sl@0: sl@0: // Now try this in 2 half sections (just a quick check) sl@0: md->Reset(); sl@0: sl@0: inputLen = input->Length(); sl@0: if (inputLen > 1) sl@0: { sl@0: TInt leftHandLen = inputLen/2; sl@0: TPtrC8 left = input->Left(leftHandLen); sl@0: TPtrC8 right = input->Right(inputLen - leftHandLen); sl@0: sl@0: md->Update(left); sl@0: TPtrC8 wholeDigest = md->Final(right); sl@0: sl@0: if (wholeDigest!=(*output)) sl@0: { sl@0: testSuccess = EFalse; sl@0: } sl@0: } sl@0: delete md; sl@0: CleanupStack::PopAndDestroy(3); // input, key, output sl@0: break; sl@0: } sl@0: case CTestData::EFinished: sl@0: finished=ETrue; sl@0: break; sl@0: default: sl@0: test.Printf(_L("Error in data file\r\n")); sl@0: break; sl@0: } sl@0: }; sl@0: sl@0: CleanupStack::PopAndDestroy(data); sl@0: sl@0: if (!testSuccess) sl@0: User::Leave(KErrGeneral); sl@0: } sl@0: sl@0: void HMACTestsL(CMessageDigest* aMD,const TDesC& aFilename, const TDesC& aHashType) sl@0: { sl@0: TBuf<0x40> formattable; sl@0: formattable.Format(_L("HMAC Tests for %S"), &aHashType); sl@0: test.Next(formattable); sl@0: CMessageDigest* temp = aMD->ReplicateL(); sl@0: CleanupStack::PushL(temp); sl@0: CHMAC* hmac=CHMAC::NewL(_L8("aaaaaaaa"), temp); sl@0: CleanupStack::Pop(temp); sl@0: CleanupStack::PushL(hmac); sl@0: sl@0: // For each of the available digests sl@0: FunctionalityTestL(hmac); //JCS for now sl@0: HMACVectorTestL(aMD,aFilename); sl@0: OOMTestL(hmac); sl@0: sl@0: CleanupStack::PopAndDestroy(hmac); sl@0: } sl@0: sl@0: sl@0: void MD2TestsL() sl@0: { sl@0: CMD2* md2; sl@0: md2=CMD2::NewL(); sl@0: CleanupStack::PushL(md2); sl@0: sl@0: FunctionalityTestL(md2); sl@0: sl@0: VectorTestL(md2,_L("md2.dat")); sl@0: sl@0: OOMTestL(md2); sl@0: sl@0: CleanupStack::PopAndDestroy(md2); sl@0: sl@0: // Problem reported by Jal Panvel, 17-12-1999. sl@0: // Report by email, CSHA1::Hash() returning zero length descriptor sl@0: // sl@0: // This was caused by failure to set internal hash descriptor length on setup, this sl@0: // problem was present in all hashes except MD2 which set it up correctly. sl@0: // Fixed 17-12-1999. sl@0: test.Next(_L("Fixed bugs Tests")); sl@0: md2 = CMD2::NewL(); sl@0: CleanupStack::PushL(md2); sl@0: TPtrC8 data(_L8("The quick brown fox jumped over the lazy dog")); sl@0: TBuf8<128> hash; sl@0: hash = md2->Hash(data); sl@0: test(hash.Length() == md2->HashSize()); sl@0: sl@0: HMACTestsL(md2,_L("hmacmd2.dat"), _L("md2")); sl@0: CleanupStack::PopAndDestroy(md2); sl@0: } sl@0: sl@0: void MD5TestsL() sl@0: { sl@0: CMD5* md5; sl@0: md5=CMD5::NewL(); sl@0: CleanupStack::PushL(md5); sl@0: sl@0: FunctionalityTestL(md5); sl@0: sl@0: VectorTestL(md5,_L("md5.dat")); sl@0: sl@0: OOMTestL(md5); sl@0: sl@0: CleanupStack::PopAndDestroy(md5); sl@0: test.Next(_L("Fixed bugs Tests")); sl@0: // Problem reported by Jal Panvel, 17-12-1999. sl@0: // Report by email, CSHA1::Hash() returning zero length descriptor sl@0: // sl@0: // This was caused by failure to set internal hash descriptor length on setup, this sl@0: // problem was present in all hashes except MD2 which set it up correctly. sl@0: // Fixed 17-12-1999. sl@0: CMD5* md = CMD5::NewL(); sl@0: CleanupStack::PushL(md); sl@0: TPtrC8 data(_L8("The quick brown fox jumped over the lazy dog")); sl@0: TBuf8<128> hash; sl@0: hash = md->Hash(data); sl@0: test(hash.Length() == md->HashSize()); sl@0: sl@0: HMACTestsL(md5,_L("hmacmd5.dat"), _L("md5")); sl@0: CleanupStack::PopAndDestroy(md); sl@0: sl@0: // Test for DEF001510 "TLS - Receives Disconnect Indication during hands..." sl@0: CMD5* testHasher = CMD5::NewL(); sl@0: CleanupStack::PushL(testHasher); sl@0: TPtrC8 client(_L8("D652CA1A6154D8303C16C055E424A5ACF3EBAB94284CD9B05B85C0D0F0B8E7A4")); sl@0: TPtrC8 server(_L8("3E3E56059EFEE4F8C5B05C76128C4C84916DF9E935510C3C063454856FF29FF8")); sl@0: sl@0: HBufC8* clientData = client.AllocLC(); sl@0: HBufC8* serverData = server.AllocLC(); sl@0: sl@0: Hex(*clientData); sl@0: Hex(*serverData); sl@0: sl@0: testHasher->Hash(*clientData); sl@0: testHasher->Hash(*serverData); sl@0: sl@0: TBuf8<32> md5buf; sl@0: md5buf.Copy(testHasher->Hash(TPtrC8(0,0))); sl@0: sl@0: testHasher->Reset(); sl@0: sl@0: // Now hash in one chunk sl@0: TPtrC8 all(_L8("D652CA1A6154D8303C16C055E424A5ACF3EBAB94284CD9B05B85C0D0F0B8E7A43E3E56059EFEE4F8C5B05C76128C4C84916DF9E935510C3C063454856FF29FF8")); sl@0: HBufC8* allData = all.AllocLC(); sl@0: Hex(*allData); sl@0: sl@0: TBuf8<32> allbuf; sl@0: allbuf = testHasher->Hash(*allData); sl@0: test(allbuf.Compare(md5buf)==0); sl@0: CleanupStack::PopAndDestroy(4, testHasher); sl@0: } sl@0: sl@0: // Test for the MD4 Message Digest Algorithm API's sl@0: void MD4TestsL() sl@0: { sl@0: CMD4* md4; sl@0: md4=CMD4::NewL(); sl@0: CleanupStack::PushL(md4); sl@0: sl@0: FunctionalityTestL(md4); sl@0: sl@0: VectorTestL(md4,_L("md4.dat")); sl@0: sl@0: OOMTestL(md4); sl@0: sl@0: CleanupStack::PopAndDestroy(md4); sl@0: sl@0: //Test to check the Hash Size. sl@0: CMD4* md = CMD4::NewL(); sl@0: CleanupStack::PushL(md); sl@0: TPtrC8 data(_L8("The quick brown fox jumped over the lazy dog")); sl@0: TBuf8<128> hash; sl@0: hash = md->Hash(data); sl@0: test(hash.Length() == md->HashSize()); sl@0: sl@0: HMACTestsL(md,_L("hmacmd4.dat"), _L("md4")); sl@0: CleanupStack::PopAndDestroy(md); sl@0: sl@0: //Tests carried for other Message Digest Algorithms copied(SHA1 and MD5) sl@0: //Here Input Data is given in two parts and as a whole and the digest generated is compared. sl@0: CMD4* testHasher = CMD4::NewL(); sl@0: CleanupStack::PushL(testHasher); sl@0: TPtrC8 client(_L8("D652CA1A6154D8303C16C055E424A5ACF3EBAB94284CD9B05B85C0D0F0B8E7A4")); sl@0: TPtrC8 server(_L8("3E3E56059EFEE4F8C5B05C76128C4C84916DF9E935510C3C063454856FF29FF8")); sl@0: sl@0: HBufC8* clientData = client.AllocLC(); sl@0: HBufC8* serverData = server.AllocLC(); sl@0: sl@0: Hex(*clientData); sl@0: Hex(*serverData); sl@0: sl@0: testHasher->Hash(*clientData); sl@0: testHasher->Hash(*serverData); sl@0: sl@0: TBuf8<32> md4buf; sl@0: md4buf.Copy(testHasher->Hash(TPtrC8(0,0))); sl@0: sl@0: testHasher->Reset(); sl@0: sl@0: // Now hash in one chunk sl@0: TPtrC8 all(_L8("D652CA1A6154D8303C16C055E424A5ACF3EBAB94284CD9B05B85C0D0F0B8E7A43E3E56059EFEE4F8C5B05C76128C4C84916DF9E935510C3C063454856FF29FF8")); sl@0: HBufC8* allData = all.AllocLC(); sl@0: Hex(*allData); sl@0: sl@0: TBuf8<32> allbuf; sl@0: allbuf = testHasher->Hash(*allData); sl@0: test(allbuf.Compare(md4buf)==0); sl@0: CleanupStack::PopAndDestroy(4, testHasher); sl@0: sl@0: //Tests for the Factory Method CMessageDigestFactory sl@0: CMessageDigest* messageDigest = CMessageDigestFactory::NewDigestLC(CMessageDigest::EMD4); sl@0: VectorTestL(messageDigest,_L("md4.dat")); sl@0: CleanupStack::PopAndDestroy(messageDigest); sl@0: } sl@0: sl@0: sl@0: void SHA1TestsL() sl@0: { sl@0: CSHA1* sha; sl@0: sha=CSHA1::NewL(); sl@0: CleanupStack::PushL(sha); sl@0: sl@0: VectorTestL(sha,_L("sha1.dat")); sl@0: sl@0: FunctionalityTestL(sha); sl@0: sl@0: OOMTestL(sha); sl@0: sl@0: CleanupStack::PopAndDestroy(sha); sl@0: sl@0: test.Next(_L("Fixed bugs Tests")); sl@0: // Problem reported by Jal Panvel, 17-12-1999. sl@0: // Report by email, CSHA1::Hash() returning zero length descriptor sl@0: // sl@0: // This was caused by failure to set internal hash descriptor length on setup, this sl@0: // problem was present in all hashes except MD2 which set it up correctly. sl@0: // Fixed 17-12-1999. sl@0: sl@0: sha=CSHA1::NewL(); sl@0: CleanupStack::PushL(sha); sl@0: TPtrC8 data(_L8("The quick brown fox jumped over the lazy dog")); sl@0: TBuf8<128> hash; sl@0: hash = sha->Hash(data); sl@0: test(hash.Length() == sha->HashSize()); sl@0: sha->Reset(); sl@0: sl@0: // Test for DEF001510 "TLS - Receives Disconnect Indication during hands..." sl@0: CSHA1* testHasher = CSHA1::NewL(); sl@0: CleanupStack::PushL(testHasher); sl@0: TPtrC8 client(_L8("D652CA1A6154D8303C16C055E424A5ACF3EBAB94284CD9B05B85C0D0F0B8E7A4")); sl@0: TPtrC8 server(_L8("3E3E56059EFEE4F8C5B05C76128C4C84916DF9E935510C3C063454856FF29FF8")); sl@0: sl@0: HBufC8* clientData = client.AllocLC(); sl@0: HBufC8* serverData = server.AllocLC(); sl@0: sl@0: Hex(*clientData); sl@0: Hex(*serverData); sl@0: sl@0: // Hash in 2 portions sl@0: TBuf8<32> clientbuf; sl@0: TBuf8<32> serverbuf; sl@0: clientbuf = testHasher->Hash(*clientData); sl@0: serverbuf = testHasher->Hash(*serverData); sl@0: sl@0: TBuf8<32> shabuf; sl@0: shabuf.Copy(testHasher->Hash(TPtrC8(0,0))); sl@0: testHasher->Reset(); sl@0: sl@0: // Now hash in one chunk sl@0: TPtrC8 all(_L8("D652CA1A6154D8303C16C055E424A5ACF3EBAB94284CD9B05B85C0D0F0B8E7A43E3E56059EFEE4F8C5B05C76128C4C84916DF9E935510C3C063454856FF29FF8")); sl@0: HBufC8* allData = all.AllocLC(); sl@0: Hex(*allData); sl@0: sl@0: TBuf8<32> allbuf; sl@0: allbuf = testHasher->Hash(*allData); sl@0: sl@0: test(allbuf.Compare(shabuf)==0); sl@0: CleanupStack::PopAndDestroy(4, testHasher); sl@0: sl@0: // Test hashing non-word aligned data - used to crash on arm sl@0: TPtrC8 nonAlignedData = data.Mid(1); sl@0: hash = sha->Final(nonAlignedData); sl@0: test(hash.Length() == sha->HashSize()); sl@0: sha->Reset(); sl@0: sl@0: // Test end sl@0: HMACTestsL(sha,_L("hmacsha1.dat"), _L("sha1")); sl@0: CleanupStack::PopAndDestroy(); // sha sl@0: } sl@0: sl@0: void ExecuteHashTestsL(CMessageDigest* aMD, const TDesC& aVector, const TDesC& aHMACVector, const TDesC& aHashType) sl@0: { sl@0: VectorTestL(aMD, aVector); sl@0: FunctionalityTestL(aMD); sl@0: OOMTestL(aMD); sl@0: aMD->Reset(); sl@0: sl@0: test.Next(_L("Fixed bugs Tests")); sl@0: sl@0: _LIT8(KTest1Data, "The quick brown fox jumped over the lazy dog"); sl@0: TBuf8 hash; sl@0: hash = aMD->Hash(KTest1Data()); sl@0: test(hash.Length() == aMD->HashSize()); sl@0: aMD->Reset(); sl@0: sl@0: // Test for DEF001510 "TLS - Receives Disconnect Indication during hands..." sl@0: _LIT8(KClientData, "D652CA1A6154D8303C16C055E424A5ACF3EBAB94284CD9B05B85C0D0F0B8E7A4"); sl@0: _LIT8(KServerData, "3E3E56059EFEE4F8C5B05C76128C4C84916DF9E935510C3C063454856FF29FF8"); sl@0: sl@0: HBufC8* clientData = KClientData().AllocLC(); sl@0: HBufC8* serverData = KServerData().AllocLC(); sl@0: sl@0: Hex(*clientData); sl@0: Hex(*serverData); sl@0: sl@0: // Hash in 2 portions sl@0: aMD->Hash(*clientData); sl@0: aMD->Hash(*serverData); sl@0: sl@0: CleanupStack::PopAndDestroy(2, clientData); sl@0: sl@0: TBuf8 shabuf; sl@0: shabuf.Copy(aMD->Hash(KNullDesC8())); sl@0: aMD->Reset(); sl@0: sl@0: // Now hash in one chunk sl@0: _LIT8(KAllData, "D652CA1A6154D8303C16C055E424A5ACF3EBAB94284CD9B05B85C0D0F0B8E7A43E3E56059EFEE4F8C5B05C76128C4C84916DF9E935510C3C063454856FF29FF8"); sl@0: HBufC8* allData = KAllData().AllocLC(); sl@0: Hex(*allData); sl@0: sl@0: TBuf8 allbuf; sl@0: allbuf = aMD->Hash(*allData); sl@0: sl@0: test(allbuf.Compare(shabuf)==0); sl@0: CleanupStack::PopAndDestroy(allData); sl@0: sl@0: // Test hashing non-word aligned data - used to crash on arm sl@0: TPtrC8 nonAlignedData = KTest1Data().Mid(1); sl@0: hash = aMD->Final(nonAlignedData); sl@0: test(hash.Length() == aMD->HashSize()); sl@0: aMD->Reset(); sl@0: sl@0: // Test end sl@0: HMACTestsL(aMD, aHMACVector, aHashType); sl@0: } sl@0: sl@0: _LIT(K224Algo, "SHA-224.dat"); sl@0: _LIT(K256Algo, "SHA-256.dat"); sl@0: _LIT(K384Algo, "SHA-384.dat"); sl@0: _LIT(K512Algo, "SHA-512.dat"); sl@0: _LIT(K224Vector, "sha224.dat"); sl@0: _LIT(K256Vector, "sha256.dat"); sl@0: _LIT(K384Vector, "sha384.dat"); sl@0: _LIT(K512Vector, "sha512.dat"); sl@0: _LIT(K224HmacVector, "hmacsha224.dat"); sl@0: _LIT(K256HmacVector, "hmacsha256.dat"); sl@0: _LIT(K384HmacVector, "hmacsha384.dat"); sl@0: _LIT(K512HmacVector, "hmacsha512.dat"); sl@0: sl@0: const TDesC* gNames[] = sl@0: { sl@0: &K224Vector(), sl@0: &K224HmacVector(), sl@0: &K224Algo(), sl@0: &K256Vector(), sl@0: &K256HmacVector(), sl@0: &K256Algo(), sl@0: &K384Vector(), sl@0: &K384HmacVector(), sl@0: &K384Algo(), sl@0: &K512Vector(), sl@0: &K512HmacVector(), sl@0: &K512Algo(), sl@0: }; sl@0: sl@0: sl@0: void SHA2TestsL(CMessageDigest::THashId aHashId) sl@0: { sl@0: CMessageDigest* md = CMessageDigestFactory::NewDigestLC(aHashId); sl@0: TInt pos = aHashId - CMessageDigest::ESHA224; sl@0: pos *= 3; sl@0: ExecuteHashTestsL(md, *gNames[pos], *gNames[pos+1], *gNames[pos+2]); sl@0: CleanupStack::PopAndDestroy(md); sl@0: } sl@0: sl@0: void HashTests(void) sl@0: { sl@0: TInt32 testsFailed=0, testCount=0; sl@0: sl@0: test.Start(_L("SHA1 Tests")); sl@0: TRAPD(r, SHA1TestsL()); sl@0: ++testCount; sl@0: if (r!=KErrNone) sl@0: { sl@0: test.Printf(_L("\r\nSHA1 Tests failed error code = %d\r\n\r\n"),r); sl@0: ++testsFailed; sl@0: } sl@0: sl@0: test.Start(_L("SHA-224 Tests")); sl@0: TRAP(r, SHA2TestsL(CMessageDigest::ESHA224)); sl@0: ++testCount; sl@0: if (r!=KErrNone) sl@0: { sl@0: test.Printf(_L("\r\nSHA-224 Tests failed error code = %d\r\n\r\n"),r); sl@0: ++testsFailed; sl@0: } sl@0: sl@0: test.Start(_L("SHA-256 Tests")); sl@0: TRAP(r, SHA2TestsL(CMessageDigest::ESHA256)); sl@0: ++testCount; sl@0: if (r!=KErrNone) sl@0: { sl@0: test.Printf(_L("\r\nSHA-256 Tests failed error code = %d\r\n\r\n"),r); sl@0: ++testsFailed; sl@0: } sl@0: sl@0: test.Start(_L("SHA-384 Tests")); sl@0: TRAP(r, SHA2TestsL(CMessageDigest::ESHA384)); sl@0: ++testCount; sl@0: if (r!=KErrNone) sl@0: { sl@0: test.Printf(_L("\r\nSHA-384 Tests failed error code = %d\r\n\r\n"),r); sl@0: ++testsFailed; sl@0: } sl@0: sl@0: test.Start(_L("SHA-512 Tests")); sl@0: TRAP(r, SHA2TestsL(CMessageDigest::ESHA512)); sl@0: ++testCount; sl@0: if (r!=KErrNone) sl@0: { sl@0: test.Printf(_L("\r\nSHA-512 Tests failed error code = %d\r\n\r\n"),r); sl@0: ++testsFailed; sl@0: } sl@0: sl@0: test.Start(_L("MD5 Tests")); sl@0: TRAP(r, MD5TestsL()); sl@0: ++testCount; sl@0: if (r!=KErrNone) sl@0: { sl@0: test.Printf(_L("\r\nMD5 Tests failed error code = %d\r\n\r\n"),r); sl@0: ++testsFailed; sl@0: } sl@0: sl@0: test.Start(_L("MD2 Tests")); sl@0: TRAP(r, MD2TestsL()); sl@0: ++testCount; sl@0: if (r!=KErrNone) sl@0: { sl@0: test.Printf(_L("\r\nMD2 Tests failed error code = %d\r\n\r\n"),r); sl@0: ++testsFailed; sl@0: } sl@0: sl@0: //MD4 Message Digest Algorithm Tests sl@0: test.Start(_L("MD4 Tests")); sl@0: TRAP(r, MD4TestsL()); sl@0: ++testCount; sl@0: if (r!=KErrNone) sl@0: { sl@0: test.Printf(_L("\r\nMD4 Tests failed error code = %d\r\n\r\n"),r); sl@0: ++testsFailed; sl@0: } sl@0: sl@0: test.Printf(_L("\r\n%d tests failed out of %d \r\n"),testsFailed,testCount); sl@0: sl@0: sl@0: test(testsFailed==0); sl@0: } sl@0: sl@0: sl@0: GLDEF_C TInt E32Main(void) sl@0: sl@0: { sl@0: CTrapCleanup* cleanup; sl@0: cleanup=CTrapCleanup::New(); sl@0: sl@0: test.Start(_L(" @SYMTestCaseID:SEC-CRYPTO-HASH-0001 Hash Algorithm Tests ")); sl@0: CTestConsole* con=NULL; sl@0: TRAPD(ret, con=CTestConsole::NewL(test.Console())); sl@0: if(ret != KErrNone) sl@0: { sl@0: return ret; sl@0: } sl@0: RFs fs; sl@0: sl@0: fs.Connect(); sl@0: RFile* file; sl@0: file=new (ELeave) RFile; sl@0: sl@0: TDriveUnit sysDrive (fs.GetSystemDrive()); sl@0: TDriveName driveName(sysDrive.Name()); sl@0: TBuf<24> hashLogFile (driveName); sl@0: hashLogFile.Append(_L("\\HashLog.txt")); sl@0: sl@0: file->Replace(fs,hashLogFile,EFileShareAny|EFileWrite); sl@0: con->SetLogFile(file); sl@0: sl@0: test.SetConsole(con); sl@0: __UHEAP_MARK; sl@0: HashTests(); sl@0: __UHEAP_MARKEND; sl@0: sl@0: test.End(); sl@0: test.Close(); sl@0: delete cleanup; sl@0: return(KErrNone); sl@0: }