diff --git a/tangem-core/src/main/java/com/tangem/SessionEnvironment.kt b/tangem-core/src/main/java/com/tangem/SessionEnvironment.kt index c2b744d811..88050df353 100644 --- a/tangem-core/src/main/java/com/tangem/SessionEnvironment.kt +++ b/tangem-core/src/main/java/com/tangem/SessionEnvironment.kt @@ -24,13 +24,13 @@ data class SessionEnvironment( val handleErrors: Boolean = true ) { - var isDefaultPin1: Boolean = Companion.pin1.contentEquals(DEFAULT_PIN.calculateSha256()) - var isDefaultPin2: Boolean = pin2.contentEquals(DEFAULT_PIN2.calculateSha256()) - var pin1: ByteArray = SessionEnvironment.pin1 private set get() = SessionEnvironment.pin1 + fun isCurrentPin1Default(): Boolean = Companion.pin1.contentEquals(DEFAULT_PIN.calculateSha256()) + fun isCurrentPin2Default(): Boolean = pin2.contentEquals(DEFAULT_PIN2.calculateSha256()) + fun setPin1(pin1: String) { SessionEnvironment.pin1 = pin1.calculateSha256() } diff --git a/tangem-core/src/main/java/com/tangem/commands/Command.kt b/tangem-core/src/main/java/com/tangem/commands/Command.kt index 2c7263ca52..ce21f6cdba 100644 --- a/tangem-core/src/main/java/com/tangem/commands/Command.kt +++ b/tangem-core/src/main/java/com/tangem/commands/Command.kt @@ -38,21 +38,11 @@ interface CommandResponse abstract class Command : ApduSerializable, CardSessionRunnable { override val performPreflightRead: Boolean = true + open val requiresPin2: Boolean = false override fun run(session: CardSession, callback: (result: CompletionResult) -> Unit) { Log.i("Command", "Initializing ${this::class.java.simpleName}") - - if (requiresPin2() && session.environment.isDefaultPin2) { - handlePin2(session, callback) - } else { - transceive(session, callback) - } - - } - - private fun Command<*>.requiresPin2(): Boolean { - return this is SignCommand || this is PurgeWalletCommand || - this is CreateWalletCommand || this is WriteUserDataCommand + transceive(session, callback) } open fun performPreCheck(card: Card): TangemSdkError? = null @@ -69,6 +59,11 @@ abstract class Command : ApduSerializable, CardSessionRu } } + if (requiresPin2 && session.environment.isCurrentPin2Default()) { + handlePin2(session, callback) + return + } + val apdu = serialize(session.environment) transceiveApdu(apdu, session) { result -> when (result) { @@ -192,7 +187,7 @@ abstract class Command : ApduSerializable, CardSessionRu session: CardSession, callback: (result: CompletionResult) -> Unit ) { - if (!session.environment.isDefaultPin1) { + if (!session.environment.isCurrentPin1Default()) { session.environment.setPin1(SessionEnvironment.DEFAULT_PIN) transceive(session, callback) return @@ -225,7 +220,7 @@ abstract class Command : ApduSerializable, CardSessionRu transceive(session, callback) } else { session.environment.setPin2(SessionEnvironment.DEFAULT_PIN2) - transceive(session, callback) + callback(CompletionResult.Failure(TangemSdkError.Pin2OrCvcRequired())) } } } diff --git a/tangem-core/src/main/java/com/tangem/commands/CreateWalletCommand.kt b/tangem-core/src/main/java/com/tangem/commands/CreateWalletCommand.kt index 87f9f6dcbe..83a6cbd78d 100644 --- a/tangem-core/src/main/java/com/tangem/commands/CreateWalletCommand.kt +++ b/tangem-core/src/main/java/com/tangem/commands/CreateWalletCommand.kt @@ -37,6 +37,8 @@ class CreateWalletResponse( */ class CreateWalletCommand : Command() { + override val requiresPin2 = true + override fun performPreCheck(card: Card): TangemSdkError? { if (card.isActivated) { return TangemSdkError.NotActivated() diff --git a/tangem-core/src/main/java/com/tangem/commands/PurgeWalletCommand.kt b/tangem-core/src/main/java/com/tangem/commands/PurgeWalletCommand.kt index c3765f4ccd..c4ca477ca3 100644 --- a/tangem-core/src/main/java/com/tangem/commands/PurgeWalletCommand.kt +++ b/tangem-core/src/main/java/com/tangem/commands/PurgeWalletCommand.kt @@ -29,6 +29,8 @@ class PurgeWalletResponse( */ class PurgeWalletCommand : Command() { + override val requiresPin2 = true + override fun performPreCheck(card: Card): TangemSdkError? { if (card.status == CardStatus.NotPersonalized) { return TangemSdkError.NotPersonalized() diff --git a/tangem-core/src/main/java/com/tangem/commands/SetPinCommand.kt b/tangem-core/src/main/java/com/tangem/commands/SetPinCommand.kt index e079f82786..084e755cc1 100644 --- a/tangem-core/src/main/java/com/tangem/commands/SetPinCommand.kt +++ b/tangem-core/src/main/java/com/tangem/commands/SetPinCommand.kt @@ -66,7 +66,7 @@ class SetPinCommand( tlvBuilder.append(TlvTag.NewPin, newPin1) tlvBuilder.append(TlvTag.NewPin2, newPin2) tlvBuilder.append(TlvTag.NewPin3, newPin3) - return CommandApdu(Instruction.SwapPIN, tlvBuilder.serialize()) + return CommandApdu(Instruction.SetPin, tlvBuilder.serialize()) } override fun deserialize(environment: SessionEnvironment, apdu: ResponseApdu): SetPinResponse { diff --git a/tangem-core/src/main/java/com/tangem/commands/SignCommand.kt b/tangem-core/src/main/java/com/tangem/commands/SignCommand.kt index c5d743975b..b48263e2d1 100644 --- a/tangem-core/src/main/java/com/tangem/commands/SignCommand.kt +++ b/tangem-core/src/main/java/com/tangem/commands/SignCommand.kt @@ -32,6 +32,8 @@ class SignResponse( */ class SignCommand(private val hashes: Array) : Command() { + override val requiresPin2 = true + //TODO: Allow signing more than 10 hashes private val hashSizes = if (hashes.isNotEmpty()) hashes.first().size else 0 diff --git a/tangem-core/src/main/java/com/tangem/commands/WriteUserDataCommand.kt b/tangem-core/src/main/java/com/tangem/commands/WriteUserDataCommand.kt index 97a406a2d3..380f18eaf1 100644 --- a/tangem-core/src/main/java/com/tangem/commands/WriteUserDataCommand.kt +++ b/tangem-core/src/main/java/com/tangem/commands/WriteUserDataCommand.kt @@ -32,6 +32,8 @@ class WriteUserDataCommand(private val userData: ByteArray? = null, private val private val userCounter: Int? = null, private val userProtectedCounter: Int? = null) : Command() { + override val requiresPin2 = true + override fun performPreCheck(card: Card): TangemSdkError? { if (card.status == CardStatus.NotPersonalized) { return TangemSdkError.NotPersonalized() diff --git a/tangem-core/src/main/java/com/tangem/common/apdu/Instruction.kt b/tangem-core/src/main/java/com/tangem/common/apdu/Instruction.kt index 46c8989535..02a5eabf7b 100644 --- a/tangem-core/src/main/java/com/tangem/common/apdu/Instruction.kt +++ b/tangem-core/src/main/java/com/tangem/common/apdu/Instruction.kt @@ -15,7 +15,7 @@ enum class Instruction(var code: Int) { ReadIssuerData(0xF7), CreateWallet(0xF8), CheckWallet(0xF9), - SwapPIN(0xFA), + SetPin(0xFA), Sign(0xFB), PurgeWallet(0xFC), Activate(0xFE),