正如此处的 JavaCard 2.2 API 文档中所述,selectingApplet()
小程序方法使用该process()
方法将选择此小程序的 SELECT APDU 命令与可能与文件或内部小程序状态选择相关的所有其他SELECT APDU 命令区分开来,它返回true如果这个小程序被选中。
我的问题是为什么我们需要这种方法?甚至更笼统:为什么选定的小程序需要接收 SELECT-applet 命令?我认为唯一需要知道SELECT -applet APDUs 的实体是JCRE。
我建议以下场景:
- JCRE从CAD接收 APDU 命令
- 检查它是否是 SELECT APDU 命令。
- 如果不是SELECT APDU 命令,它将接收到的 APDU 发送到
process()
所选 Applet 的方法。和选定的小程序解释并执行它(使用开关和if表达式,不需要使用selectingApplet()
方法) - 如果是SELECT APDU 命令,请检查命令的数据字段的长度以查看它是SELECT File还是SELECT Applet。
- 如果是SELECT File命令,JCRE将其
process()
再次发送到所选小程序的方法。但如果是SELECT Applet coomand,JCRE调用deselet()
当前选择的 applet 的方法,然后调用select()
新请求的 applet 的方法。并在接收到后True
,将其选中并等待下一个 APDU 命令。(甚至不需要将先前的SELECT-Applet
APDU 命令发送到process()
这个新选择的小程序的方法)
上述实现有什么问题?以及 JC 2.2 中当前实现的优点是什么(将所有接收的 APDU 发送到process()
当前选择的小程序的方法并selectingApplet()
区分不同的SELECT命令)
我认为当前的实现提供了一个漏洞!如果程序员以一种方式实现他/她的小程序,其process()
方法将所有接收到的APDU写入EEPROM,他/她可以检索卡上其他已安装小程序的 AID。这是正确的吗?