mirror of
https://github.com/luxfi/tss.git
synced 2026-10-30 15:14:51 +00:00
127 lines
3.1 KiB
Go
127 lines
3.1 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 keygen
|
|
|
|
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/schnorr"
|
|
"github.com/luxfi/tss/v2/crypto/vss"
|
|
"github.com/luxfi/tss/v2/tss"
|
|
)
|
|
|
|
// These messages were generated from Protocol Buffers definitions into eddsa-keygen.pb.go
|
|
// The following messages are registered on the Protocol Buffers "wire"
|
|
|
|
var (
|
|
// Ensure that keygen messages implement ValidateBasic
|
|
_ = []tss.MessageContent{
|
|
(*KGRound1Message)(nil),
|
|
(*KGRound2Message1)(nil),
|
|
(*KGRound2Message2)(nil),
|
|
}
|
|
)
|
|
|
|
// ----- //
|
|
|
|
func NewKGRound1Message(from *tss.PartyID, ct cmt.HashCommitment) tss.ParsedMessage {
|
|
meta := tss.MessageRouting{
|
|
From: from,
|
|
IsBroadcast: true,
|
|
}
|
|
content := &KGRound1Message{
|
|
Commitment: ct.Bytes(),
|
|
}
|
|
msg := tss.NewMessageWrapper(meta, content)
|
|
return tss.NewMessage(meta, content, msg)
|
|
}
|
|
|
|
func (m *KGRound1Message) ValidateBasic() bool {
|
|
return m != nil && common.NonEmptyBytes(m.GetCommitment())
|
|
}
|
|
|
|
func (m *KGRound1Message) UnmarshalCommitment() *big.Int {
|
|
return new(big.Int).SetBytes(m.GetCommitment())
|
|
}
|
|
|
|
// ----- //
|
|
|
|
func NewKGRound2Message1(
|
|
to, from *tss.PartyID,
|
|
share *vss.Share,
|
|
) tss.ParsedMessage {
|
|
meta := tss.MessageRouting{
|
|
From: from,
|
|
To: []*tss.PartyID{to},
|
|
IsBroadcast: false,
|
|
}
|
|
content := &KGRound2Message1{
|
|
Share: share.Share.Bytes(),
|
|
}
|
|
msg := tss.NewMessageWrapper(meta, content)
|
|
return tss.NewMessage(meta, content, msg)
|
|
}
|
|
|
|
func (m *KGRound2Message1) ValidateBasic() bool {
|
|
return m != nil &&
|
|
common.NonEmptyBytes(m.GetShare())
|
|
}
|
|
|
|
func (m *KGRound2Message1) UnmarshalShare() *big.Int {
|
|
return new(big.Int).SetBytes(m.Share)
|
|
}
|
|
|
|
// ----- //
|
|
|
|
func NewKGRound2Message2(
|
|
from *tss.PartyID,
|
|
deCommitment cmt.HashDeCommitment,
|
|
proof *schnorr.ZKProof,
|
|
) tss.ParsedMessage {
|
|
meta := tss.MessageRouting{
|
|
From: from,
|
|
IsBroadcast: true,
|
|
}
|
|
dcBzs := common.BigIntsToBytes(deCommitment)
|
|
content := &KGRound2Message2{
|
|
DeCommitment: dcBzs,
|
|
ProofAlphaX: proof.Alpha.X().Bytes(),
|
|
ProofAlphaY: proof.Alpha.Y().Bytes(),
|
|
ProofT: proof.T.Bytes(),
|
|
}
|
|
msg := tss.NewMessageWrapper(meta, content)
|
|
return tss.NewMessage(meta, content, msg)
|
|
}
|
|
|
|
func (m *KGRound2Message2) ValidateBasic() bool {
|
|
return m != nil &&
|
|
common.NonEmptyMultiBytes(m.GetDeCommitment())
|
|
}
|
|
|
|
func (m *KGRound2Message2) UnmarshalDeCommitment() []*big.Int {
|
|
deComBzs := m.GetDeCommitment()
|
|
return cmt.NewHashDeCommitmentFromBytes(deComBzs)
|
|
}
|
|
|
|
func (m *KGRound2Message2) UnmarshalZKProof(ec elliptic.Curve) (*schnorr.ZKProof, error) {
|
|
point, err := crypto.NewECPoint(
|
|
ec,
|
|
new(big.Int).SetBytes(m.GetProofAlphaX()),
|
|
new(big.Int).SetBytes(m.GetProofAlphaY()))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &schnorr.ZKProof{
|
|
Alpha: point,
|
|
T: new(big.Int).SetBytes(m.GetProofT()),
|
|
}, nil
|
|
}
|