Lire une carte Mifare Ultralight avec Debian
J'ai récemment acquis un lecteur de carte nfc pour m'amuser à voir ce qui se passe dans ces cartes sans contact qui nous entourent.
Partant de zéro dans ce domaine, je me suis lancé à la recherche des informations que je pouvais trouver sur le web et après avoir passé un peu de temps à lire et a faire des tests je suis enfin arrivé à lire des données sur la carte que j'avais acheté pour l'occasion \o/
Premièrement j'ai installé le paquet pcsc-tools qui contient notamment pcsc_scan et gscriptor.
La première chose à faire est d'utiliser pcsc_scan et de passer la carte sur le lecteur. Cela permettra de récupérer l'ATR qui nous donne des informations sur la carte. Si le logiciel reconnaît la carte, il nous donne des informations en plus.
Dans mon cas voici ce que me dit pcsc_scan :
Reader 0: SpringCard Prox'N'Roll (A67F095D) 00 00
Card state: Card inserted,
ATR: 3B 8F 80 01 80 4F 0C A0 00 00 03 06 03 00 03 00 00 00 00 68
ATR: 3B 8F 80 01 80 4F 0C A0 00 00 03 06 03 00 03 00 00 00 00 68
- TS = 3B --> Direct Convention
- T0 = 8F, Y(1): 1000, K: 15 (historical bytes)
TD(1) = 80 --> Y(i+1) = 1000, Protocol T = 0
-----
TD(2) = 01 --> Y(i+1) = 0000, Protocol T = 1
-----
- Historical bytes: 80 4F 0C A0 00 00 03 06 03 00 03 00 00 00 00
Category indicator byte: 80 (compact TLV data object)
Tag: 4, len: F (initial access data)
Initial access data: 0C A0 00 00 03 06 03 00 03 00 00 00 00
- TCK = 68 (correct checksum)
Possibly identified card (using /usr/share/pcsc/smartcard_list.txt):
3B 8F 80 01 80 4F 0C A0 00 00 03 06 03 00 03 00 00 00 00 68
3B 8F 80 01 80 4F 0C A0 00 00 03 06 .. 00 03 00 00 00 00 ..
Mifare Ultralight (as per PCSC std part3)
3B 8F 80 01 80 4F 0C A0 00 00 03 06 03 00 03 00 00 00 00 68
3B 8F 80 01 80 4F 0C A0 00 00 03 06 03 .. .. 00 00 00 00 ..
RFID - ISO 14443 Type A Part 3 (as per PCSC std part3)
3B 8F 80 01 80 4F 0C A0 00 00 03 06 03 00 03 00 00 00 00 68
RFID - ISO 14443 Type A - NXP Mifare Ultralight or UltralightC
Wed Jan 1 17:11:25 2014
Reader 0: SpringCard Prox'N'Roll (A67F095D) 00 00
Card state: Card removed,
Il s'agit d'une carte Mifare Ultralight, une des plus simples à priori.
Pour interagir avec la carte on devra lui envoyer directement des données binaires et elle nous renverra d'autres données.
Mais avant de nous lancer dans la lecture il faut savoir ce qu'il y a à lire.
Voici comment sont arrangé les données sur la carte (pour plus de détail, voir cette conférence) :
| Address | 0 | 1 | 2 | 3 |
|---|---|---|---|---|
| 00 | SN0 | SN1 | SN2 | CB0 |
| 01 | SN3 | SN4 | SN5 | SN6 |
| 02 | CB1 | internal | Lock byte | Lock byte |
| 03 | OTP | OTP | OTP | OTP |
| 04 | DATA | DATA | DATA | DATA |
| 05 | DATA | DATA | DATA | DATA |
| 06 | DATA | DATA | DATA | DATA |
| 07 | DATA | DATA | DATA | DATA |
| 08 | DATA | DATA | DATA | DATA |
| 09 | DATA | DATA | DATA | DATA |
| 0A | DATA | DATA | DATA | DATA |
| ... | ... | ... | ... | ... |
edit : suite à d'autres manipulations sur la carte, j'ai un doute sur l'exactitude de ce tableau. A prendre avec des pincettes.
Pour lire ces données on pourra utiliser gscriptor qui permet d'envoyer directement les commande en binaire à la carte et d'en afficher la réponse.Les données envoyées pour la lecture seront de cette forme là :
FF B0 00 XX YY avec XX l'adresse de la zone à lire et YY le nombre d'octets à lire.
La carte doit alors renvoyer les valeurs suivit de 90 00 qui indique que tout c'est bien passé.
Voici ce que j'ai obtenu :
| envoyé | reçu |
|---|---|
| FF B0 00 00 04 | 04 EA DA BC 90 00 |
| FF B0 00 01 04 | EA 97 28 80 90 00 |
| FF B0 00 02 04 | D5 48 00 00 90 00 |
| FF B0 00 03 04 | 00 00 00 00 90 00 |
| FF B0 00 04 04 | FF FF FF FF 90 00 |
| FF B0 00 05 04 | 00 00 00 00 90 00 |
| FF B0 00 06 04 | 00 00 00 00 90 00 |
| FF B0 00 07 04 | 00 00 00 00 90 00 |
| FF B0 00 08 04 | 00 00 00 00 90 00 |
| FF B0 00 09 04 | 00 00 00 00 90 00 |
| FF B0 00 0A 04 | 00 00 00 00 90 00 |
| FF B0 00 0B 04 | 00 00 00 00 90 00 |
| FF B0 00 0C 04 | 00 00 00 00 90 00 |
| FF B0 00 0D 04 | 00 00 00 00 90 00 |
| FF B0 00 0E 04 | 00 00 00 00 90 00 |
| FF B0 00 0F 04 | 00 00 00 00 90 00 |
| FF B0 00 10 04 | 6F 16 |
Concernant la dernière valeur, 6F 16, je n'ai pas encore trouvé ce que ça voulait dire. Peut-être que j'ai dépassé la capacité de la carte, mais elle était vendue comme ayant 192 octets de mémoire...
Prochaine étape : écrire des données