2014/08/09

[felica]FeliCa Lite-Sの相互認証が通った!!

まだ・・・FeliCa Lite-SのMAC_A(W)が計算できていないのだ・・・。

基本的な注意点は、以下。

  • 内部認証時のMAC計算や、読み込み時のMAC_A(R)計算とは異なる。
    • SK2→SK1→SK2の順で3DESする
    • 初期IVはRC1(エンディアン反転)で、初期値はWCNTとブロック番号

まず、前回疑問だった、発行していないのにできるのか?については、「できる」だと考えている。
その根拠は、WCNTレジスタの説明に、1次発行作業中でもMACつき書込が正常で終わると書かれているからだ。「WCNTの動作」という表があり、WCNT==0xFFFFFFになってなければ正常に書き込めるらしい。
今は0xFFFE58とかだから、まだ大丈夫そうだ。

 

では、考えられるのはMAC不一致か、WCNT不一致か。
WCNTは、読み込んだ値をそのまま使うだけなので、考えにくい。
となると、MACが不一致、ということになる。

ここで、スターターマニュアルを読んで気付いたことがある。
カード側に必要条件があるようなのだ。

  • CKブロックにカード鍵が書いてあること
  • STATEブロックがMACつき書込に設定されていること

STATEに? MAC付き書込設定?
MCレジスタを確認すると、MC_STATE_W_MAC_Aという設定があった。
全然気にしていなかったのだが、なんか重要そうだ。


MC_STATE_W_MAC_Aに0x01を書き込むと、STATEブロック書込にMAC必要となるらしい。
つまり、今まで、外部認証の処理だと考えていたシーケンスは、実は「STATEブロックにMAC付き書込を行う」という動作をしているだけだったのだ!
はらはら(目から鱗が落ちる音)。

もし私のMAC_A(W)計算が正しかったのならば、Write without Encryptionレスポンスのステータスフラグ2が0xB2である要因として、「MAC付き書込不要なブロックに対してMAC付き書込を行った」もあるということになる。

では、実証実験を。
・・・・・・・・・・

image

きたーーーーーー!!
Write without EncryptionまでOKで通った!!


では、外部認証へのまとめを。

  1. MC_STATE_W_MAC_Aには0x01を書き込んでおくこと
  2. STATEブロックへ書き込むときのEXT_AUTHは0x01
  3. MAC_A(W)を計算するときのEXT_AUTHは0x01

3番については?と思われるかもしれないが、FeliCa Lite-Sのユーザーズマニュアルには外部認証でのMAC(W)生成の説明に、

  • WCNT値とブロック番号とブロックデータからMAC(W)を生成
  • STATE[0]に01hを、MAC_AブロックにWとWCNT値を書き込む
  • の順で書かれているので、「じゃあMAC(W)を計算するときのSTATE[0]は、現在値なのか書き込む予定の値なのか?」で迷いが生じたのだ。
    しかし、ここまで確認した過程でわかったように、外部認証というのは「STATEレジスタへのMAC付き書込」を指しているので、計算するときは当然書き込む予定の値で行うことになる。

    あー、夏休みの宿題が終わった!

    0 件のコメント:

    コメントを投稿

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