有什么方法可以不使用 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()
可能更实际。 然后抛出一个 ISOException
和 SW_CONDITIONS_NOT_SATISFIED
或任何类似的可接受状态词(ISO/IEC 没有指定抛出哪些状态词,不幸的是,只有哪些存在)。
我想将 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()
可能更实际。 然后抛出一个 ISOException
和 SW_CONDITIONS_NOT_SATISFIED
或任何类似的可接受状态词(ISO/IEC 没有指定抛出哪些状态词,不幸的是,只有哪些存在)。