mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-19 22:29:53 +01:00
Normalise elliptic curve points.
This commit is contained in:
@@ -9,6 +9,7 @@ import org.briarproject.api.crypto.PublicKey;
|
|||||||
import org.spongycastle.crypto.params.ECDomainParameters;
|
import org.spongycastle.crypto.params.ECDomainParameters;
|
||||||
import org.spongycastle.crypto.params.ECPrivateKeyParameters;
|
import org.spongycastle.crypto.params.ECPrivateKeyParameters;
|
||||||
import org.spongycastle.crypto.params.ECPublicKeyParameters;
|
import org.spongycastle.crypto.params.ECPublicKeyParameters;
|
||||||
|
import org.spongycastle.math.ec.ECCurve;
|
||||||
import org.spongycastle.math.ec.ECPoint;
|
import org.spongycastle.math.ec.ECPoint;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -50,13 +51,14 @@ class Sec1KeyParser implements KeyParser {
|
|||||||
BigInteger y = new BigInteger(1, yBytes); // Positive signum
|
BigInteger y = new BigInteger(1, yBytes); // Positive signum
|
||||||
if(y.compareTo(modulus) >= 0) throw new GeneralSecurityException();
|
if(y.compareTo(modulus) >= 0) throw new GeneralSecurityException();
|
||||||
// Verify that y^2 == x^3 + ax + b (mod p)
|
// Verify that y^2 == x^3 + ax + b (mod p)
|
||||||
BigInteger a = params.getCurve().getA().toBigInteger();
|
ECCurve curve = params.getCurve();
|
||||||
BigInteger b = params.getCurve().getB().toBigInteger();
|
BigInteger a = curve.getA().toBigInteger();
|
||||||
|
BigInteger b = curve.getB().toBigInteger();
|
||||||
BigInteger lhs = y.multiply(y).mod(modulus);
|
BigInteger lhs = y.multiply(y).mod(modulus);
|
||||||
BigInteger rhs = x.multiply(x).add(a).multiply(x).add(b).mod(modulus);
|
BigInteger rhs = x.multiply(x).add(a).multiply(x).add(b).mod(modulus);
|
||||||
if(!lhs.equals(rhs)) throw new GeneralSecurityException();
|
if(!lhs.equals(rhs)) throw new GeneralSecurityException();
|
||||||
// We know the point (x, y) is on the curve, so we can create the point
|
// 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
|
// Verify that the point (x, y) is not the point at infinity
|
||||||
if(pub.isInfinity()) throw new GeneralSecurityException();
|
if(pub.isInfinity()) throw new GeneralSecurityException();
|
||||||
// Verify that the point (x, y) times n is the point at infinity
|
// Verify that the point (x, y) times n is the point at infinity
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
package org.briarproject.crypto;
|
package org.briarproject.crypto;
|
||||||
|
|
||||||
import org.briarproject.api.crypto.PublicKey;
|
import org.briarproject.api.crypto.PublicKey;
|
||||||
|
|
||||||
import org.spongycastle.crypto.params.ECPublicKeyParameters;
|
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:
|
* An elliptic curve public key that uses the encoding defined in "SEC 1:
|
||||||
@@ -23,9 +23,10 @@ class Sec1PublicKey implements PublicKey {
|
|||||||
public byte[] getEncoded() {
|
public byte[] getEncoded() {
|
||||||
byte[] encodedKey = new byte[publicKeyBytes];
|
byte[] encodedKey = new byte[publicKeyBytes];
|
||||||
encodedKey[0] = 4;
|
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);
|
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,
|
Sec1Utils.convertToFixedLength(y, encodedKey, 1 + bytesPerInt,
|
||||||
bytesPerInt);
|
bytesPerInt);
|
||||||
return encodedKey;
|
return encodedKey;
|
||||||
|
|||||||
Reference in New Issue
Block a user