如何将任何APDU命令从当前选定的applet传递到另一个applet



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

Details:在研究用于实现"应用程序选择"服务的文档"Expresspay Mobile规范v1.2"时,我被困在下面的5.3.6节中。由于该文档不是开源的,我引用了选择性部分:

"如果选择Expresspay移动应用程序而不是contact less接口使用Partial AID,则需要通过SELECT命令以及向激活的Expresspay移动应用程序发送的后续命令实例(可能是也可能不是所选择的应用程序)。"

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

Edit:假设applet A有三个实例A1, A2, A3。applet A有一个可共享的标志对象flag,其中包含"活动"实例的AID,设为A2的AID。(假设flag可以预初始化)。当前选择了实例A1。现在终端发送任何APDU命令,它将到达实例A1。A1检查flag,发现flag中含有A2的AID。因此,A1将把APDU命令传递给A2进行进一步处理。我的问题是A1实例如何发送任何APDU命令到A2实例?

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

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

所以如果新选择的applet不一定是"激活的 Expresspay移动应用实例",那么你可以通过激活的 applet实例提供的可共享接口传递所有通信。

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

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

最新更新