geTripleScalarMultBasePointVar static method
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;
}