kerneltest/e32test/rpmb/driver/d_rpmb.cpp
author hgs
Mon, 11 Oct 2010 19:11:06 +0100
changeset 287 ddfd5aa0d58f
permissions -rw-r--r--
201041_01
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
287
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
     1
// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
     2
// All rights reserved.
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
     4
// under the terms of the License "Eclipse Public License v1.0"
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
     7
//
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
     8
// Initial Contributors:
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    10
//
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    11
// Contributors:
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    12
//
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    13
// Description:
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    14
// e32test/rpmb/d_rpmb.cpp
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    15
// LDD for testing RPMB kernel extension
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    16
// 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    17
//
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    18
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    19
/**
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    20
 @file
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    21
 @internalComponent
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    22
 @prototype
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    23
*/
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    24
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    25
#include "d_rpmb.h"
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    26
#include "../t_rpmb.h"
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    27
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    28
_LIT(KRpmbTestThreadName,"RpmbTestThread");
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    29
const TInt KRpmbTestPriority = 24;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    30
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    31
TDfcQue RpmbTestDfcQ;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    32
TDfc* DfcPtr;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    33
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    34
// please read this before uncommenting out #define RPMBTESTS_TRY_TO_WRITE_KEY:
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    35
// Don't want to write key 'pre production' on real device as this will lock 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    36
// the system out of the RPMB partition (the key should be preprogrammed as 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    37
// part of the production process so that the system has access to the key - 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    38
// if the key has already been written it can't be written again).
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    39
// #define RPMBTESTS_TRY_TO_WRITE_KEY
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    40
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    41
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    42
/****************************************
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    43
 Implementation of DRpmbTestFactory class
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    44
*****************************************/
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    45
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    46
DRpmbTestFactory::DRpmbTestFactory()
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    47
	{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    48
	}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    49
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    50
DRpmbTestFactory::~DRpmbTestFactory()
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    51
	{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    52
	}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    53
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    54
TInt DRpmbTestFactory::Create(DLogicalChannelBase*& aChannel)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    55
	{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    56
	aChannel = new DRpmbTest;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    57
	return KErrNone;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    58
	}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    59
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    60
TInt DRpmbTestFactory::Install()
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    61
	{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    62
	return SetName(&KRpmbTestLddName);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    63
	}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    64
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    65
void DRpmbTestFactory::GetCaps(TDes8& /*aDes*/) const
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    66
// implementation required since DLogicalDevice::GetCaps is pure virtual
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    67
	{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    68
	// do nothing 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    69
	}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    70
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    71
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    72
static void RpmbTestDfcFunction(TAny* /*aPtr*/)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    73
	{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    74
	DRpmbDevice * rpmb;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    75
	rpmb = new DRpmbDevice;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    76
	TInt r = rpmb->Open(0);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    77
	Kern::Printf("%S Early on DRpmbDevice::Open test returned %d",&KDRpmbTestBanner, r);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    78
	// ASSERT to indicate test failure if DRpmbDevice::Open() returned error
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    79
	__ASSERT_ALWAYS((r==KErrNone), Kern::Fault(__FILE__, __LINE__));
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    80
	rpmb->Close();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    81
	delete rpmb;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    82
	// run more extensive tests early on 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    83
	// note the unconventional use of a class derived from DLogicalChannelBase which is justified
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    84
	// in the current context to provide more startup test coverage
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    85
	DRpmbTest * test;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    86
	test = new DRpmbTest;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    87
	// while a call to DRpmbTest::DRpmbDeviceTests() works in this context
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    88
	// a call to DRpmbTest::RpmbStackTests() would fail as DRpmbTest::DoCreate() wouldn't be
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    89
	// called so that DRpmbTest::iStackSemPtr wouldn't get set up properly so that when it 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    90
	// was uaed an exception would be generated
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    91
	r = test->DRpmbDeviceTests();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    92
	Kern::Printf("%S Early on DRpmbTest::DRpmbDeviceTests() returned %d",&KDRpmbTestBanner, r);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    93
	// ASSERT to indicate test failure
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    94
	__ASSERT_ALWAYS((r==KErrNone), Kern::Fault(__FILE__, __LINE__));
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    95
	// not safe to delete test as  not setup conventionally DRpmbTest::DoCreate() wasn't called 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    96
	// at setup and DLogicalChannelBase::~DLogicalChannelBase__sub_object() would generate an 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    97
	// exception
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    98
	}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
    99
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   100
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   101
/********************************
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   102
 Entry point for RPMB test driver
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   103
*********************************/
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   104
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   105
DECLARE_STANDARD_EXTENSION()
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   106
    {     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   107
	TInt r = Kern::DfcQInit(&RpmbTestDfcQ,KRpmbTestPriority,&KRpmbTestThreadName);;      
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   108
	if (r != KErrNone)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   109
		return r;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   110
	DfcPtr = new TDfc(RpmbTestDfcFunction,NULL, &RpmbTestDfcQ, KMaxDfcPriority-7);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   111
	DfcPtr->Enque();     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   112
	return KErrNone;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   113
    }
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   114
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   115
DECLARE_EXTENSION_LDD()
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   116
	{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   117
	return new DRpmbTestFactory;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   118
	}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   119
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   120
/*********************************
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   121
 Implementation of DRpmbTest class
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   122
**********************************/
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   123
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   124
DRpmbTest::DRpmbTest():
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   125
// initialise parameters
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   126
	iStackSemPtr(NULL),
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   127
	iPowerSemPtr(NULL),
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   128
	iSessionEndCallBack(DRpmbTest::StackCallBack, this)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   129
	{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   130
	}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   131
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   132
DRpmbTest::~DRpmbTest()
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   133
	{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   134
	
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   135
	iBusCallBack.Remove();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   136
		
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   137
	if (iPowerSemPtr)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   138
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   139
		iPowerSemPtr->Close(NULL);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   140
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   141
	if (iStackSemPtr)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   142
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   143
		iStackSemPtr->Close(NULL);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   144
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   145
	if (iSession)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   146
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   147
		delete iSession;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   148
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   149
	}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   150
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   151
TInt DRpmbTest::DoCreate(TInt /*aUnit*/, const TDesC8* /*aInfo*/, const TVersion& /*aVer*/)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   152
	{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   153
	TInt r = KErrNone;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   154
	r = Kern::SemaphoreCreate(iStackSemPtr, _L("DRpmbStackSem"), 0);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   155
	return r;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   156
	}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   157
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   158
TInt DRpmbTest::Request(TInt aFunction, TAny* /*a1*/, TAny* /*a2*/)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   159
	{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   160
	TInt r = KErrNotSupported;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   161
	switch (aFunction)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   162
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   163
		case RTestRpmb::ERunTests:
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   164
			{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   165
			// respond to user side request 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   166
			// execute tests for RPMB kernel extension
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   167
			// run standatd tests that use the DRpmbDevice interface
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   168
            Kern::Printf("	");
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   169
            Kern::Printf("%S << START DRpmbDevice TESTS >>", &KDRpmbTestBanner);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   170
			r = DRpmbDeviceTests();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   171
            if (r != KErrNone)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   172
                {
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   173
                Kern::Printf("%S DPrmbDevice test FAILED", &KDRpmbTestBanner);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   174
                break;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   175
                }
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   176
            Kern::Printf("%S >> ALL DRpmbDevice TESTS PASSED", &KDRpmbTestBanner);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   177
			// run tests that use the MMC stack bypassing the RPMB kernel extension
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   178
            Kern::Printf("	");
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   179
	        Kern::Printf("%S << START STACK TESTS >>", &KDRpmbTestBanner);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   180
			r = RpmbStackTests();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   181
			if (r != KErrNone)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   182
			    {
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   183
                Kern::Printf("%S stack test FAILED", &KDRpmbTestBanner);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   184
                break;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   185
			    }
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   186
            Kern::Printf("%S >> ALL STACK TESTS PASSED", &KDRpmbTestBanner);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   187
			break;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   188
			}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   189
		default:
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   190
			break;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   191
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   192
	return r;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   193
	}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   194
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   195
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   196
// test RPMB using the DRpmbDevice interface
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   197
TInt DRpmbTest::DRpmbDeviceTests()
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   198
// open interface and make data write, ket write, counter read and data write accesses
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   199
	{				
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   200
	TInt size = (TInt)(2*KRpmbOneFramePacketLength);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   201
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   202
	NKern::ThreadEnterCS();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   203
	iRequest = (TUint8 *)Kern::Alloc(size);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   204
	NKern::ThreadLeaveCS();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   205
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   206
	iResponse = iRequest + KRpmbOneFramePacketLength;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   207
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   208
	TInt r = SendAccessRequestNotOpen();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   209
	
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   210
	if (r==KErrNone)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   211
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   212
		r = OpenWithBadIndex();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   213
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   214
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   215
	if (r==KErrNone)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   216
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   217
		r = MultipleOpen();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   218
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   219
	
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   220
	if (r==KErrNone)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   221
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   222
		r = iRpmb.Open(0);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   223
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   224
	
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   225
	if (r!=KErrNone)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   226
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   227
		Kern::Printf("%S DRpmbTest::DRpmbDeviceTest DRpmbDevice open error = %d", 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   228
		        &KDRpmbTestBanner, r);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   229
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   230
	else
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   231
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   232
		r  = SendAccessRequestBadParms();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   233
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   234
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   235
	if (r==KErrNone)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   236
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   237
		r = InvalidRequestId();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   238
		}   
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   239
	
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   240
	if (r==KErrNone)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   241
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   242
		r = IsKeyProgrammed();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   243
		}   
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   244
	
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   245
// Don't want to write key 'pre production' on real device as this will lock 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   246
// the system out of the RPMB partition (the key should be preprogrammed as 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   247
// part of the production process so that the system has access to the key - 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   248
// if the key has already been written it can't be written again)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   249
#ifdef RPMBTESTS_TRY_TO_WRITE_KEY
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   250
	if (r==KErrNone)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   251
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   252
		r = WriteKey();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   253
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   254
#endif
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   255
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   256
	if (r==KErrNone)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   257
		{  
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   258
		r = ReadWriteCounter();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   259
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   260
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   261
	if (r==KErrNone)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   262
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   263
		r = ReadData();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   264
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   265
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   266
	iRpmb.Close();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   267
	
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   268
	NKern::ThreadEnterCS();	
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   269
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   270
	Kern::Free(iRequest);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   271
	
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   272
	NKern::ThreadLeaveCS();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   273
	
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   274
	return r;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   275
}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   276
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   277
TInt DRpmbTest::SendAccessRequestNotOpen()
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   278
// test cases where DRpmbDevice::SendAccessRequest() is called 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   279
// 1.) before DRpmbDevice::Open() is ever called
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   280
// 2,) after DRpmbDevice::Close() has been called but before DRpmbDevice::Open() is called
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   281
	{	
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   282
	Kern::Printf("%S DRpmbDevice::SendAccessRequest not open test", &KDRpmbTestBanner);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   283
	// wrap up IO buffers in descriptors to pass across interface
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   284
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   285
	TPtr8 request(iRequest,KRpmbOneFramePacketLength,KRpmbOneFramePacketLength);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   286
	TPtr8 response(iResponse,KRpmbOneFramePacketLength,KRpmbOneFramePacketLength);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   287
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   288
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   289
	// test call DRpmbDevice::SendAccessRequest before EVER calling open
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   290
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   291
	TInt r = iRpmb.SendAccessRequest(request, response);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   292
	if (r != KErrNotReady)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   293
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   294
        Kern::Printf("%S SendAccessRequest not open test, before EVER opening, unexpected error = %d", 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   295
                &KDRpmbTestBanner, r);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   296
		return KErrGeneral;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   297
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   298
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   299
	// test open and close and call again
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   300
	r = iRpmb.Open(0);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   301
	if (r != KErrNone)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   302
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   303
        Kern::Printf("%S SendAccessRequest not open test, opening, unexpected error = %d", 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   304
                &KDRpmbTestBanner, r);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   305
		return KErrGeneral;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   306
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   307
	iRpmb.Close();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   308
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   309
	r = iRpmb.SendAccessRequest(request, response);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   310
	if (r != KErrNotReady)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   311
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   312
        Kern::Printf("%S SendAccessRequest not open test, before opening AFTER closing, unexpected error = %d", 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   313
                &KDRpmbTestBanner, r);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   314
		return KErrGeneral;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   315
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   316
	
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   317
	Kern::Printf("%S DRpmbDevice::SendAccessRequest not open test PASS", &KDRpmbTestBanner);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   318
	return KErrNone;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   319
}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   320
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   321
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   322
TInt DRpmbTest::OpenWithBadIndex()
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   323
// test case where DRpmbDevice::Open() is called with a device index of more than zero
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   324
	{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   325
	Kern::Printf("%S DRpmbDevice::Open bad index test", &KDRpmbTestBanner);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   326
	
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   327
	// test index > 0
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   328
	TInt r = iRpmb.Open(1);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   329
	if (r != KErrGeneral)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   330
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   331
        Kern::Printf("%S RpmbDevice::Open bad index test, unexpected error = %d", 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   332
                &KDRpmbTestBanner, r);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   333
		return KErrGeneral;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   334
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   335
	
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   336
	Kern::Printf("%S DRpmbDevice::Open bad index test PASS", &KDRpmbTestBanner);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   337
	return KErrNone;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   338
}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   339
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   340
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   341
TInt DRpmbTest::MultipleOpen()
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   342
// test case where DRpmbDevice::Open() is called twice with the same index parameter and
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   343
// the same instance of DRpmbDevice
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   344
// test case where DRpmbDevice::Open() is called twice with the same index parameter and
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   345
// a different instance of DRpmbDevice
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   346
	{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   347
	Kern::Printf("%S DRpmbDevice::Open use more than once test", &KDRpmbTestBanner);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   348
	
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   349
	TInt r = iRpmb.Open(0);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   350
	if (r != KErrNone)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   351
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   352
        Kern::Printf("%S RpmbDevice::Open use more than once test first open, unexpected error = %d", 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   353
                &KDRpmbTestBanner, r);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   354
		return KErrGeneral;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   355
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   356
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   357
	r = iRpmb.Open(0);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   358
	if (r != KErrNone)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   359
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   360
        Kern::Printf("%S RpmbDevice::Open use more than once test second open, unexpected error = %d", 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   361
                &KDRpmbTestBanner, r);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   362
		return KErrGeneral;	
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   363
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   364
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   365
	r = iRpmbSecondInstance.Open(0);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   366
	if (r != KErrInUse)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   367
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   368
        Kern::Printf("%S RpmbDevice::Open use more than once test third open, unexpected error = %d", 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   369
                &KDRpmbTestBanner, r);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   370
		return KErrGeneral;	
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   371
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   372
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   373
	iRpmb.Close();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   374
	iRpmbSecondInstance.Close();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   375
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   376
	Kern::Printf("%S DRpmbDevice::Open use more than once test PASS", &KDRpmbTestBanner);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   377
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   378
	return KErrNone;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   379
	}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   380
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   381
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   382
TInt DRpmbTest::SendAccessRequestBadParms()
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   383
// test cases where DRpmbDevice::SendAccessRequest is called with secriptor arguments with invalid lengths
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   384
	{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   385
	Kern::Printf("%S DRpmbDevice::SendAccessRequest bad parms test", &KDRpmbTestBanner);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   386
	
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   387
	// test both lengths !=	KRpmbOneFramePacketLength
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   388
	TBuf<KRpmbOneFramePacketLength-1> request;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   389
	TBuf<KRpmbOneFramePacketLength+1> response;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   390
	request.SetLength(KRpmbOneFramePacketLength-1);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   391
	response.SetLength(KRpmbOneFramePacketLength+1);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   392
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   393
	TInt r = iRpmb.SendAccessRequest(request, response);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   394
	if (r != KErrArgument)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   395
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   396
        Kern::Printf("%S SendAccessRequest bad parms test, both params bad, unexpected error = %d", 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   397
                &KDRpmbTestBanner, r);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   398
		return KErrGeneral;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   399
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   400
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   401
	// test request length != KRpmbOneFramePacketLength
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   402
	TBuf<KRpmbOneFramePacketLength+1> request1;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   403
	TBuf<KRpmbOneFramePacketLength> response1;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   404
	request1.SetLength(KRpmbOneFramePacketLength+1);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   405
	response1.SetLength(KRpmbOneFramePacketLength);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   406
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   407
	r = iRpmb.SendAccessRequest(request1, response1);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   408
	if (r != KErrArgument)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   409
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   410
        Kern::Printf("%S SendAccessRequest bad parms test, request param bad, unexpected error = %d", 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   411
                &KDRpmbTestBanner, r);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   412
		return KErrGeneral;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   413
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   414
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   415
	// test response length !=KRpmbOneFramePacketLength
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   416
	TBuf<KRpmbOneFramePacketLength> request2;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   417
	TBuf<KRpmbOneFramePacketLength-1> response2;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   418
	request2.SetLength(KRpmbOneFramePacketLength);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   419
	response2.SetLength(KRpmbOneFramePacketLength-1);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   420
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   421
	r = iRpmb.SendAccessRequest(request1, response1);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   422
	if (r != KErrArgument)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   423
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   424
        Kern::Printf("%S SendAccessRequest bad parms test, response param bad, unexpected error = %d", 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   425
                &KDRpmbTestBanner, r);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   426
		return KErrGeneral;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   427
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   428
	
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   429
	
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   430
	Kern::Printf("%S DRpmbDevice::SendAccessRequest bad parms test PASS", &KDRpmbTestBanner);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   431
	return KErrNone;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   432
}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   433
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   434
TInt DRpmbTest::InvalidRequestId()
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   435
// send a request with an invalid request ID to the RPMB partition
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   436
// when SendAccessRequest returns iResponse should not have reponse or result fields filled in
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   437
	{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   438
    Kern::Printf("%S invalid request ID test", &KDRpmbTestBanner);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   439
    
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   440
	// set up write request packet with blank MAC
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   441
	memset(iRequest, 0, KRpmbOneFramePacketLength);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   442
	* (iRequest + KRpmbRequestLsbOffset) = KRpmbRequestReadResultRegister + 1;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   443
   
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   444
	// wrap up IO buffers in descriptors to pass across interface
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   445
	TPtr8 request(iRequest,KRpmbOneFramePacketLength,KRpmbOneFramePacketLength);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   446
	TPtr8 response(iResponse,KRpmbOneFramePacketLength,KRpmbOneFramePacketLength);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   447
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   448
	TInt r = iRpmb.SendAccessRequest(request, response);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   449
	if (r != KErrNone)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   450
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   451
        Kern::Printf("%S invalid request ID test, send request error = %d", 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   452
                &KDRpmbTestBanner, r);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   453
		return r;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   454
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   455
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   456
	// check that response or result fields have not been set in response
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   457
	TUint resp = DecodeResponse(iResponse);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   458
	TUint result = DecodeResult(iResponse);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   459
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   460
	if (resp != 0x0006)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   461
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   462
        Kern::Printf("%S invalid request ID test, unexpected response = %d error", 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   463
                &KDRpmbTestBanner, resp);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   464
		return KErrGeneral;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   465
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   466
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   467
	if (result != 0x0000)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   468
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   469
		Kern::Printf("%S invalid request ID test, unexpected result = %d error", 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   470
                &KDRpmbTestBanner, result);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   471
		return KErrGeneral;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   472
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   473
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   474
	Kern::Printf("%S invalid requeset ID test PASS", &KDRpmbTestBanner);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   475
	return KErrNone;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   476
	}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   477
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   478
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   479
TInt DRpmbTest::IsKeyProgrammed()
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   480
// send a data write request to the RPMB partition
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   481
// because the request has a blank MAC (not authenticated) 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   482
// the partition returns operation result authentication failure if the key is programmed
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   483
// else the partition returns authentication key not programmed
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   484
	{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   485
    Kern::Printf("%S data write test", &KDRpmbTestBanner);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   486
    
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   487
	// set up write request packet with blank MAC
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   488
	memset(iRequest, 0, KRpmbOneFramePacketLength);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   489
	* (iRequest + KRpmbRequestLsbOffset) = KRpmbRequestWriteData;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   490
   
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   491
	// wrap up IO buffers in descriptors to pass across interface
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   492
	TPtr8 request(iRequest,KRpmbOneFramePacketLength,KRpmbOneFramePacketLength);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   493
	TPtr8 response(iResponse,KRpmbOneFramePacketLength,KRpmbOneFramePacketLength);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   494
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   495
	TInt r = iRpmb.SendAccessRequest(request, response);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   496
	if (r != KErrNone)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   497
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   498
        Kern::Printf("%S data write test, send request error = %d", 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   499
                &KDRpmbTestBanner, r);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   500
		return r;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   501
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   502
		
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   503
	TUint resp = DecodeResponse(iResponse);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   504
	TUint result = DecodeResult(iResponse);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   505
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   506
	if (resp != KRpmbResponseWriteData)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   507
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   508
        Kern::Printf("%S data write test, unexpected response = %d error", 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   509
                &KDRpmbTestBanner, resp);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   510
		return KErrGeneral;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   511
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   512
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   513
	if (result == KRpmbResultKeyNotProgrammed)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   514
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   515
		iKeySet = EFalse;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   516
	    Kern::Printf("%S data write test, key NOT programmed", 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   517
	            &KDRpmbTestBanner);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   518
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   519
	else if (result == KRpmbResultAuthenticationFailure)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   520
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   521
		iKeySet = ETrue;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   522
	    Kern::Printf("%S data write test, key ALREADY programmed", 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   523
	            &KDRpmbTestBanner);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   524
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   525
	else
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   526
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   527
        Kern::Printf("%S data write test, unexpected result = %d error", 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   528
                &KDRpmbTestBanner, result);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   529
		return KErrGeneral;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   530
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   531
	Kern::Printf("%S data write test PASS", &KDRpmbTestBanner);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   532
	return KErrNone;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   533
	}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   534
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   535
TInt DRpmbTest::WriteKey()
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   536
	{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   537
    Kern::Printf("%S write key test", &KDRpmbTestBanner);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   538
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   539
    // set up write key request
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   540
	memset(iRequest, 0, KRpmbOneFramePacketLength);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   541
	* (iRequest + KRpmbRequestLsbOffset) = KRpmbRequestWriteKey;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   542
    // key = 0x0101010101010101010101010101010101010101010101010101010101010101
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   543
	memset(iRequest+KRpmbKeyOffset,1, KRpmbKeyLength); 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   544
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   545
	// wrap up IO buffers in descriptors to pass across interface
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   546
	TPtr8 request(iRequest,KRpmbOneFramePacketLength,KRpmbOneFramePacketLength);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   547
	TPtr8 response(iResponse,KRpmbOneFramePacketLength,KRpmbOneFramePacketLength);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   548
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   549
	TInt r = iRpmb.SendAccessRequest(request, response);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   550
	if (r != KErrNone)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   551
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   552
        Kern::Printf("%S write key test, send request error = %d", 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   553
                &KDRpmbTestBanner, r);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   554
		return r;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   555
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   556
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   557
	TUint resp = DecodeResponse(iResponse);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   558
	TUint result = DecodeResult(iResponse);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   559
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   560
	if (resp != KRpmbResponseWriteKey)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   561
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   562
        Kern::Printf("%S write key test, unexpected repsponse = %d error", 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   563
             &KDRpmbTestBanner, resp);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   564
		return KErrGeneral;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   565
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   566
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   567
	if (iKeySet)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   568
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   569
		if (result == KRpmbResultGeneralFailure)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   570
			{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   571
            Kern::Printf("%S write key test, key ALREADY written", 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   572
                    &KDRpmbTestBanner);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   573
            Kern::Printf("%S write key test PASS", 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   574
                    &KDRpmbTestBanner);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   575
			return KErrNone;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   576
			}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   577
		else
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   578
			{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   579
            Kern::Printf("%S write key test, unexpected result = %d error", 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   580
                    &KDRpmbTestBanner, result);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   581
			return KErrGeneral; 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   582
			}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   583
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   584
	else
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   585
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   586
		if(result == KRpmbResultOk)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   587
			{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   588
            Kern::Printf("%S write key test, key JUST written", 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   589
		            &KDRpmbTestBanner);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   590
            Kern::Printf("%S write key test PASS", &KDRpmbTestBanner);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   591
			return KErrNone;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   592
			}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   593
		else
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   594
			{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   595
	       Kern::Printf("%S write key test unexpected result = %d error", 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   596
	                &KDRpmbTestBanner, result);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   597
			return KErrGeneral;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   598
			}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   599
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   600
	}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   601
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   602
TInt DRpmbTest::ReadWriteCounter()
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   603
	{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   604
    Kern::Printf("%S read write counter test", &KDRpmbTestBanner);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   605
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   606
	// set up read write counter request packet
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   607
	memset(iRequest, 0, KRpmbOneFramePacketLength);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   608
	* (iRequest + KRpmbRequestLsbOffset) = KRpmbRequestReadWriteCounter;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   609
   
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   610
	// wrap up IO buffers in descriptors to pass across interface
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   611
	TPtr8 request(iRequest,KRpmbOneFramePacketLength,KRpmbOneFramePacketLength);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   612
	TPtr8 response(iResponse,KRpmbOneFramePacketLength,KRpmbOneFramePacketLength);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   613
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   614
	TInt r = iRpmb.SendAccessRequest(request, response);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   615
	if (r!=KErrNone)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   616
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   617
        Kern::Printf("%S read write counter test, send request error = %d", 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   618
                &KDRpmbTestBanner, r);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   619
		return r;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   620
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   621
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   622
	TUint resp = DecodeResponse(iResponse);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   623
	TUint result = DecodeResult(iResponse);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   624
	TUint32 counter = DecodeCounter(iResponse);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   625
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   626
	if (resp != KRpmbResponseReadWriteCounter)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   627
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   628
        Kern::Printf("%S read write counter test, unexpected repsponse = %d error", 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   629
                &KDRpmbTestBanner, resp);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   630
		return KErrGeneral;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   631
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   632
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   633
#ifdef  RPMBTESTS_TRY_TO_WRITE_KEY
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   634
	if (result == KRpmbResultOk)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   635
#else
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   636
	if (result == KRpmbResultOk || result == KRpmbResultKeyNotProgrammed)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   637
#endif
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   638
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   639
		Kern::Printf("%S read write counter test write counter = %d", 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   640
			&KDRpmbTestBanner, counter);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   641
        Kern::Printf("%S read write counter test PASS", &KDRpmbTestBanner);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   642
		return KErrNone;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   643
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   644
	else
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   645
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   646
        Kern::Printf("%S read write counter test, unexpected result = %d error", 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   647
                &KDRpmbTestBanner, result);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   648
		return KErrGeneral;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   649
		}	
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   650
	}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   651
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   652
TInt DRpmbTest::ReadData()
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   653
	{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   654
    Kern::Printf("%S read data test", &KDRpmbTestBanner);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   655
    
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   656
	// set up read request packet
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   657
	memset(iRequest, 0, KRpmbOneFramePacketLength);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   658
	* (iRequest + KRpmbRequestLsbOffset) = KRpmbRequestReadData;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   659
   
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   660
	// wrap up IO buffers in descriptors to pass across interface
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   661
	TPtr8 request(iRequest,KRpmbOneFramePacketLength,KRpmbOneFramePacketLength);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   662
	TPtr8 response(iResponse,KRpmbOneFramePacketLength,KRpmbOneFramePacketLength);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   663
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   664
	TInt r=iRpmb.SendAccessRequest(request, response);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   665
	if (r!=KErrNone)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   666
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   667
        Kern::Printf("%S read data test, send request error = %d", 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   668
                &KDRpmbTestBanner, r);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   669
		return r;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   670
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   671
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   672
	TUint resp = DecodeResponse(iResponse);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   673
	TUint result = DecodeResult(iResponse);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   674
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   675
	if (resp != KRpmbResponseReadData)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   676
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   677
        Kern::Printf("%S read data test, unexpected repsponse = %d error", 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   678
                &KDRpmbTestBanner, resp);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   679
		return KErrGeneral;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   680
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   681
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   682
#ifdef  RPMBTESTS_TRY_TO_WRITE_KEY
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   683
	if (result == KRpmbResultOk)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   684
#else
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   685
	if (result == KRpmbResultOk || result == KRpmbResultKeyNotProgrammed)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   686
#endif
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   687
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   688
 		DisplayReadData(iResponse);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   689
        Kern::Printf("%S read data test PASS", &KDRpmbTestBanner);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   690
		return KErrNone;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   691
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   692
	else
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   693
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   694
        Kern::Printf("%S read data test, unexpected result = %d error", 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   695
             &KDRpmbTestBanner, result);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   696
        return KErrGeneral;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   697
		}		
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   698
	}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   699
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   700
TUint DRpmbTest::DecodeResponse(TUint8 * aResp)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   701
	{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   702
	return (* (aResp + KRpmbResponseLsbOffset) + ((* (aResp + KRpmbResponseMsbOffset)) << 8));
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   703
	}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   704
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   705
TUint DRpmbTest::DecodeResult(TUint8 * aResp)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   706
	{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   707
	return ((* (aResp + KRpmbResultLsbOffset) + ((* (aResp + KRpmbResultMsbOffset)) << 8)) 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   708
	        & KRpmbResultCounterExpiredMask);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   709
	}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   710
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   711
TUint32 DRpmbTest::DecodeCounter(TUint8 * aResp)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   712
	{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   713
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   714
	return ((* (aResp + KRpmbCounterByteOneOffset)) + ((* (aResp + KRpmbCounterByteTwoOffset)) << 8)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   715
		+ ((* (aResp + KRpmbCounterByteThreeOffset)) << 16) + ((* (aResp + KRpmbCounterByteFourOffset)) << 24));
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   716
	}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   717
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   718
void DRpmbTest::DisplayReadData(TUint8 * aResp)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   719
	{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   720
	TUint8 * displayPtr = aResp + KRpmbDataOffset;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   721
    Kern::Printf("%S data field:", &KDRpmbTestBanner);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   722
	for (TInt i=0; i<8; i++)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   723
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   724
		Kern::Printf("%x%x%x%x %x%x%x%x %x%x%x%x %x%x%x%x %x%x%x%x %x%x%x%x %x%x%x%x %x%x%x%x",
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   725
			* displayPtr       , * (displayPtr +  1), * (displayPtr +  2), * (displayPtr +  3),
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   726
			* (displayPtr +  4), * (displayPtr +  5), * (displayPtr +  6), * (displayPtr +  7),
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   727
			* (displayPtr +  8), * (displayPtr +  9), * (displayPtr + 10), * (displayPtr + 11),
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   728
			* (displayPtr + 12), * (displayPtr + 13), * (displayPtr + 14), * (displayPtr + 15),
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   729
			* (displayPtr + 16), * (displayPtr + 17), * (displayPtr + 18), * (displayPtr + 19),
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   730
			* (displayPtr + 20), * (displayPtr + 21), * (displayPtr + 22), * (displayPtr + 23),
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   731
			* (displayPtr + 24), * (displayPtr + 25), * (displayPtr + 26), * (displayPtr + 27),
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   732
			* (displayPtr + 28), * (displayPtr + 29), * (displayPtr + 30), * (displayPtr + 31));
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   733
		displayPtr +=32;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   734
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   735
	}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   736
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   737
void DRpmbTest::StackCallBack(TAny * aSelf)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   738
// call back from MMC stack session 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   739
    {
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   740
	// dereference any pointer
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   741
	DRpmbTest& self = *static_cast<DRpmbTest*>(aSelf);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   742
	// signal semaphore so that calling code progresses
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   743
	Kern::SemaphoreSignal(*(self.iStackSemPtr));
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   744
	}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   745
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   746
TInt DRpmbTest::RpmbStackTests()
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   747
// Test code verfies all four access types through a direct connection to the MMC protocol stack 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   748
	{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   749
	TInt r = SetupForStackTests();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   750
	if (r == KErrNone)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   751
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   752
		r = StackBadIndex();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   753
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   754
	if (r == KErrNone)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   755
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   756
		r = StackIsKeyProgrammed();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   757
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   758
// Don't want to write key 'pre production' on a real device as this will lock 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   759
// the system out of the RPMB partition (the key should be preprogrammed as 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   760
// part of the production process so that the system has access to the key - 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   761
// if the key has already been written it can't be written again)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   762
#ifdef RPMBTESTS_TRY_TO_WRITE_KEY
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   763
	if (r == KErrNone)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   764
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   765
		r = StackWriteKey();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   766
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   767
#endif
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   768
	if (r == KErrNone)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   769
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   770
		r = StackReadWriteCounter();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   771
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   772
	if (r == KErrNone)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   773
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   774
		r = StackReadData();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   775
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   776
	return r;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   777
	}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   778
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   779
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   780
TInt DRpmbTest::StackBadIndex()
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   781
// Call MMCGetExtInterface with invalid device id
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   782
//   - don't expect params to be returned
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   783
//   - expect KErrGeneral return code
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   784
	{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   785
	Kern::Printf("%S stack device index test", &KDRpmbTestBanner);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   786
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   787
	MRpmbInfo* rpmbInterface = NULL;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   788
	TRpmbDeviceParms parms;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   789
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   790
	TInt r = MMCGetExtInterface(KInterfaceRpmb, (MMCMExtInterface*&) rpmbInterface, this); //this pointer not used in the case of Rpmb
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   791
    if (r!=KErrNone)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   792
        {
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   793
        Kern::Printf("%S stack device index, MMCGetInterface returned error = %d",
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   794
             &KDRpmbTestBanner, r);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   795
        return KErrGeneral;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   796
        }
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   797
	if (rpmbInterface == NULL)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   798
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   799
		// unexpected error since MMCGetExtInterface didn't return an error
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   800
        Kern::Printf("%S stack device index, MMCGetInterface returned NULL interface pointer",
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   801
             &KDRpmbTestBanner, r);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   802
		return KErrGeneral;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   803
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   804
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   805
    else
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   806
        {
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   807
		r = rpmbInterface->RpmbInfo(1, parms);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   808
		if (r == KErrNone)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   809
			{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   810
			Kern::Printf("%S stack device index test, parmas returned for index 1 error",
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   811
				&KDRpmbTestBanner, r);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   812
			return KErrGeneral;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   813
			}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   814
		else if (r != KErrGeneral)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   815
			{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   816
			Kern::Printf("%S stack device index test, unexpected rc for index 1 error",
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   817
				&KDRpmbTestBanner, r);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   818
			return KErrGeneral;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   819
			}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   820
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   821
    Kern::Printf("%S stack device index test PASS", &KDRpmbTestBanner);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   822
	return KErrNone;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   823
}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   824
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   825
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   826
void DRpmbTest::BusCallBack(TAny* aPtr, TInt aReason, TAny* a1, TAny* a2)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   827
{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   828
    DRpmbTest* lddPtr = (DRpmbTest*)aPtr;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   829
    TPBusState busState = (TPBusState) (TInt) a1;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   830
	TInt busError = (TInt) a2;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   831
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   832
    if(aReason == TPBusCallBack::EPBusStateChange 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   833
		&& busState == EPBusOn && busError == KErrNone)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   834
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   835
		Kern::SemaphoreSignal(*(lddPtr->iPowerSemPtr));
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   836
        }
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   837
}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   838
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   839
TInt DRpmbTest::SetupForStackTests()
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   840
	{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   841
	Kern::Printf("%S setup for stack tests", &KDRpmbTestBanner);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   842
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   843
	TRpmbDeviceParms parms;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   844
	
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   845
	parms.iCardNumber = 0;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   846
	parms.iSocketPtr = NULL;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   847
	
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   848
	DMMCStack* stack = NULL;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   849
	TUint cardNumber = 0;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   850
	MRpmbInfo* rpmbInterface = NULL;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   851
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   852
    TInt r = MMCGetExtInterface(KInterfaceRpmb, (MMCMExtInterface*&) rpmbInterface, this); //this pointer not used in the case of Rpmb
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   853
    if (r!=KErrNone)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   854
        {
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   855
        Kern::Printf("%S setup for stack tests, MMCGetInterface returned error = %d",
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   856
             &KDRpmbTestBanner, r);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   857
        return KErrGeneral;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   858
        }
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   859
	if (rpmbInterface == NULL)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   860
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   861
		// unexpected error since MMCGetExtInterface didn't return an error
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   862
		return KErrGeneral;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   863
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   864
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   865
    else
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   866
        {
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   867
		r = rpmbInterface->RpmbInfo(0, parms);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   868
		if (r != KErrNone)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   869
			{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   870
			// requested index non zero or bseport not configured with RPMB capable MMC device
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   871
			return r;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   872
			}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   873
        
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   874
        cardNumber = parms.iCardNumber;        
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   875
        iSocket = parms.iSocketPtr;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   876
        if(iSocket == NULL)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   877
            {
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   878
            Kern::Printf("%S setup for stack tests, socket pointer is NULL",
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   879
                 &KDRpmbTestBanner);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   880
              return KErrNoMemory;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   881
            }
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   882
        
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   883
		// set up to be informed of changes on bus
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   884
		iBusCallBack.iFunction = BusCallBack;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   885
		iBusCallBack.iPtr=this;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   886
		iBusCallBack.SetSocket(iSocket->iSocketNumber);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   887
		iBusCallBack.Add();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   888
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   889
        // power up the stack
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   890
        // media drivers don't have to do this at this stage because already done
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   891
 		NKern::ThreadEnterCS();	
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   892
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   893
		r = Kern::SemaphoreCreate(iPowerSemPtr,_L("DpmbPowerSem"), 0);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   894
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   895
		if (r!=KErrNone)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   896
			{		
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   897
			NKern::ThreadLeaveCS();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   898
            Kern::Printf("%S sese you below thentup for stack tests, SemaphoreCreate returned %d",
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   899
                    &KDRpmbTestBanner, r);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   900
            return KErrGeneral;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   901
			}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   902
		
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   903
		r = iSocket->PowerUp();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   904
				
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   905
        if (r!=KErrNone && r!= KErrCompletion)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   906
            {
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   907
			NKern::ThreadLeaveCS();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   908
            Kern::Printf("%S setup for stack tests, PowerUp returned %d",
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   909
                    &KDRpmbTestBanner, r);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   910
            return KErrGeneral;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   911
            }
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   912
		
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   913
        if (r == KErrNone)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   914
			{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   915
            // wait for socket to power up
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   916
			Kern::SemaphoreWait(*iPowerSemPtr);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   917
			}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   918
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   919
		NKern::ThreadLeaveCS();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   920
  
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   921
        stack = iSocket->Stack(0);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   922
        if (stack == NULL)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   923
            {
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   924
            // baseport poorly configured
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   925
            Kern::Printf("%S setup for stack tests, stack pointer is NULL",
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   926
                &KDRpmbTestBanner);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   927
            return KErrGeneral;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   928
            }
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   929
        }
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   930
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   931
    TMMCard* card = stack->CardP(cardNumber);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   932
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   933
	if (card == NULL)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   934
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   935
		// baseport poorly configured
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   936
        Kern::Printf("%S setup for stack tests, card pointer is NULL",
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   937
            &KDRpmbTestBanner);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   938
		return KErrGeneral;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   939
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   940
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   941
	NKern::ThreadEnterCS();	
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   942
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   943
 	iSession = stack->AllocSession(iSessionEndCallBack);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   944
	
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   945
	NKern::ThreadLeaveCS();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   946
	
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   947
	if (iSession == NULL)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   948
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   949
		Kern::Printf("%S setup for stack tests, session pointer is NULL",
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   950
		        &KDRpmbTestBanner);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   951
		return(KErrNoMemory);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   952
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   953
 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   954
	iSession->SetStack(stack);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   955
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   956
	iSession->SetCard(card);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   957
		
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   958
	TUint32 revision = 0;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   959
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   960
	// loop until extended csd becomes available in case earlier pause wasn't long enough
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   961
	// this shouldn't need to be done
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   962
	// a reliable method not depending on delays and or polling is required
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   963
	do {
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   964
		stack = iSocket->Stack(0);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   965
		if (stack)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   966
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   967
			card = stack->CardP(cardNumber);	
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   968
			if (card)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   969
			{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   970
				revision = card->ExtendedCSD().ExtendedCSDRev();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   971
			}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   972
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   973
	} while (revision==0);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   974
		
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   975
	TUint size = card->ExtendedCSD().RpmbSize();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   976
		
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   977
	if(revision < 5 || size == 0)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   978
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   979
		Kern::Printf("%S setup for stack test, rpmb partition NOT detected", &KDRpmbTestBanner); 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   980
		return KErrNotSupported;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   981
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   982
	
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   983
	// use memory from stack
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   984
    TInt bufLen, minorBufLen;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   985
    stack->BufferInfo(iBufPtr, bufLen, minorBufLen);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   986
	// mmc media driver reserved the first KRpmbOneFramePacketLength bytes of the 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   987
	// PSL buffer to be used for RPMB requests / responses
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   988
	iBufPtr += minorBufLen;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   989
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   990
	return KErrNone;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   991
	}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   992
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   993
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   994
TInt DRpmbTest::StackIsKeyProgrammed()
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   995
// Write Data to block 0 without MACing 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   996
//   - expect not MACed error if key set 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   997
//   - expect key not prgrammed error if key not programmed
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   998
    {    
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
   999
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1000
	Kern::Printf("%S write data stack test", &KDRpmbTestBanner);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1001
        
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1002
    // set up write request packet in stack memory
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1003
    memset(iBufPtr,0,KRpmbOneFramePacketLength);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1004
    * (iBufPtr + KRpmbRequestLsbOffset) = KRpmbRequestWriteData;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1005
        
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1006
    TInt r = SendToStackAndWait();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1007
	if (r != KErrNone)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1008
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1009
		return r;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1010
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1011
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1012
	TUint response = DecodeResponse(iBufPtr); 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1013
	TUint result = DecodeResult(iBufPtr);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1014
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1015
	if (response == KRpmbResponseWriteData)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1016
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1017
		if (result == KRpmbResultAuthenticationFailure)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1018
			{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1019
            Kern::Printf("%S write data stack test, key IS written", 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1020
                    &KDRpmbTestBanner);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1021
            Kern::Printf("%S write data stack test PASS", &KDRpmbTestBanner);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1022
			iKeySet = ETrue;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1023
			return KErrNone;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1024
			}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1025
		else if (result == KRpmbResultKeyNotProgrammed)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1026
			{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1027
            Kern::Printf("%S write data stack test, key NOT written", 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1028
                    &KDRpmbTestBanner);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1029
            Kern::Printf("%S write data stack test PASS",&KDRpmbTestBanner);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1030
            iKeySet = EFalse;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1031
            return KErrNone;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1032
			}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1033
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1034
    Kern::Printf("%S write data stack test FAILED, response = %d, result = %d", 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1035
            &KDRpmbTestBanner, response, result);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1036
    return KErrGeneral;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1037
	}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1038
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1039
TInt DRpmbTest::StackWriteKey()
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1040
// Write key
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1041
//   - expect no error if key not programmed
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1042
//   - expect general error if key already programmed
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1043
    {    
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1044
    Kern::Printf("%S write key stack test", &KDRpmbTestBanner);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1045
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1046
    // set up write key request packet in stack memory
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1047
    memset(iBufPtr,0,KRpmbOneFramePacketLength);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1048
    * (iBufPtr + KRpmbRequestLsbOffset) = KRpmbRequestWriteKey;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1049
        
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1050
    TInt r = SendToStackAndWait();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1051
	if (r != KErrNone)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1052
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1053
		return r;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1054
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1055
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1056
	TUint response = DecodeResponse(iBufPtr); 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1057
	TUint result = DecodeResult(iBufPtr);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1058
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1059
	if (response == KRpmbResponseWriteKey)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1060
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1061
		if (iKeySet && result == KRpmbResultGeneralFailure)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1062
			{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1063
            Kern::Printf("%S write key stack test, key ALREADY written", 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1064
                    &KDRpmbTestBanner);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1065
            Kern::Printf("%S write key stack test PASS", &KDRpmbTestBanner);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1066
			return KErrNone;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1067
			}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1068
		else if (!iKeySet && result == KRpmbResultOk)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1069
			{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1070
            Kern::Printf("%S write key stack test, key JUST written", 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1071
                    &KDRpmbTestBanner);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1072
            Kern::Printf("%S write key stack test PASS", &KDRpmbTestBanner);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1073
			return KErrNone;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1074
			}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1075
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1076
    Kern::Printf("%S write key stack test FAILED, response = %d, result = %d", 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1077
            &KDRpmbTestBanner, response, result);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1078
    return KErrGeneral;	
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1079
	}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1080
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1081
TInt DRpmbTest::StackReadWriteCounter()
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1082
// Read Data Counter
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1083
// - expect no error
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1084
    {    
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1085
    Kern::Printf("%S read write counter stack test", &KDRpmbTestBanner);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1086
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1087
    // set up write key request packet in stack memory
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1088
    memset(iBufPtr,0,KRpmbOneFramePacketLength);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1089
    * (iBufPtr + KRpmbRequestLsbOffset) = KRpmbRequestReadWriteCounter;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1090
        
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1091
    TInt r = SendToStackAndWait();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1092
	if (r != KErrNone)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1093
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1094
		return r;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1095
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1096
	
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1097
	TUint response = DecodeResponse(iBufPtr); 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1098
	TUint result = DecodeResult(iBufPtr);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1099
	TUint32 counter = DecodeCounter(iBufPtr);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1100
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1101
#ifdef  RPMBTESTS_TRY_TO_WRITE_KEY
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1102
	if ((response == KRpmbResponseReadWriteCounter) && (result == KRpmbResultOk))
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1103
#else
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1104
	if ((response == KRpmbResponseReadWriteCounter) 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1105
		&& (result == KRpmbResultOk || result == KRpmbResultKeyNotProgrammed))
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1106
#endif
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1107
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1108
        Kern::Printf("%S read write counter stack test, counter = %d", 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1109
			&KDRpmbTestBanner, counter);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1110
        Kern::Printf("%S read write counter stack test PASS", 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1111
                &KDRpmbTestBanner);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1112
		return KErrNone;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1113
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1114
    Kern::Printf("%S read write counrter stack test FAILED, response = %d, result = %d", 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1115
            &KDRpmbTestBanner, response, result);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1116
    return KErrGeneral;	
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1117
	}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1118
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1119
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1120
TInt DRpmbTest::StackReadData()
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1121
// Read Data from block 0
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1122
// - expect no error
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1123
    {    
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1124
    Kern::Printf("%S read data stack test", &KDRpmbTestBanner);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1125
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1126
    // set up write key request packet in stack memory
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1127
    memset(iBufPtr,0,KRpmbOneFramePacketLength);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1128
    * (iBufPtr + KRpmbRequestLsbOffset) = KRpmbRequestReadData;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1129
        
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1130
    TInt r = SendToStackAndWait();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1131
	if (r != KErrNone)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1132
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1133
		return r;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1134
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1135
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1136
	TUint response = DecodeResponse(iBufPtr); 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1137
	TUint result = DecodeResult(iBufPtr);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1138
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1139
#ifdef  RPMBTESTS_TRY_TO_WRITE_KEY
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1140
	if ((response == KRpmbResponseReadData) && (result == KRpmbResultOk))
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1141
#else
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1142
	if ((response == KRpmbResponseReadData) 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1143
		&& (result == KRpmbResultOk || result == KRpmbResultKeyNotProgrammed))
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1144
#endif
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1145
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1146
		DisplayReadData(iBufPtr);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1147
        Kern::Printf("%S read data stack test PASS", &KDRpmbTestBanner);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1148
		return KErrNone;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1149
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1150
	Kern::Printf("%S read data stack test FAILED, response = %d, result = %d", 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1151
            &KDRpmbTestBanner, response, result);     
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1152
    return KErrGeneral;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1153
	}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1154
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1155
TInt DRpmbTest::SendToStackAndWait()
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1156
	{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1157
// comment out to get timings with RPMB -> RPMB switches in place of User 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1158
// Area -> RPMB switces
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1159
#define RPMBSTACKTEST_FIRST_SWITCH_TO_USER_AREA
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1160
#ifdef RPMBSTACKTEST_FIRST_SWITCH_TO_USER_AREA	
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1161
	// in normal operation it may be necessary to switch to RPMB partition
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1162
	// prior to access
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1163
	// so force the switch to occur by pre switching to the user area
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1164
    iSession->SetPartition(TExtendedCSD::ESelectUserArea);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1165
#endif
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1166
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1167
	TInt start, postswitch, end;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1168
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1169
	start = NKern::TickCount();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1170
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1171
	// lock stack
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1172
	TInt r = iSocket->InCritical();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1173
	if (r != KErrNone)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1174
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1175
		Kern::Printf("%S DRpmbTest::SendToStackAndWait, error=%d",
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1176
		        &KDRpmbTestBanner, r);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1177
		iSocket->EndInCritical();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1178
		return KErrGeneral;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1179
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1180
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1181
	 // switch to RPMB partition
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1182
    iSession->SetPartition(TExtendedCSD::ESelectRPMB);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1183
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1184
	postswitch = NKern::TickCount();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1185
	
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1186
    // set up for write exchange 
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1187
    iSession->ResetCommandStack();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1188
    iSession->FillCommandArgs(0, KRpmbOneFramePacketLength, iBufPtr, KRpmbOneFramePacketLength);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1189
    iSession->iSessionID = ECIMRpmbAccess;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1190
    iSession->Engage();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1191
    
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1192
    // wait for stack call to complete
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1193
	r = Kern::SemaphoreWait(*iStackSemPtr);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1194
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1195
	end = NKern::TickCount();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1196
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1197
	Kern::Printf("%S switch to RPMB took %d %d uS timer ticks",
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1198
		&KDRpmbTestBanner, start - postswitch, NKern::TickPeriod());
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1199
	Kern::Printf("%S RPMB ECIMRpmbAccess took %d %d uS timer ticks",
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1200
		&KDRpmbTestBanner, end - postswitch, NKern::TickPeriod());
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1201
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1202
	if (r != KErrNone)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1203
		{
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1204
		Kern::Printf("%S DRpmbTest::SendToStackAndWait, SemaphoreWait return code = %d",
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1205
		        &KDRpmbTestBanner, r);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1206
		iSocket->EndInCritical();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1207
		return KErrGeneral;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1208
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1209
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1210
	// check stack epoc return code
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1211
	r = iSession->EpocErrorCode();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1212
	if (r != KErrNone)
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1213
		{		
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1214
		Kern::Printf("%S DRpmbTest::stack epoc return code = %d",
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1215
		        &KDRpmbTestBanner, r);
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1216
		iSocket->EndInCritical();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1217
		return KErrGeneral;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1218
		}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1219
		
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1220
	// unlock stack
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1221
	iSocket->EndInCritical();
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1222
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1223
	return KErrNone;
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1224
	}
ddfd5aa0d58f 201041_01
hgs
parents:
diff changeset
  1225