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.
20 #include "ValidateTest.h"
22 #include <ecom/ecom.h>
25 _LIT(KChainStart, "<chain>");
26 _LIT(KDateIssuedStart, "<dateissued>");
27 _LIT(KIOStart, "<io>");
29 CTestAction* CValidateTest::NewL(RFs& aFs, CConsoleBase& aConsole,
30 Output& aOut, const TTestActionSpec& aTestActionSpec)
32 CTestAction* self = CValidateTest::NewLC(aFs, aConsole, aOut, aTestActionSpec);
33 CleanupStack::Pop(self);
37 CTestAction* CValidateTest::NewLC(RFs& aFs, CConsoleBase& aConsole,
38 Output& aOut, const TTestActionSpec& aTestActionSpec)
40 CValidateTest* self = new(ELeave) CValidateTest(aFs, aConsole, aOut);
41 CleanupStack::PushL(self);
42 self->ConstructL(aTestActionSpec);
47 void CValidateTest::TestValidation(TRequestStatus& aStatus)
49 iOriginalRequestStatus = &aStatus;
50 aStatus = KRequestPending;
53 TRequestStatus* status = &aStatus;
54 User::RequestComplete(status, KErrNone);
57 CValidateTest::CValidateTest(RFs& aFs,
58 CConsoleBase& aConsole,
60 : CTestAction(aConsole, aOut), iFs(aFs)
64 void CValidateTest::ConstructL(const TTestActionSpec& aTestActionSpec)
66 CTestAction::ConstructL(aTestActionSpec);
67 iValidationResult = CWTLSValidationResult::NewL();
68 HBufC* aBody = HBufC::NewLC(aTestActionSpec.iActionBody.Length());
69 aBody->Des().Copy(aTestActionSpec.iActionBody);
70 // creates the test chan validation object
71 iTestChain = CTestChainValidate::NewL();
72 TPtrC chainBuf = Input::ParseElement(*aBody, KChainStart);
74 iTestChain->AddChainL(chainBuf);
75 TPtrC ioDateIssued = Input::ParseElement(*aBody, KDateIssuedStart);
76 iTestChain->AddDateIssued(ioDateIssued);
77 TPtrC ioBuf = Input::ParseElement(*aBody, KIOStart);
78 iTestChain->AddIOL(ioBuf);
80 CleanupStack::PopAndDestroy(aBody);
83 CValidateTest::~CValidateTest()
87 delete iValidationResult;
89 REComSession::FinalClose();
92 void CValidateTest::DoPerformPrerequisite(TRequestStatus& aStatus)
100 __ASSERT_DEBUG(!iCertUtils, User::Panic(_L("TWTLSCertTest"), 1));
101 iCertUtils = CCertUtils::NewL(iFs);
102 TRAP(err, HandleEInitL(aStatus));
105 case EValidationStoreInitStoreManager1:
106 TRAP(err, HandleEValidationInitStoreManager1L(aStatus));
107 iActionState = EAction;
109 case EValidationStoreDepopulateStore1:
110 case EValidationStorePopulateStoreRoots:
111 case EValidationStorePopulateStoreExtras:
112 case EValidationStoreValidate:
113 case EValidationStoreValidated:
114 case EValidationStoreInitStoreManager2:
115 case EValidationStoreDepopulateStore2:
116 case EValidationStoreEnd:
117 case EValidationSuppliedInit:
118 case EValidationSuppliedValidate:
119 case EValidationSuppliedValidated:
121 break; // Nothing to do, for compiler
125 void CValidateTest::DoPerformPostrequisite(TRequestStatus& aStatus)
132 case EValidationStoreInitStoreManager1:
133 case EValidationStoreDepopulateStore1:
134 case EValidationStorePopulateStoreRoots:
135 case EValidationStorePopulateStoreExtras:
136 case EValidationStoreValidate:
137 case EValidationStoreValidated:
138 case EValidationStoreInitStoreManager2:
139 case EValidationStoreDepopulateStore2:
140 case EValidationStoreEnd:
141 break; // Nothing to do, for compiler
142 case EValidationSuppliedInit:
144 iConsole.Printf(_L("started with supplied certs...\n"));
145 iOut.writeString(_L("started with supplied certs..."));
148 iState = EValidationSuppliedValidate;
149 TRequestStatus* status = &aStatus;
150 User::RequestComplete(status, KErrNone);
154 case EValidationSuppliedValidate:
156 HBufC8* encodedCerts = ReadFilesLC(*iTestChain->iServerCerts);
160 TRequestStatus* status = &aStatus;
162 User::RequestComplete(status, KErrNone);
166 TInt certCount = iTestChain->iRootCerts->MdcaCount();
167 CArrayPtrFlat<CWTLSCertificate>* roots =
168 new(ELeave) CArrayPtrFlat<CWTLSCertificate>(1);
169 TCleanupItem cleanup(CleanupCertArray, roots);
170 CleanupStack::PushL(cleanup);
171 for (TInt i = 0; i < certCount; i++)
173 // build the root certificates array including all the candidates.
175 ReadFileLC(iTestChain->iRootCerts->MdcaPoint(i));
176 CWTLSCertificate* cert = CWTLSCertificate::NewLC(encCert->Des());
177 roots->AppendL(cert);
178 CleanupStack::Pop(); // cert
179 CleanupStack::PopAndDestroy(); // encCert
182 __ASSERT_DEBUG(!iChain, User::Panic(_L("CValidateTest"), 1));
183 iChain = CWTLSCertChain::NewL(iFs, *encodedCerts, *roots);
185 CleanupStack::PopAndDestroy(2); // encodedCerts, roots
187 TDateTime dt(2000, EJuly, 0, 0, 0, 0, 0);
188 if(iTestChain->iDateIssued == 1)
194 iChain->ValidateL(*iValidationResult, iTime, aStatus);
195 iState = EValidationSuppliedValidated;
200 case EValidationSuppliedValidated:
204 TWTLSValidationStatus* expectedStatus = iTestChain->iError;
205 const TWTLSValidationStatus& actualStatus = iValidationResult->Error();
207 iOut.writeString(_L("Expected Error = "));
208 WriteError(expectedStatus->iReason);
211 iOut.writeString(_L("Actual Error = "));
212 WriteError(actualStatus.iReason);
215 TInt wCount = iTestChain->iWarnings->Count();
216 iOut.writeString(_L("Expected Warnings = "));
218 for (TInt i = 0; i < wCount; i++)
220 TWTLSValidationStatus warning = iTestChain->iWarnings->At(i);
221 WriteError(warning.iReason);
225 iOut.writeString(_L("Actual Warnings = "));
227 const CArrayFixFlat<TWTLSValidationStatus>& warnings =
228 iValidationResult->Warnings();
229 wCount = warnings.Count();
230 for (TInt j = 0; j < wCount; j++)
232 TWTLSValidationStatus warning = warnings.At(j);
233 WriteError(warning.iReason);
238 if(expectedStatus->iReason != actualStatus.iReason)
240 iConsole.Printf(_L("FAILED!!!!\n"));
241 iOut.writeString(_L("FAILED!!!!"));
246 // End of validatewith supplied
249 iOut.writeString(_L("Failed: leave code = "));
255 TRequestStatus* status = &aStatus;
256 User::RequestComplete(status, KErrNone);
264 TTimeIntervalMicroSeconds intervalMS = end.MicroSecondsFrom(iStart);
265 iConsole.Printf(_L("Time taken = %d milliseconds\n"), (intervalMS.Int64()/1000));
267 TRequestStatus* status = &aStatus;
269 User::RequestComplete(status, KErrNone);
275 void CValidateTest::PerformAction(TRequestStatus& aStatus)
277 TRequestStatus* status = &aStatus;
281 case EValidationStoreDepopulateStore1:
283 iCertUtils->RemoveCertsL(aStatus);
284 iState = EValidationStorePopulateStoreRoots;
288 case EValidationStorePopulateStoreRoots:
291 TRAP_IGNORE(iCertUtils->RemoveApplicationL(uid));
292 iCertUtils->AddApplicationL(_L("testwtls"), uid);
293 iCertUtils->AddCACertsL(*iTestChain->iRootCerts,
294 *iTestChain->iRootLabels, EWTLSCertificate, 1, KPath, aStatus);
295 iState = EValidationStorePopulateStoreExtras;
299 case EValidationStorePopulateStoreExtras:
301 iCertUtils->AddCACertsL(*iTestChain->iExtraCerts,
302 *iTestChain->iExtraLabels, EWTLSCertificate, 2, KPath, aStatus);
303 iState = EValidationStoreValidate;
307 case EValidationStoreValidate:
309 HBufC8* encodedCerts = ReadFilesLC(*iTestChain->iServerCerts);
311 TUid testUid = TUid::Uid(1);
315 TRequestStatus* status = &aStatus;
317 User::RequestComplete(status, KErrNone);
321 __ASSERT_DEBUG(!iChain, User::Panic(_L("CValidateTest"), 1));
322 iChain = CWTLSCertChain::NewL(iFs, *encodedCerts, testUid);
323 CleanupStack::PopAndDestroy(); // encodedCerts
325 TDateTime dt(2000, EJuly, 0, 0, 0, 0, 0);
326 if(iTestChain->iDateIssued == 1)
332 TRAP_IGNORE(iChain->ValidateL(*iValidationResult, iTime, aStatus));
333 iState = EValidationStoreValidated;
338 case EValidationStoreValidated:
340 TInt count = iChain->Count();
343 iOut.writeString(_L("EE certificate = "));
344 const CWTLSCertificate& eeCert = iChain->Cert(0);
345 HBufC* eeSubject = eeCert.SubjectL();
346 CleanupStack::PushL(eeSubject);
347 iOut.writeString(*eeSubject);
348 CleanupStack::PopAndDestroy();
350 for (TInt i = 1; i < count - 1; i++)
352 iOut.writeString(_L("Intermediate certificate = "));
353 const CWTLSCertificate& iCert = iChain->Cert(i);
354 HBufC* subject = iCert.SubjectL();
355 CleanupStack::PushL(subject);
356 iOut.writeString(*subject);
357 CleanupStack::PopAndDestroy();
360 iOut.writeString(_L("Root certificate = "));
361 const CWTLSCertificate& rCert = iChain->Cert(count-1);
362 HBufC* rSubject = rCert.SubjectL();
363 CleanupStack::PushL(rSubject);
364 iOut.writeString(*rSubject);
365 CleanupStack::PopAndDestroy();
369 TWTLSValidationStatus* expectedStatus = iTestChain->iError;
370 const TWTLSValidationStatus& actualStatus = iValidationResult->Error();
372 iOut.writeString(_L("Expected Error = "));
373 WriteError(expectedStatus->iReason);
376 iOut.writeString(_L("Actual Error = "));
377 WriteError(actualStatus.iReason);
380 TInt wCount = iTestChain->iWarnings->Count();
381 iOut.writeString(_L("Expected Warnings = "));
383 for (TInt i = 0; i < wCount; i++)
385 TWTLSValidationStatus warning = iTestChain->iWarnings->At(i);
386 WriteError(warning.iReason);
390 iOut.writeString(_L("Actual Warnings = "));
392 const CArrayFixFlat<TWTLSValidationStatus>& warnings =
393 iValidationResult->Warnings();
394 wCount = warnings.Count();
395 for (TInt j = 0; j < wCount; j++)
397 TWTLSValidationStatus warning = warnings.At(j);
398 WriteError(warning.iReason);
403 if(expectedStatus->iReason != actualStatus.iReason)
405 iConsole.Printf(_L("FAILED!!!!\n"));
406 iOut.writeString(_L("FAILED!!!!"));
412 iState = EValidationStoreInitStoreManager2;
413 User::RequestComplete(status, KErrNone);
419 case EValidationStoreInitStoreManager2:
421 User::RequestComplete(status, KErrNone);
422 iState = EValidationStoreDepopulateStore2;
426 case EValidationStoreDepopulateStore2:
428 iCertUtils->RemoveCertsL(aStatus);
430 iCertUtils->RemoveApplicationL(uid);
431 iState = EValidationStoreEnd;
435 case EValidationStoreEnd:
437 iState = EValidationSuppliedInit;
438 iActionState = EPostrequisite;
439 User::RequestComplete(status, KErrNone);
443 case EValidationStoreInitStoreManager1:
444 case EValidationSuppliedInit:
445 case EValidationSuppliedValidate:
446 case EValidationSuppliedValidated:
448 break; // Nothing to do, for compiler
452 HBufC8* CValidateTest::ReadFileLC(const TDesC& aFilename)
455 User::LeaveIfError(file.Open(iFs, aFilename, EFileRead));
456 CleanupClosePushL(file);
459 CleanupStack::PopAndDestroy(1);//fileClose
461 HBufC8* res = HBufC8::NewLC(size);
465 RFileReadStream stream;
466 User::LeaveIfError(stream.Open(iFs, aFilename, EFileStream));
467 CleanupClosePushL(stream);
468 stream.ReadL(p, size);
469 CleanupStack::PopAndDestroy();//streamClose...bleurgh
474 HBufC8* CValidateTest::ReadFilesLC(CDesCArray& aServerCerts)
476 TInt count = aServerCerts.MdcaCount();
480 for (i = 0; i < count; i++)
482 TPtrC filename = aServerCerts.MdcaPoint(i);
484 TRAPD(err, file.Open(iFs, filename, EFileRead));
487 HBufC *failedToLoad = filename.AllocLC();
488 SetScriptError(EFileNotFound, failedToLoad->Des());
489 CleanupStack::PopAndDestroy(2);//fsclose, fileClose
492 CleanupClosePushL(file);
495 CleanupStack::PopAndDestroy(1); // fileClose
499 HBufC8* res = HBufC8::NewLC(totalSize);
500 TPtr8 pRes = res->Des();
501 for (i = 0; i < count; i++)
503 HBufC8* cert = ReadFileLC(aServerCerts.MdcaPoint(i));
504 pRes.Append(cert->Des());
505 CleanupStack::PopAndDestroy();//cert
510 void CValidateTest::WriteError(TValidationError aError)
517 iOut.writeString(_L("Validated OK"));
520 case EChainHasNoRoot:
522 iOut.writeString(_L("No trusted root found"));
525 case ESignatureInvalid:
527 iOut.writeString(_L("Signature invalid"));
530 case EDateOutOfRange:
532 iOut.writeString(_L("Date out of range"));
535 case ENamesDontChain:
537 iOut.writeString(_L("Names don't chain"));
542 iOut.writeString(_L("Cert not authorised to sign other certs"));
548 iOut.writeString(_L("Unknown"));
554 void CValidateTest::CleanupCertArray(TAny* aCertArray)
556 CArrayPtrFlat<CWTLSCertificate>* certs = REINTERPRET_CAST(CArrayPtrFlat<CWTLSCertificate>*, aCertArray);
557 certs->ResetAndDestroy();
561 void CValidateTest::HandleEInitL(TRequestStatus& aStatus)
563 iConsole.Printf(_L("Chain validation tests...\n"));
566 iConsole.Printf(_L("started with store...\n"));
567 iOut.writeString(_L("started with store..."));
570 iState = EValidationStoreInitStoreManager1;
571 TRequestStatus* status = &aStatus;
572 User::RequestComplete(status, KErrNone);
575 void CValidateTest::HandleEValidationInitStoreManager1L(TRequestStatus& aStatus)
577 TRequestStatus* status = &aStatus;
578 User::RequestComplete(status, KErrNone);
579 iState = EValidationStoreDepopulateStore1;
583 void CValidateTest::DoReportAction()
587 void CValidateTest::DoCheckResult(TInt /*aError*/)