Refresh PEP on session establish
We now track preKeys used to establish incoming sessions with us. On each new established session, we remove the used prekey from PEP. We have to do this because libaxolotl-java internally clears the used preKey from its storage, so we will not be able to establish any future sessions using that key.
This commit is contained in:
parent
69600502d2
commit
bf4185ac08
|
@ -444,6 +444,7 @@ public class AxolotlService {
|
||||||
public static class XmppAxolotlSession {
|
public static class XmppAxolotlSession {
|
||||||
private SessionCipher cipher;
|
private SessionCipher cipher;
|
||||||
private boolean isTrusted = false;
|
private boolean isTrusted = false;
|
||||||
|
private Integer preKeyId = null;
|
||||||
private SQLiteAxolotlStore sqLiteAxolotlStore;
|
private SQLiteAxolotlStore sqLiteAxolotlStore;
|
||||||
private AxolotlAddress remoteAddress;
|
private AxolotlAddress remoteAddress;
|
||||||
|
|
||||||
|
@ -463,6 +464,14 @@ public class AxolotlService {
|
||||||
return this.isTrusted;
|
return this.isTrusted;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Integer getPreKeyId() {
|
||||||
|
return preKeyId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void resetPreKeyId() {
|
||||||
|
preKeyId = null;
|
||||||
|
}
|
||||||
|
|
||||||
public byte[] processReceiving(XmppAxolotlMessage.XmppAxolotlMessageHeader incomingHeader) {
|
public byte[] processReceiving(XmppAxolotlMessage.XmppAxolotlMessageHeader incomingHeader) {
|
||||||
byte[] plaintext = null;
|
byte[] plaintext = null;
|
||||||
try {
|
try {
|
||||||
|
@ -470,6 +479,9 @@ public class AxolotlService {
|
||||||
PreKeyWhisperMessage message = new PreKeyWhisperMessage(incomingHeader.getContents());
|
PreKeyWhisperMessage message = new PreKeyWhisperMessage(incomingHeader.getContents());
|
||||||
Log.d(Config.LOGTAG, "PreKeyWhisperMessage ID:" + message.getSignedPreKeyId() + "/" + message.getPreKeyId());
|
Log.d(Config.LOGTAG, "PreKeyWhisperMessage ID:" + message.getSignedPreKeyId() + "/" + message.getPreKeyId());
|
||||||
plaintext = cipher.decrypt(message);
|
plaintext = cipher.decrypt(message);
|
||||||
|
if (message.getPreKeyId().isPresent()) {
|
||||||
|
preKeyId = message.getPreKeyId().get();
|
||||||
|
}
|
||||||
} catch (InvalidMessageException | InvalidVersionException e) {
|
} catch (InvalidMessageException | InvalidVersionException e) {
|
||||||
WhisperMessage message = new WhisperMessage(incomingHeader.getContents());
|
WhisperMessage message = new WhisperMessage(incomingHeader.getContents());
|
||||||
plaintext = cipher.decrypt(message);
|
plaintext = cipher.decrypt(message);
|
||||||
|
@ -946,6 +958,12 @@ public class AxolotlService {
|
||||||
Log.d(Config.LOGTAG, "Got payload key from axolotl header. Decrypting message...");
|
Log.d(Config.LOGTAG, "Got payload key from axolotl header. Decrypting message...");
|
||||||
plaintextMessage = message.decrypt(session, payloadKey);
|
plaintextMessage = message.decrypt(session, payloadKey);
|
||||||
}
|
}
|
||||||
|
Integer preKeyId = session.getPreKeyId();
|
||||||
|
if (preKeyId != null) {
|
||||||
|
publishBundlesIfNeeded();
|
||||||
|
session.resetPreKeyId();
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue