Vous êtes sur la page 1sur 18

S.

Bouzefrane

TP2 : Interaction avec la carte puce laide dun programme Java sous Windows
Samia BOUZEFRANE http://cedric.cnam.fr/~bouzefra/pfsem10-11.html samia.bouzefrane@cnam.fr Laboratoire CEDRIC Chaire Systmes Embarqus et Enfouis

CNAM

Interaction avec la carte laide dun programme Java - CNAM

S. Bouzefrane

Interaction avec la carte laide dun programme Java - CNAM

S. Bouzefrane

1. API JSR 268


JSR 268 dfinit une API Java pour permettre la communication avec les cartes puce en utilisant le protocole ISO 7816-4. Il permet ainsi aux applications crites en Java 1.6 dinteragir avec des applications qui tournent sur la carte puce, en utilisant Linux ou Windows. Description du Package javax.smartcardio Classe et Constructeur Mthodes de la classe

boolean equals(Object obj) Compares the specified object with this ATR ATR : Rponse un Reset Answer To Reset for equality. ATR(byte[] atr) construit un ATR partir dun tableau doctets. byte[]getBytes() Returns a copy of the bytes in this ATR. String toString() Returns a string representation of this ATR.

Card : Etablissement de connexions

abstract void disconnect(boolean reset) dconnexion de la carte. abstract ATR getATR() retourne lATR de la carte.

Protected Card() construit un objet Card.

abstract String getProtocol() retourne le protocole de cette carte. abstract CardChannel getBasicChannel() retourne le CardChannel dun canal logique de base

Interaction avec la carte laide dun programme Java - CNAM

S. Bouzefrane

CardChannel : Connexion logique la carte puce

abstract void close() ferme le CardChannel abstract ResponseAPDU transmit(CommandAPDU command) envoie la commande APDU vers la carte et retourne une rponse APDU.

protected CardChannel() construit un objet CardChannel

CardTerminal :Cration dun lecteur de carte protected CardTerminal(TerminalFactory factory) construit un nouvel objet CardTerminal

abstract Card connect(String protocol) tablit une connexion avec la carte. abstract String getName() retourne le nom du lecteur. abstract boolean isCardPresent () retourne vrai si la carte est prsente dans le lecteur, faux sinon.

CommandAPDU : Une commande APDU tel que fini dans ISO 7816-4 CommandAPDU(byte[] apdu) construit une commande APDU partir dun tableau doctets. CommandAPDU(byte cla, byte ins, byte p1, byte p2) construit une commande APDU partir des 4 octets de lentte. etc.

byte[]getBytes() retourne une copie des octets de lAPDU. byte getCLA() retourne la valeur de CLA. byte getINS() retourne la valeur en octet de INS. byte getP1() retourne la valeur en octet du paramtre P1. byte getP2() retourne la valeur en octet du paramtre P2. int getNe() retourne le nombre maximal doctets attendus en rponse. etc.

Interaction avec la carte laide dun programme Java - CNAM

S. Bouzefrane

ResponseAPDU : la rponse APDU tel que dfini dans ISO 7816-4

byte [] getBytes() retourne une copie de lAPDU en octets. byte [] getData() retourne une copie en octets des donnes envoyes en rponse la commande APDU. byte getSW1() retourne la valeur en octet de ltat SW1. byte getSW2() retourne la valeur en octet de ltat SW2. etc.

ResponseAPDU(byte [] apdu) construit une rponse APDU partir dun vecteur doctets contenant lAPDU complte (donnes et SW1 et SW2).

TerminalFactory : une fabrique pour les objets CardTerminal

CardTerminal getTerminal(String name) retourne le terminal avec le nom spcifi ou null si le terminal spcifi nexiste pas. static TerminalFactory getDefault() retourne une instance de TerminalFactory par dfaut. etc.

II. Outils de dveloppement


II.1. Outils matriels Un lecteur de carte SIM et une carte SIM (le pilote du lecteur ayant t install durant le 1er TP). II.1. Outils logiciels ncessaires a) Tlcharger et installer JDK 1.6 (utiliser le lien suivant pour le tlcharger : (http://java.sun.com/javase/downloads/widget/jdk6.jsp). b) Tlcharger et installer Eclipse galileo pour Windows (http://www.eclipse.org/downloads/download.php?file=/technology/epp/dow nloads/release/galileo/SR1/eclipse-java-galileo-SR1-win32.zip). c) Tlcharger loutil de dveloppement de JavaCard JSR268TK.zip dans un rpertoire local par exemple C:\JavaCard, partir du lien suivant : http://cedric.cnam.fr/~bouzefra/cours/cours_SEM/JSR268TK.rar d) Pour connatre, le nom du lecteur de carte, il faut consulter la base des registres (Sous Windows, cliquer sur le menu Dmarrer et choisir Excuter pour excuter la commande regedit et parcourir le chemin suivant): Hkey local machine/software / Microsoft/cryptography/calais/readers

Interaction avec la carte laide dun programme Java - CNAM

S. Bouzefrane

III. Prparation de lenvironnement de dveloppement


III.1 importer lAPI JSR268 de dveloppement sous clipse : a) Dcompresser le projet c:\JavaCard\JSR268TK.zip dans le mme rpertoire. b) Lancer Eclipse. c) Importer le projet java C:\JavaCard\JSR268TK\JSR268TK\JSR268TK-2 de la manire suivante : File Import General Existing Project into WorkSpace Browse Chercher lemplacement o vous avez dcompress le ficher JSR268TK.zip. Dans notre cas cest : C:\JavaCard\JSR268TK\JSR268TK-2. Slectionner le rpertoire JSR268TK-2 et puis faire OK. Les captures dcran suivantes explicitent cette manipulation.

Cliquer sur le bouton File ensuite sur Import

Interaction avec la carte laide dun programme Java - CNAM

S. Bouzefrane

Cliquer alors sur le bouton + devant General Workspace

Cliquer sur Existing Projects into

Cliquer alors sur le bouton Browse pour rechercher le projet importer.

Interaction avec la carte laide dun programme Java - CNAM

S. Bouzefrane

Cliquer alors sur le bouton + devant C Cliquer sur + JavaCard cliquer sur + JSR268TK Cliquer sur + JSR268TK Cliquer sur JSR268TK-2 Cliquer sur le bouton OK

Cliquer sur le bouton Finish

Interaction avec la carte laide dun programme Java - CNAM

S. Bouzefrane

Vous devriez voir cette fentre, mais afin de visualiser les packages de ce projet cliquer sur + devant JSR268TK-2

Interaction avec la carte laide dun programme Java - CNAM

S. Bouzefrane

Vous devriez voir cette fentre

10

Interaction avec la carte laide dun programme Java - CNAM

S. Bouzefrane

Ci-dessous un schma qui dcrit dune manire gnrale les diffrentes parties de cet API. Dans le TP sur Java Card, cet environnement nous permettra de dvelopper une application Java Card (ct client et ct carte).

build.xml : comporte lexcution de trois programmes deleter : supprimer lancienne applet sur la carte. loader : charger la nouvelle applet sur la carte. run : excuter le programme du terminal.

ManagerConfig.xml : sert configurer le lecteur de carte puce en mettant son nom.

SampleTestApplet.java : le squelette de lapplet

Build.xml : sert compiler SampleTestApplet.java et gnrer ventuellement le fichier SampleTestApplet.cap qui sera install sur la carte. Ce fichier comprend bien entendu lAID de lapplet ainsi que lAID du package auquel lapplet appartient. SampleClient.java : la partie du terminal qui va interroger la carte.

11

Interaction avec la carte laide dun programme Java - CNAM

S. Bouzefrane

III.2 Configuration de lenvironnement de dveloppement : a) Modification du ManagerConfig.xml en changeant le nom du lecteur. b) Dveloppement de la partie terminal (SampleClient.java). c) Excution de la partie terminal.

Modification du ManagerConfig.xml - La premire tape consiste modifier le fichier ManagerConfig.xml en mettant le nom de notre lecteur. Ce dernier se trouve dans la base de registres. Nous lobtenons de la manire suivante : Bouton Dmarrer Excuter Taper: regedit Le nom de lecteur se trouve dans lemplacement suivant: Cliquer sur le bouton + devant Hkey local machine + software + Microsoft + cryptography + calais + readers

a)

Double clique sur Device

Vous pouvez copier ce nom de lecteur clrt+c

Ouvrir le fichier ManagerConfig.xml (double clique de souris sur le fichier).

12

Interaction avec la carte laide dun programme Java - CNAM

S. Bouzefrane

- Enregistrer les modifications en tapant Ctrl+S.

Copier le nom de lecteur entre la balise </cad> et </cad>. Faite attention quil ny ait pas despace.

Ici une liste des noms des lecteurs en commentaire.

Dveloppement de la partie terminal : -La partie terminal correspond au fichier SampleClient.java. -Ouvrir le fichier SampleClient.java (double clique de souris sur le fichier). Limage ci-dessous saffiche :

b)

13

Interaction avec la carte laide dun programme Java - CNAM

S. Bouzefrane

Dclaration de Constantes

Dclaration de lAID de lapplet qui va interagir avec cette partie terminal

- Excuter la partie terminal. Comme dans ce TP, le terminal ninteragit pas avec une applet sur la carte, la dclaration de lAID ne sera pas utile. Cliquer sur + devant jsr268.sampleClient. Cliquer sur le bouton droit de la souris sur le fichier SampleClient.java. Choisir Run As. Cliquer ensuite sur Java Application.

14

Interaction avec la carte laide dun programme Java - CNAM

S. Bouzefrane

Une console affiche le rsultat ou dventuelles erreurs.

Exercice:
En vous basant sur cet environnement, crire un programme qui affiche lATR de la carte SIM, et qui envoie des commandes APDU pour rcuprer quelques informations telles que lIMSI, TMSI et le fichier des SMS.

15

Interaction avec la carte laide dun programme Java - CNAM

S. Bouzefrane

Corrig (avec un SELECT rep. GSM et un GET RESPONSE)


package jsr268gp.sampleclient; import jsr268gp.cad.ResponseAPDU; import jsr268gp.util.Address; import com.ibm.jc.ATR; import javax.smartcardio.CardTerminal; import jsr268gp.util.Util; import javax.smartcardio.CommandAPDU; import javax.smartcardio.Card; import javax.smartcardio.TerminalFactory; import javax.smartcardio.CardTerminals; import javax.smartcardio.CardChannel;

public class SampleClient {

public SampleClient() { super(); // TODO Auto-generated constructor stub } /** * @param args */ public static void main(String[] args) { //Slectionner votre lecteur de carte //Le nom du lecteur se trouve dans la base de registres: //Hkey local machine/software / Microsoft/cryptography/calais/readers TerminalFactory tf = TerminalFactory.getDefault(); CardTerminals list = tf.terminals(); CardTerminal cad = list.getTerminal("GENERIC2KXP USB Smart Card Reader 0"); if (cad == null) { System.out.println("debug1"); } try { // Remarque: pour le transtypage de tableau byte vers une variable string en hexa // utiliser la mthode byteArrayToHexString de la classe Util //Etablir la connexion avec la carte puce Card c = cad.connect("T=0"); System.out.println("Card : "+c); System.out.println("\n"); //Afficher l'ATR et sa taille (reset the card) javax.smartcardio.ATR atr = c.getATR(); System.out.println("ATR : "+ Util.byteArrayToHexString(atr.getBytes(), " ")); System.out.println("Taille "+ atr.toString()); System.out.println("\n"); //Trouver la commande APDU qui slectionne le rpertoire GSM

16

Interaction avec la carte laide dun programme Java - CNAM

S. Bouzefrane

byte[] FIDGSM={0x7F, 0x20}; CommandAPDU capdu = new CommandAPDU((byte)0xA0,(byte)0xA4, (byte)0x00, (byte)0x00, FIDGSM); //Afficher la commande APDU System.out.println("Commande ADPU >" + Util.byteArrayToHexString(capdu.getBytes(), " ")); //Envoyer la commande APDU CardChannel cc = c.getBasicChannel(); javax.smartcardio.ResponseAPDU rapdu = cc.transmit(capdu); //Afficher la rponse APDU System.out.println("Rponse APDU Util.byteArrayToHexString(rapdu.getBytes(), " "));

< " +

// Si (status succes) alors //if ((rapdu.getSW1()==0x90) && (rapdu.getSW2()==0x00)) //{ //System.out.println("Succes "); //System.out.println("\n"); //} // Faire un Get Response A0 C0 00 00 1A capdu = new CommandAPDU((byte)0xA0,(byte)0xC0, (byte)0x00, (byte)0x00, (byte)0x1A); System.out.println("Commande ADPU > " + Util.byteArrayToHexString(capdu.getBytes(), " ")); rapdu = cc.transmit(capdu); System.out.println("Rponse APDU < " + Util.byteArrayToHexString(rapdu.getBytes(), " "));

// Dconnexion c.disconnect(false); } catch (Exception e) { e.printStackTrace(); System.exit(1); } } }

Rsultat dexcution:
Card : PC/SC card in GENERIC2KXP USB Smart Card Reader 0, protocol T=0, state OK

ATR : 0x3B 0x16 0x94 0x71 0x01 0x01 0x06 0x02 0x00 Taille ATR: 9 bytes

Commande ADPU >0xA0 0xA4 0x00 0x00 0x02 0x7F 0x20 Rponse APDU < 0x9F 0x1A Commande ADPU > 0xA0 0xC0 0x00 0x00 0x1A

17

Interaction avec la carte laide dun programme Java - CNAM

S. Bouzefrane

Rponse APDU < 0x00 0x00 0x00 0x00 0x7F 0x20 0x02 0x00 0x00 0x00 0x00 0x00 0x0D 0x13 0x00 0x15 0x04 0x00 0x83 0x8A 0x83 0x8A 0x00 0x01 0x00 0x00 0x90 0x00

18

Interaction avec la carte laide dun programme Java - CNAM