Skip to content

Commit 138812b

Browse files
committed
Validate decryption keys against eon key
1 parent 6bb333b commit 138812b

File tree

2 files changed

+41
-12
lines changed

2 files changed

+41
-12
lines changed

rolling-shutter/gnosisaccessnode/decryptionkeyshandler.go

Lines changed: 40 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,29 @@
11
package gnosisaccessnode
22

33
import (
4+
"bytes"
45
"context"
56
"math"
67

78
pubsub "github.com/libp2p/go-libp2p-pubsub"
89
"github.com/pkg/errors"
910

11+
"github.com/shutter-network/shutter/shlib/shcrypto"
12+
1013
obskeyperdatabase "github.com/shutter-network/rolling-shutter/rolling-shutter/chainobserver/db/keyper"
1114
"github.com/shutter-network/rolling-shutter/rolling-shutter/keyperimpl/gnosis"
1215
"github.com/shutter-network/rolling-shutter/rolling-shutter/p2pmsg"
1316
)
1417

1518
type DecryptionKeysHandler struct {
16-
config *Config
19+
config *Config
20+
storage *Storage
1721
}
1822

19-
func NewDecryptionKeysHandler(config *Config) *DecryptionKeysHandler {
23+
func NewDecryptionKeysHandler(config *Config, storage *Storage) *DecryptionKeysHandler {
2024
return &DecryptionKeysHandler{
21-
config: config,
25+
config: config,
26+
storage: storage,
2227
}
2328
}
2429

@@ -39,25 +44,49 @@ func (handler *DecryptionKeysHandler) ValidateMessage(_ context.Context, msg p2p
3944
return pubsub.ValidationAccept, nil
4045
}
4146

42-
func (handler *DecryptionKeysHandler) validateCommonFields(key *p2pmsg.DecryptionKeys) (pubsub.ValidationResult, error) {
43-
if key.InstanceID != handler.config.InstanceID {
47+
func (handler *DecryptionKeysHandler) validateCommonFields(keys *p2pmsg.DecryptionKeys) (pubsub.ValidationResult, error) {
48+
if keys.InstanceID != handler.config.InstanceID {
4449
return pubsub.ValidationReject,
45-
errors.Errorf("instance ID mismatch (want=%d, have=%d)", handler.config.InstanceID, key.GetInstanceID())
50+
errors.Errorf("instance ID mismatch (want=%d, have=%d)", handler.config.InstanceID, keys.GetInstanceID())
4651
}
47-
if key.Eon > math.MaxInt64 {
48-
return pubsub.ValidationReject, errors.Errorf("eon %d overflows int64", key.Eon)
52+
if keys.Eon > math.MaxInt64 {
53+
return pubsub.ValidationReject, errors.Errorf("eon %d overflows int64", keys.Eon)
4954
}
5055

51-
if len(key.Keys) == 0 {
56+
if len(keys.Keys) == 0 {
5257
return pubsub.ValidationReject, errors.New("no keys in message")
5358
}
54-
if len(key.Keys) > int(handler.config.MaxNumKeysPerMessage) {
59+
if len(keys.Keys) > int(handler.config.MaxNumKeysPerMessage) {
5560
return pubsub.ValidationReject, errors.Errorf(
5661
"too many keys in message (%d > %d)",
57-
len(key.Keys),
62+
len(keys.Keys),
5863
handler.config.MaxNumKeysPerMessage,
5964
)
6065
}
66+
67+
eonKey, ok := handler.storage.GetEonKey(keys.Eon)
68+
if !ok {
69+
return pubsub.ValidationReject, errors.Errorf("no eon key found for eon %d", keys.Eon)
70+
}
71+
72+
for i, k := range keys.Keys {
73+
epochSecretKey, err := k.GetEpochSecretKey()
74+
if err != nil {
75+
return pubsub.ValidationReject, err
76+
}
77+
ok, err := shcrypto.VerifyEpochSecretKey(epochSecretKey, eonKey, k.Identity)
78+
if err != nil {
79+
return pubsub.ValidationReject, errors.Wrapf(err, "error while checking epoch secret key for identity %x", k.Identity)
80+
}
81+
if !ok {
82+
return pubsub.ValidationReject, errors.Errorf("epoch secret key for identity %x is not valid", k.Identity)
83+
}
84+
85+
if i > 0 && bytes.Compare(k.Identity, keys.Keys[i-1].Identity) < 0 {
86+
return pubsub.ValidationReject, errors.Errorf("keys not ordered")
87+
}
88+
}
89+
6190
return pubsub.ValidationAccept, nil
6291
}
6392

rolling-shutter/gnosisaccessnode/node.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ func (node *GnosisAccessNode) Start(ctx context.Context, runner service.Runner)
3333
if err != nil {
3434
return errors.Wrap(err, "failed to initialize p2p messaging")
3535
}
36-
messageSender.AddMessageHandler(NewDecryptionKeysHandler(node.config))
36+
messageSender.AddMessageHandler(NewDecryptionKeysHandler(node.config, node.storage))
3737

3838
chainSyncClient, err := chainsync.NewClient(
3939
ctx,

0 commit comments

Comments
 (0)