diff --git a/tangem-core/src/main/java/com/tangem/CardSession.kt b/tangem-core/src/main/java/com/tangem/CardSession.kt index 450c056997..03b8330350 100644 --- a/tangem-core/src/main/java/com/tangem/CardSession.kt +++ b/tangem-core/src/main/java/com/tangem/CardSession.kt @@ -8,6 +8,7 @@ import com.tangem.common.CompletionResult import com.tangem.common.apdu.CommandApdu import com.tangem.common.apdu.ResponseApdu import com.tangem.common.extensions.calculateSha256 +import com.tangem.common.extensions.getType import com.tangem.crypto.EncryptionHelper import com.tangem.crypto.FastEncryptionHelper import com.tangem.crypto.StrongEncryptionHelper @@ -136,6 +137,11 @@ class CardSession( callback(CompletionResult.Failure(SessionError.WrongCard())) return@run } + if (!environment.allowedCards.contains(result.data.getType())) { + stopWithError(SessionError.WrongCardType()) + callback(CompletionResult.Failure(SessionError.WrongCardType())) + return@run + } environment.card = result.data cardId = receivedCardId callback(CompletionResult.Success(result.data)) diff --git a/tangem-core/src/main/java/com/tangem/Config.kt b/tangem-core/src/main/java/com/tangem/Config.kt index d99c57fcf9..ac6301c808 100644 --- a/tangem-core/src/main/java/com/tangem/Config.kt +++ b/tangem-core/src/main/java/com/tangem/Config.kt @@ -1,5 +1,8 @@ package com.tangem +import com.tangem.common.extensions.CardType +import java.util.* + class Config( /** * Enables or disables Linked Terminal feature. @@ -18,16 +21,21 @@ class Config( the correctness of Terminal_Transaction_Signature using previously stored Terminal_PublicKey and, if correct, will skip security delay for the current SIGN operation. */ - val linkedTerminal: Boolean = true, + var linkedTerminal: Boolean = true, /** * If not null, it will be used to validate Issuer data and issuer extra data. * If null, issuerPublicKey from current card will be used. */ - val issuerPublicKey: ByteArray? = null, + var issuerPublicKey: ByteArray? = null, /** * Level of encryption used in communication with a Tangem Card. */ - val encryptionMode: EncryptionMode = EncryptionMode.NONE + var encryptionMode: EncryptionMode = EncryptionMode.NONE, + + /** + * Type of cards that are allowed to be interacted with in TangemSdk. + */ + var allowedCards: EnumSet = EnumSet.allOf(CardType::class.java) ) \ No newline at end of file diff --git a/tangem-core/src/main/java/com/tangem/SessionEnvironment.kt b/tangem-core/src/main/java/com/tangem/SessionEnvironment.kt index 0dabbc74d6..d1a052b155 100644 --- a/tangem-core/src/main/java/com/tangem/SessionEnvironment.kt +++ b/tangem-core/src/main/java/com/tangem/SessionEnvironment.kt @@ -2,8 +2,10 @@ package com.tangem import com.tangem.commands.Card import com.tangem.commands.EllipticCurve +import com.tangem.common.extensions.CardType import com.tangem.common.extensions.calculateSha256 import com.tangem.crypto.CryptoUtils.generatePublicKey +import java.util.* /** @@ -20,7 +22,8 @@ data class SessionEnvironment( val terminalKeys: KeyPair? = null, var encryptionMode: EncryptionMode = EncryptionMode.NONE, var encryptionKey: ByteArray? = null, - val cvc: ByteArray? = null + val cvc: ByteArray? = null, + var allowedCards: EnumSet ) { fun setPin1(pin1: String) { diff --git a/tangem-core/src/main/java/com/tangem/SessionError.kt b/tangem-core/src/main/java/com/tangem/SessionError.kt index 07209b6a3f..b5f702ceb2 100644 --- a/tangem-core/src/main/java/com/tangem/SessionError.kt +++ b/tangem-core/src/main/java/com/tangem/SessionError.kt @@ -106,6 +106,13 @@ sealed class SessionError(val code: Int) : Exception() { */ class HashSizeMustBeEqual : SessionError(3005) + + /** + * This error is returned when a user scans a card of a [com.tangem.common.extensions.CardType] + * that is not specified in [Config.allowedCards]. + */ + class WrongCardType : SessionError(3006) + /** * This error is returned when [com.tangem.TangemSdk] was called with a new [Task], * while a previous [Task] is still in progress. diff --git a/tangem-core/src/main/java/com/tangem/TangemSdk.kt b/tangem-core/src/main/java/com/tangem/TangemSdk.kt index 145efc088e..27d1d79fc4 100644 --- a/tangem-core/src/main/java/com/tangem/TangemSdk.kt +++ b/tangem-core/src/main/java/com/tangem/TangemSdk.kt @@ -367,7 +367,8 @@ class TangemSdk( private fun buildEnvironment(): SessionEnvironment { val terminalKeys = if (config.linkedTerminal) terminalKeysService?.getKeys() else null return SessionEnvironment( - terminalKeys = terminalKeys + terminalKeys = terminalKeys, + allowedCards = config.allowedCards ) } diff --git a/tangem-core/src/main/java/com/tangem/common/extensions/Card.kt b/tangem-core/src/main/java/com/tangem/common/extensions/Card.kt new file mode 100644 index 0000000000..97243f3655 --- /dev/null +++ b/tangem-core/src/main/java/com/tangem/common/extensions/Card.kt @@ -0,0 +1,22 @@ +package com.tangem.common.extensions + +import com.tangem.commands.Card + +fun Card.getType(): CardType { + val firmware = this.firmwareVersion ?: return CardType.Unknown + return when { + firmware.endsWith("d SDK") -> { + CardType.Sdk + } + firmware.endsWith("r") -> { + CardType.Release + } + else -> { + CardType.Unknown + } + } +} + +enum class CardType { + Sdk, Release, Unknown +} \ No newline at end of file diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/ui/ActionViewModel.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/ui/ActionViewModel.kt index 7774441903..fdd0f1ea2f 100644 --- a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/ui/ActionViewModel.kt +++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/ui/ActionViewModel.kt @@ -9,6 +9,7 @@ import com.tangem.TangemSdk import com.tangem.commands.Card import com.tangem.commands.CommandResponse import com.tangem.common.CompletionResult +import com.tangem.common.extensions.CardType import com.tangem.devkit._arch.SingleLiveEvent import com.tangem.devkit._arch.structure.Id import com.tangem.devkit._arch.structure.Payload @@ -20,6 +21,7 @@ import com.tangem.devkit.ucase.resources.ActionType import com.tangem.devkit.ucase.tunnel.ViewScreen import com.tangem.devkit.ucase.variants.personalize.converter.ItemTypes import ru.dev.gbixahue.eu4d.lib.android.global.log.Log +import java.util.* /** [REDACTED_AUTHOR] @@ -43,6 +45,7 @@ class ActionViewModel(private val itemsManager: ItemsManager) : ViewModel(), Lif fun setCardManager(tangemSdk: TangemSdk) { this.tangemSdk = tangemSdk + this.tangemSdk.config.allowedCards = EnumSet.of(CardType.Sdk) } @Deprecated("Events must be send directly from the Widget")