decodeSession static method

MuSig2SessionValues decodeSession(
  1. MuSig2Session session
)

Implementation

static MuSig2SessionValues decodeSession(MuSig2Session session) {
  final tweak = keyAggAndTweak(
    publicKeys: session.publicKeys,
    tweaks: session.tweaks,
  );
  final hash = P2TRUtils.taggedHash(MuSig2Constants.noncecoefDomain, [
    ...session.aggnonce,
    ...tweak.xOnly(),
    ...session.msg,
  ]);
  final b = BigintUtils.fromBytes(hash) % MuSig2Constants.order;
  ProjectiveECCPoint r1 = MuSig2Utils.encodePointAsEven(
    session.aggnonce.sublist(0, EcdsaKeysConst.pubKeyCompressedByteLen),
    allowInfinity: true,
  );
  ProjectiveECCPoint r2 = MuSig2Utils.encodePointAsEven(
    session.aggnonce.sublist(
      EcdsaKeysConst.pubKeyCompressedByteLen,
      EcdsaKeysConst.pubKeyCompressedByteLen * 2,
    ),
    allowInfinity: true,
  );
  ProjectiveECCPoint r = (r1 + (r2 * b)).cast();
  if (r.isZero()) {
    r = MuSig2Constants.generator;
  }
  final eHash = P2TRUtils.taggedHash(MuSig2Constants.challengeDomain, [
    ...r.toXonly(),
    ...tweak.xOnly(),
    ...session.msg,
  ]);
  final e = BigintUtils.fromBytes(eHash) % MuSig2Constants.order;
  return MuSig2SessionValues(
    publicKey: tweak.publicKey,
    gacc: tweak.gacc,
    tacc: tweak.tacc,
    b: BigintUtils.toBytes(b, length: MuSig2Constants.baselen),
    r: r,
    e: BigintUtils.toBytes(e, length: MuSig2Constants.baselen),
  );
}