geDoubleScalarMultBasePointVar static method

EDPoint geDoubleScalarMultBasePointVar({
  1. required List<int> a,
  2. required EDPoint gA,
  3. required List<int> b,
})

Implementation

static EDPoint geDoubleScalarMultBasePointVar(
    {required List<int> a, required EDPoint gA, required List<int> b}) {
  final aslide = List<int>.filled(256, 0);
  final bslide = List<int>.filled(256, 0);
  CryptoOps.slide(aslide, a);
  CryptoOps.slide(bslide, b);
  final aI = geDsmPrecompVar(gA);
  final Map<int, String> res = {};
  EDPoint? r;
  // Logg.error("calll ?!");
  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 bi = aI[idx];
        r = aVal > 0 ? bi : -bi;
      }
      if (bVal != 0) {
        final idx = (bVal.abs() - 1) ~/ 2;
        final ai = Ed25519Utils.asPoint(
            BytesUtils.fromHexString(CryptoOpsConst.geBiPointBytes[idx]));
        r = (r == null) ? (bVal > 0 ? ai : -ai) : (r + (bVal > 0 ? ai : -ai));
      }

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

      if (aVal != 0) {
        final idx = (aVal.abs() - 1) ~/ 2;
        final bi = aI[idx];
        r += aVal > 0 ? bi : -bi;
      }
      if (bVal != 0) {
        final idx = (bVal.abs() - 1) ~/ 2;
        final ai = Ed25519Utils.asPoint(
            BytesUtils.fromHexString(CryptoOpsConst.geBiPointBytes[idx]));
        r += bVal > 0 ? ai : -ai;
      }
      res.addAll({i: r.toHex()});
    }
  }

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

  return r;
}