Browse Source

update attack state after every security check (#42)

* update attack state after every security check

* fix MasterFingerPrint not match
V1.2.0-btc-release
JunZhang 5 years ago
committed by GitHub
parent
commit
647e5d15cc
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 4
      app/src/main/java/com/cobo/cold/Utilities.java
  2. 3
      app/src/main/java/com/cobo/cold/service/AttackCheckingService.java
  3. 3
      app/src/main/java/com/cobo/cold/ui/fragment/SecurityCheckFragment.java
  4. 1
      app/src/main/java/com/cobo/cold/ui/fragment/main/FeeAttackChecking.java
  5. 17
      app/src/main/java/com/cobo/cold/viewmodel/PsbtViewModel.java

4
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) {

3
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);
}
}

3
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);

1
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());

17
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());

Loading…
Cancel
Save