ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

在Android上使用NFC软件卡仿真控制完整APDU

2019-05-29 13:14:02  阅读:961  来源: 互联网

标签:android nfc apdu hce acr122


我正忙着一个应用程序来模拟带有CM10.1的Nexus 7上的正常APDU通信到ACR122U102读写器.我发现这个博客关于software card emulation并写了一个应用程序,让我的设备(nexus)显示为卡.现在我正在尝试在此设备和ACR122u之间来回发送消息.到目前为止,我只是通过发送D4 40 01(InDataExchange第127页)APDU来设法与nexus 7进行通信.对于我正在编写的应用程序,这应该足够了.

问题在于我从设备发送给阅读器的答案.使用transcieve函数(带反射的android.nfc.tech.IsoPcdA),我可以回复一个长度为>的字节数组.这将在读取器端显示为正常的InDataExchange响应(例如:D5 41 00 01 02 03,其中{01 02 03}是提供给transcieve功能的字节数组).但我无法控制响应中的状态字节和SW字节(D5 41 XX和两个SW).除了源代码本身之外,没有关于此IsoPcdA类的文档.

我希望能够做的是将XX更改为我选择的字节并发送长度= 0的答案(例如:D5 41 01,没有任何额外数据).可能吗?

解决方法:

我不确定你要在这里实现什么.无论您使用IsoPcdA的收发方法收发什么,都是完整的APDU(在ISO / IEC 7816-4中定义,或者更确切地说是ISO-DEP传输协议中的任何PDU).因此,收发的返回值是完整的C-APDU(命令APDU),并且收发的字节数组参数是包括状态字(SW1 | SW2)的两个字节的完整R-APDU(响应APDU).因此,该参数的最后两个字节是状态字.在您的示例中,SW1将为02,SW2将为03.

您在PN532 NFC控制器的InDataExchange命令中看到的状态字节不是APDU的状态字,而是PN532 NFC控制器内命令执行的状态.此状态字节为您提供有关缓冲区溢出,通信超时等的信息,而不是卡方返回的信息.

编辑:示例代码测试命令:

在Galaxy Nexus(CM 10)上运行的示例代码:

try {
  Class isoPcdA = Class.forName("android.nfc.tech.IsoPcdA");
  Method isoPcdA_get = isoPcdA.getDeclaredMethod("get", Tag.class);

  final IsoPcdA techIsoPcdA = (IsoPcdA)isoPcdA_get.invoke(null, tag);

  if (techIsoPcdA != null) {
    if (mWorker != null) {
      mInterrupt = true;
      mWorker.interrupt();
      try {
        mWorker.join();
      } catch (Exception e) {}
    }

    mInterrupt = false;
    mWorker = new Thread(new Runnable() {
      public void run () {
        try {
          techIsoPcdA.connect();

          byte[] command = techIsoPcdA.transceive(new byte[]{ (byte)0x90, (byte)0x00 });
          Log.d(CardEmulationTest.class.getName(), "Connected.");

          while (!mInterrupt) {
            Log.d(CardEmulationTest.class.getName(), "C-APDU=" + StringUtils.convertByteArrayToHexString(command));
            command = techIsoPcdA.transceive(command);
          }
        } catch (Exception e) {
          Log.e(CardEmulationTest.class.getName(), "Exception while communicating on IsoPcdA object", e);
        } finally {
          try {
            techIsoPcdA.close();
          } catch (Exception e) {}
        }
      }
    });

    mWorker.start();
  }
} catch (Exception e) {
  Log.e(CardEmulationTest.class.getName(), "Exception while processing IsoPcdA object", e);
}

测试(使用ACR122U):

InListPassivTargets(1个目标速率为106kbps)

> FF00000004 D44A 0100 00
< D54B 010100046004088821310578338800 9000

InDataExchange,DATA = 0x01

> FF00000004 D440 01 01 00
< D541 00 01 9000

所以我们从读卡器得到错误代码0x00(InDataExchange命令的状态;不是实际响应APDU的一部分),我们得到0x01作为响应(这是IsoDepA响应APDU),我们得到0x9000作为状态代码读卡器封装器APDU(不是实际响应APDU的一部分).

InDataExchange,DATA = 0x01 0x02

> FF00000005 D440 01 0102 00
< D541 00 0102 9000

所以我们从读卡器得到错误代码0x00(InDataExchange命令的状态;不是实际响应APDU的一部分),我们得到0x01 0x02作为响应(这是IsoDepA响应APDU),我们得到0x9000作为状态代码对于读卡器封装器APDU(不是实际响应APDU的一部分).

InDataExchange,DATA = 0x01 0x02 0x03

> FF00000006 D440 01 010203 00
< D541 00 010203 9000

所以我们从读卡器得到错误代码0x00(InDataExchange命令的状态;不是实际响应APDU的一部分),我们得到0x01 0x02 0x03作为响应(这是IsoDepA响应APDU),我们得到0x9000作为状态读卡器封装器APDU的代码(不是实际响应APDU的一部分).

InDataExchange,DATA = 0x01 0x02 0x03 0x04

> FF00000007 D440 01 01020304 00
< D541 00 01020304 9000

所以我们从读卡器得到错误代码0x00(InDataExchange命令的状态;不是实际响应APDU的一部分),我们得到0x01 0x02 0x03 0x04作为响应(这是IsoDepA响应APDU),我们得到0x9000作为读卡器封装器APDU的状态代码(不是实际响应APDU的一部分).

因此,我们确切地获得了作为命令APDU作为响应APDU发送的数据(请注意,这些APDU都不是根据ISO 7816-4格式化的,但这并不重要,因为IsoPcdA卡仿真适用于任何ISO 14443-4传输协议格式).

状态代码0x9000属于读卡器APDU封装(CLA = FF INS = 00 P1P2 = 0000 Lc [PN542 COMMAND] Le = 00),这是通过CCID(PC / SC)接口访问ACR122U的PN532所必需的.这些是纯读取器命令封装,与ISO-DEP上的通信无关.

D440 01 [DATA]是通过ISO-DEP交换数据(例如APDU)的PN532命令,D541 00 [DATA]是相关的响应.

标签:android,nfc,apdu,hce,acr122
来源: https://codeday.me/bug/20190529/1178166.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有