簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM