From 560301be14a39e21f85377102f21f1e50cb09d4d Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 2 Mar 2020 14:47:59 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../java/com/tangem/commands/ReadCommand.kt | 18 ++++++++++------- .../java/com/tangem/common/tlv/TlvEncoder.kt | 6 +++--- .../java/com/tangem/common/tlv/TlvMapper.kt | 7 +------ .../main/java/com/tangem/tasks/ScanTask.kt | 3 +-- .../com/tangem/common/tlv/TlvMapperTest.kt | 20 +++++++++++++------ 5 files changed, 30 insertions(+), 24 deletions(-) diff --git a/tangem-core/src/main/java/com/tangem/commands/ReadCommand.kt b/tangem-core/src/main/java/com/tangem/commands/ReadCommand.kt index e6e2558685..0a161f392c 100644 --- a/tangem-core/src/main/java/com/tangem/commands/ReadCommand.kt +++ b/tangem-core/src/main/java/com/tangem/commands/ReadCommand.kt @@ -4,7 +4,6 @@ import com.tangem.common.CardEnvironment import com.tangem.common.apdu.CommandApdu import com.tangem.common.apdu.Instruction import com.tangem.common.apdu.ResponseApdu -import com.tangem.common.extensions.calculateSha256 import com.tangem.common.tlv.Tlv import com.tangem.common.tlv.TlvBuilder import com.tangem.common.tlv.TlvMapper @@ -64,14 +63,19 @@ enum class CardStatus(val code: Int) { } } -enum class ProductMask(val code: Byte) { - Note(0x01), - Tag(0x02), - Card(0x04); +/** + * Mask of products enabled on card + * @property rawValue Products mask values, + * while flags definitions and values are in [ProductMask.Companion] as constants. + */ +data class ProductMask(val rawValue: Int) { + + fun contains(value: Int): Boolean = (rawValue and value) != 0 companion object { - private val values = values() - fun byCode(code: Byte): ProductMask? = values.find { it.code == code } + const val note = 0x01 + const val tag = 0x02 + const val idCard = 0x04 } } diff --git a/tangem-core/src/main/java/com/tangem/common/tlv/TlvEncoder.kt b/tangem-core/src/main/java/com/tangem/common/tlv/TlvEncoder.kt index e2dce7d743..1186dceeb3 100644 --- a/tangem-core/src/main/java/com/tangem/common/tlv/TlvEncoder.kt +++ b/tangem-core/src/main/java/com/tangem/common/tlv/TlvEncoder.kt @@ -74,12 +74,12 @@ class TlvEncoder { TlvValueType.ProductMask -> { typeCheck(tag) byteArrayOf( - (value as ProductMask).code + (value as ProductMask).rawValue.toByte() ) } TlvValueType.SettingsMask -> { typeCheck(tag) - (value as SettingsMask).rawValue.toByteArray() + (value as SettingsMask).rawValue.toByteArray(2) } TlvValueType.CardStatus -> { typeCheck(tag) @@ -97,7 +97,7 @@ class TlvEncoder { } private inline fun typeCheck(tag: TlvTag) { - if (T::class != ExpectedT::class){ + if (T::class != ExpectedT::class) { Log.e(this::class.simpleName!!, "Mapping error. Type for tag: $tag must be ${tag.valueType()}. It is ${T::class}") throw TaskError.WrongType() diff --git a/tangem-core/src/main/java/com/tangem/common/tlv/TlvMapper.kt b/tangem-core/src/main/java/com/tangem/common/tlv/TlvMapper.kt index ead8085ebe..184f2fb49d 100644 --- a/tangem-core/src/main/java/com/tangem/common/tlv/TlvMapper.kt +++ b/tangem-core/src/main/java/com/tangem/common/tlv/TlvMapper.kt @@ -101,12 +101,7 @@ class TlvMapper(val tlvList: List) { } TlvValueType.ProductMask -> { typeCheck(tag) - try { - ProductMask.byCode(tlvValue.first()) as T - } catch (exception: Exception) { - logException(tag, tlvValue.first().toString(), exception) - throw TaskError.ConvertError() - } + ProductMask(tlvValue.toInt()) as T } TlvValueType.SettingsMask -> { typeCheck(tag) diff --git a/tangem-core/src/main/java/com/tangem/tasks/ScanTask.kt b/tangem-core/src/main/java/com/tangem/tasks/ScanTask.kt index 90a8629be0..f0160c48b3 100644 --- a/tangem-core/src/main/java/com/tangem/tasks/ScanTask.kt +++ b/tangem-core/src/main/java/com/tangem/tasks/ScanTask.kt @@ -3,7 +3,6 @@ package com.tangem.tasks import com.tangem.commands.* import com.tangem.common.CardEnvironment import com.tangem.common.CompletionResult -import com.tangem.crypto.CryptoUtils /** * Events that [ScanTask] returns on completion of its commands. @@ -38,7 +37,7 @@ internal class ScanTask : Task() { completeNfcSession(TaskError.MissingPreflightRead()) callback(TaskEvent.Completion(TaskError.MissingPreflightRead())) - } else if (currentCard.cardData?.productMask == ProductMask.Tag) { + } else if (currentCard.cardData?.productMask?.contains(ProductMask.tag) != false) { completeNfcSession() callback(TaskEvent.Completion()) diff --git a/tangem-core/src/test/java/com/tangem/common/tlv/TlvMapperTest.kt b/tangem-core/src/test/java/com/tangem/common/tlv/TlvMapperTest.kt index bbe41dee8a..b1ebcf143e 100644 --- a/tangem-core/src/test/java/com/tangem/common/tlv/TlvMapperTest.kt +++ b/tangem-core/src/test/java/com/tangem/common/tlv/TlvMapperTest.kt @@ -116,18 +116,26 @@ class TlvMapperTest { } @Test - fun `map ProductMask returns correct value`() { - val localMapper = TlvMapper(listOf(Tlv(TlvTag.ProductMask, byteArrayOf(4)))) + fun `map ProductMask with raw value 5 returns correct value`() { + val localMapper = TlvMapper(listOf(Tlv(TlvTag.ProductMask, byteArrayOf(5)))) val productMask: ProductMask = localMapper.map(TlvTag.ProductMask) - assertThat(productMask) - .isEqualTo(ProductMask.Card) + assertThat(productMask.contains(ProductMask.note) && productMask.contains(ProductMask.idCard)) + .isTrue() + } + + @Test + fun `map ProductMask with raw value 1 returns correct value`() { + val localMapper = TlvMapper(listOf(Tlv(TlvTag.ProductMask, byteArrayOf(1)))) + val productMask: ProductMask = localMapper.map(TlvTag.ProductMask) + assertThat(productMask.contains(ProductMask.note)) + .isTrue() } @Test fun `map Enum with unknown code throws ConversionException error`() { - val localMapper = TlvMapper(listOf(Tlv(TlvTag.ProductMask, byteArrayOf(5)))) + val localMapper = TlvMapper(listOf(Tlv(TlvTag.CurveId, "test".toByteArray()))) assertThrows { - localMapper.map(TlvTag.ProductMask) + localMapper.map(TlvTag.CurveId) } }