be more careful parsing integers in omemo

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/crypto/axolotl/XmppAxolotlMessage.java | 8 
src/main/java/eu/siacs/conversations/parser/IqParser.java                   | 8 
2 files changed, 12 insertions(+), 4 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/crypto/axolotl/XmppAxolotlMessage.java 🔗

@@ -91,7 +91,11 @@ public class XmppAxolotlMessage {
 	private XmppAxolotlMessage(final Element axolotlMessage, final Jid from) throws IllegalArgumentException {
 		this.from = from;
 		Element header = axolotlMessage.findChild(HEADER);
-		this.sourceDeviceId = Integer.parseInt(header.getAttribute(SOURCEID));
+		try {
+			this.sourceDeviceId = Integer.parseInt(header.getAttribute(SOURCEID));
+		} catch (NumberFormatException e) {
+			throw new IllegalArgumentException("invalid source id");
+		}
 		List<Element> keyElements = header.getChildren();
 		this.keys = new HashMap<>(keyElements.size());
 		for (Element keyElement : keyElements) {
@@ -102,7 +106,7 @@ public class XmppAxolotlMessage {
 						byte[] key = Base64.decode(keyElement.getContent().trim(), Base64.DEFAULT);
 						this.keys.put(recipientId, key);
 					} catch (NumberFormatException e) {
-						throw new IllegalArgumentException(e);
+						throw new IllegalArgumentException("invalid remote id");
 					}
 					break;
 				case IVTAG:

src/main/java/eu/siacs/conversations/parser/IqParser.java 🔗

@@ -139,7 +139,11 @@ public class IqParser extends AbstractParser implements OnIqPacketReceived {
 		if(signedPreKeyPublic == null) {
 			return null;
 		}
-		return Integer.valueOf(signedPreKeyPublic.getAttribute("signedPreKeyId"));
+		try {
+			return Integer.valueOf(signedPreKeyPublic.getAttribute("signedPreKeyId"));
+		} catch (NumberFormatException e) {
+			return null;
+		}
 	}
 
 	public ECPublicKey signedPreKeyPublic(final Element bundle) {
@@ -255,7 +259,7 @@ public class IqParser extends AbstractParser implements OnIqPacketReceived {
 		Integer signedPreKeyId = signedPreKeyId(bundleElement);
 		byte[] signedPreKeySignature = signedPreKeySignature(bundleElement);
 		IdentityKey identityKey = identityKey(bundleElement);
-		if(signedPreKeyPublic == null || identityKey == null) {
+		if(signedPreKeyId == null || signedPreKeyPublic == null || identityKey == null) {
 			return null;
 		}