finalExponentiation method

GtNative finalExponentiation()

Implementation

GtNative finalExponentiation() {
  Bls12NativeFp12 f = inner;
  // Compute t0 = f^(p^6)
  Bls12NativeFp12 t0 =
      f
          .frobeniusMap()
          .frobeniusMap()
          .frobeniusMap()
          .frobeniusMap()
          .frobeniusMap()
          .frobeniusMap();

  Bls12NativeFp12? t1 = f.invert();
  if (t1 == null) {
    throw CryptoException.failed(
      "finalExponentiation",
      reason: "Non-invertible Fp12",
    );
  }

  Bls12NativeFp12 t2 = t0 * t1;
  t1 = t2;
  t2 = t2.frobeniusMap().frobeniusMap();
  t2 *= t1;
  t1 = cyclotomicSquare(t2).conjugate();

  Bls12NativeFp12 t3 = cyclotomicExp(t2);
  Bls12NativeFp12 t4 = cyclotomicSquare(t3);
  Bls12NativeFp12 t5 = t1 * t3;
  t1 = cyclotomicExp(t5);
  t0 = cyclotomicExp(t1);
  Bls12NativeFp12 t6 = cyclotomicExp(t0);
  t6 *= t4;
  t4 = cyclotomicExp(t6);
  t5 = t5.conjugate();
  t4 *= t5 * t2;
  t5 = t2.conjugate();
  t1 *= t2;
  t1 = t1.frobeniusMap().frobeniusMap().frobeniusMap();
  t6 *= t5;
  t6 = t6.frobeniusMap();
  t3 *= t0;
  t3 = t3.frobeniusMap().frobeniusMap();
  t3 *= t1;
  t3 *= t6;
  f = t3 * t4;
  return GtNative(f);
}