From 7d66b9f2fc261ab63e3b0829663f584ebb005608 Mon Sep 17 00:00:00 2001 From: Ahmad Vazirna Date: Tue, 23 Jan 2024 14:23:57 +0200 Subject: [PATCH] Add TestKeyStoreEncryptionProvider --- ...mmcare.util.IKeyStoreEncryptionKeyProvider | 1 + .../utils/EncryptCredentialsInMemoryTest.kt | 16 ++----- .../TestKeyStoreEncryptionKeyProvider.java | 45 +++++++++++++++++++ 3 files changed, 50 insertions(+), 12 deletions(-) create mode 100644 app/unit-tests/resources/META-INF/services/org.commcare.util.IKeyStoreEncryptionKeyProvider create mode 100644 app/unit-tests/src/org/commcare/utils/TestKeyStoreEncryptionKeyProvider.java diff --git a/app/unit-tests/resources/META-INF/services/org.commcare.util.IKeyStoreEncryptionKeyProvider b/app/unit-tests/resources/META-INF/services/org.commcare.util.IKeyStoreEncryptionKeyProvider new file mode 100644 index 0000000000..c4f65b558c --- /dev/null +++ b/app/unit-tests/resources/META-INF/services/org.commcare.util.IKeyStoreEncryptionKeyProvider @@ -0,0 +1 @@ +org.commcare.utils.TestKeyStoreEncryptionKeyProvider \ No newline at end of file diff --git a/app/unit-tests/src/org/commcare/utils/EncryptCredentialsInMemoryTest.kt b/app/unit-tests/src/org/commcare/utils/EncryptCredentialsInMemoryTest.kt index e3ba51f104..ddb0a96334 100644 --- a/app/unit-tests/src/org/commcare/utils/EncryptCredentialsInMemoryTest.kt +++ b/app/unit-tests/src/org/commcare/utils/EncryptCredentialsInMemoryTest.kt @@ -8,8 +8,8 @@ import org.commcare.CommCareApplication import org.commcare.CommCareTestApplication import org.commcare.android.util.TestAppInstaller import org.commcare.util.EncryptionKeyHelper +import org.commcare.util.EncryptionHelper import org.javarosa.core.model.User -import org.junit.After import org.junit.Assert import org.junit.Before import org.junit.Test @@ -20,7 +20,6 @@ import org.robolectric.annotation.Config @RunWith(AndroidJUnit4::class) public class EncryptCredentialsInMemoryTest { - val encryptionHelper = EncryptionHelper() @Before fun setup() { TestAppInstaller.installAppAndUser( @@ -28,15 +27,13 @@ public class EncryptCredentialsInMemoryTest { TEST_USER, TEST_PASS ) - - // Set production encryption key provider - encryptionHelper.setEncryptionKeyProvider(EncryptionKeyProvider()) } @Test fun saveUsernameWithKeyStoreAndReadWithout_shouldPass() { // confirm that there is no android key store available - Assert.assertFalse(EncryptionKeyHelper.isKeyStoreAvailable) + + Assert.assertFalse(EncryptionKeyHelper.isKeyStoreAvailable()) // register mock Android key store provider, this is when the key store becomes available MockAndroidKeyStoreProvider.registerProvider() @@ -45,7 +42,7 @@ public class EncryptCredentialsInMemoryTest { generateUserCredentialKey() // assert that the android key store is available - Assert.assertTrue(EncryptionKeyHelper.isKeyStoreAvailable) + Assert.assertTrue(EncryptionKeyHelper.isKeyStoreAvailable()) // login with the Android key store available TestAppInstaller.login(TEST_USER, TEST_PASS) @@ -81,11 +78,6 @@ public class EncryptCredentialsInMemoryTest { Assert.assertEquals(username, user.username) } - @After - fun restore() { - encryptionHelper.reloadEncryptionKeyProvider() - } - private fun generateUserCredentialKey() { val mockKeyGenParameterSpec = mockk() every { mockKeyGenParameterSpec.keystoreAlias } returns EncryptionKeyHelper.CC_IN_MEMORY_ENCRYPTION_KEY_ALIAS diff --git a/app/unit-tests/src/org/commcare/utils/TestKeyStoreEncryptionKeyProvider.java b/app/unit-tests/src/org/commcare/utils/TestKeyStoreEncryptionKeyProvider.java new file mode 100644 index 0000000000..bd6bca8a1d --- /dev/null +++ b/app/unit-tests/src/org/commcare/utils/TestKeyStoreEncryptionKeyProvider.java @@ -0,0 +1,45 @@ +package org.commcare.utils; + +import android.os.Build; +import android.security.keystore.KeyProperties; + +import org.commcare.util.EncryptionHelper; +import org.commcare.util.EncryptionKeyHelper; +import org.commcare.util.IKeyStoreEncryptionKeyProvider; + +import java.security.Key; + +import androidx.annotation.RequiresApi; + +/** + * Class for providing encryption keys backed by Android Keystore for Unit testing + * + * @author avazirna + */ +public class TestKeyStoreEncryptionKeyProvider implements IKeyStoreEncryptionKeyProvider { + + @RequiresApi(api = Build.VERSION_CODES.M) + private static final String ALGORITHM = KeyProperties.KEY_ALGORITHM_AES; + @RequiresApi(api = Build.VERSION_CODES.M) + private static final String BLOCK_MODE = KeyProperties.BLOCK_MODE_GCM; + @RequiresApi(api = Build.VERSION_CODES.M) + private static final String PADDING = KeyProperties.ENCRYPTION_PADDING_NONE; + + // Generates a cryptrographic key and adds it to the Android KeyStore + @Override + public Key generateCryptographicKeyInKeyStore(String keyAlias, + EncryptionHelper.CryptographicOperation cryptographicOperation) + throws EncryptionKeyHelper.EncryptionKeyException { + throw new EncryptionKeyHelper.EncryptionKeyException("KeyStore encryption key generator provider for testing only"); + } + + @Override + public String getTransformationString() { + return String.format("%s/%s/%s", ALGORITHM, BLOCK_MODE, PADDING); + } + + @Override + public String getKeyStoreName() { + return "AndroidKeyStore"; + } +}