aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/java/de/pixart/messenger/crypto/axolotl/XmppAxolotlMessage.java
diff options
context:
space:
mode:
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.java25
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));