我正在使用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字节,表示还有更多的数据需要获取。
但是这不起作用。我得到的响应代码为0x67 0x00,意思是“长度错误”,并且没有从卡中检索到任何数据。有什么想法吗?
我认为我可以更快地完成这个任务。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,意思是“长度错误”,并且没有从卡中检索到任何数据。有什么想法吗?