You are on page 1of 43

ERNEWEIN

Ludovic
3A SERTR

Mars 2007










Projet de Iin d'etude :


Autour des
JavaCards

















Tuteur : M. DuIner

i


Remerciements





Je souhaite tout d'abord remercier M DuIner mon tuteur pour avoir propose ce projet
qui Iut d'un tres grand intert.

Je souhaite egalement remercier M RebeuI qui lors de la soutenance de Decembre m'a
permit de me rendre compte des details importants que j'avais trop vite negliges.

Je souhaite egalement remercier les personnes qui ont repondu a mes questions posees
sur Internet.


ii
Rsums

Resume :

Ce projet traite de la technologie JavaCard qui consiste au deploiement d'applets sur
de cartes a puce au Iormat Smart card. Vous y trouverez tout d'abord un recapitulatiI des
generalites sur la technologie des JavaCard, qui presente tout les aspects qui sont necessaires
pour commencer le developpement d'application dans cette technologie. Ensuite vous y
trouverez egalement un tutorial que j'ai elabore aIin de prendre en main Iacilement et
rapidement les outils qui vont servir tout au long du developpement. EnIin la derniere partie
est consacre au developpement des applets on y retrouve un applet de simulation pour une
carte de credit dont le Ionctionnement a ete detaille pour se Iamiliariser Iacilement avec la
logique de developpement, ainsi qu'un exercice propose aux personnes desireuse de tester leur
comprehension de la technologie.

Abstract :

This project is about JavaCard technology which consists with the deployment oI
applet on smart cards with the reserved Smart card Iormat. First oI all, you will Iind a
summary oI the general inIormation that I have Iounded on the JavaCard technology, which
presents all the aspects which are necessary to begin the development oI application in this
technology. Then you will also Iind a tutorial, which I made in order to discover, easily and
quickly the tools which will be used all over the length oI the development. Finally the last
part is devoted to the development oI the applet. In this part you will Iind a real simulation
applet Ior a credit card, whose operation are detail to Iamiliarize easily with the logic oI
development, as well as one exercise suggested to the people, whose are eager to test their
comprehension oI the technology.

iii
Sommaire




Introduction

1
I Generalites sur la technologie JavaCard

2
I.1 Historique
2
I.2 Architecture des JavaCards
2
I.3 DiIIerences avec Java
4
I.4 L'API JavaCard
6
I.5 Communication de la JavaCard avec son environnement
7
I.6 Cycle de vie d'un applet

12
II L'environnement de developpement

16
II.1 Choix de l'environnement de developpement
16
II.2 Tutorial Eclipse
16
II.3 Exemple de lancement d'un applet sous Eclipse

22
III Les applications

28
III.1 DescriptiI d'un applet
28
III.2 Exercice

35
Conclusion

38
Bibliographie
39



Ernewein
Ludovic
Introduction

Autour des JavaCards Page 1




Introduction:

Le but de mon projet est de me Iamiliariser et de developper la programmation
d'applications ecrites en Java pour cartes a puces SmartCards, grce a la technologie JavaCard
mise au point en 1997 et qui a connu un gain d'intert a partir de 1999.
Les objectiIs Iixes en debut de projet avec le tuteur portaient tout d'abord sur l'etude de
l'environnement de cette technologie. En eIIet, ce sujet etait tres meconnu par l'ensemble des
encadrant, il s'agissait donc d'une premiere approche d`ou le titre Ilou du projet : Autour des
JavaCards.
La premiere etape Iut donc de degager une marche a suivre pour l'ensemble du projet.
Une progression logique de l'etude Iut ainsi mise au point : Tout d'abord des recherches
generales sur le sujet, ensuite l'etude du materiel reu pour le developpement des applications
puis une derniere etape purement applicative.
Dans les pages qui vont suivre je traiterai tout d'abord du Iruit de mes recherches en
presentant la documentation rassemblee et condensee pour une comprehension rapide du sujet
puis pour approIondir je procederais au detail du Ionctionnement de cette technologie.
Dans une seconde etape je presenterais un tutorial d'utilisation pour que les personnes
qui travailleront a ma suite beneIicient d'une aide elaboree sur l'environnement de
developpement et la gestion des applications.
EnIin je procederais au detail d'une application que l'on peut developper dans cette
technologie et je proposerais un petit exercice pour la prise en main de la technologie.
Ernewein
Ludovic
I Generalites

Autour des JavaCards Page 2



I Gnralits sur la technologie 1avaCard

I.1 Historique

En mars 1996, un petit groupe d'ingenieurs de Schlumberger au Texas ont souhaite
simpliIier la programmation des cartes a puces tout en preservant la securite des donnees. La
solution adoptee a Iinalement ete Java. Malheureusement vu la taille de la memoire disponible
sur une carte a puce, seulement un sous-ensemble de Java pouvait tre utilise (la taille de la
JVM (Java Virtual Machine) et du systeme de runtime ne devant pas depasser 12 ko).
C'est ainsi qu'est ne JavaCard, le premier langage objets adapte aux cartes a puces.
Schlumberger et Gemplus sont aussi les co-Iondateurs en 1997 du JavaCard Forum
(http://www.javacardIorum.org) qui regroupe les Iabriquant de silicium, les encarteurs et les
clients, et qui recommande des speciIications a JavaSoIt (la division de Sun a qui appartient
JavaCard) en vue d'obtenir une standardisation du langage.

I.2 Architecture des JavaCards

SpeciIications:

Les JavaCards sont des cartes a puce de type smart card, leur CPU permet de gerer des
donnees de 8, 16 ou 32 bits. Le Ionctionnement classique veut que l'on utilise le plus souvent
les deux premieres options (soit 1 ou 2 octets) car la carte Ionctionne sur un principe de
decodage des octets (un peu comme un langage assembleur).
Selon les modeles on dispose de plus ou moins de ressources (memoires) pour le
stockage des applets et leur execution sur la machine virtuelle.

Donnees moyennes sur la memoire disponible:

RAM : 512 Ko
EEPROM/Flash : 128/256 Ko
ROM : 256/512 Ko
Ernewein
Ludovic
I Generalites

Autour des JavaCards Page 3


Comme il est dit precedemment la carte est basee sur un interpreteur de bytecode java, son
architecture ce presente sous cette Iorme :

On retrouve donc la machine virtuelle java (Java VM) au dessus du systeme
d'exploitation. Comme pour les ordinateurs, chaque carte d'architecture devra avoir sa propre
machine virtuelle. La machine virtuelle JavaCard est identique a celle de Java mais est
decoupee en deux parties : une sur la carte, l'autre hors carte ("Java Card Converter").
Il est donc necessaire de pre-compiler les applications avant de les charger sur la carte:


Schema de presentation plus detaille :
.
.
Ernewein
Ludovic
I Generalites

Autour des JavaCards Page 4


La programmation s'eIIectue sur n'importe quel environnement de programmation
dans lequel on constitue des Iichiers avec pour extension "java" (JBuilder, Eclipse, etc. dans
ce projet nous nous servons d'Eclipse SDK version 3.2.1 qui est la version recommande par le
Iabriquant de la carte).
On les compile ensuite aIin de Iournir le bytecode. Ce bytecode passe ensuite dans la
machine virtuelle "hors carte" qui est decoupee en 3 modules ayant chacun un rle precis :

Le VeriIieur de bytecode :
Il utilise le veriIieur de bytecode Java "classique"
Il contrle le sous-ensemble JavaCard (langage API)

Le Convertisseur en trois phases :
Preparation : initialise les structures de donnees de la JCVM
Optimisation : ajuste l'espace memoire.
Edition de liens : resout les reIerences symboliques a des classes deja presentes dans la carte
(via "image" de la carte).

Le Signeur :
Il valide le passage par le veriIicateur et le convertisseur par une signature veriIiee par la carte
au moment du chargement.
Le programme Iournit alors des Iichiers ".cap" qui peuvent tre charges dans la carte.

I.3 DiIIerences avec Java

La conIiguration minimale Iixee pour Iaire Ionctionner une JavaCard est : 16 Ko de
ROM, 8 Ko d'EEPROM et 256 octets de RAM. Il etait donc imperatiI de reduire l'API Java
aIin de pouvoir loger la machine virtuelle Java sur la carte.

On retrouve donc les possibilites d'implementation suivantes :



Ernewein
Ludovic
I Generalites

Autour des JavaCards Page 5



Pas de chargement dynamique de classes :
L'allocation dynamique d'objets (new) est supportee mais pas de ramasse miette ni de
desallocation explicite (c'est a dire que la memoire allouee ne peut pas tre recuperee).
La methode Iinalize () n'est pas supportee.

Types de base :
Byte (8bits), short (16 bits), Int (32 bits) et boolean.
Pas de types char (ni de classe String), double, Iloat ni long.

Les objets de base disponibles sont :
java.lang.Object.
java.lang.Throwable.

Les tableaux sont limites :
Ils ne peuvent avoir qu'une dimension.
Les elements supportes : uniquement les types de bases supportes par JavaCard.
La taille maximum est de 2`15 elements.

Le mecanisme d'heritage est semblable a java, on conserve donc :
La surcharge de methodes, les methodes abstraites et les interIaces.
L'invocation de methodes dynamique.
L'utilisation des mots cles instanceoI, super et this.

Pas de classe Thread, pas de Ionctionnalites de synchronisation (synchronised, wait...).
Toute application JavaCard est donc monothread

Securite :
Notions de paquetages et operateurs de portee identiques a java (protected, private et public).
Pas de classe SecurityManager, la politique de securite est directement implementee dans la
machine virtuelle : applet Iirewall.

Ernewein
Ludovic
I Generalites

Autour des JavaCards Page 6



Mecanismes d'exceptions supportes
Les exceptions peuvent tre deIinies (ajout de extends Throwable), propagees (throw) et
interceptees (catch).
Les classes Throwable, Exception et Error sont supportees et certaines de leurs sous classes
aussi (package java.lang).

I.4 L'API JavaCard

Elle contient un package principal pour programmer une applet carte, des extensions et
des API utilitaires.

Package principal : favacard.framework : Il deIinit les classes AID, APDU, Applet, ISO, PIN,
JCSystem et Util. Contient egalement les classes exception.

Des extensions de l'API :
favacardx.framework : permet la gestion des Iichiers selon la norme ISO 7816-4.
favacardx.crvpto : assure la gestion des cles publiques et privees, la generation de nombres
aleatoires, implemente des Ionctions de chiIIrement et de hachage optimisees.

Les API utilitaires :
public final class JCSvstem : cette classe contient les methodes statiques pour interagir avec le
JCRE.
public class Util : cette classe contient des methodes statiques utiles optimisees pour la carte :
Copie, comparaison de tableaux de bytes, creation de short a partir de byte.
public final class AID : Encapsule des identiIiants d'applications carte conIormes a la norme
ISO 7816-5.
public class ISO7816 . Champs statiques de constantes conIormes aux normes ISO 7816-3 et
ISO 7816-4.
public abstract class PIN : Utile pour la representation d'un code secret (tableau d`octets) :
attribut OwnerPIN : code secret pouvant tre mis a jour
Ernewein
Ludovic
I Generalites

Autour des JavaCards Page 7



I.5 Communication de la JavaCard avec son environnement

La JavaCard est un module de traitement reactiI a son environnement, en eIIet c'est
une application externe qui va lancer l'appel des applets memorisees dans la carte.

Lorsqu'un dispositiI externe est compatible, il va reagir a la presence d'une JavaCard
dans son lecteur de carte, et va envoyer une requte a la carte pour executer les applets qui lui
sont necessaires.
Chaque applet memorise dans une JavaCard est speciIique a un programme appelant,
en eIIet on utilise une numerotation unique des applet grce a un protocole appele AID, ainsi
lorsque l'on insert une JavaCard dans un lecteur, on obtient une reaction positive uniquement
si la carte contient l'applet demande par l'application externe.

SpeciIication des AID :
Dans la technologie JavaCard, chaque applet est identiIiee et selectionnee par un
identiIicateur (AID). De mme, a chaque paquetage Java est assigne un AID. Cette
convention de nommage est conIorme a la speciIication de la carte a puce deIinie dans l`ISO
7816.
Un AID est une sequence d`octets allant de 5 a 16 octets. Son Iormat est :



C'est l`ISO qui gere l`aIIectation des RID aux compagnies, chaque compagnie obtient
son propre et unique RID. Apres cela c'est les compagnies gerent l`aIIectation des PIX pour
leurs AID.



Ernewein
Ludovic
I Generalites

Autour des JavaCards Page 8



Ex : Si le RID attribue a une societe est : 0x4E, 0x78, 0x34, 0xA2, 0x27, alors tous les applets
qui seront crees par la suite seront composes de ces 5 octets suivis de leurs octets
d'identiIications :
0x4E, 0x78, 0x34, 0xA2, 0x27, 0x00, 0x00, 0x00, 0x00, 0x01
0x4E, 0x78, 0x34, 0xA2, 0x27, ,0x00, 0x00, 0x01

Fonctionnement de la communication avec l'environnement :

Un applet qui tourne sur une carte a puce communique avec l`application en utilisant
le protocole APDU (Application Protocol Data Units deIini par l`ISO 7816).

Les commandes APDU sont toujours par paire. Chaque paire contient une commande
APDU, qui speciIie une requte, et une reponse APDU, qui retourne le resultat d`execution de
la commande. Dans ce mode de Ionctionnement, les cartes sont reactives, elles n`initient
jamais des communications mais se contentent de repondre aux APDU du monde exterieur.
Explications sur le schema ci-dessous : L`application cliente envoie une commande APDU
via le lecteur (CAD). La machine virtuelle en recevant une commande, passe la commande a
l'applet concerne. L`applet traite la commande et retourne une reponse APDU a l`application.



Ernewein
Ludovic
I Generalites

Autour des JavaCards Page 9



Format d'une APDU :

Commande :



CLA (1 octet): Classe d'instruction : structure et Iormat de la categorie d'APDU.
INS (1 octet): Code de l'instruction.
P1 (1 octet) et P2 (1 octet): On peu utiliser ces champs pour donner des precisions sur le
champ INS ou pour envoyer des donnees.
Lc (1 octet): Nombre d'octets dans le champ donnees.
Donnees (nb d'octets egal a valeur de Lc): Sequence de donnees additionnelles.
Le (1 octet): Nombre maximum d'octets attendus dans le champ de donnees de la reponse.

Reponse :



Donnees (longueur variable Le): Sequence d'octets reus.
SW1 (1 octet) et SW2 (1 octet): Status words : donne une inIormation sur l'etat du processus
dans la carte.

Il est important de noter que les valeurs des champs CLA, INS, P1, P2, SW1 et SW2 ne sont
pas des valeurs aleatoires. En eIIet l'ISO 7816 deIinit des codes precis pour certains types de
requtes, dont on peut donner une liste non exhaustive :
Ernewein
Ludovic
I Generalites

Autour des JavaCards Page 10


Valeurs types de CLA dans l'ISO :
Valeur Classe d'instruction
0x0n, 0x1n Instruction selon l'ISO 7816-4, Acces aux donnees et operations de securite
De 0x20 a
0x7F
Reserves
0x8n ou
0x9n
Format utilise pour le developpement d'applications standard
0xAn Instructions speciIiques aux vendeurs ou pour applications standard
De B0 a CF Format utilise pour le developpement d'applications standard
De D0 a FE Instructions speciIiques aux vendeurs ou pour applications standard
FF Reserve

Dans la pratique on utilisera plutt des codes CLA superieurs a 0x80.
Valeurs types de INS dans l'ISO quand CLA est compris entre 0x00 et 0x7F :
Valeur Description de la commande
0E Erase Binary
20 VeriIy
70 Manage Channel
82 External Authenticate
84 Get Challenge
88 Internal Authenticate
A4 Select File
B0 Read Binary
B2 Read Record(s)
C0 Get Response
C2 Envelope
CA Get Data
D0 Write Binary
D2 Write Record
D6 Update Binary
DA Put Data
DC Update Record
E2 Append Record
Ernewein
Ludovic
I Generalites

Autour des JavaCards Page 11


Le codage des octets P1 et P2 depend ensuite de la valeur de INS, une liste recapitulant les
diIIerentes valeurs possibles pour certaines instructions sont recapitules dans le tutorial de
MO Techno joint avec les cartes de la page 25 a la page 29. Je ne preIere pas traiter leur
signiIication car elle n'apporte que peu de precisions sur le sujet qui nous interesse.

Valeurs types de SW dans l'ISO :
Valeur SW1
SW2
Type d'erreur Code 1avaCard
61 00 Response bytes remaining SWBYTESREMAINING00
67 00 Wrong length SWWRONGLENGTH
69 82 Security condition not satisIied SWSECURITYSTATUSNOT
SATISFIED
69 83 File invalid SWFILEINVALID
69 84 Data invalid SWDATAINVALID
69 85 Condition oI use not satisIied SWCONDITIONSNOTSATISFIED
69 86 Command not allowed SWCOMMANDNOTALLOWED
69 99 Applet selection Iailed SWAPPLETSELECTIONFAILED
6A 80 Wrong data SWWRONGDATA
6A 81 Function not supported SWFUNCNOTSUPPORTED
6A 82 File not Iound SWFILENOTFOUND
6A 83 Record not Iound SWRECORDNOTFOUND
6A 84 Not enough memory space in Iile SWFILEFULL
6A 86 Incorrect parameters P1, P2 SWINCORRECTP1P2
6B 00 Incorrect parameters P1, P2 SWWRONGP1P2
6C 00 Correct expected Lengh (Le) SWCORRECTLENGTH
6D 00 INS value not supported SWINSNOTSUPPORTED
Ernewein
Ludovic
I Generalites

Autour des JavaCards Page 12

6E 00 CLA value not supported SWCLANOTSUPPORTED
6F 00 No precise diagnosis SWUNKNOWN

Valeurs types de SW dans l'ISO delivres par le cardmanager pour les erreurs de VM:
62 83 Selected applet blocked
63 00 Cryptogram not veriIied
63 10 More data available
65 81 Memory Iailure
67 00 Incorrect length
6A 88 No element matches the search criteria
6C XX Only XX bytes oI data are available
6F 80 Stack overIlow
90 00 Command process without error
92 40 Memory problem
94 02 Acces out oI range
94 84 Algorithm not supported
94 85 Invalid key check value
9F XX XX bytes oI data available


I.6 Cycle de vie d'un Applet

L'applet carte est un programme serveur de la JavaCard, un applet est selectionne par
le terminal par un APDU de selection. Cette selection est Iaite en Ionction de l'ID de l'applet
qui doit tre unique (represente par la classe AID signiIiant Applet ID).
Ernewein
Ludovic
I Generalites

Autour des JavaCards Page 13


Une applet a les proprietes suivantes :
Une Iois qu'elle est installee dans la carte, elle est toujours disponible.
L'applet doit heriter de la classe favacard.framework.Applet.
Il doit implementer les methodes qui interagissent avec le JCRE : install (), select (), deselect
(), et process ().

DeIinition des methodes publiques qu'il doit obligatoirement implementer :

public void install ( APDU apdu ) :
Appelee (une Iois) par le JCRE quand l'applet est chargee dans la carte.
Doit s'enregistrer aupres du JCRE (methode register ()).
public boolean select() :
Appelee par le JCRE quand un APDU de selection est reu et designe cet applet.
Rend l'applet active.
public void process( APDU apdu ) :
Appelee par le JCRE quand un APDU de commande est reu pour cet applet (qui doit tre
actiI)
public void deselect( ) :
Appelee par le JCRE pour deselectionner l'applet courante.

Comment un applet gere les APDU ?

L'unite de traitement de base d'un applet est un objet de type
favacard.framework.APDU qui est transmis par le JCRE a la reception d'un APDU de
commande par la carte (en provenance du terminal). La methode process () de l'applet courant
est alors appelee.

SpeciIicites de la classe javacard.Iramework.APDU :
Est compatible avec le Iormat de messages ISO 7816-4.
Cache les caracteristiques des protocoles de communication bas niveau (T0 et T1).
Encapsule les echanges de messages APDUs (commandes et reponses) dans un buIIer
d'entrees/sorties
Ernewein
Ludovic
I Generalites

Autour des JavaCards Page 14



La lecture et l'ecriture dans le buIIer d'APDU se deroulent comme le montre le diagramme de
sequence ci dessous :



Le rle d'un applet est d'une part de maintenir son propre etat, gerer ses champs, creer
des objets et les reIerencer pour travailler. D'autre part il reponds a des commandes APDUs
(methode process ()) avec des reponses APDUs.
Pour concevoir une applet on doit eIIectuer les etapes suivantes :
Creer les objets de base a l'installation, initialiser les champs.
Implementation de la methode install ().
DeIinir les APDUs traites par la methode process ().
Implementation d'un analyseur de commandes.
Utilisation des champs et objets de l'applet.
DeIinir les traitements a la selection et a la deselection (methodes select () et deselect ()).
Ernewein
Ludovic
I Generalites

Autour des JavaCards Page 15



L'application cliente :

L'application cliente se trouve sur le terminal qui dialogue avec la carte :
Elle implemente les classes du terminal (avec JDK).
Elle communique avec le serveur (applet carte), pour cela elle s'occupe de l'etablissement de
la liaison : envoi d`un APDU de selection avec l`AID de l`applet (standardise).
Elle gere l'invocation de services de l`applet, c'est a dire :
Le codage et l'envoi d`APDUs de commande conIormes a ceux traites par l`applet.
La reception et decodage des APDUs de reponse retournes par l`applet.

Il n'existe pas d`API standard de communication avec la carte, on peut utiliser une des
API Iournit pas diIIerents constructeurs. Cependant une API est en cours de standardisation
pour suivre la tendance des autres services JavaCard qui suivent la loi rigoureuse deIinie par
les membres regroupes au sein du "javacardIorum".

Le diagramme de sequence ci dessous indique les communications entre l'application
cliente avec la carte :
Ernewein
Ludovic
II Environnement de developpement

Autour des JavaCards Page 16


II L'environnement de dveloppement

II.1 Choix de l'environnement

Pour developper mes applications j'ai choisit de travailler sous Eclipse SDK dans a
version 3.2.1 pour Windows. Le choix de l'IDE n'etant en eIIet pas decisiI par rapport aux
resultats attendus, j'ai choisit en accord avec M DuIner de travailler sous eclipse. Ce choix se
justiIie en partie par le Iait que c'est l'IDE que conseille MO Techno qui nous a livre les
cartes. De plus ce choix m'aura permit de me Iamiliariser avec un nouvel environnement, que
nous n'avons jamais utilise en cours et qui est touteIois tres present dans l'univers
proIessionnel. EnIin MO Techno proposait dans son package un tutorial d'installation et de
parametrage d'Eclipse en anglais (et en allemand sur le CD) ce qui m'a beaucoup servit pour
la decouverte de cet environnement.

II.2 Tutorial Eclipse

Etant donne que le tutorial d'eclipse etait Iournit en langues etrangeres j'ai convenu
avec mon tuteur de le rediger en Iranais aIin de Iaciliter la tache des personnes qui pourraient
travailler a ma suite.

Tout d'abord il Iaut explorer le CD Iournit par MO Techno pour installer le lecteur de carte
Allez dans : \Driver\SDK

Ernewein
Ludovic
II Environnement de developpement

Autour des JavaCards Page 17



Il Iaut deziper le dossier ACR38Uinst111000.
Branchez ensuite le lecteur de carte sur un des ports USB de votre ordinateur.
Lancer l'executable setup du dossier que vous avez dezipe.



Cet ecran apparat alors, cliquer sur install pour commencer.
Attendez que le peripherique soit bien installe : la petite Ientre en bas a droite qui annonce
nouveau materiel installe et prt a l'emploi. Puis Iermer le programme d'installation en
cliquant sur Iermer.

Vous pouvez veriIier dans votre gestionnaire de peripheriques que le lecteur apparat.


Ernewein
Ludovic
II Environnement de developpement

Autour des JavaCards Page 18



Ensuite il Iaut telecharger eclipse a l'adresse : http://www.eclipse.org/downloads.
Ce tutorial est Iait pour la version 3.2.1 et pour Windows, il Iaut donc chercher cette version
dans la liste des anciennes versions (en eIIet depuis peu de temps est disponible la version
3.2.2 qui n'a pas ete teste pour ces applications) il Iaut donc toujours prendre la version SDK
v3.2.1 (120Mo). Si vous n'utilisez pas Windows cherchez la version compatible avec votre
OS, le tutorial peut Iacilement tre adapte aux autres systemes.

Maintenant que vous avez telecharge eclipse il vous Iaudra aussi telecharger JRE (Java
Runtime Environnement) dans sa version 2 minimum aIin de pouvoir lancer et creer des
projets avec eclipse. Vous trouverez tout le necessaire a l'adresse
http://java.com/en/download/index.jsp, il suIIit de cliquer sur download et de choisir son
mode d'installation : En ligne ou en telechargement.

Une Iois JRE installe on peut passer a eclipse. Cette version n'a cependant pas besoin
d'installation, en eIIet il suIIit de deziper le dossier sur votre Disque et de lancer l'application
eclipse.exe

Choisissez maintenant votre dossier de travail (workspace directory)

Ensuite pour avoir acces aux outils de developpement JavaCard allez telecharger le plug-in
IBM JCOP pour eclipse a l'adresse http://tinyurl.com/vum9k. Une Ientre s'ouvre choisissez
enregistrer sur le disque.

Ernewein
Ludovic
II Environnement de developpement

Autour des JavaCards Page 19



Une Iois le telechargement termine, lancez eclipse et procedez ainsi :
Faire l'update du package telecharge precedemment





Ernewein
Ludovic
II Environnement de developpement

Autour des JavaCards Page 20



Cliquez sur "New Archived Site" sur la droite de la Ientre.
Selectionnez le Iichier "tools.zip" juste telecharge, puis "ouvrir" et "ok".

Ensuite installez le tout, mme les Iichiers qui n'ont pas etes signes numeriquement. Puis
redemarrez eclipse en choisissant "Yes" sur le dernier bouton.

Activation du plug-in : branchez le lecteur de carte, puis quand eclipse est lance cliquez sur
l'icne a gauche de l'icne java en haut a droite : petite fentre avec le faune



Choisissez dans la liste JCOP Debug (selectionnez au besoin Others dans la liste deroulante le
JCOP Debug devrait s'y trouver).
Maintenant vous allez devoir posseder une carte de developpement pour activer le
programme, sans celle-ci vous ne pourrez aller plus loin dans votre installation.
Ernewein
Ludovic
II Environnement de developpement

Autour des JavaCards Page 21



Cliquez sur next


Pour vous servir de votre Engineering card, selectionnez la seconde option puis continuez en
appuyant sur "next"


Ernewein
Ludovic
II Environnement de developpement

Autour des JavaCards Page 22



Il Iaut choisir le bon lecteur, dans notre cas c'est le ACR38U (attention votre lecteur doit tre
branche sur un de vos port USB)


Inserez votre carte de developpement, la led verte du lecteur reste allume quelques instants,
cliquez ensuite sur "Iinish". Le programme est installe vous avez desormais la possibilite de
developper vos applets.

II.3 Exemple de lancement d'un applet sous Eclipse

Maintenant qu'eclipse est prt pour le developpement des applets on peut creer un nouveau
projet


Ernewein
Ludovic
II Environnement de developpement

Autour des JavaCards Page 23



On donne un nom a notre nouveau projet puis on selectionne les options par deIaut pour la
conIiguration.



Maintenant on peu creer un applet en Iaisant un clic droit sur notre projet et en selectionnant
creer un nouvel applet.
Une Ientre s'ouvre dans laquelle on renseigne le nom du package dans lequel on va travailler
et le nom de notre applet.

Maintenant il Iaut choisir notre AID pour l'applet et un AID pour le package. Une Iois que
l'on a enregistre notre AID on peut commencer a developper notre applet.
Ernewein
Ludovic
II Environnement de developpement

Autour des JavaCards Page 24



Une Iois que l'on a developpe notre applet on peut le lancer :


On choisit soit de le lancer l'applet sur le simulateur inclus dans l'outil de developpement de
JCOP tools soit de l'installer sur la carte que l'on peut inserer dans le lecteur.


Ernewein
Ludovic
II Environnement de developpement

Autour des JavaCards Page 25



Maintenant que l'on a choisit comment tester notre applet, il suIIit de charger le package
contenant notre applet.
Pour cela il suIIit de cliquer sur l'onglet Package Upload.



Puis, une Iois la nouvelle Ientre ouverte selectionner "Add package" et choisissez le package
que vous voulez charger.


Ernewein
Ludovic
II Environnement de developpement

Autour des JavaCards Page 26



Une Iois que vous avez choisit votre package vous pouvez selectionner les applets contenu
dans celui-ci en cliquant sur "Install Applet"



Une Iois votre applet installe vous n'avez plus qu'a Iaire un double clic sur celui-ci aIin de
vous retrouver dans une Ientre vous permettant de regler ses parametres AID aIin que la
machine virtuelle puisse Iaire les liens.



Ernewein
Ludovic
II Environnement de developpement

Autour des JavaCards Page 27



Une Iois que vous avez tout parametre vous vous retrouvez avec une Ientre contenant
l'arborescence de votre projet, vous y retrouvez votre package, l'applet que vous allez lancer,
vous pouvez y distinguer l'AID du package et de l'applet et l'AID de l'instance de l'applet que
vous tes sur le point de simuler.
Il vous suIIit juste de cliquer sur "Apply" puis "Run" pour lancer l'execution.

Ernewein
Ludovic
III Les applications

Autour des JavaCards Page 28


III Les applications

III.1 DescriptiI d'un applet

Dans la majorite des cas les ressources que l'on peut trouver sur les diIIerentes sources
d'inIormation, et notamment sur Internet concernent des cas tres complexes comme les
applets de carte de credit ou les simulation de carte sim pour telephones GSM. Je pense donc
qu'etudier ce genre d'application peut nous permettre, apres avoir assimile la theorie de
developper notre approche pratique du sujet.
Pour etudier un cas complet j'ai choisit une source propose par Sun pour les developpeurs
s'interessant a des applications complexes. Vous pourrez trouvez ce source a l'adresse :
http://developers.sun.com/techtopics/mobility/javacard/articles/intro/index.html

Je vais donc maintenant reprendre cet exemple aIin de vous Iaire comprendre le
codage d'un applet.

Declaration du package
Au debut du programme comme en Java
package com.sun.javacard.samples.wallet;

Importation des outils framework
Contient toutes les classes les plus utiles comme APDU et Applet
import javacard.framework.*;

Cration de notre classe qui herite Iorcement de la classe Applet
public class Wallet extends Applet

Ernewein
Ludovic
III Les applications

Autour des JavaCards Page 29



Dclaration des constantes
On peut deIinir des constantes qui nous serviront pour identiIier certaines valeurs cle
pour des octets speciIiques.
Valeurs de CLA et de INS que l'on reconnat
// code of CLA byte in the command APDU header
final static byte Wallet_CLA =(byte)0xB0;
// codes of INS byte in the command APDU header
final static byte VERIFY = (byte) 0x20;
final static byte CREDIT = (byte) 0x30;
final static byte DEBIT = (byte) 0x40;
final static byte GET_BALANCE = (byte) 0x50;
Autres constants comme le montant maximum du credit disponible, le montant
maximum d'une transaction, le nombre d'essai avant de bloquer le code PIN, ou encore la
taille maximale du code PIN.
// maximum balance
final static short MAX_BALANCE = 0x7FFF;
// maximum transaction amount
final static byte MAX_TRANSACTION_AMOUNT = 127;

// maximum number of incorrect tries before the
// PIN is blocked
final static byte PIN_TRY_LIMIT =(byte)0x03;
// maximum size PIN
final static byte MAX_PIN_SIZE =(byte)0x08;


On peut aussi declarer des constantes associees a des octets qui seront envoye sous
certaines conditions
// signal that the PIN verification failed
final static short SW_VERIFICATION_FAILED = 0x6300;
// signal the the PIN validation is required
// for a credit or a debit transaction
final static short SW_PIN_VERIFICATION_REQUIRED = 0x6301;
// signal invalid transaction amount
// amount > MAX_TRANSACTION_AMOUNT or amount < 0
final static short sw_invalid_transaction_amount = 0x6a83;

// signal that the balance exceed the maximum
final static short sw_exceed_maximum_balance = 0x6a84;
// signal the the balance becomes negative
final static short sw_negative_balance = 0x6a85;
Ernewein
Ludovic
III Les applications

Autour des JavaCards Page 30



Dclaration des variables
On declare ici des variables telles que balance qui va representer le solde du compte,
ou pin qui est un objet de type OwnerPIN, qui est une classe qui contient diIIerentes methodes
tres utiles pour la manipulation des codes.
/* instance variables declaration */
OwnerPIN pin;
short balance;

Cration d'un constructeur
Comme en Java on a besoin d'un constructeur pour creer des objets, il est aussi en
charge de leur initialisation et du lancement de l'instance de l'applet.
private Wallet (byte[] bArray,short bOffset,byte bLength){

// It is good programming practice to allocate
// all the memory that an applet needs during
// its lifetime inside the constructor
pin = new OwnerPIN(PIN_TRY_LIMIT, MAX_PIN_SIZE);

// The installation parameters contain the PIN
// initialization value
pin.update(bArray, bOffset, bLength);
register();

} // end of the constructor

L'instanciation des objets dans le constructeur est recommandee pour eviter les
problemes d'allocation de memoire lors de l'execution de l'applet.
Avant de quitter le constructeur on implemente la methode register (), qui sert a s'enregistrer
aupres du JCRE.


Installation d'un applet

Cette methode est l'equivalente d'un Main en Java. C'est le point d'entree de l'applet
qui permet la creation de l'instance de l'applet le lancement du constructeur et donc
l'enregistrement aupres du JCRE.


Ernewein
Ludovic
III Les applications

Autour des JavaCards Page 31



public static void install(byte[] bArray,
short bOffset, byte bLength){
// create a Wallet applet instance
new Wallet(bArray, bOffset, bLength);
} // end of install method

Cette methode utilise Trois parametres :
bArray : un tableau d'octets qui contient les parametres d'installation.
bOIIset : une variable de type short qui contient un oIIset sur le tableau.
bLength : une variable de type byte qui contient la longueur en octets des donnees en
parametres.

Slection et dslection de l'applet

Cette etape se passe apres l'installation, une Iois que l'applet est memorise sur la carte
et que l'on veut y acceder. Il Iaut pour cela envoyer une APDU select () au JCRE en precisant
l'AID de l'applet qui nous interesse dans la carte. Si le JCRE trouve un applet correspondant a
l'AID que l'on veut il lance la methode select () qu'il va trouver dans celui-ci.
Ensuite c'est l'applet qui va repondre au JCRE pour dire si il est en etat ou non pour
traiter la requte a l'aide d'un booleen qui est vrai si l'applet peut traiter cette requte et Iaux si
il ne peut traiter la requte. Ensuite le JCRE peut repondre a l'application cliente pour
conIirmer ou non que l'applet peut traiter ces APDU de commande.
Pour notre exemple la condition est que le code pin ne soit pas bloque.
public boolean select() {

// The applet declines to be selected
// if the pin is blocked.
if ( pin.getTriesRemaining() == 0 )
return false;

return true;

}// end of select method

Ernewein
Ludovic
III Les applications

Autour des JavaCards Page 32



La methode deselect () permet de Iermer la communication entre l'applet et le client
pour pouvoir par exemple Iaire l'appel d'un autre applet.
public void deselect() {

// reset the pin value
pin.reset();

}

Requtes de process

Quand on a reu une conIirmation de la selection on peut envoyer des donnees grace a
la methode process.
public void process(APDU apdu) {

Cette methode resume le deroulement de l'applet, dans le cas de notre exemple le
deroulement est le suivant :

Gestion de la trame en entree :
Quand le JCRE reoit une APDU il la memorise dans un buIIer. Les cinq premier
octets sont le CLA, INS, P1, P2 et Lc. Ensuite le JCRE retransmit a la methode process ces
donnees encapsulees dans une nouvelle trame et communique un pointeur sur les donnees
byte buffer[] = apdu.getBuffer();

Utilisation du header :
La methode process examine ensuite les deux premiers octets transmis, le CLA et INS.
Si la valeur de CLA est 0 et que la valeur de INS est 0xA4, la methode redonne le contrle au
JCRE car il s'agit d'une select () APDU.
// check SELECT APDU command
if ((buffer[ISO7816.OFFSET_CLA] == 0) &&
(buffer[ISO7816.OFFSET_INS] == (byte)
(0xA4)) )
return;


Ernewein
Ludovic
III Les applications

Autour des JavaCards Page 33



L'utilisation des constantes ISO7816.OFFSETCLA et ISO7816.OFFSETINS permet
de simpliIier l'acces a certains octets de la trame, en eIIet elles servent a indexer les octets
Irequemment utilises pour le decodage des APDU.
Ensuite la methode process veriIie la valeur des octets pour voir si la valeur de CLA
est conIorme a celle attendue, sinon elle renvoie une erreur au JCRE qui notiIie que le CLA
de la requte n'est pas supporte par l'applet.
// verify the reset of commands have the
// correct CLA byte, which specifies the
// command structure
if (buffer[ISO7816.OFFSET_CLA] != Wallet_CLA)
ISOException.throwIt
(ISO7816.SW_CLA_NOT_SUPPORTED);

Slection de l'action

Si le CLA est correct alors la methode process veriIie l'octet INS pour voir quelle instruction
executer. Si la valeur n'est pas reconnue on envoie une exception comme APDU reponse.
switch (buffer[ISO7816.OFFSET_INS]) {
case GET_BALANCE: getBalance(apdu);
return;
case DEBIT: debit(apdu);
return;
case CREDIT: credit(apdu);
return;
case VERIFY: verify(apdu);
return;
default: ISOException.throwIt
(ISO7816.SW_INS_NOT_SUPPORTED);
}

} // end of process method

Un exemple : pour crditer votre compte

Cette methode reoit comme parametre une APDU qui doit contenir la valeur a
crediter sur le compte, on la traite de la Iaon suivante :

Ernewein
Ludovic
III Les applications

Autour des JavaCards Page 34



Cette methode commence par veriIier que le pin est valide. Si ce n'est pas le cas la
methode renvoie une exception inIormant que le code pin n'est pas valable.
// access authentication
if ( ! pin.isValidated() )
ISOException.throwIt(
SW_PIN_VERIFICATION_REQUIRED);

Ensuite la methode se sert du buIIer pour extraire les donnees utiles.
// Lc byte denotes the number of bytes in the
// data field of the command APDU
byte numBytes = buffer[ISO7816.OFFSET_LC];
// indicate that this APDU has incoming data
// and receive data starting from the offset
// ISO7816.OFFSET_CDATA following the 5 header
// bytes.

Une Iois a ce point la methode est prte a recevoir les donnees, soit le montant a
crediter sur le compte. Ceci ce Iait par le mot-cle setIncomingAndReceive, qui deIinit une
methode qui v lire le buIIer et renvoyer le nombre d'octets qu'elle a lue. Pour cet applet la
methode ne lit qu'un seul octet car l'octet Lc qui indique la longueur du champ de donne a la
valeur 1.La methode veriIie que Lc correspond a la longueur donnee par
setIncomingAndReceive, sinon elle envoie une exception.
byte byteRead =
(byte)(apdu.setIncomingAndReceive());

// it is an error if the number of data bytes
// read does not match the number in Lc byte
if ( ( numBytes != 1 ) || (byteRead != 1) )
ISOException.throwIt(ISO7816.SW_WRONG_LENGTH);



Ernewein
Ludovic
III Les applications

Autour des JavaCards Page 35



Quand tout est veriIie la methode va pouvoir enIin acceder aux donnees. Elle veriIie
que le montant a crediter ne depasse pas le maximum autorise ou n'est pas negatiI. Elle veriIie
aussi que la balance du compte ne depassera pas le montant maximum apres avoir ete credite.
Si ces conditions sont validees la methode credite le compte.
// get the credit amount
byte creditAmount =
buffer[ISO7816.OFFSET_CDATA];
// check the credit amount
if ( ( creditAmount > MAX_TRANSACTION_AMOUNT)
|| ( creditAmount < 0 ) )
isoexception.throwit
(sw_invalid_transaction_amount);
// check the new balance
if ( (short)( balance + creditamount)
> MAX_BALANCE )
ISOException.throwIt
(SW_EXCEED_MAXIMUM_BALANCE);
// credit the amount
balance = (short)(balance + creditAmount);
} // end of deposit method

Ici on retrouve une nouvelle constante de l'ISO7816: OFFSETCDATA qui est un
index pointant directement sur le champ de donnees de l'APDU.
Quand l'operation est terminee la methode renvoie une valeur des SW egale a 0x9000,
ce qui signiIie que l'operation c'est bien deroule. Si ce n'est pas le cas la methode renvoie une
exception que l'on peut identiIier grce a la valeur des SW.

III.2 Exercice

Pour l'entranement a la programmation j'ai imagine un petit exercice pour prendre en
main Iacilement la technologie. Malheureusement je rencontre encore des problemes au
niveau de la selection des applet au travers du JCRE. Je propose touteIois ce petit exercice
pour tester la matrise de ceux que cela interesse.
Ernewein
Ludovic
III Les applications

Autour des JavaCards Page 36


Sujet : Dans cet exercice, je vous propose de programmer un applet nomme Hello. Cet
applet devra reagir a deux types de messages. Tout d'abord il devra veriIier que les messages
qu'il traitera seront de la classe 0x80. Ensuite l'applet devra reagir au type de message qu'il
recevra dans un cas il transmettra le message Hello, dans l'autre il transmettra le message Bye.

Regles pour tout type de developpement:
Toujours implementer install, select et deselect.
Bien choisir les octets CLA et INS.
Ecrire proprement la methode process.
Ne pas oublier d'allouer les ressources dans le constructeur.
Toujours eIIectuer un register aupres du JCRE.
Toujours veriIier la longueur des donnees (surtout entrantes).
Se servir avec precaution du buIIer APDU.
Toujours caster les valeurs non typees (ex 0 en (byte) 0).

Solution proposee :

package testpack;

import javacard.framework.*;

public class Hello extends Applet {

private byte[] message1,message2;
protected Hello ()
{
message1= new byte[5];
message2= new byte[3];
message1 [0]= 0x48;
message1 [1]= 0x65;
message1 [2]= 0x6c;
message1 [3]= 0x6c;
message1 [4]= 0x6f;
message2 [0]=0x42;
message2 [1]=0x79;
message2 [2]=0x65;
register();
}
public static void install(byte[] bArray, short bOffset, byte bLength) {
new Hello ();
}



Ernewein
Ludovic
III Les applications

Autour des JavaCards Page 37

public boolean select() {

return true;

}

public void deselect() {

}

public void process(APDU apdu) {
byte buf[] = apdu.getBuffer();
if (buf[ISO7816.OFFSET_CLA] != 0x80)
ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED);
switch (buf[ISO7816.OFFSET_INS]) {

case (byte) 0x40:
Util.arrayCopy(message1,(short)0,buf,ISO7816.OFFSET_CDATA,(short)5);
apdu.setOutgoingAndSend(ISO7816.OFFSET_CDATA,(short)5);
break;



case (byte) 0x50:
Util.arrayCopy(message2,(short)0,buf,ISO7816.OFFSET_CDATA,(short)3);
apdu.setOutgoingAndSend(ISO7816.OFFSET_CDATA,(short)3);
break;


default:
ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
}
}
}

Ernewein
Ludovic
Conclusion

Autour des JavaCards Page 38




Conclusion:

Ce projet aura ete une tres bonne experience. Il m'a permit de m'interesser a un sujet
qui n'est typiquement pas un cas d'ecole car trop long pour tre realise en cours.
J'ai egalement pus me rendre compte que cette technologie possede beaucoup d'attraits
pour les personnes desireuses de developper des applications portables et securises dans
l'univers proIessionnel car elle est simple d'utilisation et possede une grande stabilite et une
Iorte opacite du contenu Iace a l'environnement exterieur.

Ma progression qui m'a tout d'abord pousse a me documenter sur le sujet m'a permis
de comprendre un peu mieux le Ionctionnement de ce type d'applications, ensuite l'utilisation
d'eclipse pour le developpement des applets m'aura Iait decouvrir un nouvel environnement de
developpement pour les applications Java ce qui j'en suis sur sera un plus durant mon stage
puis durant les premiers temps de ma vie active. EnIin l'aboutissement de ce projet aura ete le
codage des applets et la comprehension d'applets complexes, malgre la venue de diIIicultes
liees a mon niveau de debutant dans le domaine et au manque de temps pour traiter
convenablement du sujet.

J'espere touteIois avoir reussi a assurer la perennite de ce projet en realisant ce rapport,
qui pourra tre une aide precieuse pour les personnes desireuses de reprendre mon travail la
ou il s'est arrte.
Ernewein
Ludovic
Bibliographie

Autour des JavaCards Page 39



Bibliographie


Ensemble des sites Internet utilises pour la collecte d'inIormations.

http://developers.sun.com
http://java.sun.com/products/javacard
http://tinyurl.com
http://www.3ie.Ir
http://sardes.inrialpes.Ir
http://www.javacardIorum.org
http://www.javaIr.com
http://www.supinIo-project.com

You might also like