Skip to content

Commit 260eccb

Browse files
feat: update handler and middleware to allow no sig on keys message and no check on decryption trigger
1 parent 5e08d65 commit 260eccb

File tree

4 files changed

+15
-100
lines changed

4 files changed

+15
-100
lines changed

rolling-shutter/keyperimpl/shutterservice/handlers.go

Lines changed: 2 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -177,48 +177,6 @@ func validateSignerIndices(extra *p2pmsg.ShutterServiceDecryptionKeysExtra, n in
177177
return pubsub.ValidationAccept, nil
178178
}
179179

180-
func ValidateDecryptionKeysSignatures(
181-
keys *p2pmsg.DecryptionKeys,
182-
extra *p2pmsg.ShutterServiceDecryptionKeysExtra,
183-
keyperSet *obskeyperdatabase.KeyperSet,
184-
) (pubsub.ValidationResult, error) {
185-
if int32(len(extra.SignerIndices)) != keyperSet.Threshold {
186-
return pubsub.ValidationReject, errors.Errorf("expected %d signers, got %d", keyperSet.Threshold, len(extra.SignerIndices))
187-
}
188-
res, err := validateSignerIndices(extra, len(keyperSet.Keypers))
189-
if res != pubsub.ValidationAccept {
190-
return res, err
191-
}
192-
signers, err := keyperSet.GetSubset(extra.SignerIndices)
193-
if err != nil {
194-
return pubsub.ValidationReject, err
195-
}
196-
identityPreimages := []identitypreimage.IdentityPreimage{}
197-
for _, key := range keys.Keys {
198-
identityPreimage := identitypreimage.IdentityPreimage(key.IdentityPreimage)
199-
identityPreimages = append(identityPreimages, identityPreimage)
200-
}
201-
202-
sigData, err := serviceztypes.NewDecryptionSignatureData(keys.InstanceId, keys.Eon, identityPreimages)
203-
if err != nil {
204-
return pubsub.ValidationReject, errors.Wrap(err, "failed to create decryption signature data object")
205-
}
206-
207-
for signatureIndex := 0; signatureIndex < len(extra.Signature); signatureIndex++ {
208-
signature := extra.Signature[signatureIndex]
209-
signer := signers[signatureIndex]
210-
signatureValid, err := sigData.CheckSignature(signature, signer)
211-
if err != nil {
212-
return pubsub.ValidationReject, errors.Wrap(err, "failed to check decryption signature")
213-
}
214-
if !signatureValid {
215-
return pubsub.ValidationReject, errors.New("decryption signature invalid")
216-
}
217-
}
218-
219-
return pubsub.ValidationAccept, nil
220-
}
221-
222180
func (h *DecryptionKeysHandler) ValidateMessage(ctx context.Context, msg p2pmsg.Message) (pubsub.ValidationResult, error) {
223181
keys := msg.(*p2pmsg.DecryptionKeys)
224182
extra, ok := keys.Extra.(*p2pmsg.DecryptionKeys_Service)
@@ -235,7 +193,7 @@ func (h *DecryptionKeysHandler) ValidateMessage(ctx context.Context, msg p2pmsg.
235193
return pubsub.ValidationReject, errors.Wrapf(err, "failed to get keyper set from database for eon %d", keys.Eon)
236194
}
237195

238-
res, err := ValidateDecryptionKeysSignatures(keys, extra.Service, &keyperSet)
196+
res, err := validateSignerIndices(extra.Service, len(keyperSet.Keypers))
239197
if res != pubsub.ValidationAccept || err != nil {
240198
return res, err
241199
}
@@ -248,12 +206,7 @@ func (h *DecryptionKeysHandler) HandleMessage(ctx context.Context, msg p2pmsg.Me
248206
extra := keys.Extra.(*p2pmsg.DecryptionKeys_Service).Service
249207
serviceDB := database.New(h.dbpool)
250208

251-
identityPreimages := []identitypreimage.IdentityPreimage{}
252-
for _, key := range keys.Keys {
253-
identityPreimage := identitypreimage.IdentityPreimage(key.IdentityPreimage)
254-
identityPreimages = append(identityPreimages, identityPreimage)
255-
}
256-
identitiesHash := computeIdentitiesHash(identityPreimages)
209+
identitiesHash := computeIdentitiesHashFromKeys(keys.GetKeys())
257210
for i, keyperIndex := range extra.SignerIndices {
258211
err := serviceDB.InsertDecryptionSignature(ctx, database.InsertDecryptionSignatureParams{
259212
Eon: int64(keys.Eon),

rolling-shutter/keyperimpl/shutterservice/identitieshash.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,11 @@ func computeIdentitiesHashFromShares(shares []*p2pmsg.KeyShare) []byte {
2222
}
2323
return computeIdentitiesHash(identityPreimges)
2424
}
25+
26+
func computeIdentitiesHashFromKeys(keys []*p2pmsg.Key) []byte {
27+
identityPreimges := []identitypreimage.IdentityPreimage{}
28+
for _, key := range keys {
29+
identityPreimges = append(identityPreimges, identitypreimage.IdentityPreimage(key.IdentityPreimage))
30+
}
31+
return computeIdentitiesHash(identityPreimges)
32+
}

rolling-shutter/keyperimpl/shutterservice/messagingmiddleware.go

Lines changed: 5 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
package shutterservice
22

33
import (
4-
"bytes"
54
"context"
65

7-
"github.com/jackc/pgx/v4"
86
"github.com/jackc/pgx/v4/pgxpool"
97
pubsub "github.com/libp2p/go-libp2p-pubsub"
108
"github.com/pkg/errors"
@@ -105,32 +103,7 @@ func (i *MessagingMiddleware) interceptDecryptionKeyShares(
105103
) (p2pmsg.Message, error) {
106104
queries := database.New(i.dbpool)
107105

108-
currentDecryptionTrigger, err := queries.GetCurrentDecryptionTrigger(ctx, int64(originalMsg.Eon))
109-
if err == pgx.ErrNoRows {
110-
log.Warn().
111-
Uint64("eon", originalMsg.Eon).
112-
Msg("intercepted decryption key shares message with unknown corresponding decryption trigger")
113-
return nil, nil
114-
} else if err != nil {
115-
return nil, errors.Wrapf(err, "failed to get current decryption trigger for eon %d", originalMsg.Eon)
116-
}
117-
if originalMsg.Eon != uint64(currentDecryptionTrigger.Eon) {
118-
log.Warn().
119-
Uint64("eon-got", originalMsg.Eon).
120-
Int64("eon-expected", currentDecryptionTrigger.Eon).
121-
Msg("intercepted decryption key shares message with unexpected eon")
122-
return nil, nil
123-
}
124-
125106
identitiesHash := computeIdentitiesHashFromShares(originalMsg.Shares)
126-
if !bytes.Equal(identitiesHash, currentDecryptionTrigger.IdentitiesHash) {
127-
log.Warn().
128-
Uint64("eon", originalMsg.Eon).
129-
Hex("expectedIdentitiesHash", currentDecryptionTrigger.IdentitiesHash).
130-
Hex("actualIdentitiesHash", identitiesHash).
131-
Msg("intercepted decryption key shares message with unexpected identities hash")
132-
return nil, nil
133-
}
134107

135108
identityPreimages := []identitypreimage.IdentityPreimage{}
136109
for _, share := range originalMsg.Shares {
@@ -176,32 +149,23 @@ func (i *MessagingMiddleware) interceptDecryptionKeys(
176149
ctx context.Context,
177150
originalMsg *p2pmsg.DecryptionKeys,
178151
) (p2pmsg.Message, error) {
179-
// TODO: update flag in event table to notify the decryption is already done
180152
if originalMsg.Extra != nil {
181153
return originalMsg, nil
182154
}
183155

184156
serviceDB := database.New(i.dbpool)
185157
obsKeyperDB := obskeyperdatabase.New(i.dbpool)
186-
trigger, err := serviceDB.GetCurrentDecryptionTrigger(ctx, int64(originalMsg.Eon))
187-
if err == pgx.ErrNoRows {
188-
log.Warn().
189-
Uint64("eon", originalMsg.Eon).
190-
Msg("unknown decryption trigger for intercepted keys message")
191-
return nil, nil
192-
}
193-
if err != nil {
194-
return nil, errors.Wrapf(err, "failed to get current decryption trigger for eon %d", originalMsg.Eon)
195-
}
196158

197159
keyperSet, err := obsKeyperDB.GetKeyperSetByKeyperConfigIndex(ctx, int64(originalMsg.Eon))
198160
if err != nil {
199161
return nil, errors.Wrapf(err, "failed to get keyper set from database for eon %d", originalMsg.Eon)
200162
}
201163

164+
identitiesHash := computeIdentitiesHashFromKeys(originalMsg.GetKeys())
165+
202166
signatures, err := serviceDB.GetDecryptionSignatures(ctx, database.GetDecryptionSignaturesParams{
203167
Eon: int64(originalMsg.Eon),
204-
IdentitiesHash: trigger.IdentitiesHash,
168+
IdentitiesHash: identitiesHash,
205169
Limit: keyperSet.Threshold,
206170
})
207171
if err != nil {
@@ -212,7 +176,7 @@ func (i *MessagingMiddleware) interceptDecryptionKeys(
212176
if len(signatures) < int(keyperSet.Threshold) {
213177
log.Debug().
214178
Uint64("eon", originalMsg.Eon).
215-
Hex("identities-hash", trigger.IdentitiesHash).
179+
Hex("identities-hash", identitiesHash).
216180
Int32("threshold", keyperSet.Threshold).
217181
Int("num-signatures", len(signatures)).
218182
Msg("dropping intercepted keys message as signature count is not high enough yet")
@@ -241,7 +205,7 @@ func (i *MessagingMiddleware) interceptDecryptionKeys(
241205

242206
log.Info().
243207
Uint64("eon", originalMsg.Eon).
244-
Hex("identities-hash", trigger.IdentitiesHash).
208+
Hex("identities-hash", identitiesHash).
245209
Int("num-signatures", len(signatures)).
246210
Int("num-keys", len(msg.Keys)).
247211
Msg("sending keys")

rolling-shutter/keyperimpl/shutterservice/newblock.go

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,6 @@ func (kpr *Keyper) triggerDecryption(ctx context.Context,
109109
triggeredBlock *syncevent.LatestBlock,
110110
) error {
111111
coreKeyperDB := corekeyperdatabase.New(kpr.dbpool)
112-
serviceDB := servicedatabase.New(kpr.dbpool)
113112

114113
identityPreimages := make(map[int64][]identitypreimage.IdentityPreimage)
115114
lastEonBlock := make(map[int64]int64)
@@ -143,15 +142,6 @@ func (kpr *Keyper) triggerDecryption(ctx context.Context,
143142
for eon, preImages := range identityPreimages {
144143
sortedIdentityPreimages := sortIdentityPreimages(preImages)
145144

146-
err := serviceDB.SetCurrentDecryptionTrigger(ctx, servicedatabase.SetCurrentDecryptionTriggerParams{
147-
Eon: eon,
148-
TriggeredBlockNumber: triggeredBlock.Number.Int64(),
149-
IdentitiesHash: computeIdentitiesHash(sortedIdentityPreimages),
150-
})
151-
if err != nil {
152-
return errors.Wrap(err, "failed to insert published decryption trigger into db")
153-
}
154-
155145
trigger := epochkghandler.DecryptionTrigger{
156146
// sending last block available for that eon as the key shares will be generated based on the eon associated with this block number
157147
BlockNumber: uint64(lastEonBlock[eon]),

0 commit comments

Comments
 (0)