From f7933c26d7c64edb60e00f83f67b000cd1d7c1cd Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Wed, 29 Jun 2016 17:18:57 +0200 Subject: [PATCH] don't crash on broken base64 in omemo messages. fixes #1934 --- .../crypto/axolotl/XmppAxolotlMessage.java | 6 +++--- .../conversations/parser/MessageParser.java | 16 +++++++++++----- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/crypto/axolotl/XmppAxolotlMessage.java b/src/main/java/eu/siacs/conversations/crypto/axolotl/XmppAxolotlMessage.java index 93a73677..e8ec5426 100644 --- a/src/main/java/eu/siacs/conversations/crypto/axolotl/XmppAxolotlMessage.java +++ b/src/main/java/eu/siacs/conversations/crypto/axolotl/XmppAxolotlMessage.java @@ -99,7 +99,7 @@ public class XmppAxolotlMessage { case KEYTAG: try { Integer recipientId = Integer.parseInt(keyElement.getAttribute(REMOTEID)); - byte[] key = Base64.decode(keyElement.getContent(), Base64.DEFAULT); + byte[] key = Base64.decode(keyElement.getContent().trim(), Base64.DEFAULT); this.keys.put(recipientId, key); } catch (NumberFormatException e) { throw new IllegalArgumentException(e); @@ -109,7 +109,7 @@ public class XmppAxolotlMessage { if (this.iv != null) { throw new IllegalArgumentException("Duplicate iv entry"); } - iv = Base64.decode(keyElement.getContent(), Base64.DEFAULT); + iv = Base64.decode(keyElement.getContent().trim(), Base64.DEFAULT); break; default: Log.w(Config.LOGTAG, "Unexpected element in header: " + keyElement.toString()); @@ -118,7 +118,7 @@ public class XmppAxolotlMessage { } Element payloadElement = axolotlMessage.findChild(PAYLOAD); if (payloadElement != null) { - ciphertext = Base64.decode(payloadElement.getContent(), Base64.DEFAULT); + ciphertext = Base64.decode(payloadElement.getContent().trim(), Base64.DEFAULT); } } diff --git a/src/main/java/eu/siacs/conversations/parser/MessageParser.java b/src/main/java/eu/siacs/conversations/parser/MessageParser.java index ff66c30f..4c446632 100644 --- a/src/main/java/eu/siacs/conversations/parser/MessageParser.java +++ b/src/main/java/eu/siacs/conversations/parser/MessageParser.java @@ -146,17 +146,23 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece } private Message parseAxolotlChat(Element axolotlMessage, Jid from, Conversation conversation, int status) { - Message finishedMessage = null; AxolotlService service = conversation.getAccount().getAxolotlService(); - XmppAxolotlMessage xmppAxolotlMessage = XmppAxolotlMessage.fromElement(axolotlMessage, from.toBareJid()); + XmppAxolotlMessage xmppAxolotlMessage; + try { + xmppAxolotlMessage = XmppAxolotlMessage.fromElement(axolotlMessage, from.toBareJid()); + } catch (Exception e) { + Log.d(Config.LOGTAG,conversation.getAccount().getJid().toBareJid()+": invalid omemo message received "+e.getMessage()); + return null; + } XmppAxolotlMessage.XmppAxolotlPlaintextMessage plaintextMessage = service.processReceivingPayloadMessage(xmppAxolotlMessage); if(plaintextMessage != null) { - finishedMessage = new Message(conversation, plaintextMessage.getPlaintext(), Message.ENCRYPTION_AXOLOTL, status); + Message finishedMessage = new Message(conversation, plaintextMessage.getPlaintext(), Message.ENCRYPTION_AXOLOTL, status); finishedMessage.setFingerprint(plaintextMessage.getFingerprint()); Log.d(Config.LOGTAG, AxolotlService.getLogprefix(finishedMessage.getConversation().getAccount())+" Received Message with session fingerprint: "+plaintextMessage.getFingerprint()); + return finishedMessage; + } else { + return null; } - - return finishedMessage; } private class Invite {