diff --git a/tangem-card-new/src/main/java/com/tangem/commands/CheckWalletCommand.kt b/tangem-card-new/src/main/java/com/tangem/commands/CheckWalletCommand.kt index 009f6293fe..b31101ef68 100644 --- a/tangem-card-new/src/main/java/com/tangem/commands/CheckWalletCommand.kt +++ b/tangem-card-new/src/main/java/com/tangem/commands/CheckWalletCommand.kt @@ -9,6 +9,7 @@ import com.tangem.common.tlv.Tlv import com.tangem.common.tlv.TlvMapper import com.tangem.common.tlv.TlvTag import com.tangem.enums.Instruction +import com.tangem.tasks.TaskError class CheckWalletResponse( val cardId: String, @@ -45,7 +46,7 @@ class CheckWalletCommand( mapper.map(TlvTag.Signature) ) } catch (exception: Exception) { - null + throw TaskError.SerializeCommandError() } } diff --git a/tangem-card-new/src/main/java/com/tangem/commands/CommandSerializer.kt b/tangem-card-new/src/main/java/com/tangem/commands/CommandSerializer.kt index dec341e879..ad201a34a7 100644 --- a/tangem-card-new/src/main/java/com/tangem/commands/CommandSerializer.kt +++ b/tangem-card-new/src/main/java/com/tangem/commands/CommandSerializer.kt @@ -4,6 +4,7 @@ import com.tangem.CardEnvironment import com.tangem.common.apdu.CommandApdu import com.tangem.common.apdu.ResponseApdu import com.tangem.enums.Instruction +import com.tangem.tasks.TaskError //interface TlvMappable { // fun responseFromTlv(tlvList: List): CommandResponse? @@ -26,7 +27,7 @@ abstract class CommandSerializer() { sealed class CommandEvent { class Success(val response: Any) : CommandEvent() - class Failure() : CommandEvent() + class Failure(val taskError: TaskError) : CommandEvent() class UserCancellation : CommandEvent() } diff --git a/tangem-card-new/src/main/java/com/tangem/commands/ReadCardCommand.kt b/tangem-card-new/src/main/java/com/tangem/commands/ReadCardCommand.kt index 4c22b34e62..30d9b8f365 100644 --- a/tangem-card-new/src/main/java/com/tangem/commands/ReadCardCommand.kt +++ b/tangem-card-new/src/main/java/com/tangem/commands/ReadCardCommand.kt @@ -9,6 +9,8 @@ import com.tangem.common.tlv.TlvMapper import com.tangem.common.tlv.TlvTag import com.tangem.data.SettingsMask import com.tangem.enums.Instruction +import com.tangem.tasks.TaskError +import java.util.* enum class SigningMethod(val code: Int) { SignHash(0), @@ -60,9 +62,9 @@ class ReadCardResponse( val status: CardStatus, val firmwareVersion: String?, - val cardPublicKey: String?, + val cardPublicKey: ByteArray?, val settingsMask: SettingsMask?, - val issuerPublicKey: String?, + val issuerPublicKey: ByteArray?, val curve: EllipticCurve?, val maxSignatures: Int?, val signingMethpod: SigningMethod?, @@ -71,14 +73,15 @@ class ReadCardResponse( val walletRemainingSignatures: Int?, val walletSignedHashes: Int?, val health: Int?, - val isActivated: Boolean?, + val isActivated: Boolean, val activationSeed: ByteArray?, val paymentFlowVersion: ByteArray?, val userCounter: Int?, + val terminalIsLinked: Boolean, //Card Data - val batchId: Int?, - val manufactureDateTime: String?, + val batchId: String?, + val manufactureDateTime: Date?, val issuerName: String?, val blockchainName: String?, val manufacturerSignature: ByteArray?, @@ -127,10 +130,11 @@ class ReadCardCommand(private val pin1: String) : CommandSerializer) { inline fun map(tag: TlvTag): T { val tlvValue: ByteArray = tlvList.find { it.tag == tag }?.value - ?: throw MissingTagException() + ?: if (tag.valueType() == TlvValueType.BoolValue && T::class == Boolean::class) { + return false as T + } else { + throw MissingTagException("Tag $tag not found") + } return when (tag.valueType()) { TlvValueType.HexString -> { if (T::class != String::class) throw WrongTypeException("Mapping error. Type for tag: $tag must be ${tag.valueType()}. It is ${T::class}") - tlvValue.toHexString() as T + tlvValue.toHexString() as T } TlvValueType.Utf8String -> { if (T::class != String::class) throw WrongTypeException("Mapping error. Type for tag: $tag must be ${tag.valueType()}. It is ${T::class}") - String(tlvValue) as T + tlvValue.toUtf8() as T } TlvValueType.IntValue -> { if (T::class != Integer::class) @@ -59,7 +64,7 @@ class TlvMapper(val tlvList: List) { TlvValueType.EllipticCurve -> { if (T::class != EllipticCurve::class) throw WrongTypeException("Mapping error. Type for tag: $tag must be ${tag.valueType()}. It is ${T::class}") - EllipticCurve.byName(String(tlvValue)) as T + EllipticCurve.byName(tlvValue.toUtf8()) as T } TlvValueType.DateTime -> { if (T::class != Date::class) @@ -89,8 +94,6 @@ class TlvMapper(val tlvList: List) { SigningMethod.byCode(tlvValue.toInt()) as T } } - - } } \ No newline at end of file diff --git a/tangem-card-new/src/main/java/com/tangem/crypto/CryptoUtils.kt b/tangem-card-new/src/main/java/com/tangem/crypto/CryptoUtils.kt index c71858135f..c8c8ac2630 100644 --- a/tangem-card-new/src/main/java/com/tangem/crypto/CryptoUtils.kt +++ b/tangem-card-new/src/main/java/com/tangem/crypto/CryptoUtils.kt @@ -1,7 +1,9 @@ package com.tangem.crypto import com.tangem.commands.EllipticCurve +import net.i2p.crypto.eddsa.EdDSASecurityProvider import java.security.SecureRandom +import java.security.Security fun generateRandomBytes(length: Int): ByteArray { val bytes = ByteArray(length) @@ -18,3 +20,10 @@ fun verify(publicKey: ByteArray, message: ByteArray, signature: ByteArray, } +fun initCrypto() { + Security.insertProviderAt(org.spongycastle.jce.provider.BouncyCastleProvider(), 1) + Security.addProvider(EdDSASecurityProvider()) +} + + + diff --git a/tangem-card-new/src/main/java/com/tangem/enums/Status.kt b/tangem-card-new/src/main/java/com/tangem/enums/Status.kt index 16658a60db..86e3cfb19c 100644 --- a/tangem-card-new/src/main/java/com/tangem/enums/Status.kt +++ b/tangem-card-new/src/main/java/com/tangem/enums/Status.kt @@ -11,7 +11,7 @@ enum class Status (val code: Int, val description: String){ Pin2Changed(ProcessCompleted.code + 0x0002, "SW_PIN2_CHANGED"), PinsChanged(ProcessCompleted.code + 0x0003, "SW_PINS_CHANGED"), InsNotSupported(0x6D00, "SW_INS_NOT_SUPPORTED"), - NeedEnctryption(0x6982, "SW_NEED_ENCRYPTION"), + NeedEncryption(0x6982, "SW_NEED_ENCRYPTION"), NeedPause(0x9789, "SW_NEED_PAUSE"); companion object {