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

rak*_*rul 2 apdu smartcard nfc javacard contactless-smartcard

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

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

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

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

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

Mic*_*and 5

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

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

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

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

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