如何在Windows智能卡框架中使用扩展的APDU

如何在Windows智能卡框架中使用扩展的APDU,windows,smartcard,winscard,Windows,Smartcard,Winscard,我正在使用WinSCard读取符合ISO 7816标准的智能卡(具体来说,这是一张PIV卡)。卡片上有一张大约12KB的图片。现在,我以T=1模式连接,并使用SCardTransmit函数发送GET DATA APDU命令,然后发送一组GET RESPONSE APDU命令。我最终得到了卡上的所有数据,但SCardTransmit需要40多个调用,因为每次调用只能得到256字节。每个调用大约需要半秒钟才能完成,因此读取12KB的数据最终需要将近20秒 我想我可以做得更快。NIST规范规定“通过读

我正在使用WinSCard读取符合ISO 7816标准的智能卡(具体来说,这是一张PIV卡)。卡片上有一张大约12KB的图片。现在,我以T=1模式连接,并使用SCardTransmit函数发送GET DATA APDU命令,然后发送一组GET RESPONSE APDU命令。我最终得到了卡上的所有数据,但SCardTransmit需要40多个调用,因为每次调用只能得到256字节。每个调用大约需要半秒钟才能完成,因此读取12KB的数据最终需要将近20秒

我想我可以做得更快。NIST规范规定“通过读卡器的接触界面检索12.5kB(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到Bl-2是数据字段的Lc字节
  • Le字段由最后2个字节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,意思是“错误的长度”,并且没有从卡中检索到数据。想法

您尝试发送的扩展APDU是正确的,但您的卡可能不支持扩展APDU。卡上的Java卡版本应高于2.2.2,以便能够发送此类命令

有关更多背景信息(也适用于Windows):

我开始认为我的卡可能不支持您建议的扩展APDU。如果是这种情况,我必须继续使用GET-RESPONSE-APDU,那么它应该像现在这样慢吗?我认为触点接口上的波特率相对较快,肯定不低于每秒1KB,这就是我现在看到的。我将检查卡的ATR以找到实际的波特率。似乎有个瓶颈。我应该在哪里减少阅读时间?