1

正如此处的 JavaCard 2.2 API 文档中所述,selectingApplet()小程序方法使用该process()方法将选择此小程序的 SELECT APDU 命令与可能与文件或内部小程序状态选择相关的所有其他SELECT APDU 命令区分开来,它返回true如果这个小程序被选中。

我的问题是为什么我们需要这种方法?甚至更笼统:为什么选定的小程序需要接收 SELECT-applet 命令?我认为唯一需要知道SELECT -applet APDUs 的实体是JCRE

我建议以下场景:

  1. JCRECAD接收 APDU 命令
  2. 检查它是否是 SELECT APDU 命令。
  3. 如果不是SELECT APDU 命令,它将接收到的 APDU 发送到process()所选 Applet 的方法。和选定的小程序解释并执行它(使用开关和if表达式,不需要使用selectingApplet()方法)
  4. 如果是SELECT APDU 命令,请检查命令的数据字段的长度以查看它是SELECT File还是SELECT Applet
  5. 如果是SELECT File命令,JCRE将其process()再次发送到所选小程序的方法。但如果是SELECT Applet coomand,JCRE调用deselet()当前选择的 applet 的方法,然后调用select()新请求的 applet 的方法。并在接收到后True,将其选中并等待下一个 APDU 命令。(甚至不需要将先前的SELECT-AppletAPDU 命令发送到process()这个新选择的小程序的方法)

上述实现有什么问题?以及 JC 2.2 中当前实现的优点是什么(将所有接收的 APDU 发送到process()当前选择的小程序的方法并selectingApplet()区分不同的SELECT命令)

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

4

2 回答 2

3

关于你的最后一点:不。
由于 APDU 是另一个 applet 的有效 AID,JCRE 将识别这一事实并且不将其定向到当前 applet,而是取消当前 applet 并选择 AID 引用的另一个 applet 并调用selectingApplet().
selectingApplet()方法是小程序知道它仅在当前APDU 中被选中的唯一方法。
例如,它可用于重置某些文件指针或重置 Securemessaging 和其他身份验证状态。

编辑:我指的是默认的小程序模板,如下所示:

process(){
if(selectingApplet()){
return;
}

所以实际上该方法只是返回一个布尔值,实际上调用了正常的过程方法,但立即终止/完成或其他。

另一方面,select()方法可以被第一次被选中时调用的小程序覆盖。它们之间没有重大差异(我知道),除了 select 被事先调用并且可以拒绝选择小程序因此更强大(可能对小程序间通信有用)

于 2014-11-08T22:35:12.417 回答
3

您可以使用 SELECT 来区分 ATR(全局平台选项)之后的默认选择和通过 SELECT 进行的正常选择。换句话说,区分是在 MF 中还是在应用程序 DF 中。select()在这两种情况下都会调用该方法。

此外,SELECT where P1is different from04可能会向终端返回(FCI/FCP)数据。运行时不知道要返回什么,因为那是特定于应用程序的。

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

于 2014-11-09T18:07:58.567 回答