refactored whispermessage processing
This commit is contained in:
parent
b085426d22
commit
d028f4b398
|
@ -1122,7 +1122,7 @@ public class AxolotlService implements OnAdvancedStreamFeaturesLoaded {
|
||||||
session.resetPreKeyId();
|
session.resetPreKeyId();
|
||||||
}
|
}
|
||||||
} catch (CryptoFailedException e) {
|
} catch (CryptoFailedException e) {
|
||||||
Log.w(Config.LOGTAG, getLogprefix(account) + "Failed to decrypt message: " + e.getMessage());
|
Log.w(Config.LOGTAG, getLogprefix(account) + "Failed to decrypt message from "+message.getFrom()+": " + e.getMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (session.isFresh() && plaintextMessage != null) {
|
if (session.isFresh() && plaintextMessage != null) {
|
||||||
|
|
|
@ -4,6 +4,7 @@ import android.support.annotation.NonNull;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
|
import org.bouncycastle.math.ec.PreCompInfo;
|
||||||
import org.whispersystems.libaxolotl.AxolotlAddress;
|
import org.whispersystems.libaxolotl.AxolotlAddress;
|
||||||
import org.whispersystems.libaxolotl.DuplicateMessageException;
|
import org.whispersystems.libaxolotl.DuplicateMessageException;
|
||||||
import org.whispersystems.libaxolotl.IdentityKey;
|
import org.whispersystems.libaxolotl.IdentityKey;
|
||||||
|
@ -18,9 +19,11 @@ import org.whispersystems.libaxolotl.UntrustedIdentityException;
|
||||||
import org.whispersystems.libaxolotl.protocol.CiphertextMessage;
|
import org.whispersystems.libaxolotl.protocol.CiphertextMessage;
|
||||||
import org.whispersystems.libaxolotl.protocol.PreKeyWhisperMessage;
|
import org.whispersystems.libaxolotl.protocol.PreKeyWhisperMessage;
|
||||||
import org.whispersystems.libaxolotl.protocol.WhisperMessage;
|
import org.whispersystems.libaxolotl.protocol.WhisperMessage;
|
||||||
|
import org.whispersystems.libaxolotl.util.guava.Optional;
|
||||||
|
|
||||||
import eu.siacs.conversations.Config;
|
import eu.siacs.conversations.Config;
|
||||||
import eu.siacs.conversations.entities.Account;
|
import eu.siacs.conversations.entities.Account;
|
||||||
|
import eu.siacs.conversations.utils.CryptoHelper;
|
||||||
|
|
||||||
public class XmppAxolotlSession implements Comparable<XmppAxolotlSession> {
|
public class XmppAxolotlSession implements Comparable<XmppAxolotlSession> {
|
||||||
private final SessionCipher cipher;
|
private final SessionCipher cipher;
|
||||||
|
@ -83,36 +86,36 @@ public class XmppAxolotlSession implements Comparable<XmppAxolotlSession> {
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
public byte[] processReceiving(AxolotlKey encryptedKey) throws CryptoFailedException {
|
public byte[] processReceiving(AxolotlKey encryptedKey) throws CryptoFailedException {
|
||||||
byte[] plaintext = null;
|
byte[] plaintext;
|
||||||
FingerprintStatus status = getTrust();
|
FingerprintStatus status = getTrust();
|
||||||
if (!status.isCompromised()) {
|
if (!status.isCompromised()) {
|
||||||
try {
|
try {
|
||||||
|
CiphertextMessage ciphertextMessage;
|
||||||
try {
|
try {
|
||||||
PreKeyWhisperMessage message = new PreKeyWhisperMessage(encryptedKey.key);
|
ciphertextMessage = new PreKeyWhisperMessage(encryptedKey.key);
|
||||||
if (!message.getPreKeyId().isPresent()) {
|
Optional<Integer> optionalPreKeyId = ((PreKeyWhisperMessage) ciphertextMessage).getPreKeyId();
|
||||||
|
IdentityKey identityKey = ((PreKeyWhisperMessage) ciphertextMessage).getIdentityKey();
|
||||||
|
if (!optionalPreKeyId.isPresent()) {
|
||||||
throw new CryptoFailedException("PreKeyWhisperMessage did not contain a PreKeyId");
|
throw new CryptoFailedException("PreKeyWhisperMessage did not contain a PreKeyId");
|
||||||
}
|
}
|
||||||
Log.i(Config.LOGTAG, AxolotlService.getLogprefix(account) + "PreKeyWhisperMessage received, new session ID:" + message.getSignedPreKeyId() + "/" + message.getPreKeyId());
|
preKeyId = optionalPreKeyId.get();
|
||||||
IdentityKey msgIdentityKey = message.getIdentityKey();
|
if (this.identityKey != null && !this.identityKey.equals(identityKey)) {
|
||||||
if (this.identityKey != null && !this.identityKey.equals(msgIdentityKey)) {
|
throw new CryptoFailedException("Received PreKeyWhisperMessage but preexisting identity key changed.");
|
||||||
Log.e(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Had session with fingerprint " + this.getFingerprint() + ", received message with fingerprint " + msgIdentityKey.getFingerprint());
|
|
||||||
} else {
|
|
||||||
this.identityKey = msgIdentityKey;
|
|
||||||
plaintext = cipher.decrypt(message);
|
|
||||||
preKeyId = message.getPreKeyId().get();
|
|
||||||
}
|
}
|
||||||
} catch (InvalidMessageException | InvalidVersionException e) {
|
this.identityKey = identityKey;
|
||||||
Log.i(Config.LOGTAG, AxolotlService.getLogprefix(account) + "WhisperMessage received");
|
} catch (InvalidVersionException | InvalidMessageException e) {
|
||||||
WhisperMessage message = new WhisperMessage(encryptedKey.key);
|
ciphertextMessage = new WhisperMessage(encryptedKey.key);
|
||||||
plaintext = cipher.decrypt(message);
|
|
||||||
} catch (InvalidKeyException | InvalidKeyIdException | UntrustedIdentityException e) {
|
|
||||||
throw new CryptoFailedException("Error decrypting axolotl header, \" + e.getClass().getName() + \": \" + e.getMessage()");
|
|
||||||
}
|
}
|
||||||
} catch (LegacyMessageException | InvalidMessageException | DuplicateMessageException | NoSessionException e) {
|
if (ciphertextMessage instanceof PreKeyWhisperMessage) {
|
||||||
throw new CryptoFailedException("Error decrypting axolotl header, \" + e.getClass().getName() + \": \" + e.getMessage()");
|
plaintext = cipher.decrypt((PreKeyWhisperMessage) ciphertextMessage);
|
||||||
}
|
} else {
|
||||||
if (plaintext==null) {
|
plaintext = cipher.decrypt((WhisperMessage) ciphertextMessage);
|
||||||
throw new CryptoFailedException("plaintext unexpectedly null");
|
}
|
||||||
|
} catch (InvalidKeyException | LegacyMessageException | InvalidMessageException | DuplicateMessageException | NoSessionException | InvalidKeyIdException | UntrustedIdentityException e) {
|
||||||
|
if (!(e instanceof DuplicateMessageException)) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
throw new CryptoFailedException("Error decrypting WhisperMessage " + e.getClass().getSimpleName() + ": " + e.getMessage());
|
||||||
}
|
}
|
||||||
if (!status.isActive()) {
|
if (!status.isActive()) {
|
||||||
setTrust(status.toActive());
|
setTrust(status.toActive());
|
||||||
|
|
Loading…
Reference in a new issue