os/kernelhwsrv/kerneltest/e32test/property/t_security_slave.cpp
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     2
// All rights reserved.
sl@0
     3
// This component and the accompanying materials are made available
sl@0
     4
// under the terms of the License "Eclipse Public License v1.0"
sl@0
     5
// which accompanies this distribution, and is available
sl@0
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     7
//
sl@0
     8
// Initial Contributors:
sl@0
     9
// Nokia Corporation - initial contribution.
sl@0
    10
//
sl@0
    11
// Contributors:
sl@0
    12
//
sl@0
    13
// Description:
sl@0
    14
//
sl@0
    15
sl@0
    16
#include <e32test.h>
sl@0
    17
#include "t_property.h"
sl@0
    18
sl@0
    19
TSecureId TestSecureId;
sl@0
    20
TVendorId TestVendorId;
sl@0
    21
TCapability TestCaps[ECapability_Limit];
sl@0
    22
TCapability TestMissingCaps[ECapability_Limit];
sl@0
    23
sl@0
    24
TSecurityPolicy CorrectCapPolicy;
sl@0
    25
TSecurityPolicy IncorrectCapPolicy;
sl@0
    26
sl@0
    27
TUint TestPolicyCount=0;
sl@0
    28
sl@0
    29
#include <e32svr.h>
sl@0
    30
sl@0
    31
TBool MakeTestSecurityPolicy()
sl@0
    32
	{
sl@0
    33
	TCapability* c =TestCaps;
sl@0
    34
	TCapability* m =TestMissingCaps;
sl@0
    35
	TUint t=++TestPolicyCount;
sl@0
    36
	RDebug::Print(_L("Test policy %d\n"),t);
sl@0
    37
	if(t==1)
sl@0
    38
		{
sl@0
    39
		_LIT_SECURITY_POLICY_PASS(KSecurityPolicyPass);
sl@0
    40
		CorrectCapPolicy = KSecurityPolicyPass;
sl@0
    41
		_LIT_SECURITY_POLICY_FAIL(KSecurityPolicyFail);
sl@0
    42
		IncorrectCapPolicy = KSecurityPolicyFail;
sl@0
    43
		return ETrue;
sl@0
    44
		}
sl@0
    45
	t -= 1;
sl@0
    46
	if(t<7)
sl@0
    47
		{
sl@0
    48
		switch(t)
sl@0
    49
			{
sl@0
    50
		case 0:
sl@0
    51
			CorrectCapPolicy = TSecurityPolicy(c[0]);
sl@0
    52
			IncorrectCapPolicy = TSecurityPolicy(m[0]);
sl@0
    53
			break;
sl@0
    54
		case 1:
sl@0
    55
			CorrectCapPolicy = TSecurityPolicy(c[0],c[1]);
sl@0
    56
			IncorrectCapPolicy = TSecurityPolicy(m[0],c[1]);
sl@0
    57
			break;
sl@0
    58
		case 2:
sl@0
    59
			CorrectCapPolicy = TSecurityPolicy(c[0],c[1],c[2]);
sl@0
    60
			IncorrectCapPolicy = TSecurityPolicy(c[0],m[1],c[2]);
sl@0
    61
			break;
sl@0
    62
		case 3:
sl@0
    63
			CorrectCapPolicy = TSecurityPolicy(c[0],c[1],c[2],c[3]);
sl@0
    64
			IncorrectCapPolicy = TSecurityPolicy(c[0],c[1],m[2],c[3]);
sl@0
    65
			break;
sl@0
    66
		case 4:
sl@0
    67
			CorrectCapPolicy = TSecurityPolicy(c[0],c[1],c[2],c[3],c[4]);
sl@0
    68
			IncorrectCapPolicy = TSecurityPolicy(c[0],c[1],c[2],m[3],c[4]);
sl@0
    69
			break;
sl@0
    70
		case 5:
sl@0
    71
			CorrectCapPolicy = TSecurityPolicy(c[0],c[1],c[2],c[3],c[4],c[5]);
sl@0
    72
			IncorrectCapPolicy = TSecurityPolicy(c[0],c[1],c[2],c[3],m[4],c[5]);
sl@0
    73
			break;
sl@0
    74
		case 6:
sl@0
    75
			CorrectCapPolicy = TSecurityPolicy(c[0],c[1],c[2],c[3],c[4],c[5],c[6]);
sl@0
    76
			IncorrectCapPolicy = TSecurityPolicy(c[0],c[1],c[2],c[3],c[4],m[5],c[6]);
sl@0
    77
			break;
sl@0
    78
			}
sl@0
    79
		return ETrue;
sl@0
    80
		}
sl@0
    81
	t -= 7;
sl@0
    82
	if(t<4)
sl@0
    83
		{
sl@0
    84
		TSecureId id = TestSecureId;
sl@0
    85
		TSecureId id2 = TSecureId((TUint32)TestVendorId);
sl@0
    86
		switch(t)
sl@0
    87
			{
sl@0
    88
		case 0:
sl@0
    89
			CorrectCapPolicy = TSecurityPolicy(id);
sl@0
    90
			IncorrectCapPolicy = TSecurityPolicy(id2);
sl@0
    91
			break;
sl@0
    92
		case 1:
sl@0
    93
			CorrectCapPolicy = TSecurityPolicy(id,c[0]);
sl@0
    94
			IncorrectCapPolicy = TSecurityPolicy(id2,c[0]);
sl@0
    95
			break;
sl@0
    96
		case 2:
sl@0
    97
			CorrectCapPolicy = TSecurityPolicy(id,c[0],c[1]);
sl@0
    98
			IncorrectCapPolicy = TSecurityPolicy(id2,c[0],c[1]);
sl@0
    99
			break;
sl@0
   100
		case 3:
sl@0
   101
			CorrectCapPolicy = TSecurityPolicy(id,c[0],c[1],c[2]);
sl@0
   102
			IncorrectCapPolicy = TSecurityPolicy(id2,c[0],c[1],c[2]);
sl@0
   103
			break;
sl@0
   104
			}
sl@0
   105
		return ETrue;
sl@0
   106
		}
sl@0
   107
	t -= 4;
sl@0
   108
	if(t<4)
sl@0
   109
		{
sl@0
   110
		TVendorId id = TestVendorId;
sl@0
   111
		TVendorId id2 = TVendorId((TUint32)TestSecureId);
sl@0
   112
		switch(t)
sl@0
   113
			{
sl@0
   114
		case 0:
sl@0
   115
			CorrectCapPolicy = TSecurityPolicy(id);
sl@0
   116
			IncorrectCapPolicy = TSecurityPolicy(id2);
sl@0
   117
			break;
sl@0
   118
		case 1:
sl@0
   119
			CorrectCapPolicy = TSecurityPolicy(id,c[0]);
sl@0
   120
			IncorrectCapPolicy = TSecurityPolicy(id2,c[0]);
sl@0
   121
			break;
sl@0
   122
		case 2:
sl@0
   123
			CorrectCapPolicy = TSecurityPolicy(id,c[0],c[1]);
sl@0
   124
			IncorrectCapPolicy = TSecurityPolicy(id2,c[0],c[1]);
sl@0
   125
			break;
sl@0
   126
		case 3:
sl@0
   127
			CorrectCapPolicy = TSecurityPolicy(id,c[0],c[1],c[2]);
sl@0
   128
			IncorrectCapPolicy = TSecurityPolicy(id2,c[0],c[1],c[2]);
sl@0
   129
			break;
sl@0
   130
			}
sl@0
   131
		return ETrue;
sl@0
   132
		}
sl@0
   133
	t -= 4;
sl@0
   134
	TestPolicyCount = 0;
sl@0
   135
	return EFalse;
sl@0
   136
	}
sl@0
   137
sl@0
   138
_LIT(KSecurityReadCapabilityName, "RProperty Security: Read Capability Basics");
sl@0
   139
sl@0
   140
class CPropSecurityReadCapability : public CTestProgram
sl@0
   141
	{
sl@0
   142
public:
sl@0
   143
	CPropSecurityReadCapability(TUid aCategory, TUint aKey1, TUint aKey2, RProperty::TType aType) :
sl@0
   144
		CTestProgram(KSecurityReadCapabilityName), iCategory(aCategory), iKey1(aKey1), iKey2(aKey2), iType(aType)
sl@0
   145
		{
sl@0
   146
		}
sl@0
   147
sl@0
   148
	void Run(TUint aCount);
sl@0
   149
sl@0
   150
private:
sl@0
   151
	TUid				iCategory;
sl@0
   152
	TUint				iKey1;
sl@0
   153
	TUint				iKey2;
sl@0
   154
	RProperty::TType	iType;
sl@0
   155
	};
sl@0
   156
sl@0
   157
void CPropSecurityReadCapability::Run(TUint aCount)
sl@0
   158
	{
sl@0
   159
	while(MakeTestSecurityPolicy())
sl@0
   160
	for (TUint i = 0; i < aCount; ++i)
sl@0
   161
		{
sl@0
   162
		RProperty	prop1;
sl@0
   163
		RProperty	prop2;
sl@0
   164
sl@0
   165
		TInt r = prop1.Attach(iCategory, iKey1);
sl@0
   166
		TF_ERROR(r, r == KErrNone);
sl@0
   167
		r = prop2.Attach(iCategory, iKey2);
sl@0
   168
		TF_ERROR(r, r == KErrNone);
sl@0
   169
sl@0
   170
		// If the property has not been defined, the request will not complete until the property
sl@0
   171
		// is defined and published.
sl@0
   172
		// When defined if the caller does not have read capabilities the request completes
sl@0
   173
		// with KErrPermissionDenied.
sl@0
   174
		TRequestStatus status1;
sl@0
   175
		prop1.Subscribe(status1);
sl@0
   176
		TF_ERROR(status1.Int(), status1.Int() == KRequestPending);
sl@0
   177
		r = prop1.Define(iCategory, iKey1, iType, IncorrectCapPolicy, CorrectCapPolicy);
sl@0
   178
		TF_ERROR(r, r == KErrNone);
sl@0
   179
		User::WaitForRequest(status1);
sl@0
   180
		TF_ERROR(status1.Int(), status1.Int() == KErrPermissionDenied);
sl@0
   181
sl@0
   182
		TRequestStatus status2;
sl@0
   183
		prop2.Subscribe(status2);
sl@0
   184
		TF_ERROR(status2.Int(), status2.Int() == KRequestPending);
sl@0
   185
		r = prop2.Define(iCategory, iKey2, iType, CorrectCapPolicy, IncorrectCapPolicy);
sl@0
   186
		TF_ERROR(r, r == KErrNone);
sl@0
   187
		TF_ERROR(status2.Int(), status2.Int() == KRequestPending);
sl@0
   188
		prop2.Cancel();
sl@0
   189
		User::WaitForRequest(status2);
sl@0
   190
		TF_ERROR(status2.Int(), status2.Int() == KErrCancel);
sl@0
   191
sl@0
   192
		// If the Subscribe() caller does not have the read capabilities the request completes immediately
sl@0
   193
		// with KErrPermissionDenied.
sl@0
   194
		prop1.Subscribe(status1);
sl@0
   195
		User::WaitForRequest(status1);
sl@0
   196
		TF_ERROR(status1.Int(), status1.Int() == KErrPermissionDenied);
sl@0
   197
sl@0
   198
		prop2.Subscribe(status2);
sl@0
   199
		TF_ERROR(status2.Int(), status2.Int() == KRequestPending);
sl@0
   200
		prop2.Cancel();
sl@0
   201
		User::WaitForRequest(status2);
sl@0
   202
		TF_ERROR(status2.Int(), status2.Int() == KErrCancel);
sl@0
   203
sl@0
   204
		// If the caller does not have the read capabilities Get() fails with KErrPermissionDenied.
sl@0
   205
		if (iType == RProperty::EInt)
sl@0
   206
			{
sl@0
   207
			TInt value;
sl@0
   208
			r = prop1.Get(iCategory, iKey1, value);
sl@0
   209
			TF_ERROR(r, r == KErrPermissionDenied);
sl@0
   210
			r = prop2.Get(iCategory, iKey2, value);
sl@0
   211
			TF_ERROR(r, r == KErrNone);
sl@0
   212
			r = prop1.Get(value);
sl@0
   213
			TF_ERROR(r, r == KErrPermissionDenied);
sl@0
   214
			r = prop2.Get(value);
sl@0
   215
			TF_ERROR(r, r == KErrNone);
sl@0
   216
			}
sl@0
   217
		else 
sl@0
   218
			{
sl@0
   219
			TBuf<16> buf;
sl@0
   220
			TBuf8<16> buf8;
sl@0
   221
			r = prop1.Get(iCategory, iKey1, buf);
sl@0
   222
			TF_ERROR(r, r == KErrPermissionDenied);
sl@0
   223
			r = prop2.Get(iCategory, iKey2, buf);
sl@0
   224
			TF_ERROR(r, r == KErrNone);
sl@0
   225
			r = prop1.Get(iCategory, iKey1, buf8);
sl@0
   226
			TF_ERROR(r, r == KErrPermissionDenied);
sl@0
   227
			r = prop2.Get(iCategory, iKey2, buf8);
sl@0
   228
			TF_ERROR(r, r == KErrNone);
sl@0
   229
			r = prop1.Get(buf);
sl@0
   230
			TF_ERROR(r, r == KErrPermissionDenied);
sl@0
   231
			r = prop2.Get(buf);
sl@0
   232
			TF_ERROR(r, r == KErrNone);
sl@0
   233
			r = prop1.Get(buf8);
sl@0
   234
			TF_ERROR(r, r == KErrPermissionDenied);
sl@0
   235
			r = prop2.Get(buf8);
sl@0
   236
			TF_ERROR(r, r == KErrNone);
sl@0
   237
			}
sl@0
   238
sl@0
   239
		r = prop1.Delete(iCategory, iKey1);
sl@0
   240
		TF_ERROR(r, r == KErrNone);
sl@0
   241
		r = prop2.Delete(iCategory, iKey2);
sl@0
   242
		TF_ERROR(r, r == KErrNone);
sl@0
   243
		prop1.Close();
sl@0
   244
		prop2.Close();
sl@0
   245
		}
sl@0
   246
	}
sl@0
   247
sl@0
   248
_LIT(KSecurityWriteCapabilityName, "RProperty Security: Write Cpability Basics");
sl@0
   249
sl@0
   250
class CPropSecurityWriteCapability : public CTestProgram
sl@0
   251
	{
sl@0
   252
public:
sl@0
   253
	CPropSecurityWriteCapability(TUid aCategory, TUint aKey1, TUint aKey2, RProperty::TType aType) :
sl@0
   254
		CTestProgram(KSecurityWriteCapabilityName), iCategory(aCategory), iKey1(aKey1), iKey2(aKey2), iType(aType)
sl@0
   255
		{
sl@0
   256
		}
sl@0
   257
sl@0
   258
	void Run(TUint aCount);
sl@0
   259
sl@0
   260
private:
sl@0
   261
	TUid				iCategory;
sl@0
   262
	TUint				iKey1;
sl@0
   263
	TUint				iKey2;
sl@0
   264
	RProperty::TType	iType;
sl@0
   265
	};
sl@0
   266
sl@0
   267
void CPropSecurityWriteCapability::Run(TUint aCount)
sl@0
   268
	{
sl@0
   269
	while(MakeTestSecurityPolicy())
sl@0
   270
	for (TUint i = 0; i < aCount; ++i)
sl@0
   271
		{
sl@0
   272
		RProperty	prop1;
sl@0
   273
		RProperty	prop2;
sl@0
   274
sl@0
   275
		TInt r = prop1.Attach(iCategory, iKey1);
sl@0
   276
		TF_ERROR(r, r == KErrNone);
sl@0
   277
		r = prop2.Attach(iCategory, iKey2);
sl@0
   278
		TF_ERROR(r, r == KErrNone);
sl@0
   279
sl@0
   280
		r = prop1.Define(iCategory, iKey1, iType, CorrectCapPolicy, IncorrectCapPolicy);
sl@0
   281
		TF_ERROR(r, r == KErrNone);
sl@0
   282
		r = prop2.Define(iCategory, iKey2, iType, IncorrectCapPolicy, CorrectCapPolicy);
sl@0
   283
		TF_ERROR(r, r == KErrNone);
sl@0
   284
sl@0
   285
		// If the caller does not have the write capabilities Set() fails with KErrPermissionDenied.
sl@0
   286
		if (iType == RProperty::EInt)
sl@0
   287
			{
sl@0
   288
			TInt value = 1;
sl@0
   289
			r = prop1.Set(iCategory, iKey1, value);
sl@0
   290
			TF_ERROR(r, r == KErrPermissionDenied);
sl@0
   291
			r = prop2.Set(iCategory, iKey2, value);
sl@0
   292
			TF_ERROR(r, r == KErrNone);
sl@0
   293
			r = prop1.Set(value);
sl@0
   294
			TF_ERROR(r, r == KErrPermissionDenied);
sl@0
   295
			r = prop2.Set(value);
sl@0
   296
			TF_ERROR(r, r == KErrNone);
sl@0
   297
			}
sl@0
   298
		else 
sl@0
   299
			{
sl@0
   300
			TBuf<16> buf(_L("Foo"));
sl@0
   301
			TBuf8<16> buf8((TUint8*) "Foo");
sl@0
   302
			r = prop1.Set(iCategory, iKey1, buf);
sl@0
   303
			TF_ERROR(r, r == KErrPermissionDenied);
sl@0
   304
			r = prop2.Set(iCategory, iKey2, buf);
sl@0
   305
			TF_ERROR(r, r == KErrNone);
sl@0
   306
			r = prop1.Set(iCategory, iKey1, buf8);
sl@0
   307
			TF_ERROR(r, r == KErrPermissionDenied);
sl@0
   308
			r = prop2.Set(iCategory, iKey2, buf8);
sl@0
   309
			TF_ERROR(r, r == KErrNone);
sl@0
   310
			r = prop1.Set(buf);
sl@0
   311
			TF_ERROR(r, r == KErrPermissionDenied);
sl@0
   312
			r = prop2.Set(buf);
sl@0
   313
			TF_ERROR(r, r == KErrNone);
sl@0
   314
			r = prop1.Set(buf8);
sl@0
   315
			TF_ERROR(r, r == KErrPermissionDenied);
sl@0
   316
			r = prop2.Set(buf8);
sl@0
   317
			TF_ERROR(r, r == KErrNone);
sl@0
   318
			}
sl@0
   319
		
sl@0
   320
		r = prop1.Delete(iCategory, iKey1);
sl@0
   321
		TF_ERROR(r, r == KErrNone);
sl@0
   322
		r = prop2.Delete(iCategory, iKey2);
sl@0
   323
		TF_ERROR(r, r == KErrNone);
sl@0
   324
		prop1.Close();
sl@0
   325
		prop2.Close();
sl@0
   326
		}
sl@0
   327
	}
sl@0
   328
sl@0
   329
GLDEF_C TInt E32Main()
sl@0
   330
	{
sl@0
   331
sl@0
   332
	TSecurityInfo info;
sl@0
   333
	info.Set(RProcess());
sl@0
   334
	TestSecureId = info.iSecureId;
sl@0
   335
	TestVendorId = info.iVendorId;
sl@0
   336
	{
sl@0
   337
	TInt c=0;
sl@0
   338
	TInt m=0;
sl@0
   339
	for(TInt i=0; i<ECapability_Limit; i++)
sl@0
   340
		{
sl@0
   341
		if(info.iCaps.HasCapability((TCapability)i))
sl@0
   342
			TestCaps[c++] = (TCapability)i;
sl@0
   343
		else
sl@0
   344
			TestMissingCaps[m++] = (TCapability)i;
sl@0
   345
		}
sl@0
   346
	__ASSERT_ALWAYS(c>=7,User::Panic(_L("not enough caps"), 1));
sl@0
   347
	__ASSERT_ALWAYS(m>=6,User::Panic(_L("missing caps <6"), 1));
sl@0
   348
	}
sl@0
   349
		
sl@0
   350
	TInt len = User::CommandLineLength();
sl@0
   351
	__ASSERT_ALWAYS(len, User::Panic(_L("t_prop_sec: bad args"), 0));
sl@0
   352
sl@0
   353
	// Get arguments for the command line
sl@0
   354
	TInt size = len * sizeof(TUint16);
sl@0
   355
	HBufC8* hb = HBufC8::NewMax(size);
sl@0
   356
	__ASSERT_ALWAYS(hb, User::Panic(_L("t_prop_sec: no memory"), 0));
sl@0
   357
	TPtr cmd((TUint16*) hb->Ptr(), len);
sl@0
   358
	User::CommandLine(cmd);
sl@0
   359
	CPropSecurity::TArgs* args = (CPropSecurity::TArgs*) hb->Ptr();	
sl@0
   360
sl@0
   361
	CTestProgram::Start();
sl@0
   362
sl@0
   363
	CTestProgram* progs[] = 
sl@0
   364
		{ 
sl@0
   365
		new CPropSecurityReadCapability(args->iCategory, args->iSlaveKeySlot + 0, args->iSlaveKeySlot + 1, 
sl@0
   366
										RProperty::EInt),
sl@0
   367
		new CPropSecurityReadCapability(args->iCategory, args->iSlaveKeySlot + 2, args->iSlaveKeySlot + 3, 
sl@0
   368
										RProperty::EByteArray),
sl@0
   369
		new CPropSecurityWriteCapability(args->iCategory, args->iSlaveKeySlot + 4, args->iSlaveKeySlot + 5, 
sl@0
   370
										RProperty::EInt),
sl@0
   371
		new CPropSecurityWriteCapability(args->iCategory, args->iSlaveKeySlot + 6, args->iSlaveKeySlot + 7, 
sl@0
   372
										RProperty::EByteArray),
sl@0
   373
		NULL 
sl@0
   374
		};
sl@0
   375
sl@0
   376
	TInt i;
sl@0
   377
	TInt n = (sizeof(progs)/sizeof(*progs)) - 1;
sl@0
   378
	for (i = 0; i < n; ++i)
sl@0
   379
		{
sl@0
   380
		__ASSERT_ALWAYS(progs[i], User::Panic(_L("t_property: no memory"), 0));
sl@0
   381
		}
sl@0
   382
	
sl@0
   383
	CTestProgram::LaunchGroup(progs, 2);
sl@0
   384
sl@0
   385
	for (i = 0; i < n; ++i)
sl@0
   386
		{
sl@0
   387
		delete progs[i];
sl@0
   388
		}
sl@0
   389
sl@0
   390
	CTestProgram::End();
sl@0
   391
sl@0
   392
	return KErrNone;
sl@0
   393
	}