geTripleScalarMultPrecompPointVar static method

EDPoint geTripleScalarMultPrecompPointVar(
  1. List<int> a,
  2. List<EDPoint> aI,
  3. List<int> b,
  4. List<EDPoint> bI,
  5. List<int> c,
  6. List<EDPoint> cI,
)

Implementation

static EDPoint geTripleScalarMultPrecompPointVar(
    List<int> a,
    List<EDPoint> aI,
    List<int> b,
    List<EDPoint> bI,
    List<int> c,
    List<EDPoint> cI) {
  final aslide = List<int>.filled(256, 0);
  final bslide = List<int>.filled(256, 0);
  final cslide = List<int>.filled(256, 0);

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

  EDPoint? r;

  for (int i = 255; i >= 0; i--) {
    final aVal = aslide[i];
    final bVal = bslide[i];
    final cVal = cslide[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 (cVal != 0) {
        final idx = (cVal.abs() - 1) ~/ 2;
        final ci = cI[idx];
        r = (r == null) ? (cVal > 0 ? ci : -ci) : (r + (cVal > 0 ? ci : -ci));
      }

      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 (cVal != 0) {
        final idx = (cVal.abs() - 1) ~/ 2;
        final ci = cI[idx];
        r += cVal > 0 ? ci : -ci;
      }
    }
  }

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

  return r;
}