Desfire EV1 Kommunikationsbeispiele

8

Es gibt viele Fragen zu Desfire EV1 Karten hier auf Stackoverflow. Aber wenn Sie nach einigen Beispieldaten suchen, ist der einzige Ort, wo Sie ein paar Bytes finden, in Ridrix Blog . Aber das ist ziemlich unvollständig.

Viele Leute haben ihre Probleme dort geschrieben, während sie Code für Desfire-Karten entwickelt haben. Aber meistens, wenn sie ihr Problem lösten, waren sie zu faul, um die Lösung zu veröffentlichen. Sie finden also viele Fragen, aber nur wenige Antworten mit Datenbeispielen.

Auch wenn Sie die Desfire EV1 Dokumentation haben (ich habe sie nicht, ich habe easypay Code studiert), Sie brauchen mehr als Das. Eine Dokumentation ist nur Theorie. Aus welchem ​​Grund gibt Ihre Karte einen Authentifizierungsfehler oder einen Integritätsfehler oder einen unerwarteten CMAC zurück?

  • Ist der Sitzungsschlüssel OK?
  • Arbeitet CBC im richtigen Modus?
  • Ist der CMAC korrekt berechnet?
  • Ist die CRC32 korrekt?
  • Ist die IV des Sitzungsschlüssels vor / nach einem Funktionsaufruf korrekt?

Ohne Beispiele sind Sie völlig verloren.

    
Elmue 09.07.2016, 16:41
quelle

1 Antwort

14

Nachdem ich einige Wochen mit der Entwicklung von Desfire EV1 verbracht hatte, entschloss ich mich, einige Beispiele für all jene zu veröffentlichen, die Eingabedaten benötigen, um ihre komplexen kryprografischen Funktionen zu füttern und die Ausgabe mit den erwarteten Daten zu vergleichen. Ich weiß, dass dies EXTREM hilfreich ist.

Hier finden Sie eine Debug-Ausgabe der wichtigsten Desfire EV1-Operationen. Derzeit können Sie diese Informationen nicht im Internet finden. Hätte ich diese Beispiele gehabt, hätte ich viel Zeit gespart, um meinen Code zu entwickeln.

Fehler bei ISO- und AES-authentifizierten Sitzungen

Im ISO- und AES-Modus läuft JEDE Verschlüsselung / Entschlüsselung über CBC . Die IV des Sitzungsschlüssels wird nur EINMAL auf Null zurückgesetzt, wenn der Schlüssel nach der Authentifizierung erstellt wird. Die IV des Authentifizierungsschlüssels wird nur EINMAL zurückgesetzt, wenn die Authentifizierung beginnt.

Während der Authentifizierung:

  1. Random B wird von der Karte mit RECEIVE + DECIPHER
  2. empfangen
  3. Random AB wird mit SEND + ENCIPHER
  4. an die Karte gesendet
  5. Random A wird mit RECEIVE + DECIPHER
  6. empfangen

Das CMAC ist eine Kopie des IV des Sitzungsschlüssels. Der CMAC muss hauptsächlich für Daten berechnet werden, die an die Karte gesendet werden, und für Daten, die von der Karte zurückgegeben werden. Alle Befehle, die eine CBC-Verschlüsselung durchführen (z. B. ChangeKeySettings), unterscheiden sich jedoch von diesem Schema. Befehle, die mehrere Rahmen senden / empfangen (z. B. GetApplicationIDs), müssen den CMAC über die Daten aller gesendeten / empfangenen Rahmen (ohne das 0xAF-Statusbyte) berechnen. Für TX-Daten wird der CMAC über das Befehlsbyte + alle Parameterbytes berechnet. Für RX-Daten wird der CMAC über alle Antwortbytes + das letzte Statusbyte (immer 00 = Success) berechnet, das am Ende angehängt werden muss!

Die Authentifizierung ist ungültig :

  • wenn ein Fehler auftritt (Status! = 00 und! = AF),
  • wenn SelectApplication ausgeführt wird,
  • nachdem derselbe Schlüssel geändert wurde, der für die Authentifizierung verwendet wurde,
  • wenn eine andere Karte in das RF-Feld kommt (vergessen Sie nicht, Ihre Variablen zurückzusetzen).

In diesen Fällen ist der Sitzungsschlüssel nicht mehr gültig und daher muss kein CMAC berechnet werden.

Der CRC32 des neuen Schlüssels wird nur über die Schlüsseldaten selbst berechnet. Der CRC32 des Kryptogramms wird über Befehl, Schlüsselnummer und das noch nicht verschlüsselte Kryptogramm berechnet.

Die folgende Debug-Ausgabe wurde von meinem Code generiert, der in einem Teensy 3.2 mit einem PN532-Board von Adafruit ausgeführt wird. Weitere Details finden Sie in meinem Quellcode Der Quellcode wurde für Arduino / Teensy geschrieben, aber er wurde für multiplatform entwickelt, sodass nur einige Zeilen geändert werden müssen, um ihn auf Visual Studio, Linux oder anderen Plattformen zu kompilieren.

In den folgenden Beispielen haben alle Schlüssel die Schlüsselversion 0x10.

ISO-Authentifizierung mit 2K3DES-Standardschlüssel # 0

%Vor%

Ändern Sie den 2K3DES-Standardschlüssel # 0

%Vor%

Ändern Sie den 2K3DES-Standardschlüssel # 1

%Vor%

ISO-Authentifizierung mit 3K3DES-Standardschlüssel # 0

%Vor%

Ändern Sie den 3K3DES-Standardschlüssel # 0

%Vor%

Ändern Sie den 3K3DES-Standardschlüssel # 1

%Vor%

AES-Authentifizierung mit AES-Standardschlüssel # 0

%Vor%

Ändern Sie den AES-Standardschlüssel # 0

%Vor%

Ändern Sie den AES-Standardschlüssel # 1

%Vor%

CMAC-Berechnung für AES 128

Von: NIST

%Vor%

Wenn Sie weitere Beispiele (auch für CreateApplication, SelectApplication, DeleteApplication, GetApplicationIDs, GetKeyVersion, GetKeySettings, ChangeKeySettings, GetCardVersion, FormatCard, CreateStdDataFile, GetFileIDs, GetFileSettings, WriteFileData, ReadFileData, DeleteFile) benötigen, laden Sie die ZIP-Datei auf Codeproject Hier finden Sie eine HTML-Datei mit dem gesamten Selbsttest, der alle diese Befehle testet.

    
Elmue 09.07.2016, 16:41
quelle