Normalise elliptic curve points.

This commit is contained in:
akwizgran
2014-01-16 15:35:25 +00:00
parent a168a7ba89
commit 14e1cd6072
2 changed files with 9 additions and 6 deletions

View File

@@ -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

View File

@@ -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;