First public contribution.
2 * Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies).
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".
9 * Initial Contributors:
10 * Nokia Corporation - initial contribution.
19 #include "tactionvalidate.h"
20 #include "t_inputextra.h"
22 _LIT(KChainStart, "<chain>");
23 _LIT(KChainEnd, "</chain>");
24 _LIT(KIOStart, "<io>");
25 _LIT(KIOEnd, "</io>");
26 _LIT(KCertPath, "\\pkixtestdata\\");
28 CActionValidate::~CActionValidate()
32 iPolicies->ResetAndDestroy();
37 delete iValidationResult;
46 CActionValidate::CActionValidate(RFs& aFs,
47 CConsoleBase& aConsole,
49 : CTestAction(aConsole, aOut), iFs(aFs)
54 void CActionValidate::ConstructL(const TTestActionSpec& aTestActionSpec)
56 CTestAction::ConstructL(aTestActionSpec);
57 HBufC* aBody = HBufC::NewLC(aTestActionSpec.iActionBody.Length());
58 aBody->Des().Copy(aTestActionSpec.iActionBody);
61 TPtrC chainBuf = Input::ParseElement(*aBody, KChainStart, KChainEnd, pos, err);
62 iTestChain = CTestChain::NewL(chainBuf);
63 if (!AddParametersL(*aBody, pos))
65 // There must be at least one IO thing
66 User::Leave(KErrNotFound);
68 while(AddParametersL(*aBody, pos))
72 iValidationResult = CPKIXValidationResult::NewL();
73 TDriveUnit sysDrive (RFs::GetSystemDrive());
74 TDriveName driveName(sysDrive.Name());
75 iCertPath.Copy(driveName);
76 iCertPath.Append(KCertPath);
78 CleanupStack::PopAndDestroy(aBody);
81 void CActionValidate::PerformAction(TRequestStatus& aStatus)
85 case EDoValidateTestStart:
87 __ASSERT_DEBUG(!iChain, User::Panic(_L("CPKIXCertTest"), 1));
88 TRAPD(err, CreateChainL());
89 iState = EDoValidateTestValidate;
90 TRequestStatus* status = &aStatus;
91 User::RequestComplete(status, err);
95 case EDoValidateTestValidate:
97 // 1) write the overall result we expect
99 iOut.writeString(_L("Expected result = "));
100 iOut.writeString(iTestIO->iError);
103 // 2) now do the validation
105 iTime.UniversalTime();
107 if (iTestIO->iPolicyInput->Count() > 0)
109 __ASSERT_DEBUG(!iPolicies, User::Panic(_L("CPKIXCertTest"), 1));
110 __ASSERT_DEBUG(iChain, User::Panic(_L("CPKIXCertTest"), 1));
112 iPolicies = new (ELeave) CArrayPtrFlat<HBufC> (1);
113 TInt count = iTestIO->iPolicyInput->Count();
114 for (TInt i = 0; i < count; i++)
116 TPtrC policy = iTestIO->iPolicyInput->MdcaPoint(i);
117 HBufC* pBuf = policy.AllocL();
118 CleanupStack::PushL(pBuf);
119 iPolicies->AppendL(pBuf);
123 iChain->ValidateL(*iValidationResult, iTime, *iPolicies, aStatus);
127 iChain->ValidateL(*iValidationResult, iTime, aStatus);
129 iState = EDoValidateTestValidated;
133 case EDoValidateTestValidated:
135 // 3) write the overall result
137 iOut.writeString(_L("Actual result = "));
138 CCertUtils::WriteError(iValidationResult->Error().iReason, iOut);
139 TBuf<128> iActualResult = CCertUtils::MapError(iValidationResult->Error().iReason);
143 // 4) write the policy info
144 TBool checkingPolicies =
145 ((iTestIO->iIPoliciesSet) || (iTestIO->iOPoliciesSet));
146 if (checkingPolicies)
148 if (iTestIO->iIPoliciesSet)
150 // 4.1) policies we supplied
152 iOut.writeString(_L("Supplied policy set: "));
154 WritePolicies(*(iTestIO->iPolicyInput));
156 if (iTestIO->iOPoliciesSet)
158 // 4.2) policies we expect
160 iOut.writeString(_L("Expected user-constrained policy set: "));
162 WritePolicies(*(iTestIO->iExpectedPolicyOutput));
165 // 4.3) policies we collected
167 iOut.writeString(_L("Actual user-constrained policy set: "));
169 const CArrayPtrFlat<CX509CertPolicyInfo>& policies = iValidationResult->Policies();
170 TInt actualPolicyCount = policies.Count();
171 for (TInt j = 0; j < actualPolicyCount; j++)
174 iOut.writeString(policies.At(j)->Id());
179 //check expected user-constrained policy set == actual user-constrained policy set
180 TBool policyOutputCorrect = ETrue;
181 CDesCArray* expectedPolicies = iTestIO->iExpectedPolicyOutput;
182 TInt expectedPolicyCount = expectedPolicies->MdcaCount();
183 if (expectedPolicyCount == actualPolicyCount)
185 for (TInt k = 0; k < expectedPolicyCount; k++)
187 TPtrC expectedPolicy = expectedPolicies->MdcaPoint(k);
188 TBool policyFound = EFalse;
189 for (TInt l = 0; l < actualPolicyCount; l++)
191 TPtrC actualPolicy = policies.At(l)->Id();
192 if (actualPolicy == expectedPolicy)
200 policyOutputCorrect = EFalse;
206 policyOutputCorrect = EFalse;
208 iResult = (iTestIO->iError == iActualResult) && (policyOutputCorrect);
210 else //! checking policies
212 iResult = (iTestIO->iError == iActualResult);
214 iState = EDoValidateTestFinished;
217 iPolicies->ResetAndDestroy();
221 TRequestStatus* status = &aStatus;
222 User::RequestComplete(status, KErrNone);
226 case EDoValidateTestFinished:
228 __ASSERT_DEBUG(!iPolicies, User::Panic(_L("CPKIXCertTest"), 1));
231 iState = ERemoveCertsAfterTest;
232 iActionState = EPostrequisite;
233 TRequestStatus* status = &aStatus;
234 User::RequestComplete(status, KErrNone);
242 TBool CActionValidate::TestResult(TInt /*aError*/)
247 void CActionValidate::PerformCancel()
253 void CActionValidate::AfterOOMFailure()
257 iPolicies->ResetAndDestroy();
263 void CActionValidate::Reset()
265 iState = EDoValidateTestStart;
268 iPolicies->ResetAndDestroy();
276 void CActionValidate::DoReportAction()
278 iConsole.Printf(_L("u"));
281 void CActionValidate::DoCheckResult(TInt /*aError*/)
285 TBool CActionValidate::AddParametersL(const TDesC& aBuf, TInt& aPos)
287 TPtrC ioBuf = Input::ParseElement(aBuf, KIOStart, KIOEnd, aPos);
288 if (ioBuf != KNullDesC)
290 iTestIO = CTestParameters::NewL(ioBuf);
296 void CActionValidate::WritePolicies(const CDesCArray& aPolicySet)
298 TInt count = aPolicySet.Count();
299 for (TInt i = 0; i < count; i++)
302 iOut.writeString(aPolicySet.MdcaPoint(i));
308 validate using the cert store as a source of root certificates
311 CTestAction* CActionValidateWithStore::NewL(RFs& aFs, CConsoleBase& aConsole,
312 Output& aOut, const TTestActionSpec& aTestActionSpec)
314 CTestAction* self = CActionValidateWithStore::NewLC(aFs, aConsole,
315 aOut, aTestActionSpec);
316 CleanupStack::Pop(self);
320 CTestAction* CActionValidateWithStore::NewLC(RFs& aFs, CConsoleBase& aConsole,
321 Output& aOut, const TTestActionSpec& aTestActionSpec)
323 CActionValidateWithStore* self = new(ELeave) CActionValidateWithStore(aFs, aConsole, aOut);
324 CleanupStack::PushL(self);
325 self->ConstructL(aTestActionSpec);
329 CActionValidateWithStore::CActionValidateWithStore(RFs& aFs, CConsoleBase& aConsole,Output& aOut)
330 :CActionValidate(aFs, aConsole, aOut)
334 void CActionValidateWithStore::DoPerformPrerequisite(TRequestStatus& aStatus)
338 case ERemoveCertsBeforeTest:
339 __ASSERT_DEBUG(!iCertUtils, User::Panic(_L("CPKIXCertTest"), 1));
340 iCertUtils = CCertUtils::NewL(iFs);
341 iCertUtils->RemoveCertsL(aStatus);
348 TRAPD(err, iCertUtils->RemoveApplicationL(uid));
349 iCertUtils->AddApplicationL(_L("testpkix"), uid);
351 TRAP(err, iCertUtils->RemoveApplicationL(uid2));
352 iCertUtils->AddApplicationL(_L("testpkix"), uid2);
353 iCertUtils->AddCertL(iTestChain->iRootCertLabel,
354 EX509Certificate, ECACertificate, 1, iCertPath,
355 iTestChain->iRootCertFileName,
356 aStatus); // 1 is trusted for our use
357 iState = EAddIntermediateCerts;
361 case EAddIntermediateCerts:
363 iCertUtils->AddCACertsL(*(iTestChain->iIntermediateCertsFileName),
364 *(iTestChain->iIntermediateCertsLabel),
365 EX509Certificate, 2, iCertPath,
366 aStatus); //2 not trusted for our use
367 iState = EDoValidateTestStart;
368 iActionState = EAction;
376 void CActionValidateWithStore::DoPerformPostrequisite(TRequestStatus& aStatus)
380 case ERemoveCertsAfterTest:
381 iCertUtils->RemoveCertsL(aStatus);
389 TRequestStatus* status = &aStatus;
391 User::RequestComplete(status, KErrNone);
400 void CActionValidateWithStore::CreateChainL()
405 eeCert = Input::ReadFileL(iTestChain->iEECertFileName,
409 iConsole.Printf(_L("Error : couldn't open file "));
410 iConsole.Printf(iTestChain->iEECertFileName);
411 iConsole.Printf(_L("\n"));
412 iOut.writeString(_L("Error : couldn't open file "));
413 iOut.writeString(iTestChain->iEECertFileName);
417 CleanupStack::PushL(eeCert);
418 TUid testUid = TUid::Uid(1);
419 iChain = CPKIXCertChain::NewL(iFs, *eeCert, testUid);
420 CleanupStack::PopAndDestroy(eeCert);
424 validate using a set of candidates root certs supplied by the client
426 CTestAction* CActionValidateWithSuppliedCerts::NewL(RFs& aFs, CConsoleBase& aConsole,
427 Output& aOut, const TTestActionSpec& aTestActionSpec)
429 CTestAction* self = CActionValidateWithSuppliedCerts::NewLC(aFs, aConsole,
430 aOut, aTestActionSpec);
431 CleanupStack::Pop(self);
435 CTestAction* CActionValidateWithSuppliedCerts::NewLC(RFs& aFs, CConsoleBase& aConsole,
436 Output& aOut, const TTestActionSpec& aTestActionSpec)
438 CActionValidateWithSuppliedCerts* self = new(ELeave) CActionValidateWithSuppliedCerts(aFs, aConsole, aOut);
439 CleanupStack::PushL(self);
440 self->ConstructL(aTestActionSpec);
444 CActionValidateWithSuppliedCerts::CActionValidateWithSuppliedCerts(RFs& aFs, CConsoleBase& aConsole,Output& aOut)
445 :CActionValidate(aFs, aConsole, aOut)
449 void CActionValidateWithSuppliedCerts::ConstructL(const TTestActionSpec& aTestActionSpec)
451 CActionValidate::ConstructL(aTestActionSpec);
452 iRootCerts = new(ELeave) RPointerArray<CX509Certificate>;
455 CActionValidateWithSuppliedCerts::~CActionValidateWithSuppliedCerts()
459 iRootCerts->ResetAndDestroy();
462 delete iEndEntityAndIntermediateCerts;
465 void CActionValidateWithSuppliedCerts::DoPerformPrerequisite(TRequestStatus& aStatus)
467 //initialise the big descriptor containing ee cert followed by all intermediate certs
468 //and the array of candidate root certs
470 HBufC8* eeCert = Input::ReadFileLC(iTestChain->iEECertFileName, iCertPath, iFs);
471 HBufC8* inter = InputExtra::ReadFilesLC(*(iTestChain->iIntermediateCertsFileName), iCertPath, iFs);
472 TInt totalSize = (eeCert->Size()) + (inter->Size());
473 iEndEntityAndIntermediateCerts = HBufC8::NewL(totalSize);
474 TPtr8 pRes = iEndEntityAndIntermediateCerts->Des();
475 pRes.Append(*eeCert);
477 CleanupStack::PopAndDestroy(2);//eeCert, inter
479 HBufC8* rootBuf = Input::ReadFileLC(iTestChain->iRootCertFileName, iCertPath, iFs);
480 CX509Certificate* root = CX509Certificate::NewL(*rootBuf);
481 CleanupStack::PopAndDestroy(rootBuf);
482 CleanupStack::PushL(root);
484 User::LeaveIfError(iRootCerts->Append(root));
485 CleanupStack::Pop(root);//
487 TRequestStatus* status = &aStatus;
488 User::RequestComplete(status, KErrNone);
489 iState = EDoValidateTestStart;
490 iActionState = EAction;
493 void CActionValidateWithSuppliedCerts::DoPerformPostrequisite(TRequestStatus& aStatus)
497 TRequestStatus* status = &aStatus;
499 User::RequestComplete(status, KErrNone);
502 void CActionValidateWithSuppliedCerts::CreateChainL()
504 //create chain object
505 iChain = CPKIXCertChain::NewL(iFs, *iEndEntityAndIntermediateCerts, *iRootCerts);