if (content.getDecryptionErrorMessage().isPresent()) {
var message = content.getDecryptionErrorMessage().get();
logger.debug("Received a decryption error message (resend request for {})", message.getTimestamp());
+ if (message.getRatchetKey().isPresent()) {
+ if (message.getDeviceId() == account.getDeviceId() && account.getSessionStore()
+ .isCurrentRatchetKey(sender, senderDeviceId, message.getRatchetKey().get())) {
+ logger.debug("Renewing the session with sender");
+ actions.add(new RenewSessionAction(sender));
+ }
+ } else {
+ logger.debug("Reset shared sender keys with this recipient");
+ account.getSenderKeyStore().deleteSharedWith(sender);
+ }
}
if (content.getDataMessage().isPresent()) {
cachedSenderKeys.clear();
final var keys = getKeysLocked(recipientId);
for (var key : keys) {
- if (key.distributionId.equals(distributionId)) deleteSenderKeyLocked(key);
+ if (key.distributionId.equals(distributionId)) {
+ deleteSenderKeyLocked(key);
+ }
}
}
}
public void deleteAllFor(final DistributionId distributionId) {
synchronized (sharedSenderKeys) {
- sharedSenderKeys.remove(distributionId.asUuid());
- saveLocked();
+ if (sharedSenderKeys.remove(distributionId.asUuid()) != null) {
+ saveLocked();
+ }
}
}
import org.slf4j.LoggerFactory;
import org.whispersystems.libsignal.NoSessionException;
import org.whispersystems.libsignal.SignalProtocolAddress;
+import org.whispersystems.libsignal.ecc.ECPublicKey;
import org.whispersystems.libsignal.protocol.CiphertextMessage;
import org.whispersystems.libsignal.state.SessionRecord;
import org.whispersystems.signalservice.api.SignalServiceSessionStore;
}
}
+ public boolean isCurrentRatchetKey(RecipientId recipientId, int deviceId, ECPublicKey ratchetKey) {
+ final var key = new Key(recipientId, deviceId);
+
+ synchronized (cachedSessions) {
+ final var session = loadSessionLocked(key);
+ if (session == null) {
+ return false;
+ }
+ return session.currentRatchetKeyMatches(ratchetKey);
+ }
+ }
+
@Override
public void storeSession(SignalProtocolAddress address, SessionRecord session) {
final var key = getKey(address);