aggPublicKeys static method

MuSig2KeyAggContext aggPublicKeys({
  1. required List<List<int>> keys,
})

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),
  );
}