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