From 83fd47a61bbcd2cb4e928042b732c1f764ddb7a7 Mon Sep 17 00:00:00 2001 From: Taras Smakula <tarassmakula@gmail.com> Date: Thu, 23 May 2024 17:33:21 +0300 Subject: [PATCH] Move key store to sdk --- .../circles/core/provider/KeyStoreProvider.kt | 81 ------------------- .../core/provider/PreferencesProvider.kt | 9 --- 2 files changed, 90 deletions(-) delete mode 100644 core/src/main/java/org/futo/circles/core/provider/KeyStoreProvider.kt diff --git a/core/src/main/java/org/futo/circles/core/provider/KeyStoreProvider.kt b/core/src/main/java/org/futo/circles/core/provider/KeyStoreProvider.kt deleted file mode 100644 index d292d9e64..000000000 --- a/core/src/main/java/org/futo/circles/core/provider/KeyStoreProvider.kt +++ /dev/null @@ -1,81 +0,0 @@ -package org.futo.circles.core.provider - -import android.security.keystore.KeyGenParameterSpec -import android.security.keystore.KeyProperties -import android.util.Base64 -import org.matrix.android.sdk.api.extensions.tryOrNull -import java.security.KeyStore -import javax.crypto.Cipher -import javax.crypto.KeyGenerator -import javax.crypto.SecretKey -import javax.crypto.spec.GCMParameterSpec -import javax.inject.Inject - - -class KeyStoreProvider @Inject constructor( - private val preferencesProvider: PreferencesProvider -) { - private val keyStore - get() = KeyStore.getInstance(ANDROID_KEYS_TORE).apply { load(null) } - - fun storeBsSpekePrivateKey(keyBytes: ByteArray, keyId: String) { - tryOrNull { - val alias = "$ORG_FUTO_SSSS_KEY_PREFIX.$keyId" - val masterKey = getOrGenerateMasterKeyIfNotExist(alias) - ?: throw IllegalArgumentException("Failed to get master key") - val encrypted = encryptData(keyBytes, masterKey) - preferencesProvider.storeBSspekeEncryptedPrivateKeyBase64(alias, encrypted) - } - } - - fun getBsSpekePrivateKey(keyId: String): ByteArray? = tryOrNull { - val alias = "$ORG_FUTO_SSSS_KEY_PREFIX.$keyId" - val masterKey = getOrGenerateMasterKeyIfNotExist(alias) - ?: throw IllegalArgumentException("Failed to get master key") - val encrypted = preferencesProvider.getBSspekeEncryptedPrivateKeyBase64(alias) - ?: throw IllegalArgumentException("Not saved in preferences $alias") - decryptData(encrypted, masterKey) - } - - private fun getOrGenerateMasterKeyIfNotExist(alias: String): SecretKey? { - if (!keyStore.containsAlias(alias)) { - KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, ANDROID_KEYS_TORE).apply { - init( - KeyGenParameterSpec.Builder( - alias, KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT - ) - .setKeySize(KEY_SIZE) - .setBlockModes(KeyProperties.BLOCK_MODE_GCM) - .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE) - .build() - ) - generateKey() - } - } - return keyStore.getKey(alias, null) as? SecretKey - } - - private fun encryptData(data: ByteArray, masterKey: SecretKey): String { - val cipher = Cipher.getInstance(AES_NO_PADDING) - cipher.init(Cipher.ENCRYPT_MODE, masterKey) - val ivString = Base64.encodeToString(cipher.iv, Base64.DEFAULT) - val encryptedBytes: ByteArray = cipher.doFinal(data) - return ivString + IV_SEPARATOR + Base64.encodeToString(encryptedBytes, Base64.DEFAULT) - } - - private fun decryptData(encryptedData: String, masterKey: SecretKey): ByteArray { - val (iv64, encrypted64) = encryptedData.split(IV_SEPARATOR) - val cipher = Cipher.getInstance(AES_NO_PADDING) - val spec = GCMParameterSpec(KEY_SIZE, Base64.decode(iv64, Base64.DEFAULT)) - cipher.init(Cipher.DECRYPT_MODE, masterKey, spec) - return cipher.doFinal(Base64.decode(encrypted64, Base64.DEFAULT)) - } - - companion object { - private const val AES_NO_PADDING = "AES/GCM/NoPadding" - private const val IV_SEPARATOR = "]" - private const val KEY_SIZE = 128 - private const val ANDROID_KEYS_TORE = "AndroidKeyStore" - private const val ORG_FUTO_SSSS_KEY_PREFIX = "org.futo.ssss.key" - } -} diff --git a/core/src/main/java/org/futo/circles/core/provider/PreferencesProvider.kt b/core/src/main/java/org/futo/circles/core/provider/PreferencesProvider.kt index 5ba08a31f..0be15e3a3 100644 --- a/core/src/main/java/org/futo/circles/core/provider/PreferencesProvider.kt +++ b/core/src/main/java/org/futo/circles/core/provider/PreferencesProvider.kt @@ -95,15 +95,6 @@ class PreferencesProvider @Inject constructor( getSharedPreferences().edit(true) { putStringSet(NOT_RESTORED_SESSION, set) } } - fun getBSspekeEncryptedPrivateKeyBase64(alias: String): String? { - return getSharedPreferences().getString(alias, null) - } - - fun storeBSspekeEncryptedPrivateKeyBase64(alias: String, key: String) { - getSharedPreferences().edit { putString(alias, key) } - } - - companion object { private const val PREFERENCES_NAME = "circles_preferences" private const val DEV_MODE_KEY = "developer_mode" -- GitLab