From 48db52b2a92a1f360bc64e61ab0a6c8a8c757556 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 4 Dec 2018 11:05:16 +0300 Subject: [PATCH 01/61] Updated on 2026-08-14 --- .../java/com/tangem/data/LogFileProvider.java | 3 +- app/src/main/java/com/tangem/data/Logger.java | 2 +- .../StartFingerprintReaderTask.java | 2 +- .../com/tangem/data/network/Cryptonit.java | 10 - .../data/network/CryptonitOtherApi.java | 3 +- .../java/com/tangem/data/network/Kraken.java | 3 +- .../tangem/data/network/ServerApiCommon.java | 4 +- .../data/network/ServerApiElectrum.java | 4 +- .../java/com/tangem/data/nfc/PurgeTask.java | 102 ---- .../com/tangem/data/nfc/ReadCardInfoTask.java | 173 ------- .../com/tangem/data/nfc/VerifyCardTask.java | 116 ----- app/src/main/java/com/tangem/di/Navigator.kt | 2 +- .../com/tangem/domain/wallet/BTCUtils.java | 9 +- .../domain/wallet/BalanceValidator.java | 1 + .../com/tangem/domain/wallet/CoinData.java | 26 +- .../com/tangem/domain/wallet/CoinEngine.java | 2 +- .../tangem/domain/wallet/CoinEngineFactory.kt | 1 + .../tangem/domain/wallet/TangemContext.java | 15 + .../domain/wallet/bch/BtcCashEngine.java | 12 +- .../tangem/domain/wallet/btc/BtcEngine.java | 12 +- .../tangem/domain/wallet/eth/EthEngine.java | 12 +- .../domain/wallet/token/TokenEngine.java | 10 +- .../activity/ConfirmPaymentActivity.kt | 6 +- .../activity/CreateNewWalletActivity.kt | 9 +- .../activity/EmptyWalletActivity.kt | 10 +- .../presentation/activity/MainActivity.kt | 15 +- .../activity/PinRequestActivity.kt | 6 +- .../presentation/activity/PinSaveActivity.kt | 2 +- .../presentation/activity/PinSwapActivity.kt | 10 +- ...pareCryptonitOtherApiWithdrawalActivity.kt | 4 +- .../PrepareCryptonitWithdrawalActivity.kt | 4 +- .../PrepareKrakenWithdrawalActivity.kt | 4 +- .../activity/PreparePaymentActivity.kt | 4 +- .../presentation/activity/PurgeActivity.kt | 9 +- .../activity/SendTransactionActivity.kt | 4 +- .../activity/SignPaymentActivity.kt | 8 +- .../activity/VerifyCardActivity.kt | 2 +- .../presentation/fragment/LoadedWallet.kt | 14 +- .../presentation/fragment/VerifyCard.kt | 6 +- .../main/java/com/tangem/util/CryptoUtil.java | 1 + tangemcard/build.gradle | 32 +- tangemcard/src/main/AndroidManifest.xml | 15 +- .../tangem/tangemcard/data}/Blockchain.java | 7 +- .../data}/DeviceNFCAntennaLocation.kt | 3 +- .../tangem/tangemcard/data}/Firmwares.java | 4 +- .../com/tangem/tangemcard/data}/Issuer.java | 7 +- .../tangem/tangemcard/data}/LocalStorage.kt | 4 +- .../tangem/tangemcard/data}/Manufacturer.java | 2 +- .../tangemcard/{nfc => data}/NFCLocation.kt | 2 +- .../tangem/tangemcard/data}/PINStorage.java | 4 +- .../tangem/tangemcard/data}/TangemCard.java | 51 +- .../tangem/tangemcard/reader}/CardCrypto.java | 5 +- .../tangemcard/reader}/CardProtocol.java | 341 ++----------- .../tangemcard/reader}/CommandApdu.java | 4 +- .../com/tangem/tangemcard/reader}/INS.java | 2 +- .../tangem/tangemcard/reader}/NfcManager.java | 2 +- .../com/tangem/tangemcard/reader}/PBKDF2.java | 2 +- .../tangemcard/reader}/ResponseApdu.java | 2 +- .../com/tangem/tangemcard/reader}/SW.java | 2 +- .../tangemcard/reader}/SettingsMask.java | 2 +- .../com/tangem/tangemcard/reader}/TLV.java | 2 +- .../tangemcard/reader}/TLVException.java | 2 +- .../tangem/tangemcard/reader}/TLVList.java | 2 +- .../tasks}/CreateNewWalletTask.java | 10 +- .../tangemcard/tasks/CustomReadCardTask.java | 454 ++++++++++++++++++ .../tangem/tangemcard/tasks/PurgeTask.java | 29 ++ .../tangemcard/tasks/ReadCardInfoTask.java | 50 ++ .../tangemcard/tasks}/SignPaymentTask.java | 8 +- .../tangem/tangemcard/tasks}/SwapPINTask.java | 10 +- .../tangemcard/tasks/VerifyCardTask.java | 51 ++ .../com/tangem/tangemcard}/util/Util.java | 2 +- .../src/main/res/drawable/card_default.png | Bin .../src/main/res/drawable/card_ru006.png | Bin .../src/main/res/drawable/card_ru007.png | Bin .../src/main/res/drawable/card_ru011.png | Bin .../src/main/res/drawable/card_ru012.png | Bin .../src/main/res/drawable/card_ru013.png | Bin .../src/main/res/drawable/card_ru014.png | Bin .../src/main/res/drawable/card_ru015.png | Bin .../src/main/res/drawable/card_ru016.png | Bin .../src/main/res/drawable/card_ru020.png | Bin .../src/main/res/drawable/card_ru021.png | Bin .../src/main/res/drawable/card_ru022.png | Bin .../src/main/res/drawable/card_ru023.png | Bin .../src/main/res/drawable/card_ru024.png | Bin .../src/main/res/drawable/card_ru028.png | Bin .../src/main/res/drawable/card_ru029.png | Bin .../src/main/res/drawable/card_ru030.png | Bin .../res/drawable/hand_card_horizontal.png | Bin .../main/res/drawable/hand_card_vertical.png | Bin .../main/res/drawable/ic_logo_bat_token.png | Bin .../src/main/res/drawable/ic_logo_bitcoin.png | Bin .../res/drawable/ic_logo_bitcoin_cash.png | Bin .../res/drawable/ic_logo_bitcoin_testnet.png | Bin .../main/res/drawable/ic_logo_ethereum.png | Bin .../res/drawable/ic_logo_ethereum_testnet.png | Bin .../src/main/res/drawable/ic_logo_seed.png | Bin .../src/main/res/drawable/ic_logo_unknown.png | Bin .../src/main/res/drawable/tangem2.png | Bin 99 files changed, 860 insertions(+), 895 deletions(-) delete mode 100644 app/src/main/java/com/tangem/data/nfc/PurgeTask.java delete mode 100644 app/src/main/java/com/tangem/data/nfc/ReadCardInfoTask.java delete mode 100644 app/src/main/java/com/tangem/data/nfc/VerifyCardTask.java rename {app/src/main/java/com/tangem/domain/wallet => tangemcard/src/main/java/com/tangem/tangemcard/data}/Blockchain.java (95%) rename {app/src/main/java/com/tangem/data/nfc => tangemcard/src/main/java/com/tangem/tangemcard/data}/DeviceNFCAntennaLocation.kt (93%) rename {app/src/main/java/com/tangem/domain/cardReader => tangemcard/src/main/java/com/tangem/tangemcard/data}/Firmwares.java (96%) rename {app/src/main/java/com/tangem/domain/wallet => tangemcard/src/main/java/com/tangem/tangemcard/data}/Issuer.java (95%) rename {app/src/main/java/com/tangem/data/db => tangemcard/src/main/java/com/tangem/tangemcard/data}/LocalStorage.kt (99%) rename {app/src/main/java/com/tangem/domain/wallet => tangemcard/src/main/java/com/tangem/tangemcard/data}/Manufacturer.java (96%) rename tangemcard/src/main/java/com/tangem/tangemcard/{nfc => data}/NFCLocation.kt (99%) rename {app/src/main/java/com/tangem/data/db => tangemcard/src/main/java/com/tangem/tangemcard/data}/PINStorage.java (98%) rename {app/src/main/java/com/tangem/domain/wallet => tangemcard/src/main/java/com/tangem/tangemcard/data}/TangemCard.java (94%) rename {app/src/main/java/com/tangem/domain/cardReader => tangemcard/src/main/java/com/tangem/tangemcard/reader}/CardCrypto.java (98%) rename {app/src/main/java/com/tangem/domain/cardReader => tangemcard/src/main/java/com/tangem/tangemcard/reader}/CardProtocol.java (77%) rename {app/src/main/java/com/tangem/domain/cardReader => tangemcard/src/main/java/com/tangem/tangemcard/reader}/CommandApdu.java (98%) rename {app/src/main/java/com/tangem/domain/cardReader => tangemcard/src/main/java/com/tangem/tangemcard/reader}/INS.java (94%) rename {app/src/main/java/com/tangem/domain/cardReader => tangemcard/src/main/java/com/tangem/tangemcard/reader}/NfcManager.java (99%) rename {app/src/main/java/com/tangem/domain/cardReader => tangemcard/src/main/java/com/tangem/tangemcard/reader}/PBKDF2.java (98%) rename {app/src/main/java/com/tangem/domain/cardReader => tangemcard/src/main/java/com/tangem/tangemcard/reader}/ResponseApdu.java (99%) rename {app/src/main/java/com/tangem/domain/cardReader => tangemcard/src/main/java/com/tangem/tangemcard/reader}/SW.java (97%) rename {app/src/main/java/com/tangem/domain/cardReader => tangemcard/src/main/java/com/tangem/tangemcard/reader}/SettingsMask.java (95%) rename {app/src/main/java/com/tangem/domain/cardReader => tangemcard/src/main/java/com/tangem/tangemcard/reader}/TLV.java (99%) rename {app/src/main/java/com/tangem/domain/cardReader => tangemcard/src/main/java/com/tangem/tangemcard/reader}/TLVException.java (90%) rename {app/src/main/java/com/tangem/domain/cardReader => tangemcard/src/main/java/com/tangem/tangemcard/reader}/TLVList.java (98%) rename {app/src/main/java/com/tangem/data/nfc => tangemcard/src/main/java/com/tangem/tangemcard/tasks}/CreateNewWalletTask.java (93%) create mode 100644 tangemcard/src/main/java/com/tangem/tangemcard/tasks/CustomReadCardTask.java create mode 100644 tangemcard/src/main/java/com/tangem/tangemcard/tasks/PurgeTask.java create mode 100644 tangemcard/src/main/java/com/tangem/tangemcard/tasks/ReadCardInfoTask.java rename {app/src/main/java/com/tangem/data/nfc => tangemcard/src/main/java/com/tangem/tangemcard/tasks}/SignPaymentTask.java (96%) rename {app/src/main/java/com/tangem/data/nfc => tangemcard/src/main/java/com/tangem/tangemcard/tasks}/SwapPINTask.java (92%) create mode 100644 tangemcard/src/main/java/com/tangem/tangemcard/tasks/VerifyCardTask.java rename {app/src/main/java/com/tangem => tangemcard/src/main/java/com/tangem/tangemcard}/util/Util.java (99%) rename {app => tangemcard}/src/main/res/drawable/card_default.png (100%) rename {app => tangemcard}/src/main/res/drawable/card_ru006.png (100%) rename {app => tangemcard}/src/main/res/drawable/card_ru007.png (100%) rename {app => tangemcard}/src/main/res/drawable/card_ru011.png (100%) rename {app => tangemcard}/src/main/res/drawable/card_ru012.png (100%) rename {app => tangemcard}/src/main/res/drawable/card_ru013.png (100%) rename {app => tangemcard}/src/main/res/drawable/card_ru014.png (100%) rename {app => tangemcard}/src/main/res/drawable/card_ru015.png (100%) rename {app => tangemcard}/src/main/res/drawable/card_ru016.png (100%) rename {app => tangemcard}/src/main/res/drawable/card_ru020.png (100%) rename {app => tangemcard}/src/main/res/drawable/card_ru021.png (100%) rename {app => tangemcard}/src/main/res/drawable/card_ru022.png (100%) rename {app => tangemcard}/src/main/res/drawable/card_ru023.png (100%) rename {app => tangemcard}/src/main/res/drawable/card_ru024.png (100%) rename {app => tangemcard}/src/main/res/drawable/card_ru028.png (100%) rename {app => tangemcard}/src/main/res/drawable/card_ru029.png (100%) rename {app => tangemcard}/src/main/res/drawable/card_ru030.png (100%) rename {app => tangemcard}/src/main/res/drawable/hand_card_horizontal.png (100%) rename {app => tangemcard}/src/main/res/drawable/hand_card_vertical.png (100%) rename {app => tangemcard}/src/main/res/drawable/ic_logo_bat_token.png (100%) rename {app => tangemcard}/src/main/res/drawable/ic_logo_bitcoin.png (100%) rename {app => tangemcard}/src/main/res/drawable/ic_logo_bitcoin_cash.png (100%) rename {app => tangemcard}/src/main/res/drawable/ic_logo_bitcoin_testnet.png (100%) rename {app => tangemcard}/src/main/res/drawable/ic_logo_ethereum.png (100%) rename {app => tangemcard}/src/main/res/drawable/ic_logo_ethereum_testnet.png (100%) rename {app => tangemcard}/src/main/res/drawable/ic_logo_seed.png (100%) rename {app => tangemcard}/src/main/res/drawable/ic_logo_unknown.png (100%) rename {app => tangemcard}/src/main/res/drawable/tangem2.png (100%) diff --git a/app/src/main/java/com/tangem/data/LogFileProvider.java b/app/src/main/java/com/tangem/data/LogFileProvider.java index be8a46d5a7..1c95cf0459 100644 --- a/app/src/main/java/com/tangem/data/LogFileProvider.java +++ b/app/src/main/java/com/tangem/data/LogFileProvider.java @@ -68,8 +68,7 @@ public class LogFileProvider extends ContentProvider { // Create & return a ParcelFileDescriptor pointing to the file // Note: I don't care what mode they ask for - they're only getting // read only - ParcelFileDescriptor pfd = ParcelFileDescriptor.open(new File( - fileLocation), ParcelFileDescriptor.MODE_READ_ONLY); + ParcelFileDescriptor pfd = ParcelFileDescriptor.open(new File(fileLocation), ParcelFileDescriptor.MODE_READ_ONLY); return pfd; // Otherwise unrecognised Uri diff --git a/app/src/main/java/com/tangem/data/Logger.java b/app/src/main/java/com/tangem/data/Logger.java index e556515577..ad6f408d07 100644 --- a/app/src/main/java/com/tangem/data/Logger.java +++ b/app/src/main/java/com/tangem/data/Logger.java @@ -3,7 +3,7 @@ package com.tangem.data; import android.content.Context; import android.util.Log; -import com.tangem.util.Util; +import com.tangem.tangemcard.util.Util; import java.io.BufferedReader; import java.io.BufferedWriter; diff --git a/app/src/main/java/com/tangem/data/fingerprint/StartFingerprintReaderTask.java b/app/src/main/java/com/tangem/data/fingerprint/StartFingerprintReaderTask.java index 74de89e542..3884469a70 100644 --- a/app/src/main/java/com/tangem/data/fingerprint/StartFingerprintReaderTask.java +++ b/app/src/main/java/com/tangem/data/fingerprint/StartFingerprintReaderTask.java @@ -8,7 +8,7 @@ import android.security.keystore.KeyGenParameterSpec; import android.security.keystore.KeyPermanentlyInvalidatedException; import android.security.keystore.KeyProperties; -import com.tangem.data.db.PINStorage; +import com.tangem.tangemcard.data.PINStorage; import com.tangem.presentation.activity.PinRequestActivity; import java.io.IOException; diff --git a/app/src/main/java/com/tangem/data/network/Cryptonit.java b/app/src/main/java/com/tangem/data/network/Cryptonit.java index de709d7289..75f9586baa 100644 --- a/app/src/main/java/com/tangem/data/network/Cryptonit.java +++ b/app/src/main/java/com/tangem/data/network/Cryptonit.java @@ -4,30 +4,22 @@ import android.annotation.SuppressLint; import android.content.Context; import android.content.SharedPreferences; import android.preference.PreferenceManager; -import android.util.Log; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.google.gson.internal.LinkedTreeMap; import com.jakewharton.retrofit2.adapter.rxjava2.HttpException; import com.jakewharton.retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; -import com.tangem.util.Util; import com.tangem.wallet.R; import java.io.IOException; -import java.util.Arrays; - -import javax.crypto.Mac; -import javax.crypto.spec.SecretKeySpec; import io.reactivex.Observable; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.schedulers.Schedulers; import okhttp3.Interceptor; -import okhttp3.MediaType; import okhttp3.OkHttpClient; import okhttp3.Request; -import okhttp3.RequestBody; import okhttp3.Response; //import okhttp3.logging.HttpLoggingInterceptor; import retrofit2.Call; @@ -36,9 +28,7 @@ import retrofit2.converter.gson.GsonConverterFactory; import retrofit2.http.Body; import retrofit2.http.Header; import retrofit2.http.Headers; -import retrofit2.http.Multipart; import retrofit2.http.POST; -import retrofit2.http.Part; /** * HTTP diff --git a/app/src/main/java/com/tangem/data/network/CryptonitOtherApi.java b/app/src/main/java/com/tangem/data/network/CryptonitOtherApi.java index 772da733a8..7e933b1951 100644 --- a/app/src/main/java/com/tangem/data/network/CryptonitOtherApi.java +++ b/app/src/main/java/com/tangem/data/network/CryptonitOtherApi.java @@ -4,7 +4,6 @@ import android.annotation.SuppressLint; import android.content.Context; import android.content.SharedPreferences; import android.preference.PreferenceManager; -import android.util.Log; import com.google.gson.JsonObject; import com.google.gson.JsonParser; @@ -12,7 +11,7 @@ import com.google.gson.annotations.SerializedName; import com.google.gson.internal.LinkedTreeMap; import com.jakewharton.retrofit2.adapter.rxjava2.HttpException; import com.jakewharton.retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; -import com.tangem.util.Util; +import com.tangem.tangemcard.util.Util; import com.tangem.wallet.R; import java.io.IOException; diff --git a/app/src/main/java/com/tangem/data/network/Kraken.java b/app/src/main/java/com/tangem/data/network/Kraken.java index 318dd04900..3eefe0a9d9 100644 --- a/app/src/main/java/com/tangem/data/network/Kraken.java +++ b/app/src/main/java/com/tangem/data/network/Kraken.java @@ -4,10 +4,9 @@ import android.annotation.SuppressLint; import android.content.Context; import android.content.SharedPreferences; import android.preference.PreferenceManager; -import android.util.Log; import com.jakewharton.retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; -import com.tangem.util.Util; +import com.tangem.tangemcard.util.Util; import com.tangem.wallet.R; import org.spongycastle.util.encoders.Base64; diff --git a/app/src/main/java/com/tangem/data/network/ServerApiCommon.java b/app/src/main/java/com/tangem/data/network/ServerApiCommon.java index 50b790ad84..ded6b4753e 100644 --- a/app/src/main/java/com/tangem/data/network/ServerApiCommon.java +++ b/app/src/main/java/com/tangem/data/network/ServerApiCommon.java @@ -7,8 +7,8 @@ import android.util.Log; import com.tangem.App; import com.tangem.data.network.model.CardVerifyAndGetInfo; import com.tangem.data.network.model.RateInfoResponse; -import com.tangem.domain.wallet.TangemCard; -import com.tangem.util.Util; +import com.tangem.tangemcard.data.TangemCard; +import com.tangem.tangemcard.util.Util; import java.io.InputStream; import java.util.ArrayList; diff --git a/app/src/main/java/com/tangem/data/network/ServerApiElectrum.java b/app/src/main/java/com/tangem/data/network/ServerApiElectrum.java index d212c06822..732d67c72e 100644 --- a/app/src/main/java/com/tangem/data/network/ServerApiElectrum.java +++ b/app/src/main/java/com/tangem/data/network/ServerApiElectrum.java @@ -3,8 +3,8 @@ package com.tangem.data.network; import android.util.Log; import com.tangem.App; -import com.tangem.domain.wallet.Blockchain; -import com.tangem.domain.wallet.TangemCard; +import com.tangem.tangemcard.data.Blockchain; +import com.tangem.tangemcard.data.TangemCard; import com.tangem.domain.wallet.bch.BitcoinCashNode; import com.tangem.domain.wallet.btc.BitcoinNode; import com.tangem.domain.wallet.btc.BitcoinNodeTestNet; diff --git a/app/src/main/java/com/tangem/data/nfc/PurgeTask.java b/app/src/main/java/com/tangem/data/nfc/PurgeTask.java deleted file mode 100644 index a24c71e24e..0000000000 --- a/app/src/main/java/com/tangem/data/nfc/PurgeTask.java +++ /dev/null @@ -1,102 +0,0 @@ -package com.tangem.data.nfc; - -import android.content.Context; -import android.nfc.tech.IsoDep; -import android.util.Log; - -import com.tangem.domain.cardReader.CardProtocol; -import com.tangem.domain.cardReader.NfcManager; -import com.tangem.data.db.PINStorage; -import com.tangem.domain.wallet.TangemCard; - -public class PurgeTask extends Thread { - public static final String TAG = PurgeTask.class.getSimpleName(); - - private String txOutAddress; - private Context mContext; - private TangemCard mCard; - private NfcManager mNfcManager; - private IsoDep mIsoDep; - private CardProtocol.Notifications mNotifications; - private boolean isCancelled = false; - - public PurgeTask(Context context, TangemCard card, NfcManager nfcManager, IsoDep isoDep, CardProtocol.Notifications notifications) { - mCard = card; - mContext = context; - mNfcManager = nfcManager; - mIsoDep = isoDep; - mNotifications = notifications; - } - - @Override - public void run() { - if (mIsoDep == null) { - return; - } - CardProtocol protocol = new CardProtocol(mContext, mIsoDep, mCard, mNotifications); - - mNotifications.onReadStart(protocol); - try { - - // for Samsung's bugs - Workaround for the Samsung Galaxy S5 (since the first connection always hangs on transceive). - int timeout = mIsoDep.getTimeout(); - mIsoDep.connect(); - mIsoDep.close(); - mIsoDep.connect(); - mIsoDep.setTimeout(timeout); - try { - mNotifications.onReadProgress(protocol, 5); - - Log.i(TAG, "[-- Start purge --]"); - - if (isCancelled) return; - - if (mCard.getPauseBeforePIN2() > 0) { - mNotifications.onReadWait(mCard.getPauseBeforePIN2()); - } - -// try { - protocol.run_PurgeWallet(PINStorage.getPIN2()); -// } finally { -// mNotifications.onReadWait(0); -// } - - mNotifications.onReadProgress(protocol, 50); - - protocol.run_Read(); - - mNotifications.onReadProgress(protocol, 100); - - if (isCancelled) - return; - - } finally { - mNfcManager.ignoreTag(mIsoDep.getTag()); - mNotifications.onReadWait(0); - } - } catch (Exception e) { - e.printStackTrace(); - protocol.setError(e); - - } finally { - Log.i(TAG, "[-- Finish purge --]"); - mNotifications.onReadFinish(protocol); - } - } - - public void cancel(Boolean AllowInterrupt) { - try { - if (isAlive()) { - isCancelled = true; - join(500); - } - if (isAlive() && AllowInterrupt) { - interrupt(); - mNotifications.onReadCancel(); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/data/nfc/ReadCardInfoTask.java b/app/src/main/java/com/tangem/data/nfc/ReadCardInfoTask.java deleted file mode 100644 index f0fa541df9..0000000000 --- a/app/src/main/java/com/tangem/data/nfc/ReadCardInfoTask.java +++ /dev/null @@ -1,173 +0,0 @@ -package com.tangem.data.nfc; - -import android.content.Context; -import android.nfc.tech.IsoDep; -import android.util.Log; - -import com.tangem.domain.cardReader.CardProtocol; -import com.tangem.domain.cardReader.NfcManager; -import com.tangem.data.db.PINStorage; -import com.tangem.domain.wallet.TangemCard; -import com.tangem.util.Util; - -import java.util.ArrayList; - -public class ReadCardInfoTask extends Thread { - public static final String TAG = ReadCardInfoTask.class.getSimpleName(); - - private IsoDep mIsoDep; - private CardProtocol.Notifications mNotifications; - private boolean isCancelled = false; - private Context mContext; - private NfcManager mNfcManager; - - // this fields are static to optimize process when need enter pin and scan card again - private static ArrayList lastRead_UnsuccessfullPINs = new ArrayList<>(); - private static TangemCard.EncryptionMode lastRead_Encryption = null; - private static String lastRead_UID; - - public static void resetLastReadInfo() { - lastRead_UID=""; - lastRead_Encryption=null; - lastRead_UnsuccessfullPINs.clear(); - } - - public ReadCardInfoTask(Context context, NfcManager nfcManager, IsoDep isoDep, CardProtocol.Notifications notifications) { - mContext = context; - mIsoDep = isoDep; - mNotifications = notifications; - mNfcManager = nfcManager; -// ReadCardInfoTask.lastRead_UID = lastRead_UID; - } - - @Override - public void run() { - if (mIsoDep == null) { - return; - } - try { - // for Samsung's bugs - - // Workaround for the Samsung Galaxy S5 (since the - // first connection always hangs on transceive). - int timeout = mIsoDep.getTimeout(); - mIsoDep.connect(); - mIsoDep.close(); - mIsoDep.connect(); - mIsoDep.setTimeout(timeout); - try { - CardProtocol protocol = new CardProtocol(mContext, mIsoDep, mNotifications); - mNotifications.onReadStart(protocol); - try { - mNotifications.onReadProgress(protocol, 5); - - byte[] UID = mIsoDep.getTag().getId(); - String sUID = Util.byteArrayToHexString(UID); - if (!lastRead_UID.equals(sUID)) { - resetLastReadInfo(); - } - - Log.i(TAG, "[-- Start read card info --]"); - - if (isCancelled) return; - - protocol.setPIN(PINStorage.getDefaultPIN()); - protocol.clearReadResult(); - - if (lastRead_Encryption == null) { - Log.i(TAG, "Try get supported encryption mode"); - protocol.run_GetSupportedEncryption(); - } else { - Log.i(TAG, "Use already defined encryption mode: " + lastRead_Encryption.name()); - protocol.getCard().encryptionMode = lastRead_Encryption; - } - - if (protocol.haveReadResult()) { - //already have read result (obtained while get supported encryption), only read issuer data and define offline balance - protocol.parseReadResult(); - protocol.run_ReadWriteIssuerData(); - mNotifications.onReadProgress(protocol, 60); - PINStorage.setLastUsedPIN(protocol.getCard().getPIN()); - } else { - //don't have read result - may be don't get supported encryption on this try, need encryption or need another PIN - if (lastRead_Encryption == null) { - // we try get supported encryption on this time - lastRead_Encryption = protocol.getCard().encryptionMode; - if (protocol.getCard().encryptionMode == TangemCard.EncryptionMode.None) { - // default pin not accepted - lastRead_UnsuccessfullPINs.add(PINStorage.getDefaultPIN()); - } - } - - boolean pinFound = false; - for (String PIN : PINStorage.getPINs()) { - Log.e(TAG, "PIN: " + PIN); - - boolean skipPin = false; - for (int i = 0; i < lastRead_UnsuccessfullPINs.size(); i++) { - if (lastRead_UnsuccessfullPINs.get(i).equals(PIN)) { - skipPin = true; - break; - } - } - - if (skipPin) { - Log.e(TAG, "Skip PIN - already checked before"); - continue; - } - - try { - protocol.setPIN(PIN); - if (protocol.getCard().encryptionMode != TangemCard.EncryptionMode.None) { - protocol.CreateProtocolKey(); - } - protocol.run_Read(); - mNotifications.onReadProgress(protocol, 60); - PINStorage.setLastUsedPIN(PIN); - pinFound = true; - protocol.getCard().setPIN(PIN); - break; - } catch (CardProtocol.TangemException_InvalidPIN e) { - Log.e(TAG, e.getMessage()); - lastRead_UnsuccessfullPINs.add(PIN); - } - } - if (!pinFound) { - throw new CardProtocol.TangemException_InvalidPIN("No valid PIN found!"); - } - } - - protocol.run_CheckPIN2isDefault(); - - } catch (Exception e) { - e.printStackTrace(); - protocol.setError(e); - - } finally { - Log.i(TAG, "[-- Finish read card info --]"); - mNotifications.onReadFinish(protocol); - } - } finally { - mNfcManager.ignoreTag(mIsoDep.getTag()); - } - } catch (Exception e) { - e.printStackTrace(); - mNfcManager.notifyReadResult(false); - } - } - - public void cancel(Boolean AllowInterrupt) { - try { - if (isAlive()) { - isCancelled = true; - join(500); - } - if (isAlive() && AllowInterrupt) { - interrupt(); - mNotifications.onReadCancel(); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/data/nfc/VerifyCardTask.java b/app/src/main/java/com/tangem/data/nfc/VerifyCardTask.java deleted file mode 100644 index 9db5b0f682..0000000000 --- a/app/src/main/java/com/tangem/data/nfc/VerifyCardTask.java +++ /dev/null @@ -1,116 +0,0 @@ -package com.tangem.data.nfc; - -import android.content.Context; -import android.nfc.tech.IsoDep; -import android.util.Log; - -import com.tangem.domain.cardReader.CardProtocol; -import com.tangem.domain.cardReader.Firmwares; -import com.tangem.domain.cardReader.NfcManager; -import com.tangem.data.db.PINStorage; -import com.tangem.domain.wallet.TangemCard; - -import java.util.Arrays; - -/** - * Created by dvol on 04.02.2018. - */ - -public class VerifyCardTask extends Thread { - public static final String TAG = VerifyCardTask.class.getSimpleName(); - - private IsoDep mIsoDep; - private CardProtocol.Notifications mNotifications; - private boolean isCancelled = false; - private Context mContext; - private TangemCard mCard; - private NfcManager mNfcManager; - - public VerifyCardTask(Context context, TangemCard card, NfcManager nfcManager, IsoDep isoDep, CardProtocol.Notifications notifications) { - mCard = card; - mContext = context; - mIsoDep = isoDep; - mNotifications = notifications; - mNfcManager = nfcManager; - } - - @Override - public void run() { - if (mIsoDep == null) { - return; - } - try { - // for Samsung's bugs - - // Workaround for the Samsung Galaxy S5 (since the - // first connection always hangs on transceive). - int timeout = mIsoDep.getTimeout(); - mIsoDep.connect(); - mIsoDep.close(); - mIsoDep.connect(); - mIsoDep.setTimeout(timeout); - try { - CardProtocol protocol = new CardProtocol(mContext, mIsoDep, mCard, mNotifications); - mNotifications.onReadStart(protocol); - try { - mNotifications.onReadProgress(protocol, 5); - - Log.i(TAG, "[-- Start verify card --]"); - - if (isCancelled) return; - - String PIN = mCard.getPIN(); - protocol.setPIN(PIN); - protocol.run_Read(false); - PINStorage.setLastUsedPIN(PIN); - mNotifications.onReadProgress(protocol, 20); - if (isCancelled) return; - protocol.run_VerifyCard(); - mNotifications.onReadProgress(protocol, 50); - Log.i(TAG, "Manufacturer: " + protocol.getCard().getManufacturer().getOfficialName()); - if (isCancelled) return; - if (protocol.getCard().getStatus() == TangemCard.Status.Loaded) { - protocol.run_CheckWalletWithSignatureVerify(); - mNotifications.onReadProgress(protocol, 80); - } - if (isCancelled) return; - Firmwares.VerifyCodeRecord record=Firmwares.selectRandomVerifyCodeBlock(mCard.getFirmwareVersion()); - if (isCancelled) return; - if( record!=null ) { - byte[] returnedDigest = protocol.run_VerifyCode(record.hashAlg, record.blockIndex, record.blockCount, record.challenge); - mCard.setCodeConfirmed(Arrays.equals(returnedDigest, record.digest)); - }else{ - mCard.setCodeConfirmed(null); - } - mNotifications.onReadProgress(protocol, 90); - } catch (Exception e) { - e.printStackTrace(); - protocol.setError(e); - - } finally { - Log.i(TAG, "[-- Finish verify card --]"); - mNotifications.onReadFinish(protocol); - } - } finally { - mNfcManager.ignoreTag(mIsoDep.getTag()); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - - public void cancel(Boolean AllowInterrupt) { - try { - if (isAlive()) { - isCancelled = true; - join(500); - } - if (isAlive() && AllowInterrupt) { - interrupt(); - mNotifications.onReadCancel(); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/di/Navigator.kt b/app/src/main/java/com/tangem/di/Navigator.kt index 15eb86bb96..bdf47b68b1 100644 --- a/app/src/main/java/com/tangem/di/Navigator.kt +++ b/app/src/main/java/com/tangem/di/Navigator.kt @@ -4,7 +4,7 @@ import android.app.Activity import android.nfc.Tag import android.os.Bundle import com.tangem.domain.wallet.CoinData -import com.tangem.domain.wallet.TangemCard +import com.tangem.tangemcard.data.TangemCard import com.tangem.presentation.activity.EmptyWalletActivity import com.tangem.presentation.activity.LoadedWalletActivity import com.tangem.presentation.activity.MainActivity diff --git a/app/src/main/java/com/tangem/domain/wallet/BTCUtils.java b/app/src/main/java/com/tangem/domain/wallet/BTCUtils.java index c32c5bcad9..973d4ed231 100644 --- a/app/src/main/java/com/tangem/domain/wallet/BTCUtils.java +++ b/app/src/main/java/com/tangem/domain/wallet/BTCUtils.java @@ -11,21 +11,14 @@ import com.tangem.domain.wallet.btc.BitcoinOutputStream; import com.tangem.domain.wallet.btc.BtcData; import com.tangem.util.CryptoUtil; import com.tangem.util.FormatUtil; -import com.tangem.util.Util; +import com.tangem.tangemcard.util.Util; import java.io.ByteArrayOutputStream; import java.io.IOException; -import java.math.BigDecimal; import java.math.BigInteger; -import java.math.RoundingMode; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collection; import java.util.List; -import java.util.Stack; @SuppressWarnings({"WeakerAccess", "TryWithIdenticalCatches", "unused"}) public final class BTCUtils { diff --git a/app/src/main/java/com/tangem/domain/wallet/BalanceValidator.java b/app/src/main/java/com/tangem/domain/wallet/BalanceValidator.java index edb0ea6ddc..e5ada4f494 100644 --- a/app/src/main/java/com/tangem/domain/wallet/BalanceValidator.java +++ b/app/src/main/java/com/tangem/domain/wallet/BalanceValidator.java @@ -1,5 +1,6 @@ package com.tangem.domain.wallet; +import com.tangem.tangemcard.data.TangemCard; import com.tangem.wallet.R; public class BalanceValidator { diff --git a/app/src/main/java/com/tangem/domain/wallet/CoinData.java b/app/src/main/java/com/tangem/domain/wallet/CoinData.java index a96b5dbb74..b64f8f8cb3 100644 --- a/app/src/main/java/com/tangem/domain/wallet/CoinData.java +++ b/app/src/main/java/com/tangem/domain/wallet/CoinData.java @@ -3,8 +3,8 @@ package com.tangem.domain.wallet; import android.os.Bundle; import android.util.Log; -import java.math.BigDecimal; -import java.math.BigInteger; +import com.tangem.tangemcard.data.Blockchain; + import java.util.concurrent.atomic.AtomicInteger; public abstract class CoinData { @@ -12,6 +12,24 @@ public abstract class CoinData { public CoinData() { } + private String wallet; + + public void setWallet(String wallet) { + this.wallet = wallet; + } + + public String getWallet() { + return wallet; + } + + public String getShortWalletString() { + if (wallet.length() < 22) { + return wallet; + } else { + return wallet.substring(0, 10) + "......" + wallet.substring(wallet.length() - 10, wallet.length()); + } + } + public boolean isBalanceReceived() { return balanceReceived; } @@ -23,6 +41,8 @@ public abstract class CoinData { } public void loadFromBundle(Bundle B) { + wallet = B.getString("Wallet"); + if (B.containsKey("balanceReceived")) setBalanceReceived(B.getBoolean("balanceReceived")); validationNodeDescription = B.getString("validationNodeDescription"); @@ -40,6 +60,8 @@ public abstract class CoinData { public void saveToBundle(Bundle B) { try { + B.putString("Wallet", wallet); + if (balanceEqual != null) B.putBoolean("isBalanceEqual", balanceEqual); if (failedBalanceRequestCounter != null) diff --git a/app/src/main/java/com/tangem/domain/wallet/CoinEngine.java b/app/src/main/java/com/tangem/domain/wallet/CoinEngine.java index b13a5c280b..d630430787 100644 --- a/app/src/main/java/com/tangem/domain/wallet/CoinEngine.java +++ b/app/src/main/java/com/tangem/domain/wallet/CoinEngine.java @@ -3,7 +3,7 @@ package com.tangem.domain.wallet; import android.net.Uri; import android.text.InputFilter; -import com.tangem.domain.cardReader.CardProtocol; +import com.tangem.tangemcard.reader.CardProtocol; import java.math.BigDecimal; import java.math.BigInteger; diff --git a/app/src/main/java/com/tangem/domain/wallet/CoinEngineFactory.kt b/app/src/main/java/com/tangem/domain/wallet/CoinEngineFactory.kt index 71e8d249a0..f8b9e47d62 100644 --- a/app/src/main/java/com/tangem/domain/wallet/CoinEngineFactory.kt +++ b/app/src/main/java/com/tangem/domain/wallet/CoinEngineFactory.kt @@ -6,6 +6,7 @@ import com.tangem.domain.wallet.btc.BtcEngine import com.tangem.domain.wallet.eth.EthEngine import com.tangem.domain.wallet.token.TokenEngine import com.tangem.domain.wallet.bch.BtcCashEngine +import com.tangem.tangemcard.data.Blockchain /** * Factory for create specific engine diff --git a/app/src/main/java/com/tangem/domain/wallet/TangemContext.java b/app/src/main/java/com/tangem/domain/wallet/TangemContext.java index cbbcf52164..77d7954639 100644 --- a/app/src/main/java/com/tangem/domain/wallet/TangemContext.java +++ b/app/src/main/java/com/tangem/domain/wallet/TangemContext.java @@ -5,6 +5,8 @@ import android.content.Intent; import android.os.Bundle; import com.tangem.Constant; +import com.tangem.tangemcard.data.Blockchain; +import com.tangem.tangemcard.data.TangemCard; public class TangemContext { @@ -121,4 +123,17 @@ public class TangemContext { if (context != null) return getContext().getResources().getString(stringId); return "context.resources.string[" + stringId + "]"; } + + public void setDenomination(byte[] denomination) { + try { + CoinEngine engine= CoinEngineFactory.INSTANCE.create(getBlockchain()); + CoinEngine.InternalAmount internalAmount=engine.convertToInternalAmount(denomination); + CoinEngine.Amount amount=engine.convertToAmount(internalAmount); + card.setDenomination(denomination,amount.toString()); + } catch (Exception e) { + e.printStackTrace(); + card.setDenomination(denomination,"N/A"); + } + } + } diff --git a/app/src/main/java/com/tangem/domain/wallet/bch/BtcCashEngine.java b/app/src/main/java/com/tangem/domain/wallet/bch/BtcCashEngine.java index a2cf960062..ff5db5ffd8 100644 --- a/app/src/main/java/com/tangem/domain/wallet/bch/BtcCashEngine.java +++ b/app/src/main/java/com/tangem/domain/wallet/bch/BtcCashEngine.java @@ -3,16 +3,16 @@ package com.tangem.domain.wallet.bch; import android.net.Uri; import android.text.InputFilter; -import com.tangem.data.db.PINStorage; -import com.tangem.domain.cardReader.CardProtocol; -import com.tangem.domain.cardReader.TLV; +import com.tangem.tangemcard.data.PINStorage; +import com.tangem.tangemcard.reader.CardProtocol; +import com.tangem.tangemcard.reader.TLV; import com.tangem.domain.wallet.BalanceValidator; -import com.tangem.domain.wallet.Blockchain; +import com.tangem.tangemcard.data.Blockchain; import com.tangem.domain.wallet.CoinEngineFactory; import com.tangem.domain.wallet.btc.BtcData; import com.tangem.domain.wallet.CoinData; import com.tangem.domain.wallet.CoinEngine; -import com.tangem.domain.wallet.TangemCard; +import com.tangem.tangemcard.data.TangemCard; import com.tangem.domain.wallet.TangemContext; import com.tangem.domain.wallet.Transaction; import com.tangem.domain.wallet.UnspentOutputInfo; @@ -20,7 +20,7 @@ import com.tangem.domain.wallet.BTCUtils; import com.tangem.util.CryptoUtil; import com.tangem.util.DecimalDigitsInputFilter; import com.tangem.util.DerEncodingUtil; -import com.tangem.util.Util; +import com.tangem.tangemcard.util.Util; import com.tangem.wallet.R; import java.io.ByteArrayOutputStream; diff --git a/app/src/main/java/com/tangem/domain/wallet/btc/BtcEngine.java b/app/src/main/java/com/tangem/domain/wallet/btc/BtcEngine.java index 3f1bee11e5..fa1e8e134d 100644 --- a/app/src/main/java/com/tangem/domain/wallet/btc/BtcEngine.java +++ b/app/src/main/java/com/tangem/domain/wallet/btc/BtcEngine.java @@ -3,15 +3,15 @@ package com.tangem.domain.wallet.btc; import android.net.Uri; import android.text.InputFilter; -import com.tangem.data.db.PINStorage; -import com.tangem.domain.cardReader.CardProtocol; -import com.tangem.domain.cardReader.TLV; +import com.tangem.tangemcard.data.PINStorage; +import com.tangem.tangemcard.reader.CardProtocol; +import com.tangem.tangemcard.reader.TLV; import com.tangem.domain.wallet.BalanceValidator; import com.tangem.domain.wallet.Base58; -import com.tangem.domain.wallet.Blockchain; +import com.tangem.tangemcard.data.Blockchain; import com.tangem.domain.wallet.CoinData; import com.tangem.domain.wallet.CoinEngine; -import com.tangem.domain.wallet.TangemCard; +import com.tangem.tangemcard.data.TangemCard; import com.tangem.domain.wallet.TangemContext; import com.tangem.domain.wallet.Transaction; import com.tangem.domain.wallet.UnspentOutputInfo; @@ -19,7 +19,7 @@ import com.tangem.domain.wallet.BTCUtils; import com.tangem.util.CryptoUtil; import com.tangem.util.DecimalDigitsInputFilter; import com.tangem.util.DerEncodingUtil; -import com.tangem.util.Util; +import com.tangem.tangemcard.util.Util; import com.tangem.wallet.R; import java.io.ByteArrayOutputStream; diff --git a/app/src/main/java/com/tangem/domain/wallet/eth/EthEngine.java b/app/src/main/java/com/tangem/domain/wallet/eth/EthEngine.java index bcf844f3bb..50ca2af503 100644 --- a/app/src/main/java/com/tangem/domain/wallet/eth/EthEngine.java +++ b/app/src/main/java/com/tangem/domain/wallet/eth/EthEngine.java @@ -4,18 +4,18 @@ import android.net.Uri; import android.text.InputFilter; import android.util.Log; -import com.tangem.data.db.PINStorage; -import com.tangem.domain.cardReader.CardProtocol; -import com.tangem.domain.cardReader.TLV; +import com.tangem.tangemcard.data.PINStorage; +import com.tangem.tangemcard.reader.CardProtocol; +import com.tangem.tangemcard.reader.TLV; import com.tangem.domain.wallet.BalanceValidator; -import com.tangem.domain.wallet.Blockchain; +import com.tangem.tangemcard.data.Blockchain; import com.tangem.domain.wallet.CoinData; import com.tangem.domain.wallet.CoinEngine; import com.tangem.domain.wallet.ECDSASignatureETH; import com.tangem.domain.wallet.EthTransaction; -import com.tangem.domain.wallet.Issuer; +import com.tangem.tangemcard.data.Issuer; import com.tangem.domain.wallet.Keccak256; -import com.tangem.domain.wallet.TangemCard; +import com.tangem.tangemcard.data.TangemCard; import com.tangem.domain.wallet.TangemContext; import com.tangem.domain.wallet.BTCUtils; import com.tangem.util.CryptoUtil; diff --git a/app/src/main/java/com/tangem/domain/wallet/token/TokenEngine.java b/app/src/main/java/com/tangem/domain/wallet/token/TokenEngine.java index a509810107..bf4af6b2c4 100644 --- a/app/src/main/java/com/tangem/domain/wallet/token/TokenEngine.java +++ b/app/src/main/java/com/tangem/domain/wallet/token/TokenEngine.java @@ -5,17 +5,17 @@ import android.text.InputFilter; import android.util.Log; import com.google.common.base.Strings; -import com.tangem.data.db.PINStorage; -import com.tangem.domain.cardReader.CardProtocol; -import com.tangem.domain.cardReader.TLV; +import com.tangem.tangemcard.data.PINStorage; +import com.tangem.tangemcard.reader.CardProtocol; +import com.tangem.tangemcard.reader.TLV; import com.tangem.domain.wallet.BalanceValidator; import com.tangem.domain.wallet.CoinData; import com.tangem.domain.wallet.CoinEngine; import com.tangem.domain.wallet.ECDSASignatureETH; import com.tangem.domain.wallet.EthTransaction; -import com.tangem.domain.wallet.Issuer; +import com.tangem.tangemcard.data.Issuer; import com.tangem.domain.wallet.Keccak256; -import com.tangem.domain.wallet.TangemCard; +import com.tangem.tangemcard.data.TangemCard; import com.tangem.domain.wallet.TangemContext; import com.tangem.domain.wallet.BTCUtils; import com.tangem.util.CryptoUtil; diff --git a/app/src/main/java/com/tangem/presentation/activity/ConfirmPaymentActivity.kt b/app/src/main/java/com/tangem/presentation/activity/ConfirmPaymentActivity.kt index 9b3741d068..1347fb438a 100644 --- a/app/src/main/java/com/tangem/presentation/activity/ConfirmPaymentActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/ConfirmPaymentActivity.kt @@ -18,13 +18,15 @@ import com.tangem.data.network.ServerApiCommon import com.tangem.data.network.ServerApiElectrum import com.tangem.data.network.ServerApiInfura import com.tangem.data.network.model.InfuraResponse -import com.tangem.domain.cardReader.NfcManager +import com.tangem.tangemcard.reader.NfcManager import com.tangem.domain.wallet.* import com.tangem.domain.wallet.btc.BtcData +import com.tangem.tangemcard.data.Blockchain +import com.tangem.tangemcard.data.TangemCard +import com.tangem.tangemcard.util.Util import com.tangem.util.* import com.tangem.wallet.R import kotlinx.android.synthetic.main.activity_confirm_payment.* -import org.json.JSONException import java.io.IOException import java.math.BigDecimal import java.math.BigInteger diff --git a/app/src/main/java/com/tangem/presentation/activity/CreateNewWalletActivity.kt b/app/src/main/java/com/tangem/presentation/activity/CreateNewWalletActivity.kt index f1334508bd..c9314b5c81 100644 --- a/app/src/main/java/com/tangem/presentation/activity/CreateNewWalletActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/CreateNewWalletActivity.kt @@ -12,14 +12,13 @@ import android.support.v7.app.AppCompatActivity import android.view.View import android.widget.ProgressBar import android.widget.Toast -import com.tangem.data.nfc.CreateNewWalletTask -import com.tangem.domain.cardReader.CardProtocol -import com.tangem.domain.cardReader.NfcManager -import com.tangem.domain.wallet.TangemCard +import com.tangem.tangemcard.tasks.CreateNewWalletTask +import com.tangem.tangemcard.reader.CardProtocol +import com.tangem.tangemcard.reader.NfcManager import com.tangem.domain.wallet.TangemContext import com.tangem.presentation.dialog.NoExtendedLengthSupportDialog import com.tangem.presentation.dialog.WaitSecurityDelayDialog -import com.tangem.util.Util +import com.tangem.tangemcard.util.Util import com.tangem.wallet.R import kotlinx.android.synthetic.main.activity_create_new_wallet.* diff --git a/app/src/main/java/com/tangem/presentation/activity/EmptyWalletActivity.kt b/app/src/main/java/com/tangem/presentation/activity/EmptyWalletActivity.kt index e31879e9cc..0ae0e1774b 100644 --- a/app/src/main/java/com/tangem/presentation/activity/EmptyWalletActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/EmptyWalletActivity.kt @@ -13,14 +13,14 @@ import android.support.v7.app.AppCompatActivity import android.text.Html import android.view.View import android.widget.Toast -import com.tangem.data.nfc.VerifyCardTask -import com.tangem.domain.cardReader.CardProtocol -import com.tangem.domain.cardReader.NfcManager -import com.tangem.domain.wallet.TangemCard +import com.tangem.tangemcard.tasks.VerifyCardTask +import com.tangem.tangemcard.reader.CardProtocol +import com.tangem.tangemcard.reader.NfcManager +import com.tangem.tangemcard.data.TangemCard import com.tangem.domain.wallet.TangemContext import com.tangem.presentation.dialog.NoExtendedLengthSupportDialog import com.tangem.presentation.dialog.WaitSecurityDelayDialog -import com.tangem.util.Util +import com.tangem.tangemcard.util.Util import com.tangem.wallet.R import kotlinx.android.synthetic.main.activity_empty_wallet.* diff --git a/app/src/main/java/com/tangem/presentation/activity/MainActivity.kt b/app/src/main/java/com/tangem/presentation/activity/MainActivity.kt index f247ab61f4..6c4fa8f087 100644 --- a/app/src/main/java/com/tangem/presentation/activity/MainActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/MainActivity.kt @@ -26,18 +26,19 @@ import android.widget.Toast import com.scottyab.rootbeer.RootBeer import com.tangem.App import com.tangem.data.Logger -import com.tangem.data.db.PINStorage +import com.tangem.tangemcard.data.PINStorage import com.tangem.data.network.ServerApiCommon -import com.tangem.data.nfc.DeviceNFCAntennaLocation -import com.tangem.data.nfc.ReadCardInfoTask +import com.tangem.tangemcard.data.DeviceNFCAntennaLocation +import com.tangem.tangemcard.tasks.ReadCardInfoTask import com.tangem.di.Navigator -import com.tangem.domain.cardReader.CardProtocol -import com.tangem.domain.cardReader.Firmwares -import com.tangem.domain.cardReader.NfcManager -import com.tangem.domain.wallet.* +import com.tangem.tangemcard.reader.CardProtocol +import com.tangem.tangemcard.data.Firmwares +import com.tangem.tangemcard.reader.NfcManager import com.tangem.presentation.dialog.NoExtendedLengthSupportDialog import com.tangem.presentation.dialog.RootFoundDialog import com.tangem.presentation.dialog.WaitSecurityDelayDialog +import com.tangem.tangemcard.data.Issuer +import com.tangem.tangemcard.data.TangemCard import com.tangem.util.CommonUtil import com.tangem.util.PhoneUtility import com.tangem.wallet.BuildConfig diff --git a/app/src/main/java/com/tangem/presentation/activity/PinRequestActivity.kt b/app/src/main/java/com/tangem/presentation/activity/PinRequestActivity.kt index 820dfb4dae..c021f6a361 100644 --- a/app/src/main/java/com/tangem/presentation/activity/PinRequestActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/PinRequestActivity.kt @@ -20,10 +20,10 @@ import android.util.Log import android.view.View import android.widget.Button import com.tangem.data.fingerprint.StartFingerprintReaderTask -import com.tangem.domain.cardReader.NfcManager +import com.tangem.tangemcard.reader.NfcManager import com.tangem.data.fingerprint.FingerprintHelper -import com.tangem.data.db.PINStorage -import com.tangem.domain.wallet.TangemCard +import com.tangem.tangemcard.data.PINStorage +import com.tangem.tangemcard.data.TangemCard import com.tangem.wallet.R import kotlinx.android.synthetic.main.activity_pin_request.* import kotlinx.android.synthetic.main.layout_pin_buttons.* diff --git a/app/src/main/java/com/tangem/presentation/activity/PinSaveActivity.kt b/app/src/main/java/com/tangem/presentation/activity/PinSaveActivity.kt index de85d4c251..31d8bf1963 100644 --- a/app/src/main/java/com/tangem/presentation/activity/PinSaveActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/PinSaveActivity.kt @@ -21,7 +21,7 @@ import android.widget.Button import android.widget.Toast import com.tangem.data.fingerprint.ConfirmWithFingerprintTask import com.tangem.data.fingerprint.FingerprintHelper -import com.tangem.data.db.PINStorage +import com.tangem.tangemcard.data.PINStorage import com.tangem.wallet.R import kotlinx.android.synthetic.main.activity_pin_save.* import kotlinx.android.synthetic.main.layout_pin_buttons.* diff --git a/app/src/main/java/com/tangem/presentation/activity/PinSwapActivity.kt b/app/src/main/java/com/tangem/presentation/activity/PinSwapActivity.kt index 9b7c749348..e897120940 100644 --- a/app/src/main/java/com/tangem/presentation/activity/PinSwapActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/PinSwapActivity.kt @@ -12,13 +12,13 @@ import android.support.v7.app.AppCompatActivity import android.view.View import android.widget.ProgressBar import android.widget.Toast -import com.tangem.data.nfc.SwapPINTask -import com.tangem.domain.cardReader.CardProtocol -import com.tangem.domain.cardReader.NfcManager -import com.tangem.domain.wallet.TangemCard +import com.tangem.tangemcard.tasks.SwapPINTask +import com.tangem.tangemcard.reader.CardProtocol +import com.tangem.tangemcard.reader.NfcManager +import com.tangem.tangemcard.data.TangemCard import com.tangem.presentation.dialog.NoExtendedLengthSupportDialog import com.tangem.presentation.dialog.WaitSecurityDelayDialog -import com.tangem.util.Util +import com.tangem.tangemcard.util.Util import com.tangem.wallet.R import kotlinx.android.synthetic.main.activity_pin_swap.* diff --git a/app/src/main/java/com/tangem/presentation/activity/PrepareCryptonitOtherApiWithdrawalActivity.kt b/app/src/main/java/com/tangem/presentation/activity/PrepareCryptonitOtherApiWithdrawalActivity.kt index d7f21d2cac..78e8243da7 100644 --- a/app/src/main/java/com/tangem/presentation/activity/PrepareCryptonitOtherApiWithdrawalActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/PrepareCryptonitOtherApiWithdrawalActivity.kt @@ -10,8 +10,8 @@ import android.os.Bundle import android.support.v7.app.AppCompatActivity import android.view.View import com.tangem.data.network.CryptonitOtherApi -import com.tangem.domain.cardReader.NfcManager -import com.tangem.domain.wallet.Blockchain +import com.tangem.tangemcard.reader.NfcManager +import com.tangem.tangemcard.data.Blockchain import com.tangem.domain.wallet.CoinEngineFactory import com.tangem.domain.wallet.TangemContext import com.tangem.wallet.R diff --git a/app/src/main/java/com/tangem/presentation/activity/PrepareCryptonitWithdrawalActivity.kt b/app/src/main/java/com/tangem/presentation/activity/PrepareCryptonitWithdrawalActivity.kt index 167739a07a..76acc0ed4a 100644 --- a/app/src/main/java/com/tangem/presentation/activity/PrepareCryptonitWithdrawalActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/PrepareCryptonitWithdrawalActivity.kt @@ -13,8 +13,8 @@ import android.view.inputmethod.EditorInfo import android.view.inputmethod.InputMethodManager import android.widget.Toast import com.tangem.data.network.Cryptonit -import com.tangem.domain.cardReader.NfcManager -import com.tangem.domain.wallet.Blockchain +import com.tangem.tangemcard.reader.NfcManager +import com.tangem.tangemcard.data.Blockchain import com.tangem.domain.wallet.CoinEngineFactory import com.tangem.domain.wallet.TangemContext import com.tangem.util.DecimalDigitsInputFilter diff --git a/app/src/main/java/com/tangem/presentation/activity/PrepareKrakenWithdrawalActivity.kt b/app/src/main/java/com/tangem/presentation/activity/PrepareKrakenWithdrawalActivity.kt index 1bafe7e5a3..f7e33d6be0 100644 --- a/app/src/main/java/com/tangem/presentation/activity/PrepareKrakenWithdrawalActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/PrepareKrakenWithdrawalActivity.kt @@ -16,8 +16,8 @@ import android.view.inputmethod.EditorInfo import android.view.inputmethod.InputMethodManager import android.widget.Toast import com.tangem.data.network.Kraken -import com.tangem.domain.cardReader.NfcManager -import com.tangem.domain.wallet.Blockchain +import com.tangem.tangemcard.reader.NfcManager +import com.tangem.tangemcard.data.Blockchain import com.tangem.domain.wallet.CoinEngineFactory import com.tangem.domain.wallet.TangemContext import com.tangem.wallet.R diff --git a/app/src/main/java/com/tangem/presentation/activity/PreparePaymentActivity.kt b/app/src/main/java/com/tangem/presentation/activity/PreparePaymentActivity.kt index 987f307e47..80e154f6a2 100644 --- a/app/src/main/java/com/tangem/presentation/activity/PreparePaymentActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/PreparePaymentActivity.kt @@ -12,8 +12,8 @@ import android.text.Html import android.view.View import android.view.inputmethod.EditorInfo import android.view.inputmethod.InputMethodManager -import com.tangem.domain.cardReader.NfcManager -import com.tangem.domain.wallet.Blockchain +import com.tangem.tangemcard.reader.NfcManager +import com.tangem.tangemcard.data.Blockchain import com.tangem.domain.wallet.CoinEngineFactory import com.tangem.domain.wallet.TangemContext import com.tangem.wallet.R diff --git a/app/src/main/java/com/tangem/presentation/activity/PurgeActivity.kt b/app/src/main/java/com/tangem/presentation/activity/PurgeActivity.kt index bc74b7da35..504d474966 100644 --- a/app/src/main/java/com/tangem/presentation/activity/PurgeActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/PurgeActivity.kt @@ -12,14 +12,13 @@ import android.os.Bundle import android.support.v7.app.AppCompatActivity import android.view.View import android.widget.Toast -import com.tangem.data.nfc.PurgeTask -import com.tangem.domain.cardReader.CardProtocol -import com.tangem.domain.cardReader.NfcManager -import com.tangem.domain.wallet.TangemCard +import com.tangem.tangemcard.tasks.PurgeTask +import com.tangem.tangemcard.reader.CardProtocol +import com.tangem.tangemcard.reader.NfcManager import com.tangem.domain.wallet.TangemContext import com.tangem.presentation.dialog.NoExtendedLengthSupportDialog import com.tangem.presentation.dialog.WaitSecurityDelayDialog -import com.tangem.util.Util +import com.tangem.tangemcard.util.Util import com.tangem.wallet.R import kotlinx.android.synthetic.main.activity_purge.* diff --git a/app/src/main/java/com/tangem/presentation/activity/SendTransactionActivity.kt b/app/src/main/java/com/tangem/presentation/activity/SendTransactionActivity.kt index 279c561445..02f390df94 100644 --- a/app/src/main/java/com/tangem/presentation/activity/SendTransactionActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/SendTransactionActivity.kt @@ -11,9 +11,11 @@ import com.tangem.data.network.ElectrumRequest import com.tangem.data.network.ServerApiElectrum import com.tangem.data.network.ServerApiInfura import com.tangem.data.network.model.InfuraResponse -import com.tangem.domain.cardReader.NfcManager +import com.tangem.tangemcard.reader.NfcManager import com.tangem.domain.wallet.* import com.tangem.domain.wallet.eth.EthData +import com.tangem.tangemcard.data.Blockchain +import com.tangem.tangemcard.data.TangemCard import com.tangem.util.UtilHelper import com.tangem.wallet.R import java.io.IOException diff --git a/app/src/main/java/com/tangem/presentation/activity/SignPaymentActivity.kt b/app/src/main/java/com/tangem/presentation/activity/SignPaymentActivity.kt index 52c13893f4..b458346064 100644 --- a/app/src/main/java/com/tangem/presentation/activity/SignPaymentActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/SignPaymentActivity.kt @@ -13,14 +13,14 @@ import android.view.KeyEvent import android.view.View import android.widget.ProgressBar import android.widget.Toast -import com.tangem.data.nfc.SignPaymentTask -import com.tangem.domain.cardReader.CardProtocol -import com.tangem.domain.cardReader.NfcManager +import com.tangem.tangemcard.tasks.SignPaymentTask +import com.tangem.tangemcard.reader.CardProtocol +import com.tangem.tangemcard.reader.NfcManager import com.tangem.domain.wallet.CoinEngine import com.tangem.domain.wallet.TangemContext import com.tangem.presentation.dialog.NoExtendedLengthSupportDialog import com.tangem.presentation.dialog.WaitSecurityDelayDialog -import com.tangem.util.Util +import com.tangem.tangemcard.util.Util import com.tangem.wallet.R import kotlinx.android.synthetic.main.activity_sign_payment.* diff --git a/app/src/main/java/com/tangem/presentation/activity/VerifyCardActivity.kt b/app/src/main/java/com/tangem/presentation/activity/VerifyCardActivity.kt index 402da7169c..4ebb037597 100644 --- a/app/src/main/java/com/tangem/presentation/activity/VerifyCardActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/VerifyCardActivity.kt @@ -8,7 +8,7 @@ import com.tangem.App import com.tangem.Constant import com.tangem.di.Navigator import com.tangem.domain.wallet.CoinData -import com.tangem.domain.wallet.TangemCard +import com.tangem.tangemcard.data.TangemCard import com.tangem.presentation.fragment.VerifyCard import com.tangem.wallet.R import javax.inject.Inject diff --git a/app/src/main/java/com/tangem/presentation/fragment/LoadedWallet.kt b/app/src/main/java/com/tangem/presentation/fragment/LoadedWallet.kt index 7346f13445..d1e34131e9 100644 --- a/app/src/main/java/com/tangem/presentation/fragment/LoadedWallet.kt +++ b/app/src/main/java/com/tangem/presentation/fragment/LoadedWallet.kt @@ -19,17 +19,17 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.Toast -import com.tangem.data.db.LocalStorage -import com.tangem.data.db.PINStorage +import com.tangem.tangemcard.data.LocalStorage +import com.tangem.tangemcard.data.PINStorage import com.tangem.data.network.ElectrumRequest import com.tangem.data.network.ServerApiCommon import com.tangem.data.network.ServerApiElectrum import com.tangem.data.network.ServerApiInfura import com.tangem.data.network.model.CardVerifyAndGetInfo import com.tangem.data.network.model.InfuraResponse -import com.tangem.data.nfc.VerifyCardTask -import com.tangem.domain.cardReader.CardProtocol -import com.tangem.domain.cardReader.NfcManager +import com.tangem.tangemcard.tasks.VerifyCardTask +import com.tangem.tangemcard.reader.CardProtocol +import com.tangem.tangemcard.reader.NfcManager import com.tangem.domain.wallet.* import com.tangem.domain.wallet.bch.BtcCashEngine import com.tangem.domain.wallet.btc.BtcData @@ -41,7 +41,9 @@ import com.tangem.presentation.dialog.NoExtendedLengthSupportDialog import com.tangem.presentation.dialog.PINSwapWarningDialog import com.tangem.presentation.dialog.ShowQRCodeDialog import com.tangem.presentation.dialog.WaitSecurityDelayDialog -import com.tangem.util.Util +import com.tangem.tangemcard.data.Blockchain +import com.tangem.tangemcard.data.TangemCard +import com.tangem.tangemcard.util.Util import com.tangem.util.UtilHelper import com.tangem.wallet.R import kotlinx.android.synthetic.main.fr_loaded_wallet.* diff --git a/app/src/main/java/com/tangem/presentation/fragment/VerifyCard.kt b/app/src/main/java/com/tangem/presentation/fragment/VerifyCard.kt index 618aaee44c..c72785fe82 100644 --- a/app/src/main/java/com/tangem/presentation/fragment/VerifyCard.kt +++ b/app/src/main/java/com/tangem/presentation/fragment/VerifyCard.kt @@ -13,14 +13,16 @@ import android.view.View import android.view.ViewGroup import android.widget.PopupMenu import android.widget.Toast -import com.tangem.data.db.PINStorage -import com.tangem.domain.cardReader.NfcManager +import com.tangem.tangemcard.data.PINStorage +import com.tangem.tangemcard.reader.NfcManager import com.tangem.domain.wallet.* import com.tangem.presentation.activity.CreateNewWalletActivity import com.tangem.presentation.activity.PurgeActivity import com.tangem.presentation.activity.PinRequestActivity import com.tangem.presentation.activity.PinSwapActivity import com.tangem.presentation.dialog.PINSwapWarningDialog +import com.tangem.tangemcard.data.Blockchain +import com.tangem.tangemcard.data.TangemCard import com.tangem.wallet.BuildConfig import com.tangem.wallet.R import kotlinx.android.synthetic.main.fr_verify_card.* diff --git a/app/src/main/java/com/tangem/util/CryptoUtil.java b/app/src/main/java/com/tangem/util/CryptoUtil.java index 40aa618577..495c29175e 100644 --- a/app/src/main/java/com/tangem/util/CryptoUtil.java +++ b/app/src/main/java/com/tangem/util/CryptoUtil.java @@ -3,6 +3,7 @@ package com.tangem.util; import android.util.Log; import com.tangem.domain.wallet.ECDSASignatureETH; +import com.tangem.tangemcard.util.Util; import org.spongycastle.asn1.ASN1EncodableVector; import org.spongycastle.asn1.ASN1Integer; diff --git a/tangemcard/build.gradle b/tangemcard/build.gradle index e5d36fc391..9ed45e79be 100644 --- a/tangemcard/build.gradle +++ b/tangemcard/build.gradle @@ -4,10 +4,8 @@ apply plugin: 'kotlin-android' android { compileSdkVersion 28 - - defaultConfig { - minSdkVersion 16 + minSdkVersion 21 targetSdkVersion 28 versionCode 1 versionName "1.0" @@ -22,6 +20,7 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } + buildToolsVersion '28.0.3' } @@ -29,10 +28,37 @@ dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'com.android.support:appcompat-v7:28.0.0' +// implementation 'com.android.support:design:28.0.0' + implementation 'com.google.code.gson:gson:2.8.5' + implementation 'com.madgag.spongycastle:core:1.56.0.0' + implementation 'com.madgag.spongycastle:prov:1.56.0.0' + implementation 'com.scottyab:rootbeer-lib:0.0.7' + +// implementation 'com.android.support:support-compat:28.0.0' +// implementation 'com.android.support:cardview-v7:28.0.0' +// implementation 'com.android.support:support-v4:28.0.0' +// implementation 'com.android.support.constraint:constraint-layout:1.1.3' +// implementation 'com.google.zxing:core:3.3.3' +// implementation 'com.squareup.retrofit2:converter-gson:2.5.0' +// implementation 'com.squareup.retrofit2:retrofit:2.5.0' +// implementation 'com.squareup.okhttp3:logging-interceptor:3.10.0' +// implementation 'com.skyfishjy.ripplebackground:library:1.0.1' +// implementation 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0' +// implementation 'com.google.dagger:dagger:2.16' + implementation 'org.bitcoinj:bitcoinj-parent:0.14.7' + implementation 'org.bitcoinj:bitcoinj-core:0.14.7' +// implementation 'me.dm7.barcodescanner:zxing:1.9.8' +// implementation 'info.hoang8f:android-segmented:1.0.6' +// implementation 'io.reactivex.rxjava2:rxjava:2.2.0' +// implementation 'io.reactivex.rxjava2:rxandroid:2.0.1' +// implementation 'io.reactivex.rxjava2:rxkotlin:2.3.0' + + testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + } repositories { mavenCentral() diff --git a/tangemcard/src/main/AndroidManifest.xml b/tangemcard/src/main/AndroidManifest.xml index d71fe3bba6..bdc86f9b33 100644 --- a/tangemcard/src/main/AndroidManifest.xml +++ b/tangemcard/src/main/AndroidManifest.xml @@ -1,2 +1,15 @@ + package="com.tangem.tangemcard" > + + + + + + + + + + + + + diff --git a/app/src/main/java/com/tangem/domain/wallet/Blockchain.java b/tangemcard/src/main/java/com/tangem/tangemcard/data/Blockchain.java similarity index 95% rename from app/src/main/java/com/tangem/domain/wallet/Blockchain.java rename to tangemcard/src/main/java/com/tangem/tangemcard/data/Blockchain.java index f7bf3c304b..07e6fe64b4 100644 --- a/app/src/main/java/com/tangem/domain/wallet/Blockchain.java +++ b/tangemcard/src/main/java/com/tangem/tangemcard/data/Blockchain.java @@ -1,7 +1,6 @@ -package com.tangem.domain.wallet; +package com.tangem.tangemcard.data; -import com.google.common.base.Strings; -import com.tangem.wallet.R; +import com.tangem.tangemcard.R; /** * Created by dvol on 06.08.2017. @@ -71,7 +70,7 @@ public enum Blockchain { } public int getImageResource(android.content.Context context, String name) { - if (Strings.isNullOrEmpty(name)) + if (name==null || name.isEmpty()) return getImageResource(); name = name.toLowerCase(); diff --git a/app/src/main/java/com/tangem/data/nfc/DeviceNFCAntennaLocation.kt b/tangemcard/src/main/java/com/tangem/tangemcard/data/DeviceNFCAntennaLocation.kt similarity index 93% rename from app/src/main/java/com/tangem/data/nfc/DeviceNFCAntennaLocation.kt rename to tangemcard/src/main/java/com/tangem/tangemcard/data/DeviceNFCAntennaLocation.kt index 6caaa0a3d8..2034a81144 100644 --- a/app/src/main/java/com/tangem/data/nfc/DeviceNFCAntennaLocation.kt +++ b/tangemcard/src/main/java/com/tangem/tangemcard/data/DeviceNFCAntennaLocation.kt @@ -1,7 +1,6 @@ -package com.tangem.data.nfc +package com.tangem.tangemcard.data import android.os.Build -import com.tangem.tangemcard.nfc.NFCLocation class DeviceNFCAntennaLocation { companion object { diff --git a/app/src/main/java/com/tangem/domain/cardReader/Firmwares.java b/tangemcard/src/main/java/com/tangem/tangemcard/data/Firmwares.java similarity index 96% rename from app/src/main/java/com/tangem/domain/cardReader/Firmwares.java rename to tangemcard/src/main/java/com/tangem/tangemcard/data/Firmwares.java index 251f62e41d..a17114c127 100644 --- a/app/src/main/java/com/tangem/domain/cardReader/Firmwares.java +++ b/tangemcard/src/main/java/com/tangem/tangemcard/data/Firmwares.java @@ -1,11 +1,11 @@ -package com.tangem.domain.cardReader; +package com.tangem.tangemcard.data; import android.content.Context; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.google.gson.JsonParser; -import com.tangem.util.Util; +import com.tangem.tangemcard.util.Util; import java.io.IOException; import java.io.InputStream; diff --git a/app/src/main/java/com/tangem/domain/wallet/Issuer.java b/tangemcard/src/main/java/com/tangem/tangemcard/data/Issuer.java similarity index 95% rename from app/src/main/java/com/tangem/domain/wallet/Issuer.java rename to tangemcard/src/main/java/com/tangem/tangemcard/data/Issuer.java index 778111463b..9682b920c5 100644 --- a/app/src/main/java/com/tangem/domain/wallet/Issuer.java +++ b/tangemcard/src/main/java/com/tangem/tangemcard/data/Issuer.java @@ -1,15 +1,12 @@ -package com.tangem.domain.wallet; +package com.tangem.tangemcard.data; import android.content.Context; -import com.google.common.io.Files; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; -import com.tangem.domain.cardReader.CardCrypto; +import com.tangem.tangemcard.reader.CardCrypto; import com.tangem.util.Util; -import java.io.BufferedReader; -import java.io.File; import java.io.InputStream; import java.io.InputStreamReader; import java.lang.reflect.Type; diff --git a/app/src/main/java/com/tangem/data/db/LocalStorage.kt b/tangemcard/src/main/java/com/tangem/tangemcard/data/LocalStorage.kt similarity index 99% rename from app/src/main/java/com/tangem/data/db/LocalStorage.kt rename to tangemcard/src/main/java/com/tangem/tangemcard/data/LocalStorage.kt index b0df8cadb9..1f5acea861 100644 --- a/app/src/main/java/com/tangem/data/db/LocalStorage.kt +++ b/tangemcard/src/main/java/com/tangem/tangemcard/data/LocalStorage.kt @@ -1,4 +1,4 @@ -package com.tangem.data.db +package com.tangem.tangemcard.data import android.annotation.SuppressLint import android.content.Context @@ -11,7 +11,7 @@ import com.google.gson.Gson import com.google.gson.annotations.SerializedName import com.google.gson.reflect.TypeToken import com.tangem.data.network.model.CardVerifyAndGetInfo -import com.tangem.domain.cardReader.CardCrypto +import com.tangem.tangemcard.reader.CardCrypto import com.tangem.domain.wallet.TangemCard import com.tangem.util.Util import com.tangem.wallet.R diff --git a/app/src/main/java/com/tangem/domain/wallet/Manufacturer.java b/tangemcard/src/main/java/com/tangem/tangemcard/data/Manufacturer.java similarity index 96% rename from app/src/main/java/com/tangem/domain/wallet/Manufacturer.java rename to tangemcard/src/main/java/com/tangem/tangemcard/data/Manufacturer.java index 8c298ce0c6..a3d1081032 100644 --- a/app/src/main/java/com/tangem/domain/wallet/Manufacturer.java +++ b/tangemcard/src/main/java/com/tangem/tangemcard/data/Manufacturer.java @@ -1,4 +1,4 @@ -package com.tangem.domain.wallet; +package com.tangem.tangemcard.data; /** * Created by dvol on 09.08.2017. diff --git a/tangemcard/src/main/java/com/tangem/tangemcard/nfc/NFCLocation.kt b/tangemcard/src/main/java/com/tangem/tangemcard/data/NFCLocation.kt similarity index 99% rename from tangemcard/src/main/java/com/tangem/tangemcard/nfc/NFCLocation.kt rename to tangemcard/src/main/java/com/tangem/tangemcard/data/NFCLocation.kt index ffce1f1988..711f44d3c5 100644 --- a/tangemcard/src/main/java/com/tangem/tangemcard/nfc/NFCLocation.kt +++ b/tangemcard/src/main/java/com/tangem/tangemcard/data/NFCLocation.kt @@ -1,4 +1,4 @@ -package com.tangem.tangemcard.nfc +package com.tangem.tangemcard.data enum class NFCLocation(val codename: String, val fullName: String, val orientation: Int, val x: Int, val y: Int, val z: Int) { model1("sailfish", "Google Pixel", 0, 65, 25, 0), diff --git a/app/src/main/java/com/tangem/data/db/PINStorage.java b/tangemcard/src/main/java/com/tangem/tangemcard/data/PINStorage.java similarity index 98% rename from app/src/main/java/com/tangem/data/db/PINStorage.java rename to tangemcard/src/main/java/com/tangem/tangemcard/data/PINStorage.java index 91a9c3a47a..7ccbc20417 100644 --- a/app/src/main/java/com/tangem/data/db/PINStorage.java +++ b/tangemcard/src/main/java/com/tangem/tangemcard/data/PINStorage.java @@ -1,11 +1,11 @@ -package com.tangem.data.db; +package com.tangem.tangemcard.data; import android.content.Context; import android.content.SharedPreferences; import android.preference.PreferenceManager; import android.util.Base64; -import com.tangem.domain.cardReader.CardProtocol; +import com.tangem.tangemcard.reader.CardProtocol; import java.util.ArrayList; import java.util.List; diff --git a/app/src/main/java/com/tangem/domain/wallet/TangemCard.java b/tangemcard/src/main/java/com/tangem/tangemcard/data/TangemCard.java similarity index 94% rename from app/src/main/java/com/tangem/domain/wallet/TangemCard.java rename to tangemcard/src/main/java/com/tangem/tangemcard/data/TangemCard.java index 54367b1a0d..0b89e855ff 100644 --- a/app/src/main/java/com/tangem/domain/wallet/TangemCard.java +++ b/tangemcard/src/main/java/com/tangem/tangemcard/data/TangemCard.java @@ -1,12 +1,11 @@ -package com.tangem.domain.wallet; +package com.tangem.tangemcard.data; import android.os.Bundle; import android.util.Log; import com.google.common.base.Strings; -import com.tangem.data.db.PINStorage; -import com.tangem.domain.cardReader.SettingsMask; -import com.tangem.util.Util; +import com.tangem.tangemcard.reader.SettingsMask; +import com.tangem.tangemcard.util.Util; import java.util.Date; @@ -21,7 +20,6 @@ public class TangemCard { private byte[] CID; private Status status; - private String wallet; private String UID; private String blockchainID; private Manufacturer manufacturer = Manufacturer.Unknown; @@ -43,7 +41,7 @@ public class TangemCard { } public void setBlockchain(Blockchain blockchain) { - blockchainID=blockchain.getID(); + blockchainID = blockchain.getID(); } public void setBlockchainID(String blockchainID) { @@ -57,7 +55,7 @@ public class TangemCard { String oldName = getBlockchain().getOfficialName(); //String newName = String.format("%s - %s ERC20 token", token, oldName); String newName = token + "
" + oldName + " ERC20 token"; - blockchainName=newName; + blockchainName = newName; } @@ -549,22 +547,6 @@ public class TangemCard { } } - public void setWallet(String wallet) { - this.wallet = wallet; - } - - public String getWallet() { - return wallet; - } - - public String getShortWalletString() { - if (wallet.length() < 22) { - return wallet; - } else { - return wallet.substring(0, 10) + "......" + wallet.substring(wallet.length() - 10, wallet.length()); - } - } - public String getUID() { return UID; } @@ -596,19 +578,6 @@ public class TangemCard { this.DenominationText = denominationText; } - public void setDenomination(byte[] denomination) { - this.Denomination = denomination; - try { - CoinEngine engine= CoinEngineFactory.INSTANCE.create(getBlockchain()); - CoinEngine.InternalAmount internalAmount=engine.convertToInternalAmount(denomination); - CoinEngine.Amount amount=engine.convertToAmount(internalAmount); - this.DenominationText = amount.toString(); - } catch (Exception e) { - e.printStackTrace(); - this.DenominationText = "N/A"; - } - } - public byte[] getDenomination() { return Denomination; } @@ -673,7 +642,6 @@ public class TangemCard { B.putByteArray("CardPublicKey", getCardPublicKey()); B.putInt("SignedHashes", getSignedHashes()); - B.putString("Wallet", wallet); B.putBoolean("WalletPublicKeyValid", isWalletPublicKeyValid()); if (pbWalletKey != null) B.putByteArray("PublicKey", pbWalletKey); @@ -683,6 +651,7 @@ public class TangemCard { if (getOfflineBalance() != null) B.putByteArray("OfflineBalance", getOfflineBalance()); if (getDenomination() != null) B.putByteArray("Denomination", getDenomination()); + if (getDenominationText() != null) B.putString("DenominationText", getDenominationText()); if (getIssuerData() != null && getIssuerDataSignature() != null) { B.putByteArray("IssuerData", getIssuerData()); @@ -725,7 +694,6 @@ public class TangemCard { PIN = B.getString("PIN"); PIN2 = PIN2_Mode.valueOf(B.getString("PIN2")); status = Status.valueOf(B.getString("Status")); - wallet = B.getString("Wallet"); blockchainID = B.getString("Blockchain"); tokensDecimal = B.getInt("TokensDecimal", 18); tokenSymbol = B.getString("TokenSymbol", ""); @@ -765,8 +733,11 @@ public class TangemCard { if (B.containsKey("OfflineBalance")) setOfflineBalance(B.getByteArray("OfflineBalance")); else clearOfflineBalance(); - if (B.containsKey("Denomination")) setDenomination(B.getByteArray("Denomination")); - else clearDenomination(); + if (B.containsKey("Denomination") && B.containsKey("DenominationText")) { + setDenomination(B.getByteArray("Denomination"), B.getString("DenominationText")); + } else if (B.containsKey("Denomination")) { + setDenomination(B.getByteArray("Denomination"), "N/A"); + } else clearDenomination(); if (B.containsKey("IssuerData") && B.containsKey("IssuerDataSignature")) setIssuerData(B.getByteArray("IssuerData"), B.getByteArray("IssuerDataSignature")); diff --git a/app/src/main/java/com/tangem/domain/cardReader/CardCrypto.java b/tangemcard/src/main/java/com/tangem/tangemcard/reader/CardCrypto.java similarity index 98% rename from app/src/main/java/com/tangem/domain/cardReader/CardCrypto.java rename to tangemcard/src/main/java/com/tangem/tangemcard/reader/CardCrypto.java index c9f8b83196..a81ace9df5 100644 --- a/app/src/main/java/com/tangem/domain/cardReader/CardCrypto.java +++ b/tangemcard/src/main/java/com/tangem/tangemcard/reader/CardCrypto.java @@ -1,8 +1,8 @@ -package com.tangem.domain.cardReader; +package com.tangem.tangemcard.reader; import android.util.Log; -import com.tangem.util.Util; +import com.tangem.tangemcard.util.Util; import org.spongycastle.asn1.ASN1EncodableVector; import org.spongycastle.asn1.ASN1Integer; @@ -23,7 +23,6 @@ import java.security.PrivateKey; import java.security.PublicKey; import java.security.Security; import java.security.Signature; -import java.security.spec.InvalidKeySpecException; import java.util.Arrays; import javax.crypto.BadPaddingException; diff --git a/app/src/main/java/com/tangem/domain/cardReader/CardProtocol.java b/tangemcard/src/main/java/com/tangem/tangemcard/reader/CardProtocol.java similarity index 77% rename from app/src/main/java/com/tangem/domain/cardReader/CardProtocol.java rename to tangemcard/src/main/java/com/tangem/tangemcard/reader/CardProtocol.java index 3a2edcc10c..05629ac7dc 100644 --- a/app/src/main/java/com/tangem/domain/cardReader/CardProtocol.java +++ b/tangemcard/src/main/java/com/tangem/tangemcard/reader/CardProtocol.java @@ -1,4 +1,4 @@ -package com.tangem.domain.cardReader; +package com.tangem.tangemcard.reader; import android.content.Context; import android.nfc.Tag; @@ -6,14 +6,12 @@ import android.nfc.TagLostException; import android.nfc.tech.IsoDep; import android.util.Log; -import com.tangem.domain.wallet.CoinEngine; -import com.tangem.domain.wallet.CoinEngineFactory; -import com.tangem.domain.wallet.Issuer; -import com.tangem.data.db.LocalStorage; -import com.tangem.domain.wallet.TangemCard; -import com.tangem.domain.wallet.Manufacturer; -import com.tangem.domain.wallet.TangemContext; -import com.tangem.util.Util; +import com.tangem.tangemcard.data.Issuer; +import com.tangem.tangemcard.data.TangemCard; +import com.tangem.tangemcard.data.Firmwares; +import com.tangem.tangemcard.data.LocalStorage; +import com.tangem.tangemcard.data.Manufacturer; +import com.tangem.tangemcard.util.Util; import org.spongycastle.jce.ECNamedCurveTable; import org.spongycastle.jce.interfaces.ECPublicKey; @@ -29,6 +27,7 @@ import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.security.spec.ECGenParameterSpec; import java.util.Calendar; +import java.util.TreeMap; import javax.crypto.KeyAgreement; @@ -153,34 +152,25 @@ public class CardProtocol { } /** - * Constructor for reading a card for the first time + * Constructor * * @param context - Android context * @param isoDep - Android NFC tag - * @param notifications - UI notification callbacks - */ - public CardProtocol(Context context, IsoDep isoDep, Notifications notifications) { - mContext = context; - mIsoDep = isoDep; - mNotifications = notifications; - mPIN = null; - mCard = new TangemCard(Util.byteArrayToHexString(mIsoDep.getTag().getId())); - } - - /** - * Constructor for subsequent reading of the card - * - * @param context - Android context - * @param isoDep - Android NFC tag - * @param card - TangemCard object, stored data from previous reading + * @param card - TangemCard object, stored data from previous reading or null for reading a card for the first time * @param notifications - UI notification callbacks */ public CardProtocol(Context context, IsoDep isoDep, TangemCard card, Notifications notifications) { mContext = context; mIsoDep = isoDep; mNotifications = notifications; - mPIN = card.getPIN(); - mCard = card; + if (card != null) + { + mPIN = card.getPIN(); + mCard = card; + }else{ + mPIN = null; + mCard = new TangemCard(Util.byteArrayToHexString(mIsoDep.getTag().getId())); + } } /** @@ -502,15 +492,15 @@ public class CardProtocol { return Apdu; } - /** - * Run READ command and parse answer - * {@see run_Read(boolean parseResult) } - * - * @throws Exception if something went wrong - */ - public void run_Read() throws Exception { - run_Read(true); - } +// /** +// * Run READ command and parse answer +// * {@see run_Read(boolean parseResult) } +// * +// * @throws Exception if something went wrong +// */ +// public void run_Read() throws Exception { +// run_Read1(true); +// } /** * Run READ command and parse answer (if specified) @@ -523,10 +513,9 @@ public class CardProtocol { * This command requires only PIN1 parameter while other commands also need CID * See [1] 8, 8.2 * - * @param parseResult - parse answer into TangemCard object or not * @throws Exception if something went wrong */ - public void run_Read(boolean parseResult) throws Exception { + public void run_Read1() throws Exception { CommandApdu rqApdu = StartPrepareCommand(INS.Read); Log.i(logTag, String.format("[%s]\n%s", rqApdu.getCommandName(), rqApdu.getTLVs().getParsedTLVs(" "))); @@ -536,15 +525,6 @@ public class CardProtocol { Log.i(logTag, String.format("OK: [%04X]\n%s", rspApdu.getSW1SW2(), rspApdu.getTLVs().getParsedTLVs(" "))); readResult = rspApdu.getTLVs(); - if (parseResult) { - // After first successful read, data will be parsed into TangemCard object - parseReadResult(); - //TODO: move issuer data out from here - run_ReadWriteIssuerData(); - } else { - //TODO: check that card is the same - } - } else if (rspApdu.isStatus(SW_PIN_ERROR)) { throw new TangemException_InvalidPIN(String.format("FAILED: [%04X] - Possible PIN is invalid!\n", rspApdu.getSW1SW2())); } else { @@ -553,54 +533,6 @@ public class CardProtocol { } - /** - * Executing GET_ISSUER_DATA or WRITE_ISSUER_DATA depending on state in TangemCard object {@see TangemCard.getNeedWriteIssuerData()} - * See [1] 8.7 - * - * @throws Exception if something went wrong - */ - public void run_ReadWriteIssuerData() throws Exception { - TLVList tlvIssuerData; - if (mCard.getNeedWriteIssuerData()) { - run_WriteIssuerData(mCard.getIssuerData(), mCard.getIssuerDataSignature()); - try { - tlvIssuerData = TLVList.fromBytes(mCard.getIssuerData()); - } catch (TLVException e) { - e.printStackTrace(); - tlvIssuerData = null; - } - } else { - try { - tlvIssuerData = run_GetIssuerData(); - } catch (Exception e) { - e.printStackTrace(); - tlvIssuerData = null; - } - } - - // try read offline balance data - if (mCard.getStatus() == TangemCard.Status.Loaded) { - if (tlvIssuerData != null && tlvIssuerData.getTLV(TLV.Tag.TAG_ValidatedBalance) != null && mCard.getMaxSignatures() == mCard.getRemainingSignatures()) { - mCard.setOfflineBalance(tlvIssuerData.getTLV(TLV.Tag.TAG_ValidatedBalance).Value); - } else { - mCard.clearOfflineBalance(); - } - } else { - mCard.clearOfflineBalance(); - } - - // try read denomination - if (tlvIssuerData != null && tlvIssuerData.getTLV(TLV.Tag.TAG_Denomination) != null) { - if (tlvIssuerData.getTLV(TLV.Tag.TAG_DenominationText) != null) { - mCard.setDenomination(tlvIssuerData.getTLV(TLV.Tag.TAG_Denomination).Value, tlvIssuerData.getTLV(TLV.Tag.TAG_DenominationText).getAsString()); - } else { - mCard.setDenomination(tlvIssuerData.getTLV(TLV.Tag.TAG_Denomination).Value); - } - } else { - mCard.clearDenomination(); - } - } - /** * A TLV list containing response of the last READ command */ @@ -615,181 +547,12 @@ public class CardProtocol { return readResult != null; } - /** - * Parse response of the last READ command into TangemCard object - * See [1] 8.2, 5.3, 3.3 - * - * @throws TangemException - if something went wrong - */ - public void parseReadResult() throws TangemException { - // These tags always present in the parsed response: TAG_Status, TAG_CID, TAG_Manufacture_ID, TAG_Health, TAG_Firmware - TLV tlvStatus = readResult.getTLV(TLV.Tag.TAG_Status); - mCard.setStatus(TangemCard.Status.fromCode(Util.byteArrayToInt(tlvStatus.Value))); - TLV tlvCID = readResult.getTLV(TLV.Tag.TAG_CardID); - mCard.setCID(tlvCID.Value); - mCard.setManufacturer(Manufacturer.FindManufacturer(readResult.getTLV(TLV.Tag.TAG_Manufacture_ID).getAsString()), true); - - // Support of legacy Firmware - if (readResult.getTLV(TLV.Tag.TAG_Firmware) != null) { - mCard.setFirmwareVersion(readResult.getTLV(TLV.Tag.TAG_Firmware).getAsString()); - } - mCard.setHealth(readResult.getTLV(TLV.Tag.TAG_Health).getAsInt()); - - // If the card was previously personalized then parse personalized card data - card public key, blockchain data and other settings - if (mCard.getStatus() != TangemCard.Status.NotPersonalized) { - try { - TLV tlvCardPubkicKey = readResult.getTLV(TLV.Tag.TAG_CardPublicKey); - if (tlvCardPubkicKey == null) - throw new TangemException("Invalid answer format"); - - mCard.setCardPublicKey(tlvCardPubkicKey.Value); - - TLVList tlvCardData = TLVList.fromBytes(readResult.getTLV(TLV.Tag.TAG_CardData).Value); - - mCard.setBatch(tlvCardData.getTLV(TLV.Tag.TAG_Batch).getAsHexString()); - - TLV tokenSymbol = tlvCardData.getTLV(TLV.Tag.TAG_Token_Symbol); - TLV contractAddress = tlvCardData.getTLV(TLV.Tag.TAG_Token_Contract_Address); - TLV tokens_decimal = tlvCardData.getTLV(TLV.Tag.TAG_Token_Decimal); - - if (tokenSymbol != null) - mCard.setTokenSymbol(tokenSymbol.getAsString()); - - if (contractAddress != null) - mCard.setContractAddress(contractAddress.getAsString()); - - if (tokens_decimal != null) - mCard.setTokensDecimal(tokens_decimal.getAsInt()); - - byte[] tlvPersonalizationDT = tlvCardData.getTLV(TLV.Tag.TAG_ManufactureDateTime).Value; - int year = (tlvPersonalizationDT[0] & 0xFF) << 8 | (tlvPersonalizationDT[1] & 0xFF); - int month = tlvPersonalizationDT[2] - 1; - int day = tlvPersonalizationDT[3]; - Calendar cd = Calendar.getInstance(); - cd.set(year, month, day, 0, 0, 0); - mCard.setPersonalizationDateTime(cd.getTime()); - try { - // Support of legacy Firmware - if (mCard.getFirmwareVersion() == null) { - mCard.setFirmwareVersion(tlvCardData.getTLV(TLV.Tag.TAG_Firmware).getAsString()); - } - } catch (Exception e) { - e.printStackTrace(); - Log.e(logTag, "Cannot get firmware version"); - mCard.setFirmwareVersion("0.00"); - } - - try { - if (mCard.getFirmwareVersion().compareTo("1.05") < 0) { - // In FW ver 1.05, the issuer has one key pair used as both DataKey and TransactionKey, see [1] 3.3.1 and [1] 3.3.2 - mCard.setIssuer(tlvCardData.getTLV(TLV.Tag.TAG_Issuer_ID).getAsString(), readResult.getTLV(TLV.Tag.TAG_Issuer_Transaction_PublicKey).Value); - } else { - // In newer FW versions, the issuer has two different key pairs - DataKey and TransactionKey, see [1] 3.3.1 and [1] 3.3.2 - mCard.setIssuer(tlvCardData.getTLV(TLV.Tag.TAG_Issuer_ID).getAsString(), readResult.getTLV(TLV.Tag.TAG_Issuer_Data_PublicKey).Value); - } - } catch (Exception e) { - e.printStackTrace(); - Log.e(logTag, "Cannot get issuer, try a version for older cards"); - try { - // for very very old cards Issuer key can be stored in different TLV tag - mCard.setIssuer(tlvCardData.getTLV(TLV.Tag.TAG_Issuer_ID).getAsString(), readResult.getTLV(TLV.Tag.TAG_Issuer_Transaction_PublicKey).Value); - } catch (Exception ee) { - ee.printStackTrace(); - Log.e(logTag, "Cannot get issuer"); - mCard.setIssuer(Issuer.Unknown().getID(), null); - } - } - - // Overriding of missing card data, e.g. for cards with unknown ERC20 contract data - // This method must be called after the issuer data is defined because newly written data is verified by issuer data key - try { - // Hardcoded for some known batches, or, for other batches, received from Tangem server and stored in local storage - if (mCard.getBatch().equals("0017")) { - mCard.setContractAddress("0x9Eef75bA8e81340da9D8d1fd06B2f313DB88839c"); - } else if (mCard.getBatch().equals("0019")) { - mCard.setContractAddress("0x0c056b0cda0763cc14b8b2d6c02465c91e33ec72"); - } else { - LocalStorage localStorage = new LocalStorage(mContext); - localStorage.applySubstitution(mCard); - } - } catch (Exception e) { - Log.e(logTag, "Can't apply card data substitution"); - e.printStackTrace(); - } - - mCard.setBlockchainIDFromCard(tlvCardData.getTLV(TLV.Tag.TAG_Blockchain_ID).getAsString()); - - try { - mCard.setSettingsMask(readResult.getTagAsInt(TLV.Tag.TAG_SettingsMask)); - } catch (Exception e) { - e.printStackTrace(); - Log.e(logTag, "Can't get settings mask"); - } - - if (readResult.getTLV(TLV.Tag.TAG_PauseBeforePIN2) != null) { - mCard.setPauseBeforePIN2(10 * readResult.getTagAsInt(TLV.Tag.TAG_PauseBeforePIN2)); - } - - try { - mCard.setSigningMethod(readResult.getTagAsInt(TLV.Tag.TAG_SigningMethod)); - } catch (Exception e) { - e.printStackTrace(); - Log.e(logTag, "Can't get signing method"); - mCard.setSigningMethod(0); - } - - try { - mCard.setMaxSignatures(readResult.getTagAsInt(TLV.Tag.TAG_MaxSignatures)); - } catch (Exception e) { - e.printStackTrace(); - Log.e(logTag, "Can't get max signatures"); - } - - } catch (Exception e) { - e.printStackTrace(); - throw new TangemException("Can't parse card data"); - } - } - - - // Parse additional parameters for Loaded cards: wallet public key, remaining signatures, etc - if (mCard.getStatus() == TangemCard.Status.Loaded) { - - TLV tlvPublicKey = readResult.getTLV(TLV.Tag.TAG_Wallet_PublicKey); - - ECNamedCurveParameterSpec spec = ECNamedCurveTable.getParameterSpec("secp256k1"); - ECPoint p1 = spec.getCurve().decodePoint(tlvPublicKey.Value); - - byte pkUncompressed[] = p1.getEncoded(false); - - byte pkCompresses[] = p1.getEncoded(true); - mCard.setWalletPublicKey(pkUncompressed); - mCard.setWalletPublicKeyRar(pkCompresses); - - TangemContext ctx = new TangemContext(mCard); - try { - // TODO - store in mCard only public key, not wallet address, move wallet address to coinData - CoinEngine engineCoin = CoinEngineFactory.INSTANCE.create(ctx); - if (engineCoin == null) throw new Exception("Can't create CoinEngine!"); - String wallet = engineCoin.calculateAddress(pkUncompressed); - mCard.setWallet(wallet); - } catch (Exception e) { - e.printStackTrace(); - throw new TangemException("Can't define wallet address"); - } - //mCard.setWallet(Blockchain.calculateWalletAddress(mCard, pkUncompressed)); - - mCard.setRemainingSignatures(readResult.getTagAsInt(TLV.Tag.TAG_RemainingSignatures)); - - if (readResult != null && readResult.getTLV(TLV.Tag.TAG_SignedHashes) != null) { - mCard.setSignedHashes(readResult.getTagAsInt(TLV.Tag.TAG_SignedHashes)); - } - - } else { - mCard.setWallet("N/A"); - } + public TLVList getReadResult() + { + return readResult; } + /** * VERIFY_CARD command and verify card's signature * By using standard challenge-response scheme, the card proves @@ -801,7 +564,7 @@ public class CardProtocol { */ public TLVList run_VerifyCard() throws Exception { if (mCard.getCardPublicKey() == null || readResult == null) { - run_Read(); + throw new TangemException("Before run_VerifyCard execute run_Read card first!"); } if (mCard.getStatus() == TangemCard.Status.NotPersonalized) { getCard().setManufacturer(Manufacturer.Unknown, false); @@ -869,7 +632,7 @@ public class CardProtocol { * @throws Exception - if something went wrong */ public void run_CreateWallet(String PIN2) throws Exception { - if (readResult == null) run_Read(); + if (readResult == null) throw new TangemException("Before run_VerifyCard execute run_Read card first!"); CommandApdu rqApdu = StartPrepareCommand(INS.CreateWallet); rqApdu.addTLV(TLV.Tag.TAG_PIN2, Util.calculateSHA256(PIN2)); Log.i(logTag, String.format("[%s]\n%s", rqApdu.getCommandName(), rqApdu.getTLVs().getParsedTLVs(" "))); @@ -930,7 +693,7 @@ public class CardProtocol { */ public void run_CheckWalletWithSignatureVerify() throws Exception { if (mCard.getCardPublicKey() == null || readResult == null) { - run_Read(); + throw new TangemException("Before run_VerifyCard execute run_Read card first!"); } if (mCard.getStatus() == TangemCard.Status.NotPersonalized) { getCard().setManufacturer(Manufacturer.Unknown, false); @@ -1043,29 +806,6 @@ public class CardProtocol { } } - /** - * Verify if default PIN2 is set on the card and enable UseDefaultPIN2 flag {@link TangemCard} - * Works in firmware 1.12 and later, for older version UseDefaultPIN2 is always null - * This function NEVER triggers security delay - * - * @throws Exception - if something went wrong - */ - public void run_CheckPIN2isDefault() throws Exception { - // can obtain SetPIN(to default) answer without security delay - try check if PIN2 is default with card request - if (mCard.isFirmwareNewer("1.19") || (mCard.isFirmwareNewer("1.12") && (mCard.getPauseBeforePIN2() == 0 || mCard.useSmartSecurityDelay()))) { - try { - run_SetPIN(DefaultPIN2, mPIN, DefaultPIN2, true); - mCard.setUseDefaultPIN2(true); - } catch (TangemException_NeedPause e) { - mCard.setUseDefaultPIN2(null); - } catch (TangemException_InvalidPIN e) { - mCard.setUseDefaultPIN2(false); - } - } else { - mCard.setUseDefaultPIN2(null); - } - } - /** * SIGN command to sign hashes - SigningMethod=0,2,4 (see {@link TangemCard.SigningMethod}) * See [1] 8.6 @@ -1177,7 +917,7 @@ public class CardProtocol { * @throws Exception - if something went wrong */ public byte[] run_VerifyCode(String hashAlgID, int codePageAddress, int codePageCount, byte[] challenge) throws Exception { - if (readResult == null) run_Read(); + if (readResult == null) throw new TangemException("Before run_VerifyCard execute run_Read card first!"); CommandApdu rqApdu = StartPrepareCommand(INS.VerifyCode); rqApdu.addTLV(TLV.Tag.TAG_HashAlgID, hashAlgID.getBytes("US-ASCII")); rqApdu.addTLV_U32(TLV.Tag.TAG_CodePageAddress, codePageAddress); @@ -1212,7 +952,7 @@ public class CardProtocol { * @throws Exception - if something went wrong */ private void run_ValidateCard(String PIN2) throws Exception { - if (readResult == null) run_Read(); + if (readResult == null) throw new TangemException("Before run_VerifyCard execute run_Read card first!"); CommandApdu rqApdu = StartPrepareCommand(INS.ValidateCard); rqApdu.addTLV(TLV.Tag.TAG_PIN2, Util.calculateSHA256(PIN2)); @@ -1244,8 +984,8 @@ public class CardProtocol { * @param issuerSignature - signature of issuerData with IssuerDataKey * @throws Exception - if something went wrong */ - private void run_WriteIssuerData(byte[] issuerData, byte[] issuerSignature) throws Exception { - run_Read(); + public void run_WriteIssuerData(byte[] issuerData, byte[] issuerSignature) throws Exception { + if( readResult==null ) throw new TangemException("Before run_VerifyCard execute run_Read card first!"); CommandApdu rqApdu = StartPrepareCommand(INS.WriteIssuerData); rqApdu.addTLV(TLV.Tag.TAG_Issuer_Data, issuerData); @@ -1269,7 +1009,7 @@ public class CardProtocol { * @return TLVList with issuerData (if success read and verify) * @throws Exception - if something went wrong */ - private TLVList run_GetIssuerData() throws Exception { + public TLVList run_GetIssuerData() throws Exception { CommandApdu rqApdu = StartPrepareCommand(INS.GetIssuerData); Log.i(logTag, String.format("[%s]\n%s", rqApdu.getCommandName(), rqApdu.getTLVs().getParsedTLVs(" "))); @@ -1342,4 +1082,5 @@ public class CardProtocol { } while (true); } + } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/domain/cardReader/CommandApdu.java b/tangemcard/src/main/java/com/tangem/tangemcard/reader/CommandApdu.java similarity index 98% rename from app/src/main/java/com/tangem/domain/cardReader/CommandApdu.java rename to tangemcard/src/main/java/com/tangem/tangemcard/reader/CommandApdu.java index 0248d65f16..9706a68a35 100644 --- a/app/src/main/java/com/tangem/domain/cardReader/CommandApdu.java +++ b/tangemcard/src/main/java/com/tangem/tangemcard/reader/CommandApdu.java @@ -1,6 +1,6 @@ -package com.tangem.domain.cardReader; +package com.tangem.tangemcard.reader; -import com.tangem.util.Util; +import com.tangem.tangemcard.util.Util; import java.io.ByteArrayOutputStream; import java.io.IOException; diff --git a/app/src/main/java/com/tangem/domain/cardReader/INS.java b/tangemcard/src/main/java/com/tangem/tangemcard/reader/INS.java similarity index 94% rename from app/src/main/java/com/tangem/domain/cardReader/INS.java rename to tangemcard/src/main/java/com/tangem/tangemcard/reader/INS.java index 0005be0b95..1fb6be61c1 100644 --- a/app/src/main/java/com/tangem/domain/cardReader/INS.java +++ b/tangemcard/src/main/java/com/tangem/tangemcard/reader/INS.java @@ -1,4 +1,4 @@ -package com.tangem.domain.cardReader; +package com.tangem.tangemcard.reader; /** * Created by dvol on 07.03.2018. diff --git a/app/src/main/java/com/tangem/domain/cardReader/NfcManager.java b/tangemcard/src/main/java/com/tangem/tangemcard/reader/NfcManager.java similarity index 99% rename from app/src/main/java/com/tangem/domain/cardReader/NfcManager.java rename to tangemcard/src/main/java/com/tangem/tangemcard/reader/NfcManager.java index b60eaf3a5b..868b9569c9 100644 --- a/app/src/main/java/com/tangem/domain/cardReader/NfcManager.java +++ b/tangemcard/src/main/java/com/tangem/tangemcard/reader/NfcManager.java @@ -1,4 +1,4 @@ -package com.tangem.domain.cardReader; +package com.tangem.tangemcard.reader; import android.Manifest; import android.annotation.TargetApi; diff --git a/app/src/main/java/com/tangem/domain/cardReader/PBKDF2.java b/tangemcard/src/main/java/com/tangem/tangemcard/reader/PBKDF2.java similarity index 98% rename from app/src/main/java/com/tangem/domain/cardReader/PBKDF2.java rename to tangemcard/src/main/java/com/tangem/tangemcard/reader/PBKDF2.java index 700648c6dd..873b76ca6e 100644 --- a/app/src/main/java/com/tangem/domain/cardReader/PBKDF2.java +++ b/tangemcard/src/main/java/com/tangem/tangemcard/reader/PBKDF2.java @@ -1,5 +1,5 @@ -package com.tangem.domain.cardReader; +package com.tangem.tangemcard.reader; import org.spongycastle.crypto.CipherParameters; import org.spongycastle.crypto.digests.SHA256Digest; diff --git a/app/src/main/java/com/tangem/domain/cardReader/ResponseApdu.java b/tangemcard/src/main/java/com/tangem/tangemcard/reader/ResponseApdu.java similarity index 99% rename from app/src/main/java/com/tangem/domain/cardReader/ResponseApdu.java rename to tangemcard/src/main/java/com/tangem/tangemcard/reader/ResponseApdu.java index c4bddff265..1c4c3e367c 100644 --- a/app/src/main/java/com/tangem/domain/cardReader/ResponseApdu.java +++ b/tangemcard/src/main/java/com/tangem/tangemcard/reader/ResponseApdu.java @@ -1,4 +1,4 @@ -package com.tangem.domain.cardReader; +package com.tangem.tangemcard.reader; import com.tangem.util.Util; diff --git a/app/src/main/java/com/tangem/domain/cardReader/SW.java b/tangemcard/src/main/java/com/tangem/tangemcard/reader/SW.java similarity index 97% rename from app/src/main/java/com/tangem/domain/cardReader/SW.java rename to tangemcard/src/main/java/com/tangem/tangemcard/reader/SW.java index cbc25c239a..cd3ef7ee05 100644 --- a/app/src/main/java/com/tangem/domain/cardReader/SW.java +++ b/tangemcard/src/main/java/com/tangem/tangemcard/reader/SW.java @@ -1,4 +1,4 @@ -package com.tangem.domain.cardReader; +package com.tangem.tangemcard.reader; /** * Created by dvol on 07.03.2018. diff --git a/app/src/main/java/com/tangem/domain/cardReader/SettingsMask.java b/tangemcard/src/main/java/com/tangem/tangemcard/reader/SettingsMask.java similarity index 95% rename from app/src/main/java/com/tangem/domain/cardReader/SettingsMask.java rename to tangemcard/src/main/java/com/tangem/tangemcard/reader/SettingsMask.java index 2472e06a33..f12243a1b1 100644 --- a/app/src/main/java/com/tangem/domain/cardReader/SettingsMask.java +++ b/tangemcard/src/main/java/com/tangem/tangemcard/reader/SettingsMask.java @@ -1,4 +1,4 @@ -package com.tangem.domain.cardReader; +package com.tangem.tangemcard.reader; /** * Created by dvol on 07.03.2018. diff --git a/app/src/main/java/com/tangem/domain/cardReader/TLV.java b/tangemcard/src/main/java/com/tangem/tangemcard/reader/TLV.java similarity index 99% rename from app/src/main/java/com/tangem/domain/cardReader/TLV.java rename to tangemcard/src/main/java/com/tangem/tangemcard/reader/TLV.java index a94a7856e7..f38733b4d1 100644 --- a/app/src/main/java/com/tangem/domain/cardReader/TLV.java +++ b/tangemcard/src/main/java/com/tangem/tangemcard/reader/TLV.java @@ -1,4 +1,4 @@ -package com.tangem.domain.cardReader; +package com.tangem.tangemcard.reader; import com.tangem.util.Util; diff --git a/app/src/main/java/com/tangem/domain/cardReader/TLVException.java b/tangemcard/src/main/java/com/tangem/tangemcard/reader/TLVException.java similarity index 90% rename from app/src/main/java/com/tangem/domain/cardReader/TLVException.java rename to tangemcard/src/main/java/com/tangem/tangemcard/reader/TLVException.java index 6d69e73855..9b1a4eb3c8 100644 --- a/app/src/main/java/com/tangem/domain/cardReader/TLVException.java +++ b/tangemcard/src/main/java/com/tangem/tangemcard/reader/TLVException.java @@ -1,4 +1,4 @@ -package com.tangem.domain.cardReader; +package com.tangem.tangemcard.reader; public class TLVException extends Exception { diff --git a/app/src/main/java/com/tangem/domain/cardReader/TLVList.java b/tangemcard/src/main/java/com/tangem/tangemcard/reader/TLVList.java similarity index 98% rename from app/src/main/java/com/tangem/domain/cardReader/TLVList.java rename to tangemcard/src/main/java/com/tangem/tangemcard/reader/TLVList.java index fd320ac41a..11c3e2597d 100644 --- a/app/src/main/java/com/tangem/domain/cardReader/TLVList.java +++ b/tangemcard/src/main/java/com/tangem/tangemcard/reader/TLVList.java @@ -1,4 +1,4 @@ -package com.tangem.domain.cardReader; +package com.tangem.tangemcard.reader; /** * Created by dvol on 23.06.2017. diff --git a/app/src/main/java/com/tangem/data/nfc/CreateNewWalletTask.java b/tangemcard/src/main/java/com/tangem/tangemcard/tasks/CreateNewWalletTask.java similarity index 93% rename from app/src/main/java/com/tangem/data/nfc/CreateNewWalletTask.java rename to tangemcard/src/main/java/com/tangem/tangemcard/tasks/CreateNewWalletTask.java index bdce5f6241..6de9679b36 100644 --- a/app/src/main/java/com/tangem/data/nfc/CreateNewWalletTask.java +++ b/tangemcard/src/main/java/com/tangem/tangemcard/tasks/CreateNewWalletTask.java @@ -1,13 +1,13 @@ -package com.tangem.data.nfc; +package com.tangem.tangemcard.tasks; import android.content.Context; import android.nfc.tech.IsoDep; import android.util.Log; -import com.tangem.domain.cardReader.CardProtocol; -import com.tangem.domain.cardReader.NfcManager; -import com.tangem.data.db.PINStorage; -import com.tangem.domain.wallet.TangemCard; +import com.tangem.tangemcard.reader.CardProtocol; +import com.tangem.tangemcard.reader.NfcManager; +import com.tangem.tangemcard.data.PINStorage; +import com.tangem.tangemcard.data.TangemCard; public class CreateNewWalletTask extends Thread { public static final String TAG = CreateNewWalletTask.class.getSimpleName(); diff --git a/tangemcard/src/main/java/com/tangem/tangemcard/tasks/CustomReadCardTask.java b/tangemcard/src/main/java/com/tangem/tangemcard/tasks/CustomReadCardTask.java new file mode 100644 index 0000000000..4036851ce0 --- /dev/null +++ b/tangemcard/src/main/java/com/tangem/tangemcard/tasks/CustomReadCardTask.java @@ -0,0 +1,454 @@ +package com.tangem.tangemcard.tasks; + +import android.content.Context; +import android.nfc.tech.IsoDep; +import android.util.Log; + +import com.tangem.tangemcard.data.Issuer; +import com.tangem.tangemcard.data.LocalStorage; +import com.tangem.tangemcard.data.Manufacturer; +import com.tangem.tangemcard.data.PINStorage; +import com.tangem.tangemcard.data.TangemCard; +import com.tangem.tangemcard.reader.CardProtocol; +import com.tangem.tangemcard.reader.NfcManager; +import com.tangem.tangemcard.reader.TLV; +import com.tangem.tangemcard.reader.TLVException; +import com.tangem.tangemcard.reader.TLVList; +import com.tangem.tangemcard.util.Util; + +import org.spongycastle.jce.ECNamedCurveTable; +import org.spongycastle.jce.spec.ECNamedCurveParameterSpec; +import org.spongycastle.math.ec.ECPoint; + +import java.util.ArrayList; +import java.util.Calendar; + +/** + * Base class for card communication task + */ +public class CustomReadCardTask extends Thread { + public static final String TAG = CustomReadCardTask.class.getSimpleName(); + + protected IsoDep mIsoDep; + protected CardProtocol.Notifications mNotifications; + protected boolean isCancelled = false; + protected Context mContext; + protected NfcManager mNfcManager; + protected TangemCard mCard ; + CardProtocol protocol; + + // this fields are static to optimize process when need enter pin and scan card again + private static ArrayList lastRead_UnsuccessfullPINs = new ArrayList<>(); + private static TangemCard.EncryptionMode lastRead_Encryption = null; + private static String lastRead_UID; + + public static void resetLastReadInfo() { + lastRead_UID = ""; + lastRead_Encryption = null; + lastRead_UnsuccessfullPINs.clear(); + } + + public CustomReadCardTask(Context context, TangemCard card, NfcManager nfcManager, IsoDep isoDep, CardProtocol.Notifications notifications) { + mContext = context; + mIsoDep = isoDep; + mNotifications = notifications; + mNfcManager = nfcManager; + mCard=card; + } + + /** + * Executing GET_ISSUER_DATA or WRITE_ISSUER_DATA depending on state in TangemCard object {@see TangemCard.getNeedWriteIssuerData()} + * See [1] 8.7 + * Usually this function must be called if run_Task() of descendants + * + * @throws Exception if something went wrong + */ + protected void run_ReadOrWriteIssuerData() throws Exception { + TLVList tlvIssuerData; + if (mCard.getNeedWriteIssuerData()) { + protocol.run_WriteIssuerData(mCard.getIssuerData(), mCard.getIssuerDataSignature()); + try { + tlvIssuerData = TLVList.fromBytes(mCard.getIssuerData()); + } catch (TLVException e) { + e.printStackTrace(); + tlvIssuerData = null; + } + } else { + try { + tlvIssuerData = protocol.run_GetIssuerData(); + } catch (Exception e) { + e.printStackTrace(); + tlvIssuerData = null; + } + } + + // try read offline balance data + if (mCard.getStatus() == TangemCard.Status.Loaded) { + if (tlvIssuerData != null && tlvIssuerData.getTLV(TLV.Tag.TAG_ValidatedBalance) != null && mCard.getMaxSignatures() == mCard.getRemainingSignatures()) { + mCard.setOfflineBalance(tlvIssuerData.getTLV(TLV.Tag.TAG_ValidatedBalance).Value); + } else { + mCard.clearOfflineBalance(); + } + } else { + mCard.clearOfflineBalance(); + } + + // try read denomination + if (tlvIssuerData != null && tlvIssuerData.getTLV(TLV.Tag.TAG_Denomination) != null) { + if (tlvIssuerData.getTLV(TLV.Tag.TAG_DenominationText) != null) { + mCard.setDenomination(tlvIssuerData.getTLV(TLV.Tag.TAG_Denomination).Value, tlvIssuerData.getTLV(TLV.Tag.TAG_DenominationText).getAsString()); + } else { + mCard.setDenomination(tlvIssuerData.getTLV(TLV.Tag.TAG_Denomination).Value, null); + } + } else { + mCard.clearDenomination(); + } + } + + /** + * Parse response of the last READ command into TangemCard object + * See [1] 8.2, 5.3, 3.3 + * + * @throws CardProtocol.TangemException - if something went wrong + */ + public void parseReadResult() throws CardProtocol.TangemException { + // These tags always present in the parsed response: TAG_Status, TAG_CID, TAG_Manufacture_ID, TAG_Health, TAG_Firmware + TLV tlvStatus = protocol.getReadResult().getTLV(TLV.Tag.TAG_Status); + mCard.setStatus(TangemCard.Status.fromCode(Util.byteArrayToInt(tlvStatus.Value))); + TLV tlvCID = protocol.getReadResult().getTLV(TLV.Tag.TAG_CardID); + mCard.setCID(tlvCID.Value); + mCard.setManufacturer(Manufacturer.FindManufacturer(protocol.getReadResult().getTLV(TLV.Tag.TAG_Manufacture_ID).getAsString()), true); + + // Support of legacy Firmware + if (protocol.getReadResult().getTLV(TLV.Tag.TAG_Firmware) != null) { + mCard.setFirmwareVersion(protocol.getReadResult().getTLV(TLV.Tag.TAG_Firmware).getAsString()); + } + mCard.setHealth(protocol.getReadResult().getTLV(TLV.Tag.TAG_Health).getAsInt()); + + // If the card was previously personalized then parse personalized card data - card public key, blockchain data and other settings + if (mCard.getStatus() != TangemCard.Status.NotPersonalized) { + try { + TLV tlvCardPubkicKey = protocol.getReadResult().getTLV(TLV.Tag.TAG_CardPublicKey); + if (tlvCardPubkicKey == null) + throw new CardProtocol.TangemException("Invalid answer format"); + + mCard.setCardPublicKey(tlvCardPubkicKey.Value); + + TLVList tlvCardData = TLVList.fromBytes(protocol.getReadResult().getTLV(TLV.Tag.TAG_CardData).Value); + + mCard.setBatch(tlvCardData.getTLV(TLV.Tag.TAG_Batch).getAsHexString()); + + TLV tokenSymbol = tlvCardData.getTLV(TLV.Tag.TAG_Token_Symbol); + TLV contractAddress = tlvCardData.getTLV(TLV.Tag.TAG_Token_Contract_Address); + TLV tokens_decimal = tlvCardData.getTLV(TLV.Tag.TAG_Token_Decimal); + + if (tokenSymbol != null) + mCard.setTokenSymbol(tokenSymbol.getAsString()); + + if (contractAddress != null) + mCard.setContractAddress(contractAddress.getAsString()); + + if (tokens_decimal != null) + mCard.setTokensDecimal(tokens_decimal.getAsInt()); + + byte[] tlvPersonalizationDT = tlvCardData.getTLV(TLV.Tag.TAG_ManufactureDateTime).Value; + int year = (tlvPersonalizationDT[0] & 0xFF) << 8 | (tlvPersonalizationDT[1] & 0xFF); + int month = tlvPersonalizationDT[2] - 1; + int day = tlvPersonalizationDT[3]; + Calendar cd = Calendar.getInstance(); + cd.set(year, month, day, 0, 0, 0); + mCard.setPersonalizationDateTime(cd.getTime()); + try { + // Support of legacy Firmware + if (mCard.getFirmwareVersion() == null) { + mCard.setFirmwareVersion(tlvCardData.getTLV(TLV.Tag.TAG_Firmware).getAsString()); + } + } catch (Exception e) { + e.printStackTrace(); + Log.e(TAG, "Cannot get firmware version"); + mCard.setFirmwareVersion("0.00"); + } + + try { + if (mCard.getFirmwareVersion().compareTo("1.05") < 0) { + // In FW ver 1.05, the issuer has one key pair used as both DataKey and TransactionKey, see [1] 3.3.1 and [1] 3.3.2 + mCard.setIssuer(tlvCardData.getTLV(TLV.Tag.TAG_Issuer_ID).getAsString(), protocol.getReadResult().getTLV(TLV.Tag.TAG_Issuer_Transaction_PublicKey).Value); + } else { + // In newer FW versions, the issuer has two different key pairs - DataKey and TransactionKey, see [1] 3.3.1 and [1] 3.3.2 + mCard.setIssuer(tlvCardData.getTLV(TLV.Tag.TAG_Issuer_ID).getAsString(), protocol.getReadResult().getTLV(TLV.Tag.TAG_Issuer_Data_PublicKey).Value); + } + } catch (Exception e) { + e.printStackTrace(); + Log.e(TAG, "Cannot get issuer, try a version for older cards"); + try { + // for very very old cards Issuer key can be stored in different TLV tag + mCard.setIssuer(tlvCardData.getTLV(TLV.Tag.TAG_Issuer_ID).getAsString(), protocol.getReadResult().getTLV(TLV.Tag.TAG_Issuer_Transaction_PublicKey).Value); + } catch (Exception ee) { + ee.printStackTrace(); + Log.e(TAG, "Cannot get issuer"); + mCard.setIssuer(Issuer.Unknown().getID(), null); + } + } + + // Overriding of missing card data, e.g. for cards with unknown ERC20 contract data + // This method must be called after the issuer data is defined because newly written data is verified by issuer data key + try { + // Hardcoded for some known batches, or, for other batches, received from Tangem server and stored in local storage + if (mCard.getBatch().equals("0017")) { + mCard.setContractAddress("0x9Eef75bA8e81340da9D8d1fd06B2f313DB88839c"); + } else if (mCard.getBatch().equals("0019")) { + mCard.setContractAddress("0x0c056b0cda0763cc14b8b2d6c02465c91e33ec72"); + } else { + LocalStorage localStorage = new LocalStorage(mContext); + localStorage.applySubstitution(mCard); + } + } catch (Exception e) { + Log.e(TAG, "Can't apply card data substitution"); + e.printStackTrace(); + } + + mCard.setBlockchainIDFromCard(tlvCardData.getTLV(TLV.Tag.TAG_Blockchain_ID).getAsString()); + + try { + mCard.setSettingsMask(protocol.getReadResult().getTagAsInt(TLV.Tag.TAG_SettingsMask)); + } catch (Exception e) { + e.printStackTrace(); + Log.e(TAG, "Can't get settings mask"); + } + + if (protocol.getReadResult().getTLV(TLV.Tag.TAG_PauseBeforePIN2) != null) { + mCard.setPauseBeforePIN2(10 * protocol.getReadResult().getTagAsInt(TLV.Tag.TAG_PauseBeforePIN2)); + } + + try { + mCard.setSigningMethod(protocol.getReadResult().getTagAsInt(TLV.Tag.TAG_SigningMethod)); + } catch (Exception e) { + e.printStackTrace(); + Log.e(TAG, "Can't get signing method"); + mCard.setSigningMethod(0); + } + + try { + mCard.setMaxSignatures(protocol.getReadResult().getTagAsInt(TLV.Tag.TAG_MaxSignatures)); + } catch (Exception e) { + e.printStackTrace(); + Log.e(TAG, "Can't get max signatures"); + } + + } catch (Exception e) { + e.printStackTrace(); + throw new CardProtocol.TangemException("Can't parse card data"); + } + } + + + // Parse additional parameters for Loaded cards: wallet public key, remaining signatures, etc + if (mCard.getStatus() == TangemCard.Status.Loaded) { + + TLV tlvPublicKey = protocol.getReadResult().getTLV(TLV.Tag.TAG_Wallet_PublicKey); + + ECNamedCurveParameterSpec spec = ECNamedCurveTable.getParameterSpec("secp256k1"); + ECPoint p1 = spec.getCurve().decodePoint(tlvPublicKey.Value); + + byte pkUncompressed[] = p1.getEncoded(false); + + byte pkCompresses[] = p1.getEncoded(true); + mCard.setWalletPublicKey(pkUncompressed); + mCard.setWalletPublicKeyRar(pkCompresses); + + // TODO - store in mCard only public key, not wallet address, move wallet address to coinData +// TangemContext ctx = new TangemContext(mCard); +// try { +// CoinEngine engineCoin = CoinEngineFactory.INSTANCE.create(ctx); +// if (engineCoin == null) throw new Exception("Can't create CoinEngine!"); +// String wallet = engineCoin.calculateAddress(pkUncompressed); +// mCard.setWallet(wallet); +// } catch (Exception e) { +// e.printStackTrace(); +// throw new TangemException("Can't define wallet address"); +// } + //mCard.setWallet(Blockchain.calculateWalletAddress(mCard, pkUncompressed)); + + mCard.setRemainingSignatures(protocol.getReadResult().getTagAsInt(TLV.Tag.TAG_RemainingSignatures)); + + if (protocol.getReadResult() != null && protocol.getReadResult().getTLV(TLV.Tag.TAG_SignedHashes) != null) { + mCard.setSignedHashes(protocol.getReadResult().getTagAsInt(TLV.Tag.TAG_SignedHashes)); + } + + } else { +// mCard.setWallet("N/A"); + } + } + + + /** + * On first time card reading run READ command, parse answer and Executing GET_ISSUER_DATA or WRITE_ISSUER_DATA depending on state in TangemCard object {@see TangemCard.getNeedWriteIssuerData()} + * See [1] 8.7 + * + * @throws Exception if something went wrong + */ + public void run_FirstTimeRead() throws Exception { + + + byte[] UID = mIsoDep.getTag().getId(); + String sUID = Util.byteArrayToHexString(UID); + if (!lastRead_UID.equals(sUID)) { + resetLastReadInfo(); + } + + Log.i(TAG, "[-- Start read card info --]"); + + if (isCancelled) return; + + protocol.setPIN(PINStorage.getDefaultPIN()); + protocol.clearReadResult(); + + if (lastRead_Encryption == null) { + Log.i(TAG, "Try get supported encryption mode"); + protocol.run_GetSupportedEncryption(); + } else { + Log.i(TAG, "Use already defined encryption mode: " + lastRead_Encryption.name()); + protocol.getCard().encryptionMode = lastRead_Encryption; + } + + if (protocol.haveReadResult()) { + //already have read result (obtained while get supported encryption), only read issuer data and define offline balance + parseReadResult(); + PINStorage.setLastUsedPIN(protocol.getCard().getPIN()); + } else { + //don't have read result - may be don't get supported encryption on this try, need encryption or need another PIN + if (lastRead_Encryption == null) { + // we try get supported encryption on this time + lastRead_Encryption = protocol.getCard().encryptionMode; + if (protocol.getCard().encryptionMode == TangemCard.EncryptionMode.None) { + // default pin not accepted + lastRead_UnsuccessfullPINs.add(PINStorage.getDefaultPIN()); + } + } + + boolean pinFound = false; + for (String PIN : PINStorage.getPINs()) { + Log.e(TAG, "PIN: " + PIN); + + boolean skipPin = false; + for (int i = 0; i < lastRead_UnsuccessfullPINs.size(); i++) { + if (lastRead_UnsuccessfullPINs.get(i).equals(PIN)) { + skipPin = true; + break; + } + } + + if (skipPin) { + Log.e(TAG, "Skip PIN - already checked before"); + continue; + } + + try { + protocol.setPIN(PIN); + if (protocol.getCard().encryptionMode != TangemCard.EncryptionMode.None) { + protocol.CreateProtocolKey(); + } + protocol.run_Read1(); + // After first successful read, data will be parsed into TangemCard object + parseReadResult(); + + PINStorage.setLastUsedPIN(PIN); + pinFound = true; + protocol.getCard().setPIN(PIN); + break; + } catch (CardProtocol.TangemException_InvalidPIN e) { + Log.e(TAG, e.getMessage()); + lastRead_UnsuccessfullPINs.add(PIN); + } + } + if (!pinFound) { + throw new CardProtocol.TangemException_InvalidPIN("No valid PIN found!"); + } + } + } + + /** + * Run read and check that the card is the same + * + * @throws Exception if something went wrong + */ + public void run_SecondTimeRead() throws Exception { + String PIN = mCard.getPIN(); + protocol.setPIN(PIN); + protocol.run_Read1(); + PINStorage.setLastUsedPIN(PIN); + if (!mCard.getCID().equals(protocol.getReadResult().getTLV(TLV.Tag.TAG_CardID))) { + throw new CardProtocol.TangemException("Card must be the same. Reading attempt on different card!"); + } + } + + /** + * This function must be override in descendants to arrive the task goal - sign, verify and etc + * @throws Exception if something went wrong + */ + public void run_Task() throws Exception { + + } + + @Override + public void run() { + if (mIsoDep == null) { + return; + } + try { + // for Samsung's bugs - + // Workaround for the Samsung Galaxy S5 (since the + // first connection always hangs on transceive). + int timeout = mIsoDep.getTimeout(); + mIsoDep.connect(); + mIsoDep.close(); + mIsoDep.connect(); + mIsoDep.setTimeout(timeout); + try { + protocol = new CardProtocol(mContext, mIsoDep, mCard, mNotifications); + mNotifications.onReadStart(protocol); + try { + Log.i(TAG, String.format("[-- Start task -- %s --]", getClass().getSimpleName())); + mNotifications.onReadProgress(protocol, 5); + if (mCard == null) { + // first time reading + run_FirstTimeRead(); + } else { + run_SecondTimeRead(); + } + run_Task(); + mNotifications.onReadProgress(protocol, 100); + } catch (Exception e) { + e.printStackTrace(); + protocol.setError(e); + + } finally { + Log.i(TAG, String.format("[-- Finish task -- %s --]", getClass().getSimpleName())); + mNotifications.onReadFinish(protocol); + } + } finally { + mNfcManager.ignoreTag(mIsoDep.getTag()); + } + } catch (Exception e) { + e.printStackTrace(); + mNfcManager.notifyReadResult(false); + } + } + + public void cancel(Boolean AllowInterrupt) { + try { + if (isAlive()) { + isCancelled = true; + join(500); + } + if (isAlive() && AllowInterrupt) { + interrupt(); + mNotifications.onReadCancel(); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + +} diff --git a/tangemcard/src/main/java/com/tangem/tangemcard/tasks/PurgeTask.java b/tangemcard/src/main/java/com/tangem/tangemcard/tasks/PurgeTask.java new file mode 100644 index 0000000000..9e42ea2581 --- /dev/null +++ b/tangemcard/src/main/java/com/tangem/tangemcard/tasks/PurgeTask.java @@ -0,0 +1,29 @@ +package com.tangem.tangemcard.tasks; + +import android.content.Context; +import android.nfc.tech.IsoDep; + +import com.tangem.tangemcard.reader.CardProtocol; +import com.tangem.tangemcard.reader.NfcManager; +import com.tangem.tangemcard.data.PINStorage; +import com.tangem.tangemcard.data.TangemCard; + +public class PurgeTask extends CustomReadCardTask { + public static final String TAG = PurgeTask.class.getSimpleName(); + + public PurgeTask(Context context, TangemCard card, NfcManager nfcManager, IsoDep isoDep, CardProtocol.Notifications notifications) { + super(context, card, nfcManager, isoDep, notifications); + } + + @Override + public void run_Task() throws Exception { + if (mCard.getPauseBeforePIN2() > 0) { + mNotifications.onReadWait(mCard.getPauseBeforePIN2()); + } + protocol.run_PurgeWallet(PINStorage.getPIN2()); + mNotifications.onReadProgress(protocol, 50); + protocol.run_Read1(); + mNotifications.onReadProgress(protocol, 100); + + } +} \ No newline at end of file diff --git a/tangemcard/src/main/java/com/tangem/tangemcard/tasks/ReadCardInfoTask.java b/tangemcard/src/main/java/com/tangem/tangemcard/tasks/ReadCardInfoTask.java new file mode 100644 index 0000000000..bc2192b665 --- /dev/null +++ b/tangemcard/src/main/java/com/tangem/tangemcard/tasks/ReadCardInfoTask.java @@ -0,0 +1,50 @@ +package com.tangem.tangemcard.tasks; + +import android.content.Context; +import android.nfc.tech.IsoDep; + +import com.tangem.tangemcard.data.TangemCard; +import com.tangem.tangemcard.reader.CardProtocol; +import com.tangem.tangemcard.reader.NfcManager; + +public class ReadCardInfoTask extends CustomReadCardTask { + public static final String TAG = ReadCardInfoTask.class.getSimpleName(); + + public ReadCardInfoTask(Context context, NfcManager nfcManager, IsoDep isoDep, CardProtocol.Notifications notifications) { + super(context, null, nfcManager, isoDep, notifications); + } + + /** + * Verify if default PIN2 is set on the card and enable UseDefaultPIN2 flag {@link TangemCard} + * Works in firmware 1.12 and later, for older version UseDefaultPIN2 is always null + * This function NEVER triggers security delay + * + * @throws Exception - if something went wrong + */ + public void run_CheckPIN2isDefault() throws Exception { + // can obtain SetPIN(to default) answer without security delay - try check if PIN2 is default with card request + if (mCard.isFirmwareNewer("1.19") || (mCard.isFirmwareNewer("1.12") && (mCard.getPauseBeforePIN2() == 0 || mCard.useSmartSecurityDelay()))) { + try { + protocol.run_SetPIN(protocol.DefaultPIN2, mCard.getPIN(), protocol.DefaultPIN2, true); + mCard.setUseDefaultPIN2(true); + } catch (CardProtocol.TangemException_NeedPause e) { + mCard.setUseDefaultPIN2(null); + } catch (CardProtocol.TangemException_InvalidPIN e) { + mCard.setUseDefaultPIN2(false); + } + } else { + mCard.setUseDefaultPIN2(null); + } + } + + @Override + public void run_Task() throws Exception { + mNotifications.onReadProgress(protocol, 20); + run_ReadOrWriteIssuerData(); + mNotifications.onReadProgress(protocol, 50); + run_CheckPIN2isDefault(); + mNotifications.onReadProgress(protocol, 90); + + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/data/nfc/SignPaymentTask.java b/tangemcard/src/main/java/com/tangem/tangemcard/tasks/SignPaymentTask.java similarity index 96% rename from app/src/main/java/com/tangem/data/nfc/SignPaymentTask.java rename to tangemcard/src/main/java/com/tangem/tangemcard/tasks/SignPaymentTask.java index 03499bc05f..663bfcc5ab 100644 --- a/app/src/main/java/com/tangem/data/nfc/SignPaymentTask.java +++ b/tangemcard/src/main/java/com/tangem/tangemcard/tasks/SignPaymentTask.java @@ -1,13 +1,13 @@ -package com.tangem.data.nfc; +package com.tangem.tangemcard.tasks; import android.app.Activity; import android.content.Intent; import android.nfc.tech.IsoDep; import android.util.Log; -import com.tangem.domain.cardReader.CardProtocol; -import com.tangem.domain.cardReader.NfcManager; -import com.tangem.domain.wallet.Blockchain; +import com.tangem.tangemcard.reader.CardProtocol; +import com.tangem.tangemcard.reader.NfcManager; +import com.tangem.tangemcard.data.Blockchain; import com.tangem.domain.wallet.CoinEngine; import com.tangem.domain.wallet.CoinEngineFactory; import com.tangem.domain.wallet.TangemContext; diff --git a/app/src/main/java/com/tangem/data/nfc/SwapPINTask.java b/tangemcard/src/main/java/com/tangem/tangemcard/tasks/SwapPINTask.java similarity index 92% rename from app/src/main/java/com/tangem/data/nfc/SwapPINTask.java rename to tangemcard/src/main/java/com/tangem/tangemcard/tasks/SwapPINTask.java index 0e18d6e8bc..564764f7aa 100644 --- a/app/src/main/java/com/tangem/data/nfc/SwapPINTask.java +++ b/tangemcard/src/main/java/com/tangem/tangemcard/tasks/SwapPINTask.java @@ -1,13 +1,13 @@ -package com.tangem.data.nfc; +package com.tangem.tangemcard.tasks; import android.content.Context; import android.nfc.tech.IsoDep; import android.util.Log; -import com.tangem.domain.cardReader.CardProtocol; -import com.tangem.domain.cardReader.NfcManager; -import com.tangem.data.db.PINStorage; -import com.tangem.domain.wallet.TangemCard; +import com.tangem.tangemcard.reader.CardProtocol; +import com.tangem.tangemcard.reader.NfcManager; +import com.tangem.tangemcard.data.PINStorage; +import com.tangem.tangemcard.data.TangemCard; public class SwapPINTask extends Thread { public static final String TAG = SwapPINTask.class.getSimpleName(); diff --git a/tangemcard/src/main/java/com/tangem/tangemcard/tasks/VerifyCardTask.java b/tangemcard/src/main/java/com/tangem/tangemcard/tasks/VerifyCardTask.java new file mode 100644 index 0000000000..6ab2e0b8d4 --- /dev/null +++ b/tangemcard/src/main/java/com/tangem/tangemcard/tasks/VerifyCardTask.java @@ -0,0 +1,51 @@ +package com.tangem.tangemcard.tasks; + +import android.content.Context; +import android.nfc.tech.IsoDep; +import android.util.Log; + +import com.tangem.tangemcard.reader.CardProtocol; +import com.tangem.tangemcard.data.Firmwares; +import com.tangem.tangemcard.reader.NfcManager; +import com.tangem.tangemcard.data.PINStorage; +import com.tangem.tangemcard.data.TangemCard; + +import java.util.Arrays; + +/** + * Created by dvol on 04.02.2018. + */ + +public class VerifyCardTask extends CustomReadCardTask { + public static final String TAG = VerifyCardTask.class.getSimpleName(); + + public VerifyCardTask(Context context, TangemCard card, NfcManager nfcManager, IsoDep isoDep, CardProtocol.Notifications notifications) { + super(context, card, nfcManager, isoDep, notifications); + } + + @Override + public void run_Task() throws Exception { + mNotifications.onReadProgress(protocol, 20); + if (isCancelled) return; + protocol.run_VerifyCard(); + mNotifications.onReadProgress(protocol, 50); + Log.i(TAG, "Manufacturer: " + protocol.getCard().getManufacturer().getOfficialName()); + if (isCancelled) return; + if (protocol.getCard().getStatus() == TangemCard.Status.Loaded) { + protocol.run_CheckWalletWithSignatureVerify(); + mNotifications.onReadProgress(protocol, 80); + } + if (isCancelled) return; + Firmwares.VerifyCodeRecord record=Firmwares.selectRandomVerifyCodeBlock(mCard.getFirmwareVersion()); + if (isCancelled) return; + if( record!=null ) { + byte[] returnedDigest = protocol.run_VerifyCode(record.hashAlg, record.blockIndex, record.blockCount, record.challenge); + mCard.setCodeConfirmed(Arrays.equals(returnedDigest, record.digest)); + }else{ + mCard.setCodeConfirmed(null); + } + mNotifications.onReadProgress(protocol, 90); + + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/util/Util.java b/tangemcard/src/main/java/com/tangem/tangemcard/util/Util.java similarity index 99% rename from app/src/main/java/com/tangem/util/Util.java rename to tangemcard/src/main/java/com/tangem/tangemcard/util/Util.java index 3ebf4b4bfa..4b4823f4f1 100644 --- a/app/src/main/java/com/tangem/util/Util.java +++ b/tangemcard/src/main/java/com/tangem/tangemcard/util/Util.java @@ -1,4 +1,4 @@ -package com.tangem.util; +package com.tangem.tangemcard.util; import android.text.format.DateUtils; diff --git a/app/src/main/res/drawable/card_default.png b/tangemcard/src/main/res/drawable/card_default.png similarity index 100% rename from app/src/main/res/drawable/card_default.png rename to tangemcard/src/main/res/drawable/card_default.png diff --git a/app/src/main/res/drawable/card_ru006.png b/tangemcard/src/main/res/drawable/card_ru006.png similarity index 100% rename from app/src/main/res/drawable/card_ru006.png rename to tangemcard/src/main/res/drawable/card_ru006.png diff --git a/app/src/main/res/drawable/card_ru007.png b/tangemcard/src/main/res/drawable/card_ru007.png similarity index 100% rename from app/src/main/res/drawable/card_ru007.png rename to tangemcard/src/main/res/drawable/card_ru007.png diff --git a/app/src/main/res/drawable/card_ru011.png b/tangemcard/src/main/res/drawable/card_ru011.png similarity index 100% rename from app/src/main/res/drawable/card_ru011.png rename to tangemcard/src/main/res/drawable/card_ru011.png diff --git a/app/src/main/res/drawable/card_ru012.png b/tangemcard/src/main/res/drawable/card_ru012.png similarity index 100% rename from app/src/main/res/drawable/card_ru012.png rename to tangemcard/src/main/res/drawable/card_ru012.png diff --git a/app/src/main/res/drawable/card_ru013.png b/tangemcard/src/main/res/drawable/card_ru013.png similarity index 100% rename from app/src/main/res/drawable/card_ru013.png rename to tangemcard/src/main/res/drawable/card_ru013.png diff --git a/app/src/main/res/drawable/card_ru014.png b/tangemcard/src/main/res/drawable/card_ru014.png similarity index 100% rename from app/src/main/res/drawable/card_ru014.png rename to tangemcard/src/main/res/drawable/card_ru014.png diff --git a/app/src/main/res/drawable/card_ru015.png b/tangemcard/src/main/res/drawable/card_ru015.png similarity index 100% rename from app/src/main/res/drawable/card_ru015.png rename to tangemcard/src/main/res/drawable/card_ru015.png diff --git a/app/src/main/res/drawable/card_ru016.png b/tangemcard/src/main/res/drawable/card_ru016.png similarity index 100% rename from app/src/main/res/drawable/card_ru016.png rename to tangemcard/src/main/res/drawable/card_ru016.png diff --git a/app/src/main/res/drawable/card_ru020.png b/tangemcard/src/main/res/drawable/card_ru020.png similarity index 100% rename from app/src/main/res/drawable/card_ru020.png rename to tangemcard/src/main/res/drawable/card_ru020.png diff --git a/app/src/main/res/drawable/card_ru021.png b/tangemcard/src/main/res/drawable/card_ru021.png similarity index 100% rename from app/src/main/res/drawable/card_ru021.png rename to tangemcard/src/main/res/drawable/card_ru021.png diff --git a/app/src/main/res/drawable/card_ru022.png b/tangemcard/src/main/res/drawable/card_ru022.png similarity index 100% rename from app/src/main/res/drawable/card_ru022.png rename to tangemcard/src/main/res/drawable/card_ru022.png diff --git a/app/src/main/res/drawable/card_ru023.png b/tangemcard/src/main/res/drawable/card_ru023.png similarity index 100% rename from app/src/main/res/drawable/card_ru023.png rename to tangemcard/src/main/res/drawable/card_ru023.png diff --git a/app/src/main/res/drawable/card_ru024.png b/tangemcard/src/main/res/drawable/card_ru024.png similarity index 100% rename from app/src/main/res/drawable/card_ru024.png rename to tangemcard/src/main/res/drawable/card_ru024.png diff --git a/app/src/main/res/drawable/card_ru028.png b/tangemcard/src/main/res/drawable/card_ru028.png similarity index 100% rename from app/src/main/res/drawable/card_ru028.png rename to tangemcard/src/main/res/drawable/card_ru028.png diff --git a/app/src/main/res/drawable/card_ru029.png b/tangemcard/src/main/res/drawable/card_ru029.png similarity index 100% rename from app/src/main/res/drawable/card_ru029.png rename to tangemcard/src/main/res/drawable/card_ru029.png diff --git a/app/src/main/res/drawable/card_ru030.png b/tangemcard/src/main/res/drawable/card_ru030.png similarity index 100% rename from app/src/main/res/drawable/card_ru030.png rename to tangemcard/src/main/res/drawable/card_ru030.png diff --git a/app/src/main/res/drawable/hand_card_horizontal.png b/tangemcard/src/main/res/drawable/hand_card_horizontal.png similarity index 100% rename from app/src/main/res/drawable/hand_card_horizontal.png rename to tangemcard/src/main/res/drawable/hand_card_horizontal.png diff --git a/app/src/main/res/drawable/hand_card_vertical.png b/tangemcard/src/main/res/drawable/hand_card_vertical.png similarity index 100% rename from app/src/main/res/drawable/hand_card_vertical.png rename to tangemcard/src/main/res/drawable/hand_card_vertical.png diff --git a/app/src/main/res/drawable/ic_logo_bat_token.png b/tangemcard/src/main/res/drawable/ic_logo_bat_token.png similarity index 100% rename from app/src/main/res/drawable/ic_logo_bat_token.png rename to tangemcard/src/main/res/drawable/ic_logo_bat_token.png diff --git a/app/src/main/res/drawable/ic_logo_bitcoin.png b/tangemcard/src/main/res/drawable/ic_logo_bitcoin.png similarity index 100% rename from app/src/main/res/drawable/ic_logo_bitcoin.png rename to tangemcard/src/main/res/drawable/ic_logo_bitcoin.png diff --git a/app/src/main/res/drawable/ic_logo_bitcoin_cash.png b/tangemcard/src/main/res/drawable/ic_logo_bitcoin_cash.png similarity index 100% rename from app/src/main/res/drawable/ic_logo_bitcoin_cash.png rename to tangemcard/src/main/res/drawable/ic_logo_bitcoin_cash.png diff --git a/app/src/main/res/drawable/ic_logo_bitcoin_testnet.png b/tangemcard/src/main/res/drawable/ic_logo_bitcoin_testnet.png similarity index 100% rename from app/src/main/res/drawable/ic_logo_bitcoin_testnet.png rename to tangemcard/src/main/res/drawable/ic_logo_bitcoin_testnet.png diff --git a/app/src/main/res/drawable/ic_logo_ethereum.png b/tangemcard/src/main/res/drawable/ic_logo_ethereum.png similarity index 100% rename from app/src/main/res/drawable/ic_logo_ethereum.png rename to tangemcard/src/main/res/drawable/ic_logo_ethereum.png diff --git a/app/src/main/res/drawable/ic_logo_ethereum_testnet.png b/tangemcard/src/main/res/drawable/ic_logo_ethereum_testnet.png similarity index 100% rename from app/src/main/res/drawable/ic_logo_ethereum_testnet.png rename to tangemcard/src/main/res/drawable/ic_logo_ethereum_testnet.png diff --git a/app/src/main/res/drawable/ic_logo_seed.png b/tangemcard/src/main/res/drawable/ic_logo_seed.png similarity index 100% rename from app/src/main/res/drawable/ic_logo_seed.png rename to tangemcard/src/main/res/drawable/ic_logo_seed.png diff --git a/app/src/main/res/drawable/ic_logo_unknown.png b/tangemcard/src/main/res/drawable/ic_logo_unknown.png similarity index 100% rename from app/src/main/res/drawable/ic_logo_unknown.png rename to tangemcard/src/main/res/drawable/ic_logo_unknown.png diff --git a/app/src/main/res/drawable/tangem2.png b/tangemcard/src/main/res/drawable/tangem2.png similarity index 100% rename from app/src/main/res/drawable/tangem2.png rename to tangemcard/src/main/res/drawable/tangem2.png From 10c0b8e680e547bdb638315aa7dfd9cfb983db73 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 4 Dec 2018 15:53:05 +0300 Subject: [PATCH 02/61] Updated on 2026-08-14 --- app/src/main/java/com/tangem/Constant.kt | 20 ++++++- .../com/tangem/data/nfc/VerifyCardTask.java | 6 +- app/src/main/java/com/tangem/di/Navigator.kt | 7 ++- .../activity/LoadedWalletActivity.kt | 3 +- .../presentation/activity/MainActivity.kt | 18 ++---- .../activity/VerifyCardActivity.kt | 4 +- .../presentation/dialog/RootFoundDialog.kt | 2 +- .../presentation/fragment/LoadedWallet.kt | 60 ++++++++----------- .../presentation/fragment/VerifyCard.kt | 3 +- tangemcard/build.gradle | 9 +-- 10 files changed, 66 insertions(+), 66 deletions(-) diff --git a/app/src/main/java/com/tangem/Constant.kt b/app/src/main/java/com/tangem/Constant.kt index 5fb46a7a5f..c3d29195f6 100644 --- a/app/src/main/java/com/tangem/Constant.kt +++ b/app/src/main/java/com/tangem/Constant.kt @@ -2,7 +2,6 @@ package com.tangem object Constant { - const val EXTRA_BLOCKCHAIN_DATA = "BLOCKCHAIN_DATA" const val MESSAGE = "Message" @@ -10,4 +9,23 @@ object Constant { const val EXTRA_MODIFICATION = "modification" + // LoadedWallet + const val REQUEST_CODE_SEND_PAYMENT = 1 + const val REQUEST_CODE_PURGE = 2 + const val REQUEST_CODE_REQUEST_PIN2_FOR_PURGE = 3 + const val REQUEST_CODE_VERIFY_CARD = 4 + const val REQUEST_CODE_ENTER_NEW_PIN = 5 + const val REQUEST_CODE_ENTER_NEW_PIN2 = 6 + const val REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN = 7 + const val REQUEST_CODE_SWAP_PIN = 8 + const val REQUEST_CODE_RECEIVE_PAYMENT = 9 + + // MainActivity + const val REQUEST_CODE_SHOW_CARD_ACTIVITY = 1 + const val REQUEST_CODE_ENTER_PIN_ACTIVITY = 2 + const val REQUEST_CODE_SEND_EMAIL = 3 + const val REQUEST_CODE_REQUEST_CAMERA_PERMISSIONS = 3 + + const val EXTRA_LAST_DISCOVERED_TAG = "extra_last_tag" + } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/data/nfc/VerifyCardTask.java b/app/src/main/java/com/tangem/data/nfc/VerifyCardTask.java index 9db5b0f682..f90849fd38 100644 --- a/app/src/main/java/com/tangem/data/nfc/VerifyCardTask.java +++ b/app/src/main/java/com/tangem/data/nfc/VerifyCardTask.java @@ -73,12 +73,12 @@ public class VerifyCardTask extends Thread { mNotifications.onReadProgress(protocol, 80); } if (isCancelled) return; - Firmwares.VerifyCodeRecord record=Firmwares.selectRandomVerifyCodeBlock(mCard.getFirmwareVersion()); + Firmwares.VerifyCodeRecord record = Firmwares.selectRandomVerifyCodeBlock(mCard.getFirmwareVersion()); if (isCancelled) return; - if( record!=null ) { + if (record != null) { byte[] returnedDigest = protocol.run_VerifyCode(record.hashAlg, record.blockIndex, record.blockCount, record.challenge); mCard.setCodeConfirmed(Arrays.equals(returnedDigest, record.digest)); - }else{ + } else { mCard.setCodeConfirmed(null); } mNotifications.onReadProgress(protocol, 90); diff --git a/app/src/main/java/com/tangem/di/Navigator.kt b/app/src/main/java/com/tangem/di/Navigator.kt index 15eb86bb96..a64290d3b6 100644 --- a/app/src/main/java/com/tangem/di/Navigator.kt +++ b/app/src/main/java/com/tangem/di/Navigator.kt @@ -3,6 +3,7 @@ package com.tangem.di import android.app.Activity import android.nfc.Tag import android.os.Bundle +import com.tangem.Constant import com.tangem.domain.wallet.CoinData import com.tangem.domain.wallet.TangemCard import com.tangem.presentation.activity.EmptyWalletActivity @@ -18,15 +19,15 @@ class Navigator { } fun showLoadedWallet(context: Activity, lastTag: Tag, cardInfo: Bundle) { - context.startActivityForResult(LoadedWalletActivity.callingIntent(context, lastTag, cardInfo), MainActivity.REQUEST_CODE_SHOW_CARD_ACTIVITY) + context.startActivityForResult(LoadedWalletActivity.callingIntent(context, lastTag, cardInfo), Constant.REQUEST_CODE_SHOW_CARD_ACTIVITY) } fun showEmptyWallet(context: Activity) { context.startActivity(EmptyWalletActivity.callingIntent(context)) } - fun showVerifyCard(context: Activity, card: TangemCard, coinData: CoinData, message: String, error: String) { - context.startActivityForResult(VerifyCardActivity.callingIntent(context, card, coinData, message, error), LoadedWallet.REQUEST_CODE_VERIFY_CARD) + fun showVerifyCard(context: Activity, card: TangemCard, coinData: CoinData) { + context.startActivityForResult(VerifyCardActivity.callingIntent(context, card, coinData), Constant.REQUEST_CODE_VERIFY_CARD) } fun showPinSwap(context: Activity) { diff --git a/app/src/main/java/com/tangem/presentation/activity/LoadedWalletActivity.kt b/app/src/main/java/com/tangem/presentation/activity/LoadedWalletActivity.kt index 04dab07418..1356658cb8 100644 --- a/app/src/main/java/com/tangem/presentation/activity/LoadedWalletActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/LoadedWalletActivity.kt @@ -7,6 +7,7 @@ import android.nfc.Tag import android.os.Bundle import android.support.v7.app.AppCompatActivity import com.tangem.App +import com.tangem.Constant import com.tangem.di.Navigator import com.tangem.presentation.fragment.LoadedWallet import com.tangem.wallet.R @@ -20,7 +21,7 @@ class LoadedWalletActivity : AppCompatActivity() { companion object { fun callingIntent(context: Context, lastTag: Tag, cardInfo: Bundle): Intent { val intent = Intent(context, LoadedWalletActivity::class.java) - intent.putExtra(MainActivity.EXTRA_LAST_DISCOVERED_TAG, lastTag) + intent.putExtra(Constant.EXTRA_LAST_DISCOVERED_TAG, lastTag) intent.putExtras(cardInfo) return intent } diff --git a/app/src/main/java/com/tangem/presentation/activity/MainActivity.kt b/app/src/main/java/com/tangem/presentation/activity/MainActivity.kt index f247ab61f4..91186d4325 100644 --- a/app/src/main/java/com/tangem/presentation/activity/MainActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/MainActivity.kt @@ -25,6 +25,7 @@ import android.widget.RelativeLayout import android.widget.Toast import com.scottyab.rootbeer.RootBeer import com.tangem.App +import com.tangem.Constant import com.tangem.data.Logger import com.tangem.data.db.PINStorage import com.tangem.data.network.ServerApiCommon @@ -52,13 +53,6 @@ class MainActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, CardProtoco companion object { val TAG: String = MainActivity::class.java.simpleName - private const val REQUEST_CODE_SEND_EMAIL = 3 - private const val REQUEST_CODE_ENTER_PIN_ACTIVITY = 2 - const val REQUEST_CODE_SHOW_CARD_ACTIVITY = 1 - private const val REQUEST_CODE_REQUEST_CAMERA_PERMISSIONS = 3 - - const val EXTRA_LAST_DISCOVERED_TAG = "extra_last_tag" - fun callingIntent(context: Context) = Intent(context, MainActivity::class.java) fun commonInit(context: Context) { @@ -155,7 +149,7 @@ class MainActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, CardProtoco // check if root device val rootBeer = RootBeer(this) if (rootBeer.isRootedWithoutBusyBoxCheck && !BuildConfig.DEBUG) - RootFoundDialog().show(fragmentManager, RootFoundDialog.TAG) + RootFoundDialog().show(supportFragmentManager, RootFoundDialog.TAG) // set listeners fab.setOnClickListener { showMenu(it) } @@ -180,19 +174,19 @@ class MainActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, CardProtoco NfcManager.verifyPermissions(this) if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { Log.e("QRScanActivity", "User hasn't granted permission to use camera") - ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.CAMERA), REQUEST_CODE_REQUEST_CAMERA_PERMISSIONS) + ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.CAMERA), Constant.REQUEST_CODE_REQUEST_CAMERA_PERMISSIONS) } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { when (requestCode) { - REQUEST_CODE_SEND_EMAIL -> { + Constant.REQUEST_CODE_SEND_EMAIL -> { if (zipFile != null) { zipFile!!.delete() zipFile = null } } - REQUEST_CODE_ENTER_PIN_ACTIVITY -> { + Constant.REQUEST_CODE_ENTER_PIN_ACTIVITY -> { if (resultCode == Activity.RESULT_OK && lastTag != null) onTagDiscovered(lastTag!!) else @@ -454,7 +448,7 @@ class MainActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, CardProtoco private fun doEnterPIN() { val intent = Intent(this, PinRequestActivity::class.java) intent.putExtra("mode", PinRequestActivity.Mode.RequestPIN.toString()) - startActivityForResult(intent, REQUEST_CODE_ENTER_PIN_ACTIVITY) + startActivityForResult(intent, Constant.REQUEST_CODE_ENTER_PIN_ACTIVITY) } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/presentation/activity/VerifyCardActivity.kt b/app/src/main/java/com/tangem/presentation/activity/VerifyCardActivity.kt index 402da7169c..6841d4bc83 100644 --- a/app/src/main/java/com/tangem/presentation/activity/VerifyCardActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/VerifyCardActivity.kt @@ -19,13 +19,11 @@ class VerifyCardActivity : AppCompatActivity() { lateinit var navigator: Navigator companion object { - fun callingIntent(context: Context, card: TangemCard, coinData: CoinData, message: String, error: String): Intent { + fun callingIntent(context: Context, card: TangemCard, coinData: CoinData): Intent { val intent = Intent(context, VerifyCardActivity::class.java) intent.putExtra(TangemCard.EXTRA_UID, card.uid) intent.putExtra(TangemCard.EXTRA_CARD, card.asBundle) intent.putExtra(Constant.EXTRA_BLOCKCHAIN_DATA, coinData.asBundle()) - intent.putExtra(Constant.MESSAGE, message) - intent.putExtra(Constant.ERROR, error) return intent } } diff --git a/app/src/main/java/com/tangem/presentation/dialog/RootFoundDialog.kt b/app/src/main/java/com/tangem/presentation/dialog/RootFoundDialog.kt index b49551d716..f6aed9beb5 100644 --- a/app/src/main/java/com/tangem/presentation/dialog/RootFoundDialog.kt +++ b/app/src/main/java/com/tangem/presentation/dialog/RootFoundDialog.kt @@ -2,8 +2,8 @@ package com.tangem.presentation.dialog import android.app.AlertDialog import android.app.Dialog -import android.app.DialogFragment import android.os.Bundle +import android.support.v4.app.DialogFragment import com.tangem.wallet.R diff --git a/app/src/main/java/com/tangem/presentation/fragment/LoadedWallet.kt b/app/src/main/java/com/tangem/presentation/fragment/LoadedWallet.kt index 7346f13445..3c315e1c07 100644 --- a/app/src/main/java/com/tangem/presentation/fragment/LoadedWallet.kt +++ b/app/src/main/java/com/tangem/presentation/fragment/LoadedWallet.kt @@ -19,6 +19,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.Toast +import com.tangem.Constant import com.tangem.data.db.LocalStorage import com.tangem.data.db.PINStorage import com.tangem.data.network.ElectrumRequest @@ -53,15 +54,6 @@ import java.util.* class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notifications, SharedPreferences.OnSharedPreferenceChangeListener { companion object { val TAG: String = LoadedWallet::class.java.simpleName - private const val REQUEST_CODE_SEND_PAYMENT = 1 - const val REQUEST_CODE_VERIFY_CARD = 4 - private const val REQUEST_CODE_PURGE = 2 - private const val REQUEST_CODE_REQUEST_PIN2_FOR_PURGE = 3 - private const val REQUEST_CODE_ENTER_NEW_PIN = 5 - private const val REQUEST_CODE_ENTER_NEW_PIN2 = 6 - private const val REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN = 7 - private const val REQUEST_CODE_SWAP_PIN = 8 - private const val REQUEST_CODE_RECEIVE_PAYMENT = 9 } private var nfcManager: NfcManager? = null @@ -93,7 +85,7 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific ctx = TangemContext.loadFromBundle(activity, activity?.intent?.extras) - lastTag = activity?.intent?.getParcelableExtra(MainActivity.EXTRA_LAST_DISCOVERED_TAG) + lastTag = activity?.intent?.getParcelableExtra(Constant.EXTRA_LAST_DISCOVERED_TAG) localStorage = activity?.let { LocalStorage(it) }!! } @@ -163,12 +155,12 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific getString(R.string.via_cryptonit) -> { val intent = Intent(activity, PrepareCryptonitWithdrawalActivity::class.java) ctx.saveToIntent(intent) - startActivityForResult(intent, REQUEST_CODE_RECEIVE_PAYMENT) + startActivityForResult(intent, Constant.REQUEST_CODE_RECEIVE_PAYMENT) } getString(R.string.via_kraken) -> { val intent = Intent(activity, PrepareKrakenWithdrawalActivity::class.java) ctx.saveToIntent(intent) - startActivityForResult(intent, REQUEST_CODE_RECEIVE_PAYMENT) + startActivityForResult(intent, Constant.REQUEST_CODE_RECEIVE_PAYMENT) } else -> { } @@ -192,7 +184,7 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific btnDetails.setOnClickListener { if (cardProtocol != null) // openVerifyCard(cardProtocol!!) - (activity as LoadedWalletActivity).navigator.showVerifyCard(context as Activity, ctx.card, ctx.coinData, ctx.message, ctx.error) + (activity as LoadedWalletActivity).navigator.showVerifyCard(context as Activity, ctx.card, ctx.coinData) else showSingleToast(R.string.need_attach_card_again) @@ -208,7 +200,7 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific else { val intent = Intent(activity, PreparePaymentActivity::class.java) ctx.saveToIntent(intent) - startActivityForResult(intent, REQUEST_CODE_SEND_PAYMENT) + startActivityForResult(intent, Constant.REQUEST_CODE_SEND_PAYMENT) } } else Toast.makeText(activity, getString(R.string.no_connection), Toast.LENGTH_SHORT).show() @@ -498,46 +490,46 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific var data = data super.onActivityResult(requestCode, resultCode, data) when (requestCode) { - REQUEST_CODE_VERIFY_CARD -> + Constant.REQUEST_CODE_VERIFY_CARD -> // action when erase wallet if (resultCode == Activity.RESULT_OK) { if (activity != null) activity?.finish() } - REQUEST_CODE_ENTER_NEW_PIN -> if (resultCode == Activity.RESULT_OK) { + Constant.REQUEST_CODE_ENTER_NEW_PIN -> if (resultCode == Activity.RESULT_OK) { if (data != null) { if (data.extras != null && data.extras!!.containsKey("confirmPIN")) { val intent = Intent(activity, PinRequestActivity::class.java) intent.putExtra("mode", PinRequestActivity.Mode.RequestPIN2.toString()) ctx.saveToIntent(intent) newPIN = data.getStringExtra("newPIN") - startActivityForResult(intent, REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN) + startActivityForResult(intent, Constant.REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN) } else { val intent = Intent(activity, PinRequestActivity::class.java) intent.putExtra("newPIN", data.getStringExtra("newPIN")) intent.putExtra("mode", PinRequestActivity.Mode.ConfirmNewPIN.toString()) - startActivityForResult(intent, REQUEST_CODE_ENTER_NEW_PIN) + startActivityForResult(intent, Constant.REQUEST_CODE_ENTER_NEW_PIN) } } } - REQUEST_CODE_ENTER_NEW_PIN2 -> if (resultCode == Activity.RESULT_OK) { + Constant.REQUEST_CODE_ENTER_NEW_PIN2 -> if (resultCode == Activity.RESULT_OK) { if (data != null) { if (data.extras != null && data.extras!!.containsKey("confirmPIN2")) { val intent = Intent(activity, PinRequestActivity::class.java) intent.putExtra("mode", PinRequestActivity.Mode.RequestPIN2.toString()) ctx.saveToIntent(intent) newPIN2 = data.getStringExtra("newPIN2") - startActivityForResult(intent, REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN) + startActivityForResult(intent, Constant.REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN) } else { val intent = Intent(activity, PinRequestActivity::class.java) intent.putExtra("newPIN2", data.getStringExtra("newPIN2")) intent.putExtra("mode", PinRequestActivity.Mode.ConfirmNewPIN2.toString()) - startActivityForResult(intent, REQUEST_CODE_ENTER_NEW_PIN2) + startActivityForResult(intent, Constant.REQUEST_CODE_ENTER_NEW_PIN2) } } } - REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN -> if (resultCode == Activity.RESULT_OK) { + Constant.REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN -> if (resultCode == Activity.RESULT_OK) { if (newPIN == "") newPIN = ctx.card!!.pin @@ -555,13 +547,13 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific pinSwapWarningDialog.show(activity?.supportFragmentManager, PINSwapWarningDialog.TAG) } - REQUEST_CODE_SWAP_PIN -> if (resultCode == Activity.RESULT_OK) { + Constant.REQUEST_CODE_SWAP_PIN -> if (resultCode == Activity.RESULT_OK) { if (data == null) { data = Intent() ctx.saveToIntent(data) - data.putExtra("modification", "delete") + data.putExtra(Constant.EXTRA_MODIFICATION, "delete") } else - data.putExtra("modification", "update") + data.putExtra(Constant.EXTRA_MODIFICATION, "update") activity?.setResult(Activity.RESULT_OK, data) activity?.finish() @@ -577,7 +569,7 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific val intent = Intent(activity, PinRequestActivity::class.java) intent.putExtra("mode", PinRequestActivity.Mode.RequestPIN2.toString()) ctx.saveToIntent(intent) - startActivityForResult(intent, REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN) + startActivityForResult(intent, Constant.REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN) return } else { if (data != null && data.extras!!.containsKey("message")) { @@ -585,18 +577,18 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific } } } - REQUEST_CODE_REQUEST_PIN2_FOR_PURGE -> if (resultCode == Activity.RESULT_OK) { + Constant.REQUEST_CODE_REQUEST_PIN2_FOR_PURGE -> if (resultCode == Activity.RESULT_OK) { val intent = Intent(activity, PurgeActivity::class.java) ctx.saveToIntent(intent) - startActivityForResult(intent, REQUEST_CODE_PURGE) + startActivityForResult(intent, Constant.REQUEST_CODE_PURGE) } - REQUEST_CODE_PURGE -> if (resultCode == Activity.RESULT_OK) { + Constant.REQUEST_CODE_PURGE -> if (resultCode == Activity.RESULT_OK) { if (data == null) { data = Intent() ctx.saveToIntent(data) - data.putExtra("modification", "delete") + data.putExtra(Constant.EXTRA_MODIFICATION, "delete") } else { - data.putExtra("modification", "update") + data.putExtra(Constant.EXTRA_MODIFICATION, "update") } activity?.setResult(Activity.RESULT_OK, data) @@ -613,7 +605,7 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific val intent = Intent(activity, PinRequestActivity::class.java) intent.putExtra("mode", PinRequestActivity.Mode.RequestPIN2.toString()) ctx.saveToIntent(intent) - startActivityForResult(intent, REQUEST_CODE_REQUEST_PIN2_FOR_PURGE) + startActivityForResult(intent, Constant.REQUEST_CODE_REQUEST_PIN2_FOR_PURGE) return } else { if (data != null && data.extras!!.containsKey("message")) { @@ -622,7 +614,7 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific } updateViews() } - REQUEST_CODE_SEND_PAYMENT, REQUEST_CODE_RECEIVE_PAYMENT -> { + Constant.REQUEST_CODE_SEND_PAYMENT, Constant.REQUEST_CODE_RECEIVE_PAYMENT -> { if (resultCode == Activity.RESULT_OK) { ctx.coinData?.clearInfo() srl?.postDelayed({ this.refresh() }, 5000) @@ -955,7 +947,7 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific ctx.saveToIntent(intent) intent.putExtra("newPIN", newPIN) intent.putExtra("newPIN2", newPIN2) - startActivityForResult(intent, REQUEST_CODE_SWAP_PIN) + startActivityForResult(intent, Constant.REQUEST_CODE_SWAP_PIN) } private var showTime: Date = Date() diff --git a/app/src/main/java/com/tangem/presentation/fragment/VerifyCard.kt b/app/src/main/java/com/tangem/presentation/fragment/VerifyCard.kt index 618aaee44c..e9c1f257b1 100644 --- a/app/src/main/java/com/tangem/presentation/fragment/VerifyCard.kt +++ b/app/src/main/java/com/tangem/presentation/fragment/VerifyCard.kt @@ -13,6 +13,7 @@ import android.view.View import android.view.ViewGroup import android.widget.PopupMenu import android.widget.Toast +import com.tangem.Constant import com.tangem.data.db.PINStorage import com.tangem.domain.cardReader.NfcManager import com.tangem.domain.wallet.* @@ -72,7 +73,7 @@ class VerifyCard : Fragment(), NfcAdapter.ReaderCallback { fabMenu.setOnClickListener { showMenu(fabMenu) } btnOk.setOnClickListener { val data = prepareResultIntent() - data.putExtra("modification", "update") + data.putExtra(Constant.EXTRA_MODIFICATION, "update") activity?.finish() } } diff --git a/tangemcard/build.gradle b/tangemcard/build.gradle index e5d36fc391..049f9d32bd 100644 --- a/tangemcard/build.gradle +++ b/tangemcard/build.gradle @@ -4,16 +4,12 @@ apply plugin: 'kotlin-android' android { compileSdkVersion 28 - - defaultConfig { minSdkVersion 16 targetSdkVersion 28 versionCode 1 versionName "1.0" - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" - } buildTypes { @@ -22,18 +18,17 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } - } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation 'com.android.support:appcompat-v7:28.0.0' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" } + repositories { mavenCentral() -} +} \ No newline at end of file From 452c5511bcda9aa4f36fdfd1b15beef6c0de08df Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 4 Dec 2018 18:31:15 +0300 Subject: [PATCH 03/61] Updated on 2026-08-14 --- app/src/main/java/com/tangem/App.java | 13 +++++++++++ .../com/tangem/data/nfc/ReadCardInfoTask.java | 4 ++-- .../activity/ConfirmPaymentActivity.kt | 2 +- .../activity/CreateNewWalletActivity.kt | 2 +- .../activity/EmptyWalletActivity.kt | 2 +- .../activity/LoadedWalletActivity.kt | 2 +- .../presentation/activity/MainActivity.kt | 22 +++++++++---------- .../activity/PinRequestActivity.kt | 2 +- .../presentation/activity/PinSaveActivity.kt | 2 +- .../presentation/activity/PinSwapActivity.kt | 2 +- ...pareCryptonitOtherApiWithdrawalActivity.kt | 10 ++++----- .../PrepareCryptonitWithdrawalActivity.kt | 2 +- .../PrepareKrakenWithdrawalActivity.kt | 2 +- .../activity/PreparePaymentActivity.kt | 2 +- .../presentation/activity/PurgeActivity.kt | 2 +- .../activity/SendTransactionActivity.kt | 2 +- .../activity/SignPaymentActivity.kt | 2 +- .../activity/VerifyCardActivity.kt | 2 +- .../dialog/WaitSecurityDelayDialog.java | 1 + .../drawable/ic_content_copy_black_24dp.xml | 0 .../main/res/drawable/ic_nfc_white_24dp.xml | 0 .../res/drawable/ic_wrench_white_24dp.xml | 0 gradlew | 0 23 files changed, 46 insertions(+), 32 deletions(-) mode change 100755 => 100644 app/src/main/res/drawable/ic_content_copy_black_24dp.xml mode change 100755 => 100644 app/src/main/res/drawable/ic_nfc_white_24dp.xml mode change 100755 => 100644 app/src/main/res/drawable/ic_wrench_white_24dp.xml mode change 100755 => 100644 gradlew diff --git a/app/src/main/java/com/tangem/App.java b/app/src/main/java/com/tangem/App.java index b63bdafa7e..8f8a25d409 100644 --- a/app/src/main/java/com/tangem/App.java +++ b/app/src/main/java/com/tangem/App.java @@ -3,10 +3,13 @@ package com.tangem; import android.app.Application; import android.support.v7.app.AppCompatDelegate; +import com.tangem.data.db.PINStorage; import com.tangem.di.DaggerNavigatorComponent; import com.tangem.di.DaggerNetworkComponent; import com.tangem.di.NavigatorComponent; import com.tangem.di.NetworkComponent; +import com.tangem.domain.cardReader.Firmwares; +import com.tangem.domain.wallet.Issuer; public class App extends Application { @@ -38,6 +41,16 @@ public class App extends Application { networkComponent = DaggerNetworkComponent.create(); navigatorComponent = buildNavigatorComponent(); + + // common init + if (PINStorage.needInit()) + PINStorage.init(getApplicationContext()); + + if (Issuer.needInit()) + Issuer.init(getApplicationContext()); + + if (Firmwares.needInit()) + Firmwares.init(getApplicationContext()); } /** diff --git a/app/src/main/java/com/tangem/data/nfc/ReadCardInfoTask.java b/app/src/main/java/com/tangem/data/nfc/ReadCardInfoTask.java index f0fa541df9..f7300a2d35 100644 --- a/app/src/main/java/com/tangem/data/nfc/ReadCardInfoTask.java +++ b/app/src/main/java/com/tangem/data/nfc/ReadCardInfoTask.java @@ -27,8 +27,8 @@ public class ReadCardInfoTask extends Thread { private static String lastRead_UID; public static void resetLastReadInfo() { - lastRead_UID=""; - lastRead_Encryption=null; + lastRead_UID = ""; + lastRead_Encryption = null; lastRead_UnsuccessfullPINs.clear(); } diff --git a/app/src/main/java/com/tangem/presentation/activity/ConfirmPaymentActivity.kt b/app/src/main/java/com/tangem/presentation/activity/ConfirmPaymentActivity.kt index 9b3741d068..e0c1b86d45 100644 --- a/app/src/main/java/com/tangem/presentation/activity/ConfirmPaymentActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/ConfirmPaymentActivity.kt @@ -61,7 +61,7 @@ class ConfirmPaymentActivity : AppCompatActivity(), NfcAdapter.ReaderCallback { super.onCreate(savedInstanceState) setContentView(R.layout.activity_confirm_payment) - MainActivity.commonInit(applicationContext) +// MainActivity.commonInit(applicationContext) nfcManager = NfcManager(this, this) diff --git a/app/src/main/java/com/tangem/presentation/activity/CreateNewWalletActivity.kt b/app/src/main/java/com/tangem/presentation/activity/CreateNewWalletActivity.kt index f1334508bd..0e7cdd8655 100644 --- a/app/src/main/java/com/tangem/presentation/activity/CreateNewWalletActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/CreateNewWalletActivity.kt @@ -43,7 +43,7 @@ class CreateNewWalletActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, super.onCreate(savedInstanceState) setContentView(R.layout.activity_create_new_wallet) - MainActivity.commonInit(applicationContext) +// MainActivity.commonInit(applicationContext) nfcManager = NfcManager(this, this) diff --git a/app/src/main/java/com/tangem/presentation/activity/EmptyWalletActivity.kt b/app/src/main/java/com/tangem/presentation/activity/EmptyWalletActivity.kt index e31879e9cc..c899e343da 100644 --- a/app/src/main/java/com/tangem/presentation/activity/EmptyWalletActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/EmptyWalletActivity.kt @@ -46,7 +46,7 @@ class EmptyWalletActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, Card super.onCreate(savedInstanceState) setContentView(R.layout.activity_empty_wallet) - MainActivity.commonInit(applicationContext) +// MainActivity.commonInit(applicationContext) nfcManager = NfcManager(this, this) diff --git a/app/src/main/java/com/tangem/presentation/activity/LoadedWalletActivity.kt b/app/src/main/java/com/tangem/presentation/activity/LoadedWalletActivity.kt index 1356658cb8..016901085d 100644 --- a/app/src/main/java/com/tangem/presentation/activity/LoadedWalletActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/LoadedWalletActivity.kt @@ -33,7 +33,7 @@ class LoadedWalletActivity : AppCompatActivity() { App.getNavigatorComponent().inject(this) - MainActivity.commonInit(applicationContext) +// MainActivity.commonInit(applicationContext) if (intent.extras!!.containsKey(NfcAdapter.EXTRA_TAG)) { val tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG) diff --git a/app/src/main/java/com/tangem/presentation/activity/MainActivity.kt b/app/src/main/java/com/tangem/presentation/activity/MainActivity.kt index 91186d4325..c923abe3c4 100644 --- a/app/src/main/java/com/tangem/presentation/activity/MainActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/MainActivity.kt @@ -55,16 +55,16 @@ class MainActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, CardProtoco fun callingIntent(context: Context) = Intent(context, MainActivity::class.java) - fun commonInit(context: Context) { - if (PINStorage.needInit()) - PINStorage.init(context) - - if (Issuer.needInit()) - Issuer.init(context) - - if (Firmwares.needInit()) - Firmwares.init(context) - } +// fun commonInit(context: Context) { +// if (PINStorage.needInit()) +// PINStorage.init(context) +// +// if (Issuer.needInit()) +// Issuer.init(context) +// +// if (Firmwares.needInit()) +// Firmwares.init(context) +// } } private var nfcManager: NfcManager? = null @@ -101,7 +101,7 @@ class MainActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, CardProtoco requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_NOSENSOR - commonInit(applicationContext) +// commonInit(applicationContext) setNfcAdapterReaderCallback(this) diff --git a/app/src/main/java/com/tangem/presentation/activity/PinRequestActivity.kt b/app/src/main/java/com/tangem/presentation/activity/PinRequestActivity.kt index 820dfb4dae..c91c59a6fc 100644 --- a/app/src/main/java/com/tangem/presentation/activity/PinRequestActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/PinRequestActivity.kt @@ -53,7 +53,7 @@ class PinRequestActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, Finge super.onCreate(savedInstanceState) setContentView(R.layout.activity_pin_request) - MainActivity.commonInit(applicationContext) +// MainActivity.commonInit(applicationContext) nfcManager = NfcManager(this, this) diff --git a/app/src/main/java/com/tangem/presentation/activity/PinSaveActivity.kt b/app/src/main/java/com/tangem/presentation/activity/PinSaveActivity.kt index de85d4c251..c5a0d1f57a 100644 --- a/app/src/main/java/com/tangem/presentation/activity/PinSaveActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/PinSaveActivity.kt @@ -56,7 +56,7 @@ class PinSaveActivity : AppCompatActivity(), FingerprintHelper.FingerprintHelper super.onCreate(savedInstanceState) setContentView(R.layout.activity_pin_save) - MainActivity.commonInit(applicationContext) +// MainActivity.commonInit(applicationContext) usePIN2 = intent.getBooleanExtra("PIN2", false) diff --git a/app/src/main/java/com/tangem/presentation/activity/PinSwapActivity.kt b/app/src/main/java/com/tangem/presentation/activity/PinSwapActivity.kt index 9b7c749348..4bdac7b598 100644 --- a/app/src/main/java/com/tangem/presentation/activity/PinSwapActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/PinSwapActivity.kt @@ -44,7 +44,7 @@ class PinSwapActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, CardProt super.onCreate(savedInstanceState) setContentView(R.layout.activity_pin_swap) - MainActivity.commonInit(applicationContext) +// MainActivity.commonInit(applicationContext) nfcManager = NfcManager(this, this) diff --git a/app/src/main/java/com/tangem/presentation/activity/PrepareCryptonitOtherApiWithdrawalActivity.kt b/app/src/main/java/com/tangem/presentation/activity/PrepareCryptonitOtherApiWithdrawalActivity.kt index d7f21d2cac..ad2c17d0e5 100644 --- a/app/src/main/java/com/tangem/presentation/activity/PrepareCryptonitOtherApiWithdrawalActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/PrepareCryptonitOtherApiWithdrawalActivity.kt @@ -38,7 +38,7 @@ class PrepareCryptonitOtherApiWithdrawalActivity : AppCompatActivity(), NfcAdapt super.onCreate(savedInstanceState) setContentView(R.layout.activity_prepare_cryptonit_other_api_withdrawal) - MainActivity.commonInit(applicationContext) +// MainActivity.commonInit(applicationContext) nfcManager = NfcManager(this, this) @@ -57,7 +57,7 @@ class PrepareCryptonitOtherApiWithdrawalActivity : AppCompatActivity(), NfcAdapt tvCurrency.text = engine!!.balanceCurrency etAmount.setText(engine.convertToAmount(engine.convertToInternalAmount(ctx.card!!.denomination)).toValueString()) - etAmount.filters=engine.amountInputFilters + etAmount.filters = engine.amountInputFilters // set listeners btnLoad.setOnClickListener { @@ -66,7 +66,7 @@ class PrepareCryptonitOtherApiWithdrawalActivity : AppCompatActivity(), NfcAdapt val strAmount: String = etAmount.text.toString().replace(",", ".") // if (!engine.checkAmount(card, strAmount)) // etAmount.error = getString(R.string.unknown_amount_format) - var dblAmount: Double = strAmount.toDouble() + val dblAmount: Double = strAmount.toDouble() rlProgressBar.visibility = View.VISIBLE tvProgressDescription.text = getString(R.string.cryptonit_request_withdrawal) @@ -177,8 +177,8 @@ class PrepareCryptonitOtherApiWithdrawalActivity : AppCompatActivity(), NfcAdapt override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) - if( resultCode == Activity.RESULT_OK && data != null && data.extras!!.containsKey("QRCode") ) { - when(requestCode) { + if (resultCode == Activity.RESULT_OK && data != null && data.extras!!.containsKey("QRCode")) { + when (requestCode) { REQUEST_CODE_SCAN_QR_KEY -> { cryptonit!!.key = data.getStringExtra("QRCode") tvKey!!.text = cryptonit!!.key diff --git a/app/src/main/java/com/tangem/presentation/activity/PrepareCryptonitWithdrawalActivity.kt b/app/src/main/java/com/tangem/presentation/activity/PrepareCryptonitWithdrawalActivity.kt index 167739a07a..edc71f556c 100644 --- a/app/src/main/java/com/tangem/presentation/activity/PrepareCryptonitWithdrawalActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/PrepareCryptonitWithdrawalActivity.kt @@ -39,7 +39,7 @@ class PrepareCryptonitWithdrawalActivity : AppCompatActivity(), NfcAdapter.Reade super.onCreate(savedInstanceState) setContentView(R.layout.activity_prepare_cryptonit_withdrawal) - MainActivity.commonInit(applicationContext) +// MainActivity.commonInit(applicationContext) nfcManager = NfcManager(this, this) diff --git a/app/src/main/java/com/tangem/presentation/activity/PrepareKrakenWithdrawalActivity.kt b/app/src/main/java/com/tangem/presentation/activity/PrepareKrakenWithdrawalActivity.kt index 1bafe7e5a3..bfbf3652f6 100644 --- a/app/src/main/java/com/tangem/presentation/activity/PrepareKrakenWithdrawalActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/PrepareKrakenWithdrawalActivity.kt @@ -45,7 +45,7 @@ class PrepareKrakenWithdrawalActivity : AppCompatActivity(), NfcAdapter.ReaderCa super.onCreate(savedInstanceState) setContentView(R.layout.activity_prepare_kraken_withdrawal) - MainActivity.commonInit(applicationContext) +// MainActivity.commonInit(applicationContext) nfcManager = NfcManager(this, this) diff --git a/app/src/main/java/com/tangem/presentation/activity/PreparePaymentActivity.kt b/app/src/main/java/com/tangem/presentation/activity/PreparePaymentActivity.kt index 987f307e47..456d8d8b0a 100644 --- a/app/src/main/java/com/tangem/presentation/activity/PreparePaymentActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/PreparePaymentActivity.kt @@ -37,7 +37,7 @@ class PreparePaymentActivity : AppCompatActivity(), NfcAdapter.ReaderCallback { super.onCreate(savedInstanceState) setContentView(R.layout.activity_prepare_payment) - MainActivity.commonInit(applicationContext) +// MainActivity.commonInit(applicationContext) nfcManager = NfcManager(this, this) diff --git a/app/src/main/java/com/tangem/presentation/activity/PurgeActivity.kt b/app/src/main/java/com/tangem/presentation/activity/PurgeActivity.kt index bc74b7da35..ddb499459b 100644 --- a/app/src/main/java/com/tangem/presentation/activity/PurgeActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/PurgeActivity.kt @@ -42,7 +42,7 @@ class PurgeActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, CardProtoc nfcManager = NfcManager(this, this) - MainActivity.commonInit(applicationContext) +// MainActivity.commonInit(applicationContext) ctx = TangemContext.loadFromBundle(this, intent.extras) diff --git a/app/src/main/java/com/tangem/presentation/activity/SendTransactionActivity.kt b/app/src/main/java/com/tangem/presentation/activity/SendTransactionActivity.kt index 279c561445..9dfd11aa45 100644 --- a/app/src/main/java/com/tangem/presentation/activity/SendTransactionActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/SendTransactionActivity.kt @@ -36,7 +36,7 @@ class SendTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallback { super.onCreate(savedInstanceState) setContentView(R.layout.activity_send_transaction) - MainActivity.commonInit(applicationContext) +// MainActivity.commonInit(applicationContext) nfcManager = NfcManager(this, this) diff --git a/app/src/main/java/com/tangem/presentation/activity/SignPaymentActivity.kt b/app/src/main/java/com/tangem/presentation/activity/SignPaymentActivity.kt index 52c13893f4..324c129de2 100644 --- a/app/src/main/java/com/tangem/presentation/activity/SignPaymentActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/SignPaymentActivity.kt @@ -56,7 +56,7 @@ class SignPaymentActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, Card super.onCreate(savedInstanceState) setContentView(R.layout.activity_sign_payment) - MainActivity.commonInit(applicationContext) +// MainActivity.commonInit(applicationContext) nfcManager = NfcManager(this, this) diff --git a/app/src/main/java/com/tangem/presentation/activity/VerifyCardActivity.kt b/app/src/main/java/com/tangem/presentation/activity/VerifyCardActivity.kt index 6841d4bc83..54203243e7 100644 --- a/app/src/main/java/com/tangem/presentation/activity/VerifyCardActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/VerifyCardActivity.kt @@ -34,7 +34,7 @@ class VerifyCardActivity : AppCompatActivity() { App.getNavigatorComponent().inject(this) - MainActivity.commonInit(applicationContext) +// MainActivity.commonInit(applicationContext) } override fun onBackPressed() { diff --git a/app/src/main/java/com/tangem/presentation/dialog/WaitSecurityDelayDialog.java b/app/src/main/java/com/tangem/presentation/dialog/WaitSecurityDelayDialog.java index 00a53361a6..8e61a1087b 100644 --- a/app/src/main/java/com/tangem/presentation/dialog/WaitSecurityDelayDialog.java +++ b/app/src/main/java/com/tangem/presentation/dialog/WaitSecurityDelayDialog.java @@ -143,6 +143,7 @@ public class WaitSecurityDelayDialog extends DialogFragment { if (msec == 0) { if (instance != null) { + // TODO java.lang.NullPointerException: Attempt to invoke virtual method 'android.support.v4.app.FragmentTransaction android.support.v4.app.FragmentManager.beginTransaction()' on a null object reference instance.dismiss(); instance = null; } diff --git a/app/src/main/res/drawable/ic_content_copy_black_24dp.xml b/app/src/main/res/drawable/ic_content_copy_black_24dp.xml old mode 100755 new mode 100644 diff --git a/app/src/main/res/drawable/ic_nfc_white_24dp.xml b/app/src/main/res/drawable/ic_nfc_white_24dp.xml old mode 100755 new mode 100644 diff --git a/app/src/main/res/drawable/ic_wrench_white_24dp.xml b/app/src/main/res/drawable/ic_wrench_white_24dp.xml old mode 100755 new mode 100644 diff --git a/gradlew b/gradlew old mode 100755 new mode 100644 From cd34e37675cf81a198a5830f1bcc2e673c4accea Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 4 Dec 2018 19:13:22 +0300 Subject: [PATCH 04/61] Updated on 2026-08-14 --- app/src/main/AndroidManifest.xml | 7 +++-- app/src/main/java/com/tangem/Constant.kt | 5 ++++ app/src/main/java/com/tangem/di/Navigator.kt | 13 +++++++--- .../presentation/activity/LogoActivity.kt | 14 +++++++--- .../presentation/activity/MainActivity.kt | 26 +++---------------- .../presentation/activity/PinSaveActivity.kt | 16 ++++++++++-- 6 files changed, 46 insertions(+), 35 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b2cea5d8f7..ac8f4dbac1 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,5 +1,6 @@ - + @@ -20,11 +21,13 @@ + android:theme="@style/AppTheme" + tools:ignore="GoogleAppIndexingWarning"> { var f: File? = null @@ -231,17 +230,17 @@ class MainActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, CardProtoco return true } R.id.managePIN -> { - showSavePinActivity() + navigator.showPinSave(this, false) return true } R.id.managePIN2 -> { - showSavePin2Activity() + navigator.showPinSave(this, true) return true } R.id.about -> { - showLogoActivity() + navigator.showLogo(this, false) return true } } @@ -391,13 +390,6 @@ class MainActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, CardProtoco onNfcReaderCallback = callback } - private fun showLogoActivity() { - val intent = Intent(baseContext, LogoActivity::class.java) - intent.putExtra(LogoActivity.TAG, true) - intent.putExtra(LogoActivity.EXTRA_AUTO_HIDE, false) - startActivity(intent) - } - private fun animate() { val lp = llHand.layoutParams as RelativeLayout.LayoutParams val lp2 = llNfc.layoutParams as RelativeLayout.LayoutParams @@ -418,18 +410,6 @@ class MainActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, CardProtoco llHand.startAnimation(a) } - private fun showSavePinActivity() { - val intent = Intent(baseContext, PinSaveActivity::class.java) - intent.putExtra("PIN2", false) - startActivity(intent) - } - - private fun showSavePin2Activity() { - val intent = Intent(baseContext, PinSaveActivity::class.java) - intent.putExtra("PIN2", true) - startActivity(intent) - } - private fun showMenu(v: View) { val popup = PopupMenu(this, v) val inflater = popup.menuInflater diff --git a/app/src/main/java/com/tangem/presentation/activity/PinSaveActivity.kt b/app/src/main/java/com/tangem/presentation/activity/PinSaveActivity.kt index c5a0d1f57a..0cedd9d5b2 100644 --- a/app/src/main/java/com/tangem/presentation/activity/PinSaveActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/PinSaveActivity.kt @@ -6,6 +6,7 @@ import android.annotation.TargetApi import android.app.Dialog import android.app.KeyguardManager import android.content.Context +import android.content.Intent import android.content.pm.PackageManager import android.hardware.fingerprint.FingerprintManager import android.os.Build @@ -19,9 +20,10 @@ import android.text.TextUtils import android.view.View import android.widget.Button import android.widget.Toast +import com.tangem.Constant +import com.tangem.data.db.PINStorage import com.tangem.data.fingerprint.ConfirmWithFingerprintTask import com.tangem.data.fingerprint.FingerprintHelper -import com.tangem.data.db.PINStorage import com.tangem.wallet.R import kotlinx.android.synthetic.main.activity_pin_save.* import kotlinx.android.synthetic.main.layout_pin_buttons.* @@ -38,6 +40,16 @@ import javax.crypto.spec.IvParameterSpec class PinSaveActivity : AppCompatActivity(), FingerprintHelper.FingerprintHelperListener { + companion object { + val TAG: String = PinSaveActivity::class.java.simpleName + + fun callingIntent(context: Context, hasPin2: Boolean): Intent { + val intent = Intent(context, PinSaveActivity::class.java) + intent.putExtra(Constant.EXTRA_PIN2, hasPin2) + return intent + } + } + private var confirmWithFingerprintTask: ConfirmWithFingerprintTask? = null private var keyStore: KeyStore? = null private var cipher: Cipher? = null @@ -58,7 +70,7 @@ class PinSaveActivity : AppCompatActivity(), FingerprintHelper.FingerprintHelper // MainActivity.commonInit(applicationContext) - usePIN2 = intent.getBooleanExtra("PIN2", false) + usePIN2 = intent.getBooleanExtra(Constant.EXTRA_PIN2, false) if (usePIN2) tvPinPrompt.text = getString(R.string.enter_pin2_and_use_fingerprint_to_save_it) From c1c91c9ed9f1b6da2ef493fab1b0f1db088a9908 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 4 Dec 2018 23:59:26 +0300 Subject: [PATCH 05/61] Updated on 2026-08-14 --- app/src/main/java/com/tangem/Constant.kt | 7 ++++++ app/src/main/java/com/tangem/di/Navigator.kt | 9 +++++--- .../presentation/activity/MainActivity.kt | 12 ++-------- .../activity/PinRequestActivity.kt | 8 +++++++ .../presentation/activity/PinSwapActivity.kt | 14 +++++++++-- .../presentation/fragment/LoadedWallet.kt | 23 +++---------------- .../presentation/fragment/VerifyCard.kt | 21 ++++++++--------- 7 files changed, 47 insertions(+), 47 deletions(-) diff --git a/app/src/main/java/com/tangem/Constant.kt b/app/src/main/java/com/tangem/Constant.kt index cc90cd9b50..2ce7970ca6 100644 --- a/app/src/main/java/com/tangem/Constant.kt +++ b/app/src/main/java/com/tangem/Constant.kt @@ -33,4 +33,11 @@ object Constant { const val EXTRA_AUTO_HIDE = "extra_auto_hide" const val MILLIS_AUTO_HIDE = 1000 + // PinRequestActivity + const val EXTRA_MODE = "mode" + + // PinSwapActivity + const val EXTRA_NEW_PIN = "newPIN" + const val EXTRA_NEW_PIN_2 = "newPIN2" + } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/di/Navigator.kt b/app/src/main/java/com/tangem/di/Navigator.kt index b49904b0fe..bfa5abc229 100644 --- a/app/src/main/java/com/tangem/di/Navigator.kt +++ b/app/src/main/java/com/tangem/di/Navigator.kt @@ -7,7 +7,6 @@ import com.tangem.Constant import com.tangem.domain.wallet.CoinData import com.tangem.domain.wallet.TangemCard import com.tangem.presentation.activity.* -import com.tangem.presentation.fragment.LoadedWallet class Navigator { @@ -23,6 +22,10 @@ class Navigator { context.startActivity(PinSaveActivity.callingIntent(context, hasPin2)) } + fun showPinRequest(context: Activity, mode: String) { + context.startActivityForResult(PinRequestActivity.callingIntent(context, mode), Constant.REQUEST_CODE_ENTER_PIN_ACTIVITY) + } + fun showLoadedWallet(context: Activity, lastTag: Tag, cardInfo: Bundle) { context.startActivityForResult(LoadedWalletActivity.callingIntent(context, lastTag, cardInfo), Constant.REQUEST_CODE_SHOW_CARD_ACTIVITY) } @@ -35,8 +38,8 @@ class Navigator { context.startActivityForResult(VerifyCardActivity.callingIntent(context, card, coinData), Constant.REQUEST_CODE_VERIFY_CARD) } - fun showPinSwap(context: Activity) { - + fun showPinSwap(context: Activity, newPIN: String, newPIN2: String) { + context.startActivityForResult(PinSwapActivity.callingIntent(context, newPIN, newPIN2), Constant.REQUEST_CODE_SWAP_PIN) } // fun showPreparePayment(context: Activity) { diff --git a/app/src/main/java/com/tangem/presentation/activity/MainActivity.kt b/app/src/main/java/com/tangem/presentation/activity/MainActivity.kt index dbdeff2cf7..91be7820e1 100644 --- a/app/src/main/java/com/tangem/presentation/activity/MainActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/MainActivity.kt @@ -27,15 +27,13 @@ import com.scottyab.rootbeer.RootBeer import com.tangem.App import com.tangem.Constant import com.tangem.data.Logger -import com.tangem.data.db.PINStorage import com.tangem.data.network.ServerApiCommon import com.tangem.data.nfc.DeviceNFCAntennaLocation import com.tangem.data.nfc.ReadCardInfoTask import com.tangem.di.Navigator import com.tangem.domain.cardReader.CardProtocol -import com.tangem.domain.cardReader.Firmwares import com.tangem.domain.cardReader.NfcManager -import com.tangem.domain.wallet.* +import com.tangem.domain.wallet.TangemCard import com.tangem.presentation.dialog.NoExtendedLengthSupportDialog import com.tangem.presentation.dialog.RootFoundDialog import com.tangem.presentation.dialog.WaitSecurityDelayDialog @@ -339,7 +337,7 @@ class MainActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, CardProtoco unsuccessReadCount++ if (cardProtocol.error is CardProtocol.TangemException_InvalidPIN) - doEnterPIN() + navigator.showPinRequest(this, PinRequestActivity.Mode.RequestPIN.toString()) else { if (cardProtocol.error is CardProtocol.TangemException_ExtendedLengthNotSupported) if (!NoExtendedLengthSupportDialog.allReadyShowed) @@ -425,10 +423,4 @@ class MainActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, CardProtoco popup.show() } - private fun doEnterPIN() { - val intent = Intent(this, PinRequestActivity::class.java) - intent.putExtra("mode", PinRequestActivity.Mode.RequestPIN.toString()) - startActivityForResult(intent, Constant.REQUEST_CODE_ENTER_PIN_ACTIVITY) - } - } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/presentation/activity/PinRequestActivity.kt b/app/src/main/java/com/tangem/presentation/activity/PinRequestActivity.kt index c91c59a6fc..faa7b4c7d2 100644 --- a/app/src/main/java/com/tangem/presentation/activity/PinRequestActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/PinRequestActivity.kt @@ -19,10 +19,12 @@ import android.text.TextUtils import android.util.Log import android.view.View import android.widget.Button +import com.tangem.Constant import com.tangem.data.fingerprint.StartFingerprintReaderTask import com.tangem.domain.cardReader.NfcManager import com.tangem.data.fingerprint.FingerprintHelper import com.tangem.data.db.PINStorage +import com.tangem.domain.wallet.CoinData import com.tangem.domain.wallet.TangemCard import com.tangem.wallet.R import kotlinx.android.synthetic.main.activity_pin_request.* @@ -34,6 +36,12 @@ class PinRequestActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, Finge companion object { const val KEY_ALIAS = "pinKey" const val KEYSTORE = "AndroidKeyStore" + + fun callingIntent(context: Activity, mode: String): Intent { + val intent = Intent(context, PinRequestActivity::class.java) + intent.putExtra(Constant.EXTRA_MODE, mode) + return intent + } } lateinit var mode: Mode diff --git a/app/src/main/java/com/tangem/presentation/activity/PinSwapActivity.kt b/app/src/main/java/com/tangem/presentation/activity/PinSwapActivity.kt index 4bdac7b598..505e411d4e 100644 --- a/app/src/main/java/com/tangem/presentation/activity/PinSwapActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/PinSwapActivity.kt @@ -1,6 +1,7 @@ package com.tangem.presentation.activity import android.app.Activity +import android.content.Context import android.content.Intent import android.content.res.ColorStateList import android.graphics.Color @@ -12,9 +13,11 @@ import android.support.v7.app.AppCompatActivity import android.view.View import android.widget.ProgressBar import android.widget.Toast +import com.tangem.Constant import com.tangem.data.nfc.SwapPINTask import com.tangem.domain.cardReader.CardProtocol import com.tangem.domain.cardReader.NfcManager +import com.tangem.domain.wallet.CoinData import com.tangem.domain.wallet.TangemCard import com.tangem.presentation.dialog.NoExtendedLengthSupportDialog import com.tangem.presentation.dialog.WaitSecurityDelayDialog @@ -27,6 +30,13 @@ class PinSwapActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, CardProt companion object { val TAG: String = PinSwapActivity::class.java.simpleName + fun callingIntent(context: Context, newPIN: String, newPIN2: String): Intent { + val intent = Intent(context, PinSwapActivity::class.java) + intent.putExtra(Constant.EXTRA_NEW_PIN, newPIN) + intent.putExtra(Constant.EXTRA_NEW_PIN_2, newPIN2) + return intent + } + const val RESULT_INVALID_PIN = Activity.RESULT_FIRST_USER } @@ -51,8 +61,8 @@ class PinSwapActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, CardProt card = TangemCard(intent.getStringExtra(TangemCard.EXTRA_UID)) card!!.loadFromBundle(intent.extras!!.getBundle(TangemCard.EXTRA_CARD)) - newPIN = intent.getStringExtra("newPIN") - newPIN2 = intent.getStringExtra("newPIN2") + newPIN = intent.getStringExtra(Constant.EXTRA_NEW_PIN) + newPIN2 = intent.getStringExtra(Constant.EXTRA_NEW_PIN_2) tvCardID.text = card!!.cidDescription diff --git a/app/src/main/java/com/tangem/presentation/fragment/LoadedWallet.kt b/app/src/main/java/com/tangem/presentation/fragment/LoadedWallet.kt index 3c315e1c07..cb93210152 100644 --- a/app/src/main/java/com/tangem/presentation/fragment/LoadedWallet.kt +++ b/app/src/main/java/com/tangem/presentation/fragment/LoadedWallet.kt @@ -183,9 +183,7 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific } btnDetails.setOnClickListener { if (cardProtocol != null) -// openVerifyCard(cardProtocol!!) (activity as LoadedWalletActivity).navigator.showVerifyCard(context as Activity, ctx.card, ctx.coinData) - else showSingleToast(R.string.need_attach_card_again) } @@ -537,7 +535,7 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific newPIN2 = PINStorage.getPIN2() val pinSwapWarningDialog = PINSwapWarningDialog() - pinSwapWarningDialog.setOnRefreshPage { startSwapPINActivity() } + pinSwapWarningDialog.setOnRefreshPage { (activity as LoadedWalletActivity).navigator.showPinSwap(context as Activity, newPIN, newPIN2) } val bundle = Bundle() if (!PINStorage.isDefaultPIN(newPIN) || !PINStorage.isDefaultPIN2(newPIN2)) bundle.putString(PINSwapWarningDialog.EXTRA_MESSAGE, getString(R.string.if_you_forget)) @@ -874,17 +872,10 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific } } -// private fun openVerifyCard(cardProtocol: CardProtocol) { -// val intent = Intent(activity, VerifyCardActivity::class.java) -// ctx.saveToIntent(intent) -// startActivityForResult(intent, REQUEST_CODE_VERIFY_CARD) -// -// ctx.coinData -// } - private fun startVerify(tag: Tag?) { try { - val isoDep = IsoDep.get(tag) ?: throw CardProtocol.TangemException(getString(R.string.wrong_tag_err)) + val isoDep = IsoDep.get(tag) + ?: throw CardProtocol.TangemException(getString(R.string.wrong_tag_err)) val uid = tag!!.id val sUID = Util.byteArrayToHexString(uid) if (ctx.card.uid != sUID) { @@ -942,14 +933,6 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific } } - private fun startSwapPINActivity() { - val intent = Intent(activity, PinSwapActivity::class.java) - ctx.saveToIntent(intent) - intent.putExtra("newPIN", newPIN) - intent.putExtra("newPIN2", newPIN2) - startActivityForResult(intent, Constant.REQUEST_CODE_SWAP_PIN) - } - private var showTime: Date = Date() private fun showSingleToast(text: Int) { diff --git a/app/src/main/java/com/tangem/presentation/fragment/VerifyCard.kt b/app/src/main/java/com/tangem/presentation/fragment/VerifyCard.kt index e9c1f257b1..3568eff663 100644 --- a/app/src/main/java/com/tangem/presentation/fragment/VerifyCard.kt +++ b/app/src/main/java/com/tangem/presentation/fragment/VerifyCard.kt @@ -17,10 +17,7 @@ import com.tangem.Constant import com.tangem.data.db.PINStorage import com.tangem.domain.cardReader.NfcManager import com.tangem.domain.wallet.* -import com.tangem.presentation.activity.CreateNewWalletActivity -import com.tangem.presentation.activity.PurgeActivity -import com.tangem.presentation.activity.PinRequestActivity -import com.tangem.presentation.activity.PinSwapActivity +import com.tangem.presentation.activity.* import com.tangem.presentation.dialog.PINSwapWarningDialog import com.tangem.wallet.BuildConfig import com.tangem.wallet.R @@ -135,7 +132,7 @@ class VerifyCard : Fragment(), NfcAdapter.ReaderCallback { if (newPIN2 == "") newPIN2 = PINStorage.getPIN2() val pinSwapWarningDialog = PINSwapWarningDialog() - pinSwapWarningDialog.setOnRefreshPage { startSwapPINActivity() } + pinSwapWarningDialog.setOnRefreshPage { (activity as VerifyCardActivity).navigator.showPinSwap(context as Activity, newPIN, newPIN2) } val bundle = Bundle() if (!PINStorage.isDefaultPIN(newPIN) || !PINStorage.isDefaultPIN2(newPIN2)) bundle.putString(PINSwapWarningDialog.EXTRA_MESSAGE, getString(R.string.if_you_forget)) @@ -481,13 +478,13 @@ class VerifyCard : Fragment(), NfcAdapter.ReaderCallback { startActivityForResult(intent, REQUEST_CODE_REQUEST_PIN2_FOR_PURGE) } - private fun startSwapPINActivity() { - val intent = Intent(context, PinSwapActivity::class.java) - ctx.saveToIntent(intent) - intent.putExtra("newPIN", newPIN) - intent.putExtra("newPIN2", newPIN2) - startActivityForResult(intent, REQUEST_CODE_SWAP_PIN) - } +// private fun startSwapPINActivity() { +// val intent = Intent(context, PinSwapActivity::class.java) +// ctx.saveToIntent(intent) +// intent.putExtra("newPIN", newPIN) +// intent.putExtra("newPIN2", newPIN2) +// startActivityForResult(intent, REQUEST_CODE_SWAP_PIN) +// } fun prepareResultIntent(): Intent { val data = Intent() From 98806df725a72452043150ad3e70da2c0ca2c361 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 5 Dec 2018 00:19:41 +0300 Subject: [PATCH 06/61] Updated on 2026-08-14 --- app/src/main/java/com/tangem/Constant.kt | 2 +- app/src/main/java/com/tangem/di/Navigator.kt | 18 +++--- .../presentation/fragment/VerifyCard.kt | 62 +++++++------------ 3 files changed, 35 insertions(+), 47 deletions(-) diff --git a/app/src/main/java/com/tangem/Constant.kt b/app/src/main/java/com/tangem/Constant.kt index 2ce7970ca6..8e1fdf1955 100644 --- a/app/src/main/java/com/tangem/Constant.kt +++ b/app/src/main/java/com/tangem/Constant.kt @@ -9,7 +9,7 @@ object Constant { const val EXTRA_MODIFICATION = "modification" - // LoadedWallet + // LoadedWallet, VerifyCard const val REQUEST_CODE_SEND_PAYMENT = 1 const val REQUEST_CODE_PURGE = 2 const val REQUEST_CODE_REQUEST_PIN2_FOR_PURGE = 3 diff --git a/app/src/main/java/com/tangem/di/Navigator.kt b/app/src/main/java/com/tangem/di/Navigator.kt index bfa5abc229..82ca8238fb 100644 --- a/app/src/main/java/com/tangem/di/Navigator.kt +++ b/app/src/main/java/com/tangem/di/Navigator.kt @@ -42,12 +42,16 @@ class Navigator { context.startActivityForResult(PinSwapActivity.callingIntent(context, newPIN, newPIN2), Constant.REQUEST_CODE_SWAP_PIN) } -// fun showPreparePayment(context: Activity) { -// -// } -// -// fun showCreateNewWallet(context: Activity) { -// -// } + fun showPurge(context: Activity) { + + } + + fun showPreparePayment(context: Activity) { + + } + + fun showCreateNewWallet(context: Activity) { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/presentation/fragment/VerifyCard.kt b/app/src/main/java/com/tangem/presentation/fragment/VerifyCard.kt index 3568eff663..0ef5bddedf 100644 --- a/app/src/main/java/com/tangem/presentation/fragment/VerifyCard.kt +++ b/app/src/main/java/com/tangem/presentation/fragment/VerifyCard.kt @@ -30,14 +30,6 @@ class VerifyCard : Fragment(), NfcAdapter.ReaderCallback { companion object { val TAG: String = VerifyCard::class.java.simpleName - private const val REQUEST_CODE_SEND_PAYMENT = 1 - private const val REQUEST_CODE_PURGE = 2 - private const val REQUEST_CODE_REQUEST_PIN2_FOR_PURGE = 3 - private const val REQUEST_CODE_VERIFY_CARD = 4 - private const val REQUEST_CODE_ENTER_NEW_PIN = 5 - private const val REQUEST_CODE_ENTER_NEW_PIN2 = 6 - private const val REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN = 7 - private const val REQUEST_CODE_SWAP_PIN = 8 } private var nfcManager: NfcManager? = null @@ -94,39 +86,39 @@ class VerifyCard : Fragment(), NfcAdapter.ReaderCallback { var data = data super.onActivityResult(requestCode, resultCode, data) when (requestCode) { - REQUEST_CODE_ENTER_NEW_PIN -> if (resultCode == Activity.RESULT_OK) { + Constant.REQUEST_CODE_ENTER_NEW_PIN -> if (resultCode == Activity.RESULT_OK) { if (data != null) { if (data.extras!!.containsKey("confirmPIN")) { val intent = Intent(context, PinRequestActivity::class.java) intent.putExtra("mode", PinRequestActivity.Mode.RequestPIN2.toString()) ctx.saveToIntent(intent) newPIN = data.getStringExtra("newPIN") - startActivityForResult(intent, REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN) + startActivityForResult(intent, Constant.REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN) } else { val intent = Intent(context, PinRequestActivity::class.java) intent.putExtra("newPIN", data.getStringExtra("newPIN")) intent.putExtra("mode", PinRequestActivity.Mode.ConfirmNewPIN.toString()) - startActivityForResult(intent, REQUEST_CODE_ENTER_NEW_PIN) + startActivityForResult(intent, Constant.REQUEST_CODE_ENTER_NEW_PIN) } } } - REQUEST_CODE_ENTER_NEW_PIN2 -> if (resultCode == Activity.RESULT_OK) { + Constant.REQUEST_CODE_ENTER_NEW_PIN2 -> if (resultCode == Activity.RESULT_OK) { if (data != null) { if (data.extras!!.containsKey("confirmPIN2")) { val intent = Intent(context, PinRequestActivity::class.java) intent.putExtra("mode", PinRequestActivity.Mode.RequestPIN2.toString()) ctx.saveToIntent(intent) newPIN2 = data.getStringExtra("newPIN2") - startActivityForResult(intent, REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN) + startActivityForResult(intent, Constant.REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN) } else { val intent = Intent(context, PinRequestActivity::class.java) intent.putExtra("newPIN2", data.getStringExtra("newPIN2")) intent.putExtra("mode", PinRequestActivity.Mode.ConfirmNewPIN2.toString()) - startActivityForResult(intent, REQUEST_CODE_ENTER_NEW_PIN2) + startActivityForResult(intent, Constant.REQUEST_CODE_ENTER_NEW_PIN2) } } } - REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN -> if (resultCode == Activity.RESULT_OK) { + Constant.REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN -> if (resultCode == Activity.RESULT_OK) { if (newPIN == "") newPIN = ctx.card!!.pin if (newPIN2 == "") newPIN2 = PINStorage.getPIN2() @@ -142,7 +134,7 @@ class VerifyCard : Fragment(), NfcAdapter.ReaderCallback { pinSwapWarningDialog.show(activity?.supportFragmentManager, PINSwapWarningDialog.TAG) } - REQUEST_CODE_SWAP_PIN -> if (resultCode == Activity.RESULT_OK) { + Constant.REQUEST_CODE_SWAP_PIN -> if (resultCode == Activity.RESULT_OK) { if (data == null) { data = Intent() ctx.saveToIntent(data) @@ -162,7 +154,7 @@ class VerifyCard : Fragment(), NfcAdapter.ReaderCallback { val intent = Intent(context, PinRequestActivity::class.java) intent.putExtra("mode", PinRequestActivity.Mode.RequestPIN2.toString()) ctx.saveToIntent(intent) - startActivityForResult(intent, REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN) + startActivityForResult(intent, Constant.REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN) return } else { if (data != null && data.extras!!.containsKey("message")) { @@ -170,18 +162,18 @@ class VerifyCard : Fragment(), NfcAdapter.ReaderCallback { } } } - REQUEST_CODE_REQUEST_PIN2_FOR_PURGE -> if (resultCode == Activity.RESULT_OK) { + Constant.REQUEST_CODE_REQUEST_PIN2_FOR_PURGE -> if (resultCode == Activity.RESULT_OK) { val intent = Intent(context, PurgeActivity::class.java) ctx.saveToIntent(intent) - startActivityForResult(intent, REQUEST_CODE_PURGE) + startActivityForResult(intent, Constant.REQUEST_CODE_PURGE) } - REQUEST_CODE_PURGE -> if (resultCode == Activity.RESULT_OK) { + Constant.REQUEST_CODE_PURGE -> if (resultCode == Activity.RESULT_OK) { if (data == null) { data = Intent() ctx.saveToIntent(data) - data.putExtra("modification", "delete") + data.putExtra(Constant.EXTRA_MODIFICATION, "delete") } else { - data.putExtra("modification", "update") + data.putExtra(Constant.EXTRA_MODIFICATION, "update") } activity!!.setResult(Activity.RESULT_OK, data) activity!!.finish() @@ -194,9 +186,9 @@ class VerifyCard : Fragment(), NfcAdapter.ReaderCallback { if (resultCode == CreateNewWalletActivity.RESULT_INVALID_PIN && requestPIN2Count < 2) { requestPIN2Count++ val intent = Intent(context, PinRequestActivity::class.java) - intent.putExtra("mode", PinRequestActivity.Mode.RequestPIN2.toString()) + intent.putExtra(Constant.EXTRA_MODE, PinRequestActivity.Mode.RequestPIN2.toString()) ctx.saveToIntent(intent) - startActivityForResult(intent, REQUEST_CODE_REQUEST_PIN2_FOR_PURGE) + startActivityForResult(intent, Constant.REQUEST_CODE_REQUEST_PIN2_FOR_PURGE) return } else { if (data != null && data.extras!!.containsKey("message")) { @@ -205,7 +197,7 @@ class VerifyCard : Fragment(), NfcAdapter.ReaderCallback { } updateViews() } - REQUEST_CODE_SEND_PAYMENT -> { + Constant.REQUEST_CODE_SEND_PAYMENT -> { if (resultCode == Activity.RESULT_OK) { srlVerifyCard.isRefreshing = true ctx.coinData!!.clearInfo() @@ -420,7 +412,7 @@ class VerifyCard : Fragment(), NfcAdapter.ReaderCallback { intent.putExtra("mode", PinRequestActivity.Mode.RequestNewPIN.toString()) newPIN = "" newPIN2 = "" - startActivityForResult(intent, REQUEST_CODE_ENTER_NEW_PIN) + startActivityForResult(intent, Constant.REQUEST_CODE_ENTER_NEW_PIN) } private fun doResetPin() { @@ -430,7 +422,7 @@ class VerifyCard : Fragment(), NfcAdapter.ReaderCallback { ctx.saveToIntent(intent) newPIN = PINStorage.getDefaultPIN() newPIN2 = "" - startActivityForResult(intent, REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN) + startActivityForResult(intent, Constant.REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN) } private fun doResetPin2() { @@ -440,7 +432,7 @@ class VerifyCard : Fragment(), NfcAdapter.ReaderCallback { ctx.saveToIntent(intent) newPIN = "" newPIN2 = PINStorage.getDefaultPIN2() - startActivityForResult(intent, REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN) + startActivityForResult(intent, Constant.REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN) } private fun doResetPins() { @@ -450,7 +442,7 @@ class VerifyCard : Fragment(), NfcAdapter.ReaderCallback { ctx.saveToIntent(intent) newPIN = PINStorage.getDefaultPIN() newPIN2 = PINStorage.getDefaultPIN2() - startActivityForResult(intent, REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN) + startActivityForResult(intent, Constant.REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN) } private fun doSetPin2() { @@ -459,7 +451,7 @@ class VerifyCard : Fragment(), NfcAdapter.ReaderCallback { intent.putExtra("mode", PinRequestActivity.Mode.RequestNewPIN2.toString()) newPIN = "" newPIN2 = "" - startActivityForResult(intent, REQUEST_CODE_ENTER_NEW_PIN2) + startActivityForResult(intent, Constant.REQUEST_CODE_ENTER_NEW_PIN2) } private fun doPurge() { @@ -475,17 +467,9 @@ class VerifyCard : Fragment(), NfcAdapter.ReaderCallback { val intent = Intent(context, PinRequestActivity::class.java) intent.putExtra("mode", PinRequestActivity.Mode.RequestPIN2.toString()) ctx.saveToIntent(intent) - startActivityForResult(intent, REQUEST_CODE_REQUEST_PIN2_FOR_PURGE) + startActivityForResult(intent, Constant.REQUEST_CODE_REQUEST_PIN2_FOR_PURGE) } -// private fun startSwapPINActivity() { -// val intent = Intent(context, PinSwapActivity::class.java) -// ctx.saveToIntent(intent) -// intent.putExtra("newPIN", newPIN) -// intent.putExtra("newPIN2", newPIN2) -// startActivityForResult(intent, REQUEST_CODE_SWAP_PIN) -// } - fun prepareResultIntent(): Intent { val data = Intent() ctx.saveToIntent(data) From 71fe425c1b8f784112bb9177f947b01b225fe042 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 5 Dec 2018 12:40:42 +0300 Subject: [PATCH 07/61] Updated on 2026-08-14 --- .../StartFingerprintReaderTask.java | 2 +- .../java/com/tangem/data/network/Server.java | 14 --- .../tangem/data/network/ServerApiCommon.java | 91 +------------- .../com/tangem/data/nfc}/SignPaymentTask.java | 14 +-- app/src/main/java/com/tangem/di/Navigator.kt | 13 +- .../java/com/tangem/di/NetworkComponent.java | 3 - .../java/com/tangem/di/NetworkModule.java | 11 -- .../com/tangem/domain/wallet/CoinEngine.java | 21 ++++ .../domain/wallet/bch/BtcCashEngine.java | 14 ++- .../tangem/domain/wallet/btc/BtcEngine.java | 15 +-- .../tangem/domain/wallet/eth/EthEngine.java | 14 +-- .../domain/wallet/token/TokenEngine.java | 16 +-- .../activity/ConfirmPaymentActivity.kt | 4 +- .../activity/EmptyWalletActivity.kt | 6 +- .../activity/LoadedWalletActivity.kt | 5 +- .../presentation/activity/MainActivity.kt | 24 ++-- .../activity/PinRequestActivity.kt | 2 +- .../presentation/activity/PinSaveActivity.kt | 2 +- ...pareCryptonitOtherApiWithdrawalActivity.kt | 4 +- .../PrepareCryptonitWithdrawalActivity.kt | 4 +- .../PrepareKrakenWithdrawalActivity.kt | 6 +- .../activity/PreparePaymentActivity.kt | 2 +- .../activity/SendTransactionActivity.kt | 6 +- .../activity/SignPaymentActivity.kt | 22 +++- .../activity/VerifyCardActivity.kt | 9 +- .../presentation/fragment/LoadedWallet.kt | 41 ++++--- .../presentation/fragment/VerifyCard.kt | 4 +- tangemcard/build.gradle | 13 +- tangemcard/src/main/AndroidManifest.xml | 3 +- .../main/java/com/tangem/tangemcard/App.java | 24 ++++ .../com/tangem/tangemcard/data/Issuer.java | 2 +- .../tangem/tangemcard/data/TangemCard.java | 5 +- .../data/{ => local}/Firmwares.java | 2 +- .../data/{ => local}/LocalStorage.kt | 10 +- .../data/{ => local}/PINStorage.java | 2 +- .../tangemcard/data/network/Server.java | 17 +++ .../data/network/ServerApiTangem.java | 113 ++++++++++++++++++ .../tangemcard/data/network/ServerURL.java | 5 + .../tangemcard}/data/network/TangemApi.java | 4 +- .../data/network/model/CardVerify.java | 2 +- .../network/model/CardVerifyAndGetInfo.kt | 2 +- .../{ => nfc}/DeviceNFCAntennaLocation.kt | 2 +- .../tangemcard/data/{ => nfc}/NFCLocation.kt | 2 +- .../tangemcard/di/NetworkComponent.java | 18 +++ .../tangem/tangemcard/di/NetworkModule.java | 42 +++++++ .../presentation/dialog/NfcEnableDialog.kt | 4 +- .../tangem/tangemcard/reader/CardCrypto.java | 1 + .../tangemcard/reader/CardProtocol.java | 79 +++++++----- .../tangem/tangemcard/reader/NfcManager.java | 2 +- .../tangemcard/reader/ResponseApdu.java | 2 +- .../com/tangem/tangemcard/reader/TLV.java | 2 +- .../com/tangem/tangemcard/reader/TLVList.java | 2 +- .../tangemcard/tasks/CreateNewWalletTask.java | 92 +++----------- .../tangemcard/tasks/CustomReadCardTask.java | 25 ++-- .../tangem/tangemcard/tasks/PurgeTask.java | 4 +- .../com/tangem/tangemcard/tasks/SignTask.java | 93 ++++++++++++++ .../tangem/tangemcard/tasks/SwapPINTask.java | 93 +++----------- .../tangemcard/tasks/VerifyCardTask.java | 3 +- .../tangemcard/{reader => util}/PBKDF2.java | 2 +- .../main/res/drawable/ic_action_nfc_gray.png | Bin tangemcard/src/main/res/values/strings.xml | 5 + 61 files changed, 592 insertions(+), 454 deletions(-) rename {tangemcard/src/main/java/com/tangem/tangemcard/tasks => app/src/main/java/com/tangem/data/nfc}/SignPaymentTask.java (97%) create mode 100644 tangemcard/src/main/java/com/tangem/tangemcard/App.java rename tangemcard/src/main/java/com/tangem/tangemcard/data/{ => local}/Firmwares.java (98%) rename tangemcard/src/main/java/com/tangem/tangemcard/data/{ => local}/LocalStorage.kt (98%) rename tangemcard/src/main/java/com/tangem/tangemcard/data/{ => local}/PINStorage.java (99%) create mode 100644 tangemcard/src/main/java/com/tangem/tangemcard/data/network/Server.java create mode 100644 tangemcard/src/main/java/com/tangem/tangemcard/data/network/ServerApiTangem.java create mode 100644 tangemcard/src/main/java/com/tangem/tangemcard/data/network/ServerURL.java rename {app/src/main/java/com/tangem => tangemcard/src/main/java/com/tangem/tangemcard}/data/network/TangemApi.java (84%) rename {app/src/main/java/com/tangem => tangemcard/src/main/java/com/tangem/tangemcard}/data/network/model/CardVerify.java (80%) rename {app/src/main/java/com/tangem => tangemcard/src/main/java/com/tangem/tangemcard}/data/network/model/CardVerifyAndGetInfo.kt (96%) rename tangemcard/src/main/java/com/tangem/tangemcard/data/{ => nfc}/DeviceNFCAntennaLocation.kt (96%) rename tangemcard/src/main/java/com/tangem/tangemcard/data/{ => nfc}/NFCLocation.kt (99%) create mode 100644 tangemcard/src/main/java/com/tangem/tangemcard/di/NetworkComponent.java create mode 100644 tangemcard/src/main/java/com/tangem/tangemcard/di/NetworkModule.java rename {app/src/main/java/com/tangem => tangemcard/src/main/java/com/tangem/tangemcard}/presentation/dialog/NfcEnableDialog.kt (93%) create mode 100644 tangemcard/src/main/java/com/tangem/tangemcard/tasks/SignTask.java rename tangemcard/src/main/java/com/tangem/tangemcard/{reader => util}/PBKDF2.java (98%) rename {app => tangemcard}/src/main/res/drawable/ic_action_nfc_gray.png (100%) diff --git a/app/src/main/java/com/tangem/data/fingerprint/StartFingerprintReaderTask.java b/app/src/main/java/com/tangem/data/fingerprint/StartFingerprintReaderTask.java index 3884469a70..401e5c4018 100644 --- a/app/src/main/java/com/tangem/data/fingerprint/StartFingerprintReaderTask.java +++ b/app/src/main/java/com/tangem/data/fingerprint/StartFingerprintReaderTask.java @@ -8,7 +8,7 @@ import android.security.keystore.KeyGenParameterSpec; import android.security.keystore.KeyPermanentlyInvalidatedException; import android.security.keystore.KeyProperties; -import com.tangem.tangemcard.data.PINStorage; +import com.tangem.tangemcard.data.local.PINStorage; import com.tangem.presentation.activity.PinRequestActivity; import java.io.IOException; diff --git a/app/src/main/java/com/tangem/data/network/Server.java b/app/src/main/java/com/tangem/data/network/Server.java index e7c666b4ec..8ddf03d120 100644 --- a/app/src/main/java/com/tangem/data/network/Server.java +++ b/app/src/main/java/com/tangem/data/network/Server.java @@ -2,20 +2,6 @@ package com.tangem.data.network; public class Server { - /** - * https://tangem-webapp.appspot.com/ - * https://tangem-services.appspot.com/ - */ - public static class ApiTangem { - public static final String URL_TANGEM = ServerURL.API_TANGEM; - - public static class Method { - static final String VERIFY = URL_TANGEM + "verify"; - static final String VERIFY_AND_GET_INFO = URL_TANGEM + "card/verify-and-get-info"; - static final String ARTWORK = URL_TANGEM + "card/artwork"; - } - } - public static class ApiUpdateVersion { public static final String URL_UPDATE_VERSION = ServerURL.API_UPDATE_VERSION; diff --git a/app/src/main/java/com/tangem/data/network/ServerApiCommon.java b/app/src/main/java/com/tangem/data/network/ServerApiCommon.java index ded6b4753e..ea5539b26a 100644 --- a/app/src/main/java/com/tangem/data/network/ServerApiCommon.java +++ b/app/src/main/java/com/tangem/data/network/ServerApiCommon.java @@ -5,7 +5,8 @@ import android.support.annotation.NonNull; import android.util.Log; import com.tangem.App; -import com.tangem.data.network.model.CardVerifyAndGetInfo; +import com.tangem.tangemcard.data.network.TangemApi; +import com.tangem.tangemcard.data.network.model.CardVerifyAndGetInfo; import com.tangem.data.network.model.RateInfoResponse; import com.tangem.tangemcard.data.TangemCard; import com.tangem.tangemcard.util.Util; @@ -83,94 +84,6 @@ public class ServerApiCommon { }); } - /** - * HTTP - * Card verify - */ - private CardVerifyAndGetInfoListener cardVerifyAndGetInfoListener; - - public interface CardVerifyAndGetInfoListener { - void onSuccess(CardVerifyAndGetInfo.Response cardVerifyAndGetArtworkResponse); - void onFail(String message); - } - - public void setCardVerifyAndGetInfoListener(CardVerifyAndGetInfoListener listener) { - cardVerifyAndGetInfoListener = listener; - } - - public void cardVerifyAndGetInfo(TangemCard card) { - TangemApi tangemApi = App.getNetworkComponent().getRetrofitTangem().create(TangemApi.class); - - List requests = new ArrayList<>(); - requests.add(new CardVerifyAndGetInfo.Request.Item(Util.bytesToHex(card.getCID()), Util.bytesToHex(card.getCardPublicKey()))); - - CardVerifyAndGetInfo.Request requestBody = new CardVerifyAndGetInfo.Request(requests); - - Call call = tangemApi.getCardVerifyAndGetInfo(requestBody); - call.enqueue(new Callback() { - @Override - public void onResponse(@NonNull Call call, @NonNull Response response) { - if (response.code() == 200) { - CardVerifyAndGetInfo.Response cardVerifyAndGetArtworkResponse = response.body(); - cardVerifyAndGetInfoListener.onSuccess(cardVerifyAndGetArtworkResponse); - Log.i(TAG, "cardVerifyAndGeInfo onResponse " + response.code()); - } else { - cardVerifyAndGetInfoListener.onFail(String.valueOf(response.code())); - Log.e(TAG, "cardVerifyAndGetInfo onResponse " + response.code()); - } - } - - @Override - public void onFailure(@NonNull Call call, @NonNull Throwable t) { - cardVerifyAndGetInfoListener.onFail(t.getMessage()); - Log.e(TAG, "cardVerifyAndGetInfo onFailure " + t.getMessage()); - } - }); - } - - /** - * HTTP - * Last version request from GitHub - */ - private ArtworkListener artworkListener; - - public interface ArtworkListener { - void onSuccess(String artworkId, InputStream inputStream, Date updateDate); - void onFail(String message); - } - - public void setArtworkListener(ArtworkListener listener) { - artworkListener = listener; - } - - public void requestArtwork(String artworkId, Date updateDate, TangemCard card) { - TangemApi tangemApi = App.getNetworkComponent().getRetrofitTangem().create(TangemApi.class); - - Call call = tangemApi.getArtwork(artworkId, Util.bytesToHex(card.getCID()), Util.bytesToHex(card.getCardPublicKey())); - call.enqueue(new Callback() { - @Override - public void onResponse(@NonNull Call call, @NonNull Response response) { - Log.i(TAG, "getArtwork onResponse " + response.code()); - if (response.code() == 200) { - try { - ResponseBody body = response.body(); - if (body != null) { - artworkListener.onSuccess(artworkId, body.byteStream(), updateDate); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - } - - @Override - public void onFailure(@NonNull Call call, @NonNull Throwable t) { - artworkListener.onFail(t.getMessage()); - Log.e(TAG, "getArtwork onFailure " + t.getMessage()); - } - }); - } - /** * HTTP * Used in Crypto-currency course diff --git a/tangemcard/src/main/java/com/tangem/tangemcard/tasks/SignPaymentTask.java b/app/src/main/java/com/tangem/data/nfc/SignPaymentTask.java similarity index 97% rename from tangemcard/src/main/java/com/tangem/tangemcard/tasks/SignPaymentTask.java rename to app/src/main/java/com/tangem/data/nfc/SignPaymentTask.java index 663bfcc5ab..40dbb93549 100644 --- a/tangemcard/src/main/java/com/tangem/tangemcard/tasks/SignPaymentTask.java +++ b/app/src/main/java/com/tangem/data/nfc/SignPaymentTask.java @@ -1,23 +1,23 @@ -package com.tangem.tangemcard.tasks; +package com.tangem.data.nfc; import android.app.Activity; import android.content.Intent; import android.nfc.tech.IsoDep; import android.util.Log; -import com.tangem.tangemcard.reader.CardProtocol; -import com.tangem.tangemcard.reader.NfcManager; -import com.tangem.tangemcard.data.Blockchain; +import com.tangem.domain.wallet.BTCUtils; import com.tangem.domain.wallet.CoinEngine; import com.tangem.domain.wallet.CoinEngineFactory; import com.tangem.domain.wallet.TangemContext; import com.tangem.presentation.activity.SendTransactionActivity; import com.tangem.presentation.activity.SignPaymentActivity; -import com.tangem.domain.wallet.BTCUtils; +import com.tangem.tangemcard.reader.CardProtocol; +import com.tangem.tangemcard.reader.NfcManager; +import com.tangem.tangemcard.data.Blockchain; import java.io.IOException; -public class SignPaymentTask extends Thread { +public class SignPaymentTask extends Thread{ public static final String TAG = SignPaymentTask.class.getSimpleName(); private CoinEngine.Amount txAmount; @@ -72,7 +72,7 @@ public class SignPaymentTask extends Thread { Log.i(TAG, "[-- Start sign payment --]"); if (isCancelled) return; - protocol.run_Read(false); + protocol.run_Read(); protocol.run_VerifyCard(); Log.i(TAG, "Manufacturer: " + protocol.getCard().getManufacturer().getOfficialName()); diff --git a/app/src/main/java/com/tangem/di/Navigator.kt b/app/src/main/java/com/tangem/di/Navigator.kt index bdf47b68b1..1d575858a7 100644 --- a/app/src/main/java/com/tangem/di/Navigator.kt +++ b/app/src/main/java/com/tangem/di/Navigator.kt @@ -4,6 +4,7 @@ import android.app.Activity import android.nfc.Tag import android.os.Bundle import com.tangem.domain.wallet.CoinData +import com.tangem.domain.wallet.TangemContext import com.tangem.tangemcard.data.TangemCard import com.tangem.presentation.activity.EmptyWalletActivity import com.tangem.presentation.activity.LoadedWalletActivity @@ -17,16 +18,16 @@ class Navigator { context.startActivity(MainActivity.callingIntent(context)) } - fun showLoadedWallet(context: Activity, lastTag: Tag, cardInfo: Bundle) { - context.startActivityForResult(LoadedWalletActivity.callingIntent(context, lastTag, cardInfo), MainActivity.REQUEST_CODE_SHOW_CARD_ACTIVITY) + fun showLoadedWallet(context: Activity, lastTag: Tag, ctx: TangemContext) { + context.startActivityForResult(LoadedWalletActivity.callingIntent(context, lastTag, ctx), MainActivity.REQUEST_CODE_SHOW_CARD_ACTIVITY) } - fun showEmptyWallet(context: Activity) { - context.startActivity(EmptyWalletActivity.callingIntent(context)) + fun showEmptyWallet(context: Activity, ctx: TangemContext) { + context.startActivity(EmptyWalletActivity.callingIntent(context ,ctx)) } - fun showVerifyCard(context: Activity, card: TangemCard, coinData: CoinData, message: String, error: String) { - context.startActivityForResult(VerifyCardActivity.callingIntent(context, card, coinData, message, error), LoadedWallet.REQUEST_CODE_VERIFY_CARD) + fun showVerifyCard(context: Activity, ctx: TangemContext) { + context.startActivityForResult(VerifyCardActivity.callingIntent(context, ctx), LoadedWallet.REQUEST_CODE_VERIFY_CARD) } fun showPinSwap(context: Activity) { diff --git a/app/src/main/java/com/tangem/di/NetworkComponent.java b/app/src/main/java/com/tangem/di/NetworkComponent.java index b8ac3affa5..4de9763426 100644 --- a/app/src/main/java/com/tangem/di/NetworkComponent.java +++ b/app/src/main/java/com/tangem/di/NetworkComponent.java @@ -20,9 +20,6 @@ public interface NetworkComponent { @Named(Server.ApiEstimatefee.URL_ESTIMATEFEE) Retrofit getRetrofitEstimatefee(); - @Named(Server.ApiTangem.URL_TANGEM) - Retrofit getRetrofitTangem(); - @Named(Server.ApiCoinmarket.URL_COINMARKET) Retrofit getRetrofitCoinmarketcap(); diff --git a/app/src/main/java/com/tangem/di/NetworkModule.java b/app/src/main/java/com/tangem/di/NetworkModule.java index 5fbadb3e82..86e669389e 100644 --- a/app/src/main/java/com/tangem/di/NetworkModule.java +++ b/app/src/main/java/com/tangem/di/NetworkModule.java @@ -41,17 +41,6 @@ class NetworkModule { .build(); } - @Singleton - @Provides - @Named(Server.ApiTangem.URL_TANGEM) - Retrofit provideRetrofitTangem() { - return new Retrofit.Builder() - .baseUrl(Server.ApiTangem.URL_TANGEM) - .addConverterFactory(GsonConverterFactory.create()) - .client(createOkHttpClient()) - .build(); - } - @Singleton @Provides @Named(Server.ApiUpdateVersion.URL_UPDATE_VERSION) diff --git a/app/src/main/java/com/tangem/domain/wallet/CoinEngine.java b/app/src/main/java/com/tangem/domain/wallet/CoinEngine.java index d630430787..e3d6576bcd 100644 --- a/app/src/main/java/com/tangem/domain/wallet/CoinEngine.java +++ b/app/src/main/java/com/tangem/domain/wallet/CoinEngine.java @@ -4,6 +4,9 @@ import android.net.Uri; import android.text.InputFilter; import com.tangem.tangemcard.reader.CardProtocol; +import com.tangem.tangemcard.tasks.SignTask; + +import org.jetbrains.annotations.Nullable; import java.math.BigDecimal; import java.math.BigInteger; @@ -20,6 +23,7 @@ import java.util.Locale; public abstract class CoinEngine { + public static class InternalAmount extends BigDecimal { private String currency; @@ -231,4 +235,21 @@ public abstract class CoinEngine { public abstract String getUnspentInputsDescription(); + public void defineWallet() throws CardProtocol.TangemException { + try { + String wallet = calculateAddress(ctx.getCard().getWalletPublicKey()); + ctx.getCoinData().setWallet(wallet); + } + catch (Exception e) + { + ctx.getCoinData().setWallet("ERROR"); + throw new CardProtocol.TangemException("Can't define wallet address"); + } + + } + + public SignTask.PaymentToSign constructPayment(Amount feeValue, Amount amountValue, boolean IncFee, String targetAddress) + { + return null; + } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/domain/wallet/bch/BtcCashEngine.java b/app/src/main/java/com/tangem/domain/wallet/bch/BtcCashEngine.java index ff5db5ffd8..1c36a95f6e 100644 --- a/app/src/main/java/com/tangem/domain/wallet/bch/BtcCashEngine.java +++ b/app/src/main/java/com/tangem/domain/wallet/bch/BtcCashEngine.java @@ -3,7 +3,7 @@ package com.tangem.domain.wallet.bch; import android.net.Uri; import android.text.InputFilter; -import com.tangem.tangemcard.data.PINStorage; +import com.tangem.tangemcard.data.local.PINStorage; import com.tangem.tangemcard.reader.CardProtocol; import com.tangem.tangemcard.reader.TLV; import com.tangem.domain.wallet.BalanceValidator; @@ -181,12 +181,12 @@ public class BtcCashEngine extends CoinEngine { @Override public Uri getShareWalletUriExplorer() { - return Uri.parse((ctx.getBlockchain() == Blockchain.BitcoinCash ? "https://bitcoincash.blockexplorer.com/address/" : "https://testnet.blockexplorer.com/address/") + ctx.getCard().getWallet()); + return Uri.parse((ctx.getBlockchain() == Blockchain.BitcoinCash ? "https://bitcoincash.blockexplorer.com/address/" : "https://testnet.blockexplorer.com/address/") + ctx.getCoinData().getWallet()); } @Override public Uri getShareWalletUri() { - return Uri.parse(ctx.getCard().getWallet()); + return Uri.parse(ctx.getCoinData().getWallet()); } @Override @@ -440,7 +440,7 @@ public class BtcCashEngine extends CoinEngine { CoinEngine engine = CoinEngineFactory.INSTANCE.create(ctx); - String srcLegacyAddress = ((BtcCashEngine)engine).convertToLegacyAddress(ctx.getCard().getWallet()); + String srcLegacyAddress = ((BtcCashEngine)engine).convertToLegacyAddress(ctx.getCoinData().getWallet()); String destLegacyAddress = ((BtcCashEngine)engine).convertToLegacyAddress(destAddress); byte[] pbKey = ctx.getCard().getWalletPublicKeyRar(); //ALWAYS USING COMPRESS KEY @@ -498,9 +498,11 @@ public class BtcCashEngine extends CoinEngine { throw new Exception("Hashes length must be identical!"); bs.write(dataForSign[i]); } - signFromCard = protocol.run_SignRaw(PINStorage.getPIN2(), bs.toByteArray()).getTLV(TLV.Tag.TAG_Signature).Value; + signFromCard = protocol.run_SignRaw(PINStorage.getPIN2(), "sha-256x2", bs.toByteArray(), null, null, null).getTLV(TLV.Tag.TAG_Signature).Value; } else { - signFromCard = protocol.run_SignHashes(PINStorage.getPIN2(), dataForSign, ctx.getCard().getSigningMethod() == TangemCard.SigningMethod.Sign_Hash_Validated_By_Issuer, null, ctx.getCard().getIssuer()).getTLV(TLV.Tag.TAG_Signature).Value; + //ctx.getCard().getSigningMethod() == TangemCard.SigningMethod.Sign_Hash_Validated_By_Issuer + //ctx.getCard().getIssuer() + signFromCard = protocol.run_SignHashes(PINStorage.getPIN2(), dataForSign, null, null, null).getTLV(TLV.Tag.TAG_Signature).Value; // TODO slice signFromCard to hashes.length parts } diff --git a/app/src/main/java/com/tangem/domain/wallet/btc/BtcEngine.java b/app/src/main/java/com/tangem/domain/wallet/btc/BtcEngine.java index fa1e8e134d..eab7e750a7 100644 --- a/app/src/main/java/com/tangem/domain/wallet/btc/BtcEngine.java +++ b/app/src/main/java/com/tangem/domain/wallet/btc/BtcEngine.java @@ -3,7 +3,7 @@ package com.tangem.domain.wallet.btc; import android.net.Uri; import android.text.InputFilter; -import com.tangem.tangemcard.data.PINStorage; +import com.tangem.tangemcard.data.local.PINStorage; import com.tangem.tangemcard.reader.CardProtocol; import com.tangem.tangemcard.reader.TLV; import com.tangem.domain.wallet.BalanceValidator; @@ -179,15 +179,15 @@ public class BtcEngine extends CoinEngine { @Override public Uri getShareWalletUriExplorer() { - return Uri.parse((ctx.getBlockchain() == Blockchain.Bitcoin ? "https://blockchain.info/address/" : "https://testnet.blockchain.info/address/") + ctx.getCard().getWallet()); + return Uri.parse((ctx.getBlockchain() == Blockchain.Bitcoin ? "https://blockchain.info/address/" : "https://testnet.blockchain.info/address/") + ctx.getCoinData().getWallet()); } @Override public Uri getShareWalletUri() { if (ctx.getCard().getDenomination() != null) { - return Uri.parse("bitcoin:" + ctx.getCard().getWallet() + "?amount=" + convertToAmount(convertToInternalAmount(ctx.getCard().getDenomination())).toValueString(8)); + return Uri.parse("bitcoin:" + ctx.getCoinData().getWallet() + "?amount=" + convertToAmount(convertToInternalAmount(ctx.getCard().getDenomination())).toValueString(8)); } else { - return Uri.parse("bitcoin:" + ctx.getCard().getWallet()); + return Uri.parse("bitcoin:" + ctx.getCoinData().getWallet()); } } @@ -408,7 +408,7 @@ public class BtcEngine extends CoinEngine { checkBlockchainDataExists(); - String myAddress = ctx.getCard().getWallet(); + String myAddress = ctx.getCoinData().getWallet(); byte[] pbKey = ctx.getCard().getWalletPublicKey(); // Build script for our address @@ -464,9 +464,10 @@ public class BtcEngine extends CoinEngine { throw new Exception("Hashes length must be identical!"); bs.write(dataForSign[i]); } - signFromCard = protocol.run_SignRaw(PINStorage.getPIN2(), bs.toByteArray()).getTLV(TLV.Tag.TAG_Signature).Value; + signFromCard = protocol.run_SignRaw(PINStorage.getPIN2(), "sha-256x2",bs.toByteArray(),null,null,null).getTLV(TLV.Tag.TAG_Signature).Value; } else { - signFromCard = protocol.run_SignHashes(PINStorage.getPIN2(), dataForSign, ctx.getCard().getSigningMethod() == TangemCard.SigningMethod.Sign_Hash_Validated_By_Issuer, null, ctx.getCard().getIssuer()).getTLV(TLV.Tag.TAG_Signature).Value; + //ctx.getCard().getSigningMethod() == TangemCard.SigningMethod.Sign_Hash_Validated_By_Issuer, null, ctx.getCard().getIssuer() + signFromCard = protocol.run_SignHashes(PINStorage.getPIN2(), dataForSign, null, null, null).getTLV(TLV.Tag.TAG_Signature).Value; // TODO slice signFromCard to hashes.length parts } diff --git a/app/src/main/java/com/tangem/domain/wallet/eth/EthEngine.java b/app/src/main/java/com/tangem/domain/wallet/eth/EthEngine.java index 50ca2af503..f7e3836c6d 100644 --- a/app/src/main/java/com/tangem/domain/wallet/eth/EthEngine.java +++ b/app/src/main/java/com/tangem/domain/wallet/eth/EthEngine.java @@ -4,7 +4,7 @@ import android.net.Uri; import android.text.InputFilter; import android.util.Log; -import com.tangem.tangemcard.data.PINStorage; +import com.tangem.tangemcard.data.local.PINStorage; import com.tangem.tangemcard.reader.CardProtocol; import com.tangem.tangemcard.reader.TLV; import com.tangem.domain.wallet.BalanceValidator; @@ -227,18 +227,18 @@ public class EthEngine extends CoinEngine { @Override public Uri getShareWalletUri() { if (ctx.getCard().getDenomination() != null) { - return Uri.parse("ethereum:" + ctx.getCard().getWallet());// + "?value=" + mCard.getDenomination() +"e18"); + return Uri.parse("ethereum:" + ctx.getCoinData().getWallet());// + "?value=" + mCard.getDenomination() +"e18"); } else { - return Uri.parse("ethereum:" + ctx.getCard().getWallet()); + return Uri.parse("ethereum:" + ctx.getCoinData().getWallet()); } } @Override public Uri getShareWalletUriExplorer() { if (ctx.getCard().getBlockchain() == Blockchain.EthereumTestNet) - return Uri.parse("https://rinkeby.etherscan.io/address/" + ctx.getCard().getWallet()); + return Uri.parse("https://rinkeby.etherscan.io/address/" + ctx.getCoinData().getWallet()); else - return Uri.parse("https://etherscan.io/address/" + ctx.getCard().getWallet()); + return Uri.parse("https://etherscan.io/address/" + ctx.getCoinData().getWallet()); } @Override @@ -383,7 +383,7 @@ public class EthEngine extends CoinEngine { BigInteger nonceValue = coinData.getConfirmedTXCount(); byte[] pbKey = ctx.getCard().getWalletPublicKey(); - boolean flag = (ctx.getCard().getSigningMethod() == TangemCard.SigningMethod.Sign_Hash_Validated_By_Issuer); +// boolean flag = (ctx.getCard().getSigningMethod() == TangemCard.SigningMethod.Sign_Hash_Validated_By_Issuer); Issuer issuer = ctx.getCard().getIssuer(); BigInteger weiFee=convertToInternalAmount(feeValue).toBigIntegerExact(); @@ -412,7 +412,7 @@ public class EthEngine extends CoinEngine { byte[] signFromCard = null; try { - signFromCard = protocol.run_SignHashes(PINStorage.getPIN2(), hashesForSign, flag, null, issuer).getTLV(TLV.Tag.TAG_Signature).Value; + signFromCard = protocol.run_SignHashes(PINStorage.getPIN2(), hashesForSign, null, null, null).getTLV(TLV.Tag.TAG_Signature).Value; // TODO slice signFromCard to hashes.length parts } catch (Exception ex) { Log.e("ETH", ex.getMessage()); diff --git a/app/src/main/java/com/tangem/domain/wallet/token/TokenEngine.java b/app/src/main/java/com/tangem/domain/wallet/token/TokenEngine.java index bf4af6b2c4..5b6c5172f1 100644 --- a/app/src/main/java/com/tangem/domain/wallet/token/TokenEngine.java +++ b/app/src/main/java/com/tangem/domain/wallet/token/TokenEngine.java @@ -5,7 +5,7 @@ import android.text.InputFilter; import android.util.Log; import com.google.common.base.Strings; -import com.tangem.tangemcard.data.PINStorage; +import com.tangem.tangemcard.data.local.PINStorage; import com.tangem.tangemcard.reader.CardProtocol; import com.tangem.tangemcard.reader.TLV; import com.tangem.domain.wallet.BalanceValidator; @@ -282,15 +282,15 @@ public class TokenEngine extends CoinEngine { @Override public Uri getShareWalletUriExplorer() { - return Uri.parse("https://etherscan.io/token/" + getContractAddress(ctx.getCard()) + "?a=" + ctx.getCard().getWallet()); + return Uri.parse("https://etherscan.io/token/" + getContractAddress(ctx.getCard()) + "?a=" + ctx.getCoinData().getWallet()); } @Override public Uri getShareWalletUri() { if (ctx.getCard().getDenomination() != null) { - return Uri.parse("ethereum:" + ctx.getCard().getWallet());// + "?value=" + mCard.getDenomination() +"e18"); + return Uri.parse("ethereum:" + ctx.getCoinData().getWallet());// + "?value=" + mCard.getDenomination() +"e18"); } else { - return Uri.parse("ethereum:" + ctx.getCard().getWallet()); + return Uri.parse("ethereum:" + ctx.getCoinData().getWallet()); } } @@ -436,7 +436,7 @@ public class TokenEngine extends CoinEngine { public byte[] signETH(Amount feeValue, Amount amountValue, boolean IncFee, String targetAddress, CardProtocol protocol) throws Exception { BigInteger nonceValue = coinData.getConfirmedTXCount(); byte[] pbKey = ctx.getCard().getWalletPublicKey(); - boolean flag = (ctx.getCard().getSigningMethod() == TangemCard.SigningMethod.Sign_Hash_Validated_By_Issuer); +// boolean flag = (ctx.getCard().getSigningMethod() == TangemCard.SigningMethod.Sign_Hash_Validated_By_Issuer); Issuer issuer = ctx.getCard().getIssuer(); BigInteger weiFee = convertToInternalAmount(feeValue).toBigIntegerExact(); @@ -467,7 +467,7 @@ public class TokenEngine extends CoinEngine { byte[] signFromCard = null; try { - signFromCard = protocol.run_SignHashes(PINStorage.getPIN2(), hashesForSign, flag, null, issuer).getTLV(TLV.Tag.TAG_Signature).Value; + signFromCard = protocol.run_SignHashes(PINStorage.getPIN2(), hashesForSign, null, null, null).getTLV(TLV.Tag.TAG_Signature).Value; // TODO slice signFromCard to hashes.length parts } catch (Exception ex) { Log.e("ETH", ex.getMessage()); @@ -500,7 +500,7 @@ public class TokenEngine extends CoinEngine { public byte[] signToken(Amount feeValue, Amount amountValue, boolean IncFee, String targetAddress, CardProtocol protocol) throws Exception { BigInteger nonceValue = coinData.getConfirmedTXCount(); byte[] pbKey = ctx.getCard().getWalletPublicKey(); - boolean flag = (ctx.getCard().getSigningMethod() == TangemCard.SigningMethod.Sign_Hash_Validated_By_Issuer); +// boolean flag = (ctx.getCard().getSigningMethod() == TangemCard.SigningMethod.Sign_Hash_Validated_By_Issuer); Issuer issuer = ctx.getCard().getIssuer(); @@ -553,7 +553,7 @@ public class TokenEngine extends CoinEngine { byte[] signFromCard = null; try { - signFromCard = protocol.run_SignHashes(PINStorage.getPIN2(), hashesForSign, flag, null, issuer).getTLV(TLV.Tag.TAG_Signature).Value; + signFromCard = protocol.run_SignHashes(PINStorage.getPIN2(), hashesForSign, null, null, null).getTLV(TLV.Tag.TAG_Signature).Value; // TODO slice signFromCard to hashes.length parts } catch (Exception ex) { Log.e("ETH", ex.getMessage()); diff --git a/app/src/main/java/com/tangem/presentation/activity/ConfirmPaymentActivity.kt b/app/src/main/java/com/tangem/presentation/activity/ConfirmPaymentActivity.kt index 1347fb438a..61e1b95dab 100644 --- a/app/src/main/java/com/tangem/presentation/activity/ConfirmPaymentActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/ConfirmPaymentActivity.kt @@ -401,7 +401,7 @@ class ConfirmPaymentActivity : AppCompatActivity(), NfcAdapter.ReaderCallback { // TODO - move to BtcEngine @Throws(Exception::class) internal fun buildSize(outputAddress: String, outFee: String, outAmount: String): Int { - val myAddress = ctx.card!!.wallet + val myAddress = ctx.coinData!!.wallet val pbKey = ctx.card!!.walletPublicKey val pbComprKey = ctx.card!!.walletPublicKeyRar @@ -472,7 +472,7 @@ class ConfirmPaymentActivity : AppCompatActivity(), NfcAdapter.ReaderCallback { private fun requestInfura(method: String) { if (UtilHelper.isOnline(this)) { - serverApiInfura.infura(method, 67, ctx.card!!.wallet, "", "") + serverApiInfura.infura(method, 67, ctx.coinData!!.wallet, "", "") } else finishWithError(Activity.RESULT_CANCELED, getString(R.string.cannot_obtain_data_from_blockchain)) } diff --git a/app/src/main/java/com/tangem/presentation/activity/EmptyWalletActivity.kt b/app/src/main/java/com/tangem/presentation/activity/EmptyWalletActivity.kt index 0ae0e1774b..79af813002 100644 --- a/app/src/main/java/com/tangem/presentation/activity/EmptyWalletActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/EmptyWalletActivity.kt @@ -33,7 +33,11 @@ class EmptyWalletActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, Card private const val REQUEST_CODE_REQUEST_PIN2 = 3 private const val REQUEST_CODE_VERIFY_CARD = 4 - fun callingIntent(context: Context) = Intent(context, EmptyWalletActivity::class.java) + fun callingIntent(context: Context, ctx: TangemContext) : Intent { + val intent=Intent(context, EmptyWalletActivity::class.java) + ctx.saveToIntent(intent) + return intent + } } private var nfcManager: NfcManager? = null diff --git a/app/src/main/java/com/tangem/presentation/activity/LoadedWalletActivity.kt b/app/src/main/java/com/tangem/presentation/activity/LoadedWalletActivity.kt index 04dab07418..4a94664dcf 100644 --- a/app/src/main/java/com/tangem/presentation/activity/LoadedWalletActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/LoadedWalletActivity.kt @@ -8,6 +8,7 @@ import android.os.Bundle import android.support.v7.app.AppCompatActivity import com.tangem.App import com.tangem.di.Navigator +import com.tangem.domain.wallet.TangemContext import com.tangem.presentation.fragment.LoadedWallet import com.tangem.wallet.R import javax.inject.Inject @@ -18,10 +19,10 @@ class LoadedWalletActivity : AppCompatActivity() { lateinit var navigator: Navigator companion object { - fun callingIntent(context: Context, lastTag: Tag, cardInfo: Bundle): Intent { + fun callingIntent(context: Context, lastTag: Tag, ctx: TangemContext): Intent { val intent = Intent(context, LoadedWalletActivity::class.java) intent.putExtra(MainActivity.EXTRA_LAST_DISCOVERED_TAG, lastTag) - intent.putExtras(cardInfo) + ctx.saveToIntent(intent) return intent } } diff --git a/app/src/main/java/com/tangem/presentation/activity/MainActivity.kt b/app/src/main/java/com/tangem/presentation/activity/MainActivity.kt index 6c4fa8f087..e1c970094e 100644 --- a/app/src/main/java/com/tangem/presentation/activity/MainActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/MainActivity.kt @@ -26,13 +26,15 @@ import android.widget.Toast import com.scottyab.rootbeer.RootBeer import com.tangem.App import com.tangem.data.Logger -import com.tangem.tangemcard.data.PINStorage +import com.tangem.tangemcard.data.local.PINStorage import com.tangem.data.network.ServerApiCommon -import com.tangem.tangemcard.data.DeviceNFCAntennaLocation +import com.tangem.tangemcard.data.nfc.DeviceNFCAntennaLocation import com.tangem.tangemcard.tasks.ReadCardInfoTask import com.tangem.di.Navigator +import com.tangem.domain.wallet.CoinEngineFactory +import com.tangem.domain.wallet.TangemContext import com.tangem.tangemcard.reader.CardProtocol -import com.tangem.tangemcard.data.Firmwares +import com.tangem.tangemcard.data.local.Firmwares import com.tangem.tangemcard.reader.NfcManager import com.tangem.presentation.dialog.NoExtendedLengthSupportDialog import com.tangem.presentation.dialog.RootFoundDialog @@ -309,7 +311,6 @@ class MainActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, CardProtoco } override fun onReadProgress(protocol: CardProtocol, progress: Int) { - } override fun onReadFinish(cardProtocol: CardProtocol?) { @@ -320,7 +321,7 @@ class MainActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, CardProtoco rlProgressBar.post { rlProgressBar.visibility = View.GONE - // TODO - ??? remove save and load??? +// // TODO - ??? remove save and load??? val cardInfo = Bundle() cardInfo.putString("UID", cardProtocol.card.uid) val bCard = Bundle() @@ -331,12 +332,19 @@ class MainActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, CardProtoco val card = TangemCard(uid) card.loadFromBundle(cardInfo.getBundle("Card")) + val ctx = TangemContext(card) when { - card.status == TangemCard.Status.Loaded -> lastTag?.let { navigator.showLoadedWallet(this, it, cardInfo) } - card.status == TangemCard.Status.Empty -> navigator.showEmptyWallet(this) + card.status == TangemCard.Status.Loaded -> lastTag?.let { + val engineCoin = CoinEngineFactory.create(ctx) ?: throw CardProtocol.TangemException("Can't create CoinEngine!") + engineCoin.defineWallet() + //mCard.setWallet(Blockchain.calculateWalletAddress(mCard, pkUncompressed)); + + navigator.showLoadedWallet(this, it, ctx) + } + card.status == TangemCard.Status.Empty -> navigator.showEmptyWallet(this, ctx) card.status == TangemCard.Status.Purged -> Toast.makeText(this, R.string.erased_wallet, Toast.LENGTH_SHORT).show() card.status == TangemCard.Status.NotPersonalized -> Toast.makeText(this, R.string.not_personalized, Toast.LENGTH_SHORT).show() - else -> lastTag?.let { navigator.showLoadedWallet(this, it, cardInfo) } + else -> lastTag?.let { navigator.showLoadedWallet(this, it, ctx) } } } diff --git a/app/src/main/java/com/tangem/presentation/activity/PinRequestActivity.kt b/app/src/main/java/com/tangem/presentation/activity/PinRequestActivity.kt index c021f6a361..884ff25e6b 100644 --- a/app/src/main/java/com/tangem/presentation/activity/PinRequestActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/PinRequestActivity.kt @@ -22,7 +22,7 @@ import android.widget.Button import com.tangem.data.fingerprint.StartFingerprintReaderTask import com.tangem.tangemcard.reader.NfcManager import com.tangem.data.fingerprint.FingerprintHelper -import com.tangem.tangemcard.data.PINStorage +import com.tangem.tangemcard.data.local.PINStorage import com.tangem.tangemcard.data.TangemCard import com.tangem.wallet.R import kotlinx.android.synthetic.main.activity_pin_request.* diff --git a/app/src/main/java/com/tangem/presentation/activity/PinSaveActivity.kt b/app/src/main/java/com/tangem/presentation/activity/PinSaveActivity.kt index 31d8bf1963..8daf65bf13 100644 --- a/app/src/main/java/com/tangem/presentation/activity/PinSaveActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/PinSaveActivity.kt @@ -21,7 +21,7 @@ import android.widget.Button import android.widget.Toast import com.tangem.data.fingerprint.ConfirmWithFingerprintTask import com.tangem.data.fingerprint.FingerprintHelper -import com.tangem.tangemcard.data.PINStorage +import com.tangem.tangemcard.data.local.PINStorage import com.tangem.wallet.R import kotlinx.android.synthetic.main.activity_pin_save.* import kotlinx.android.synthetic.main.layout_pin_buttons.* diff --git a/app/src/main/java/com/tangem/presentation/activity/PrepareCryptonitOtherApiWithdrawalActivity.kt b/app/src/main/java/com/tangem/presentation/activity/PrepareCryptonitOtherApiWithdrawalActivity.kt index 78e8243da7..af704b6c99 100644 --- a/app/src/main/java/com/tangem/presentation/activity/PrepareCryptonitOtherApiWithdrawalActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/PrepareCryptonitOtherApiWithdrawalActivity.kt @@ -51,7 +51,7 @@ class PrepareCryptonitOtherApiWithdrawalActivity : AppCompatActivity(), NfcAdapt tvSecret.text = cryptonit!!.secretDescription tvCardID.text = ctx.card!!.cidDescription - tvWallet.text = ctx.card!!.wallet + tvWallet.text = ctx.coinData!!.wallet val engine = CoinEngineFactory.create(ctx) tvCurrency.text = engine!!.balanceCurrency @@ -71,7 +71,7 @@ class PrepareCryptonitOtherApiWithdrawalActivity : AppCompatActivity(), NfcAdapt rlProgressBar.visibility = View.VISIBLE tvProgressDescription.text = getString(R.string.cryptonit_request_withdrawal) - cryptonit!!.requestCryptoWithdrawal(ctx.blockchain.currency, dblAmount.toString(), ctx.card!!.wallet) + cryptonit!!.requestCryptoWithdrawal(ctx.blockchain.currency, dblAmount.toString(), ctx.coinData!!.wallet) } catch (e: Exception) { etAmount.error = getString(R.string.unknown_amount_format) } diff --git a/app/src/main/java/com/tangem/presentation/activity/PrepareCryptonitWithdrawalActivity.kt b/app/src/main/java/com/tangem/presentation/activity/PrepareCryptonitWithdrawalActivity.kt index 76acc0ed4a..7dcf4d6ccf 100644 --- a/app/src/main/java/com/tangem/presentation/activity/PrepareCryptonitWithdrawalActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/PrepareCryptonitWithdrawalActivity.kt @@ -52,7 +52,7 @@ class PrepareCryptonitWithdrawalActivity : AppCompatActivity(), NfcAdapter.Reade etFee.setText(cryptonit!!.fee) tvCardID.text = ctx.card!!.cidDescription - tvWallet.text = ctx.card!!.wallet + tvWallet.text = ctx.coinData!!.wallet val engine = CoinEngineFactory.create(ctx) tvCurrency.text = engine!!.balanceCurrency @@ -100,7 +100,7 @@ class PrepareCryptonitWithdrawalActivity : AppCompatActivity(), NfcAdapter.Reade rlProgressBar.visibility = View.VISIBLE tvProgressDescription.text = getString(R.string.cryptonit_request_withdrawal) - cryptonit!!.requestWithdrawCoins(ctx.blockchain.currency, dblAmount, ctx.card!!.wallet) + cryptonit!!.requestWithdrawCoins(ctx.blockchain.currency, dblAmount, ctx.coinData!!.wallet) } catch (e: Exception) { etAmount.error = getString(R.string.unknown_amount_format) } diff --git a/app/src/main/java/com/tangem/presentation/activity/PrepareKrakenWithdrawalActivity.kt b/app/src/main/java/com/tangem/presentation/activity/PrepareKrakenWithdrawalActivity.kt index f7e33d6be0..b8299f2319 100644 --- a/app/src/main/java/com/tangem/presentation/activity/PrepareKrakenWithdrawalActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/PrepareKrakenWithdrawalActivity.kt @@ -57,7 +57,7 @@ class PrepareKrakenWithdrawalActivity : AppCompatActivity(), NfcAdapter.ReaderCa tvSecret.text = kraken!!.secretDescription tvCardID.text = ctx.card!!.cidDescription - tvWallet.text = ctx.card!!.wallet + tvWallet.text = ctx.coinData!!.wallet val engine = CoinEngineFactory.create(ctx) tvCurrency.text = engine!!.balanceCurrency @@ -85,7 +85,7 @@ class PrepareKrakenWithdrawalActivity : AppCompatActivity(), NfcAdapter.ReaderCa rlProgressBar.visibility = View.VISIBLE tvProgressDescription.text = getString(R.string.kraken_request_withdrawal) - kraken!!.requestWithdrawInfo(ctx.blockchain.currency, dblAmount.toString(), ctx.card!!.wallet) + kraken!!.requestWithdrawInfo(ctx.blockchain.currency, dblAmount.toString(), ctx.coinData!!.wallet) } catch (e: Exception) { etAmount.error = getString(R.string.unknown_amount_format) } @@ -184,7 +184,7 @@ class PrepareKrakenWithdrawalActivity : AppCompatActivity(), NfcAdapter.ReaderCa tvProgressDescription.text = getString(R.string.kraken_request_withdrawal) //Toast.makeText(this, String.format("Withdraw %s!",dblAmount.toString()), Toast.LENGTH_LONG).show() - kraken!!.requestWithdraw(ctx.blockchain.currency, dblAmount.toString(), ctx.card!!.wallet) + kraken!!.requestWithdraw(ctx.blockchain.currency, dblAmount.toString(), ctx.coinData!!.wallet) } catch (e: Exception) { etAmount.error = getString(R.string.unknown_amount_format) } diff --git a/app/src/main/java/com/tangem/presentation/activity/PreparePaymentActivity.kt b/app/src/main/java/com/tangem/presentation/activity/PreparePaymentActivity.kt index 80e154f6a2..418e70f9fe 100644 --- a/app/src/main/java/com/tangem/presentation/activity/PreparePaymentActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/PreparePaymentActivity.kt @@ -104,7 +104,7 @@ class PreparePaymentActivity : AppCompatActivity(), NfcAdapter.ReaderCallback { etWallet.error = null } - if (etWallet.text.toString() == ctx.card!!.wallet) { + if (etWallet.text.toString() == ctx.coinData!!.wallet) { etWallet.error = getString(R.string.destination_wallet_address_equal_source_address) return@setOnClickListener } diff --git a/app/src/main/java/com/tangem/presentation/activity/SendTransactionActivity.kt b/app/src/main/java/com/tangem/presentation/activity/SendTransactionActivity.kt index 02f390df94..8576ff549b 100644 --- a/app/src/main/java/com/tangem/presentation/activity/SendTransactionActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/SendTransactionActivity.kt @@ -50,9 +50,9 @@ class SendTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallback { if (ctx.blockchain == Blockchain.Ethereum || ctx.blockchain == Blockchain.EthereumTestNet || ctx.blockchain == Blockchain.Token) requestInfura(ServerApiInfura.INFURA_ETH_SEND_RAW_TRANSACTION, "") else if (ctx.blockchain == Blockchain.Bitcoin || ctx.blockchain == Blockchain.BitcoinTestNet) - requestElectrum(ctx.card!!, ElectrumRequest.broadcast(ctx.card!!.wallet, tx)) + requestElectrum(ctx.card!!, ElectrumRequest.broadcast(ctx.coinData!!.wallet, tx)) else if (ctx.blockchain == Blockchain.BitcoinCash) - requestElectrum(ctx.card!!, ElectrumRequest.broadcast(ctx.card!!.wallet, tx)) + requestElectrum(ctx.card!!, ElectrumRequest.broadcast(ctx.coinData!!.wallet, tx)) // request electrum listener val electrumBodyListener: ServerApiElectrum.ElectrumRequestDataListener = object : ServerApiElectrum.ElectrumRequestDataListener { @@ -134,7 +134,7 @@ class SendTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallback { private fun requestInfura(method: String, contract: String) { if (UtilHelper.isOnline(this)) { - serverApiInfura.infura(method, 67, ctx.card!!.wallet, contract, tx) + serverApiInfura.infura(method, 67, ctx.coinData!!.wallet, contract, tx) } else finishWithError(getString(R.string.no_connection)) } diff --git a/app/src/main/java/com/tangem/presentation/activity/SignPaymentActivity.kt b/app/src/main/java/com/tangem/presentation/activity/SignPaymentActivity.kt index b458346064..1436f8d288 100644 --- a/app/src/main/java/com/tangem/presentation/activity/SignPaymentActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/SignPaymentActivity.kt @@ -13,13 +13,15 @@ import android.view.KeyEvent import android.view.View import android.widget.ProgressBar import android.widget.Toast -import com.tangem.tangemcard.tasks.SignPaymentTask +import com.tangem.data.nfc.SignPaymentTask import com.tangem.tangemcard.reader.CardProtocol import com.tangem.tangemcard.reader.NfcManager import com.tangem.domain.wallet.CoinEngine +import com.tangem.domain.wallet.CoinEngineFactory import com.tangem.domain.wallet.TangemContext import com.tangem.presentation.dialog.NoExtendedLengthSupportDialog import com.tangem.presentation.dialog.WaitSecurityDelayDialog +import com.tangem.tangemcard.tasks.SignTask import com.tangem.tangemcard.util.Util import com.tangem.wallet.R import kotlinx.android.synthetic.main.activity_sign_payment.* @@ -42,10 +44,11 @@ class SignPaymentActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, Card private var nfcManager: NfcManager? = null private lateinit var ctx: TangemContext - private var signPaymentTask: SignPaymentTask? = null +// private var signPaymentTask: SignPaymentTask? = null + private var signPaymentTask: SignTask? = null - private var amount: CoinEngine.Amount? = null - private var fee: CoinEngine.Amount? = null + private lateinit var amount: CoinEngine.Amount + private lateinit var fee: CoinEngine.Amount private var isIncludeFee = true private var outAddressStr: String? = null private var lastReadSuccess = true @@ -130,7 +133,16 @@ class SignPaymentActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, Card } else { isoDep.timeout = ctx.card!!.pauseBeforePIN2 + 65000 } - signPaymentTask = SignPaymentTask(this, ctx, nfcManager, isoDep, this, amount, fee, isIncludeFee, outAddressStr) +// signPaymentTask = SignPaymentTask(this, ctx, nfcManager, isoDep, this, amount, fee, isIncludeFee, outAddressStr) + + val coinEngine= CoinEngineFactory.create(ctx) ?: throw CardProtocol.TangemException("Can't create CoinEngine!") + val paymentToSign = coinEngine.constructPayment(amount, fee, isIncludeFee, outAddressStr) + +// object: SignTask.PaymentToSign { +// override fun call(context: String?) { println("Call: $context") } +// override fun run(context: String?) { println("Run: $context") } +// } + signPaymentTask = SignTask(this, ctx.card, nfcManager, isoDep, this, paymentToSign) signPaymentTask!!.start() } else { // Log.d(TAG, "Mismatch card UID (" + sUID + " instead of " + card!!.uid + ")") diff --git a/app/src/main/java/com/tangem/presentation/activity/VerifyCardActivity.kt b/app/src/main/java/com/tangem/presentation/activity/VerifyCardActivity.kt index 4ebb037597..c7bd55e93e 100644 --- a/app/src/main/java/com/tangem/presentation/activity/VerifyCardActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/VerifyCardActivity.kt @@ -8,6 +8,7 @@ import com.tangem.App import com.tangem.Constant import com.tangem.di.Navigator import com.tangem.domain.wallet.CoinData +import com.tangem.domain.wallet.TangemContext import com.tangem.tangemcard.data.TangemCard import com.tangem.presentation.fragment.VerifyCard import com.tangem.wallet.R @@ -19,13 +20,9 @@ class VerifyCardActivity : AppCompatActivity() { lateinit var navigator: Navigator companion object { - fun callingIntent(context: Context, card: TangemCard, coinData: CoinData, message: String, error: String): Intent { + fun callingIntent(context: Context, ctx: TangemContext): Intent { val intent = Intent(context, VerifyCardActivity::class.java) - intent.putExtra(TangemCard.EXTRA_UID, card.uid) - intent.putExtra(TangemCard.EXTRA_CARD, card.asBundle) - intent.putExtra(Constant.EXTRA_BLOCKCHAIN_DATA, coinData.asBundle()) - intent.putExtra(Constant.MESSAGE, message) - intent.putExtra(Constant.ERROR, error) + ctx.saveToIntent(intent) return intent } } diff --git a/app/src/main/java/com/tangem/presentation/fragment/LoadedWallet.kt b/app/src/main/java/com/tangem/presentation/fragment/LoadedWallet.kt index d1e34131e9..5f5eadedf4 100644 --- a/app/src/main/java/com/tangem/presentation/fragment/LoadedWallet.kt +++ b/app/src/main/java/com/tangem/presentation/fragment/LoadedWallet.kt @@ -19,13 +19,13 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.Toast -import com.tangem.tangemcard.data.LocalStorage -import com.tangem.tangemcard.data.PINStorage +import com.tangem.tangemcard.data.local.LocalStorage +import com.tangem.tangemcard.data.local.PINStorage import com.tangem.data.network.ElectrumRequest import com.tangem.data.network.ServerApiCommon import com.tangem.data.network.ServerApiElectrum import com.tangem.data.network.ServerApiInfura -import com.tangem.data.network.model.CardVerifyAndGetInfo +import com.tangem.tangemcard.data.network.model.CardVerifyAndGetInfo import com.tangem.data.network.model.InfuraResponse import com.tangem.tangemcard.tasks.VerifyCardTask import com.tangem.tangemcard.reader.CardProtocol @@ -43,6 +43,8 @@ import com.tangem.presentation.dialog.ShowQRCodeDialog import com.tangem.presentation.dialog.WaitSecurityDelayDialog import com.tangem.tangemcard.data.Blockchain import com.tangem.tangemcard.data.TangemCard +import com.tangem.tangemcard.data.network.Server +import com.tangem.tangemcard.data.network.ServerApiTangem import com.tangem.tangemcard.util.Util import com.tangem.util.UtilHelper import com.tangem.wallet.R @@ -71,6 +73,7 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific private var serverApiCommon: ServerApiCommon = ServerApiCommon() private var serverApiInfura: ServerApiInfura = ServerApiInfura() private var serverApiElectrum: ServerApiElectrum = ServerApiElectrum() + private var serverApiTangem: ServerApiTangem = ServerApiTangem() private var singleToast: Toast? = null private lateinit var ctx: TangemContext @@ -119,8 +122,7 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific startVerify(lastTag) - tvWallet.text = ctx.card.wallet - tvWallet.text = ctx.card.wallet + tvWallet.text = ctx.coinData.wallet // set listeners srl.setOnRefreshListener { refresh() } @@ -194,7 +196,7 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific btnDetails.setOnClickListener { if (cardProtocol != null) // openVerifyCard(cardProtocol!!) - (activity as LoadedWalletActivity).navigator.showVerifyCard(context as Activity, ctx.card, ctx.coinData, ctx.message, ctx.error) + (activity as LoadedWalletActivity).navigator.showVerifyCard(context as Activity, ctx) else showSingleToast(R.string.need_attach_card_again) @@ -412,7 +414,7 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific serverApiInfura.setInfuraResponse(infuraBodyListener) // request card verify and get info listener - val cardVerifyAndGetInfoListener: ServerApiCommon.CardVerifyAndGetInfoListener = object : ServerApiCommon.CardVerifyAndGetInfoListener { + val cardVerifyAndGetInfoListener: ServerApiTangem.CardVerifyAndGetInfoListener = object : ServerApiTangem.CardVerifyAndGetInfoListener { override fun onSuccess(cardVerifyAndGetArtworkResponse: CardVerifyAndGetInfo.Response?) { val result = cardVerifyAndGetArtworkResponse?.results!![0] if (result.error != null) { @@ -438,7 +440,7 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific } if (result.artwork != null && localStorage.checkNeedUpdateArtwork(result.artwork)) { Log.w(TAG, "Artwork '${result.artwork!!.id}' updated, need download") - serverApiCommon.requestArtwork(result.artwork!!.id, result.artwork!!.getUpdateDate(), ctx.card!!) + serverApiTangem.requestArtwork(result.artwork!!.id, result.artwork!!.getUpdateDate(), ctx.card!!) updateViews() } // Log.i(TAG, "setCardVerify " + it.results!![0].passed) @@ -448,10 +450,10 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific } } - serverApiCommon.setCardVerifyAndGetInfoListener(cardVerifyAndGetInfoListener) + serverApiTangem.setCardVerifyAndGetInfoListener(cardVerifyAndGetInfoListener) // request artwork listener - val artworkListener: ServerApiCommon.ArtworkListener = object : ServerApiCommon.ArtworkListener { + val artworkListener: ServerApiTangem.ArtworkListener = object : ServerApiTangem.ArtworkListener { override fun onSuccess(artworkId: String?, inputStream: InputStream?, updateDate: Date?) { localStorage.updateArtwork(artworkId!!, inputStream!!, updateDate!!) ivTangemCard.setImageBitmap(localStorage.getCardArtworkBitmap(ctx.card!!)) @@ -461,7 +463,7 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific } } - serverApiCommon.setArtworkListener(artworkListener) + serverApiTangem.setArtworkListener(artworkListener) // request rate info listener serverApiCommon.setRateInfoData { @@ -755,6 +757,7 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific tvBalanceEquivalent.text = "" } else { val validator = BalanceValidator() + // TODO why attest=false? validator.Check(ctx, false) context?.let { ContextCompat.getColor(it, validator.color) }?.let { tvBalanceLine1.setTextColor(it) } tvBalanceLine1.text = validator.firstLine @@ -775,7 +778,7 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific else -> tvBalance.text = getString(R.string.no_data_string) } - tvWallet.text = ctx.card!!.wallet + tvWallet.text = ctx.coinData!!.wallet if (ctx.card!!.tokenSymbol.length > 1) { val html = Html.fromHtml(ctx.card!!.blockchainName) @@ -813,8 +816,8 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific if (ctx.blockchain == Blockchain.Bitcoin || ctx.blockchain == Blockchain.BitcoinTestNet) { ctx.coinData.setIsBalanceEqual(true) - requestElectrum(ElectrumRequest.checkBalance(ctx.card!!.wallet)) - requestElectrum(ElectrumRequest.listUnspent(ctx.card!!.wallet)) + requestElectrum(ElectrumRequest.checkBalance(ctx.coinData!!.wallet)) + requestElectrum(ElectrumRequest.listUnspent(ctx.coinData!!.wallet)) requestRateInfo("bitcoin") } @@ -823,8 +826,8 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific ctx.coinData.setIsBalanceEqual(true) val engine = CoinEngineFactory.create(ctx) - requestElectrum(ElectrumRequest.checkBalance((engine as BtcCashEngine).convertToLegacyAddress(ctx.card!!.wallet))) - requestElectrum(ElectrumRequest.listUnspent(engine.convertToLegacyAddress(ctx.card!!.wallet))) + requestElectrum(ElectrumRequest.checkBalance((engine as BtcCashEngine).convertToLegacyAddress(ctx.coinData!!.wallet))) + requestElectrum(ElectrumRequest.listUnspent(engine.convertToLegacyAddress(ctx.coinData!!.wallet))) requestRateInfo("bitcoin-cash") } @@ -857,7 +860,7 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific private fun requestInfura(method: String, contract: String) { if (UtilHelper.isOnline(context as Activity)) { requestCounter++ - serverApiInfura.infura(method, 67, ctx.card!!.wallet, contract, "") + serverApiInfura.infura(method, 67, ctx.coinData!!.wallet, contract, "") } else { Toast.makeText(activity, getString(R.string.no_connection), Toast.LENGTH_SHORT).show() srl?.isRefreshing = false @@ -867,7 +870,7 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific private fun requestVerifyAndGetInfo() { if (UtilHelper.isOnline(context as Activity)) { if ((ctx.card!!.isOnlineVerified == null || !ctx.card!!.isOnlineVerified)) { - serverApiCommon.cardVerifyAndGetInfo(ctx.card) + serverApiTangem.cardVerifyAndGetInfo(ctx.card) } } else { Toast.makeText(activity, getString(R.string.no_connection), Toast.LENGTH_SHORT).show() @@ -945,7 +948,7 @@ class LoadedWallet : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific Toast.makeText(activity, R.string.copied_clipboard, Toast.LENGTH_LONG).show() } } else { - val txtShare = ctx.card.wallet + val txtShare = ctx.coinData.wallet val clipboard = activity?.getSystemService(CLIPBOARD_SERVICE) as ClipboardManager clipboard.primaryClip = ClipData.newPlainText(txtShare, txtShare) Toast.makeText(activity, R.string.copied_clipboard, Toast.LENGTH_LONG).show() diff --git a/app/src/main/java/com/tangem/presentation/fragment/VerifyCard.kt b/app/src/main/java/com/tangem/presentation/fragment/VerifyCard.kt index c72785fe82..dc6fa9b463 100644 --- a/app/src/main/java/com/tangem/presentation/fragment/VerifyCard.kt +++ b/app/src/main/java/com/tangem/presentation/fragment/VerifyCard.kt @@ -13,7 +13,7 @@ import android.view.View import android.view.ViewGroup import android.widget.PopupMenu import android.widget.Toast -import com.tangem.tangemcard.data.PINStorage +import com.tangem.tangemcard.data.local.PINStorage import com.tangem.tangemcard.reader.NfcManager import com.tangem.domain.wallet.* import com.tangem.presentation.activity.CreateNewWalletActivity @@ -387,7 +387,7 @@ class VerifyCard : Fragment(), NfcAdapter.ReaderCallback { imgDeveloperVersion.visibility = View.INVISIBLE if (ctx.card!!.status == TangemCard.Status.Loaded) { - tvWallet.text = ctx.card!!.shortWalletString + tvWallet.text = ctx.coinData!!.shortWalletString if (ctx.card!!.isWalletPublicKeyValid) { tvWalletIdentity.setText(R.string.possession_proved) tvWalletIdentity.setTextColor(ContextCompat.getColor(context!!, R.color.confirmed)) diff --git a/tangemcard/build.gradle b/tangemcard/build.gradle index 9ed45e79be..debd066e8c 100644 --- a/tangemcard/build.gradle +++ b/tangemcard/build.gradle @@ -35,19 +35,16 @@ dependencies { implementation 'com.scottyab:rootbeer-lib:0.0.7' // implementation 'com.android.support:support-compat:28.0.0' -// implementation 'com.android.support:cardview-v7:28.0.0' // implementation 'com.android.support:support-v4:28.0.0' -// implementation 'com.android.support.constraint:constraint-layout:1.1.3' -// implementation 'com.google.zxing:core:3.3.3' -// implementation 'com.squareup.retrofit2:converter-gson:2.5.0' -// implementation 'com.squareup.retrofit2:retrofit:2.5.0' -// implementation 'com.squareup.okhttp3:logging-interceptor:3.10.0' + implementation 'com.squareup.retrofit2:converter-gson:2.5.0' + implementation 'com.squareup.retrofit2:retrofit:2.5.0' + implementation 'com.squareup.okhttp3:logging-interceptor:3.10.0' // implementation 'com.skyfishjy.ripplebackground:library:1.0.1' // implementation 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0' -// implementation 'com.google.dagger:dagger:2.16' + implementation 'com.google.dagger:dagger:2.16' implementation 'org.bitcoinj:bitcoinj-parent:0.14.7' implementation 'org.bitcoinj:bitcoinj-core:0.14.7' -// implementation 'me.dm7.barcodescanner:zxing:1.9.8' + annotationProcessor 'com.google.dagger:dagger-compiler:2.16' // implementation 'info.hoang8f:android-segmented:1.0.6' // implementation 'io.reactivex.rxjava2:rxjava:2.2.0' // implementation 'io.reactivex.rxjava2:rxandroid:2.0.1' diff --git a/tangemcard/src/main/AndroidManifest.xml b/tangemcard/src/main/AndroidManifest.xml index bdc86f9b33..2d29383987 100644 --- a/tangemcard/src/main/AndroidManifest.xml +++ b/tangemcard/src/main/AndroidManifest.xml @@ -3,7 +3,8 @@ - + diff --git a/tangemcard/src/main/java/com/tangem/tangemcard/App.java b/tangemcard/src/main/java/com/tangem/tangemcard/App.java new file mode 100644 index 0000000000..c18cd9cea7 --- /dev/null +++ b/tangemcard/src/main/java/com/tangem/tangemcard/App.java @@ -0,0 +1,24 @@ +package com.tangem.tangemcard; + +import android.support.v7.app.AppCompatDelegate; + +import com.tangem.tangemcard.di.DaggerNetworkComponent; +import com.tangem.tangemcard.di.NetworkComponent; + +public class App { + public App() { + super(); + } + + static { + AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); + networkComponent = DaggerNetworkComponent.create(); + } + + private static NetworkComponent networkComponent; + + public static NetworkComponent getNetworkComponent() { + return networkComponent; + } + +} \ No newline at end of file diff --git a/tangemcard/src/main/java/com/tangem/tangemcard/data/Issuer.java b/tangemcard/src/main/java/com/tangem/tangemcard/data/Issuer.java index 9682b920c5..f2fd6c66a0 100644 --- a/tangemcard/src/main/java/com/tangem/tangemcard/data/Issuer.java +++ b/tangemcard/src/main/java/com/tangem/tangemcard/data/Issuer.java @@ -5,7 +5,7 @@ import android.content.Context; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.tangem.tangemcard.reader.CardCrypto; -import com.tangem.util.Util; +import com.tangem.tangemcard.util.Util; import java.io.InputStream; import java.io.InputStreamReader; diff --git a/tangemcard/src/main/java/com/tangem/tangemcard/data/TangemCard.java b/tangemcard/src/main/java/com/tangem/tangemcard/data/TangemCard.java index 0b89e855ff..04b60aaeed 100644 --- a/tangemcard/src/main/java/com/tangem/tangemcard/data/TangemCard.java +++ b/tangemcard/src/main/java/com/tangem/tangemcard/data/TangemCard.java @@ -4,6 +4,7 @@ import android.os.Bundle; import android.util.Log; import com.google.common.base.Strings; +import com.tangem.tangemcard.data.local.PINStorage; import com.tangem.tangemcard.reader.SettingsMask; import com.tangem.tangemcard.util.Util; @@ -463,7 +464,9 @@ public class TangemCard { Sign_Hash(0, "sign hash"), Sign_Raw(1, "sign raw tx"), Sign_Hash_Validated_By_Issuer(2, "sign hash validated by issuer"), - Sign_Raw_Validated_By_Issuer(3, "sign raw tx validated by issuer"); + Sign_Raw_Validated_By_Issuer(3, "sign raw tx validated by issuer"), + Sign_Hash_Validated_By_Issuer_And_WriteIssuerData(4, "sign hash validated by issuer and write issuer data"), + Sign_Raw_Validated_By_Issuer_And_WriteIssuerData(5, "sign raw tx validated by issuer and write issuer data"); int ID; String mDescription; diff --git a/tangemcard/src/main/java/com/tangem/tangemcard/data/Firmwares.java b/tangemcard/src/main/java/com/tangem/tangemcard/data/local/Firmwares.java similarity index 98% rename from tangemcard/src/main/java/com/tangem/tangemcard/data/Firmwares.java rename to tangemcard/src/main/java/com/tangem/tangemcard/data/local/Firmwares.java index a17114c127..53fbb2708d 100644 --- a/tangemcard/src/main/java/com/tangem/tangemcard/data/Firmwares.java +++ b/tangemcard/src/main/java/com/tangem/tangemcard/data/local/Firmwares.java @@ -1,4 +1,4 @@ -package com.tangem.tangemcard.data; +package com.tangem.tangemcard.data.local; import android.content.Context; diff --git a/tangemcard/src/main/java/com/tangem/tangemcard/data/LocalStorage.kt b/tangemcard/src/main/java/com/tangem/tangemcard/data/local/LocalStorage.kt similarity index 98% rename from tangemcard/src/main/java/com/tangem/tangemcard/data/LocalStorage.kt rename to tangemcard/src/main/java/com/tangem/tangemcard/data/local/LocalStorage.kt index 1f5acea861..0320e870a6 100644 --- a/tangemcard/src/main/java/com/tangem/tangemcard/data/LocalStorage.kt +++ b/tangemcard/src/main/java/com/tangem/tangemcard/data/local/LocalStorage.kt @@ -1,4 +1,4 @@ -package com.tangem.tangemcard.data +package com.tangem.tangemcard.data.local import android.annotation.SuppressLint import android.content.Context @@ -10,11 +10,11 @@ import android.util.Log import com.google.gson.Gson import com.google.gson.annotations.SerializedName import com.google.gson.reflect.TypeToken -import com.tangem.data.network.model.CardVerifyAndGetInfo +import com.tangem.tangemcard.data.network.model.CardVerifyAndGetInfo +import com.tangem.tangemcard.R +import com.tangem.tangemcard.data.TangemCard import com.tangem.tangemcard.reader.CardCrypto -import com.tangem.domain.wallet.TangemCard -import com.tangem.util.Util -import com.tangem.wallet.R +import com.tangem.tangemcard.util.Util import java.io.InputStream import java.lang.Exception import java.nio.charset.StandardCharsets diff --git a/tangemcard/src/main/java/com/tangem/tangemcard/data/PINStorage.java b/tangemcard/src/main/java/com/tangem/tangemcard/data/local/PINStorage.java similarity index 99% rename from tangemcard/src/main/java/com/tangem/tangemcard/data/PINStorage.java rename to tangemcard/src/main/java/com/tangem/tangemcard/data/local/PINStorage.java index 7ccbc20417..435347b94a 100644 --- a/tangemcard/src/main/java/com/tangem/tangemcard/data/PINStorage.java +++ b/tangemcard/src/main/java/com/tangem/tangemcard/data/local/PINStorage.java @@ -1,4 +1,4 @@ -package com.tangem.tangemcard.data; +package com.tangem.tangemcard.data.local; import android.content.Context; import android.content.SharedPreferences; diff --git a/tangemcard/src/main/java/com/tangem/tangemcard/data/network/Server.java b/tangemcard/src/main/java/com/tangem/tangemcard/data/network/Server.java new file mode 100644 index 0000000000..9e618ea304 --- /dev/null +++ b/tangemcard/src/main/java/com/tangem/tangemcard/data/network/Server.java @@ -0,0 +1,17 @@ +package com.tangem.tangemcard.data.network; + +public class Server { + /** + * https://tangem-webapp.appspot.com/ + * https://tangem-services.appspot.com/ + */ + public static class ApiTangem { + public static final String URL_TANGEM = ServerURL.API_TANGEM; + + public static class Method { + static final String VERIFY = URL_TANGEM + "verify"; + static final String VERIFY_AND_GET_INFO = URL_TANGEM + "card/verify-and-get-info"; + static final String ARTWORK = URL_TANGEM + "card/artwork"; + } + } +} \ No newline at end of file diff --git a/tangemcard/src/main/java/com/tangem/tangemcard/data/network/ServerApiTangem.java b/tangemcard/src/main/java/com/tangem/tangemcard/data/network/ServerApiTangem.java new file mode 100644 index 0000000000..92a9557ae1 --- /dev/null +++ b/tangemcard/src/main/java/com/tangem/tangemcard/data/network/ServerApiTangem.java @@ -0,0 +1,113 @@ +package com.tangem.tangemcard.data.network; + +import android.support.annotation.NonNull; +import android.util.Log; + +import com.tangem.tangemcard.App; +import com.tangem.tangemcard.data.TangemCard; +import com.tangem.tangemcard.data.network.model.CardVerifyAndGetInfo; +import com.tangem.tangemcard.util.Util; + +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import okhttp3.ResponseBody; +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; + +public class ServerApiTangem { + private static String TAG = ServerApiTangem.class.getSimpleName(); + + /** + * HTTP + * Card verify + */ + private CardVerifyAndGetInfoListener cardVerifyAndGetInfoListener; + + public interface CardVerifyAndGetInfoListener { + void onSuccess(CardVerifyAndGetInfo.Response cardVerifyAndGetArtworkResponse); + void onFail(String message); + } + + public void setCardVerifyAndGetInfoListener(CardVerifyAndGetInfoListener listener) { + cardVerifyAndGetInfoListener = listener; + } + + public void cardVerifyAndGetInfo(TangemCard card) { + TangemApi tangemApi = App.getNetworkComponent().getRetrofitTangem().create(TangemApi.class); + + List requests = new ArrayList<>(); + requests.add(new CardVerifyAndGetInfo.Request.Item(Util.bytesToHex(card.getCID()), Util.bytesToHex(card.getCardPublicKey()))); + + CardVerifyAndGetInfo.Request requestBody = new CardVerifyAndGetInfo.Request(requests); + + Call call = tangemApi.getCardVerifyAndGetInfo(requestBody); + call.enqueue(new Callback() { + @Override + public void onResponse(@NonNull Call call, @NonNull Response response) { + if (response.code() == 200) { + CardVerifyAndGetInfo.Response cardVerifyAndGetArtworkResponse = response.body(); + cardVerifyAndGetInfoListener.onSuccess(cardVerifyAndGetArtworkResponse); + Log.i(TAG, "cardVerifyAndGeInfo onResponse " + response.code()); + } else { + cardVerifyAndGetInfoListener.onFail(String.valueOf(response.code())); + Log.e(TAG, "cardVerifyAndGetInfo onResponse " + response.code()); + } + } + + @Override + public void onFailure(@NonNull Call call, @NonNull Throwable t) { + cardVerifyAndGetInfoListener.onFail(t.getMessage()); + Log.e(TAG, "cardVerifyAndGetInfo onFailure " + t.getMessage()); + } + }); + } + + /** + * HTTP + * Last version request from GitHub + */ + private ArtworkListener artworkListener; + + public interface ArtworkListener { + void onSuccess(String artworkId, InputStream inputStream, Date updateDate); + void onFail(String message); + } + + public void setArtworkListener(ArtworkListener listener) { + artworkListener = listener; + } + + public void requestArtwork(final String artworkId, final Date updateDate, TangemCard card) { + TangemApi tangemApi = App.getNetworkComponent().getRetrofitTangem().create(TangemApi.class); + + Call call = tangemApi.getArtwork(artworkId, Util.bytesToHex(card.getCID()), Util.bytesToHex(card.getCardPublicKey())); + call.enqueue(new Callback() { + @Override + public void onResponse(@NonNull Call call, @NonNull Response response) { + Log.i(TAG, "getArtwork onResponse " + response.code()); + if (response.code() == 200) { + try { + ResponseBody body = response.body(); + if (body != null) { + artworkListener.onSuccess(artworkId, body.byteStream(), updateDate); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + @Override + public void onFailure(@NonNull Call call, @NonNull Throwable t) { + artworkListener.onFail(t.getMessage()); + Log.e(TAG, "getArtwork onFailure " + t.getMessage()); + } + }); + } + + +} \ No newline at end of file diff --git a/tangemcard/src/main/java/com/tangem/tangemcard/data/network/ServerURL.java b/tangemcard/src/main/java/com/tangem/tangemcard/data/network/ServerURL.java new file mode 100644 index 0000000000..0eb32f08f9 --- /dev/null +++ b/tangemcard/src/main/java/com/tangem/tangemcard/data/network/ServerURL.java @@ -0,0 +1,5 @@ +package com.tangem.tangemcard.data.network; + +class ServerURL { + static final String API_TANGEM = "https://verify.tangem.com/"; +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/data/network/TangemApi.java b/tangemcard/src/main/java/com/tangem/tangemcard/data/network/TangemApi.java similarity index 84% rename from app/src/main/java/com/tangem/data/network/TangemApi.java rename to tangemcard/src/main/java/com/tangem/tangemcard/data/network/TangemApi.java index 3a17e33874..112c363362 100644 --- a/app/src/main/java/com/tangem/data/network/TangemApi.java +++ b/tangemcard/src/main/java/com/tangem/tangemcard/data/network/TangemApi.java @@ -1,6 +1,6 @@ -package com.tangem.data.network; +package com.tangem.tangemcard.data.network; -import com.tangem.data.network.model.CardVerifyAndGetInfo; +import com.tangem.tangemcard.data.network.model.CardVerifyAndGetInfo; import okhttp3.ResponseBody; import retrofit2.Call; diff --git a/app/src/main/java/com/tangem/data/network/model/CardVerify.java b/tangemcard/src/main/java/com/tangem/tangemcard/data/network/model/CardVerify.java similarity index 80% rename from app/src/main/java/com/tangem/data/network/model/CardVerify.java rename to tangemcard/src/main/java/com/tangem/tangemcard/data/network/model/CardVerify.java index c03c809cfb..13f39787be 100644 --- a/app/src/main/java/com/tangem/data/network/model/CardVerify.java +++ b/tangemcard/src/main/java/com/tangem/tangemcard/data/network/model/CardVerify.java @@ -1,4 +1,4 @@ -package com.tangem.data.network.model; +package com.tangem.tangemcard.data.network.model; public class CardVerify { private String CID; diff --git a/app/src/main/java/com/tangem/data/network/model/CardVerifyAndGetInfo.kt b/tangemcard/src/main/java/com/tangem/tangemcard/data/network/model/CardVerifyAndGetInfo.kt similarity index 96% rename from app/src/main/java/com/tangem/data/network/model/CardVerifyAndGetInfo.kt rename to tangemcard/src/main/java/com/tangem/tangemcard/data/network/model/CardVerifyAndGetInfo.kt index 0888ca0b16..017648fba3 100644 --- a/app/src/main/java/com/tangem/data/network/model/CardVerifyAndGetInfo.kt +++ b/tangemcard/src/main/java/com/tangem/tangemcard/data/network/model/CardVerifyAndGetInfo.kt @@ -1,4 +1,4 @@ -package com.tangem.data.network.model +package com.tangem.tangemcard.data.network.model import java.text.SimpleDateFormat import java.util.* diff --git a/tangemcard/src/main/java/com/tangem/tangemcard/data/DeviceNFCAntennaLocation.kt b/tangemcard/src/main/java/com/tangem/tangemcard/data/nfc/DeviceNFCAntennaLocation.kt similarity index 96% rename from tangemcard/src/main/java/com/tangem/tangemcard/data/DeviceNFCAntennaLocation.kt rename to tangemcard/src/main/java/com/tangem/tangemcard/data/nfc/DeviceNFCAntennaLocation.kt index 2034a81144..ed0bef115a 100644 --- a/tangemcard/src/main/java/com/tangem/tangemcard/data/DeviceNFCAntennaLocation.kt +++ b/tangemcard/src/main/java/com/tangem/tangemcard/data/nfc/DeviceNFCAntennaLocation.kt @@ -1,4 +1,4 @@ -package com.tangem.tangemcard.data +package com.tangem.tangemcard.data.nfc import android.os.Build diff --git a/tangemcard/src/main/java/com/tangem/tangemcard/data/NFCLocation.kt b/tangemcard/src/main/java/com/tangem/tangemcard/data/nfc/NFCLocation.kt similarity index 99% rename from tangemcard/src/main/java/com/tangem/tangemcard/data/NFCLocation.kt rename to tangemcard/src/main/java/com/tangem/tangemcard/data/nfc/NFCLocation.kt index 711f44d3c5..0b9859767c 100644 --- a/tangemcard/src/main/java/com/tangem/tangemcard/data/NFCLocation.kt +++ b/tangemcard/src/main/java/com/tangem/tangemcard/data/nfc/NFCLocation.kt @@ -1,4 +1,4 @@ -package com.tangem.tangemcard.data +package com.tangem.tangemcard.data.nfc enum class NFCLocation(val codename: String, val fullName: String, val orientation: Int, val x: Int, val y: Int, val z: Int) { model1("sailfish", "Google Pixel", 0, 65, 25, 0), diff --git a/tangemcard/src/main/java/com/tangem/tangemcard/di/NetworkComponent.java b/tangemcard/src/main/java/com/tangem/tangemcard/di/NetworkComponent.java new file mode 100644 index 0000000000..09cfdf0b8f --- /dev/null +++ b/tangemcard/src/main/java/com/tangem/tangemcard/di/NetworkComponent.java @@ -0,0 +1,18 @@ +package com.tangem.tangemcard.di; + +import com.tangem.tangemcard.data.network.Server; + +import javax.inject.Named; +import javax.inject.Singleton; + +import dagger.Component; +import retrofit2.Retrofit; + +@Singleton +@Component(modules = {NetworkModule.class}) +public interface NetworkComponent { + + @Named(Server.ApiTangem.URL_TANGEM) + Retrofit getRetrofitTangem(); + +} \ No newline at end of file diff --git a/tangemcard/src/main/java/com/tangem/tangemcard/di/NetworkModule.java b/tangemcard/src/main/java/com/tangem/tangemcard/di/NetworkModule.java new file mode 100644 index 0000000000..193acdf41e --- /dev/null +++ b/tangemcard/src/main/java/com/tangem/tangemcard/di/NetworkModule.java @@ -0,0 +1,42 @@ +package com.tangem.tangemcard.di; + +import com.tangem.tangemcard.data.network.Server; + +import javax.inject.Named; +import javax.inject.Singleton; + +import dagger.Module; +import dagger.Provides; +import okhttp3.OkHttpClient; +import okhttp3.logging.HttpLoggingInterceptor; +import retrofit2.Retrofit; +import retrofit2.converter.gson.GsonConverterFactory; + +@Module +class NetworkModule { + + @Singleton + @Provides + @Named(Server.ApiTangem.URL_TANGEM) + Retrofit provideRetrofitTangem() { + return new Retrofit.Builder() + .baseUrl(Server.ApiTangem.URL_TANGEM) + .addConverterFactory(GsonConverterFactory.create()) + .client(createOkHttpClient()) + .build(); + } + + private OkHttpClient createOkHttpClient() { + return new OkHttpClient.Builder(). + addInterceptor(createHttpLoggingInterceptor()). + build(); + } + + private HttpLoggingInterceptor createHttpLoggingInterceptor() { + HttpLoggingInterceptor logging = new HttpLoggingInterceptor(); + logging.setLevel(HttpLoggingInterceptor.Level.BODY); + return logging; + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/presentation/dialog/NfcEnableDialog.kt b/tangemcard/src/main/java/com/tangem/tangemcard/presentation/dialog/NfcEnableDialog.kt similarity index 93% rename from app/src/main/java/com/tangem/presentation/dialog/NfcEnableDialog.kt rename to tangemcard/src/main/java/com/tangem/tangemcard/presentation/dialog/NfcEnableDialog.kt index c8676fdc8f..8660e29ab4 100644 --- a/app/src/main/java/com/tangem/presentation/dialog/NfcEnableDialog.kt +++ b/tangemcard/src/main/java/com/tangem/tangemcard/presentation/dialog/NfcEnableDialog.kt @@ -1,4 +1,4 @@ -package com.tangem.presentation.dialog +package com.tangem.tangemcard.presentation.dialog import android.app.Dialog import android.content.Intent @@ -8,7 +8,7 @@ import android.support.v4.app.DialogFragment import android.support.v7.app.AlertDialog -import com.tangem.wallet.R +import com.tangem.tangemcard.R class NfcEnableDialog : DialogFragment() { diff --git a/tangemcard/src/main/java/com/tangem/tangemcard/reader/CardCrypto.java b/tangemcard/src/main/java/com/tangem/tangemcard/reader/CardCrypto.java index a81ace9df5..6cd69b6b3b 100644 --- a/tangemcard/src/main/java/com/tangem/tangemcard/reader/CardCrypto.java +++ b/tangemcard/src/main/java/com/tangem/tangemcard/reader/CardCrypto.java @@ -2,6 +2,7 @@ package com.tangem.tangemcard.reader; import android.util.Log; +import com.tangem.tangemcard.util.PBKDF2; import com.tangem.tangemcard.util.Util; import org.spongycastle.asn1.ASN1EncodableVector; diff --git a/tangemcard/src/main/java/com/tangem/tangemcard/reader/CardProtocol.java b/tangemcard/src/main/java/com/tangem/tangemcard/reader/CardProtocol.java index 05629ac7dc..a5e8cf1752 100644 --- a/tangemcard/src/main/java/com/tangem/tangemcard/reader/CardProtocol.java +++ b/tangemcard/src/main/java/com/tangem/tangemcard/reader/CardProtocol.java @@ -6,17 +6,14 @@ import android.nfc.TagLostException; import android.nfc.tech.IsoDep; import android.util.Log; -import com.tangem.tangemcard.data.Issuer; import com.tangem.tangemcard.data.TangemCard; -import com.tangem.tangemcard.data.Firmwares; -import com.tangem.tangemcard.data.LocalStorage; +import com.tangem.tangemcard.data.local.Firmwares; import com.tangem.tangemcard.data.Manufacturer; import com.tangem.tangemcard.util.Util; import org.spongycastle.jce.ECNamedCurveTable; import org.spongycastle.jce.interfaces.ECPublicKey; import org.spongycastle.jce.spec.ECNamedCurveParameterSpec; -import org.spongycastle.math.ec.ECPoint; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -26,8 +23,6 @@ import java.security.KeyPairGenerator; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.security.spec.ECGenParameterSpec; -import java.util.Calendar; -import java.util.TreeMap; import javax.crypto.KeyAgreement; @@ -499,7 +494,7 @@ public class CardProtocol { // * @throws Exception if something went wrong // */ // public void run_Read() throws Exception { -// run_Read1(true); +// run_Read(true); // } /** @@ -515,7 +510,7 @@ public class CardProtocol { * * @throws Exception if something went wrong */ - public void run_Read1() throws Exception { + public void run_Read() throws Exception { CommandApdu rqApdu = StartPrepareCommand(INS.Read); Log.i(logTag, String.format("[%s]\n%s", rqApdu.getCommandName(), rqApdu.getTLVs().getParsedTLVs(" "))); @@ -811,37 +806,44 @@ public class CardProtocol { * See [1] 8.6 * @param PIN2 - PIN2 code to confirm operation * @param hashes - array of digests to sign (max 10 digest at a time) - * @param UseIssuerValidation - if card need issuer validation before sign (true for SigningMethod=2,4) + * @param issuerTransactionSignature - signature of hashes, if card need issuer validation before sign (for SigningMethod=2) * @param issuerData - new issuerData to write on card (only for SigningMethod=4, null for other) - * @param issuer - issuer (need only for SigningMethod=2,4) + * @param issuerDataSignature - signature of issuerData, if issuerData specified(for SigningMethod=4) * @return TLVList with card answer contained wallet signatures of digests from hashes array (in case of success) * @throws Exception - if something went wrong */ - // TODO - change function to run_SignHashes(String PIN2, byte[][] hashes, byte[] issuerData, byte[] issuerTransactionSignature) because normally issuer signature can be obtained only by external server - public TLVList run_SignHashes(String PIN2, byte[][] hashes, boolean UseIssuerValidation, byte[] issuerData, Issuer issuer) throws Exception { + public TLVList run_SignHashes(String PIN2, byte[][] hashes, byte[] issuerTransactionSignature, byte[] issuerData, byte[] issuerDataSignature) throws Exception { + if ( mCard.getSigningMethod()!=TangemCard.SigningMethod.Sign_Hash_Validated_By_Issuer && mCard.getSigningMethod()!=TangemCard.SigningMethod.Sign_Hash ){ + throw new TangemException("Card don't support signing hashes!"); + } + ByteArrayOutputStream bs = new ByteArrayOutputStream(); - if (hashes.length > 10) throw new Exception("To much hashes in one transaction!"); + if (hashes.length > 10) throw new TangemException("To much hashes in one transaction!"); for (int i = 0; i < hashes.length; i++) { if (i != 0 && hashes[0].length != hashes[i].length) - throw new Exception("Hashes length must be identical!"); + throw new TangemException("Hashes length must be identical!"); bs.write(hashes[i]); } CommandApdu rqApdu = StartPrepareCommand(INS.Sign); rqApdu.addTLV(TLV.Tag.TAG_PIN2, Util.calculateSHA256(PIN2)); rqApdu.addTLV_U8(TLV.Tag.TAG_TrOut_HashSize, hashes[0].length); rqApdu.addTLV(TLV.Tag.TAG_TrOut_Hash, bs.toByteArray()); - if (UseIssuerValidation) { - byte[] issuerSignature = CardCrypto.Signature(issuer.getPrivateTransactionKey(), bs.toByteArray()); - rqApdu.addTLV(TLV.Tag.TAG_Issuer_Transaction_Signature, issuerSignature); - } if (issuerData != null) { - if (issuer == null || issuer == Issuer.Unknown()) - throw new Exception("Need known Issuer to write issuer Data"); - rqApdu.addTLV(TLV.Tag.TAG_Issuer_Data, issuerData); - byte[] issuerSignature = CardCrypto.Signature(issuer.getPrivateTransactionKey(), issuerData); - rqApdu.addTLV(TLV.Tag.TAG_Issuer_Data_Signature, issuerSignature); - } + if ( mCard.getSigningMethod()!=TangemCard.SigningMethod.Sign_Hash_Validated_By_Issuer_And_WriteIssuerData ) + throw new TangemException("Card don't support simultaneous sign with write issuer data!"); + if (issuerDataSignature == null ) + throw new TangemException("Card require issuer validation before write issuer data"); + bs.write(issuerData); + rqApdu.addTLV(TLV.Tag.TAG_Issuer_Data, issuerData); + rqApdu.addTLV(TLV.Tag.TAG_Issuer_Data_Signature, issuerDataSignature); + } + if (issuerTransactionSignature!=null) { + //byte[] issuerSignature = CardCrypto.Signature(issuer.getPrivateTransactionKey(), bs.toByteArray()); + rqApdu.addTLV(TLV.Tag.TAG_Issuer_Transaction_Signature, issuerTransactionSignature); + }else if ( mCard.getSigningMethod()==TangemCard.SigningMethod.Sign_Hash_Validated_By_Issuer ){ + throw new TangemException("Card require issuer validation before sign the transaction!"); + } Log.i(logTag, String.format("[%s]\n%s", rqApdu.getCommandName(), rqApdu.getTLVs().getParsedTLVs(" "))); @@ -868,19 +870,42 @@ public class CardProtocol { * SIGN raw tx - SigningMethod=1 (see {@link TangemCard.SigningMethod}) * See [1] 8.6 * @param PIN2 - PIN2 code to confirm operation + * @param hashAlgID - name of hash alg, used for signature * @param bTxOutData - part of raw transaction to sign + * @param issuerTransactionSignature - signature of hashes, if card need issuer validation before sign (for SigningMethod=2) + * @param issuerData - new issuerData to write on card (only for SigningMethod=4, null for other) + * @param issuerDataSignature - signature of issuerData, if issuerData specified(for SigningMethod=4) * @return TLVList with card answer contained wallet signatures of bTxOutData(in case of success) * @throws Exception - if something went wrong */ - // TODO - change function to run_SignRaw(String PIN2, String hashAlgID, byte[] bTxOutData, byte[] issuerData, byte[] issuerTransactionSignature) to support all signing methods - public TLVList run_SignRaw(String PIN2, byte[] bTxOutData) throws Exception { + public TLVList run_SignRaw(String PIN2, String hashAlgID, byte[] bTxOutData, byte[] issuerTransactionSignature, byte[] issuerData, byte[] issuerDataSignature) throws Exception { CommandApdu rqApdu = StartPrepareCommand(INS.Sign); rqApdu.addTLV(TLV.Tag.TAG_PIN2, Util.calculateSHA256(PIN2)); rqApdu.addTLV(TLV.Tag.TAG_TrOut_Raw, bTxOutData); - rqApdu.addTLV(TLV.Tag.TAG_HashAlgID, "sha-256x2".getBytes("US-ASCII")); + rqApdu.addTLV(TLV.Tag.TAG_HashAlgID, hashAlgID.getBytes("US-ASCII")); Log.i(logTag, String.format("[%s]\n%s", rqApdu.getCommandName(), rqApdu.getTLVs().getParsedTLVs(" "))); + ByteArrayOutputStream bs = new ByteArrayOutputStream(); + if (bTxOutData.length > 1024) throw new TangemException("Raw transaction size is to big!"); + bs.write(bTxOutData); + + if (issuerData != null) { + if ( mCard.getSigningMethod()!=TangemCard.SigningMethod.Sign_Hash_Validated_By_Issuer_And_WriteIssuerData ) + throw new TangemException("Card don't support simultaneous sign with write issuer data!"); + + if (issuerDataSignature == null ) + throw new TangemException("Card require issuer validation before write issuer data"); + bs.write(issuerData); + rqApdu.addTLV(TLV.Tag.TAG_Issuer_Data, issuerData); + rqApdu.addTLV(TLV.Tag.TAG_Issuer_Data_Signature, issuerDataSignature); + } + if (issuerTransactionSignature!=null) { + rqApdu.addTLV(TLV.Tag.TAG_Issuer_Transaction_Signature, issuerTransactionSignature); + }else if ( mCard.getSigningMethod()==TangemCard.SigningMethod.Sign_Hash_Validated_By_Issuer ){ + throw new TangemException("Card require issuer validation before sign the transaction!"); + } + ResponseApdu rspApdu = SendAndReceive(rqApdu, false); if (rspApdu.isStatus(SW.PROCESS_COMPLETED)) { diff --git a/tangemcard/src/main/java/com/tangem/tangemcard/reader/NfcManager.java b/tangemcard/src/main/java/com/tangem/tangemcard/reader/NfcManager.java index 868b9569c9..bf53e18afa 100644 --- a/tangemcard/src/main/java/com/tangem/tangemcard/reader/NfcManager.java +++ b/tangemcard/src/main/java/com/tangem/tangemcard/reader/NfcManager.java @@ -16,7 +16,7 @@ import android.os.Bundle; import android.support.v4.app.ActivityCompat; import android.support.v4.app.FragmentActivity; -import com.tangem.presentation.dialog.NfcEnableDialog; +import com.tangem.tangemcard.presentation.dialog.NfcEnableDialog; import java.io.IOException; diff --git a/tangemcard/src/main/java/com/tangem/tangemcard/reader/ResponseApdu.java b/tangemcard/src/main/java/com/tangem/tangemcard/reader/ResponseApdu.java index 1c4c3e367c..fbc3b00be5 100644 --- a/tangemcard/src/main/java/com/tangem/tangemcard/reader/ResponseApdu.java +++ b/tangemcard/src/main/java/com/tangem/tangemcard/reader/ResponseApdu.java @@ -1,6 +1,6 @@ package com.tangem.tangemcard.reader; -import com.tangem.util.Util; +import com.tangem.tangemcard.util.Util; import java.io.ByteArrayInputStream; import java.util.Arrays; diff --git a/tangemcard/src/main/java/com/tangem/tangemcard/reader/TLV.java b/tangemcard/src/main/java/com/tangem/tangemcard/reader/TLV.java index f38733b4d1..5fa1f3637d 100644 --- a/tangemcard/src/main/java/com/tangem/tangemcard/reader/TLV.java +++ b/tangemcard/src/main/java/com/tangem/tangemcard/reader/TLV.java @@ -1,6 +1,6 @@ package com.tangem.tangemcard.reader; -import com.tangem.util.Util; +import com.tangem.tangemcard.util.Util; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; diff --git a/tangemcard/src/main/java/com/tangem/tangemcard/reader/TLVList.java b/tangemcard/src/main/java/com/tangem/tangemcard/reader/TLVList.java index 11c3e2597d..965d453058 100644 --- a/tangemcard/src/main/java/com/tangem/tangemcard/reader/TLVList.java +++ b/tangemcard/src/main/java/com/tangem/tangemcard/reader/TLVList.java @@ -6,7 +6,7 @@ package com.tangem.tangemcard.reader; import android.support.annotation.NonNull; -import com.tangem.util.Util; +import com.tangem.tangemcard.util.Util; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; diff --git a/tangemcard/src/main/java/com/tangem/tangemcard/tasks/CreateNewWalletTask.java b/tangemcard/src/main/java/com/tangem/tangemcard/tasks/CreateNewWalletTask.java index 6de9679b36..d223027d0c 100644 --- a/tangemcard/src/main/java/com/tangem/tangemcard/tasks/CreateNewWalletTask.java +++ b/tangemcard/src/main/java/com/tangem/tangemcard/tasks/CreateNewWalletTask.java @@ -6,95 +6,31 @@ import android.util.Log; import com.tangem.tangemcard.reader.CardProtocol; import com.tangem.tangemcard.reader.NfcManager; -import com.tangem.tangemcard.data.PINStorage; +import com.tangem.tangemcard.data.local.PINStorage; import com.tangem.tangemcard.data.TangemCard; -public class CreateNewWalletTask extends Thread { +public class CreateNewWalletTask extends CustomReadCardTask { public static final String TAG = CreateNewWalletTask.class.getSimpleName(); - private Context mContext; - private TangemCard mCard; - private NfcManager mNfcManager; - private IsoDep mIsoDep; - private CardProtocol.Notifications mNotifications; - private boolean isCancelled = false; - public CreateNewWalletTask(Context context, TangemCard card, NfcManager nfcManager, IsoDep isoDep, CardProtocol.Notifications notifications) { - mCard = card; - mContext = context; - mNfcManager = nfcManager; - mIsoDep = isoDep; - mNotifications = notifications; + super(context, card, nfcManager, isoDep, notifications); } @Override - public void run() { - if (mIsoDep == null) { - return; - } - CardProtocol protocol = new CardProtocol(mContext, mIsoDep, mCard, mNotifications); - mNotifications.onReadStart(protocol); - try { - // for Samsung's bugs - - // Workaround for the Samsung Galaxy S5 (since the - // first connection always hangs on transceive). - int timeout = mIsoDep.getTimeout(); - mIsoDep.connect(); - mIsoDep.close(); - mIsoDep.connect(); - mIsoDep.setTimeout(timeout); - try { - mNotifications.onReadProgress(protocol, 5); + public void run_Task() throws Exception { + mNotifications.onReadProgress(protocol, 20); + protocol.run_VerifyCard(); - Log.i(TAG, "[-- Start create new wallet --]"); + Log.i(TAG, "Manufacturer: " + protocol.getCard().getManufacturer().getOfficialName()); - if (isCancelled) return; - protocol.run_VerifyCard(); + mNotifications.onReadProgress(protocol, 30); + if (isCancelled) return; + protocol.run_CreateWallet(PINStorage.getPIN2()); + mNotifications.onReadProgress(protocol, 60); + if (isCancelled) return; - Log.i(TAG, "Manufacturer: " + protocol.getCard().getManufacturer().getOfficialName()); - - mNotifications.onReadProgress(protocol, 30); - if (isCancelled) return; - -// if (mCard.getPauseBeforePIN2() > 0) { -// mNotifications.onReadWait(mCard.getPauseBeforePIN2()); -// } -// try { - protocol.run_CreateWallet(PINStorage.getPIN2()); -// } finally { -// mNotifications.onReadWait(0); -// } - mNotifications.onReadProgress(protocol, 60); - if (isCancelled) return; - - protocol.run_Read(); - - } finally { - mNfcManager.ignoreTag(mIsoDep.getTag()); - } - } catch (Exception e) { - e.printStackTrace(); - protocol.setError(e); - - } finally { - Log.i(TAG, "[-- Finish create new wallet --]"); - mNotifications.onReadFinish(protocol); - } - } - - public void cancel(Boolean AllowInterrupt) { - try { - if (isAlive()) { - isCancelled = true; - join(500); - } - if (isAlive() && AllowInterrupt) { - interrupt(); - mNotifications.onReadCancel(); - } - } catch (Exception e) { - e.printStackTrace(); - } + protocol.run_Read(); + parseReadResult(); } } \ No newline at end of file diff --git a/tangemcard/src/main/java/com/tangem/tangemcard/tasks/CustomReadCardTask.java b/tangemcard/src/main/java/com/tangem/tangemcard/tasks/CustomReadCardTask.java index 4036851ce0..34de48329b 100644 --- a/tangemcard/src/main/java/com/tangem/tangemcard/tasks/CustomReadCardTask.java +++ b/tangemcard/src/main/java/com/tangem/tangemcard/tasks/CustomReadCardTask.java @@ -5,9 +5,9 @@ import android.nfc.tech.IsoDep; import android.util.Log; import com.tangem.tangemcard.data.Issuer; -import com.tangem.tangemcard.data.LocalStorage; +import com.tangem.tangemcard.data.local.LocalStorage; import com.tangem.tangemcard.data.Manufacturer; -import com.tangem.tangemcard.data.PINStorage; +import com.tangem.tangemcard.data.local.PINStorage; import com.tangem.tangemcard.data.TangemCard; import com.tangem.tangemcard.reader.CardProtocol; import com.tangem.tangemcard.reader.NfcManager; @@ -21,6 +21,7 @@ import org.spongycastle.jce.spec.ECNamedCurveParameterSpec; import org.spongycastle.math.ec.ECPoint; import java.util.ArrayList; +import java.util.Arrays; import java.util.Calendar; /** @@ -112,6 +113,7 @@ public class CustomReadCardTask extends Thread { * @throws CardProtocol.TangemException - if something went wrong */ public void parseReadResult() throws CardProtocol.TangemException { + if( mCard==null ) mCard=protocol.getCard(); // These tags always present in the parsed response: TAG_Status, TAG_CID, TAG_Manufacture_ID, TAG_Health, TAG_Firmware TLV tlvStatus = protocol.getReadResult().getTLV(TLV.Tag.TAG_Status); mCard.setStatus(TangemCard.Status.fromCode(Util.byteArrayToInt(tlvStatus.Value))); @@ -256,19 +258,6 @@ public class CustomReadCardTask extends Thread { mCard.setWalletPublicKey(pkUncompressed); mCard.setWalletPublicKeyRar(pkCompresses); - // TODO - store in mCard only public key, not wallet address, move wallet address to coinData -// TangemContext ctx = new TangemContext(mCard); -// try { -// CoinEngine engineCoin = CoinEngineFactory.INSTANCE.create(ctx); -// if (engineCoin == null) throw new Exception("Can't create CoinEngine!"); -// String wallet = engineCoin.calculateAddress(pkUncompressed); -// mCard.setWallet(wallet); -// } catch (Exception e) { -// e.printStackTrace(); -// throw new TangemException("Can't define wallet address"); -// } - //mCard.setWallet(Blockchain.calculateWalletAddress(mCard, pkUncompressed)); - mCard.setRemainingSignatures(protocol.getReadResult().getTagAsInt(TLV.Tag.TAG_RemainingSignatures)); if (protocol.getReadResult() != null && protocol.getReadResult().getTLV(TLV.Tag.TAG_SignedHashes) != null) { @@ -348,7 +337,7 @@ public class CustomReadCardTask extends Thread { if (protocol.getCard().encryptionMode != TangemCard.EncryptionMode.None) { protocol.CreateProtocolKey(); } - protocol.run_Read1(); + protocol.run_Read(); // After first successful read, data will be parsed into TangemCard object parseReadResult(); @@ -375,9 +364,9 @@ public class CustomReadCardTask extends Thread { public void run_SecondTimeRead() throws Exception { String PIN = mCard.getPIN(); protocol.setPIN(PIN); - protocol.run_Read1(); + protocol.run_Read(); PINStorage.setLastUsedPIN(PIN); - if (!mCard.getCID().equals(protocol.getReadResult().getTLV(TLV.Tag.TAG_CardID))) { + if (!Arrays.equals(mCard.getCID(),protocol.getReadResult().getTLV(TLV.Tag.TAG_CardID).Value)) { throw new CardProtocol.TangemException("Card must be the same. Reading attempt on different card!"); } } diff --git a/tangemcard/src/main/java/com/tangem/tangemcard/tasks/PurgeTask.java b/tangemcard/src/main/java/com/tangem/tangemcard/tasks/PurgeTask.java index 9e42ea2581..2b943f4271 100644 --- a/tangemcard/src/main/java/com/tangem/tangemcard/tasks/PurgeTask.java +++ b/tangemcard/src/main/java/com/tangem/tangemcard/tasks/PurgeTask.java @@ -5,7 +5,7 @@ import android.nfc.tech.IsoDep; import com.tangem.tangemcard.reader.CardProtocol; import com.tangem.tangemcard.reader.NfcManager; -import com.tangem.tangemcard.data.PINStorage; +import com.tangem.tangemcard.data.local.PINStorage; import com.tangem.tangemcard.data.TangemCard; public class PurgeTask extends CustomReadCardTask { @@ -22,7 +22,7 @@ public class PurgeTask extends CustomReadCardTask { } protocol.run_PurgeWallet(PINStorage.getPIN2()); mNotifications.onReadProgress(protocol, 50); - protocol.run_Read1(); + protocol.run_Read(); mNotifications.onReadProgress(protocol, 100); } diff --git a/tangemcard/src/main/java/com/tangem/tangemcard/tasks/SignTask.java b/tangemcard/src/main/java/com/tangem/tangemcard/tasks/SignTask.java new file mode 100644 index 0000000000..75a3bdd830 --- /dev/null +++ b/tangemcard/src/main/java/com/tangem/tangemcard/tasks/SignTask.java @@ -0,0 +1,93 @@ +package com.tangem.tangemcard.tasks; + +import android.content.Context; +import android.nfc.tech.IsoDep; +import android.util.Log; + +import com.tangem.tangemcard.data.local.PINStorage; +import com.tangem.tangemcard.data.TangemCard; +import com.tangem.tangemcard.reader.CardProtocol; +import com.tangem.tangemcard.reader.NfcManager; +import com.tangem.tangemcard.reader.TLV; +import com.tangem.tangemcard.reader.TLVList; + +import java.io.ByteArrayOutputStream; + +public class SignTask extends CustomReadCardTask { + public static final String TAG = SignTask.class.getSimpleName(); + + /** + * Payment Engine request/notifications during sign process + */ + public interface PaymentToSign { + boolean isSigningMethodSupported(TangemCard.SigningMethod signingMethod); + + byte[][] getHashesToSign(); + + byte[] getRawDataToSign(); + + String getHashAlgToSign(); + + byte[] getIssuerTransactionSignature(byte[] dataToSignByIssuer); + + void OnSignCompleted(byte[] signature); + } + + private PaymentToSign paymentToSign; + + public SignTask(Context context, TangemCard card, NfcManager nfcManager, IsoDep isoDep, CardProtocol.Notifications notifications, PaymentToSign paymentToSign) { + super(context, card, nfcManager, isoDep, notifications); + this.paymentToSign = paymentToSign; + } + + @Override + public void run_Task() throws Exception { + protocol.run_VerifyCard(); + + Log.i(TAG, "Manufacturer: " + protocol.getCard().getManufacturer().getOfficialName()); + + mNotifications.onReadProgress(protocol, 30); + if (isCancelled) return; + + if (mCard.getPauseBeforePIN2() > 0) { + mNotifications.onReadWait(mCard.getPauseBeforePIN2()); + } + + if (!paymentToSign.isSigningMethodSupported(mCard.getSigningMethod())) { + throw new CardProtocol.TangemException("Signing method isn't supported!"); + } + + TLVList signResult; + switch (mCard.getSigningMethod()) { + case Sign_Hash: + signResult = protocol.run_SignHashes(PINStorage.getPIN2(), paymentToSign.getHashesToSign(), null, null, null); + break; + case Sign_Hash_Validated_By_Issuer: + case Sign_Hash_Validated_By_Issuer_And_WriteIssuerData: + ByteArrayOutputStream bs = new ByteArrayOutputStream(); + byte[][] hashes = paymentToSign.getHashesToSign(); + if (hashes.length > 10) throw new CardProtocol.TangemException("To much hashes in one transaction!"); + for (int i = 0; i < hashes.length; i++) { + if (i != 0 && hashes[0].length != hashes[i].length) + throw new CardProtocol.TangemException("Hashes length must be identical!"); + bs.write(hashes[i]); + } + signResult = protocol.run_SignHashes(PINStorage.getPIN2(), hashes, paymentToSign.getIssuerTransactionSignature(bs.toByteArray()), null, null); + break; + case Sign_Raw: + signResult = protocol.run_SignRaw(PINStorage.getPIN2(), paymentToSign.getHashAlgToSign(), paymentToSign.getRawDataToSign(), null, null, null); + break; + case Sign_Raw_Validated_By_Issuer: + case Sign_Raw_Validated_By_Issuer_And_WriteIssuerData: + byte[] txOut = paymentToSign.getRawDataToSign(); + signResult = protocol.run_SignRaw(PINStorage.getPIN2(), paymentToSign.getHashAlgToSign(), txOut, paymentToSign.getIssuerTransactionSignature(txOut), null, null); + break; + default: + throw new CardProtocol.TangemException("Signing method isn't supported!"); + } + + paymentToSign.OnSignCompleted(signResult.getTLV(TLV.Tag.TAG_Signature).Value); + mNotifications.onReadProgress(protocol, 100); + + } +} diff --git a/tangemcard/src/main/java/com/tangem/tangemcard/tasks/SwapPINTask.java b/tangemcard/src/main/java/com/tangem/tangemcard/tasks/SwapPINTask.java index 564764f7aa..a5ba27b61e 100644 --- a/tangemcard/src/main/java/com/tangem/tangemcard/tasks/SwapPINTask.java +++ b/tangemcard/src/main/java/com/tangem/tangemcard/tasks/SwapPINTask.java @@ -2,105 +2,40 @@ package com.tangem.tangemcard.tasks; import android.content.Context; import android.nfc.tech.IsoDep; -import android.util.Log; import com.tangem.tangemcard.reader.CardProtocol; import com.tangem.tangemcard.reader.NfcManager; -import com.tangem.tangemcard.data.PINStorage; +import com.tangem.tangemcard.data.local.PINStorage; import com.tangem.tangemcard.data.TangemCard; -public class SwapPINTask extends Thread { +public class SwapPINTask extends CustomReadCardTask { public static final String TAG = SwapPINTask.class.getSimpleName(); - private Context mContext; - private TangemCard mCard; - private NfcManager mNfcManager; private String newPIN, newPIN2; - private IsoDep mIsoDep; - private CardProtocol.Notifications mNotifications; - private boolean isCancelled = false; public SwapPINTask(Context context, TangemCard card, NfcManager nfcManager, String newPIN, String newPIN2, IsoDep isoDep, CardProtocol.Notifications notifications) { + super(context, card, nfcManager, isoDep, notifications); this.newPIN = newPIN; this.newPIN2 = newPIN2; - mCard = card; - mContext = context; - mNfcManager = nfcManager; - mIsoDep = isoDep; - mNotifications = notifications; } @Override - public void run() { - if (mIsoDep == null) { - return; + public void run_Task() throws Exception { + + if (mCard.getPauseBeforePIN2() > 0) { + mNotifications.onReadWait(mCard.getPauseBeforePIN2()); } - CardProtocol protocol = new CardProtocol(mContext, mIsoDep, mCard, mNotifications); - mNotifications.onReadStart(protocol); - try { + protocol.run_SetPIN(PINStorage.getPIN2(), newPIN, newPIN2, false); + protocol.setPIN(newPIN); + mCard.setPIN(newPIN); - // for Samsung's bugs - - // Workaround for the Samsung Galaxy S5 (since the - // first connection always hangs on transceive). - int timeout = mIsoDep.getTimeout(); - mIsoDep.connect(); - mIsoDep.close(); - mIsoDep.connect(); - mIsoDep.setTimeout(timeout); - try { + mNotifications.onReadProgress(protocol, 50); - mNotifications.onReadProgress(protocol, 5); + protocol.run_Read(); - Log.i(TAG, "[-- Start swap pin --]"); + mNotifications.onReadProgress(protocol, 100); - if (isCancelled) return; - - if (mCard.getPauseBeforePIN2() > 0) { - mNotifications.onReadWait(mCard.getPauseBeforePIN2()); - } - -// try { - protocol.run_SetPIN(PINStorage.getPIN2(), newPIN, newPIN2, false); - protocol.setPIN(newPIN); - mCard.setPIN(newPIN); -// } finally { -// mNotifications.onReadWait(0); -// } - - mNotifications.onReadProgress(protocol, 50); - - protocol.run_Read(); - - mNotifications.onReadProgress(protocol, 100); - - } finally { - mNfcManager.ignoreTag(mIsoDep.getTag()); - mNotifications.onReadWait(0); - } - } catch (Exception e) { - e.printStackTrace(); - protocol.setError(e); - - } finally { - Log.i(TAG, "[-- Finish purge --]"); - mNotifications.onReadFinish(protocol); - } } - - public void cancel(Boolean AllowInterrupt) { - try { - if (isAlive()) { - isCancelled = true; - join(500); - } - if (isAlive() && AllowInterrupt) { - interrupt(); - mNotifications.onReadCancel(); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - + } \ No newline at end of file diff --git a/tangemcard/src/main/java/com/tangem/tangemcard/tasks/VerifyCardTask.java b/tangemcard/src/main/java/com/tangem/tangemcard/tasks/VerifyCardTask.java index 6ab2e0b8d4..855851782b 100644 --- a/tangemcard/src/main/java/com/tangem/tangemcard/tasks/VerifyCardTask.java +++ b/tangemcard/src/main/java/com/tangem/tangemcard/tasks/VerifyCardTask.java @@ -5,9 +5,8 @@ import android.nfc.tech.IsoDep; import android.util.Log; import com.tangem.tangemcard.reader.CardProtocol; -import com.tangem.tangemcard.data.Firmwares; +import com.tangem.tangemcard.data.local.Firmwares; import com.tangem.tangemcard.reader.NfcManager; -import com.tangem.tangemcard.data.PINStorage; import com.tangem.tangemcard.data.TangemCard; import java.util.Arrays; diff --git a/tangemcard/src/main/java/com/tangem/tangemcard/reader/PBKDF2.java b/tangemcard/src/main/java/com/tangem/tangemcard/util/PBKDF2.java similarity index 98% rename from tangemcard/src/main/java/com/tangem/tangemcard/reader/PBKDF2.java rename to tangemcard/src/main/java/com/tangem/tangemcard/util/PBKDF2.java index 873b76ca6e..31d8d47a6e 100644 --- a/tangemcard/src/main/java/com/tangem/tangemcard/reader/PBKDF2.java +++ b/tangemcard/src/main/java/com/tangem/tangemcard/util/PBKDF2.java @@ -1,5 +1,5 @@ -package com.tangem.tangemcard.reader; +package com.tangem.tangemcard.util; import org.spongycastle.crypto.CipherParameters; import org.spongycastle.crypto.digests.SHA256Digest; diff --git a/app/src/main/res/drawable/ic_action_nfc_gray.png b/tangemcard/src/main/res/drawable/ic_action_nfc_gray.png similarity index 100% rename from app/src/main/res/drawable/ic_action_nfc_gray.png rename to tangemcard/src/main/res/drawable/ic_action_nfc_gray.png diff --git a/tangemcard/src/main/res/values/strings.xml b/tangemcard/src/main/res/values/strings.xml index 2f96d49efc..3be1a76c7b 100644 --- a/tangemcard/src/main/res/values/strings.xml +++ b/tangemcard/src/main/res/values/strings.xml @@ -1,3 +1,8 @@ tangemcard + OK + Quit + Enable NFC? + This app is useless when NFC is disabled. Reader mode depends on it. Hit OK to go to Settings, where you can enable NFC. + From 6ebb46c2a531cc80ec0b1a4cf77fa56f04ff0bce Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 6 Dec 2018 12:11:10 +0300 Subject: [PATCH 08/61] Updated on 2026-08-14 --- .../com/tangem/data/nfc/SignPaymentTask.java | 159 -------- .../com/tangem/domain/wallet/CoinEngine.java | 20 +- .../domain/wallet/UnspentOutputInfo.java | 2 - .../domain/wallet/bch/BtcCashEngine.java | 187 +++++++--- .../tangem/domain/wallet/btc/BtcEngine.java | 176 +++++++-- .../tangem/domain/wallet/eth/EthEngine.java | 147 ++++++-- .../domain/wallet/token/TokenEngine.java | 342 ++++++++++++++---- .../activity/ConfirmPaymentActivity.kt | 21 +- .../activity/SignPaymentActivity.kt | 137 +------ .../com/tangem/tangemcard/tasks/SignTask.java | 12 +- 10 files changed, 711 insertions(+), 492 deletions(-) delete mode 100644 app/src/main/java/com/tangem/data/nfc/SignPaymentTask.java diff --git a/app/src/main/java/com/tangem/data/nfc/SignPaymentTask.java b/app/src/main/java/com/tangem/data/nfc/SignPaymentTask.java deleted file mode 100644 index 40dbb93549..0000000000 --- a/app/src/main/java/com/tangem/data/nfc/SignPaymentTask.java +++ /dev/null @@ -1,159 +0,0 @@ -package com.tangem.data.nfc; - -import android.app.Activity; -import android.content.Intent; -import android.nfc.tech.IsoDep; -import android.util.Log; - -import com.tangem.domain.wallet.BTCUtils; -import com.tangem.domain.wallet.CoinEngine; -import com.tangem.domain.wallet.CoinEngineFactory; -import com.tangem.domain.wallet.TangemContext; -import com.tangem.presentation.activity.SendTransactionActivity; -import com.tangem.presentation.activity.SignPaymentActivity; -import com.tangem.tangemcard.reader.CardProtocol; -import com.tangem.tangemcard.reader.NfcManager; -import com.tangem.tangemcard.data.Blockchain; - -import java.io.IOException; - -public class SignPaymentTask extends Thread{ - public static final String TAG = SignPaymentTask.class.getSimpleName(); - - private CoinEngine.Amount txAmount; - private CoinEngine.Amount txFee; - private Boolean txIncFee = true; - - public void SetTransactionValue(CoinEngine.Amount amount, CoinEngine.Amount fee, Boolean incfee) { - txAmount = amount; - txFee = fee; - txIncFee = incfee; - } - - private String txOutAddress; - private Activity mContext; - private TangemContext mCtx; - private NfcManager mNfcManager; - private IsoDep mIsoDep; - private CardProtocol.Notifications mNotifications; - private boolean isCancelled = false; - - public SignPaymentTask(Activity context, TangemContext ctx, NfcManager nfcManager, IsoDep isoDep, CardProtocol.Notifications notifications, CoinEngine.Amount amount, CoinEngine.Amount fee, Boolean IncFee, String outAddress) { - mCtx=ctx; - mContext = context; - mNfcManager = nfcManager; - mIsoDep = isoDep; - mNotifications = notifications; - txOutAddress = outAddress; - SetTransactionValue(amount, fee, IncFee); - } - - @Override - public void run() { - if (mIsoDep == null) { - return; - } - CardProtocol protocol = new CardProtocol(mContext, mIsoDep, mCtx.getCard(), mNotifications); - - mNotifications.onReadStart(protocol); - try { - - // for Samsung's bugs - - // Workaround for the Samsung Galaxy S5 (since the - // first connection always hangs on transceive). - int timeout = mIsoDep.getTimeout(); - mIsoDep.connect(); - mIsoDep.close(); - mIsoDep.connect(); - mIsoDep.setTimeout(timeout); - try { - mNotifications.onReadProgress(protocol, 5); - - Log.i(TAG, "[-- Start sign payment --]"); - - if (isCancelled) return; - protocol.run_Read(); - protocol.run_VerifyCard(); - - Log.i(TAG, "Manufacturer: " + protocol.getCard().getManufacturer().getOfficialName()); - - mNotifications.onReadProgress(protocol, 30); - if (isCancelled) return; -// -// if (mCard.getBlockchain() == Blockchain.Ethereum) { -// SignETH_TX(protocol); -// } else { -// SignBTC_TX(protocol); -// } - - CoinEngine engine = CoinEngineFactory.INSTANCE.create(mCtx); - if (engine != null) { - if (mCtx.getCard().getPauseBeforePIN2() > 0) { - mNotifications.onReadWait(mCtx.getCard().getPauseBeforePIN2()); - } - - byte[] tx = null; - try { - tx = engine.sign(txFee, txAmount, txIncFee, txOutAddress, protocol); - } - catch (IOException e) { - e.printStackTrace(); - protocol.setError(e); - } finally { - mNotifications.onReadWait(0); - } - - if (tx != null) { - // TODO - move to engine!!! - String txStr = BTCUtils.toHex(tx); - if (mCtx.getBlockchain() == Blockchain.Ethereum || mCtx.getBlockchain() == Blockchain.EthereumTestNet || mCtx.getBlockchain() == Blockchain.Token) { - txStr = String.format("0x%s", txStr); - } - - Intent intent = new Intent(mContext, SendTransactionActivity.class); - mCtx.saveToIntent(intent); - intent.putExtra(SendTransactionActivity.EXTRA_TX, txStr); - mContext.startActivityForResult(intent, SignPaymentActivity.REQUEST_CODE_SEND_PAYMENT); - } - } - mNotifications.onReadProgress(protocol, 100); - - - if (isCancelled) return; - - } finally { - mNfcManager.ignoreTag(mIsoDep.getTag()); - mNotifications.onReadWait(0); - } - } catch (CardProtocol.TangemException_InvalidPIN e) { - e.printStackTrace(); - protocol.setError(e); - } catch (CardProtocol.TangemException_WrongAmount e) { - e.printStackTrace(); - protocol.setError(e); - } catch (Exception e) { - e.printStackTrace(); - protocol.setError(e); - - } finally { - Log.i(TAG, "[-- Finish sign payment --]"); - mNotifications.onReadFinish(protocol); - } - } - - public void cancel(Boolean AllowInterrupt) { - try { - if (isAlive()) { - isCancelled = true; - join(500); - } - if (isAlive() && AllowInterrupt) { - interrupt(); - mNotifications.onReadCancel(); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/domain/wallet/CoinEngine.java b/app/src/main/java/com/tangem/domain/wallet/CoinEngine.java index e3d6576bcd..f93c438f78 100644 --- a/app/src/main/java/com/tangem/domain/wallet/CoinEngine.java +++ b/app/src/main/java/com/tangem/domain/wallet/CoinEngine.java @@ -185,7 +185,7 @@ public abstract class CoinEngine { public abstract boolean isBalanceNotZero(); - public abstract byte[] sign(Amount feeValue, Amount amountValue, boolean IncFee, String targetAddress, CardProtocol protocol) throws Exception; +// public abstract byte[] sign(Amount feeValue, Amount amountValue, boolean IncFee, String targetAddress, CardProtocol protocol) throws Exception; // TODO - change isExtractPossible to isExtractPossible and if not - return string message public abstract boolean isExtractPossible(); @@ -248,8 +248,22 @@ public abstract class CoinEngine { } - public SignTask.PaymentToSign constructPayment(Amount feeValue, Amount amountValue, boolean IncFee, String targetAddress) + public abstract SignTask.PaymentToSign constructPayment(Amount feeValue, Amount amountValue, boolean IncFee, String targetAddress) throws Exception; + + public interface OnNeedSendPayment { - return null; + void onPaymentPrepared(byte[] txForSend); + } + private OnNeedSendPayment onNeedSendPayment; + + public void setOnNeedSendPayment(OnNeedSendPayment onNeedSendPayment) { + this.onNeedSendPayment = onNeedSendPayment; + } + + protected void notifyOnNeedSendPayment(byte[] txForSend) throws Exception { + if(onNeedSendPayment==null) + throw new Exception("Payment signed but no callback defined to send!"); + onNeedSendPayment.onPaymentPrepared(txForSend); + } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/domain/wallet/UnspentOutputInfo.java b/app/src/main/java/com/tangem/domain/wallet/UnspentOutputInfo.java index ddd4b2a113..88191c50b6 100644 --- a/app/src/main/java/com/tangem/domain/wallet/UnspentOutputInfo.java +++ b/app/src/main/java/com/tangem/domain/wallet/UnspentOutputInfo.java @@ -13,8 +13,6 @@ public class UnspentOutputInfo { public final long confirmations; public String txHashForBuild; public byte[] scriptForBuild; - public byte[] bodyDoubleHash; - public byte[] bodyHash; public UnspentOutputInfo(byte[] txHash, Transaction.Script script, long value, int outputIndex, long confirmations, String hashForBuild, byte[] sign) { this.txHash = txHash; diff --git a/app/src/main/java/com/tangem/domain/wallet/bch/BtcCashEngine.java b/app/src/main/java/com/tangem/domain/wallet/bch/BtcCashEngine.java index 1c36a95f6e..f615742b96 100644 --- a/app/src/main/java/com/tangem/domain/wallet/bch/BtcCashEngine.java +++ b/app/src/main/java/com/tangem/domain/wallet/bch/BtcCashEngine.java @@ -17,6 +17,7 @@ import com.tangem.domain.wallet.TangemContext; import com.tangem.domain.wallet.Transaction; import com.tangem.domain.wallet.UnspentOutputInfo; import com.tangem.domain.wallet.BTCUtils; +import com.tangem.tangemcard.tasks.SignTask; import com.tangem.util.CryptoUtil; import com.tangem.util.DecimalDigitsInputFilter; import com.tangem.util.DerEncodingUtil; @@ -433,15 +434,13 @@ public class BtcCashEngine extends CoinEngine { // return mCard.getAmountDescription(Double.parseDouble(amount)); // } - @Override - public byte[] sign(Amount feeValue, Amount amountValue, boolean IncFee, String destAddress, CardProtocol protocol) throws Exception { + @Override + public SignTask.PaymentToSign constructPayment(Amount feeValue, Amount amountValue, boolean IncFee, String targetAddress) throws Exception { checkBlockchainDataExists(); - CoinEngine engine = CoinEngineFactory.INSTANCE.create(ctx); - - String srcLegacyAddress = ((BtcCashEngine)engine).convertToLegacyAddress(ctx.getCoinData().getWallet()); - String destLegacyAddress = ((BtcCashEngine)engine).convertToLegacyAddress(destAddress); + String srcLegacyAddress = convertToLegacyAddress(ctx.getCoinData().getWallet()); + String destLegacyAddress = convertToLegacyAddress(targetAddress); byte[] pbKey = ctx.getCard().getWalletPublicKeyRar(); //ALWAYS USING COMPRESS KEY // Build script for our address @@ -470,50 +469,156 @@ public class BtcCashEngine extends CoinEngine { throw new CardProtocol.TangemException_WrongAmount(String.format("Balance (%d) < change (%d) + amount (%d)", fullAmount, change, amount)); } - byte[][] dataForSign = new byte[unspentOutputs.size()][]; + final long amountFinal = amount; + final long changeFinal = change; + + byte[][] txForSign= new byte[unspentOutputs.size()][]; + byte[][] bodyHash= new byte[unspentOutputs.size()][]; + byte[][] bodyDoubleHash= new byte[unspentOutputs.size()][]; for (int i = 0; i < unspentOutputs.size(); ++i) { - byte[] newTX = BTCUtils.buildTXForSign(srcLegacyAddress, destLegacyAddress, srcLegacyAddress, unspentOutputs, i, amount, change); + txForSign[i] = BTCUtils.buildTXForSign(srcLegacyAddress, destLegacyAddress, srcLegacyAddress, unspentOutputs, i, amount, change); + bodyHash[i] = Util.calculateSHA256(txForSign[i]); + bodyDoubleHash[i] = Util.calculateSHA256(bodyHash[i]); + } - byte[] hashData = Util.calculateSHA256(newTX); - byte[] doubleHashData = Util.calculateSHA256(hashData); + return new SignTask.PaymentToSign() { - unspentOutputs.get(i).bodyDoubleHash = doubleHashData; - unspentOutputs.get(i).bodyHash = hashData; - - if (ctx.getCard().getSigningMethod() == TangemCard.SigningMethod.Sign_Raw || ctx.getCard().getSigningMethod() == TangemCard.SigningMethod.Sign_Raw_Validated_By_Issuer) { - dataForSign[i] = newTX; - } else { - dataForSign[i] = doubleHashData; + @Override + public boolean isSigningMethodSupported(TangemCard.SigningMethod signingMethod) { + return signingMethod==TangemCard.SigningMethod.Sign_Hash || signingMethod==TangemCard.SigningMethod.Sign_Raw; } - } - - byte[] signFromCard; - if (ctx.getCard().getSigningMethod() == TangemCard.SigningMethod.Sign_Raw || ctx.getCard().getSigningMethod() == TangemCard.SigningMethod.Sign_Raw_Validated_By_Issuer) { - ByteArrayOutputStream bs = new ByteArrayOutputStream(); - if (dataForSign.length > 10) throw new Exception("To much hashes in one transaction!"); - for (int i = 0; i < dataForSign.length; i++) { - if (i != 0 && dataForSign[0].length != dataForSign[i].length) - throw new Exception("Hashes length must be identical!"); - bs.write(dataForSign[i]); + @Override + public byte[][] getHashesToSign() throws Exception { + byte[][] dataForSign=new byte[unspentOutputs.size()][]; + if (txForSign.length > 10) throw new Exception("To much hashes in one transaction!"); + for (int i = 0; i < unspentOutputs.size(); ++i) { + dataForSign[i] = bodyDoubleHash[i]; + } + return dataForSign; } - signFromCard = protocol.run_SignRaw(PINStorage.getPIN2(), "sha-256x2", bs.toByteArray(), null, null, null).getTLV(TLV.Tag.TAG_Signature).Value; - } else { - //ctx.getCard().getSigningMethod() == TangemCard.SigningMethod.Sign_Hash_Validated_By_Issuer - //ctx.getCard().getIssuer() - signFromCard = protocol.run_SignHashes(PINStorage.getPIN2(), dataForSign, null, null, null).getTLV(TLV.Tag.TAG_Signature).Value; - // TODO slice signFromCard to hashes.length parts - } - for (int i = 0; i < unspentOutputs.size(); ++i) { - BigInteger r = new BigInteger(1, Arrays.copyOfRange(signFromCard, i * 64, 32 + i * 64)); - BigInteger s = new BigInteger(1, Arrays.copyOfRange(signFromCard, 32 + i * 64, 64 + i * 64)); - s = CryptoUtil.toCanonicalised(s); + @Override + public byte[] getRawDataToSign() throws Exception { + ByteArrayOutputStream bs = new ByteArrayOutputStream(); + for (int i = 0; i < txForSign.length; i++) { + if (i != 0 && txForSign[0].length != txForSign[i].length) + throw new Exception("Hashes length must be identical!"); + bs.write(txForSign[i]); + } - unspentOutputs.get(i).scriptForBuild = DerEncodingUtil.packSignDerBitcoinCash(r, s, pbKey); - } + return bs.toByteArray(); + } - return BTCUtils.buildTXForSend(destLegacyAddress, srcLegacyAddress, unspentOutputs, amount, change); + @Override + public String getHashAlgToSign() { + return "sha-256x2"; + } + + @Override + public byte[] getIssuerTransactionSignature(byte[] dataToSignByIssuer) throws Exception { + throw new Exception("Transaction validation by issuer not supported in this version!"); + } + + @Override + public void onSignCompleted(byte[] signFromCard) throws Exception { + for (int i = 0; i < unspentOutputs.size(); ++i) { + BigInteger r = new BigInteger(1, Arrays.copyOfRange(signFromCard, i * 64, 32 + i * 64)); + BigInteger s = new BigInteger(1, Arrays.copyOfRange(signFromCard, 32 + i * 64, 64 + i * 64)); + s = CryptoUtil.toCanonicalised(s); + + unspentOutputs.get(i).scriptForBuild = DerEncodingUtil.packSignDerBitcoinCash(r, s, pbKey); + } + + byte[] txForSend=BTCUtils.buildTXForSend(destLegacyAddress, srcLegacyAddress, unspentOutputs, amountFinal, changeFinal); + + notifyOnNeedSendPayment(txForSend); + } + }; } + +// @Override +// public byte[] sign(Amount feeValue, Amount amountValue, boolean IncFee, String destAddress, CardProtocol protocol) throws Exception { +// +// checkBlockchainDataExists(); +// +// CoinEngine engine = CoinEngineFactory.INSTANCE.create(ctx); +// +// String srcLegacyAddress = ((BtcCashEngine)engine).convertToLegacyAddress(ctx.getCoinData().getWallet()); +// String destLegacyAddress = ((BtcCashEngine)engine).convertToLegacyAddress(destAddress); +// byte[] pbKey = ctx.getCard().getWalletPublicKeyRar(); //ALWAYS USING COMPRESS KEY +// +// // Build script for our address +// List rawTxList = coinData.getUnspentTransactions(); +// byte[] outputScriptWeAreAbleToSpend = Transaction.Script.buildOutput(srcLegacyAddress).bytes; +// +// // Collect unspent +// ArrayList unspentOutputs = BTCUtils.getOutputs(rawTxList, outputScriptWeAreAbleToSpend); +// +// long fullAmount = 0; +// for (int i = 0; i < unspentOutputs.size(); ++i) { +// fullAmount += unspentOutputs.get(i).value; +// } +// +// +// long fees = convertToInternalAmount(feeValue).longValueExact(); +// long amount = convertToInternalAmount(amountValue).longValueExact(); +// long change = fullAmount - amount; +// if (IncFee) { +// amount = amount - fees; +// } else { +// change = change - fees; +// } +// +// if (amount + fees > fullAmount) { +// throw new CardProtocol.TangemException_WrongAmount(String.format("Balance (%d) < change (%d) + amount (%d)", fullAmount, change, amount)); +// } +// +// byte[][] dataForSign = new byte[unspentOutputs.size()][]; +// +// for (int i = 0; i < unspentOutputs.size(); ++i) { +// byte[] newTX = BTCUtils.buildTXForSign(srcLegacyAddress, destLegacyAddress, srcLegacyAddress, unspentOutputs, i, amount, change); +// +// byte[] hashData = Util.calculateSHA256(newTX); +// byte[] doubleHashData = Util.calculateSHA256(hashData); +// +// unspentOutputs.get(i).bodyDoubleHash = doubleHashData; +// unspentOutputs.get(i).bodyHash = hashData; +// +// if (ctx.getCard().getSigningMethod() == TangemCard.SigningMethod.Sign_Raw || ctx.getCard().getSigningMethod() == TangemCard.SigningMethod.Sign_Raw_Validated_By_Issuer) { +// dataForSign[i] = newTX; +// } else { +// dataForSign[i] = doubleHashData; +// } +// +// } +// +// byte[] signFromCard; +// if (ctx.getCard().getSigningMethod() == TangemCard.SigningMethod.Sign_Raw || ctx.getCard().getSigningMethod() == TangemCard.SigningMethod.Sign_Raw_Validated_By_Issuer) { +// ByteArrayOutputStream bs = new ByteArrayOutputStream(); +// if (dataForSign.length > 10) throw new Exception("To much hashes in one transaction!"); +// for (int i = 0; i < dataForSign.length; i++) { +// if (i != 0 && dataForSign[0].length != dataForSign[i].length) +// throw new Exception("Hashes length must be identical!"); +// bs.write(dataForSign[i]); +// } +// signFromCard = protocol.run_SignRaw(PINStorage.getPIN2(), "sha-256x2", bs.toByteArray(), null, null, null).getTLV(TLV.Tag.TAG_Signature).Value; +// } else { +// //ctx.getCard().getSigningMethod() == TangemCard.SigningMethod.Sign_Hash_Validated_By_Issuer +// //ctx.getCard().getIssuer() +// signFromCard = protocol.run_SignHashes(PINStorage.getPIN2(), dataForSign, null, null, null).getTLV(TLV.Tag.TAG_Signature).Value; +// // TODO slice signFromCard to hashes.length parts +// } +// +// for (int i = 0; i < unspentOutputs.size(); ++i) { +// BigInteger r = new BigInteger(1, Arrays.copyOfRange(signFromCard, i * 64, 32 + i * 64)); +// BigInteger s = new BigInteger(1, Arrays.copyOfRange(signFromCard, 32 + i * 64, 64 + i * 64)); +// s = CryptoUtil.toCanonicalised(s); +// +// unspentOutputs.get(i).scriptForBuild = DerEncodingUtil.packSignDerBitcoinCash(r, s, pbKey); +// } +// +// return BTCUtils.buildTXForSend(destLegacyAddress, srcLegacyAddress, unspentOutputs, amount, change); +// } } diff --git a/app/src/main/java/com/tangem/domain/wallet/btc/BtcEngine.java b/app/src/main/java/com/tangem/domain/wallet/btc/BtcEngine.java index eab7e750a7..8d3a950a1f 100644 --- a/app/src/main/java/com/tangem/domain/wallet/btc/BtcEngine.java +++ b/app/src/main/java/com/tangem/domain/wallet/btc/BtcEngine.java @@ -16,6 +16,7 @@ import com.tangem.domain.wallet.TangemContext; import com.tangem.domain.wallet.Transaction; import com.tangem.domain.wallet.UnspentOutputInfo; import com.tangem.domain.wallet.BTCUtils; +import com.tangem.tangemcard.tasks.SignTask; import com.tangem.util.CryptoUtil; import com.tangem.util.DecimalDigitsInputFilter; import com.tangem.util.DerEncodingUtil; @@ -404,8 +405,8 @@ public class BtcEngine extends CoinEngine { } @Override - public byte[] sign(Amount feeValue, Amount amountValue, boolean IncFee, String targetAddress, CardProtocol protocol) throws Exception { - + public SignTask.PaymentToSign constructPayment(Amount feeValue, Amount amountValue, boolean IncFee, String targetAddress) throws Exception { + final ArrayList unspentOutputs; checkBlockchainDataExists(); String myAddress = ctx.getCoinData().getWallet(); @@ -416,14 +417,13 @@ public class BtcEngine extends CoinEngine { byte[] outputScriptWeAreAbleToSpend = Transaction.Script.buildOutput(myAddress).bytes; // Collect unspent - ArrayList unspentOutputs = BTCUtils.getOutputs(rawTxList, outputScriptWeAreAbleToSpend); + unspentOutputs = BTCUtils.getOutputs(rawTxList, outputScriptWeAreAbleToSpend); long fullAmount = 0; for (int i = 0; i < unspentOutputs.size(); ++i) { fullAmount += unspentOutputs.get(i).value; } - long fees = convertToInternalAmount(feeValue).longValueExact(); long amount = convertToInternalAmount(amountValue).longValueExact(); long change = fullAmount - amount; @@ -433,53 +433,155 @@ public class BtcEngine extends CoinEngine { change = change - fees; } + final long amountFinal=amount; + final long changeFinal=change; + if (amount + fees > fullAmount) { throw new CardProtocol.TangemException_WrongAmount(String.format("Balance (%d) < change (%d) + amount (%d)", fullAmount, change, amount)); } - byte[][] dataForSign = new byte[unspentOutputs.size()][]; + byte[][] txForSign = new byte[unspentOutputs.size()][]; + byte[][] bodyDoubleHash = new byte[unspentOutputs.size()][]; + byte[][] bodyHash= new byte[unspentOutputs.size()][]; for (int i = 0; i < unspentOutputs.size(); ++i) { - byte[] newTX = BTCUtils.buildTXForSign(myAddress, targetAddress, myAddress, unspentOutputs, i, amount, change); + txForSign[i] = BTCUtils.buildTXForSign(myAddress, targetAddress, myAddress, unspentOutputs, i, amount, change); + bodyHash[i] = Util.calculateSHA256(txForSign[i]); + bodyDoubleHash [i] = Util.calculateSHA256(bodyHash[i]); + } - byte[] hashData = Util.calculateSHA256(newTX); - byte[] doubleHashData = Util.calculateSHA256(hashData); + return new SignTask.PaymentToSign() { - unspentOutputs.get(i).bodyDoubleHash = doubleHashData; - unspentOutputs.get(i).bodyHash = hashData; - - if (ctx.getCard().getSigningMethod() == TangemCard.SigningMethod.Sign_Raw || ctx.getCard().getSigningMethod() == TangemCard.SigningMethod.Sign_Raw_Validated_By_Issuer) { - dataForSign[i] = newTX; - } else { - dataForSign[i] = doubleHashData; + @Override + public boolean isSigningMethodSupported(TangemCard.SigningMethod signingMethod) { + return signingMethod==TangemCard.SigningMethod.Sign_Hash || signingMethod==TangemCard.SigningMethod.Sign_Raw; } - } - byte[] signFromCard; - if (ctx.getCard().getSigningMethod() == TangemCard.SigningMethod.Sign_Raw || ctx.getCard().getSigningMethod() == TangemCard.SigningMethod.Sign_Raw_Validated_By_Issuer) { - ByteArrayOutputStream bs = new ByteArrayOutputStream(); - if (dataForSign.length > 10) throw new Exception("To much hashes in one transaction!"); - for (int i = 0; i < dataForSign.length; i++) { - if (i != 0 && dataForSign[0].length != dataForSign[i].length) - throw new Exception("Hashes length must be identical!"); - bs.write(dataForSign[i]); + @Override + public byte[][] getHashesToSign() throws Exception { + byte[][] dataForSign=new byte[unspentOutputs.size()][]; + if (txForSign.length > 10) throw new Exception("To much hashes in one transaction!"); + for (int i = 0; i < unspentOutputs.size(); ++i) { + dataForSign[i] = bodyDoubleHash[i]; + } + return dataForSign; } - signFromCard = protocol.run_SignRaw(PINStorage.getPIN2(), "sha-256x2",bs.toByteArray(),null,null,null).getTLV(TLV.Tag.TAG_Signature).Value; - } else { - //ctx.getCard().getSigningMethod() == TangemCard.SigningMethod.Sign_Hash_Validated_By_Issuer, null, ctx.getCard().getIssuer() - signFromCard = protocol.run_SignHashes(PINStorage.getPIN2(), dataForSign, null, null, null).getTLV(TLV.Tag.TAG_Signature).Value; - // TODO slice signFromCard to hashes.length parts - } - for (int i = 0; i < unspentOutputs.size(); ++i) { - BigInteger r = new BigInteger(1, Arrays.copyOfRange(signFromCard, i * 64, 32 + i * 64)); - BigInteger s = new BigInteger(1, Arrays.copyOfRange(signFromCard, 32 + i * 64, 64 + i * 64)); - s = CryptoUtil.toCanonicalised(s); + @Override + public byte[] getRawDataToSign() throws Exception { + ByteArrayOutputStream bs = new ByteArrayOutputStream(); + for (int i = 0; i < txForSign.length; i++) { + if (i != 0 && txForSign[0].length != txForSign[i].length) + throw new Exception("Hashes length must be identical!"); + bs.write(txForSign[i]); + } - unspentOutputs.get(i).scriptForBuild = DerEncodingUtil.packSignDer(r, s, pbKey); - } + return bs.toByteArray(); + } - return BTCUtils.buildTXForSend(targetAddress, myAddress, unspentOutputs, amount, change); + @Override + public String getHashAlgToSign() { + return "sha-256x2"; + } + + @Override + public byte[] getIssuerTransactionSignature(byte[] dataToSignByIssuer) throws Exception { + throw new Exception("Issuer validation not supported!"); + } + + @Override + public void onSignCompleted(byte[] signature) throws Exception { + for (int i = 0; i < unspentOutputs.size(); ++i) { + BigInteger r = new BigInteger(1, Arrays.copyOfRange(signature, i * 64, 32 + i * 64)); + BigInteger s = new BigInteger(1, Arrays.copyOfRange(signature, 32 + i * 64, 64 + i * 64)); + s = CryptoUtil.toCanonicalised(s); + + unspentOutputs.get(i).scriptForBuild = DerEncodingUtil.packSignDer(r, s, pbKey); + } + + byte[] txForSend=BTCUtils.buildTXForSend(targetAddress, myAddress, unspentOutputs, amountFinal, changeFinal); + notifyOnNeedSendPayment(txForSend); + } + }; } +// @Override +// public byte[] sign(Amount feeValue, Amount amountValue, boolean IncFee, String targetAddress, CardProtocol protocol) throws Exception { +// +// checkBlockchainDataExists(); +// +// String myAddress = ctx.getCoinData().getWallet(); +// byte[] pbKey = ctx.getCard().getWalletPublicKey(); +// +// // Build script for our address +// List rawTxList = coinData.getUnspentTransactions(); +// byte[] outputScriptWeAreAbleToSpend = Transaction.Script.buildOutput(myAddress).bytes; +// +// // Collect unspent +// ArrayList unspentOutputs = BTCUtils.getOutputs(rawTxList, outputScriptWeAreAbleToSpend); +// +// long fullAmount = 0; +// for (int i = 0; i < unspentOutputs.size(); ++i) { +// fullAmount += unspentOutputs.get(i).value; +// } +// +// +// long fees = convertToInternalAmount(feeValue).longValueExact(); +// long amount = convertToInternalAmount(amountValue).longValueExact(); +// long change = fullAmount - amount; +// if (IncFee) { +// amount = amount - fees; +// } else { +// change = change - fees; +// } +// +// if (amount + fees > fullAmount) { +// throw new CardProtocol.TangemException_WrongAmount(String.format("Balance (%d) < change (%d) + amount (%d)", fullAmount, change, amount)); +// } +// +// byte[][] dataForSign = new byte[unspentOutputs.size()][]; +// +// for (int i = 0; i < unspentOutputs.size(); ++i) { +// byte[] newTX = BTCUtils.buildTXForSign(myAddress, targetAddress, myAddress, unspentOutputs, i, amount, change); +// +// byte[] hashData = Util.calculateSHA256(newTX); +// byte[] doubleHashData = Util.calculateSHA256(hashData); +// +// unspentOutputs.get(i).bodyDoubleHash = doubleHashData; +// unspentOutputs.get(i).bodyHash = hashData; +// +// if (ctx.getCard().getSigningMethod() == TangemCard.SigningMethod.Sign_Raw || ctx.getCard().getSigningMethod() == TangemCard.SigningMethod.Sign_Raw_Validated_By_Issuer) { +// dataForSign[i] = newTX; +// } else { +// dataForSign[i] = doubleHashData; +// } +// } +// +// byte[] signFromCard; +// if (ctx.getCard().getSigningMethod() == TangemCard.SigningMethod.Sign_Raw || ctx.getCard().getSigningMethod() == TangemCard.SigningMethod.Sign_Raw_Validated_By_Issuer) { +// ByteArrayOutputStream bs = new ByteArrayOutputStream(); +// if (dataForSign.length > 10) throw new Exception("To much hashes in one transaction!"); +// for (int i = 0; i < dataForSign.length; i++) { +// if (i != 0 && dataForSign[0].length != dataForSign[i].length) +// throw new Exception("Hashes length must be identical!"); +// bs.write(dataForSign[i]); +// } +// signFromCard = protocol.run_SignRaw(PINStorage.getPIN2(), "sha-256x2",bs.toByteArray(),null,null,null).getTLV(TLV.Tag.TAG_Signature).Value; +// } else { +// //ctx.getCard().getSigningMethod() == TangemCard.SigningMethod.Sign_Hash_Validated_By_Issuer, null, ctx.getCard().getIssuer() +// signFromCard = protocol.run_SignHashes(PINStorage.getPIN2(), dataForSign, null, null, null).getTLV(TLV.Tag.TAG_Signature).Value; +// // TODO slice signFromCard to hashes.length parts +// } +// +// for (int i = 0; i < unspentOutputs.size(); ++i) { +// BigInteger r = new BigInteger(1, Arrays.copyOfRange(signFromCard, i * 64, 32 + i * 64)); +// BigInteger s = new BigInteger(1, Arrays.copyOfRange(signFromCard, 32 + i * 64, 64 + i * 64)); +// s = CryptoUtil.toCanonicalised(s); +// +// unspentOutputs.get(i).scriptForBuild = DerEncodingUtil.packSignDer(r, s, pbKey); +// } +// +// return BTCUtils.buildTXForSend(targetAddress, myAddress, unspentOutputs, amount, change); +// } + } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/domain/wallet/eth/EthEngine.java b/app/src/main/java/com/tangem/domain/wallet/eth/EthEngine.java index f7e3836c6d..7614c9a2c7 100644 --- a/app/src/main/java/com/tangem/domain/wallet/eth/EthEngine.java +++ b/app/src/main/java/com/tangem/domain/wallet/eth/EthEngine.java @@ -18,6 +18,7 @@ import com.tangem.domain.wallet.Keccak256; import com.tangem.tangemcard.data.TangemCard; import com.tangem.domain.wallet.TangemContext; import com.tangem.domain.wallet.BTCUtils; +import com.tangem.tangemcard.tasks.SignTask; import com.tangem.util.CryptoUtil; import com.tangem.util.DecimalDigitsInputFilter; import com.tangem.wallet.R; @@ -379,12 +380,9 @@ public class EthEngine extends CoinEngine { } @Override - public byte[] sign(Amount feeValue, Amount amountValue, boolean IncFee, String targetAddress, CardProtocol protocol) throws Exception { - + public SignTask.PaymentToSign constructPayment(Amount feeValue, Amount amountValue, boolean IncFee, String targetAddress) throws Exception { BigInteger nonceValue = coinData.getConfirmedTXCount(); byte[] pbKey = ctx.getCard().getWalletPublicKey(); -// boolean flag = (ctx.getCard().getSigningMethod() == TangemCard.SigningMethod.Sign_Hash_Validated_By_Issuer); - Issuer issuer = ctx.getCard().getIssuer(); BigInteger weiFee=convertToInternalAmount(feeValue).toBigIntegerExact(); BigInteger weiAmount=convertToInternalAmount(amountValue).toBigIntegerExact(); @@ -404,41 +402,124 @@ public class EthEngine extends CoinEngine { to = to.substring(2); } - EthTransaction tx = EthTransaction.create(to, weiAmount, nonce, gasPrice, gasLimit, chainId); + final EthTransaction tx = EthTransaction.create(to, weiAmount, nonce, gasPrice, gasLimit, chainId); - byte[][] hashesForSign = new byte[1][]; - byte[] for_hash = tx.getRawHash(); - hashesForSign[0] = for_hash; + return new SignTask.PaymentToSign() { + @Override + public boolean isSigningMethodSupported(TangemCard.SigningMethod signingMethod) { + return signingMethod==TangemCard.SigningMethod.Sign_Hash; + } - byte[] signFromCard = null; - try { - signFromCard = protocol.run_SignHashes(PINStorage.getPIN2(), hashesForSign, null, null, null).getTLV(TLV.Tag.TAG_Signature).Value; - // TODO slice signFromCard to hashes.length parts - } catch (Exception ex) { - Log.e("ETH", ex.getMessage()); - return null; - } + @Override + public byte[][] getHashesToSign() throws Exception { + byte[][] hashesForSign = new byte[1][]; + hashesForSign[0] = tx.getRawHash(); + return hashesForSign; + } - BigInteger r = new BigInteger(1, Arrays.copyOfRange(signFromCard, 0, 32)); - BigInteger s = new BigInteger(1, Arrays.copyOfRange(signFromCard, 32, 64)); - s = CryptoUtil.toCanonicalised(s); + @Override + public byte[] getRawDataToSign() throws Exception { + throw new Exception("Signing of raw transaction not supported for ETH"); + } - boolean f = ECKey.verify(for_hash, new ECKey.ECDSASignature(r, s), pbKey); + @Override + public String getHashAlgToSign() throws Exception { + throw new Exception("Signing of raw transaction not supported for ETH"); + } - if (!f) { - Log.e("ETH-CHECK", "sign Failed."); - } + @Override + public byte[] getIssuerTransactionSignature(byte[] dataToSignByIssuer) throws Exception { + throw new Exception("Transaction validation by issuer not supported in this version"); + } - tx.signature = new ECDSASignatureETH(r, s); - int v = tx.BruteRecoveryID2(tx.signature, for_hash, pbKey); - if (v != 27 && v != 28) { - Log.e("ETH", "invalid v"); - return null; - } - tx.signature.v = (byte) v; - Log.e("ETH_v", String.valueOf(v)); + @Override + public void onSignCompleted(byte[] signFromCard) throws Exception { + byte[] for_hash=tx.getRawHash(); + BigInteger r = new BigInteger(1, Arrays.copyOfRange(signFromCard, 0, 32)); + BigInteger s = new BigInteger(1, Arrays.copyOfRange(signFromCard, 32, 64)); + s = CryptoUtil.toCanonicalised(s); - byte[] realTX = tx.getEncoded(); - return realTX; + boolean f = ECKey.verify(for_hash, new ECKey.ECDSASignature(r, s), pbKey); + + if (!f) { + Log.e("ETH-CHECK", "sign Failed."); + } + + tx.signature = new ECDSASignatureETH(r, s); + int v = tx.BruteRecoveryID2(tx.signature, for_hash, pbKey); + if (v != 27 && v != 28) { + Log.e("ETH", "invalid v"); + throw new Exception("Error in EthEngine - invalid v"); + } + tx.signature.v = (byte) v; + Log.e("ETH_v", String.valueOf(v)); + + notifyOnNeedSendPayment(tx.getEncoded()); + } + }; } + +// @Override +// public byte[] sign(Amount feeValue, Amount amountValue, boolean IncFee, String targetAddress, CardProtocol protocol) throws Exception { +// +// BigInteger nonceValue = coinData.getConfirmedTXCount(); +// byte[] pbKey = ctx.getCard().getWalletPublicKey(); +//// boolean flag = (ctx.getCard().getSigningMethod() == TangemCard.SigningMethod.Sign_Hash_Validated_By_Issuer); +// Issuer issuer = ctx.getCard().getIssuer(); +// +// BigInteger weiFee=convertToInternalAmount(feeValue).toBigIntegerExact(); +// BigInteger weiAmount=convertToInternalAmount(amountValue).toBigIntegerExact(); +// +// if (IncFee) { +// weiAmount = weiAmount.subtract(weiFee); +// } +// +// BigInteger nonce = nonceValue; +// BigInteger gasPrice = weiFee.divide(BigInteger.valueOf(21000)); +// BigInteger gasLimit = BigInteger.valueOf(21000); +// Integer chainId = ctx.getBlockchain() == Blockchain.Ethereum ? EthTransaction.ChainEnum.Mainnet.getValue() : EthTransaction.ChainEnum.Rinkeby.getValue(); +// +// String to = targetAddress; +// +// if (to.startsWith("0x") || to.startsWith("0X")) { +// to = to.substring(2); +// } +// +// EthTransaction tx = EthTransaction.create(to, weiAmount, nonce, gasPrice, gasLimit, chainId); +// +// byte[][] hashesForSign = new byte[1][]; +// byte[] for_hash = tx.getRawHash(); +// hashesForSign[0] = for_hash; +// +// byte[] signFromCard = null; +// try { +// signFromCard = protocol.run_SignHashes(PINStorage.getPIN2(), hashesForSign, null, null, null).getTLV(TLV.Tag.TAG_Signature).Value; +// // TODO slice signFromCard to hashes.length parts +// } catch (Exception ex) { +// Log.e("ETH", ex.getMessage()); +// return null; +// } +// +// BigInteger r = new BigInteger(1, Arrays.copyOfRange(signFromCard, 0, 32)); +// BigInteger s = new BigInteger(1, Arrays.copyOfRange(signFromCard, 32, 64)); +// s = CryptoUtil.toCanonicalised(s); +// +// boolean f = ECKey.verify(for_hash, new ECKey.ECDSASignature(r, s), pbKey); +// +// if (!f) { +// Log.e("ETH-CHECK", "sign Failed."); +// } +// +// tx.signature = new ECDSASignatureETH(r, s); +// int v = tx.BruteRecoveryID2(tx.signature, for_hash, pbKey); +// if (v != 27 && v != 28) { +// Log.e("ETH", "invalid v"); +// return null; +// } +// tx.signature.v = (byte) v; +// Log.e("ETH_v", String.valueOf(v)); +// +// byte[] realTX = tx.getEncoded(); +// return realTX; +// } } diff --git a/app/src/main/java/com/tangem/domain/wallet/token/TokenEngine.java b/app/src/main/java/com/tangem/domain/wallet/token/TokenEngine.java index 5b6c5172f1..bfcd0a4d34 100644 --- a/app/src/main/java/com/tangem/domain/wallet/token/TokenEngine.java +++ b/app/src/main/java/com/tangem/domain/wallet/token/TokenEngine.java @@ -5,6 +5,7 @@ import android.text.InputFilter; import android.util.Log; import com.google.common.base.Strings; +import com.tangem.tangemcard.data.Blockchain; import com.tangem.tangemcard.data.local.PINStorage; import com.tangem.tangemcard.reader.CardProtocol; import com.tangem.tangemcard.reader.TLV; @@ -18,6 +19,7 @@ import com.tangem.domain.wallet.Keccak256; import com.tangem.tangemcard.data.TangemCard; import com.tangem.domain.wallet.TangemContext; import com.tangem.domain.wallet.BTCUtils; +import com.tangem.tangemcard.tasks.SignTask; import com.tangem.util.CryptoUtil; import com.tangem.util.DecimalDigitsInputFilter; import com.tangem.wallet.R; @@ -345,7 +347,7 @@ public class TokenEngine extends CoinEngine { if( fee.compareTo(balance)>0 ) return false; } else if (amount.getCurrency().equals("ETH") && coinData.getBalanceInInternalUnits().isZero()) { - // standart ETH transaction + // standard ETH transaction try { BigDecimal cardBalance = getBalance(); @@ -425,31 +427,36 @@ public class TokenEngine extends CoinEngine { } @Override - public byte[] sign(Amount feeValue, Amount amountValue, boolean IncFee, String targetAddress, CardProtocol protocol) throws Exception { + public SignTask.PaymentToSign constructPayment(Amount feeValue, Amount amountValue, boolean IncFee, String targetAddress) throws Exception { if (amountValue.getCurrency().equals("ETH")) { - return signETH(feeValue, amountValue, IncFee, targetAddress, protocol); + return constructPaymentETH(feeValue, amountValue, IncFee, targetAddress); } else { - return signToken(feeValue, amountValue, IncFee, targetAddress, protocol); + return constructPaymentToken(feeValue, amountValue, IncFee, targetAddress); } } - public byte[] signETH(Amount feeValue, Amount amountValue, boolean IncFee, String targetAddress, CardProtocol protocol) throws Exception { +// @Override +// public byte[] sign(Amount feeValue, Amount amountValue, boolean IncFee, String targetAddress, CardProtocol protocol) throws Exception { +// if (amountValue.getCurrency().equals("ETH")) { +// return signETH(feeValue, amountValue, IncFee, targetAddress, protocol); +// } else { +// return signToken(feeValue, amountValue, IncFee, targetAddress, protocol); +// } +// } + + private SignTask.PaymentToSign constructPaymentETH(Amount feeValue, Amount amountValue, boolean IncFee, String targetAddress) throws Exception { BigInteger nonceValue = coinData.getConfirmedTXCount(); byte[] pbKey = ctx.getCard().getWalletPublicKey(); -// boolean flag = (ctx.getCard().getSigningMethod() == TangemCard.SigningMethod.Sign_Hash_Validated_By_Issuer); - Issuer issuer = ctx.getCard().getIssuer(); - BigInteger weiFee = convertToInternalAmount(feeValue).toBigIntegerExact(); - BigInteger weiAmount = convertToInternalAmount(amountValue).toBigIntegerExact(); + BigInteger weiFee=convertToInternalAmount(feeValue).toBigIntegerExact(); + BigInteger weiAmount=convertToInternalAmount(amountValue).toBigIntegerExact(); if (IncFee) { weiAmount = weiAmount.subtract(weiFee); } - BigInteger nonce = nonceValue; BigInteger gasPrice = weiFee.divide(BigInteger.valueOf(21000)); BigInteger gasLimit = BigInteger.valueOf(21000); - // Integer chainId = ctx.getBlockchain() == Blockchain.Ethereum ? EthTransaction.ChainEnum.Mainnet.getValue() : EthTransaction.ChainEnum.Rinkeby.getValue(); Integer chainId = EthTransaction.ChainEnum.Mainnet.getValue(); // Token support on main net only!!! @@ -459,52 +466,71 @@ public class TokenEngine extends CoinEngine { to = to.substring(2); } - EthTransaction tx = EthTransaction.create(to, weiAmount, nonce, gasPrice, gasLimit, chainId); + final EthTransaction tx = EthTransaction.create(to, weiAmount, nonceValue, gasPrice, gasLimit, chainId); - byte[][] hashesForSign = new byte[1][]; - byte[] for_hash = tx.getRawHash(); - hashesForSign[0] = for_hash; + return new SignTask.PaymentToSign() { + @Override + public boolean isSigningMethodSupported(TangemCard.SigningMethod signingMethod) { + return signingMethod==TangemCard.SigningMethod.Sign_Hash; + } - byte[] signFromCard = null; - try { - signFromCard = protocol.run_SignHashes(PINStorage.getPIN2(), hashesForSign, null, null, null).getTLV(TLV.Tag.TAG_Signature).Value; - // TODO slice signFromCard to hashes.length parts - } catch (Exception ex) { - Log.e("ETH", ex.getMessage()); - return null; - } + @Override + public byte[][] getHashesToSign() { + byte[][] hashesForSign = new byte[1][]; + hashesForSign[0] = tx.getRawHash(); + return hashesForSign; + } - BigInteger r = new BigInteger(1, Arrays.copyOfRange(signFromCard, 0, 32)); - BigInteger s = new BigInteger(1, Arrays.copyOfRange(signFromCard, 32, 64)); - s = CryptoUtil.toCanonicalised(s); + @Override + public byte[] getRawDataToSign() throws Exception { + throw new Exception("Signing of raw transaction not supported for ETH"); + } - boolean f = ECKey.verify(for_hash, new ECKey.ECDSASignature(r, s), pbKey); + @Override + public String getHashAlgToSign() throws Exception { + throw new Exception("Signing of raw transaction not supported for ETH"); + } - if (!f) { - Log.e("ETH-CHECK", "sign Failed."); - } + @Override + public byte[] getIssuerTransactionSignature(byte[] dataToSignByIssuer) throws Exception { + throw new Exception("Transaction validation by issuer not supported in this version"); + } - tx.signature = new ECDSASignatureETH(r, s); - int v = tx.BruteRecoveryID2(tx.signature, for_hash, pbKey); - if (v != 27 && v != 28) { - Log.e("ETH", "invalid v"); - return null; - } - tx.signature.v = (byte) v; - Log.e("ETH_v", String.valueOf(v)); + @Override + public void onSignCompleted(byte[] signFromCard) throws Exception { + byte[] for_hash=tx.getRawHash(); + BigInteger r = new BigInteger(1, Arrays.copyOfRange(signFromCard, 0, 32)); + BigInteger s = new BigInteger(1, Arrays.copyOfRange(signFromCard, 32, 64)); + s = CryptoUtil.toCanonicalised(s); - byte[] realTX = tx.getEncoded(); - return realTX; + boolean f = ECKey.verify(for_hash, new ECKey.ECDSASignature(r, s), pbKey); + + if (!f) { + Log.e("ETH-CHECK", "sign Failed."); + } + + tx.signature = new ECDSASignatureETH(r, s); + int v = tx.BruteRecoveryID2(tx.signature, for_hash, pbKey); + if (v != 27 && v != 28) { + Log.e("ETH", "invalid v"); + throw new Exception("Error in EthEngine - invalid v"); + } + tx.signature.v = (byte) v; + Log.e("ETH_v", String.valueOf(v)); + + notifyOnNeedSendPayment(tx.getEncoded()); + } + }; } - public byte[] signToken(Amount feeValue, Amount amountValue, boolean IncFee, String targetAddress, CardProtocol protocol) throws Exception { + private SignTask.PaymentToSign constructPaymentToken(Amount feeValue, Amount amountValue, boolean IncFee, String targetAddress) throws Exception { BigInteger nonceValue = coinData.getConfirmedTXCount(); byte[] pbKey = ctx.getCard().getWalletPublicKey(); // boolean flag = (ctx.getCard().getSigningMethod() == TangemCard.SigningMethod.Sign_Hash_Validated_By_Issuer); - Issuer issuer = ctx.getCard().getIssuer(); +// Issuer issuer = ctx.getCard().getIssuer(); - BigInteger gigaK = BigInteger.valueOf(1000000000L); +// BigInteger gigaK = BigInteger.valueOf(1000000000L); BigInteger weiFee = convertToInternalAmount(feeValue).toBigIntegerExact(); @@ -514,7 +540,6 @@ public class TokenEngine extends CoinEngine { //amount = amount.subtract(fee); - BigInteger nonce = nonceValue; BigInteger gasPrice = weiFee.divide(BigInteger.valueOf(60000)); BigInteger gasLimit = BigInteger.valueOf(60000); Integer chainId = EthTransaction.ChainEnum.Mainnet.getValue(); @@ -545,41 +570,212 @@ public class TokenEngine extends CoinEngine { byte[] data = BTCUtils.fromHex(cmd); - EthTransaction tx = EthTransaction.create(contractAddress, amountZero, nonce, gasPrice, gasLimit, chainId, data); + EthTransaction tx = EthTransaction.create(contractAddress, amountZero, nonceValue, gasPrice, gasLimit, chainId, data); - byte[][] hashesForSign = new byte[1][]; - byte[] for_hash = tx.getRawHash(); - hashesForSign[0] = for_hash; + return new SignTask.PaymentToSign() { + @Override + public boolean isSigningMethodSupported(TangemCard.SigningMethod signingMethod) { + return signingMethod==TangemCard.SigningMethod.Sign_Hash; + } - byte[] signFromCard = null; - try { - signFromCard = protocol.run_SignHashes(PINStorage.getPIN2(), hashesForSign, null, null, null).getTLV(TLV.Tag.TAG_Signature).Value; - // TODO slice signFromCard to hashes.length parts - } catch (Exception ex) { - Log.e("ETH", ex.getMessage()); - return null; - } + @Override + public byte[][] getHashesToSign() { + byte[][] hashesForSign = new byte[1][]; + hashesForSign[0] = tx.getRawHash(); + return hashesForSign; + } - BigInteger r = new BigInteger(1, Arrays.copyOfRange(signFromCard, 0, 32)); - BigInteger s = new BigInteger(1, Arrays.copyOfRange(signFromCard, 32, 64)); - s = CryptoUtil.toCanonicalised(s); + @Override + public byte[] getRawDataToSign() throws Exception { + throw new Exception("Signing of raw transaction not supported for ETH"); + } - boolean f = ECKey.verify(for_hash, new ECKey.ECDSASignature(r, s), pbKey); + @Override + public String getHashAlgToSign() throws Exception { + throw new Exception("Signing of raw transaction not supported for ETH"); + } - if (!f) { - Log.e("ETH-CHECK", "sign Failed."); - } + @Override + public byte[] getIssuerTransactionSignature(byte[] dataToSignByIssuer) throws Exception { + throw new Exception("Transaction validation by issuer not supported in this version"); + } - tx.signature = new ECDSASignatureETH(r, s); - int v = tx.BruteRecoveryID2(tx.signature, for_hash, pbKey); - if (v != 27 && v != 28) { - Log.e("ETH", "invalid v"); - return null; - } - tx.signature.v = (byte) v; - Log.e("ETH_v", String.valueOf(v)); + @Override + public void onSignCompleted(byte[] signFromCard) throws Exception { + byte[] for_hash = tx.getRawHash(); + BigInteger r = new BigInteger(1, Arrays.copyOfRange(signFromCard, 0, 32)); + BigInteger s = new BigInteger(1, Arrays.copyOfRange(signFromCard, 32, 64)); + s = CryptoUtil.toCanonicalised(s); + + boolean f = ECKey.verify(for_hash, new ECKey.ECDSASignature(r, s), pbKey); + + if (!f) { + Log.e("ETH-CHECK", "sign Failed."); + } + + tx.signature = new ECDSASignatureETH(r, s); + int v = tx.BruteRecoveryID2(tx.signature, for_hash, pbKey); + if (v != 27 && v != 28) { + Log.e("ETH", "invalid v"); + throw new Exception("Error in EthEngine - invalid v"); + } + tx.signature.v = (byte) v; + Log.e("ETH_v", String.valueOf(v)); + + notifyOnNeedSendPayment(tx.getEncoded()); + + } + }; - byte[] realTX = tx.getEncoded(); - return realTX; } + +// public byte[] signETH(Amount feeValue, Amount amountValue, boolean IncFee, String targetAddress, CardProtocol protocol) throws Exception { +// BigInteger nonceValue = coinData.getConfirmedTXCount(); +// byte[] pbKey = ctx.getCard().getWalletPublicKey(); +//// boolean flag = (ctx.getCard().getSigningMethod() == TangemCard.SigningMethod.Sign_Hash_Validated_By_Issuer); +// Issuer issuer = ctx.getCard().getIssuer(); +// +// BigInteger weiFee = convertToInternalAmount(feeValue).toBigIntegerExact(); +// BigInteger weiAmount = convertToInternalAmount(amountValue).toBigIntegerExact(); +// +// if (IncFee) { +// weiAmount = weiAmount.subtract(weiFee); +// } +// +// BigInteger nonce = nonceValue; +// BigInteger gasPrice = weiFee.divide(BigInteger.valueOf(21000)); +// BigInteger gasLimit = BigInteger.valueOf(21000); + +// Integer chainId = ctx.getBlockchain() == Blockchain.Ethereum ? EthTransaction.ChainEnum.Mainnet.getValue() : EthTransaction.ChainEnum.Rinkeby.getValue(); +// Integer chainId = EthTransaction.ChainEnum.Mainnet.getValue(); // Token support on main net only!!! +// +// String to = targetAddress; +// +// if (to.startsWith("0x") || to.startsWith("0X")) { +// to = to.substring(2); +// } +// +// EthTransaction tx = EthTransaction.create(to, weiAmount, nonce, gasPrice, gasLimit, chainId); +// +// byte[][] hashesForSign = new byte[1][]; +// byte[] for_hash = tx.getRawHash(); +// hashesForSign[0] = for_hash; +// +// byte[] signFromCard = null; +// try { +// signFromCard = protocol.run_SignHashes(PINStorage.getPIN2(), hashesForSign, null, null, null).getTLV(TLV.Tag.TAG_Signature).Value; +// // TODO slice signFromCard to hashes.length parts +// } catch (Exception ex) { +// Log.e("ETH", ex.getMessage()); +// return null; +// } +// +// BigInteger r = new BigInteger(1, Arrays.copyOfRange(signFromCard, 0, 32)); +// BigInteger s = new BigInteger(1, Arrays.copyOfRange(signFromCard, 32, 64)); +// s = CryptoUtil.toCanonicalised(s); +// +// boolean f = ECKey.verify(for_hash, new ECKey.ECDSASignature(r, s), pbKey); +// +// if (!f) { +// Log.e("ETH-CHECK", "sign Failed."); +// } +// +// tx.signature = new ECDSASignatureETH(r, s); +// int v = tx.BruteRecoveryID2(tx.signature, for_hash, pbKey); +// if (v != 27 && v != 28) { +// Log.e("ETH", "invalid v"); +// return null; +// } +// tx.signature.v = (byte) v; +// Log.e("ETH_v", String.valueOf(v)); +// +// byte[] realTX = tx.getEncoded(); +// return realTX; +// } + +// public byte[] signToken(Amount feeValue, Amount amountValue, boolean IncFee, String targetAddress, CardProtocol protocol) throws Exception { +// BigInteger nonceValue = coinData.getConfirmedTXCount(); +// byte[] pbKey = ctx.getCard().getWalletPublicKey(); +//// boolean flag = (ctx.getCard().getSigningMethod() == TangemCard.SigningMethod.Sign_Hash_Validated_By_Issuer); +// Issuer issuer = ctx.getCard().getIssuer(); +// +// +// BigInteger gigaK = BigInteger.valueOf(1000000000L); +// +// BigInteger weiFee = convertToInternalAmount(feeValue).toBigIntegerExact(); +// +// InternalAmount amountDec=convertToInternalAmount(amountValue); +// BigInteger amount = amountDec.toBigInteger(); //new BigInteger(amountValue, 10); +// +// +// //amount = amount.subtract(fee); +// +// BigInteger nonce = nonceValue; +// BigInteger gasPrice = weiFee.divide(BigInteger.valueOf(60000)); +// BigInteger gasLimit = BigInteger.valueOf(60000); +// Integer chainId = EthTransaction.ChainEnum.Mainnet.getValue(); +// BigInteger amountZero = BigInteger.ZERO; +// +// String to = targetAddress; +// +// if (to.startsWith("0x") || to.startsWith("0X")) { +// to = to.substring(2); +// } +// +// String contractAddress = getContractAddress(ctx.getCard()); +// +// if (contractAddress.startsWith("0x") || contractAddress.startsWith("0X")) { +// contractAddress = contractAddress.substring(2); +// } +// +// String amountLeadZero = amount.toString(16); +// if (amountLeadZero.startsWith("0x") || amountLeadZero.startsWith("0X")) { +// amountLeadZero = amountLeadZero.substring(2); +// } +// +// while (amountLeadZero.length() < 64) { +// amountLeadZero = "0" + amountLeadZero; +// } +// +// String cmd = "a9059cbb000000000000000000000000" + to + amountLeadZero; //TODO only for BAT +// +// +// byte[] data = BTCUtils.fromHex(cmd); +// EthTransaction tx = EthTransaction.create(contractAddress, amountZero, nonce, gasPrice, gasLimit, chainId, data); +// +// byte[][] hashesForSign = new byte[1][]; +// byte[] for_hash = tx.getRawHash(); +// hashesForSign[0] = for_hash; +// +// byte[] signFromCard = null; +// try { +// signFromCard = protocol.run_SignHashes(PINStorage.getPIN2(), hashesForSign, null, null, null).getTLV(TLV.Tag.TAG_Signature).Value; +// // TODO slice signFromCard to hashes.length parts +// } catch (Exception ex) { +// Log.e("ETH", ex.getMessage()); +// return null; +// } +// +// BigInteger r = new BigInteger(1, Arrays.copyOfRange(signFromCard, 0, 32)); +// BigInteger s = new BigInteger(1, Arrays.copyOfRange(signFromCard, 32, 64)); +// s = CryptoUtil.toCanonicalised(s); +// +// boolean f = ECKey.verify(for_hash, new ECKey.ECDSASignature(r, s), pbKey); +// +// if (!f) { +// Log.e("ETH-CHECK", "sign Failed."); +// } +// +// tx.signature = new ECDSASignatureETH(r, s); +// int v = tx.BruteRecoveryID2(tx.signature, for_hash, pbKey); +// if (v != 27 && v != 28) { +// Log.e("ETH", "invalid v"); +// return null; +// } +// tx.signature.v = (byte) v; +// Log.e("ETH_v", String.valueOf(v)); +// +// byte[] realTX = tx.getEncoded(); +// return realTX; +// } } diff --git a/app/src/main/java/com/tangem/presentation/activity/ConfirmPaymentActivity.kt b/app/src/main/java/com/tangem/presentation/activity/ConfirmPaymentActivity.kt index 61e1b95dab..b2ffd02cda 100644 --- a/app/src/main/java/com/tangem/presentation/activity/ConfirmPaymentActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/ConfirmPaymentActivity.kt @@ -109,13 +109,6 @@ class ConfirmPaymentActivity : AppCompatActivity(), NfcAdapter.ReaderCallback { // requestElectrum(ctx.card, ElectrumRequest.checkBalance(ctx.card!!.wallet)) - calcSize = 256 - try { - calcSize = buildSize(etWallet!!.text.toString(), "0.00", etAmount.text.toString()) - } catch (ex: Exception) { - Log.e("Build Fee error", ex.message) - } - ctx.coinData!!.resetFailedBalanceRequestCounter() progressBar.visibility = View.VISIBLE @@ -444,8 +437,8 @@ class ConfirmPaymentActivity : AppCompatActivity(), NfcAdapter.ReaderCallback { // Log.e("TX_HASH_1", BTCUtils.toHex(hashData)) // Log.e("TX_HASH_2", BTCUtils.toHex(doubleHashData)) - unspentOutputs[i].bodyDoubleHash = doubleHashData - unspentOutputs[i].bodyHash = hashData +// unspentOutputs[i].bodyDoubleHash = doubleHashData +// unspentOutputs[i].bodyHash = hashData hashesForSign[i] = doubleHashData } @@ -478,6 +471,16 @@ class ConfirmPaymentActivity : AppCompatActivity(), NfcAdapter.ReaderCallback { } private fun requestEstimateFee() { + if( calcSize==0 ) + { + calcSize = 256 + try { + + calcSize = buildSize(etWallet!!.text.toString(), "0.00", etAmount.text.toString()) + } catch (ex: Exception) { + Log.e("Build Fee error", ex.message) + } + } serverApiCommon.estimateFee(ServerApiCommon.ESTIMATE_FEE_PRIORITY) serverApiCommon.estimateFee(ServerApiCommon.ESTIMATE_FEE_NORMAL) serverApiCommon.estimateFee(ServerApiCommon.ESTIMATE_FEE_MINIMAL) diff --git a/app/src/main/java/com/tangem/presentation/activity/SignPaymentActivity.kt b/app/src/main/java/com/tangem/presentation/activity/SignPaymentActivity.kt index 1436f8d288..4d778acd70 100644 --- a/app/src/main/java/com/tangem/presentation/activity/SignPaymentActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/SignPaymentActivity.kt @@ -13,19 +13,21 @@ import android.view.KeyEvent import android.view.View import android.widget.ProgressBar import android.widget.Toast -import com.tangem.data.nfc.SignPaymentTask -import com.tangem.tangemcard.reader.CardProtocol -import com.tangem.tangemcard.reader.NfcManager +import com.tangem.domain.wallet.BTCUtils import com.tangem.domain.wallet.CoinEngine import com.tangem.domain.wallet.CoinEngineFactory import com.tangem.domain.wallet.TangemContext import com.tangem.presentation.dialog.NoExtendedLengthSupportDialog import com.tangem.presentation.dialog.WaitSecurityDelayDialog +import com.tangem.tangemcard.data.Blockchain +import com.tangem.tangemcard.reader.CardProtocol +import com.tangem.tangemcard.reader.NfcManager import com.tangem.tangemcard.tasks.SignTask import com.tangem.tangemcard.util.Util import com.tangem.wallet.R import kotlinx.android.synthetic.main.activity_sign_payment.* + class SignPaymentActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, CardProtocol.Notifications { companion object { @@ -136,129 +138,6 @@ class SignPaymentActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, Card // signPaymentTask = SignPaymentTask(this, ctx, nfcManager, isoDep, this, amount, fee, isIncludeFee, outAddressStr) val coinEngine= CoinEngineFactory.create(ctx) ?: throw CardProtocol.TangemException("Can't create CoinEngine!") - val paymentToSign = coinEngine.constructPayment(amount, fee, isIncludeFee, outAddressStr) - -// object: SignTask.PaymentToSign { -// override fun call(context: String?) { println("Call: $context") } -// override fun run(context: String?) { println("Run: $context") } -// } - signPaymentTask = SignTask(this, ctx.card, nfcManager, isoDep, this, paymentToSign) - signPaymentTask!!.start() - } else { -// Log.d(TAG, "Mismatch card UID (" + sUID + " instead of " + card!!.uid + ")") - nfcManager!!.ignoreTag(isoDep.tag) - } - - } catch (e: Exception) { - e.printStackTrace() - } - } - - override fun onReadStart(cardProtocol: CardProtocol) { - progressBar!!.post { - progressBar!!.visibility = View.VISIBLE - progressBar!!.progress = 5 - } - } - - override fun onReadProgress(protocol: CardProtocol, progress: Int) { - progressBar!!.post { progressBar!!.progress = progress } - } - - override fun onReadFinish(cardProtocol: CardProtocol?) { - signPaymentTask = null - if (cardProtocol != null) { - if (cardProtocol.error == null) { - progressBar!!.post { - progressBar!!.progress = 100 - progressBar!!.progressTintList = ColorStateList.valueOf(Color.GREEN) - } - } else { - lastReadSuccess = false - if (cardProtocol.error.javaClass == CardProtocol.TangemException_InvalidPIN::class.java) { - progressBar!!.post { - progressBar!!.progress = 100 - progressBar!!.progressTintList = ColorStateList.valueOf(Color.RED) - } - progressBar!!.postDelayed({ - try { - progressBar!!.progress = 0 - progressBar!!.progressTintList = ColorStateList.valueOf(Color.DKGRAY) - progressBar!!.visibility = View.INVISIBLE - val intent = Intent() - intent.putExtra("message", getString(R.string.cannot_sign_transaction__make_sure_you_enter_correct_pin_2)) - intent.putExtra("UID", cardProtocol.card.uid) - intent.putExtra("Card", cardProtocol.card.asBundle) - setResult(RESULT_INVALID_PIN, intent) - finish() - } catch (e: Exception) { - e.printStackTrace() - } - }, 500) - } else { - if (cardProtocol.error is CardProtocol.TangemException_WrongAmount) { - try { - val intent = Intent() - intent.putExtra("message", getString(R.string.cannot_sign_transaction_wrong_amount)) - intent.putExtra("UID", cardProtocol.card.uid) - intent.putExtra("Card", cardProtocol.card.asBundle) - setResult(Activity.RESULT_CANCELED, intent) - finish() - } catch (e: Exception) { - e.printStackTrace() - } - } - progressBar!!.post { - if (cardProtocol.error is CardProtocol.TangemException_ExtendedLengthNotSupported) { - if (!NoExtendedLengthSupportDialog.allReadyShowed) { - NoExtendedLengthSupportDialog.message = getText(R.string.the_nfc_adapter_length_apdu).toString() + "\n" + getText(R.string.the_nfc_adapter_length_apdu_advice).toString() - NoExtendedLengthSupportDialog().show(supportFragmentManager, NoExtendedLengthSupportDialog.TAG) - } - } else { - Toast.makeText(baseContext, R.string.try_to_scan_again, Toast.LENGTH_LONG).show() - } - progressBar!!.progress = 100 - progressBar!!.progressTintList = ColorStateList.valueOf(Color.RED) - } - } - } - } - - progressBar!!.postDelayed({ - try { - progressBar!!.progress = 0 - progressBar!!.progressTintList = ColorStateList.valueOf(Color.DKGRAY) - progressBar!!.visibility = View.INVISIBLE - } catch (e: Exception) { - e.printStackTrace() - } - }, 500) - } - - override fun onReadCancel() { - signPaymentTask = null - - progressBar!!.postDelayed({ - try { - progressBar!!.progress = 0 - progressBar!!.progressTintList = ColorStateList.valueOf(Color.DKGRAY) - progressBar!!.visibility = View.INVISIBLE - } catch (e: Exception) { - e.printStackTrace() - } - }, 500) - } - - override fun onReadWait(msec: Int) { - WaitSecurityDelayDialog.OnReadWait(this, msec) - } - - override fun onReadBeforeRequest(timeout: Int) { - WaitSecurityDelayDialog.onReadBeforeRequest(this, timeout) - } - - override fun onReadAfterRequest() { - WaitSecurityDelayDialog.onReadAfterRequest(this) - } - -} \ No newline at end of file + coinEngine.setOnNeedSendPayment { tx-> + if (tx != null) { + // [REDACTED_TODO_COMMENT] \ No newline at end of file diff --git a/tangemcard/src/main/java/com/tangem/tangemcard/tasks/SignTask.java b/tangemcard/src/main/java/com/tangem/tangemcard/tasks/SignTask.java index 75a3bdd830..66e7721ee0 100644 --- a/tangemcard/src/main/java/com/tangem/tangemcard/tasks/SignTask.java +++ b/tangemcard/src/main/java/com/tangem/tangemcard/tasks/SignTask.java @@ -22,15 +22,15 @@ public class SignTask extends CustomReadCardTask { public interface PaymentToSign { boolean isSigningMethodSupported(TangemCard.SigningMethod signingMethod); - byte[][] getHashesToSign(); + byte[][] getHashesToSign() throws Exception; - byte[] getRawDataToSign(); + byte[] getRawDataToSign() throws Exception; - String getHashAlgToSign(); + String getHashAlgToSign() throws Exception; - byte[] getIssuerTransactionSignature(byte[] dataToSignByIssuer); + byte[] getIssuerTransactionSignature(byte[] dataToSignByIssuer) throws Exception; - void OnSignCompleted(byte[] signature); + void onSignCompleted(byte[] signature) throws Exception; } private PaymentToSign paymentToSign; @@ -86,7 +86,7 @@ public class SignTask extends CustomReadCardTask { throw new CardProtocol.TangemException("Signing method isn't supported!"); } - paymentToSign.OnSignCompleted(signResult.getTLV(TLV.Tag.TAG_Signature).Value); + paymentToSign.onSignCompleted(signResult.getTLV(TLV.Tag.TAG_Signature).Value); mNotifications.onReadProgress(protocol, 100); } From 5b949fa686c94f44723340390a721d2ba39f1c3e Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 7 Dec 2018 11:41:30 +0300 Subject: [PATCH 09/61] Updated on 2026-08-14 --- .../com/tangem/data/network/ServerURL.java | 2 +- .../drawable/ic_content_copy_black_24dp.xml | 0 .../main/res/drawable/ic_nfc_white_24dp.xml | 0 .../res/drawable/ic_wrench_white_24dp.xml | 0 gradlew | 0 .../main/java/com/tangem/tangemcard/App.java | 24 ----------- .../main/java/com/tangem/tangemcard/Test.java | 4 -- .../data/network/ServerApiTangem.java | 17 ++++++-- .../tangemcard/di/NetworkComponent.java | 18 -------- .../tangem/tangemcard/di/NetworkModule.java | 42 ------------------- 10 files changed, 15 insertions(+), 92 deletions(-) mode change 100755 => 100644 app/src/main/res/drawable/ic_content_copy_black_24dp.xml mode change 100755 => 100644 app/src/main/res/drawable/ic_nfc_white_24dp.xml mode change 100755 => 100644 app/src/main/res/drawable/ic_wrench_white_24dp.xml mode change 100755 => 100644 gradlew delete mode 100644 tangemcard/src/main/java/com/tangem/tangemcard/App.java delete mode 100644 tangemcard/src/main/java/com/tangem/tangemcard/Test.java delete mode 100644 tangemcard/src/main/java/com/tangem/tangemcard/di/NetworkComponent.java delete mode 100644 tangemcard/src/main/java/com/tangem/tangemcard/di/NetworkModule.java diff --git a/app/src/main/java/com/tangem/data/network/ServerURL.java b/app/src/main/java/com/tangem/data/network/ServerURL.java index 3911f7ed5d..14898c2f12 100644 --- a/app/src/main/java/com/tangem/data/network/ServerURL.java +++ b/app/src/main/java/com/tangem/data/network/ServerURL.java @@ -4,6 +4,6 @@ class ServerURL { static final String API_TANGEM = "https://verify.tangem.com/"; static final String API_COINMARKETCAP = "https://api.coinmarketcap.com/"; static final String API_INFURA = "https://mainnet.infura.io/"; - static final String API_ESTIMATEFEE = " https://estimatefee.com/"; + static final String API_ESTIMATEFEE = "https://estimatefee.com/"; static final String API_UPDATE_VERSION = "https://raw.githubusercontent.com/"; } \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_content_copy_black_24dp.xml b/app/src/main/res/drawable/ic_content_copy_black_24dp.xml old mode 100755 new mode 100644 diff --git a/app/src/main/res/drawable/ic_nfc_white_24dp.xml b/app/src/main/res/drawable/ic_nfc_white_24dp.xml old mode 100755 new mode 100644 diff --git a/app/src/main/res/drawable/ic_wrench_white_24dp.xml b/app/src/main/res/drawable/ic_wrench_white_24dp.xml old mode 100755 new mode 100644 diff --git a/gradlew b/gradlew old mode 100755 new mode 100644 diff --git a/tangemcard/src/main/java/com/tangem/tangemcard/App.java b/tangemcard/src/main/java/com/tangem/tangemcard/App.java deleted file mode 100644 index c18cd9cea7..0000000000 --- a/tangemcard/src/main/java/com/tangem/tangemcard/App.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.tangem.tangemcard; - -import android.support.v7.app.AppCompatDelegate; - -import com.tangem.tangemcard.di.DaggerNetworkComponent; -import com.tangem.tangemcard.di.NetworkComponent; - -public class App { - public App() { - super(); - } - - static { - AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); - networkComponent = DaggerNetworkComponent.create(); - } - - private static NetworkComponent networkComponent; - - public static NetworkComponent getNetworkComponent() { - return networkComponent; - } - -} \ No newline at end of file diff --git a/tangemcard/src/main/java/com/tangem/tangemcard/Test.java b/tangemcard/src/main/java/com/tangem/tangemcard/Test.java deleted file mode 100644 index 3d2329b2c4..0000000000 --- a/tangemcard/src/main/java/com/tangem/tangemcard/Test.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.tangem.tangemcard; - -public class Test { -} diff --git a/tangemcard/src/main/java/com/tangem/tangemcard/data/network/ServerApiTangem.java b/tangemcard/src/main/java/com/tangem/tangemcard/data/network/ServerApiTangem.java index 92a9557ae1..4fecffb7c2 100644 --- a/tangemcard/src/main/java/com/tangem/tangemcard/data/network/ServerApiTangem.java +++ b/tangemcard/src/main/java/com/tangem/tangemcard/data/network/ServerApiTangem.java @@ -3,7 +3,6 @@ package com.tangem.tangemcard.data.network; import android.support.annotation.NonNull; import android.util.Log; -import com.tangem.tangemcard.App; import com.tangem.tangemcard.data.TangemCard; import com.tangem.tangemcard.data.network.model.CardVerifyAndGetInfo; import com.tangem.tangemcard.util.Util; @@ -17,6 +16,8 @@ import okhttp3.ResponseBody; import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response; +import retrofit2.Retrofit; +import retrofit2.converter.gson.GsonConverterFactory; public class ServerApiTangem { private static String TAG = ServerApiTangem.class.getSimpleName(); @@ -37,7 +38,12 @@ public class ServerApiTangem { } public void cardVerifyAndGetInfo(TangemCard card) { - TangemApi tangemApi = App.getNetworkComponent().getRetrofitTangem().create(TangemApi.class); + Retrofit retrofit = new Retrofit.Builder() + .baseUrl("https://estimatefee.com/") + .addConverterFactory(GsonConverterFactory.create()) + .build(); + + TangemApi tangemApi = retrofit.create(TangemApi.class); List requests = new ArrayList<>(); requests.add(new CardVerifyAndGetInfo.Request.Item(Util.bytesToHex(card.getCID()), Util.bytesToHex(card.getCardPublicKey()))); @@ -82,7 +88,12 @@ public class ServerApiTangem { } public void requestArtwork(final String artworkId, final Date updateDate, TangemCard card) { - TangemApi tangemApi = App.getNetworkComponent().getRetrofitTangem().create(TangemApi.class); + Retrofit retrofit = new Retrofit.Builder() + .baseUrl("https://verify.tangem.com/") + .addConverterFactory(GsonConverterFactory.create()) + .build(); + + TangemApi tangemApi = retrofit.create(TangemApi.class); Call call = tangemApi.getArtwork(artworkId, Util.bytesToHex(card.getCID()), Util.bytesToHex(card.getCardPublicKey())); call.enqueue(new Callback() { diff --git a/tangemcard/src/main/java/com/tangem/tangemcard/di/NetworkComponent.java b/tangemcard/src/main/java/com/tangem/tangemcard/di/NetworkComponent.java deleted file mode 100644 index 09cfdf0b8f..0000000000 --- a/tangemcard/src/main/java/com/tangem/tangemcard/di/NetworkComponent.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.tangem.tangemcard.di; - -import com.tangem.tangemcard.data.network.Server; - -import javax.inject.Named; -import javax.inject.Singleton; - -import dagger.Component; -import retrofit2.Retrofit; - -@Singleton -@Component(modules = {NetworkModule.class}) -public interface NetworkComponent { - - @Named(Server.ApiTangem.URL_TANGEM) - Retrofit getRetrofitTangem(); - -} \ No newline at end of file diff --git a/tangemcard/src/main/java/com/tangem/tangemcard/di/NetworkModule.java b/tangemcard/src/main/java/com/tangem/tangemcard/di/NetworkModule.java deleted file mode 100644 index 193acdf41e..0000000000 --- a/tangemcard/src/main/java/com/tangem/tangemcard/di/NetworkModule.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.tangem.tangemcard.di; - -import com.tangem.tangemcard.data.network.Server; - -import javax.inject.Named; -import javax.inject.Singleton; - -import dagger.Module; -import dagger.Provides; -import okhttp3.OkHttpClient; -import okhttp3.logging.HttpLoggingInterceptor; -import retrofit2.Retrofit; -import retrofit2.converter.gson.GsonConverterFactory; - -@Module -class NetworkModule { - - @Singleton - @Provides - @Named(Server.ApiTangem.URL_TANGEM) - Retrofit provideRetrofitTangem() { - return new Retrofit.Builder() - .baseUrl(Server.ApiTangem.URL_TANGEM) - .addConverterFactory(GsonConverterFactory.create()) - .client(createOkHttpClient()) - .build(); - } - - private OkHttpClient createOkHttpClient() { - return new OkHttpClient.Builder(). - addInterceptor(createHttpLoggingInterceptor()). - build(); - } - - private HttpLoggingInterceptor createHttpLoggingInterceptor() { - HttpLoggingInterceptor logging = new HttpLoggingInterceptor(); - logging.setLevel(HttpLoggingInterceptor.Level.BODY); - return logging; - } - - -} \ No newline at end of file From e1984e63aaa8a1a31751594b73093e75877c3787 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 7 Dec 2018 12:40:12 +0300 Subject: [PATCH 10/61] Updated on 2026-08-14 --- app/build.gradle | 2 +- app/src/main/java/com/tangem/App.java | 6 +- .../com/tangem/data/nfc/ReadCardInfoTask.java | 67 ------------ .../com/tangem/data/nfc/VerifyCardTask.java | 103 ------------------ app/src/main/java/com/tangem/di/Navigator.kt | 3 +- 5 files changed, 5 insertions(+), 176 deletions(-) delete mode 100644 app/src/main/java/com/tangem/data/nfc/ReadCardInfoTask.java delete mode 100644 app/src/main/java/com/tangem/data/nfc/VerifyCardTask.java diff --git a/app/build.gradle b/app/build.gradle index 129a474e04..4edcf50124 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,7 +15,7 @@ android { applicationId "com.tangem.wallet" minSdkVersion 21 targetSdkVersion 28 - versionCode 100 + versionCode 101 versionName "0.811.1." + generateVersionName() testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } diff --git a/app/src/main/java/com/tangem/App.java b/app/src/main/java/com/tangem/App.java index 8f8a25d409..f99acd8605 100644 --- a/app/src/main/java/com/tangem/App.java +++ b/app/src/main/java/com/tangem/App.java @@ -3,13 +3,13 @@ package com.tangem; import android.app.Application; import android.support.v7.app.AppCompatDelegate; -import com.tangem.data.db.PINStorage; import com.tangem.di.DaggerNavigatorComponent; import com.tangem.di.DaggerNetworkComponent; import com.tangem.di.NavigatorComponent; import com.tangem.di.NetworkComponent; -import com.tangem.domain.cardReader.Firmwares; -import com.tangem.domain.wallet.Issuer; +import com.tangem.tangemcard.data.Issuer; +import com.tangem.tangemcard.data.local.Firmwares; +import com.tangem.tangemcard.data.local.PINStorage; public class App extends Application { diff --git a/app/src/main/java/com/tangem/data/nfc/ReadCardInfoTask.java b/app/src/main/java/com/tangem/data/nfc/ReadCardInfoTask.java deleted file mode 100644 index 8ecf882ecb..0000000000 --- a/app/src/main/java/com/tangem/data/nfc/ReadCardInfoTask.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.tangem.data.nfc; - -import android.content.Context; -import android.nfc.tech.IsoDep; -import android.util.Log; - -import com.tangem.domain.cardReader.CardProtocol; -import com.tangem.domain.cardReader.NfcManager; -import com.tangem.data.db.PINStorage; -import com.tangem.domain.wallet.TangemCard; -import com.tangem.util.Util; - -import java.util.ArrayList; - -public class ReadCardInfoTask extends Thread { - public static final String TAG = ReadCardInfoTask.class.getSimpleName(); - - private IsoDep mIsoDep; - private CardProtocol.Notifications mNotifications; - private boolean isCancelled = false; - private Context mContext; - private NfcManager mNfcManager; - - // this fields are static to optimize process when need enter pin and scan card again - private static ArrayList lastRead_UnsuccessfullPINs = new ArrayList<>(); - private static TangemCard.EncryptionMode lastRead_Encryption = null; - private static String lastRead_UID; - - public static void resetLastReadInfo() { - lastRead_UID = ""; - lastRead_Encryption = null; - lastRead_UnsuccessfullPINs.clear(); - } - - public ReadCardInfoTask(Context context, NfcManager nfcManager, IsoDep isoDep, CardProtocol.Notifications notifications) { - mContext = context; - mIsoDep = isoDep; - mNotifications = notifications; - mNfcManager = nfcManager; -// ReadCardInfoTask.lastRead_UID = lastRead_UID; - } - - @Override - public void run() { - if (mIsoDep == null) { - return; - } - try { - // for Samsung's bugs - - // Workaround for the Samsung Galaxy S5 (since the - // first connection always hangs on transceive). - int timeout = mIsoDep.getTimeout(); - mIsoDep.connect(); - mIsoDep.close(); - mIsoDep.connect(); - mIsoDep.setTimeout(timeout); - try { - CardProtocol protocol = new CardProtocol(mContext, mIsoDep, mNotifications); - mNotifications.onReadStart(protocol); - try { - mNotifications.onReadProgress(protocol, 5); - - byte[] UID = mIsoDep.getTag().getId(); - String sUID = Util.byteArrayToHexString(UID); - if (!lastRead_UID.equals(sUID)) { - resetLastReadInfo(); - } diff --git a/app/src/main/java/com/tangem/data/nfc/VerifyCardTask.java b/app/src/main/java/com/tangem/data/nfc/VerifyCardTask.java deleted file mode 100644 index 148ab92087..0000000000 --- a/app/src/main/java/com/tangem/data/nfc/VerifyCardTask.java +++ /dev/null @@ -1,103 +0,0 @@ - -/** - * Created by dvol on 04.02.2018. - */ - -public class VerifyCardTask extends Thread { - public static final String TAG = VerifyCardTask.class.getSimpleName(); - - private IsoDep mIsoDep; - private CardProtocol.Notifications mNotifications; - private boolean isCancelled = false; - private Context mContext; - private TangemCard mCard; - private NfcManager mNfcManager; - - public VerifyCardTask(Context context, TangemCard card, NfcManager nfcManager, IsoDep isoDep, CardProtocol.Notifications notifications) { - mCard = card; - mContext = context; - mIsoDep = isoDep; - mNotifications = notifications; - mNfcManager = nfcManager; - } - - @Override - public void run() { - if (mIsoDep == null) { - return; - } - try { - // for Samsung's bugs - - // Workaround for the Samsung Galaxy S5 (since the - // first connection always hangs on transceive). - int timeout = mIsoDep.getTimeout(); - mIsoDep.connect(); - mIsoDep.close(); - mIsoDep.connect(); - mIsoDep.setTimeout(timeout); - try { - CardProtocol protocol = new CardProtocol(mContext, mIsoDep, mCard, mNotifications); - mNotifications.onReadStart(protocol); - try { - mNotifications.onReadProgress(protocol, 5); - - Log.i(TAG, "[-- Start verify card --]"); - - if (isCancelled) return; - - String PIN = mCard.getPIN(); - protocol.setPIN(PIN); - protocol.run_Read(false); - PINStorage.setLastUsedPIN(PIN); - mNotifications.onReadProgress(protocol, 20); - if (isCancelled) return; - protocol.run_VerifyCard(); - mNotifications.onReadProgress(protocol, 50); - Log.i(TAG, "Manufacturer: " + protocol.getCard().getManufacturer().getOfficialName()); - if (isCancelled) return; - if (protocol.getCard().getStatus() == TangemCard.Status.Loaded) { - protocol.run_CheckWalletWithSignatureVerify(); - mNotifications.onReadProgress(protocol, 80); - } - if (isCancelled) return; - Firmwares.VerifyCodeRecord record = Firmwares.selectRandomVerifyCodeBlock(mCard.getFirmwareVersion()); - if (isCancelled) return; - if (record != null) { - byte[] returnedDigest = protocol.run_VerifyCode(record.hashAlg, record.blockIndex, record.blockCount, record.challenge); - mCard.setCodeConfirmed(Arrays.equals(returnedDigest, record.digest)); - } else { - mCard.setCodeConfirmed(null); - } - mNotifications.onReadProgress(protocol, 90); - } catch (Exception e) { - e.printStackTrace(); - protocol.setError(e); - - } finally { - Log.i(TAG, "[-- Finish verify card --]"); - mNotifications.onReadFinish(protocol); - } - } finally { - mNfcManager.ignoreTag(mIsoDep.getTag()); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - - public void cancel(Boolean AllowInterrupt) { - try { - if (isAlive()) { - isCancelled = true; - join(500); - } - if (isAlive() && AllowInterrupt) { - interrupt(); - mNotifications.onReadCancel(); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/di/Navigator.kt b/app/src/main/java/com/tangem/di/Navigator.kt index e58593d8ae..79d5732855 100644 --- a/app/src/main/java/com/tangem/di/Navigator.kt +++ b/app/src/main/java/com/tangem/di/Navigator.kt @@ -47,8 +47,7 @@ class Navigator { fun showPinSwap(context: Activity, newPIN: String, newPIN2: String) { context.startActivityForResult(PinSwapActivity.callingIntent(context, newPIN, newPIN2), Constant.REQUEST_CODE_SWAP_PIN) - fun showVerifyCard(context: Activity, ctx: TangemContext) { - context.startActivityForResult(VerifyCardActivity.callingIntent(context, ctx), Constant.REQUEST_CODE_VERIFY_CARD) + } fun showPurge(context: Activity) { From 4a27600edee23d8e795d997f4d71d171d1fe6091 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 7 Dec 2018 17:38:02 +0300 Subject: [PATCH 11/61] Updated on 2026-08-14 --- .idea/kotlinc.xml | 6 + .../data/network/ServerApiElectrum.java | 16 +- .../com/tangem/domain/wallet/BCHUtils.java | 345 ++++++++++++++++++ .../com/tangem/domain/wallet/CoinEngine.java | 8 +- .../domain/wallet/bch/BitcoinCashNode.kt | 26 +- .../domain/wallet/bch/BtcCashEngine.java | 92 +---- .../wallet/btc/BitcoinOutputStream.java | 5 + 7 files changed, 397 insertions(+), 101 deletions(-) create mode 100644 .idea/kotlinc.xml create mode 100644 app/src/main/java/com/tangem/domain/wallet/BCHUtils.java diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml new file mode 100644 index 0000000000..8b7f4afdab --- /dev/null +++ b/.idea/kotlinc.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/tangem/data/network/ServerApiElectrum.java b/app/src/main/java/com/tangem/data/network/ServerApiElectrum.java index 732d67c72e..e61d44dff5 100644 --- a/app/src/main/java/com/tangem/data/network/ServerApiElectrum.java +++ b/app/src/main/java/com/tangem/data/network/ServerApiElectrum.java @@ -124,11 +124,16 @@ public class ServerApiElectrum { BitcoinCashNode bitcoinCashNode = BitcoinCashNode.values()[new Random().nextInt(BitcoinCashNode.values().length)]; host = bitcoinCashNode.getHost(); port = bitcoinCashNode.getPort(); + proto = bitcoinCashNode.getProto(); this.host = host; this.port = port; - return doElectrumRequestTcp(electrumRequest, host, port); + if (proto.equals("tcp")) { + return doElectrumRequestTcp(electrumRequest, host, port); + } else { + return doElectrumRequestSsl(electrumRequest, host, port); + } } else if (card.getBlockchain() == Blockchain.Bitcoin) { BitcoinNode bitcoinNode = BitcoinNode.values()[new Random().nextInt(BitcoinNode.values().length)]; @@ -136,15 +141,12 @@ public class ServerApiElectrum { port = bitcoinNode.getPort(); proto = bitcoinNode.getProto(); - if (proto.equals("tcp")) { - this.host = host; - this.port = port; + this.host = host; + this.port = port; + if (proto.equals("tcp")) { return doElectrumRequestTcp(electrumRequest, host, port); } else { - this.host = host; - this.port = port; - return doElectrumRequestSsl(electrumRequest, host, port); } } diff --git a/app/src/main/java/com/tangem/domain/wallet/BCHUtils.java b/app/src/main/java/com/tangem/domain/wallet/BCHUtils.java new file mode 100644 index 0000000000..91da8e43cf --- /dev/null +++ b/app/src/main/java/com/tangem/domain/wallet/BCHUtils.java @@ -0,0 +1,345 @@ +package com.tangem.domain.wallet; + +/** + * Created by Ilia on 29.09.2017. + */ + +import android.util.Log; + +import com.tangem.domain.wallet.btc.BitcoinException; +import com.tangem.domain.wallet.btc.BitcoinOutputStream; +import com.tangem.domain.wallet.btc.BtcData; +import com.tangem.util.CryptoUtil; +import com.tangem.util.FormatUtil; +import com.tangem.tangemcard.util.Util; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +@SuppressWarnings({"WeakerAccess", "TryWithIdenticalCatches", "unused"}) +public final class BCHUtils { + static final BigInteger LARGEST_PRIVATE_KEY = new BigInteger("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141", 16);//SECP256K1_N + public static final long MIN_FEE_PER_KB = 10000; + public static final long MAX_ALLOWED_FEE = FormatUtil.parseValue("0.1"); + public static final long MIN_PRIORITY_FOR_NO_FEE = 57600000; + public static final long MIN_MIN_OUTPUT_VALUE_FOR_NO_FEE = 10000000L; + public static final int MAX_TX_LEN_FOR_NO_FEE = 10000; + public static final float EXPECTED_BLOCKS_PER_DAY = 144.0f;//(expected confirmations per day) + + public static String toHex(byte[] bytes) { + if (bytes == null) { + return ""; + } + final char[] hexArray = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; + char[] hexChars = new char[bytes.length * 2]; + int v; + for (int j = 0; j < bytes.length; j++) { + v = bytes[j] & 0xFF; + hexChars[j * 2] = hexArray[v >>> 4]; + hexChars[j * 2 + 1] = hexArray[v & 0x0F]; + } + return new String(hexChars); + } + + public static byte[] buildTXForSign(String myAddress, String outputAddress, String changeAddress, ArrayList unspentOutputs, int currentInputPos, long amount, long change) throws BitcoinException, IOException { + + int inputPos = currentInputPos; + byte[] tx = buildPreimage(outputAddress, changeAddress, unspentOutputs, inputPos, amount, change); + return tx; + } + + public static byte[] buildTXForSend(String outputAddress, String changeAddress, ArrayList unspentOutputs, long amount, long change) throws BitcoinException, IOException { + + int inputPos = -1; + byte[] tx = buildBodyTX(outputAddress, changeAddress, unspentOutputs, inputPos, amount, change); + return tx; + } + + //BIP 143 as reference + script length added + public static byte[] buildPreimage(String outputAddress, String changeAddress, ArrayList unspentOutputs, int inputPos, long amount, long change) throws BitcoinException, IOException { + + //nVersion of the transaction (4-byte little endian) + BitcoinOutputStream forSign = new BitcoinOutputStream(); + //forSign.writeInt32(0x01); + forSign.write(new byte[]{0x02, 0x00, 0x00, 0x00}); // version + + //inputCount + byte inputCount = (byte) unspentOutputs.size(); + + //hashPrevouts (32-byte hash) + ByteArrayOutputStream prevouts = new ByteArrayOutputStream(); + for (int i = 0; i < inputCount; ++i) { + UnspentOutputInfo outPut = unspentOutputs.get(i); + byte[] txHash = BCHUtils.reverse(Util.hexToBytes(outPut.txHashForBuild));//Little-endian txID + byte[] txIndex = BCHUtils.reverse(Util.intToByteArray4(outPut.outputIndex));//Little-endian outputIndex + prevouts.write(txHash); + prevouts.write(txIndex); + } + byte[] hashPrevouts = CryptoUtil.doubleSha256(prevouts.toByteArray()); + forSign.write(hashPrevouts); + + //hashSequence (32-byte hash), ffffffff only + ByteArrayOutputStream sequences = new ByteArrayOutputStream(); + for (int i = 0; i < inputCount; ++i) { + sequences.write(new byte[]{(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff}); + } + byte[] hashSequence = CryptoUtil.doubleSha256(sequences.toByteArray()); + forSign.write(hashSequence); + + //outpoint (32-byte hash + 4-byte little endian) + UnspentOutputInfo outPut = unspentOutputs.get(inputPos); + byte[] txHash = BCHUtils.reverse(Util.hexToBytes(outPut.txHashForBuild));//Little-endian txID + byte[] txIndex = BCHUtils.reverse(Util.intToByteArray4(outPut.outputIndex));//Little-endian outputIndex + forSign.write(txHash); + forSign.write(txIndex); + + //scriptCode of the input (serialized as scripts inside CTxOuts) + byte[] scriptCode = Transaction.Script.buildOutput(changeAddress).bytes; //build change out + byte[] scriptLength = Util.intToByteArray(scriptCode.length); + forSign.write(scriptLength); + forSign.write(scriptCode); + + //value of the output spent by this input (8-byte little endian) + byte[] outValue = BCHUtils.reverse(Util.longToByteArray8(outPut.value)); + forSign.write(outValue); + + //nSequence of the input (4-byte little endian), ffffffff only + forSign.write(new byte[]{(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff}); + + //hashOutputs (32-byte hash) + ByteArrayOutputStream outputs = new ByteArrayOutputStream(); + byte[] sendAmount = BCHUtils.reverse(Util.longToByteArray8(amount)); + byte[] sendScript = Transaction.Script.buildOutput(outputAddress).bytes; // build out + byte[] sendLength = Util.intToByteArray(sendScript.length); + outputs.write(sendAmount); + outputs.write(sendLength); + outputs.write(sendScript); + //output for change (if any) + if (change != 0) { + byte[] changeAmount = BCHUtils.reverse(Util.longToByteArray8(change)); + byte[] changeScript = Transaction.Script.buildOutput(changeAddress).bytes; //build change out + byte[] changeLength = Util.intToByteArray(changeScript.length); + outputs.write(changeAmount); + outputs.write(changeLength); + outputs.write(changeScript); + } + byte[] hashOutputs = CryptoUtil.doubleSha256(outputs.toByteArray()); + forSign.write(hashOutputs); + + //nLocktime of the transaction (4-byte little endian) + forSign.write(new byte[]{0x00, 0x00, 0x00, 0x00}); + + //sighash type of the signature (4-byte little endian) + forSign.write(new byte[]{0x41, 0x00, 0x00, 0x00}); + + byte[] rawData = forSign.toByteArray(); + + Log.e("Sign_TX_Body", BCHUtils.toHex(rawData)); + + return rawData; + + } + public static byte[] buildBodyTX(String outputAddress, String changeAddress, ArrayList unspentOutputs, int inputPos, long amount, long change) throws BitcoinException, IOException { + + //0200000000 + BitcoinOutputStream forSign = new BitcoinOutputStream(); + //forSign.writeInt32(0x01); + forSign.write(new byte[]{0x02, 0x00, 0x00, 0x00}); // version + + //01 + byte inputCount = (byte) unspentOutputs.size(); + forSign.write(inputCount); // input count + //hex str hash prev btc + + for (int i = 0; i < inputCount; ++i) { + UnspentOutputInfo outPut = unspentOutputs.get(i); + int outputIndex = outPut.outputIndex; + byte[] txHash = BCHUtils.reverse(Util.hexToBytes(outPut.txHashForBuild));//Sha256Hash.hash(rawTxByte); + forSign.write(txHash); + forSign.writeInt32(outputIndex); //output index in prev tx + if (inputPos == -1 || i == inputPos) { + // hex str 1976a914....88ac + forSign.write((byte) outPut.scriptForBuild.length); + forSign.write(outPut.scriptForBuild); + } else { + forSign.write(0x00); + } + //ffffffff + forSign.write(new byte[]{(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff}); // sequence + } + + + //02 + byte outputCount = (byte) ((change == 0) ? 1 : 2); // outputCount + forSign.write(outputCount); + + //8 bytes + + forSign.writeInt64(amount); //amount + byte[] sendScript = Transaction.Script.buildOutput(outputAddress).bytes; // build out + //hex str 1976a914....88ac + forSign.write((byte) sendScript.length); + forSign.write(sendScript); + + if (change != 0) { + //8 bytes + forSign.writeInt64(change); // change + //hex str 1976a914....88ac + byte[] chancheScript = Transaction.Script.buildOutput(changeAddress).bytes; //build out + forSign.write((byte) chancheScript.length); + forSign.write(chancheScript); + + } + + //00000000 + forSign.write(new byte[]{0x00, 0x00, 0x00, 0x00}); + + //forSign.write(new byte[]{0x01, 0x00, 0x00, 0x00}); + + byte[] rawData = forSign.toByteArray(); + + Log.e("Sign_TX_Body", BCHUtils.toHex(rawData)); + + return rawData; + } + + public static byte[] buildBodyTX(String outputAddress, String changeAddress, int outputIndex, String prevID, long amount, long change, byte[] script) throws BitcoinException, IOException { + + //0200000000 + BitcoinOutputStream forSign = new BitcoinOutputStream(); + forSign.writeInt32(0x01);//write(new byte[]{0x02, 0x00, 0x00, 0x00}); // version + + //01 + byte inputCount = 1; + forSign.write(inputCount); // input count + //hex str hash prev btc + byte[] txHash = BCHUtils.reverse(Util.hexToBytes(prevID));//Sha256Hash.hash(rawTxByte); + forSign.write(txHash); //previos tx hash + + //00000000 + //byte indexOutput = outputIndex; + forSign.writeInt32(outputIndex/*indexOutput*/); //output index in prev tx + //forSign.write(0x00); + + // hex str 1976a914....88ac + forSign.write((byte) script.length); + forSign.write(script); + + //ffffffff + forSign.write(new byte[]{(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff}); // sequence + + //02 + byte outputCount = (byte) ((change == 0) ? 1 : 2); // outputCount + forSign.write(outputCount); + + //8 bytes + + forSign.writeInt64(amount); //amount + byte[] sendScript = Transaction.Script.buildOutput(outputAddress).bytes; // build out + //hex str 1976a914....88ac + forSign.write((byte) sendScript.length); + forSign.write(sendScript); + + if (change != 0) { + //8 bytes + forSign.writeInt64(change); // change + //hex str 1976a914....88ac + byte[] chancheScript = Transaction.Script.buildOutput(changeAddress).bytes; //build out + forSign.write((byte) chancheScript.length); + forSign.write(chancheScript); + + } + + //00000000 + forSign.write(new byte[]{0x00, 0x00, 0x00, 0x00}); + + byte[] rawData = forSign.toByteArray(); + + //Log.e("Sign_TX_Body", BCHUtils.toHex(rawData)); + return rawData; + } + + public static ArrayList getOutputs(List rawTxList, byte[] outputScriptWeAreAbleToSpend) throws BitcoinException { + ArrayList unspentOutputs = new ArrayList<>(); + + for (BtcData.UnspentTransaction current : rawTxList) { + byte[] rawTxByte = BCHUtils.fromHex(current.Raw); + if (rawTxByte == null || current.Raw.isEmpty()) { + continue; + } + + Transaction baseTx = new Transaction(rawTxByte); + + if (baseTx.inputs.length == 0 || baseTx.outputs.length == 0) + throw new IllegalArgumentException("Unable to decode given transaction"); + + byte[] txHash = BCHUtils.reverse(CryptoUtil.doubleSha256(rawTxByte)); + String txHashForBuild = current.txID; + byte[] sign = null; + + for (int outputIndex = 0; outputIndex < baseTx.outputs.length; outputIndex++) { + Transaction.Output output = baseTx.outputs[outputIndex]; + + // find outputs + if (Arrays.equals(outputScriptWeAreAbleToSpend, output.script.bytes)) { + unspentOutputs.add(new UnspentOutputInfo(txHash, output.script, output.value, outputIndex, -1, txHashForBuild, sign)); + } + } + + } + + return unspentOutputs; + } + + public static byte[] fromHex(String s) { + if (s != null) { + try { + StringBuilder sb = new StringBuilder(s.length()); + for (int i = 0; i < s.length(); i++) { + char ch = s.charAt(i); + if (!Character.isWhitespace(ch)) { + sb.append(ch); + } + } + s = sb.toString(); + int len = s.length(); + byte[] data = new byte[len / 2]; + for (int i = 0; i < len; i += 2) { + int hi = (Character.digit(s.charAt(i), 16) << 4); + int low = Character.digit(s.charAt(i + 1), 16); + if (hi >= 256 || low < 0 || low >= 16) { + return null; + } + data[i / 2] = (byte) (hi | low); + } + return data; + } catch (Exception ignored) { + } + } + return null; + } + + public static byte[] reverse(byte[] bytes) { + byte[] result = new byte[bytes.length]; + for (int i = 0; i < bytes.length; i++) { + result[i] = bytes[bytes.length - i - 1]; + } + return result; + } + + public static byte[] reverseInPlace(byte[] bytes) { + int len = bytes.length / 2; + for (int i = 0; i < len; i++) { + byte t = bytes[i]; + bytes[i] = bytes[bytes.length - i - 1]; + bytes[bytes.length - i - 1] = t; + } + return bytes; + } + +} + diff --git a/app/src/main/java/com/tangem/domain/wallet/CoinEngine.java b/app/src/main/java/com/tangem/domain/wallet/CoinEngine.java index f93c438f78..ede4dee25f 100644 --- a/app/src/main/java/com/tangem/domain/wallet/CoinEngine.java +++ b/app/src/main/java/com/tangem/domain/wallet/CoinEngine.java @@ -3,6 +3,7 @@ package com.tangem.domain.wallet; import android.net.Uri; import android.text.InputFilter; +import com.tangem.tangemcard.data.Blockchain; import com.tangem.tangemcard.reader.CardProtocol; import com.tangem.tangemcard.tasks.SignTask; @@ -237,7 +238,12 @@ public abstract class CoinEngine { public void defineWallet() throws CardProtocol.TangemException { try { - String wallet = calculateAddress(ctx.getCard().getWalletPublicKey()); + String wallet; + if (ctx.getBlockchain() == Blockchain.BitcoinCash) { + wallet = calculateAddress(ctx.getCard().getWalletPublicKeyRar()); + } else { + wallet = calculateAddress(ctx.getCard().getWalletPublicKey()); + } ctx.getCoinData().setWallet(wallet); } catch (Exception e) diff --git a/app/src/main/java/com/tangem/domain/wallet/bch/BitcoinCashNode.kt b/app/src/main/java/com/tangem/domain/wallet/bch/BitcoinCashNode.kt index 7cd8f18c8c..e08f74eacf 100644 --- a/app/src/main/java/com/tangem/domain/wallet/bch/BitcoinCashNode.kt +++ b/app/src/main/java/com/tangem/domain/wallet/bch/BitcoinCashNode.kt @@ -1,8 +1,24 @@ package com.tangem.domain.wallet.bch -enum class BitcoinCashNode(val host: String, val port: Int) { - n1("electrumx-bch.cryptonermal.net", 50001), - n2("abc1.hsmiths.com", 60001), - n3("electrum.imaginary.cash", 50001), - n4("35.157.238.5", 51001), +enum class BitcoinCashNode(val host: String, val port: Int, val proto: String) { + N_001("electrumx.hillsideinternet.com", 50002, "ssl"), + N_002("bch0.kister.net", 50002, "ssl"), + N_003("abc1.hsmiths.com", 60002, "ssl"), + N_004("bch.curalle.ovh", 50002, "ssl"), + N_005("207.180.215.112", 52002, "ssl"), + N_006("bch.imaginary.cash", 50002, "ssl"), + N_007("dedi.jochen-hoenicke.de", 51002, "ssl"), + N_008("crypto.mldlabs.com", 50002, "ssl"), + N_009("bch.electrumx.cash", 50002, "ssl"), + N_010("electroncash.cascharia.com", 50002, "ssl"), + N_011("bch.crypto.mldlabs.com", 50002, "ssl"), + N_012("electron-cash.dragon.zone", 50002, "ssl"), + N_013("electron.coinucopia.io", 50002, "ssl"), + N_014("blackie.c3-soft.com", 50002, "ssl"), + N_015("electroncash.ueo.ch", 51002, "ssl"), + N_016("electrum.imaginary.cash", 50002, "ssl"), + N_017("35.157.238.5", 51002, "ssl"), + N_018("bitcoincash.quangld.com", 50002, "ssl"), + N_019("bch.stitthappens.com", 50002, "ssl"), + N_020("electroncash.dk", 50002, "ssl"), } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/domain/wallet/bch/BtcCashEngine.java b/app/src/main/java/com/tangem/domain/wallet/bch/BtcCashEngine.java index f615742b96..44f98ae69f 100644 --- a/app/src/main/java/com/tangem/domain/wallet/bch/BtcCashEngine.java +++ b/app/src/main/java/com/tangem/domain/wallet/bch/BtcCashEngine.java @@ -3,6 +3,7 @@ package com.tangem.domain.wallet.bch; import android.net.Uri; import android.text.InputFilter; +import com.tangem.domain.wallet.BCHUtils; import com.tangem.tangemcard.data.local.PINStorage; import com.tangem.tangemcard.reader.CardProtocol; import com.tangem.tangemcard.reader.TLV; @@ -16,7 +17,6 @@ import com.tangem.tangemcard.data.TangemCard; import com.tangem.domain.wallet.TangemContext; import com.tangem.domain.wallet.Transaction; import com.tangem.domain.wallet.UnspentOutputInfo; -import com.tangem.domain.wallet.BTCUtils; import com.tangem.tangemcard.tasks.SignTask; import com.tangem.util.CryptoUtil; import com.tangem.util.DecimalDigitsInputFilter; @@ -448,7 +448,7 @@ public class BtcCashEngine extends CoinEngine { byte[] outputScriptWeAreAbleToSpend = Transaction.Script.buildOutput(srcLegacyAddress).bytes; // Collect unspent - ArrayList unspentOutputs = BTCUtils.getOutputs(rawTxList, outputScriptWeAreAbleToSpend); + ArrayList unspentOutputs = BCHUtils.getOutputs(rawTxList, outputScriptWeAreAbleToSpend); long fullAmount = 0; for (int i = 0; i < unspentOutputs.size(); ++i) { @@ -477,7 +477,7 @@ public class BtcCashEngine extends CoinEngine { byte[][] bodyDoubleHash= new byte[unspentOutputs.size()][]; for (int i = 0; i < unspentOutputs.size(); ++i) { - txForSign[i] = BTCUtils.buildTXForSign(srcLegacyAddress, destLegacyAddress, srcLegacyAddress, unspentOutputs, i, amount, change); + txForSign[i] = BCHUtils.buildTXForSign(srcLegacyAddress, destLegacyAddress, srcLegacyAddress, unspentOutputs, i, amount, change); bodyHash[i] = Util.calculateSHA256(txForSign[i]); bodyDoubleHash[i] = Util.calculateSHA256(bodyHash[i]); } @@ -531,94 +531,10 @@ public class BtcCashEngine extends CoinEngine { unspentOutputs.get(i).scriptForBuild = DerEncodingUtil.packSignDerBitcoinCash(r, s, pbKey); } - byte[] txForSend=BTCUtils.buildTXForSend(destLegacyAddress, srcLegacyAddress, unspentOutputs, amountFinal, changeFinal); + byte[] txForSend=BCHUtils.buildTXForSend(destLegacyAddress, srcLegacyAddress, unspentOutputs, amountFinal, changeFinal); notifyOnNeedSendPayment(txForSend); } }; } - -// @Override -// public byte[] sign(Amount feeValue, Amount amountValue, boolean IncFee, String destAddress, CardProtocol protocol) throws Exception { -// -// checkBlockchainDataExists(); -// -// CoinEngine engine = CoinEngineFactory.INSTANCE.create(ctx); -// -// String srcLegacyAddress = ((BtcCashEngine)engine).convertToLegacyAddress(ctx.getCoinData().getWallet()); -// String destLegacyAddress = ((BtcCashEngine)engine).convertToLegacyAddress(destAddress); -// byte[] pbKey = ctx.getCard().getWalletPublicKeyRar(); //ALWAYS USING COMPRESS KEY -// -// // Build script for our address -// List rawTxList = coinData.getUnspentTransactions(); -// byte[] outputScriptWeAreAbleToSpend = Transaction.Script.buildOutput(srcLegacyAddress).bytes; -// -// // Collect unspent -// ArrayList unspentOutputs = BTCUtils.getOutputs(rawTxList, outputScriptWeAreAbleToSpend); -// -// long fullAmount = 0; -// for (int i = 0; i < unspentOutputs.size(); ++i) { -// fullAmount += unspentOutputs.get(i).value; -// } -// -// -// long fees = convertToInternalAmount(feeValue).longValueExact(); -// long amount = convertToInternalAmount(amountValue).longValueExact(); -// long change = fullAmount - amount; -// if (IncFee) { -// amount = amount - fees; -// } else { -// change = change - fees; -// } -// -// if (amount + fees > fullAmount) { -// throw new CardProtocol.TangemException_WrongAmount(String.format("Balance (%d) < change (%d) + amount (%d)", fullAmount, change, amount)); -// } -// -// byte[][] dataForSign = new byte[unspentOutputs.size()][]; -// -// for (int i = 0; i < unspentOutputs.size(); ++i) { -// byte[] newTX = BTCUtils.buildTXForSign(srcLegacyAddress, destLegacyAddress, srcLegacyAddress, unspentOutputs, i, amount, change); -// -// byte[] hashData = Util.calculateSHA256(newTX); -// byte[] doubleHashData = Util.calculateSHA256(hashData); -// -// unspentOutputs.get(i).bodyDoubleHash = doubleHashData; -// unspentOutputs.get(i).bodyHash = hashData; -// -// if (ctx.getCard().getSigningMethod() == TangemCard.SigningMethod.Sign_Raw || ctx.getCard().getSigningMethod() == TangemCard.SigningMethod.Sign_Raw_Validated_By_Issuer) { -// dataForSign[i] = newTX; -// } else { -// dataForSign[i] = doubleHashData; -// } -// -// } -// -// byte[] signFromCard; -// if (ctx.getCard().getSigningMethod() == TangemCard.SigningMethod.Sign_Raw || ctx.getCard().getSigningMethod() == TangemCard.SigningMethod.Sign_Raw_Validated_By_Issuer) { -// ByteArrayOutputStream bs = new ByteArrayOutputStream(); -// if (dataForSign.length > 10) throw new Exception("To much hashes in one transaction!"); -// for (int i = 0; i < dataForSign.length; i++) { -// if (i != 0 && dataForSign[0].length != dataForSign[i].length) -// throw new Exception("Hashes length must be identical!"); -// bs.write(dataForSign[i]); -// } -// signFromCard = protocol.run_SignRaw(PINStorage.getPIN2(), "sha-256x2", bs.toByteArray(), null, null, null).getTLV(TLV.Tag.TAG_Signature).Value; -// } else { -// //ctx.getCard().getSigningMethod() == TangemCard.SigningMethod.Sign_Hash_Validated_By_Issuer -// //ctx.getCard().getIssuer() -// signFromCard = protocol.run_SignHashes(PINStorage.getPIN2(), dataForSign, null, null, null).getTLV(TLV.Tag.TAG_Signature).Value; -// // TODO slice signFromCard to hashes.length parts -// } -// -// for (int i = 0; i < unspentOutputs.size(); ++i) { -// BigInteger r = new BigInteger(1, Arrays.copyOfRange(signFromCard, i * 64, 32 + i * 64)); -// BigInteger s = new BigInteger(1, Arrays.copyOfRange(signFromCard, 32 + i * 64, 64 + i * 64)); -// s = CryptoUtil.toCanonicalised(s); -// -// unspentOutputs.get(i).scriptForBuild = DerEncodingUtil.packSignDerBitcoinCash(r, s, pbKey); -// } -// -// return BTCUtils.buildTXForSend(destLegacyAddress, srcLegacyAddress, unspentOutputs, amount, change); -// } } diff --git a/app/src/main/java/com/tangem/domain/wallet/btc/BitcoinOutputStream.java b/app/src/main/java/com/tangem/domain/wallet/btc/BitcoinOutputStream.java index 243eb7ca10..ced90a20d3 100644 --- a/app/src/main/java/com/tangem/domain/wallet/btc/BitcoinOutputStream.java +++ b/app/src/main/java/com/tangem/domain/wallet/btc/BitcoinOutputStream.java @@ -4,6 +4,8 @@ package com.tangem.domain.wallet.btc; * Created by Ilia on 29.09.2017. */ +import com.tangem.domain.wallet.Transaction; + import java.io.ByteArrayOutputStream; @SuppressWarnings("WeakerAccess") @@ -40,4 +42,7 @@ public final class BitcoinOutputStream extends ByteArrayOutputStream { writeInt64(value); } } + + public void write(Transaction.Script script) { + } } \ No newline at end of file From 03ed4fbd9238181117f68792287fc2169018dff2 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 7 Dec 2018 21:44:12 +0300 Subject: [PATCH 12/61] Updated on 2026-08-14 --- .../tangem/data/network/ElectrumRequest.java | 13 ++++++++++-- .../tangem/domain/wallet/btc/BtcEngine.java | 14 ++++++------- .../activity/SendTransactionActivity.kt | 20 +++++++++++++++---- .../activity/SignPaymentActivity.kt | 5 +++-- 4 files changed, 37 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/com/tangem/data/network/ElectrumRequest.java b/app/src/main/java/com/tangem/data/network/ElectrumRequest.java index e61b18008f..4c3f05a3c2 100644 --- a/app/src/main/java/com/tangem/data/network/ElectrumRequest.java +++ b/app/src/main/java/com/tangem/data/network/ElectrumRequest.java @@ -156,11 +156,20 @@ public class ElectrumRequest { } public JSONObject getError() throws JSONException { - return getAnswer().getJSONObject("error"); + JSONObject answer = getAnswer(); + if (answer.has("error")) { + return getAnswer().getJSONObject("error"); + } else { + return null; + } } public String getResultString() throws JSONException { - return getAnswer().getString("result"); + if (getAnswer().has("result")) { + return getAnswer().getString("result"); + } else { + return null; + } } public JSONArray getResultArray() throws JSONException { diff --git a/app/src/main/java/com/tangem/domain/wallet/btc/BtcEngine.java b/app/src/main/java/com/tangem/domain/wallet/btc/BtcEngine.java index 8d3a950a1f..b5643b73ac 100644 --- a/app/src/main/java/com/tangem/domain/wallet/btc/BtcEngine.java +++ b/app/src/main/java/com/tangem/domain/wallet/btc/BtcEngine.java @@ -440,14 +440,14 @@ public class BtcEngine extends CoinEngine { throw new CardProtocol.TangemException_WrongAmount(String.format("Balance (%d) < change (%d) + amount (%d)", fullAmount, change, amount)); } - byte[][] txForSign = new byte[unspentOutputs.size()][]; - byte[][] bodyDoubleHash = new byte[unspentOutputs.size()][]; - byte[][] bodyHash= new byte[unspentOutputs.size()][]; + final byte[][] txForSign = new byte[unspentOutputs.size()][]; + final byte[][] bodyDoubleHash = new byte[unspentOutputs.size()][]; + final byte[][] bodyHash= new byte[unspentOutputs.size()][]; for (int i = 0; i < unspentOutputs.size(); ++i) { txForSign[i] = BTCUtils.buildTXForSign(myAddress, targetAddress, myAddress, unspentOutputs, i, amount, change); bodyHash[i] = Util.calculateSHA256(txForSign[i]); - bodyDoubleHash [i] = Util.calculateSHA256(bodyHash[i]); + bodyDoubleHash[i] = Util.calculateSHA256(bodyHash[i]); } return new SignTask.PaymentToSign() { @@ -490,10 +490,10 @@ public class BtcEngine extends CoinEngine { } @Override - public void onSignCompleted(byte[] signature) throws Exception { + public void onSignCompleted(byte[] signFromCard) throws Exception { for (int i = 0; i < unspentOutputs.size(); ++i) { - BigInteger r = new BigInteger(1, Arrays.copyOfRange(signature, i * 64, 32 + i * 64)); - BigInteger s = new BigInteger(1, Arrays.copyOfRange(signature, 32 + i * 64, 64 + i * 64)); + BigInteger r = new BigInteger(1, Arrays.copyOfRange(signFromCard, i * 64, 32 + i * 64)); + BigInteger s = new BigInteger(1, Arrays.copyOfRange(signFromCard, 32 + i * 64, 64 + i * 64)); s = CryptoUtil.toCanonicalised(s); unspentOutputs.get(i).scriptForBuild = DerEncodingUtil.packSignDer(r, s, pbKey); diff --git a/app/src/main/java/com/tangem/presentation/activity/SendTransactionActivity.kt b/app/src/main/java/com/tangem/presentation/activity/SendTransactionActivity.kt index 8576ff549b..4718859bae 100644 --- a/app/src/main/java/com/tangem/presentation/activity/SendTransactionActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/SendTransactionActivity.kt @@ -19,6 +19,7 @@ import com.tangem.tangemcard.data.TangemCard import com.tangem.util.UtilHelper import com.tangem.wallet.R import java.io.IOException +import java.lang.Exception import java.math.BigInteger class SendTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallback { @@ -58,10 +59,21 @@ class SendTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallback { val electrumBodyListener: ServerApiElectrum.ElectrumRequestDataListener = object : ServerApiElectrum.ElectrumRequestDataListener { override fun onSuccess(electrumRequest: ElectrumRequest?) { if (electrumRequest!!.isMethod(ElectrumRequest.METHOD_SendTransaction)) { - if (electrumRequest.resultString.isEmpty()) - finishWithError("Rejected by node: " + electrumRequest.getError()) - else - finishWithSuccess() + try { + if (electrumRequest.resultString.isNullOrEmpty()) + finishWithError("Rejected by node: " + electrumRequest.getError()) + else + finishWithSuccess() + } + catch (e: Exception) + { + if( e.message!=null ) + { + finishWithError(e.message!!) + }else{ + finishWithError(e.javaClass.name) + } + } } } diff --git a/app/src/main/java/com/tangem/presentation/activity/SignPaymentActivity.kt b/app/src/main/java/com/tangem/presentation/activity/SignPaymentActivity.kt index 4d778acd70..97df34baf8 100644 --- a/app/src/main/java/com/tangem/presentation/activity/SignPaymentActivity.kt +++ b/app/src/main/java/com/tangem/presentation/activity/SignPaymentActivity.kt @@ -137,7 +137,8 @@ class SignPaymentActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, Card } // signPaymentTask = SignPaymentTask(this, ctx, nfcManager, isoDep, this, amount, fee, isIncludeFee, outAddressStr) - val coinEngine= CoinEngineFactory.create(ctx) ?: throw CardProtocol.TangemException("Can't create CoinEngine!") - coinEngine.setOnNeedSendPayment { tx-> + val coinEngine = CoinEngineFactory.create(ctx) + ?: throw CardProtocol.TangemException("Can't create CoinEngine!") + coinEngine.setOnNeedSendPayment { tx -> if (tx != null) { // [REDACTED_TODO_COMMENT] \ No newline at end of file From 7737b890bbde0ecd18a29f1a506b9360efd4b87f Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 10 Dec 2018 12:05:32 +0300 Subject: [PATCH 13/61] Updated on 2026-08-14 --- .idea/gradle.xml | 4 +- app/build.gradle | 4 +- app/src/main/AndroidManifest.xml | 1 + app/src/main/java/com/tangem/App.java | 47 +- .../java/com/tangem}/data/Blockchain.java | 2 +- .../StartFingerprintReaderTask.java | 2 +- .../tangem/data/network/ServerApiCommon.java | 9 - .../data/network/ServerApiElectrum.java | 16 +- app/src/main/java/com/tangem/di/Navigator.kt | 4 - .../com/tangem/domain/wallet/CoinData.java | 2 +- .../com/tangem/domain/wallet/CoinEngine.java | 4 +- .../tangem/domain/wallet/CoinEngineFactory.kt | 2 +- .../tangem/domain/wallet/TangemContext.java | 39 +- .../domain/wallet/bch/BtcCashEngine.java | 5 +- .../tangem/domain/wallet/btc/BtcEngine.java | 4 +- .../tangem/domain/wallet/eth/EthEngine.java | 8 +- .../domain/wallet/token/TokenEngine.java | 5 - .../activity/ConfirmPaymentActivity.kt | 9 +- .../activity/CreateNewWalletActivity.kt | 11 +- .../activity/EmptyWalletActivity.kt | 19 +- .../presentation/activity/MainActivity.kt | 14 +- .../activity/PinRequestActivity.kt | 11 +- .../presentation/activity/PinSaveActivity.kt | 2 +- .../presentation/activity/PinSwapActivity.kt | 14 +- ...pareCryptonitOtherApiWithdrawalActivity.kt | 4 +- .../PrepareCryptonitWithdrawalActivity.kt | 6 +- .../PrepareKrakenWithdrawalActivity.kt | 4 +- .../activity/PreparePaymentActivity.kt | 8 +- .../presentation/activity/PurgeActivity.kt | 9 +- .../activity/SendTransactionActivity.kt | 13 +- .../activity/SignPaymentActivity.kt | 9 +- .../activity/VerifyCardActivity.kt | 2 - .../presentation/fragment/LoadedWallet.kt | 73 ++-- .../presentation/fragment/VerifyCard.kt | 23 +- settings.gradle | 2 +- {tangemcard => tangemcard-android}/.gitignore | 0 .../build.gradle | 18 +- .../proguard-rules.pro | 0 .../android}/ExampleInstrumentedTest.java | 2 +- .../src/main/AndroidManifest.xml | 8 + .../tangemcard/android/data}/Firmwares.java | 24 +- .../tangemcard/android/data}/PINStorage.java | 21 +- .../android}/nfc/DeviceNFCAntennaLocation.kt | 2 +- .../tangemcard/android}/nfc/NFCLocation.kt | 2 +- .../presentation/dialog/NfcEnableDialog.kt | 2 +- .../android}/reader/NfcManager.java | 4 +- .../tangemcard/android/reader/NfcReader.kt | 41 ++ .../tangemcard/data/TangemCardExtensions.kt | 150 +++++++ .../src/main/res/drawable/card_default.png | Bin .../src/main/res/drawable/card_ru006.png | Bin .../src/main/res/drawable/card_ru007.png | Bin .../src/main/res/drawable/card_ru011.png | Bin .../src/main/res/drawable/card_ru012.png | Bin .../src/main/res/drawable/card_ru013.png | Bin .../src/main/res/drawable/card_ru014.png | Bin .../src/main/res/drawable/card_ru015.png | Bin .../src/main/res/drawable/card_ru016.png | Bin .../src/main/res/drawable/card_ru020.png | Bin .../src/main/res/drawable/card_ru021.png | Bin .../src/main/res/drawable/card_ru022.png | Bin .../src/main/res/drawable/card_ru023.png | Bin .../src/main/res/drawable/card_ru024.png | Bin .../src/main/res/drawable/card_ru028.png | Bin .../src/main/res/drawable/card_ru029.png | Bin .../src/main/res/drawable/card_ru030.png | Bin .../res/drawable/hand_card_horizontal.png | Bin .../main/res/drawable/hand_card_vertical.png | Bin .../main/res/drawable/ic_action_nfc_gray.png | Bin .../main/res/drawable/ic_logo_bat_token.png | Bin .../src/main/res/drawable/ic_logo_bitcoin.png | Bin .../res/drawable/ic_logo_bitcoin_cash.png | Bin .../res/drawable/ic_logo_bitcoin_testnet.png | Bin .../main/res/drawable/ic_logo_ethereum.png | Bin .../res/drawable/ic_logo_ethereum_testnet.png | Bin .../src/main/res/drawable/ic_logo_seed.png | Bin .../src/main/res/drawable/ic_logo_unknown.png | Bin .../src/main/res/drawable/tangem2.png | Bin .../src/main/res/values/strings.xml | 0 .../tangemcard/android/ExampleUnitTest.java | 17 + tangemcard-common/.gitignore | 1 + tangemcard-common/build.gradle | 12 + .../com/tangem/tangemcard/data/Issuer.java | 41 +- .../tangem/tangemcard/data/Manufacturer.java | 0 .../tangem/tangemcard/data/TangemCard.java | 410 ++++++++---------- .../CardDataSubstitutionProvider.java | 7 + .../external/FirmwaresDigestsProvider.java | 14 + .../data/external/PINsProvider.java | 11 + .../tangem/tangemcard/reader/CardCrypto.java | 3 +- .../tangemcard/reader/CardProtocol.java | 72 +-- .../tangem/tangemcard/reader/CommandApdu.java | 0 .../com/tangem/tangemcard/reader/INS.java | 0 .../tangem/tangemcard/reader/NfcReader.java | 20 + .../tangemcard/reader/ResponseApdu.java | 0 .../java/com/tangem/tangemcard/reader/SW.java | 0 .../tangemcard/reader/SettingsMask.java | 67 +++ .../com/tangem/tangemcard/reader/TLV.java | 29 +- .../tangemcard/reader/TLVException.java | 0 .../com/tangem/tangemcard/reader/TLVList.java | 4 +- .../tangemcard/tasks/CreateNewWalletTask.java | 15 +- .../tangemcard/tasks/CustomReadCardTask.java | 60 ++- .../tangem/tangemcard/tasks/PurgeTask.java | 14 +- .../tangemcard/tasks/ReadCardInfoTask.java | 18 +- .../com/tangem/tangemcard/tasks/SignTask.java | 22 +- .../tangem/tangemcard/tasks/SwapPINTask.java | 13 +- .../tangemcard/tasks/VerifyCardTask.java | 25 +- .../java/com/tangem/tangemcard/util/Log.java | 13 + .../com/tangem/tangemcard/util/PBKDF2.java | 0 .../java/com/tangem/tangemcard/util/Util.java | 37 +- tangemcard/src/main/AndroidManifest.xml | 16 - .../tangemcard/reader/SettingsMask.java | 27 -- tangemserver-android/.gitignore | 1 + tangemserver-android/build.gradle | 47 ++ tangemserver-android/proguard-rules.pro | 21 + .../tangemserver/ExampleInstrumentedTest.java | 26 ++ .../src/main/AndroidManifest.xml | 5 + .../tangem/tangemserver/android}/Server.java | 2 +- .../android}/ServerApiTangem.java | 4 +- .../tangemserver/android}/ServerURL.java | 2 +- .../tangemserver/android}/TangemApi.java | 4 +- .../android/data}/LocalStorage.kt | 19 +- .../android}/model/CardVerify.java | 2 +- .../android}/model/CardVerifyAndGetInfo.kt | 2 +- .../src/main/res/values/strings.xml | 3 + .../tangem/tangemserver}/ExampleUnitTest.java | 2 +- 124 files changed, 1067 insertions(+), 706 deletions(-) rename {tangemcard/src/main/java/com/tangem/tangemcard => app/src/main/java/com/tangem}/data/Blockchain.java (98%) rename {tangemcard => tangemcard-android}/.gitignore (100%) rename {tangemcard => tangemcard-android}/build.gradle (75%) rename {tangemcard => tangemcard-android}/proguard-rules.pro (100%) rename {tangemcard/src/androidTest/java/com/tangem/tangemcard => tangemcard-android/src/androidTest/java/com/tangem/tangemcard/android}/ExampleInstrumentedTest.java (94%) create mode 100644 tangemcard-android/src/main/AndroidManifest.xml rename {tangemcard/src/main/java/com/tangem/tangemcard/data/local => tangemcard-android/src/main/java/com/tangem/tangemcard/android/data}/Firmwares.java (75%) rename {tangemcard/src/main/java/com/tangem/tangemcard/data/local => tangemcard-android/src/main/java/com/tangem/tangemcard/android/data}/PINStorage.java (93%) rename {tangemcard/src/main/java/com/tangem/tangemcard/data => tangemcard-android/src/main/java/com/tangem/tangemcard/android}/nfc/DeviceNFCAntennaLocation.kt (95%) rename {tangemcard/src/main/java/com/tangem/tangemcard/data => tangemcard-android/src/main/java/com/tangem/tangemcard/android}/nfc/NFCLocation.kt (99%) rename {tangemcard/src/main/java/com/tangem/tangemcard => tangemcard-android/src/main/java/com/tangem/tangemcard/android}/presentation/dialog/NfcEnableDialog.kt (95%) rename {tangemcard/src/main/java/com/tangem/tangemcard => tangemcard-android/src/main/java/com/tangem/tangemcard/android}/reader/NfcManager.java (97%) create mode 100644 tangemcard-android/src/main/java/com/tangem/tangemcard/android/reader/NfcReader.kt create mode 100644 tangemcard-android/src/main/java/com/tangem/tangemcard/data/TangemCardExtensions.kt rename {tangemcard => tangemcard-android}/src/main/res/drawable/card_default.png (100%) rename {tangemcard => tangemcard-android}/src/main/res/drawable/card_ru006.png (100%) rename {tangemcard => tangemcard-android}/src/main/res/drawable/card_ru007.png (100%) rename {tangemcard => tangemcard-android}/src/main/res/drawable/card_ru011.png (100%) rename {tangemcard => tangemcard-android}/src/main/res/drawable/card_ru012.png (100%) rename {tangemcard => tangemcard-android}/src/main/res/drawable/card_ru013.png (100%) rename {tangemcard => tangemcard-android}/src/main/res/drawable/card_ru014.png (100%) rename {tangemcard => tangemcard-android}/src/main/res/drawable/card_ru015.png (100%) rename {tangemcard => tangemcard-android}/src/main/res/drawable/card_ru016.png (100%) rename {tangemcard => tangemcard-android}/src/main/res/drawable/card_ru020.png (100%) rename {tangemcard => tangemcard-android}/src/main/res/drawable/card_ru021.png (100%) rename {tangemcard => tangemcard-android}/src/main/res/drawable/card_ru022.png (100%) rename {tangemcard => tangemcard-android}/src/main/res/drawable/card_ru023.png (100%) rename {tangemcard => tangemcard-android}/src/main/res/drawable/card_ru024.png (100%) rename {tangemcard => tangemcard-android}/src/main/res/drawable/card_ru028.png (100%) rename {tangemcard => tangemcard-android}/src/main/res/drawable/card_ru029.png (100%) rename {tangemcard => tangemcard-android}/src/main/res/drawable/card_ru030.png (100%) rename {tangemcard => tangemcard-android}/src/main/res/drawable/hand_card_horizontal.png (100%) rename {tangemcard => tangemcard-android}/src/main/res/drawable/hand_card_vertical.png (100%) rename {tangemcard => tangemcard-android}/src/main/res/drawable/ic_action_nfc_gray.png (100%) rename {tangemcard => tangemcard-android}/src/main/res/drawable/ic_logo_bat_token.png (100%) rename {tangemcard => tangemcard-android}/src/main/res/drawable/ic_logo_bitcoin.png (100%) rename {tangemcard => tangemcard-android}/src/main/res/drawable/ic_logo_bitcoin_cash.png (100%) rename {tangemcard => tangemcard-android}/src/main/res/drawable/ic_logo_bitcoin_testnet.png (100%) rename {tangemcard => tangemcard-android}/src/main/res/drawable/ic_logo_ethereum.png (100%) rename {tangemcard => tangemcard-android}/src/main/res/drawable/ic_logo_ethereum_testnet.png (100%) rename {tangemcard => tangemcard-android}/src/main/res/drawable/ic_logo_seed.png (100%) rename {tangemcard => tangemcard-android}/src/main/res/drawable/ic_logo_unknown.png (100%) rename {tangemcard => tangemcard-android}/src/main/res/drawable/tangem2.png (100%) rename {tangemcard => tangemcard-android}/src/main/res/values/strings.xml (100%) create mode 100644 tangemcard-android/src/test/java/com/tangem/tangemcard/android/ExampleUnitTest.java create mode 100644 tangemcard-common/.gitignore create mode 100644 tangemcard-common/build.gradle rename {tangemcard => tangemcard-common}/src/main/java/com/tangem/tangemcard/data/Issuer.java (72%) rename {tangemcard => tangemcard-common}/src/main/java/com/tangem/tangemcard/data/Manufacturer.java (100%) rename {tangemcard => tangemcard-common}/src/main/java/com/tangem/tangemcard/data/TangemCard.java (61%) create mode 100644 tangemcard-common/src/main/java/com/tangem/tangemcard/data/external/CardDataSubstitutionProvider.java create mode 100644 tangemcard-common/src/main/java/com/tangem/tangemcard/data/external/FirmwaresDigestsProvider.java create mode 100644 tangemcard-common/src/main/java/com/tangem/tangemcard/data/external/PINsProvider.java rename {tangemcard => tangemcard-common}/src/main/java/com/tangem/tangemcard/reader/CardCrypto.java (99%) rename {tangemcard => tangemcard-common}/src/main/java/com/tangem/tangemcard/reader/CardProtocol.java (97%) rename {tangemcard => tangemcard-common}/src/main/java/com/tangem/tangemcard/reader/CommandApdu.java (100%) rename {tangemcard => tangemcard-common}/src/main/java/com/tangem/tangemcard/reader/INS.java (100%) create mode 100644 tangemcard-common/src/main/java/com/tangem/tangemcard/reader/NfcReader.java rename {tangemcard => tangemcard-common}/src/main/java/com/tangem/tangemcard/reader/ResponseApdu.java (100%) rename {tangemcard => tangemcard-common}/src/main/java/com/tangem/tangemcard/reader/SW.java (100%) create mode 100644 tangemcard-common/src/main/java/com/tangem/tangemcard/reader/SettingsMask.java rename {tangemcard => tangemcard-common}/src/main/java/com/tangem/tangemcard/reader/TLV.java (78%) rename {tangemcard => tangemcard-common}/src/main/java/com/tangem/tangemcard/reader/TLVException.java (100%) rename {tangemcard => tangemcard-common}/src/main/java/com/tangem/tangemcard/reader/TLVList.java (94%) rename {tangemcard => tangemcard-common}/src/main/java/com/tangem/tangemcard/tasks/CreateNewWalletTask.java (57%) rename {tangemcard => tangemcard-common}/src/main/java/com/tangem/tangemcard/tasks/CustomReadCardTask.java (90%) rename {tangemcard => tangemcard-common}/src/main/java/com/tangem/tangemcard/tasks/PurgeTask.java (53%) rename {tangemcard => tangemcard-common}/src/main/java/com/tangem/tangemcard/tasks/ReadCardInfoTask.java (71%) rename {tangemcard => tangemcard-common}/src/main/java/com/tangem/tangemcard/tasks/SignTask.java (71%) rename {tangemcard => tangemcard-common}/src/main/java/com/tangem/tangemcard/tasks/SwapPINTask.java (57%) rename {tangemcard => tangemcard-common}/src/main/java/com/tangem/tangemcard/tasks/VerifyCardTask.java (58%) create mode 100644 tangemcard-common/src/main/java/com/tangem/tangemcard/util/Log.java rename {tangemcard => tangemcard-common}/src/main/java/com/tangem/tangemcard/util/PBKDF2.java (100%) rename {tangemcard => tangemcard-common}/src/main/java/com/tangem/tangemcard/util/Util.java (97%) delete mode 100644 tangemcard/src/main/AndroidManifest.xml delete mode 100644 tangemcard/src/main/java/com/tangem/tangemcard/reader/SettingsMask.java create mode 100644 tangemserver-android/.gitignore create mode 100644 tangemserver-android/build.gradle create mode 100644 tangemserver-android/proguard-rules.pro create mode 100644 tangemserver-android/src/androidTest/java/com/tangem/tangemserver/ExampleInstrumentedTest.java create mode 100644 tangemserver-android/src/main/AndroidManifest.xml rename {tangemcard/src/main/java/com/tangem/tangemcard/data/network => tangemserver-android/src/main/java/com/tangem/tangemserver/android}/Server.java (92%) rename {tangemcard/src/main/java/com/tangem/tangemcard/data/network => tangemserver-android/src/main/java/com/tangem/tangemserver/android}/ServerApiTangem.java (97%) rename {tangemcard/src/main/java/com/tangem/tangemcard/data/network => tangemserver-android/src/main/java/com/tangem/tangemserver/android}/ServerURL.java (66%) rename {tangemcard/src/main/java/com/tangem/tangemcard/data/network => tangemserver-android/src/main/java/com/tangem/tangemserver/android}/TangemApi.java (84%) rename {tangemcard/src/main/java/com/tangem/tangemcard/data/local => tangemserver-android/src/main/java/com/tangem/tangemserver/android/data}/LocalStorage.kt (97%) rename {tangemcard/src/main/java/com/tangem/tangemcard/data/network => tangemserver-android/src/main/java/com/tangem/tangemserver/android}/model/CardVerify.java (80%) rename {tangemcard/src/main/java/com/tangem/tangemcard/data/network => tangemserver-android/src/main/java/com/tangem/tangemserver/android}/model/CardVerifyAndGetInfo.kt (96%) create mode 100644 tangemserver-android/src/main/res/values/strings.xml rename {tangemcard/src/test/java/com/tangem/tangemcard => tangemserver-android/src/test/java/com/tangem/tangemserver}/ExampleUnitTest.java (91%) diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 255a33e953..ada7acbd0c 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -9,7 +9,9 @@