2017-05-29 23 views
0

我希望從不同供應商,不同使用情況和不同APDU的一堆智能卡中讀取一些基本信息。 例如:國家鑑定智能卡,EMV(支付),手機SIM,javacard等...使用不同的SC系列進行智能卡探測:清除SC狀態的命令

我寫了一個Java應用程序。 讓我打電話給SC家庭A B C D E,並用同樣的名字命名5個子程序,每個子程序都有正確的APDU來讀取SC的一個特定家庭的基本信息。

不幸的是,我發佈例程的順序偏向於成功的結果。

實施例:用子例程順序ABCDE,我可以讀取類型ABCD,不E.的SC

如果我改變執行順序EABCD,我可以改爲E但現在我失敗,類型C的SC

我明白了:有些SC放棄外來APDU ......其他SC「掛起」。

是否有清除智能卡(和讀卡器)狀態的基本命令?

所以子程序的執行順序不會改變輸出嗎?

A復位B復位C復位D復位等...

是ATR?每種類型的SC都是強制性的嗎?

+0

這不應該發生。你使用哪種讀卡器?你用不同的讀卡器觀察到了同樣的行爲嗎? – arminb

+0

是的,兩種不同的讀卡器。不考慮具體的測試:這是重置讀卡器和卡狀態的通用方法? – Massimo

回答

1

您可以使用Card.disconnect()方法重置卡(當心爲this)。

但是(恕我直言)最好的方法是使用卡片ATR(如Card.getATR()給出的)猜測正確的卡片族(如果可能的話)。這種方式也快得多。我使用這種方法進行處理幾個不同的非接觸式卡產品的演示,並且工作得非常好。


一些額外的(隨機)注意事項:

所有家庭的文檔
  • 研究 - 絕對必須有這種行爲的理由。嘗試跳過一些子例程和/或它們的APDU命令來固定它。

  • 另外,一些APDU在偶然發送時可能會導致問題(例如鎖定的密碼或鎖定的驗證嘗試)。你應該知道你在做什麼。

  • 大多數產品系列都有一些可靠的檢測方法 - 如果您有它,請參閱文檔。

  • 如果之前調用的子例程使用SELECT更改選定的應用程序/文件併成功保持選中狀態。考慮在每個子程序的開始處使用明確的SELECT(例如,選擇預期的AID或主文件)。

  • DESFire卡在接收到非本地命令APDU(這可能不是您的情況,因爲您通常在使用javax.smartcardio時使用ISO wrap命令)時會離開本機模式並進入包裝模式。

祝你好運!

1

您描述的行爲聽起來很奇怪,因爲智能卡讀卡器不應該在不同的智能卡之間保持狀態。

但是,我不知道任何通用命令來重新啓動智能卡讀卡器。例如HID OMNIKEY閱讀器,您可以使用專有的APDU FF 70 07 6B 08 A2 06 A1 04 A9 02 83 00 00(請參閱here [7.6.3])重新啓動,儘管本指南指出它適用於OMNIKEY 5022閱讀器,但它適用於更多OMNIKEY閱讀器)。所以對於你的讀者,你將不得不在互聯網上研究類似的專有APDU。

請記住,閱讀器重新啓動也很可能會導致USB閱讀器重新枚舉。