os/security/cryptoservices/certificateandkeymgmt/tpkcs10/tpkcs10negatives.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
/*
sl@0
     2
* Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     3
* All rights reserved.
sl@0
     4
* This component and the accompanying materials are made available
sl@0
     5
* under the terms of the License "Eclipse Public License v1.0"
sl@0
     6
* which accompanies this distribution, and is available
sl@0
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     8
*
sl@0
     9
* Initial Contributors:
sl@0
    10
* Nokia Corporation - initial contribution.
sl@0
    11
*
sl@0
    12
* Contributors:
sl@0
    13
*
sl@0
    14
* Description: 
sl@0
    15
* Implementation of negative step classes for PKCS#10 tests.
sl@0
    16
*
sl@0
    17
*/
sl@0
    18
sl@0
    19
sl@0
    20
#include "tpkcs10negatives.h"
sl@0
    21
#include <x500dn.h>
sl@0
    22
#include <unifiedkeystore.h>
sl@0
    23
sl@0
    24
// Key label
sl@0
    25
_LIT(KKeyLabel, "new pkcs10 neg test key"); 
sl@0
    26
sl@0
    27
// Panics
sl@0
    28
_LIT(KPanicNegativeTests, "PKCS10NegativeTests");
sl@0
    29
TInt EPanicNegInvalidTestData = 1;
sl@0
    30
sl@0
    31
// String of 256 characters
sl@0
    32
_LIT8(KHugeString, "p000000001p000000002p000000003p000000004p000000005p000000006p000000007"
sl@0
    33
				   "p000000008p000000009p000000010p000000011p000000012p000000013p000000014"
sl@0
    34
				   "p000000015p000000016p000000017p000000018p000000019p000000020p000000021"
sl@0
    35
				   "p000000022p000000023p000000024p000000025p23456");
sl@0
    36
sl@0
    37
sl@0
    38
CPKCS10NegTesterActive::CPKCS10NegTesterActive(CTestExecuteLogger& aLogger) : 
sl@0
    39
	CActive(EPriorityStandard),
sl@0
    40
	iLogger(aLogger),
sl@0
    41
	iKeyImportStarted(EFalse)
sl@0
    42
	{
sl@0
    43
	CActiveScheduler::Add(this);
sl@0
    44
	User::LeaveIfError(iFs.Connect());
sl@0
    45
	}
sl@0
    46
sl@0
    47
CPKCS10NegTesterActive::~CPKCS10NegTesterActive()
sl@0
    48
	{
sl@0
    49
	Cancel();
sl@0
    50
	delete iKeyData;
sl@0
    51
	if (iKeyInfo)
sl@0
    52
		{
sl@0
    53
		iKeyInfo->Release();
sl@0
    54
 		}
sl@0
    55
 	delete iKeyStore;
sl@0
    56
	iFs.Close();
sl@0
    57
	}
sl@0
    58
sl@0
    59
CCTKeyInfo* CPKCS10NegTesterActive::doImportKeyL(CCertificateRequestStep *aStep)
sl@0
    60
{
sl@0
    61
	INFO_PRINTF1(_L("Active object tester for Key Import"));
sl@0
    62
sl@0
    63
	iStep = aStep;
sl@0
    64
	// Initialise Key store
sl@0
    65
  	iKeyStore = CUnifiedKeyStore::NewL(iFs);
sl@0
    66
	iKeyStore->Initialize(iStatus);  
sl@0
    67
sl@0
    68
	SetActive();
sl@0
    69
   	CActiveScheduler::Start();
sl@0
    70
sl@0
    71
	User::LeaveIfError(iStatus.Int());
sl@0
    72
sl@0
    73
	return iKeyInfo;
sl@0
    74
}
sl@0
    75
sl@0
    76
void CPKCS10NegTesterActive::RunL()
sl@0
    77
	{
sl@0
    78
	iError = iStatus.Int();
sl@0
    79
	if (iError != KErrNone)
sl@0
    80
		{
sl@0
    81
		CActiveScheduler::Stop();
sl@0
    82
		}
sl@0
    83
sl@0
    84
	if (iKeyImportStarted == EFalse) 
sl@0
    85
		{
sl@0
    86
  		INFO_PRINTF1(_L("Importing keys"));
sl@0
    87
		TFileName filename;
sl@0
    88
		filename = iStep->iPrivateKey;
sl@0
    89
		RFile file;
sl@0
    90
		User::LeaveIfError(file.Open(iFs, filename, EFileRead));
sl@0
    91
		CleanupClosePushL(file);
sl@0
    92
		TInt size;
sl@0
    93
		User::LeaveIfError(file.Size(size));
sl@0
    94
		iKeyData = HBufC8::NewMaxL(size);
sl@0
    95
		TPtr8 keyPtr = iKeyData->Des();
sl@0
    96
		User::LeaveIfError(file.Read(keyPtr));			
sl@0
    97
		CleanupStack::PopAndDestroy(); // file
sl@0
    98
sl@0
    99
		TTime start(0.0); 
sl@0
   100
		TTime end(0.0); 
sl@0
   101
sl@0
   102
		// Assumes only one keystore
sl@0
   103
	 	ASSERT(iKeyInfo == NULL);      
sl@0
   104
		iKeyStore->ImportKey(0, *iKeyData, EPKCS15UsageSign, KKeyLabel,0, start, end, iKeyInfo, iStatus);
sl@0
   105
  		iKeyImportStarted = ETrue;
sl@0
   106
  		SetActive();
sl@0
   107
		}
sl@0
   108
	else
sl@0
   109
		{
sl@0
   110
		// Key import done
sl@0
   111
		CActiveScheduler::Stop();
sl@0
   112
		}
sl@0
   113
	}
sl@0
   114
sl@0
   115
TInt CPKCS10NegTesterActive::RunError(TInt aError)
sl@0
   116
	{
sl@0
   117
	iError = aError;
sl@0
   118
	CActiveScheduler::Stop();
sl@0
   119
	return KErrNone;
sl@0
   120
	}
sl@0
   121
sl@0
   122
TVerdict CPKCS10NegPKCS10GenericAttr::doTestStepL()
sl@0
   123
	{
sl@0
   124
	// Set it to pass initially
sl@0
   125
	SetTestStepResult(EPass);
sl@0
   126
sl@0
   127
	//////////////////////////////////////////////////////////////////////////////
sl@0
   128
	// Test for invalid attribute for NewL
sl@0
   129
 	TInt numAttr = iArrayGenAttrOID.Count();
sl@0
   130
 	__ASSERT_ALWAYS((numAttr > 0), User::Panic(KPanicNegativeTests, EPanicNegInvalidTestData));
sl@0
   131
sl@0
   132
	HBufC8 *string = HBufC8::NewMaxLC(iArrayGenAttrValue[0].Length());
sl@0
   133
	string->Des().Copy(iArrayGenAttrValue[0]);
sl@0
   134
sl@0
   135
	CASN1EncOctetString* attrString = CASN1EncOctetString::NewLC(*string);
sl@0
   136
sl@0
   137
	CPKCS10Attribute *genericAttr = NULL;
sl@0
   138
	TRAPD(err, genericAttr = CPKCS10Attribute::NewL(iArrayGenAttrOID[0], attrString));
sl@0
   139
	CleanupStack::Pop(attrString);
sl@0
   140
	CleanupStack::PopAndDestroy(string);
sl@0
   141
sl@0
   142
	if (err != KErrNone)
sl@0
   143
		{
sl@0
   144
		delete attrString;
sl@0
   145
		}
sl@0
   146
	else
sl@0
   147
		{
sl@0
   148
		delete genericAttr;
sl@0
   149
		}
sl@0
   150
sl@0
   151
	if (err != KErrBadDescriptor)
sl@0
   152
		{
sl@0
   153
		SetTestStepResult(EFail);
sl@0
   154
		}
sl@0
   155
sl@0
   156
	//////////////////////////////////////////////////////////////////////////////
sl@0
   157
	// Test for NULL value for NewL
sl@0
   158
 	__ASSERT_ALWAYS((numAttr > 1), User::Panic(KPanicNegativeTests, EPanicNegInvalidTestData));
sl@0
   159
sl@0
   160
	string = HBufC8::NewMaxLC(iArrayGenAttrValue[1].Length());
sl@0
   161
	string->Des().Copy(iArrayGenAttrValue[1]);
sl@0
   162
sl@0
   163
	if (*string == KNullDesC8)
sl@0
   164
		{
sl@0
   165
		attrString = NULL;
sl@0
   166
		}
sl@0
   167
	else
sl@0
   168
		{
sl@0
   169
		attrString = CASN1EncOctetString::NewLC(*string);
sl@0
   170
		}
sl@0
   171
sl@0
   172
	TRAP(err, genericAttr = CPKCS10Attribute::NewL(iArrayGenAttrOID[1], attrString));
sl@0
   173
	if (attrString != NULL)
sl@0
   174
		{
sl@0
   175
		CleanupStack::Pop(attrString);
sl@0
   176
		}
sl@0
   177
	CleanupStack::PopAndDestroy(string);
sl@0
   178
sl@0
   179
	if (err != KErrNone)
sl@0
   180
		{
sl@0
   181
		delete attrString;
sl@0
   182
		}
sl@0
   183
	else
sl@0
   184
		{
sl@0
   185
		delete genericAttr;
sl@0
   186
		}
sl@0
   187
sl@0
   188
	if (err != 	KErrArgument)
sl@0
   189
		{
sl@0
   190
		SetTestStepResult(EFail);
sl@0
   191
		}
sl@0
   192
sl@0
   193
	//////////////////////////////////////////////////////////////////////////////
sl@0
   194
	// Test for NULL value for AddValueL
sl@0
   195
 	__ASSERT_ALWAYS((numAttr > 2), User::Panic(KPanicNegativeTests, EPanicNegInvalidTestData));
sl@0
   196
	string = HBufC8::NewMaxLC(iArrayGenAttrValue[2].Length());
sl@0
   197
	string->Des().Copy(iArrayGenAttrValue[2]);
sl@0
   198
sl@0
   199
	attrString = CASN1EncOctetString::NewLC(*string);
sl@0
   200
sl@0
   201
	TRAP(err, genericAttr = CPKCS10Attribute::NewL(iArrayGenAttrOID[2], attrString));
sl@0
   202
	CleanupStack::Pop(attrString);
sl@0
   203
	CleanupStack::PopAndDestroy(string);
sl@0
   204
sl@0
   205
	// Should not be an error
sl@0
   206
	if (err != KErrNone)
sl@0
   207
		{
sl@0
   208
		SetTestStepResult(EFail);
sl@0
   209
		}
sl@0
   210
sl@0
   211
	// Try to add a NULL value
sl@0
   212
	TRAP(err, genericAttr->AddValueL(NULL));
sl@0
   213
	delete genericAttr;
sl@0
   214
sl@0
   215
	// Should return an error
sl@0
   216
	if (err != KErrArgument)
sl@0
   217
		{
sl@0
   218
		SetTestStepResult(EFail);
sl@0
   219
		}
sl@0
   220
sl@0
   221
	//////////////////////////////////////////////////////////////////////////////
sl@0
   222
	// Test for invalid attribute for ResetL
sl@0
   223
	string = HBufC8::NewMaxLC(iArrayGenAttrValue[2].Length());
sl@0
   224
	string->Des().Copy(iArrayGenAttrValue[2]);
sl@0
   225
sl@0
   226
	attrString = CASN1EncOctetString::NewLC(*string);
sl@0
   227
sl@0
   228
	TRAP(err, genericAttr = CPKCS10Attribute::NewL(iArrayGenAttrOID[2], attrString));
sl@0
   229
	CleanupStack::Pop(attrString);
sl@0
   230
sl@0
   231
	// Should not be an error
sl@0
   232
	if (err != KErrNone)
sl@0
   233
		{
sl@0
   234
		SetTestStepResult(EFail);
sl@0
   235
		}
sl@0
   236
sl@0
   237
	// Try to reset with an invalid attribute OID
sl@0
   238
	attrString = CASN1EncOctetString::NewLC(*string);
sl@0
   239
	TRAP(err, genericAttr->ResetL(KNullDesC, attrString));
sl@0
   240
sl@0
   241
	if (err != KErrNone)
sl@0
   242
		{
sl@0
   243
		delete attrString;
sl@0
   244
		}
sl@0
   245
sl@0
   246
	CleanupStack::Pop(attrString);
sl@0
   247
	CleanupStack::PopAndDestroy(string);
sl@0
   248
	delete genericAttr;
sl@0
   249
sl@0
   250
	// Should return an error
sl@0
   251
	if (err != 	KErrBadDescriptor)
sl@0
   252
		{
sl@0
   253
		SetTestStepResult(EFail);
sl@0
   254
		}
sl@0
   255
sl@0
   256
	//////////////////////////////////////////////////////////////////////////////
sl@0
   257
	// Test for NULL value for ResetL
sl@0
   258
	string = HBufC8::NewMaxLC(iArrayGenAttrValue[2].Length());
sl@0
   259
	string->Des().Copy(iArrayGenAttrValue[2]);
sl@0
   260
sl@0
   261
	attrString = CASN1EncOctetString::NewLC(*string);
sl@0
   262
sl@0
   263
	TRAP(err, genericAttr = CPKCS10Attribute::NewL(iArrayGenAttrOID[2], attrString));
sl@0
   264
	CleanupStack::Pop(attrString);
sl@0
   265
	CleanupStack::PopAndDestroy(string);
sl@0
   266
sl@0
   267
	// Should not be an error
sl@0
   268
	if (err != KErrNone)
sl@0
   269
		{
sl@0
   270
		SetTestStepResult(EFail);
sl@0
   271
		}
sl@0
   272
sl@0
   273
	// Try to reset with a NULL value
sl@0
   274
	TRAP(err, genericAttr->ResetL(iArrayGenAttrOID[2], NULL));
sl@0
   275
	delete genericAttr;
sl@0
   276
sl@0
   277
	// Should return an error
sl@0
   278
	if (err != KErrArgument)
sl@0
   279
		{
sl@0
   280
		SetTestStepResult(EFail);
sl@0
   281
		}
sl@0
   282
sl@0
   283
	return TestStepResult();
sl@0
   284
	}
sl@0
   285
sl@0
   286
TVerdict CPKCS10NegPKCS9ChallengePasswordAttr::doTestStepL()
sl@0
   287
	{
sl@0
   288
	// Set it to pass initially
sl@0
   289
	SetTestStepResult(EPass);
sl@0
   290
sl@0
   291
	//////////////////////////////////////////////////////////////////////////////
sl@0
   292
	// Test for empty password for NewL
sl@0
   293
	HBufC8 *passwordString = HBufC8::NewMaxLC(iChallengePassword.Length());
sl@0
   294
	passwordString->Des().Copy(iChallengePassword);
sl@0
   295
sl@0
   296
	CPKCS9ChallengePasswordAttr *chPasswordAttr = NULL;
sl@0
   297
	TRAPD(err, chPasswordAttr = CPKCS9ChallengePasswordAttr::NewL(*passwordString));
sl@0
   298
	CleanupStack::PopAndDestroy(passwordString);
sl@0
   299
sl@0
   300
	if (err != KErrArgument)
sl@0
   301
		{
sl@0
   302
		SetTestStepResult(EFail);
sl@0
   303
		}
sl@0
   304
sl@0
   305
	//////////////////////////////////////////////////////////////////////////////
sl@0
   306
	// Test for big password for ResetL
sl@0
   307
	TRAP(err, chPasswordAttr = CPKCS9ChallengePasswordAttr::NewL(_L8("password")));
sl@0
   308
sl@0
   309
	// Should not fail
sl@0
   310
	if (err != KErrNone)
sl@0
   311
		{
sl@0
   312
		SetTestStepResult(EFail);
sl@0
   313
		}
sl@0
   314
sl@0
   315
	TRAP(err, chPasswordAttr->ResetL(KHugeString));
sl@0
   316
	delete chPasswordAttr;
sl@0
   317
sl@0
   318
	if (err != KErrArgument)
sl@0
   319
		{
sl@0
   320
		SetTestStepResult(EFail);
sl@0
   321
		}
sl@0
   322
sl@0
   323
	return TestStepResult();
sl@0
   324
	}
sl@0
   325
sl@0
   326
TVerdict CPKCS10NegPKCS9ExtensionRequestAttr::doTestStepL()
sl@0
   327
	{
sl@0
   328
	// Set it to pass initially
sl@0
   329
	SetTestStepResult(EPass);
sl@0
   330
sl@0
   331
	//////////////////////////////////////////////////////////////////////////////
sl@0
   332
	// Test for empty attribute OID for NewL
sl@0
   333
 	TInt numAttr = iArrayV3AttrOID.Count();
sl@0
   334
 	__ASSERT_ALWAYS((numAttr > 0), User::Panic(KPanicNegativeTests, EPanicNegInvalidTestData));
sl@0
   335
sl@0
   336
	CX509CertExtension* x509CertExtn = CX509CertExtension::NewL(iArrayV3AttrOID[0], iArrayV3AttrCritical[0], _L8("value"));
sl@0
   337
sl@0
   338
	CPKCS9ExtensionRequestAttr *chExtReqAttr = NULL;
sl@0
   339
	TRAPD(err, chExtReqAttr = CPKCS9ExtensionRequestAttr::NewL(*x509CertExtn));
sl@0
   340
sl@0
   341
	delete x509CertExtn;
sl@0
   342
sl@0
   343
	if (err != KErrBadDescriptor)
sl@0
   344
		{
sl@0
   345
		SetTestStepResult(EFail);
sl@0
   346
		}
sl@0
   347
sl@0
   348
	//////////////////////////////////////////////////////////////////////////////
sl@0
   349
	// Test for empty attribute OID for AddExtensionL
sl@0
   350
 	__ASSERT_ALWAYS((numAttr > 1), User::Panic(KPanicNegativeTests, EPanicNegInvalidTestData));
sl@0
   351
sl@0
   352
	x509CertExtn = CX509CertExtension::NewLC(iArrayV3AttrOID[1], iArrayV3AttrCritical[1], _L8("value"));
sl@0
   353
	chExtReqAttr = CPKCS9ExtensionRequestAttr::NewLC(*x509CertExtn);
sl@0
   354
sl@0
   355
	CX509CertExtension *x509CertExtnNew = CX509CertExtension::NewLC(iArrayV3AttrOID[0], iArrayV3AttrCritical[0], _L8("value"));
sl@0
   356
	TRAP(err, chExtReqAttr->AddExtensionL(*x509CertExtnNew));
sl@0
   357
sl@0
   358
	CleanupStack::PopAndDestroy(3, x509CertExtn);	// chExtReqAttr, x509CertExtnNew
sl@0
   359
sl@0
   360
	if (err != KErrBadDescriptor)
sl@0
   361
		{
sl@0
   362
		SetTestStepResult(EFail);
sl@0
   363
		}
sl@0
   364
sl@0
   365
	return TestStepResult();
sl@0
   366
	}
sl@0
   367
sl@0
   368
TVerdict CPKCS10NegPKCS10Attributes::doTestStepL()
sl@0
   369
	{
sl@0
   370
	// Set it to pass initially
sl@0
   371
	SetTestStepResult(EPass);
sl@0
   372
sl@0
   373
	//////////////////////////////////////////////////////////////////////////////
sl@0
   374
	// Test for NULL attribute for AddPKCSAttributeL
sl@0
   375
	CPKCS10Attributes *attrList = NULL;
sl@0
   376
	attrList = CPKCS10Attributes::NewLC();
sl@0
   377
	TRAPD(err, attrList->AddPKCSAttributeL(NULL));
sl@0
   378
	CleanupStack::PopAndDestroy(attrList);
sl@0
   379
sl@0
   380
	if (err != KErrArgument)
sl@0
   381
		{
sl@0
   382
		SetTestStepResult(EFail);
sl@0
   383
		}
sl@0
   384
sl@0
   385
	return TestStepResult();
sl@0
   386
	}
sl@0
   387
sl@0
   388
TVerdict CPKCS10NegPKCS10Request::doTestStepL()
sl@0
   389
	{
sl@0
   390
	// Set it to pass initially
sl@0
   391
	SetTestStepResult(EPass);
sl@0
   392
sl@0
   393
	//////////////////////////////////////////////////////////////////////////////
sl@0
   394
	// Test for invalid DN for NewL
sl@0
   395
	CActiveScheduler* sch = new(ELeave) CActiveScheduler;   
sl@0
   396
	CActiveScheduler::Install(sch);
sl@0
   397
sl@0
   398
	// Import the key
sl@0
   399
	CPKCS10NegTesterActive* activeObj = new (ELeave) CPKCS10NegTesterActive(Logger());
sl@0
   400
	CCTKeyInfo *keyInfo = activeObj->doImportKeyL(this);
sl@0
   401
sl@0
   402
	// Try to generate a cert req
sl@0
   403
	CX500DistinguishedName* dn = NULL;
sl@0
   404
	CPKCS10Request* req = NULL;
sl@0
   405
	TRAPD(err, req = CPKCS10Request::NewL(*dn, *keyInfo));
sl@0
   406
sl@0
   407
	if (err != KErrArgument)
sl@0
   408
		{
sl@0
   409
		SetTestStepResult(EFail);
sl@0
   410
		}
sl@0
   411
sl@0
   412
	//////////////////////////////////////////////////////////////////////////////
sl@0
   413
	// Test for EDH for SetDigestAlgL
sl@0
   414
    CArrayPtrFlat<CX520AttributeTypeAndValue>* array = new(ELeave) CArrayPtrFlat<CX520AttributeTypeAndValue>(7);
sl@0
   415
	CleanupStack::PushL(array);
sl@0
   416
	dn = CX500DistinguishedName::NewL(*array);
sl@0
   417
	CleanupStack::PushL(dn);
sl@0
   418
sl@0
   419
	req = CPKCS10Request::NewL(*dn, *keyInfo);
sl@0
   420
sl@0
   421
	TRAP(err, req->SetDigestAlgL(EDH));
sl@0
   422
sl@0
   423
	delete req;
sl@0
   424
	array->ResetAndDestroy();
sl@0
   425
	CleanupStack::PopAndDestroy(2, array); //array, dn
sl@0
   426
sl@0
   427
	if (err != KErrArgument)
sl@0
   428
		{
sl@0
   429
		SetTestStepResult(EFail);
sl@0
   430
		}
sl@0
   431
sl@0
   432
	//////////////////////////////////////////////////////////////////////////////
sl@0
   433
	// Test for NULL DN for SetDistinguishedNameL
sl@0
   434
    array = new(ELeave) CArrayPtrFlat<CX520AttributeTypeAndValue>(7);
sl@0
   435
	CleanupStack::PushL(array);
sl@0
   436
	dn = CX500DistinguishedName::NewL(*array);
sl@0
   437
	CleanupStack::PushL(dn);
sl@0
   438
sl@0
   439
	req = CPKCS10Request::NewL(*dn, *keyInfo);
sl@0
   440
sl@0
   441
	CX500DistinguishedName* nullDN = NULL;
sl@0
   442
	TRAP(err, req->SetDistinguishedNameL(*nullDN));
sl@0
   443
sl@0
   444
	delete req;
sl@0
   445
	array->ResetAndDestroy();
sl@0
   446
	CleanupStack::PopAndDestroy(2, array); //array, dn
sl@0
   447
sl@0
   448
	if (err != KErrArgument)
sl@0
   449
		{
sl@0
   450
		SetTestStepResult(EFail);
sl@0
   451
		}
sl@0
   452
sl@0
   453
	//////////////////////////////////////////////////////////////////////////////
sl@0
   454
	// Test for NULL for SetKeyInfoL
sl@0
   455
    array = new(ELeave) CArrayPtrFlat<CX520AttributeTypeAndValue>(7);
sl@0
   456
	CleanupStack::PushL(array);
sl@0
   457
	dn = CX500DistinguishedName::NewL(*array);
sl@0
   458
	CleanupStack::PushL(dn);
sl@0
   459
sl@0
   460
	req = CPKCS10Request::NewL(*dn, *keyInfo);
sl@0
   461
sl@0
   462
	CCTKeyInfo* nullKeyInfo = NULL;
sl@0
   463
	TRAP(err, req->SetKeyInfoL(*nullKeyInfo));
sl@0
   464
sl@0
   465
	delete req;
sl@0
   466
	array->ResetAndDestroy();
sl@0
   467
	CleanupStack::PopAndDestroy(2, array); //array, dn
sl@0
   468
sl@0
   469
	if (err != KErrArgument)
sl@0
   470
		{
sl@0
   471
		SetTestStepResult(EFail);
sl@0
   472
		}
sl@0
   473
sl@0
   474
	delete activeObj;		// Will release keyInfo
sl@0
   475
	delete sch;
sl@0
   476
sl@0
   477
	return TestStepResult();
sl@0
   478
	}
sl@0
   479