Skip to content
Snippets Groups Projects
Commit 14e1cd60 authored by akwizgran's avatar akwizgran
Browse files

Normalise elliptic curve points.

parent a168a7ba
No related branches found
No related tags found
No related merge requests found
......@@ -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
......
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;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment