partially improved logging for receiving omemo messages

This commit is contained in:
Daniel Gultsch 2017-01-14 18:10:04 +01:00
parent aa7bfe9fe7
commit 8f39a594ff
4 changed files with 28 additions and 19 deletions

View file

@ -1136,7 +1136,12 @@ public class AxolotlService implements OnAdvancedStreamFeaturesLoaded {
XmppAxolotlMessage.XmppAxolotlKeyTransportMessage keyTransportMessage; XmppAxolotlMessage.XmppAxolotlKeyTransportMessage keyTransportMessage;
XmppAxolotlSession session = getReceivingSession(message); XmppAxolotlSession session = getReceivingSession(message);
try {
keyTransportMessage = message.getParameters(session, getOwnDeviceId()); keyTransportMessage = message.getParameters(session, getOwnDeviceId());
} catch (CryptoFailedException e) {
Log.d(Config.LOGTAG,"could not decrypt keyTransport message "+e.getMessage());
keyTransportMessage = null;
}
if (session.isFresh() && keyTransportMessage != null) { if (session.isFresh() && keyTransportMessage != null) {
putFreshSession(session); putFreshSession(session);

View file

@ -1,6 +1,11 @@
package eu.siacs.conversations.crypto.axolotl; package eu.siacs.conversations.crypto.axolotl;
public class CryptoFailedException extends Exception { public class CryptoFailedException extends Exception {
public CryptoFailedException(String msg) {
super(msg);
}
public CryptoFailedException(Exception e){ public CryptoFailedException(Exception e){
super(e); super(e);
} }

View file

@ -250,16 +250,16 @@ public class XmppAxolotlMessage {
return encryptionElement; return encryptionElement;
} }
private byte[] unpackKey(XmppAxolotlSession session, Integer sourceDeviceId) { private byte[] unpackKey(XmppAxolotlSession session, Integer sourceDeviceId) throws CryptoFailedException {
XmppAxolotlSession.AxolotlKey encryptedKey = keys.get(sourceDeviceId); XmppAxolotlSession.AxolotlKey encryptedKey = keys.get(sourceDeviceId);
return (encryptedKey != null) ? session.processReceiving(encryptedKey) : null; if (encryptedKey == null) {
throw new CryptoFailedException("Message was not encrypted for this device");
}
return session.processReceiving(encryptedKey);
} }
public XmppAxolotlKeyTransportMessage getParameters(XmppAxolotlSession session, Integer sourceDeviceId) { public XmppAxolotlKeyTransportMessage getParameters(XmppAxolotlSession session, Integer sourceDeviceId) throws CryptoFailedException {
byte[] key = unpackKey(session, sourceDeviceId); return new XmppAxolotlKeyTransportMessage(session.getFingerprint(), unpackKey(session, sourceDeviceId), getIV());
return (key != null)
? new XmppAxolotlKeyTransportMessage(session.getFingerprint(), key, getIV())
: null;
} }
public XmppAxolotlPlaintextMessage decrypt(XmppAxolotlSession session, Integer sourceDeviceId) throws CryptoFailedException { public XmppAxolotlPlaintextMessage decrypt(XmppAxolotlSession session, Integer sourceDeviceId) throws CryptoFailedException {

View file

@ -82,7 +82,7 @@ public class XmppAxolotlSession implements Comparable<XmppAxolotlSession> {
} }
@Nullable @Nullable
public byte[] processReceiving(AxolotlKey encryptedKey) { public byte[] processReceiving(AxolotlKey encryptedKey) throws CryptoFailedException {
byte[] plaintext = null; byte[] plaintext = null;
FingerprintStatus status = getTrust(); FingerprintStatus status = getTrust();
if (!status.isCompromised()) { if (!status.isCompromised()) {
@ -90,8 +90,7 @@ public class XmppAxolotlSession implements Comparable<XmppAxolotlSession> {
try { try {
PreKeyWhisperMessage message = new PreKeyWhisperMessage(encryptedKey.key); PreKeyWhisperMessage message = new PreKeyWhisperMessage(encryptedKey.key);
if (!message.getPreKeyId().isPresent()) { if (!message.getPreKeyId().isPresent()) {
Log.w(Config.LOGTAG, AxolotlService.getLogprefix(account) + "PreKeyWhisperMessage did not contain a PreKeyId"); throw new CryptoFailedException("PreKeyWhisperMessage did not contain a PreKeyId");
return null;
} }
Log.i(Config.LOGTAG, AxolotlService.getLogprefix(account) + "PreKeyWhisperMessage received, new session ID:" + message.getSignedPreKeyId() + "/" + message.getPreKeyId()); Log.i(Config.LOGTAG, AxolotlService.getLogprefix(account) + "PreKeyWhisperMessage received, new session ID:" + message.getSignedPreKeyId() + "/" + message.getPreKeyId());
IdentityKey msgIdentityKey = message.getIdentityKey(); IdentityKey msgIdentityKey = message.getIdentityKey();
@ -107,19 +106,19 @@ public class XmppAxolotlSession implements Comparable<XmppAxolotlSession> {
WhisperMessage message = new WhisperMessage(encryptedKey.key); WhisperMessage message = new WhisperMessage(encryptedKey.key);
plaintext = cipher.decrypt(message); plaintext = cipher.decrypt(message);
} catch (InvalidKeyException | InvalidKeyIdException | UntrustedIdentityException e) { } catch (InvalidKeyException | InvalidKeyIdException | UntrustedIdentityException e) {
Log.w(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Error decrypting axolotl header, " + e.getClass().getName() + ": " + e.getMessage()); throw new CryptoFailedException("Error decrypting axolotl header, \" + e.getClass().getName() + \": \" + e.getMessage()");
} }
} catch (LegacyMessageException | InvalidMessageException | DuplicateMessageException | NoSessionException e) { } catch (LegacyMessageException | InvalidMessageException | DuplicateMessageException | NoSessionException e) {
Log.w(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Error decrypting axolotl header, " + e.getClass().getName() + ": " + e.getMessage()); throw new CryptoFailedException("Error decrypting axolotl header, \" + e.getClass().getName() + \": \" + e.getMessage()");
}
if (plaintext==null) {
throw new CryptoFailedException("plaintext unexpectedly null");
} }
if (plaintext != null) {
if (!status.isActive()) { if (!status.isActive()) {
setTrust(status.toActive()); setTrust(status.toActive());
} }
}
} else { } else {
Log.d(Config.LOGTAG,account.getJid().toBareJid()+" not encrypting omemo message from fingerprint "+getFingerprint()+" because it was marked as compromised"); throw new CryptoFailedException("not encrypting omemo message from fingerprint "+getFingerprint()+" because it was marked as compromised");
} }
return plaintext; return plaintext;
} }