如何将扩展 APDU 与 Windows 智能卡框架一起使用

问题描述 投票:0回答:3

我正在使用 WinSCard 读取符合 ISO 7816 标准的智能卡(具体来说,它是 PIV 卡)。该卡上有一张大约 12 KB 的图片。现在,我以 T=1 模式进行连接,并使用 SCardTransmit 函数发送 GET DATA APDU 命令,后跟一堆 GET RESPONSE APDU 命令。我最终从卡上获取了所有数据,但需要 40 多次调用 SCardTransmit,因为每次调用只能获取 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,意思是“长度错误”,并且没有从卡中检索到数据。有想法吗?

windows smartcard winscard
3个回答
4
投票

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


0
投票

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


0
投票

再试一次。

新字节[] { 0x00,//CLA 0xCB, // INS 0x3F // P1 0xFF, // P2 0x05, // LC 0x5C, 0x03, // 数据字段 0x5F、0xC1、0x09、//...(数据) 0x00, 0x00 // 乐 };

© www.soinside.com 2019 - 2024. All rights reserved.