正如 JavaCard 2.2 API 文档中提到的here http://www.win.tue.nl/pinpasjc/docs/apis/jc222/javacard/framework/Applet.html, selectingApplet()
是小程序使用的方法process()
区分方法SELECT从所有其他小程序中选择此小程序的 APDU 命令SELECT可能与文件或内部小程序状态选择相关的 APDU 命令,如果选择了该小程序,则返回 true。
我的问题是为什么我们需要这个方法?甚至更一般:为什么选择的小程序需要接收 SELECT-applet 命令?我认为唯一需要知道的实体SELECT- 小程序 APDU 是JCRE.
我建议以下场景:
-
JCRE接收来自 APDU 命令CAD
- 检查它是否是 SELECT APDU 命令。
- 如果它不是一个SELECTAPDU命令,它将接收到的APDU发送到
process()
选择Applet的方法。选定的小程序解释并执行它(使用开关和 if 表达式,不需要使用selectingApplet()
method)
- 如果它是一个SELECTAPDU命令,检查命令的Data Field长度,看是否是一个选择文件或者它是一个选择小程序.
- 如果是选择文件命令,JCRE将其发送至
process()
再次选择小程序的方法。但如果它是一个选择小程序命令,JCRE invoke deselet()
当前选择的小程序的方法,然后调用select()
新请求的小程序的方法。并在收到后True
,使其被选中并等待下一个APDU命令。(甚至不需要发送之前的APDU命令SELECT-Applet
APDU 命令至process()
这个新选择的小程序的方法)
上述实现有什么问题吗? JC 2.2 中当前实现的优点是什么(将所有接收 APDU 发送到process()
当前选择的小程序的方法和selectingApplet()
区分不同SELECT命令)
我认为当前的实现提供了一个漏洞!如果程序员以某种方式实现他/她的小程序process()
方法写入所有收到的APDUs in EEPROM,他/她可以检索卡上其他一些安装的小程序的 AID。这是正确的吗?
您可以使用 SELECT 来区分 ATR(全局平台选项)后的默认选择和通过 SELECT 进行的正常选择。换句话说,区分是在 MF 中还是在应用程序 DF 中。方法select()
在这两种情况下都会被调用。
此外,选择其中P1
不同于04
可以向终端返回(FCI/FCP)数据。运行时不知道要返回什么,因为这是特定于应用程序的。
selectingApplet()
非常有用,因为您可以立即看到 Applet 实际上已通过此方法(重新)选择了。如果小程序被重新选择,您可能想要进行一些内部处理,但您肯定不希望返回指示错误的状态字。错误表明 APDU 失败,这与运行时选择小程序的事实不一致。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)