Вы находитесь на странице: 1из 12

29/03/13

TP Java Card 1/2 : Utilisation du Javacard Development Kit 2.2.2 de Sun | Groupe SEN
Sys tmes lec troniques N umriques

Groupe SEN

Vie du groupe SEN A rchives

BCI Cycle master Projets matriels Les stages TEL

Cours en ligne A ide au choix des parcours A ffectations de projets Guides, manuels, mementos

Projets Recherche Site web COMELEC Site web ENST Intranet COMELEC Wiki COMELEC

Enseignement
BCI Cycle master C SMLP ELEC 222 ELEC 223 ELEC 342 - SO C ELEC 390 ELEC INF344 / ELEC INF381 ELEC INF359 Etude s biblio 2010-2011 Etude s biblio 2011-2012 Mini-proje ts 2008-2009 Mini-proje ts 2009-2010 TD SC A TP Javacard 1/2 TP Javacard 2/2 ELEC 920 / NSS04 Projets matriels Les stages TEL

Accue il :: Ense igne m e nt :: C ycle m aste r :: ELEC INF359

TP Java Card 1/2 : Utilisation du Javacard Development Kit 2.2.2 de Sun

Objectif du TP
C e TP a pour but de vous initier la programmation de cartes Java (Javacard) l'aide d'un environnement de dveloppement gratuit vous permettant de dvelopper des applets (appeles parfois cardlets car elles s'excutent sur la carte puce), dvelopper des applications clientes pour communiquer avec les cartes et de les tester l'aide d'un simulateur de carte. C e sujet est inspir du tutoriel "Introduction la programmation de Javacard sous Windows" crit par un ancien lve de l'cole et publi sur le site developpez.com (http://julienb.developpez.com/tutoriels/java/introjavacard/).

Quelques rappels
Les APDU
Les changes entre carte et terminal se font au moyen d'APDUs (suite d'octets respectant nu format dfini dans le standard ISO7816-4). Nous utiliserons dans ce TP l'APDU de requte suivante :

C onnexion utilisateur
Nom d'utilisate ur :

Offset

6 ... 6 + (Lc 1)

6 + Lc

Mot de passe :

Donnes C LA INS P1 P2 Lc Donnes (si Lc > 0) Le O :

Se connecter

C LA = octet de classe dfini pour des types de cartes particuliers (exemples : 0xBC pour les cartes vitales, 0x0A pour les cartes SIM, 0x00 pour les Mastercard/Visa) INS = octet d'instruction P1 = paramtre 1 P2 = paramtre 2 Lc = taille des donnes (0x00 si pas de donnes) Le = taille maximale des donnes pour la rponse La carte rpond en envoyant les donnes de rponse (si il y a) suivies d'un status word cod sur 2 octets (nomms SW1 et SW2). Gnralement, SW1 indique le type de rponse et SW2 fournit des informations supplmentaires. Quelques exemples de status word : SW1 SW2 Signification 0x90 0x61 0x00 Pas d'erreur xx Pas de problme Avertissement Erreur d'excution C ommande incorrecte

0x62 ou 0x63 xx 0x64 ou 0x64 xx 0x67 xx

Identification des applets


Les applets sont identifies par un AID (Applet ID) compos de 16 octets. Les 5 premiers correspondent l'ID du fournisseur d'application et les 11 suivants identifient l'application. Afin de pouvoir communiquer avec elle, une applet doit tre pralablement slectionne l'aide de l'APDU SELEC T : C LA INS P1 P2 Lc Donnes

0x00 0xA4 0x04 0x00 0x10 AID sur 16 octets

Limitations de la machine virtuelle Javacard 2.x


Le framework Javacard 2.x est un sous-ensemble du langage Java. Il ne supporte que les lments suivants : types primitifs boolean, byte et short les tableaux une dimension les packages, classes, interfaces, exceptions l'hritage, les objets virtuels, la surcharge la cration d'objets (new) mais uniquement dans son constructeur/sa mthode d'installation (donc pas de cration d'objets en runtime) Ainsi les types long, double, float, char, l'objet String et les tableaux plusieurs dimensions ne sont pas autoriss.

Environnement de dveloppement utilis dans ce TP


Afin de pouvoir dvelopper une applet Javacard et une application cliente, nous allons installer l'environnement de dveloppement Javacard. Les outils utiliss dans ce TP sont : le Java C ard Development Kit 2.2.2 l'environnement de dveloppement Eclipse version 3.2 le plugin d'intgration Eclipse-JC DE version 0.1

Instructions d'installation

sen.enst.fr/node/408

1/12

29/03/13

TP Java Card 1/2 : Utilisation du Javacard Development Kit 2.2.2 de Sun | Groupe SEN
Installation du Java Card Development Kit 2.2.2
Dzipper l'archive dans le rpertoire de votre choix (~ / E L E C I N F 3 5 9par exemple) (pour information, l'archive a t&eacute rcupre l'adresse http://java.sun.com/products/javacard/dev_kit.html)

~ / E L E C I N F 3 5 9 $u n z i p~ d u c / e n s e i g n e m e n t s / T P _ E L E C I N F 3 5 9 / j a v a _ c a r d _ k i t 2 _ 2 _ 2 l i n u x . z i p
Aller alors dans le rpertoire j a v a _ c a r d _ k i t 2 _ 2 _ 2et dcompresser l'archive java_card_kit-2_2_2-rr-bin-linux-do.zip (supprimez ensuite l'archive afin d'conomiser de l'espace) :

~ / E L E C I N F 3 5 9 $c dj a v a _ c a r d _ k i t 2 _ 2 _ 2 ~ / E L E C I N F 3 5 9 / j a v a c a r d _ k i t 2 _ 2 _ 2 $u n z i pj a v a _ c a r d _ k i t 2 _ 2 _ 2 r r b i n l i n u x d o . z i p ~ / E L E C I N F 3 5 9 / j a v a c a r d _ k i t 2 _ 2 _ 2 $r mj a v a _ c a r d _ k i t 2 _ 2 _ 2 r r b i n l i n u x d o . z i p
Note : les 3 autres archives ZIP ne seront pas utilises dans ce TP. Elles contiennent, entre autres, la Javadoc du JC DK de Sun.

Installation du plugin Eclipse-JCDE


Rcuprer l'archive suivante : e c l i p s e j c d e 0 . 1 l i n u x . t g zIC I (version lgrement modifie pour pouvoir tre utilis sous Linux, l'original est disponible ici : http://sourceforge.net/projects/eclipse-jcde/) et la placer dans le rpertoire de votre choix (~ / E L E C I N F 3 5 9par exemple) Dcompresser l'archive :

~ / E L E C I N F 3 5 9 $t a rz x v fe c l i p s e j c d e 0 . 1 l i n u x . t g z
Lancer Eclipse :

~ / E L E C I N F 3 5 9 $e c l i p s e v m/ u s r / b i n / j a v a
Aller dans le menu "Help" / "Software Updates" / "Manage Configuration" C liquer sur "Add an Extension Location" Slectionner le rpertoire eclipse contenant le plugin (~ / E L E C I N F 3 5 9 / e c l i p s edans notre cas) C liquer sur "Yes" pour redmarrer Eclipse Aller dans le menu "Java Card" / "Preferences" Renseigner le champ "Java Card Home " (~ / E L E C I N F 3 5 9 / j a v a _ c a r d _ k i t 2 _ 2 _ 2dans notre cas) puis cliquer sur "OK" ce stade, nous disposons d'un environnement de dveloppement permettant de crer des applet Javacard, de les simuler et crer des applications clientes.

Codage d'une applet Javacard


Cration de l'applet sous Eclipse
Nous allons crer dans ce tutoriel une applet basique. Pour cela, lancer Eclipse, dans le menu File , faire New puis Other et slectionner Java Card Project :

C liquer alors sur le bouton Next. Donner alors un nom au projet. Nous l'appellerons "Tutoriel Javacard" :

A ce stade, nous venons de crer notre projet. Nous allons maintenant crer notre applet Javacard. Pour cela, aller dans le menu File , faire New puis Other... Slectionner alors "Java Card Applet" puis cliquer sur le bouton Next. Donner alors un nom au package

sen.enst.fr/node/408

2/12

29/03/13

TP Java Card 1/2 : Utilisation du Javacard Development Kit 2.2.2 de Sun | Groupe SEN
ainsi qu' l'applet. Nous les appellerons respectivement "monpackage " et "MonApplet" :

C liquer alors sur le bouton Finish. Eclipse vient de gnrer automatiquement le squelette de notre Applet :

C lic droit sur le package monpackage , Java Card Tools, Set Package AID :

Appuyer sur le bouton OK . Le Package AID doit obligatoirement tre un prfixe de l'applet AID.

Les mthodes et objets cls de l'applet


La mthode i n s t a l lest appele lors de l'installation de l'applet dans la carte. Elle instancie notre classe MonApplet et l'enregistre auprs du systme de la carte. L'instanciation d'autres objets (instruction new) est autorise uniquement dans cette mthode (ou dans le constructeur de la classe). La mthode p r o c e s sest la mthode principale de l'applet. Elle sera appele chaque fois que la carte recevra un APDU pour l'applet en question. L'APDU reu sera alors pass en paramtre de cette mthode.

Codage de notre applet


Nous allons crer un compteur dans le cadre de ce tutoriel. L'applet comportera 4 fonctions : incrmenter le compteur dcrmenter le compteur interroger le compteur initialiser le compteur une valeur donne Pour cela, nous allons dfinir des constantes et un attribut compteur de type primitif b y t e:

p a c k a g em o n p a c k a g e ; i m p o r tj a v a c a r d . f r a m e w o r k . A P D U ; i m p o r tj a v a c a r d . f r a m e w o r k . A p p l e t ; i m p o r tj a v a c a r d . f r a m e w o r k . I S O 7 8 1 6 ; i m p o r tj a v a c a r d . f r a m e w o r k . I S O E x c e p t i o n ; p u b l i cc l a s sM o n A p p l e te x t e n d sA p p l e t{

sen.enst.fr/node/408

3/12

29/03/13

TP Java Card 1/2 : Utilisation du Javacard Development Kit 2.2.2 de Sun | Groupe SEN
/ *C o n s t a n t e s* / p u b l i cs t a t i cf i n a lb y t eC L A _ M O N A P P L E T=( b y t e )0 x B 0 ; p u b l i cs t a t i cf i n a lb y t eI N S _ I N C R E M E N T E R _ C O M P T E U R=0 x 0 0 ; p u b l i cs t a t i cf i n a lb y t eI N S _ D E C R E M E N T E R _ C O M P T E U R=0 x 0 1 ; p u b l i cs t a t i cf i n a lb y t eI N S _ I N T E R R O G E R _ C O M P T E U R=0 x 0 2 ; p u b l i cs t a t i cf i n a lb y t eI N S _ I N I T I A L I S E R _ C O M P T E U R=0 x 0 3 ; / *A t t r i b u t s* / p r i v a t eb y t ec o m p t e u r ; / *C o n s t r u c t e u r* / p r i v a t eM o n A p p l e t ( ){ c o m p t e u r=0 ; } p u b l i cs t a t i cv o i di n s t a l l ( b y t eb A r r a y [ ] ,s h o r tb O f f s e t ,b y t eb L e n g t h )t h r o w sI S O E x c e p t i o n{ n e wM o n A p p l e t ( ) . r e g i s t e r ( ) ; } }
Puis nous codons notre mthode p r o c e s s:

p u b l i cv o i dp r o c e s s ( A P D Ua p d u )t h r o w sI S O E x c e p t i o n{ b y t e [ ]b u f f e r=a p d u . g e t B u f f e r ( ) ; i f( t h i s . s e l e c t i n g A p p l e t ( ) )r e t u r n ; i f( b u f f e r [ I S O 7 8 1 6 . O F F S E T _ C L A ]! =C L A _ M O N A P P L E T ){ I S O E x c e p t i o n . t h r o w I t ( I S O 7 8 1 6 . S W _ C L A _ N O T _ S U P P O R T E D ) ; } s w i t c h( b u f f e r [ I S O 7 8 1 6 . O F F S E T _ I N S ] ){ c a s eI N S _ I N C R E M E N T E R _ C O M P T E U R : c o m p t e u r + + ; b r e a k ; c a s eI N S _ D E C R E M E N T E R _ C O M P T E U R : c o m p t e u r ; b r e a k ; c a s eI N S _ I N T E R R O G E R _ C O M P T E U R : b u f f e r [ 0 ]=c o m p t e u r ; a p d u . s e t O u t g o i n g A n d S e n d ( ( s h o r t )0 ,( s h o r t )1 ) ; b r e a k ; c a s eI N S _ I N I T I A L I S E R _ C O M P T E U R : a p d u . s e t I n c o m i n g A n d R e c e i v e ( ) ; c o m p t e u r=b u f f e r [ I S O 7 8 1 6 . O F F S E T _ C D A T A ] ; b r e a k ; d e f a u l t : I S O E x c e p t i o n . t h r o w I t ( I S O 7 8 1 6 . S W _ I N S _ N O T _ S U P P O R T E D ) ; } }


Quelques explications : la mthode g e t B u f f e r ( )de la classe APDU permet de rcuprer l'APDU sous forme d'un tableau d'octets la mthode s e l e c t i n g A p p l e t ( )permet de prciser si l'APDU est en cours de slection l'interface I S O 7 8 1 6contient les constantes usuelles des APDU la mthode I S O E x c e p t i o n . t h r o w I tpermet de retourner le status word pass en paramtre se rfrer l'API pour plus d'explications Note : si aucune exception n'a t leve, le status word 0 x 9 0 0 0est retourn automatiquement la fin de la mthode process.

Outils de simulation
Avant de commencer les simulations, faire un clic droit sur le package monpackage , slectionner Java Card Tools puis Generate Script. C eci a pour consquence de gnrer automatiquement les APDU ncessaires l'upload, l'instanciation (installation) et la slection de l'applet sur une Javacard. m o n p a c k a g e . j a v a c a r dcontient alors 3 scripts : cap-download.script : upload de l'applet create-MonApplet.script : instanciation (installation) de l'applet select-MonApplet.script : slection de l'applet

Initialisation des variables d'environnement


Afin de pouvoir utiliser les outils du JC DK, il faut dfinir quelques variables d'environnement, savoir :

J A V A _ H O M E: le chemin d'accs au Java Development Kit J C _ H O M E: le chemin d'accs au Java C ard Development Kit ~ / E L E C I N F 3 5 9 $e x p o r tJ A V A _ H O M E = / u s r ~ / E L E C I N F 3 5 9 $e x p o r tJ C _ H O M E = / s t u d / u s e r s / p r o m o X X / Y Y Y / E L E C I N F 3 5 9 / j a v a _ c a r d _ k i t 2 _ 2 _ 2
Il faut galement rendre les scripts excutables, et ventuellement ajouter le chemin d'accs dans le P A T Hpour plus de facilit :

~ / E L E C I N F 3 5 9 $c dj a v a _ c a r d _ k i t 2 _ 2 _ 2 / b i n ~ / E L E C I N F 3 5 9 / j a v a _ c a r d _ k i t 2 _ 2 _ 2 / b i n $c h m o da + x* ~ / E L E C I N F 3 5 9 / j a v a _ c a r d _ k i t 2 _ 2 _ 2 / b i n $e x p o r tP A T H = $ P A T H : $ J C _ H O M E / b i n APDUTOOL : envoi/rception d'APDU

sen.enst.fr/node/408

4/12

29/03/13

TP Java Card 1/2 : Utilisation du Javacard Development Kit 2.2.2 de Sun | Groupe SEN
L'outil APDUTOOL du JC DK permet d'changer des APDU avec une Javacard relle ou un simulateur. Nous l'utiliserons dans la suite de ce tutoriel.

JCWDE : simulateur sans conservation d'tat


Le simulateur JC WDE ne ncessite pas de phase d'upload de code. Il nous suffit juste d'installer puis de slectionner notre applet pour pouvoir la faire fonctionner. Dans le menu JCWDE d'Eclipse, slectionner Start.

C liquer sur le bouton OK pour lancer le simulateur JC WDE avec notre applet. Le simulateur est alors lanc et attend une connexion (le simulateur et l'outil apdutool communiquent l'aide d'une socket rseau). Nous pouvons alors lancer l'outil APDUTOOL. Pour cela, ouvrir un terminal dans lequel on aura pris soin de dfinir les variables d'environnement, puis taper a p d u t o o let valider :

~ / E L E C I N F 3 5 9 $a p d u t o o l J a v aC a r d2 . 2 . 2A P D UT o o l ,V e r s i o n1 . 3 C o p y r i g h t2 0 0 5S u nM i c r o s y s t e m s ,I n c .A l lr i g h t sr e s e r v e d .U s ei ss u b j e c tt ol i c e n s et e r m s . O p e n i n gc o n n e c t i o nt ol o c a l h o s to np o r t9 0 2 5 . C o n n e c t e d .
Installons notre applet en recopiant les APDU contenus dans le script c r e a t e M o n A p p l e t . s c r i p t(sauf la dernire instruction p o w e r d o w n ):

p o w e r u p ; / /S e l e c tt h ei n s t a l l e ra p p l e t 0 x 0 00 x A 40 x 0 40 x 0 00 x 0 90 x a 00 x 0 00 x 0 00 x 0 00 x 6 20 x 0 30 x 0 10 x 0 80 x 0 10 x 7 F ; / /c r e a t eM o n A p p l e ta p p l e t 0 x 8 00 x B 80 x 0 00 x 0 00 x d0 x b0 x 0 10 x 0 20 x 0 30 x 0 40 x 0 50 x 0 60 x 0 70 x 0 80 x 0 90 x 0 00 x 0 00 x 0 00 x 7 F ; R e c e i v e dA T R=0 x 3 b0 x f 00 x 1 10 x 0 00 x f f0 x 0 0 C L A :0 0 ,I N S :a 4 ,P 1 :0 4 ,P 2 :0 0 ,L c :0 9 ,a 0 ,0 0 ,0 0 ,0 0 ,6 2 ,0 3 ,0 1 ,0 8 ,0 1 ,L e :0 0 ,S W 1 :9 0 ,S W 2 :0 0 C L A :8 0 ,I N S :b 8 ,P 1 :0 0 ,P 2 :0 0 ,L c :0 d ,0 b ,0 1 ,0 2 ,0 3 ,0 4 ,0 5 ,0 6 ,0 7 ,0 8 ,0 9 ,0 0 ,0 0 ,0 0 ,L e :0 b ,0 1 ,0 2
Nous voyons que la carte rpond "positivement" avec un status word 0 x 9 0 0 0 . Nous pouvons alors slectionner notre applet en recopiant l'APDU contenu dans s e l e c t M o n A p p l e t . s c r i p t:

/ /s e l e c tM o n A p p l e ta p p l e t 0 x 0 00 x A 40 x 0 40 x 0 00 x b0 x 0 10 x 0 20 x 0 30 x 0 40 x 0 50 x 0 60 x 0 70 x 0 80 x 0 90 x 0 00 x 0 00 x 7 F ; C L A :0 0 ,I N S :a 4 ,P 1 :0 4 ,P 2 :0 0 ,L c :0 b ,0 1 ,0 2 ,0 3 ,0 4 ,0 5 ,0 6 ,0 7 ,0 8 ,0 9 ,0 0 ,0 0 ,L e :0 0 ,S W 1 :9 0 ,S W 2 :
De nouveau, la carte rpond "positivement" avec un status word 0 x 9 0 0 0 . Notre applet est dsormais slectionne et nous pouvons la tester. C ommenons par interroger le compteur (I N S=0 x 0 2 ) en envoyant l'APDU suivante :

0 x B 00 x 0 20 x 0 00 x 0 00 x 0 00 x 7 F ; C L A :b 0 ,I N S :0 2 ,P 1 :0 0 ,P 2 :0 0 ,L c :0 0 ,L e :0 1 ,0 0 ,S W 1 :9 0 ,S W 2 :0 0
Nous pouvons voir que le compteur est pour l'instant 0. Nous allons l'incrmenter (I N S=0 x 0 0 ):

0 x B 00 x 0 00 x 0 00 x 0 00 x 0 00 x 7 F ; C L A :b 0 ,I N S :0 0 ,P 1 :0 0 ,P 2 :0 0 ,L c :0 0 ,L e :0 0 ,S W 1 :9 0 ,S W 2 :0 0
Interrogeons de nouveau le compteur :

0 x B 00 x 0 20 x 0 00 x 0 00 x 0 00 x 7 F ; C L A :b 0 ,I N S :0 2 ,P 1 :0 0 ,P 2 :0 0 ,L c :0 0 ,L e :0 1 ,0 1 ,S W 1 :9 0 ,S W 2 :0 0
Il est dsormais 1. Initialisons maintenant (I N S=0 x 0 3 ) le compteur 0 x 4 A:

0 x B 00 x 0 30 x 0 00 x 0 00 x 0 10 x 4 A0 x 7 F ; C L A :b 0 ,I N S :0 3 ,P 1 :0 0 ,P 2 :0 0 ,L c :0 1 ,4 a ,L e :0 0 ,S W 1 :9 0 ,S W 2 :0 0
Dcrmentons le compteur (I N S=0 x 0 1 ) et regardons le rsultat :

0 x B 00 x 0 10 x 0 00 x 0 00 x 0 00 x 7 F ; C L A :b 0 ,I N S :0 1 ,P 1 :0 0 ,P 2 :0 0 ,L c :0 0 ,L e :0 0 ,S W 1 :9 0 ,S W 2 :0 0 0 x B 00 x 0 20 x 0 00 x 0 00 x 0 00 x 7 F ; C L A :b 0 ,I N S :0 2 ,P 1 :0 0 ,P 2 :0 0 ,L c :0 0 ,L e :0 1 ,4 9 ,S W 1 :9 0 ,S W 2 :0 0 0 x 4 A-1=0 x 4 9 . Le rsultat est cohrent. Nous allons nous dconnecter du simulateur en tapant "p o w e r d o w n ; " dans apdutool,

sen.enst.fr/node/408

5/12

29/03/13

TP Java Card 1/2 : Utilisation du Javacard Development Kit 2.2.2 de Sun | Groupe SEN
ce qui provoque la fermeture de JC WDE dans la console d'Eclipse :

p o w e r d o w n ; CREF : simulateur avec conservation d'tat


JC WDE a l'avantage de ne pas ncessiter l'upload de l'applet sur le simulateur, ce qui le rend plus souple d'utilisation par rapport C REF. En revanche ds que JC WDE est stopp ( la reception d'une commande powerdown par exemple), l'tat de la carte n'est pas conserv (la valeur du compteur dans le cas l'applet de ce TP), contrairement ce qui se passe avec une vrai carte (si la carte est retire du lecteur, la valeur du compteur reste conserve dans la mmoire EEPROM de la carte). Les options de ligne de commande que nous allons utiliser :

if i c h i e r _ e e p r o m: initialise l'tat de la carte avec l'image f i c h i e r _ e e p r o m of i c h i e r _ e e p r o m: enregistre l'tat de la carte dans f i c h i e r _ e e p r o m


Nous pouvons lancer C REF et crer notre fichier image. Pour cela, ouvrir un terminal dans lequel on aura pris soin de dfinir les variables d'environnement (cf. plus haut), puis taper "c r e f om o n a p p l e t . e e p r o m " et valider :

~ / E L E C I N F 3 5 9 $c r e f om o n a p p l e t . e e p r o m J a v aC a r d2 . 2 . 2CR e f e r e n c eI m p l e m e n t a t i o nS i m u l a t o r( v e r s i o n0 . 4 1 ) 3 2 b i tA d d r e s sS p a c ei m p l e m e n t a t i o n-w i t hc r y p t o g r a p h ys u p p o r t T = 1/T = C LD u a li n t e r f a c eA P D Up r o t o c o l( I S O7 8 1 6 3 ) C o p y r i g h t2 0 0 5S u nM i c r o s y s t e m s ,I n c .A l lr i g h t sr e s e r v e d . M e m o r yc o n f i g u r a t i o n T y p e B a s e S i z e R A M 0 x 0 0 x 1 0 0 0 R O M 0 x 2 0 0 0 0 x e 0 0 0 E 2 P 0 x 1 0 0 2 00 x f f e 0

M a xA d d r 0 x f f f 0 x f f f f 0 x 1 f f f f 5 2 8 3 6b y t e s 6 1 0 2 7b y t e s 4 5 0 8b y t e s

R O MM a s ks i z e= 0 x c e 6 4= H i g h e s tR O Ma d d r e s si nm a s k= 0 x e e 6 3= S p a c ea v a i l a b l ei nR O M= 0 x 1 1 9 c= E E P R O Mw i l lb es a v e di nf i l e" m o n a p p l e t . e e p r o m " M a s kh a sn o wb e e ni n i t i a l i z e df o ru s e

C hargeons maintenant notre applet. Pour cela, clic droit sur le package monpackage , Java Card Tools, Deploy :

Nous pouvons voir les APDUs envoys dans la zone C onsole d'Eclipse :

Les status word 0 x 9 0 0 0indiquent que l'upload s'est droul correctement. Relanons C REF afin d'installer notre applet, en prenant soin de recharger notre fichier image (option i ):

~ / E L E C I N F 3 5 9 $c r e f im o n a p p l e t . e e p r o m om o n a p p l e t . e e p r o m J a v aC a r d2 . 2 . 2CR e f e r e n c eI m p l e m e n t a t i o nS i m u l a t o r( v e r s i o n0 . 4 1 ) 3 2 b i tA d d r e s sS p a c ei m p l e m e n t a t i o n-w i t hc r y p t o g r a p h ys u p p o r t T = 1/T = C LD u a li n t e r f a c eA P D Up r o t o c o l( I S O7 8 1 6 3 ) C o p y r i g h t2 0 0 5S u nM i c r o s y s t e m s ,I n c .A l lr i g h t sr e s e r v e d . M e m o r yc o n f i g u r a t i o n T y p e B a s e S i z e R A M 0 x 0 0 x 1 0 0 0 R O M 0 x 2 0 0 0 0 x e 0 0 0 E 2 P 0 x 1 0 0 2 00 x f f e 0

M a xA d d r 0 x f f f 0 x f f f f 0 x 1 f f f f

R O MM a s ks i z e= 0 x c e 6 4= 5 2 8 3 6b y t e s H i g h e s tR O Ma d d r e s si nm a s k= 0 x e e 6 3= 6 1 0 2 7b y t e s S p a c ea v a i l a b l ei nR O M= 0 x 1 1 9 c= 4 5 0 8b y t e s E E P R O M( 0 x f f e 0b y t e s )r e s t o r e df r o mf i l e" m o n a p p l e t . e e p r o m " U s i n gap r e i n i t i a l i z e dM a s k


Installons notre applet. Pour cela, dans Eclipse, clic droit sur le script c r e a t e M o n A p p l e t . s c r i p t , Java Card Tools, Run Script :

ce stade, nous pouvons utiliser apdutool pour tester notre carte, de la mme manire qu'avec JC WDE, en prenant soin de ne pas oublier la commande p o w e r u pet la slection de l'applet. C ommenons par relancer C REF (qui s'est termin sur une commande p o w e r d o w n ):

~ / E L E C I N F 3 5 9 $c r e f im o n a p p l e t . e e p r o m om o n a p p l e t . e e p r o m J a v aC a r d2 . 2 . 2CR e f e r e n c eI m p l e m e n t a t i o nS i m u l a t o r( v e r s i o n0 . 4 1 )

sen.enst.fr/node/408

6/12

29/03/13

TP Java Card 1/2 : Utilisation du Javacard Development Kit 2.2.2 de Sun | Groupe SEN
3 2 b i tA d d r e s sS p a c ei m p l e m e n t a t i o n-w i t hc r y p t o g r a p h ys u p p o r t T = 1/T = C LD u a li n t e r f a c eA P D Up r o t o c o l( I S O7 8 1 6 3 ) C o p y r i g h t2 0 0 5S u nM i c r o s y s t e m s ,I n c .A l lr i g h t sr e s e r v e d . M e m o r yc o n f i g u r a t i o n T y p e B a s e S i z e R A M 0 x 0 0 x 1 0 0 0 R O M 0 x 2 0 0 0 0 x e 0 0 0 E 2 P 0 x 1 0 0 2 00 x f f e 0

M a xA d d r 0 x f f f 0 x f f f f 0 x 1 f f f f

R O MM a s ks i z e= 0 x c e 6 4= 5 2 8 3 6b y t e s H i g h e s tR O Ma d d r e s si nm a s k= 0 x e e 6 3= 6 1 0 2 7b y t e s S p a c ea v a i l a b l ei nR O M= 0 x 1 1 9 c= 4 5 0 8b y t e s E E P R O M( 0 x f f e 0b y t e s )r e s t o r e df r o mf i l e" m o n a p p l e t . e e p r o m " U s i n gap r e i n i t i a l i z e dM a s k


Puis, dans un autre terminal, lanons a p d u t o o l , slectionnons notre applet, aprs quoi nous pouvons envoyer des APDU notre applet :

~ / E L E C I N F 3 5 9 $a p d u t o o l J a v aC a r d2 . 2 . 2A P D UT o o l ,V e r s i o n1 . 3 C o p y r i g h t2 0 0 5S u nM i c r o s y s t e m s ,I n c .A l lr i g h t sr e s e r v e d .U s ei ss u b j e c tt ol i c e n s et e r m s . O p e n i n gc o n n e c t i o nt ol o c a l h o s to np o r t9 0 2 5 . C o n n e c t e d . p o w e r u p ; R e c e i v e dA T R=0 x 3 b0 x f 00 x 1 10 x 0 00 x f f0 x 0 1 / /s e l e c tM o n A p p l e ta p p l e t 0 x 0 00 x A 40 x 0 40 x 0 00 x b0 x 0 10 x 0 20 x 0 30 x 0 40 x 0 50 x 0 60 x 0 70 x 0 80 x 0 90 x 0 00 x 0 00 x 7 F ; C L A :0 0 ,I N S :a 4 ,P 1 :0 4 ,P 2 :0 0 ,L c :0 b ,0 1 ,0 2 ,0 3 ,0 4 ,0 5 ,0 6 ,0 7 ,0 8 ,0 9 ,0 0 ,0 0 ,L e :0 0 ,S W 1 :9 0 ,S W 2 : 0 x B 00 x 0 00 x 0 00 x 0 00 x 0 00 x 7 F ; C L A :b 0 ,I N S :0 0 ,P 1 :0 0 ,P 2 :0 0 ,L c :0 0 ,L e :0 0 ,S W 1 :9 0 ,S W 2 :0 0 0 x B 00 x 0 20 x 0 00 x 0 00 x 0 00 x 7 F ; C L A :b 0 ,I N S :0 2 ,P 1 :0 0 ,P 2 :0 0 ,L c :0 0 ,L e :0 1 ,0 1 ,S W 1 :9 0 ,S W 2 :0 0 p o w e r d o w n ;

Codage d'une application cliente


Maintenant que nous avons programm notre applet Javcard, nous pouvons coder une application cliente : l'quivalent du terminal bancaire si notre Javacard tait une carte de paiement.

Cration du projet sous Eclipse


C rons un nouveau projet. Pour cela, dans Eclipse, aller dans le menu File , faire New puis Project... :

C hoisir Java Project puis confirmer en cliquant sur Next :

Donner un nom au nouveau projet puis cliquer sur Finish :

sen.enst.fr/node/408

7/12

29/03/13

TP Java Card 1/2 : Utilisation du Javacard Development Kit 2.2.2 de Sun | Groupe SEN

Ajout de la librairie apduio dans le classpath


Afin de pouvoir utiliser les classes servant communiquer avec notre Javacard, il faut ajouter la bibliothque a p d u i o . j a r (prsente dans le rpertoire ~ / E L E C I N F 3 5 9 / j a v a _ c a r d _ k i t 2 _ 2 _ 2 / l i b ). Pour cela, faire un clic droit sur notre nouveau projet puis Proprits... :

Dans la section Java Build Path, slectionner l'onglet Librairies et cliquer sur le bouton Add External Jars... :

Slectionner alors le fichier a p d u i o . j a r , valider et appuyer sur le bouton OK .

Cration de la classe principale


Tout d'abord, crons un nouveau package. Pour cela, faire un clic droit sur notre projet, puis New et Package :

Donner un nom au package puis valider l'aide du bouton Finish :

sen.enst.fr/node/408

8/12

29/03/13

TP Java Card 1/2 : Utilisation du Javacard Development Kit 2.2.2 de Sun | Groupe SEN

C rons maintenant la classe principale de notre application. Pour cela, faire un clic droit sur le package cr puis New et Class :

Donnons un nom notre nouvelle classe, cocher la case public static void main puis cliquer sur Finish :

Code pour se connecter la Javacard


La connexion au simulateur se fait via une socket. Le simulateur coute par dfaut sur le port 9025. La classe que nous utiliserons pour les changes de donnes est C a d T 1 C l i e n t .

/ *C o n n e x i o nal aJ a v a c a r d* / C a d T 1 C l i e n tc a d ; S o c k e ts c k C a r t e ; t r y{ s c k C a r t e=n e wS o c k e t ( " l o c a l h o s t " ,9 0 2 5 ) ; s c k C a r t e . s e t T c p N o D e l a y ( t r u e ) ; B u f f e r e d I n p u t S t r e a mi n p u t=n e wB u f f e r e d I n p u t S t r e a m ( s c k C a r t e . g e t I n p u t S t r e a m ( ) ) ; B u f f e r e d O u t p u t S t r e a mo u t p u t=n e wB u f f e r e d O u t p u t S t r e a m ( s c k C a r t e . g e t O u t p u t S t r e a m ( ) ) ; c a d=n e wC a d T 1 C l i e n t ( i n p u t ,o u t p u t ) ; }c a t c h( E x c e p t i o ne ){ S y s t e m . o u t . p r i n t l n ( " E r r e u r:i m p o s s i b l ed es ec o n n e c t e ral aJ a v a c a r d " ) ; r e t u r n ; } / *M i s es o u st e n s i o nd el ac a r t e* / t r y{ c a d . p o w e r U p ( ) ; }c a t c h( E x c e p t i o ne ){ S y s t e m . o u t . p r i n t l n ( " E r r e u rl o r sd el ' e n v o id el ac o m m a n d eP o w e r u pal aJ a v a c a r d " ) ; r e t u r n ; }

sen.enst.fr/node/408

9/12

29/03/13

TP Java Card 1/2 : Utilisation du Javacard Development Kit 2.2.2 de Sun | Groupe SEN
Code pour se dconnecter de la Javacard
La dconnexion de la Javacard se fera via la mthode p o w e r D o w n ( )de la classe C a d T 1 C l i e n t:

/ *M i s eh o r st e n s i o nd el ac a r t e* / t r y{ c a d . p o w e r D o w n ( ) ; }c a t c h( E x c e p t i o ne ){ S y s t e m . o u t . p r i n t l n ( " E r r e u rl o r sd el ' e n v o id el ac o m m a n d eP o w e r d o w nal aJ a v a c a r d " ) ; r e t u r n ; } Code pour slectionner l'applet Javacard


La slection d'applet se fait en envoyant l'APDU dcrite prcdemment :

/ *S l e c t i o nd el ' a p p l e t* / A p d ua p d u=n e wA p d u ( ) ; a p d u . c o m m a n d [ A p d u . C L A ]=0 x 0 0 ; a p d u . c o m m a n d [ A p d u . I N S ]=( b y t e )0 x A 4 ; a p d u . c o m m a n d [ A p d u . P 1 ]=0 x 0 4 ; a p d u . c o m m a n d [ A p d u . P 2 ]=0 x 0 0 ; b y t e [ ]a p p l e t A I D={0 x 0 1 ,0 x 0 2 ,0 x 0 3 ,0 x 0 4 ,0 x 0 5 ,0 x 0 6 ,0 x 0 7 ,0 x 0 8 ,0 x 0 9 ,0 x 0 0 ,0 x 0 0} ; a p d u . s e t D a t a I n ( a p p l e t A I D ) ; c a d . e x c h a n g e A p d u ( a p d u ) ; i f( a p d u . g e t S t a t u s ( )! =0 x 9 0 0 0 ){ S y s t e m . o u t . p r i n t l n ( " E r r e u rl o r sd el as l e c t i o nd el ' a p p l e t " ) ; S y s t e m . e x i t ( 1 ) ; }
Note : cette phase de slection n'est pas indispensable pour le simulateur JC WDE

Code de la boucle principale de l'application


Voici le code de la boucle principale de l'application. Il suffit pour chaque opration d'initialiser correctement une instance de l'objet APDU et de l'envoyer la carte via l'instance de la classe C adT1C lient.

/ *M e n up r i n c i p a l* / b o o l e a nf i n=f a l s e ; w h i l e( ! f i n ){ S y s t e m . o u t . p r i n t l n ( ) ; S y s t e m . o u t . p r i n t l n ( " A p p l i c a t i o nc l i e n t eJ a v a c a r d " ) ; S y s t e m . o u t . p r i n t l n ( " " ) ; S y s t e m . o u t . p r i n t l n ( ) ; S y s t e m . o u t . p r i n t l n ( " 1-I n t e r r o g e rl ec o m p t e u r " ) ; S y s t e m . o u t . p r i n t l n ( " 2-I n r e m e n t e rl ec o m p t e u r " ) ; S y s t e m . o u t . p r i n t l n ( " 3-D e c r e m e n t e rl ec o m p t e u r " ) ; S y s t e m . o u t . p r i n t l n ( " 4-R e i n i t i a l i s e rl ec o m p t e u r " ) ; S y s t e m . o u t . p r i n t l n ( " 5-Q u i t t e r " ) ; S y s t e m . o u t . p r i n t l n ( ) ; S y s t e m . o u t . p r i n t l n ( " V o t r ec h o i x? " ) ; i n tc h o i x=S y s t e m . i n . r e a d ( ) ; w h i l e( ! ( c h o i x> =' 1 '& &c h o i x< =' 5 ' ) ){ c h o i x=S y s t e m . i n . r e a d ( ) ; } a p d u=n e wA p d u ( ) ; a p d u . c o m m a n d [ A p d u . C L A ]=M a c l a s s e . C L A _ M O N A P P L E T ; a p d u . c o m m a n d [ A p d u . P 1 ]=0 x 0 0 ; a p d u . c o m m a n d [ A p d u . P 2 ]=0 x 0 0 ; a p d u . s e t L e ( 0 x 7 f ) ; s w i t c h( c h o i x ){ c a s e' 1 ' : a p d u . c o m m a n d [ A p d u . I N S ]=M a c l a s s e . I N S _ I N T E R R O G E R _ C O M P T E U R ; c a d . e x c h a n g e A p d u ( a p d u ) ; i f( a p d u . g e t S t a t u s ( )! =0 x 9 0 0 0 ){ S y s t e m . o u t . p r i n t l n ( " E r r e u r:s t a t u sw o r dd i f f e r e n td e0 x 9 0 0 0 " ) ; }e l s e{ S y s t e m . o u t . p r i n t l n ( " V a l e u rd uc o m p t e u r:"+a p d u . d a t a O u t [ 0 ] ) ; } b r e a k ; c a s e' 2 ' : a p d u . c o m m a n d [ A p d u . I N S ]=M a c l a s s e . I N S _ I N C R E M E N T E R _ C O M P T E U R ; c a d . e x c h a n g e A p d u ( a p d u ) ; i f( a p d u . g e t S t a t u s ( )! =0 x 9 0 0 0 ){ S y s t e m . o u t . p r i n t l n ( " E r r e u r:s t a t u sw o r dd i f f e r e n td e0 x 9 0 0 0 " ) ; }e l s e{ S y s t e m . o u t . p r i n t l n ( " O K " ) ; } b r e a k ; c a s e' 3 ' : a p d u . c o m m a n d [ A p d u . I N S ]=M a c l a s s e . I N S _ D E C R E M E N T E R _ C O M P T E U R ; c a d . e x c h a n g e A p d u ( a p d u ) ; i f( a p d u . g e t S t a t u s ( )! =0 x 9 0 0 0 ){ S y s t e m . o u t . p r i n t l n ( " E r r e u r:s t a t u sw o r dd i f f e r e n td e0 x 9 0 0 0 " ) ; }e l s e{ S y s t e m . o u t . p r i n t l n ( " O K " ) ; } b r e a k ; c a s e' 4 ' :

sen.enst.fr/node/408

10/12

29/03/13

TP Java Card 1/2 : Utilisation du Javacard Development Kit 2.2.2 de Sun | Groupe SEN
a p d u . c o m m a n d [ A p d u . I N S ]=M a c l a s s e . I N S _ I N I T I A L I S E R _ C O M P T E U R ; b y t e [ ]d o n n e e s=n e wb y t e [ 1 ] ; d o n n e e s [ 0 ]=0 ; a p d u . s e t D a t a I n ( d o n n e e s ) ; c a d . e x c h a n g e A p d u ( a p d u ) ; i f( a p d u . g e t S t a t u s ( )! =0 x 9 0 0 0 ){ S y s t e m . o u t . p r i n t l n ( " E r r e u r:s t a t u sw o r dd i f f e r e n td e0 x 9 0 0 0 " ) ; }e l s e{ S y s t e m . o u t . p r i n t l n ( " O K " ) ; } b r e a k ; c a s e' 5 ' : f i n=t r u e ; b r e a k ; } }
Le code source de l'application est disponible ici : Maclasse.java

Utilisation de l'application cliente et d'un simulateur


Avec JCWDE
Afin de pouvoir lancer le simulateur de notre applet en ligne de commande, nous allons crer un fichier "de configuration". Il permet de lister les applets Javacard installer pour la simulation et de spcifier leurs AID respectifs. C rons notre fichier que nous appellerons "m o n a p p l e t . a p p ". Il contiendra la ligne suivante :

m o n p a c k a g e . M o n A p p l e t0 x 0 1 : 0 x 0 2 : 0 x 0 3 : 0 x 0 4 : 0 x 0 5 : 0 x 0 6 : 0 x 0 7 : 0 x 0 8 : 0 x 0 9 : 0 x 0 0 : 0 x 0 0
Nous pouvons maintenant lancer notre simulateur, en prenant soin de nous placer dans le bon rpertoire (rpertoire parent du package contenant le fichier class de l'applet) :

~ $c dw o r k s p a c e / T u t o r i e l \J a v a c a r d / b i n ~ / w o r k s p a c e / T u t o r i e lJ a v a c a r d / b i n $j c w d em o n a p p l e t . a p p J a v aC a r d2 . 2 . 2W o r k s t a t i o nD e v e l o p m e n tE n v i r o n m e n t ,V e r s i o n1 . 3 C o p y r i g h t2 0 0 5S u nM i c r o s y s t e m s ,I n c .A l lr i g h t sr e s e r v e d .U s ei ss u b j e c tt ol i c e n s et e r m s . j c w d ei sl i s t e n i n gf o rT = 1A p d u ' so nT C P / I Pp o r t90 2 5 .
Maintenant que notre simulateur est lanc, lanons notre application cliente :

C ommenons par interroger le compteur : tapons 1 puis validons :

Le compteur est bien 0. Incrmentons maintenant le compteur 3 fois puis dcrmentons-le une fois. Lorsque nous rinterrogeons 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 la rception de la commande "p o w e r d o w n ":

j c w d ee x i t i n go nr e c e i p to fp o w e rd o w nc o m m a n d .
Rappel : ce simulateur ne permet pas de conserver l'tat de la carte. Si nous le relanons, le compteur sera 0 et non 2.

Avec CREF
Lanons C REF partir de l'image EEPROM que nous avons gnre :

~ / E L E C I N F 3 5 9 $c r e f im o n a p p l e t . e e p r o m om o n a p p l e t . e e p r o m J a v aC a r d2 . 2 . 2CR e f e r e n c eI m p l e m e n t a t i o nS i m u l a t o r( v e r s i o n0 . 4 1 ) 3 2 b i tA d d r e s sS p a c ei m p l e m e n t a t i o n-w i t hc r y p t o g r a p h ys u p p o r t T = 1/T = C LD u a li n t e r f a c eA P D Up r o t o c o l( I S O7 8 1 6 3 ) C o p y r i g h t2 0 0 5S u nM i c r o s y s t e m s ,I n c .A l lr i g h t sr e s e r v e d . M e m o r yc o n f i g u r a t i o n

sen.enst.fr/node/408

11/12

29/03/13

TP Java Card 1/2 : Utilisation du Javacard Development Kit 2.2.2 de Sun | Groupe SEN
T y p e R A M R O M E 2 P B a s e S i z e 0 x 0 0 x 1 0 0 0 0 x 2 0 0 0 0 x e 0 0 0 0 x 1 0 0 2 00 x f f e 0 M a xA d d r 0 x f f f 0 x f f f f 0 x 1 f f f f

R O MM a s ks i z e= 0 x c e 6 4= 5 2 8 3 6b y t e s H i g h e s tR O Ma d d r e s si nm a s k= 0 x e e 6 3= 6 1 0 2 7b y t e s S p a c ea v a i l a b l ei nR O M= 0 x 1 1 9 c= 4 5 0 8b y t e s E E P R O M( 0 x f f e 0b y t e s )r e s t o r e df r o mf i l e" m o n a p p l e t . e e p r o m " U s i n gap r e i n i t i a l i z e dM a s k


Nous pouvons dsormais lancer notre application cliente et observer les mmes rsultats qu'avec JC WDE, en revanche, l'tat de la carte (le compteur) sera conserv d'une session l'autre.

Pour aller plus loin...


Si le cur vous en dit, vous pouvez uploader votre magnifique compteur sur une vraie Javacard... c'est sur cette page que a se passe

Filename/Title

Taille

Maclasse.java

4.12 Ko

eclipse-jcde-0.1-linux.tgz 135.54 Ko

(c) C OMELEC 2007

sen.enst.fr/node/408

12/12

Вам также может понравиться