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?
get() = mDatabaseKDB?.kdfEngine ?: mDatabaseKDBX?.kdfEngine
set(kdfEngine) {
kdfEngine?.let {
if (mDatabaseKDBX?.kdfParameters?.uuid != kdfEngine.defaultParameters.uuid)
mDatabaseKDBX?.kdfParameters = kdfEngine.defaultParameters
numberKeyEncryptionRounds = kdfEngine.defaultKeyRounds
memoryUsage = kdfEngine.defaultMemoryUsage
parallelism = kdfEngine.defaultParallelism
}
mDatabaseKDB?.kdfEngine = kdfEngine
mDatabaseKDBX?.kdfEngine = kdfEngine
mDatabaseKDBX?.settingsChanged = DateInstant()
dataModifiedSinceLastLoading = true
}
fun getKeyDerivationName(): String {

View File

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

View File

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

View File

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

View File

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