Monday, November 19, 2012

Rechargement du passe navigo sous linux


Il y a peu de temps, j'ai reçu un email de la RATP me disant que j'avais été sélectionné pour participer à la phase de test du rechargement de passe navigo directement sur son ordinateur. J'ai gratuitement reçu un lecteur de cartes à puce, mais des lecteurs de type Gemalto ou autres fonctionnent aussi (et ne coute qu'une dizaine d'euros sur ebay !)
Malheureusement, en se connectant sur le site rechargercommandernavigo.fr, mon système d'exploitation n'est pas supporté. Et pour cause, seul Windows et MacOS sont supportés. Que se passe-t-il en changeant mon user-agent ? La configuration a l'air d'être bonne ! En cliquant sur continuer, ça coince un peu. Message d'erreur, mon lecteur n'est pas connecté. Dommage, ça aurait pu fonctionner. Mais il est hors de question que je baisse les bras.

Reverse-engineering

Si les pré-requis sont bons, il doit y avoir un applet java qui se cache dans ma page. Effectivement :

<iframe id="applet" src="applet.jsp" width="1px" height="1px" frameborder="0"></iframe>

A priori, le javascript situé dans carte.js communique avec l'applet, qui communique avec le lecteur de cartes.

Et si on décompilait le jar (RITMxAppletCardClient.jar) ? En utilisant l'excellent JD-GUI, j'ai appris que l'API utilisée pour communiquer est javax.smartcardio. Vraisemblablement, le problème se situe sur mon système. En utilisant le code de l'applet (qui d'ailleurs est très proche des exemples de code pour SmartCardIO) suivant et en le compilant :
      TerminalFactory factory = TerminalFactory.getDefault();
      List terminals = factory.terminals().list();

      for (CardTerminal aTerminal : terminals)
      {
        System.out.println(aTerminal);
      }

Je me rends compte qu'aucun lecteur n'est détecté. Je cherche dans la documentation de SmartCardIO ce qu'il me manque : les librairies pour accéder au lecteur de carte !

Installation de PC/SC

J'installe via pacman (pour ArchLinux) :   pcsc-tools et pcsclite (ou pour ubuntu, pcscd libpcsclite1 pcsc-tools). Il faut ensuite lancer le démon pcscd, et vérifier avec pcsc_scan que le lecteur est correctement détecté.

PC/SC device scanner
V 1.4.20 (c) 2001-2011, Ludovic Rousseau 
Compiled with PC/SC lite version: 1.8.3
Using reader plug'n play mechanism
Scanning present readers...
0: Alcor Micro SCR001 00 00

Mon Nov 19 16:48:52 2012
Reader 0: Alcor Micro SCR001 00 00
  Card state: Card removed, 

Mon Nov 19 16:48:56 2012
Reader 0: Alcor Micro SCR001 00 00
  Card state: Card inserted, 
  ATR: 3B XX XX XX XX

ATR: 3B 6F XX XX ...
+ TS = 3B --> Direct Convention
+ T0 = 6F, Y(1): 0110, K: 15 (historical bytes)
  TB(1) = 00 --> VPP is not electrically connected
  TC(1) = 00 --> Extra guard time: 0
+ Historical bytes: 80 XX XX XX XX 
  Category indicator byte: 80 (compact TLV data object)
    Tag: 5, len: A (card issuer's data)
      Card issuer data: 08 XX XX XX 
    Tag: 8, len: 2 (status indicator)
      SW: 9000

Possibly identified card (using /usr/share/pcsc/smartcard_list.txt):
..
3B 6F 00 00 80 5A .. 0[1-5] .. .. .. .. .. .. .. .. 82 90 00
 Card supporting a Calypso application Rev 1
 Typically: French "Navigo" transport card

En revanche, l'applet ne fonctionne toujours pas ! C'est un bug connu dans les distributions (ou dans java, tout dépend du point de vue !), qui va chercher les librairies au mauvais endroit :
SunPCSC accesses the PC/SC stack via the libpcsclite.so library. It looks for this library in the directories /usr/$LIBISA and /usr/local/$LIBISA, where $LIBISA is expanded to lib on 32-bit platforms, lib/64 on 64-bit Solaris platforms, and lib64 on 64-bit Linux platforms.
 Il ne reste plus qu'à trouver la librairie libpcsclite.so et faire un lien symbolique au bon endroit. Pour Archlinux :


$ sudo mkdir /usr/local/lib64
$ cd /usr/local/lib64
$ sudo ln -s /usr/lib/libpcsclite.so.1 libpcsclite.so


Retour sur le site navigo :