VERIFY命令用来把传送给智能卡的秘密对象和所存储的基准值相比较,例如PIN。PIN的长度必须在1~8字 节之间,操作系统则对传入的数据串的编码可进行任何种类的测试,这就是说,一个四位的PIN(如为 ‘1234’)可编码为两个BCD字节(‘12’‘34’)或作为四个ASCII字节(‘1’‖‘2’|‘3’‖‘4’= ‘31’‖‘32’‖‘33’‖‘34’)。I/ERIFY命令属于第3类,这就是说,在命令APDU中有一数据部分,而 在响应APDU中没有数据部分。
多可对两个ΠN(PIN NO.1和PIN NO.2)寻址,它们可位于ME的BF Key或当前选择的DE的EF Key之中, 存在MI'的EF Key中的PIN被用来作为智能卡中所有应用的通用PIN,如果是DE的EF Key中存储的PIN,则它 仅可用于在DE内的有关应用,这样的PIN就是应用专用PIN。
每一PIN都有一个重试计数器。对于肯定的比较结果,它被复位为零,对于否定的比较结果,它增量1。如 果重试计数器的状态不是零,则仍将允许的输入PIN尝试次数编码在回送的SW2之中。如果重试计数器已达到 其值,则由一单独的回送代码来表明。
由于Small ̄OS中没有任何命令对重试计数器复位,每当一重试计数器达到其值,则没有任何可能 再进行任何对PIN的进一步比较。取决于应用,这有可能意味着智能卡不能再使用。位于BF Key中的PIN不能 由用户改变,虽然这种可能性在很多智能卡应用中已经很普遍,为此需要一条专门的命令(例如按照 ISO/IEC 7816-8的CHANG REFERENCE DATA),但在ISO/IEC 7816-4标准中并未提供它。
这儿给出的实现,由于简洁性的之故,有一点小小的特色。重试计数器是在EEPROM之中,然而,由于存在 着写错误,对EEPROM写访问不可能总是成功的。结果,在每次写操作之后需要去检查数据以核实是否正确写 人了。如果测试结果是否定的,则设定一适当的回送代码。重试计数器在VERIFY命令中的改变是如此频繁, 以至在伪代码中没有包括这样的测试,因为如果有了错误的话代码间的基本关系已不再清楚,在检查代码时 ,应当记住这一点。
VERIFY命令当然会被预定用来对PIN进行攻击,这儿的实现已经设计得使基于时序行为或电流耗损分析的攻 击成为不可能,重试计数器总是在对接收的PIN和存在BF Key中的基准PIN比较之前被增量,这样保证了不可 能在PIN比较后立即切断对卡的电源供给从而使重使计数器不被增量的做法,因为那样将使一个攻击者对PIN 进行次数无限制的比较。
真正在EEPROM写人过程中对重试计数器的增量决不像乍想起来那么微不足道,重试计数器的编码必须构造 得使之能在写人操作时,或在写人操作前所必需的擦除操作的过程中中断,而不致使重试计数器被复位为初 始的0值。因此,对于操作系统的内部编码必须设计得以EEPROM的能量状态为参考,它也被已知为其安全状态。例如,这就是说对于一个其安全状态为0的 EEPROM,则重试计数器的初始值不能编码为0,如果是的话,就有可能在EEPROM的写操作时,切断供电电压 使重试计数器复位为0。于是,就有可能在较短时期内通过反复试验去确定PIN,因为在不成功的PIN比较中 ,重试计数器不能履行它作为计数器的角色。理论上,原子进程的技术可用来对重试计数器写人。
表1 Small-OS:VERIFY命令情况3的编码
表2 Small-OS:VERIFY命令的响应的编码
表3 Small-OS:遵照ISO 7816-4协议子集N的VERIFY命令的程序代码
欢迎转载,信息来源维库电子市场网(www.dzsc.com)
免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。