diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/_arch/structure/abstraction/ModelConverter.kt b/tangem-devkit/src/main/java/com/tangem/devkit/_arch/structure/abstraction/ModelConverter.kt index d6b1cdb38c..30c69cd6b2 100644 --- a/tangem-devkit/src/main/java/com/tangem/devkit/_arch/structure/abstraction/ModelConverter.kt +++ b/tangem-devkit/src/main/java/com/tangem/devkit/_arch/structure/abstraction/ModelConverter.kt @@ -9,6 +9,11 @@ interface DefaultConverter { fun convert(from: A, default: B): B } +interface TwoWayConverter { + fun aToB(from: A): B + fun bToA(from: B): A +} + interface ItemsToModel : DefaultConverter, M> interface ModelToItems : Converter> diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/DefaultValues.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/DefaultValues.kt index 8c558ab19f..51747d4156 100644 --- a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/DefaultValues.kt +++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/DefaultValues.kt @@ -16,9 +16,9 @@ class ConfigValuesHolder : BaseTypedHolder() { fun init(default: PersonalizationConfig) { register(CardNumber.Series, Value(default.series)) register(CardNumber.Number, Value(default.startNumber)) - register(CardNumber.BatchId, Value(default.batchId)) + register(CardNumber.BatchId, Value(default.cardData.batch)) register(Common.Curve, Value(default.curveID, Helper.listOfCurves())) - register(Common.Blockchain, Value(default.blockchain, Helper.listOfBlockchain())) + register(Common.Blockchain, Value(default.cardData.blockchain, Helper.listOfBlockchain())) register(Common.BlockchainCustom, Value(default.blockchainCustom)) register(Common.MaxSignatures, Value(default.MaxSignatures)) register(Common.CreateWallet, Value(default.createWallet)) @@ -35,9 +35,9 @@ class ConfigValuesHolder : BaseTypedHolder() { register(SignHashExProp.RequireTerminalTxSig, Value(default.requireTerminalTxSignature)) register(SignHashExProp.CheckPin3, Value(default.checkPIN3onCard)) register(Token.ItsToken, Value(default.itsToken)) - register(Token.Symbol, Value(default.symbol)) - register(Token.ContractAddress, Value(default.contractAddress)) - register(Token.Decimal, Value(default.decimal)) + register(Token.Symbol, Value(default.cardData.token_symbol)) + register(Token.ContractAddress, Value(default.cardData.token_contract_address)) + register(Token.Decimal, Value(default.cardData.token_decimal)) register(ProductMask.Note, Value(default.cardData.product_note)) register(ProductMask.Tag, Value(default.cardData.product_tag)) register(ProductMask.IdCard, Value(default.cardData.product_id_card)) diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/PersonalizationConfigConverter.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/PersonalizationConfigConverter.kt index 47bc3f2e6a..a2f8b5de05 100644 --- a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/PersonalizationConfigConverter.kt +++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/PersonalizationConfigConverter.kt @@ -52,9 +52,9 @@ class ItemsToPersonalizationConfig : ItemsToModel { val export = PersonalizationConfig() export.series = getTyped(CardNumber.Series) export.startNumber = getTyped(CardNumber.Number) - export.batchId = getTyped(CardNumber.BatchId) + export.cardData.batch = getTyped(CardNumber.BatchId) export.curveID = getTyped(Common.Curve) - export.blockchain = getTyped(Common.Blockchain) + export.cardData.blockchain = getTyped(Common.Blockchain) export.blockchainCustom = getTyped(Common.BlockchainCustom) export.MaxSignatures = getTyped(Common.MaxSignatures) export.createWallet = getTyped(Common.CreateWallet) @@ -71,9 +71,9 @@ class ItemsToPersonalizationConfig : ItemsToModel { export.requireTerminalTxSignature = getTyped(SignHashExProp.RequireTerminalTxSig) export.checkPIN3onCard = getTyped(SignHashExProp.CheckPin3) export.itsToken = getTyped(Token.ItsToken) - export.symbol = getTyped(Token.Symbol) - export.contractAddress = getTyped(Token.ContractAddress) - export.decimal = getTyped(Token.Decimal) + export.cardData.token_symbol = getTyped(Token.Symbol) + export.cardData.token_contract_address = getTyped(Token.ContractAddress) + export.cardData.token_decimal = getTyped(Token.Decimal) export.cardData = export.cardData.apply { this.product_note = getTyped(ProductMask.Note) } export.cardData = export.cardData.apply { this.product_tag = getTyped(ProductMask.Tag) } export.cardData = export.cardData.apply { this.product_id_card = getTyped(ProductMask.IdCard) } diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/PersonalizationConfigToCardConfig.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/PersonalizationConfigToCardConfig.kt index 719b6bea7a..1c202d0265 100644 --- a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/PersonalizationConfigToCardConfig.kt +++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/converter/PersonalizationConfigToCardConfig.kt @@ -1,6 +1,9 @@ package com.tangem.devkit.ucase.variants.personalize.converter -import com.tangem.commands.* +import com.tangem.commands.CardData +import com.tangem.commands.EllipticCurve +import com.tangem.commands.Product +import com.tangem.commands.ProductMaskBuilder import com.tangem.commands.personalization.entities.CardConfig import com.tangem.commands.personalization.entities.NdefRecord import com.tangem.devkit.ucase.variants.personalize.dto.PersonalizationConfig @@ -10,29 +13,7 @@ import java.util.* class PersonalizationConfigToCardConfig : Converter { override fun convert(from: PersonalizationConfig): CardConfig { - val signingMethodMaskBuilder = SigningMethodMaskBuilder() - if (from.SigningMethod0) { - signingMethodMaskBuilder.add(SigningMethod.SignHash) - } - if (from.SigningMethod1) { - signingMethodMaskBuilder.add(SigningMethod.SignRaw) - } - if (from.SigningMethod2) { - signingMethodMaskBuilder.add(SigningMethod.SignHashValidateByIssuer) - } - if (from.SigningMethod3) { - signingMethodMaskBuilder.add(SigningMethod.SignRawValidateByIssuer) - } - if (from.SigningMethod4) { - signingMethodMaskBuilder.add(SigningMethod.SignHashValidateByIssuerWriteIssuerData) - } - if (from.SigningMethod5) { - signingMethodMaskBuilder.add(SigningMethod.SignRawValidateByIssuerWriteIssuerData) - } - if (from.SigningMethod6) { - signingMethodMaskBuilder.add(SigningMethod.SignHash) - } - val signingMethod = signingMethodMaskBuilder.build() + val signingMethod = PersonalizationConfig.makeSigningMask(from) val isNote = from.cardData.product_note val isTag = from.cardData.product_tag @@ -40,25 +21,25 @@ class PersonalizationConfigToCardConfig : Converter { + + override fun aToB(from: PersonalizationJson): PersonalizationConfig = JsonToConfig().convert(from) + + override fun bToA(from: PersonalizationConfig): PersonalizationJson = ConfigToJson().convert(from) +} + +internal class JsonToConfig : Converter { + override fun convert(from: PersonalizationJson): PersonalizationConfig { + val config = PersonalizationConfig.default() + config.apply { + // Card number + series = from.series + startNumber = from.startNumber + + // Common + curveID = EllipticCurve.byName(from.curveID)?.curve ?: "" + blockchainCustom = "" + MaxSignatures = from.MaxSignatures + createWallet = from.createWallet != 0L + + // Sign hash external properties + pinLessFloorLimit = 100000L + hexCrExKey = from.hexCrExKey + requireTerminalTxSignature = from.requireTerminalTxSignature + requireTerminalCertSignature = from.requireTerminalCertSignature + checkPIN3onCard = from.checkPIN3onCard + + // Product mask + cardData = from.cardData + + // Settings mask + isReusable = from.isReusable + useActivation = from.useActivation + forbidPurgeWallet = from.forbidPurgeWallet + allowSelectBlockchain = from.allowSelectBlockchain + useBlock = from.useBlock + useOneCommandAtTime = from.useOneCommandAtTime + useCVC = from.useCVC + allowSwapPIN = from.allowSwapPIN + allowSwapPIN2 = from.allowSwapPIN2 + forbidDefaultPIN = from.forbidDefaultPIN + smartSecurityDelay = from.smartSecurityDelay + protectIssuerDataAgainstReplay = from.protectIssuerDataAgainstReplay + skipSecurityDelayIfValidatedByIssuer = from.skipSecurityDelayIfValidatedByIssuer + skipCheckPIN2andCVCIfValidatedByIssuer = from.skipCheckPIN2andCVCIfValidatedByIssuer + skipSecurityDelayIfValidatedByLinkedTerminal = from.skipSecurityDelayIfValidatedByLinkedTerminal + restrictOverwriteIssuerDataEx = from.restrictOverwriteIssuerDataEx + + // Settings mask - protocol encryption + protocolAllowUnencrypted = from.protocolAllowUnencrypted + protocolAllowStaticEncryption = from.protocolAllowStaticEncryption + + // Settings mask + useNDEF = from.useNDEF + useDynamicNDEF = from.useDynamicNDEF + disablePrecomputedNDEF = from.disablePrecomputedNDEF + + // Pins + PIN = from.PIN + PIN2 = from.PIN2 + PIN3 = from.PIN3 + CVC = from.CVC + pauseBeforePIN2 = from.pauseBeforePIN2 + + count = from.count + issuerName = from.issuerName + issuerData = from.issuerData +// numberFormat = from.numberFormat + } + + fillToken(config, from.cardData) + fillSigningMethod(config, from.SigningMethod) + fillNdef(config, from.ndef) + + return config + } + + private fun fillToken(config: PersonalizationConfig, cardData: CardData) { + config.itsToken = cardData.token_contract_address.isNotEmpty() || cardData.token_symbol.isNotEmpty() + config.cardData.token_contract_address = cardData.token_contract_address + config.cardData.token_symbol = cardData.token_symbol + config.cardData.token_decimal = cardData.token_decimal + } + + private fun fillSigningMethod(config: PersonalizationConfig, signingMethod: Long) { + val mask = SigningMethodMask(signingMethod.toInt()) + if (mask.contains(SigningMethod.SignHash)) config.SigningMethod0 = true + if (mask.contains(SigningMethod.SignRaw)) config.SigningMethod1 = true + if (mask.contains(SigningMethod.SignHashValidateByIssuer)) config.SigningMethod2 = true + if (mask.contains(SigningMethod.SignRawValidateByIssuer)) config.SigningMethod3 = true + if (mask.contains(SigningMethod.SignHashValidateByIssuerWriteIssuerData)) config.SigningMethod4 = true + if (mask.contains(SigningMethod.SignRawValidateByIssuerWriteIssuerData)) config.SigningMethod5 = true + } + + private fun fillNdef(config: PersonalizationConfig, ndef: MutableList) { + ndef.forEach { record -> + when (record.type) { + NdefRecord.Type.URI -> config.uri = record.value + NdefRecord.Type.AAR -> config.aar = record.value + NdefRecord.Type.TEXT -> { + } + } + } + } +} + +internal class ConfigToJson : Converter { + override fun convert(from: PersonalizationConfig): PersonalizationJson { + val jsonDto = PersonalizationJson() + jsonDto.apply { + releaseVersion = false + issuerName = from.issuerName + series = from.series + startNumber = from.startNumber + count = from.count + PIN = from.PIN + PIN2 = from.PIN2 + PIN3 = from.PIN3 + hexCrExKey = from.hexCrExKey + CVC = from.CVC + pauseBeforePIN2 = from.pauseBeforePIN2 + smartSecurityDelay = from.smartSecurityDelay + curveID = from.curveID + MaxSignatures = from.MaxSignatures + isReusable = from.isReusable + allowSwapPIN = from.allowSwapPIN + allowSwapPIN2 = from.allowSwapPIN2 + useActivation = from.useActivation + useCVC = from.useCVC + useNDEF = from.useNDEF + useDynamicNDEF = from.useDynamicNDEF + useOneCommandAtTime = from.useOneCommandAtTime + useBlock = from.useBlock + allowSelectBlockchain = from.allowSelectBlockchain + forbidPurgeWallet = from.forbidPurgeWallet + protocolAllowUnencrypted = from.protocolAllowUnencrypted + protocolAllowStaticEncryption = from.protocolAllowStaticEncryption + protectIssuerDataAgainstReplay = from.protectIssuerDataAgainstReplay + forbidDefaultPIN = from.forbidDefaultPIN + disablePrecomputedNDEF = from.disablePrecomputedNDEF + skipSecurityDelayIfValidatedByIssuer = from.skipSecurityDelayIfValidatedByIssuer + skipCheckPIN2andCVCIfValidatedByIssuer = from.skipCheckPIN2andCVCIfValidatedByIssuer + skipSecurityDelayIfValidatedByLinkedTerminal = from.skipSecurityDelayIfValidatedByLinkedTerminal + restrictOverwriteIssuerDataEx = from.restrictOverwriteIssuerDataEx + requireTerminalTxSignature = from.requireTerminalTxSignature + requireTerminalCertSignature = from.requireTerminalCertSignature + checkPIN3onCard = from.checkPIN3onCard + createWallet = if (from.createWallet) 1 else 0 + issuerData = from.issuerData + cardData = from.cardData +// numberFormat = from.numberFormat + } + + fillSigningMethod(jsonDto, from) + fillNdef(jsonDto, from) + return jsonDto + } + + private fun fillSigningMethod(jsonDto: PersonalizationJson, from: PersonalizationConfig) { + jsonDto.SigningMethod = PersonalizationConfig.makeSigningMask(from).rawValue.toLong() + } + + private fun fillNdef(jsonDto: PersonalizationJson, from: PersonalizationConfig) { + fun add(value: String, type: NdefRecord.Type) { + if (value.isNotEmpty()) jsonDto.ndef.add(NdefRecord(type, value)) + } + + if (from.aarCustom.isNotEmpty()) add(from.aarCustom, NdefRecord.Type.AAR) + else add(from.aar, NdefRecord.Type.AAR) + + add(from.uri, NdefRecord.Type.URI) + } +} \ No newline at end of file diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/dto/PersonalizationConfig.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/dto/PersonalizationConfig.kt index 67a46c81e8..fbf4739e5c 100644 --- a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/dto/PersonalizationConfig.kt +++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/dto/PersonalizationConfig.kt @@ -1,7 +1,9 @@ package com.tangem.devkit.ucase.variants.personalize.dto import com.tangem.commands.EllipticCurve -import com.tangem.commands.personalization.entities.NdefRecord +import com.tangem.commands.SigningMethod +import com.tangem.commands.SigningMethodMask +import com.tangem.commands.SigningMethodMaskBuilder /** [REDACTED_AUTHOR] @@ -11,11 +13,9 @@ class PersonalizationConfig { // Card number var series = "" var startNumber: Long = 0 - var batchId = "" // Common var curveID = "" - var blockchain = "" var blockchainCustom = "" var MaxSignatures: Long = 0 var createWallet = false @@ -38,10 +38,8 @@ class PersonalizationConfig { // Token var itsToken = false - var symbol = "" - var contractAddress = "" - var decimal: Long = 0 + // Product mask var cardData = CardData() // Settings mask @@ -66,6 +64,7 @@ class PersonalizationConfig { var protocolAllowUnencrypted = false var protocolAllowStaticEncryption = false + // Settings mask var useNDEF = false var useDynamicNDEF = false var disablePrecomputedNDEF = false @@ -80,17 +79,24 @@ class PersonalizationConfig { var CVC = "" var pauseBeforePIN2: Long = 0 +// Fields from JSON +// var releaseVersion = true - don't use in personalization +// var count = 1050 - don't use in personalization +// var numberFormat = "" - don't use in personalization + var count: Long = 0 + var issuerName = "" + var issuerData = null + companion object { + fun default(): PersonalizationConfig { return PersonalizationConfig().apply { // Card number series = "BB" startNumber = 300000000000L - batchId = "ffff" // Common curveID = EllipticCurve.Secp256k1.curve - blockchain = "ETH" blockchainCustom = "" MaxSignatures = 999999L createWallet = true @@ -113,11 +119,8 @@ class PersonalizationConfig { // Token itsToken = false - symbol = "" - contractAddress = "" - decimal = 0L - cardData = CardData() + cardData = CardData.default() // Settings mask isReusable = true @@ -154,17 +157,67 @@ class PersonalizationConfig { PIN3 = "" CVC = "000" pauseBeforePIN2 = 5000L + + count = 1050 + issuerName = "TANGEM" + issuerData = null } } + + fun makeSigningMask(from: PersonalizationConfig): SigningMethodMask { + val signingMethodMaskBuilder = SigningMethodMaskBuilder() + if (from.SigningMethod0) { + signingMethodMaskBuilder.add(SigningMethod.SignHash) + } + if (from.SigningMethod1) { + signingMethodMaskBuilder.add(SigningMethod.SignRaw) + } + if (from.SigningMethod2) { + signingMethodMaskBuilder.add(SigningMethod.SignHashValidateByIssuer) + } + if (from.SigningMethod3) { + signingMethodMaskBuilder.add(SigningMethod.SignRawValidateByIssuer) + } + if (from.SigningMethod4) { + signingMethodMaskBuilder.add(SigningMethod.SignHashValidateByIssuerWriteIssuerData) + } + if (from.SigningMethod5) { + signingMethodMaskBuilder.add(SigningMethod.SignRawValidateByIssuerWriteIssuerData) + } + if (from.SigningMethod6) { + signingMethodMaskBuilder.add(SigningMethod.SignHash) + } + return signingMethodMaskBuilder.build() + } } } class CardData { - var date = "2020-02-17" - var batch = "FF87" - var blockchain = "IROHA" - var product_note = true + var date = "" + var batch = "" + var blockchain = "" + var token_symbol = "" + var token_contract_address = "" + var token_decimal: Int = 0 + var product_note = false var product_tag = false var product_id_card = false var product_id_issuer = false + + companion object { + fun default(): CardData { + return CardData().apply { + date = "2020-02-17" + batch = "FFFF" + blockchain = "ETH" + token_symbol = "" + token_contract_address = "" + token_decimal = 0 + product_note = true + product_tag = false + product_id_card = false + product_id_issuer = false + } + } + } } \ No newline at end of file diff --git a/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/dto/PersonalizationJson.kt b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/dto/PersonalizationJson.kt new file mode 100644 index 0000000000..c19ddc4515 --- /dev/null +++ b/tangem-devkit/src/main/java/com/tangem/devkit/ucase/variants/personalize/dto/PersonalizationJson.kt @@ -0,0 +1,52 @@ +package com.tangem.devkit.ucase.variants.personalize.dto + +import com.tangem.commands.personalization.entities.NdefRecord + +class PersonalizationJson { + + var releaseVersion = false + var issuerName = "" + var series = "" + var startNumber = 0L + var count = 0L + var PIN = "" + var PIN2 = "" + var PIN3 = "" + var hexCrExKey = "" + var CVC = "" + var pauseBeforePIN2 = 0L + var smartSecurityDelay = false + var curveID = "" + var SigningMethod = 0L + var MaxSignatures = 0L + var isReusable = false + var allowSwapPIN = false + var allowSwapPIN2 = false + var useActivation = false + var useCVC = false + var useNDEF = false + var useDynamicNDEF = false + var useOneCommandAtTime = false + var useBlock = false + var allowSelectBlockchain = false + var forbidPurgeWallet = false + var protocolAllowUnencrypted = false + var protocolAllowStaticEncryption = false + var protectIssuerDataAgainstReplay = false + var forbidDefaultPIN = false + var disablePrecomputedNDEF = false + var skipSecurityDelayIfValidatedByIssuer = false + var skipCheckPIN2andCVCIfValidatedByIssuer = false + var skipSecurityDelayIfValidatedByLinkedTerminal = false + var restrictOverwriteIssuerDataEx = false + var requireTerminalTxSignature = false + var requireTerminalCertSignature = false + var checkPIN3onCard = false + var createWallet = 0L + var issuerData = null + + var ndef = mutableListOf() + var cardData = CardData() + + var numberFormat = "" +} \ No newline at end of file