mirror of
https://source.quilibrium.com/quilibrium/ceremonyclient.git
synced 2024-11-11 02:35:18 +00:00
99 lines
2.2 KiB
Go
99 lines
2.2 KiB
Go
|
//
|
||
|
// Copyright Coinbase, Inc. All Rights Reserved.
|
||
|
//
|
||
|
// SPDX-License-Identifier: Apache-2.0
|
||
|
//
|
||
|
|
||
|
package v0
|
||
|
|
||
|
import (
|
||
|
"encoding/gob"
|
||
|
"io"
|
||
|
)
|
||
|
|
||
|
func (alice *Alice) dkgCommit(w io.Writer) error {
|
||
|
var err error
|
||
|
enc := gob.NewEncoder(w)
|
||
|
if alice.SkA, err = alice.params.Scalar.Random(); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
alice.PkA = &Schnorr{params: alice.params} // kind of awkward where this should be defined.
|
||
|
result, err := alice.PkA.ProveCommit(alice.SkA) // will mutate `pkA`
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
return enc.Encode(&result)
|
||
|
}
|
||
|
|
||
|
// dkgCommit receives Bob's commitment and returns schnorr statment + proof.
|
||
|
func (bob *Bob) dkgCommit(rw io.ReadWriter) error {
|
||
|
enc := gob.NewEncoder(rw)
|
||
|
dec := gob.NewDecoder(rw)
|
||
|
var err error
|
||
|
if err = dec.Decode(&bob.com); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
if bob.SkB, err = bob.params.Scalar.Random(); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
bob.PkB = &Schnorr{params: bob.params}
|
||
|
if err = bob.PkB.Prove(bob.SkB); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
return enc.Encode(bob.PkB)
|
||
|
}
|
||
|
|
||
|
// dkgVerify input: Bob's statement + schnorr proof.
|
||
|
func (alice *Alice) dkgVerify(rw io.ReadWriter) error {
|
||
|
dec := gob.NewDecoder(rw)
|
||
|
enc := gob.NewEncoder(rw)
|
||
|
var err error
|
||
|
input := &Schnorr{params: alice.params}
|
||
|
if err = dec.Decode(input); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
if err = input.Verify(); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
if alice.Pk, err = input.Pub.ScalarMult(alice.SkA); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
return enc.Encode(alice.PkA)
|
||
|
}
|
||
|
|
||
|
func (bob *Bob) dkgVerify(r io.Reader) error {
|
||
|
dec := gob.NewDecoder(r)
|
||
|
var err error
|
||
|
input := &Schnorr{params: bob.params}
|
||
|
if err = dec.Decode(input); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
if err = input.DecommitVerify(bob.com); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
if bob.Pk, err = input.Pub.ScalarMult(bob.SkB); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (alice *Alice) DKG(rw io.ReadWriter) error {
|
||
|
if err := alice.dkgCommit(rw); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
if err := alice.dkgVerify(rw); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
return alice.Receiver.kosSetup(rw)
|
||
|
}
|
||
|
|
||
|
func (bob *Bob) DKG(rw io.ReadWriter) error {
|
||
|
if err := bob.dkgCommit(rw); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
if err := bob.dkgVerify(rw); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
return bob.Sender.kosSetup(rw)
|
||
|
}
|