public SecT113FieldElement() { this.x = Nat128.create64(); }
public static long[] fromBigInteger64(BigInteger x) { if (x.signum() < 0 || x.bitLength() > 128) { throw new IllegalArgumentException(); } long[] z = create64(); int i = 0; while (x.signum() != 0) { z[i++] = x.longValue(); x = x.shiftRight(64); } return z; }
public ECPoint lookup(int index) { long[] x = Nat128.create64(), y = Nat128.create64(); int pos = 0; for (int i = 0; i < len; ++i) { long MASK = ((i ^ index) - 1) >> 31; for (int j = 0; j < FE_LONGS; ++j) { x[j] ^= table[pos + j] & MASK; y[j] ^= table[pos + FE_LONGS + j] & MASK; } pos += (FE_LONGS * 2); } return createRawPoint(new SecT113FieldElement(x), new SecT113FieldElement(y), false); } };
public ECFieldElement squarePow(int pow) { if (pow < 1) { return this; } long[] z = Nat128.create64(); SecT113Field.squareN(x, pow, z); return new SecT113FieldElement(z); }
public ECFieldElement invert() { long[] z = Nat128.create64(); SecT113Field.invert(x, z); return new SecT113FieldElement(z); }
public ECFieldElement sqrt() { long[] z = Nat128.create64(); SecT113Field.sqrt(x, z); return new SecT113FieldElement(z); }
public ECFieldElement addOne() { long[] z = Nat128.create64(); SecT113Field.addOne(x, z); return new SecT113FieldElement(z); }
public ECPoint lookup(int index) { long[] x = Nat128.create64(), y = Nat128.create64(); int pos = 0; for (int i = 0; i < len; ++i) { long MASK = ((i ^ index) - 1) >> 31; for (int j = 0; j < FE_LONGS; ++j) { x[j] ^= table[pos + j] & MASK; y[j] ^= table[pos + FE_LONGS + j] & MASK; } pos += (FE_LONGS * 2); } return createRawPoint(new SecT113FieldElement(x), new SecT113FieldElement(y), false); } };
public ECFieldElement add(ECFieldElement b) { long[] z = Nat128.create64(); SecT113Field.add(x, ((SecT113FieldElement)b).x, z); return new SecT113FieldElement(z); }
public ECFieldElement multiply(ECFieldElement b) { long[] z = Nat128.create64(); SecT113Field.multiply(x, ((SecT113FieldElement)b).x, z); return new SecT113FieldElement(z); }
public ECFieldElement square() { long[] z = Nat128.create64(); SecT113Field.square(x, z); return new SecT113FieldElement(z); }
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 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 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); }