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

103 lines
3.0 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 (
"encoding/hex"
"errors"
"math/big"
"github.com/luxfi/tss/v2/crypto"
"github.com/luxfi/tss/v2/crypto/paillier"
"github.com/luxfi/tss/v2/tss"
)
type (
LocalPreParams struct {
PaillierSK *paillier.PrivateKey // ski
NTildei,
H1i, H2i,
Alpha, Beta,
P, Q *big.Int
}
LocalSecrets struct {
// secret fields (not shared, but stored locally)
Xi, ShareID *big.Int // xi, kj
}
// Everything in LocalPartySaveData is saved locally to user's HD when done
LocalPartySaveData struct {
LocalPreParams
LocalSecrets
// original indexes (ki in signing preparation phase)
Ks []*big.Int
// n-tilde, h1, h2 for range proofs
NTildej, H1j, H2j []*big.Int
// public keys (Xj = uj*G for each Pj)
BigXj []*crypto.ECPoint // Xj
PaillierPKs []*paillier.PublicKey // pkj
// used for test assertions (may be discarded)
ECDSAPub *crypto.ECPoint // y
}
)
func NewLocalPartySaveData(partyCount int) (saveData LocalPartySaveData) {
saveData.Ks = make([]*big.Int, partyCount)
saveData.NTildej = make([]*big.Int, partyCount)
saveData.H1j, saveData.H2j = make([]*big.Int, partyCount), make([]*big.Int, partyCount)
saveData.BigXj = make([]*crypto.ECPoint, partyCount)
saveData.PaillierPKs = make([]*paillier.PublicKey, partyCount)
return
}
func (preParams LocalPreParams) Validate() bool {
return preParams.PaillierSK != nil &&
preParams.NTildei != nil &&
preParams.H1i != nil &&
preParams.H2i != nil
}
func (preParams LocalPreParams) ValidateWithProof() bool {
return preParams.Validate() &&
preParams.PaillierSK.P != nil &&
preParams.PaillierSK.Q != nil &&
preParams.Alpha != nil &&
preParams.Beta != nil &&
preParams.P != nil &&
preParams.Q != nil
}
// BuildLocalSaveDataSubset re-creates the LocalPartySaveData to contain data for only the list of signing parties.
func BuildLocalSaveDataSubset(sourceData LocalPartySaveData, sortedIDs tss.SortedPartyIDs) LocalPartySaveData {
keysToIndices := make(map[string]int, len(sourceData.Ks))
for j, kj := range sourceData.Ks {
keysToIndices[hex.EncodeToString(kj.Bytes())] = j
}
newData := NewLocalPartySaveData(sortedIDs.Len())
newData.LocalPreParams = sourceData.LocalPreParams
newData.LocalSecrets = sourceData.LocalSecrets
newData.ECDSAPub = sourceData.ECDSAPub
for j, id := range sortedIDs {
savedIdx, ok := keysToIndices[hex.EncodeToString(id.Key)]
if !ok {
panic(errors.New("BuildLocalSaveDataSubset: unable to find a signer party in the local save data"))
}
newData.Ks[j] = sourceData.Ks[savedIdx]
newData.NTildej[j] = sourceData.NTildej[savedIdx]
newData.H1j[j] = sourceData.H1j[savedIdx]
newData.H2j[j] = sourceData.H2j[savedIdx]
newData.BigXj[j] = sourceData.BigXj[savedIdx]
newData.PaillierPKs[j] = sourceData.PaillierPKs[savedIdx]
}
return newData
}