os/security/cryptoservices/certificateandkeymgmt/tpkcs10/tpkcs10minortests.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.
     1 /*
     2 * Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
     3 * All rights reserved.
     4 * This component and the accompanying materials are made available
     5 * under the terms of the License "Eclipse Public License v1.0"
     6 * which accompanies this distribution, and is available
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
     8 *
     9 * Initial Contributors:
    10 * Nokia Corporation - initial contribution.
    11 *
    12 * Contributors:
    13 *
    14 * Description: 
    15 * Implementation of reuse test cases
    16 *
    17 */
    18 
    19 
    20 #include "tpkcs10minortests.h"
    21 
    22 _LIT(KKeyLabel, "new pkcs10 test key"); 
    23 
    24 // Panics
    25 _LIT(KPanicReuseTests, "PKCS10ReuseTests");
    26 TInt EPanicInvalidTestData = 1;
    27 
    28 void CPKCS10ReuseAttributeStep::doTestL()
    29 	{
    30 	// Set it to pass initially
    31 	SetTestStepResult(EPass);
    32 
    33 	//////////////////////////////////////////////////////////////////////////////
    34 	// Test for reuse case of CPKCS10Attribute class
    35  	TInt numAttr = iArrayGenAttrOID.Count();
    36  	__ASSERT_ALWAYS((numAttr > 0), User::Panic(KPanicReuseTests, EPanicInvalidTestData));
    37 
    38 	HBufC8 *string = HBufC8::NewMaxLC(iArrayGenAttrValue[0].Length());
    39 	string->Des().Copy(iArrayGenAttrValue[0]);
    40 
    41 	CASN1EncOctetString* attrString1 = CASN1EncOctetString::NewLC(*string);
    42 
    43 	CPKCS10Attribute *genericAttr = CPKCS10Attribute::NewLC(iArrayGenAttrOID[0], attrString1);
    44 
    45 	// Get the encoding
    46 	CASN1EncBase* attrEncoding1 = genericAttr->GetEncodingLC();
    47 
    48 	// Reset and reuse the class
    49 	CASN1EncOctetString* attrString2 = CASN1EncOctetString::NewLC(*string);
    50 	genericAttr->ResetL(iArrayGenAttrOID[0], attrString2);
    51 	CleanupStack::Pop(attrString2);
    52 	CASN1EncBase* attrEncoding2 = genericAttr->GetEncodingLC();
    53 
    54 	// Compare the encodings
    55 	TBool result = IsMatchingEncodingL(attrEncoding1, attrEncoding2);
    56 
    57 	CleanupStack::PopAndDestroy(3, genericAttr);	// attrEncoding1, attrEncoding2
    58 	CleanupStack::Pop(attrString1);
    59 	CleanupStack::PopAndDestroy(string);
    60 
    61 	if (result == EFalse)
    62 		{
    63 		SetTestStepResult(EFail);
    64 		}
    65 	}
    66 
    67 void CPKCS10ReuseChallengePasswordAttrStep::doTestL()
    68 	{
    69 	// Set it to pass initially
    70 	SetTestStepResult(EPass);
    71 
    72 	//////////////////////////////////////////////////////////////////////////////
    73 	// Test for reuse case of CPKCS9ChallengePasswordAttr class
    74 	HBufC8 *passwordString = HBufC8::NewMaxLC(iChallengePassword.Length());
    75 	passwordString->Des().Copy(iChallengePassword);
    76 
    77 	CPKCS9ChallengePasswordAttr *chPasswordAttr = CPKCS9ChallengePasswordAttr::NewLC(*passwordString);
    78 
    79 	// Get the encoding
    80 	CASN1EncBase* attrEncoding1 = chPasswordAttr->GetEncodingLC();
    81 
    82 	// Reset and reuse the class
    83 	chPasswordAttr->ResetL(*passwordString);
    84 	CASN1EncBase* attrEncoding2 = chPasswordAttr->GetEncodingLC();
    85 
    86 	// Compare the encodings
    87 	TBool result = IsMatchingEncodingL(attrEncoding1, attrEncoding2);
    88 
    89 	CleanupStack::PopAndDestroy(4, passwordString);	// chPasswordAttr, attrEncoding1, attrEncoding2
    90 
    91 	if (result == EFalse)
    92 		{
    93 		SetTestStepResult(EFail);
    94 		}
    95 	}
    96 
    97 void CPKCS10ReuseExtensionAttrStep::doTestL()
    98 	{
    99 	// Set it to pass initially
   100 	SetTestStepResult(EPass);
   101 
   102 	//////////////////////////////////////////////////////////////////////////////
   103 	// Test for reuse case of CPKCS10Attribute class
   104 	HBufC8 *extValue1 = HBufC8::NewMaxLC(iArrayV3AttrValue[0].Length());
   105 	extValue1->Des().Copy(iArrayV3AttrValue[0]);
   106 	CX509CertExtension *v3ExtAttr1 = CX509CertExtension::NewLC(iArrayV3AttrOID[0], 
   107 												 iArrayV3AttrCritical[0],
   108 												 *extValue1);
   109 
   110 	HBufC8 *extValue2 = HBufC8::NewMaxLC(iArrayV3AttrValue[1].Length());
   111 	extValue2->Des().Copy(iArrayV3AttrValue[1]);
   112 	CX509CertExtension *v3ExtAttr2 = CX509CertExtension::NewLC(iArrayV3AttrOID[1], 
   113 												 iArrayV3AttrCritical[1],
   114 												 *extValue2);
   115 
   116 	CPKCS9ExtensionRequestAttr *extReqAttr = CPKCS9ExtensionRequestAttr::NewLC(*v3ExtAttr1);
   117 	extReqAttr->AddExtensionL(*v3ExtAttr2);
   118 
   119 	// Get the encoding
   120 	CASN1EncBase* attrEncoding1 = extReqAttr->GetEncodingLC();
   121 
   122 	// Reset and reuse the class
   123 	extReqAttr->ResetL(*v3ExtAttr1);
   124 	extReqAttr->AddExtensionL(*v3ExtAttr2);
   125 	CASN1EncBase* attrEncoding2 = extReqAttr->GetEncodingLC();
   126 
   127 	// Compare the encodings
   128 	TBool result = IsMatchingEncodingL(attrEncoding1, attrEncoding2);
   129 
   130 	CleanupStack::PopAndDestroy(7, extValue1);	// v3ExtAttr1, extValue2, v3ExtAttr2, extReqAttr, attrEncoding1, attrEncoding2
   131 
   132 	if (result == EFalse)
   133 		{
   134 		SetTestStepResult(EFail);
   135 		}
   136 	}
   137 	
   138 CPKCS10TesterActiveCancelRequestA::CPKCS10TesterActiveCancelRequestA( CTestExecuteLogger& aLogger ) : 
   139    CPKCS10TesterActive( aLogger )
   140 	{
   141 	}
   142 	
   143 void CPKCS10CancelRequestAStep::doTestL()
   144 {
   145     
   146     iSched=new(ELeave) CActiveScheduler; 
   147     CleanupStack::PushL(iSched);  
   148 	CActiveScheduler::Install(iSched);
   149 	
   150 	iActiveObjTest = new (ELeave) CPKCS10TesterActiveCancelRequestA(Logger());
   151 	CleanupStack::PushL(iActiveObjTest);
   152 
   153 	if (iActiveObjTest->doActiveCertRequestL(this) != EPass)
   154 	 {
   155 	 	SetTestStepResult(EFail);
   156 	 }
   157 	 
   158 	 CleanupStack::PopAndDestroy(iActiveObjTest);
   159 	 iActiveObjTest = NULL;
   160 	 CleanupStack::PopAndDestroy(iSched);
   161 	 iSched=NULL;
   162 	 
   163  }
   164 
   165 	
   166 TVerdict CPKCS10TesterActiveCancelRequestA::doActiveCertRequestL(CCertificateRequestStep* aStep)
   167 	{
   168 	
   169 	iTestSuccess= EFail;
   170 	INFO_PRINTF1(_L("Active tester for Cert Request started. "));
   171 	iStepPointer = aStep;
   172 		
   173     DeleteAllKeysL();
   174 	
   175     INFO_PRINTF1(_L("initialising keystore"));
   176     
   177 	// Initialise Key store.
   178   	iKeyStore = CUnifiedKeyStore::NewL(iFs);
   179   	CleanupStack::PushL(iKeyStore); 
   180   	iKeyStore->Initialize(iStatus);  
   181 	iState = EInitKeyStore; 
   182 	SetActive();
   183    	CActiveScheduler::Start();
   184    	
   185    	// After encoding was produced it checks correctness
   186     if(iRunError!=KErrCancel)
   187      {
   188 	     iTestSuccess= EFail;
   189 	 }
   190 	 else
   191 	 {
   192 	 	iTestSuccess= EPass;
   193 	 }
   194   	
   195    	CleanupStack::Pop(iKeyStore);  
   196     return iTestSuccess;
   197 }
   198 
   199 void CPKCS10TesterActiveCancelRequestA::RunL()
   200 {
   201 	
   202 	iRunError =KErrNone;
   203 	
   204  	User::LeaveIfError(iStatus.Int());
   205    
   206 	switch(iState)
   207 		{
   208 		
   209 		case EDeleteAllInit:
   210 			INFO_PRINTF1(_L("  listing existing keys\n"));
   211 			iKeyStore->List(iKeys, iKeyFilter, iStatus);
   212 			iState = EDeleteAllDelete;
   213 			SetActive();
   214 			break;
   215 			
   216 		case EDeleteAllDelete:
   217 			if (iKeys.Count() == 0)
   218 				{
   219 				// key log is empty
   220 				iKeys.Close();
   221 				CActiveScheduler::Stop();
   222 				break;
   223 				}
   224 			
   225 			INFO_PRINTF1(_L("  deleting key\n"));
   226 			iKeyStore->DeleteKey(*iKeys[0], iStatus);
   227 			iState = EDeleteAllDelete;
   228 			SetActive();
   229 			iKeys[0]->Release();
   230 			iKeys.Remove(0);
   231 			break;
   232 		
   233 		case EInitKeyStore:
   234 			{
   235 	  		INFO_PRINTF1(_L("Importing keys"));
   236  			TFileName filename;
   237  			filename = iStepPointer->iPrivateKey;
   238 			RFile file;
   239 			User::LeaveIfError(file.Open(iFs,filename,EFileRead));
   240 			CleanupClosePushL(file);
   241 			TInt size;
   242 			User::LeaveIfError(file.Size(size));
   243 			iKeyData = HBufC8::NewMaxL(size);
   244 			TPtr8 keyPtr = iKeyData->Des();
   245 			User::LeaveIfError(file.Read(keyPtr));			
   246 			CleanupStack::PopAndDestroy(); // file
   247 
   248 			TTime start(0.0); 
   249 			TTime end(0.0); 
   250 			
   251 			// Assumes only one keystore
   252 			// Check parameters!
   253 		 	ASSERT(iKeyInfo == NULL);      
   254 			iKeyStore->ImportKey(0, *(iKeyData), EPKCS15UsageSign, KKeyLabel,0, start, end,iKeyInfo, iStatus);
   255 	  		iState = EImportKey;
   256 	  		SetActive();
   257 			break;
   258 			}
   259 	  	case EImportKey:
   260 			{
   261 			INFO_PRINTF1(_L("Setting security policy for new stored key"));
   262 			TSecureId secureId(0x101f7784); // Application secure ID 
   263 			TSecurityPolicy securePolicy(secureId,ECapabilityReadUserData);
   264 			iKeyStore->SetUsePolicy(iKeyInfo->Handle(),securePolicy,iStatus);
   265 			iState = EKeyPolicy;
   266  			SetActive();
   267  			break;
   268 		   	}
   269 		case EKeyPolicy:
   270 			{
   271 			iAttrCollection=CPKCS10Attributes::NewL();
   272  			CleanupStack::PushL(iAttrCollection); 
   273 			INFO_PRINTF1(_L("Adding generic attributes"));		
   274  			AddGenericAttributesL();
   275  			INFO_PRINTF1(_L("Adding Challenge password"));
   276  			AddChallengePasswordL();
   277  			INFO_PRINTF1(_L("Adding V3 extensions"));
   278  			AddV3ExtensionsL();
   279  			INFO_PRINTF1(_L("Generating distinguished name"));
   280  			iDN=MakeDistinguishedNameL();
   281  			CleanupStack::PushL(iDN);
   282    	 		INFO_PRINTF1(_L("Generating cert request"));
   283    	 		iCertRequest=CPKCS10Request::NewL(*iDN,*iKeyInfo,iAttrCollection);
   284      		CleanupStack::PushL(iCertRequest);
   285      		INFO_PRINTF1(_L("Setting digest algorithm"));
   286 			TAlgorithmId digestAlgo=iStepPointer->ConvertNameToDigestId(iStepPointer->iDigestAlg);
   287 			iCertRequest->SetDigestAlgL(digestAlgo);
   288  			INFO_PRINTF1(_L("Requesting cert request encoding"));
   289  	  		
   290  	  		// Clean up
   291  	  		CleanupStack::Pop(iCertRequest);
   292  			CleanupStack::Pop(iDN);
   293     	 	CleanupStack::Pop(iAttrCollection);
   294     	  	iAttrCollection=NULL;  
   295 			iOutputASN1Encoding=NULL;
   296 			iCertRequest->CreateEncoding(iOutputASN1Encoding,iStatus);
   297 			iState=EGenerateCertRequest; 
   298 			SetActive();
   299 			
   300 			iCertRequest->Cancel();
   301 		
   302 	  		break;	
   303 			}
   304 		default:
   305 			{
   306 		  	INFO_PRINTF1(_L("Cert Request Active tester: State corrupted."));
   307 			User::Leave(KErrCorrupt);
   308 			}
   309  		} 
   310  		
   311    	return; 
   312 }