![](/img/trans.png)
[英]How to send low-level command (non-APDU) to a smartcard on Windows 10 (mobile)?
[英]How To Use Extended APDU With Windows SmartCard Framework
我正在使用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字段由最后2個字節Bl-1和B1組成,其代碼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 Card版本應高於2.2.2才能發送此類命令。
有關更多背景信息(也適用於Windows): http : //pcsclite.alioth.debian.org/ccid_extended_apdu.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.