blob: 049f123e4c5f67b1685058c373e86999bb21415d [file] [log] [blame]
package org.mariadb.jdbc.plugin.authentication.standard.ed25519.math;
import java.io.Serializable;
/**
* A twisted Edwards curve. Points on the curve satisfy $-x^2 + y^2 = 1 + d x^2y^2$
*
* @author str4d
*/
public class Curve implements Serializable {
private static final long serialVersionUID = 4578920872509827L;
private final Field f;
private final FieldElement d;
private final FieldElement d2;
private final FieldElement I;
private final GroupElement zeroP2;
private final GroupElement zeroP3;
private final GroupElement zeroP3PrecomputedDouble;
private final GroupElement zeroPrecomp;
public Curve(Field f, byte[] d, FieldElement I) {
this.f = f;
this.d = f.fromByteArray(d);
this.d2 = this.d.add(this.d);
this.I = I;
FieldElement zero = f.ZERO;
FieldElement one = f.ONE;
zeroP2 = GroupElement.p2(this, zero, one, one);
zeroP3 = GroupElement.p3(this, zero, one, one, zero, false);
zeroP3PrecomputedDouble = GroupElement.p3(this, zero, one, one, zero, true);
zeroPrecomp = GroupElement.precomp(this, one, one, zero);
}
public Field getField() {
return f;
}
public FieldElement getD() {
return d;
}
public FieldElement get2D() {
return d2;
}
public FieldElement getI() {
return I;
}
public GroupElement getZero(GroupElement.Representation repr) {
switch (repr) {
case P2:
return zeroP2;
case P3:
return zeroP3;
case P3PrecomputedDouble:
return zeroP3PrecomputedDouble;
case PRECOMP:
return zeroPrecomp;
default:
return null;
}
}
public GroupElement createPoint(byte[] P, boolean precompute) {
return new GroupElement(this, P, precompute);
}
@Override
public int hashCode() {
return f.hashCode() ^ d.hashCode() ^ I.hashCode();
}
@Override
public boolean equals(Object o) {
if (o == this) return true;
if (!(o instanceof Curve)) return false;
Curve c = (Curve) o;
return f.equals(c.getField()) && d.equals(c.getD()) && I.equals(c.getI());
}
}