From a813f8cd142249178c7709ff6a24ed06b9d12b84 Mon Sep 17 00:00:00 2001 From: dxl <64101226@qq.com> Date: Mon, 13 Apr 2020 15:45:37 +0800 Subject: [PATCH] Project rebuild & clean up. --- app_main/build.gradle | 3 +- .../rrg/rdv/activities/main/BaseActivity.java | 12 +- .../cn/rrg/rdv/adapter/DumpEqualAdapter.java | 12 +- .../fragment/tools/AbsMfOperatesFragment.java | 4 +- .../tools/AbsShowInformationFragment.java | 8 +- .../rrg/rdv/models/AbsTagKeysCheckModel.java | 4 +- .../cn/rrg/rdv/models/AbsTagReadModel.java | 10 +- .../cn/rrg/rdv/models/AbsTagWriteModel.java | 18 +- .../rdv/models/StandardNFCTagStateModel.java | 4 +- .../rdv/models/StdNfcInformationsModel.java | 4 +- .../rdv/presenter/AbsTagWritePresenter.java | 6 +- .../main/java/cn/rrg/rdv/util/DumpUtils.java | 10 +- build.gradle | 2 +- chameleon/build.gradle | 7 +- .../chameleon/utils/ChameleonDetection.java | 10 +- .../rrg/chameleon/utils/DetectionResult.java | 4 +- console/.gitignore | 62 ---- console/build.gradle | 30 -- console/proguard-rules.pro | 21 -- console/src/main/AndroidManifest.xml | 2 - .../cn/rrg/console/define/ICommandTools.java | 24 -- .../cn/rrg/console/define/ICommandType.java | 24 -- console/src/main/res/values/strings.xml | 3 - libnfc_pn53x/build.gradle | 5 +- mifaretag/.gitignore | 62 ---- mifaretag/build.gradle | 27 -- mifaretag/consumer-rules.pro | 0 mifaretag/proguard-rules.pro | 21 -- mifaretag/src/main/AndroidManifest.xml | 5 - .../main/java/cn/dxl/mifare/BatchAdapter.java | 50 --- .../main/java/cn/dxl/mifare/GlobalTag.java | 44 --- .../java/cn/dxl/mifare/HardNestedAdapter.java | 14 - .../java/cn/dxl/mifare/MifareAdapter.java | 179 ---------- .../main/java/cn/dxl/mifare/MifareUtils.java | 105 ------ .../java/cn/dxl/mifare/NestedAdapter.java | 14 - .../main/java/cn/dxl/mifare/PRNGAdapter.java | 5 - .../java/cn/dxl/mifare/StdMifareImpl.java | 333 ------------------ .../java/cn/dxl/mifare/StdMifareIntent.java | 53 --- .../java/cn/dxl/mifare/TagLeaksAdapter.java | 28 -- .../java/cn/dxl/mifare/TestTaskAdapter.java | 23 -- mifaretag/src/main/res/values/strings.xml | 3 - pm3rdv4rrg/build.gradle | 5 +- settings.gradle | 2 +- 43 files changed, 67 insertions(+), 1195 deletions(-) delete mode 100644 console/.gitignore delete mode 100644 console/build.gradle delete mode 100644 console/proguard-rules.pro delete mode 100644 console/src/main/AndroidManifest.xml delete mode 100644 console/src/main/java/cn/rrg/console/define/ICommandTools.java delete mode 100644 console/src/main/java/cn/rrg/console/define/ICommandType.java delete mode 100644 console/src/main/res/values/strings.xml delete mode 100644 mifaretag/.gitignore delete mode 100644 mifaretag/build.gradle delete mode 100644 mifaretag/consumer-rules.pro delete mode 100644 mifaretag/proguard-rules.pro delete mode 100644 mifaretag/src/main/AndroidManifest.xml delete mode 100644 mifaretag/src/main/java/cn/dxl/mifare/BatchAdapter.java delete mode 100644 mifaretag/src/main/java/cn/dxl/mifare/GlobalTag.java delete mode 100644 mifaretag/src/main/java/cn/dxl/mifare/HardNestedAdapter.java delete mode 100644 mifaretag/src/main/java/cn/dxl/mifare/MifareAdapter.java delete mode 100644 mifaretag/src/main/java/cn/dxl/mifare/MifareUtils.java delete mode 100644 mifaretag/src/main/java/cn/dxl/mifare/NestedAdapter.java delete mode 100644 mifaretag/src/main/java/cn/dxl/mifare/PRNGAdapter.java delete mode 100644 mifaretag/src/main/java/cn/dxl/mifare/StdMifareImpl.java delete mode 100644 mifaretag/src/main/java/cn/dxl/mifare/StdMifareIntent.java delete mode 100644 mifaretag/src/main/java/cn/dxl/mifare/TagLeaksAdapter.java delete mode 100644 mifaretag/src/main/java/cn/dxl/mifare/TestTaskAdapter.java delete mode 100644 mifaretag/src/main/res/values/strings.xml diff --git a/app_main/build.gradle b/app_main/build.gradle index 434cab91..55c6e2a6 100644 --- a/app_main/build.gradle +++ b/app_main/build.gradle @@ -55,10 +55,11 @@ dependencies { // This my project maven from github release! implementation 'com.github.xianglin1998:IORedirector:1.0' implementation 'com.github.xianglin1998:Crapto1:1.3' + implementation 'com.github.xianglin1998:nfctag:1.0' + implementation 'com.github.xianglin1998:nfc_console:1.0' implementation project(':utils') implementation project(':libnfc_pn53x') - implementation project(':console') implementation project(':chameleon') implementation project(':communication') implementation project(':pm3rdv4rrg') diff --git a/app_main/src/main/java/cn/rrg/rdv/activities/main/BaseActivity.java b/app_main/src/main/java/cn/rrg/rdv/activities/main/BaseActivity.java index ff623c93..73912f50 100644 --- a/app_main/src/main/java/cn/rrg/rdv/activities/main/BaseActivity.java +++ b/app_main/src/main/java/cn/rrg/rdv/activities/main/BaseActivity.java @@ -24,7 +24,7 @@ import cn.dxl.common.util.LanguageUtil; import cn.dxl.common.util.StatusBarUtil; import cn.dxl.common.widget.ToastUtil; import cn.dxl.common.util.VibratorUtils; -import cn.dxl.mifare.GlobalTag; +import cn.dxl.mifare.NfcTagListenUtils; import cn.dxl.mifare.StdMifareIntent; import cn.rrg.rdv.R; import cn.rrg.rdv.application.Properties; @@ -33,7 +33,7 @@ import cn.rrg.rdv.application.Properties; * Created by DXL on 2017/10/26. */ public abstract class BaseActivity - extends AppCompatActivity implements GlobalTag.OnNewTagListener { + extends AppCompatActivity implements NfcTagListenUtils.OnNewTagListener { protected String LOG_TAG = this.getClass().getSimpleName(); protected Context context = this; @@ -50,7 +50,7 @@ public abstract class BaseActivity //实例化一个标准NFC设备工具对象! mStdMfUtil = new StdMifareIntent(this); //添加全局的标签状态监听! - GlobalTag.addListener(this); + NfcTagListenUtils.addListener(this); //建立事件观察数列! onTouchListeners = new ArrayList<>(); @@ -134,12 +134,12 @@ public abstract class BaseActivity Tag tag = data.getParcelable(NfcAdapter.EXTRA_TAG); if (tag != null) { //存入全局操作域! - GlobalTag.setTag(tag); + NfcTagListenUtils.setTag(tag); //显示 UID! ToastUtil.show(this, getString(R.string.tips_uid) + HexUtil.toHexString(tag.getId()), true); //震动一下! VibratorUtils.runOneAsDelay(context, 1000); - GlobalTag.notifyOnNewTag(tag); + NfcTagListenUtils.notifyOnNewTag(tag); } } super.onNewIntent(intent); @@ -183,7 +183,7 @@ public abstract class BaseActivity protected void onDestroy() { //Log.d(LOG_TAG, "Act is destory"); super.onDestroy(); - GlobalTag.removeListener(this); + NfcTagListenUtils.removeListener(this); } @Override diff --git a/app_main/src/main/java/cn/rrg/rdv/adapter/DumpEqualAdapter.java b/app_main/src/main/java/cn/rrg/rdv/adapter/DumpEqualAdapter.java index 626ebec1..78c6b19a 100644 --- a/app_main/src/main/java/cn/rrg/rdv/adapter/DumpEqualAdapter.java +++ b/app_main/src/main/java/cn/rrg/rdv/adapter/DumpEqualAdapter.java @@ -10,7 +10,7 @@ import android.view.ViewGroup; import android.widget.LinearLayout; import android.widget.TextView; -import cn.dxl.mifare.MifareUtils; +import cn.dxl.mifare.MifareClassicUtils; import cn.rrg.rdv.R; import cn.dxl.common.util.ContextUtil; import cn.dxl.common.util.TextStyleUtil; @@ -34,25 +34,25 @@ public class DumpEqualAdapter extends AbsResIdArrayAdapter { showBlock.setText(String.valueOf(position)); //判断是否试起始扇区,是的话就显示扇区索引值 LinearLayout layout = view.findViewById(R.id.layout_sector_label); - if (MifareUtils.isFirstBlock(position)) { + if (MifareClassicUtils.isFirstBlock(position)) { layout.setVisibility(View.VISIBLE); //填充扇区值! TextView txtShowSector = layout.findViewById(R.id.txtShowSector); - int sector = MifareUtils.blockToSector(position); + int sector = MifareClassicUtils.blockToSector(position); txtShowSector.setText(String.valueOf(sector)); } else { layout.setVisibility(View.GONE); } //判断是否需要显示尾部的分割线! View endDivider = view.findViewById(R.id.view_divider); - if (MifareUtils.isTrailerBlock(position)) { + if (MifareClassicUtils.isTrailerBlock(position)) { endDivider.setVisibility(View.VISIBLE); } else { endDivider.setVisibility(View.GONE); } //判断是否需要显示块数据的分割线! View dataBlckDivider = view.findViewById(R.id.view_divider_1); - if (!MifareUtils.isTrailerBlock(position)) { + if (!MifareClassicUtils.isTrailerBlock(position)) { dataBlckDivider.setVisibility(View.VISIBLE); } else { dataBlckDivider.setVisibility(View.GONE); @@ -91,7 +91,7 @@ public class DumpEqualAdapter extends AbsResIdArrayAdapter { //厂商块! ssb.append(TextStyleUtil.getStyleString(getContext(), data, R.style.ManufacturerStyle)); if (i != contents.length - 1) ssb.append('\n'); - } else if (MifareUtils.isTrailerBlock(position)) { + } else if (MifareClassicUtils.isTrailerBlock(position)) { //尾部块! //尾部块需要进行截取设置,无需最终的换行!!! String keyA = data.substring(0, 12); diff --git a/app_main/src/main/java/cn/rrg/rdv/fragment/tools/AbsMfOperatesFragment.java b/app_main/src/main/java/cn/rrg/rdv/fragment/tools/AbsMfOperatesFragment.java index 07c4fb8f..9f49c86d 100644 --- a/app_main/src/main/java/cn/rrg/rdv/fragment/tools/AbsMfOperatesFragment.java +++ b/app_main/src/main/java/cn/rrg/rdv/fragment/tools/AbsMfOperatesFragment.java @@ -35,7 +35,7 @@ import cn.dxl.common.util.HexUtil; import cn.dxl.common.util.LogUtils; import cn.dxl.common.widget.FilesSelectorDialog; import cn.dxl.common.widget.ToastUtil; -import cn.dxl.mifare.MifareUtils; +import cn.dxl.mifare.MifareClassicUtils; import cn.rrg.rdv.R; import cn.rrg.rdv.activities.standard.AbsStandardM1Activity; import cn.rrg.rdv.activities.tools.DumpEditActivity; @@ -715,7 +715,7 @@ public abstract class AbsMfOperatesFragment // TODO 后期可以做类似MCT的多扇区(非全部扇区)或者单扇区读写实现! // 目前只返回用户输入的扇区即可! sector = Integer.parseInt(edtInputReadTagSingleSector.getText().toString()); - if (!MifareUtils.validateSector(sector)) sector = -1; + if (!MifareClassicUtils.validateSector(sector)) sector = -1; } catch (Exception ignored) { } for (M1KeyBean keyBean : keyBeans) { diff --git a/app_main/src/main/java/cn/rrg/rdv/fragment/tools/AbsShowInformationFragment.java b/app_main/src/main/java/cn/rrg/rdv/fragment/tools/AbsShowInformationFragment.java index 9f038133..11563435 100644 --- a/app_main/src/main/java/cn/rrg/rdv/fragment/tools/AbsShowInformationFragment.java +++ b/app_main/src/main/java/cn/rrg/rdv/fragment/tools/AbsShowInformationFragment.java @@ -17,7 +17,7 @@ import android.webkit.WebSettings; import android.webkit.WebView; import cn.dxl.common.util.FragmentUtil; -import cn.dxl.mifare.GlobalTag; +import cn.dxl.mifare.NfcTagListenUtils; import cn.rrg.rdv.R; import cn.rrg.rdv.fragment.base.BaseFragment; import cn.rrg.rdv.presenter.AbsTagInformationsPresenter; @@ -29,7 +29,7 @@ import cn.rrg.rdv.view.TagInformationsView; public abstract class AbsShowInformationFragment extends BaseFragment implements TagInformationsView, - GlobalTag.OnNewTagListener { + NfcTagListenUtils.OnNewTagListener { private AbsTagInformationsPresenter presenter; @@ -42,7 +42,7 @@ public abstract class AbsShowInformationFragment @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); - GlobalTag.addListener(this); + NfcTagListenUtils.addListener(this); workingMsgDialog = new AlertDialog.Builder(getContext()) .setTitle(R.string.tips) .setCancelable(false) @@ -100,7 +100,7 @@ public abstract class AbsShowInformationFragment @Override public void onDestroy() { super.onDestroy(); - GlobalTag.removeListener(this); + NfcTagListenUtils.removeListener(this); presenter.detachView(); workingMsgDialog.dismiss(); workingMsgDialog = null; diff --git a/app_main/src/main/java/cn/rrg/rdv/models/AbsTagKeysCheckModel.java b/app_main/src/main/java/cn/rrg/rdv/models/AbsTagKeysCheckModel.java index a3eb00fa..c671c47c 100644 --- a/app_main/src/main/java/cn/rrg/rdv/models/AbsTagKeysCheckModel.java +++ b/app_main/src/main/java/cn/rrg/rdv/models/AbsTagKeysCheckModel.java @@ -10,7 +10,7 @@ import cn.dxl.common.util.FileUtils; import cn.dxl.common.util.HexUtil; import cn.dxl.common.util.LogUtils; import cn.dxl.mifare.MifareAdapter; -import cn.dxl.mifare.MifareUtils; +import cn.dxl.mifare.MifareClassicUtils; import cn.rrg.rdv.callback.KeysAuthCallback; import cn.rrg.rdv.javabean.M1KeyBean; import cn.rrg.rdv.util.DumpUtils; @@ -197,7 +197,7 @@ public abstract class AbsTagKeysCheckModel extends AbsStopableTask { private void authkeysInSector(int sector, KeysAuthCallback callBack) { // 初始化标签 MifareAdapter stdMf = getTag(); - if (!MifareUtils.validateSector(sector)) { + if (!MifareClassicUtils.validateSector(sector)) { //不是有效的扇区,可能是出现了BUG callBack.onResults(null); return; diff --git a/app_main/src/main/java/cn/rrg/rdv/models/AbsTagReadModel.java b/app_main/src/main/java/cn/rrg/rdv/models/AbsTagReadModel.java index 4cb64288..85fe6410 100644 --- a/app_main/src/main/java/cn/rrg/rdv/models/AbsTagReadModel.java +++ b/app_main/src/main/java/cn/rrg/rdv/models/AbsTagReadModel.java @@ -9,7 +9,7 @@ import java.util.Arrays; import cn.dxl.common.util.HexUtil; import cn.dxl.common.util.LogUtils; import cn.dxl.mifare.MifareAdapter; -import cn.dxl.mifare.MifareUtils; +import cn.dxl.mifare.MifareClassicUtils; import cn.rrg.rdv.callback.ReaderCallback; import cn.rrg.rdv.javabean.M1Bean; import cn.rrg.rdv.javabean.M1KeyBean; @@ -54,9 +54,9 @@ public abstract class AbsTagReadModel extends AbsStopableTask { ret = new M1Bean(); ret.setSector(sector); //验证成功,则得到当前扇区的块数量,进行遍历读取 - int blockCount = MifareUtils.getBlockCountInSector(sector); + int blockCount = MifareClassicUtils.getBlockCountInSector(sector); //得到块开始的位置 - int startBlock = MifareUtils.sectorToBlock(sector); + int startBlock = MifareClassicUtils.sectorToBlock(sector); //得到块结束的位置 int endBlock = startBlock + blockCount; //建立一个数组,存放数据! @@ -186,11 +186,11 @@ public abstract class AbsTagReadModel extends AbsStopableTask { //设置扇区 ret.setSector(sector); //得到扇区总数量 - int blockCount = MifareUtils.getBlockCountInSector(sector); + int blockCount = MifareClassicUtils.getBlockCountInSector(sector); //建立数据块字符串数组 String[] datas = new String[blockCount]; //这个扇区的第一块 - int firstBlock = MifareUtils.sectorToBlock(sector); + int firstBlock = MifareClassicUtils.sectorToBlock(sector); //迭代扇区中的块! for (int i = 0, j = firstBlock; i < blockCount; ++i, ++j) { //Log.d(LOG_TAG, "读取块: " + i); diff --git a/app_main/src/main/java/cn/rrg/rdv/models/AbsTagWriteModel.java b/app_main/src/main/java/cn/rrg/rdv/models/AbsTagWriteModel.java index 10b2fcda..0a26a61f 100644 --- a/app_main/src/main/java/cn/rrg/rdv/models/AbsTagWriteModel.java +++ b/app_main/src/main/java/cn/rrg/rdv/models/AbsTagWriteModel.java @@ -8,7 +8,7 @@ import java.util.Comparator; import cn.dxl.common.util.HexUtil; import cn.dxl.mifare.MifareAdapter; -import cn.dxl.mifare.MifareUtils; +import cn.dxl.mifare.MifareClassicUtils; import cn.rrg.rdv.javabean.M1KeyBean; import cn.rrg.rdv.javabean.M1Bean; import cn.rrg.rdv.callback.WriterCallback; @@ -69,7 +69,7 @@ public abstract class AbsTagWriteModel if (block == 0 && !writeZero) return false; boolean ret = false; boolean auth; - int sector = MifareUtils.blockToSector(block); + int sector = MifareClassicUtils.blockToSector(block); try { if (useKeyB) { auth = tag.authB(sector, key); @@ -96,7 +96,7 @@ public abstract class AbsTagWriteModel } MifareAdapter tag = getTag(); //判断给出的密钥是否可以用来验证这个块 - if (MifareUtils.blockToSector(block) != keys.getSector()) { + if (MifareClassicUtils.blockToSector(block) != keys.getSector()) { Log.d(LOG_TAG, "给出的密钥bean不符合输入的block值!"); callback.onFinish(); return; @@ -135,7 +135,7 @@ public abstract class AbsTagWriteModel //取出数据尝试写入! String[] datas = data.getDatas(); //进一步验证数据和卡片类型的映射! - if (datas.length != MifareUtils.getBlockCountInSector(data.getSector())) { + if (datas.length != MifareClassicUtils.getBlockCountInSector(data.getSector())) { //数据长度跟卡片对应扇区的块数量不匹配! Log.d(LOG_TAG, "发现了致命的问题,传入的数据块数量与标签的块数量不匹配!"); stopLable = true; @@ -146,7 +146,7 @@ public abstract class AbsTagWriteModel if (order) { //正序写! int sector = data.getSector(); - int startBlobk = MifareUtils.sectorToBlock(sector); + int startBlobk = MifareClassicUtils.sectorToBlock(sector); for (int i = 0, j = startBlobk; i < datas.length; ++i, ++j) { //Log.d(LOG_TAG, "写入块" + j); //TODO 当前是扇区顺写,数据也要是倒写的,因此,我们需要进行验证流程!! @@ -187,7 +187,7 @@ public abstract class AbsTagWriteModel } } else { int sector = data.getSector(); - int lastBlock = MifareUtils.sectorToBlock(sector) + MifareUtils.getBlockCountInSector(sector) - 1; + int lastBlock = MifareClassicUtils.sectorToBlock(sector) + MifareClassicUtils.getBlockCountInSector(sector) - 1; for (int i = datas.length - 1, j = lastBlock; i >= 0; --i, --j) { //Log.d(LOG_TAG, "写入块" + j); //TODO 当前是扇区倒写,数据也要是倒写的,因此,我们需要进行验证流程!! @@ -205,7 +205,7 @@ public abstract class AbsTagWriteModel if (!retA && !retB) { Log.d(LOG_TAG, "使用AB密钥写入块" + j + "失败!"); } - if (MifareUtils.isTrailerBlock(j)) { + if (MifareClassicUtils.isTrailerBlock(j)) { //写入了尾部块后应当重新截取密钥! if (retA) { keyA = HexUtil.hexStringToByteArray(datas[i].substring(0, 12)); @@ -366,7 +366,7 @@ public abstract class AbsTagWriteModel } String[] datas = data.getDatas(); //验证将要被写入的数据个数是否与卡片的块个数一致 - if (datas.length != MifareUtils.getBlockCountInSector(data.getSector())) { + if (datas.length != MifareClassicUtils.getBlockCountInSector(data.getSector())) { //不一致,需要反馈! Log.d(LOG_TAG, "致命的错误发生在写扇区 " + data + ",要写入的数据个数与标签支持的个数无法成功对应上!"); callback.onFinish(); @@ -374,7 +374,7 @@ public abstract class AbsTagWriteModel } int _sector = data.getSector(); //获得当前扇区最后一个块 - int lastBlock = MifareUtils.sectorToBlock(_sector) + MifareUtils.getBlockCountInSector(_sector) - 1; + int lastBlock = MifareClassicUtils.sectorToBlock(_sector) + MifareClassicUtils.getBlockCountInSector(_sector) - 1; //经过必要写入前步骤判断之后,开始写入,倒着写! for (int i = datas.length - 1, j = lastBlock; i >= 0; --i, --j) { if (DumpUtils.isValidBlockData(datas[i])) { diff --git a/app_main/src/main/java/cn/rrg/rdv/models/StandardNFCTagStateModel.java b/app_main/src/main/java/cn/rrg/rdv/models/StandardNFCTagStateModel.java index c07801d0..54b99fd7 100644 --- a/app_main/src/main/java/cn/rrg/rdv/models/StandardNFCTagStateModel.java +++ b/app_main/src/main/java/cn/rrg/rdv/models/StandardNFCTagStateModel.java @@ -6,13 +6,13 @@ import android.nfc.tech.MifareClassic; import java.io.IOException; import cn.dxl.common.util.IOUtils; -import cn.dxl.mifare.GlobalTag; +import cn.dxl.mifare.NfcTagListenUtils; public class StandardNFCTagStateModel extends AbsTagStateModel { @Override protected boolean checkTagState() { //判断标准设备MF是否存在实例引用 - Tag tag = GlobalTag.getTag(); + Tag tag = NfcTagListenUtils.getTag(); // 直接判断全局的标签状态是否正常! if (tag != null) { //判断能否链接! diff --git a/app_main/src/main/java/cn/rrg/rdv/models/StdNfcInformationsModel.java b/app_main/src/main/java/cn/rrg/rdv/models/StdNfcInformationsModel.java index e6e7c8cf..28b5a50e 100644 --- a/app_main/src/main/java/cn/rrg/rdv/models/StdNfcInformationsModel.java +++ b/app_main/src/main/java/cn/rrg/rdv/models/StdNfcInformationsModel.java @@ -15,7 +15,7 @@ import java.util.Arrays; import cn.dxl.common.util.FileUtils; import cn.dxl.common.util.HexUtil; import cn.dxl.common.util.AppUtil; -import cn.dxl.mifare.GlobalTag; +import cn.dxl.mifare.NfcTagListenUtils; import cn.rrg.rdv.R; import cn.rrg.rdv.callback.TagInformationsCallback; import cn.rrg.rdv.util.Paths; @@ -31,7 +31,7 @@ public class StdNfcInformationsModel { public void collect(TagInformationsCallback callback) { //获得最新的标签对象! - Tag tag = GlobalTag.getTag(); + Tag tag = NfcTagListenUtils.getTag(); int mMFCSupport; if (tag != null) { Log.d(LOG_TAG, "collect调用,卡片存在!"); diff --git a/app_main/src/main/java/cn/rrg/rdv/presenter/AbsTagWritePresenter.java b/app_main/src/main/java/cn/rrg/rdv/presenter/AbsTagWritePresenter.java index 1654f7dc..6efe7fe3 100644 --- a/app_main/src/main/java/cn/rrg/rdv/presenter/AbsTagWritePresenter.java +++ b/app_main/src/main/java/cn/rrg/rdv/presenter/AbsTagWritePresenter.java @@ -1,6 +1,6 @@ package cn.rrg.rdv.presenter; -import cn.dxl.mifare.MifareUtils; +import cn.dxl.mifare.MifareClassicUtils; import cn.rrg.rdv.javabean.M1KeyBean; import cn.rrg.rdv.callback.WriterCallback; import cn.rrg.rdv.models.AbsTagWriteModel; @@ -42,7 +42,7 @@ public abstract class AbsTagWritePresenter extends BasePresenter { if (data != null && keyBeans != null && keyBeans.length > 0 && sector != -1 && block != -1) { writeModel = getWriteModel(); writeModel.reset(); - block = MifareUtils.sectorToBlock(sector) + block; + block = MifareClassicUtils.sectorToBlock(sector) + block; writeModel.writeBlock( view.isWriteManufacturerAllow(), block, keyBeans[0], @@ -76,7 +76,7 @@ public abstract class AbsTagWritePresenter extends BasePresenter { if (data != null && keyBeans != null && keyBeans.length > 0 && sector != -1 && block != -1) { writeModel = getWriteModel(); writeModel.reset(); - block = MifareUtils.sectorToBlock(sector) + block; + block = MifareClassicUtils.sectorToBlock(sector) + block; writeModel.writeBlock(block, data, callback); } } diff --git a/app_main/src/main/java/cn/rrg/rdv/util/DumpUtils.java b/app_main/src/main/java/cn/rrg/rdv/util/DumpUtils.java index 056ac99f..18eca7ab 100644 --- a/app_main/src/main/java/cn/rrg/rdv/util/DumpUtils.java +++ b/app_main/src/main/java/cn/rrg/rdv/util/DumpUtils.java @@ -13,7 +13,7 @@ import java.util.Comparator; import cn.dxl.common.util.FileUtils; import cn.dxl.common.util.HexUtil; import cn.dxl.common.util.RegexGroupUtil; -import cn.dxl.mifare.MifareUtils; +import cn.dxl.mifare.MifareClassicUtils; import cn.rrg.rdv.javabean.M1Bean; import cn.rrg.rdv.javabean.M1KeyBean; @@ -96,7 +96,7 @@ public class DumpUtils { // 根据扇区号来获取相应的空扇区! public static M1Bean getEmptyM1Bean(int sector) { M1Bean ret = new M1Bean(); - int blockCount = MifareUtils.getBlockCountInSector(sector); + int blockCount = MifareClassicUtils.getBlockCountInSector(sector); String[] datas = new String[blockCount]; for (int i = 0; i < blockCount; i++) { datas[i] = i < (blockCount - 1) ? BLANK_DATA : BLANK_TRAIL_BLOCK; @@ -619,10 +619,10 @@ public class DumpUtils { for (int i = 0; i < blockCount; ) { M1Bean bean = new M1Bean(); //获取当前的扇区 - int sector = MifareUtils.blockToSector(i); + int sector = MifareClassicUtils.blockToSector(i); bean.setSector(sector); //获取当前的块数量统计! - int blockCountInSecrot = MifareUtils.getBlockCountInSector(sector); + int blockCountInSecrot = MifareClassicUtils.getBlockCountInSector(sector); String[] dataArray = new String[blockCountInSecrot]; //进行迭代添加! for (int j = i, k = 0; j < blockCountInSecrot; ++j, ++k) { @@ -801,7 +801,7 @@ public class DumpUtils { String[] _tmps = null; for (int i = 0; i < contents.length; ) { // 进行尾部的判断,如果是256的扇区的话我们需要进行偏移量的重新设置! - int count = MifareUtils.getBlockCountInSector(MifareUtils.blockToSector(i)); + int count = MifareClassicUtils.getBlockCountInSector(MifareClassicUtils.blockToSector(i)); if (DumpUtils.isHeader(i)) { //在首部块! bean = new M1Bean(); diff --git a/build.gradle b/build.gradle index 7cb8fa95..23660b03 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ buildscript { } dependencies { //这里指定构建工具支持的版本仓库 - classpath 'com.android.tools.build:gradle:3.6.1' + classpath 'com.android.tools.build:gradle:3.6.2' } } diff --git a/chameleon/build.gradle b/chameleon/build.gradle index 999aa431..65063f8b 100644 --- a/chameleon/build.gradle +++ b/chameleon/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.library' android { compileSdkVersion 29 - buildToolsVersion "29.0.2" + buildToolsVersion "29.0.3" defaultConfig { minSdkVersion 19 @@ -22,9 +22,10 @@ android { dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'com.github.xianglin1998:mfkey:1.1' + implementation 'com.github.xianglin1998:nfctag:1.0' + implementation project(path: ':utils') + implementation project(path: ':communication') implementation 'androidx.appcompat:appcompat:1.1.0' - api project(path: ':mifaretag') - implementation project(path: ':communication') } diff --git a/chameleon/src/main/java/cn/rrg/chameleon/utils/ChameleonDetection.java b/chameleon/src/main/java/cn/rrg/chameleon/utils/ChameleonDetection.java index f7f9e018..493bf349 100644 --- a/chameleon/src/main/java/cn/rrg/chameleon/utils/ChameleonDetection.java +++ b/chameleon/src/main/java/cn/rrg/chameleon/utils/ChameleonDetection.java @@ -5,7 +5,7 @@ import com.dxl.mfkey.Nonce32; import java.util.List; -import cn.dxl.mifare.MifareUtils; +import cn.dxl.mifare.MifareClassicUtils; import cn.rrg.chameleon.javabean.ResultBean; import cn.rrg.chameleon.javabean.DetectionDatas; import cn.dxl.common.util.HexUtil; @@ -126,8 +126,8 @@ public class ChameleonDetection { //如果成功,则拼装解密的结果! ResultBean resultBean = new ResultBean(); resultBean.setId(HexUtil.toHexString(resultUtil.getUid())); - resultBean.setSector(MifareUtils.blockToSector(data1.getBlock())); - resultBean.setBlock(MifareUtils.getIndexOnSector(data1.getBlock(), resultBean.getSector())); + resultBean.setSector(MifareClassicUtils.blockToSector(data1.getBlock())); + resultBean.setBlock(MifareClassicUtils.getIndexOnSector(data1.getBlock(), resultBean.getSector())); resultBean.setKeyA(data1.getType() == 1); resultBean.setKey(key); //拼装完成,进行解密! @@ -162,8 +162,8 @@ public class ChameleonDetection { //如果成功,则拼装解密的结果! ResultBean resultBean = new ResultBean(); resultBean.setId(HexUtil.toHexString(resultUtil.getUid())); - resultBean.setSector(MifareUtils.blockToSector(d1.getBlock())); - resultBean.setBlock(MifareUtils.getIndexOnSector(d1.getBlock(), resultBean.getSector())); + resultBean.setSector(MifareClassicUtils.blockToSector(d1.getBlock())); + resultBean.setBlock(MifareClassicUtils.getIndexOnSector(d1.getBlock(), resultBean.getSector())); resultBean.setKeyA(d1.getType() == 0); resultBean.setKey(key); //拼装完成,进行解密! diff --git a/chameleon/src/main/java/cn/rrg/chameleon/utils/DetectionResult.java b/chameleon/src/main/java/cn/rrg/chameleon/utils/DetectionResult.java index 51bfd7e9..b3e87b7f 100644 --- a/chameleon/src/main/java/cn/rrg/chameleon/utils/DetectionResult.java +++ b/chameleon/src/main/java/cn/rrg/chameleon/utils/DetectionResult.java @@ -6,7 +6,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import cn.dxl.mifare.MifareUtils; +import cn.dxl.mifare.MifareClassicUtils; import cn.rrg.chameleon.javabean.DetectionDatas; import cn.dxl.common.util.HexUtil; @@ -142,7 +142,7 @@ public class DetectionResult { HexUtil.byte2Int(sources, (i + 1) * 16 + 12) )); // skip sectors with 0xFF - if (MifareUtils.validateBlock(dds.getBlock())) + if (MifareClassicUtils.validateBlock(dds.getBlock())) mResultList.add(dds); } //进行数据排序,按照块顺序! diff --git a/console/.gitignore b/console/.gitignore deleted file mode 100644 index 3889eda0..00000000 --- a/console/.gitignore +++ /dev/null @@ -1,62 +0,0 @@ -# Built application files -*.apk -*.ap_ - -# Files for the ART/Dalvik VM -*.dex - -# Java class files -*.class - -# Generated files -bin/ -gen/ -out/ - -# Cmake gen -.cxx/ - -# Gradle files -.gradle/ -build/ - -# Local configuration file (sdk path, etc) -local.properties - -# Proguard folder generated by Eclipse -proguard/ - -# Log Files -*.log - -# Android Studio Navigation editor temp files -.navigation/ - -# Android Studio captures folder -captures/ - -# IntelliJ -*.iml -.idea/ - -# Keystore files -# Uncomment the following line if you do not want to check your keystore files in. -#*.jks - -# External native build folder generated in Android Studio 2.2 and later -.externalNativeBuild - -# Google Services (e.g. APIs or Firebase) -google-services.json - -# Freeline -freeline.py -freeline/ -freeline_project_description.json - -# fastlane -fastlane/report.xml -fastlane/Preview.html -fastlane/screenshots -fastlane/test_output -fastlane/readme.md diff --git a/console/build.gradle b/console/build.gradle deleted file mode 100644 index 522bc2eb..00000000 --- a/console/build.gradle +++ /dev/null @@ -1,30 +0,0 @@ -apply plugin: 'com.android.library' - -android { - compileSdkVersion 29 - buildToolsVersion "29.0.2" - - defaultConfig { - minSdkVersion 19 - targetSdkVersion 29 - versionCode 1 - versionName "1.0" - } - - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - } - debug { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - } - } - -} - -dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation 'androidx.appcompat:appcompat:1.1.0' -} diff --git a/console/proguard-rules.pro b/console/proguard-rules.pro deleted file mode 100644 index f1b42451..00000000 --- a/console/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile diff --git a/console/src/main/AndroidManifest.xml b/console/src/main/AndroidManifest.xml deleted file mode 100644 index cab5590f..00000000 --- a/console/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - diff --git a/console/src/main/java/cn/rrg/console/define/ICommandTools.java b/console/src/main/java/cn/rrg/console/define/ICommandTools.java deleted file mode 100644 index b29fce4d..00000000 --- a/console/src/main/java/cn/rrg/console/define/ICommandTools.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.rrg.console.define; - -/* - * 定义命令行程序的接口! - * */ -public interface ICommandTools { - /** - * 执行一个命令,根据传入的参数! - * @param cmd 命令行,需要被执行的命令 - * @return 程序执行命令可能返回的值 - * */ - int startExecute(String cmd); - - /* - * 当前是否在执行当中! - * @return 是否在运行当中,true or false - * */ - boolean isExecuting(); - - /* - * 停止一个当前正在执行的命令! - * */ - void stopExecute(); -} diff --git a/console/src/main/java/cn/rrg/console/define/ICommandType.java b/console/src/main/java/cn/rrg/console/define/ICommandType.java deleted file mode 100644 index 1c9f15d9..00000000 --- a/console/src/main/java/cn/rrg/console/define/ICommandType.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.rrg.console.define; - -/* - * 类型,对于控制台输出,可能有,1、密钥,2、数据,3、普通文本 - * */ -public interface ICommandType { - //是一个密钥 - boolean isKey(String output); - - //该怎么解析 - String parseKey(String output); - - //是一段数据 - boolean isData(String output); - - //该怎么解析 - String parseData(String output); - - //是普通文本 - boolean isText(String output); - - //该怎么解析 - Runnable parseText(String output); -} diff --git a/console/src/main/res/values/strings.xml b/console/src/main/res/values/strings.xml deleted file mode 100644 index 19df965e..00000000 --- a/console/src/main/res/values/strings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - console - diff --git a/libnfc_pn53x/build.gradle b/libnfc_pn53x/build.gradle index d0ac283f..5da5981f 100644 --- a/libnfc_pn53x/build.gradle +++ b/libnfc_pn53x/build.gradle @@ -36,10 +36,11 @@ android { dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation 'com.github.xianglin1998:nfctag:1.0' + implementation 'com.github.xianglin1998:nfc_console:1.0' + implementation project(path: ':communication') implementation project(path: ':utils') - implementation project(path: ':console') implementation 'androidx.appcompat:appcompat:1.1.0' - implementation project(path: ':mifaretag') } diff --git a/mifaretag/.gitignore b/mifaretag/.gitignore deleted file mode 100644 index 3889eda0..00000000 --- a/mifaretag/.gitignore +++ /dev/null @@ -1,62 +0,0 @@ -# Built application files -*.apk -*.ap_ - -# Files for the ART/Dalvik VM -*.dex - -# Java class files -*.class - -# Generated files -bin/ -gen/ -out/ - -# Cmake gen -.cxx/ - -# Gradle files -.gradle/ -build/ - -# Local configuration file (sdk path, etc) -local.properties - -# Proguard folder generated by Eclipse -proguard/ - -# Log Files -*.log - -# Android Studio Navigation editor temp files -.navigation/ - -# Android Studio captures folder -captures/ - -# IntelliJ -*.iml -.idea/ - -# Keystore files -# Uncomment the following line if you do not want to check your keystore files in. -#*.jks - -# External native build folder generated in Android Studio 2.2 and later -.externalNativeBuild - -# Google Services (e.g. APIs or Firebase) -google-services.json - -# Freeline -freeline.py -freeline/ -freeline_project_description.json - -# fastlane -fastlane/report.xml -fastlane/Preview.html -fastlane/screenshots -fastlane/test_output -fastlane/readme.md diff --git a/mifaretag/build.gradle b/mifaretag/build.gradle deleted file mode 100644 index b5a5f0da..00000000 --- a/mifaretag/build.gradle +++ /dev/null @@ -1,27 +0,0 @@ -apply plugin: 'com.android.library' - -android { - compileSdkVersion 29 - buildToolsVersion "29.0.2" - - defaultConfig { - minSdkVersion 19 - targetSdkVersion 29 - versionCode 1 - versionName "1.0" - - consumerProguardFiles 'consumer-rules.pro' - } - - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - } - } -} - -dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation 'androidx.appcompat:appcompat:1.1.0' -} diff --git a/mifaretag/consumer-rules.pro b/mifaretag/consumer-rules.pro deleted file mode 100644 index e69de29b..00000000 diff --git a/mifaretag/proguard-rules.pro b/mifaretag/proguard-rules.pro deleted file mode 100644 index f1b42451..00000000 --- a/mifaretag/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile diff --git a/mifaretag/src/main/AndroidManifest.xml b/mifaretag/src/main/AndroidManifest.xml deleted file mode 100644 index 67676580..00000000 --- a/mifaretag/src/main/AndroidManifest.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - diff --git a/mifaretag/src/main/java/cn/dxl/mifare/BatchAdapter.java b/mifaretag/src/main/java/cn/dxl/mifare/BatchAdapter.java deleted file mode 100644 index e91400ee..00000000 --- a/mifaretag/src/main/java/cn/dxl/mifare/BatchAdapter.java +++ /dev/null @@ -1,50 +0,0 @@ -package cn.dxl.mifare; - -import java.io.IOException; - -/** - * MifareClassic S50 & S70 batch verity and RW! - * - * @author DXL - * @version 1.0 - */ -public interface BatchAdapter { - /** - * 读取标签 - * - * @param block 读取的起始块 - * 如果all为true,则将会读取该扇区所有块,此时参数一就是扇区的起始块, - * 如果all为false,则将会只读单个块,此时参数一就是块! - * @return 读取结果, 可能为null - */ - byte[][] read(int block, boolean isKeyA, byte[] key, boolean isReadSector) throws IOException; - - /** - * 写入标签 - * - * @param sector 写入的扇区, - * @param data 将被写入的数据,单项必须是16字节长度的Hex字符串 - * @return 写入结果! - */ - boolean write(int sector, boolean isKeyA, byte[] key, byte[] data) throws IOException; - - /** - * 验证标签,使用一定长度的秘钥组 - * - * @param sector 需要验证的扇区号! - * @param keysGroup 被用来验证的秘钥组! - * @param isKeyA 是否是验证秘钥A的 - * @return 验证成功的秘钥! - */ - byte[] verity(int sector, byte[][] keysGroup, boolean isKeyA) throws IOException; - - /** - * 获取批量操作的超时! - */ - int getTimeout(); - - /** - * 设置批量操作的超时! - */ - void setTimeout(int timeout); -} diff --git a/mifaretag/src/main/java/cn/dxl/mifare/GlobalTag.java b/mifaretag/src/main/java/cn/dxl/mifare/GlobalTag.java deleted file mode 100644 index 8a5ad85d..00000000 --- a/mifaretag/src/main/java/cn/dxl/mifare/GlobalTag.java +++ /dev/null @@ -1,44 +0,0 @@ -package cn.dxl.mifare; - -import android.nfc.Tag; - -import java.util.ArrayList; -import java.util.List; - -/** - * 全局的标签缓存! - */ -public class GlobalTag { - private static Tag tag = null; - private static List listeners = new ArrayList<>(); - - public static Tag getTag() { - return tag; - } - - public static void setTag(Tag tag) { - GlobalTag.tag = tag; - } - - public interface OnNewTagListener { - void onNewTag(Tag tag); - } - - public static void addListener(OnNewTagListener listener) { - listeners.add(listener); - } - - public static void removeListener(OnNewTagListener listener) { - listeners.remove(listener); - } - - public static void notifyOnNewTag(Tag tag) { - //直接通知TAG的变化! - for (OnNewTagListener l : listeners) { - try { - l.onNewTag(tag); - } catch (Exception ignored) { - } - } - } -} diff --git a/mifaretag/src/main/java/cn/dxl/mifare/HardNestedAdapter.java b/mifaretag/src/main/java/cn/dxl/mifare/HardNestedAdapter.java deleted file mode 100644 index 6fd96408..00000000 --- a/mifaretag/src/main/java/cn/dxl/mifare/HardNestedAdapter.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.dxl.mifare; - -public interface HardNestedAdapter extends TestTaskAdapter { - /** - * 以一个已知秘钥测试其他的秘钥,使用HardNested漏洞! - * - * @param srcSector 已知的秘钥的扇区 - * @param srcKey 已知的秘钥 - * @param isKeyA 已知的秘钥的类型 - * @param targetSector 欲测试的扇区 - * @param getKeyA 欲获得的扇区的秘钥类型 - */ - byte[] prepare(int srcSector, byte[] srcKey, boolean isKeyA, int targetSector, boolean getKeyA); -} diff --git a/mifaretag/src/main/java/cn/dxl/mifare/MifareAdapter.java b/mifaretag/src/main/java/cn/dxl/mifare/MifareAdapter.java deleted file mode 100644 index 947113bb..00000000 --- a/mifaretag/src/main/java/cn/dxl/mifare/MifareAdapter.java +++ /dev/null @@ -1,179 +0,0 @@ -package cn.dxl.mifare; - -import java.io.IOException; -import java.io.Serializable; - -/* - * MifareClassic定义 - * */ -public interface MifareAdapter extends Serializable { - /* - * 一个标准的MifareClassic - * 是可以被链接,被验证,被读取,被写入,被增值,被减值,被重置的! - * */ - - /** - * 重新查找获取标签! - * - * @return 查找结果! - */ - boolean rescantag() throws IOException; - - /** - * 链接标签 - * - * @return 链接结果! - */ - boolean connect() throws IOException; - - /** - * 断开标签 - */ - void close() throws IOException; - - /** - * 读取标签 - * - * @param block 读取的块 - * @return 读取结果, 可能为null - */ - byte[] read(int block) throws IOException; - - /** - * 写入标签 - * - * @param blockIndex 写入的块, - * @param data 将被写入的数据,必须是16字节长度的Hex字符串! - * @return 写入结果! - */ - boolean write(int blockIndex, byte[] data) throws IOException; - - /** - * 验证密钥A - * - * @param sectorIndex 被验证的块 - * @param key 用来验证的密钥 - * @return 验证结果! - */ - boolean authA(int sectorIndex, byte[] key) throws IOException; - - /** - * 验证密钥B - * - * @param sectorIndex 被验证的块 - * @param key 用来验证的密钥 - * @return 验证结果! - */ - boolean authB(int sectorIndex, byte[] key) throws IOException; - - /** - * 增值 - * - * @param blockIndex 被增值的块 - * @param value 非负递增的值 - */ - void increment(int blockIndex, int value) throws IOException; - - /** - * 增值 - * - * @param blockIndex 被增值的块 - * @param value 非负递减的值 - */ - void decrement(int blockIndex, int value) throws IOException; - - /** - * 恢复增值减值操作 - * - * @param blockIndex 被恢复的块 - */ - void restore(int blockIndex) throws IOException; - - /** - * 转移值数据到块 - * - * @param blockIndex 被转移的块 - */ - void transfer(int blockIndex) throws IOException; - - /** - * 获得UID - * - * @return UID字节数组 - */ - byte[] getUid(); - - byte[] getAts(); - - byte[] getAtqa(); - - byte[] getSak(); - - /** - * 获得类型 - * - * @return 1024 or 2048 or 4096 - */ - int getType(); - - /** - * 获得扇区数量 - * - * @return 卡片支持的扇区容量 - */ - int getSectorCount(); - - /** - * 获得块数量 - * - * @return 卡片支持的块容量 - */ - int getBlockCount(); - - /** - * 设置操作超时 - * - * @param ms 被设置的超时 - */ - void setTimeout(int ms); - - /** - * 获取操作超时 - * - * @return 超时参数 - */ - int getTimeout(); - - /** - * 获取批量操作的实现! - * 如果返回null,则不支持批量! - */ - BatchAdapter getBatchImpl(); - - /** - * 是否是链接状态! - * - * @return 如果卡片已经链接(在部分实现机制上) - * 否则你可以获取结果为true的返回值,否则为false - */ - boolean isConnected(); - - /** - * 是否是仿真卡 - * - * @return true为仿真 - */ - boolean isEmulated(); - - /** - * 是否是后门卡! - * - * @return 是否是后门卡 - */ - boolean isSpecialTag(); - - /** - * 是否是支持测试! - */ - boolean isTestSupported(); -} diff --git a/mifaretag/src/main/java/cn/dxl/mifare/MifareUtils.java b/mifaretag/src/main/java/cn/dxl/mifare/MifareUtils.java deleted file mode 100644 index b9f826d2..00000000 --- a/mifaretag/src/main/java/cn/dxl/mifare/MifareUtils.java +++ /dev/null @@ -1,105 +0,0 @@ -package cn.dxl.mifare; - -/* - * MifareClassic标签用得到的工具! - * */ -public class MifareUtils { - - public static boolean validateSector(int sector) { - // Do not be too strict on upper bounds checking, since some cards - // have more addressable memory than they report. For example, - // MIFARE Plus 2k cards will appear as MIFARE Classic 1k cards when in - // MIFARE Classic compatibility mode. - // Note that issuing a command to an out-of-bounds block is safe - the - // tag should report error causing IOException. This validation is a - // helper to guard against obvious programming mistakes. - - int NR_TRAILERS_4k = 40; - if (sector < 0 || sector >= NR_TRAILERS_4k) { - return false; - } - return true; - } - - public static boolean validateBlock(int block) { - // Just looking for obvious out of bounds... - int NR_BLOCKS_4k = 0xFF; - if (block < 0 || block >= NR_BLOCKS_4k) { - return false; - } - return true; - } - - public static boolean validateValueOperand(int value) { - if (value < 0) { - return false; - } - return true; - } - - public static int blockToSector(int blockIndex) { - if (!validateBlock(blockIndex)) return 0; - if (blockIndex < 32 * 4) { - return (blockIndex / 4); - } else { - return (32 + (blockIndex - 32 * 4) / 16); - } - } - - public static int sectorToBlock(int sectorIndex) { - if (!validateSector(sectorIndex)) { - return -1; - } - if (sectorIndex < 32) { - return (sectorIndex * 4); - } else { - return (32 * 4 + (sectorIndex - 32) * 16); - } - } - - public static boolean isFirstBlock(int uiBlock) { - // 测试我们是否处于小扇区或者大扇区? - if (uiBlock < 128) - return ((uiBlock) % 4 == 0); - else - return ((uiBlock) % 16 == 0); - } - - public static boolean isTrailerBlock(int uiBlock) { - // 测试我们处于小区块还是大扇区 - if (uiBlock < 128) - return ((uiBlock + 1) % 4 == 0); - else - return ((uiBlock + 1) % 16 == 0); - } - - public static int getBlockCountInSector(int sectorIndex) { - if (!validateSector(sectorIndex)) return -1; - if (sectorIndex < 32) { - return 4; - } else { - return 16; - } - } - - public static int get_trailer_block(int uiFirstBlock) { - // Test if we are in the small or big sectors - int trailer_block; - if (uiFirstBlock < 128) { - trailer_block = uiFirstBlock + (3 - (uiFirstBlock % 4)); - } else { - trailer_block = uiFirstBlock + (15 - (uiFirstBlock % 16)); - } - return trailer_block; - } - - public static int getIndexOnSector(int block, int sector) { - int index = 0; - //得到当前的块在扇区中的具体索引! - for (int i = 0; i < getBlockCountInSector(sector); i++) { //得到当前扇区的块总数! - if (block == (sectorToBlock(block) + i)) break; - ++index; - } - return index; - } -} diff --git a/mifaretag/src/main/java/cn/dxl/mifare/NestedAdapter.java b/mifaretag/src/main/java/cn/dxl/mifare/NestedAdapter.java deleted file mode 100644 index 12b2dd65..00000000 --- a/mifaretag/src/main/java/cn/dxl/mifare/NestedAdapter.java +++ /dev/null @@ -1,14 +0,0 @@ -package cn.dxl.mifare; - -public interface NestedAdapter extends TestTaskAdapter { - /** - * 以一个已知秘钥测试其他的秘钥! - * - * @param srcSector 已知的秘钥的扇区 - * @param srcKey 已知的秘钥 - * @param isKeyA 已知的秘钥的类型 - * @param targetSector 欲测试的扇区 - * @param getKeyA 欲获得的扇区的秘钥类型 - */ - void prepare(int srcSector, byte[] srcKey, boolean isKeyA, int targetSector, boolean getKeyA); -} diff --git a/mifaretag/src/main/java/cn/dxl/mifare/PRNGAdapter.java b/mifaretag/src/main/java/cn/dxl/mifare/PRNGAdapter.java deleted file mode 100644 index 441a6824..00000000 --- a/mifaretag/src/main/java/cn/dxl/mifare/PRNGAdapter.java +++ /dev/null @@ -1,5 +0,0 @@ -package cn.dxl.mifare; - -public interface PRNGAdapter extends TestTaskAdapter { - byte[] prepare(int sector, boolean getKeyA); -} \ No newline at end of file diff --git a/mifaretag/src/main/java/cn/dxl/mifare/StdMifareImpl.java b/mifaretag/src/main/java/cn/dxl/mifare/StdMifareImpl.java deleted file mode 100644 index 6c2caa16..00000000 --- a/mifaretag/src/main/java/cn/dxl/mifare/StdMifareImpl.java +++ /dev/null @@ -1,333 +0,0 @@ -package cn.dxl.mifare; - -import android.content.Context; -import android.nfc.NfcAdapter; -import android.nfc.NfcManager; -import android.nfc.Tag; -import android.nfc.tech.MifareClassic; -import android.os.Build; - -import java.io.File; -import java.io.IOException; - -public class StdMifareImpl implements MifareAdapter, GlobalTag.OnNewTagListener { - private static MifareClassic mMfTag = null; - private final static StdMifareImpl stdMifareImpl = new StdMifareImpl(); - - /* - * 此方法需要传入一个TAG,这个TAG将被用来初始化一个MifareClassic标签! - * */ - private StdMifareImpl() { - mMfTag = getMfOfGlobalTag(); - GlobalTag.addListener(this); - } - - public static StdMifareImpl getInstance() { - synchronized (stdMifareImpl) { - mMfTag = getMfOfGlobalTag(); - } - return stdMifareImpl; - } - - private static MifareClassic getMfOfGlobalTag() { - if (mMfTag != null) { - try { - mMfTag.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - Tag tag = GlobalTag.getTag(); - if (tag != null) { - return MifareClassic.get(tag); - } - return null; - } - - /** - * Check if the device supports the MIFARE Classic technology. - * In order to do so, there is a first check ensure the device actually has a NFC hardware - * After this, this function will check if there are files - * like "/dev/bcm2079x-i2c" or "/system/lib/libnfc-bcrm*". Files like - * these are indicators for a NFC controller manufactured by Broadcom. - * Broadcom chips don't support MIFARE Classic. - * - * @return True if the device supports MIFARE Classic. False otherwise. - */ - public static boolean hasMifareClassicSupport(Context context) { - - // Check for the MifareClassic class. - // It is most likely there on all NFC enabled phones. - // Therefore this check is not needed. - /* - try { - Class.forName("android.nfc.tech.MifareClassic"); - } catch( ClassNotFoundException e ) { - // Class not found. Devices does not support MIFARE Classic. - return false; - } - */ - - // Check if ther is any NFC hardware at all. - if (NfcAdapter.getDefaultAdapter(context) == null) { - return false; - } - - // Check if there is the NFC device "bcm2079x-i2c". - // Chips by Broadcom don't support MIFARE Classic. - // This could fail because on a lot of devices apps don't have - // the sufficient permissions. - // Another exception: - // The Lenovo P2 has a device at "/dev/bcm2079x-i2c" but is still - // able of reading/writing MIFARE Classic tags. I don't know why... - // https://github.com/ikarus23/MifareClassicTool/issues/152 - boolean isLenovoP2 = Build.MANUFACTURER.equals("LENOVO") - && Build.MODEL.equals("Lenovo P2a42"); - File device = new File("/dev/bcm2079x-i2c"); - if (!isLenovoP2 && device.exists()) { - return false; - } - - // Check if there is the NFC device "pn544". - // The PN544 NFC chip is manufactured by NXP. - // Chips by NXP support MIFARE Classic. - device = new File("/dev/pn544"); - if (device.exists()) { - return true; - } - - // Check if there are NFC libs with "brcm" in their names. - // "brcm" libs are for devices with Broadcom chips. Broadcom chips - // don't support MIFARE Classic. - File libsFolder = new File("/system/lib"); - File[] libs = libsFolder.listFiles(); - if (libs != null) { - for (File lib : libs) { - if (lib.isFile() - && lib.getName().startsWith("libnfc") - && lib.getName().contains("brcm") - // Add here other non NXP NFC libraries. - ) { - return false; - } - } - } else { - return false; - } - return true; - } - - public static boolean isNfcOpened(Context context) { - if (hasMifareClassicSupport(context)) { - NfcManager manager = (NfcManager) context.getSystemService(Context.NFC_SERVICE); - //判断设备是否支持NFC! - if (manager != null) { - NfcAdapter adapter = manager.getDefaultAdapter(); - // 可能出现adapter为空的情况! - if (adapter != null) { - return adapter.isEnabled(); - } - } - } - return false; - } - - public MifareClassic getMf() { - return mMfTag; - } - - @Override - public boolean rescantag() throws IOException { - Tag tag = GlobalTag.getTag(); - if (mMfTag != null) mMfTag.close(); - if (tag != null) { - mMfTag = MifareClassic.get(tag); - } - return mMfTag != null; - } - - @Override - public boolean connect() throws IOException { - if (mMfTag.isConnected()) mMfTag.close(); - if (mMfTag != null && !isConnected()) { - mMfTag.connect(); - return true; - } - return false; - } - - @Override - public void close() throws IOException { - if (mMfTag != null) - if (isConnected()) - mMfTag.close(); - } - - @Override - public byte[] read(int block) throws IOException { - if (mMfTag != null) - return mMfTag.readBlock(block); - return null; - } - - @Override - public boolean write(int blockIndex, byte[] data) throws IOException { - if (mMfTag != null) { - mMfTag.writeBlock(blockIndex, data); - return true; - } - return false; - } - - private boolean conTest() throws IOException { - boolean con = true; - if (!mMfTag.isConnected()) { - con = connect(); - } - return con; - } - - @Override - public boolean authA(int sectorIndex, byte[] key) throws IOException { - if (mMfTag != null) { - return conTest() && mMfTag.authenticateSectorWithKeyA(sectorIndex, key); - } - return false; - } - - @Override - public boolean authB(int sectorIndex, byte[] key) throws IOException { - if (mMfTag != null) { - return conTest() && mMfTag.authenticateSectorWithKeyB(sectorIndex, key); - } - return false; - } - - @Override - public void increment(int blockIndex, int value) throws IOException { - if (mMfTag != null) - mMfTag.increment(blockIndex, value); - } - - @Override - public void decrement(int blockIndex, int value) throws IOException { - if (mMfTag != null) - mMfTag.decrement(blockIndex, value); - } - - @Override - public void restore(int blockIndex) throws IOException { - if (mMfTag != null) - mMfTag.restore(blockIndex); - } - - @Override - public void transfer(int blockIndex) throws IOException { - if (mMfTag != null) - mMfTag.transfer(blockIndex); - } - - @Override - public byte[] getUid() { - if (mMfTag != null) - return mMfTag.getTag().getId(); - return null; - } - - @Override - public byte[] getAts() { - return new byte[0]; - } - - @Override - public byte[] getAtqa() { - return new byte[0]; - } - - @Override - public byte[] getSak() { - return new byte[0]; - } - - @Override - public int getType() { - if (mMfTag != null) - return mMfTag.getType(); - return -1; - } - - @Override - public int getSectorCount() { - if (mMfTag != null) - return mMfTag.getSectorCount(); - return -1; - } - - @Override - public int getBlockCount() { - if (mMfTag != null) - return mMfTag.getBlockCount(); - return -1; - } - - @Override - public void setTimeout(int ms) { - if (mMfTag != null) - mMfTag.setTimeout(ms); - } - - @Override - public int getTimeout() { - if (mMfTag != null) - return mMfTag.getTimeout(); - return -1; - } - - @Override - public BatchAdapter getBatchImpl() { - // 标准NFC不支持批量验证,所以需要返回null - return null; - } - - @Override - public boolean isConnected() { - synchronized (stdMifareImpl) { - if (mMfTag == null) { - return false; - } - return mMfTag.isConnected(); - } - } - - @Override - public boolean isEmulated() { - return false; - } - - @Override - public boolean isSpecialTag() { - //自带的NFC不支持特殊的后门标签直接读写,因此直接返回false即可! - return false; - } - - @Override - public boolean isTestSupported() { - return false; - } - - @Override - public void onNewTag(Tag tag) { - synchronized (stdMifareImpl) { - if (mMfTag != null) { - if (mMfTag.isConnected()) { - try { - mMfTag.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - mMfTag = getMfOfGlobalTag(); - } - } - } -} diff --git a/mifaretag/src/main/java/cn/dxl/mifare/StdMifareIntent.java b/mifaretag/src/main/java/cn/dxl/mifare/StdMifareIntent.java deleted file mode 100644 index 24596beb..00000000 --- a/mifaretag/src/main/java/cn/dxl/mifare/StdMifareIntent.java +++ /dev/null @@ -1,53 +0,0 @@ -package cn.dxl.mifare; - -import android.app.Activity; -import android.app.PendingIntent; -import android.content.Context; -import android.content.Intent; -import android.nfc.NfcAdapter; -import android.nfc.NfcManager; -import android.nfc.tech.MifareClassic; - -public class StdMifareIntent { - - private NfcAdapter mAdapter = null; - - public StdMifareIntent(Context context) { - NfcManager manager = (NfcManager) context.getSystemService(Context.NFC_SERVICE); - //判断设备是否支持NFC! - if (manager == null) return; - mAdapter = manager.getDefaultAdapter(); - } - - /* - * 获取当前操作的适配器! - * */ - public NfcAdapter getAdapter() { - return mAdapter; - } - - /* - * 注册前台 - * */ - public void enableForegroundDispatch(Activity targetAct) { - if (mAdapter == null) return; - //进行前台广播拦截! - Intent intent = new Intent(targetAct, - targetAct.getClass()).addFlags( - Intent.FLAG_ACTIVITY_SINGLE_TOP); - PendingIntent pendingIntent = PendingIntent.getActivity( - targetAct, 0, intent, 0); - mAdapter.enableForegroundDispatch(targetAct, pendingIntent, null, new String[][]{ - new String[]{MifareClassic.class.getName()}}); - } - - /* - * 解注册前台 - * */ - public void disableForegroundDispatch(Activity activity) { - if (mAdapter == null) return; - //解注册前台拦截 - mAdapter.disableForegroundDispatch(activity); - } - -} diff --git a/mifaretag/src/main/java/cn/dxl/mifare/TagLeaksAdapter.java b/mifaretag/src/main/java/cn/dxl/mifare/TagLeaksAdapter.java deleted file mode 100644 index 0aa75c74..00000000 --- a/mifaretag/src/main/java/cn/dxl/mifare/TagLeaksAdapter.java +++ /dev/null @@ -1,28 +0,0 @@ -package cn.dxl.mifare; - -import java.io.Serializable; - -/** - * @author DXL the TagLeaksAdapter can scan a leak for tag - * impl at subclass - */ -public interface TagLeaksAdapter extends Serializable { - /* - * Darkside test, form a nack(4bit) recovery a key. - * don't need any key. - * if tag no nack response, the darkside can't wrok. - * */ - boolean isDarksideSupported(); - - /* - * Nested test, from a available auth data pack recovery a key. - * need a key - * if tag no prng available, the nested can't running. - * */ - boolean isNestedSupported(); - - /* - * Harden nested, must have a key available and powerful processors. - * */ - boolean isHardnestedSupported(); -} \ No newline at end of file diff --git a/mifaretag/src/main/java/cn/dxl/mifare/TestTaskAdapter.java b/mifaretag/src/main/java/cn/dxl/mifare/TestTaskAdapter.java deleted file mode 100644 index 1723cbf1..00000000 --- a/mifaretag/src/main/java/cn/dxl/mifare/TestTaskAdapter.java +++ /dev/null @@ -1,23 +0,0 @@ -package cn.dxl.mifare; - -import java.io.Serializable; - -public interface TestTaskAdapter extends Serializable { - // start work. - void start(); - - // call at start finished. - void onStart(); - - // on test progress - void progress(int max, int now); - - // stop task and recycle source - void stop(); - - // call at stop finished. - void onStop(int status); - - // return a key if exists. - byte[] getKeys(); -} diff --git a/mifaretag/src/main/res/values/strings.xml b/mifaretag/src/main/res/values/strings.xml deleted file mode 100644 index e79fbce9..00000000 --- a/mifaretag/src/main/res/values/strings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - mifaretag - diff --git a/pm3rdv4rrg/build.gradle b/pm3rdv4rrg/build.gradle index 5cb01894..356fe9e4 100644 --- a/pm3rdv4rrg/build.gradle +++ b/pm3rdv4rrg/build.gradle @@ -39,10 +39,11 @@ android { dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation project(':console') + implementation 'com.github.xianglin1998:nfctag:1.0' + implementation 'com.github.xianglin1998:nfc_console:1.0' + implementation project(':communication') implementation project(path: ':utils') - implementation project(path: ':mifaretag') implementation 'androidx.appcompat:appcompat:1.1.0' } diff --git a/settings.gradle b/settings.gradle index cfccc086..339254c7 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,3 +1,3 @@ -include ':app_main', ':utils', ':console', ':chameleon', ':communication', ':libnfc_pn53x', ':pm3rdv4rrg', ':mifaretag' +include ':app_main', ':utils', ':chameleon', ':communication', ':libnfc_pn53x', ':pm3rdv4rrg' include ':pm3flasher' include ':xmodem'