如何在Windows SmartCard Framework中使用扩展APDU

我正在使用WinSCard来读取符合ISO 7816标准的智能卡(具体来说,它是一张PIV卡)。该卡上有一张大约12 KB的图片。现在,我以T = 1模式连接并使用SCardTransmit函数发送我的GET DATA APDU命令,然后发送一堆GET RESPONSE APDU命令。我最终从卡上获取了所有数据,但是对SCardTransmit的调用超过40次,因为每次调用只能获得256个字节。每次调用都需要大约半秒才能完成,因此最终花费大约20秒来读取12 KB的数据。 我想我可以更快地做到这一点。 NIST规范称“通过阅读器的接触界面获取12.5千字节(KB)数据的时间不应超过2.0秒”。规范引用了扩展长度的APDU,所以我认为它是受支持的,但它的使用没有记录。我试图搞清楚,但我无法让它发挥作用。 这是当前命令,它返回256个字节,状态为0x61 0x00,这意味着需要获取更多数据。
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字段由前3个字节组成,其中B2和B3代码为Lc(!= 0)   价值从1到65535   B4到B1-2是数据字段的Lc字节   Le字段包括代码Le值的最后2个字节B1-1和B1   从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,意思是“错误的长度”,并且没有从卡中检索数据。想法?     
已邀请:
您尝试发送的扩展APDU是正确的,但您的卡可能不支持扩展APDU。卡上的Java Card版本应高于2.2.2才能发送此类命令。     
有关更多背景信息(也适用于Windows):http://pcsclite.alioth.debian.org/ccid_extended_apdu.html     

要回复问题请先登录注册