19.10.2024

Der Mifare Classic Chip -
Speicherstruktur und Vorbereitung für NDEF

Der Schnellste Weg eine Mifare Classic (1K) für NDEF vorzubereiten ist, das Mifare Classic Tool (Android) zu installieren und die hier verlinkte MCT-Datei mit den Keys (ohne die UID) draufzuschreiben.

Wer auch noch die technischen Hintergründe verstehen will, für den ist die folgende Anleitung gedacht. Die Anleitung basiert auf Publikationen von NXD zu diesem Thema, die aber für Einsteiger nicht immer einfach zu lesen sind.

Allgemeines zur Mifare Classic und NDEF

Was ist die Mifare Classic?

Die Mifare Classic (MC) vom Hersteller NXP ist ein Chip, der über Nearfield Communication (NFC) kontaktlos kommunizieren kann. Im Kern ist die MC eine RFID-fähige Speicherkarte ohne nennenswerte darüber hinausgehende Fähigkeiten. Es gibt noch einige Abwandlungen und Variante. Die häufigste ist die MC 1K (Herstellerkennung: MF1ICS50), die auch als S50 vermarktet wird.

Wie ist der Speicher strukturiert?

Der Speicher ist in Sektoren gegliedert, die jeweils vier Blocks mit je 16 Byte enthalten. Die Nummerierung beginnt jeweils mit 0. Der zweite Block im ersten Sektor ist also Sektor 0, Block 1. Es gibt die MC in der Größe 1K (=1024 Byte in 16 Sektoren) und 4k (= 4096 Byte in 64 Sektoren), wobei ein Teil des Speichers für Systemdaten verwendet wird. Effektiv können dadurch nur 720 Byte bzw. 2976 Byte für Nutzdaten verwendet werden. Die 4k-Variante unterscheidet sich lediglich darin, dass es mehr Sektoren gibt. Bei beiden Karten ist der Sektor 0 für Systemdaten reserviert. Bei der 4k-Variante ist zudem auch der Sektor 16 hierfür reserviert. Außerdem enthält der Block 3 in jedem Sektor Zugriffsinformationen. Für Nutzdaten können also lediglich die Blocks 0 bis 3 der Sektoren 1 bis 15 bzw. bei der 4k-Variante der Sektoren 1 bis 63, ohne Sektor 16 verwendet werden.

Wie sicher ist die MC?

Die MC ist nicht sicher. Es gibt zwar eine Verschlüsselung der Sektoren, diese ist aber so schwach bzw. gebrochen, dass sie praktisch als unverschlüsselt gelten muss. Die über NDAV bereitgestellten Daten sind zudem per Prinzip schon ohne Sicherung zugänglich.

Was ist NDEF und wofür braucht man das?

Das NFC Data Exchange Format (NDEF) ist ein Protokoll, um über NFC strukturierte Daten bereitzustellen. Das Format ist heute Neben dem EMV-Standard (Europay, MasterCard, and Visa) für den Zahlungsverkehr eines der verbreitetsten Protokoll für den Datenaustausch über NFC.

Kann man die MC für NDEF nutzen?

Ja. Die MC verwendet zwar ein proprietäres Protokoll und erfüllt nicht den NFC-Standards. Sie ist auch nicht genuin darauf ausgelegt NDEF Bereitzustellen. Man kann aber die Karte so vorbereiten, dass sie Daten im NDEF-Format bereitstellen kann. Allerding solle es manchmal Probleme mit manchen Lesern geben. In der Praxis hatte ich bisher aber keine Probleme.

Was ist die Alternative, wenn ich eine Karte Brauche, die NDEF bereitstellen soll?

Es gibt andere Chips, die NDEF genuin bereitstellen. Von NXP wären dies z.B. die Chips der NTAG-Familie.

Grundsätzlicher Aufbau des Sektor 0

Die Bytes werden hier (abweichend von anderen Beschreibungen) von links nach recht gezählt. Sektor 0, Block 0, Byte 0 hat also in der Grafik den Hexadezimalwert A2h.

Sektor 0, Block 0

Dieser Block enthält die eindeutige UID (Unique Identifier), die eigentlich nicht änderbar ist. Man kann aber mittlerweile Karten, so genannte "magic tags" kaufen, bei denen auch die UID geändert werden kann. Wenn dies mit bestimmen Steuerbefehlen möglich ist, nennt man diese "gen1". Wenn dies als einfacher Schreibvorgang möglich ist, heißen sie "gen2". Mit Android-Smartphones lassen sich zumeist nur bei den gen2-Varianten die UID ändern. Die "gen1-Varianten lassen sich aber beispielsweise mit einem Flipper ändern.
Sektor 0, Block 0: UID (einmalig)

Sektor 0, Block 1 und Block 2

Hier liegt das MAD (MIFARE Application Directory), das Informationen darüber enthält, welche Sektoren für welche Anwendungen vorgesehen sind.

Das CRC-Byte (Byte 0)

Das erste Byte des Blocks ist eine CRC-8-Byte (Cyclic Redundancy Check). Es errechnet sich aus den Werten von Sektor 0, Block 1, Byte 1 (das ist das Info-Byte) und allen nachfolgenden Bytes über das Blockende hinaus bis zum Ende des Block 2. Dafür wird ein eigenes CRC-8/MIFARE-MAD-Verfahren angewendet. Ein Tool zur Berechnung findet sich hier: https://crccalc.com. Bei einem Info-Byte von 00h und der Benutzung von allen 15 Sektoren für NDAV ergibt sich ein CRC-Byte von 0F h.

Das Info-Byte (Byte 1)

Das Info-Byte enthält Informationen zum Kartenherausgeber, die in einem der Sektoren auf der Karte abgelegt werden können. Dabei sind die ersten sechs Bit (0-5) dafür vorgesehen, den Nummer des Sektors anzugeben. Die letzten zwei Bit (6-7) bleiben frei. Wenn kein Sektor zusätzliche Informationen enthält, ist der Wert 00 h.

Die Sektorinformationen (Block 1, Byte 2 bis Block 2, Byte 15)

Für jeden Sektor ist eine feste Stelle im MAD von jeweils 2 Byte reserviert, die den AID (Application Identifier) enthalten. Der ID gibt Auskunft darüber, welchen Anwendungszweck der Sektor hat. Die Informationen für den Sektor 1 liegen im Sektor 0, Block 1, Byte 2 und 3, die für den Sektor 2 im Sektor 0, Block 1 in Byte 4 und 5 usw. Am Ende des Blocks 1 geht es nahtlos im Block 2 weiter bis dann die Informationen für den Sektor 15 in Sektor 0, Block 2, Byte 14 und 15 vermerkt sind.

Sektor 0, Block 3

In allen Sektoren enthält der letzte Block 3 die Informationen für die Zugriffssteuerung. Das ist für den Sektor 0 nicht anders als für alle anderen Sektoren. Der Block wird auch Sector Trailer genannt. Der Block beginnt mit einem 6 Byte langem Schlüssel, dem Key A. (Am Ende des Blocks kommt der Key B). Nach dem Key A folgen 3 Byte für die AC (Access Conditions), die festlegen, welcher Schlüssel für was (lesen/ scheiben von welchen Stellen) vorgesehen sind.

Anpassungen für NDEF im Sektor 0

Für die Nutzung der MC für NDEF sind einige Anpassungen erforderlich.

Block 1 und 2: Anpassung des MAD

Wenn Sektoren für NDEF vorbereitet werden sollen, müssen die AID im MAD in Sektor 0, Block 1 angepasst werden. Das jeweils ersten Byte bekommt den Anwendungscode 03h, um den NFC-Sektor zu identifizieren enthalten, um den Cluster von Sektoren mit NDEF-Daten zu identifizieren, und im zweiten Byte den Funktionsclustercode E1h (Hexwert E1) auf den sich diese Anwendungsnotiz bezieht. Für jeden NFC-Sektoren (NDAV) ist das dann: 03E1 im MAD. Damit ergibt sich für den Sektor 0, Block 1-3, wenn alle 15 Sektoren für NDEF genutzt werden sollen:
Sektor 0, Block 1: 0F0003E103E103E103E103E103E103E1
Sektor 0, Block 2: 03E103E103E103E103E103E103E103E1

Block 3: Anpassung des Sector Trailers

Die Schlüssel

Der Key A muss aus einer Liste zulässiger Schlüssel stammen. Einer dieser Schlüssel ist A0A1A2A3A4A5 .
Der Key B kann einen leeren wert haben, was FFFFFFFFFFFF entspricht.

Access Conditions (AC)

Die ACs bestimmen die Lese- und Schreibrechte für den Sektor. Es sind nur bestimmte Konfigurationen zugelassen, damit die Daten problemlos gelesen werden können. Einer dieser Werte ist 787788

General Purpose Byte (GPB)

Das GPB folgt in jedem Block 3 auf die AC. Es unterscheidet sich in Sektor 0 von denen in den übrigen Sektoren:
  • Bit 0: DA-Bit gibt an, ob ein MDA vorhanden ist: 0 = MDA nicht vorhanden, 1 = MDA Version vorhanden
  • Bit 1: Gibt an, ob mehrer Aplikationen vorhanden sind: 0 = Mono-Aplication, 1 = Multi-Aplication
  • Bit 2-5: Reserviert, auf 0 gesetzt
  • Bit 6-7: ADV (MAD version code): 1 = MAD version 1
Daruch ergibt sich ein typisches GPB: 11000001b = C1 h. Insgesamt ergibt sich damit für den Sektor 0, Block eins folgender Wert:
Sektor 0, Block 3: A0A1A2A3A4A5787788C1FFFFFFFFFFFF

Anpassung für NDEF ab Sektor 1 bis zum letzten Sektor

Einen Sektor, der NDEF-Daten enthält nennt man NFC-Sektor.

Sektor 1, Blocks 0-2: Anpassung der Daten-Sektoren für NDEF

Block 0 bis Block 2 ab Sektor 1 enthalten die NFC-Daten, die über NDEF ausgeliefert werden. Sie liegen in Form von Type-Length-Value-Variablen (TLV) vor. TLV bestehen aus einem Typ, der den Datentyp angibt, einer Länge, die die Größe des Wertes bestimmt, und dem Wert selbst. Zu Beginn reicht es, leere TLV einzutragen. Zu Beginn sollte somit jeder Block 1 ab Sektor 1 den Wert 0300FE erhalten. Der Rest von Block 1 und 2 wird mit 00h gefüllt. Für Block 1 und 2 ergibt sich somit:
Sektor 1, Block 0: 0300FE00000000000000000000000000
Sektor 1, Block 1: 00000000000000000000000000000000
Sektor 1, Block 2: 00000000000000000000000000000000

Sektor 1, Block 3: Anpassung des Sector Trailer für NDEF

Hier gibt es vordefinierte Werte für Key A. Ein Wert ist D3F7D3F7D3F7. Die ACs müssen bestimmen die Lese- und Schreibrechte für den Sektor. Ein zulässiger Wert ist : 7F0788. Das GPB enthält Informationen zur Version des Mapping-Modells und zu den Zugriffsrechten der NFC-Sektoren. Die Most Significant Bits (MSB) sind Die ersten vier bit des GPB. Sie legt die Versionsnummer fest.
  • Bit 0-1: Hauptversion des NDEF-Mapping-Modells: Beginnt mit 01, also hier 01
  • Bit 2-3: Nebenversion des NDEF-Mapping-Modells: Beginnt mit 00, also hier 00
  • Bit 4-5: Lesezugriffsbedingung: 00 = Zugriff gewährt, 11 = kein Zugriff
  • Bit 5-6: Schreibzugriffsbedingung: 00 = Zugriff gewährt, 11 = kein Zugriff
Insgesamt ergibt sich dadruch 01000000b = 40 h. Auch hier kann der Key B einen leeren wert haben, was FFFFFFFFFFFF entspricht. Für den Sector Trailer ergibt sich damit insgesamt:
Sektor 1, Block 3: D3F7D3F7D3F77F078840FFFFFFFFFFFF

Wo finde ich weiterführende Informationen

Wie kann ich dann NDEF-Einträge auf die Karte Schreiben?

Am leichtesten ist das mit entsprechenden Programmen, wie dem TagWriter von NXP oder dem NFC Tool Pro.