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