问题:假设Applet有多个实例。目前选择了一个Applet实例。是否可以将任何APDU命令从选定的Applet传递到另一个Applet实例?我在JavaCard API 3.0.4版中没有找到这样的方法。
详细信息:在研究文档" Expresspay Mobile Specifications v1.2"用于实施应用程序选择'服务,我陷入了以下5.3.6节。由于该文件不是开源的,我引用了选择性部分:
"如果通过联系人选择Expresspay移动应用程序 接口使用Partial AID,然后它将传递SELECT命令 和激活的Expresspay移动应用程序的后续命令 实例(可能是也可能不是被选中的应用程序)。"
它声明我需要将SELECT命令从当前选定的applet传递到另一个applet(已激活!)。 但我没有在JavaCard API中找到任何可以将任何命令从一个applet传递到另一个applet的东西。我搜索了Oracle社区,发现this没有回复!
编辑:假设applet A有三个实例A1,A2,A3。小程序A有一个可共享的标记对象flag
,其中包含AID为"活动"例如,说A2的AID。 (假设flag
可能已预先初始化)。当前选择实例A1。现在终端发送任何APDU命令,该命令将到达实例A1。 A1将检查flag
并找出flag
包含A2的AID。因此,A1会将APDU命令传递给A2进行进一步处理。我的问题是A1实例如何向A2实例发送任何APDU命令?
答案 0 :(得分:5)
"如果使用部分AID通过无接触界面选择Expresspay移动应用程序,则它应将SELECT命令和后续命令传递给激活的Expresspay移动应用程序实例(可能是也可能不是应用程序)被选中)。"
到目前为止我遇到的大多数Java Card智能卡都支持部分AID选择(而Java Card RE规范对此没有要求,GlobalPlatform卡规范(参见" 基本逻辑上的显式选择)频道")确实支持部分AID选择)。因此,SELECT命令通常会使当前选定的applet更改为具有匹配AID的applet。
因此,如果新选择的applet不一定是" 激活的 Expresspay移动应用程序实例",那么您可以通过由共享提供的可共享接口传递所有通信。 已激活小程序实例。
假设SELECT(通过部分AID)命令使 B 成为当前选定的小程序,并且 A 是"已激活" applet实例。然后 A 将实现可共享的接口,并提供一种方法,可用于将命令传递给 A 并从中返回响应。然后, B 可以通过getShareableInterfaceObject(AID of A, ...)
访问该可共享接口,并可以使用该接口调用 A 以便将命令转发给它。实际的APDU通信仍然必须在applet B 中完成。而且,在 B 和 A 之间传递命令和响应似乎相当低效。此外,这不会将当前选定的小程序切换为 A ,因此后续命令仍将转到 B ,并且还需要通过该接口传递。
更好的方法似乎是让GlobalPlatform OPEN处理上述要求(我假设这是如何实现的)。对于SELECT(通过部分AID)命令,OPEN(参见" 基本逻辑通道上的显式选择" GP卡规范)将自动选择第一个可选的小程序实例。因此,为了将您的一个applet实例标记为 active ,您实际上将停用非接触式界面的所有其他applet实例。为此,您的管理小程序(CRS应用程序)需要具有非接触式激活权限(和/或每个小程序实例都需要非接触式自我激活权限管理自己的激活)。然后,您可以使用GlobalPlatform API来管理每个applet实例的激活状态。参见GP卡规范的修正案C. GP卡API的有趣方法似乎是GPCLSystem.getGPCLRegistryEntry(AID)
和GPCLRegistryEntry.setCLState(state)
。