added omemo padding but disabled by Config.java flag

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/Config.java                            |  1 
src/main/java/eu/siacs/conversations/crypto/axolotl/XmppAxolotlMessage.java | 20 
2 files changed, 19 insertions(+), 2 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/Config.java 🔗

@@ -82,6 +82,7 @@ public final class Config {
 
 	public static final long OMEMO_AUTO_EXPIRY = 7 * MILLISECONDS_IN_DAY;
 	public static final boolean REMOVE_BROKEN_DEVICES = false;
+	public static final boolean OMEMO_PADDING = false;
 
 
 	public static final boolean DISABLE_PROXY_LOOKUP = false; //useful to debug ibb

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

@@ -162,7 +162,7 @@ public class XmppAxolotlMessage {
 			IvParameterSpec ivSpec = new IvParameterSpec(iv);
 			Cipher cipher = Cipher.getInstance(CIPHERMODE, PROVIDER);
 			cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec);
-			this.ciphertext = cipher.doFinal(plaintext.getBytes());
+			this.ciphertext = cipher.doFinal(Config.OMEMO_PADDING ? getPaddedBytes(plaintext) : plaintext.getBytes());
 		} catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException
 				| IllegalBlockSizeException | BadPaddingException | NoSuchProviderException
 				| InvalidAlgorithmParameterException e) {
@@ -170,6 +170,22 @@ public class XmppAxolotlMessage {
 		}
 	}
 
+	private static byte[] getPaddedBytes(String plaintext) {
+		int plainLength = plaintext.getBytes().length;
+		int pad = Math.max(64,(plainLength / 32 + 1) * 32) - plainLength;
+		SecureRandom random = new SecureRandom();
+		int left = random.nextInt(pad);
+		int right = pad - left;
+		StringBuilder builder = new StringBuilder(plaintext);
+		for(int i = 0; i < left; ++i) {
+			builder.insert(0,random.nextBoolean() ? "\t" : " ");
+		}
+		for(int i = 0; i < right; ++i) {
+			builder.append(random.nextBoolean() ? "\t" : " ");
+		}
+		return builder.toString().getBytes();
+	}
+
 	public Jid getFrom() {
 		return this.from;
 	}
@@ -239,7 +255,7 @@ public class XmppAxolotlMessage {
 				cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
 
 				String plaintext = new String(cipher.doFinal(ciphertext));
-				plaintextMessage = new XmppAxolotlPlaintextMessage(plaintext, session.getFingerprint());
+				plaintextMessage = new XmppAxolotlPlaintextMessage(Config.OMEMO_PADDING ? plaintext.trim() : plaintext, session.getFingerprint());
 
 			} catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException
 					| InvalidAlgorithmParameterException | IllegalBlockSizeException