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

时间:2011-03-30 21:45:15

标签: windows smartcard winscard

我正在使用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到Bl-2是数据字段的Lc字节
  •   
  • Le字段由代码Le值的最后2个字节Bl-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,意思是“错误的长度”,并且没有从卡中检索数据。想法?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

有关更多背景信息(也适用于Windows):http://pcsclite.alioth.debian.org/ccid_extended_apdu.html

相关问题