2016/01/10

[nfc]PC/SCを試す (7)

予告通り、Verifyだ。

IC運転免許証の仕様書にあるアクセス方法と、一般的なISO/IEC 7816のアクセス方法に違いがあるかどうかは、比較対象がなくてわからない。
今のところ、以下の順でAPIを使えば動いている。

  1. BeginTransaction
  2. Transmit
  3. EndTransaction

こう書くと、データベースへのアクセスみたいですな。


で、IC運転免許証に対するVerifyだが、使い道は2種類ある。
実際に暗号の認証を行うのと、残り思考可能回数を取得するのとだ。

暗証番号は、実際にアクセスして、間違ったら残り試行可能回数が減る、という作りになっている。
免許証は最大3回まで残り試行可能回数があるので、3回間違えばアクセスできなくなる。
アクセスできなくなった状態を「閉塞状態」と呼ぶようだ。

いきなり書込んで失敗する勇気は私にはないので、まずは回数の取得を行った。
PC/SCのコマンドの実行結果というか、ISO/IEC 7816コマンドの実行結果というかは、SW1=0x90、SW2=0x00が返ってくるのだが、回数の取得の時はSW1=0x63が返ってくる。
0x63の意味は「不揮発性メモリの状態は、変化している」ということなのだが・・・まさか回数取得だけで不揮発性メモリの内容までは変化しないよな?

やってみたが・・・残り試行回数は変化しなかった。
よかったよかった。
今のところ、3回がずっと取得できている。
1回くらい間違えたパスワードを設定して「2」になるのを確認したい気もするが、ちょっと怖い。

それと、3回失敗したら閉塞状態になるのはわかったが、2回失敗して3回目に成功したら思考可能回数は3に戻るのかもわからん。
もしそうなら、他の人が作ったIC運転免許証を読むアプリでアクセスすれば済むのだけど。

 

あと試せるのはREAD BINARYなのだが、もしかしたらMF直下のEF01は読むことができるのかな?
次回はそれを試そう。

7 件のコメント:

  1. コメント失礼します。
    https://github.com/hirokuma/PcscSample01/blob/master/PcscSample01/PcscSample01.cs
    こちらのファイルを勉強しています。
    大変参考になっています。ありがとうございます。

    ところで、不明点があるので、コメントしました。
    よろしくお願いします。

    Verify1 numボタンは回数の取得ですね、
    暗証番号の認証はどうやって行いますか?

    仕様書によるて、Case3のようなので、
    CommandApdu apdu = new CommandApdu(IsoCase.Case3Short, reader.ActiveProtocol)
    {
    CLA = 0x00,
    Instruction = InstructionCode.Verify,
    P1 = 0x00,
    P2 = (byte)(0x80 + ef),
    Data = 暗証番号
    };

    こうな感じですか?
    Lcはいらないですか?(追加できません)
    暗証番号を仮に1234なら、どうやって書き直しますか?

    よければ返事お願いします。
    ありがとうございます。


    PS:外国人なので、間違い日本語使ったら申し訳ございません。

    返信削除
    返信
    1. 日本語で助かります。ありがとうございます。
      Dataは、byte[]で、ASCIIコードにするとよさそうでした。

      CommandApdu apdu = new CommandApdu(IsoCase.Case3Short, reader.ActiveProtocol)
      {
      CLA = 0x00,
      Instruction = InstructionCode.Verify,
      P1 = 0x00,
      P2 = (byte)(0x80 + ef),
      Data = new byte[] { 0x31, 0x32, 0x33, 0x34 }
      };

      削除
    2. 成功しました。
      早速の返事、ありがとうございました。

      削除
  2. 2回目の質問で、失礼します。
    今回は取得したデータの変換です。
    よろしくお願いします。

    DF1 EF1のデータ:
    免許証番号と有効期限などの数字のデータは31→1のように変換すればいけますが...
    氏名の変換はどうやっていけますか?

    自分の考え方はタグ12から、氏名の長さのデータを取得し、
    例「渡邊」の文字列:45-4F-FF-F1
    この文字列を漢字に変換すればいけると思いますが、
    いろいろ試しましたが、どうしてもうもくできでないです。
    変換するために、何か処理が必要ですか?

    よければ、教えていただけますでしょうか?
    ありがとうございます。

    返信削除
    返信
    1. 暗証番号が必要になるデータを読んだことはないのですが、JIS X0208と外字で書くようになっているので、それから変換できるのではないでしょうか。

      削除
    2. 返事ありがとうございます。
      JIS X0208の変換も試しましたが、だめでした。
      引き続き調査します。

      削除
    3. X0208、ではなくX0208と外字、なので、X0208で変換できない文字は外字として変換する必要があるかと思います。

      削除

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。