/** Copyright (c) 1998-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: * CWTLSCertChainAO class implementation**//** @file @internalTechnology*/#ifndef __WTLSCERTCHAINAO_H__#define __WTLSCERTCHAINAO_H__#include <e32base.h>#include <f32file.h>#include <unifiedcertstore.h>#include <hash.h>class CWTLSCertChain;class CWTLSValidationResult;class CWTLSCertificate;/** * This class handles the asynchronous part of the wtls chain validation. It * is an active object which handles the asynchronous certificate store operations. */class CWTLSCertChainAO : public CActive{public: static CWTLSCertChainAO* NewL(RFs& aFs, CWTLSCertChain &aWTLSCertChain, const CArrayPtr<CWTLSCertificate>& aRootCerts); static CWTLSCertChainAO* NewL(RFs& aFs, CWTLSCertChain &aWTLSCertChain, const TUid aClient); virtual ~CWTLSCertChainAO(); virtual TInt RunError(TInt aError);private: CWTLSCertChainAO(RFs& aFs, CWTLSCertChain &aWTLSCertChain); CWTLSCertChainAO(RFs& aFs, CWTLSCertChain &aWTLSCertChain, const TUid aClient); void ConstructL(const CArrayPtr<CWTLSCertificate>& aRootCerts);public: void RunL(); void DoCancel();private: /** * This function creates a CCertStoreManager, * calls CCertStoreManager initialise and sets the state * to EStoreManagerInitialized */ void HandleEStoreManagerInitializationL(); void HandleEStoreManagerInitializedL(); void HandleEGetCertHashesL(); void HandleEPruneListL(); void HandleEPruneListDoneL(); void HandleECheckTCAL(); void HandleEIsChainSelfSignedL(); void HandleERetrieveRootsL(); void HandleEAddRootToListL(); void HandleEFindRootL(); void HandleEValidateEndL(); // Request functionspublic: void Validate(CWTLSValidationResult& aValidationResult, const TTime& aValidationTime, TRequestStatus& aStatus);private: TBool CheckSignatureAndNameL(const CWTLSCertificate& aCert, CWTLSValidationResult& aResult, TInt aPos) const; TBool CheckValidityPeriod(const CWTLSCertificate& aCert, CWTLSValidationResult& aResult, const TTime aTime, TInt aPos) const; HBufC8& GeneratePublicKeyHashL(const CWTLSCertificate& aCert) const; enum TState { EStoreManagerInitialization = 0, EStoreManagerInitialized, EGetCertHashes, EPruneList, EPruneListDone, ECheckTCA, EIsChainSelfSigned, ERetrieveRoots, EAddRootToList, EFindRoot, EValidateEnd };private: RFs& iFs; CUnifiedCertStore* iCertStoreManager; /** * List of the subject hashes from the cert store * The elements remained owned by the CCTCertInfo */ RPointerArray< TBuf8<20> > iRootSubjectStoreHashList; /** * List of the subject hashes from the passed in certs * We own this object and all its elements */ RPointerArray< HBufC8 > iRootSubjectClientHashList; CCertAttributeFilter* iFilter; /** * Stores info on the certs in the cert store * We own this object and all its elements */ RMPointerArray<CCTCertInfo> iCertInfos; /** * Indicates whether iWTLSCertChain.iChain was pruned or not */ TBool iPruned; /** * The index within iChain that the chain was pruned */ TInt iPrunedChainLength; CWTLSCertChain& iWTLSCertChain; TUid iClient; TPtr8 iEncodedCert; HBufC8* iEncodedCertTemp; TState iState; TRequestStatus* iOriginalRequestStatus; /** * Roots passed in from the client that we trust * We own this object and all its elements */ RPointerArray<CWTLSCertificate> iRootsFromClient; /** * Roots from the specified cert store that we trust. * We own this object and all its elements */ RPointerArray<CWTLSCertificate> iRootsFromStore; /** * A counter used to carry counter information between AO states */ TInt iIndex; /** * Indicates if a root cert has been found for this particular chain */ TBool iFoundRoot; /** * To store the parameters passed to CWTLSCertChain::Validate */ CWTLSValidationResult* iValidationResult; /** * To store the parameters passed to CWTLSCertChain::Validate */ const TTime* iValidationTime; };#include <wtlscertchain.h>#endif