有没有办法在不使用select APDU命令的情况下选择javacard applet?

时间:2017-08-02 15:57:50

标签: smartcard javacard apdu

我想通过某些界面将applet列入黑名单。我已经阻止使用select APDU,但我想确保没有其他方法可以选择applet。我可以发送任何选择applet作为副作用的APDU吗?

2 个答案:

答案 0 :(得分:2)

如果applet被标记为默认选择的applet,则在ATR / ATS之后自动选择applet。 如果您在阅读器端阻止整个SELECT命令,那么您的其他小程序可能会停止工作,因为您无法再选择它们。

如果您只通过匹配APDU标头 AID来阻止此给定小程序的SELECT命令,那么您应该确保:

  • INS字节为A4
  • P1为04(按DF名称选择)
  • Lc字节和命令数据与AID
  • 匹配
  • Lc字节和命令数据匹配AID的任何子字符串前缀

最后一点被部分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()可能更实际。然后使用ISOExceptionSW_CONDITIONS_NOT_SATISFIEDIsValid任何类似的可接受状态字(ISO / IEC没有指定要抛出哪些状态字,不幸的是,只存在哪些状态字。)