Skip to content

Commit

Permalink
Add TestKeyStoreEncryptionProvider
Browse files Browse the repository at this point in the history
  • Loading branch information
avazirna committed Jan 23, 2024
1 parent b1af601 commit 7d66b9f
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 12 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
org.commcare.utils.TestKeyStoreEncryptionKeyProvider
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -20,23 +20,20 @@ import org.robolectric.annotation.Config
@RunWith(AndroidJUnit4::class)
public class EncryptCredentialsInMemoryTest {

val encryptionHelper = EncryptionHelper()
@Before
fun setup() {
TestAppInstaller.installAppAndUser(
"jr://resource/commcare-apps/update_tests/base_app/profile.ccpr",
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()
Expand All @@ -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)
Expand Down Expand Up @@ -81,11 +78,6 @@ public class EncryptCredentialsInMemoryTest {
Assert.assertEquals(username, user.username)
}

@After
fun restore() {
encryptionHelper.reloadEncryptionKeyProvider()
}

private fun generateUserCredentialKey() {
val mockKeyGenParameterSpec = mockk<KeyGenParameterSpec>()
every { mockKeyGenParameterSpec.keystoreAlias } returns EncryptionKeyHelper.CC_IN_MEMORY_ENCRYPTION_KEY_ALIAS
Expand Down
Original file line number Diff line number Diff line change
@@ -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";
}
}

0 comments on commit 7d66b9f

Please sign in to comment.