geDoubleScalarMultPrecompPointVar static method

EDPoint geDoubleScalarMultPrecompPointVar(
  1. List<int> a,
  2. List<EDPoint> aI,
  3. List<int> b,
  4. List<EDPoint> bI,
)

Implementation

static EDPoint geDoubleScalarMultPrecompPointVar(
    List<int> a, List<EDPoint> aI, List<int> b, List<EDPoint> bI) {
  final aslide = List<int>.filled(256, 0);
  final bslide = List<int>.filled(256, 0);
  CryptoOps.slide(aslide, a);
  CryptoOps.slide(bslide, b);

  EDPoint? r;

  for (int i = 255; i >= 0; i--) {
    final aVal = aslide[i];
    final bVal = bslide[i];

    if (r == null) {
      if (aVal != 0) {
        final idx = (aVal.abs() - 1) ~/ 2;
        final ai = aI[idx];
        r = aVal > 0 ? ai : -ai;
      }

      if (bVal != 0) {
        final idx = (bVal.abs() - 1) ~/ 2;
        final bi = bI[idx];
        r = (r == null) ? (bVal > 0 ? bi : -bi) : (r + (bVal > 0 ? bi : -bi));
      }

      if (r == null) continue; // still no op
    } else {
      r = r * BigInt.two;

      if (aVal != 0) {
        final idx = (aVal.abs() - 1) ~/ 2;
        final ai = aI[idx];
        r += aVal > 0 ? ai : -ai;
      }

      if (bVal != 0) {
        final idx = (bVal.abs() - 1) ~/ 2;
        final bi = bI[idx];
        r += bVal > 0 ? bi : -bi;
      }
    }
  }

  if (r == null) {
    throw Exception(
        "Both scalars are zero; result undefined without identity support.");
  }

  return r;
}