diff options
Diffstat (limited to 'src/main/java/de/pixart/messenger/crypto/axolotl/XmppAxolotlMessage.java')
-rw-r--r-- | src/main/java/de/pixart/messenger/crypto/axolotl/XmppAxolotlMessage.java | 25 |
1 files changed, 12 insertions, 13 deletions
diff --git a/src/main/java/de/pixart/messenger/crypto/axolotl/XmppAxolotlMessage.java b/src/main/java/de/pixart/messenger/crypto/axolotl/XmppAxolotlMessage.java index a55e741bb..ac16ccc47 100644 --- a/src/main/java/de/pixart/messenger/crypto/axolotl/XmppAxolotlMessage.java +++ b/src/main/java/de/pixart/messenger/crypto/axolotl/XmppAxolotlMessage.java @@ -2,15 +2,14 @@ package de.pixart.messenger.crypto.axolotl; import android.util.Base64; import android.util.Log; +import android.util.SparseArray; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.security.SecureRandom; -import java.util.HashMap; import java.util.List; -import java.util.Map; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; @@ -42,7 +41,7 @@ public class XmppAxolotlMessage { private byte[] ciphertext = null; private byte[] authtagPlusInnerKey = null; private byte[] iv = null; - private final Map<Integer, XmppAxolotlSession.AxolotlKey> keys; + private final SparseArray<XmppAxolotlSession.AxolotlKey> keys; private final Jid from; private final int sourceDeviceId; @@ -98,7 +97,7 @@ public class XmppAxolotlMessage { throw new IllegalArgumentException("invalid source id"); } List<Element> keyElements = header.getChildren(); - this.keys = new HashMap<>(keyElements.size()); + this.keys = new SparseArray<>(); for (Element keyElement : keyElements) { switch (keyElement.getName()) { case KEYTAG: @@ -131,7 +130,7 @@ public class XmppAxolotlMessage { public XmppAxolotlMessage(Jid from, int sourceDeviceId) { this.from = from; this.sourceDeviceId = sourceDeviceId; - this.keys = new HashMap<>(); + this.keys = new SparseArray<>(); this.iv = generateIv(); this.innerKey = generateKey(); } @@ -158,6 +157,10 @@ public class XmppAxolotlMessage { return iv; } + public boolean hasPayload() { + return ciphertext != null; + } + public void encrypt(String plaintext) throws CryptoFailedException { try { SecretKey secretKey = new SecretKeySpec(innerKey, KEYTYPE); @@ -204,10 +207,6 @@ public class XmppAxolotlMessage { return sourceDeviceId; } - public byte[] getCiphertext() { - return ciphertext; - } - public void addDevice(XmppAxolotlSession session) { XmppAxolotlSession.AxolotlKey key; if (authtagPlusInnerKey != null) { @@ -232,13 +231,13 @@ public class XmppAxolotlMessage { Element encryptionElement = new Element(CONTAINERTAG, AxolotlService.PEP_PREFIX); Element headerElement = encryptionElement.addChild(HEADER); headerElement.setAttribute(SOURCEID, sourceDeviceId); - for (Map.Entry<Integer, XmppAxolotlSession.AxolotlKey> keyEntry : keys.entrySet()) { + for(int i = 0; i < keys.size(); ++i) { Element keyElement = new Element(KEYTAG); - keyElement.setAttribute(REMOTEID, keyEntry.getKey()); - if (keyEntry.getValue().prekey) { + keyElement.setAttribute(REMOTEID, keys.keyAt(i)); + if (keys.valueAt(i).prekey) { keyElement.setAttribute("prekey", "true"); } - keyElement.setContent(Base64.encodeToString(keyEntry.getValue().key, Base64.NO_WRAP)); + keyElement.setContent(Base64.encodeToString(keys.valueAt(i).key, Base64.NO_WRAP)); headerElement.addChild(keyElement); } headerElement.addChild(IVTAG).setContent(Base64.encodeToString(iv, Base64.NO_WRAP)); |