geTripleScalarMultBasePointVar static method

EDPoint geTripleScalarMultBasePointVar({
  1. required List<int> a,
  2. required List<int> b,
  3. required List<EDPoint> bI,
  4. required List<int> c,
  5. required List<EDPoint> cI,
})

Implementation

static EDPoint geTripleScalarMultBasePointVar(
    {required List<int> a,
    required List<int> b,
    required List<EDPoint> bI,
    required List<int> c,
    required 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;
  // Logg.error("calll ?!");
  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 = Ed25519Utils.asPoint(
            BytesUtils.fromHexString(CryptoOpsConst.geBiPointBytes[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;
    } else {
      r = r * BigInt.two;

      if (aVal != 0) {
        final idx = (aVal.abs() - 1) ~/ 2;
        final ai = Ed25519Utils.asPoint(
            BytesUtils.fromHexString(CryptoOpsConst.geBiPointBytes[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 Exception(
        "All scalars are zero; result undefined without identity support.");
  }

  return r;
}