cryptoplugins/cryptospiplugins/source/softwarecrypto/dhkeypairgenimpl.cpp
changeset 19 cd501b96611d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cryptoplugins/cryptospiplugins/source/softwarecrypto/dhkeypairgenimpl.cpp	Fri Nov 06 13:21:00 2009 +0200
@@ -0,0 +1,154 @@
+/*
+* Copyright (c) 2007-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 "dhkeypairgenimpl.h"
+#include "pluginconfig.h"
+#include "keypair.h"
+
+using namespace SoftwareCrypto;
+using namespace CryptoSpi;
+
+/* CDHKeyPairGenImpl */
+CDHKeyPairGenImpl::CDHKeyPairGenImpl()
+	{
+	
+	}
+
+CDHKeyPairGenImpl::~CDHKeyPairGenImpl()
+	{
+	
+	}
+
+CDHKeyPairGenImpl* CDHKeyPairGenImpl::NewL(void)
+	{
+	CDHKeyPairGenImpl* self = CDHKeyPairGenImpl::NewLC();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CDHKeyPairGenImpl* CDHKeyPairGenImpl::NewLC(void)
+	{
+	CDHKeyPairGenImpl* self = new(ELeave) CDHKeyPairGenImpl();
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	return self;
+	}
+
+void CDHKeyPairGenImpl::ConstructL(void)
+	{
+	CKeyPairGenImpl::ConstructL();
+	}
+
+CExtendedCharacteristics* CDHKeyPairGenImpl::CreateExtendedCharacteristicsL()
+	{
+	// All Symbian software plug-ins have unlimited concurrency, cannot be reserved
+	// for exclusive use and are not CERTIFIED to be standards compliant.
+	return CExtendedCharacteristics::NewL(KMaxTInt, EFalse);
+	}
+
+const CExtendedCharacteristics* CDHKeyPairGenImpl::GetExtendedCharacteristicsL()
+	{
+	return CDHKeyPairGenImpl::CreateExtendedCharacteristicsL();
+	}
+
+TUid CDHKeyPairGenImpl::ImplementationUid() const
+	{
+	return KCryptoPluginDhKeyPairGenUid;
+	}
+
+void CDHKeyPairGenImpl::Reset()
+	{
+	// does nothing in this plugin
+	}
+
+void CDHKeyPairGenImpl::GenerateKeyPairL(TInt /*aKeySize*/, const CCryptoParams& aKeyParameters, CKeyPair*& aKeyPair)
+	{
+	/*
+	 * unpack the parameters, we're expecting the N and G parameters and if present the x parameter (aka private key)
+	 */
+	const TInteger& N = aKeyParameters.GetBigIntL(KDhKeyParameterNUid);
+	const TInteger& G = aKeyParameters.GetBigIntL(KDhKeyParameterGUid);
+
+	/*
+	 * do some sanity checking
+	 */
+	RInteger nminus2 = RInteger::NewL(N);
+	CleanupStack::PushL(nminus2);
+	--nminus2;
+	--nminus2;
+
+	if ((G < TInteger::Two()) || (G > nminus2))
+		{
+		User::Leave(KErrArgument);
+		}
+
+	/*
+	 * has a private key x been supplied? if not then generate it
+	 */
+	RInteger x;
+	if (aKeyParameters.IsPresent(KDhKeyParameterxUid))
+		{
+		x = RInteger::NewL(aKeyParameters.GetBigIntL(KDhKeyParameterxUid));
+		}
+		else
+		{
+		// find a random x | 1 <= x <= n-2
+		x = RInteger::NewRandomL(TInteger::One(), nminus2);
+		}
+	CleanupClosePushL(x);
+	/*
+	 * generate the public key with X = G^(x) mod N
+	 */
+	RInteger X = TInteger::ModularExponentiateL(G, x, N);
+	CleanupClosePushL(X);
+
+	/*
+	 * create the keys parameters
+	  */
+	CCryptoParams* publicKeyParameters = CCryptoParams::NewLC();
+	publicKeyParameters->AddL(X, KDhKeyParameterXUid);
+	TKeyProperty publicKeyProperties = {KDHKeyPairGeneratorUid, 	KCryptoPluginDhKeyPairGenUid, 
+									KDHPublicKeyUid, KNonEmbeddedKeyUid };
+	CCryptoParams* privateKeyParameters = CCryptoParams::NewLC();
+	privateKeyParameters->AddL(x, KDhKeyParameterxUid);
+	TKeyProperty privateKeyProperties = {KDHKeyPairGeneratorUid, KCryptoPluginDhKeyPairGenUid,
+									KDHPrivateKeyUid, KNonEmbeddedKeyUid };
+
+	/*
+	 * create the public key
+	 */
+	CKey* publicKey = CKey::NewL(publicKeyProperties, *publicKeyParameters);
+	CleanupStack::PushL(publicKey);
+
+	/*
+	 * create the private key
+	 */
+	CKey* privateKey = CKey::NewL(privateKeyProperties, *privateKeyParameters);
+	CleanupStack::PushL(privateKey);
+
+	/*
+	 * create the key pair
+	 */
+	aKeyPair = CKeyPair::NewL(publicKey, privateKey);
+	
+	/* 
+	 * cleanup stack - it should contain nminus2, x (if allocated here), X, publicKeyParameters, privateKeyParameters, publicKey and privateKey
+	 */
+	CleanupStack::Pop(2, publicKey);
+	CleanupStack::PopAndDestroy(5, &nminus2);
+	}