cryptoplugins/cryptospiplugins/source/softwarecrypto/pluginentry.cpp
changeset 19 cd501b96611d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cryptoplugins/cryptospiplugins/source/softwarecrypto/pluginentry.cpp	Fri Nov 06 13:21:00 2009 +0200
@@ -0,0 +1,448 @@
+/*
+* 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: 
+* plugin entry implementation
+* plugin entry implementation
+*
+*/
+
+
+/**
+ @file
+*/
+
+#include "pluginentry.h"
+#include "keypair.h"
+#include "pluginconfig.h"
+#include "md2impl.h"
+#include "md5impl.h"
+#include "md4impl.h"
+#include "sha1impl.h"
+#include "hmacimpl.h"
+#include "keys.h"
+#include "3desimpl.h"
+#include "desimpl.h"
+#include "rc2impl.h"
+#include "arc4impl.h"
+#include "randomimpl.h"
+#include "rijndaelimpl.h"
+#include "randomimpl.h"
+#include "rsaimpl.h"
+#include "dhimpl.h"
+#include "dhkeypairgenimpl.h"
+#include "rsakeypairgenimpl.h"
+#include "dsakeypairgenimpl.h"
+#include "dsasignerimpl.h"
+#include "dsaverifyimpl.h"
+#include "rsasignerimpl.h"
+#include "rsaverifyimpl.h"
+#include <cryptospi/cryptospidef.h>
+
+#ifdef SYMBIAN_SDP_IPSEC_VOIP_SUPPORT	
+	#include "macimpl.h"
+#endif
+
+
+using namespace SoftwareCrypto;
+
+EXPORT_C const TCharacteristics** CCryptoPluginEntry::Enumerate(TUid aInterface, TInt& aNumPlugins)
+	{
+	const TCharacteristics** ptr(0);
+	switch (aInterface.iUid)
+		{
+	case KHashInterface:
+		{
+		aNumPlugins=sizeof(KHashCharacteristics)/sizeof(THashCharacteristics*);
+		ptr = (const TCharacteristics**) &KHashCharacteristics[0];
+		}
+		break;
+		
+#ifdef SYMBIAN_SDP_IPSEC_VOIP_SUPPORT		
+		
+	case KMacInterface:
+		{
+		aNumPlugins=sizeof(KMacCharacteristics)/sizeof(TMacCharacteristics*);
+		ptr = (const TCharacteristics**) &KMacCharacteristics[0];
+		}
+		break;
+		
+#endif
+		
+	case KRandomInterface:
+		{
+		aNumPlugins=sizeof(KRandomCharacteristics)/sizeof(TRandomCharacteristics*);
+		ptr= (const TCharacteristics**) &KRandomCharacteristics[0];
+		}
+		break;
+
+	case KSymmetricCipherInterface:
+		{
+		aNumPlugins=sizeof(KSymmetricCipherCharacteristics)/sizeof(TSymmetricCipherCharacteristics*);
+		ptr = (const TCharacteristics**) &KSymmetricCipherCharacteristics[0];
+		}
+		break;
+
+	case KAsymmetricCipherInterface:
+		{
+		aNumPlugins=sizeof(KAsymmetricCipherCharacteristics)/sizeof(TAsymmetricCipherCharacteristics*);
+		ptr = (const TCharacteristics**) &KAsymmetricCipherCharacteristics[0];
+		}
+		break;
+
+	case KSignerInterface:
+		{
+		aNumPlugins=sizeof(KSignerCharacteristics)/sizeof(TAsymmetricSignatureCharacteristics*);
+		ptr = (const TCharacteristics**) &KSignerCharacteristics[0];
+		}
+		break;
+
+	case KVerifierInterface:
+		{
+		aNumPlugins=sizeof(KVerifierCharacteristics)/sizeof(TAsymmetricSignatureCharacteristics*);
+		ptr = (const TCharacteristics**) &KVerifierCharacteristics[0];
+		}
+		break;
+
+	case KKeyAgreementInterface:
+		{
+		aNumPlugins=sizeof(KKeyAgreementCharacteristics)/sizeof(TKeyAgreementCharacteristics*);
+		ptr = (const TCharacteristics**) &KKeyAgreementCharacteristics[0];
+		}
+		break;
+
+	case KKeypairGeneratorInterface:
+		{
+		aNumPlugins=sizeof(KKeyPairGeneratorCharacteristics)/sizeof(TAsymmetricKeypairGeneratorCharacteristics*);
+		ptr = (const TCharacteristics**) &KKeyPairGeneratorCharacteristics[0];
+		}
+		break;
+
+	case KKeyGeneratorInterface:
+		break;
+		
+	default:;
+		}
+		
+	return ptr;
+	}
+
+EXPORT_C void CCryptoPluginEntry::GetExtendedCharacteristicsL(TUid aImplementationUid, CExtendedCharacteristics*& aExt)
+	{
+	switch (aImplementationUid.iUid)
+		{
+		
+#ifdef SYMBIAN_SDP_IPSEC_VOIP_SUPPORT	
+	case KCryptoPluginMacHashMd2:   
+#endif
+	
+	case KCryptoPluginMd2:
+	   aExt = CMD2Impl::CreateExtendedCharacteristicsL();
+	   break;
+	   
+#ifdef SYMBIAN_SDP_IPSEC_VOIP_SUPPORT	
+	case KCryptoPluginMacHashMd5:   
+#endif
+	
+	case KCryptoPluginMd5:
+	   aExt = CMD5Impl::CreateExtendedCharacteristicsL();
+	   break;
+	   
+#ifdef SYMBIAN_SDP_IPSEC_VOIP_SUPPORT	
+	case KCryptoPluginMacHashSha1:   
+#endif
+	
+	case KCryptoPluginSha1:
+	   aExt = CSHA1Impl::CreateExtendedCharacteristicsL();
+	   break;
+	   
+#ifdef SYMBIAN_SDP_IPSEC_VOIP_SUPPORT	
+	case KCryptoPluginMacHashMd4:   
+#endif
+	
+	case KCryptoPluginMd4:
+	   aExt = CMD4Impl::CreateExtendedCharacteristicsL();
+	   break;
+	case KCryptoPluginRandom:
+	   aExt = CRandomImpl::CreateExtendedCharacteristicsL();
+	   break;
+	case KCryptoPluginDes:
+	   aExt = CDesImpl::CreateExtendedCharacteristicsL();
+	   break;
+	case KCryptoPlugin3Des:
+	   aExt = C3DesImpl::CreateExtendedCharacteristicsL();
+	   break;
+	case KCryptoPluginRc2:
+	   aExt = CRc2Impl::CreateExtendedCharacteristicsL();
+	   break;
+	case KCryptoPluginArc4:
+	   aExt = CArc4Impl::CreateExtendedCharacteristicsL();
+	   break;
+	   
+#ifdef SYMBIAN_SDP_IPSEC_VOIP_SUPPORT	
+	case KCryptoPluginMacAesXcbcMac96:   
+	case KCryptoPluginMacAesXcbcPrf128:
+#endif	
+	
+	case KCryptoPluginAes:
+	   aExt = CRijndaelImpl::CreateExtendedCharacteristicsL();
+	   break;
+	case KCryptoPluginRsaCipher:
+	   aExt = CRSAImpl::CreateExtendedCharacteristicsL();
+	   break;
+	case KCryptoPluginRsaSigner:
+	   aExt = CRSASignerImpl::CreateExtendedCharacteristicsL();
+	   break;
+	case KCryptoPluginDsaSigner:
+	   aExt = CDSASignerImpl::CreateExtendedCharacteristicsL();
+	   break;
+	case KCryptoPluginRsaVerifier:
+	   aExt = CRSAVerifierImpl::CreateExtendedCharacteristicsL();
+	   break;
+	case KCryptoPluginDsaVerifier:
+	   aExt = CDSAVerifierImpl::CreateExtendedCharacteristicsL();
+	   break;
+	case KCryptoPluginDhKeyAgreement:
+	   aExt = CDHImpl::CreateExtendedCharacteristicsL();
+	   break;
+	case KCryptoPluginDhKeyPairGen:
+	   aExt = CDHKeyPairGenImpl::CreateExtendedCharacteristicsL();
+	   break;
+	case KCryptoPluginRsaKeyPairGen:
+	   aExt = CRSAKeyPairGenImpl::CreateExtendedCharacteristicsL();
+	   break;
+	case KCryptoPluginDsaKeyPairGen:
+	   aExt = CDSAKeyPairGenImpl::CreateExtendedCharacteristicsL();
+	   break;
+	default:
+		User::Leave(KErrNotSupported);
+		}
+	}
+	
+EXPORT_C void CCryptoPluginEntry::CreateAsymmetricCipherL(MAsymmetricCipher*& aPlugin,
+														TUid aImplementationId,
+														const CKey& aKey,
+														TUid aCryptoMode,
+														TUid aPaddingMode,
+														const CCryptoParams* /*aAlgorithmParams*/)
+	{
+	switch (aImplementationId.iUid)
+		{
+	case KCryptoPluginRsaCipher:
+		{
+		aPlugin = CRSAImpl::NewL(aKey, aCryptoMode, aPaddingMode);
+		}
+		break;
+		
+	default:
+		User::Leave(KErrNotFound);
+		}
+	}
+	
+EXPORT_C void CCryptoPluginEntry::CreateAsymmetricSignerL(MSigner*& aPlugin,
+														TUid aImplementationId,
+														const CKey& aKey,
+														TUid aPaddingMode,
+														const CCryptoParams* /*aAlgorithmParams*/)
+	{
+	switch (aImplementationId.iUid)
+		{
+	case KCryptoPluginRsaSigner:
+		{
+		aPlugin = CRSASignerImpl::NewL(aKey, aPaddingMode);
+		}	
+		break;
+
+	case KCryptoPluginDsaSigner:
+		{
+		aPlugin = CDSASignerImpl::NewL(aKey);
+		}	
+		break;
+
+	default:
+		User::Leave(KErrNotFound);
+		}
+	}
+	
+EXPORT_C void CCryptoPluginEntry::CreateAsymmetricVerifierL(MVerifier*& aPlugin,
+															TUid aImplementationId,
+															const CKey& aKey,
+															TUid aPaddingMode,
+															const CCryptoParams* /*aAlgorithmParams*/)
+	{
+	switch (aImplementationId.iUid)
+		{
+	case KCryptoPluginRsaVerifier:
+		aPlugin = CRSAVerifierImpl::NewL(aKey, aPaddingMode);
+		break;
+	
+	case KCryptoPluginDsaVerifier:
+		{
+		aPlugin = CDSAVerifierImpl::NewL(aKey);
+		}	
+		break;
+		
+	default:
+		User::Leave(KErrNotFound);
+		}
+	}
+
+EXPORT_C void CCryptoPluginEntry::CreateHashL(MHash*& aPlugin,
+											TUid aImplementationId,
+											TUid aOperationMode,
+											const CKey* aKey,
+											const CCryptoParams* /*aAlgorithmParams*/)
+	{
+	aPlugin=CSoftwareHash::NewL(aImplementationId, aOperationMode, aKey);
+	}
+
+#ifdef SYMBIAN_SDP_IPSEC_VOIP_SUPPORT	
+
+EXPORT_C void CCryptoPluginEntry::CreateHashL(MHash*& aPlugin,
+											TUid aImplementationId,
+											const CCryptoParams* /*aAlgorithmParams*/)
+	{
+	aPlugin=CSoftwareHash::NewL(aImplementationId);
+	}
+
+EXPORT_C void CCryptoPluginEntry::CreateMacL(MMac*& aPlugin,
+											const TUid aImplementationId,
+											const CKey& aKey,
+											const CCryptoParams* aAlgorithmParams)
+	{
+	aPlugin=CMacImpl::NewL(aKey, aImplementationId, aAlgorithmParams);
+	}
+
+#endif
+
+EXPORT_C void CCryptoPluginEntry::CreateKeyAgreementL(MKeyAgreement*& aPlugin,
+														TUid aImplementationId,
+														const CKey& aPrivateKey,
+														const CCryptoParams* aAlgorithmParams)
+	{
+	// create requested key agreement implementation in this plugin
+	switch (aImplementationId.iUid)
+		{
+	case KCryptoPluginDhKeyAgreement:
+		{
+		aPlugin = CDHImpl::NewL(aPrivateKey, aAlgorithmParams);
+		}
+		break;
+
+	default:
+		User::Leave(KErrNotFound);
+		}
+	}
+
+EXPORT_C void CCryptoPluginEntry::CreateKeyPairGeneratorL(MKeyPairGenerator*& aPlugin,
+														TUid aImplementationId,
+														const CCryptoParams* /*aAlgorithmParams*/)
+	{
+	// create requested key pair generator implementation in this plugin
+	switch (aImplementationId.iUid)
+		{
+	case KCryptoPluginDhKeyPairGen:
+		{
+		aPlugin = CDHKeyPairGenImpl::NewL();
+		}
+		break;
+		
+	case KCryptoPluginRsaKeyPairGen:
+		{
+		aPlugin = CRSAKeyPairGenImpl::NewL();
+		}
+		break;
+		
+	case KCryptoPluginDsaKeyPairGen:
+		{
+		aPlugin = CDSAKeyPairGenImpl::NewL();
+		}
+		break;
+		
+	default:
+		User::Leave(KErrNotFound);
+		}
+	}
+	
+EXPORT_C void CCryptoPluginEntry::CreateRandomL(MRandom*& aPlugin,
+												TUid /*aImplementationId*/,
+												const CCryptoParams* /*aAlgorithmParams*/)
+	{
+	aPlugin=CRandomImpl::NewL();
+	}	
+
+EXPORT_C void CCryptoPluginEntry::CreateSymmetricCipherL(MSymmetricCipher*& aPlugin,
+														TUid aImplementationId,
+														const CKey& aKey,
+														TUid aCryptoMode,
+														TUid aOperationMode,
+														TUid aPadding,
+														const CCryptoParams* aAlgorithmParams)
+	{
+	switch (aImplementationId.iUid)
+		{
+	case KCryptoPluginAes:
+		{
+		aPlugin=CRijndaelImpl::NewL(
+			aKey, aCryptoMode, aOperationMode, aPadding);
+		}	
+		break;
+	case KCryptoPluginDes:
+		{
+		aPlugin=CDesImpl::NewL(
+			aKey, aCryptoMode, aOperationMode, aPadding);
+		}	
+		break;
+	case KCryptoPlugin3Des:
+		{
+		aPlugin=C3DesImpl::NewL(
+			aKey, aCryptoMode, aOperationMode, aPadding);
+		}	
+		break;
+	case KCryptoPluginRc2:
+		{
+		TInt effectiveKeyLenBits(CRc2Impl::KDefaultEffectiveKeyLenBits);
+			
+		if (aAlgorithmParams && aAlgorithmParams->IsPresent(KRC2EffectiveKeyLenBits))
+			{
+			effectiveKeyLenBits = aAlgorithmParams->GetTIntL(KRC2EffectiveKeyLenBits);
+			if (effectiveKeyLenBits < 0)
+				{
+				User::Leave(KErrArgument);
+				}
+			}
+		aPlugin=CRc2Impl::NewL(
+			aKey, aCryptoMode, aOperationMode, aPadding, effectiveKeyLenBits);
+		}	
+		break;				
+	
+	case KCryptoPluginArc4:
+		{
+		TInt discardBytes(CArc4Impl::KDefaultDiscardBytes);
+		if (aAlgorithmParams && aAlgorithmParams->IsPresent(KARC4DiscardBytes))
+			{
+			discardBytes = aAlgorithmParams->GetTIntL(KARC4DiscardBytes);
+			if (discardBytes < 0)
+				{
+				User::Leave(KErrArgument);
+				}
+			}		
+		aPlugin=CArc4Impl::NewL(aKey, discardBytes);
+		}
+		break;
+		
+	default:
+		User::Leave(KErrNotFound);
+		}
+	}
+