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 = MuSig2Utils.keyAggAndTweak(
    publicKeys: publicKeys,
    tweaks: tweaks,
  );
  final aggPkX = aggPk.xOnly().asImmutableBytes;
  final k1 = MuSig2Utils.toScalarBigInt(
    MuSig2Utils.deterministicNonceHash(
      sk: rand,
      aggotherNonce: aggotherNonce,
      aggPk: aggPkX,
      i: 0,
      msg: msg,
    ),
  );
  final k2 = MuSig2Utils.toScalarBigInt(
    MuSig2Utils.deterministicNonceHash(
      sk: rand,
      aggotherNonce: aggotherNonce,
      aggPk: aggPkX,
      i: 1,
      msg: msg,
    ),
  );

  if (k1 == BigInt.zero || k2 == BigInt.zero) {
    throw MuSig2Exception("Derive nonce hash failed.");
  }
  final rs1 = MuSig2Constants.generator * k1;
  final rs2 = MuSig2Constants.generator * k2;
  final pk = MuSig2Utils.generatePublicKey(sk);
  final pubnonce = [...rs1.toBytes(), ...rs2.toBytes()];
  final secnonce =
      [
        ...BigintUtils.toBytes(k1),
        ...BigintUtils.toBytes(k2),
        ...pk,
      ].asImmutableBytes;
  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,
  );
}