@@ -7,7 +7,10 @@ import (
7
7
"github.com/pkg/errors"
8
8
"github.com/rs/zerolog/log"
9
9
10
+ "github.com/shutter-network/shutter/shlib/shcrypto"
11
+
10
12
"github.com/shutter-network/rolling-shutter/rolling-shutter/db/snpdb"
13
+ "github.com/shutter-network/rolling-shutter/rolling-shutter/medley"
11
14
"github.com/shutter-network/rolling-shutter/rolling-shutter/p2p"
12
15
"github.com/shutter-network/rolling-shutter/rolling-shutter/p2pmsg"
13
16
)
@@ -49,7 +52,9 @@ func (d *DecryptionTriggerHandler) MessagePrototypes() []p2pmsg.Message {
49
52
return []p2pmsg.Message {& p2pmsg.DecryptionTrigger {}}
50
53
}
51
54
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
+
53
58
decryptionKeyMsg := msg .(* p2pmsg.DecryptionKey )
54
59
// FIXME: check snapshot business logic for decryptionKeyMsg validation
55
60
if decryptionKeyMsg .GetInstanceID () != handler .config .InstanceID {
@@ -67,6 +72,30 @@ func (handler *DecryptionKeyHandler) ValidateMessage(_ context.Context, msg p2pm
67
72
return false , errors .Wrap (err , "failed to encode decryption key" )
68
73
}
69
74
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
+
70
99
return true , nil
71
100
}
72
101
0 commit comments