javax.smartcardio case 4 APDU消失 - 6700响应 - 警告

时间:2015-06-25 13:49:57

标签: java smartcard apdu

使用javax.smartcardio类进行智能卡编程时,我遇到了持久性错误 - 当代码看起来很好时,从卡中获取6700(无效长度)和类似的错误代码。示例代码:

    req = new CommandAPDU(0x00, 0xA4, 0x04, 0x00, aid, 0x00);

这应该构造一个案例4 APDU。为什么卡片会像我丢失的东西一样回应?

1 个答案:

答案 0 :(得分:6)

   req = new CommandAPDU(0x00, 0xA4, 0x04, 0x00, aid, 0x00);
     

这应该构造一个案例4 APDU。为什么卡片会像我丢失的东西一样回应?

简短回答

使用aid, 0x100代替aid, 0x00

答案很长(最好喝些咖啡):

这是因为NeLe之间的混淆。 Ne是可以返回给终端的最大字节数。 Ne是一个没有具体表示的数字。 Le然而Ne编码表示形式

现在对于ISO / IEC 7816-4,有一个小技巧:在没有响应数据(RDATA)的ISO情况1或3命令的情况下,Le不存在(无字节)。因此,将Le = 00定义为“无响应数据”是假的。相反,7816-4使用Le = 00表示Ne = 256。同样,Le = 0000(或Le = 000000)表示Ne = 65536,即2 ^ 16。双字节和三字节编码仅用于扩展长度的APDU。

正如您在CommandAPDU constructor中看到的那样,您必须指定Ne,而不是Le。因此,您指定的内容与没有响应数据的说法相同。因此APDU将不会被正确解释为ISO案例4并且命令将失败(在这种情况下正确地,6700正是您应该期望的那样)。

所以只需指定您期望的字节数。如果该值大于256,则需要扩展长度的APDU(或命令链接,但这本身就是一个主题)。当然不支持Ne < 0Ne > 64Ki

请注意,许多协议描述(包括Java Card API )区分了NeLe错误(这已在the Java Card API v3.0.5中得到修复)。这有点奇怪,因为7816-4有很多很多问题,但这不是其中之一。它的说明很清楚。