kerneltest/e32test/random/d_entropysources.cpp
branchRCL_3
changeset 80 597aaf25e343
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/e32test/random/d_entropysources.cpp	Fri Mar 12 15:50:11 2010 +0200
@@ -0,0 +1,160 @@
+// Copyright (c) 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:
+// e32test\entropysources\d_entropysources.cpp
+// 
+//
+/**
+ @file
+ @internalComponent
+ @test
+*/
+#include <dfcs.h>
+#include <kernel/kernel.h>
+#include <kernel/kern_priv.h>
+#include "kern_test.h"
+#include "d_entropysources.h"
+
+//---------------------------------------------------------------------------------------------------------------------
+//! @SYMTestCaseID				KBASE-entropysources-2703
+//! @SYMTestType				UT
+//! @SYMTestCaseDesc			Verifies that entropy is contributed to the Secure RNG
+//! @SYMPREQ					PREQ211
+//! @SYMTestPriority			High
+//! @SYMTestActions				
+//! 	1. 	TestReseed: tests that the interval between RNG reseeds is less than KMaxReseedTime, unless the platform is 
+//!         known not to have a viable entropy source.
+//! 		
+//! 
+//! @SYMTestExpectedResults
+//! 	1.	Properties checked:
+//! 		1) checks that there is a valid entropy source contrbuting entropy data.
+//!         2) checks that the entropy collection framework is functioning correctly..
+//! 	
+//---------------------------------------------------------------------------------------------------------------------
+
+class DEntropySourcesFactory : public DLogicalDevice
+    {
+public:
+    DEntropySourcesFactory();
+    virtual TInt Install();    
+    virtual void GetCaps(TDes8 &aDes) const;
+    virtual TInt Create(DLogicalChannelBase*& aChannel); 
+    };
+
+class DEntropySources : public DLogicalChannelBase
+    {
+public:
+ 	DEntropySources();
+   ~DEntropySources();    
+    void ReseedHook();
+    
+protected:    
+	virtual TInt DoCreate(TInt aUnit, const TDesC8* anInfo, const TVersion& aVer);
+	virtual TInt Request(TInt aReqNo, TAny* a1, TAny* a2);
+
+private:
+    DThread*        iClient;
+    TClientRequest* iRequest;    
+    };
+
+// Function to be called from the kernel side code.
+void ReseedHook(TAny* aPtr)
+    {
+	((DEntropySources*)aPtr)->ReseedHook();
+    }
+
+DECLARE_STANDARD_LDD()
+    {
+     return new DEntropySourcesFactory;
+    }
+
+//
+// DEntropySourcesFactory
+//
+
+DEntropySourcesFactory::DEntropySourcesFactory()
+    {
+    // Set version number for this device
+    iVersion = TVersion(0,1,1);
+
+    // Indicate we don't support units or a PDD
+    iParseMask = 0;
+    }
+
+TInt DEntropySourcesFactory::Install()
+    {
+    return(SetName(&KEntropySourcesName));
+    }
+
+void DEntropySourcesFactory::GetCaps(TDes8& aDes) const
+    {
+    // Create a capabilities object
+    TCapsEntropySources caps;
+    caps.iVersion = iVersion;
+
+    // Write it back to user memory
+    Kern::InfoCopy(aDes,(TUint8*)&caps,sizeof(caps));
+    }
+
+TInt DEntropySourcesFactory::Create(DLogicalChannelBase*& aChannel)
+    {
+    aChannel = new DEntropySources;
+    if(!aChannel)
+        return KErrNoMemory;
+    return KErrNone;
+    }
+
+//
+// DEntropySources
+//
+
+DEntropySources::DEntropySources()
+	{
+    iClient = &Kern::CurrentThread();
+    iClient->Open();
+	}
+
+DEntropySources::~DEntropySources()
+    {
+	KernTest::Test(KernTest::ERNGReseedHook, NULL, NULL);
+    Kern::SafeClose((DObject*&)iClient, NULL);
+	Kern::DestroyClientRequest(iRequest);
+    }
+
+TInt DEntropySources::DoCreate(TInt /*aUnit*/, const TDesC8* /*aInfo*/, const TVersion& /*aVer*/)
+	{
+	return Kern::CreateClientRequest(iRequest);
+	}
+
+TInt DEntropySources::Request(TInt aReqNo, TAny* a1, TAny* a2)
+    {
+    (void)a2;
+    TInt r = KErrNotSupported;
+    switch(aReqNo)
+        {
+        case ~REntropySources::EReseedTest:
+            r = iRequest->SetStatus((TRequestStatus*)a1);
+			if (r!=KErrNone)
+				return r;
+            KernTest::Test(KernTest::ERNGReseedHook, (TAny*)&::ReseedHook, this);            
+            break;
+        }
+    return r;
+    }
+
+void DEntropySources::ReseedHook()
+    {
+	KernTest::Test(KernTest::ERNGReseedHook, NULL, NULL);
+    Kern::QueueRequestComplete(iClient, iRequest, KErrNone);
+    }