public SecP160R2FieldElement() { this.x = Nat160.create(); }
public static int[] fromBigInteger(BigInteger x) { int[] z = Nat160.fromBigInteger(x); if (z[4] == P4 && Nat160.gte(z, P)) { Nat160.subFrom(P, z); } return z; }
public static void reduce(int[] xx, int[] z) { long cc = Nat160.mul33Add(PInv33, xx, 5, xx, 0, z, 0); int c = Nat160.mul33DWordAdd(PInv33, cc, z, 0); // assert c == 0 || c == 1; if (c != 0 || (z[4] == P4 && Nat160.gte(z, P))) { Nat.add33To(5, PInv33, z); } }
int[] tt1 = Nat160.createExt(); int[] t2 = Nat160.create(); int[] t3 = Nat160.create(); int[] t4 = Nat160.create(); int[] H = Nat160.create(); SecP160R2Field.subtract(U1, U2, H); if (Nat160.isZero(H)) if (Nat160.isZero(R)) SecP160R2Field.square(H, HSquared); int[] G = Nat160.create(); SecP160R2Field.multiply(HSquared, H, G); Nat160.mul(S1, G, tt1); c = Nat160.addBothTo(V, V, G); SecP160R2Field.reduce32(c, G);
if (Nat160.isZero(x1) || Nat160.isOne(x1)) int[] x2 = Nat160.create(); SecP160R1Field.square(x1, x2); SecP160R1Field.multiply(x2, x1, x2); int[] x4 = Nat160.create(); SecP160R1Field.squareN(x2, 2, x4); SecP160R1Field.multiply(x4, x2, x4); SecP160R1Field.square(t1, t2); return Nat160.eq(x1, t2) ? new SecP160R1FieldElement(t1) : null;
int[] Y1Squared = Nat160.create(); SecP160R2Field.square(Y1.x, Y1Squared); int[] T = Nat160.create(); SecP160R2Field.square(Y1Squared, T); int[] M = Nat160.create(); SecP160R2Field.square(X1.x, M); c = Nat160.addBothTo(M, M, M); SecP160R2Field.reduce32(c, M); SecP160R2Field.reduce32(c, S); int[] t1 = Nat160.create(); c = Nat.shiftUpBits(5, T, 3, 0, t1); SecP160R2Field.reduce32(c, t1);
public static void reduce32(int x, int[] z) { if ((x != 0 && Nat160.mul33WordAdd(PInv33, x, z, 0) != 0) || (z[4] == P4 && Nat160.gte(z, P))) { Nat.add33To(5, PInv33, z); } }
public static void reduce32(int x, int[] z) { if ((x != 0 && Nat160.mulWordsAdd(PInv, x, z, 0) != 0) || (z[4] == P4 && Nat160.gte(z, P))) { Nat.addWordTo(5, PInv, z); } }
public static void addOne(int[] x, int[] z) { int c = Nat.inc(5, x, z); if (c != 0 || (z[4] == P4 && Nat160.gte(z, P))) { Nat.add33To(5, PInv33, z); } }
public static void half(int[] x, int[] z) { if ((x[0] & 1) == 0) { Nat.shiftDownBit(5, x, 0, z); } else { int c = Nat160.add(x, P, z); Nat.shiftDownBit(5, z, c); } }
public boolean testBitZero() { return Nat160.getBit(x, 0) == 1; }
public boolean isOne() { return Nat160.isOne(x); }
public boolean equals(Object other) { if (other == this) { return true; } if (!(other instanceof SecP160R1FieldElement)) { return false; } SecP160R1FieldElement o = (SecP160R1FieldElement)other; return Nat160.eq(x, o.x); }
int[] tt1 = Nat160.createExt(); int[] t2 = Nat160.create(); int[] t3 = Nat160.create(); int[] t4 = Nat160.create(); int[] H = Nat160.create(); SecP160R1Field.subtract(U1, U2, H); if (Nat160.isZero(H)) if (Nat160.isZero(R)) SecP160R1Field.square(H, HSquared); int[] G = Nat160.create(); SecP160R1Field.multiply(HSquared, H, G); Nat160.mul(S1, G, tt1); c = Nat160.addBothTo(V, V, G); SecP160R1Field.reduce32(c, G);
if (Nat160.isZero(x1) || Nat160.isOne(x1)) int[] x2 = Nat160.create(); SecP160R2Field.square(x1, x2); SecP160R2Field.multiply(x2, x1, x2); int[] x3 = Nat160.create(); SecP160R2Field.square(x2, x3); SecP160R2Field.multiply(x3, x1, x3); int[] x4 = Nat160.create(); SecP160R2Field.square(x3, x4); SecP160R2Field.multiply(x4, x1, x4); int[] x7 = Nat160.create(); SecP160R2Field.squareN(x4, 3, x7); SecP160R2Field.multiply(x7, x3, x7); SecP160R2Field.squareN(x14, 3, x17); SecP160R2Field.multiply(x17, x3, x17); int[] x31 = Nat160.create(); SecP160R2Field.squareN(x17, 14, x31); SecP160R2Field.multiply(x31, x14, x31); SecP160R2Field.square(t1, t2); return Nat160.eq(x1, t2) ? new SecP160R2FieldElement(t1) : null;