Programmation des cartes à puce – JavaCard
TP3 - Programmation d’une application coté client – (V2.0)
Ramzi Mahmoudi
([Link]@[Link])
TP3 - Programmation d’une application coté client
But de ce TP :
Maintenant que nous avons programmé notre applet Javcard compteur, nous pouvons
coder une application cliente : l'équivalent du terminal bancaire si notre Javacard était
une carte de paiement.
I.1 Création de l’application client sous Eclipse :
a) Création d’un nouveau projet :
▪ Créons 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 (Application client par exemple) puis cliquer sur Finish :
2
b) Ajout de la librairie « apduio » dans le classpath
Afin de pouvoir utiliser les classes servant à communiquer avec notre Javacard, il faut ajouter
la bibliothèque [Link] (présente dans le répertoire C:\JCDK \java_card_kit-2_2_2\lib).
▪ Pour cela, faire un clic droit sur notre projet Application Client puis Propriétés... :
▪ Dans la section Java Build Path, sélectionner l'onglet Librairies et cliquer sur le
bouton Add External Jars ... :
3
▪ Sélectionner alors le fichier [Link], valider et appuyer sur le bouton OK.
c) Création de la classe principale :
Tout d'abord, créons un nouveau package. Pour cela, faire un clic droit sur notre
projet, puis New et Package :
▪ Donner un nom au package (monpackageclient par exemple ), puis valider à l'aide du
bouton Finish :
▪ Créons maintenant la classe principale de notre application. Pour cela, faire un clic droit
sur le package créé puis New et Class :
4
▪ Donnons un nom à notre nouvelle classe (Maclasse par exemple ), cocher la case public
static void main puis cliquer sur Finish :
L'application cliente se trouve sur le terminal qui communique avec le serveur (applet carte),
on peut séparer l’écriture de notre application en plusieurs étapes :
Étape 1 - Connexion :
La connexion au simulateur se fait via une socket. Le simulateur écoute par défaut sur le
port 9025. La classe que nous utiliserons pour les échanges de données est CadT1Client.
/* Connexion - Javacard */
CadT1Client cad;
Socket sckCarte;
try {
sckCarte = new Socket("localhost", 9025);
[Link](true);
BufferedInputStream input = new
BufferedInputStream([Link]());
BufferedOutputStream output = new
BufferedOutputStream([Link]());
cad = new CadT1Client(input, output);
} catch (Exception e) {
[Link]("Erreur : impossible de se
connecter a la Javacard");
return;
}
/* Mise sous tension de la carte */
try {
[Link]();
} catch (Exception e) {
5
[Link]("Erreur lors de l'envoi de la
commande Powerup a la Javacard");
return;
}
Etape 2 - Sélection
La sélection d'applet se fait en envoyant la commade SELECT APDU (voir annexe A)
/* Sélection de l'applet */
Apdu apdu = new Apdu();
[Link][[Link]] = 0x00;
[Link][[Link]] = (byte) 0xA4;
[Link][Apdu.P1] = 0x04;
[Link][Apdu.P2] = 0x00;
byte[] appletAID = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
0x07, 0x08, 0x09, 0x00, 0x00 };
[Link](appletAID);
[Link](apdu);
if ([Link]() != 0x9000) {
[Link]("Erreur lors de la sélection de l'applet");
[Link](1);
}
Etape 3 - Invocation des services implémentés
Il suffit pour chaque opération d'initialiser correctement une instance de l'objet APDU
et de l'envoyer à la carte via l'instance de la classe CadT1Client.
/* Menu principal */
boolean fin = false;
while (!fin) {
[Link]();
[Link]("Application cliente
Javacard");
[Link]("----------------------------
");
[Link]();
[Link]("1 - Interroger le compteur");
[Link]("2 - Inrementer le compteur");
[Link]("3 - Decrementer le compteur");
[Link]("4 - Reinitialiser le
compteur");
[Link]("5 - Quitter");
6
[Link]();
[Link]("Votre choix ?");
int choix = [Link]();
while (!(choix >= '1' && choix <= '5')) {
choix = [Link]();
}
apdu = new Apdu();
[Link][[Link]] = Maclasse.CLA_MONAPPLET;
[Link][Apdu.P1] = 0x00;
[Link][Apdu.P2] = 0x00;
[Link](0x7f);
switch (choix) {
case '1':
[Link][[Link]] =
Maclasse.INS_INTERROGER_COMPTEUR;
[Link](apdu);
if ([Link]() != 0x9000) {
[Link]("Erreur :
status word different de 0x9000");
} else {
[Link]("Valeur du
compteur : " + [Link][0]);
}
break;
case '2':
[Link][[Link]] =
Maclasse.INS_INCREMENTER_COMPTEUR;
[Link](apdu);
if ([Link]() != 0x9000) {
[Link]("Erreur :
status word different de 0x9000");
} else {
[Link]("OK");
}
break;
case '3':
[Link][[Link]] =
Maclasse.INS_DECREMENTER_COMPTEUR;
[Link](apdu);
if ([Link]() != 0x9000) {
[Link]("Erreur :
status word different de 0x9000");
} else {
[Link]("OK");
}
break;
7
case '4':
[Link][[Link]] =
Maclasse.INS_INITIALISER_COMPTEUR;
byte[] donnees = new byte[1];
donnees[0] = 0;
[Link](donnees);
[Link](apdu);
if ([Link]() != 0x9000) {
[Link]("Erreur :
status word different de 0x9000");
} else {
[Link]("OK");
}
break;
case '5':
fin = true;
break;
}
}
Etape 4 - Mise hors tension
La déconnexion de la Javacard se fera via la méthode powerDown() de la
classe CadT1Client :
/* Mise hors tension de la carte */
try {
[Link]();
} catch (Exception e) {
[Link]("Erreur lors de l'envoi de la
commande Powerdown a la Javacard");
return;
}
8
I.2 Utilisation de l'application cliente avec un simulateur - JCWDE
Afin de pouvoir lancer le simulateur de notre applet en ligne de commande, nous allons
créer un fichier "de configuration". Il permet de lister les applets Javacard à installer pour
la simulation et de spécifier leurs AID respectifs.
▪ Créons notre fichier que nous appellerons "[Link]" (répertoire parent du
package contenant le fichier class de l'applet card « .\workspace\TP Javacard\bin ») . Il
contiendra la ligne suivante :
[Link] 0x01:0x02:0x03:0x04:0x05:0x06:0x07:0x08:0x09:0x00:0x00
▪ Nous pouvons maintenant lancer notre simulateur, en prenant soin de nous placer dans
le bon répertoire (répertoire parent du package contenant le fichier class de l'applet
« .\workspace\TP Javacard\bin ») :
▪ Maintenant que notre simulateur est lancé, lançons notre application cliente :
▪ Commençons par interroger le compteur : tapons 1 puis validons :
9
▪ Le compteur est bien à 0. Incrémentons maintenant le compteur 3 fois puis
décrémentons-le une fois. Lorsque nous réinterrogeons 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 réception de la commande
"powerdown" :
jcwde exiting on receipt of power down command.
10
Remarque:
Le simulateur JCWDE ne permet pas de conserver l'état de la carte. Si nous le relançons,
le compteur sera à 0 et non à 2.
11