mirror of
https://github.com/luxfi/tss.git
synced 2026-10-30 15:14:51 +00:00
99 lines
2.1 KiB
Go
99 lines
2.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 (
|
|
"math/big"
|
|
|
|
"github.com/luxfi/tss/v2/common"
|
|
"github.com/luxfi/tss/v2/tss"
|
|
)
|
|
|
|
const (
|
|
TaskName = "eddsa-keygen"
|
|
)
|
|
|
|
type (
|
|
base struct {
|
|
*tss.Parameters
|
|
save *LocalPartySaveData
|
|
temp *localTempData
|
|
out chan<- tss.Message
|
|
end chan<- *LocalPartySaveData
|
|
ok []bool // `ok` tracks parties which have been verified by Update()
|
|
started bool
|
|
number int
|
|
}
|
|
round1 struct {
|
|
*base
|
|
}
|
|
round2 struct {
|
|
*round1
|
|
}
|
|
round3 struct {
|
|
*round2
|
|
}
|
|
)
|
|
|
|
func (round *base) Params() *tss.Parameters {
|
|
return round.Parameters
|
|
}
|
|
|
|
func (round *base) RoundNumber() int {
|
|
return round.number
|
|
}
|
|
|
|
// CanProceed is inherited by other rounds
|
|
func (round *base) CanProceed() bool {
|
|
if !round.started {
|
|
return false
|
|
}
|
|
for _, ok := range round.ok {
|
|
if !ok {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
// WaitingFor is called by a Party for reporting back to the caller
|
|
func (round *base) WaitingFor() []*tss.PartyID {
|
|
Ps := round.Parties().IDs()
|
|
ids := make([]*tss.PartyID, 0, len(round.ok))
|
|
for j, ok := range round.ok {
|
|
if ok {
|
|
continue
|
|
}
|
|
ids = append(ids, Ps[j])
|
|
}
|
|
return ids
|
|
}
|
|
|
|
func (round *base) WrapError(err error, culprits ...*tss.PartyID) *tss.Error {
|
|
return tss.NewError(err, TaskName, round.number, round.PartyID(), culprits...)
|
|
}
|
|
|
|
// ----- //
|
|
|
|
// `ok` tracks parties which have been verified by Update()
|
|
func (round *base) resetOK() {
|
|
for j := range round.ok {
|
|
round.ok[j] = false
|
|
}
|
|
}
|
|
|
|
// get ssid from local params
|
|
func (round *base) getSSID() ([]byte, error) {
|
|
ssidList := []*big.Int{round.EC().Params().P, round.EC().Params().N, round.EC().Params().Gx, round.EC().Params().Gy} // ec curve
|
|
ssidList = append(ssidList, round.Parties().IDs().Keys()...)
|
|
ssidList = append(ssidList, big.NewInt(int64(round.number))) // round number
|
|
ssidList = append(ssidList, round.temp.ssidNonce)
|
|
ssid := common.SHA512_256i(ssidList...).Bytes()
|
|
|
|
return ssid, nil
|
|
}
|