public SecP128R1FieldElement() { this.x = Nat128.create(); }
public SecT113FieldElement() { this.x = Nat128.create64(); }
int[] tt1 = Nat128.createExt(); int[] t2 = Nat128.create(); int[] t3 = Nat128.create(); int[] t4 = Nat128.create(); int[] H = Nat128.create(); SecP128R1Field.subtract(U1, U2, H); if (Nat128.isZero(H)) if (Nat128.isZero(R)) SecP128R1Field.square(H, HSquared); int[] G = Nat128.create(); SecP128R1Field.multiply(HSquared, H, G); Nat128.mul(S1, G, tt1); c = Nat128.addBothTo(V, V, G); SecP128R1Field.reduce32(c, G);
if (Nat128.isZero(x1) || Nat128.isOne(x1)) int[] x2 = Nat128.create(); SecP128R1Field.square(x1, x2); SecP128R1Field.multiply(x2, x1, x2); int[] x4 = Nat128.create(); SecP128R1Field.squareN(x2, 2, x4); SecP128R1Field.multiply(x4, x2, x4); int[] x8 = Nat128.create(); SecP128R1Field.squareN(x4, 4, x8); SecP128R1Field.multiply(x8, x4, x8); SecP128R1Field.square(t1, t2); return Nat128.eq(x1, t2) ? new SecP128R1FieldElement(t1) : null;
public ECFieldElement multiplyPlusProduct(ECFieldElement b, ECFieldElement x, ECFieldElement y) { long[] ax = this.x, bx = ((SecT113FieldElement)b).x; long[] xx = ((SecT113FieldElement)x).x, yx = ((SecT113FieldElement)y).x; long[] tt = Nat128.createExt64(); SecT113Field.multiplyAddToExt(ax, bx, tt); SecT113Field.multiplyAddToExt(xx, yx, tt); long[] z = Nat128.create64(); SecT113Field.reduce(tt, z); return new SecT113FieldElement(z); }
public static void squareAddToExt(long[] x, long[] zz) { long[] tt = Nat128.createExt64(); implSquare(x, tt); addExt(zz, tt, zz); }
public static void invert(long[] x, long[] z) { if (Nat128.isZero64(x)) { throw new IllegalStateException(); } // Itoh-Tsujii inversion long[] t0 = Nat128.create64(); long[] t1 = Nat128.create64(); square(x, t0); multiply(t0, x, t0); square(t0, t0); multiply(t0, x, t0); squareN(t0, 3, t1); multiply(t1, t0, t1); square(t1, t1); multiply(t1, x, t1); squareN(t1, 7, t0); multiply(t0, t1, t0); squareN(t0, 14, t1); multiply(t1, t0, t1); squareN(t1, 28, t0); multiply(t0, t1, t0); squareN(t0, 56, t1); multiply(t1, t0, t1); square(t1, z); }
int[] t1 = Nat128.create(); int[] t2 = Nat128.create(); int[] Y1Squared = Nat128.create(); SecP128R1Field.square(Y1.x, Y1Squared); int[] T = Nat128.create(); SecP128R1Field.square(Y1Squared, T); SecP128R1Field.add(X1.x, Z1Squared, M); SecP128R1Field.multiply(M, t1, M); c = Nat128.addBothTo(M, M, M); SecP128R1Field.reduce32(c, M);
public boolean equals(Object other) { if (other == this) { return true; } if (!(other instanceof SecT113FieldElement)) { return false; } SecT113FieldElement o = (SecT113FieldElement)other; return Nat128.eq64(x, o.x); }
public boolean equals(Object other) { if (other == this) { return true; } if (!(other instanceof SecP128R1FieldElement)) { return false; } SecP128R1FieldElement o = (SecP128R1FieldElement)other; return Nat128.eq(x, o.x); }
public static void half(int[] x, int[] z) { if ((x[0] & 1) == 0) { Nat.shiftDownBit(4, x, 0, z); } else { int c = Nat128.add(x, P, z); Nat.shiftDownBit(4, z, c); } }
public ECFieldElement squarePlusProduct(ECFieldElement x, ECFieldElement y) { long[] ax = this.x; long[] xx = ((SecT113FieldElement)x).x, yx = ((SecT113FieldElement)y).x; long[] tt = Nat128.createExt64(); SecT113Field.squareAddToExt(ax, tt); SecT113Field.multiplyAddToExt(xx, yx, tt); long[] z = Nat128.create64(); SecT113Field.reduce(tt, z); return new SecT113FieldElement(z); }
public static void multiply(long[] x, long[] y, long[] z) { long[] tt = Nat128.createExt64(); implMultiply(x, y, tt); reduce(tt, z); }