diff --git a/domain/build.gradle.kts b/domain/build.gradle.kts index 1474413..69a0129 100644 --- a/domain/build.gradle.kts +++ b/domain/build.gradle.kts @@ -11,4 +11,5 @@ java { dependencies { implementation(libs.kotlinx.coroutines.core) + testImplementation(libs.junit) } \ No newline at end of file diff --git a/domain/src/main/java/com/github/nullptroma/wallenc/domain/datatypes/EncryptKey.kt b/domain/src/main/java/com/github/nullptroma/wallenc/domain/datatypes/EncryptKey.kt index 286f442..ca565c3 100644 --- a/domain/src/main/java/com/github/nullptroma/wallenc/domain/datatypes/EncryptKey.kt +++ b/domain/src/main/java/com/github/nullptroma/wallenc/domain/datatypes/EncryptKey.kt @@ -1,10 +1,15 @@ package com.github.nullptroma.wallenc.domain.datatypes import java.security.MessageDigest +import javax.crypto.spec.SecretKeySpec class EncryptKey(val key: String) { fun to32Bytes(): ByteArray { val digest = MessageDigest.getInstance("SHA-256") return digest.digest(key.toByteArray(Charsets.UTF_8)) } + + fun toAesKey() : SecretKeySpec { + return SecretKeySpec(to32Bytes(), "AES") + } } \ No newline at end of file diff --git a/domain/src/main/java/com/github/nullptroma/wallenc/domain/encrypt/EncryptedStorageAccessor.kt b/domain/src/main/java/com/github/nullptroma/wallenc/domain/encrypt/EncryptedStorageAccessor.kt index 37e6213..0206172 100644 --- a/domain/src/main/java/com/github/nullptroma/wallenc/domain/encrypt/EncryptedStorageAccessor.kt +++ b/domain/src/main/java/com/github/nullptroma/wallenc/domain/encrypt/EncryptedStorageAccessor.kt @@ -5,7 +5,6 @@ import com.github.nullptroma.wallenc.domain.common.impl.CommonFile import com.github.nullptroma.wallenc.domain.common.impl.CommonMetaInfo import com.github.nullptroma.wallenc.domain.datatypes.DataPackage import com.github.nullptroma.wallenc.domain.datatypes.EncryptKey -import com.github.nullptroma.wallenc.domain.datatypes.StorageEncryptionInfo import com.github.nullptroma.wallenc.domain.interfaces.IDirectory import com.github.nullptroma.wallenc.domain.interfaces.IFile import com.github.nullptroma.wallenc.domain.interfaces.ILogger @@ -23,7 +22,6 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch import java.io.InputStream import java.io.OutputStream -import javax.crypto.spec.SecretKeySpec import kotlin.io.path.Path import kotlin.io.path.pathString @@ -46,7 +44,7 @@ class EncryptedStorageAccessor( private val _dirsUpdates = MutableSharedFlow>>() override val dirsUpdates: SharedFlow>> = _dirsUpdates - private val _encryptor = Encryptor(SecretKeySpec(key.to32Bytes(), "AES")) + private val _encryptor = Encryptor(key.toAesKey()) init { collectSourceState() @@ -217,14 +215,4 @@ class EncryptedStorageAccessor( _job.cancel() _encryptor.dispose() } - - - companion object { - private const val IV_LEN = 16 - private const val AES_SETTINGS = "AES/CBC/PKCS5Padding" - - fun generateEncryptionInfo(key: EncryptKey): StorageEncryptionInfo { - TODO() - } - } } \ No newline at end of file diff --git a/domain/src/main/java/com/github/nullptroma/wallenc/domain/encrypt/Encryptor.kt b/domain/src/main/java/com/github/nullptroma/wallenc/domain/encrypt/Encryptor.kt index c6e54a2..76ea838 100644 --- a/domain/src/main/java/com/github/nullptroma/wallenc/domain/encrypt/Encryptor.kt +++ b/domain/src/main/java/com/github/nullptroma/wallenc/domain/encrypt/Encryptor.kt @@ -1,5 +1,7 @@ package com.github.nullptroma.wallenc.domain.encrypt +import com.github.nullptroma.wallenc.domain.datatypes.EncryptKey +import com.github.nullptroma.wallenc.domain.datatypes.StorageEncryptionInfo import kotlinx.coroutines.DisposableHandle import java.io.InputStream import java.io.OutputStream @@ -74,8 +76,33 @@ class Encryptor(private var _secretKey: SecretKey?) : DisposableHandle { companion object { private const val IV_LEN = 16 + private const val TEST_DATA_LEN = 512 private const val AES_SETTINGS = "AES/CBC/PKCS5Padding" - + @OptIn(ExperimentalEncodingApi::class) + fun generateEncryptionInfo(key: EncryptKey) : StorageEncryptionInfo { + val encryptor = Encryptor(key.toAesKey()) + val testData = ByteArray(TEST_DATA_LEN) + val encryptedData = encryptor.encryptBytes(testData) + return StorageEncryptionInfo( + isEncrypted = true, + encryptedTestData = Base64.Default.encode(encryptedData) + ) + } + + @OptIn(ExperimentalEncodingApi::class) + fun checkKey(key: EncryptKey, encInfo: StorageEncryptionInfo): Boolean { + if(encInfo.encryptedTestData == null) + return false + val encryptor = Encryptor(key.toAesKey()) + try { + val encData = Base64.Default.decode(encInfo.encryptedTestData) + val testData = encryptor.decryptBytes(encData) + return testData.all { it == 0.toByte() } && testData.size == TEST_DATA_LEN + } + catch (e: Exception) { + return false + } + } } } \ No newline at end of file