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

How to pass any APDU command from currently selected applet to another applet?

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

详情: 在研究文档 "Expresspay Mobile Specifications v1.2" 以实现 'Application Selection' 服务时,我卡在了以下第 5.3.6 节。由于该文档不是开源的,我只引用了部分:

"If an Expresspay Mobile Application is selected over the contact less interface using the Partial AID, then it shall pass the SELECT command and subsequent commands to the activated Expresspay Mobile Application instance (which may or may not be the application being selected)."

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

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

"If an Expresspay Mobile Application is selected over the contact less interface using the Partial AID, then it shall pass the SELECT command and subsequent commands to the activated Expresspay Mobile Application instance (which may or may not be the application being selected)."

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

因此,如果新选择的小程序不一定是“activated Expresspay Mobile Application 实例”,那么您可以通过由激活 小程序实例。

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

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