crypto/weakcryptospi/source/asymmetric/dhkeys.cpp
changeset 19 cd501b96611d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/crypto/weakcryptospi/source/asymmetric/dhkeys.cpp	Fri Nov 06 13:21:00 2009 +0200
@@ -0,0 +1,225 @@
+/*
+* Copyright (c) 2003-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 <asymmetrickeys.h>
+#include "dhkeypairshim.h"
+
+
+/* CDHParameters */
+EXPORT_C const TInteger& CDHParameters::N(void) const
+	{
+	return iN;
+	}
+
+EXPORT_C const TInteger& CDHParameters::G(void) const
+	{
+	return iG;
+	}
+
+EXPORT_C CDHParameters::~CDHParameters(void)
+	{
+	iN.Close();
+	iG.Close();
+	}
+
+EXPORT_C CDHParameters::CDHParameters(RInteger& aN, RInteger& aG) : iN(aN), iG(aG)
+	{
+	}
+
+/* CDHPublicKey */
+EXPORT_C CDHPublicKey* CDHPublicKey::NewL(RInteger& aN, RInteger& aG, 
+	RInteger& aX)
+	{
+	CDHPublicKey* self = new(ELeave) CDHPublicKey(aN, aG, aX);
+	return self;
+	}
+
+EXPORT_C CDHPublicKey* CDHPublicKey::NewLC(RInteger& aN, RInteger& aG, 
+	RInteger& aX)
+	{
+	CDHPublicKey* self = NewL(aN, aG, aX);
+	CleanupStack::PushL(self);
+	return self;
+	}
+
+EXPORT_C const TInteger& CDHPublicKey::X(void) const
+	{
+	return iX;
+	}
+
+EXPORT_C CDHPublicKey::CDHPublicKey(RInteger& aN, RInteger& aG, RInteger& aX)
+	: CDHParameters(aN, aG), iX(aX)
+	{
+	}
+
+EXPORT_C CDHPublicKey::~CDHPublicKey(void)
+	{
+	iX.Close();
+	}
+
+/* CDHPrivateKey */
+EXPORT_C CDHPrivateKey* CDHPrivateKey::NewL(RInteger& aN, RInteger& aG, 
+	RInteger& ax)
+	{
+	CDHPrivateKey* self = new(ELeave) CDHPrivateKey(aN, aG, ax);
+	return self;
+	}
+
+EXPORT_C CDHPrivateKey* CDHPrivateKey::NewLC(RInteger& aN, RInteger& aG, 
+	RInteger& ax)
+	{
+	CDHPrivateKey* self = NewL(aN, aG, ax);
+	CleanupStack::PushL(self);
+	return self;
+	}
+
+EXPORT_C const TInteger& CDHPrivateKey::x(void) const
+	{
+	return ix;
+	}
+
+EXPORT_C CDHPrivateKey::CDHPrivateKey(RInteger& aN, RInteger& aG, RInteger& ax)
+	: CDHParameters(aN, aG), ix(ax)
+	{
+	}
+
+EXPORT_C CDHPrivateKey::~CDHPrivateKey(void)
+	{
+	ix.Close();
+	}
+
+/* CDHKeyPair */
+
+EXPORT_C CDHKeyPair* CDHKeyPair::NewL(RInteger& aN, RInteger& aG)
+	{
+	CDHKeyPairShim* self = CDHKeyPairShim::NewLC(aN, aG);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+EXPORT_C CDHKeyPair* CDHKeyPair::NewLC(RInteger& aN, RInteger& aG)
+	{
+	CDHKeyPairShim* self = CDHKeyPairShim::NewLC(aN, aG);
+	return self;
+	}
+
+EXPORT_C CDHKeyPair* CDHKeyPair::NewL(RInteger& aN, RInteger& aG, RInteger& ax)
+	{
+	CDHKeyPairShim* self = CDHKeyPairShim::NewLC(aN, aG, ax);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+EXPORT_C CDHKeyPair* CDHKeyPair::NewLC(RInteger& aN, RInteger& aG, RInteger& ax)
+	{
+	CDHKeyPairShim* self = CDHKeyPairShim::NewLC(aN, aG, ax);
+	return self;
+	}
+
+EXPORT_C const CDHPublicKey& CDHKeyPair::PublicKey(void) const
+	{
+	return *iPublic;
+	}
+
+EXPORT_C const CDHPrivateKey& CDHKeyPair::PrivateKey(void) const
+	{
+	return *iPrivate;
+	}
+
+EXPORT_C CDHKeyPair::~CDHKeyPair(void)
+	{
+	delete iPublic;
+	delete iPrivate;
+	}
+
+EXPORT_C CDHKeyPair::CDHKeyPair(void)
+	{
+	}
+
+// Excluded from coverage due to shim replacements.
+#ifdef _BullseyeCoverage
+#pragma suppress_warnings on
+#pragma BullseyeCoverage off
+#pragma suppress_warnings off
+#endif
+EXPORT_C void CDHKeyPair::ConstructL(RInteger& aN, RInteger& aG)
+	{
+	//declaring a reference just for clarity in NewRandomL statement
+	RInteger& nminus2 = aN;
+	--nminus2;
+	--nminus2;
+
+	//find a random x | 1 <= x <= n-2
+	RInteger x = RInteger::NewRandomL(TInteger::One(), nminus2);
+	CleanupStack::PushL(x);
+	++nminus2;
+	++nminus2; // reincrement aN
+
+	ConstructL(aN, aG, x);
+
+	CleanupStack::Pop(&x);
+	}
+
+EXPORT_C void CDHKeyPair::ConstructL(RInteger& aN, RInteger& aG, RInteger& ax)
+	{
+	//declaring a reference just for clarity in if statements
+	RInteger& nminus2 = aN;
+	--nminus2;
+	--nminus2;
+	
+	if( aG < TInteger::Two() || aG > nminus2 )
+		{
+		User::Leave(KErrArgument);
+		}
+	//In the case of the other ConstructL calling this function this if
+	//statement is redundant.  However, we need to check as this is can be
+	//called without going through the other api.
+	if( ax < TInteger::One() || ax > nminus2 )
+		{
+		User::Leave(KErrArgument);
+		}
+
+	++nminus2;
+	++nminus2; // reincrement aN
+
+	// Calculate X = g^(x) mod n; (note the case sensitivity)
+	RInteger X = TInteger::ModularExponentiateL(aG, ax, aN);
+	CleanupStack::PushL(X);
+
+	RInteger n1 = RInteger::NewL(aN);
+	CleanupStack::PushL(n1);
+	RInteger g1 = RInteger::NewL(aG);
+	CleanupStack::PushL(g1);
+	iPublic = CDHPublicKey::NewL(n1, g1, X);
+	CleanupStack::Pop(3, &X); // g1, n1, X all owned by iPublic
+	
+	iPrivate = CDHPrivateKey::NewL(aN, aG, ax);
+	}
+
+// Unused exported and protected members. So, exclude them from coverage.
+EXPORT_C CDHParameters::CDHParameters(void)
+	{
+	}
+
+EXPORT_C CDHPrivateKey::CDHPrivateKey(void)
+	{
+	}
+
+EXPORT_C CDHPublicKey::CDHPublicKey(void)
+	{
+	}