tp java card 1_2 _ utilisation du javacard development kit 2.2

12
29/03/13 TP Java Card 1/2 : Utilisation du Javacard Development Kit 2.2.2 de Sun | Groupe SEN sen.enst.fr/node/408 1/12 Accueil :: Enseignement :: Cycle master :: ELECINF359 BCI Cycle master CSMLP ELEC222 ELEC223 ELEC342 - SOC ELEC390 ELECINF344 / ELECINF381 ELECINF359 Etudes biblio 2010-2011 Etudes biblio 2011-2012 Mini-projets 2008-2009 Mini-projets 2009-2010 TD SCA TP Javacard 1/2 TP Javacard 2/2 ELEC920 / NSS04 Projets matériels Les stages TEL Nom d'utilisateur : Mot de passe : Se conne Groupe SEN Systèmes Électroniques Numériques TP Java Card 1/2 : Utilisation du Javacard Development Kit 2.2.2 de Sun Objectif du TP Ce TP a pour but de vous initier à la programmation de cartes Java (Javacard) à l'aide d'un environnement de développement gratuit vous permettant de développer des applets (appelées parfois cardlets car elles s'exécutent sur la carte à puce), développer des applications clientes pour communiquer avec les cartes et de les tester à l'aide d'un simulateur de carte. Ce sujet est inspiré du tutoriel "Introduction à la programmation de Javacard sous Windows" écrit par un ancien élève de l'école et publié sur le site developpez.com (http://julienb.developpez.com/tutoriels/java/introjavacard/). Quelques rappels Les APDU Les échanges entre carte et terminal se font au moyen d'APDUs (suite d'octets respectant nu format défini dans le standard ISO7816-4). Nous utiliserons dans ce TP l'APDU de requête suivante : Offset 1 2 3 4 5 6 ... 6 + (Lc – 1) 6 + Lc Données C LA INS P1 P2 Lc Données (si Lc > 0) Le Où : CLA = octet de classe défini pour des types de cartes particuliers (exemples : 0xBC pour les cartes vitales, 0x0A pour les cartes SIM, 0x00 pour les Mastercard/Visa) INS = octet d'instruction P1 = paramètre 1 P2 = paramètre 2 Lc = taille des données (0x00 si pas de données) Le = taille maximale des données pour la réponse La carte répond en envoyant les données de réponse (si il y a) suivies d'un status word codé sur 2 octets (nommés SW1 et SW2). Généralement, SW1 indique le type de réponse et SW2 fournit des informations supplémentaires. Quelques exemples de status word : SW1 SW2 Signification 0x90 0x00 Pas d'erreur 0x61 xx Pas de problème 0x62 ou 0x63 xx Avertissement 0x64 ou 0x64 xx Erreur d'exécution 0x67 xx Commande incorrecte Identification des applets Les applets sont identifiées par un AID (Applet ID) composé de 16 octets. Les 5 premiers correspondent à l'ID du fournisseur d'application et les 11 suivants identifient l'application. Afin de pouvoir communiquer avec elle, une applet doit être préalablement sélectionnée à l'aide de l'APDU SELECT : C LA INS P1 P2 Lc Données 0x00 0xA4 0x04 0x00 0x10 AID sur 16 octets Limitations de la machine virtuelle Javacard 2.x Le framework Javacard 2.x est un sous-ensemble du langage Java. Il ne supporte que les éléments suivants : types primitifs boolean, byte et short les tableaux à une dimension les packages, classes, interfaces, exceptions l'héritage, les objets virtuels, la surcharge la création d'objets (new) mais uniquement dans son constructeur/sa méthode d'installation (donc pas de création d'objets en runtime) Ainsi les types long, double, float, char, l'objet String et les tableaux à plusieurs dimensions ne sont pas autorisés. Environnement de développement utilisé dans ce TP Afin de pouvoir développer une applet Javacard et une application cliente, nous allons installer l'environnement de développement Javacard. Les outils utilisés dans ce TP sont : le Java Card Development Kit 2.2.2 l'environnement de développement Eclipse version 3.2 le plugin d'intégration Eclipse-JCDE version 0.1 Instructions d'installation Enseignement Connexion utilisateur Vie du groupe SEN Archives BCI Cycle master Projets matériels Les stages TEL Cours en ligne A ide au choix des parcours Affectations de projets Guides, manuels, mementos Projets Recherche Site web COMELEC Site web ENST Intranet COMELEC Wiki COMELEC

Upload: zembe-cisse

Post on 18-Feb-2015

243 views

Category:

Documents


5 download

TRANSCRIPT

Page 1: TP Java Card 1_2 _ Utilisation Du Javacard Development Kit 2.2

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

Page 2: TP Java Card 1_2 _ Utilisation Du Javacard Development Kit 2.2

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

Page 3: TP Java Card 1_2 _ Utilisation Du Javacard Development Kit 2.2

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

Page 4: TP Java Card 1_2 _ Utilisation Du Javacard Development Kit 2.2

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

Page 5: TP Java Card 1_2 _ Utilisation Du Javacard Development Kit 2.2

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

Page 6: TP Java Card 1_2 _ Utilisation Du Javacard Development Kit 2.2

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

Page 7: TP Java Card 1_2 _ Utilisation Du Javacard Development Kit 2.2

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

Page 8: TP Java Card 1_2 _ Utilisation Du Javacard Development Kit 2.2

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

Page 9: TP Java Card 1_2 _ Utilisation Du Javacard Development Kit 2.2

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

Page 10: TP Java Card 1_2 _ Utilisation Du Javacard Development Kit 2.2

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

Page 11: TP Java Card 1_2 _ Utilisation Du Javacard Development Kit 2.2

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

Page 12: TP Java Card 1_2 _ Utilisation Du Javacard Development Kit 2.2

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