Skip to content

Commit e46d104

Browse files
committed
msgsecret: add hack for trying both senders for decryption
1 parent 5d16908 commit e46d104

1 file changed

Lines changed: 11 additions & 2 deletions

File tree

msgsecret.go

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"context"
1111
"crypto/sha256"
1212
"fmt"
13+
"strings"
1314
"time"
1415

1516
"go.mau.fi/util/random"
@@ -101,7 +102,7 @@ func (cli *Client) decryptMsgSecret(ctx context.Context, msg *events.Message, us
101102
if err != nil {
102103
return nil, err
103104
}
104-
baseEncKey, origSender, err := cli.Store.MsgSecrets.GetMessageSecret(ctx, msg.Info.Chat, origSender, origMsgKey.GetID())
105+
baseEncKey, storedOrigSender, err := cli.Store.MsgSecrets.GetMessageSecret(ctx, msg.Info.Chat, origSender, origMsgKey.GetID())
105106
if err != nil {
106107
return nil, fmt.Errorf("failed to get original message secret key: %w", err)
107108
}
@@ -111,7 +112,15 @@ func (cli *Client) decryptMsgSecret(ctx context.Context, msg *events.Message, us
111112
secretKey, additionalData := generateMsgSecretKey(useCase, msg.Info.Sender, origMsgKey.GetID(), origSender, baseEncKey)
112113
plaintext, err := gcmutil.Decrypt(secretKey, encrypted.GetEncIV(), encrypted.GetEncPayload(), additionalData)
113114
if err != nil {
114-
return nil, fmt.Errorf("failed to decrypt secret message: %w", err)
115+
// Hack for trying both the original sender in the new message and the one who we received the secret key from.
116+
// This will hopefully become unnecessary when WhatsApp fully finishes their migration to LIDs.
117+
if origSender != storedOrigSender && strings.Contains(err.Error(), "message authentication failed") {
118+
secretKey, additionalData = generateMsgSecretKey(useCase, msg.Info.Sender, origMsgKey.GetID(), origSender, baseEncKey)
119+
plaintext, err = gcmutil.Decrypt(secretKey, encrypted.GetEncIV(), encrypted.GetEncPayload(), additionalData)
120+
}
121+
if err != nil {
122+
return nil, fmt.Errorf("failed to decrypt secret message: %w", err)
123+
}
115124
}
116125
return plaintext, nil
117126
}

0 commit comments

Comments
 (0)