diff -r 675a964f4eb5 -r 35751d3474b7 crypto/weakcryptospi/inc/spi/ruleselector.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/crypto/weakcryptospi/inc/spi/ruleselector.h Thu Sep 10 14:01:51 2009 +0300 @@ -0,0 +1,604 @@ +/* +* Copyright (c) 2006-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: +* Rule-based plugin selector definition +* +*/ + + +/** + @file + @publishedAll + @released +*/ + +#ifndef __CRYPTOAPI_RULESELECTOR_H__ +#define __CRYPTOAPI_RULESELECTOR_H__ + +#include +#include +#include +#include + +#ifndef SYMBIAN_ENABLE_SPLIT_HEADERS +#include +#endif + +namespace CryptoSpi + { + + /** + The operators of the plugin selection rule + */ + enum TRuleOperator + { + /** + Operator == + */ + EOpEqual, + + /** + Operator != + */ + EOpNotEqual, + + /** + Operator > + */ + EOpGreaterThan, + + /** + Operator < + */ + EOpLessThan, + + /** + Operator >= + */ + EOpGreaterThanOrEqual, + + /** + Operator <= + */ + EOpLessThanOrEqual, + + /** + Ascending Sort of an characteristic + */ + EOpAscendingSort, + + /** + Descending Sort of an characteristic + */ + EOpDescendingSort, + + /** + The total number of operators + */ + EOpInvalid + }; + + class CRulesCharacteristicsAndPluginName; + /** + A single plugin selection rule definition + */ + NONSHARABLE_CLASS(CSelectionRuleContent) : public CBase + { + public: + /** + Create a selection rule content instance; the supported characteristic uid's are + defined in plugincharacteristics.h; the supported operators are defined in ruleselector.h + @param aInterfaceScope The Interface scope of this rule + @param aAlgorithmScope The Algorithm scope of this rule + @param aCharacteristicValue The value of the rule of this characteristic + @param aOperator The operator of the rule + @param aIsOptional Whether this rule is optional or mandatory + @return A pointer to a CSelectionRuleContent instance + */ + IMPORT_C static CSelectionRuleContent* NewL(TUid aInterfaceScope, + TUid aAlgorithmScope, + CCryptoParam* aCharacteristicValue, + TRuleOperator aOperator, + TBool aIsOptional); + /** + Destructor + */ + IMPORT_C ~CSelectionRuleContent(); + + /** + * @internalComponent + * + * Get the Interface Scope of this rule + * @return the Interface Scope Uid of this rule + **/ + TUid GetInterfaceScope(); + + /** + * @internalComponent + * + * Get the Algorithm Scope of this rule + * @return the Algorithm Scope Uid of this rule + **/ + TUid GetAlgorithmScope(); + + /** + * @internalComponent + * + * Get the Rule operator + * @return The Rule operator + **/ + TInt GetOperator(); + + /** + * @internalComponent + * + * Get the value of the rule of this characteristic + * @return The value of the rule of this characteristic + **/ + const CCryptoParam* GetCharacteristicValue(); + + /** + * @internalComponent + * + * returns whether the rule is optional + * @return Whether the rule is optional + **/ + TBool IsOptionalRule(); + + private: + /** + Constructor + */ + CSelectionRuleContent(TUid aInterfaceScope, + TUid aAlgorithmScope, + CCryptoParam* aCharacteristicValue, + TRuleOperator aOperator, + TBool aIsOptional); + + /** + The scopes of this rule + */ + TUid iInterfaceScope; + TUid iAlgorithmScope; + + /** + The value of the rule of this characteristic + */ + const CCryptoParam* iCharacteristicValue; + + /** + The Operator of the Characteristic + */ + TRuleOperator iOperator; + + /** + if the rule on this characteristic is optional + */ + TBool iIsOptional; + }; + + + /** + Definition of rule-based plugin selection rules + */ + NONSHARABLE_CLASS(CSelectionRules) : public CBase + { + public: + /** + create a Selection Rule instance which will hold the rules to filter the plugins + @return a pointer to a CSelectionRules instance + */ + IMPORT_C static CSelectionRules* NewL(); + + /** + Destructor + */ + IMPORT_C ~CSelectionRules(); + + /** + Add a selection rule the this object + @param aSelectionRule The rule to be added + */ + IMPORT_C void AddSelectionRuleL(CSelectionRuleContent* aSelectionRule); + + /** + * @internalComponent + * + * Get the selection rules + * @return The reference of the rules + **/ + RPointerArray& GetSelectionRules(); + + private: + /** + Constructor + */ + CSelectionRules(); + + /** + a group of plugin rules + */ + RPointerArray iRules; + }; + + /** + Selector apply the rule-based selection to find the plugin. + */ + NONSHARABLE_CLASS(CRuleSelector) : public CBase, public MPluginSelector + { + public: + /** + NewL create the ruled-based selector + @param aRules The Rules to select the plugins + @return a pointer to a CRuleSelector instance + */ + IMPORT_C static CRuleSelector* NewL(CSelectionRules* aRules); + IMPORT_C static CRuleSelector* NewLC(CSelectionRules* aRules); + + /** + Destructor + */ + IMPORT_C ~CRuleSelector(); + + /** + * @deprecated + * + * virtual function from MPluginSelector + */ + virtual void CreateHashL(CHash*& aHash, + TUid aAlgorithmUid, + TUid aOperationMode, + const CKey* aKey, + const CCryptoParams* aAlgorithmParams); + + //virtual function from MPluginSelector + virtual void CreateRandomL(CRandom*& aRandom, + TUid aAlgorithmUid, + const CCryptoParams* aAlgorithmParams); + + //virtual function from MPluginSelector + virtual void CreateSymmetricCipherL(CSymmetricCipher*& aCipher, + TUid aAlgorithmUid, + const CKey& aKey, + TUid aCryptoMode, + TUid aOperationMode, + TUid aPaddingMode, + const CCryptoParams* aAlgorithmParams); + + //virtual function from MPluginSelector + virtual void CreateAsymmetricCipherL(CAsymmetricCipher*& aCipher, + TUid aAlgorithmUid, + const CKey& aKey, + TUid aCryptoMode, + TUid aPaddingMode, + const CCryptoParams* aAlgorithmParams); + + //virtual function from MPluginSelector + virtual void CreateSignerL(CSigner*& aSigner, + TUid aAlgorithmUid, + const CKey& aKey, + TUid aPaddingMode, + const CCryptoParams* aAlgorithmParams); + + //virtual function from MPluginSelector + virtual void CreateVerifierL(CVerifier*& aVerifier, + TUid aAlgorithmUid, + const CKey& aKey, + TUid aPaddingMode, + const CCryptoParams* aAlgorithmParams); + + //virtual function from MPluginSelector + virtual void CreateKeyPairGeneratorL(CKeyPairGenerator*& aKeyPairGenerator, + TUid aKeyAlgorithmUid, + const CCryptoParams* aAlgorithmParams); + + //virtual function from MPluginSelector + virtual void CreateKeyAgreementL(CKeyAgreement*& aKeyAgreement, + TUid aAlgorithmUid, + const CKey& aPrivateKey, + const CCryptoParams* aAlgorithmParams); + + /** + * @deprecated + * + * virtual function from MPluginSelector + */ + virtual void CreateAsyncHashL(CAsyncHash*& aHash, + TUid aAlgorithmUid, + TUid aOperationMode, + const CKey* aKey, + const CCryptoParams* aAlgorithmParams); + + //virtual function from MPluginSelector + virtual void CreateAsyncRandomL(CAsyncRandom*& aRandom, + TUid aAlgorithmUid, + const CCryptoParams* aAlgorithmParams); + + //virtual function from MPluginSelector + virtual void CreateAsyncSymmetricCipherL(CAsyncSymmetricCipher*& aCipher, + TUid aAlgorithmUid, + const CKey& aKey, + TUid aCryptoMode, + TUid aOperationMode, + TUid aPaddingMode, + const CCryptoParams* aAlgorithmParams); + + //virtual function from MPluginSelector + virtual void CreateAsyncAsymmetricCipherL(CAsyncAsymmetricCipher*& aCipher, + TUid aAlgorithmUid, + const CKey& aKey, + TUid aCryptoMode, + TUid aPaddingMode, + const CCryptoParams* aAlgorithmParams); + + //virtual function from MPluginSelector + virtual void CreateAsyncSignerL(CAsyncSigner*& aSigner, + TUid aAlgorithmUid, + const CKey& aKey, + TUid aPaddingMode, + const CCryptoParams* aAlgorithmParams); + + //virtual function from MPluginSelector + virtual void CreateAsyncVerifierL(CAsyncVerifier*& aVerifier, + TUid aAlgorithmUid, + const CKey& aKey, + TUid aPaddingMode, + const CCryptoParams* aAlgorithmParams); + + //virtual function from MPluginSelector + virtual void CreateAsyncKeyPairGeneratorL(CAsyncKeyPairGenerator*& aKeyPairGenerator, + TUid aAlgorithmUid, + const CCryptoParams* aAlgorithmParams); + + //virtual function from MPluginSelector + virtual void CreateAsyncKeyAgreementL(CAsyncKeyAgreement*& aKeyAgreement, + TUid aAlgorithmUid, + const CKey& aPrivateKey, + const CCryptoParams* aAlgorithmParams); + +#ifdef SYMBIAN_SDP_IPSEC_VOIP_SUPPORT + + //virtual function from MPluginSelector + virtual void CreateMacL(CMac*& aMac, + const TUid aAlgorithmUid, + const CKey& aKey, + const CCryptoParams* aAlgorithmParams); + + //virtual function from MPluginSelector + virtual void CreateAsyncMacL(CAsyncMac*& aMac, + const TUid aAlgorithmUid, + const CKey& aKey, + const CCryptoParams* aAlgorithmParams); + + //virtual function from MPluginSelector + virtual void CreateHashL(CHash*& aHash, + TUid aAlgorithmUid, + const CCryptoParams* aAlgorithmParams); + + //virtual function from MPluginSelector + virtual void CreateAsyncHashL(CAsyncHash*& aHash, + TUid aAlgorithmUid, + const CCryptoParams* aAlgorithmParams); + +#endif + + /** @internalComponent */ + static TInt AscendCreatorName(const CRulesCharacteristicsAndPluginName& aLeft, const CRulesCharacteristicsAndPluginName& aRight); + + /** @internalComponent */ + static TInt DescendCreatorName(const CRulesCharacteristicsAndPluginName& aLeft, const CRulesCharacteristicsAndPluginName& aRight); + + /** @internalComponent */ + static TInt AscendExtendedTDesC8L(const CRulesCharacteristicsAndPluginName& aLeft, const CRulesCharacteristicsAndPluginName& aRight); + + /** @internalComponent */ + static TInt DescendExtendedTDesC8L(const CRulesCharacteristicsAndPluginName& aLeft, const CRulesCharacteristicsAndPluginName& aRight); + + /** @internalComponent */ + static TInt AscendMaxConcurrencySupported(const CRulesCharacteristicsAndPluginName& aLeft, const CRulesCharacteristicsAndPluginName& aRight); + + /** @internalComponent */ + static TInt DescendMaxConcurrencySupported(const CRulesCharacteristicsAndPluginName& aLeft, const CRulesCharacteristicsAndPluginName& aRight); + + /** @internalComponent */ + static TInt AscendLatency(const CRulesCharacteristicsAndPluginName& aLeft, const CRulesCharacteristicsAndPluginName& aRight); + + /** @internalComponent */ + static TInt DescendLatency(const CRulesCharacteristicsAndPluginName& aLeft, const CRulesCharacteristicsAndPluginName& aRight); + + /** @internalComponent */ + static TInt AscendThroughput(const CRulesCharacteristicsAndPluginName& aLeft, const CRulesCharacteristicsAndPluginName& aRight); + + /** @internalComponent */ + static TInt DescendThroughput(const CRulesCharacteristicsAndPluginName& aLeft, const CRulesCharacteristicsAndPluginName& aRight); + + /** @internalComponent */ + static TInt AscendHashBlockSize(const CRulesCharacteristicsAndPluginName& aLeft, const CRulesCharacteristicsAndPluginName& aRight); + + /** @internalComponent */ + static TInt DescendHashBlockSize(const CRulesCharacteristicsAndPluginName& aLeft, const CRulesCharacteristicsAndPluginName& aRight); + + /** @internalComponent */ + static TInt AscendSymmetricCipherBlockSize(const CRulesCharacteristicsAndPluginName& aLeft, const CRulesCharacteristicsAndPluginName& aRight); + + /** @internalComponent */ + static TInt DescendSymmetricCipherBlockSize(const CRulesCharacteristicsAndPluginName& aLeft, const CRulesCharacteristicsAndPluginName& aRight); + + /** @internalComponent */ + static TInt AscendHashOutputSize(const CRulesCharacteristicsAndPluginName& aLeft, const CRulesCharacteristicsAndPluginName& aRight); + + /** @internalComponent */ + static TInt DescendHashOutputSize(const CRulesCharacteristicsAndPluginName& aLeft, const CRulesCharacteristicsAndPluginName& aRight); + + /** @internalComponent */ + static TInt AscendRandomBlockingMode(const CRulesCharacteristicsAndPluginName& aLeft, const CRulesCharacteristicsAndPluginName& aRight); + + /** @internalComponent */ + static TInt DescendRandomBlockingMode(const CRulesCharacteristicsAndPluginName& aLeft, const CRulesCharacteristicsAndPluginName& aRight); + + /** @internalComponent */ + static TInt AscendSymmetricCipherKeyLength(const CRulesCharacteristicsAndPluginName& aLeft, const CRulesCharacteristicsAndPluginName& aRight); + + /** @internalComponent */ + static TInt DescendSymmetricCipherKeyLength(const CRulesCharacteristicsAndPluginName& aLeft, const CRulesCharacteristicsAndPluginName& aRight); + + /** @internalComponent */ + static TInt AscendAsymmetricCipherKeyLength(const CRulesCharacteristicsAndPluginName& aLeft, const CRulesCharacteristicsAndPluginName& aRight); + + /** @internalComponent */ + static TInt DescendAsymmetricCipherKeyLength(const CRulesCharacteristicsAndPluginName& aLeft, const CRulesCharacteristicsAndPluginName& aRight); + + /** @internalComponent */ + static TInt AscendAsymmetricSignatureKeyLength(const CRulesCharacteristicsAndPluginName& aLeft, const CRulesCharacteristicsAndPluginName& aRight); + + /** @internalComponent */ + static TInt DescendAsymmetricSignatureKeyLength(const CRulesCharacteristicsAndPluginName& aLeft, const CRulesCharacteristicsAndPluginName& aRight); + + /** @internalComponent */ + static TInt AscendSymmetricCipherKeySupport(const CRulesCharacteristicsAndPluginName& aLeft, const CRulesCharacteristicsAndPluginName& aRight); + + /** @internalComponent */ + static TInt DescendSymmetricCipherKeySupport(const CRulesCharacteristicsAndPluginName& aLeft, const CRulesCharacteristicsAndPluginName& aRight); + + /** @internalComponent */ + static TInt AscendAsymmetricCipherKeySupport(const CRulesCharacteristicsAndPluginName& aLeft, const CRulesCharacteristicsAndPluginName& aRight); + + /** @internalComponent */ + static TInt DescendAsymmetricCipherKeySupport(const CRulesCharacteristicsAndPluginName& aLeft, const CRulesCharacteristicsAndPluginName& aRight); + + /** @internalComponent */ + static TInt AscendAsymmetricSignatureKeySupport(const CRulesCharacteristicsAndPluginName& aLeft, const CRulesCharacteristicsAndPluginName& aRight); + + /** @internalComponent */ + static TInt DescendAsymmetricSignatureKeySupport(const CRulesCharacteristicsAndPluginName& aLeft, const CRulesCharacteristicsAndPluginName& aRight); + + /** @internalComponent */ + static TInt AscendAsymmetricKeypairGeneratorKeyLength(const CRulesCharacteristicsAndPluginName& aLeft, const CRulesCharacteristicsAndPluginName& aRight); + + /** @internalComponent */ + static TInt DescendAsymmetricKeypairGeneratorKeyLength(const CRulesCharacteristicsAndPluginName& aLeft, const CRulesCharacteristicsAndPluginName& aRight); + + /** @internalComponent */ + static TInt AscendExtendedCharacteristicL(const CRulesCharacteristicsAndPluginName& aLeft, const CRulesCharacteristicsAndPluginName& aRight); + + /** @internalComponent */ + static TInt DescendExtendedCharacteristicL(const CRulesCharacteristicsAndPluginName& aLeft, const CRulesCharacteristicsAndPluginName& aRight); + + private: + + /** + Constructor + @param aRules the Rules to select the plugins + */ + CRuleSelector(); + + /** + Second Phase Constructor + */ + void ConstructL(CSelectionRules* aRules); + + void PerformFilterL(CSelectionRules* aRules); + + void PerformAlgorithmFilterL(TInt32 aInterfaceUid, RPointerArray& aCharacteristicsDLL, + CSelectionRuleContent* aRules, TInt& aLastPreference); + + TBool FilterCommonCharacteristicsL(TInt32 aInterfaceUid, RPointerArray& aCharacteristicsDLL, + CSelectionRuleContent* aRules, TInt& aLastPreference); + + TBool FilterNonCommonCharacteristicsL(TInt32 aInterfaceUid, RPointerArray& aCharacteristicsDLL, + CSelectionRuleContent* aRules, TInt& aLastPreference); + + TBool FilterExtendedCharacteristicsL(TInt32 aInterfaceUid, RPointerArray& aCharacteristicsDLL, + CSelectionRuleContent* aRules, TInt& aLastPreference); + + void FilterTInt32L(TInt32 aInterfaceUid, CRulesCharacteristicsAndPluginName& aCharacteristics, + CSelectionRuleContent* aRules, TInt& aLastPreference, TInt32 aCharValue); + + void FilterMultiTInt32L(TInt32 aInterfaceUid, CRulesCharacteristicsAndPluginName& aCharacteristicsDLL, + CSelectionRuleContent* aRules, TInt& aLastPreference, + TBool aSupport); + + void FilterCreatorNameL(TInt32 aInterfaceUid, RPointerArray& aCharacteristicsDLL, + CSelectionRuleContent* aRules, TInt& aLastPreference); + + void FilterExtendedTDesC8L(TInt32 aInterfaceUid, RPointerArray& aCharacteristicsDLL, + CSelectionRuleContent* aRules, TInt& aLastPreference, const TDesC8& aCharValue); + + void FilterTBoolL(TInt32 aInterfaceUid, CRulesCharacteristicsAndPluginName& aCharacteristics, + CSelectionRuleContent* aRules, TInt& aLastPreference, TBool aCharValue); + + void FilterTIntL(TInt32 aInterfaceUid, RPointerArray& aCharacteristicsDLL, + CSelectionRuleContent* aRules, TInt& aLastPreference, TInt aCharValue); + + void TryAddToOptionalCharListL(TInt32 aInterfaceUid, CRulesCharacteristicsAndPluginName& aCharacteristics, + CSelectionRuleContent* aRules); + + void AddToCharListL(TInt32 aInterfaceUid, CRulesCharacteristicsAndPluginName& aCharacteristics, + TInt& aLastPreference); + + void AddOptionalToCharListL(TInt32 aInterfaceUid, CRulesCharacteristicsAndPluginName& aCharacteristics); + + void ConstructMapAL(); + + void SetSearchRecord(TUid aInterfaceUid, TInt aValue); + + /** + Loads the crypto plugins + */ + void LoadPluginsL(); + + TInt FindPlugin(TUid aInterfaceUid, TUid aAlgorithmUid, TUid& aImplementationId, TFileName& aDllName); + + /** + The selection rules to filter the plugins + */ + CSelectionRules* iSelectionRules; + + /** + Maps of the interface UID and the pointer of algorithm's characteristic array + They are used alternatively to filter from one array to the other + The final array will be set to iActiveInterfaceCharacteristics_Map for plugin lookup + */ + RHashMap*> iSelectedInterfaceCharacteristics_MapA; + RHashMap*> iSelectedInterfaceCharacteristics_MapB; + + /** + Pointer of the active map of the interface UID and the characteristic list + */ + const RHashMap*>* iActiveInterfaceCharacteristics_Map; + + /** + Records the next index to try + */ + RHashMap iNextTryCharacteristicsIndex; + + /** + To indicate whether to use iSelectedInterfaceCharacteristics_MapA + or iSelectedInterfaceCharacteristics_MapA to filter + */ + TBool iUseMapAToFilter; + + /** + This is use to indicate whether to alternate the maps for next rule filtering or not + */ + TBool iToggleUseMap; + + /** + The plugin DLL list, which holds all the plugin DLLs + */ + RArray iPluginDllList; + }; + } + +#endif //__CRYPTOAPI_RULESELECTOR_H__