JAVACARD2.2中chooseApplet()方法的功能是什么

时间:2014-11-08 11:36:18

标签: javacard globalplatform

正如JavaCard 2.2 API文档here中所提到的,selectingApplet()是applet process()方法用来区分 SELECT APDU命令的方法。从所有其他 SELECT APDU命令中选择此applet,这些命令可能与文件或内部applet状态选择有关,如果正在选择此applet,则返回true。

我的问题是为什么我们需要这种方法?甚至更一般:为什么选择的applet需要接收SELECT-applet命令?我认为唯一的实体是需要知道 SELECT -applet APDU是 JCRE

我建议采用以下方案:

  1. JCRE CAD
  2. 接收APDU命令
  3. 检查它是否是SELECT APDU命令。
  4. 如果它不是 SELECT APDU命令,它会将收到的APDU发送到所选Applet的process()方法。并且选定的applet解释并执行它(使用开关和if表达式,不需要使用selectingApplet()方法)
  5. 如果是 SELECT APDU命令,请检查命令的数据字段的长度,以查看它是 SELECT文件还是 SELECT Applet
  6. 如果是 SELECT File 命令, JCRE 会再次将其发送到所选applet的process()方法。但如果它是 SELECT Applet coomand,则 JCRE 调用当前所选applet的deselet()方法,然后调用新请求的applet的select()方法。并且在接收到True之后,将其选中并等待下一个APDU命令。(甚至不需要将先前的SELECT-Applet APDU命令发送到此新选择的小程序的process()方法)
  7. 上述实施有什么问题? JC 2.2中当前实现的优点是什么(将所有接收APDU发送到当前所选applet的process()方法,而selectingApplet()区分不同的 SELECT 命令)< / p>

    我认为目前的实施提供了一个漏洞!如果程序员以process()方法将所有收到的 APDU 写入 EEPROM 的方式实现他/她的applet,他/她可以检索一些AID卡上其他已安装的小程序。这是正确的吗?

2 个答案:

答案 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()

此外,P104不同的SELECT可以向终端返回(FCI / FCP)数据。运行时不知道要返回什么,因为这是特定于应用程序的。

selectingApplet()非常有用,因为您可以立即看到Applet实际上已通过此方法选择(重新)。如果重新选择小程序,您可能需要进行一些内部管理,但您当然不希望返回指示错误的状态字。错误将指示APDU失败,这与运行时选择applet的事实不一致。