deterministicSign method
MuSig2DeterministicSignature
deterministicSign({
- required List<
int> sk, - required List<
int> aggotherNonce, - required List<
List< publicKeys,int> > - List<
MuSig2Tweak> tweaks = const [], - required List<
int> msg, - 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,
);
}