正如JavaCard 2.2 API文档here中所提到的,selectingApplet()
是applet process()
方法用来区分 SELECT APDU命令的方法。从所有其他 SELECT APDU命令中选择此applet,这些命令可能与文件或内部applet状态选择有关,如果正在选择此applet,则返回true。
我的问题是为什么我们需要这种方法?甚至更一般:为什么选择的applet需要接收SELECT-applet命令?我认为唯一的实体是需要知道 SELECT -applet APDU是 JCRE 。
我建议采用以下方案:
process()
方法。并且选定的applet解释并执行它(使用开关和if表达式,不需要使用selectingApplet()
方法)process()
方法。但如果它是 SELECT Applet coomand,则 JCRE 调用当前所选applet的deselet()
方法,然后调用新请求的applet的select()
方法。并且在接收到True
之后,将其选中并等待下一个APDU命令。(甚至不需要将先前的SELECT-Applet
APDU命令发送到此新选择的小程序的process()
方法)上述实施有什么问题? JC 2.2中当前实现的优点是什么(将所有接收APDU发送到当前所选applet的process()
方法,而selectingApplet()
区分不同的 SELECT 命令)< / p>
我认为目前的实施提供了一个漏洞!如果程序员以process()
方法将所有收到的 APDU 写入 EEPROM 的方式实现他/她的applet,他/她可以检索一些AID卡上其他已安装的小程序。这是正确的吗?
答案 0 :(得分:3)
关于你的最后一点:不。
由于APDU是另一个applet的有效AID,JCRE将识别该事实而不是将其指向当前applet,而是取消当前applet并选择AID引用的其他applet并调用selectingApplet()
。 />
selectingApplet()
方法是applet知道在当前 APDU中选择的唯一方法。
例如,它可用于重置某些文件指针或重置Securemessaging和其他身份验证状态。
编辑:我指的是默认的applet模板,如下所示:
process(){
if(selectingApplet()){
return;
}
所以实际上这个方法只是返回一个布尔值,实际上正常的进程方法被调用但是不可能终止/完成或等等。
另一方面,applet可以覆盖select()
方法,该方法将在第一次被选中时调用。它们之间没有主要的差异(我知道),除了select之前被调用并且可以拒绝选择applet因此更强大(可能对Interapplet通信有用)
答案 1 :(得分:2)
您可以使用SELECT来区分ATR(全局平台选项)后的默认选择和SELECT之间的正常选择。换句话说,区分在MF或应用程序DF中。在这两种情况下都会调用方法select()
。
此外,P1
与04
不同的SELECT可以向终端返回(FCI / FCP)数据。运行时不知道要返回什么,因为这是特定于应用程序的。
selectingApplet()
非常有用,因为您可以立即看到Applet实际上已通过此方法选择(重新)。如果重新选择小程序,您可能需要进行一些内部管理,但您当然不希望返回指示错误的状态字。错误将指示APDU失败,这与运行时选择applet的事实不一致。