4

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

4

2 回答 2

4

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

于 2011-04-01T12:10:03.353 回答
0

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

于 2011-04-05T14:15:17.177 回答