aggPublicKeys static method
Implementation
static MuSig2KeyAggContext aggPublicKeys({required List<List<int>> keys}) {
Secp256k1Gej? aggKey;
for (final k in keys) {
final coeff = _keyAggCoeffConst(keys: keys, key: k);
Secp256k1Ge c = encodePointAsEvenConst(k);
final key = Secp256k1Utils.secp256k1Mult(
scalar: coeff,
point: c,
checkScalar: false,
);
if (aggKey != null) {
Secp256k1Ge mid1 = Secp256k1Ge();
Secp256k1.secp256k1GeSetGej(mid1, key);
Secp256k1.secp256k1GejAddGe(aggKey, aggKey, mid1);
} else {
aggKey = key;
}
}
if (aggKey == null) {
throw ArgumentException.invalidOperationArguments(
"MuSig2Session",
name: "aggPublicKeys",
reason:
"At least ${MuSig2Constants.minimumRequiredKey} public keys require.",
);
}
Secp256k1Ge mid1 = Secp256k1Ge();
Secp256k1.secp256k1GeSetGej(mid1, aggKey);
final keyBytes = Secp256k1Utils.secp256k1ECkeyPubkeySerialize(mid1, true);
if (keyBytes == null) {
throw MuSig2Exception("Failed to generate agg publuc key.");
}
return MuSig2KeyAggContext(
publicKey: ProjectiveECCPoint.fromBytes(
curve: MuSig2Constants.curve,
data: keyBytes,
),
gacc: BigintUtils.toBytes(BigInt.one, length: MuSig2Constants.baselen),
tacc: BigintUtils.toBytes(BigInt.zero, length: MuSig2Constants.baselen),
);
}