M build.gradle => build.gradle +2 -2
@@ 90,8 90,8 @@ android {
defaultConfig {
minSdkVersion 16
targetSdkVersion 28
- versionCode 364
- versionName "2.7.0"
+ versionCode 365
+ versionName "2.7.1"
archivesBaseName += "-$versionName"
applicationId "eu.siacs.conversations"
resValue "string", "applicationId", applicationId
M src/main/java/eu/siacs/conversations/Config.java => src/main/java/eu/siacs/conversations/Config.java +0 -1
@@ 100,7 100,6 @@ public final class Config {
public static final boolean REMOVE_BROKEN_DEVICES = false;
public static final boolean OMEMO_PADDING = false;
public static final boolean PUT_AUTH_TAG_INTO_KEY = true;
- public static final boolean TWELVE_BYTE_IV = false;
public static final boolean USE_BOOKMARKS2 = false;
M src/main/java/eu/siacs/conversations/crypto/axolotl/AxolotlService.java => src/main/java/eu/siacs/conversations/crypto/axolotl/AxolotlService.java +3 -3
@@ 1157,7 1157,7 @@ public class AxolotlService implements OnAdvancedStreamFeaturesLoaded {
@Nullable
public XmppAxolotlMessage encrypt(Message message) {
- final XmppAxolotlMessage axolotlMessage = new XmppAxolotlMessage(account.getJid().asBareJid(), getOwnDeviceId());
+ final XmppAxolotlMessage axolotlMessage = new XmppAxolotlMessage(account.getJid().asBareJid(), getOwnDeviceId(), true);
final String content;
if (message.hasFileOnRemoteHost()) {
content = message.getFileParams().url.toString();
@@ 1201,7 1201,7 @@ public class AxolotlService implements OnAdvancedStreamFeaturesLoaded {
executor.execute(new Runnable() {
@Override
public void run() {
- final XmppAxolotlMessage axolotlMessage = new XmppAxolotlMessage(account.getJid().asBareJid(), getOwnDeviceId());
+ final XmppAxolotlMessage axolotlMessage = new XmppAxolotlMessage(account.getJid().asBareJid(), getOwnDeviceId(), false);
if (buildHeader(axolotlMessage, conversation)) {
onMessageCreatedCallback.run(axolotlMessage);
} else {
@@ 1362,7 1362,7 @@ public class AxolotlService implements OnAdvancedStreamFeaturesLoaded {
}
private void completeSession(XmppAxolotlSession session) {
- final XmppAxolotlMessage axolotlMessage = new XmppAxolotlMessage(account.getJid().asBareJid(), getOwnDeviceId());
+ final XmppAxolotlMessage axolotlMessage = new XmppAxolotlMessage(account.getJid().asBareJid(), getOwnDeviceId(), true);
axolotlMessage.addDevice(session, true);
try {
final Jid jid = Jid.of(session.getRemoteAddress().getName());
M src/main/java/eu/siacs/conversations/crypto/axolotl/XmppAxolotlMessage.java => src/main/java/eu/siacs/conversations/crypto/axolotl/XmppAxolotlMessage.java +5 -6
@@ 85,11 85,11 @@ public class XmppAxolotlMessage {
}
}
- XmppAxolotlMessage(Jid from, int sourceDeviceId) {
+ XmppAxolotlMessage(Jid from, int sourceDeviceId, final boolean twelveByteIv) {
this.from = from;
this.sourceDeviceId = sourceDeviceId;
this.keys = new ArrayList<>();
- this.iv = generateIv();
+ this.iv = generateIv(twelveByteIv);
this.innerKey = generateKey();
}
@@ 115,14 115,13 @@ public class XmppAxolotlMessage {
generator.init(128);
return generator.generateKey().getEncoded();
} catch (NoSuchAlgorithmException e) {
- Log.e(Config.LOGTAG, e.getMessage());
- return null;
+ throw new IllegalStateException(e);
}
}
- private static byte[] generateIv() {
+ private static byte[] generateIv(final boolean twelveByteIv) {
final SecureRandom random = new SecureRandom();
- byte[] iv = new byte[Config.TWELVE_BYTE_IV ? 12 : 16];
+ byte[] iv = new byte[twelveByteIv ? 12 : 16];
random.nextBytes(iv);
return iv;
}
M src/main/java/eu/siacs/conversations/entities/DownloadableFile.java => src/main/java/eu/siacs/conversations/entities/DownloadableFile.java +4 -0
@@ 1,7 1,10 @@
package eu.siacs.conversations.entities;
+import android.util.Log;
+
import java.io.File;
+import eu.siacs.conversations.Config;
import eu.siacs.conversations.utils.MimeUtils;
public class DownloadableFile extends File {
@@ 66,6 69,7 @@ public class DownloadableFile extends File {
this.iv = new byte[]{ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0xf };
System.arraycopy(keyIvCombo, 0, aeskey, 0, 32);
}
+ Log.d(Config.LOGTAG,"using "+this.iv.length+"-byte IV for file transmission");
}
public void setKey(byte[] key) {
M src/main/java/eu/siacs/conversations/http/HttpUploadConnection.java => src/main/java/eu/siacs/conversations/http/HttpUploadConnection.java +11 -2
@@ 105,11 105,20 @@ public class HttpUploadConnection implements Transferable {
} else {
this.mime = this.file.getMimeType();
}
+ final long originalFileSize = file.getSize();
this.delayed = delay;
if (Config.ENCRYPT_ON_HTTP_UPLOADED
|| message.getEncryption() == Message.ENCRYPTION_AXOLOTL
|| message.getEncryption() == Message.ENCRYPTION_OTR) {
- this.key = new byte[Config.TWELVE_BYTE_IV ? 44 : 48];
+ //ok, this is going to sound super crazy but on Android 9+ a 12 byte IV will use the
+ //internal conscrypt library (provided by the OS) instead of bounce castle, while 16 bytes
+ //will still 'fallback' to bounce castle even on Android 9+ because conscrypt doesnt
+ //have support for anything but 12.
+ //For large files conscrypt has extremely bad performance; so why not always use 16 you ask?
+ //well the ecosystem was moving and some clients like Monal *only* support 16
+ //so the result of this code is that we can only send 'small' files to Monal.
+ //'small' was relatively arbitrarily choose and correlates to roughly 'small' compressed images
+ this.key = new byte[originalFileSize <= 786432 ? 44 : 48];
mXmppConnectionService.getRNG().nextBytes(this.key);
this.file.setKeyAndIv(this.key);
}
@@ 128,7 137,7 @@ public class HttpUploadConnection implements Transferable {
md5 = null;
}
- this.file.setExpectedSize(file.getSize() + (file.getKey() != null ? 16 : 0));
+ this.file.setExpectedSize(originalFileSize + (file.getKey() != null ? 16 : 0));
message.resetFileParams();
this.mSlotRequester.request(method, account, file, mime, md5, new SlotRequester.OnSlotRequested() {
@Override