2017-05-29 10 views
0

異なるベンダーのスマートカードの束から、いくつかの基本情報を、さまざまなAPDUで読みたいと思います。 国識別スマートカード、EMV(支払い)、携帯電話SIM、javacardなど。異なるSCファミリのスマートカードプロービング:SC状態を消去するコマンド

私はJavaアプリケーションを作成しました。 私は、SCファミリーA B C D Eと同じ名前で、SCの1つの特定ファミリの基本情報を読み取るための正しいAPDUを持つ5つのサブルーチンを呼び出します。

残念ながら、私がルーチンを発行すると、成功した結果に偏ってしまいます。

例:サブルーチンの順序ABCDEで、私はタイプABCDのSCを読むことができる、ではないE.

私はEABCDに実行順序を変更した場合、私はEを読み取ることができますが、今、私はタイプCのSCで失敗

私は理解しています:一部のSCは海外のAPDUを破棄します...他のSCは "ハングする"。

スマートカード(およびリーダー)の状態を消去する基本的なコマンドはありますか?

したがって、サブルーチンの実行順序は出力を変更しませんか?

リセットBリセットCリセットDリセット等

それはATRですか?それはSCの各種類に必須ですか?

+0

これは起こりません。どのカードリーダーを使用していますか?あなたは別のカードリーダーで同じ動作を観察しましたか? – arminb

+0

はい、2種類のカードリーダーです。特定のテストを無視する:これは普遍的なリーダーとカードの状態をリセットする方法ですか? – Massimo

答えて

1

Card.disconnect()メソッドを使用してカードをリセットできます(thisにご注意ください)。

しかし、(IMHO)最良の方法は、(可能であれば)正しいカードファミリーを推測するためにカードATR(Card.getATR()によって与えられる)を使用することです。この方法も非常に高速です。私はいくつかの異なる非接触カード製品を扱うデモにこのアプローチを使用し、それは非常にうまくいった。


いくつかの追加(ランダム)ノート:

  • 研究のすべての家族のための文書は - 確かにそのような行動の理由がなければなりません。いくつかのサブルーチンやAPDUコマンドをスキップしてピンを止めてください。

  • さらに、一部のAPDUは、偶発的に送信されると問題を引き起こす可能性があります(ロックされた秘密コードやロックされた認証の試みなど)。あなたは何をしているのか知っているべきです。

  • ほとんどの製品ファミリには確実に検出する方法があります。マニュアルがある場合は、そのマニュアルを参照してください。

  • 以前に呼び出されたサブルーチンは、選択したアプリケーション/ファイルを変更するにはSELECTを使用し、それを選択したままに成功した場合。サブルーチンのそれぞれの最初に、SELECTを明示的に使用することを検討してください(たとえば、期待されるAIDまたはマスターファイルを選択してください)。

  • DESFireカードは、ネイティブモードを残し、ネイティブでないコマンドAPDUを受信するとラップモードに入ります(通常は、javax.smartcardioを使用するときは通常ISOラップコマンドのようになりません)。

幸運を祈る!

1

スマートカードリーダーは異なるスマートカード間で状態を保持すべきではないため、説明した動作は実際には奇妙に聞こえます。

ただし、スマートカードリーダーを再起動するための汎用コマンドはありません。たとえば、HID OMNIKEYリーダーの場合は、独自のAPDU FF 70 07 6B 08 A2 06 A1 04 A9 02 83 00 00here [7.6.3]を参照してください。ただし、このガイドではOMNIKEY 5022リーダー用ですが、より多くのOMNIKEYリーダーで使用できます)。あなたの読者にとっては、同様の独自のAPDUをインターネットで調べる必要があります。

リーダーを再起動すると、USBリーダーが再列挙される可能性が高いことに注意してください。

関連する問題