Académique Documents
Professionnel Documents
Culture Documents
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
S. Bouzefrane
S. Bouzefrane
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.
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
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
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).
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.
S. Bouzefrane
S. Bouzefrane
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
S. Bouzefrane
Vous devriez voir cette fentre, mais afin de visualiser les packages de ce projet cliquer sur + devant JSR268TK-2
S. Bouzefrane
10
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.
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
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)
12
S. Bouzefrane
Copier le nom de lecteur entre la balise </cad> et </cad>. Faite attention quil ny ait pas despace.
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
S. Bouzefrane
Dclaration de Constantes
- 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
S. Bouzefrane
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
S. Bouzefrane
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
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(), " "));
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
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