TP1 Java Corrige
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
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