Skip to content

Commit b7b201f

Browse files
authored
Merge pull request #400 from shutter-network/fix/verify-decryption-key
fix: snapshot collator did not verify received decryption keys
2 parents 560147b + d96b534 commit b7b201f

File tree

2 files changed

+34
-1
lines changed

2 files changed

+34
-1
lines changed

docker/docker-compose.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@ services:
3636
--http
3737
--http.addr 0.0.0.0
3838
--http.vhosts geth
39+
# No idea why this is suddenly needed - the HEALTHCHECK is defined in the dockerfile but doesn't get picked up anymore...
40+
healthcheck:
41+
test: >
42+
curl -sSf -X POST http://127.0.0.1:8545 -H "Content-Type: application/json" --data-raw '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[], "id": 1}'
3943
logging: *logging
4044

4145
deploy-contracts:

rolling-shutter/snapshot/handler.go

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@ import (
77
"github.com/pkg/errors"
88
"github.com/rs/zerolog/log"
99

10+
"github.com/shutter-network/shutter/shlib/shcrypto"
11+
1012
"github.com/shutter-network/rolling-shutter/rolling-shutter/db/snpdb"
13+
"github.com/shutter-network/rolling-shutter/rolling-shutter/medley"
1114
"github.com/shutter-network/rolling-shutter/rolling-shutter/p2p"
1215
"github.com/shutter-network/rolling-shutter/rolling-shutter/p2pmsg"
1316
)
@@ -49,7 +52,9 @@ func (d *DecryptionTriggerHandler) MessagePrototypes() []p2pmsg.Message {
4952
return []p2pmsg.Message{&p2pmsg.DecryptionTrigger{}}
5053
}
5154

52-
func (handler *DecryptionKeyHandler) ValidateMessage(_ context.Context, msg p2pmsg.Message) (bool, error) {
55+
func (handler *DecryptionKeyHandler) ValidateMessage(ctx context.Context, msg p2pmsg.Message) (bool, error) {
56+
var eonPublicKey shcrypto.EonPublicKey
57+
5358
decryptionKeyMsg := msg.(*p2pmsg.DecryptionKey)
5459
// FIXME: check snapshot business logic for decryptionKeyMsg validation
5560
if decryptionKeyMsg.GetInstanceID() != handler.config.InstanceID {
@@ -67,6 +72,30 @@ func (handler *DecryptionKeyHandler) ValidateMessage(_ context.Context, msg p2pm
6772
return false, errors.Wrap(err, "failed to encode decryption key")
6873
}
6974

75+
eonID, err := medley.Uint64ToInt64Safe(decryptionKeyMsg.GetEon())
76+
if err != nil {
77+
return false, errors.Wrap(err, "can't cast eon to int64")
78+
}
79+
80+
eon, err := handler.snapshot.db.GetEonPublicKey(ctx, eonID)
81+
if err != nil {
82+
return false, errors.Wrap(err, "failed to retrieve eon for decryption key")
83+
}
84+
85+
err = eonPublicKey.GobDecode(eon)
86+
if err != nil {
87+
return false, errors.Wrap(err, "failed to retrieve eon for decryption key")
88+
}
89+
90+
epochID := decryptionKeyMsg.GetEpochID()
91+
ok, err := shcrypto.VerifyEpochSecretKey(key, &eonPublicKey, epochID)
92+
if err != nil {
93+
return false, err
94+
}
95+
if !ok {
96+
return false, errors.Errorf("recovery of epoch secret key failed for epoch %s", epochID)
97+
}
98+
7099
return true, nil
71100
}
72101

0 commit comments

Comments
 (0)