secp256k1GeSetAllGejVar static method

void secp256k1GeSetAllGejVar(
  1. List<Secp256k1Ge> r,
  2. List<Secp256k1Gej> a,
  3. int len
)

Implementation

static void secp256k1GeSetAllGejVar(
    List<Secp256k1Ge> r, List<Secp256k1Gej> a, int len) {
  Secp256k1Fe u = Secp256k1Fe();
  int i;
  int lastI = -1;

  for (i = 0; i < len; i++) {
    if (a[i].infinity.toBool) {
      secp256k1GeSetInfinity(r[i]);
    } else {
      /// Use destination's x coordinates as scratch space
      if (lastI == -1) {
        r[i].x = a[i].z.clone();
      } else {
        secp256k1FeMul(r[i].x, r[lastI].x, a[i].z);
      }
      lastI = i;
    }
  }
  if (lastI == -1) {
    return;
  }
  secp256k1FeInvVar(u, r[lastI].x);

  i = lastI;
  while (i > 0) {
    i--;
    if (!a[i].infinity.toBool) {
      secp256k1FeMul(r[lastI].x, r[i].x, u);
      secp256k1FeMul(u, u, a[lastI].z);
      lastI = i;
    }
  }
  _cond(a[lastI].infinity == 0, "secp256k1GeSetAllGejVar");
  r[lastI].x = u;

  for (i = 0; i < len; i++) {
    if (!a[i].infinity.toBool) {
      secp256k1GeSetGejZinv(r[i], a[i], r[i].x);
    }
  }
}