mirror of
https://github.com/Kunzisoft/KeePassDX.git
synced 2025-12-04 15:49:33 +01:00
Better getHmacKey64 method
This commit is contained in:
@@ -182,7 +182,7 @@ class ValuesTest : TestCase() {
|
||||
}
|
||||
|
||||
val byteArrayOutputStream = ByteArrayOutputStream()
|
||||
byteArrayOutputStream.write8BytesLong(UnsignedLong.MAX)
|
||||
byteArrayOutputStream.write(UnsignedLong.MAX_BYTES)
|
||||
byteArrayOutputStream.close()
|
||||
val uLongMax = byteArrayOutputStream.toByteArray()
|
||||
|
||||
|
||||
@@ -19,8 +19,6 @@
|
||||
*/
|
||||
package com.kunzisoft.keepass.database.crypto
|
||||
|
||||
import com.kunzisoft.encrypt.UnsignedLong
|
||||
import com.kunzisoft.encrypt.stream.uLongTo8Bytes
|
||||
import java.io.IOException
|
||||
import java.security.InvalidKeyException
|
||||
import java.security.MessageDigest
|
||||
@@ -44,14 +42,14 @@ object HmacBlock {
|
||||
return hmac
|
||||
}
|
||||
|
||||
fun getHmacKey64(key: ByteArray, blockIndex: UnsignedLong): ByteArray {
|
||||
fun getHmacKey64(key: ByteArray, blockIndex: ByteArray): ByteArray {
|
||||
val hash: MessageDigest
|
||||
try {
|
||||
hash = MessageDigest.getInstance("SHA-512")
|
||||
} catch (e: NoSuchAlgorithmException) {
|
||||
throw RuntimeException(e)
|
||||
}
|
||||
hash.update(uLongTo8Bytes(blockIndex))
|
||||
hash.update(blockIndex)
|
||||
hash.update(key)
|
||||
return hash.digest()
|
||||
}
|
||||
|
||||
@@ -184,7 +184,7 @@ class DatabaseInputKDBX(cacheDirectory: File,
|
||||
|
||||
val hmacKey = mDatabase.hmacKey ?: throw LoadDatabaseException()
|
||||
|
||||
val blockKey = HmacBlock.getHmacKey64(hmacKey, UnsignedLong.MAX)
|
||||
val blockKey = HmacBlock.getHmacKey64(hmacKey, UnsignedLong.MAX_BYTES)
|
||||
val hmac: Mac = HmacBlock.getHmacSha256(blockKey)
|
||||
val headerHmac = hmac.doFinal(pbHeader)
|
||||
|
||||
|
||||
@@ -66,7 +66,8 @@ constructor(private val databaseKDBX: DatabaseKDBX,
|
||||
}
|
||||
|
||||
val hmacKey = databaseKDBX.hmacKey ?: throw DatabaseOutputException("HmacKey is not defined")
|
||||
val hmac: Mac = HmacBlock.getHmacSha256(HmacBlock.getHmacKey64(hmacKey, UnsignedLong.MAX))
|
||||
val blockKey = HmacBlock.getHmacKey64(hmacKey, UnsignedLong.MAX_BYTES)
|
||||
val hmac: Mac = HmacBlock.getHmacSha256(blockKey)
|
||||
|
||||
dos = DigestOutputStream(outputStream, md)
|
||||
mos = MacOutputStream(dos, hmac)
|
||||
|
||||
@@ -91,7 +91,6 @@ class HmacBlockInputStream(private val baseStream: InputStream, private val veri
|
||||
throw IOException("File corrupted")
|
||||
}
|
||||
|
||||
val pbBlockIndex = uLongTo8Bytes(blockIndex)
|
||||
val pbBlockSize = baseStream.readBytesLength(4)
|
||||
if (pbBlockSize.size != 4) {
|
||||
throw IOException("File corrupted")
|
||||
@@ -102,7 +101,9 @@ class HmacBlockInputStream(private val baseStream: InputStream, private val veri
|
||||
buffer = baseStream.readBytesLength(blockSize.toKotlinInt())
|
||||
|
||||
if (verify) {
|
||||
val blockKey = HmacBlock.getHmacKey64(key, blockIndex)
|
||||
val pbBlockIndex = uLongTo8Bytes(blockIndex)
|
||||
|
||||
val blockKey = HmacBlock.getHmacKey64(key, pbBlockIndex)
|
||||
val hmac: Mac = HmacBlock.getHmacSha256(blockKey)
|
||||
hmac.update(pbBlockIndex)
|
||||
hmac.update(pbBlockSize)
|
||||
|
||||
@@ -88,7 +88,7 @@ class HmacBlockOutputStream(private val baseStream: OutputStream,
|
||||
val bufBlockIndex = uLongTo8Bytes(blockIndex)
|
||||
val blockSizeBuf = uIntTo4Bytes(UnsignedInt(bufferPos))
|
||||
|
||||
val blockKey = HmacBlock.getHmacKey64(key, blockIndex)
|
||||
val blockKey = HmacBlock.getHmacKey64(key, bufBlockIndex)
|
||||
val hmac: Mac = HmacBlock.getHmacSha256(blockKey)
|
||||
hmac.update(bufBlockIndex)
|
||||
hmac.update(blockSizeBuf)
|
||||
|
||||
@@ -19,6 +19,8 @@
|
||||
*/
|
||||
package com.kunzisoft.encrypt
|
||||
|
||||
import com.kunzisoft.encrypt.stream.longTo8Bytes
|
||||
|
||||
class UnsignedLong(value: Long) {
|
||||
|
||||
private var unsignedValue: Long = value
|
||||
@@ -53,7 +55,7 @@ class UnsignedLong(value: Long) {
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val MAX_VALUE: Long = -1
|
||||
val MAX = UnsignedLong(MAX_VALUE)
|
||||
private const val MAX_VALUE: Long = -1
|
||||
val MAX_BYTES = longTo8Bytes(MAX_VALUE)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user