/* set (x,y) from two BIGs */ public ECP(BIG ix, BIG iy) { x = new FP(ix); y = new FP(iy); z = new FP(1); FP rhs = RHS(x); if (ROM.CURVETYPE == ROM.MONTGOMERY) { if (rhs.jacobi() == 1) { INF = false; } else { inf(); } } else { FP y2 = new FP(y); y2.sqr(); if (y2.Equals(rhs)) { INF = false; } else { inf(); } } }
/* test for O point-at-infinity */ public bool is_infinity() { if (ROM.CURVETYPE == ROM.EDWARDS) { x.reduce(); y.reduce(); z.reduce(); return(x.iszilch() && y.Equals(z)); } else { return(INF); } }
/* set to affine - from (x,y,z) to (x,y) */ public void affine() { if (is_infinity()) { return; } FP one = new FP(1); if (z.Equals(one)) { return; } z.inverse(); if (ROM.CURVETYPE == ROM.WEIERSTRASS) { FP z2 = new FP(z); z2.sqr(); x.mul(z2); x.reduce(); y.mul(z2); y.mul(z); y.reduce(); } if (ROM.CURVETYPE == ROM.EDWARDS) { x.mul(z); x.reduce(); y.mul(z); y.reduce(); } if (ROM.CURVETYPE == ROM.MONTGOMERY) { x.mul(z); x.reduce(); } z.copy(one); }
/* Test P == Q */ public bool Equals(ECP Q) { if (is_infinity() && Q.is_infinity()) { return(true); } if (is_infinity() || Q.is_infinity()) { return(false); } if (ROM.CURVETYPE == ROM.WEIERSTRASS) { FP zs2 = new FP(z); zs2.sqr(); FP zo2 = new FP(Q.z); zo2.sqr(); FP zs3 = new FP(zs2); zs3.mul(z); FP zo3 = new FP(zo2); zo3.mul(Q.z); zs2.mul(Q.x); zo2.mul(x); if (!zs2.Equals(zo2)) { return(false); } zs3.mul(Q.y); zo3.mul(y); if (!zs3.Equals(zo3)) { return(false); } } else { FP a = new FP(0); FP b = new FP(0); a.copy(x); a.mul(Q.z); a.reduce(); b.copy(Q.x); b.mul(z); b.reduce(); if (!a.Equals(b)) { return(false); } if (ROM.CURVETYPE == ROM.EDWARDS) { a.copy(y); a.mul(Q.z); a.reduce(); b.copy(Q.y); b.mul(z); b.reduce(); if (!a.Equals(b)) { return(false); } } } return(true); }
/* test this=x */ public bool Equals(FP2 x) { return(a.Equals(x.a) && b.Equals(x.b)); }
/* test this=1 ? */ public bool IsUnity() { FP one = new FP(1); return(a.Equals(one) && b.IsZilch()); }
/* test this=1 ? */ public bool isunity() { FP one = new FP(1); return(a.Equals(one) && b.iszilch()); }