From f2447e4c8676effb4eba91a3e6d3c49a86a9c4b7 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Fri, 22 Oct 2021 11:38:27 +0200 Subject: [PATCH] Trying to prevent crash due to unusable key store master key --- .../java/org/linphone/core/CoreContext.kt | 11 +++++-- .../java/org/linphone/core/CorePreferences.kt | 31 +++++++++++++------ 2 files changed, 30 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/org/linphone/core/CoreContext.kt b/app/src/main/java/org/linphone/core/CoreContext.kt index e15cd3885..8e942a1a8 100644 --- a/app/src/main/java/org/linphone/core/CoreContext.kt +++ b/app/src/main/java/org/linphone/core/CoreContext.kt @@ -883,11 +883,16 @@ class CoreContext(val context: Context, coreConfig: Config) { fun activateVFS() { try { Log.i("[Context] Activating VFS") + val preferences = corePreferences.encryptedSharedPreferences + if (preferences == null) { + Log.e("[Context] Can't get encrypted SharedPreferences, can't init VFS") + return + } - if (corePreferences.encryptedSharedPreferences.getString(VFS_IV, null) == null) { + if (preferences.getString(VFS_IV, null) == null) { generateSecretKey() encryptToken(generateToken()).let { data -> - corePreferences.encryptedSharedPreferences + preferences .edit() .putString(VFS_IV, data.first) .putString(VFS_KEY, data.second) @@ -896,7 +901,7 @@ class CoreContext(val context: Context, coreConfig: Config) { } Factory.instance().setVfsEncryption( LINPHONE_VFS_ENCRYPTION_AES256GCM128_SHA256, - getVfsKey(corePreferences.encryptedSharedPreferences).toByteArray().copyOfRange(0, 32), + getVfsKey(preferences).toByteArray().copyOfRange(0, 32), 32 ) diff --git a/app/src/main/java/org/linphone/core/CorePreferences.kt b/app/src/main/java/org/linphone/core/CorePreferences.kt index f951dd85f..aca0f4e1d 100644 --- a/app/src/main/java/org/linphone/core/CorePreferences.kt +++ b/app/src/main/java/org/linphone/core/CorePreferences.kt @@ -26,6 +26,7 @@ import androidx.security.crypto.MasterKey import java.io.File import java.io.FileInputStream import java.io.FileOutputStream +import java.security.KeyStoreException import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.compatibility.Compatibility import org.linphone.core.tools.Log @@ -46,26 +47,38 @@ class CorePreferences constructor(private val context: Context) { private const val encryptedSharedPreferencesFile = "encrypted.pref" } - val encryptedSharedPreferences: SharedPreferences by lazy { + val encryptedSharedPreferences: SharedPreferences? by lazy { val masterKey: MasterKey = MasterKey.Builder( context, MasterKey.DEFAULT_MASTER_KEY_ALIAS ).setKeyScheme(MasterKey.KeyScheme.AES256_GCM).build() - EncryptedSharedPreferences.create( - context, encryptedSharedPreferencesFile, masterKey, - EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV, - EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM - ) + try { + EncryptedSharedPreferences.create( + context, encryptedSharedPreferencesFile, masterKey, + EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV, + EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM + ) + } catch (kse: KeyStoreException) { + Log.e("[VFS] Keystore exception: $kse") + null + } } var vfsEnabled: Boolean - get() = encryptedSharedPreferences.getBoolean("vfs_enabled", false) + get() = encryptedSharedPreferences?.getBoolean("vfs_enabled", false) ?: false set(value) { - if (!value && encryptedSharedPreferences.getBoolean("vfs_enabled", false)) { + val preferences = encryptedSharedPreferences + if (preferences == null) { + Log.e("[VFS] Failed to get encrypted SharedPreferences") + return + } + + if (!value && preferences.getBoolean("vfs_enabled", false)) { Log.w("[VFS] It is not possible to disable VFS once it has been enabled") return } - encryptedSharedPreferences.edit().putBoolean("vfs_enabled", value).apply() + + preferences.edit().putBoolean("vfs_enabled", value)?.apply() // When VFS is enabled we disable logcat output for linphone logs // TODO: decide if we do it // logcatLogsOutput = false