public ECFieldElement fromBigInteger(BigInteger x) { return new SecT571FieldElement(x); }
public ECFieldElement subtract(ECFieldElement b) { // Addition and subtraction are the same in F2m return add(b); }
public ECFieldElement divide(ECFieldElement b) { return multiply(b.invert()); }
if (X1.isZero()) if (X2.isZero()) long[] Z1Precomp = Z1.isOne() ? null : SecT571Field.precompMultiplicand(Z1.x); long[] U2, S2; if (Z1Precomp == null) long[] Z2Precomp = Z2.isOne() ? null : SecT571Field.precompMultiplicand(Z2.x); long[] U1, S1; if (Z2Precomp == null) if (X2.isZero()) if (X3.isZero()) ECFieldElement Y3 = L.multiply(X1.add(X3)).add(X3).add(Y1); L3 = (SecT571FieldElement)Y3.divide(X3).add(X3); Z3 = (SecT571FieldElement)curve.fromBigInteger(ECConstants.ONE); X3 = new SecT571FieldElement(t1); SecT571Field.multiply(AU1, AU2, X3.x); if (X3.isZero()) Z3 = new SecT571FieldElement(t3); SecT571Field.multiplyPrecomp(B, APrecomp, Z3.x); L3 = new SecT571FieldElement(t4);
if (X1.isZero()) long[] t2 = Nat576.create64(); long[] Z1Precomp = Z1.isOne() ? null : SecT571Field.precompMultiplicand(Z1.x); long[] L1Z1, Z1Sq; if (Z1Precomp == null) return new SecT571R1Point(curve, new SecT571FieldElement(T), SecT571R1Curve.SecT571R1_B_SQRT, withCompression); SecT571Field.multiplyAddToExt(T, L1Z1, tt); SecT571FieldElement X3 = new SecT571FieldElement(t1); SecT571Field.square(T, X3.x); SecT571FieldElement Z3 = new SecT571FieldElement(T); if (Z1Precomp != null) SecT571Field.reduce(tt, t2); SecT571Field.addBothTo(X3.x, Z3.x, t2); SecT571FieldElement L3 = new SecT571FieldElement(t2);
public ECFieldElement squareMinusProduct(ECFieldElement x, ECFieldElement y) { return squarePlusProduct(x, y); }
public ECFieldElement multiplyMinusProduct(ECFieldElement b, ECFieldElement x, ECFieldElement y) { return multiplyPlusProduct(b, x, y); }
if (X1.isZero()) if (X2.isZero()) long[] Z1Precomp = Z1.isOne() ? null : SecT571Field.precompMultiplicand(Z1.x); long[] U2, S2; if (Z1Precomp == null) long[] Z2Precomp = Z2.isOne() ? null : SecT571Field.precompMultiplicand(Z2.x); long[] U1, S1; if (Z2Precomp == null) if (X2.isZero()) if (X3.isZero()) ECFieldElement Y3 = L.multiply(X1.add(X3)).add(X3).add(Y1); L3 = (SecT571FieldElement)Y3.divide(X3).add(X3); Z3 = (SecT571FieldElement)curve.fromBigInteger(ECConstants.ONE); X3 = new SecT571FieldElement(t1); SecT571Field.multiply(AU1, AU2, X3.x); if (X3.isZero()) Z3 = new SecT571FieldElement(t3); SecT571Field.multiplyPrecomp(B, APrecomp, Z3.x); L3 = new SecT571FieldElement(t4);
if (X1.isZero()) if (X2.isZero() || !Z2.isOne()) return new SecT571R1Point(curve, new SecT571FieldElement(A), SecT571R1Curve.SecT571R1_B_SQRT, withCompression); SecT571FieldElement X3 = new SecT571FieldElement(); SecT571Field.square(A, X3.x); SecT571Field.multiply(X3.x, X2Z1Sq, X3.x); SecT571FieldElement Z3 = new SecT571FieldElement(t1); SecT571Field.multiply(A, B, Z3.x); SecT571Field.multiplyPrecomp(Z3.x, Z1SqPrecomp, Z3.x); SecT571FieldElement L3 = new SecT571FieldElement(t2); SecT571Field.add(A, B, L3.x); SecT571Field.square(L3.x, L3.x);
public ECFieldElement fromBigInteger(BigInteger x) { return new SecT571FieldElement(x); }
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); }
return createRawPoint(new SecT571FieldElement(x), new SecT571FieldElement(y), false);