deterministicSign method

  1. @override
MuSig2DeterministicSignature deterministicSign({
  1. required List<int> sk,
  2. required List<int> aggotherNonce,
  3. required List<List<int>> publicKeys,
  4. List<MuSig2Tweak> tweaks = const [],
  5. required List<int> msg,
  6. List<int>? rand,
})
override

Generates a deterministic MuSig2 signature

Implementation

@override
MuSig2DeterministicSignature deterministicSign({
  required List<int> sk,
  required List<int> aggotherNonce,
  required List<List<int>> publicKeys,
  List<MuSig2Tweak> tweaks = const [],
  required List<int> msg,
  List<int>? rand,
}) {
  if (rand != null) {
    rand = BytesUtils.xor(
      sk,
      P2TRUtils.taggedHash(MuSig2Constants.musigAuxDomain, rand),
    );
  } else {
    rand = sk.clone();
  }
  final aggPk = MuSig2UtilsConst.keyAggAndTweak(
    publicKeys: publicKeys,
    tweaks: tweaks,
  );
  final aggPkX = aggPk.xOnly().asImmutableBytesConst;
  final k1 = MuSig2UtilsConst.deterministicNonceHash(
    sk: rand,
    aggotherNonce: aggotherNonce,
    aggPk: aggPkX,
    i: 0,
    msg: msg,
  );
  final k2 = MuSig2UtilsConst.deterministicNonceHash(
    sk: rand,
    aggotherNonce: aggotherNonce,
    aggPk: aggPkX,
    i: 1,
    msg: msg,
  );
  final rs1 = Secp256k1Utils.secp256k1MultBase(scalar: k1);
  final rs2 = Secp256k1Utils.secp256k1MultBase(scalar: k2);
  final pk = Secp256k1Utils.generatePublicKeyBlind(scalarBytes: sk);
  if (pk == null) {
    throw ArgumentException.invalidOperationArguments(
      "deterministicSignConst",
      name: "sk",
      reason: "Invalid secret key bytes.",
    );
  }
  // final pk = MuSig2Utils.generatePublicKey(sk);
  final pubnonce = [
    ...Secp256k1Utils.geToBytes(rs1),
    ...Secp256k1Utils.geToBytes(rs2),
  ];
  final secnonce = [
    ...Secp256k1Utils.scalarToBytes(k1, validate: false),
    ...Secp256k1Utils.scalarToBytes(k2, validate: false),
    ...pk,
  ];
  final aggnonce = nonceAgg([pubnonce, aggotherNonce]);
  final session = MuSig2Session(
    aggnonce: aggnonce,
    publicKeys: publicKeys,
    tweaks: tweaks,
    msg: msg,
  );
  final signature = sign(secnonce: secnonce, sk: sk, session: session);
  return MuSig2DeterministicSignature(
    pubnonce: pubnonce,
    signature: signature,
  );
}