我想通过某些界面将applet列入黑名单。我已经阻止使用select APDU,但我想确保没有其他方法可以选择applet。我可以发送任何选择applet作为副作用的APDU吗?
答案 0 :(得分:2)
如果applet被标记为默认选择的applet,则在ATR / ATS之后自动选择applet。 如果您在阅读器端阻止整个SELECT命令,那么您的其他小程序可能会停止工作,因为您无法再选择它们。
如果您只通过匹配APDU标头和 AID来阻止此给定小程序的SELECT命令,那么您应该确保:
最后一点被部分AID调用SELECT,它选择匹配AID子字符串的第一个applet(以及之后的下一个)。
[编辑]:重读问题我不确定您是否可能意味着阻止小程序中的选择。我的解决方案是从PCD的角度来使用的。
答案 1 :(得分:1)
通常为NO,除非Applet是默认选择,否则始终使用SELECT by Name(其中名称是应用程序标识符或AID)来选择Applet。这可以使用Applet#selectingApplet()
来检测,即使通过另一个APDU进行选择也应该有效。之后,您可以使用静态APDU.getProtocol()
方法过滤掉不需要的协议。
但是,即使从流程方法中返回错误的状态字,平台也无法停止小程序。所以选择的唯一有意义的答案是SW_NO_ERROR
(当然是SW 9000
)。所以以前的解决方案无法让你随处可见。
在通过流程方法处理SELECT APDU之前,Java Card小程序也将接收对Applet.select()
的调用。但是,您无法在此调用中对协议/媒体做出决定; APDU接口中的静态方法尚不可用。如果可能,则可以通过特定接口阻止选择。所以这也不会让你到任何地方。
最后,简单地为您收到的每个APDU调用APDU.getProtocol()
可能更实际。然后使用ISOException
或SW_CONDITIONS_NOT_SATISFIED
或IsValid
任何类似的可接受状态字(ISO / IEC没有指定要抛出哪些状态字,不幸的是,只存在哪些状态字。)