Arduino NFC Shield - SmartCardReader (ISO 14443, 18092)

Die Arduino-Plattform ist bei Einsteigern und Hobbyentwicklern sehr beliebt und damit einhergehend wächst die Zahl der Erweiterungsplatinen, die sogenannten Shields, für Arduino zügig. Entsprechend gibt es auch Lösungen für NFC, wie z.B. das hier vorgestellte NFC Shield von SeeedStudio. Das NFC Shield ergänzt einen Arduino Uno zu einem kleinen, programmierbaren Smartcard-Reader für unter 50€. Das NFC Shield wird hierzu einfach mittels des Arduino-Pinouts auf ein Arduino-kompatibles Board mit entsprechendem Pinout gesteckt.

Vorschau: Arduino NFC ShieldDas NFC Shield basiert auf dem bereits im Jahr 2007 vorgestellten NFC-Chip NXP PN532 und bietet neben der grundlegenden Unterstützung für ISO/IEC 18092 auch die Kommunikation nach ISO14443. Dieser um einen 80C51-Kern aufgebaute NFC-Chip kann aber noch mehr, als nur die Aufgaben eines einfachen Readers zu erfüllen. Der NXP PN532 bietet direkt aus der Firmware folgende Kommunikationsstandards:

  • ISO/IEC 14443A / MIFARE Reader/Writer
  • ISO/IEC 14443A / MIFARE Card Emulation (MIFARE 1k/4k)
  • ISO/IEC 14443B Reader/Writer
  • ISO/IEC 18092, ECMA 340 Peer-to-Peer
  • FeliCa Reader/Writer
  • FeliCa Card Emulation

Die eigentliche Kommunikation zwischen dem NFC Shield und dem Arduino erfolgt über SPI. Dadurch bedingt bleiben die meisten Arduino-Pins für andere Anwendungen verfügbar. Im SeeedStudio-Wiki gibt es dazu einige weitere Hintergrundinfos und vor allem ist die Bibliothek mit Beispielquelltexten verlinkt und teils auch erklärt. Die PN532-Bibliothek stammt in ihrer ursprünglichen Fassung von Adafruit und bietet nur die rudimentären Funktionen zur Kartenerkennung. Von SeeedStudio stammen die Funktionen zum kompletten Auslesen von MIFARE-Karten und zum Beschreiben selbiger. Es gibt bisher allerdings keine fertigen Quelltexte für ISO14443B, ISO18092 (entsprechend auch nicht für FeliCa-Cards) und auch keine zur Kartenemulation. Bei Bedarf lässt sich derartiges mit Hilfe der PN532-Dokumentation von NXP entwickeln.

Beim Lesen des PN532-Usermanuals und der Quelltexte fällt eine starke Abstraktion von den eigentlichen ISO14443-Kommandos auf. Der NFC-Chip kümmert sich intern um den standardkonformen Verbindungsaufbau und die Berechnung von Prüfsummen. Hierzu ist in den Chip ein CRC-Coprozessor integriert. Mit der vollständigen Integration des Kommunikationsaufbaus nach ISO14443A-3 ist es daher auch möglich, MIFARE-Karten Vorschau: Arduino NFC Shield Eagle-brdmit Hilfe dieser abstrahierten Bibliothek anzusprechen, ohne das dahinterliegende Protokoll selbst programmieren zu müssen. Außerdem übernimmt der Chip sämtliche Signalcodierungen (ASK, Miller, …), so dass ein recht einfacher Schaltungsaufbau mit nur wenigen zusätzlichen Komponenten ermöglicht wird. Das Referenzdesign für eine Schaltung mit dem NXP PN532 findet man in der Application Note PN532 C106 (AN10609_3, Rev 1.2 — 1/14/2010, S. 12/75) und auch im Short Data Sheet PN532/C1 (120130, S. 21/27). Die von SeeedStudio entwickelte Schaltung basiert darauf, hat aber einige Detailänderungen und die Anpassung an Arduino inkl. dem Levelshifter TI TXB0104.

Die von SeeedStudio verwendete Bibliothek (Stand Anfang 12/2011) läuft nur bis zur Arduino-IDE-Version 0.23, da sich mit der Veröffentlichung der Version 0 - wie bereits in einem früheren Artikel erwähnt - zahlreiche Details bei den Arduino-Bibliotheken verändert haben. Bei Adafruit findet sich inzwischen allerdings auch eine Version für die neue Arduino-IDE.

Der entscheidende Unterschied sind folgende Zeilen im Kopfbereich der Headerdatei:

#if ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif

Außerdem muss aus der cpp-Datei der SeeedStudio-Bibliothek oben der Include für die WProgram.h entfernt werden - es reicht das Include der Headerdatei. Damit laufen die PN532-Bibliothek und die Beispielquelltexte dann auch unter Arduino 1.0. Eine Einarbeitung in die PN532-Klasse mit ihren Funktionen ist mittels des englischsprachigen SeeedStudio-Wikis und der vier auf Mifare-Karten zugeschnittenen Quelltexte leicht möglich. Es handelt sich hierbei um folgende Quelltexte:

  • readMifareTargetID.pde
  • readMifareMemory.pde
  • readAllMemoryBlocks.pde
  • writeMifareMemory.pde

Das erste Programm readMifareTargetID.pde dient ganz einfach dazu, im Feld befindliche Tags/PICCs zu suchen und die UID auf der seriellen Konsole auszugeben. Wie allgemein üblich, können sich hierbei nur zwei Karten gleichzeitig im Feld befinden. Diese werden dann abwechseln ausgegeben. Legt man drei Karten ins Feld variiert das Ergebnis: mitunter wird nichts erkannt, oft aber ein oder zwei der Karten. Der Wechsel zwischen zwei Karten erfolgt sehr schnell, was zeigt, dass die interne Verarbeitung im PN532 sehr gut optimiert ist und auch das Antennenlayout des NFC Shields sehr gut abgestimmt ist.

Das zweite Programm readMifareMemory.pde liest einfach nur einen Speicherblock aus, vordefiniert ist hierbei der Block 0×08. Bei einer frischen (leeren) Karte erhält man nach der UID daher nur eine Zeile mit Nullen.

Das dritte Programm readAllMemoryBlocks.pde ist schon deutlich interessanter. Dieses liest die komplette Karte mit den Standardkeys aus. Verschlüsselte Bereiche (Crypto1) sieht man also nicht ohne den Schlüssel zu haben (oder zu knacken). Die Ausgabe dieses Testprogramms verdeutlicht sehr schön den Speicheraufbau. Die MIFARE-Karten mit 1kB sind unterteilt in 16 Sektoren á vier Blöcke, ergibt zusammen 64 Blöcke. Jeder Block enthält 16 Byte. Da also 16 Blöcke als Sector Trailer und der 0. Block als Manufacturer Block definiert sind, stehen 47 Blöcke mit insgesamt 752 Byte Speicherkapazität für Daten zur Verfügung. Eine MensaCard des Berliner Studentenwerks gibt nur die ersten vier Blöcke (Block 0 Manufacturer, Block 1 & 2 leer, Block 3 Sector Trailer wie auf frischer Karte) aus, der Rest ist verschlüsselt.
Eine frische Karte gibt in etwa Folgendes zurück:

Hello!
Found chip PN532
Firmware ver. 1.6
Supports 7
Found 1 tags
Sens Response: 0x4
Sel Response: 0x8
 0x4D 0x7 0x5B 0x76Read card #1292327798
 
4D 7  5B 76 67 88 4  0  48 85 14 57 55 90 34 10 | Block  0 | Manufacturer Block
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  | Block  1 | Data Block
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  | Block  2 | Data Block
0  0  0  0  0  0  FF 7  80 69 FF FF FF FF FF FF | Block  3 | Sector Trailer
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  | Block  4 | Data Block
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  | Block  5 | Data Block
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  | Block  6 | Data Block
0  0  0  0  0  0  FF 7  80 69 FF FF FF FF FF FF | Block  7 | Sector Trailer
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  | Block  8 | Data Block
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  | Block  9 | Data Block
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  | Block 10 | Data Block
0  0  0  0  0  0  FF 7  80 69 FF FF FF FF FF FF | Block 11 | Sector Trailer
...
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  | Block 62 | Data Block
0  0  0  0  0  0  FF 7  80 BC FF FF FF FF FF FF | Block 63 | Sector Trailer

Die UID dieser frischen Testkarte ist also 0x 4D 07 5B 76 (im Dekadischen System 1292327798) und die XOR-Prüfsumme dazu ist 0×67. In den Blöcken mit dem Sector Trailer stehen u.a. die beiden Keys. Key A sind die ersten 6 Byte, hier also 6 mal 0×00. Key B sind die letzten 6 Byte, standardmäßig 6 mal 0xFF. Laut Application Note von NXP zur Mifare Classic sollte allerdings auch der Key A 6 mal 0xFF enthalten. Die “Zwischenbytes” des Sektortrailers enthalten 3 Byte ACL für den Sektor. Frische Karten der Typen MIFARE Classic und MIFARE Plus enthalten hier immer die Bytefolge 0xFF0780, was die Authentifizierung über Key A definiert. Ein weiterer in der NXP AN1305 angegebener Standardwert ist 0×7F0788 und steht für die Authentifizierung mittels Key B. Das 4. Zwischenbyte (also Byte #09) nennt sich General Purpose Byte (GPB) und kann zum Setzen von Schreib-/Leserechten verwendet werden. Standardmäßig ist dies in den ersten Sektortrailern 0×69 (non-personalized tag). Der letzte Sektor Trailer enthält schließlich 0xBC in diesem Byte. Mittels der ACLs kann definiert werden, mit welchem Schlüssel was erlaubt ist. Grundsätzlich lässt sich hierbei vereinfacht sagen, dass der Schlüssel B höherwertig ist, da er entweder die gleichen Rechte oder mehr Rechte als Schlüssel A besitzt. Das lässt sich auch für ein Public-/Private-Key-Verfahren nutzen. Die ACLs sind außer in der AN1305 z.B. auch in der Diplomarbeit von Henryk Plötz, Humboldt-Universität zu Berlin, zum Thema Mifare Classic – Eine Analyse der Implementierung von 10/2008 umfangreich beschrieben.

Das vierte Programm writeMifareMemory.pde bietet schließlich eine Demonstration zum Beschreiben der Blöcke einer MIFARE-Karte. Das Beispiel schreibt die Ziffern 0×00 - 0×0F in den Block #08, also in den 0. Block des 3. Sektors. Das Ergebnis lässt sich mittels des 2. oder 3. Programms entsprechend wieder auslesen.

Wer sich die Mühe macht, die MIFARE Card Emulation entsprechend dem NXP-Datenblatt zu implementieren, dürfte darüber dann auch in der Lage sein, kopierte Karten abzuspielen. Bereits in dem Artikel von letzter Woche hatte ich kurz erwähnt, dass sich Anleitungen im Netz finden, wie man an die Schlüssel einer MIFARE Classic herankommen und diese Karten/Tags somit komplett kopieren kann. Bliebe nur die Frage, ob die Firmware des NXP PN532 auch ein beliebiges Setzen der UID im Emulatormodus erlaubt … Weiß dies jemand oder mag es testen?

Eine Reaktion zu “Arduino NFC Shield - SmartCardReader (ISO 14443, 18092)”

  1. admin

    Quellen:

    • Near Field Communication (NFC, ISO14443)
    • Arduino 1.0, Arduino Uno
    • NFC Shield externerLink - Wiki zum Arduino-NFC-Shield von SeeedStudio mit NXP PN532
    • NXP-Dokumentationen:
      • UM0701-02, PN532 User Manual, Rev. 02, 2007-11-05 Version for firmware version V1.6 (PN532/C106)
      • AN10609_3, PN532 C106 application note, Rev. 1.2 - 5. Januar 2010
      • PN532_SDS_120130, PN532/C1 Product short data sheet, Rev. 3.0 - 10. November 2011
      • AN1305, Application note 130512, MIFARE Classic as NFC Type MIFARE Classic Tag, Rev. 1.2 — 3. Mai 2011
      • OM5597_RD2612_SDS, alternatives Design mit NXP LPC1768 (ARM Cortex M3): OM5597/RD2612, POS Reference Design, Rev. 1.0 - 26. Mai 2011

Einen Kommentar schreiben