diff --git a/app/src/main/java/com/cobo/cold/Utilities.java b/app/src/main/java/com/cobo/cold/Utilities.java index 04c8980..7f6f6a1 100644 --- a/app/src/main/java/com/cobo/cold/Utilities.java +++ b/app/src/main/java/com/cobo/cold/Utilities.java @@ -206,9 +206,9 @@ public class Utilities { return Settings.System.putString(context.getContentResolver(), FINGERPRINT_PASSWORD, pwd); } - public static void setAttackDetected(Context context) { + public static void setAttackDetected(Context context, boolean attacked) { SharedPreferences sp = context.getSharedPreferences(PREFERENCE_SECRET, MODE_PRIVATE); - sp.edit().putBoolean(ATTACK_DETECTED,true).apply(); + sp.edit().putBoolean(ATTACK_DETECTED,attacked).apply(); } public static boolean isAttackDetected(Context context) { diff --git a/app/src/main/java/com/cobo/cold/service/AttackCheckingService.java b/app/src/main/java/com/cobo/cold/service/AttackCheckingService.java index 87f5f69..766d1c4 100644 --- a/app/src/main/java/com/cobo/cold/service/AttackCheckingService.java +++ b/app/src/main/java/com/cobo/cold/service/AttackCheckingService.java @@ -41,7 +41,7 @@ public class AttackCheckingService extends Service { public void run() { SecurityCheck.CheckResult result = securityCheck.attackChecking(AttackCheckingService.this); if (result.result == RESULT_UNDER_ATTACK) { - Utilities.setAttackDetected(AttackCheckingService.this); + Utilities.setAttackDetected(AttackCheckingService.this,true); Bundle data = new Bundle(); data.putInt("firmware", result.firmwareStatusCode); data.putInt("system", result.systemStatusCode); @@ -52,6 +52,7 @@ public class AttackCheckingService extends Service { intent.putExtras(data); startActivity(intent); } else { + Utilities.setAttackDetected(AttackCheckingService.this,false); handler.postDelayed(this, checkingInterval); } } diff --git a/app/src/main/java/com/cobo/cold/ui/fragment/SecurityCheckFragment.java b/app/src/main/java/com/cobo/cold/ui/fragment/SecurityCheckFragment.java index e481488..f337f12 100644 --- a/app/src/main/java/com/cobo/cold/ui/fragment/SecurityCheckFragment.java +++ b/app/src/main/java/com/cobo/cold/ui/fragment/SecurityCheckFragment.java @@ -48,6 +48,7 @@ public class SecurityCheckFragment extends BaseFragment { SecurityCheck.CheckResult checkResult = new SecurityCheck().doSelfCheck(mActivity); handler.postDelayed(() -> { if (checkResult.result == RESULT_OK) { + Utilities.setAttackDetected(mActivity, false); boolean vaultCreated = Utilities.hasVaultCreated(mActivity); Log.d(TAG, "vaultCreated = " + vaultCreated); Intent intent; @@ -60,7 +61,7 @@ public class SecurityCheckFragment extends BaseFragment { startActivity(intent); mActivity.finish(); } else { - Utilities.setAttackDetected(mActivity); + Utilities.setAttackDetected(mActivity, true); Bundle data = new Bundle(); data.putInt("firmware", checkResult.firmwareStatusCode); data.putInt("system", checkResult.systemStatusCode); diff --git a/app/src/main/java/com/cobo/cold/ui/fragment/main/FeeAttackChecking.java b/app/src/main/java/com/cobo/cold/ui/fragment/main/FeeAttackChecking.java index d73aae5..f87690b 100644 --- a/app/src/main/java/com/cobo/cold/ui/fragment/main/FeeAttackChecking.java +++ b/app/src/main/java/com/cobo/cold/ui/fragment/main/FeeAttackChecking.java @@ -41,6 +41,7 @@ public class FeeAttackChecking { null, false); modalDialog.setBinding(binding); binding.title.setText(R.string.abnormal_tx); + binding.close.setVisibility(View.GONE); binding.subTitle.setText(R.string.fee_attack_warning); binding.confirm.setText(R.string.know); binding.confirm.setOnClickListener(v -> modalDialog.dismiss()); diff --git a/app/src/main/java/com/cobo/cold/viewmodel/PsbtViewModel.java b/app/src/main/java/com/cobo/cold/viewmodel/PsbtViewModel.java index 7d2e760..5f607e2 100644 --- a/app/src/main/java/com/cobo/cold/viewmodel/PsbtViewModel.java +++ b/app/src/main/java/com/cobo/cold/viewmodel/PsbtViewModel.java @@ -24,17 +24,16 @@ import androidx.lifecycle.AndroidViewModel; import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; -import com.cobo.coinlib.Util; import com.cobo.coinlib.utils.Coins; import com.cobo.cold.AppExecutors; import com.cobo.cold.MainApplication; -import com.cobo.cold.Utilities; import com.cobo.cold.callables.GetMasterFingerprintCallable; import com.cobo.cold.update.utils.Storage; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; +import org.spongycastle.util.encoders.Hex; import java.io.File; import java.util.ArrayList; @@ -87,7 +86,9 @@ public class PsbtViewModel extends AndroidViewModel { for (int j = 0; j < bip32Derivation.length(); j++) { JSONObject item = bip32Derivation.getJSONObject(j); String hdPath = item.getString("path"); - if (item.getString("masterFingerprint").equals(masterKeyFingerprint) + String fingerprint = item.getString("masterFingerprint"); + if ((fingerprint.equals(masterKeyFingerprint) + || reverseHex(fingerprint).equals(masterKeyFingerprint)) && hdPath.toUpperCase().startsWith(account.getPath())) { utxo.put("publicKey", item.getString("pubkey")); utxo.put("value", psbtInput.optInt("value")); @@ -103,6 +104,16 @@ public class PsbtViewModel extends AndroidViewModel { } + private static String reverseHex(String hex) { + byte[] data = Hex.decode(hex); + for(int i = 0; i < data.length / 2; i++) { + byte temp = data[i]; + data[i] = data[data.length - i - 1]; + data[data.length - i - 1] = temp; + } + return Hex.toHexString(data); + } + private static void adaptOutputs(JSONArray psbtOutputs, JSONArray outputs) throws JSONException { String masterKeyFingerprint = new GetMasterFingerprintCallable().call(); Coins.Account account = getAccount(MainApplication.getApplication());