Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions dkg/pedersen/dkg.go
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,15 @@ func (s *instance) handleMessage(
// receive other messages in the meantime, like a Deal.
switch msg := msg.(type) {

case types.GetPeerPubKey:
response := types.NewGetPeerPubKeyResp(suite.Point().Mul(s.privKey, nil))
errs := out.Send(response, from)
err := <-errs
if err != nil {
return xerrors.Errorf("got an error while sending the get peer pubkey resp "+
"reply: %v", err)
}

case types.Start:
go func() {
err := s.start(ctx, msg, s.deals, s.responses, from, out)
Expand Down
33 changes: 33 additions & 0 deletions dkg/pedersen/json/json.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,12 @@ type Address []byte

type PublicKey []byte

type GetPeerPubKey struct{}

type GetPeerPubKeyResp struct {
PublicKey PublicKey
}

type Start struct {
Threshold int
Addresses []Address
Expand Down Expand Up @@ -121,6 +127,8 @@ type ReencryptReply struct {
}

type Message struct {
GetPeerPubKey *GetPeerPubKey `json:",omitempty"`
GetPeerPubKeyResp *GetPeerPubKeyResp `json:",omitempty"`
Start *Start `json:",omitempty"`
StartResharing *StartResharing `json:",omitempty"`
Deal *Deal `json:",omitempty"`
Expand Down Expand Up @@ -155,6 +163,19 @@ func (f msgFormat) Encode(ctx serde.Context, msg serde.Message) ([]byte, error)
var err error

switch in := msg.(type) {
case types.GetPeerPubKey:
m = Message{
GetPeerPubKey: &GetPeerPubKey{},
}
case types.GetPeerPubKeyResp:
v, err := in.GetPublicKey().MarshalBinary()
if err != nil {
return nil, xerrors.Errorf("failed to marshal pubkey: %v", err)
}

m = Message{GetPeerPubKeyResp: &GetPeerPubKeyResp{
PublicKey: v,
}}
case types.Start:
m, err = encodeStart(in)
case types.StartResharing:
Expand Down Expand Up @@ -226,6 +247,18 @@ func (f msgFormat) Decode(ctx serde.Context, data []byte) (serde.Message, error)
}

switch {
case m.GetPeerPubKey != nil:
return types.NewGetPeerPubKey(), nil

case m.GetPeerPubKeyResp != nil:
v := f.suite.Point()
err = v.UnmarshalBinary(m.GetPeerPubKeyResp.PublicKey)
if err != nil {
return nil, xerrors.Errorf("failed to unmarshal pubkey: %v", err)
}

return types.NewGetPeerPubKeyResp(v), nil

case m.Start != nil:
return f.decodeStart(ctx, m.Start)

Expand Down
30 changes: 30 additions & 0 deletions dkg/pedersen/json/json_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,36 @@ import (
// suite is the Kyber suite for Pedersen.
var suite = suites.MustFind("Ed25519")

func TestMessageFormat_PeerPublicKey(t *testing.T) {
format := newMsgFormat()
ctx := serde.NewContext(fake.ContextEngine{})

data, err := format.Encode(ctx, types.NewGetPeerPubKey())
require.NoError(t, err)
require.JSONEq(t, `{"GetPeerPubKey":{}}`, string(data))

request, err := format.Decode(ctx, data)
require.NoError(t, err)
require.IsType(t, types.GetPeerPubKey{}, request)

publicKey := suite.Point().Pick(suite.RandomStream())
data, err = format.Encode(ctx, types.NewGetPeerPubKeyResp(publicKey))
require.NoError(t, err)

message, err := format.Decode(ctx, data)
require.NoError(t, err)
response := message.(types.GetPeerPubKeyResp)
require.True(t, publicKey.Equal(response.GetPublicKey()))

_, err = format.Encode(ctx, types.NewGetPeerPubKeyResp(badPoint{}))
require.EqualError(t, err,
fake.Err("failed to marshal pubkey"))

_, err = format.Decode(ctx, []byte(`{"GetPeerPubKeyResp":{"PublicKey":[]}}`))
require.EqualError(t, err,
"failed to unmarshal pubkey: invalid Ed25519 curve point")
}

func TestMessageFormat_EncodeStart(t *testing.T) {
start := types.NewStart(1, []mino.Address{fake.NewAddress(0)}, []kyber.Point{suite.Point()})

Expand Down
Loading
Loading