Online Store

MIFAREクラシックおよびMIFARE Plus ICメモリNDEFデータマッピング方法

MIFAREアプリケーションディレクトリ #

MIFARE Classic および MIFARE Plus IC のメモリ データ マッピング NDEF メソッドは、MIFARE アプリケーション ディレクトリ構造 (MAD) を使用します。

MIFAREアプリケーションディレクトリ(MAD)は、各メモリセクター内に格納されている情報が属するアプリケーションを識別します。

次の 2 つの MIFARE アプリケーションディレクトリが指定されています。

      1. MIFAREアプリケーションディレクトリ1(MAD1):MAD1は、MIFAREクラシック準拠の製品で使用できます。 MAD1はMADセクター(セクター00h)にあり、MAD1が1Kバイトを超えるメモリサイズの製品で使用されている場合、MAD1は1Kバイトのメモリのみを使用してアドレス指定できます。 したがって、残りのメモリは NDEF ストレージには使用されず、空き状態が維持されます。
      2. MIFARE アプリケーション ディレクトリ 2 (MAD2): MAD1 は、メモリ サイズが 1K バイトを超える MIFARE クラシック準拠製品で使用できます。 MAD2は、メモリサイズが1Kバイト以下の製品には適用されません。 MAD2はMADセクター(セクター00hおよび10h)にあります

各アプリケーションに、MAD は一意のアプリケーション識別子 (AID) を関連付けます。 アプリケーション識別子 (AID) は、MAD セクター 00h 内に格納されます。

AID は 2 バイト長で、それぞれ 1 バイトの 2 つのフィールドに分割されます。

  1. アプリケーションが属するクラスターを識別する機能クラスター・コード (1 バイト)
  2. クラスター内のアプリケーションを識別するアプリケーション・コード (1 バイト)。 MAD1 および MAD2 の詳細については、こちらを参照してください。

MAD セクターの汎用バイト (GPB) は、1b に等しい DA ビットで設定されるものとします (DA ビットは GPB の MAD 使用可能なビットです)。

現在使用されていないすべてのセクターは、アクセス条件とキーの意図しない再定義を防ぐために、タグ発行者によって定義された秘密鍵で書き込み保護されるべきです(SHOULD)。 すべてのフリーセクターに異なるキーを使用することをお勧めします。 これにより、すべての無料セクターを解放することなく、一部のセクターを新しいサービスプロバイダーに将来リリースできます。

マッドセクターアクセス #

MAD1 と MAD2 が格納されているメモリ セクタ(「」を参照 [MAD])は、キー A とキー B を使用して保護されます。 メモリセクターによると [MAD] :

        • MAD1: MAD セクターは 00h (セクター 0) であり、
        • MAD2: MAD セクターは 00h と 10h (セクター 0 とセクター 16) です。

誰でもMADセクターを読むことが許されるものとします。 これは、 1 で説明されている公開鍵 A を使用して実現されます (も [MAD]参照してください)。

タブル1. 公開鍵 MAD セクターの値

バイト 0 バイト 1 バイト 2 バイト 3 バイト 4 バイト 5
A0h A1h A2h A3h A4時間 A5h

MAD セクターのアクセス ビットは、次のいずれかに設定されます。

        • 2 で説明されているように、MAD セクターに読み取りおよび書き込みアクセスが許可されている場合、または
        • 3 に示すように、MAD セクタに読み取り専用アクセス権が付与されている場合 ( も参照してください[MF1K, MF4K, MFPLUS])。

この文脈では、付与される読み取りおよび書き込みアクセスという用語は、以前に秘密鍵Bで認証されたMADセクターの場合、セクタートレーラブロックを除くすべてのセクターブロックを読み書きできることを意味します(詳細については、表2を参照してください)。

代わりに、読み取り専用アクセス権付与という用語は、 1 の公開鍵 A または秘密鍵 B で以前に認証された MAD セクターの場合、セクター・トレーラ・ブロックを除くすべてのセクター・ブロックのみを読み取ることができることを意味します (詳細については 、表 5 を参照してください)。

キーAを使用すると、常にMADセクターのブロックを読み取ることしかできません。 セクター トレーラーには、読み取り/書き込みアクセスまたは読み取り専用アクセスが許可されると、特定のアクセス構成があります (表 2 および 3 を参照)。

MADセクターは、秘密鍵B(例えば、タグ発行者によって定義される)によって、またはアクセスビットを使用してMIFAREクラシックおよびMIFARE Plusタグを読み取り専用として設定することによって書き込み保護されるべきである(SHOULD)。

表2. 読み取りおよび書き込みアクセスが許可されたMADセクターのアクセスビット設定

MAD1 または MAD2 のセクター 0 および MAD2 のセクター 16 のアクセス ビット設定
アクセス ビット 発言
C1 0 C20 C30 100bi ブロック 0 はキー A またはキー B で読み取られ、キー B で書き込まれます。
C1 1 C21 C31 100b ブロック 1 はキー A またはキー B で読み取られ、キー B で書き込まれます。
C1 2 C22 C32 100b ブロック 2 はキー A またはキー B で読み取られ、キー B で書き込まれます。
C1 3 C23 C33 011b セクタートレーラーブロック:

  • キーAはキーBで書き込まれ、読み取られることはありません。
  • アクセスビットは、キーAまたはキーBで読み取られ、キーBで書き込まれます。
  • キーBはキーBで書き込まれ、読み取られることはありません。
i. セクター 0(製造元ブロック)アクセス ビット C1 0 C20 C3 0 推奨

表 3. 読み取り専用アクセスが許可された MAD セクターのアクセス ビット設定

MAD1 または MAD2 のセクター 0 および MAD2 のセクター 16 のアクセス ビット設定
アクセス ビット 発言
C1 0 C20 C30 010b ブロック 0 はキー A またはキー B で読み取られます。
C1 1 C21 C31 010b ブロック 1 はキー A またはキー B で読み取られます。
C1 2 C22 C32 010b ブロック 2 はキー A またはキー B で読み取られます。
C1 3 C23 C33 110b セクタートレーラーブロック:

  • キーAは書き込みも読み取りも行われず、
  • アクセスビットはキーAまたはキーBで読み取られ、書き込まれることはありません。
  • キーBは書き込みも読み取りも行われません。
i. セクター 0(製造元ブロック)アクセス ビット C1 0 C20 C3 0 推奨

TLV ブロック #

TLV ブロックは、1 つから 3 つのフィールドで構成されます。

T (タグ フィールド、または T フィールド) は TLV ブロックのタイプを識別し (表 9 を参照)、00h から FFh までの数値をエンコードする 1 バイトで構成されます。 FChおよびFFhへのタグ値01h、02h、04hは、将来の使用のために予約されています。

L (長さフィールド、または L フィールド) は、値フィールドのサイズをバイト単位で提供します。 1バイトまたは3バイトで構成される2つの異なる形式があります。 リーダーデバイスは、すべての2つの長さのフィールド形式を理解するものとします。 図 5 は、2 つの異なる長さのフィールド構造を示しています。 ただし、タグフィールドの値によっては、長さフィールドが存在しない場合があります。

  • 1バイト形式:1バイト形式は、00hバイトからFEhバイトの間の値フィールドの長さをコード化します。 このバイトは、値が 00h から FEh の間の場合、基数として解釈されるものとします。 FFh が含まれている場合、値は、長さフィールドが複数のバイトで構成されることを指定するフラグとして解釈されるものとします。
  • 3 つの連続するバイト形式: この形式は、00FFh バイトから FFFEh バイトの間の値フィールドの長さをコード化する必要があります。 最初のバイトは、さらに2バイトの長さが単語として解釈されることを示すFFhに等しいフラグであると見なされます。 この単語は、値が00FFhとFFFEhの間の場合、基数として解釈されるものとします。 値 FFFFh は、将来の使用 (RFU) のために予約されています。

V(値フィールド、またはVフィールド)長さフィールドが00hに等しい場合、または長さフィールドがない場合、値フィールドは存在しない、つまりTLVブロックは空です。 長さフィールドがあり、ゼロより大きい値フィールド N (N>0) の長さを示す場合、値フィールドは N 個の連続したバイトで構成されます。

表 4 に、このドキュメントで指定されている、次のセクションで説明する TLV ブロックを示します。

表 4. 定義された TLV ブロック

TLV ブロック名 タグフィールド値 短い説明
ヌル TLV 00時 メモリ領域のパディングに使用される可能性があり、リーダーデバイスはこれを無視するものとします
NDEF メッセージ TLV 03時 これには、NDEF メッセージが含まれています。
プロプライエタリTLV ティッカー 機密情報にタグを付ける
ターミネータ TLV フェ データ域内の最後の TLV ブロック

リーダーデバイスは、以下のルールに従って、データ領域内に特定の順序でTLVブロックを書き込むものとします。

  • TLV ブロックは、最小アドレスを持つ NFC セクター (NDEF データを含むセクター) のブロック 0 のバイト 0 から始まる順序で書き込まれるものとします。
  • TLBブロックは、2つ以上のNFCセクターにまたがって記憶することができます。
  • 存在する場合、ターミネーター TLV は MIFARE クラシックおよび MIFARE Plus タグの最後の TLV ブロックです。

NULL TLV とターミネータ TLV は、1 バイト長の唯一の TLV ブロックです (たとえば、タグ フィールドのみで構成される、以下を参照)。

リーダーデバイスは、予約されたタグフィールド値を利用するTLVブロックを無視してジャンプするものとします(上記を参照)。 予約されたタグフィールド値を持つTLVブロックをジャンプするために、リーダーデバイスは長さフィールドを読み取って値フィールドの長さを理解する必要があります。

タグフィールドのみで構成されるTLVブロックの将来の定義は、このアプリケーションノートと下位互換性がありません。

NDEF メッセージ TLV #

少なくとも1つのNDEFメッセージTLVは、MIFAREクラシックおよびMIFAREプラスタグ内に常に存在するものとします。 NDEF メッセージ TLV は、NDEF メッセージを [値] フィールド内に格納します。 リーダーデバイスは、NDEF検出手順によって検出されたNDEFメッセージTLV(必須NDEFメッセージTLVまたは最初のNDEFメッセージTLVとも呼ばれます)を読み取って処理できるものとします。とにかく、さらにNDEFメッセージTLVブロックが存在する可能性があります。 NDEF メッセージ TLV の 3 つの TLV フィールドのエンコーディングの下に、次の値が表示されます。

T は 03h に等しい (表 4 を参照)。

L は、格納されている NDEF メッセージのバイト単位のサイズと等しくなります。

V は NDEF メッセージを格納する必要があります。

空の NDEF メッセージ TLV は、L フィールドが 00h で、V フィールドがない NDEF メッセージ TLV として定義されます(つまり、 [NDEF]V フィールドに NDEF メッセージが存在しません)。

空でない NDEF メッセージ TLV には、空または空でない NDEF メッセージを含めることができます。

プロプライエタリTLV #

プロプライエタリTLVには専有情報が含まれています。 MIFAREクラシックおよびMIFARE Plusタグには、ゼロ、1つ以上のプロプライエタリTLVが含まれるものとします。 リーダー デバイスは、この TLV ブロックに含まれるデータを無視する場合があります。 プロプライエタリTLVの3つのTLVフィールドのエンコーディングを以下に示します。

T は FDh と等しくなければならない (表 4 を参照)。

L は、Vale フィールドの専有データのバイト単位のサイズと等しくなります。

Vには専有データが含まれるものとします。

ヌル TLV #

ヌル TLV は、データ領域の埋め込みに使用できます。 MIFARE クラシックおよび MIFARE プラスタグには、0 個、1 個、または複数の NULL TLV を含めることができます。 リーダーデバイスは、このTLVブロックを無視するものとします。 NULL TLV は、1 バイトのタグ フィールドで構成されます。 NULL TLV のタグ フィールドのエンコーディングの下に、次の値が表示されます。

T は 00h に等しいものとします (表 4 を参照)。

L )は存在してはならない。

Vは存在してはならない。

ターミネータ TLV #

ターミネーターTLVは、MIFAREクラシックおよびMIFARE Plusタグ内に存在する可能性があり、リーダーデバイスはそれを読み取る/処理できるものとします。 ターミネータ TLV は、データ メモリ領域の最後の TLV ブロックです。 ターミネータ TLV は、1 バイトのタグ フィールドで構成されます。 ターミネータTLVのタグフィールドのエンコーディングの下に表示されます。

T は FEh と等しくなければならない (表 4 を参照)。

L )は存在してはならない。

Vは存在してはならない。