HID Omnikey 5321 リーダーを使用して、Mifare DESFire EV1 タグと通信しています。標準データファイルに 16 バイトを書き込みたい。WinSCard DLL (C++) を使用して、ネイティブ DESFire コマンドを ISO 7816 APDU メッセージ構造にラップしています。
既存のファイルにデータを書き込むことができました:
File Nb : 00
Offset : 00 00 00
Length : 10 00 00 (LSB first)
Data (16 bytes) : 23 00 00 00 00 00 00 08 12 34 56 78 00 00 00 00
Native コマンドから CRC を計算します。
Native command : 3D (File Nb) (Offset) (Length) (Data)
CRC = 30 D2 07 00
次に、セッション キーと IV を 00 に設定して暗号化します。
32 bytes data to encipher : (Data) (CRC) 00 00 00 00 00 00 00 00 00 00 00 00
APDU が送信されました:
90 3D 00 00 27 00 00 00 00 10 00 00 (32 bytes enciphered data) 00
しかし、以前に作成したファイルに書き込もうとすると問題が発生します。
Application Master Key による AES 認証の後、2 つのサブキー (K1 と K2) を計算します。IV を 0x00...00 に設定します。次に、2 つのファイルを作成します。
ファイル 0
CMAC calculation :
(CD 00 03 00 21 30 00 00 80 00...00) XOR (K2)
encryption with session key and IV
copy of encryption result into IV
APDU sended : 90 CD 00 00 07 00 03 00 21 30 00 00 00
Creation file 0 OK
ファイル 1
CMAC calculation :
(CD 01 03 00 11 F0 05 00 80 00...00) XOR (K2)
encryption with session key and IV
copy of encryption result into IV
APDU sended : 90 CD 00 00 07 01 03 00 11 F0 05 00 00
Creation file 1 OK
次に、暗号化に IV を使用してファイル 0 にデータを書き込みます。「1E」エラーが発生します。
既存のファイルでデータを読み取ることができました:
CMAC calculation
(BD 00 00 00 00 10 00 00 80 00...00) XOR (K2)
encryption with session key and IV = 0x00...00
copy of encryption result into IV
IV を使用して受信したデータを復号化すると、良好なバイト値が得られます。なので、サブキーK2がいいと思います。
データ書き込みコマンドのどこに問題があるのかわかりません。IVかもしれませんが、理由はわかりません。