S.
Bouzefrane
TP2 : Interaction avec la carte puce laide dun programme Java sous Windows
Samia BOUZEFRANE [Link] [Link]@[Link] 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 [Link] 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 : ([Link] b) Tlcharger et installer Eclipse galileo pour Windows ([Link] nloads/release/galileo/SR1/[Link]). c) Tlcharger loutil de dveloppement de JavaCard [Link] dans un rpertoire local par exemple C:\JavaCard, partir du lien suivant : [Link] 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\[Link] 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 [Link]. 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).
[Link] : 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.
[Link] : sert configurer le lecteur de carte puce en mettant son nom.
[Link] : le squelette de lapplet
[Link] : sert compiler [Link] et gnrer ventuellement le fichier [Link] qui sera install sur la carte. Ce fichier comprend bien entendu lAID de lapplet ainsi que lAID du package auquel lapplet appartient. [Link] : 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 [Link] en changeant le nom du lecteur. b) Dveloppement de la partie terminal ([Link]). c) Excution de la partie terminal.
Modification du [Link] - La premire tape consiste modifier le fichier [Link] 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 [Link] (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 [Link]. -Ouvrir le fichier [Link] (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 [Link]. Cliquer sur le bouton droit de la souris sur le fichier [Link]. 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 [Link]; import [Link]; import [Link]; import [Link]; import [Link]; import [Link]; import [Link]; import [Link]; import [Link]; import [Link]; import [Link];
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 = [Link](); CardTerminals list = [Link](); CardTerminal cad = [Link]("GENERIC2KXP USB Smart Card Reader 0"); if (cad == null) { [Link]("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 = [Link]("T=0"); [Link]("Card : "+c); [Link]("\n"); //Afficher l'ATR et sa taille (reset the card) [Link] atr = [Link](); [Link]("ATR : "+ [Link]([Link](), " ")); [Link]("Taille "+ [Link]()); [Link]("\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 [Link]("Commande ADPU >" + [Link]([Link](), " ")); //Envoyer la commande APDU CardChannel cc = [Link](); [Link] rapdu = [Link](capdu); //Afficher la rponse APDU [Link]("Rponse APDU [Link]([Link](), " "));
< " +
// Si (status succes) alors //if ((rapdu.getSW1()==0x90) && (rapdu.getSW2()==0x00)) //{ //[Link]("Succes "); //[Link]("\n"); //} // Faire un Get Response A0 C0 00 00 1A capdu = new CommandAPDU((byte)0xA0,(byte)0xC0, (byte)0x00, (byte)0x00, (byte)0x1A); [Link]("Commande ADPU > " + [Link]([Link](), " ")); rapdu = [Link](capdu); [Link]("Rponse APDU < " + [Link]([Link](), " "));
// Dconnexion [Link](false); } catch (Exception e) { [Link](); [Link](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