public static PointEdwardsProjective operator +(PointEdwardsProjective P, PointEdwardsProjective Q)//10M + 1S + 1*a + 1*d + 7add { BigInteger A, B, C, D, E, F, G, x, y, z; if (Q.z == 1) { B = P.z * P.z; C = P.x * Q.x; D = P.y * Q.y; E = P.E.b * C * D; F = B - E; G = B + E; x = (P.z * F * ((P.x + P.y) * (Q.x + Q.y) - C - D)) % P.E.n; y = (P.z * G * (D - P.E.a * C)) % P.E.n; z = (F * G) % P.E.n; return(new PointEdwardsProjective(x, y, z, P.E)); } A = P.z * Q.z; B = A * A; C = P.x * Q.x; D = P.y * Q.y; E = P.E.b * C * D; F = B - E; G = B + E; x = (A * F * ((P.x + P.y) * (Q.x + Q.y) - C - D)) % P.E.n; y = (A * G * (D - P.E.a * C)) % P.E.n; z = (F * G) % P.E.n; return(new PointEdwardsProjective(x, y, z, P.E)); }
public static PointEdwardsInverted operator +(PointEdwardsInverted P, PointEdwardsInverted Q)//9M + 1S + 1*a + 1*d + 7add { BigInteger A, B, C, D, E, F, G, H, I, x, y, z; if (Q.z == 1) { B = P.E.b * P.z * P.z; C = P.x * Q.x; D = P.y * Q.y; E = C * D; H = C - P.E.a * D; I = (P.x + P.y) * (Q.x + Q.y) - C - D; x = ((E + B) * H) % P.E.n; y = ((E - B) * I) % P.E.n; z = (P.z * H * I) % P.E.n; return(new PointEdwardsInverted(x, y, z, P.E)); } A = P.z * Q.z; B = P.E.b * A * A; C = P.x * Q.x; D = P.y * Q.y; E = C * D; H = C - P.E.a * D; I = (P.x + P.y) * (Q.x + Q.y) - C - D; x = ((E + B) * H) % P.E.n; y = ((E - B) * I) % P.E.n; z = (A * H * I) % P.E.n; return(new PointEdwardsInverted(x, y, z, P.E)); }
public PointEdwardsProjective(BigInteger x, BigInteger y, EllipticCurveEdwards E) { this.x = x; this.y = y; this.z = 1; this.E = E; }
public PointEdwardsInverted(BigInteger x, BigInteger y, BigInteger z, EllipticCurveEdwards E) { this.x = x; this.y = y; this.z = z; this.E = E; }
public PointEdwardsInverted(BigInteger x, BigInteger y, EllipticCurveEdwards E) { this.x = Algorithms.Invert(x, E.n); this.y = Algorithms.Invert(y, E.n); this.z = 1; this.E = E; }
public static PointEdwardsExtended operator +(PointEdwardsExtended P, PointEdwardsExtended Q)//9M + 1*a + 7add { BigInteger A, B, C, D, E, F, G, H, I, x, y, z, t; if (Q.z == 1) { A = P.x * Q.x; B = P.y * Q.y; C = P.z * Q.t; D = P.t; E = D + C; F = (P.x - P.y) * (Q.x + Q.y) + B - A; G = B + P.E.a * A; H = D - C; x = (E * F) % P.E.n; y = (G * H) % P.E.n; t = (E * H) % P.E.n; z = (F * G) % P.E.n; return(new PointEdwardsExtended(x, y, z, t, P.E)); } A = P.x * Q.x; B = P.y * Q.y; C = P.z * Q.t; D = P.t * Q.z; E = D + C; F = (P.x - P.y) * (Q.x + Q.y) + B - A; G = B + P.E.a * A; H = D - C; x = (E * F) % P.E.n; y = (G * H) % P.E.n; t = (E * H) % P.E.n; z = (F * G) % P.E.n; return(new PointEdwardsExtended(x, y, z, t, P.E)); }
public PointEdwardsExtended(BigInteger x, BigInteger y, EllipticCurveEdwards E) { this.x = x; this.y = y; this.z = 1; this.t = (x * y) % E.n; this.E = E; }
public PointEdwardsExtended(BigInteger x, BigInteger y, BigInteger z, BigInteger t, EllipticCurveEdwards E) { this.x = x; this.y = y; this.z = z; this.t = t; this.E = E; }
public override bool Equals(Object obj) { if (obj == null) { return(false); } EllipticCurveEdwards E = obj as EllipticCurveEdwards; return(new EllipticCurveEdwards(this.a, this.b, this.n) == E); }
}//extended private static EllipticCurveEdwards GenerateCurve(BigInteger n, out BigInteger x, out BigInteger y, TorsionType type) { switch (type) { case TorsionType.RandomCurve: return(EllipticCurveEdwards.GenerateCurveRandom(n, out x, out y)); case TorsionType.Curve12: return(EllipticCurveEdwards.GenerateCurve12(n, out x, out y)); case TorsionType.Curve2x8: return(EllipticCurveEdwards.GenerateCurve2x8(n, out x, out y)); case TorsionType.Curve12FromFile: return(EllipticCurveEdwards.GetCurve(n, out x, out y, "curve12.txt")); case TorsionType.Curve2x8FromFile: return(EllipticCurveEdwards.GetCurve(n, out x, out y, "curve2x8.txt")); default: return(EllipticCurveEdwards.GenerateCurveRandom(n, out x, out y)); } }