mirror of
https://source.quilibrium.com/quilibrium/ceremonyclient.git
synced 2024-12-27 17:15:18 +00:00
66 lines
1.9 KiB
Go
66 lines
1.9 KiB
Go
//
|
|
// Copyright Coinbase, Inc. All Rights Reserved.
|
|
//
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
//
|
|
|
|
// Package frost is an implementation of the DKG part of https://eprint.iacr.org/2020/852.pdf
|
|
package frost
|
|
|
|
import (
|
|
"strconv"
|
|
|
|
"source.quilibrium.com/quilibrium/monorepo/nekryptology/internal"
|
|
"source.quilibrium.com/quilibrium/monorepo/nekryptology/pkg/core/curves"
|
|
"source.quilibrium.com/quilibrium/monorepo/nekryptology/pkg/sharing"
|
|
)
|
|
|
|
type DkgParticipant struct {
|
|
round int
|
|
Curve *curves.Curve
|
|
otherParticipantShares map[uint32]*dkgParticipantData
|
|
Id uint32
|
|
SkShare curves.Scalar
|
|
VerificationKey curves.Point
|
|
VkShare curves.Point
|
|
feldman *sharing.Feldman
|
|
verifiers *sharing.FeldmanVerifier
|
|
secretShares []*sharing.ShamirShare
|
|
ctx byte
|
|
}
|
|
|
|
type dkgParticipantData struct {
|
|
Id uint32
|
|
Share *sharing.ShamirShare
|
|
Verifiers *sharing.FeldmanVerifier
|
|
}
|
|
|
|
func NewDkgParticipant(id, threshold uint32, ctx string, curve *curves.Curve, otherParticipants ...uint32) (*DkgParticipant, error) {
|
|
if curve == nil || len(otherParticipants) == 0 {
|
|
return nil, internal.ErrNilArguments
|
|
}
|
|
limit := uint32(len(otherParticipants)) + 1
|
|
feldman, err := sharing.NewFeldman(threshold, limit, curve)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
otherParticipantShares := make(map[uint32]*dkgParticipantData, len(otherParticipants))
|
|
for _, id := range otherParticipants {
|
|
otherParticipantShares[id] = &dkgParticipantData{
|
|
Id: id,
|
|
}
|
|
}
|
|
|
|
// SetBigInt the common fixed string
|
|
ctxV, _ := strconv.Atoi(ctx)
|
|
|
|
return &DkgParticipant{
|
|
Id: id,
|
|
round: 1,
|
|
Curve: curve,
|
|
feldman: feldman,
|
|
otherParticipantShares: otherParticipantShares,
|
|
ctx: byte(ctxV),
|
|
}, nil
|
|
}
|