jjzjj

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

coder 2023-11-23 原文

我正在尝试做 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/

有关android - 如何为基于读卡器主机的卡仿真获取 AID的更多相关文章

  1. ruby - 如何为 emacs 安装 ruby​​-mode - 2

    我刚刚为fedora安装了emacs。我想用emacs编写ruby。为ruby​​提供代码提示、代码完成类型功能所需的工具、扩展是什么? 最佳答案 ruby-mode已经包含在Emacs23之后的版本中。不过,它也可以通过ELPA获得。您可能感兴趣的其他一些事情是集成RVM、feature-mode(Cucumber)、rspec-mode、ruby-electric、inf-ruby、rinari(用于Rails)等。这是我当前用于Ruby开发的Emacs配置:https://github.com/citizen428/emacs

  2. ruby - 即使失败也继续进行多主机测试 - 2

    我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r

  3. ruby - 从 Ruby 中的主机名获取 IP 地址 - 2

    我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge

  4. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  5. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  6. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

  7. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  8. ruby-on-rails - 如何为空白字段编写 rspec? [Rails3.1] - 2

    我使用rails3.1+rspec和factorygirl。我对必填字段(validates_presence_of)的验证工作正常。我如何让测试将该事实用作“成功”而不是“失败”规范是:describe"Addanindustrywithnoname"docontext"Unabletocreatearecordwhenthenameisblank"dosubjectdoind=Factory.create(:industry_name_blank)endit{shouldbe_invalid}endend但是我失败了:Failures:1)Addanindustrywithnona

  9. ruby - 允许主机名包含下划线的 URI.parse 的替代方法 - 2

    我正在使用DMOZ的listofurltopics,其中包含一些具有包含下划线的主机名的url。例如:608609TheOuterHeaven610InformationandimagegalleryofMcFarlane'sactionfiguresforTrigun,Akira,TenchiMuyoandotherJapaneseSci-Fianimations.611Top/Arts/Animation/Anime/Collectibles/Models_and_Figures/Action_Figures612虽然此url可以在网络浏览器中使用(或者至少在我的浏览器中可以使用:

  10. ruby - 如何为 pbcopy 生成富文本链接 - 2

    我一直在玩一个脚本,它在Chrome中获取选定的文本并在Google中查找它,提供四个最佳选择,然后粘贴相关链接。它以不同的格式粘贴,具体取决于当前在Chrome中打开的页面-DokuWiki打开的DokuWiki格式,普通网站的HTML,我想要我的WordPress所见即所得编辑器的富文本。我尝试使用pbpaste-Preferrtf来查看没有其他样式的富文本链接在粘贴板上的样子,但它仍然输出纯文本。在文本编辑中保存文件并进行试验后,我想出了以下内容text=%q|{\rtf1{\field{\*\fldinst{HYPERLINK"URL"}}{\fldrsltTEXT}}}|te

随机推荐