有什么方法可以不使用 select APDU 命令来 select javacard 小程序吗?

Is there any way to select a javacard applet without using the select APDU command?

我想将 applet 列入黑名单,使其无法通过某些界面 selected。我已阻止使用 select APDU,但我想确保没有其他方法可以 select 小程序。是否有任何 APDU 可以作为副作用发送给 select applet?

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

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

  • INS字节为A4
  • P1 是 04(Select 由 DF-name)
  • Lc 字节和命令数据与 AID 匹配
  • Lc 字节和命令数据匹配 AID 的任何子字符串前缀

最后一点被部分 AID 称为 SELECT,它 select 是第一个与 AID 的子字符串匹配的小程序(以及之后的下一个小程序)。


[编辑]:重读问题我不确定你的意思是不是要从小程序中阻止 selection。我的解决方案旨在从 PCD 的角度使用。

通常否,除非 Applet 是 默认选择的,Applet 的选择始终使用 SELECT 按名称执行(名称是应用程序标识符或 AID ).这可以使用 Applet#selectingApplet() which should work even if selection takes place through another APDU. After that you can use the static APDU.getProtocol() 方法来检测,以过滤掉不需要的协议。

但是,小程序无法停止被平台选中,即使您在处理方法中 return 一个错误的状态词也是如此。所以真正对选择唯一有意义的答案是 SW_NO_ERROR(当然是 SW 9000)。所以以前的解决方案不会让你到任何地方。


在SELECT APDU 被process 方法处理之前,Java Card 小程序也将收到对Applet.select() 的调用。但是,您还不能决定此调用中的协议/媒体; APDU 接口中的静态方法尚不可用。如果那是可能的,那么就可以通过特定界面来阻止选择。所以这也不会让你到任何地方。


最后,为您收到的每个 APDU 简单地调用 APDU.getProtocol() 可能更实际。 然后抛出一个 ISOExceptionSW_CONDITIONS_NOT_SATISFIED 或任何类似的可接受状态词(ISO/IEC 没有指定抛出哪些状态词,不幸的是,只有哪些存在)。