@@ -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