我在ISO 7816中发现了这些神秘的线条,(http://www.cardwerk.com/smartcards/smartcard_standard_ISO7816-4_5_basic_organizations.aspx#chap5_4):
5.4.2指令字节
命令的指令字节INS应编码为允许 使用ISO / IEC第3部分中定义的任何协议进行传输 7816.表10显示了因此无效的INS代码。
表10 - 无效的INS代码
b8 b7 b6 b5 b4 b3 b2 b1 Meaning x x x x x x x 1 Odd values 0 1 1 0 x x x x '6X' 1 0 0 1 x x x x '9X'
据我所知,我不能使用6X或9X作为INS字节(因为T = 0兼容性?)。
然而,我不知道为什么我不能使用奇数值...这应该作为一种错误检测机制(虽然我没有理由,因为它只是意味着我们应该只使用INS的7个最重要的位字节,所以最低有效位根本不携带任何信息)?
它真的会在现实世界部署中造成任何麻烦吗?您是否见过任何卡片/读卡器/工具,这些卡片/读卡器/工具无法正常使用奇数INS字节?
答案 0 :(得分:2)
经过一番研究后,我将回答我自己的问题。我的问题是Guidot在评论中提到的旧ISO7816-3标准。根据目前的ISO7816-3和ISO7816-4奇数INS代码是有效的。根据当前ISO,唯一无效的INS值为6X和9X。
一些INS代码无效的原因是旧的T = 0协议(许多今天的金雅拓SIM卡使用)。因此,如果您的applet不适用于T = 0协议的卡,您可以使用您喜欢的任何INS代码。
以T = 0协议发送一个数据单元的方式如下:
CLA INS P1 P2 P3
) 60
...等待下一个程序字节
6X
或9X
...完成后,此过程字节是状态字(SW1)的第一个字节
INS
...发送数据部分的下一个字节
INS xor 0xFF
...发送数据部分的所有剩余字节
INS+1
...发送数据部分的下一个字节并打开附加电压(VPP)
(INS+1) xor 0xFF
...发送数据部分的所有剩余字节并打开附加电压(VPP)
这就是为什么根据旧标准INS代码必须不是奇数的(终端设备无法决定最后一个程序字节的含义)。但是,自1990年以来一直没有使用VPP,这就是为什么粗体过程字节不再使用的原因,并且它们没有被提及为ISO标准的最后一个版本。
结论是,您只能使用6XXX或9XXX状态字,并且在使用“旧”T = 0协议时不能使用6X或9X INS代码。奇怪的INS代码是可以的,尽管它们在过去并不好。如果您只使用T = 1协议,则根本不需要注意。