-
Notifications
You must be signed in to change notification settings - Fork 0
Commands
Das Modul für die Verarbeitung von Kommandos besteht aus zwei Dateien: commands.h
und commands.c
.
In der commands.h
werden die Bytes für alle acht Mifare-Kommandos als defines angelegt. Dazu kommen noch die Bytes für ACK und NAK (not ACK).
Die Mifare-Kommandos haben eine bestimmte Struktur. Sie beinhalten entweder ein Kommandobyte und eine Blockbyte oder die eigentlichen Daten von meheren Bytes. Dieser Sachverhalt wurde in eine Struct - Struktur übersetzt. Für jedes Kommando existiert ein Struct. Durch ein Union werden Platz für daten bzw. Kommando/Block vereint. Da Kommando- und Blockbyte in jedem Kommando vorkommt, wurden diese beiden in ein eigenes Struct zur weiteren Abstraktion rausgezogen.
Zuletzt werden in der Header-datei noch process
Funktionen zu jedem Kommando deklariert. Diese Funktionen sollen letztendlich ein eingehendes Kommando verarbeiten und die entsprchenen Speicher-/Zustandsfunktionen ausführen.
Die dazugehörge c-Datei commands.c
definiert alle process
Funktionen. Die Implementierungen sind meist recht 'straight-forward'. Jede Funktion bekommt eine Byte-Folge, die ein Kommando repräsentieren soll als Array verpackt und ein Array, welches als out-Parameter dient (zur Aufnahme des Rückgabewertes). Da die Bytefolge ein Kommando repräsentieren soll, wird dieses auf das entsprechende Strucht gecastet.
Da einige Kommandos aus zwei Teilen besteht wird dann anhand der Zustandsmaschine überprüft, um welchen Teil es sich handelt.
Im ersten Teil werden lediglich die Zugriffsberechtigung auf den gegebenen Block mit Hilfe der Zustandsmaschinenfunktionen geprüft und mit einem ACK oder NAK bestätigt.
Der zweite Teil führt dann die eigentlichen Speicher / Register operationen aus und gibt die entsprechende Antwort zurück. In diesem Teil wird der Block nicht nochmal übergeben. Deshalb wird er im ersten Teil in einer statischen Variable block
funtionenübergreifend gespeichert.
Drei Funktionen unterscheiden sich von diesem Muster. Zum einen sind das Read und Transfer. Diese beiden Kommandos haben lediglich den ersten Teil. Wenn die Berechtigungen stimmen, wird sofort die Lese- bzw. Transfer-Operation ausgeführt. Zum anderen ist die Auth-Funktion etwas anders, obwohl sie auch aus zwei Teilen besteht. Im ersten Teil wird eine neue Crypto1-Instanz initialisiert und im zweiten Teil wird der zweite Schritt für Crypto1 ausgeführt. Hier werden jeweils nur die Zustände geändert. Die Rückgabewerte werden von den Crypto1-Funktionen in den Rückgabebuffer geschrieben.
In einer process
selbst muss sich nich darum gekümmert werden, welches Kommando es ist. Das übernimmt ein Modul, welches auf der Kommandoverarbeitung sitzt.
Dieses Modul verwendet den Speicher
, Zustandsmaschine
,mifare_internal
und den Zufallszahlengenerator
(Erzeugung nonce in Authentifizierungsfunktion; ist ziemlich primitiv implementiert)
{Kommando} --> [Kommandoverarbeitung] --> {ACK, NAK, data}