まだ・・・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付き書込」を指しているので、計算するときは当然書き込む予定の値で行うことになる。
あー、夏休みの宿題が終わった!