public SecT571FieldElement() { this.x = Nat576.create64(); }
public static long[] fromBigInteger64(BigInteger x) { if (x.signum() < 0 || x.bitLength() > 576) { 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 = Nat576.create64(), y = Nat576.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 SecT571FieldElement(x), new SecT571FieldElement(y), false); } };
public ECPoint lookup(int index) { long[] x = Nat576.create64(), y = Nat576.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 SecT571FieldElement(x), new SecT571FieldElement(y), false); } };
public ECFieldElement add(ECFieldElement b) { long[] z = Nat576.create64(); SecT571Field.add(x, ((SecT571FieldElement)b).x, z); return new SecT571FieldElement(z); }
public ECFieldElement sqrt() { long[] z = Nat576.create64(); SecT571Field.sqrt(x, z); return new SecT571FieldElement(z); }
public ECFieldElement addOne() { long[] z = Nat576.create64(); SecT571Field.addOne(x, z); return new SecT571FieldElement(z); }
public ECFieldElement square() { long[] z = Nat576.create64(); SecT571Field.square(x, z); return new SecT571FieldElement(z); }
public ECFieldElement multiply(ECFieldElement b) { long[] z = Nat576.create64(); SecT571Field.multiply(x, ((SecT571FieldElement)b).x, z); return new SecT571FieldElement(z); }
public ECFieldElement squarePow(int pow) { if (pow < 1) { return this; } long[] z = Nat576.create64(); SecT571Field.squareN(x, pow, z); return new SecT571FieldElement(z); }
public ECFieldElement invert() { long[] z = Nat576.create64(); SecT571Field.invert(x, z); return new SecT571FieldElement(z); }
public static void sqrt(long[] x, long[] z) { long[] evn = Nat576.create64(), odd = Nat576.create64(); int pos = 0; for (int i = 0; i < 4; ++i) { long u0 = Interleave.unshuffle(x[pos++]); long u1 = Interleave.unshuffle(x[pos++]); evn[i] = (u0 & 0x00000000FFFFFFFFL) | (u1 << 32); odd[i] = (u0 >>> 32) | (u1 & 0xFFFFFFFF00000000L); } { long u0 = Interleave.unshuffle(x[pos]); evn[4] = (u0 & 0x00000000FFFFFFFFL); odd[4] = (u0 >>> 32); } multiply(odd, ROOT_Z, z); add(z, evn, z); }
public ECFieldElement squarePlusProduct(ECFieldElement x, ECFieldElement y) { long[] ax = this.x; long[] xx = ((SecT571FieldElement)x).x, yx = ((SecT571FieldElement)y).x; long[] tt = Nat576.createExt64(); SecT571Field.squareAddToExt(ax, tt); SecT571Field.multiplyAddToExt(xx, yx, tt); long[] z = Nat576.create64(); SecT571Field.reduce(tt, z); return new SecT571FieldElement(z); }
public ECFieldElement multiplyPlusProduct(ECFieldElement b, ECFieldElement x, ECFieldElement y) { long[] ax = this.x, bx = ((SecT571FieldElement)b).x; long[] xx = ((SecT571FieldElement)x).x, yx = ((SecT571FieldElement)y).x; long[] tt = Nat576.createExt64(); SecT571Field.multiplyAddToExt(ax, bx, tt); SecT571Field.multiplyAddToExt(xx, yx, tt); long[] z = Nat576.create64(); SecT571Field.reduce(tt, z); return new SecT571FieldElement(z); }