gpt4 book ai didi

android - 如何为基于读卡器主机的卡仿真获取 AID

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:53:09 33 4
gpt4 key购买 nike

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

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 吗?它的用途是什么?

最佳答案

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 的值(value)?

这取决于你的应用场景。

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

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

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

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

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

如何选择 AID?

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

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

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

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

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

我不知道,而且您没有提供足够的信息来对此进行诊断。例如。当您尝试选择 F0010203040506 时,adb 日志中哪里有任何消息?

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

关于android - 如何为基于读卡器主机的卡仿真获取 AID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27877373/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com