如何在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,意思是“错误的长度”,并且没有从卡中检索数据。想法?
没有找到相关结果
已邀请:
2 个回复
鞋扣蚊冈借
森含械