ISO7816 - 奇怪的INS代码?

时间:2015-05-11 07:38:16

标签: smartcard javacard apdu

我在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字节?

1 个答案:

答案 0 :(得分:2)

经过一番研究后,我将回答我自己的问题。我的问题是Guidot在评论中提到的旧ISO7816-3标准。根据目前的ISO7816-3和ISO7816-4奇数INS代码是有效的。根据当前ISO,唯一无效的INS值为6X和9X。

一些INS代码无效的原因是旧的T = 0协议(许多今天的金雅拓SIM卡使用)。因此,如果您的applet不适用于T = 0协议的卡,您可以使用您喜欢的任何INS代码。

以T = 0协议发送一个数据单元的方式如下:

  1. 终端发送标头(CLA INS P1 P2 P3
  2. 卡会定期发送所谓的“过程字节”,其含义如下:
  3. 60 ...等待下一个程序字节

    6X9X ...完成后,此过程字节是状态字(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协议,则根本不需要注意。