如何将任何 APDU 命令从当前选定的小程序传递到另一个小程序?

Posted

技术标签:

【中文标题】如何将任何 APDU 命令从当前选定的小程序传递到另一个小程序?【英文标题】:How to pass any APDU command from currently selected applet to another applet? 【发布时间】:2015-05-28 08:51:51 【问题描述】:

问题:假设有多个Applet 实例。当前选择了一个 Applet 实例。是否可以将任何 APDU 命令从选定的 Applet 传递到另一个 Applet 实例?我在 JavaCard API 3.0.4 版中没有找到这样的任何方法。

详细说明:在研究文档“Expresspay Mobile Specifications v1.2”以实现“应用程序选择”服务时,我陷入了以下第 5.3.6 节。由于该文档不是开源的,我引用了选择性部分:

"如果选择了 Expresspay 移动应用程序而不是联系人较少 使用 Partial AID 的接口,然后它应该通过 SELECT 命令 以及对已激活的 Expresspay 移动应用程序的后续命令 实例(可能是也可能不是正在选择的应用程序)。”

它指出我需要将 SELECT 命令从当前选定的小程序传递到另一个小程序(已激活!)。 但是我在 JavaCard API 中没有找到任何可以将任何命令从一个小程序传递到另一个小程序的东西。我在Oracle社区搜索,发现this没有回复!

编辑:假设小程序 A 有三个实例 A1、A2、A3。小程序 A 有一个可共享标志对象 flag,包含“活动”实例的 AID,比如 A2 的 AID。 (假设flag 可能被预初始化)。当前选择了实例 A1。现在终端发送任何 APDU 命令,该命令将到达实例 A1。 A1 将检查flag 并发现flag 包含A2 的AID。因此,A1 会将 APDU 命令传递给 A2 进行进一步处理。我的问题是 A1 实例如何向 A2 实例发送任何 APDU 命令?

【问题讨论】:

您要选择其他实例吗? @Ellisun 不完全是,我需要将 SELECT 命令处理成另一个实例。 您可以将带有File occurrence 位的SELECT 命令发送到Next occurence (部分 AID)SELECT 命令将到达当前选定的小程序,然后它(当前选定的)小程序将决定将命令发送到另一个实例。问:怎么办?这与Next occurence 无关。 我不知道你的要求。 【参考方案1】:

"如果使用 Partial AID 在无接触界面上选择 Expresspay 移动应用程序,则它应将 SELECT 命令和后续命令传递给激活的 Expresspay 移动应用程序实例(可能是也可能不是被选择的应用程序) 。”

到目前为止,我遇到的大多数 Java Card 智能卡都支持通过部分 AID 进行选择(虽然 Java Card RE 规范对此没有要求,但 GlobalPlatform 卡规范(请参阅“基本逻辑通道上的显式选择”部分 em>") 确实要求支持通过部分 AID 进行选择)。因此,SELECT 命令通常会导致当前选定的小程序更改为具有匹配 AID 的小程序。

因此,如果新选择的小程序不一定是“激活的 Expresspay 移动应用程序实例”,那么您可以通过激活的提供的可共享接口传递所有通信/em> 小程序实例。

假设 SELECT(通过部分 AID)命令导致 B 成为当前选定的小程序,而 A 是“激活的”小程序实例。然后,A 将实现一个可共享的接口,并提供一种可用于向 A 传递命令和返回响应的方法。 B 然后可以通过getShareableInterfaceObject(AID of A, ...) 访问该可共享接口,并可以使用该接口调用 A 以便将命令转发给它。但是,实际的 APDU 通信仍然必须在 applet B 中完成。此外,在BA 之间传递命令和响应似乎相当低效。此外,这不会将当前选择的小程序切换到 A,因此后续命令仍将转到 B,并且还需要通过该接口。

似乎更好的方法是让 GlobalPlatform OPEN 处理上述要求(我认为这就是实现的方式)。对于 SELECT(通过部分 AID)命令,OPEN(参见 GP 卡规范的“基本逻辑通道上的显式选择”部分)将自动选择第一个 可选 小程序实例。因此,为了将您的小程序实例之一标记为活动,您实际上将停用非接触式界面的所有其他小程序实例。为此,您的管理小程序(CRS 应用程序)需要具有非接触式激活权限(和/或每个小程序实例都需要非接触式自我激活权限管理自己的激活)。然后,您可以使用 GlobalPlatform API 来管理每个小程序实例的激活状态。请参阅 GP 卡规范的修订 C。 GP卡API有趣的方法好像是GPCLSystem.getGPCLRegistryEntry(AID)GPCLRegistryEntry.setCLState(state)

【讨论】:

以上是关于如何将任何 APDU 命令从当前选定的小程序传递到另一个小程序?的主要内容,如果未能解决你的问题,请参考以下文章

1.2 小程序开发文档与开发工具

小程序开发:上传图片到腾讯云

如何将低级命令(非 APDU)发送到 Windows 10(移动)上的智能卡?

Javacards中关于SELECT APDU命令的一些问题

Django 将选定对象从表单传递到另一个表单

微信小程序开发常见坑