tp java card 1_2 _ utilisation du javacard development kit 2.2
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
developpezcom (httpjulienbdeveloppezcomtutorielsjavaintrojavacard)
Quelques rappels
Les APDU
Les eacutechanges entre carte et terminal se font au moyen dAPDUs (suite doctets respectant nu format deacutefini dans le standard
ISO7816-4)
Nous utiliserons dans ce TP lAPDU de requecircte suivante
Offset 1 2 3 4 5 6 6 + (Lc ndash 1) 6 + Lc
Donneacutees CLA INS P1 P2 Lc Donneacutees (si Lc gt 0) Le
Ougrave
CLA = octet de classe deacutefini pour des types de cartes particuliers (exemples 0xBC pour les cartes vitales 0x0A pour les
cartes SIM 0x00 pour les MastercardVisa)
INS = octet dinstruction
P1 = paramegravetre 1
P2 = paramegravetre 2
Lc = taille des donneacutees (0x00 si pas de donneacutees)
Le = taille maximale des donneacutees pour la reacuteponse
La carte reacutepond en envoyant les donneacutees de reacuteponse (si il y a) suivies dun status word codeacute sur 2 octets (nommeacutes SW1 et SW2)
Geacuteneacuteralement SW1 indique le type de reacuteponse et SW2 fournit des informations suppleacutementaires
Quelques exemples de status word
SW1
SW2
Signification
0x90 0x00 Pas derreur
0x61 xx Pas de problegraveme
0x62 ou 0x63 xx Avertissement
0x64 ou 0x64 xx Erreur dexeacutecution
0x67 xx Commande incorrecte
Identification des applets
Les applets sont identifieacutees par un AID (Applet ID) composeacute de 16 octets Les 5 premiers correspondent agrave lID du fournisseur
dapplication et les 11 suivants identifient lapplication
Afin de pouvoir communiquer avec elle une applet doit ecirctre preacutealablement seacutelectionneacutee agrave laide de lAPDU SELECT
CLA INS P1 P2 Lc Donneacutees
0x00 0xA4 0x04 0x00 0x10 AID sur 16 octets
Limitations de la machine virtuelle Javacard 2x
Le framework Javacard 2x est un sous-ensemble du langage Java Il ne supporte que les eacuteleacutements suivants
types primitifs boolean byte et short
les tableaux agrave une dimension
les packages classes interfaces exceptions
lheacuteritage les objets virtuels la surcharge
la creacuteation dobjets (new) mais uniquement dans son constructeursa meacutethode dinstallation (donc pas de creacuteation dobjets en
runtime)
Ainsi les types long double float char lobjet String et les tableaux agrave plusieurs dimensions ne sont pas autoriseacutes
Environnement de deacuteveloppement utiliseacute dans ce TP
Afin de pouvoir deacutevelopper une applet Javacard et une application cliente nous allons installer lenvironnement de deacuteveloppement
Javacard Les outils utiliseacutes dans ce TP sont
le Java Card Development Kit 222
lenvironnement de deacuteveloppement Eclipse version 32
le plugin dinteacutegration Eclipse-JCDE version 01
Instructions dinstallation
Enseignement
Connexion utilisateur
Vie du groupe SEN
Archives
BCI
Cycle master
Projets mateacuteriels
Les stages
TEL
Cours en ligne
Aide au choix des parcours
Affectations de projets
Guides manuels mementos
Projets Recherche
Site web COMELEC
Site web ENST
Intranet COMELEC
Wiki COMELEC
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
reacutecupeacutereacutee agrave ladresse httpjavasuncomproductsjavacarddev_kithtml)
~ELECINF359$ unzip ~ducenseignementsTP_ELECINF359java_card_kit-2_2_2-linuxzip
Aller alors dans le reacutepertoire java_card_kit-2_2_2 et deacutecompresser larchive java_card_kit-2_2_2-rr-bin-linux-dozip
(supprimez ensuite larchive afin deacuteconomiser de lespace)
~ELECINF359$ cd java_card_kit-2_2_2~ELECINF359javacard_kit-2_2_2$ unzip java_card_kit-2_2_2-rr-bin-linux-dozip~ELECINF359javacard_kit-2_2_2$ rm java_card_kit-2_2_2-rr-bin-linux-dozip
Note les 3 autres archives ZIP ne seront pas utiliseacutees dans ce TP Elles contiennent entre autres la Javadoc du JCDK de Sun
Installation du plugin Eclipse-JCDE
Reacutecupeacuterer larchive suivante eclipse-jcde-01-linuxtgz ICI (version leacutegegraverement modifieacutee pour pouvoir ecirctre utiliseacute
sous Linux loriginal est disponible ici httpsourceforgenetprojectseclipse-jcde) et la placer dans le reacutepertoire de votre
choix (~ELECINF359 par exemple)
Deacutecompresser larchive
~ELECINF359$ tar zxvf eclipse-jcde-01-linuxtgz
Lancer Eclipse
~ELECINF359$ eclipse ndashvm usrbinjava
Aller dans le menu Help Software Updates Manage Configuration
Cliquer sur Add an Extension Location
Seacutelectionner le reacutepertoire eclipse contenant le plugin (~ELECINF359eclipse dans notre cas)
Cliquer sur Yes pour redeacutemarrer Eclipse
Aller dans le menu Java Card Preferences
Renseigner le champ Java Card Home (~ELECINF359java_card_kit-2_2_2 dans notre cas) puis cliquer sur OK
Agrave ce stade nous disposons dun environnement de deacuteveloppement permettant de creacuteer des applet Javacard de les simuler et creacuteer
des applications clientes
Codage dune applet Javacard
Creacuteation de lapplet sous Eclipse
Nous allons creacuteer dans ce tutoriel une applet basique Pour cela lancer Eclipse dans le menu File faire New puis Other et
seacutelectionner Java Card Project
Cliquer alors sur le bouton Next Donner alors un nom au projet Nous lappellerons Tutoriel Javacard
A ce stade nous venons de creacuteer notre projet Nous allons maintenant creacuteer notre applet Javacard Pour cela aller dans le menu
File faire New puis Other Seacutelectionner alors Java Card Applet puis cliquer sur le bouton Next Donner alors un nom au package
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
package monpackage
import javacardframeworkAPDUimport javacardframeworkAppletimport javacardframeworkISO7816import javacardframeworkISOException
public class MonApplet extends Applet
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
default ISOExceptionthrowIt(ISO7816SW_INS_NOT_SUPPORTED)
Quelques explications
la meacutethode getBuffer() de la classe APDU permet de reacutecupeacuterer lAPDU sous forme dun tableau doctets
la meacutethode selectingApplet() permet de preacuteciser si lAPDU est en cours de seacutelection
linterface ISO7816 contient les constantes usuelles des APDU
la meacutethode ISOExceptionthrowIt permet de retourner le status word passeacute en paramegravetre
se reacutefeacuterer agrave lAPI pour plus dexplications
Note si aucune exception na eacuteteacute leveacutee le status word 0x9000 est retourneacute automatiquement agrave la fin de la meacutethode process
Outils de simulation
Avant de commencer les simulations faire un clic droit sur le package monpackage seacutelectionner Java Card Tools puis Generate
Script Ceci a pour conseacutequence de geacuteneacuterer automatiquement les APDU neacutecessaires agrave lupload linstanciation (installation) et la
seacutelection de lapplet sur une Javacard monpackagejavacard contient alors 3 scripts
cap-downloadscript upload de lapplet
create-MonAppletscript instanciation (installation) de lapplet
select-MonAppletscript seacutelection de lapplet
Initialisation des variables denvironnement
Afin de pouvoir utiliser les outils du JCDK il faut deacutefinir quelques variables denvironnement agrave savoir
JAVA_HOME le chemin daccegraves au Java Development Kit
JC_HOME le chemin daccegraves au Java Card Development Kit
~ELECINF359$ export JAVA_HOME=usr~ELECINF359$ export JC_HOME=studuserspromoXXYYYELECINF359java_card_kit-2_2_2
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
powerdown)
powerup Select the installer applet0x00 0xA4 0x04 0x00 0x09 0xa0 0x00 0x00 0x00 0x62 0x03 0x01 0x08 0x01 0x7F create MonApplet applet0x80 0xB8 0x00 0x00 0xd 0xb 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x00 0x00 0x00 0x7FReceived ATR = 0x3b 0xf0 0x11 0x00 0xff 0x00CLA 00 INS a4 P1 04 P2 00 Lc 09 a0 00 00 00 62 03 01 08 01 Le 00 SW1 90 SW2 00CLA 80 INS b8 P1 00 P2 00 Lc 0d 0b 01 02 03 04 05 06 07 08 09 00 00 00 Le 0b 01 02 03 04 05 06 07 08 09 00 00 SW1 90 SW2 00
Nous voyons que la carte reacutepond positivement avec un status word 0x9000
Nous pouvons alors seacutelectionner notre applet en recopiant lAPDU contenu dans select-MonAppletscript
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 00
De nouveau la carte reacutepond positivement avec un status word 0x9000 Notre applet est deacutesormais seacutelectionneacutee et nous pouvons
la tester Commenccedilons par interroger le compteur (INS = 0x02) en envoyant lAPDU suivante
0xB0 0x02 0x00 0x00 0x00 0x7FCLA b0 INS 02 P1 00 P2 00 Lc 00 Le 01 00 SW1 90 SW2 00
Nous pouvons voir que le compteur est pour linstant agrave 0 Nous allons lincreacutementer (INS = 0x00)
0xB0 0x00 0x00 0x00 0x00 0x7FCLA b0 INS 00 P1 00 P2 00 Lc 00 Le 00 SW1 90 SW2 00
Interrogeons de nouveau le compteur
0xB0 0x02 0x00 0x00 0x00 0x7FCLA b0 INS 02 P1 00 P2 00 Lc 00 Le 01 01 SW1 90 SW2 00
Il est deacutesormais agrave 1 Initialisons maintenant (INS = 0x03) le compteur agrave 0x4A
0xB0 0x03 0x00 0x00 0x01 0x4A 0x7FCLA b0 INS 03 P1 00 P2 00 Lc 01 4a Le 00 SW1 90 SW2 00
Deacutecreacutementons le compteur (INS = 0x01) et regardons le reacutesultat
0xB0 0x01 0x00 0x00 0x00 0x7FCLA b0 INS 01 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 49 SW1 90 SW2 00
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
powerdown)
~ELECINF359$ cref ndashi monappleteeprom ndasho monappleteepromJava Card 222 C Reference Implementation Simulator (version 041)
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()
apdu = new Apdu() apducommand[ApduCLA] = MaclasseCLA_MONAPPLET apducommand[ApduP1] = 0x00 apducommand[ApduP2] = 0x00 apdusetLe(0x7f)
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
monpackageMonApplet 0x010x020x030x040x050x060x070x080x090x000x00
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
reacutecupeacutereacutee agrave ladresse httpjavasuncomproductsjavacarddev_kithtml)
~ELECINF359$ unzip ~ducenseignementsTP_ELECINF359java_card_kit-2_2_2-linuxzip
Aller alors dans le reacutepertoire java_card_kit-2_2_2 et deacutecompresser larchive java_card_kit-2_2_2-rr-bin-linux-dozip
(supprimez ensuite larchive afin deacuteconomiser de lespace)
~ELECINF359$ cd java_card_kit-2_2_2~ELECINF359javacard_kit-2_2_2$ unzip java_card_kit-2_2_2-rr-bin-linux-dozip~ELECINF359javacard_kit-2_2_2$ rm java_card_kit-2_2_2-rr-bin-linux-dozip
Note les 3 autres archives ZIP ne seront pas utiliseacutees dans ce TP Elles contiennent entre autres la Javadoc du JCDK de Sun
Installation du plugin Eclipse-JCDE
Reacutecupeacuterer larchive suivante eclipse-jcde-01-linuxtgz ICI (version leacutegegraverement modifieacutee pour pouvoir ecirctre utiliseacute
sous Linux loriginal est disponible ici httpsourceforgenetprojectseclipse-jcde) et la placer dans le reacutepertoire de votre
choix (~ELECINF359 par exemple)
Deacutecompresser larchive
~ELECINF359$ tar zxvf eclipse-jcde-01-linuxtgz
Lancer Eclipse
~ELECINF359$ eclipse ndashvm usrbinjava
Aller dans le menu Help Software Updates Manage Configuration
Cliquer sur Add an Extension Location
Seacutelectionner le reacutepertoire eclipse contenant le plugin (~ELECINF359eclipse dans notre cas)
Cliquer sur Yes pour redeacutemarrer Eclipse
Aller dans le menu Java Card Preferences
Renseigner le champ Java Card Home (~ELECINF359java_card_kit-2_2_2 dans notre cas) puis cliquer sur OK
Agrave ce stade nous disposons dun environnement de deacuteveloppement permettant de creacuteer des applet Javacard de les simuler et creacuteer
des applications clientes
Codage dune applet Javacard
Creacuteation de lapplet sous Eclipse
Nous allons creacuteer dans ce tutoriel une applet basique Pour cela lancer Eclipse dans le menu File faire New puis Other et
seacutelectionner Java Card Project
Cliquer alors sur le bouton Next Donner alors un nom au projet Nous lappellerons Tutoriel Javacard
A ce stade nous venons de creacuteer notre projet Nous allons maintenant creacuteer notre applet Javacard Pour cela aller dans le menu
File faire New puis Other Seacutelectionner alors Java Card Applet puis cliquer sur le bouton Next Donner alors un nom au package
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
package monpackage
import javacardframeworkAPDUimport javacardframeworkAppletimport javacardframeworkISO7816import javacardframeworkISOException
public class MonApplet extends Applet
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
default ISOExceptionthrowIt(ISO7816SW_INS_NOT_SUPPORTED)
Quelques explications
la meacutethode getBuffer() de la classe APDU permet de reacutecupeacuterer lAPDU sous forme dun tableau doctets
la meacutethode selectingApplet() permet de preacuteciser si lAPDU est en cours de seacutelection
linterface ISO7816 contient les constantes usuelles des APDU
la meacutethode ISOExceptionthrowIt permet de retourner le status word passeacute en paramegravetre
se reacutefeacuterer agrave lAPI pour plus dexplications
Note si aucune exception na eacuteteacute leveacutee le status word 0x9000 est retourneacute automatiquement agrave la fin de la meacutethode process
Outils de simulation
Avant de commencer les simulations faire un clic droit sur le package monpackage seacutelectionner Java Card Tools puis Generate
Script Ceci a pour conseacutequence de geacuteneacuterer automatiquement les APDU neacutecessaires agrave lupload linstanciation (installation) et la
seacutelection de lapplet sur une Javacard monpackagejavacard contient alors 3 scripts
cap-downloadscript upload de lapplet
create-MonAppletscript instanciation (installation) de lapplet
select-MonAppletscript seacutelection de lapplet
Initialisation des variables denvironnement
Afin de pouvoir utiliser les outils du JCDK il faut deacutefinir quelques variables denvironnement agrave savoir
JAVA_HOME le chemin daccegraves au Java Development Kit
JC_HOME le chemin daccegraves au Java Card Development Kit
~ELECINF359$ export JAVA_HOME=usr~ELECINF359$ export JC_HOME=studuserspromoXXYYYELECINF359java_card_kit-2_2_2
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
powerdown)
powerup Select the installer applet0x00 0xA4 0x04 0x00 0x09 0xa0 0x00 0x00 0x00 0x62 0x03 0x01 0x08 0x01 0x7F create MonApplet applet0x80 0xB8 0x00 0x00 0xd 0xb 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x00 0x00 0x00 0x7FReceived ATR = 0x3b 0xf0 0x11 0x00 0xff 0x00CLA 00 INS a4 P1 04 P2 00 Lc 09 a0 00 00 00 62 03 01 08 01 Le 00 SW1 90 SW2 00CLA 80 INS b8 P1 00 P2 00 Lc 0d 0b 01 02 03 04 05 06 07 08 09 00 00 00 Le 0b 01 02 03 04 05 06 07 08 09 00 00 SW1 90 SW2 00
Nous voyons que la carte reacutepond positivement avec un status word 0x9000
Nous pouvons alors seacutelectionner notre applet en recopiant lAPDU contenu dans select-MonAppletscript
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 00
De nouveau la carte reacutepond positivement avec un status word 0x9000 Notre applet est deacutesormais seacutelectionneacutee et nous pouvons
la tester Commenccedilons par interroger le compteur (INS = 0x02) en envoyant lAPDU suivante
0xB0 0x02 0x00 0x00 0x00 0x7FCLA b0 INS 02 P1 00 P2 00 Lc 00 Le 01 00 SW1 90 SW2 00
Nous pouvons voir que le compteur est pour linstant agrave 0 Nous allons lincreacutementer (INS = 0x00)
0xB0 0x00 0x00 0x00 0x00 0x7FCLA b0 INS 00 P1 00 P2 00 Lc 00 Le 00 SW1 90 SW2 00
Interrogeons de nouveau le compteur
0xB0 0x02 0x00 0x00 0x00 0x7FCLA b0 INS 02 P1 00 P2 00 Lc 00 Le 01 01 SW1 90 SW2 00
Il est deacutesormais agrave 1 Initialisons maintenant (INS = 0x03) le compteur agrave 0x4A
0xB0 0x03 0x00 0x00 0x01 0x4A 0x7FCLA b0 INS 03 P1 00 P2 00 Lc 01 4a Le 00 SW1 90 SW2 00
Deacutecreacutementons le compteur (INS = 0x01) et regardons le reacutesultat
0xB0 0x01 0x00 0x00 0x00 0x7FCLA b0 INS 01 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 49 SW1 90 SW2 00
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
powerdown)
~ELECINF359$ cref ndashi monappleteeprom ndasho monappleteepromJava Card 222 C Reference Implementation Simulator (version 041)
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()
apdu = new Apdu() apducommand[ApduCLA] = MaclasseCLA_MONAPPLET apducommand[ApduP1] = 0x00 apducommand[ApduP2] = 0x00 apdusetLe(0x7f)
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
monpackageMonApplet 0x010x020x030x040x050x060x070x080x090x000x00
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
package monpackage
import javacardframeworkAPDUimport javacardframeworkAppletimport javacardframeworkISO7816import javacardframeworkISOException
public class MonApplet extends Applet
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
default ISOExceptionthrowIt(ISO7816SW_INS_NOT_SUPPORTED)
Quelques explications
la meacutethode getBuffer() de la classe APDU permet de reacutecupeacuterer lAPDU sous forme dun tableau doctets
la meacutethode selectingApplet() permet de preacuteciser si lAPDU est en cours de seacutelection
linterface ISO7816 contient les constantes usuelles des APDU
la meacutethode ISOExceptionthrowIt permet de retourner le status word passeacute en paramegravetre
se reacutefeacuterer agrave lAPI pour plus dexplications
Note si aucune exception na eacuteteacute leveacutee le status word 0x9000 est retourneacute automatiquement agrave la fin de la meacutethode process
Outils de simulation
Avant de commencer les simulations faire un clic droit sur le package monpackage seacutelectionner Java Card Tools puis Generate
Script Ceci a pour conseacutequence de geacuteneacuterer automatiquement les APDU neacutecessaires agrave lupload linstanciation (installation) et la
seacutelection de lapplet sur une Javacard monpackagejavacard contient alors 3 scripts
cap-downloadscript upload de lapplet
create-MonAppletscript instanciation (installation) de lapplet
select-MonAppletscript seacutelection de lapplet
Initialisation des variables denvironnement
Afin de pouvoir utiliser les outils du JCDK il faut deacutefinir quelques variables denvironnement agrave savoir
JAVA_HOME le chemin daccegraves au Java Development Kit
JC_HOME le chemin daccegraves au Java Card Development Kit
~ELECINF359$ export JAVA_HOME=usr~ELECINF359$ export JC_HOME=studuserspromoXXYYYELECINF359java_card_kit-2_2_2
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
powerdown)
powerup Select the installer applet0x00 0xA4 0x04 0x00 0x09 0xa0 0x00 0x00 0x00 0x62 0x03 0x01 0x08 0x01 0x7F create MonApplet applet0x80 0xB8 0x00 0x00 0xd 0xb 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x00 0x00 0x00 0x7FReceived ATR = 0x3b 0xf0 0x11 0x00 0xff 0x00CLA 00 INS a4 P1 04 P2 00 Lc 09 a0 00 00 00 62 03 01 08 01 Le 00 SW1 90 SW2 00CLA 80 INS b8 P1 00 P2 00 Lc 0d 0b 01 02 03 04 05 06 07 08 09 00 00 00 Le 0b 01 02 03 04 05 06 07 08 09 00 00 SW1 90 SW2 00
Nous voyons que la carte reacutepond positivement avec un status word 0x9000
Nous pouvons alors seacutelectionner notre applet en recopiant lAPDU contenu dans select-MonAppletscript
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 00
De nouveau la carte reacutepond positivement avec un status word 0x9000 Notre applet est deacutesormais seacutelectionneacutee et nous pouvons
la tester Commenccedilons par interroger le compteur (INS = 0x02) en envoyant lAPDU suivante
0xB0 0x02 0x00 0x00 0x00 0x7FCLA b0 INS 02 P1 00 P2 00 Lc 00 Le 01 00 SW1 90 SW2 00
Nous pouvons voir que le compteur est pour linstant agrave 0 Nous allons lincreacutementer (INS = 0x00)
0xB0 0x00 0x00 0x00 0x00 0x7FCLA b0 INS 00 P1 00 P2 00 Lc 00 Le 00 SW1 90 SW2 00
Interrogeons de nouveau le compteur
0xB0 0x02 0x00 0x00 0x00 0x7FCLA b0 INS 02 P1 00 P2 00 Lc 00 Le 01 01 SW1 90 SW2 00
Il est deacutesormais agrave 1 Initialisons maintenant (INS = 0x03) le compteur agrave 0x4A
0xB0 0x03 0x00 0x00 0x01 0x4A 0x7FCLA b0 INS 03 P1 00 P2 00 Lc 01 4a Le 00 SW1 90 SW2 00
Deacutecreacutementons le compteur (INS = 0x01) et regardons le reacutesultat
0xB0 0x01 0x00 0x00 0x00 0x7FCLA b0 INS 01 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 49 SW1 90 SW2 00
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
powerdown)
~ELECINF359$ cref ndashi monappleteeprom ndasho monappleteepromJava Card 222 C Reference Implementation Simulator (version 041)
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()
apdu = new Apdu() apducommand[ApduCLA] = MaclasseCLA_MONAPPLET apducommand[ApduP1] = 0x00 apducommand[ApduP2] = 0x00 apdusetLe(0x7f)
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
monpackageMonApplet 0x010x020x030x040x050x060x070x080x090x000x00
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
default ISOExceptionthrowIt(ISO7816SW_INS_NOT_SUPPORTED)
Quelques explications
la meacutethode getBuffer() de la classe APDU permet de reacutecupeacuterer lAPDU sous forme dun tableau doctets
la meacutethode selectingApplet() permet de preacuteciser si lAPDU est en cours de seacutelection
linterface ISO7816 contient les constantes usuelles des APDU
la meacutethode ISOExceptionthrowIt permet de retourner le status word passeacute en paramegravetre
se reacutefeacuterer agrave lAPI pour plus dexplications
Note si aucune exception na eacuteteacute leveacutee le status word 0x9000 est retourneacute automatiquement agrave la fin de la meacutethode process
Outils de simulation
Avant de commencer les simulations faire un clic droit sur le package monpackage seacutelectionner Java Card Tools puis Generate
Script Ceci a pour conseacutequence de geacuteneacuterer automatiquement les APDU neacutecessaires agrave lupload linstanciation (installation) et la
seacutelection de lapplet sur une Javacard monpackagejavacard contient alors 3 scripts
cap-downloadscript upload de lapplet
create-MonAppletscript instanciation (installation) de lapplet
select-MonAppletscript seacutelection de lapplet
Initialisation des variables denvironnement
Afin de pouvoir utiliser les outils du JCDK il faut deacutefinir quelques variables denvironnement agrave savoir
JAVA_HOME le chemin daccegraves au Java Development Kit
JC_HOME le chemin daccegraves au Java Card Development Kit
~ELECINF359$ export JAVA_HOME=usr~ELECINF359$ export JC_HOME=studuserspromoXXYYYELECINF359java_card_kit-2_2_2
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
powerdown)
powerup Select the installer applet0x00 0xA4 0x04 0x00 0x09 0xa0 0x00 0x00 0x00 0x62 0x03 0x01 0x08 0x01 0x7F create MonApplet applet0x80 0xB8 0x00 0x00 0xd 0xb 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x00 0x00 0x00 0x7FReceived ATR = 0x3b 0xf0 0x11 0x00 0xff 0x00CLA 00 INS a4 P1 04 P2 00 Lc 09 a0 00 00 00 62 03 01 08 01 Le 00 SW1 90 SW2 00CLA 80 INS b8 P1 00 P2 00 Lc 0d 0b 01 02 03 04 05 06 07 08 09 00 00 00 Le 0b 01 02 03 04 05 06 07 08 09 00 00 SW1 90 SW2 00
Nous voyons que la carte reacutepond positivement avec un status word 0x9000
Nous pouvons alors seacutelectionner notre applet en recopiant lAPDU contenu dans select-MonAppletscript
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 00
De nouveau la carte reacutepond positivement avec un status word 0x9000 Notre applet est deacutesormais seacutelectionneacutee et nous pouvons
la tester Commenccedilons par interroger le compteur (INS = 0x02) en envoyant lAPDU suivante
0xB0 0x02 0x00 0x00 0x00 0x7FCLA b0 INS 02 P1 00 P2 00 Lc 00 Le 01 00 SW1 90 SW2 00
Nous pouvons voir que le compteur est pour linstant agrave 0 Nous allons lincreacutementer (INS = 0x00)
0xB0 0x00 0x00 0x00 0x00 0x7FCLA b0 INS 00 P1 00 P2 00 Lc 00 Le 00 SW1 90 SW2 00
Interrogeons de nouveau le compteur
0xB0 0x02 0x00 0x00 0x00 0x7FCLA b0 INS 02 P1 00 P2 00 Lc 00 Le 01 01 SW1 90 SW2 00
Il est deacutesormais agrave 1 Initialisons maintenant (INS = 0x03) le compteur agrave 0x4A
0xB0 0x03 0x00 0x00 0x01 0x4A 0x7FCLA b0 INS 03 P1 00 P2 00 Lc 01 4a Le 00 SW1 90 SW2 00
Deacutecreacutementons le compteur (INS = 0x01) et regardons le reacutesultat
0xB0 0x01 0x00 0x00 0x00 0x7FCLA b0 INS 01 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 49 SW1 90 SW2 00
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
powerdown)
~ELECINF359$ cref ndashi monappleteeprom ndasho monappleteepromJava Card 222 C Reference Implementation Simulator (version 041)
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()
apdu = new Apdu() apducommand[ApduCLA] = MaclasseCLA_MONAPPLET apducommand[ApduP1] = 0x00 apducommand[ApduP2] = 0x00 apdusetLe(0x7f)
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
monpackageMonApplet 0x010x020x030x040x050x060x070x080x090x000x00
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
powerdown)
powerup Select the installer applet0x00 0xA4 0x04 0x00 0x09 0xa0 0x00 0x00 0x00 0x62 0x03 0x01 0x08 0x01 0x7F create MonApplet applet0x80 0xB8 0x00 0x00 0xd 0xb 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x00 0x00 0x00 0x7FReceived ATR = 0x3b 0xf0 0x11 0x00 0xff 0x00CLA 00 INS a4 P1 04 P2 00 Lc 09 a0 00 00 00 62 03 01 08 01 Le 00 SW1 90 SW2 00CLA 80 INS b8 P1 00 P2 00 Lc 0d 0b 01 02 03 04 05 06 07 08 09 00 00 00 Le 0b 01 02 03 04 05 06 07 08 09 00 00 SW1 90 SW2 00
Nous voyons que la carte reacutepond positivement avec un status word 0x9000
Nous pouvons alors seacutelectionner notre applet en recopiant lAPDU contenu dans select-MonAppletscript
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 00
De nouveau la carte reacutepond positivement avec un status word 0x9000 Notre applet est deacutesormais seacutelectionneacutee et nous pouvons
la tester Commenccedilons par interroger le compteur (INS = 0x02) en envoyant lAPDU suivante
0xB0 0x02 0x00 0x00 0x00 0x7FCLA b0 INS 02 P1 00 P2 00 Lc 00 Le 01 00 SW1 90 SW2 00
Nous pouvons voir que le compteur est pour linstant agrave 0 Nous allons lincreacutementer (INS = 0x00)
0xB0 0x00 0x00 0x00 0x00 0x7FCLA b0 INS 00 P1 00 P2 00 Lc 00 Le 00 SW1 90 SW2 00
Interrogeons de nouveau le compteur
0xB0 0x02 0x00 0x00 0x00 0x7FCLA b0 INS 02 P1 00 P2 00 Lc 00 Le 01 01 SW1 90 SW2 00
Il est deacutesormais agrave 1 Initialisons maintenant (INS = 0x03) le compteur agrave 0x4A
0xB0 0x03 0x00 0x00 0x01 0x4A 0x7FCLA b0 INS 03 P1 00 P2 00 Lc 01 4a Le 00 SW1 90 SW2 00
Deacutecreacutementons le compteur (INS = 0x01) et regardons le reacutesultat
0xB0 0x01 0x00 0x00 0x00 0x7FCLA b0 INS 01 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 49 SW1 90 SW2 00
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
powerdown)
~ELECINF359$ cref ndashi monappleteeprom ndasho monappleteepromJava Card 222 C Reference Implementation Simulator (version 041)
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()
apdu = new Apdu() apducommand[ApduCLA] = MaclasseCLA_MONAPPLET apducommand[ApduP1] = 0x00 apducommand[ApduP2] = 0x00 apdusetLe(0x7f)
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
monpackageMonApplet 0x010x020x030x040x050x060x070x080x090x000x00
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
powerdown)
~ELECINF359$ cref ndashi monappleteeprom ndasho monappleteepromJava Card 222 C Reference Implementation Simulator (version 041)
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()
apdu = new Apdu() apducommand[ApduCLA] = MaclasseCLA_MONAPPLET apducommand[ApduP1] = 0x00 apducommand[ApduP2] = 0x00 apdusetLe(0x7f)
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
monpackageMonApplet 0x010x020x030x040x050x060x070x080x090x000x00
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()
apdu = new Apdu() apducommand[ApduCLA] = MaclasseCLA_MONAPPLET apducommand[ApduP1] = 0x00 apducommand[ApduP2] = 0x00 apdusetLe(0x7f)
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
monpackageMonApplet 0x010x020x030x040x050x060x070x080x090x000x00
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()
apdu = new Apdu() apducommand[ApduCLA] = MaclasseCLA_MONAPPLET apducommand[ApduP1] = 0x00 apducommand[ApduP2] = 0x00 apdusetLe(0x7f)
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
monpackageMonApplet 0x010x020x030x040x050x060x070x080x090x000x00
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()
apdu = new Apdu() apducommand[ApduCLA] = MaclasseCLA_MONAPPLET apducommand[ApduP1] = 0x00 apducommand[ApduP2] = 0x00 apdusetLe(0x7f)
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
monpackageMonApplet 0x010x020x030x040x050x060x070x080x090x000x00
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()
apdu = new Apdu() apducommand[ApduCLA] = MaclasseCLA_MONAPPLET apducommand[ApduP1] = 0x00 apducommand[ApduP2] = 0x00 apdusetLe(0x7f)
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
monpackageMonApplet 0x010x020x030x040x050x060x070x080x090x000x00
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
monpackageMonApplet 0x010x020x030x040x050x060x070x080x090x000x00
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
passe
FilenameTitle Taille
Maclassejava 412 Ko
eclipse-jcde-01-linuxtgz 13554 Ko