package cash.z.ecc.android.sdk.demoapp.util import android.content.Context @Deprecated( message = "Do not use this! It is insecure and only intended for demo purposes to " + "show how to bridge to an existing key storage mechanism. Instead, use the Android " + "Keystore system or a 3rd party library that leverages it." ) class SampleStorage(context: Context) { private val prefs = context.applicationContext.getSharedPreferences("ExtremelyInsecureStorage", Context.MODE_PRIVATE) fun saveSensitiveString(key: String, value: String) { prefs.edit().putString(key, value).apply() } fun loadSensitiveString(key: String): String? = prefs.getString(key, null) fun saveSensitiveBytes(key: String, value: ByteArray) { saveSensitiveString(key, value.toString(Charsets.ISO_8859_1)) } fun loadSensitiveBytes(key: String): ByteArray? = prefs.getString(key, null)?.toByteArray(Charsets.ISO_8859_1) } /** * Simple demonstration of how to take existing code that securely stores data and bridge it into * the SDK. This class delegates to the storage object. For demo purposes, we're using an insecure * SampleStorage implementation but this can easily be swapped for a truly secure storage solution. */ @Suppress("deprecation") class SampleStorageBridge(context: Context) { private val delegate = SampleStorage(context.applicationContext) /** * Just a sugar method to help with being explicit in sample code. We want to show developers * our intention that they write simple bridges to secure storage components. */ fun securelyStoreSeed(seed: ByteArray): SampleStorageBridge { delegate.saveSensitiveBytes(KEY_SEED, seed) return this } /** * Just a sugar method to help with being explicit in sample code. We want to show developers * our intention that they write simple bridges to secure storage components. */ fun securelyStorePrivateKey(key: String): SampleStorageBridge { delegate.saveSensitiveString(KEY_PK, key) return this } val seed: ByteArray get() = delegate.loadSensitiveBytes(KEY_SEED)!! val key get() = delegate.loadSensitiveString(KEY_PK)!! companion object { private const val KEY_SEED = "cash.z.ecc.android.sdk.demoapp.SEED" private const val KEY_PK = "cash.z.ecc.android.sdk.demoapp.PK" } }