diff -r 000000000000 -r 2c201484c85f cryptoservices/certificateandkeymgmt/pkixCert/pkixCertChainHelper.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cryptoservices/certificateandkeymgmt/pkixCert/pkixCertChainHelper.cpp Wed Jul 08 11:25:26 2009 +0100 @@ -0,0 +1,200 @@ +/* +* Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +#include "pkixCertChainHelper.h" +#include +#include +#include + +_LIT(KPanicCat, "CPKIXCertChainHelper"); + +CPKIXCertChainHelper* CPKIXCertChainHelper::NewL(RFs& aFs) + { + CPKIXCertChainHelper* self = new (ELeave) CPKIXCertChainHelper(); + CleanupStack::PushL(self); + self->ConstructL(aFs); + CleanupStack::Pop(self); + return self; + } + +CPKIXCertChainHelper::CPKIXCertChainHelper() : + CActive(EPriorityNormal) + { + CActiveScheduler::Add(this); + } + +void CPKIXCertChainHelper::ConstructL(RFs& aFs) + { + iCertStore = CUnifiedCertStore::NewL(aFs, EFalse); + } + +CPKIXCertChainHelper::~CPKIXCertChainHelper() + { + Cancel(); + delete iCertStore; + } + +CUnifiedCertStore& CPKIXCertChainHelper::CertStore() + { + return *iCertStore; + } + +void CPKIXCertChainHelper::Validate(CPKIXCertChainBase& aCertChain, + CPKIXValidationResult& aValidationResult, + const TTime& aValidationTime, + TRequestStatus& aStatus) + { + StartValidate(aCertChain, aValidationResult, aValidationTime, NULL, + aStatus); + } + +void CPKIXCertChainHelper::Validate(CPKIXCertChainBase& aCertChain, + CPKIXValidationResult& aValidationResult, + const TTime& aValidationTime, + const CArrayPtr& aInitialPolicies, + TRequestStatus& aStatus) + { + StartValidate(aCertChain, aValidationResult, aValidationTime, &aInitialPolicies, + aStatus); + } + +void CPKIXCertChainHelper::CancelValidate() + { + if (iState == EInitializeCertStore || + iState == EValidateChain) + { + Cancel(); + } + } + +void CPKIXCertChainHelper::StartValidate(CPKIXCertChainBase& aCertChain, + CPKIXValidationResult& aValidationResult, + const TTime& aValidationTime, + const CArrayPtr* aInitialPolicies, + TRequestStatus& aStatus) + { + __ASSERT_ALWAYS(iState == EIdle, User::Panic(KPanicCat, 1)); + iCertChain = &aCertChain; + iValidationResult = &aValidationResult; + iValidationTime = aValidationTime; + iInitialPolicies = aInitialPolicies; + iClientStatus = &aStatus; + aStatus = KRequestPending; + InitializeCertStore(); + } + +void CPKIXCertChainHelper::InitializeCertStore() + { + iState = EInitializeCertStore; + if (iCertStoreInitialized) + { + TRequestStatus* status = &iStatus; + User::RequestComplete(status, KErrNone); + } + else + { + iCertStore->Initialize(iStatus); + } + SetActive(); + } + +void CPKIXCertChainHelper::ValidateChainL() + { + iState = EValidateChain; + if (iInitialPolicies) + { + iCertChain->ValidateL(*iValidationResult, + iValidationTime, + *iInitialPolicies, + iStatus); + } + else + { + iCertChain->ValidateL(*iValidationResult, + iValidationTime, + iStatus); + } + SetActive(); + } + +void CPKIXCertChainHelper::RunL() + { + User::LeaveIfError(iStatus.Int()); + + switch (iState) + { + case EInitializeCertStore: + iCertStoreInitialized = ETrue; + ValidateChainL(); + break; + + case EValidateChain: + Complete(KErrNone); + break; + + default: + User::Invariant(); + } + } + +TInt CPKIXCertChainHelper::RunError(TInt aError) + { + Complete(aError); + return KErrNone; + } + +void CPKIXCertChainHelper::DoCancel() + { + TInt result = KErrCancel; + + switch (iState) + { + case EInitializeCertStore: + iCertStore->CancelInitialize(); + break; + + case EValidateChain: + if (iStatus == KRequestPending) + { + iCertChain->CancelValidate(); + } + else + { + result = iStatus.Int(); + } + break; + + default: + // Do nothing + break; + } + + Complete(result); + } + +void CPKIXCertChainHelper::Complete(TInt aError) + { + iState = EIdle; + iCertChain = NULL; + iValidationResult = NULL; + iInitialPolicies = NULL; + if (iClientStatus) + { + User::RequestComplete(iClientStatus, aError); + } + }