TP1 Java Corrige

of 18 /18
S. Bouzefrane 1 Interaction avec la carte à l’aide d’un programme Java - CNAM TP2 : Interaction avec la carte à puce à l’aide d’un programme Java sous Windows Samia BOUZEFRANE http://cedric.cnam.fr/~bouzefra/pfsem10-11.html [email protected] Laboratoire CEDRIC Chaire Systèmes Embarqués et Enfouis CNAM

Embed Size (px)

Transcript of TP1 Java Corrige

  • S. Bouzefrane

    1 Interaction avec la carte laide dun programme Java - CNAM

    TP2 : Interaction avec la carte puce

    laide dun programme Java

    sous Windows

    Samia BOUZEFRANE

    http://cedric.cnam.fr/~bouzefra/pfsem10-11.html

    [email protected]

    Laboratoire CEDRIC

    Chaire Systmes Embarqus et Enfouis

    CNAM

  • S. Bouzefrane

    2 Interaction avec la carte laide dun programme Java - CNAM

  • S. Bouzefrane

    3 Interaction avec la carte laide dun programme Java - CNAM

    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

    ATR : Rponse un Reset Answer To Reset

    ATR(byte[] atr) construit un ATR partir dun tableau doctets.

    boolean equals(Object obj) Compares the specified object with this ATR

    for equality.

    byte[]getBytes() Returns a copy of the bytes in this ATR.

    String toString() Returns a string representation of this ATR.

    Card : Etablissement de connexions

    Protected Card() construit un objet Card.

    abstract void disconnect(boolean reset)

    dconnexion de la carte.

    abstract ATR getATR() retourne lATR de la carte.

    abstract String getProtocol() retourne le protocole de cette carte.

    abstract CardChannel getBasicChannel() retourne le CardChannel dun canal logique de base

  • S. Bouzefrane

    4 Interaction avec la carte laide dun programme Java - CNAM

    CardChannel : Connexion logique la carte puce

    protected CardChannel() construit un objet CardChannel

    abstract void close() ferme le CardChannel

    abstract ResponseAPDU transmit(CommandAPDU command) envoie la commande APDU vers la carte et retourne une rponse APDU.

    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.

  • S. Bouzefrane

    5 Interaction avec la carte laide dun programme Java - CNAM

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

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

    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.

    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

  • S. Bouzefrane

    6 Interaction avec la carte laide dun programme Java - CNAM

    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

  • S. Bouzefrane

    7 Interaction avec la carte laide dun programme Java - CNAM

    Cliquer alors sur le bouton + devant General Cliquer sur Existing Projects into

    Workspace

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

  • S. Bouzefrane

    8 Interaction avec la carte laide dun programme Java - CNAM

    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

  • S. Bouzefrane

    9 Interaction avec la carte laide dun programme Java - CNAM

    Vous devriez voir cette fentre, mais afin de visualiser les packages de ce projet

    cliquer sur + devant JSR268TK-2

  • S. Bouzefrane

    10 Interaction avec la carte laide dun programme Java - CNAM

    Vous devriez voir cette fentre

  • S. Bouzefrane

    11 Interaction avec la carte laide dun programme Java - CNAM

    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.

  • S. Bouzefrane

    12 Interaction avec la carte laide dun programme Java - CNAM

    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.

    a) 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

    -

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

    Double clique sur Device

    Vous pouvez copier ce nom de lecteur clrt+c

  • S. Bouzefrane

    13 Interaction avec la carte laide dun programme Java - CNAM

    - Enregistrer les modifications en tapant Ctrl+S.

    b) 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 :

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

    Ici une liste des noms des lecteurs en commentaire.

  • S. Bouzefrane

    14 Interaction avec la carte laide dun programme Java - CNAM

    - 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.

    Dclaration de Constantes

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

  • S. Bouzefrane

    15 Interaction avec la carte laide dun programme Java - CNAM

    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.

  • S. Bouzefrane

    16 Interaction avec la carte laide dun programme Java - CNAM

    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

  • S. Bouzefrane

    17 Interaction avec la carte laide dun programme Java - CNAM

    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

  • S. Bouzefrane

    18 Interaction avec la carte laide dun programme Java - CNAM

    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