From 14e1cd6072f3502f83c98206b66d13170bdc39db Mon Sep 17 00:00:00 2001
From: akwizgran <akwizgran@users.sourceforge.net>
Date: Thu, 16 Jan 2014 15:35:25 +0000
Subject: [PATCH] Normalise elliptic curve points.

---
 briar-core/src/org/briarproject/crypto/Sec1KeyParser.java | 8 +++++---
 briar-core/src/org/briarproject/crypto/Sec1PublicKey.java | 7 ++++---
 2 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/briar-core/src/org/briarproject/crypto/Sec1KeyParser.java b/briar-core/src/org/briarproject/crypto/Sec1KeyParser.java
index e64de28aaa..0446c6a523 100644
--- a/briar-core/src/org/briarproject/crypto/Sec1KeyParser.java
+++ b/briar-core/src/org/briarproject/crypto/Sec1KeyParser.java
@@ -9,6 +9,7 @@ import org.briarproject.api.crypto.PublicKey;
 import org.spongycastle.crypto.params.ECDomainParameters;
 import org.spongycastle.crypto.params.ECPrivateKeyParameters;
 import org.spongycastle.crypto.params.ECPublicKeyParameters;
+import org.spongycastle.math.ec.ECCurve;
 import org.spongycastle.math.ec.ECPoint;
 
 /**
@@ -50,13 +51,14 @@ class Sec1KeyParser implements KeyParser {
 		BigInteger y = new BigInteger(1, yBytes); // Positive signum
 		if(y.compareTo(modulus) >= 0) throw new GeneralSecurityException();
 		// Verify that y^2 == x^3 + ax + b (mod p)
-		BigInteger a = params.getCurve().getA().toBigInteger();
-		BigInteger b = params.getCurve().getB().toBigInteger();
+		ECCurve curve = params.getCurve();
+		BigInteger a = curve.getA().toBigInteger();
+		BigInteger b = curve.getB().toBigInteger();
 		BigInteger lhs = y.multiply(y).mod(modulus);
 		BigInteger rhs = x.multiply(x).add(a).multiply(x).add(b).mod(modulus);
 		if(!lhs.equals(rhs)) throw new GeneralSecurityException();
 		// We know the point (x, y) is on the curve, so we can create the point
-		ECPoint pub = params.getCurve().createPoint(x, y);
+		ECPoint pub = curve.createPoint(x, y).normalize();
 		// Verify that the point (x, y) is not the point at infinity
 		if(pub.isInfinity()) throw new GeneralSecurityException();
 		// Verify that the point (x, y) times n is the point at infinity
diff --git a/briar-core/src/org/briarproject/crypto/Sec1PublicKey.java b/briar-core/src/org/briarproject/crypto/Sec1PublicKey.java
index 290f35ce19..95523c79b8 100644
--- a/briar-core/src/org/briarproject/crypto/Sec1PublicKey.java
+++ b/briar-core/src/org/briarproject/crypto/Sec1PublicKey.java
@@ -1,8 +1,8 @@
 package org.briarproject.crypto;
 
 import org.briarproject.api.crypto.PublicKey;
-
 import org.spongycastle.crypto.params.ECPublicKeyParameters;
+import org.spongycastle.math.ec.ECPoint;
 
 /**
  * An elliptic curve public key that uses the encoding defined in "SEC 1:
@@ -23,9 +23,10 @@ class Sec1PublicKey implements PublicKey {
 	public byte[] getEncoded() {
 		byte[] encodedKey = new byte[publicKeyBytes];
 		encodedKey[0] = 4;
-		byte[] x = key.getQ().getAffineXCoord().toBigInteger().toByteArray();
+		ECPoint pub = key.getQ().normalize();
+		byte[] x = pub.getAffineXCoord().toBigInteger().toByteArray();
 		Sec1Utils.convertToFixedLength(x, encodedKey, 1, bytesPerInt);
-		byte[] y = key.getQ().getAffineYCoord().toBigInteger().toByteArray();
+		byte[] y = pub.getAffineYCoord().toBigInteger().toByteArray();
 		Sec1Utils.convertToFixedLength(y, encodedKey, 1 + bytesPerInt,
 				bytesPerInt);
 		return encodedKey;
-- 
GitLab