【问题标题】:How to get AID for reader Host based card emulation如何为基于主机的读卡器仿真获取 AID
【发布时间】:2015-01-10 14:39:32
【问题描述】:

我正在尝试使用 ACR1281U NFC 标签阅读器在 Android 设备上使用 example 执行 Host card emulation

This 是我想做的那种应用程序。

根据Android文档和示例,需要在Android项目中注册一个AID:

<host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android"
           android:description="@string/servicedesc"
           android:requireDeviceUnlock="false">
    <aid-group android:description="@string/aiddescription"
               android:category="other">
        <aid-filter android:name="F0010203040506"/>
        <aid-filter android:name="F0394148148100"/>
    </aid-group>
</host-apdu-service>

我如何知道我需要在我的 Android 应用程序中注册哪个 AID,以便阅读器可以阅读 HCE Android 应用程序?

这是我发布的另一个问题:No supported card terminal found ARC1281U nfc card reader

我参考了以下链接,但没有太大帮助:

请帮忙,因为 HCE 上可用的资源很少!

编辑

该示例在 SELECT(通过 AID)命令中使用了 AID F0010203040506,但我的 ACR128 阅读器无法读取 HCE 设备。

private static final byte[] CLA_INS_P1_P2 = { 0x00, (byte)0xA4, 0x04, 0x00 };
private static final byte[] AID_ANDROID = { (byte)0xF0, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 };

private byte[] createSelectAidApdu(byte[] aid) {
    byte[] result = new byte[6 + aid.length];
    System.arraycopy(CLA_INS_P1_P2, 0, result, 0, CLA_INS_P1_P2.length);
    result[4] = (byte)aid.length;
    System.arraycopy(aid, 0, result, 5, aid.length);
    result[result.length - 1] = 0;
    return result;
}

然后我将 AID 更改为 F00000000A0101(其他示例应用程序使用过),并在 AID 过滤器中也使用了它。更改为此 AID 后,ACR 阅读器能够检测到 HCE 设备。

  • 两个 AID(在 example 中使用但不起作用的一个,在 app 中使用的另一个)都符合规范,我如何知道要使用哪个 AID?
  • 该示例在 AID 过滤器中添加了多个 AID,但在 SELECT(按 AID)APDU 中仅发送其中一个。我还应该在 AID 过滤器中添加多个 AID 吗?它有什么用?

【问题讨论】:

    标签: android nfc rfid apdu hce


    【解决方案1】:

    AID 是您分配给智能卡应用程序的“名称”(在 HCE 的情况下:模拟卡应用程序的 Android 应用程序)。读卡器应用程序使用此“名称”通过 SELECT(按 DF 名称/AID)APDU 命令来寻址您的卡 (HCE) 应用程序(参见 ISO/IEC 7816-4)。您可以使用任何您想要的值,只要它符合 ISO/IEC 7816-4。

    在您的具体情况下,reader example application 使用 AID F0010203040506

    private static final byte[] AID_ANDROID = { (byte)0xF0, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 };
    

    因此,要与该示例互操作,您需要为 AID F0010203040506 注册 HCE 服务。

    如何分配和使用 AID?

    通常,您首先为您的 HCE 应用定义一个“名称”:

    <host-apdu-service ...>
        <aid-group ...>
            <aid-filter android:name="F0010203040506"/>
        </aid-group>
    </host-apdu-service>
    

    稍后,阅读器应用程序可以使用该名称来选择您的 HCE 应用程序,然后与之通信(在 Java 中,例如使用 Java 智能卡 IO):

    Card card = ...;
    CardChannel c = card.getBasicChannel();
    
    // SELECT by AID (F0010203040506)
    ResponseAPDU  resp = c.transmit(new CommandAPDU(
            0x00, 0xA4, 0x04, 0x00, new byte[] { (byte)0xF0, (byte)0x01, (byte)0x02, (byte)0x03, (byte)0x04, (byte)0x05, (byte)0x06 }));
    assert resp.getSW() == 0x9000;
    
    // Send application-specific command (what such a command could look like depends on your application)
    resp = c.transmit(new CommandAPDU(
            0x80, 0x10, 0x00, 0x00, new byte[] { (byte)0x12, (byte)0x34 }));
    

    您如何得出 AID 的值?

    这取决于您的应用场景。

    • 在您的闭环场景中,您可以完全控制 HCE 端和读取器端,您可以选择任意(请注意,are some rules for AIDs)AID 并将其分配给您的 HCE 应用程序.稍后您可以在阅读器应用程序中使用该 AID 来寻址 HCE 应用程序。

    • 在现实世界的 HCE 场景中,您通常将 HCE 应用程序设计为与现有阅读器基础架构进行交互。因此,您的 HCE 应用程序将实现一些给定的规范。在这种情况下,这样的规范将规定您的 HCE 应用程序需要使用的 AID(或多个 AID)才能被现有的阅读器基础设施发现。这种规范的一个例子是非接触式支付系统的 EMV 规范。

    为什么有些 HCE 应用程序注册了多个 AID?

    有时需要通过多个“名称”(AID) 来寻址应用程序。原因可能是:

    • 一个应用程序提供多个不同的接口(即具有不同的命令集或提供不同的数据)。
    • 现有的阅读器使用(出于某种原因)不同的 AID 来处理相同的应用程序。

    如何选择 AID?

    智能卡应用标识符 (AID) 的规则在 ISO/IEC 7816-4 中定义。一个 AID 至少有 5 个字节,最多可以包含 16 个字节(请参阅 this answer 关于 AID 大小限制)。根据前 4 位,AID 分为不同的组。 ISO/IEC 7816-4 中定义的最相关组是:

    • 'A' 开头的AID:国际注册的AID
    • 'D' 开头的AID:国家注册的AID
    • 'F' 开头的AID:专有AID(无需注册)

    对于(国际)国家注册的 AID,AID 分为两部分,一个 5 字节的强制性 RID(注册的应用程序提供商标识符)和一个可选的最多 11 个字节的 PIX(专有应用程序标识符扩展)。

    对于专有 AID (F...),您可以使用任意值。

    为什么 AID F00000000A0101 有效,而 F0010203040506 无效?

    我不知道,您也没有提供足够的信息来诊断此问题。例如。当您尝试选择 F0010203040506 时,adb 日志中有哪些消息?

    无论如何,这两个 AID 都是有效的并且应该可以工作。一种可能是您的设备上已经安装了另一个 HCE 应用程序,该应用程序注册了该 AID。在这种情况下,两个应用程序会监听同一个名称,这是不可能的。

    【讨论】:

    • 谢谢,你能帮我解答一下我在编辑中添加的疑问,因为你提到的 AID 不起作用
    • @Michael:当您说应该将 AID 分配给您的应用程序时,您的意思是指在手机上运行的 Android 应用程序应该模拟卡,或者您的意思是应该将 AID 分配给窗口应用程序或其他什么是否连续读取 RFID 卡?
    • @MichaelRoland:我的意思是为窗口应用程序分配 AID。我无法弄清楚。但是用你的代码,我会尝试研究所有的可能性。
    • @ShantanuGupta 您没有将 AID“分配”给阅读器应用程序。读卡器应用程序使用 AID 来选择 卡片应用程序。
    • @MichaelRoland:这是否意味着,我需要从阅读器应用程序广播 AID,并且已经在 Android 操作系统中注册的 Android 应用程序将接收阅读器应用程序广播的数据包。我在正确的轨道上吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-28
    • 2013-11-14
    • 2013-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多