diff --git a/app/src/main/java/com/kunzisoft/keepass/database/crypto/CipherEngine.kt b/app/src/main/java/com/kunzisoft/keepass/database/crypto/CipherEngine.kt index 38b653853..1850e9da8 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/crypto/CipherEngine.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/crypto/CipherEngine.kt @@ -36,6 +36,9 @@ abstract class CipherEngine { return 16 } + // Used only with padding workaround + var forcePaddingCompatibility = false + @Throws(NoSuchAlgorithmException::class, NoSuchPaddingException::class, InvalidKeyException::class, InvalidAlgorithmParameterException::class) abstract fun getCipher(opmode: Int, key: ByteArray, IV: ByteArray): Cipher diff --git a/app/src/main/java/com/kunzisoft/keepass/database/crypto/TwofishEngine.kt b/app/src/main/java/com/kunzisoft/keepass/database/crypto/TwofishEngine.kt index bec5a17a3..48d2ec0b5 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/crypto/TwofishEngine.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/crypto/TwofishEngine.kt @@ -30,7 +30,7 @@ class TwofishEngine : CipherEngine() { @Throws(NoSuchAlgorithmException::class, NoSuchPaddingException::class, InvalidKeyException::class, InvalidAlgorithmParameterException::class) override fun getCipher(opmode: Int, key: ByteArray, IV: ByteArray): Cipher { - return CipherFactory.getTwofish(opmode, key, IV) + return CipherFactory.getTwofish(opmode, key, IV, forcePaddingCompatibility) } override fun getEncryptionAlgorithm(): EncryptionAlgorithm { diff --git a/app/src/main/java/com/kunzisoft/keepass/database/file/input/DatabaseInputKDBX.kt b/app/src/main/java/com/kunzisoft/keepass/database/file/input/DatabaseInputKDBX.kt index adbe7e9af..c4f9a9f3a 100644 --- a/app/src/main/java/com/kunzisoft/keepass/database/file/input/DatabaseInputKDBX.kt +++ b/app/src/main/java/com/kunzisoft/keepass/database/file/input/DatabaseInputKDBX.kt @@ -151,9 +151,11 @@ class DatabaseInputKDBX(cacheDirectory: File, val cipher: Cipher try { engine = EncryptionAlgorithm.getFrom(mDatabase.cipherUuid).cipherEngine + engine.forcePaddingCompatibility = true mDatabase.setDataEngine(engine) mDatabase.encryptionAlgorithm = engine.getEncryptionAlgorithm() cipher = engine.getCipher(Cipher.DECRYPT_MODE, mDatabase.finalKey!!, header.encryptionIV) + engine.forcePaddingCompatibility = false } catch (e: Exception) { throw InvalidAlgorithmDatabaseException(e) } diff --git a/crypto/src/main/java/com/kunzisoft/encrypt/CipherFactory.kt b/crypto/src/main/java/com/kunzisoft/encrypt/CipherFactory.kt index c2830f814..7b48bdc24 100644 --- a/crypto/src/main/java/com/kunzisoft/encrypt/CipherFactory.kt +++ b/crypto/src/main/java/com/kunzisoft/encrypt/CipherFactory.kt @@ -38,8 +38,12 @@ object CipherFactory { } @Throws(NoSuchAlgorithmException::class, NoSuchPaddingException::class, InvalidKeyException::class, InvalidAlgorithmParameterException::class) - fun getTwofish(opmode: Int, key: ByteArray, IV: ByteArray): Cipher { - val cipher: Cipher = Cipher.getInstance("Twofish/CBC/PKCS7PADDING") + fun getTwofish(opmode: Int, key: ByteArray, IV: ByteArray, forceCompatibility: Boolean = false): Cipher { + val cipher: Cipher = if (forceCompatibility) { + Cipher.getInstance("Twofish/CBC/NoPadding") + } else { + Cipher.getInstance("Twofish/CBC/PKCS7PADDING") + } cipher.init(opmode, SecretKeySpec(key, "AES"), IvParameterSpec(IV)) return cipher }