Better kdf engine implementation

This commit is contained in:
J-Jamet
2022-01-25 16:37:18 +01:00
parent c90f18c45a
commit 98804db478
5 changed files with 29 additions and 16 deletions

View File

@@ -340,13 +340,10 @@ class Database {
var kdfEngine: KdfEngine? var kdfEngine: KdfEngine?
get() = mDatabaseKDB?.kdfEngine ?: mDatabaseKDBX?.kdfEngine get() = mDatabaseKDB?.kdfEngine ?: mDatabaseKDBX?.kdfEngine
set(kdfEngine) { set(kdfEngine) {
kdfEngine?.let { mDatabaseKDB?.kdfEngine = kdfEngine
if (mDatabaseKDBX?.kdfParameters?.uuid != kdfEngine.defaultParameters.uuid) mDatabaseKDBX?.kdfEngine = kdfEngine
mDatabaseKDBX?.kdfParameters = kdfEngine.defaultParameters mDatabaseKDBX?.settingsChanged = DateInstant()
numberKeyEncryptionRounds = kdfEngine.defaultKeyRounds dataModifiedSinceLastLoading = true
memoryUsage = kdfEngine.defaultMemoryUsage
parallelism = kdfEngine.defaultParallelism
}
} }
fun getKeyDerivationName(): String { fun getKeyDerivationName(): String {

View File

@@ -44,8 +44,13 @@ class DatabaseKDB : DatabaseVersioned<Int, UUID, GroupKDB, EntryKDB>() {
EncryptionAlgorithm.Twofish EncryptionAlgorithm.Twofish
) )
override val kdfEngine: KdfEngine override var kdfEngine: KdfEngine?
get() = kdfAvailableList[0] get() = kdfAvailableList[0]
set(value) {
value?.let {
numberKeyEncryptionRounds = value.defaultKeyRounds
}
}
override val kdfAvailableList: List<KdfEngine> = listOf( override val kdfAvailableList: List<KdfEngine> = listOf(
KdfFactory.aesKdf KdfFactory.aesKdf

View File

@@ -73,6 +73,9 @@ import kotlin.math.min
class DatabaseKDBX : DatabaseVersioned<UUID, UUID, GroupKDBX, EntryKDBX> { class DatabaseKDBX : DatabaseVersioned<UUID, UUID, GroupKDBX, EntryKDBX> {
var hmacKey: ByteArray? = null
private set
override var encryptionAlgorithm: EncryptionAlgorithm = EncryptionAlgorithm.AESRijndael override var encryptionAlgorithm: EncryptionAlgorithm = EncryptionAlgorithm.AESRijndael
fun setEncryptionAlgorithmFromUUID(uuid: UUID) { fun setEncryptionAlgorithmFromUUID(uuid: UUID) {
@@ -85,13 +88,24 @@ class DatabaseKDBX : DatabaseVersioned<UUID, UUID, GroupKDBX, EntryKDBX> {
EncryptionAlgorithm.ChaCha20 EncryptionAlgorithm.ChaCha20
) )
override val kdfEngine: KdfEngine? var kdfParameters: KdfParameters? = null
override var kdfEngine: KdfEngine?
get() = try { get() = try {
getEngineKDBX4(kdfParameters) getEngineKDBX4(kdfParameters)
} catch (unknownKDF: UnknownKDF) { } catch (unknownKDF: UnknownKDF) {
Log.i(TAG, "Unable to retrieve KDF engine", unknownKDF) Log.i(TAG, "Unable to retrieve KDF engine", unknownKDF)
null null
} }
set(value) {
value?.let {
if (kdfParameters?.uuid != value.defaultParameters.uuid)
kdfParameters = value.defaultParameters
numberKeyEncryptionRounds = value.defaultKeyRounds
memoryUsage = value.defaultMemoryUsage
parallelism = value.defaultParallelism
}
}
@Throws(UnknownKDF::class) @Throws(UnknownKDF::class)
fun getEngineKDBX4(kdfParameters: KdfParameters?): KdfEngine { fun getEngineKDBX4(kdfParameters: KdfParameters?): KdfEngine {
@@ -113,11 +127,8 @@ class DatabaseKDBX : DatabaseVersioned<UUID, UUID, GroupKDBX, EntryKDBX> {
KdfFactory.argon2idKdf KdfFactory.argon2idKdf
) )
var hmacKey: ByteArray? = null
private set
var compressionAlgorithm = CompressionAlgorithm.GZip var compressionAlgorithm = CompressionAlgorithm.GZip
var kdfParameters: KdfParameters? = null
private var numKeyEncRounds: Long = 0
private val mFieldReferenceEngine = FieldReferencesEngine(this) private val mFieldReferenceEngine = FieldReferencesEngine(this)
private val mTemplateEngine = TemplateEngineCompatible(this) private val mTemplateEngine = TemplateEngineCompatible(this)
@@ -311,6 +322,7 @@ class DatabaseKDBX : DatabaseVersioned<UUID, UUID, GroupKDBX, EntryKDBX> {
override var numberKeyEncryptionRounds: Long override var numberKeyEncryptionRounds: Long
get() { get() {
val kdfEngine = kdfEngine val kdfEngine = kdfEngine
var numKeyEncRounds: Long = 0
if (kdfEngine != null && kdfParameters != null) if (kdfEngine != null && kdfParameters != null)
numKeyEncRounds = kdfEngine.getKeyRounds(kdfParameters!!) numKeyEncRounds = kdfEngine.getKeyRounds(kdfParameters!!)
return numKeyEncRounds return numKeyEncRounds
@@ -319,7 +331,6 @@ class DatabaseKDBX : DatabaseVersioned<UUID, UUID, GroupKDBX, EntryKDBX> {
val kdfEngine = kdfEngine val kdfEngine = kdfEngine
if (kdfEngine != null && kdfParameters != null) if (kdfEngine != null && kdfParameters != null)
kdfEngine.setKeyRounds(kdfParameters!!, rounds) kdfEngine.setKeyRounds(kdfParameters!!, rounds)
numKeyEncRounds = rounds
} }
var memoryUsage: Long var memoryUsage: Long

View File

@@ -51,7 +51,7 @@ abstract class DatabaseVersioned<
abstract var encryptionAlgorithm: EncryptionAlgorithm abstract var encryptionAlgorithm: EncryptionAlgorithm
abstract val availableEncryptionAlgorithms: List<EncryptionAlgorithm> abstract val availableEncryptionAlgorithms: List<EncryptionAlgorithm>
abstract val kdfEngine: KdfEngine? abstract var kdfEngine: KdfEngine?
abstract val kdfAvailableList: List<KdfEngine> abstract val kdfAvailableList: List<KdfEngine>
abstract var numberKeyEncryptionRounds: Long abstract var numberKeyEncryptionRounds: Long

View File

@@ -189,7 +189,7 @@ class DatabaseKDBXMerger(private var database: DatabaseKDBX) {
database.historyMaxItems = databaseToMerge.historyMaxItems database.historyMaxItems = databaseToMerge.historyMaxItems
database.historyMaxSize = databaseToMerge.historyMaxSize database.historyMaxSize = databaseToMerge.historyMaxSize
database.encryptionAlgorithm = databaseToMerge.encryptionAlgorithm database.encryptionAlgorithm = databaseToMerge.encryptionAlgorithm
database.kdfParameters = databaseToMerge.kdfParameters database.kdfEngine = databaseToMerge.kdfEngine
database.numberKeyEncryptionRounds = databaseToMerge.numberKeyEncryptionRounds database.numberKeyEncryptionRounds = databaseToMerge.numberKeyEncryptionRounds
database.memoryUsage = databaseToMerge.memoryUsage database.memoryUsage = databaseToMerge.memoryUsage
database.parallelism = databaseToMerge.parallelism database.parallelism = databaseToMerge.parallelism