--- a/crypto/weakcrypto/test/trandom/t_random.cpp Tue Aug 31 17:00:08 2010 +0300
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,410 +0,0 @@
-/*
-* Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of the License "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description:
-* (c) 1999 Symbian Ltd
-*
-*/
-
-
-/**
- @file
-*/
-
-#include <e32base.h>
-#include <e32std.h>
-#include <e32test.h>
-#include <random.h>
-#include <f32file.h>
-
-#include <randsvr.h>
-
-RTest test(_L("Random Number Generator Tests"));
-
-TInt gNumberOfRandomNumbers=10000;
-
-/** Wraps a console and logs output to a file. */
-class CTestConsole:public CConsoleBase
- {
- public:
- static CTestConsole* NewL(CConsoleBase* aCon, const TDesC& aFilename);
- TInt Create(const TDesC16& aTitle,TSize aSize) {return iCon->Create(aTitle,aSize);};
- void Read(TRequestStatus& aStatus) {iCon->Read(aStatus);};
- void ReadCancel(void) {iCon->ReadCancel();};
- void Write(const TDesC16& aString);
- TPoint CursorPos(void) const {return iCon->CursorPos();};
- void SetCursorPosAbs(const TPoint& aPos) {iCon->SetCursorPosAbs(aPos);};
- void SetCursorPosRel(const TPoint& aPos) {iCon->SetCursorPosRel(aPos);};
- void SetCursorHeight(TInt aHeight) {iCon->SetCursorHeight(aHeight);};
- void SetTitle(const TDesC16& aTitle) {iCon->SetTitle(aTitle);};
- void ClearScreen(void) {iCon->ClearScreen();};
- void ClearToEndOfLine(void) {iCon->ClearToEndOfLine();};
- TSize ScreenSize(void) const {return iCon->ScreenSize();};
- TKeyCode KeyCode(void) const {return iCon->KeyCode();};
- TUint KeyModifiers(void) const {return iCon->KeyModifiers();};
- ~CTestConsole(void);
- private:
- CTestConsole(CConsoleBase* aCon);
- void ConstructL(const TDesC& aFilename);
- CConsoleBase* iCon; ///< Pointer to wrapped console, we don't own this
- RFs iFs;
- RFile iFile; ///< Log file
- };
-
-CTestConsole* CTestConsole::NewL(CConsoleBase* aCon, const TDesC& aFilename)
-
- {
- CTestConsole* self;
- self=new (ELeave) CTestConsole(aCon);
- CleanupStack::PushL(self);
- self->ConstructL(aFilename);
- CleanupStack::Pop(self);
- return self;
- }
-
-CTestConsole::CTestConsole(CConsoleBase* aCon) :
- CConsoleBase(), iCon(aCon)
-
- {
- }
-
-void CTestConsole::ConstructL(const TDesC& aFilename)
-
- {
- User::LeaveIfError(iFs.Connect());
- User::LeaveIfError(iFile.Replace(iFs,aFilename,EFileShareAny|EFileWrite));
- }
-
-CTestConsole::~CTestConsole(void)
-
- {
- iFile.Close();
- iFs.Close();
- }
-
-void CTestConsole::Write(const TDesC16& aString)
-
- {
- iCon->Write(aString);
- TUint8 space[200];
- TPtr8 ptr(space,200);
- ptr.Copy(aString);
- iFile.Write(ptr);
- }
-
-void Monobit(const TUint8* aData)
-
- {
- const TInt bitcount[256]=
- { 0,1,1,2,1,2,2,3, // 00-07
- 1,2,2,3,2,3,3,4, // 08-0f
- 1,2,2,3,2,3,3,4, // 10-17
- 2,3,3,4,3,4,4,5, // 18-1f
- 1,2,2,3,2,3,3,4, // 20-27
- 2,3,3,4,3,4,4,5, // 28-2f
- 2,3,3,4,3,4,4,5, // 30-37
- 3,4,4,5,4,5,5,6, // 38-3f
-
- 1,2,2,3,2,3,3,4, // 40-47
- 2,3,3,4,3,4,4,5, // 48-4f
- 2,3,3,4,3,4,4,5, // 50-57
- 3,4,4,5,4,5,5,6, // 58-5f
- 2,3,3,4,3,4,4,5, // 60-67
- 3,4,4,5,4,5,5,6, // 68-6f
- 3,4,4,5,4,5,5,6, // 70-77
- 4,5,5,6,5,6,6,7, // 78-7f
-
- 1,2,2,3,2,3,3,4, // 80-87
- 2,3,3,4,3,4,4,5, // 88-8f
- 2,3,3,4,3,4,4,5, // 90-97
- 3,4,4,5,4,5,5,6, // 98-9f
- 2,3,3,4,3,4,4,5, // a0-a7
- 3,4,4,5,4,5,5,6, // a8-af
- 3,4,4,5,4,5,5,6, // b0-b7
- 4,5,5,6,5,6,6,7, // b8-bf
-
- 2,3,3,4,3,4,4,5, // c0-c7
- 3,4,4,5,4,5,5,6, // c8-cf
- 3,4,4,5,4,5,5,6, // d0-d7
- 4,5,5,6,5,6,6,7, // d8-df
- 3,4,4,5,4,5,5,6, // e0-e7
- 4,5,5,6,5,6,6,7, // e8-ef
- 4,5,5,6,5,6,6,7, // f0-f7
- 5,6,6,7,6,7,7,8 // f8-ff
- };
- TInt total=0;
- TInt i;
- for (i=0;i<2500;i++)
- {
- total+=bitcount[aData[i]];
- }
- test.Printf(_L(" Total bitcount %d\r\n"),total);
- if ((total>9654)&&(total<10346))
- {
- test.Printf(_L(" Passed Monobit\r\n"));
- }
- else
- {
- test.Printf(_L(" ***FAILED!\r\n"));
- User::Panic(_L("t_random.exe"), KErrGeneral);
- }
- }
-
-void Poker(const TUint8* aData)
-
- {
- TInt f[16]= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
- TInt i;
- for (i=0;i<2500;i++)
- {
- f[(aData[i]&0x0f)]++;
- f[((aData[i]&0xf0)>>4)]++;
- }
- TReal x=0;
- for (i=0;i<16;i++)
- {
- x+=f[i]*f[i];
- }
- x*=16;
- x/=5000;
- x-=5000;
- if ((x>1.03)&&(x<57.4))
- {
- test.Printf(_L(" Passed poker test\r\n"));
- }
- else
- {
- test.Printf(_L(" ***FAILED poker test\r\n"));
- User::Panic(_L("t_random.exe"), KErrGeneral);
- }
- }
-
-void Runs(const TUint8* aData)
-
- {
- TInt i;
- TInt lastbit=0;
- TInt count[7][2]={
- { 0,0 },
- { 0,0 },
- { 0,0 },
- { 0,0 },
- { 0,0 },
- { 0,0 },
- { 0,0 }
- };
- TInt thisrun=0;
- TInt longrun=0;
- for (i=0;i<2500;i++)
- {
- TInt bit;
- for (bit=0;bit<8;bit++)
- {
- if (((aData[i]>>bit)&1)==lastbit)
- {
- thisrun++;
- }
- else
- {
- if (thisrun<5)
- {
- count[thisrun][lastbit]++;
- }
- else
- {
- count[5][lastbit]++;
- }
- lastbit^=1;
- if (thisrun>longrun)
- {
- longrun=thisrun;
- }
- thisrun=0;
- }
- }
- }
- TInt bound[6][2]=
- {
- {2267,2733},
- {1079,1421},
- { 502, 748},
- { 223, 402},
- { 90, 223},
- { 90, 223}
- };
- TBool failed=EFalse;
- for (i=0;i<6;i++)
- {
- if (!((count[i][0]>bound[i][0])&&(count[i][0]<bound[i][1])))
- {
- test.Printf(_L(" ***FAILED runs test\r\n"));
- failed=ETrue;
- }
- if (!((count[i][1]>bound[i][0])&&(count[i][1]<bound[i][1])))
- {
- test.Printf(_L(" ***FAILED runs test\r\n"));
- failed=ETrue;
- }
- }
- if (!failed)
- {
- test.Printf(_L(" Passed runs test\r\n"));
- }
- if ( (longrun>34) || (failed) )
- {
- test.Printf(_L(" ***FAILED longrun test\r\n"));
- User::Panic(_L("t_random.exe"), KErrGeneral);
- }
- }
-
-void FIPSTest(const TUint8* aData)
-// Run some basic tests to check it's returned some numbers
-// These will panic if a failure is detected
- {
- Monobit(aData);
- Poker(aData);
- Runs(aData);
- }
-
-void WriteFile(const TUint8* aData,const TDesC& aFileName)
-
- {
- RFs fs;
- fs.Connect();
- RFile file;
- TInt err;
- err=file.Open(fs,aFileName,EFileShareAny|EFileWrite);
- if (err)
- {
- if (file.Create(fs,aFileName,EFileShareAny|EFileWrite))
- {
- return;
- }
- }
- TPtrC8 ptr(aData,gNumberOfRandomNumbers);
- TInt size;
- file.Size(size);
- file.Write(size,ptr);
- file.Close();
- fs.Close();
- FIPSTest(aData);
- }
-
-class RTestRandomSession : public RRandomSession
- {
- public:
- void SendMalformedInputL()
- {
- test.Printf(_L("Test malformed input with negative buffer size\r\n"));
- TBuf8<1024> buffer;
- TInt err = SendReceive(CRandomSession::KRandomRequest, TIpcArgs(&buffer, -1));
- if (err != KErrArgument)
- {
- test.Printf(_L("%d should have been returned on negative buffer size test, but %d was returned!\r\n"), KErrArgument, err);
- User::Leave(KErrGeneral);
- }
- }
- };
-
-// Checks that RandomServer handles malformed length correctly - see INC113902
-void TestMalformedInputL()
- {
- RTestRandomSession rs;
- TRAPD(err, rs.ConnectL());
- User::LeaveIfError(err); // The connect method leaves with zero even if it succeeds, so we have to trap the error
- CleanupClosePushL(rs);
- rs.SendMalformedInputL();
- CleanupStack::PopAndDestroy(&rs);
- }
-
-void DoTestsL()
-
- {
- TestMalformedInputL();
-
- test.Printf(_L(" Run random tests with normal salting\r\n"));
-
- TInt i;
- TBuf8<16> buf2;
- for (i=0;i<16;i++)
- {
- buf2.SetLength(i);
- TRandom::RandomL(buf2);
- }
- HBufC8* buf=HBufC8::NewMaxL(gNumberOfRandomNumbers);
- TPtr8 buffer=buf->Des();
- for (i=0;i<11;i++)
- {
- User::After(10000000);
- TPtr8 thePtr(buf->Des());
- thePtr.FillZ();
- // Generate the random data
- TRandom::RandomL(buffer);
- if (buf->Length()!=gNumberOfRandomNumbers)
- User::Leave(KErrGeneral);
-
-
- WriteFile(buffer.Ptr(),_L("User.rnd"));
- test.Printf(_L("."));
- }
- delete buf;
- }
-
-void TestsL(void)
- {
- TDriveUnit sysDrive (RFs::GetSystemDrive());
- TDriveName driveName(sysDrive.Name());
- TBuf<64> logFile (driveName);
- logFile.Append(_L("\\t_random.log"));
- CTestConsole* con = CTestConsole::NewL(test.Console(), logFile);
- test.SetConsole(con);
-
- DoTestsL();
-
- // If test reached here, no tests failed, otherwise it would have panicked
- // and terminated prematurely. Print this out for tester's reference.
- test.Printf(_L("\n0 tests failed out of 12\r\n"));
- }
-
-GLDEF_C TInt E32Main(void)
-
- {
- CTrapCleanup* cleanup;
- cleanup=CTrapCleanup::New();
-
- __UHEAP_MARK;
-
- test.Start(_L(" SYMTestCaseID:SEC-CRYPTO-RANDOM-0001 Starting random number generator tests\r\n"));
- CConsoleBase* originalConsole = test.Console();
-
- TRAPD(ret,TestsL());
- if (ret)
- {
- test.Printf(_L("Unexpected leave\r\n"));
- // Print something to let the build system know we failed
- test.Printf(_L("\n1 tests failed out of 11\r\n"));
- }
- test.End();
-
- if (test.Console() != originalConsole)
- {
- delete test.Console();
- test.SetConsole(originalConsole);
- }
- test.Close();
-
- __UHEAP_MARKEND;
-
- delete cleanup;
- return(KErrNone);
- }