From 5ec60f0cce8ebf4ff7114ab945d4861aa97a3b70 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 21 Oct 2021 19:19:59 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../java/com/tangem/tap/domain/ProductType.kt | 2 +- .../tangem/tap/domain/tasks/ScanNoteTask.kt | 4 +-- .../CreateProductWalletAndRescanTask.kt | 2 +- .../domain/tasks/product/ScanProductTask.kt | 26 +++++++++++-------- .../tap/domain/twins/TwinCardsManager.kt | 12 ++------- .../tangem/tap/domain/twins/TwinsHelper.kt | 9 +++++++ .../features/onboarding/OnboardingHelper.kt | 20 +++++++++++--- 7 files changed, 47 insertions(+), 28 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/domain/ProductType.kt b/app/src/main/java/com/tangem/tap/domain/ProductType.kt index 02f0246c82..07cbea8905 100644 --- a/app/src/main/java/com/tangem/tap/domain/ProductType.kt +++ b/app/src/main/java/com/tangem/tap/domain/ProductType.kt @@ -4,5 +4,5 @@ package com.tangem.tap.domain [REDACTED_AUTHOR] */ enum class ProductType { - Note, Wallet, Twin, Other + Note, Wallet, Twins, Other } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/domain/tasks/ScanNoteTask.kt b/app/src/main/java/com/tangem/tap/domain/tasks/ScanNoteTask.kt index b2b415dc15..3b01ae1c98 100644 --- a/app/src/main/java/com/tangem/tap/domain/tasks/ScanNoteTask.kt +++ b/app/src/main/java/com/tangem/tap/domain/tasks/ScanNoteTask.kt @@ -16,7 +16,7 @@ import com.tangem.tap.domain.TapWorkarounds.isExcluded import com.tangem.tap.domain.TapWorkarounds.isTangemNote import com.tangem.tap.domain.extensions.getSingleWallet import com.tangem.tap.domain.tasks.product.ScanResponse -import com.tangem.tap.domain.twins.TwinCardsManager +import com.tangem.tap.domain.twins.TwinsHelper import com.tangem.tap.domain.twins.isTangemTwin class ScanNoteTask(val card: Card? = null) : CardSessionRunnable { @@ -92,7 +92,7 @@ class ScanNoteTask(val card: Card? = null) : CardSessionRunnable { callback(CompletionResult.Success(ScanResponse(card, ProductType.Other, null))) return@run } - val verified = TwinCardsManager.verifyTwinPublicKey( + val verified = TwinsHelper.verifyTwinPublicKey( readDataResult.data.issuerData, publicKey ) if (verified) { diff --git a/app/src/main/java/com/tangem/tap/domain/tasks/product/CreateProductWalletAndRescanTask.kt b/app/src/main/java/com/tangem/tap/domain/tasks/product/CreateProductWalletAndRescanTask.kt index 3b3c6ea2ae..92beb01238 100644 --- a/app/src/main/java/com/tangem/tap/domain/tasks/product/CreateProductWalletAndRescanTask.kt +++ b/app/src/main/java/com/tangem/tap/domain/tasks/product/CreateProductWalletAndRescanTask.kt @@ -45,7 +45,7 @@ private class CreateProductWalletTask( override fun run(session: CardSession, callback: (result: CompletionResult) -> Unit) { val commandProcessor = when (type) { ProductType.Note -> CreateWalletTangemNote() - ProductType.Twin -> throw UnsupportedOperationException("Use the TwinCardsManager to create a wallet") + ProductType.Twins -> throw UnsupportedOperationException("Use the TwinCardsManager to create a wallet") ProductType.Wallet -> CreateWalletTangemWallet() else -> CreateWalletOtherCards() } diff --git a/app/src/main/java/com/tangem/tap/domain/tasks/product/ScanProductTask.kt b/app/src/main/java/com/tangem/tap/domain/tasks/product/ScanProductTask.kt index cdb63d456b..34f8f201f7 100644 --- a/app/src/main/java/com/tangem/tap/domain/tasks/product/ScanProductTask.kt +++ b/app/src/main/java/com/tangem/tap/domain/tasks/product/ScanProductTask.kt @@ -24,7 +24,7 @@ import com.tangem.tap.domain.TapWorkarounds.isExcluded import com.tangem.tap.domain.TapWorkarounds.isTangemNote import com.tangem.tap.domain.TapWorkarounds.isTangemWallet import com.tangem.tap.domain.extensions.getSingleWallet -import com.tangem.tap.domain.twins.TwinCardsManager +import com.tangem.tap.domain.twins.TwinsHelper import com.tangem.tap.domain.twins.isTangemTwin data class ScanResponse( @@ -43,13 +43,17 @@ data class ScanResponse( fun getPrimaryToken(): Token? { val cardToken = walletData?.token ?: return null return Token( - cardToken.name, - cardToken.symbol, - cardToken.contractAddress, - cardToken.decimals, - Blockchain.fromId(walletData.blockchain) + cardToken.name, + cardToken.symbol, + cardToken.contractAddress, + cardToken.decimals, + Blockchain.fromId(walletData.blockchain) ) } + + fun twinsIsTwinned(): Boolean { + return walletData != null && secondTwinPublicKey != null + } } class ScanProductTask(val card: Card? = null) : CardSessionRunnable { @@ -120,21 +124,21 @@ private class ScanTwinProcessor : ProductCommandProcessor { is CompletionResult.Success -> { val publicKey = card.getSingleWallet()?.publicKey if (publicKey == null) { - callback(CompletionResult.Success(ScanResponse(card, ProductType.Twin, null))) + callback(CompletionResult.Success(ScanResponse(card, ProductType.Twins, null))) return@run } - val verified = TwinCardsManager.verifyTwinPublicKey(readDataResult.data.issuerData, publicKey) + val verified = TwinsHelper.verifyTwinPublicKey(readDataResult.data.issuerData, publicKey) if (verified) { val twinPublicKey = readDataResult.data.issuerData.sliceArray(0 until 65) val walletData = session.environment.walletData - val response = ScanResponse(card, ProductType.Twin, walletData, twinPublicKey.toHexString()) + val response = ScanResponse(card, ProductType.Twins, walletData, twinPublicKey.toHexString()) callback(CompletionResult.Success(response)) } else { - callback(CompletionResult.Success(ScanResponse(card, ProductType.Twin, null))) + callback(CompletionResult.Success(ScanResponse(card, ProductType.Twins, null))) } } is CompletionResult.Failure -> - callback(CompletionResult.Success(ScanResponse(card, ProductType.Twin, null))) + callback(CompletionResult.Success(ScanResponse(card, ProductType.Twins, null))) } } } diff --git a/app/src/main/java/com/tangem/tap/domain/twins/TwinCardsManager.kt b/app/src/main/java/com/tangem/tap/domain/twins/TwinCardsManager.kt index d2d8aa143c..df48e76971 100644 --- a/app/src/main/java/com/tangem/tap/domain/twins/TwinCardsManager.kt +++ b/app/src/main/java/com/tangem/tap/domain/twins/TwinCardsManager.kt @@ -11,7 +11,6 @@ import com.tangem.common.KeyPair import com.tangem.common.core.TangemSdkError import com.tangem.common.extensions.hexToBytes import com.tangem.common.extensions.toHexString -import com.tangem.crypto.CryptoUtils import com.tangem.tap.common.analytics.FirebaseAnalyticsHandler import com.tangem.tap.common.extensions.readAssetAsString import com.tangem.tap.domain.tasks.product.ScanResponse @@ -21,7 +20,8 @@ import com.tangem.tap.tangemSdkManager class TwinCardsManager(private val scanResponse: ScanResponse, context: Context) { private val currentCardId: String = scanResponse.card.cardId -// private val secondCardId: String? = TwinsHelper.getTwinsCardId(currentCardId) + + // private val secondCardId: String? = TwinsHelper.getTwinsCardId(currentCardId) private val secondCardId: String? = null private var currentCardPublicKey: String? = null @@ -108,14 +108,6 @@ class TwinCardsManager(private val scanResponse: ScanResponse, context: Context) } companion object { - fun verifyTwinPublicKey(issuerData: ByteArray, cardWalletPublicKey: ByteArray?): Boolean { - if (issuerData.size < 65 || cardWalletPublicKey == null) return false - - val publicKey = issuerData.sliceArray(0 until 65) - val signedKey = issuerData.sliceArray(65 until issuerData.size) - return CryptoUtils.verify(cardWalletPublicKey, publicKey, signedKey) - } - private fun getIssuerKeys(context: Context, publicKey: String): KeyPair { val issuer = getIssuers(context).first { it.publicKey == publicKey } return KeyPair( diff --git a/app/src/main/java/com/tangem/tap/domain/twins/TwinsHelper.kt b/app/src/main/java/com/tangem/tap/domain/twins/TwinsHelper.kt index 65c4d7cb53..89affa15d1 100644 --- a/app/src/main/java/com/tangem/tap/domain/twins/TwinsHelper.kt +++ b/app/src/main/java/com/tangem/tap/domain/twins/TwinsHelper.kt @@ -1,11 +1,20 @@ package com.tangem.tap.domain.twins import com.tangem.common.card.Card +import com.tangem.crypto.CryptoUtils class TwinsHelper { companion object { const val TWIN_FILE_NAME = "TwinPublicKey" + fun verifyTwinPublicKey(issuerData: ByteArray, cardWalletPublicKey: ByteArray?): Boolean { + if (issuerData.size < 65 || cardWalletPublicKey == null) return false + + val publicKey = issuerData.sliceArray(0 until 65) + val signedKey = issuerData.sliceArray(65 until issuerData.size) + return CryptoUtils.verify(cardWalletPublicKey, publicKey, signedKey) + } + fun getTwinCardNumber(cardId: String): TwinCardNumber? { return when { firstCardSeries.map { cardId.startsWith(it) }.contains(true) -> { diff --git a/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingHelper.kt b/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingHelper.kt index 38b2517ad1..6a097f6511 100644 --- a/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingHelper.kt +++ b/app/src/main/java/com/tangem/tap/features/onboarding/OnboardingHelper.kt @@ -12,14 +12,28 @@ import com.tangem.tap.preferencesStorage class OnboardingHelper { companion object { - fun isOnboardingCase(response: ScanResponse): Boolean = if (response.card.hasWallets()) - preferencesStorage.usedCardsPrefStorage.activationIsStarted(response.card.cardId) else true + fun isOnboardingCase(response: ScanResponse): Boolean { + val cardInfoStorage = preferencesStorage.usedCardsPrefStorage + return when { + response.productType == ProductType.Twins -> { + if (!response.twinsIsTwinned()) { + true + } else { + cardInfoStorage.activationIsStarted(response.card.cardId) + } + } + response.card.hasWallets() -> { + cardInfoStorage.activationIsStarted(response.card.cardId) + } + else -> true + } + } fun whereToNavigate(scanResponse: ScanResponse): AppScreen { return when (scanResponse.productType) { ProductType.Note -> AppScreen.OnboardingNote ProductType.Wallet -> AppScreen.OnboardingWallet - ProductType.Twin -> AppScreen.OnboardingTwins + ProductType.Twins -> AppScreen.OnboardingTwins ProductType.Other -> AppScreen.OnboardingOther } }