mardi 19 juillet 2016

Discussion avec une carte à puce grâce à "gscriptor"

Nous avons vu dans l'article précédent la manière avec laquelle une carte à puce discute avec un lecteur de cartes : via des APDU. Il est temps maintenant d'envoyer nos premiers APDU vers une carte pour voir ce qui se passe.

Pour cela nous allons utiliser un utilitaire livré dans le package pcsc-tools (sudo apt-get install pcsc-tools) : gscriptor.

Connectons le lecteur de cartes à puce sur le port USB du PC et insérons y une carte à puce. Je prends ici pour l'exercice une carte bancaire EMV périmée depuis 2014 que j'ai dans mes cartons (pour expérimenter, il vaut mieux avoir des cartes, c'est sûr).

Au moment où la carte est insérée, elle balance son ATR. Celui-ci ne sera pas perdu, bien qu'on n'ait pas encore lancé gscriptor, car il est lu et conservé par la couche PCSC de l'ordi.

Lançons gscriptor.

Ce petit programme, écrit en perl, est une simple interface graphique vers l'API PCSC. Sur la gauche de la fenêtre on écrit un script, et on voit le résultat (dont la réponse de la carte) dans la fenêtre de droite.

Cliquons dans le menu "Reader / Connect" pour se connecter logiciellement à la carte à puce. Puis faisons "Reader / Status".
On voit que la carte à puce a émis comme ATR lors de l'insertion : 3B 65 00 00 20 63 CB 6A 00. Le premier octet étant 3B, on peut déjà en déduire qu'une carte bancaire EMV fonctionne en convention directe.

Arrivé à ce stade, il faut connaitre les APDU supportés par la carte. Nous reviendrons dans un prochain article sur une exploration plus poussée de la carte EMV. Comme il s'agit ici uniquement pour l'instant de montrer comment utiliser gscriptor, nous allons simplement envoyer à la carte 1 type d'APDU.

L'APDU que nous allons utiliser s'appelle (dans la doc EMV) GET CHALLENGE. Par cet APDU le lecteur de carte demande à la carte de générer un nombre aléatoire de 8 octets. GET CHALLENGE est utilisé dans la sécurité de la carte bancaire, c'est pourquoi cet APDU existe.

La bonne séquence à envoyer à la carte est : 00 84 00 00 08, c'est à dire CLA = 00, INS = 84, P1 = P2 = 00, et Le = 08.

Commençons par envoyer 00 84 00 00 00 pour voir ce qui se passe (on tape le script à gauche et on clique sur "Run").
On voit que la carte ramène 6C 08 (soit SW1 = 6C, SW2 = 08). gscriptor fait une interprétation de ce code (basé sur les specs EMV) : mauvaise longueur Le, devrait être 08. En effet cet APDU demande la génération d'une séquence aléatoire de 8 octets.

Tapons donc la bonne commande cette fois-ci (00 84 00 00 08) :
On voit cette fois que la carte envoie 8 octets choisis (pseudo) aléatoirement : D1 03 7A 3A AD 25 A6 2C. La réponse de la carte se termine par 90 00 qui signifie que tout s'est bien passé.

On peut s'amuser à renvoyer cet APDU plusieurs fois, on aura toujours 8 nombres aléatoires différents.

Voilà, inutile d'aller plus loin, gscriptor est vraiment un logiciel simplissime à utiliser. De toute façon pour aller plus loin il faut bosser les specs EMV, sujet dont je suis loin d'avoir fait le tour.

Nous verrons dans un prochain article comment se passer de gscriptor pour dialoguer avec la carte, en passant par un programme qu'on écrira en C et qui discutera directement avec la carte en passant par l'API PCSC (ce que fait gscriptor en fait). On verra donc en quelque sorte l'envers du décors de gscriptor.

Nous verrons également plus tard qu'il n'est pas très difficile de programmer une Silvercard pour qu'elle soit capable de faire cette fonction de génération de 8 nombres aléatoires, comme le fait la carte bancaire.

Publié le 19 juillet 2016 par Alan Cartman

Aucun commentaire: