OPSystem.setATRHistBytes在GlobalPlatform兼容卡中如何工作?

问题描述

从GP2.1.1 api文档中引用:

setATRHistBytes
public static boolean setATRHistBytes(byte[] baBuffer,short sOffset,byte bLength)
This method sets the historical bytes of the ATR (Answer To Reset) string. The sequence of bytes will be visible on a subsequent power-up or reset.

Notes:

    This method shall not be invoked from the Applet.install() method.
    
The OPEN locates the entry of the current applet context in the Open Platform Registry and verifies that the application has the "default selected" privilege.
    The OPEN is responsible for updating the length of historical bytes in Format Character T0 of the ATR.

    Parameters:

    baBuffer - the source byte array containing the ATR historical bytes. Must be a global array.
    sOffset - offset of the ATR historical bytes within source byte array.
    bLength - the number of historical bytes.

    Returns:
    true if ATR bytes set,false otherwise.

问题1:GP是否强制认选择小程序来更改ATR历史字节?

问题2:GP仅更改冷复位ATR吗?还是热重置ATR也改变了?

问题3:如何接收卡的热重置ATR?有什么命令吗?是特定于读者的吗?

解决方法

关于1:我以前从未使用过此命令,但是在阅读时:

OPEN在GlobalPlatform注册表中查找当前applet上下文的条目,并 验证该应用程序具有“默认选定”特权。

我认为任何兼容的实现都必须以这种方式进行处理。是否有理由不相信这一点,或者您问大多数供应商是否忽略了这一点?由于历史部分包含与默认选定应用程序相关的信息(例如,具有MF卡,如何读取EF.DR,默认应用程序的AID,发行者所在的国家/地区,...),因此检查此特权是有意义的。今天在多应用程序智能卡世界中可能不合适。

关于2:由于名称“历史字节”指示ATR的仅此部分被更改。冷和热ATR之间的其他部分(如时钟速度)可能会有所不同。

关于3:查看PC / SC命令SCardConnect。参见SCARD_RESET_CARDSCARD_UNPOWER_CARD

,

问题1:GP是否强制默认选择小程序来更改ATR历史字节?

否,Applet必须具有#5特权(或“ GP v2.2中的卡重置特权,请参阅表11-7”)才能更改它。它是在INSTALL期间设置的,并使其成为Selectable。基本上,在启动时需要默认选择它,否则它不能更改ATR历史字节对于多用途卡,这可能是个问题,尽管您可以说这是ISO 7816-4的局限,而协议而不是Java Card /全球平台。

Global Platform规范v2.2中的2个片段:

将“默认选定”特权重新定义为“卡重置”特权,以修改历史字节。应用程序可以拒绝显式选择,例如因为它不支持当前的卡I / O接口,并允许通过OPEN继续(部分)选择过程。为了提供向后兼容性,如果特权尚未授予其他应用程序,则该特权授予隐式选择。

必须存在特权。如果仅安装应用程序且无法使用同一INSTALL命令选择应用程序,则无法设置卡重置权限。

问题2:GP仅更改冷复位ATR吗?还是热重置ATR也更改了?

通常两者都被更改,并且大多数平台至少会将它们初始化为相同的值。请注意,历史字节已更改,通常会指示卡的类型,但不会指示通信参数(速度,超时值等)

问题3:如何接收卡的热重置ATR?有什么命令吗?是特定于读者的吗?

通常,您只需要执行一次复位即可,而无需关闭电源。当然可以使用标准命令(例如SCardReconnect)来完成此操作,但是我不确定其他工具。通常,您只需要执行一次重置即可,对于冷重启,您只需移除存储卡,读卡器或什至只是电源即可。

通常,您不会期望冷重启或热重启之间有所区别,但是当然可以对两者使用不同的ATR(从有关多个Java Card芯片的专有信息中知道)。如果有足够的特权和专有命令的知识,供应商通常可以设置完整的ATR。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...