Autours Des Java Cards

Embed Size (px)

Citation preview

ERNEWEIN Ludovic 3A SERTR Mars 2007 Projet de Iin d'etude : Autour desJavaCards Tuteur : M. DuIner i Remerciements Jesouhaitetoutd'abordremercierMDuInermontuteurpouravoirproposeceprojet qui Iut d'un tres grand intert. Je souhaite egalement remercier M RebeuI qui lors de la soutenance de Decembre m'a permit de me rendre compte des details importants que j'avais trop vite negliges. Je souhaite egalement remercier les personnes qui ont repondu a mes questions posees sur Internet. ii Rsums Resume : CeprojettraitedelatechnologieJavaCardquiconsisteaudeploiementd'appletssur decartesapuceauIormatSmartcard.Vousytrouvereztoutd'abordunrecapitulatiIdes generalites sur la technologie des JavaCard, qui presente tout les aspects qui sont necessaires pourcommencerledeveloppementd'applicationdanscettetechnologie.Ensuitevousy trouverezegalementuntutorialquej'aielaboreaIindeprendreenmainIacilementet rapidement les outils qui vont servir tout au long du developpement. EnIin la derniere partie estconsacreaudeveloppementdesappletsonyretrouveunappletdesimulationpourune cartedecreditdontleIonctionnementaetedetaillepourseIamiliariserIacilementavecla logique de developpement, ainsi qu'un exercice propose aux personnes desireuse de tester leur comprehension de la technologie. Abstract : ThisprojectisaboutJavaCardtechnologywhichconsistswiththedeploymentoI appletonsmartcardswiththereservedSmartcardIormat.FirstoIall,youwillIinda summaryoIthegeneralinIormationthatIhaveIoundedontheJavaCardtechnology,which presentsalltheaspectswhicharenecessarytobeginthedevelopmentoIapplicationinthis technology. Thenyou will also Iind a tutorial, whichI made in order to discover,easily and quicklythetoolswhichwillbeusedalloverthelengthoIthedevelopment.Finallythelast partisdevotedtothedevelopmentoItheapplet.InthispartyouwillIindarealsimulation appletIoracreditcard,whoseoperationaredetailtoIamiliarizeeasilywiththelogicoI development,aswellasoneexercisesuggestedtothepeople,whoseareeagertotesttheir comprehension oI the technology. iii Sommaire Introduction 1 I Generalites sur la technologie JavaCard 2 I.1 Historique 2 I.2 Architecture des JavaCards 2 I.3 DiIIerences avec Java 4 I.4 L'API JavaCard 6 I.5 Communication de la JavaCard avec son environnement 7 I.6 Cycle de vie d'un applet 12 II L'environnement de developpement 16 II.1 Choix de l'environnement de developpement 16 II.2 Tutorial Eclipse 16 II.3 Exemple de lancement d'un applet sous Eclipse 22 III Les applications 28 III.1 DescriptiI d'un applet 28 III.2 Exercice 35 Conclusion 38 Bibliographie 39 Ernewein Ludovic Introduction Autour des JavaCardsPage 1 Introduction: LebutdemonprojetestdemeIamiliariseretdedevelopperlaprogrammation d'applications ecrites en Java pour cartes a puces SmartCards, grce a la technologie JavaCard mise au point en 1997 et qui a connu un gain d'intert a partir de 1999. Les objectiIs Iixes en debut de projet avec le tuteur portaient tout d'abord sur l'etude de l'environnement de cette technologie. En eIIet, ce sujet etait tres meconnu par l'ensemble des encadrant, il s'agissait donc d'une premiere approche d`ou le titre Ilou du projet : Autour des JavaCards. La premiere etape Iut donc de degager une marche a suivre pour l'ensemble du projet. Uneprogressionlogiquedel'etudeIutainsimiseaupoint:Toutd'aborddesrecherches generales sur le sujet, ensuite l'etude du materiel reu pour le developpement des applications puis une derniere etape purement applicative. Danslespagesquivontsuivrejetraiteraitoutd'abordduIruitdemesrecherchesen presentant la documentation rassemblee et condensee pour une comprehension rapide du sujet puis pour approIondir je procederais au detail du Ionctionnement de cette technologie. Dans une seconde etape je presenterais un tutorial d'utilisation pour que les personnes quitravaillerontamasuitebeneIicientd'uneaideelaboreesurl'environnementde developpement et la gestion des applications. EnIinjeprocederaisaudetaild'uneapplicationquel'onpeutdevelopperdanscette technologie et je proposerais un petit exercice pour la prise en main de la technologie. Ernewein Ludovic I Generalites Autour des JavaCardsPage 2 I Gnralits sur la technologie 1avaCard I.1 Historique Enmars1996,unpetitgrouped'ingenieursdeSchlumbergerauTexasontsouhaite simpliIier la programmation des cartes a puces tout en preservant la securite des donnees. La solution adoptee a Iinalement ete Java. Malheureusement vu la taille de la memoire disponible surunecarteapuce,seulementunsous-ensembledeJavapouvaittreutilise(latailledela JVM (Java Virtual Machine) et du systeme de runtime ne devant pas depasser 12 ko). C'estainsiqu'estneJavaCard,lepremierlangageobjetsadapteauxcartesapuces. SchlumbergeretGemplussontaussilesco-Iondateursen1997duJavaCardForum (http://www.javacardIorum.org)quiregroupelesIabriquantdesilicium,lesencarteursetles clients,etquirecommandedesspeciIicationsaJavaSoIt(ladivisiondeSunaquiappartient JavaCard) en vue d'obtenir une standardisation du langage. I.2 Architecture des JavaCards SpeciIications: Les JavaCards sont des cartes a puce de type smart card, leur CPU permet de gerer des donnees de 8, 16 ou 32 bits. Le Ionctionnement classique veut que l'on utilise le plus souvent lesdeuxpremieresoptions(soit1ou2octets)carlacarteIonctionnesurunprincipede decodage des octets (un peu comme un langage assembleur). Selonlesmodelesondisposedeplusoumoinsderessources(memoires)pourle stockage des applets et leur execution sur la machine virtuelle. Donnees moyennes sur la memoire disponible: RAM : 512 Ko EEPROM/Flash : 128/256 Ko ROM : 256/512 Ko Ernewein Ludovic I Generalites Autour des JavaCardsPage 3 Comme il est dit precedemment la carte est basee sur un interpreteur de bytecode java, son architecture ce presente sous cette Iorme : Onretrouvedonclamachinevirtuellejava(JavaVM)audessusdusysteme d'exploitation. Comme pour les ordinateurs, chaque carte d'architecture devra avoir sa propre machinevirtuelle.LamachinevirtuelleJavaCardestidentiqueacelledeJavamaisest decoupee en deux parties : une sur la carte, l'autre hors carte ("Java Card Converter"). Il est donc necessaire de pre-compiler les applications avant de les charger sur la carte: Schema de presentation plus detaille : . .Ernewein Ludovic I Generalites Autour des JavaCardsPage 4 Laprogrammations'eIIectuesurn'importequelenvironnementdeprogrammation dans lequel onconstituedes Iichiers avec pour extension "java" (JBuilder, Eclipse, etc. dans ce projet nous nous servons d'Eclipse SDK version 3.2.1 qui est la version recommande par le Iabriquant de la carte). On les compile ensuite aIin de Iournir le bytecode. Ce bytecode passe ensuite dans la machine virtuelle "hors carte" qui est decoupee en 3 modules ayant chacun un rle precis : Le VeriIieur de bytecode : Il utilise le veriIieur de bytecode Java "classique"Il contrle le sous-ensemble JavaCard (langage API) Le Convertisseur en trois phases : Preparation : initialise les structures de donnees de la JCVMOptimisation : ajuste l'espace memoire.Edition de liens : resout les reIerences symboliques a des classes deja presentes dans la carte (via "image" de la carte). Le Signeur : Il valide le passage par le veriIicateur et le convertisseur par une signature veriIiee par la carte au moment du chargement.Le programme Iournit alors des Iichiers ".cap" qui peuvent tre charges dans la carte. I.3 DiIIerences avec Java LaconIigurationminimaleIixeepourIaireIonctionneruneJavaCardest:16Kode ROM,8Kod'EEPROMet256octetsdeRAM. IletaitdoncimperatiIdereduirel'APIJava aIin de pouvoir loger la machine virtuelle Java sur la carte. On retrouve donc les possibilites d'implementation suivantes : Ernewein Ludovic I Generalites Autour des JavaCardsPage 5 Pas de chargement dynamique de classes : L'allocationdynamiqued'objets(new)estsupporteemaispasderamassemiettenide desallocation explicite (c'est a dire que la memoire allouee ne peut pas tre recuperee). La methode Iinalize () n'est pas supportee. Types de base :Byte (8bits), short (16 bits), Int (32 bits) et boolean. Pas de types char (ni de classe String), double, Iloat ni long. Les objets de base disponibles sont : java.lang.Object. java.lang.Throwable. Les tableaux sont limites : Ils ne peuvent avoir qu'une dimension. Les elements supportes : uniquement les types de bases supportes par JavaCard. La taille maximum est de 2`15 elements. Le mecanisme d'heritage est semblable a java, on conserve donc : La surcharge de methodes, les methodes abstraites et les interIaces. L'invocation de methodes dynamique. L'utilisation des mots cles instanceoI, super et this. Pas de classe Thread, pas de Ionctionnalites de synchronisation (synchronised, wait...). Toute application JavaCard est donc monothread Securite : Notions de paquetages et operateurs de portee identiques a java (protected, private et public). PasdeclasseSecurityManager,lapolitiquedesecuriteestdirectementimplementeedansla machine virtuelle : applet Iirewall. Ernewein Ludovic I Generalites Autour des JavaCardsPage 6 Mecanismes d'exceptions supportesLesexceptionspeuventtredeIinies(ajoutdeextendsThrowable),propagees(throw)et interceptees (catch). LesclassesThrowable,ExceptionetErrorsontsupporteesetcertainesdeleurssousclasses aussi (package java.lang). I.4 L'API JavaCard Elle contient un package principal pour programmer une applet carte, des extensions et des API utilitaires. Package principal : favacard.framework : Il deIinit les classes AID, APDU, Applet, ISO, PIN, JCSystem et Util. Contient egalement les classes exception. Des extensions de l'API : favacardx.framework : permet la gestion des Iichiers selon la norme ISO 7816-4. favacardx.crvpto:assurelagestiondesclespubliquesetprivees,lagenerationdenombres aleatoires, implemente des Ionctions de chiIIrement et de hachage optimisees. Les API utilitaires : public final class JCSvstem : cette classe contient les methodes statiques pour interagir avec le JCRE. public class Util : cette classe contient des methodes statiques utiles optimisees pour la carte : Copie, comparaison de tableaux de bytes, creation de short a partir de byte. public final class AID :Encapsule des identiIiants d'applications carte conIormes a la norme ISO 7816-5. public class ISO7816 . Champs statiques de constantes conIormes aux normes ISO 7816-3 et ISO 7816-4. publicabstractclassPIN:Utilepourlarepresentationd'uncodesecret(tableaud`octets): attribut OwnerPIN : code secret pouvant tre mis a jourErnewein Ludovic I Generalites Autour des JavaCardsPage 7 I.5 Communication de la JavaCard avec son environnement LaJavaCardestunmoduledetraitementreactiIasonenvironnement,eneIIetc'est une application externe qui va lancer l'appel des applets memorisees dans la carte. Lorsqu'undispositiIexterneestcompatible,ilvareagiralapresenced'uneJavaCard dans son lecteur de carte, et va envoyer une requte a la carte pour executer les applets qui lui sont necessaires. Chaque applet memorise dans une JavaCard est speciIique a un programme appelant, en eIIet on utilise une numerotation unique des applet grce a un protocole appele AID, ainsi lorsque l'on insert une JavaCard dans un lecteur, on obtient une reaction positive uniquement si la carte contient l'applet demande par l'application externe. SpeciIication des AID : DanslatechnologieJavaCard,chaqueappletestidentiIieeetselectionneeparun identiIicateur(AID).Demme,achaquepaquetageJavaestassigneunAID.Cette convention de nommage est conIorme a la speciIication de la carte a puce deIinie dans l`ISO 7816. Un AID est une sequence d`octets allant de 5 a 16 octets. Son Iormat est : C'est l`ISO qui gere l`aIIectation des RID aux compagnies, chaque compagnie obtient sonpropreetuniqueRID.Aprescelac'estlescompagniesgerentl`aIIectationdesPIXpour leurs AID. Ernewein Ludovic I Generalites Autour des JavaCardsPage 8 Ex : Si le RID attribue a une societe est : 0x4E, 0x78, 0x34, 0xA2, 0x27, alors tous les applets quiserontcreesparlasuiteserontcomposesdeces5octetssuivisdeleursoctets d'identiIications :0x4E, 0x78, 0x34, 0xA2, 0x27, 0x00, 0x00, 0x00, 0x00, 0x01 0x4E, 0x78, 0x34, 0xA2, 0x27, ,0x00, 0x00, 0x01 Fonctionnement de la communication avec l'environnement : Un applet qui tourne sur une cartea puce communique avec l`application en utilisant le protocole APDU (Application Protocol Data Units deIini par l`ISO 7816). Les commandes APDU sont toujours par paire. Chaque paire contient une commande APDU, qui speciIie une requte, et une reponse APDU, qui retourne le resultat d`execution de lacommande.DanscemodedeIonctionnement,lescartessontreactives,ellesn`initient jamais des communications mais se contentent de repondre aux APDU du monde exterieur. Explicationssurleschemaci-dessous:L`applicationclienteenvoieunecommandeAPDU via le lecteur (CAD). La machine virtuelle en recevant une commande, passe la commande a l'applet concerne. L`applet traite la commande et retourne une reponse APDU a l`application. Ernewein Ludovic I Generalites Autour des JavaCardsPage 9 Format d'une APDU : Commande : CLA (1 octet): Classe d'instruction : structure et Iormat de la categorie d'APDU. INS (1 octet): Code de l'instruction. P1(1octet)etP2(1octet):Onpeuutiliserceschampspourdonnerdesprecisionssurle champ INS ou pour envoyer des donnees. Lc (1 octet): Nombre d'octets dans le champ donnees. Donnees (nb d'octets egal a valeur de Lc): Sequence de donnees additionnelles. Le (1 octet): Nombre maximum d'octets attendus dans le champ de donnees de la reponse. Reponse : Donnees (longueur variable Le): Sequence d'octets reus. SW1 (1 octet) et SW2 (1 octet): Status words : donne une inIormation sur l'etat du processus dans la carte. Il est important de noter que les valeurs des champs CLA, INS, P1, P2, SW1 et SW2 ne sont pas des valeurs aleatoires. En eIIet l'ISO 7816 deIinit des codes precis pour certains types de requtes, dont on peut donner une liste non exhaustive : Ernewein Ludovic I Generalites Autour des JavaCardsPage 10 Valeurs types de CLA dans l'ISO : ValeurClasse d'instruction 0x0n, 0x1nInstruction selon l'ISO 7816-4, Acces aux donnees et operations de securite De 0x20 a 0x7F Reserves 0x8n ou 0x9n Format utilise pour le developpement d'applications standard 0xAnInstructions speciIiques aux vendeurs ou pour applications standard De B0 a CFFormat utilise pour le developpement d'applications standard De D0 a FEInstructions speciIiques aux vendeurs ou pour applications standard FFReserve Dans la pratique on utilisera plutt des codes CLA superieurs a 0x80. Valeurs types de INS dans l'ISO quand CLA est compris entre 0x00 et 0x7F : ValeurDescription de la commande 0EErase Binary 20VeriIy 70Manage Channel 82External Authenticate 84Get Challenge 88Internal Authenticate A4Select File B0Read Binary B2Read Record(s) C0Get Response C2Envelope CAGet Data D0Write Binary D2Write Record D6Update Binary DAPut Data DCUpdate Record E2Append Record Ernewein Ludovic I Generalites Autour des JavaCardsPage 11 LecodagedesoctetsP1etP2dependensuitedelavaleurdeINS,unelisterecapitulantles diIIerentesvaleurspossiblespourcertainesinstructionssontrecapitulesdansletutorialde MOTechnojointaveclescartesdelapage25alapage29.JenepreIerepastraiterleur signiIication car elle n'apporte que peu de precisions sur le sujet qui nous interesse. Valeurs types de SW dans l'ISO : Valeur SW1 SW2 Type d'erreurCode 1avaCard 61 00Response bytes remainingSWBYTESREMAINING00 67 00Wrong lengthSWWRONGLENGTH 69 82Security condition not satisIiedSWSECURITYSTATUSNOT SATISFIED 69 83File invalidSWFILEINVALID 69 84Data invalidSWDATAINVALID 69 85Condition oI use not satisIiedSWCONDITIONSNOTSATISFIED 69 86Command not allowedSWCOMMANDNOTALLOWED 69 99Applet selection IailedSWAPPLETSELECTIONFAILED 6A 80Wrong dataSWWRONGDATA 6A 81Function not supportedSWFUNCNOTSUPPORTED 6A 82File not IoundSWFILENOTFOUND 6A 83Record not IoundSWRECORDNOTFOUND 6A 84Not enough memory space in IileSWFILEFULL 6A 86Incorrect parameters P1, P2SWINCORRECTP1P2 6B 00Incorrect parameters P1, P2SWWRONGP1P2 6C 00Correct expected Lengh (Le)SWCORRECTLENGTH 6D 00INS value not supportedSWINSNOTSUPPORTED Ernewein Ludovic I Generalites Autour des JavaCardsPage 12 6E 00CLA value not supportedSWCLANOTSUPPORTED 6F 00No precise diagnosisSWUNKNOWN Valeurs types de SW dans l'ISO delivres par le cardmanager pour les erreurs de VM: 62 83Selected applet blocked 63 00Cryptogram not veriIied 63 10More data available 65 81Memory Iailure 67 00Incorrect length 6A 88No element matches the search criteria 6C XXOnly XX bytes oI data are available 6F 80Stack overIlow 90 00Command process without error 92 40Memory problem 94 02Acces out oI range 94 84Algorithm not supported 94 85Invalid key check value 9F XXXX bytes oI data available I.6 Cycle de vie d'un Applet L'applet carte est un programme serveur de la JavaCard, un applet est selectionne par le terminal par un APDU de selection. Cette selection est Iaite en Ionction de l'ID de l'applet qui doit tre unique (represente par la classe AID signiIiant Applet ID). Ernewein Ludovic I Generalites Autour des JavaCardsPage 13 Une applet a les proprietes suivantes : Une Iois qu'elle est installee dans la carte, elle est toujours disponible. L'applet doit heriter de la classe favacard.framework.Applet. Il doit implementer les methodes qui interagissent avec le JCRE : install (), select (), deselect (), et process (). DeIinition des methodes publiques qu'il doit obligatoirement implementer : public void install ( APDU apdu ) : Appelee (une Iois) par le JCRE quand l'applet est chargee dans la carte. Doit s'enregistrer aupres du JCRE (methode register ()). public boolean select() : Appelee par le JCRE quand un APDU de selection est reu et designe cet applet. Rend l'applet active. public void process( APDU apdu ) : AppeleeparleJCREquandunAPDUdecommandeestreupourcetapplet(quidoittre actiI)public void deselect( ) : Appelee par le JCRE pour deselectionner l'applet courante. Comment un applet gere les APDU ? L'unitedetraitementdebased'unappletestunobjetdetype favacard.framework.APDUquiesttransmisparleJCREalareceptiond'unAPDUde commande par la carte (en provenance du terminal). La methode process () de l'applet courant est alors appelee. SpeciIicites de la classe javacard.Iramework.APDU : Est compatible avec le Iormat de messages ISO 7816-4. Cache les caracteristiques des protocoles de communication bas niveau (T0 et T1). EncapsulelesechangesdemessagesAPDUs(commandesetreponses)dansunbuIIer d'entrees/sortiesErnewein Ludovic I Generalites Autour des JavaCardsPage 14 La lecture et l'ecriture dans le buIIer d'APDU se deroulent comme le montre le diagramme de sequence ci dessous : Le rle d'un applet est d'une part de maintenir son propre etat, gerer ses champs, creer desobjetsetlesreIerencerpourtravailler.D'autrepartilrepondsadescommandesAPDUs (methode process ()) avec des reponses APDUs. Pour concevoir une applet on doit eIIectuer les etapes suivantes : Creer les objets de base a l'installation, initialiser les champs. Implementation de la methode install (). DeIinir les APDUs traites par la methode process (). Implementation d'un analyseur de commandes. Utilisation des champs et objets de l'applet. DeIinir les traitements a la selection et a la deselection (methodes select () et deselect ()). Ernewein Ludovic I Generalites Autour des JavaCardsPage 15 L'application cliente : L'application cliente se trouve sur le terminal qui dialogue avec la carte : Elle implemente les classes du terminal (avec JDK). Elle communique avec le serveur (applet carte),pour cela elle s'occupe de l'etablissement de la liaison : envoi d`un APDU de selection avec l`AID de l`applet (standardise). Elle gere l'invocation de services de l`applet, c'est a dire :Le codage et l'envoi d`APDUs de commande conIormes a ceux traites par l`applet. La reception et decodage des APDUs de reponse retournes par l`applet. Il n'existe pas d`API standard de communication avec la carte, on peut utiliser une des APIIournitpasdiIIerentsconstructeurs.CependantuneAPIestencoursdestandardisation pour suivre la tendance des autres services JavaCard qui suivent la loi rigoureuse deIinie par les membres regroupes au sein du "javacardIorum". Le diagramme de sequenceci dessous indique les communications entre l'application cliente avec la carte : Ernewein Ludovic II Environnement de developpement Autour des JavaCardsPage 16 II L'environnement de dveloppement II.1 Choix de l'environnement Pourdeveloppermesapplicationsj'aichoisitdetravaillersousEclipseSDKdansa version3.2.1pourWindows.Lechoixdel'IDEn'etanteneIIetpasdecisiIparrapportaux resultats attendus, j'ai choisit en accord avec M DuIner de travailler sous eclipse. Ce choix se justiIieenpartieparleIaitquec'estl'IDEqueconseilleMOTechnoquinousalivreles cartes. De plus ce choix m'aura permit de me Iamiliariser avec un nouvel environnement, que nousn'avonsjamaisutiliseencoursetquiesttouteIoistrespresentdansl'univers proIessionnel.EnIinMOTechnoproposaitdanssonpackageuntutoriald'installationetde parametrage d'Eclipse en anglais (et en allemand sur le CD) ce qui m'a beaucoup servit pour la decouverte de cet environnement. II.2 Tutorial Eclipse Etantdonnequeletutoriald'eclipseetaitIournitenlanguesetrangeresj'aiconvenu avec mon tuteur de le rediger en Iranais aIin de Iaciliter la tache des personnes qui pourraient travailler a ma suite. Tout d'abord il Iaut explorer le CD Iournit par MO Techno pour installer le lecteur de carte Allez dans : \Driver\SDK Ernewein Ludovic II Environnement de developpement Autour des JavaCardsPage 17 Il Iaut deziper le dossier ACR38Uinst111000. Branchez ensuite le lecteur de carte sur un des ports USB de votre ordinateur. Lancer l'executable setup du dossier que vous avez dezipe. Cet ecran apparat alors, cliquer sur install pour commencer. Attendezqueleperipheriquesoitbieninstalle:lapetiteIentreenbasadroitequiannonce nouveaumaterielinstalleetprtal'emploi.PuisIermerleprogrammed'installationen cliquant sur Iermer. Vous pouvez veriIier dans votre gestionnaire de peripheriques que le lecteur apparat. Ernewein Ludovic II Environnement de developpement Autour des JavaCardsPage 18 Ensuite il Iaut telecharger eclipse a l'adresse : http://www.eclipse.org/downloads. Ce tutorial est Iait pour la version 3.2.1 et pour Windows, il Iaut donc chercher cette version danslalistedesanciennesversions(eneIIetdepuispeudetempsestdisponiblelaversion 3.2.2 qui n'a pas ete teste pour ces applications) il Iaut donc toujours prendre la version SDK v3.2.1(120Mo).Sivousn'utilisezpasWindowscherchezlaversioncompatibleavecvotre OS, le tutorial peut Iacilement tre adapte aux autres systemes. MaintenantquevousaveztelechargeeclipseilvousIaudraaussitelechargerJRE(Java RuntimeEnvironnement)danssaversion2minimumaIindepouvoirlanceretcreerdes projetsavececlipse.Voustrouvereztoutlenecessaireal'adresse http://java.com/en/download/index.jsp,ilsuIIitdecliquersurdownloadetdechoisirson mode d'installation : En ligne ou en telechargement. UneIoisJREinstalleonpeutpasseraeclipse.Cetteversionn'acependantpasbesoin d'installation, en eIIet il suIIit de deziper le dossier sur votre Disque et de lancer l'application eclipse.exe Choisissez maintenant votre dossier de travail (workspace directory) EnsuitepouravoiraccesauxoutilsdedeveloppementJavaCardalleztelechargerleplug-in IBMJCOPpoureclipseal'adressehttp://tinyurl.com/vum9k.UneIentres'ouvrechoisissez enregistrer sur le disque. Ernewein Ludovic II Environnement de developpement Autour des JavaCardsPage 19 Une Iois le telechargement termine, lancez eclipse et procedez ainsi : Faire l'update du package telecharge precedemment Ernewein Ludovic II Environnement de developpement Autour des JavaCardsPage 20 Cliquez sur "New Archived Site" sur la droite de la Ientre. Selectionnez le Iichier "tools.zip" juste telecharge, puis "ouvrir" et "ok". Ensuiteinstallezletout,mmelesIichiersquin'ontpasetessignesnumeriquement.Puis redemarrez eclipse en choisissant "Yes" sur le dernier bouton. Activationduplug-in:branchezlelecteurdecarte,puisquandeclipseestlancecliquezsur l'icne a gauche de l'icne java en haut a droite : petite fentre avec le faune Choisissez dans la liste JCOP Debug (selectionnez au besoin Others dans la liste deroulante le JCOP Debug devrait s'y trouver). Maintenantvousallezdevoirpossederunecartededeveloppementpouractiverle programme, sans celle-ci vous ne pourrez aller plus loin dans votre installation. Ernewein Ludovic II Environnement de developpement Autour des JavaCardsPage 21 Cliquez sur next Pour vous servir de votre Engineering card, selectionnez la seconde option puis continuez en appuyant sur "next" Ernewein Ludovic II Environnement de developpement Autour des JavaCardsPage 22 Il Iaut choisir le bon lecteur, dans notre cas c'est le ACR38U (attention votre lecteur doit tre branche sur un de vos port USB) Inserezvotrecartededeveloppement,laledvertedulecteurresteallumequelquesinstants, cliquezensuitesur"Iinish".Leprogrammeestinstallevousavezdesormaislapossibilitede developper vos applets. II.3 Exemple de lancement d'un applet sous Eclipse Maintenantqu'eclipseestprtpourledeveloppementdesappletsonpeutcreerunnouveau projet Ernewein Ludovic II Environnement de developpement Autour des JavaCardsPage 23 On donne un nom a notre nouveau projet puis on selectionne les options par deIaut pour la conIiguration. Maintenant on peu creer un applet en Iaisant un clic droit sur notre projet et en selectionnant creer un nouvel applet. Une Ientre s'ouvre dans laquelle on renseigne le nom du package dans lequel on va travailler et le nom de notre applet. Maintenant il Iaut choisir notre AID pour l'applet et un AID pour le package. Une Iois que l'on a enregistre notre AID on peut commencer a developper notre applet. Ernewein Ludovic II Environnement de developpement Autour des JavaCardsPage 24 Une Iois que l'on a developpe notre applet on peut le lancer : On choisit soit de le lancer l'applet sur le simulateur inclus dans l'outil de developpement de JCOP tools soit de l'installer sur la carte que l'on peut inserer dans le lecteur. Ernewein Ludovic II Environnement de developpement Autour des JavaCardsPage 25 Maintenantquel'onachoisitcommenttesternotreapplet,ilsuIIitdechargerlepackage contenant notre applet. Pour cela il suIIit de cliquer sur l'onglet Package Upload. Puis, une Iois la nouvelle Ientre ouverte selectionner "Add package" et choisissez le package que vous voulez charger. Ernewein Ludovic II Environnement de developpement Autour des JavaCardsPage 26 UneIoisquevousavezchoisitvotrepackagevouspouvezselectionnerlesappletscontenu dans celui-ci en cliquant sur "Install Applet" UneIoisvotreappletinstallevousn'avezplusqu'aIaireundoubleclicsurcelui-ciaIinde vousretrouverdansuneIentrevouspermettantdereglersesparametresAIDaIinquela machine virtuelle puisse Iaire les liens. Ernewein Ludovic II Environnement de developpement Autour des JavaCardsPage 27 UneIoisquevousaveztoutparametrevousvousretrouvezavecuneIentrecontenant l'arborescence de votre projet, vous y retrouvez votre package, l'applet que vous allez lancer, vous pouvez y distinguer l'AID du package et de l'applet et l'AID de l'instance de l'applet que vous tes sur le point de simuler. Il vous suIIit juste de cliquer sur "Apply" puis "Run" pour lancer l'execution. Ernewein Ludovic III Les applications Autour des JavaCardsPage 28 III Les applications III.1 DescriptiI d'un applet Dans la majorite des cas les ressources que l'on peut trouver sur les diIIerentes sources d'inIormation,etnotammentsurInternetconcernentdescastrescomplexescommeles applets de carte de credit ou les simulation de carte sim pour telephones GSM. Je pense donc qu'etudiercegenred'applicationpeutnouspermettre,apresavoirassimilelatheoriede developper notre approche pratique du sujet. Pouretudieruncascompletj'aichoisitunesourceproposeparSunpourlesdeveloppeurs s'interessantadesapplicationscomplexes.Vouspourreztrouvezcesourceal'adresse: http://developers.sun.com/techtopics/mobility/javacard/articles/intro/index.html JevaisdoncmaintenantreprendrecetexempleaIindevousIairecomprendrele codage d'un applet. Declaration du package Au debut du programme comme en Java package com.sun.javacard.samples.wallet; Importation des outils framework Contient toutes les classes les plus utiles comme APDU et Applet import javacard.framework.*; Cration de notre classe qui herite Iorcement de la classe Applet public class Wallet extends Applet Ernewein Ludovic III Les applications Autour des JavaCardsPage 29 Dclaration des constantes OnpeutdeIinirdesconstantesquinousservirontpouridentiIiercertainesvaleurscle pour des octets speciIiques. Valeurs de CLA et de INS que l'on reconnat // code of CLA byte in the command APDU header final static byte Wallet_CLA =(byte)0xB0; // codes of INS byte in the command APDU header final static byte VERIFY = (byte) 0x20; final static byte CREDIT = (byte) 0x30; final static byte DEBIT = (byte) 0x40; final static byte GET_BALANCE = (byte) 0x50; Autresconstantscommelemontantmaximumducreditdisponible,lemontant maximumd'unetransaction,lenombred'essaiavantdebloquerlecodePIN,ouencorela taille maximale du code PIN. // maximum balance final static short MAX_BALANCE = 0x7FFF; // maximum transaction amount final static byte MAX_TRANSACTION_AMOUNT = 127; // maximum number of incorrect tries before the // PIN is blocked final static byte PIN_TRY_LIMIT =(byte)0x03; // maximum size PIN final static byte MAX_PIN_SIZE =(byte)0x08; Onpeutaussideclarerdesconstantesassocieesadesoctetsquiserontenvoyesous certaines conditions // signal that the PIN verification failed final static short SW_VERIFICATION_FAILED = 0x6300; // signal the the PIN validation is required // for a credit or a debit transaction final static short SW_PIN_VERIFICATION_REQUIRED = 0x6301; // signal invalid transaction amount // amount > MAX_TRANSACTION_AMOUNT or amount < 0 final static short sw_invalid_transaction_amount = 0x6a83; // signal that the balance exceed the maximum final static short sw_exceed_maximum_balance = 0x6a84; // signal the the balance becomes negative final static short sw_negative_balance = 0x6a85; Ernewein Ludovic III Les applications Autour des JavaCardsPage 30 Dclaration des variables On declare ici des variables telles que balance qui va representer le soldedu compte, ou pin qui est un objet de type OwnerPIN, qui est une classe qui contient diIIerentes methodes tres utiles pour la manipulation des codes. /* instance variables declaration */ OwnerPIN pin; short balance; Cration d'un constructeur CommeenJavaonabesoind'unconstructeurpourcreerdesobjets,ilestaussien charge de leur initialisation et du lancement de l'instance de l'applet. private Wallet (byte[] bArray,short bOffset,byte bLength){ // It is good programming practice to allocate // all the memory that an applet needs during // its lifetime inside the constructor pin = new OwnerPIN(PIN_TRY_LIMIT, MAX_PIN_SIZE); // The installation parameters contain the PIN // initialization value pin.update(bArray, bOffset, bLength); register(); } // end of the constructor L'instanciationdesobjetsdansleconstructeurestrecommandeepoureviterles problemes d'allocation de memoire lors de l'execution de l'applet. Avant de quitter le constructeur on implemente la methode register (), qui sert a s'enregistrer aupres du JCRE. Installation d'un applet Cettemethodeestl'equivalented'unMainenJava.C'estlepointd'entreedel'applet quipermetlacreationdel'instancedel'appletlelancementduconstructeuretdonc l'enregistrement aupres du JCRE. Ernewein Ludovic III Les applications Autour des JavaCardsPage 31 public static void install(byte[] bArray, short bOffset, byte bLength){ // create a Wallet applet instance new Wallet(bArray, bOffset, bLength); } // end of install method Cette methode utilise Trois parametres :bArray : un tableau d'octets qui contient les parametres d'installation. bOIIset : une variable de type short qui contient un oIIset sur le tableau. bLength:unevariabledetypebytequicontientlalongueurenoctetsdesdonneesen parametres. Slection et dslection de l'applet Cette etape se passe apres l'installation, une Iois que l'applet est memorise sur la carte et que l'on veut y acceder. Il Iaut pour cela envoyer une APDU select () au JCRE en precisant l'AID de l'applet qui nous interesse dans la carte. Si le JCRE trouve un applet correspondant a l'AID que l'on veut il lance la methode select () qu'il va trouver dans celui-ci. Ensuitec'estl'appletquivarepondreauJCREpourdiresiilestenetatounonpour traiter la requte a l'aide d'un booleen qui est vrai si l'applet peut traiter cette requte et Iaux si ilnepeuttraiterlarequte.EnsuiteleJCREpeutrepondreal'applicationclientepour conIirmer ou non que l'applet peut traiter ces APDU de commande. Pour notre exemple la condition est que le code pin ne soit pas bloque. public boolean select() { // The applet declines to be selected // if the pin is blocked. if ( pin.getTriesRemaining() == 0 ) return false; return true; }// end of select method Ernewein Ludovic III Les applications Autour des JavaCardsPage 32 Lamethodedeselect()permetdeIermerlacommunicationentrel'appletetleclient pour pouvoir par exemple Iaire l'appel d'un autre applet. public void deselect() { // reset the pin value pin.reset(); } Requtes de process Quand on a reu une conIirmation de la selection on peut envoyer des donnees grace a la methode process. public void process(APDU apdu) { Cettemethoderesumelederoulementdel'applet,danslecasdenotreexemplele deroulement est le suivant : Gestion de la trame en entree : QuandleJCREreoituneAPDUillamemorisedansunbuIIer.Lescinqpremier octetssontleCLA,INS,P1,P2etLc.EnsuiteleJCREretransmitalamethodeprocessces donnees encapsulees dans une nouvelle trame et communique un pointeur sur les donneesbyte buffer[] = apdu.getBuffer(); Utilisation du header : La methode process examine ensuite les deux premiers octets transmis, le CLA et INS. Si la valeur de CLA est 0 et que la valeur de INS est 0xA4, la methode redonne le contrle au JCRE car il s'agit d'une select () APDU. // check SELECT APDU command if ((buffer[ISO7816.OFFSET_CLA] == 0) && (buffer[ISO7816.OFFSET_INS] == (byte) (0xA4)) ) return; Ernewein Ludovic III Les applications Autour des JavaCardsPage 33 L'utilisation des constantes ISO7816.OFFSETCLA et ISO7816.OFFSETINS permet desimpliIierl'accesacertainsoctetsdelatrame,eneIIetellesserventaindexerlesoctets Irequemment utilises pour le decodage des APDU. EnsuitelamethodeprocessveriIielavaleurdesoctetspourvoirsilavaleurdeCLA est conIormea celleattendue, sinon elle renvoieune erreur au JCRE qui notiIie que le CLA de la requte n'est pas supporte par l'applet. // verify the reset of commands have the // correct CLA byte, which specifies the // command structure if (buffer[ISO7816.OFFSET_CLA] != Wallet_CLA) ISOException.throwIt (ISO7816.SW_CLA_NOT_SUPPORTED); Slection de l'action Si le CLA est correct alors la methode process veriIie l'octet INS pour voir quelle instruction executer. Si la valeur n'est pas reconnue on envoie une exception comme APDU reponse.switch (buffer[ISO7816.OFFSET_INS]) { case GET_BALANCE: getBalance(apdu); return; case DEBIT: debit(apdu); return; case CREDIT:credit(apdu); return; case VERIFY:verify(apdu); return; default: ISOException.throwIt (ISO7816.SW_INS_NOT_SUPPORTED); } } // end of process method Un exemple : pour crditer votre compte CettemethodereoitcommeparametreuneAPDUquidoitcontenirlavaleura crediter sur le compte, on la traite de la Iaon suivante : Ernewein Ludovic III Les applications Autour des JavaCardsPage 34 CettemethodecommenceparveriIierquelepinestvalide.Sicen'estpaslecasla methode renvoie une exception inIormant que le code pin n'est pas valable. // access authentication if ( ! pin.isValidated() ) ISOException.throwIt( SW_PIN_VERIFICATION_REQUIRED); Ensuite la methode se sert du buIIer pour extraire les donnees utiles.// Lc byte denotes the number of bytes in the // data field of the command APDU byte numBytes = buffer[ISO7816.OFFSET_LC]; // indicate that this APDU has incoming data // and receive data starting from the offset // ISO7816.OFFSET_CDATA following the 5 header // bytes. UneIoisacepointlamethodeestprtearecevoirlesdonnees,soitlemontanta creditersurlecompte.CeciceIaitparlemot-clesetIncomingAndReceive,quideIinitune methodequivlirelebuIIeretrenvoyerlenombred'octetsqu'ellealue.Pourcetappletla methode ne lit qu'un seul octet car l'octet Lc qui indique la longueur du champ de donne a la valeur1.LamethodeveriIiequeLccorrespondalalongueurdonneepar setIncomingAndReceive, sinon elle envoie une exception. byte byteRead = (byte)(apdu.setIncomingAndReceive()); // it is an error if the number of data bytes // read does not match the number in Lc byte if ( ( numBytes != 1 ) || (byteRead != 1) ) ISOException.throwIt(ISO7816.SW_WRONG_LENGTH); Ernewein Ludovic III Les applications Autour des JavaCardsPage 35 QuandtoutestveriIielamethodevapouvoirenIinaccederauxdonnees.ElleveriIie que le montant a crediter ne depasse pas le maximum autorise ou n'est pas negatiI. Elle veriIie aussi que la balance du compte ne depassera pas le montant maximum apres avoir ete credite.Si ces conditions sont validees la methode credite le compte. // get the credit amount byte creditAmount = buffer[ISO7816.OFFSET_CDATA]; // check the credit amount if ( ( creditAmount > MAX_TRANSACTION_AMOUNT) || ( creditAmount < 0 ) ) isoexception.throwit (sw_invalid_transaction_amount); // check the new balance if ( (short)( balance + creditamount) > MAX_BALANCE ) ISOException.throwIt (SW_EXCEED_MAXIMUM_BALANCE); // credit the amount balance = (short)(balance + creditAmount); } // end of deposit method Icionretrouveunenouvelleconstantedel'ISO7816:OFFSETCDATAquiestun index pointant directement sur le champ de donnees de l'APDU.Quand l'operation est terminee la methode renvoie une valeur des SW egale a 0x9000, ce qui signiIie que l'operation c'est bien deroule. Si ce n'est pas le cas la methode renvoie une exception que l'on peut identiIier grce a la valeur des SW. III.2 Exercice Pour l'entranement a la programmation j'ai imagine un petit exercice pour prendre en mainIacilementlatechnologie.Malheureusementjerencontreencoredesproblemesau niveaudelaselectiondesappletautraversduJCRE.JeproposetouteIoiscepetitexercice pour tester la matrise de ceux que cela interesse. Ernewein Ludovic III Les applications Autour des JavaCardsPage 36 Sujet : Dans cet exercice, je vous propose de programmer un applet nomme Hello. Cet applet devra reagir a deux types de messages. Tout d'abord il devra veriIier que les messages qu'iltraiteraserontdelaclasse0x80.Ensuitel'appletdevrareagirautypedemessagequ'il recevra dans un cas il transmettra le message Hello, dans l'autre il transmettra le message Bye. Regles pour tout type de developpement:Toujours implementer install, select et deselect. Bien choisir les octets CLA et INS. Ecrire proprement la methode process. Ne pas oublier d'allouer les ressources dans le constructeur. Toujours eIIectuer un register aupres du JCRE. Toujours veriIier la longueur des donnees (surtout entrantes). Se servir avec precaution du buIIer APDU. Toujours caster les valeurs non typees (ex 0 en (byte) 0). Solution proposee : package testpack; import javacard.framework.*; public class Hello extends Applet { private byte[] message1,message2; protected Hello () { message1= new byte[5]; message2= new byte[3]; message1 [0]= 0x48; message1 [1]= 0x65; message1 [2]= 0x6c; message1 [3]= 0x6c; message1 [4]= 0x6f; message2 [0]=0x42; message2 [1]=0x79; message2 [2]=0x65; register(); } public static void install(byte[] bArray, short bOffset, byte bLength) { new Hello (); } Ernewein Ludovic III Les applications Autour des JavaCardsPage 37 public boolean select() { return true; } public void deselect() { } public void process(APDU apdu) { byte buf[] = apdu.getBuffer(); if (buf[ISO7816.OFFSET_CLA] != 0x80) ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED); switch (buf[ISO7816.OFFSET_INS]) { case (byte) 0x40: Util.arrayCopy(message1,(short)0,buf,ISO7816.OFFSET_CDATA,(short)5); apdu.setOutgoingAndSend(ISO7816.OFFSET_CDATA,(short)5); break; case (byte) 0x50: Util.arrayCopy(message2,(short)0,buf,ISO7816.OFFSET_CDATA,(short)3); apdu.setOutgoingAndSend(ISO7816.OFFSET_CDATA,(short)3); break; default: ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED); } } } Ernewein Ludovic Conclusion Autour des JavaCardsPage 38 Conclusion: Ceprojetauraeteunetresbonneexperience.Ilm'apermitdem'interesseraunsujet qui n'est typiquement pas un cas d'ecole car trop long pour tre realise en cours.J'ai egalement pus me rendre compte que cette technologie possede beaucoup d'attraits pourlespersonnesdesireusesdedevelopperdesapplicationsportablesetsecurisesdans l'universproIessionnelcarelleestsimpled'utilisationetpossedeunegrandestabiliteetune Iorte opacite du contenu Iace a l'environnement exterieur. Maprogressionquim'atoutd'abordpousseamedocumentersurlesujetm'apermis de comprendre un peu mieux le Ionctionnement de ce type d'applications, ensuite l'utilisation d'eclipse pour le developpement des applets m'aura Iait decouvrir un nouvel environnement de developpementpourlesapplicationsJavacequij'ensuissurseraunplusdurantmonstage puis durant les premiers temps de ma vie active. EnIin l'aboutissement de ce projet aura ete le codagedesappletsetlacomprehensiond'appletscomplexes,malgrelavenuedediIIicultes lieesamonniveaudedebutantdansledomaineetaumanquedetempspourtraiter convenablement du sujet. J'espere touteIois avoir reussi a assurer la perennite de ce projet en realisant ce rapport, quipourratreuneaideprecieusepourlespersonnesdesireusesdereprendremontravailla ou il s'est arrte. Ernewein Ludovic Bibliographie Autour des JavaCardsPage 39 Bibliographie Ensemble des sites Internet utilises pour la collecte d'inIormations. http://developers.sun.com http://java.sun.com/products/javacard http://tinyurl.com http://www.3ie.Ir http://sardes.inrialpes.Ir http://www.javacardIorum.org http://www.javaIr.com http://www.supinIo-project.com