如何使用扩展APDU与Windows智能卡框架

4
我正在使用WinSCard读取符合ISO 7816标准的智能卡(具体来说,是PIV卡)。卡上有一张大约12KB大小的图片。现在,我以T=1模式连接并使用SCardTransmit函数发送我的GET DATA APDU命令,然后是一堆GET RESPONSE APDU命令。最终,我可以获取到卡上所有的数据,但需要调用超过40次SCardTransmit才行,因为每次只能获取256字节。每次调用需要约半秒钟才能完成,所以读取12KB的数据需要近20秒钟。
我认为我可以更快地完成这个任务。NIST规范指出,“通过读卡器接触界面检索12.5千字节(KB)数据的时间不得超过2.0秒”。该规范提到了扩展长度APDU,因此我认为它被支持,但其使用未经记录。我试图搞清楚它的用法,但无法使其工作。
以下是当前命令,它返回带有0x61 0x00状态的256字节,表示还有更多的数据需要获取。
new byte[] {
     0x00,               // CLA
     0xCB,               // INS
     0x3F,               // P1
     0xFF,               // P2
     0x05,               // Lc
     0x5C, 0x03,         // Data Field
     0x5F, 0xC1, 0x09,   // ... (Data)
     0x00                // Le
};

ISO-7815-4规范的第5.3.2部分对编码Le有如下规定:

情况4E - L = 5 + (B2 || B3),(B1) = 0且(B2 || B3) = 0

  • Lc字段由前三个字节组成,其中B2和B3编码Lc(!= 0),值从1到65535
  • B4到Bl-2是数据字段的Lc字节
  • Le字段由最后两个字节Bl-1和Bl组成,编码Le的值为1到65536

我理解为我的命令应该是这样的:

new byte[] {
     0x00,               // CLA
     0xCB,               // INS
     0x3F,               // P1
     0xFF,               // P2
     0x00, 0x00, 0x05,   // Lc
     0x5C, 0x03,         // Data Field
     0x5F, 0xC1, 0x09,   // ... (Data)
     0x00, 0x00          // Le
};

但是这不起作用。我得到的响应代码为0x67 0x00,意思是“长度错误”,并且没有从卡中检索到任何数据。有什么想法吗?
2个回答

4
您尝试发送的扩展APDU是正确的,但您的卡可能不支持扩展APDU。卡上的Java Card版本应该高于2.2.2才能发送这样的命令。

我开始觉得我的卡可能不支持扩展APDU,正如你所建议的那样。如果是这种情况,并且我必须继续使用GET RESPONSE APDU,那么速度应该像现在这样慢吗?我认为接触界面的波特率相对较快,肯定不低于每秒1千字节,但现在我看到的就是这个速度。我将检查卡的ATR以找到实际的波特率。某处似乎存在瓶颈。我应该从哪里着手减少读取时间? - Ben

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接