geTripleScalarMultBasePrecompVartime static method

void geTripleScalarMultBasePrecompVartime(
  1. GroupElementP2 r,
  2. List<int> a,
  3. GroupElementDsmp aI,
  4. List<int> b,
  5. GroupElementDsmp bI,
  6. List<int> c,
  7. GroupElementDsmp cI,
)

Implementation

static void geTripleScalarMultBasePrecompVartime(
    GroupElementP2 r,
    List<int> a,
    GroupElementDsmp aI,
    List<int> b,
    GroupElementDsmp bI,
    List<int> c,
    GroupElementDsmp cI) {
  b.asMin32("geTripleScalarMultBasePrecompVartime");
  a.asMin32("geTripleScalarMultBasePrecompVartime");
  c.asMin32("geTripleScalarMultBasePrecompVartime");
  final List<int> aslide = List<int>.filled(256, 0);
  final List<int> bslide = List<int>.filled(256, 0);
  final List<int> cslide = List<int>.filled(256, 0);
  final GroupElementP1P1 t = GroupElementP1P1();
  final GroupElementP3 u = GroupElementP3();
  int i;

  slide(aslide, a);
  slide(bslide, b);
  slide(cslide, c);

  geP2Zero(r);

  for (i = 255; i >= 0; --i) {
    if (aslide[i] != 0 || bslide[i] != 0 || cslide[i] != 0) {
      break;
    }
  }

  for (; i >= 0; --i) {
    geP2Dbl(t, r);

    if (aslide[i] > 0) {
      geP1P1ToP3(u, t);
      geAdd(t, u, aI[aslide[i] ~/ 2]);
    } else if (aslide[i] < 0) {
      geP1P1ToP3(u, t);
      geSub(t, u, aI[(-aslide[i]) ~/ 2]);
    }

    if (bslide[i] > 0) {
      geP1P1ToP3(u, t);
      geAdd(t, u, bI[bslide[i] ~/ 2]);
    } else if (bslide[i] < 0) {
      geP1P1ToP3(u, t);
      geSub(t, u, bI[(-bslide[i]) ~/ 2]);
    }

    if (cslide[i] > 0) {
      geP1P1ToP3(u, t);
      geAdd(t, u, cI[cslide[i] ~/ 2]);
    } else if (cslide[i] < 0) {
      geP1P1ToP3(u, t);
      geSub(t, u, cI[(-cslide[i]) ~/ 2]);
    }

    geP1P1ToP2(r, t);
  }
}