From 68f7103607b708623fcdfd81301f7cbf6faa3c13 Mon Sep 17 00:00:00 2001
From: Matthias Urhahn <matthias.urhahn@sap.com>
Date: Fri, 12 Mar 2021 15:08:37 +0100
Subject: [PATCH] Encryption migration edge case handling (DEV) #2596

Co-authored-by: Ralf Gehrer <ralfgehrer@users.noreply.github.com>
Co-authored-by: Juraj Kusnier <jurajkusnier@users.noreply.github.com>
---
 .../ui/main/home/HomeFragmentTest.kt          |  2 +-
 .../coronawarnapp/CoronaWarnApplication.kt    | 15 +++---
 .../preferences/EncryptedPreferencesHelper.kt | 51 ------------------
 .../ui/main/home/HomeFragmentViewModel.kt     |  2 +-
 .../de/rki/coronawarnapp/util/CWADebug.kt     |  1 +
 .../rki/coronawarnapp/util/di/AppInjector.kt  |  8 +--
 .../util/di/ApplicationComponent.kt           |  7 ++-
 .../EncryptedPreferencesFactory.kt            |  2 +-
 .../EncryptedPreferencesHelper.kt             | 53 +++++++++++++++++++
 .../EncryptedPreferencesMigration.kt          | 44 +++++++++------
 .../EncryptionErrorResetTool.kt               |  8 +--
 .../util/security/SecurityConstants.kt        |  1 -
 .../main/home/HomeFragmentViewModelTest.kt    |  2 +-
 .../storage/SubmissionRepositoryTest.kt       |  4 +-
 .../EncryptedPreferencesFactoryTest.kt        |  1 +
 ...isTestResultRetrievalPeriodicWorkerTest.kt |  4 +-
 16 files changed, 112 insertions(+), 93 deletions(-)
 delete mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/preferences/EncryptedPreferencesHelper.kt
 rename Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/{security => encryptionmigration}/EncryptedPreferencesFactory.kt (96%)
 create mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/encryptionmigration/EncryptedPreferencesHelper.kt
 rename Corona-Warn-App/src/main/java/de/rki/coronawarnapp/{storage/preferences => util/encryptionmigration}/EncryptedPreferencesMigration.kt (85%)
 rename Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/{security => encryptionmigration}/EncryptionErrorResetTool.kt (69%)

diff --git a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/main/home/HomeFragmentTest.kt b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/main/home/HomeFragmentTest.kt
index 5f2f3a274..383ad820a 100644
--- a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/main/home/HomeFragmentTest.kt
+++ b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/main/home/HomeFragmentTest.kt
@@ -30,7 +30,7 @@ import de.rki.coronawarnapp.tracing.ui.statusbar.TracingHeaderState
 import de.rki.coronawarnapp.ui.main.home.items.FAQCard
 import de.rki.coronawarnapp.ui.main.home.items.HomeItem
 import de.rki.coronawarnapp.ui.statistics.Statistics
-import de.rki.coronawarnapp.util.security.EncryptionErrorResetTool
+import de.rki.coronawarnapp.util.encryptionmigration.EncryptionErrorResetTool
 import de.rki.coronawarnapp.util.shortcuts.AppShortcutsHelper
 import de.rki.coronawarnapp.util.ui.SingleLiveEvent
 import io.mockk.MockKAnnotations
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/CoronaWarnApplication.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/CoronaWarnApplication.kt
index d57407ef4..1424f0742 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/CoronaWarnApplication.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/CoronaWarnApplication.kt
@@ -21,9 +21,8 @@ import de.rki.coronawarnapp.exception.reporting.ErrorReportReceiver
 import de.rki.coronawarnapp.exception.reporting.ReportingConstants.ERROR_REPORT_LOCAL_BROADCAST_CHANNEL
 import de.rki.coronawarnapp.notification.NotificationHelper
 import de.rki.coronawarnapp.risk.RiskLevelChangeDetector
-import de.rki.coronawarnapp.submission.SubmissionSettings
 import de.rki.coronawarnapp.storage.OnboardingSettings
-import de.rki.coronawarnapp.storage.preferences.EncryptedPreferencesMigration
+import de.rki.coronawarnapp.submission.SubmissionSettings
 import de.rki.coronawarnapp.submission.auto.AutoSubmission
 import de.rki.coronawarnapp.task.TaskController
 import de.rki.coronawarnapp.util.CWADebug
@@ -62,7 +61,6 @@ class CoronaWarnApplication : Application(), HasAndroidInjector {
     @Inject lateinit var autoSubmission: AutoSubmission
     @Inject lateinit var submissionSettings: SubmissionSettings
     @Inject lateinit var onboardingSettings: OnboardingSettings
-    @Inject lateinit var encryptedPreferencesMigration: EncryptedPreferencesMigration
 
     @LogHistoryTree @Inject lateinit var rollingLogHistory: Timber.Tree
 
@@ -71,12 +69,15 @@ class CoronaWarnApplication : Application(), HasAndroidInjector {
         super.onCreate()
         CWADebug.init(this)
 
-        Timber.v("onCreate(): Initializing Dagger")
-        AppInjector.init(this)
+        AppInjector.init(this).let { compPreview ->
+            Timber.v("Calling EncryptedPreferencesMigration.doMigration()")
+            compPreview.encryptedMigration.doMigration()
 
-        CWADebug.initAfterInjection(component)
+            CWADebug.initAfterInjection(compPreview)
 
-        encryptedPreferencesMigration.doMigration()
+            Timber.v("Completing application injection")
+            compPreview.inject(this)
+        }
 
         BackgroundWorkScheduler.init(component)
 
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/preferences/EncryptedPreferencesHelper.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/preferences/EncryptedPreferencesHelper.kt
deleted file mode 100644
index 45b15c4d4..000000000
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/preferences/EncryptedPreferencesHelper.kt
+++ /dev/null
@@ -1,51 +0,0 @@
-package de.rki.coronawarnapp.storage.preferences
-
-import android.content.SharedPreferences
-import android.content.pm.ApplicationInfo
-import androidx.core.content.edit
-import de.rki.coronawarnapp.exception.CwaSecurityException
-import de.rki.coronawarnapp.util.security.EncryptedPreferencesFactory
-import de.rki.coronawarnapp.util.security.EncryptionErrorResetTool
-import de.rki.coronawarnapp.util.security.SecurityConstants
-import java.io.File
-import javax.inject.Inject
-
-class EncryptedPreferencesHelper @Inject constructor(
-    private val applicationInfo: ApplicationInfo,
-    factory: EncryptedPreferencesFactory,
-    encryptionErrorResetTool: EncryptionErrorResetTool
-) {
-
-    private val encryptedPreferencesFile by lazy {
-        File(applicationInfo.dataDir)
-            .resolve("shared_prefs/${SecurityConstants.ENCRYPTED_SHARED_PREFERENCES_FILE}.xml")
-    }
-
-    val encryptedSharedPreferencesInstance: SharedPreferences? by lazy {
-        withSecurityCatch {
-            try {
-                if (encryptedPreferencesFile.exists()) {
-                    factory.create(SecurityConstants.ENCRYPTED_SHARED_PREFERENCES_FILE)
-                } else {
-                    null
-                }
-            } catch (e: Exception) {
-                encryptionErrorResetTool.isResetNoticeToBeShown = true
-                null
-            }
-        }
-    }
-
-    fun clean() {
-        encryptedSharedPreferencesInstance?.edit(true) {
-            clear()
-        }
-        encryptedPreferencesFile.delete()
-    }
-
-    private fun <T> withSecurityCatch(doInCatch: () -> T) = try {
-        doInCatch.invoke()
-    } catch (e: Exception) {
-        throw CwaSecurityException(e)
-    }
-}
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeFragmentViewModel.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeFragmentViewModel.kt
index 0c72da282..6cdae10cf 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeFragmentViewModel.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/ui/main/home/HomeFragmentViewModel.kt
@@ -54,7 +54,7 @@ import de.rki.coronawarnapp.ui.main.home.items.ReenableRiskCard
 import de.rki.coronawarnapp.util.DeviceUIState
 import de.rki.coronawarnapp.util.NetworkRequestWrapper.Companion.withSuccess
 import de.rki.coronawarnapp.util.coroutine.DispatcherProvider
-import de.rki.coronawarnapp.util.security.EncryptionErrorResetTool
+import de.rki.coronawarnapp.util.encryptionmigration.EncryptionErrorResetTool
 import de.rki.coronawarnapp.util.shortcuts.AppShortcutsHelper
 import de.rki.coronawarnapp.util.ui.SingleLiveEvent
 import de.rki.coronawarnapp.util.viewmodel.CWAViewModel
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/CWADebug.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/CWADebug.kt
index 9cfc42f4e..a00851695 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/CWADebug.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/CWADebug.kt
@@ -36,6 +36,7 @@ object CWADebug {
     }
 
     fun initAfterInjection(component: ApplicationComponent) {
+        Timber.v("initAfterInjection(%s)", component)
         // TODO ¯\_(ツ)_/¯
         if (isDeviceForTestersBuild) {
             debugLogger.setInjectionIsReady(component)
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/di/AppInjector.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/di/AppInjector.kt
index 2c63e6eff..12e80b7d7 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/di/AppInjector.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/di/AppInjector.kt
@@ -13,9 +13,11 @@ import timber.log.Timber
 object AppInjector {
     lateinit var component: ApplicationComponent
 
-    fun init(app: CoronaWarnApplication) {
-        component = DaggerApplicationComponent.factory().create(app)
-        component.inject(app)
+    fun init(app: CoronaWarnApplication): ApplicationComponent {
+        Timber.v("Initializing Dagger (%s)", app)
+        return DaggerApplicationComponent.factory().create(app).also {
+            component = it
+        }
     }
 
     fun setup(activity: Activity) {
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/di/ApplicationComponent.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/di/ApplicationComponent.kt
index 35ee578c3..f4784f987 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/di/ApplicationComponent.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/di/ApplicationComponent.kt
@@ -35,8 +35,9 @@ import de.rki.coronawarnapp.util.coroutine.AppCoroutineScope
 import de.rki.coronawarnapp.util.coroutine.AppScope
 import de.rki.coronawarnapp.util.coroutine.CoroutineModule
 import de.rki.coronawarnapp.util.device.DeviceModule
-import de.rki.coronawarnapp.util.security.EncryptedPreferencesFactory
-import de.rki.coronawarnapp.util.security.EncryptionErrorResetTool
+import de.rki.coronawarnapp.util.encryptionmigration.EncryptedPreferencesFactory
+import de.rki.coronawarnapp.util.encryptionmigration.EncryptedPreferencesMigration
+import de.rki.coronawarnapp.util.encryptionmigration.EncryptionErrorResetTool
 import de.rki.coronawarnapp.util.security.SecurityModule
 import de.rki.coronawarnapp.util.serialization.SerializationModule
 import de.rki.coronawarnapp.util.worker.WorkerBinder
@@ -100,6 +101,8 @@ interface ApplicationComponent : AndroidInjector<CoronaWarnApplication> {
 
     fun inject(backgroundWorkScheduler: BackgroundWorkScheduler)
 
+    val encryptedMigration: EncryptedPreferencesMigration
+
     @Component.Factory
     interface Factory {
         fun create(@BindsInstance app: CoronaWarnApplication): ApplicationComponent
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/security/EncryptedPreferencesFactory.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/encryptionmigration/EncryptedPreferencesFactory.kt
similarity index 96%
rename from Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/security/EncryptedPreferencesFactory.kt
rename to Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/encryptionmigration/EncryptedPreferencesFactory.kt
index 317e3e765..cd3ec57e8 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/security/EncryptedPreferencesFactory.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/encryptionmigration/EncryptedPreferencesFactory.kt
@@ -1,4 +1,4 @@
-package de.rki.coronawarnapp.util.security
+package de.rki.coronawarnapp.util.encryptionmigration
 
 import android.content.Context
 import android.content.SharedPreferences
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/encryptionmigration/EncryptedPreferencesHelper.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/encryptionmigration/EncryptedPreferencesHelper.kt
new file mode 100644
index 000000000..b58581503
--- /dev/null
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/encryptionmigration/EncryptedPreferencesHelper.kt
@@ -0,0 +1,53 @@
+package de.rki.coronawarnapp.util.encryptionmigration
+
+import android.content.SharedPreferences
+import android.content.pm.ApplicationInfo
+import androidx.core.content.edit
+import timber.log.Timber
+import java.io.File
+import javax.inject.Inject
+
+class EncryptedPreferencesHelper @Inject constructor(
+    private val applicationInfo: ApplicationInfo,
+    factory: EncryptedPreferencesFactory
+) {
+
+    private val preferenceFile by lazy {
+        File(applicationInfo.dataDir)
+            .resolve("shared_prefs/$ENCRYPTED_SHARED_PREFERENCES_FILE.xml")
+    }
+
+    val instance: SharedPreferences? by lazy {
+        if (preferenceFile.exists()) {
+            factory.create(ENCRYPTED_SHARED_PREFERENCES_FILE)
+        } else {
+            null
+        }
+    }
+
+    fun clean() {
+        try {
+            instance?.edit(true) {
+                Timber.d("Clearing all encrypted preference values.")
+                clear()
+                Timber.d("Preference values have been cleared.")
+            }
+        } catch (e: Exception) {
+            Timber.w("Failed to clear encrypted preferences.")
+        }
+
+        if (preferenceFile.exists()) {
+            if (preferenceFile.delete()) {
+                Timber.i("Encrypted preference file deleted.")
+            } else {
+                Timber.e("Encrypted preference could not be deleted.")
+            }
+        } else {
+            Timber.d("Encrypted preference file did not exist.")
+        }
+    }
+
+    companion object {
+        private const val ENCRYPTED_SHARED_PREFERENCES_FILE = "shared_preferences_cwa"
+    }
+}
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/preferences/EncryptedPreferencesMigration.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/encryptionmigration/EncryptedPreferencesMigration.kt
similarity index 85%
rename from Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/preferences/EncryptedPreferencesMigration.kt
rename to Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/encryptionmigration/EncryptedPreferencesMigration.kt
index cda45aade..ae1cb42af 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/preferences/EncryptedPreferencesMigration.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/encryptionmigration/EncryptedPreferencesMigration.kt
@@ -1,4 +1,4 @@
-package de.rki.coronawarnapp.storage.preferences
+package de.rki.coronawarnapp.util.encryptionmigration
 
 import android.content.Context
 import android.content.SharedPreferences
@@ -15,32 +15,38 @@ import javax.inject.Inject
 
 class EncryptedPreferencesMigration @Inject constructor(
     @AppContext private val context: Context,
-    private val encryptedPreferencesHelper: EncryptedPreferencesHelper,
+    private val encryptedPreferences: EncryptedPreferencesHelper,
     private val cwaSettings: CWASettings,
     private val submissionSettings: SubmissionSettings,
     private val tracingSettings: TracingSettings,
-    private val onboardingSettings: OnboardingSettings
+    private val onboardingSettings: OnboardingSettings,
+    private val errorResetTool: EncryptionErrorResetTool
 ) {
 
     fun doMigration() {
         Timber.d("Migration start")
         try {
-            copyData()
-            cleanData()
+            encryptedPreferences.instance?.let { copyData(it) }
         } catch (e: Exception) {
-            Timber.e(e, "Migration was not successful")
+            Timber.e(e, "Migration failed")
+            errorResetTool.isResetNoticeToBeShown = true
+        } finally {
+            try {
+                encryptedPreferences.clean()
+            } catch (e: Exception) {
+                Timber.e(e, "Encryption data clean up failed")
+            }
         }
         try {
             dropDatabase()
         } catch (e: Exception) {
-            Timber.e(e, "Database removing was not successful")
+            Timber.e(e, "Database removing failed")
         }
         Timber.d("Migration finish")
     }
 
-    private fun copyData() {
-        val encryptedSharedPreferences = encryptedPreferencesHelper.encryptedSharedPreferencesInstance ?: return
-        Timber.d("EncryptedPreferences are available")
+    private fun copyData(encryptedSharedPreferences: SharedPreferences) {
+        Timber.i("copyData(): EncryptedPreferences are available")
         SettingsLocalData(encryptedSharedPreferences).apply {
             cwaSettings.wasInteroperabilityShownAtLeastOnce = wasInteroperabilityShown()
             cwaSettings.isNotificationsRiskEnabled.update { isNotificationsRiskEnabled() }
@@ -72,17 +78,21 @@ class EncryptedPreferencesMigration @Inject constructor(
             submissionSettings.isSubmissionSuccessful = numberOfSuccessfulSubmissions() >= 1
             submissionSettings.isAllowedToSubmitKeys = isAllowedToSubmitDiagnosisKeys()
         }
-    }
-
-    private fun cleanData() {
-        encryptedPreferencesHelper.clean()
+        Timber.i("copyData(): EncryptedPreferences have been copied.")
     }
 
     private fun dropDatabase() {
         val file = context.getDatabasePath("coronawarnapp-db")
-        if (file.exists()) {
-            Timber.d("Removing database $file")
-            SQLiteDatabase.deleteDatabase(file)
+        if (!file.exists()) {
+            Timber.d("Encrypted database does not exist.")
+            return
+        }
+
+        Timber.i("Removing database $file")
+        if (SQLiteDatabase.deleteDatabase(file)) {
+            Timber.i("Legacy encrypted database was deleted.")
+        } else {
+            Timber.e("Legacy encrypted database could not be deleted.")
         }
     }
 
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/security/EncryptionErrorResetTool.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/encryptionmigration/EncryptionErrorResetTool.kt
similarity index 69%
rename from Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/security/EncryptionErrorResetTool.kt
rename to Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/encryptionmigration/EncryptionErrorResetTool.kt
index fd87b8a0a..fd432a8b6 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/security/EncryptionErrorResetTool.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/encryptionmigration/EncryptionErrorResetTool.kt
@@ -1,4 +1,4 @@
-package de.rki.coronawarnapp.util.security
+package de.rki.coronawarnapp.util.encryptionmigration
 
 import android.content.Context
 import android.content.SharedPreferences
@@ -16,12 +16,12 @@ class EncryptionErrorResetTool @Inject constructor(
     }
 
     var isResetNoticeToBeShown: Boolean
-        get() = prefs.getBoolean(PKEY_EA1851_SHOW_RESET_NOTICE, false)
+        get() = prefs.getBoolean(PKEY_EA2850_SHOW_RESET_NOTICE, false)
         set(value) = prefs.edit {
-            putBoolean(PKEY_EA1851_SHOW_RESET_NOTICE, value)
+            putBoolean(PKEY_EA2850_SHOW_RESET_NOTICE, value)
         }
 
     companion object {
-        private const val PKEY_EA1851_SHOW_RESET_NOTICE = "ea1851.reset.shownotice"
+        private const val PKEY_EA2850_SHOW_RESET_NOTICE = "ea2850.reset.shownotice"
     }
 }
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/security/SecurityConstants.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/security/SecurityConstants.kt
index 03bffdb28..61ec34895 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/security/SecurityConstants.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/security/SecurityConstants.kt
@@ -2,6 +2,5 @@ package de.rki.coronawarnapp.util.security
 
 object SecurityConstants {
     const val DIGEST_ALGORITHM = "SHA-256"
-    const val ENCRYPTED_SHARED_PREFERENCES_FILE = "shared_preferences_cwa"
     const val EXPORT_FILE_SIGNATURE_VERIFICATION_ALGORITHM = "SHA256withECDSA"
 }
diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/main/home/HomeFragmentViewModelTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/main/home/HomeFragmentViewModelTest.kt
index fe35faf99..2dfc0688e 100644
--- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/main/home/HomeFragmentViewModelTest.kt
+++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/main/home/HomeFragmentViewModelTest.kt
@@ -22,7 +22,7 @@ import de.rki.coronawarnapp.ui.main.home.HomeFragmentViewModel
 import de.rki.coronawarnapp.util.DeviceUIState.PAIRED_POSITIVE
 import de.rki.coronawarnapp.util.DeviceUIState.PAIRED_POSITIVE_TELETAN
 import de.rki.coronawarnapp.util.NetworkRequestWrapper
-import de.rki.coronawarnapp.util.security.EncryptionErrorResetTool
+import de.rki.coronawarnapp.util.encryptionmigration.EncryptionErrorResetTool
 import de.rki.coronawarnapp.util.shortcuts.AppShortcutsHelper
 import io.kotest.matchers.shouldBe
 import io.mockk.MockKAnnotations
diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/storage/SubmissionRepositoryTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/storage/SubmissionRepositoryTest.kt
index 31f62170a..9dcfcba44 100644
--- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/storage/SubmissionRepositoryTest.kt
+++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/storage/SubmissionRepositoryTest.kt
@@ -14,9 +14,9 @@ import de.rki.coronawarnapp.util.NetworkRequestWrapper
 import de.rki.coronawarnapp.util.TimeStamper
 import de.rki.coronawarnapp.util.di.AppInjector
 import de.rki.coronawarnapp.util.di.ApplicationComponent
+import de.rki.coronawarnapp.util.encryptionmigration.EncryptedPreferencesFactory
+import de.rki.coronawarnapp.util.encryptionmigration.EncryptionErrorResetTool
 import de.rki.coronawarnapp.util.formatter.TestResult
-import de.rki.coronawarnapp.util.security.EncryptedPreferencesFactory
-import de.rki.coronawarnapp.util.security.EncryptionErrorResetTool
 import io.kotest.matchers.shouldBe
 import io.mockk.MockKAnnotations
 import io.mockk.Runs
diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/security/EncryptedPreferencesFactoryTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/security/EncryptedPreferencesFactoryTest.kt
index dc37e11df..8ca6a803f 100644
--- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/security/EncryptedPreferencesFactoryTest.kt
+++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/security/EncryptedPreferencesFactoryTest.kt
@@ -1,6 +1,7 @@
 package de.rki.coronawarnapp.util.security
 
 import android.content.Context
+import de.rki.coronawarnapp.util.encryptionmigration.EncryptedPreferencesFactory
 import io.kotest.assertions.throwables.shouldNotThrowAny
 import io.mockk.Called
 import io.mockk.MockKAnnotations
diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/worker/DiagnosisTestResultRetrievalPeriodicWorkerTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/worker/DiagnosisTestResultRetrievalPeriodicWorkerTest.kt
index 2547fd754..6a9c9d4a7 100644
--- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/worker/DiagnosisTestResultRetrievalPeriodicWorkerTest.kt
+++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/worker/DiagnosisTestResultRetrievalPeriodicWorkerTest.kt
@@ -15,9 +15,9 @@ import de.rki.coronawarnapp.util.TimeAndDateExtensions.daysToMilliseconds
 import de.rki.coronawarnapp.util.TimeStamper
 import de.rki.coronawarnapp.util.di.AppInjector
 import de.rki.coronawarnapp.util.di.ApplicationComponent
+import de.rki.coronawarnapp.util.encryptionmigration.EncryptedPreferencesFactory
+import de.rki.coronawarnapp.util.encryptionmigration.EncryptionErrorResetTool
 import de.rki.coronawarnapp.util.formatter.TestResult
-import de.rki.coronawarnapp.util.security.EncryptedPreferencesFactory
-import de.rki.coronawarnapp.util.security.EncryptionErrorResetTool
 import de.rki.coronawarnapp.worker.BackgroundWorkScheduler.stop
 import io.kotest.matchers.shouldBe
 import io.mockk.MockKAnnotations
-- 
GitLab