From 6246065cabbfe827fa2b6e85e3f9de35847eaeb3 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 1 Apr 2025 15:00:11 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../tasks/visa/VisaCardActivationTask.kt | 31 ++++++++++++++++--- .../data/visa/MockVisaActivationRepository.kt | 8 ++++- 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/domain/tasks/visa/VisaCardActivationTask.kt b/app/src/main/java/com/tangem/tap/domain/tasks/visa/VisaCardActivationTask.kt index 93b23d3999..890ce4ba9b 100644 --- a/app/src/main/java/com/tangem/tap/domain/tasks/visa/VisaCardActivationTask.kt +++ b/app/src/main/java/com/tangem/tap/domain/tasks/visa/VisaCardActivationTask.kt @@ -16,7 +16,7 @@ import com.tangem.common.extensions.toHexString import com.tangem.common.map import com.tangem.common.timemeasure.RealtimeMonotonicTimeSource import com.tangem.core.error.ext.tangemError -import com.tangem.crypto.CryptoUtils +import com.tangem.crypto.hdWallet.bip32.ExtendedPublicKey import com.tangem.datasource.local.visa.VisaAuthTokenStorage import com.tangem.datasource.local.visa.VisaOTPStorage import com.tangem.datasource.local.visa.VisaOtpData @@ -31,6 +31,7 @@ import com.tangem.domain.visa.repository.VisaActivationRepository import com.tangem.domain.visa.repository.VisaAuthRepository import com.tangem.operations.GenerateOTPCommand import com.tangem.operations.attestation.AttestCardKeyCommand +import com.tangem.operations.derivation.DeriveWalletPublicKeyTask import com.tangem.operations.pins.SetUserCodeCommand import com.tangem.operations.sign.SignHashCommand import com.tangem.operations.sign.SignHashResponse @@ -56,6 +57,8 @@ class VisaCardActivationTask @AssistedInject constructor( private val visaActivationRepositoryFactory: VisaActivationRepository.Factory, ) : CardSessionRunnable { + override val allowsRequestAccessCodeFromRepository: Boolean = false + private class SessionContext( val visaActivationRepository: VisaActivationRepository, val cardId: String, @@ -105,7 +108,7 @@ class VisaCardActivationTask @AssistedInject constructor( private suspend fun SessionContext.signAuthorizationChallenge( challengeToSign: VisaAuthChallenge.Card, ): CompletionResult { - val attestationCommand = AttestCardKeyCommand(challenge = CryptoUtils.generateRandomBytes(length = 16)) + val attestationCommand = AttestCardKeyCommand(challenge = challengeToSign.challenge.hexToBytes()) val timedResult = RealtimeMonotonicTimeSource.measureTimedValue { suspendCancellableCoroutine { continuation -> attestationCommand.run(session = session) { attestationResponse -> @@ -249,8 +252,14 @@ class VisaCardActivationTask @AssistedInject constructor( card.wallets.firstOrNull { it.curve == EllipticCurve.Secp256k1 } ?: return CompletionResult.Failure(TangemSdkError.MissingPreflightRead()) - val derivedPublicKey = wallet.derivedKeys[VisaUtilities.visaDefaultDerivationPath] - ?: return CompletionResult.Failure(VisaActivationError.MissingWallet.tangemError) + val derivedPublicKey = when (val deriveKeyResult = deriveKey(wallet.publicKey)) { + is CompletionResult.Failure -> { + return CompletionResult.Failure(deriveKeyResult.error) + } + is CompletionResult.Success -> { + deriveKeyResult.data + } + } val walletAddress = VisaWalletPublicKeyUtility.generateAddressOnSecp256k1(derivedPublicKey.publicKey) .getOrElse { return CompletionResult.Failure(it.tangemError) } @@ -288,6 +297,20 @@ class VisaCardActivationTask @AssistedInject constructor( } } + private suspend fun SessionContext.deriveKey(publicKey: ByteArray): CompletionResult { + val derivationPath = VisaUtilities.visaDefaultDerivationPath + ?: return CompletionResult.Failure(VisaActivationError.FailedToCreateAddress.tangemError) + + val derivationTask = DeriveWalletPublicKeyTask(publicKey, derivationPath) + val derivationTaskResult = suspendCancellableCoroutine { continuation -> + derivationTask.run(session) { result -> + continuation.resume(result) + } + } + + return derivationTaskResult + } + private suspend fun SessionContext.handleSignedData( dataToSign: VisaDataToSignByCardWallet, walletAddress: String, diff --git a/data/visa/src/main/kotlin/com/tangem/data/visa/MockVisaActivationRepository.kt b/data/visa/src/main/kotlin/com/tangem/data/visa/MockVisaActivationRepository.kt index ed49e8187b..5a33fb6a70 100644 --- a/data/visa/src/main/kotlin/com/tangem/data/visa/MockVisaActivationRepository.kt +++ b/data/visa/src/main/kotlin/com/tangem/data/visa/MockVisaActivationRepository.kt @@ -14,7 +14,13 @@ class MockVisaActivationRepository @AssistedInject constructor( ) : VisaActivationRepository { override suspend fun getActivationRemoteState(): VisaActivationRemoteState { - return VisaActivationRemoteState.PaymentAccountDeploying + return VisaActivationRemoteState.CardWalletSignatureRequired( + request = VisaCardWalletDataToSignRequest( + orderId = "orderId", + customerId = "customerId", + customerWalletAddress = "customerWalletAddress", + ), + ) } override suspend fun getActivationRemoteStateLongPoll(): VisaActivationRemoteState {