29/03/13 TP Java Card 1/2 : Utilisation du Javacard Development Kit 2.2.2 de Sun | Groupe SEN sen.enst.fr/node/408 1/12 Accueil :: Enseignement :: Cycle master :: ELECINF359 BCI Cycle master CSMLP ELEC222 ELEC223 ELEC342 - SOC ELEC390 ELECINF344 / ELECINF381 ELECINF359 Etudes biblio 2010-2011 Etudes biblio 2011-2012 Mini-projets 2008-2009 Mini-projets 2009-2010 TD SCA TP Javacard 1/2 TP Javacard 2/2 ELEC920 / NSS04 Projets matériels Les stages TEL Nom d'utilisateur : Mot de passe : Se conne Groupe SEN Systèmes Électroniques Numériques TP Java Card 1/2 : Utilisation du Javacard Development Kit 2.2.2 de Sun Objectif du TP Ce TP a pour but de vous initier à la programmation de cartes Java (Javacard) à l'aide d'un environnement de développement gratuit vous permettant de développer des applets (appelées parfois cardlets car elles s'exécutent sur la carte à puce), développer des applications clientes pour communiquer avec les cartes et de les tester à l'aide d'un simulateur de carte. Ce sujet est inspiré du tutoriel "Introduction à la programmation de Javacard sous Windows" écrit par un ancien élève de l'école et publié sur le site developpez.com (http://julienb.developpez.com/tutoriels/java/introjavacard/). Quelques rappels Les APDU Les échanges entre carte et terminal se font au moyen d'APDUs (suite d'octets respectant nu format défini dans le standard ISO7816-4). Nous utiliserons dans ce TP l'APDU de requête suivante : Offset 1 2 3 4 5 6 ... 6 + (Lc – 1) 6 + Lc Données C LA INS P1 P2 Lc Données (si Lc > 0) Le Où : CLA = octet de classe défini pour des types de cartes particuliers (exemples : 0xBC pour les cartes vitales, 0x0A pour les cartes SIM, 0x00 pour les Mastercard/Visa) INS = octet d'instruction P1 = paramètre 1 P2 = paramètre 2 Lc = taille des données (0x00 si pas de données) Le = taille maximale des données pour la réponse La carte répond en envoyant les données de réponse (si il y a) suivies d'un status word codé sur 2 octets (nommés SW1 et SW2). Généralement, SW1 indique le type de réponse et SW2 fournit des informations supplémentaires. Quelques exemples de status word : SW1 SW2 Signification 0x90 0x00 Pas d'erreur 0x61 xx Pas de problème 0x62 ou 0x63 xx Avertissement 0x64 ou 0x64 xx Erreur d'exécution 0x67 xx Commande incorrecte Identification des applets Les applets sont identifiées par un AID (Applet ID) composé de 16 octets. Les 5 premiers correspondent à l'ID du fournisseur d'application et les 11 suivants identifient l'application. Afin de pouvoir communiquer avec elle, une applet doit être préalablement sélectionnée à l'aide de l'APDU SELECT : C LA INS P1 P2 Lc Données 0x00 0xA4 0x04 0x00 0x10 AID sur 16 octets Limitations de la machine virtuelle Javacard 2.x Le framework Javacard 2.x est un sous-ensemble du langage Java. Il ne supporte que les éléments suivants : types primitifs boolean, byte et short les tableaux à une dimension les packages, classes, interfaces, exceptions l'héritage, les objets virtuels, la surcharge la création d'objets (new) mais uniquement dans son constructeur/sa méthode d'installation (donc pas de création d'objets en runtime) Ainsi les types long, double, float, char, l'objet String et les tableaux à plusieurs dimensions ne sont pas autorisés. Environnement de développement utilisé dans ce TP Afin de pouvoir développer une applet Javacard et une application cliente, nous allons installer l'environnement de développement Javacard. Les outils utilisés dans ce TP sont : le Java Card Development Kit 2.2.2 l'environnement de développement Eclipse version 3.2 le plugin d'intégration Eclipse-JCDE version 0.1 Instructions d'installation Enseignement Connexion utilisateur Vie du groupe SEN Archives BCI Cycle master Projets matériels Les stages TEL Cours en ligne A ide au choix des parcours Affectations de projets Guides, manuels, mementos Projets Recherche Site web COMELEC Site web ENST Intranet COMELEC Wiki COMELEC
12
Embed
TP Java Card 1_2 _ Utilisation Du Javacard Development Kit 2.2
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 112
Accueil Enseignement Cycle master ELECINF359
BCI
Cycle master
CSMLP
ELEC222
ELEC223
ELEC342 - SOC
ELEC390
ELECINF344 ELECINF381
ELECINF359
Etudes biblio 2010-2011
Etudes biblio 2011-2012
Mini-projets 2008-2009
Mini-projets 2009-2010
TD SCA
TP Javacard 12
TP Javacard 22
ELEC920 NSS04
Projets mateacuteriels
Les stages
TEL
Nom dutilisateur
Mot de passe
Se connecter
Groupe SEN Systegravemes Eacute lec troniques Numeacuteriques
TP Java Card 12 Utilisation du Javacard Development Kit 222
de Sun
Objectif du TP
Ce TP a pour but de vous initier agrave la programmation de cartes Java (Javacard) agrave laide dun environnement de deacuteveloppement gratuit
vous permettant de deacutevelopper des applets (appeleacutees parfois cardlets car elles sexeacutecutent sur la carte agrave puce) deacutevelopper des
applications clientes pour communiquer avec les cartes et de les tester agrave laide dun simulateur de carte Ce sujet est inspireacute du
tutoriel Introduction agrave la programmation de Javacard sous Windows eacutecrit par un ancien eacutelegraveve de leacutecole et publieacute sur le site
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 412
Constantes public static final byte CLA_MONAPPLET = (byte) 0xB0
public static final byte INS_INCREMENTER_COMPTEUR = 0x00 public static final byte INS_DECREMENTER_COMPTEUR = 0x01 public static final byte INS_INTERROGER_COMPTEUR = 0x02 public static final byte INS_INITIALISER_COMPTEUR = 0x03
Attributs private byte compteur
Constructeur private MonApplet() compteur = 0
public static void install(byte bArray[] short bOffset byte bLength) throws ISOException new MonApplet()register()
Puis nous codons notre meacutethode process
public void process(APDU apdu) throws ISOException byte[] buffer = apdugetBuffer()
if (thisselectingApplet()) return
if (buffer[ISO7816OFFSET_CLA] = CLA_MONAPPLET) ISOExceptionthrowIt(ISO7816SW_CLA_NOT_SUPPORTED)
switch (buffer[ISO7816OFFSET_INS]) case INS_INCREMENTER_COMPTEUR compteur++ break
case INS_DECREMENTER_COMPTEUR compteur-- break
case INS_INTERROGER_COMPTEUR buffer[0] = compteur apdusetOutgoingAndSend((short) 0 (short) 1) break
case INS_INITIALISER_COMPTEUR apdusetIncomingAndReceive() compteur = buffer[ISO7816OFFSET_CDATA] break
Il faut eacutegalement rendre les scripts exeacutecutables et eacuteventuellement ajouter le chemin daccegraves dans le PATH pour plus de faciliteacute
~ELECINF359$ cd java_card_kit-2_2_2bin~ELECINF359java_card_kit-2_2_2bin$ chmod a+x ~ELECINF359java_card_kit-2_2_2bin$ export PATH=$PATH$JC_HOMEbin
APDUTOOL envoireacuteception dAPDU
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 512
Loutil APDUTOOL du JCDK permet deacutechanger des APDU avec une Javacard reacuteelle ou un simulateur Nous lutiliserons dans la suite
de ce tutoriel
JCWDE simulateur sans conservation deacutetat
Le simulateur JCWDE ne neacutecessite pas de phase dupload de code Il nous suffit juste dinstaller puis de seacutelectionner notre applet
pour pouvoir la faire fonctionner
Dans le menu JCWDE dEclipse seacutelectionner Start
Cliquer sur le bouton OK pour lancer le simulateur JCWDE avec notre applet Le simulateur est alors lanceacute et attend une connexion
(le simulateur et loutil apdutool communiquent agrave laide dune socket reacuteseau) Nous pouvons alors lancer loutil APDUTOOL Pour cela
ouvrir un terminal dans lequel on aura pris soin de deacutefinir les variables denvironnement puis taper apdutool et valider
~ELECINF359$ apdutoolJava Card 222 APDU Tool Version 13Copyright 2005 Sun Microsystems Inc All rights reserved Use is subject to license termsOpening connection to localhost on port 9025Connected
Installons notre applet en recopiant les APDU contenus dans le script create-MonAppletscript (sauf la derniegravere instruction
0x4A - 1 = 0x49 Le reacutesultat est coheacuterent Nous allons nous deacuteconnecter du simulateur en tapant powerdown dans apdutool
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 612
ce qui provoque la fermeture de JCWDE dans la console dEclipse
powerdown
CREF simulateur avec conservation deacutetat
JCWDE a lavantage de ne pas neacutecessiter lupload de lapplet sur le simulateur ce qui le rend plus souple dutilisation par rapport agrave
CREF En revanche degraves que JCWDE est stoppeacute (agrave la reception dune commande powerdown par exemple) leacutetat de la carte nest pas
conserveacute (la valeur du compteur dans le cas lapplet de ce TP) contrairement agrave ce qui se passe avec une vrai carte (si la carte est
retireacutee du lecteur la valeur du compteur reste conserveacutee dans la meacutemoire EEPROM de la carte)
Les options de ligne de commande que nous allons utiliser
-i fichier_eeprom initialise leacutetat de la carte avec limage fichier_eeprom-o fichier_eeprom enregistre leacutetat de la carte dans fichier_eeprom
Nous pouvons lancer CREF et creacuteer notre fichier image Pour cela ouvrir un terminal dans lequel on aura pris soin de deacutefinir les
variables denvironnement (cf plus haut) puis taper cref ndasho monappleteeprom et valider
~ELECINF359$ cref ndasho monappleteepromJava Card 222 C Reference Implementation Simulator (version 041)32-bit Address Space implementation - with cryptography supportT=1 T=CL Dual interface APDU protocol (ISO 7816-3)Copyright 2005 Sun Microsystems Inc All rights reserved
Memory configuration Type Base Size Max Addr RAM 0x0 0x1000 0xfff ROM 0x2000 0xe000 0xffff E2P 0x10020 0xffe0 0x1ffff
ROM Mask size = 0xce64 = 52836 bytes Highest ROM address in mask = 0xee63 = 61027 bytes Space available in ROM = 0x119c = 4508 bytesEEPROM will be saved in file monappleteepromMask has now been initialized for use
Chargeons maintenant notre applet Pour cela clic droit sur le package monpackage Java Card Tools Deploy
Nous pouvons voir les APDUs envoyeacutes dans la zone Console dEclipse
Les status word 0x9000 indiquent que lupload sest deacuterouleacute correctement
Relanccedilons CREF afin dinstaller notre applet en prenant soin de recharger notre fichier image (option ndashi)
~ELECINF359$ cref ndashi monappleteeprom ndasho monappleteepromJava Card 222 C Reference Implementation Simulator (version 041)32-bit Address Space implementation - with cryptography supportT=1 T=CL Dual interface APDU protocol (ISO 7816-3)Copyright 2005 Sun Microsystems Inc All rights reserved
Memory configuration Type Base Size Max Addr RAM 0x0 0x1000 0xfff ROM 0x2000 0xe000 0xffff E2P 0x10020 0xffe0 0x1ffff
ROM Mask size = 0xce64 = 52836 bytes Highest ROM address in mask = 0xee63 = 61027 bytes Space available in ROM = 0x119c = 4508 bytesEEPROM (0xffe0 bytes) restored from file monappleteepromUsing a pre-initialized Mask
Installons notre applet Pour cela dans Eclipse clic droit sur le script create-MonAppletscript Java Card Tools Run Script
Agrave ce stade nous pouvons utiliser apdutool pour tester notre carte de la mecircme maniegravere quavec JCWDE en prenant soin de ne pas
oublier la commande powerup et la seacutelection de lapplet Commenccedilons par relancer CREF (qui sest termineacute sur une commande
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 712
32-bit Address Space implementation - with cryptography supportT=1 T=CL Dual interface APDU protocol (ISO 7816-3)Copyright 2005 Sun Microsystems Inc All rights reserved
Memory configuration Type Base Size Max Addr RAM 0x0 0x1000 0xfff ROM 0x2000 0xe000 0xffff E2P 0x10020 0xffe0 0x1ffff
ROM Mask size = 0xce64 = 52836 bytes Highest ROM address in mask = 0xee63 = 61027 bytes Space available in ROM = 0x119c = 4508 bytesEEPROM (0xffe0 bytes) restored from file monappleteepromUsing a pre-initialized Mask
Puis dans un autre terminal lanccedilons apdutool seacutelectionnons notre applet apregraves quoi nous pouvons envoyer des APDU agrave notre
applet
~ELECINF359$ apdutoolJava Card 222 APDU Tool Version 13Copyright 2005 Sun Microsystems Inc All rights reserved Use is subject to license termsOpening connection to localhost on port 9025ConnectedpowerupReceived ATR = 0x3b 0xf0 0x11 0x00 0xff 0x01 select MonApplet applet0x00 0xA4 0x04 0x00 0xb 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x00 0x00 0x7FCLA 00 INS a4 P1 04 P2 00 Lc 0b 01 02 03 04 05 06 07 08 09 00 00 Le 00 SW1 90 SW2 000xB0 0x00 0x00 0x00 0x00 0x7FCLA b0 INS 00 P1 00 P2 00 Lc 00 Le 00 SW1 90 SW2 000xB0 0x02 0x00 0x00 0x00 0x7FCLA b0 INS 02 P1 00 P2 00 Lc 00 Le 01 01 SW1 90 SW2 00powerdown
Codage dune application cliente
Maintenant que nous avons programmeacute notre applet Javcard nous pouvons coder une application cliente leacutequivalent du terminal
bancaire si notre Javacard eacutetait une carte de paiement
Creacuteation du projet sous Eclipse
Creacuteons un nouveau projet Pour cela dans Eclipse aller dans le menu File faire New puis Project
Choisir Java Project puis confirmer en cliquant sur Next
Donner un nom au nouveau projet puis cliquer sur Finish
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 812
Ajout de la librairie laquo apduio raquo dans le classpath
Afin de pouvoir utiliser les classes servant agrave communiquer avec notre Javacard il faut ajouter la bibliothegraveque apduiojar(preacutesente dans le reacutepertoire ~ELECINF359java_card_kit-2_2_2lib) Pour cela faire un clic droit sur notre nouveau
projet puis Proprieacuteteacutes
Dans la section Java Build Path seacutelectionner longlet Librairies et cliquer sur le bouton Add External Jars
Seacutelectionner alors le fichier apduiojar valider et appuyer sur le bouton OK
Creacuteation de la classe principale
Tout dabord creacuteons un nouveau package Pour cela faire un clic droit sur notre projet puis New et Package
Donner un nom au package puis valider agrave laide du bouton Finish
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 912
Creacuteons maintenant la classe principale de notre application Pour cela faire un clic droit sur le package creacuteeacute puis New et Class
Donnons un nom agrave notre nouvelle classe cocher la case public static void main puis cliquer sur Finish
Code pour se connecter agrave la Javacard
La connexion au simulateur se fait via une socket Le simulateur eacutecoute par deacutefaut sur le port 9025 La classe que nous utiliserons
pour les eacutechanges de donneacutees est CadT1Client
Connexion a la Javacard CadT1Client cad Socket sckCarte try sckCarte = new Socket(localhost 9025) sckCartesetTcpNoDelay(true) BufferedInputStream input = new BufferedInputStream(sckCartegetInputStream()) BufferedOutputStream output = new BufferedOutputStream(sckCartegetOutputStream()) cad = new CadT1Client(input output) catch (Exception e) Systemoutprintln(Erreur impossible de se connecter a la Javacard) return
Mise sous tension de la carte try cadpowerUp() catch (Exception e) Systemoutprintln(Erreur lors de lenvoi de la commande Powerup a la Javacard) return
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 1012
Code pour se deacuteconnecter de la Javacard
La deacuteconnexion de la Javacard se fera via la meacutethode powerDown() de la classe CadT1Client
Mise hors tension de la carte try cadpowerDown() catch (Exception e) Systemoutprintln(Erreur lors de lenvoi de la commande Powerdown a la Javacard) return
Code pour seacutelectionner lapplet Javacard
La seacutelection dapplet se fait en envoyant lAPDU deacutecrite preacuteceacutedemment
Seacutelection de lapplet Apdu apdu = new Apdu() apducommand[ApduCLA] = 0x00 apducommand[ApduINS] = (byte) 0xA4 apducommand[ApduP1] = 0x04 apducommand[ApduP2] = 0x00 byte[] appletAID = 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x00 0x00 apdusetDataIn(appletAID) cadexchangeApdu(apdu) if (apdugetStatus() = 0x9000) Systemoutprintln(Erreur lors de la seacutelection de lapplet) Systemexit(1)
Note cette phase de seacutelection nest pas indispensable pour le simulateur JCWDE
Code de la boucle principale de lapplication
Voici le code de la boucle principale de lapplication Il suffit pour chaque opeacuteration dinitialiser correctement une instance de lobjet
APDU et de lenvoyer agrave la carte via linstance de la classe CadT1Client
Menu principal boolean fin = false while (fin) Systemoutprintln() Systemoutprintln(Application cliente Javacard) Systemoutprintln(----------------------------) Systemoutprintln() Systemoutprintln(1 - Interroger le compteur) Systemoutprintln(2 - Inrementer le compteur) Systemoutprintln(3 - Decrementer le compteur) Systemoutprintln(4 - Reinitialiser le compteur) Systemoutprintln(5 - Quitter) Systemoutprintln() Systemoutprintln(Votre choix )
int choix = Systeminread() while ((choix gt= 1 ampamp choix lt= 5)) choix = Systeminread()
switch (choix) case 1 apducommand[ApduINS] = MaclasseINS_INTERROGER_COMPTEUR cadexchangeApdu(apdu) if (apdugetStatus() = 0x9000) Systemoutprintln(Erreur status word different de 0x9000) else Systemoutprintln(Valeur du compteur + apdudataOut[0]) break
case 2 apducommand[ApduINS] = MaclasseINS_INCREMENTER_COMPTEUR cadexchangeApdu(apdu) if (apdugetStatus() = 0x9000) Systemoutprintln(Erreur status word different de 0x9000) else Systemoutprintln(OK) break
case 3 apducommand[ApduINS] = MaclasseINS_DECREMENTER_COMPTEUR cadexchangeApdu(apdu) if (apdugetStatus() = 0x9000) Systemoutprintln(Erreur status word different de 0x9000) else Systemoutprintln(OK) break
case 4
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 1112
apducommand[ApduINS] = MaclasseINS_INITIALISER_COMPTEUR byte[] donnees = new byte[1] donnees[0] = 0 apdusetDataIn(donnees) cadexchangeApdu(apdu) if (apdugetStatus() = 0x9000) Systemoutprintln(Erreur status word different de 0x9000) else Systemoutprintln(OK) break
case 5 fin = true break
Le code source de lapplication est disponible ici Maclassejava
Utilisation de lapplication cliente et dun simulateur
Avec JCWDE
Afin de pouvoir lancer le simulateur de notre applet en ligne de commande nous allons creacuteer un fichier de configuration Il permet
de lister les applets Javacard agrave installer pour la simulation et de speacutecifier leurs AID respectifs
Creacuteons notre fichier que nous appellerons monappletapp Il contiendra la ligne suivante
Nous pouvons maintenant lancer notre simulateur en prenant soin de nous placer dans le bon reacutepertoire (reacutepertoire parent du
package contenant le fichier class de lapplet)
~$ cd workspaceTutoriel Javacardbin~workspaceTutoriel Javacardbin$ jcwde monappletappJava Card 222 Workstation Development Environment Version 13Copyright 2005 Sun Microsystems Inc All rights reserved Use is subject to license termsjcwde is listening for T=1 Apdus on TCPIP port 9 025
Maintenant que notre simulateur est lanceacute lanccedilons notre application cliente
Commenccedilons par interroger le compteur tapons 1 puis validons
Le compteur est bien agrave 0 Increacutementons maintenant le compteur 3 fois puis deacutecreacutementons-le une fois Lorsque nous reacuteinterrogeons la
carte le compteur vaut 2 donc tout va bien
Quittons maintenant notre application cliente (commande 5) Nous pouvons voir que le simulateur se termine automatiquement agrave la
reacuteception de la commande powerdown
jcwde exiting on receipt of power down command
Rappel ce simulateur ne permet pas de conserver leacutetat de la carte Si nous le relanccedilons le compteur sera agrave 0 et non agrave 2
Avec CREF
Lanccedilons CREF agrave partir de limage EEPROM que nous avons geacuteneacutereacutee
~ELECINF359$ cref ndashi monappleteeprom ndasho monappleteepromJava Card 222 C Reference Implementation Simulator (version 041)32-bit Address Space implementation - with cryptography supportT=1 T=CL Dual interface APDU protocol (ISO 7816-3)Copyright 2005 Sun Microsystems Inc All rights reserved
Memory configuration
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 1212
(c) COMELEC 2007
Type Base Size Max Addr RAM 0x0 0x1000 0xfff ROM 0x2000 0xe000 0xffff E2P 0x10020 0xffe0 0x1ffff
ROM Mask size = 0xce64 = 52836 bytes Highest ROM address in mask = 0xee63 = 61027 bytes Space available in ROM = 0x119c = 4508 bytesEEPROM (0xffe0 bytes) restored from file monappleteepromUsing a pre-initialized Mask
Nous pouvons deacutesormais lancer notre application cliente et observer les mecircmes reacutesultats quavec JCWDE en revanche leacutetat de la
carte (le compteur) sera conserveacute dune session agrave lautre
Pour aller plus loin
Si le cœur vous en dit vous pouvez uploader votre magnifique compteur sur une vraie Javacard cest sur cette page que ccedila se
passe
FilenameTitle Taille
Maclassejava 412 Ko
eclipse-jcde-01-linuxtgz 13554 Ko
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 212
Installation du Java Card Development Kit 222
Deacutezipper larchive dans le reacutepertoire de votre choix (~ELECINF359 par exemple) (pour information larchive a eacutetampeacute
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 412
Constantes public static final byte CLA_MONAPPLET = (byte) 0xB0
public static final byte INS_INCREMENTER_COMPTEUR = 0x00 public static final byte INS_DECREMENTER_COMPTEUR = 0x01 public static final byte INS_INTERROGER_COMPTEUR = 0x02 public static final byte INS_INITIALISER_COMPTEUR = 0x03
Attributs private byte compteur
Constructeur private MonApplet() compteur = 0
public static void install(byte bArray[] short bOffset byte bLength) throws ISOException new MonApplet()register()
Puis nous codons notre meacutethode process
public void process(APDU apdu) throws ISOException byte[] buffer = apdugetBuffer()
if (thisselectingApplet()) return
if (buffer[ISO7816OFFSET_CLA] = CLA_MONAPPLET) ISOExceptionthrowIt(ISO7816SW_CLA_NOT_SUPPORTED)
switch (buffer[ISO7816OFFSET_INS]) case INS_INCREMENTER_COMPTEUR compteur++ break
case INS_DECREMENTER_COMPTEUR compteur-- break
case INS_INTERROGER_COMPTEUR buffer[0] = compteur apdusetOutgoingAndSend((short) 0 (short) 1) break
case INS_INITIALISER_COMPTEUR apdusetIncomingAndReceive() compteur = buffer[ISO7816OFFSET_CDATA] break
Il faut eacutegalement rendre les scripts exeacutecutables et eacuteventuellement ajouter le chemin daccegraves dans le PATH pour plus de faciliteacute
~ELECINF359$ cd java_card_kit-2_2_2bin~ELECINF359java_card_kit-2_2_2bin$ chmod a+x ~ELECINF359java_card_kit-2_2_2bin$ export PATH=$PATH$JC_HOMEbin
APDUTOOL envoireacuteception dAPDU
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 512
Loutil APDUTOOL du JCDK permet deacutechanger des APDU avec une Javacard reacuteelle ou un simulateur Nous lutiliserons dans la suite
de ce tutoriel
JCWDE simulateur sans conservation deacutetat
Le simulateur JCWDE ne neacutecessite pas de phase dupload de code Il nous suffit juste dinstaller puis de seacutelectionner notre applet
pour pouvoir la faire fonctionner
Dans le menu JCWDE dEclipse seacutelectionner Start
Cliquer sur le bouton OK pour lancer le simulateur JCWDE avec notre applet Le simulateur est alors lanceacute et attend une connexion
(le simulateur et loutil apdutool communiquent agrave laide dune socket reacuteseau) Nous pouvons alors lancer loutil APDUTOOL Pour cela
ouvrir un terminal dans lequel on aura pris soin de deacutefinir les variables denvironnement puis taper apdutool et valider
~ELECINF359$ apdutoolJava Card 222 APDU Tool Version 13Copyright 2005 Sun Microsystems Inc All rights reserved Use is subject to license termsOpening connection to localhost on port 9025Connected
Installons notre applet en recopiant les APDU contenus dans le script create-MonAppletscript (sauf la derniegravere instruction
0x4A - 1 = 0x49 Le reacutesultat est coheacuterent Nous allons nous deacuteconnecter du simulateur en tapant powerdown dans apdutool
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 612
ce qui provoque la fermeture de JCWDE dans la console dEclipse
powerdown
CREF simulateur avec conservation deacutetat
JCWDE a lavantage de ne pas neacutecessiter lupload de lapplet sur le simulateur ce qui le rend plus souple dutilisation par rapport agrave
CREF En revanche degraves que JCWDE est stoppeacute (agrave la reception dune commande powerdown par exemple) leacutetat de la carte nest pas
conserveacute (la valeur du compteur dans le cas lapplet de ce TP) contrairement agrave ce qui se passe avec une vrai carte (si la carte est
retireacutee du lecteur la valeur du compteur reste conserveacutee dans la meacutemoire EEPROM de la carte)
Les options de ligne de commande que nous allons utiliser
-i fichier_eeprom initialise leacutetat de la carte avec limage fichier_eeprom-o fichier_eeprom enregistre leacutetat de la carte dans fichier_eeprom
Nous pouvons lancer CREF et creacuteer notre fichier image Pour cela ouvrir un terminal dans lequel on aura pris soin de deacutefinir les
variables denvironnement (cf plus haut) puis taper cref ndasho monappleteeprom et valider
~ELECINF359$ cref ndasho monappleteepromJava Card 222 C Reference Implementation Simulator (version 041)32-bit Address Space implementation - with cryptography supportT=1 T=CL Dual interface APDU protocol (ISO 7816-3)Copyright 2005 Sun Microsystems Inc All rights reserved
Memory configuration Type Base Size Max Addr RAM 0x0 0x1000 0xfff ROM 0x2000 0xe000 0xffff E2P 0x10020 0xffe0 0x1ffff
ROM Mask size = 0xce64 = 52836 bytes Highest ROM address in mask = 0xee63 = 61027 bytes Space available in ROM = 0x119c = 4508 bytesEEPROM will be saved in file monappleteepromMask has now been initialized for use
Chargeons maintenant notre applet Pour cela clic droit sur le package monpackage Java Card Tools Deploy
Nous pouvons voir les APDUs envoyeacutes dans la zone Console dEclipse
Les status word 0x9000 indiquent que lupload sest deacuterouleacute correctement
Relanccedilons CREF afin dinstaller notre applet en prenant soin de recharger notre fichier image (option ndashi)
~ELECINF359$ cref ndashi monappleteeprom ndasho monappleteepromJava Card 222 C Reference Implementation Simulator (version 041)32-bit Address Space implementation - with cryptography supportT=1 T=CL Dual interface APDU protocol (ISO 7816-3)Copyright 2005 Sun Microsystems Inc All rights reserved
Memory configuration Type Base Size Max Addr RAM 0x0 0x1000 0xfff ROM 0x2000 0xe000 0xffff E2P 0x10020 0xffe0 0x1ffff
ROM Mask size = 0xce64 = 52836 bytes Highest ROM address in mask = 0xee63 = 61027 bytes Space available in ROM = 0x119c = 4508 bytesEEPROM (0xffe0 bytes) restored from file monappleteepromUsing a pre-initialized Mask
Installons notre applet Pour cela dans Eclipse clic droit sur le script create-MonAppletscript Java Card Tools Run Script
Agrave ce stade nous pouvons utiliser apdutool pour tester notre carte de la mecircme maniegravere quavec JCWDE en prenant soin de ne pas
oublier la commande powerup et la seacutelection de lapplet Commenccedilons par relancer CREF (qui sest termineacute sur une commande
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 712
32-bit Address Space implementation - with cryptography supportT=1 T=CL Dual interface APDU protocol (ISO 7816-3)Copyright 2005 Sun Microsystems Inc All rights reserved
Memory configuration Type Base Size Max Addr RAM 0x0 0x1000 0xfff ROM 0x2000 0xe000 0xffff E2P 0x10020 0xffe0 0x1ffff
ROM Mask size = 0xce64 = 52836 bytes Highest ROM address in mask = 0xee63 = 61027 bytes Space available in ROM = 0x119c = 4508 bytesEEPROM (0xffe0 bytes) restored from file monappleteepromUsing a pre-initialized Mask
Puis dans un autre terminal lanccedilons apdutool seacutelectionnons notre applet apregraves quoi nous pouvons envoyer des APDU agrave notre
applet
~ELECINF359$ apdutoolJava Card 222 APDU Tool Version 13Copyright 2005 Sun Microsystems Inc All rights reserved Use is subject to license termsOpening connection to localhost on port 9025ConnectedpowerupReceived ATR = 0x3b 0xf0 0x11 0x00 0xff 0x01 select MonApplet applet0x00 0xA4 0x04 0x00 0xb 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x00 0x00 0x7FCLA 00 INS a4 P1 04 P2 00 Lc 0b 01 02 03 04 05 06 07 08 09 00 00 Le 00 SW1 90 SW2 000xB0 0x00 0x00 0x00 0x00 0x7FCLA b0 INS 00 P1 00 P2 00 Lc 00 Le 00 SW1 90 SW2 000xB0 0x02 0x00 0x00 0x00 0x7FCLA b0 INS 02 P1 00 P2 00 Lc 00 Le 01 01 SW1 90 SW2 00powerdown
Codage dune application cliente
Maintenant que nous avons programmeacute notre applet Javcard nous pouvons coder une application cliente leacutequivalent du terminal
bancaire si notre Javacard eacutetait une carte de paiement
Creacuteation du projet sous Eclipse
Creacuteons un nouveau projet Pour cela dans Eclipse aller dans le menu File faire New puis Project
Choisir Java Project puis confirmer en cliquant sur Next
Donner un nom au nouveau projet puis cliquer sur Finish
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 812
Ajout de la librairie laquo apduio raquo dans le classpath
Afin de pouvoir utiliser les classes servant agrave communiquer avec notre Javacard il faut ajouter la bibliothegraveque apduiojar(preacutesente dans le reacutepertoire ~ELECINF359java_card_kit-2_2_2lib) Pour cela faire un clic droit sur notre nouveau
projet puis Proprieacuteteacutes
Dans la section Java Build Path seacutelectionner longlet Librairies et cliquer sur le bouton Add External Jars
Seacutelectionner alors le fichier apduiojar valider et appuyer sur le bouton OK
Creacuteation de la classe principale
Tout dabord creacuteons un nouveau package Pour cela faire un clic droit sur notre projet puis New et Package
Donner un nom au package puis valider agrave laide du bouton Finish
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 912
Creacuteons maintenant la classe principale de notre application Pour cela faire un clic droit sur le package creacuteeacute puis New et Class
Donnons un nom agrave notre nouvelle classe cocher la case public static void main puis cliquer sur Finish
Code pour se connecter agrave la Javacard
La connexion au simulateur se fait via une socket Le simulateur eacutecoute par deacutefaut sur le port 9025 La classe que nous utiliserons
pour les eacutechanges de donneacutees est CadT1Client
Connexion a la Javacard CadT1Client cad Socket sckCarte try sckCarte = new Socket(localhost 9025) sckCartesetTcpNoDelay(true) BufferedInputStream input = new BufferedInputStream(sckCartegetInputStream()) BufferedOutputStream output = new BufferedOutputStream(sckCartegetOutputStream()) cad = new CadT1Client(input output) catch (Exception e) Systemoutprintln(Erreur impossible de se connecter a la Javacard) return
Mise sous tension de la carte try cadpowerUp() catch (Exception e) Systemoutprintln(Erreur lors de lenvoi de la commande Powerup a la Javacard) return
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 1012
Code pour se deacuteconnecter de la Javacard
La deacuteconnexion de la Javacard se fera via la meacutethode powerDown() de la classe CadT1Client
Mise hors tension de la carte try cadpowerDown() catch (Exception e) Systemoutprintln(Erreur lors de lenvoi de la commande Powerdown a la Javacard) return
Code pour seacutelectionner lapplet Javacard
La seacutelection dapplet se fait en envoyant lAPDU deacutecrite preacuteceacutedemment
Seacutelection de lapplet Apdu apdu = new Apdu() apducommand[ApduCLA] = 0x00 apducommand[ApduINS] = (byte) 0xA4 apducommand[ApduP1] = 0x04 apducommand[ApduP2] = 0x00 byte[] appletAID = 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x00 0x00 apdusetDataIn(appletAID) cadexchangeApdu(apdu) if (apdugetStatus() = 0x9000) Systemoutprintln(Erreur lors de la seacutelection de lapplet) Systemexit(1)
Note cette phase de seacutelection nest pas indispensable pour le simulateur JCWDE
Code de la boucle principale de lapplication
Voici le code de la boucle principale de lapplication Il suffit pour chaque opeacuteration dinitialiser correctement une instance de lobjet
APDU et de lenvoyer agrave la carte via linstance de la classe CadT1Client
Menu principal boolean fin = false while (fin) Systemoutprintln() Systemoutprintln(Application cliente Javacard) Systemoutprintln(----------------------------) Systemoutprintln() Systemoutprintln(1 - Interroger le compteur) Systemoutprintln(2 - Inrementer le compteur) Systemoutprintln(3 - Decrementer le compteur) Systemoutprintln(4 - Reinitialiser le compteur) Systemoutprintln(5 - Quitter) Systemoutprintln() Systemoutprintln(Votre choix )
int choix = Systeminread() while ((choix gt= 1 ampamp choix lt= 5)) choix = Systeminread()
switch (choix) case 1 apducommand[ApduINS] = MaclasseINS_INTERROGER_COMPTEUR cadexchangeApdu(apdu) if (apdugetStatus() = 0x9000) Systemoutprintln(Erreur status word different de 0x9000) else Systemoutprintln(Valeur du compteur + apdudataOut[0]) break
case 2 apducommand[ApduINS] = MaclasseINS_INCREMENTER_COMPTEUR cadexchangeApdu(apdu) if (apdugetStatus() = 0x9000) Systemoutprintln(Erreur status word different de 0x9000) else Systemoutprintln(OK) break
case 3 apducommand[ApduINS] = MaclasseINS_DECREMENTER_COMPTEUR cadexchangeApdu(apdu) if (apdugetStatus() = 0x9000) Systemoutprintln(Erreur status word different de 0x9000) else Systemoutprintln(OK) break
case 4
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 1112
apducommand[ApduINS] = MaclasseINS_INITIALISER_COMPTEUR byte[] donnees = new byte[1] donnees[0] = 0 apdusetDataIn(donnees) cadexchangeApdu(apdu) if (apdugetStatus() = 0x9000) Systemoutprintln(Erreur status word different de 0x9000) else Systemoutprintln(OK) break
case 5 fin = true break
Le code source de lapplication est disponible ici Maclassejava
Utilisation de lapplication cliente et dun simulateur
Avec JCWDE
Afin de pouvoir lancer le simulateur de notre applet en ligne de commande nous allons creacuteer un fichier de configuration Il permet
de lister les applets Javacard agrave installer pour la simulation et de speacutecifier leurs AID respectifs
Creacuteons notre fichier que nous appellerons monappletapp Il contiendra la ligne suivante
Nous pouvons maintenant lancer notre simulateur en prenant soin de nous placer dans le bon reacutepertoire (reacutepertoire parent du
package contenant le fichier class de lapplet)
~$ cd workspaceTutoriel Javacardbin~workspaceTutoriel Javacardbin$ jcwde monappletappJava Card 222 Workstation Development Environment Version 13Copyright 2005 Sun Microsystems Inc All rights reserved Use is subject to license termsjcwde is listening for T=1 Apdus on TCPIP port 9 025
Maintenant que notre simulateur est lanceacute lanccedilons notre application cliente
Commenccedilons par interroger le compteur tapons 1 puis validons
Le compteur est bien agrave 0 Increacutementons maintenant le compteur 3 fois puis deacutecreacutementons-le une fois Lorsque nous reacuteinterrogeons la
carte le compteur vaut 2 donc tout va bien
Quittons maintenant notre application cliente (commande 5) Nous pouvons voir que le simulateur se termine automatiquement agrave la
reacuteception de la commande powerdown
jcwde exiting on receipt of power down command
Rappel ce simulateur ne permet pas de conserver leacutetat de la carte Si nous le relanccedilons le compteur sera agrave 0 et non agrave 2
Avec CREF
Lanccedilons CREF agrave partir de limage EEPROM que nous avons geacuteneacutereacutee
~ELECINF359$ cref ndashi monappleteeprom ndasho monappleteepromJava Card 222 C Reference Implementation Simulator (version 041)32-bit Address Space implementation - with cryptography supportT=1 T=CL Dual interface APDU protocol (ISO 7816-3)Copyright 2005 Sun Microsystems Inc All rights reserved
Memory configuration
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 1212
(c) COMELEC 2007
Type Base Size Max Addr RAM 0x0 0x1000 0xfff ROM 0x2000 0xe000 0xffff E2P 0x10020 0xffe0 0x1ffff
ROM Mask size = 0xce64 = 52836 bytes Highest ROM address in mask = 0xee63 = 61027 bytes Space available in ROM = 0x119c = 4508 bytesEEPROM (0xffe0 bytes) restored from file monappleteepromUsing a pre-initialized Mask
Nous pouvons deacutesormais lancer notre application cliente et observer les mecircmes reacutesultats quavec JCWDE en revanche leacutetat de la
carte (le compteur) sera conserveacute dune session agrave lautre
Pour aller plus loin
Si le cœur vous en dit vous pouvez uploader votre magnifique compteur sur une vraie Javacard cest sur cette page que ccedila se
passe
FilenameTitle Taille
Maclassejava 412 Ko
eclipse-jcde-01-linuxtgz 13554 Ko
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 312
ainsi quagrave lapplet Nous les appellerons respectivement monpackage et MonApplet
Cliquer alors sur le bouton Finish Eclipse vient de geacuteneacuterer automatiquement le squelette de notre Applet
Clic droit sur le package monpackage Java Card Tools Set Package AID
Appuyer sur le bouton OK Le Package AID doit obligatoirement ecirctre un preacutefixe de lapplet AID
Les meacutethodes et objets cleacutes de lapplet
La meacutethode install est appeleacutee lors de linstallation de lapplet dans la carte Elle instancie notre classe MonApplet et lenregistre
aupregraves du systegraveme de la carte Linstanciation dautres objets (instruction new) est autoriseacutee uniquement dans cette meacutethode (ou
dans le constructeur de la classe)
La meacutethode process est la meacutethode principale de lapplet Elle sera appeleacutee agrave chaque fois que la carte recevra un APDU pour
lapplet en question LAPDU reccedilu sera alors passeacute en paramegravetre de cette meacutethode
Codage de notre applet
Nous allons creacuteer un compteur dans le cadre de ce tutoriel Lapplet comportera 4 fonctions
increacutementer le compteur
deacutecreacutementer le compteur
interroger le compteur
initialiser le compteur agrave une valeur donneacutee
Pour cela nous allons deacutefinir des constantes et un attribut compteur de type primitif byte
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 412
Constantes public static final byte CLA_MONAPPLET = (byte) 0xB0
public static final byte INS_INCREMENTER_COMPTEUR = 0x00 public static final byte INS_DECREMENTER_COMPTEUR = 0x01 public static final byte INS_INTERROGER_COMPTEUR = 0x02 public static final byte INS_INITIALISER_COMPTEUR = 0x03
Attributs private byte compteur
Constructeur private MonApplet() compteur = 0
public static void install(byte bArray[] short bOffset byte bLength) throws ISOException new MonApplet()register()
Puis nous codons notre meacutethode process
public void process(APDU apdu) throws ISOException byte[] buffer = apdugetBuffer()
if (thisselectingApplet()) return
if (buffer[ISO7816OFFSET_CLA] = CLA_MONAPPLET) ISOExceptionthrowIt(ISO7816SW_CLA_NOT_SUPPORTED)
switch (buffer[ISO7816OFFSET_INS]) case INS_INCREMENTER_COMPTEUR compteur++ break
case INS_DECREMENTER_COMPTEUR compteur-- break
case INS_INTERROGER_COMPTEUR buffer[0] = compteur apdusetOutgoingAndSend((short) 0 (short) 1) break
case INS_INITIALISER_COMPTEUR apdusetIncomingAndReceive() compteur = buffer[ISO7816OFFSET_CDATA] break
Il faut eacutegalement rendre les scripts exeacutecutables et eacuteventuellement ajouter le chemin daccegraves dans le PATH pour plus de faciliteacute
~ELECINF359$ cd java_card_kit-2_2_2bin~ELECINF359java_card_kit-2_2_2bin$ chmod a+x ~ELECINF359java_card_kit-2_2_2bin$ export PATH=$PATH$JC_HOMEbin
APDUTOOL envoireacuteception dAPDU
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 512
Loutil APDUTOOL du JCDK permet deacutechanger des APDU avec une Javacard reacuteelle ou un simulateur Nous lutiliserons dans la suite
de ce tutoriel
JCWDE simulateur sans conservation deacutetat
Le simulateur JCWDE ne neacutecessite pas de phase dupload de code Il nous suffit juste dinstaller puis de seacutelectionner notre applet
pour pouvoir la faire fonctionner
Dans le menu JCWDE dEclipse seacutelectionner Start
Cliquer sur le bouton OK pour lancer le simulateur JCWDE avec notre applet Le simulateur est alors lanceacute et attend une connexion
(le simulateur et loutil apdutool communiquent agrave laide dune socket reacuteseau) Nous pouvons alors lancer loutil APDUTOOL Pour cela
ouvrir un terminal dans lequel on aura pris soin de deacutefinir les variables denvironnement puis taper apdutool et valider
~ELECINF359$ apdutoolJava Card 222 APDU Tool Version 13Copyright 2005 Sun Microsystems Inc All rights reserved Use is subject to license termsOpening connection to localhost on port 9025Connected
Installons notre applet en recopiant les APDU contenus dans le script create-MonAppletscript (sauf la derniegravere instruction
0x4A - 1 = 0x49 Le reacutesultat est coheacuterent Nous allons nous deacuteconnecter du simulateur en tapant powerdown dans apdutool
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 612
ce qui provoque la fermeture de JCWDE dans la console dEclipse
powerdown
CREF simulateur avec conservation deacutetat
JCWDE a lavantage de ne pas neacutecessiter lupload de lapplet sur le simulateur ce qui le rend plus souple dutilisation par rapport agrave
CREF En revanche degraves que JCWDE est stoppeacute (agrave la reception dune commande powerdown par exemple) leacutetat de la carte nest pas
conserveacute (la valeur du compteur dans le cas lapplet de ce TP) contrairement agrave ce qui se passe avec une vrai carte (si la carte est
retireacutee du lecteur la valeur du compteur reste conserveacutee dans la meacutemoire EEPROM de la carte)
Les options de ligne de commande que nous allons utiliser
-i fichier_eeprom initialise leacutetat de la carte avec limage fichier_eeprom-o fichier_eeprom enregistre leacutetat de la carte dans fichier_eeprom
Nous pouvons lancer CREF et creacuteer notre fichier image Pour cela ouvrir un terminal dans lequel on aura pris soin de deacutefinir les
variables denvironnement (cf plus haut) puis taper cref ndasho monappleteeprom et valider
~ELECINF359$ cref ndasho monappleteepromJava Card 222 C Reference Implementation Simulator (version 041)32-bit Address Space implementation - with cryptography supportT=1 T=CL Dual interface APDU protocol (ISO 7816-3)Copyright 2005 Sun Microsystems Inc All rights reserved
Memory configuration Type Base Size Max Addr RAM 0x0 0x1000 0xfff ROM 0x2000 0xe000 0xffff E2P 0x10020 0xffe0 0x1ffff
ROM Mask size = 0xce64 = 52836 bytes Highest ROM address in mask = 0xee63 = 61027 bytes Space available in ROM = 0x119c = 4508 bytesEEPROM will be saved in file monappleteepromMask has now been initialized for use
Chargeons maintenant notre applet Pour cela clic droit sur le package monpackage Java Card Tools Deploy
Nous pouvons voir les APDUs envoyeacutes dans la zone Console dEclipse
Les status word 0x9000 indiquent que lupload sest deacuterouleacute correctement
Relanccedilons CREF afin dinstaller notre applet en prenant soin de recharger notre fichier image (option ndashi)
~ELECINF359$ cref ndashi monappleteeprom ndasho monappleteepromJava Card 222 C Reference Implementation Simulator (version 041)32-bit Address Space implementation - with cryptography supportT=1 T=CL Dual interface APDU protocol (ISO 7816-3)Copyright 2005 Sun Microsystems Inc All rights reserved
Memory configuration Type Base Size Max Addr RAM 0x0 0x1000 0xfff ROM 0x2000 0xe000 0xffff E2P 0x10020 0xffe0 0x1ffff
ROM Mask size = 0xce64 = 52836 bytes Highest ROM address in mask = 0xee63 = 61027 bytes Space available in ROM = 0x119c = 4508 bytesEEPROM (0xffe0 bytes) restored from file monappleteepromUsing a pre-initialized Mask
Installons notre applet Pour cela dans Eclipse clic droit sur le script create-MonAppletscript Java Card Tools Run Script
Agrave ce stade nous pouvons utiliser apdutool pour tester notre carte de la mecircme maniegravere quavec JCWDE en prenant soin de ne pas
oublier la commande powerup et la seacutelection de lapplet Commenccedilons par relancer CREF (qui sest termineacute sur une commande
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 712
32-bit Address Space implementation - with cryptography supportT=1 T=CL Dual interface APDU protocol (ISO 7816-3)Copyright 2005 Sun Microsystems Inc All rights reserved
Memory configuration Type Base Size Max Addr RAM 0x0 0x1000 0xfff ROM 0x2000 0xe000 0xffff E2P 0x10020 0xffe0 0x1ffff
ROM Mask size = 0xce64 = 52836 bytes Highest ROM address in mask = 0xee63 = 61027 bytes Space available in ROM = 0x119c = 4508 bytesEEPROM (0xffe0 bytes) restored from file monappleteepromUsing a pre-initialized Mask
Puis dans un autre terminal lanccedilons apdutool seacutelectionnons notre applet apregraves quoi nous pouvons envoyer des APDU agrave notre
applet
~ELECINF359$ apdutoolJava Card 222 APDU Tool Version 13Copyright 2005 Sun Microsystems Inc All rights reserved Use is subject to license termsOpening connection to localhost on port 9025ConnectedpowerupReceived ATR = 0x3b 0xf0 0x11 0x00 0xff 0x01 select MonApplet applet0x00 0xA4 0x04 0x00 0xb 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x00 0x00 0x7FCLA 00 INS a4 P1 04 P2 00 Lc 0b 01 02 03 04 05 06 07 08 09 00 00 Le 00 SW1 90 SW2 000xB0 0x00 0x00 0x00 0x00 0x7FCLA b0 INS 00 P1 00 P2 00 Lc 00 Le 00 SW1 90 SW2 000xB0 0x02 0x00 0x00 0x00 0x7FCLA b0 INS 02 P1 00 P2 00 Lc 00 Le 01 01 SW1 90 SW2 00powerdown
Codage dune application cliente
Maintenant que nous avons programmeacute notre applet Javcard nous pouvons coder une application cliente leacutequivalent du terminal
bancaire si notre Javacard eacutetait une carte de paiement
Creacuteation du projet sous Eclipse
Creacuteons un nouveau projet Pour cela dans Eclipse aller dans le menu File faire New puis Project
Choisir Java Project puis confirmer en cliquant sur Next
Donner un nom au nouveau projet puis cliquer sur Finish
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 812
Ajout de la librairie laquo apduio raquo dans le classpath
Afin de pouvoir utiliser les classes servant agrave communiquer avec notre Javacard il faut ajouter la bibliothegraveque apduiojar(preacutesente dans le reacutepertoire ~ELECINF359java_card_kit-2_2_2lib) Pour cela faire un clic droit sur notre nouveau
projet puis Proprieacuteteacutes
Dans la section Java Build Path seacutelectionner longlet Librairies et cliquer sur le bouton Add External Jars
Seacutelectionner alors le fichier apduiojar valider et appuyer sur le bouton OK
Creacuteation de la classe principale
Tout dabord creacuteons un nouveau package Pour cela faire un clic droit sur notre projet puis New et Package
Donner un nom au package puis valider agrave laide du bouton Finish
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 912
Creacuteons maintenant la classe principale de notre application Pour cela faire un clic droit sur le package creacuteeacute puis New et Class
Donnons un nom agrave notre nouvelle classe cocher la case public static void main puis cliquer sur Finish
Code pour se connecter agrave la Javacard
La connexion au simulateur se fait via une socket Le simulateur eacutecoute par deacutefaut sur le port 9025 La classe que nous utiliserons
pour les eacutechanges de donneacutees est CadT1Client
Connexion a la Javacard CadT1Client cad Socket sckCarte try sckCarte = new Socket(localhost 9025) sckCartesetTcpNoDelay(true) BufferedInputStream input = new BufferedInputStream(sckCartegetInputStream()) BufferedOutputStream output = new BufferedOutputStream(sckCartegetOutputStream()) cad = new CadT1Client(input output) catch (Exception e) Systemoutprintln(Erreur impossible de se connecter a la Javacard) return
Mise sous tension de la carte try cadpowerUp() catch (Exception e) Systemoutprintln(Erreur lors de lenvoi de la commande Powerup a la Javacard) return
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 1012
Code pour se deacuteconnecter de la Javacard
La deacuteconnexion de la Javacard se fera via la meacutethode powerDown() de la classe CadT1Client
Mise hors tension de la carte try cadpowerDown() catch (Exception e) Systemoutprintln(Erreur lors de lenvoi de la commande Powerdown a la Javacard) return
Code pour seacutelectionner lapplet Javacard
La seacutelection dapplet se fait en envoyant lAPDU deacutecrite preacuteceacutedemment
Seacutelection de lapplet Apdu apdu = new Apdu() apducommand[ApduCLA] = 0x00 apducommand[ApduINS] = (byte) 0xA4 apducommand[ApduP1] = 0x04 apducommand[ApduP2] = 0x00 byte[] appletAID = 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x00 0x00 apdusetDataIn(appletAID) cadexchangeApdu(apdu) if (apdugetStatus() = 0x9000) Systemoutprintln(Erreur lors de la seacutelection de lapplet) Systemexit(1)
Note cette phase de seacutelection nest pas indispensable pour le simulateur JCWDE
Code de la boucle principale de lapplication
Voici le code de la boucle principale de lapplication Il suffit pour chaque opeacuteration dinitialiser correctement une instance de lobjet
APDU et de lenvoyer agrave la carte via linstance de la classe CadT1Client
Menu principal boolean fin = false while (fin) Systemoutprintln() Systemoutprintln(Application cliente Javacard) Systemoutprintln(----------------------------) Systemoutprintln() Systemoutprintln(1 - Interroger le compteur) Systemoutprintln(2 - Inrementer le compteur) Systemoutprintln(3 - Decrementer le compteur) Systemoutprintln(4 - Reinitialiser le compteur) Systemoutprintln(5 - Quitter) Systemoutprintln() Systemoutprintln(Votre choix )
int choix = Systeminread() while ((choix gt= 1 ampamp choix lt= 5)) choix = Systeminread()
switch (choix) case 1 apducommand[ApduINS] = MaclasseINS_INTERROGER_COMPTEUR cadexchangeApdu(apdu) if (apdugetStatus() = 0x9000) Systemoutprintln(Erreur status word different de 0x9000) else Systemoutprintln(Valeur du compteur + apdudataOut[0]) break
case 2 apducommand[ApduINS] = MaclasseINS_INCREMENTER_COMPTEUR cadexchangeApdu(apdu) if (apdugetStatus() = 0x9000) Systemoutprintln(Erreur status word different de 0x9000) else Systemoutprintln(OK) break
case 3 apducommand[ApduINS] = MaclasseINS_DECREMENTER_COMPTEUR cadexchangeApdu(apdu) if (apdugetStatus() = 0x9000) Systemoutprintln(Erreur status word different de 0x9000) else Systemoutprintln(OK) break
case 4
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 1112
apducommand[ApduINS] = MaclasseINS_INITIALISER_COMPTEUR byte[] donnees = new byte[1] donnees[0] = 0 apdusetDataIn(donnees) cadexchangeApdu(apdu) if (apdugetStatus() = 0x9000) Systemoutprintln(Erreur status word different de 0x9000) else Systemoutprintln(OK) break
case 5 fin = true break
Le code source de lapplication est disponible ici Maclassejava
Utilisation de lapplication cliente et dun simulateur
Avec JCWDE
Afin de pouvoir lancer le simulateur de notre applet en ligne de commande nous allons creacuteer un fichier de configuration Il permet
de lister les applets Javacard agrave installer pour la simulation et de speacutecifier leurs AID respectifs
Creacuteons notre fichier que nous appellerons monappletapp Il contiendra la ligne suivante
Nous pouvons maintenant lancer notre simulateur en prenant soin de nous placer dans le bon reacutepertoire (reacutepertoire parent du
package contenant le fichier class de lapplet)
~$ cd workspaceTutoriel Javacardbin~workspaceTutoriel Javacardbin$ jcwde monappletappJava Card 222 Workstation Development Environment Version 13Copyright 2005 Sun Microsystems Inc All rights reserved Use is subject to license termsjcwde is listening for T=1 Apdus on TCPIP port 9 025
Maintenant que notre simulateur est lanceacute lanccedilons notre application cliente
Commenccedilons par interroger le compteur tapons 1 puis validons
Le compteur est bien agrave 0 Increacutementons maintenant le compteur 3 fois puis deacutecreacutementons-le une fois Lorsque nous reacuteinterrogeons la
carte le compteur vaut 2 donc tout va bien
Quittons maintenant notre application cliente (commande 5) Nous pouvons voir que le simulateur se termine automatiquement agrave la
reacuteception de la commande powerdown
jcwde exiting on receipt of power down command
Rappel ce simulateur ne permet pas de conserver leacutetat de la carte Si nous le relanccedilons le compteur sera agrave 0 et non agrave 2
Avec CREF
Lanccedilons CREF agrave partir de limage EEPROM que nous avons geacuteneacutereacutee
~ELECINF359$ cref ndashi monappleteeprom ndasho monappleteepromJava Card 222 C Reference Implementation Simulator (version 041)32-bit Address Space implementation - with cryptography supportT=1 T=CL Dual interface APDU protocol (ISO 7816-3)Copyright 2005 Sun Microsystems Inc All rights reserved
Memory configuration
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 1212
(c) COMELEC 2007
Type Base Size Max Addr RAM 0x0 0x1000 0xfff ROM 0x2000 0xe000 0xffff E2P 0x10020 0xffe0 0x1ffff
ROM Mask size = 0xce64 = 52836 bytes Highest ROM address in mask = 0xee63 = 61027 bytes Space available in ROM = 0x119c = 4508 bytesEEPROM (0xffe0 bytes) restored from file monappleteepromUsing a pre-initialized Mask
Nous pouvons deacutesormais lancer notre application cliente et observer les mecircmes reacutesultats quavec JCWDE en revanche leacutetat de la
carte (le compteur) sera conserveacute dune session agrave lautre
Pour aller plus loin
Si le cœur vous en dit vous pouvez uploader votre magnifique compteur sur une vraie Javacard cest sur cette page que ccedila se
passe
FilenameTitle Taille
Maclassejava 412 Ko
eclipse-jcde-01-linuxtgz 13554 Ko
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 412
Constantes public static final byte CLA_MONAPPLET = (byte) 0xB0
public static final byte INS_INCREMENTER_COMPTEUR = 0x00 public static final byte INS_DECREMENTER_COMPTEUR = 0x01 public static final byte INS_INTERROGER_COMPTEUR = 0x02 public static final byte INS_INITIALISER_COMPTEUR = 0x03
Attributs private byte compteur
Constructeur private MonApplet() compteur = 0
public static void install(byte bArray[] short bOffset byte bLength) throws ISOException new MonApplet()register()
Puis nous codons notre meacutethode process
public void process(APDU apdu) throws ISOException byte[] buffer = apdugetBuffer()
if (thisselectingApplet()) return
if (buffer[ISO7816OFFSET_CLA] = CLA_MONAPPLET) ISOExceptionthrowIt(ISO7816SW_CLA_NOT_SUPPORTED)
switch (buffer[ISO7816OFFSET_INS]) case INS_INCREMENTER_COMPTEUR compteur++ break
case INS_DECREMENTER_COMPTEUR compteur-- break
case INS_INTERROGER_COMPTEUR buffer[0] = compteur apdusetOutgoingAndSend((short) 0 (short) 1) break
case INS_INITIALISER_COMPTEUR apdusetIncomingAndReceive() compteur = buffer[ISO7816OFFSET_CDATA] break
Il faut eacutegalement rendre les scripts exeacutecutables et eacuteventuellement ajouter le chemin daccegraves dans le PATH pour plus de faciliteacute
~ELECINF359$ cd java_card_kit-2_2_2bin~ELECINF359java_card_kit-2_2_2bin$ chmod a+x ~ELECINF359java_card_kit-2_2_2bin$ export PATH=$PATH$JC_HOMEbin
APDUTOOL envoireacuteception dAPDU
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 512
Loutil APDUTOOL du JCDK permet deacutechanger des APDU avec une Javacard reacuteelle ou un simulateur Nous lutiliserons dans la suite
de ce tutoriel
JCWDE simulateur sans conservation deacutetat
Le simulateur JCWDE ne neacutecessite pas de phase dupload de code Il nous suffit juste dinstaller puis de seacutelectionner notre applet
pour pouvoir la faire fonctionner
Dans le menu JCWDE dEclipse seacutelectionner Start
Cliquer sur le bouton OK pour lancer le simulateur JCWDE avec notre applet Le simulateur est alors lanceacute et attend une connexion
(le simulateur et loutil apdutool communiquent agrave laide dune socket reacuteseau) Nous pouvons alors lancer loutil APDUTOOL Pour cela
ouvrir un terminal dans lequel on aura pris soin de deacutefinir les variables denvironnement puis taper apdutool et valider
~ELECINF359$ apdutoolJava Card 222 APDU Tool Version 13Copyright 2005 Sun Microsystems Inc All rights reserved Use is subject to license termsOpening connection to localhost on port 9025Connected
Installons notre applet en recopiant les APDU contenus dans le script create-MonAppletscript (sauf la derniegravere instruction
0x4A - 1 = 0x49 Le reacutesultat est coheacuterent Nous allons nous deacuteconnecter du simulateur en tapant powerdown dans apdutool
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 612
ce qui provoque la fermeture de JCWDE dans la console dEclipse
powerdown
CREF simulateur avec conservation deacutetat
JCWDE a lavantage de ne pas neacutecessiter lupload de lapplet sur le simulateur ce qui le rend plus souple dutilisation par rapport agrave
CREF En revanche degraves que JCWDE est stoppeacute (agrave la reception dune commande powerdown par exemple) leacutetat de la carte nest pas
conserveacute (la valeur du compteur dans le cas lapplet de ce TP) contrairement agrave ce qui se passe avec une vrai carte (si la carte est
retireacutee du lecteur la valeur du compteur reste conserveacutee dans la meacutemoire EEPROM de la carte)
Les options de ligne de commande que nous allons utiliser
-i fichier_eeprom initialise leacutetat de la carte avec limage fichier_eeprom-o fichier_eeprom enregistre leacutetat de la carte dans fichier_eeprom
Nous pouvons lancer CREF et creacuteer notre fichier image Pour cela ouvrir un terminal dans lequel on aura pris soin de deacutefinir les
variables denvironnement (cf plus haut) puis taper cref ndasho monappleteeprom et valider
~ELECINF359$ cref ndasho monappleteepromJava Card 222 C Reference Implementation Simulator (version 041)32-bit Address Space implementation - with cryptography supportT=1 T=CL Dual interface APDU protocol (ISO 7816-3)Copyright 2005 Sun Microsystems Inc All rights reserved
Memory configuration Type Base Size Max Addr RAM 0x0 0x1000 0xfff ROM 0x2000 0xe000 0xffff E2P 0x10020 0xffe0 0x1ffff
ROM Mask size = 0xce64 = 52836 bytes Highest ROM address in mask = 0xee63 = 61027 bytes Space available in ROM = 0x119c = 4508 bytesEEPROM will be saved in file monappleteepromMask has now been initialized for use
Chargeons maintenant notre applet Pour cela clic droit sur le package monpackage Java Card Tools Deploy
Nous pouvons voir les APDUs envoyeacutes dans la zone Console dEclipse
Les status word 0x9000 indiquent que lupload sest deacuterouleacute correctement
Relanccedilons CREF afin dinstaller notre applet en prenant soin de recharger notre fichier image (option ndashi)
~ELECINF359$ cref ndashi monappleteeprom ndasho monappleteepromJava Card 222 C Reference Implementation Simulator (version 041)32-bit Address Space implementation - with cryptography supportT=1 T=CL Dual interface APDU protocol (ISO 7816-3)Copyright 2005 Sun Microsystems Inc All rights reserved
Memory configuration Type Base Size Max Addr RAM 0x0 0x1000 0xfff ROM 0x2000 0xe000 0xffff E2P 0x10020 0xffe0 0x1ffff
ROM Mask size = 0xce64 = 52836 bytes Highest ROM address in mask = 0xee63 = 61027 bytes Space available in ROM = 0x119c = 4508 bytesEEPROM (0xffe0 bytes) restored from file monappleteepromUsing a pre-initialized Mask
Installons notre applet Pour cela dans Eclipse clic droit sur le script create-MonAppletscript Java Card Tools Run Script
Agrave ce stade nous pouvons utiliser apdutool pour tester notre carte de la mecircme maniegravere quavec JCWDE en prenant soin de ne pas
oublier la commande powerup et la seacutelection de lapplet Commenccedilons par relancer CREF (qui sest termineacute sur une commande
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 712
32-bit Address Space implementation - with cryptography supportT=1 T=CL Dual interface APDU protocol (ISO 7816-3)Copyright 2005 Sun Microsystems Inc All rights reserved
Memory configuration Type Base Size Max Addr RAM 0x0 0x1000 0xfff ROM 0x2000 0xe000 0xffff E2P 0x10020 0xffe0 0x1ffff
ROM Mask size = 0xce64 = 52836 bytes Highest ROM address in mask = 0xee63 = 61027 bytes Space available in ROM = 0x119c = 4508 bytesEEPROM (0xffe0 bytes) restored from file monappleteepromUsing a pre-initialized Mask
Puis dans un autre terminal lanccedilons apdutool seacutelectionnons notre applet apregraves quoi nous pouvons envoyer des APDU agrave notre
applet
~ELECINF359$ apdutoolJava Card 222 APDU Tool Version 13Copyright 2005 Sun Microsystems Inc All rights reserved Use is subject to license termsOpening connection to localhost on port 9025ConnectedpowerupReceived ATR = 0x3b 0xf0 0x11 0x00 0xff 0x01 select MonApplet applet0x00 0xA4 0x04 0x00 0xb 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x00 0x00 0x7FCLA 00 INS a4 P1 04 P2 00 Lc 0b 01 02 03 04 05 06 07 08 09 00 00 Le 00 SW1 90 SW2 000xB0 0x00 0x00 0x00 0x00 0x7FCLA b0 INS 00 P1 00 P2 00 Lc 00 Le 00 SW1 90 SW2 000xB0 0x02 0x00 0x00 0x00 0x7FCLA b0 INS 02 P1 00 P2 00 Lc 00 Le 01 01 SW1 90 SW2 00powerdown
Codage dune application cliente
Maintenant que nous avons programmeacute notre applet Javcard nous pouvons coder une application cliente leacutequivalent du terminal
bancaire si notre Javacard eacutetait une carte de paiement
Creacuteation du projet sous Eclipse
Creacuteons un nouveau projet Pour cela dans Eclipse aller dans le menu File faire New puis Project
Choisir Java Project puis confirmer en cliquant sur Next
Donner un nom au nouveau projet puis cliquer sur Finish
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 812
Ajout de la librairie laquo apduio raquo dans le classpath
Afin de pouvoir utiliser les classes servant agrave communiquer avec notre Javacard il faut ajouter la bibliothegraveque apduiojar(preacutesente dans le reacutepertoire ~ELECINF359java_card_kit-2_2_2lib) Pour cela faire un clic droit sur notre nouveau
projet puis Proprieacuteteacutes
Dans la section Java Build Path seacutelectionner longlet Librairies et cliquer sur le bouton Add External Jars
Seacutelectionner alors le fichier apduiojar valider et appuyer sur le bouton OK
Creacuteation de la classe principale
Tout dabord creacuteons un nouveau package Pour cela faire un clic droit sur notre projet puis New et Package
Donner un nom au package puis valider agrave laide du bouton Finish
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 912
Creacuteons maintenant la classe principale de notre application Pour cela faire un clic droit sur le package creacuteeacute puis New et Class
Donnons un nom agrave notre nouvelle classe cocher la case public static void main puis cliquer sur Finish
Code pour se connecter agrave la Javacard
La connexion au simulateur se fait via une socket Le simulateur eacutecoute par deacutefaut sur le port 9025 La classe que nous utiliserons
pour les eacutechanges de donneacutees est CadT1Client
Connexion a la Javacard CadT1Client cad Socket sckCarte try sckCarte = new Socket(localhost 9025) sckCartesetTcpNoDelay(true) BufferedInputStream input = new BufferedInputStream(sckCartegetInputStream()) BufferedOutputStream output = new BufferedOutputStream(sckCartegetOutputStream()) cad = new CadT1Client(input output) catch (Exception e) Systemoutprintln(Erreur impossible de se connecter a la Javacard) return
Mise sous tension de la carte try cadpowerUp() catch (Exception e) Systemoutprintln(Erreur lors de lenvoi de la commande Powerup a la Javacard) return
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 1012
Code pour se deacuteconnecter de la Javacard
La deacuteconnexion de la Javacard se fera via la meacutethode powerDown() de la classe CadT1Client
Mise hors tension de la carte try cadpowerDown() catch (Exception e) Systemoutprintln(Erreur lors de lenvoi de la commande Powerdown a la Javacard) return
Code pour seacutelectionner lapplet Javacard
La seacutelection dapplet se fait en envoyant lAPDU deacutecrite preacuteceacutedemment
Seacutelection de lapplet Apdu apdu = new Apdu() apducommand[ApduCLA] = 0x00 apducommand[ApduINS] = (byte) 0xA4 apducommand[ApduP1] = 0x04 apducommand[ApduP2] = 0x00 byte[] appletAID = 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x00 0x00 apdusetDataIn(appletAID) cadexchangeApdu(apdu) if (apdugetStatus() = 0x9000) Systemoutprintln(Erreur lors de la seacutelection de lapplet) Systemexit(1)
Note cette phase de seacutelection nest pas indispensable pour le simulateur JCWDE
Code de la boucle principale de lapplication
Voici le code de la boucle principale de lapplication Il suffit pour chaque opeacuteration dinitialiser correctement une instance de lobjet
APDU et de lenvoyer agrave la carte via linstance de la classe CadT1Client
Menu principal boolean fin = false while (fin) Systemoutprintln() Systemoutprintln(Application cliente Javacard) Systemoutprintln(----------------------------) Systemoutprintln() Systemoutprintln(1 - Interroger le compteur) Systemoutprintln(2 - Inrementer le compteur) Systemoutprintln(3 - Decrementer le compteur) Systemoutprintln(4 - Reinitialiser le compteur) Systemoutprintln(5 - Quitter) Systemoutprintln() Systemoutprintln(Votre choix )
int choix = Systeminread() while ((choix gt= 1 ampamp choix lt= 5)) choix = Systeminread()
switch (choix) case 1 apducommand[ApduINS] = MaclasseINS_INTERROGER_COMPTEUR cadexchangeApdu(apdu) if (apdugetStatus() = 0x9000) Systemoutprintln(Erreur status word different de 0x9000) else Systemoutprintln(Valeur du compteur + apdudataOut[0]) break
case 2 apducommand[ApduINS] = MaclasseINS_INCREMENTER_COMPTEUR cadexchangeApdu(apdu) if (apdugetStatus() = 0x9000) Systemoutprintln(Erreur status word different de 0x9000) else Systemoutprintln(OK) break
case 3 apducommand[ApduINS] = MaclasseINS_DECREMENTER_COMPTEUR cadexchangeApdu(apdu) if (apdugetStatus() = 0x9000) Systemoutprintln(Erreur status word different de 0x9000) else Systemoutprintln(OK) break
case 4
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 1112
apducommand[ApduINS] = MaclasseINS_INITIALISER_COMPTEUR byte[] donnees = new byte[1] donnees[0] = 0 apdusetDataIn(donnees) cadexchangeApdu(apdu) if (apdugetStatus() = 0x9000) Systemoutprintln(Erreur status word different de 0x9000) else Systemoutprintln(OK) break
case 5 fin = true break
Le code source de lapplication est disponible ici Maclassejava
Utilisation de lapplication cliente et dun simulateur
Avec JCWDE
Afin de pouvoir lancer le simulateur de notre applet en ligne de commande nous allons creacuteer un fichier de configuration Il permet
de lister les applets Javacard agrave installer pour la simulation et de speacutecifier leurs AID respectifs
Creacuteons notre fichier que nous appellerons monappletapp Il contiendra la ligne suivante
Nous pouvons maintenant lancer notre simulateur en prenant soin de nous placer dans le bon reacutepertoire (reacutepertoire parent du
package contenant le fichier class de lapplet)
~$ cd workspaceTutoriel Javacardbin~workspaceTutoriel Javacardbin$ jcwde monappletappJava Card 222 Workstation Development Environment Version 13Copyright 2005 Sun Microsystems Inc All rights reserved Use is subject to license termsjcwde is listening for T=1 Apdus on TCPIP port 9 025
Maintenant que notre simulateur est lanceacute lanccedilons notre application cliente
Commenccedilons par interroger le compteur tapons 1 puis validons
Le compteur est bien agrave 0 Increacutementons maintenant le compteur 3 fois puis deacutecreacutementons-le une fois Lorsque nous reacuteinterrogeons la
carte le compteur vaut 2 donc tout va bien
Quittons maintenant notre application cliente (commande 5) Nous pouvons voir que le simulateur se termine automatiquement agrave la
reacuteception de la commande powerdown
jcwde exiting on receipt of power down command
Rappel ce simulateur ne permet pas de conserver leacutetat de la carte Si nous le relanccedilons le compteur sera agrave 0 et non agrave 2
Avec CREF
Lanccedilons CREF agrave partir de limage EEPROM que nous avons geacuteneacutereacutee
~ELECINF359$ cref ndashi monappleteeprom ndasho monappleteepromJava Card 222 C Reference Implementation Simulator (version 041)32-bit Address Space implementation - with cryptography supportT=1 T=CL Dual interface APDU protocol (ISO 7816-3)Copyright 2005 Sun Microsystems Inc All rights reserved
Memory configuration
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 1212
(c) COMELEC 2007
Type Base Size Max Addr RAM 0x0 0x1000 0xfff ROM 0x2000 0xe000 0xffff E2P 0x10020 0xffe0 0x1ffff
ROM Mask size = 0xce64 = 52836 bytes Highest ROM address in mask = 0xee63 = 61027 bytes Space available in ROM = 0x119c = 4508 bytesEEPROM (0xffe0 bytes) restored from file monappleteepromUsing a pre-initialized Mask
Nous pouvons deacutesormais lancer notre application cliente et observer les mecircmes reacutesultats quavec JCWDE en revanche leacutetat de la
carte (le compteur) sera conserveacute dune session agrave lautre
Pour aller plus loin
Si le cœur vous en dit vous pouvez uploader votre magnifique compteur sur une vraie Javacard cest sur cette page que ccedila se
passe
FilenameTitle Taille
Maclassejava 412 Ko
eclipse-jcde-01-linuxtgz 13554 Ko
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 512
Loutil APDUTOOL du JCDK permet deacutechanger des APDU avec une Javacard reacuteelle ou un simulateur Nous lutiliserons dans la suite
de ce tutoriel
JCWDE simulateur sans conservation deacutetat
Le simulateur JCWDE ne neacutecessite pas de phase dupload de code Il nous suffit juste dinstaller puis de seacutelectionner notre applet
pour pouvoir la faire fonctionner
Dans le menu JCWDE dEclipse seacutelectionner Start
Cliquer sur le bouton OK pour lancer le simulateur JCWDE avec notre applet Le simulateur est alors lanceacute et attend une connexion
(le simulateur et loutil apdutool communiquent agrave laide dune socket reacuteseau) Nous pouvons alors lancer loutil APDUTOOL Pour cela
ouvrir un terminal dans lequel on aura pris soin de deacutefinir les variables denvironnement puis taper apdutool et valider
~ELECINF359$ apdutoolJava Card 222 APDU Tool Version 13Copyright 2005 Sun Microsystems Inc All rights reserved Use is subject to license termsOpening connection to localhost on port 9025Connected
Installons notre applet en recopiant les APDU contenus dans le script create-MonAppletscript (sauf la derniegravere instruction
0x4A - 1 = 0x49 Le reacutesultat est coheacuterent Nous allons nous deacuteconnecter du simulateur en tapant powerdown dans apdutool
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 612
ce qui provoque la fermeture de JCWDE dans la console dEclipse
powerdown
CREF simulateur avec conservation deacutetat
JCWDE a lavantage de ne pas neacutecessiter lupload de lapplet sur le simulateur ce qui le rend plus souple dutilisation par rapport agrave
CREF En revanche degraves que JCWDE est stoppeacute (agrave la reception dune commande powerdown par exemple) leacutetat de la carte nest pas
conserveacute (la valeur du compteur dans le cas lapplet de ce TP) contrairement agrave ce qui se passe avec une vrai carte (si la carte est
retireacutee du lecteur la valeur du compteur reste conserveacutee dans la meacutemoire EEPROM de la carte)
Les options de ligne de commande que nous allons utiliser
-i fichier_eeprom initialise leacutetat de la carte avec limage fichier_eeprom-o fichier_eeprom enregistre leacutetat de la carte dans fichier_eeprom
Nous pouvons lancer CREF et creacuteer notre fichier image Pour cela ouvrir un terminal dans lequel on aura pris soin de deacutefinir les
variables denvironnement (cf plus haut) puis taper cref ndasho monappleteeprom et valider
~ELECINF359$ cref ndasho monappleteepromJava Card 222 C Reference Implementation Simulator (version 041)32-bit Address Space implementation - with cryptography supportT=1 T=CL Dual interface APDU protocol (ISO 7816-3)Copyright 2005 Sun Microsystems Inc All rights reserved
Memory configuration Type Base Size Max Addr RAM 0x0 0x1000 0xfff ROM 0x2000 0xe000 0xffff E2P 0x10020 0xffe0 0x1ffff
ROM Mask size = 0xce64 = 52836 bytes Highest ROM address in mask = 0xee63 = 61027 bytes Space available in ROM = 0x119c = 4508 bytesEEPROM will be saved in file monappleteepromMask has now been initialized for use
Chargeons maintenant notre applet Pour cela clic droit sur le package monpackage Java Card Tools Deploy
Nous pouvons voir les APDUs envoyeacutes dans la zone Console dEclipse
Les status word 0x9000 indiquent que lupload sest deacuterouleacute correctement
Relanccedilons CREF afin dinstaller notre applet en prenant soin de recharger notre fichier image (option ndashi)
~ELECINF359$ cref ndashi monappleteeprom ndasho monappleteepromJava Card 222 C Reference Implementation Simulator (version 041)32-bit Address Space implementation - with cryptography supportT=1 T=CL Dual interface APDU protocol (ISO 7816-3)Copyright 2005 Sun Microsystems Inc All rights reserved
Memory configuration Type Base Size Max Addr RAM 0x0 0x1000 0xfff ROM 0x2000 0xe000 0xffff E2P 0x10020 0xffe0 0x1ffff
ROM Mask size = 0xce64 = 52836 bytes Highest ROM address in mask = 0xee63 = 61027 bytes Space available in ROM = 0x119c = 4508 bytesEEPROM (0xffe0 bytes) restored from file monappleteepromUsing a pre-initialized Mask
Installons notre applet Pour cela dans Eclipse clic droit sur le script create-MonAppletscript Java Card Tools Run Script
Agrave ce stade nous pouvons utiliser apdutool pour tester notre carte de la mecircme maniegravere quavec JCWDE en prenant soin de ne pas
oublier la commande powerup et la seacutelection de lapplet Commenccedilons par relancer CREF (qui sest termineacute sur une commande
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 712
32-bit Address Space implementation - with cryptography supportT=1 T=CL Dual interface APDU protocol (ISO 7816-3)Copyright 2005 Sun Microsystems Inc All rights reserved
Memory configuration Type Base Size Max Addr RAM 0x0 0x1000 0xfff ROM 0x2000 0xe000 0xffff E2P 0x10020 0xffe0 0x1ffff
ROM Mask size = 0xce64 = 52836 bytes Highest ROM address in mask = 0xee63 = 61027 bytes Space available in ROM = 0x119c = 4508 bytesEEPROM (0xffe0 bytes) restored from file monappleteepromUsing a pre-initialized Mask
Puis dans un autre terminal lanccedilons apdutool seacutelectionnons notre applet apregraves quoi nous pouvons envoyer des APDU agrave notre
applet
~ELECINF359$ apdutoolJava Card 222 APDU Tool Version 13Copyright 2005 Sun Microsystems Inc All rights reserved Use is subject to license termsOpening connection to localhost on port 9025ConnectedpowerupReceived ATR = 0x3b 0xf0 0x11 0x00 0xff 0x01 select MonApplet applet0x00 0xA4 0x04 0x00 0xb 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x00 0x00 0x7FCLA 00 INS a4 P1 04 P2 00 Lc 0b 01 02 03 04 05 06 07 08 09 00 00 Le 00 SW1 90 SW2 000xB0 0x00 0x00 0x00 0x00 0x7FCLA b0 INS 00 P1 00 P2 00 Lc 00 Le 00 SW1 90 SW2 000xB0 0x02 0x00 0x00 0x00 0x7FCLA b0 INS 02 P1 00 P2 00 Lc 00 Le 01 01 SW1 90 SW2 00powerdown
Codage dune application cliente
Maintenant que nous avons programmeacute notre applet Javcard nous pouvons coder une application cliente leacutequivalent du terminal
bancaire si notre Javacard eacutetait une carte de paiement
Creacuteation du projet sous Eclipse
Creacuteons un nouveau projet Pour cela dans Eclipse aller dans le menu File faire New puis Project
Choisir Java Project puis confirmer en cliquant sur Next
Donner un nom au nouveau projet puis cliquer sur Finish
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 812
Ajout de la librairie laquo apduio raquo dans le classpath
Afin de pouvoir utiliser les classes servant agrave communiquer avec notre Javacard il faut ajouter la bibliothegraveque apduiojar(preacutesente dans le reacutepertoire ~ELECINF359java_card_kit-2_2_2lib) Pour cela faire un clic droit sur notre nouveau
projet puis Proprieacuteteacutes
Dans la section Java Build Path seacutelectionner longlet Librairies et cliquer sur le bouton Add External Jars
Seacutelectionner alors le fichier apduiojar valider et appuyer sur le bouton OK
Creacuteation de la classe principale
Tout dabord creacuteons un nouveau package Pour cela faire un clic droit sur notre projet puis New et Package
Donner un nom au package puis valider agrave laide du bouton Finish
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 912
Creacuteons maintenant la classe principale de notre application Pour cela faire un clic droit sur le package creacuteeacute puis New et Class
Donnons un nom agrave notre nouvelle classe cocher la case public static void main puis cliquer sur Finish
Code pour se connecter agrave la Javacard
La connexion au simulateur se fait via une socket Le simulateur eacutecoute par deacutefaut sur le port 9025 La classe que nous utiliserons
pour les eacutechanges de donneacutees est CadT1Client
Connexion a la Javacard CadT1Client cad Socket sckCarte try sckCarte = new Socket(localhost 9025) sckCartesetTcpNoDelay(true) BufferedInputStream input = new BufferedInputStream(sckCartegetInputStream()) BufferedOutputStream output = new BufferedOutputStream(sckCartegetOutputStream()) cad = new CadT1Client(input output) catch (Exception e) Systemoutprintln(Erreur impossible de se connecter a la Javacard) return
Mise sous tension de la carte try cadpowerUp() catch (Exception e) Systemoutprintln(Erreur lors de lenvoi de la commande Powerup a la Javacard) return
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 1012
Code pour se deacuteconnecter de la Javacard
La deacuteconnexion de la Javacard se fera via la meacutethode powerDown() de la classe CadT1Client
Mise hors tension de la carte try cadpowerDown() catch (Exception e) Systemoutprintln(Erreur lors de lenvoi de la commande Powerdown a la Javacard) return
Code pour seacutelectionner lapplet Javacard
La seacutelection dapplet se fait en envoyant lAPDU deacutecrite preacuteceacutedemment
Seacutelection de lapplet Apdu apdu = new Apdu() apducommand[ApduCLA] = 0x00 apducommand[ApduINS] = (byte) 0xA4 apducommand[ApduP1] = 0x04 apducommand[ApduP2] = 0x00 byte[] appletAID = 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x00 0x00 apdusetDataIn(appletAID) cadexchangeApdu(apdu) if (apdugetStatus() = 0x9000) Systemoutprintln(Erreur lors de la seacutelection de lapplet) Systemexit(1)
Note cette phase de seacutelection nest pas indispensable pour le simulateur JCWDE
Code de la boucle principale de lapplication
Voici le code de la boucle principale de lapplication Il suffit pour chaque opeacuteration dinitialiser correctement une instance de lobjet
APDU et de lenvoyer agrave la carte via linstance de la classe CadT1Client
Menu principal boolean fin = false while (fin) Systemoutprintln() Systemoutprintln(Application cliente Javacard) Systemoutprintln(----------------------------) Systemoutprintln() Systemoutprintln(1 - Interroger le compteur) Systemoutprintln(2 - Inrementer le compteur) Systemoutprintln(3 - Decrementer le compteur) Systemoutprintln(4 - Reinitialiser le compteur) Systemoutprintln(5 - Quitter) Systemoutprintln() Systemoutprintln(Votre choix )
int choix = Systeminread() while ((choix gt= 1 ampamp choix lt= 5)) choix = Systeminread()
switch (choix) case 1 apducommand[ApduINS] = MaclasseINS_INTERROGER_COMPTEUR cadexchangeApdu(apdu) if (apdugetStatus() = 0x9000) Systemoutprintln(Erreur status word different de 0x9000) else Systemoutprintln(Valeur du compteur + apdudataOut[0]) break
case 2 apducommand[ApduINS] = MaclasseINS_INCREMENTER_COMPTEUR cadexchangeApdu(apdu) if (apdugetStatus() = 0x9000) Systemoutprintln(Erreur status word different de 0x9000) else Systemoutprintln(OK) break
case 3 apducommand[ApduINS] = MaclasseINS_DECREMENTER_COMPTEUR cadexchangeApdu(apdu) if (apdugetStatus() = 0x9000) Systemoutprintln(Erreur status word different de 0x9000) else Systemoutprintln(OK) break
case 4
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 1112
apducommand[ApduINS] = MaclasseINS_INITIALISER_COMPTEUR byte[] donnees = new byte[1] donnees[0] = 0 apdusetDataIn(donnees) cadexchangeApdu(apdu) if (apdugetStatus() = 0x9000) Systemoutprintln(Erreur status word different de 0x9000) else Systemoutprintln(OK) break
case 5 fin = true break
Le code source de lapplication est disponible ici Maclassejava
Utilisation de lapplication cliente et dun simulateur
Avec JCWDE
Afin de pouvoir lancer le simulateur de notre applet en ligne de commande nous allons creacuteer un fichier de configuration Il permet
de lister les applets Javacard agrave installer pour la simulation et de speacutecifier leurs AID respectifs
Creacuteons notre fichier que nous appellerons monappletapp Il contiendra la ligne suivante
Nous pouvons maintenant lancer notre simulateur en prenant soin de nous placer dans le bon reacutepertoire (reacutepertoire parent du
package contenant le fichier class de lapplet)
~$ cd workspaceTutoriel Javacardbin~workspaceTutoriel Javacardbin$ jcwde monappletappJava Card 222 Workstation Development Environment Version 13Copyright 2005 Sun Microsystems Inc All rights reserved Use is subject to license termsjcwde is listening for T=1 Apdus on TCPIP port 9 025
Maintenant que notre simulateur est lanceacute lanccedilons notre application cliente
Commenccedilons par interroger le compteur tapons 1 puis validons
Le compteur est bien agrave 0 Increacutementons maintenant le compteur 3 fois puis deacutecreacutementons-le une fois Lorsque nous reacuteinterrogeons la
carte le compteur vaut 2 donc tout va bien
Quittons maintenant notre application cliente (commande 5) Nous pouvons voir que le simulateur se termine automatiquement agrave la
reacuteception de la commande powerdown
jcwde exiting on receipt of power down command
Rappel ce simulateur ne permet pas de conserver leacutetat de la carte Si nous le relanccedilons le compteur sera agrave 0 et non agrave 2
Avec CREF
Lanccedilons CREF agrave partir de limage EEPROM que nous avons geacuteneacutereacutee
~ELECINF359$ cref ndashi monappleteeprom ndasho monappleteepromJava Card 222 C Reference Implementation Simulator (version 041)32-bit Address Space implementation - with cryptography supportT=1 T=CL Dual interface APDU protocol (ISO 7816-3)Copyright 2005 Sun Microsystems Inc All rights reserved
Memory configuration
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 1212
(c) COMELEC 2007
Type Base Size Max Addr RAM 0x0 0x1000 0xfff ROM 0x2000 0xe000 0xffff E2P 0x10020 0xffe0 0x1ffff
ROM Mask size = 0xce64 = 52836 bytes Highest ROM address in mask = 0xee63 = 61027 bytes Space available in ROM = 0x119c = 4508 bytesEEPROM (0xffe0 bytes) restored from file monappleteepromUsing a pre-initialized Mask
Nous pouvons deacutesormais lancer notre application cliente et observer les mecircmes reacutesultats quavec JCWDE en revanche leacutetat de la
carte (le compteur) sera conserveacute dune session agrave lautre
Pour aller plus loin
Si le cœur vous en dit vous pouvez uploader votre magnifique compteur sur une vraie Javacard cest sur cette page que ccedila se
passe
FilenameTitle Taille
Maclassejava 412 Ko
eclipse-jcde-01-linuxtgz 13554 Ko
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 612
ce qui provoque la fermeture de JCWDE dans la console dEclipse
powerdown
CREF simulateur avec conservation deacutetat
JCWDE a lavantage de ne pas neacutecessiter lupload de lapplet sur le simulateur ce qui le rend plus souple dutilisation par rapport agrave
CREF En revanche degraves que JCWDE est stoppeacute (agrave la reception dune commande powerdown par exemple) leacutetat de la carte nest pas
conserveacute (la valeur du compteur dans le cas lapplet de ce TP) contrairement agrave ce qui se passe avec une vrai carte (si la carte est
retireacutee du lecteur la valeur du compteur reste conserveacutee dans la meacutemoire EEPROM de la carte)
Les options de ligne de commande que nous allons utiliser
-i fichier_eeprom initialise leacutetat de la carte avec limage fichier_eeprom-o fichier_eeprom enregistre leacutetat de la carte dans fichier_eeprom
Nous pouvons lancer CREF et creacuteer notre fichier image Pour cela ouvrir un terminal dans lequel on aura pris soin de deacutefinir les
variables denvironnement (cf plus haut) puis taper cref ndasho monappleteeprom et valider
~ELECINF359$ cref ndasho monappleteepromJava Card 222 C Reference Implementation Simulator (version 041)32-bit Address Space implementation - with cryptography supportT=1 T=CL Dual interface APDU protocol (ISO 7816-3)Copyright 2005 Sun Microsystems Inc All rights reserved
Memory configuration Type Base Size Max Addr RAM 0x0 0x1000 0xfff ROM 0x2000 0xe000 0xffff E2P 0x10020 0xffe0 0x1ffff
ROM Mask size = 0xce64 = 52836 bytes Highest ROM address in mask = 0xee63 = 61027 bytes Space available in ROM = 0x119c = 4508 bytesEEPROM will be saved in file monappleteepromMask has now been initialized for use
Chargeons maintenant notre applet Pour cela clic droit sur le package monpackage Java Card Tools Deploy
Nous pouvons voir les APDUs envoyeacutes dans la zone Console dEclipse
Les status word 0x9000 indiquent que lupload sest deacuterouleacute correctement
Relanccedilons CREF afin dinstaller notre applet en prenant soin de recharger notre fichier image (option ndashi)
~ELECINF359$ cref ndashi monappleteeprom ndasho monappleteepromJava Card 222 C Reference Implementation Simulator (version 041)32-bit Address Space implementation - with cryptography supportT=1 T=CL Dual interface APDU protocol (ISO 7816-3)Copyright 2005 Sun Microsystems Inc All rights reserved
Memory configuration Type Base Size Max Addr RAM 0x0 0x1000 0xfff ROM 0x2000 0xe000 0xffff E2P 0x10020 0xffe0 0x1ffff
ROM Mask size = 0xce64 = 52836 bytes Highest ROM address in mask = 0xee63 = 61027 bytes Space available in ROM = 0x119c = 4508 bytesEEPROM (0xffe0 bytes) restored from file monappleteepromUsing a pre-initialized Mask
Installons notre applet Pour cela dans Eclipse clic droit sur le script create-MonAppletscript Java Card Tools Run Script
Agrave ce stade nous pouvons utiliser apdutool pour tester notre carte de la mecircme maniegravere quavec JCWDE en prenant soin de ne pas
oublier la commande powerup et la seacutelection de lapplet Commenccedilons par relancer CREF (qui sest termineacute sur une commande
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 712
32-bit Address Space implementation - with cryptography supportT=1 T=CL Dual interface APDU protocol (ISO 7816-3)Copyright 2005 Sun Microsystems Inc All rights reserved
Memory configuration Type Base Size Max Addr RAM 0x0 0x1000 0xfff ROM 0x2000 0xe000 0xffff E2P 0x10020 0xffe0 0x1ffff
ROM Mask size = 0xce64 = 52836 bytes Highest ROM address in mask = 0xee63 = 61027 bytes Space available in ROM = 0x119c = 4508 bytesEEPROM (0xffe0 bytes) restored from file monappleteepromUsing a pre-initialized Mask
Puis dans un autre terminal lanccedilons apdutool seacutelectionnons notre applet apregraves quoi nous pouvons envoyer des APDU agrave notre
applet
~ELECINF359$ apdutoolJava Card 222 APDU Tool Version 13Copyright 2005 Sun Microsystems Inc All rights reserved Use is subject to license termsOpening connection to localhost on port 9025ConnectedpowerupReceived ATR = 0x3b 0xf0 0x11 0x00 0xff 0x01 select MonApplet applet0x00 0xA4 0x04 0x00 0xb 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x00 0x00 0x7FCLA 00 INS a4 P1 04 P2 00 Lc 0b 01 02 03 04 05 06 07 08 09 00 00 Le 00 SW1 90 SW2 000xB0 0x00 0x00 0x00 0x00 0x7FCLA b0 INS 00 P1 00 P2 00 Lc 00 Le 00 SW1 90 SW2 000xB0 0x02 0x00 0x00 0x00 0x7FCLA b0 INS 02 P1 00 P2 00 Lc 00 Le 01 01 SW1 90 SW2 00powerdown
Codage dune application cliente
Maintenant que nous avons programmeacute notre applet Javcard nous pouvons coder une application cliente leacutequivalent du terminal
bancaire si notre Javacard eacutetait une carte de paiement
Creacuteation du projet sous Eclipse
Creacuteons un nouveau projet Pour cela dans Eclipse aller dans le menu File faire New puis Project
Choisir Java Project puis confirmer en cliquant sur Next
Donner un nom au nouveau projet puis cliquer sur Finish
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 812
Ajout de la librairie laquo apduio raquo dans le classpath
Afin de pouvoir utiliser les classes servant agrave communiquer avec notre Javacard il faut ajouter la bibliothegraveque apduiojar(preacutesente dans le reacutepertoire ~ELECINF359java_card_kit-2_2_2lib) Pour cela faire un clic droit sur notre nouveau
projet puis Proprieacuteteacutes
Dans la section Java Build Path seacutelectionner longlet Librairies et cliquer sur le bouton Add External Jars
Seacutelectionner alors le fichier apduiojar valider et appuyer sur le bouton OK
Creacuteation de la classe principale
Tout dabord creacuteons un nouveau package Pour cela faire un clic droit sur notre projet puis New et Package
Donner un nom au package puis valider agrave laide du bouton Finish
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 912
Creacuteons maintenant la classe principale de notre application Pour cela faire un clic droit sur le package creacuteeacute puis New et Class
Donnons un nom agrave notre nouvelle classe cocher la case public static void main puis cliquer sur Finish
Code pour se connecter agrave la Javacard
La connexion au simulateur se fait via une socket Le simulateur eacutecoute par deacutefaut sur le port 9025 La classe que nous utiliserons
pour les eacutechanges de donneacutees est CadT1Client
Connexion a la Javacard CadT1Client cad Socket sckCarte try sckCarte = new Socket(localhost 9025) sckCartesetTcpNoDelay(true) BufferedInputStream input = new BufferedInputStream(sckCartegetInputStream()) BufferedOutputStream output = new BufferedOutputStream(sckCartegetOutputStream()) cad = new CadT1Client(input output) catch (Exception e) Systemoutprintln(Erreur impossible de se connecter a la Javacard) return
Mise sous tension de la carte try cadpowerUp() catch (Exception e) Systemoutprintln(Erreur lors de lenvoi de la commande Powerup a la Javacard) return
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 1012
Code pour se deacuteconnecter de la Javacard
La deacuteconnexion de la Javacard se fera via la meacutethode powerDown() de la classe CadT1Client
Mise hors tension de la carte try cadpowerDown() catch (Exception e) Systemoutprintln(Erreur lors de lenvoi de la commande Powerdown a la Javacard) return
Code pour seacutelectionner lapplet Javacard
La seacutelection dapplet se fait en envoyant lAPDU deacutecrite preacuteceacutedemment
Seacutelection de lapplet Apdu apdu = new Apdu() apducommand[ApduCLA] = 0x00 apducommand[ApduINS] = (byte) 0xA4 apducommand[ApduP1] = 0x04 apducommand[ApduP2] = 0x00 byte[] appletAID = 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x00 0x00 apdusetDataIn(appletAID) cadexchangeApdu(apdu) if (apdugetStatus() = 0x9000) Systemoutprintln(Erreur lors de la seacutelection de lapplet) Systemexit(1)
Note cette phase de seacutelection nest pas indispensable pour le simulateur JCWDE
Code de la boucle principale de lapplication
Voici le code de la boucle principale de lapplication Il suffit pour chaque opeacuteration dinitialiser correctement une instance de lobjet
APDU et de lenvoyer agrave la carte via linstance de la classe CadT1Client
Menu principal boolean fin = false while (fin) Systemoutprintln() Systemoutprintln(Application cliente Javacard) Systemoutprintln(----------------------------) Systemoutprintln() Systemoutprintln(1 - Interroger le compteur) Systemoutprintln(2 - Inrementer le compteur) Systemoutprintln(3 - Decrementer le compteur) Systemoutprintln(4 - Reinitialiser le compteur) Systemoutprintln(5 - Quitter) Systemoutprintln() Systemoutprintln(Votre choix )
int choix = Systeminread() while ((choix gt= 1 ampamp choix lt= 5)) choix = Systeminread()
switch (choix) case 1 apducommand[ApduINS] = MaclasseINS_INTERROGER_COMPTEUR cadexchangeApdu(apdu) if (apdugetStatus() = 0x9000) Systemoutprintln(Erreur status word different de 0x9000) else Systemoutprintln(Valeur du compteur + apdudataOut[0]) break
case 2 apducommand[ApduINS] = MaclasseINS_INCREMENTER_COMPTEUR cadexchangeApdu(apdu) if (apdugetStatus() = 0x9000) Systemoutprintln(Erreur status word different de 0x9000) else Systemoutprintln(OK) break
case 3 apducommand[ApduINS] = MaclasseINS_DECREMENTER_COMPTEUR cadexchangeApdu(apdu) if (apdugetStatus() = 0x9000) Systemoutprintln(Erreur status word different de 0x9000) else Systemoutprintln(OK) break
case 4
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 1112
apducommand[ApduINS] = MaclasseINS_INITIALISER_COMPTEUR byte[] donnees = new byte[1] donnees[0] = 0 apdusetDataIn(donnees) cadexchangeApdu(apdu) if (apdugetStatus() = 0x9000) Systemoutprintln(Erreur status word different de 0x9000) else Systemoutprintln(OK) break
case 5 fin = true break
Le code source de lapplication est disponible ici Maclassejava
Utilisation de lapplication cliente et dun simulateur
Avec JCWDE
Afin de pouvoir lancer le simulateur de notre applet en ligne de commande nous allons creacuteer un fichier de configuration Il permet
de lister les applets Javacard agrave installer pour la simulation et de speacutecifier leurs AID respectifs
Creacuteons notre fichier que nous appellerons monappletapp Il contiendra la ligne suivante
Nous pouvons maintenant lancer notre simulateur en prenant soin de nous placer dans le bon reacutepertoire (reacutepertoire parent du
package contenant le fichier class de lapplet)
~$ cd workspaceTutoriel Javacardbin~workspaceTutoriel Javacardbin$ jcwde monappletappJava Card 222 Workstation Development Environment Version 13Copyright 2005 Sun Microsystems Inc All rights reserved Use is subject to license termsjcwde is listening for T=1 Apdus on TCPIP port 9 025
Maintenant que notre simulateur est lanceacute lanccedilons notre application cliente
Commenccedilons par interroger le compteur tapons 1 puis validons
Le compteur est bien agrave 0 Increacutementons maintenant le compteur 3 fois puis deacutecreacutementons-le une fois Lorsque nous reacuteinterrogeons la
carte le compteur vaut 2 donc tout va bien
Quittons maintenant notre application cliente (commande 5) Nous pouvons voir que le simulateur se termine automatiquement agrave la
reacuteception de la commande powerdown
jcwde exiting on receipt of power down command
Rappel ce simulateur ne permet pas de conserver leacutetat de la carte Si nous le relanccedilons le compteur sera agrave 0 et non agrave 2
Avec CREF
Lanccedilons CREF agrave partir de limage EEPROM que nous avons geacuteneacutereacutee
~ELECINF359$ cref ndashi monappleteeprom ndasho monappleteepromJava Card 222 C Reference Implementation Simulator (version 041)32-bit Address Space implementation - with cryptography supportT=1 T=CL Dual interface APDU protocol (ISO 7816-3)Copyright 2005 Sun Microsystems Inc All rights reserved
Memory configuration
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 1212
(c) COMELEC 2007
Type Base Size Max Addr RAM 0x0 0x1000 0xfff ROM 0x2000 0xe000 0xffff E2P 0x10020 0xffe0 0x1ffff
ROM Mask size = 0xce64 = 52836 bytes Highest ROM address in mask = 0xee63 = 61027 bytes Space available in ROM = 0x119c = 4508 bytesEEPROM (0xffe0 bytes) restored from file monappleteepromUsing a pre-initialized Mask
Nous pouvons deacutesormais lancer notre application cliente et observer les mecircmes reacutesultats quavec JCWDE en revanche leacutetat de la
carte (le compteur) sera conserveacute dune session agrave lautre
Pour aller plus loin
Si le cœur vous en dit vous pouvez uploader votre magnifique compteur sur une vraie Javacard cest sur cette page que ccedila se
passe
FilenameTitle Taille
Maclassejava 412 Ko
eclipse-jcde-01-linuxtgz 13554 Ko
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 712
32-bit Address Space implementation - with cryptography supportT=1 T=CL Dual interface APDU protocol (ISO 7816-3)Copyright 2005 Sun Microsystems Inc All rights reserved
Memory configuration Type Base Size Max Addr RAM 0x0 0x1000 0xfff ROM 0x2000 0xe000 0xffff E2P 0x10020 0xffe0 0x1ffff
ROM Mask size = 0xce64 = 52836 bytes Highest ROM address in mask = 0xee63 = 61027 bytes Space available in ROM = 0x119c = 4508 bytesEEPROM (0xffe0 bytes) restored from file monappleteepromUsing a pre-initialized Mask
Puis dans un autre terminal lanccedilons apdutool seacutelectionnons notre applet apregraves quoi nous pouvons envoyer des APDU agrave notre
applet
~ELECINF359$ apdutoolJava Card 222 APDU Tool Version 13Copyright 2005 Sun Microsystems Inc All rights reserved Use is subject to license termsOpening connection to localhost on port 9025ConnectedpowerupReceived ATR = 0x3b 0xf0 0x11 0x00 0xff 0x01 select MonApplet applet0x00 0xA4 0x04 0x00 0xb 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x00 0x00 0x7FCLA 00 INS a4 P1 04 P2 00 Lc 0b 01 02 03 04 05 06 07 08 09 00 00 Le 00 SW1 90 SW2 000xB0 0x00 0x00 0x00 0x00 0x7FCLA b0 INS 00 P1 00 P2 00 Lc 00 Le 00 SW1 90 SW2 000xB0 0x02 0x00 0x00 0x00 0x7FCLA b0 INS 02 P1 00 P2 00 Lc 00 Le 01 01 SW1 90 SW2 00powerdown
Codage dune application cliente
Maintenant que nous avons programmeacute notre applet Javcard nous pouvons coder une application cliente leacutequivalent du terminal
bancaire si notre Javacard eacutetait une carte de paiement
Creacuteation du projet sous Eclipse
Creacuteons un nouveau projet Pour cela dans Eclipse aller dans le menu File faire New puis Project
Choisir Java Project puis confirmer en cliquant sur Next
Donner un nom au nouveau projet puis cliquer sur Finish
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 812
Ajout de la librairie laquo apduio raquo dans le classpath
Afin de pouvoir utiliser les classes servant agrave communiquer avec notre Javacard il faut ajouter la bibliothegraveque apduiojar(preacutesente dans le reacutepertoire ~ELECINF359java_card_kit-2_2_2lib) Pour cela faire un clic droit sur notre nouveau
projet puis Proprieacuteteacutes
Dans la section Java Build Path seacutelectionner longlet Librairies et cliquer sur le bouton Add External Jars
Seacutelectionner alors le fichier apduiojar valider et appuyer sur le bouton OK
Creacuteation de la classe principale
Tout dabord creacuteons un nouveau package Pour cela faire un clic droit sur notre projet puis New et Package
Donner un nom au package puis valider agrave laide du bouton Finish
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 912
Creacuteons maintenant la classe principale de notre application Pour cela faire un clic droit sur le package creacuteeacute puis New et Class
Donnons un nom agrave notre nouvelle classe cocher la case public static void main puis cliquer sur Finish
Code pour se connecter agrave la Javacard
La connexion au simulateur se fait via une socket Le simulateur eacutecoute par deacutefaut sur le port 9025 La classe que nous utiliserons
pour les eacutechanges de donneacutees est CadT1Client
Connexion a la Javacard CadT1Client cad Socket sckCarte try sckCarte = new Socket(localhost 9025) sckCartesetTcpNoDelay(true) BufferedInputStream input = new BufferedInputStream(sckCartegetInputStream()) BufferedOutputStream output = new BufferedOutputStream(sckCartegetOutputStream()) cad = new CadT1Client(input output) catch (Exception e) Systemoutprintln(Erreur impossible de se connecter a la Javacard) return
Mise sous tension de la carte try cadpowerUp() catch (Exception e) Systemoutprintln(Erreur lors de lenvoi de la commande Powerup a la Javacard) return
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 1012
Code pour se deacuteconnecter de la Javacard
La deacuteconnexion de la Javacard se fera via la meacutethode powerDown() de la classe CadT1Client
Mise hors tension de la carte try cadpowerDown() catch (Exception e) Systemoutprintln(Erreur lors de lenvoi de la commande Powerdown a la Javacard) return
Code pour seacutelectionner lapplet Javacard
La seacutelection dapplet se fait en envoyant lAPDU deacutecrite preacuteceacutedemment
Seacutelection de lapplet Apdu apdu = new Apdu() apducommand[ApduCLA] = 0x00 apducommand[ApduINS] = (byte) 0xA4 apducommand[ApduP1] = 0x04 apducommand[ApduP2] = 0x00 byte[] appletAID = 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x00 0x00 apdusetDataIn(appletAID) cadexchangeApdu(apdu) if (apdugetStatus() = 0x9000) Systemoutprintln(Erreur lors de la seacutelection de lapplet) Systemexit(1)
Note cette phase de seacutelection nest pas indispensable pour le simulateur JCWDE
Code de la boucle principale de lapplication
Voici le code de la boucle principale de lapplication Il suffit pour chaque opeacuteration dinitialiser correctement une instance de lobjet
APDU et de lenvoyer agrave la carte via linstance de la classe CadT1Client
Menu principal boolean fin = false while (fin) Systemoutprintln() Systemoutprintln(Application cliente Javacard) Systemoutprintln(----------------------------) Systemoutprintln() Systemoutprintln(1 - Interroger le compteur) Systemoutprintln(2 - Inrementer le compteur) Systemoutprintln(3 - Decrementer le compteur) Systemoutprintln(4 - Reinitialiser le compteur) Systemoutprintln(5 - Quitter) Systemoutprintln() Systemoutprintln(Votre choix )
int choix = Systeminread() while ((choix gt= 1 ampamp choix lt= 5)) choix = Systeminread()
switch (choix) case 1 apducommand[ApduINS] = MaclasseINS_INTERROGER_COMPTEUR cadexchangeApdu(apdu) if (apdugetStatus() = 0x9000) Systemoutprintln(Erreur status word different de 0x9000) else Systemoutprintln(Valeur du compteur + apdudataOut[0]) break
case 2 apducommand[ApduINS] = MaclasseINS_INCREMENTER_COMPTEUR cadexchangeApdu(apdu) if (apdugetStatus() = 0x9000) Systemoutprintln(Erreur status word different de 0x9000) else Systemoutprintln(OK) break
case 3 apducommand[ApduINS] = MaclasseINS_DECREMENTER_COMPTEUR cadexchangeApdu(apdu) if (apdugetStatus() = 0x9000) Systemoutprintln(Erreur status word different de 0x9000) else Systemoutprintln(OK) break
case 4
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 1112
apducommand[ApduINS] = MaclasseINS_INITIALISER_COMPTEUR byte[] donnees = new byte[1] donnees[0] = 0 apdusetDataIn(donnees) cadexchangeApdu(apdu) if (apdugetStatus() = 0x9000) Systemoutprintln(Erreur status word different de 0x9000) else Systemoutprintln(OK) break
case 5 fin = true break
Le code source de lapplication est disponible ici Maclassejava
Utilisation de lapplication cliente et dun simulateur
Avec JCWDE
Afin de pouvoir lancer le simulateur de notre applet en ligne de commande nous allons creacuteer un fichier de configuration Il permet
de lister les applets Javacard agrave installer pour la simulation et de speacutecifier leurs AID respectifs
Creacuteons notre fichier que nous appellerons monappletapp Il contiendra la ligne suivante
Nous pouvons maintenant lancer notre simulateur en prenant soin de nous placer dans le bon reacutepertoire (reacutepertoire parent du
package contenant le fichier class de lapplet)
~$ cd workspaceTutoriel Javacardbin~workspaceTutoriel Javacardbin$ jcwde monappletappJava Card 222 Workstation Development Environment Version 13Copyright 2005 Sun Microsystems Inc All rights reserved Use is subject to license termsjcwde is listening for T=1 Apdus on TCPIP port 9 025
Maintenant que notre simulateur est lanceacute lanccedilons notre application cliente
Commenccedilons par interroger le compteur tapons 1 puis validons
Le compteur est bien agrave 0 Increacutementons maintenant le compteur 3 fois puis deacutecreacutementons-le une fois Lorsque nous reacuteinterrogeons la
carte le compteur vaut 2 donc tout va bien
Quittons maintenant notre application cliente (commande 5) Nous pouvons voir que le simulateur se termine automatiquement agrave la
reacuteception de la commande powerdown
jcwde exiting on receipt of power down command
Rappel ce simulateur ne permet pas de conserver leacutetat de la carte Si nous le relanccedilons le compteur sera agrave 0 et non agrave 2
Avec CREF
Lanccedilons CREF agrave partir de limage EEPROM que nous avons geacuteneacutereacutee
~ELECINF359$ cref ndashi monappleteeprom ndasho monappleteepromJava Card 222 C Reference Implementation Simulator (version 041)32-bit Address Space implementation - with cryptography supportT=1 T=CL Dual interface APDU protocol (ISO 7816-3)Copyright 2005 Sun Microsystems Inc All rights reserved
Memory configuration
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 1212
(c) COMELEC 2007
Type Base Size Max Addr RAM 0x0 0x1000 0xfff ROM 0x2000 0xe000 0xffff E2P 0x10020 0xffe0 0x1ffff
ROM Mask size = 0xce64 = 52836 bytes Highest ROM address in mask = 0xee63 = 61027 bytes Space available in ROM = 0x119c = 4508 bytesEEPROM (0xffe0 bytes) restored from file monappleteepromUsing a pre-initialized Mask
Nous pouvons deacutesormais lancer notre application cliente et observer les mecircmes reacutesultats quavec JCWDE en revanche leacutetat de la
carte (le compteur) sera conserveacute dune session agrave lautre
Pour aller plus loin
Si le cœur vous en dit vous pouvez uploader votre magnifique compteur sur une vraie Javacard cest sur cette page que ccedila se
passe
FilenameTitle Taille
Maclassejava 412 Ko
eclipse-jcde-01-linuxtgz 13554 Ko
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 812
Ajout de la librairie laquo apduio raquo dans le classpath
Afin de pouvoir utiliser les classes servant agrave communiquer avec notre Javacard il faut ajouter la bibliothegraveque apduiojar(preacutesente dans le reacutepertoire ~ELECINF359java_card_kit-2_2_2lib) Pour cela faire un clic droit sur notre nouveau
projet puis Proprieacuteteacutes
Dans la section Java Build Path seacutelectionner longlet Librairies et cliquer sur le bouton Add External Jars
Seacutelectionner alors le fichier apduiojar valider et appuyer sur le bouton OK
Creacuteation de la classe principale
Tout dabord creacuteons un nouveau package Pour cela faire un clic droit sur notre projet puis New et Package
Donner un nom au package puis valider agrave laide du bouton Finish
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 912
Creacuteons maintenant la classe principale de notre application Pour cela faire un clic droit sur le package creacuteeacute puis New et Class
Donnons un nom agrave notre nouvelle classe cocher la case public static void main puis cliquer sur Finish
Code pour se connecter agrave la Javacard
La connexion au simulateur se fait via une socket Le simulateur eacutecoute par deacutefaut sur le port 9025 La classe que nous utiliserons
pour les eacutechanges de donneacutees est CadT1Client
Connexion a la Javacard CadT1Client cad Socket sckCarte try sckCarte = new Socket(localhost 9025) sckCartesetTcpNoDelay(true) BufferedInputStream input = new BufferedInputStream(sckCartegetInputStream()) BufferedOutputStream output = new BufferedOutputStream(sckCartegetOutputStream()) cad = new CadT1Client(input output) catch (Exception e) Systemoutprintln(Erreur impossible de se connecter a la Javacard) return
Mise sous tension de la carte try cadpowerUp() catch (Exception e) Systemoutprintln(Erreur lors de lenvoi de la commande Powerup a la Javacard) return
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 1012
Code pour se deacuteconnecter de la Javacard
La deacuteconnexion de la Javacard se fera via la meacutethode powerDown() de la classe CadT1Client
Mise hors tension de la carte try cadpowerDown() catch (Exception e) Systemoutprintln(Erreur lors de lenvoi de la commande Powerdown a la Javacard) return
Code pour seacutelectionner lapplet Javacard
La seacutelection dapplet se fait en envoyant lAPDU deacutecrite preacuteceacutedemment
Seacutelection de lapplet Apdu apdu = new Apdu() apducommand[ApduCLA] = 0x00 apducommand[ApduINS] = (byte) 0xA4 apducommand[ApduP1] = 0x04 apducommand[ApduP2] = 0x00 byte[] appletAID = 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x00 0x00 apdusetDataIn(appletAID) cadexchangeApdu(apdu) if (apdugetStatus() = 0x9000) Systemoutprintln(Erreur lors de la seacutelection de lapplet) Systemexit(1)
Note cette phase de seacutelection nest pas indispensable pour le simulateur JCWDE
Code de la boucle principale de lapplication
Voici le code de la boucle principale de lapplication Il suffit pour chaque opeacuteration dinitialiser correctement une instance de lobjet
APDU et de lenvoyer agrave la carte via linstance de la classe CadT1Client
Menu principal boolean fin = false while (fin) Systemoutprintln() Systemoutprintln(Application cliente Javacard) Systemoutprintln(----------------------------) Systemoutprintln() Systemoutprintln(1 - Interroger le compteur) Systemoutprintln(2 - Inrementer le compteur) Systemoutprintln(3 - Decrementer le compteur) Systemoutprintln(4 - Reinitialiser le compteur) Systemoutprintln(5 - Quitter) Systemoutprintln() Systemoutprintln(Votre choix )
int choix = Systeminread() while ((choix gt= 1 ampamp choix lt= 5)) choix = Systeminread()
switch (choix) case 1 apducommand[ApduINS] = MaclasseINS_INTERROGER_COMPTEUR cadexchangeApdu(apdu) if (apdugetStatus() = 0x9000) Systemoutprintln(Erreur status word different de 0x9000) else Systemoutprintln(Valeur du compteur + apdudataOut[0]) break
case 2 apducommand[ApduINS] = MaclasseINS_INCREMENTER_COMPTEUR cadexchangeApdu(apdu) if (apdugetStatus() = 0x9000) Systemoutprintln(Erreur status word different de 0x9000) else Systemoutprintln(OK) break
case 3 apducommand[ApduINS] = MaclasseINS_DECREMENTER_COMPTEUR cadexchangeApdu(apdu) if (apdugetStatus() = 0x9000) Systemoutprintln(Erreur status word different de 0x9000) else Systemoutprintln(OK) break
case 4
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 1112
apducommand[ApduINS] = MaclasseINS_INITIALISER_COMPTEUR byte[] donnees = new byte[1] donnees[0] = 0 apdusetDataIn(donnees) cadexchangeApdu(apdu) if (apdugetStatus() = 0x9000) Systemoutprintln(Erreur status word different de 0x9000) else Systemoutprintln(OK) break
case 5 fin = true break
Le code source de lapplication est disponible ici Maclassejava
Utilisation de lapplication cliente et dun simulateur
Avec JCWDE
Afin de pouvoir lancer le simulateur de notre applet en ligne de commande nous allons creacuteer un fichier de configuration Il permet
de lister les applets Javacard agrave installer pour la simulation et de speacutecifier leurs AID respectifs
Creacuteons notre fichier que nous appellerons monappletapp Il contiendra la ligne suivante
Nous pouvons maintenant lancer notre simulateur en prenant soin de nous placer dans le bon reacutepertoire (reacutepertoire parent du
package contenant le fichier class de lapplet)
~$ cd workspaceTutoriel Javacardbin~workspaceTutoriel Javacardbin$ jcwde monappletappJava Card 222 Workstation Development Environment Version 13Copyright 2005 Sun Microsystems Inc All rights reserved Use is subject to license termsjcwde is listening for T=1 Apdus on TCPIP port 9 025
Maintenant que notre simulateur est lanceacute lanccedilons notre application cliente
Commenccedilons par interroger le compteur tapons 1 puis validons
Le compteur est bien agrave 0 Increacutementons maintenant le compteur 3 fois puis deacutecreacutementons-le une fois Lorsque nous reacuteinterrogeons la
carte le compteur vaut 2 donc tout va bien
Quittons maintenant notre application cliente (commande 5) Nous pouvons voir que le simulateur se termine automatiquement agrave la
reacuteception de la commande powerdown
jcwde exiting on receipt of power down command
Rappel ce simulateur ne permet pas de conserver leacutetat de la carte Si nous le relanccedilons le compteur sera agrave 0 et non agrave 2
Avec CREF
Lanccedilons CREF agrave partir de limage EEPROM que nous avons geacuteneacutereacutee
~ELECINF359$ cref ndashi monappleteeprom ndasho monappleteepromJava Card 222 C Reference Implementation Simulator (version 041)32-bit Address Space implementation - with cryptography supportT=1 T=CL Dual interface APDU protocol (ISO 7816-3)Copyright 2005 Sun Microsystems Inc All rights reserved
Memory configuration
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 1212
(c) COMELEC 2007
Type Base Size Max Addr RAM 0x0 0x1000 0xfff ROM 0x2000 0xe000 0xffff E2P 0x10020 0xffe0 0x1ffff
ROM Mask size = 0xce64 = 52836 bytes Highest ROM address in mask = 0xee63 = 61027 bytes Space available in ROM = 0x119c = 4508 bytesEEPROM (0xffe0 bytes) restored from file monappleteepromUsing a pre-initialized Mask
Nous pouvons deacutesormais lancer notre application cliente et observer les mecircmes reacutesultats quavec JCWDE en revanche leacutetat de la
carte (le compteur) sera conserveacute dune session agrave lautre
Pour aller plus loin
Si le cœur vous en dit vous pouvez uploader votre magnifique compteur sur une vraie Javacard cest sur cette page que ccedila se
passe
FilenameTitle Taille
Maclassejava 412 Ko
eclipse-jcde-01-linuxtgz 13554 Ko
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 912
Creacuteons maintenant la classe principale de notre application Pour cela faire un clic droit sur le package creacuteeacute puis New et Class
Donnons un nom agrave notre nouvelle classe cocher la case public static void main puis cliquer sur Finish
Code pour se connecter agrave la Javacard
La connexion au simulateur se fait via une socket Le simulateur eacutecoute par deacutefaut sur le port 9025 La classe que nous utiliserons
pour les eacutechanges de donneacutees est CadT1Client
Connexion a la Javacard CadT1Client cad Socket sckCarte try sckCarte = new Socket(localhost 9025) sckCartesetTcpNoDelay(true) BufferedInputStream input = new BufferedInputStream(sckCartegetInputStream()) BufferedOutputStream output = new BufferedOutputStream(sckCartegetOutputStream()) cad = new CadT1Client(input output) catch (Exception e) Systemoutprintln(Erreur impossible de se connecter a la Javacard) return
Mise sous tension de la carte try cadpowerUp() catch (Exception e) Systemoutprintln(Erreur lors de lenvoi de la commande Powerup a la Javacard) return
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 1012
Code pour se deacuteconnecter de la Javacard
La deacuteconnexion de la Javacard se fera via la meacutethode powerDown() de la classe CadT1Client
Mise hors tension de la carte try cadpowerDown() catch (Exception e) Systemoutprintln(Erreur lors de lenvoi de la commande Powerdown a la Javacard) return
Code pour seacutelectionner lapplet Javacard
La seacutelection dapplet se fait en envoyant lAPDU deacutecrite preacuteceacutedemment
Seacutelection de lapplet Apdu apdu = new Apdu() apducommand[ApduCLA] = 0x00 apducommand[ApduINS] = (byte) 0xA4 apducommand[ApduP1] = 0x04 apducommand[ApduP2] = 0x00 byte[] appletAID = 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x00 0x00 apdusetDataIn(appletAID) cadexchangeApdu(apdu) if (apdugetStatus() = 0x9000) Systemoutprintln(Erreur lors de la seacutelection de lapplet) Systemexit(1)
Note cette phase de seacutelection nest pas indispensable pour le simulateur JCWDE
Code de la boucle principale de lapplication
Voici le code de la boucle principale de lapplication Il suffit pour chaque opeacuteration dinitialiser correctement une instance de lobjet
APDU et de lenvoyer agrave la carte via linstance de la classe CadT1Client
Menu principal boolean fin = false while (fin) Systemoutprintln() Systemoutprintln(Application cliente Javacard) Systemoutprintln(----------------------------) Systemoutprintln() Systemoutprintln(1 - Interroger le compteur) Systemoutprintln(2 - Inrementer le compteur) Systemoutprintln(3 - Decrementer le compteur) Systemoutprintln(4 - Reinitialiser le compteur) Systemoutprintln(5 - Quitter) Systemoutprintln() Systemoutprintln(Votre choix )
int choix = Systeminread() while ((choix gt= 1 ampamp choix lt= 5)) choix = Systeminread()
switch (choix) case 1 apducommand[ApduINS] = MaclasseINS_INTERROGER_COMPTEUR cadexchangeApdu(apdu) if (apdugetStatus() = 0x9000) Systemoutprintln(Erreur status word different de 0x9000) else Systemoutprintln(Valeur du compteur + apdudataOut[0]) break
case 2 apducommand[ApduINS] = MaclasseINS_INCREMENTER_COMPTEUR cadexchangeApdu(apdu) if (apdugetStatus() = 0x9000) Systemoutprintln(Erreur status word different de 0x9000) else Systemoutprintln(OK) break
case 3 apducommand[ApduINS] = MaclasseINS_DECREMENTER_COMPTEUR cadexchangeApdu(apdu) if (apdugetStatus() = 0x9000) Systemoutprintln(Erreur status word different de 0x9000) else Systemoutprintln(OK) break
case 4
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 1112
apducommand[ApduINS] = MaclasseINS_INITIALISER_COMPTEUR byte[] donnees = new byte[1] donnees[0] = 0 apdusetDataIn(donnees) cadexchangeApdu(apdu) if (apdugetStatus() = 0x9000) Systemoutprintln(Erreur status word different de 0x9000) else Systemoutprintln(OK) break
case 5 fin = true break
Le code source de lapplication est disponible ici Maclassejava
Utilisation de lapplication cliente et dun simulateur
Avec JCWDE
Afin de pouvoir lancer le simulateur de notre applet en ligne de commande nous allons creacuteer un fichier de configuration Il permet
de lister les applets Javacard agrave installer pour la simulation et de speacutecifier leurs AID respectifs
Creacuteons notre fichier que nous appellerons monappletapp Il contiendra la ligne suivante
Nous pouvons maintenant lancer notre simulateur en prenant soin de nous placer dans le bon reacutepertoire (reacutepertoire parent du
package contenant le fichier class de lapplet)
~$ cd workspaceTutoriel Javacardbin~workspaceTutoriel Javacardbin$ jcwde monappletappJava Card 222 Workstation Development Environment Version 13Copyright 2005 Sun Microsystems Inc All rights reserved Use is subject to license termsjcwde is listening for T=1 Apdus on TCPIP port 9 025
Maintenant que notre simulateur est lanceacute lanccedilons notre application cliente
Commenccedilons par interroger le compteur tapons 1 puis validons
Le compteur est bien agrave 0 Increacutementons maintenant le compteur 3 fois puis deacutecreacutementons-le une fois Lorsque nous reacuteinterrogeons la
carte le compteur vaut 2 donc tout va bien
Quittons maintenant notre application cliente (commande 5) Nous pouvons voir que le simulateur se termine automatiquement agrave la
reacuteception de la commande powerdown
jcwde exiting on receipt of power down command
Rappel ce simulateur ne permet pas de conserver leacutetat de la carte Si nous le relanccedilons le compteur sera agrave 0 et non agrave 2
Avec CREF
Lanccedilons CREF agrave partir de limage EEPROM que nous avons geacuteneacutereacutee
~ELECINF359$ cref ndashi monappleteeprom ndasho monappleteepromJava Card 222 C Reference Implementation Simulator (version 041)32-bit Address Space implementation - with cryptography supportT=1 T=CL Dual interface APDU protocol (ISO 7816-3)Copyright 2005 Sun Microsystems Inc All rights reserved
Memory configuration
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 1212
(c) COMELEC 2007
Type Base Size Max Addr RAM 0x0 0x1000 0xfff ROM 0x2000 0xe000 0xffff E2P 0x10020 0xffe0 0x1ffff
ROM Mask size = 0xce64 = 52836 bytes Highest ROM address in mask = 0xee63 = 61027 bytes Space available in ROM = 0x119c = 4508 bytesEEPROM (0xffe0 bytes) restored from file monappleteepromUsing a pre-initialized Mask
Nous pouvons deacutesormais lancer notre application cliente et observer les mecircmes reacutesultats quavec JCWDE en revanche leacutetat de la
carte (le compteur) sera conserveacute dune session agrave lautre
Pour aller plus loin
Si le cœur vous en dit vous pouvez uploader votre magnifique compteur sur une vraie Javacard cest sur cette page que ccedila se
passe
FilenameTitle Taille
Maclassejava 412 Ko
eclipse-jcde-01-linuxtgz 13554 Ko
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 1012
Code pour se deacuteconnecter de la Javacard
La deacuteconnexion de la Javacard se fera via la meacutethode powerDown() de la classe CadT1Client
Mise hors tension de la carte try cadpowerDown() catch (Exception e) Systemoutprintln(Erreur lors de lenvoi de la commande Powerdown a la Javacard) return
Code pour seacutelectionner lapplet Javacard
La seacutelection dapplet se fait en envoyant lAPDU deacutecrite preacuteceacutedemment
Seacutelection de lapplet Apdu apdu = new Apdu() apducommand[ApduCLA] = 0x00 apducommand[ApduINS] = (byte) 0xA4 apducommand[ApduP1] = 0x04 apducommand[ApduP2] = 0x00 byte[] appletAID = 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x00 0x00 apdusetDataIn(appletAID) cadexchangeApdu(apdu) if (apdugetStatus() = 0x9000) Systemoutprintln(Erreur lors de la seacutelection de lapplet) Systemexit(1)
Note cette phase de seacutelection nest pas indispensable pour le simulateur JCWDE
Code de la boucle principale de lapplication
Voici le code de la boucle principale de lapplication Il suffit pour chaque opeacuteration dinitialiser correctement une instance de lobjet
APDU et de lenvoyer agrave la carte via linstance de la classe CadT1Client
Menu principal boolean fin = false while (fin) Systemoutprintln() Systemoutprintln(Application cliente Javacard) Systemoutprintln(----------------------------) Systemoutprintln() Systemoutprintln(1 - Interroger le compteur) Systemoutprintln(2 - Inrementer le compteur) Systemoutprintln(3 - Decrementer le compteur) Systemoutprintln(4 - Reinitialiser le compteur) Systemoutprintln(5 - Quitter) Systemoutprintln() Systemoutprintln(Votre choix )
int choix = Systeminread() while ((choix gt= 1 ampamp choix lt= 5)) choix = Systeminread()
switch (choix) case 1 apducommand[ApduINS] = MaclasseINS_INTERROGER_COMPTEUR cadexchangeApdu(apdu) if (apdugetStatus() = 0x9000) Systemoutprintln(Erreur status word different de 0x9000) else Systemoutprintln(Valeur du compteur + apdudataOut[0]) break
case 2 apducommand[ApduINS] = MaclasseINS_INCREMENTER_COMPTEUR cadexchangeApdu(apdu) if (apdugetStatus() = 0x9000) Systemoutprintln(Erreur status word different de 0x9000) else Systemoutprintln(OK) break
case 3 apducommand[ApduINS] = MaclasseINS_DECREMENTER_COMPTEUR cadexchangeApdu(apdu) if (apdugetStatus() = 0x9000) Systemoutprintln(Erreur status word different de 0x9000) else Systemoutprintln(OK) break
case 4
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 1112
apducommand[ApduINS] = MaclasseINS_INITIALISER_COMPTEUR byte[] donnees = new byte[1] donnees[0] = 0 apdusetDataIn(donnees) cadexchangeApdu(apdu) if (apdugetStatus() = 0x9000) Systemoutprintln(Erreur status word different de 0x9000) else Systemoutprintln(OK) break
case 5 fin = true break
Le code source de lapplication est disponible ici Maclassejava
Utilisation de lapplication cliente et dun simulateur
Avec JCWDE
Afin de pouvoir lancer le simulateur de notre applet en ligne de commande nous allons creacuteer un fichier de configuration Il permet
de lister les applets Javacard agrave installer pour la simulation et de speacutecifier leurs AID respectifs
Creacuteons notre fichier que nous appellerons monappletapp Il contiendra la ligne suivante
Nous pouvons maintenant lancer notre simulateur en prenant soin de nous placer dans le bon reacutepertoire (reacutepertoire parent du
package contenant le fichier class de lapplet)
~$ cd workspaceTutoriel Javacardbin~workspaceTutoriel Javacardbin$ jcwde monappletappJava Card 222 Workstation Development Environment Version 13Copyright 2005 Sun Microsystems Inc All rights reserved Use is subject to license termsjcwde is listening for T=1 Apdus on TCPIP port 9 025
Maintenant que notre simulateur est lanceacute lanccedilons notre application cliente
Commenccedilons par interroger le compteur tapons 1 puis validons
Le compteur est bien agrave 0 Increacutementons maintenant le compteur 3 fois puis deacutecreacutementons-le une fois Lorsque nous reacuteinterrogeons la
carte le compteur vaut 2 donc tout va bien
Quittons maintenant notre application cliente (commande 5) Nous pouvons voir que le simulateur se termine automatiquement agrave la
reacuteception de la commande powerdown
jcwde exiting on receipt of power down command
Rappel ce simulateur ne permet pas de conserver leacutetat de la carte Si nous le relanccedilons le compteur sera agrave 0 et non agrave 2
Avec CREF
Lanccedilons CREF agrave partir de limage EEPROM que nous avons geacuteneacutereacutee
~ELECINF359$ cref ndashi monappleteeprom ndasho monappleteepromJava Card 222 C Reference Implementation Simulator (version 041)32-bit Address Space implementation - with cryptography supportT=1 T=CL Dual interface APDU protocol (ISO 7816-3)Copyright 2005 Sun Microsystems Inc All rights reserved
Memory configuration
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 1212
(c) COMELEC 2007
Type Base Size Max Addr RAM 0x0 0x1000 0xfff ROM 0x2000 0xe000 0xffff E2P 0x10020 0xffe0 0x1ffff
ROM Mask size = 0xce64 = 52836 bytes Highest ROM address in mask = 0xee63 = 61027 bytes Space available in ROM = 0x119c = 4508 bytesEEPROM (0xffe0 bytes) restored from file monappleteepromUsing a pre-initialized Mask
Nous pouvons deacutesormais lancer notre application cliente et observer les mecircmes reacutesultats quavec JCWDE en revanche leacutetat de la
carte (le compteur) sera conserveacute dune session agrave lautre
Pour aller plus loin
Si le cœur vous en dit vous pouvez uploader votre magnifique compteur sur une vraie Javacard cest sur cette page que ccedila se
passe
FilenameTitle Taille
Maclassejava 412 Ko
eclipse-jcde-01-linuxtgz 13554 Ko
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 1112
apducommand[ApduINS] = MaclasseINS_INITIALISER_COMPTEUR byte[] donnees = new byte[1] donnees[0] = 0 apdusetDataIn(donnees) cadexchangeApdu(apdu) if (apdugetStatus() = 0x9000) Systemoutprintln(Erreur status word different de 0x9000) else Systemoutprintln(OK) break
case 5 fin = true break
Le code source de lapplication est disponible ici Maclassejava
Utilisation de lapplication cliente et dun simulateur
Avec JCWDE
Afin de pouvoir lancer le simulateur de notre applet en ligne de commande nous allons creacuteer un fichier de configuration Il permet
de lister les applets Javacard agrave installer pour la simulation et de speacutecifier leurs AID respectifs
Creacuteons notre fichier que nous appellerons monappletapp Il contiendra la ligne suivante
Nous pouvons maintenant lancer notre simulateur en prenant soin de nous placer dans le bon reacutepertoire (reacutepertoire parent du
package contenant le fichier class de lapplet)
~$ cd workspaceTutoriel Javacardbin~workspaceTutoriel Javacardbin$ jcwde monappletappJava Card 222 Workstation Development Environment Version 13Copyright 2005 Sun Microsystems Inc All rights reserved Use is subject to license termsjcwde is listening for T=1 Apdus on TCPIP port 9 025
Maintenant que notre simulateur est lanceacute lanccedilons notre application cliente
Commenccedilons par interroger le compteur tapons 1 puis validons
Le compteur est bien agrave 0 Increacutementons maintenant le compteur 3 fois puis deacutecreacutementons-le une fois Lorsque nous reacuteinterrogeons la
carte le compteur vaut 2 donc tout va bien
Quittons maintenant notre application cliente (commande 5) Nous pouvons voir que le simulateur se termine automatiquement agrave la
reacuteception de la commande powerdown
jcwde exiting on receipt of power down command
Rappel ce simulateur ne permet pas de conserver leacutetat de la carte Si nous le relanccedilons le compteur sera agrave 0 et non agrave 2
Avec CREF
Lanccedilons CREF agrave partir de limage EEPROM que nous avons geacuteneacutereacutee
~ELECINF359$ cref ndashi monappleteeprom ndasho monappleteepromJava Card 222 C Reference Implementation Simulator (version 041)32-bit Address Space implementation - with cryptography supportT=1 T=CL Dual interface APDU protocol (ISO 7816-3)Copyright 2005 Sun Microsystems Inc All rights reserved
Memory configuration
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 1212
(c) COMELEC 2007
Type Base Size Max Addr RAM 0x0 0x1000 0xfff ROM 0x2000 0xe000 0xffff E2P 0x10020 0xffe0 0x1ffff
ROM Mask size = 0xce64 = 52836 bytes Highest ROM address in mask = 0xee63 = 61027 bytes Space available in ROM = 0x119c = 4508 bytesEEPROM (0xffe0 bytes) restored from file monappleteepromUsing a pre-initialized Mask
Nous pouvons deacutesormais lancer notre application cliente et observer les mecircmes reacutesultats quavec JCWDE en revanche leacutetat de la
carte (le compteur) sera conserveacute dune session agrave lautre
Pour aller plus loin
Si le cœur vous en dit vous pouvez uploader votre magnifique compteur sur une vraie Javacard cest sur cette page que ccedila se
passe
FilenameTitle Taille
Maclassejava 412 Ko
eclipse-jcde-01-linuxtgz 13554 Ko
290313 TP Java Card 12 Utilisation du Javacard Development Kit 222 de Sun | Groupe SEN
senenstfrnode408 1212
(c) COMELEC 2007
Type Base Size Max Addr RAM 0x0 0x1000 0xfff ROM 0x2000 0xe000 0xffff E2P 0x10020 0xffe0 0x1ffff
ROM Mask size = 0xce64 = 52836 bytes Highest ROM address in mask = 0xee63 = 61027 bytes Space available in ROM = 0x119c = 4508 bytesEEPROM (0xffe0 bytes) restored from file monappleteepromUsing a pre-initialized Mask
Nous pouvons deacutesormais lancer notre application cliente et observer les mecircmes reacutesultats quavec JCWDE en revanche leacutetat de la
carte (le compteur) sera conserveacute dune session agrave lautre
Pour aller plus loin
Si le cœur vous en dit vous pouvez uploader votre magnifique compteur sur une vraie Javacard cest sur cette page que ccedila se