Files
2025-08-02 15:20:14 -05:00

293 lines
7.2 KiB
Go

// Copyright © 2019 Binance
//
// This file is part of Binance. The full Binance copyright notice, including
// terms governing use, modification, and redistribution, is contained in the
// file LICENSE at the root of the source code distribution tree.
package resharing
import (
"crypto/elliptic"
"math/big"
"github.com/luxfi/tss/v2/common"
"github.com/luxfi/tss/v2/crypto"
cmt "github.com/luxfi/tss/v2/crypto/commitments"
"github.com/luxfi/tss/v2/crypto/dlnproof"
"github.com/luxfi/tss/v2/crypto/facproof"
"github.com/luxfi/tss/v2/crypto/modproof"
"github.com/luxfi/tss/v2/crypto/paillier"
"github.com/luxfi/tss/v2/crypto/vss"
"github.com/luxfi/tss/v2/tss"
)
// These messages were generated from Protocol Buffers definitions into ecdsa-resharing.pb.go
var (
// Ensure that signing messages implement ValidateBasic
_ = []tss.MessageContent{
(*DGRound1Message)(nil),
(*DGRound2Message1)(nil),
(*DGRound2Message2)(nil),
(*DGRound3Message1)(nil),
(*DGRound3Message2)(nil),
(*DGRound4Message1)(nil),
(*DGRound4Message2)(nil),
}
)
// ----- //
func NewDGRound1Message(
to []*tss.PartyID,
from *tss.PartyID,
ecdsaPub *crypto.ECPoint,
vct cmt.HashCommitment,
ssid []byte,
) tss.ParsedMessage {
meta := tss.MessageRouting{
From: from,
To: to,
IsBroadcast: true,
IsToOldCommittee: false,
}
content := &DGRound1Message{
EcdsaPubX: ecdsaPub.X().Bytes(),
EcdsaPubY: ecdsaPub.Y().Bytes(),
VCommitment: vct.Bytes(),
Ssid: ssid,
}
msg := tss.NewMessageWrapper(meta, content)
return tss.NewMessage(meta, content, msg)
}
func (m *DGRound1Message) ValidateBasic() bool {
return m != nil &&
common.NonEmptyBytes(m.EcdsaPubX) &&
common.NonEmptyBytes(m.EcdsaPubY) &&
common.NonEmptyBytes(m.VCommitment)
}
func (m *DGRound1Message) UnmarshalECDSAPub(ec elliptic.Curve) (*crypto.ECPoint, error) {
return crypto.NewECPoint(
ec,
new(big.Int).SetBytes(m.EcdsaPubX),
new(big.Int).SetBytes(m.EcdsaPubY))
}
func (m *DGRound1Message) UnmarshalVCommitment() *big.Int {
return new(big.Int).SetBytes(m.GetVCommitment())
}
func (m *DGRound1Message) UnmarshalSSID() []byte {
return m.GetSsid()
}
// ----- //
func NewDGRound2Message1(
to []*tss.PartyID,
from *tss.PartyID,
paillierPK *paillier.PublicKey,
modProof *modproof.ProofMod,
NTildei, H1i, H2i *big.Int,
dlnProof1, dlnProof2 *dlnproof.Proof,
) (tss.ParsedMessage, error) {
meta := tss.MessageRouting{
From: from,
To: to,
IsBroadcast: true,
IsToOldCommittee: false,
}
modPfBzs := modProof.Bytes()
dlnProof1Bz, err := dlnProof1.Serialize()
if err != nil {
return nil, err
}
dlnProof2Bz, err := dlnProof2.Serialize()
if err != nil {
return nil, err
}
content := &DGRound2Message1{
PaillierN: paillierPK.N.Bytes(),
ModProof: modPfBzs[:],
NTilde: NTildei.Bytes(),
H1: H1i.Bytes(),
H2: H2i.Bytes(),
Dlnproof_1: dlnProof1Bz,
Dlnproof_2: dlnProof2Bz,
}
msg := tss.NewMessageWrapper(meta, content)
return tss.NewMessage(meta, content, msg), nil
}
func (m *DGRound2Message1) ValidateBasic() bool {
return m != nil &&
// use with NoProofFac()
// common.NonEmptyMultiBytes(m.ModProof, modproof.ProofModBytesParts) &&
common.NonEmptyBytes(m.PaillierN) &&
common.NonEmptyBytes(m.NTilde) &&
common.NonEmptyBytes(m.H1) &&
common.NonEmptyBytes(m.H2) &&
// expected len of dln proof = sizeof(int64) + len(alpha) + len(t)
common.NonEmptyMultiBytes(m.GetDlnproof_1(), 2+(dlnproof.Iterations*2)) &&
common.NonEmptyMultiBytes(m.GetDlnproof_2(), 2+(dlnproof.Iterations*2))
}
func (m *DGRound2Message1) UnmarshalPaillierPK() *paillier.PublicKey {
return &paillier.PublicKey{
N: new(big.Int).SetBytes(m.PaillierN),
}
}
func (m *DGRound2Message1) UnmarshalNTilde() *big.Int {
return new(big.Int).SetBytes(m.GetNTilde())
}
func (m *DGRound2Message1) UnmarshalH1() *big.Int {
return new(big.Int).SetBytes(m.GetH1())
}
func (m *DGRound2Message1) UnmarshalH2() *big.Int {
return new(big.Int).SetBytes(m.GetH2())
}
func (m *DGRound2Message1) UnmarshalModProof() (*modproof.ProofMod, error) {
return modproof.NewProofFromBytes(m.GetModProof())
}
func (m *DGRound2Message1) UnmarshalDLNProof1() (*dlnproof.Proof, error) {
return dlnproof.UnmarshalDLNProof(m.GetDlnproof_1())
}
func (m *DGRound2Message1) UnmarshalDLNProof2() (*dlnproof.Proof, error) {
return dlnproof.UnmarshalDLNProof(m.GetDlnproof_2())
}
// ----- //
func NewDGRound2Message2(
to []*tss.PartyID,
from *tss.PartyID,
) tss.ParsedMessage {
meta := tss.MessageRouting{
From: from,
To: to,
IsBroadcast: true,
IsToOldCommittee: true,
}
content := &DGRound2Message2{}
msg := tss.NewMessageWrapper(meta, content)
return tss.NewMessage(meta, content, msg)
}
func (m *DGRound2Message2) ValidateBasic() bool {
return true
}
// ----- //
func NewDGRound3Message1(
to *tss.PartyID,
from *tss.PartyID,
share *vss.Share,
) tss.ParsedMessage {
meta := tss.MessageRouting{
From: from,
To: []*tss.PartyID{to},
IsBroadcast: false,
IsToOldCommittee: false,
}
content := &DGRound3Message1{
Share: share.Share.Bytes(),
}
msg := tss.NewMessageWrapper(meta, content)
return tss.NewMessage(meta, content, msg)
}
func (m *DGRound3Message1) ValidateBasic() bool {
return m != nil &&
common.NonEmptyBytes(m.Share)
}
// ----- //
func NewDGRound3Message2(
to []*tss.PartyID,
from *tss.PartyID,
vdct cmt.HashDeCommitment,
) tss.ParsedMessage {
meta := tss.MessageRouting{
From: from,
To: to,
IsBroadcast: true,
IsToOldCommittee: false,
}
vDctBzs := common.BigIntsToBytes(vdct)
content := &DGRound3Message2{
VDecommitment: vDctBzs,
}
msg := tss.NewMessageWrapper(meta, content)
return tss.NewMessage(meta, content, msg)
}
func (m *DGRound3Message2) ValidateBasic() bool {
return m != nil &&
common.NonEmptyMultiBytes(m.VDecommitment)
}
func (m *DGRound3Message2) UnmarshalVDeCommitment() cmt.HashDeCommitment {
deComBzs := m.GetVDecommitment()
return cmt.NewHashDeCommitmentFromBytes(deComBzs)
}
// ----- //
func NewDGRound4Message2(
to []*tss.PartyID,
from *tss.PartyID,
) tss.ParsedMessage {
meta := tss.MessageRouting{
From: from,
To: to,
IsBroadcast: true,
IsToOldAndNewCommittees: true,
}
content := &DGRound4Message2{}
msg := tss.NewMessageWrapper(meta, content)
return tss.NewMessage(meta, content, msg)
}
func (m *DGRound4Message2) ValidateBasic() bool {
return true
}
func NewDGRound4Message1(
to *tss.PartyID,
from *tss.PartyID,
proof *facproof.ProofFac,
) tss.ParsedMessage {
meta := tss.MessageRouting{
From: from,
To: []*tss.PartyID{to},
IsBroadcast: false,
IsToOldCommittee: false,
}
pfBzs := proof.Bytes()
content := &DGRound4Message1{
FacProof: pfBzs[:],
}
msg := tss.NewMessageWrapper(meta, content)
return tss.NewMessage(meta, content, msg)
}
func (m *DGRound4Message1) ValidateBasic() bool {
return m != nil
// use with NoProofFac()
// && common.NonEmptyMultiBytes(m.GetFacProof(), facproof.ProofFacBytesParts)
}
func (m *DGRound4Message1) UnmarshalFacProof() (*facproof.ProofFac, error) {
return facproof.NewProofFromBytes(m.GetFacProof())
}