正如在Java卡中提到2.2的API文档这里 , selectingApplet()
是用于由小应用程序的方法process()
方法来区分哪个选择此applet的SELECT APDU命令命令可能涉及到文件或内部小应用程序,从所有其它SELECT APDU状态选择,如果被选中这个小程序就返回true。
我的问题是, 为什么我们需要这个方法? 更一般: 为什么选择小程序需要接收SELECT-applet的命令? 我认为,需要知道选择 -applet APDU的唯一实体是JCRE。
我建议以下情形:
- JCRE从CAD接收APDU命令
- 检查它,看它是否是一个SELECT APDU命令与否。
- 如果它不是一个SELECT APDU命令时,它发送所接收的APDU的
process()
选择的小程序的方法。 和所选择的小应用程序解释并执行它(使用开关,并且如果表达式和没有必要使用selectingApplet()
方法) - 如果它是一个SELECT APDU命令,检查数据字段的长度的命令的,看它是否是一个选择文件或它是一个SELECT的Applet。
- 如果是SELECT文件命令,JCRE其发送到
process()
再次选择小应用程序的方法。 但是,如果它是一个SELECT的Applet coomand,JCRE调用deselet()
当前选择的小应用程序的方法,然后调用select()
的新请求的小程序的方法。 接收后True
,使其选择并等待下一个APDU命令(甚至不需要发送先前SELECT-Applet
APDU命令来process()
这个新选的applet的方法)
有什么不对上述实施? 什么是在JC 2.2当前实现的优点(即发送所有接收的APDU的process()
当前选择的小应用程序的方法和selectingApplet()
区分不同的SELECT命令)
我认为目前的实施提供一个漏洞! 如果程序员实现他/她的小应用程序的方式,其process()
方法在EEPROM中写入所有收到的APDU时,他/她可以检索卡上的其他一些安装小程序的AID。 这是正确的吗?
您可以使用SELECT的ATR(一个全球平台选项)和正常选择,虽然SELECT后默认选择来区分。 换句话说,区分在MF或应用DF是之间。 该方法select()
会在两种情况下被调用。
此外,选择P1
是从不同04
可(FCI / FCP)数据返回给终端。 运行时不知道该怎么回,因为这是专用的。
selectingApplet()
是非常有用的,你可以立即看到小程序实际上得到(再)用这种方法选择。 如果applet被重新选择,你可能需要做一些内部处理,但你肯定不希望返回表示错误的状态字。 错误将表明APDU失败,这是与小应用程序被运行时选择的事实不符。
Regarding your last point: no.
Because of the APDU is a valid AID of another applet, the JCRE will recognize that fact and not direct it to the current applet but deseclect the current applet and select the other applet referenced by the AID and call selectingApplet()
.
The selectingApplet()
method is the only way that the applet knows it got selected in just this current APDU.
For example, it can be used to reset some file pointers or reset Securemessaging and other authentication status.
edit: i was referring to the default applet template, that goes like this:
process(){
if(selectingApplet()){
return;
}
So actually the method is just returning a boolean and in fact the normal process method is called but immidiatly terminated/finished or whatever.
On the other hand, select()
method can be overwritten by the applet which will be called the first time its gets selected. There are no major diffrences between them(that i know) except that select gets called prior and can deny selection of th applet thus is more powerful(Might be useful for Interapplet communication)