まだ・・・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付き書込を行った」もあるということになる。
では、実証実験を。
・・・・・・・・・・
きたーーーーーー!!
Write without EncryptionまでOKで通った!!
では、外部認証へのまとめを。
- MC_STATE_W_MAC_Aには0x01を書き込んでおくこと
- STATEブロックへ書き込むときのEXT_AUTHは0x01
- MAC_A(W)を計算するときのEXT_AUTHは0x01
3番については?と思われるかもしれないが、FeliCa Lite-Sのユーザーズマニュアルには外部認証でのMAC(W)生成の説明に、
の順で書かれているので、「じゃあMAC(W)を計算するときのSTATE[0]は、現在値なのか書き込む予定の値なのか?」で迷いが生じたのだ。
しかし、ここまで確認した過程でわかったように、外部認証というのは「STATEレジスタへのMAC付き書込」を指しているので、計算するときは当然書き込む予定の値で行うことになる。
あー、夏休みの宿題が終わった!
FeliCa Lite-Sの相互認証について質問があります。
返信削除記事中に、
「ステータスフラグ2が0xB2である要因として、....」
をもう少し詳しくお教え頂ければと思います。
また、「実証実験を。」の画像が現在見つかりません。
再度、どのように回避したのかをご説明頂ければ助かります。
また、上記のソース等をHP上で公開してますでしょうか?
古い記事にコメントを致しますがご容赦ください。
コメントありがとうございます。
削除ただ、歯切れの良い回答ができるものが無く。。。
・記事の内容について、まったく記憶が残っていない
・画像はGoogleフォトから気付かずに削除して、手元に残っていない
・ソースファイルはGitHubを見た感じではなさそうで、それ以外に残っているかわからない
せっかくなのに、申し訳ないです。
ソースは出てきたら、どこかに載せられるようにします。