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