Java Card
Java Card est un systĂšme d'exploitation pour carte Ă puce qui fournit essentiellement un environnement d'exĂ©cution pour un sous-ensemble du langage Java spĂ©cifiquement destinĂ© aux applications pour carte Ă puce. Java Card permet l'exĂ©cution d'applications au sein des cartes Ă puce, qui offrent des capacitĂ©s de mĂ©moire et de traitement limitĂ©es. De multiples applications peuvent ĂȘtre dĂ©ployĂ©es avant et mĂȘme aprĂšs que la carte Ă puce a Ă©tĂ© fournie Ă l'utilisateur final. Les applications Ă©crites dans le langage de programmation Java peuvent ĂȘtre exĂ©cutĂ©es en toute sĂ©curitĂ© sur lâensemble des types de cartes disponibles sur le marchĂ©.
|
Historique
En 1996, les ingénieurs de la division carte de Schlumberger[1] au Texas (qui a fusionné plus tard avec Gemplus international pour former Gemalto) ont souhaité simplifier la programmation des cartes à puces tout en préservant la sécurité des données dans le respect de la norme ISO 7816.
La solution retenue fut le langage de programmation Java. En raison de la faible capacitĂ© mĂ©moire disponible sur une Carte Ă puce seulement un sous-ensemble de Java pouvait ĂȘtre utilisĂ©. Ainsi fut crĂ©Ă© Java Card 1.0 en , le premier langage orientĂ© objet adaptĂ© aux cartes Ă puce.
, Schlumberger et Gemplus fondent Java Card Forum qui recommande des spécifications à JavaSoft (la division de Sun à qui appartient Java Card) en vue d'obtenir une standardisation du langage et promeut les APIs de Java Card pour qu'elle devienne la plate-forme standard de développement des applications pour les cartes à puce[1].
, les producteurs de Cartes à puce comme De La Rue, Bull , Giesecke & Devrient(G&D) rejoignent Java Card Forum qui édite une nouvelle version de spécifications Java Card 2.0[1].
Par la suite, Sun éditera alors quatre nouvelles spécifications : en édition de Java Card 2.1[1], en Java Card 2.2, en Java Card 3.0 et enfin la plus récente Java Card 3.0.1 en [2].
La société Oracle Corporation acquiert en l'entreprise Sun Microsystems.
Architecture
La carte Ă puce reprĂ©sente une des plates-formes informatiques les plus rĂ©duites[3]. Le plus grand dĂ©fi de conception de la technologie de Java Card est d'embarquer le logiciel de base Java dans une carte Ă puce en conservant l'espace mĂ©moire nĂ©cessaire pour stocker des applications. La solution retenue par Sun, issue des travaux de Schlumberger[1], est dâimplĂ©menter un sous-ensemble des fonctionnalitĂ©s du langage Java et dâappliquer un modĂšle rĂ©duit de la JVM (Java Virtual Machine) appelĂ© JCVM (Java Card Virtual Machine)[3]. En plus de fournir le support de langage Java, la technologie de Java Card dĂ©finit un environnement d'exĂ©cution en temps rĂ©el qui supporte la mĂ©moire, la communication, la sĂ©curitĂ© et le modĂšle d'exĂ©cution de lâapplication. Cet environnement respecte la norme standard ISO7816[4].
La plate-forme Java Card est articulée autour[5] :
- dâune machine virtuelle Java Card appelĂ©e JCVM[note 1] dont les spĂ©cifications dĂ©finissent les fonctionnalitĂ©s mises en Ćuvre par la technologie Java Card. Elles incluent le jeu d'instruction de la Machine Virtuelle Java Card, un sous-ensemble du langage Java et les formats de fichier utilisĂ©s pour installer des applets et des bibliothĂšques dans des cartes Ă puce ou autres pĂ©riphĂ©riques qui hĂ©bergent la technologie de Java Card[6].
- dâun environnement dâexĂ©cution Java Card appelĂ© JCRE[note 2] constituĂ© de composants systĂšmes. La JCRE est responsable de la gestion des ressources des cartes Ă puces, des communications rĂ©seaux, de l'exĂ©cution ainsi que la sĂ©curitĂ© des Applets. La JCRE sert de systĂšme d'exploitation de la carte Ă puce, celui-ci s'appuie sur la couche matĂ©rielle de carte Ă puce et du systĂšme natif[6].
- dâun ensemble de librairies accessibles APIs[note 3], un sous ensemble du JCRE, contenant les dĂ©finitions de classe requises pour supporter la JVCM et la JCRE. Il dĂ©crit les fonctions de bases utiles pour programmer des applications de cartes Ă puce[6].
La caractéristique la plus significative du JCRE est qu'il fournit une séparation claire entre le systÚme et les applications[6]. La technologie de Java Card définit une plate-forme sur laquelle les applications écrites dans le langage de programmation Java peuvent fonctionner sur carte à puce et autres périphériques avec mémoire[6]. Les applications Java Card sont vues comme des applets[6] ou des servlets[7].
à partir de la version 3.0, éditée par Sun en , à la suite des évolutions des cartes à puces, la plate-forme Java Card se décline en 2 versions[8].
- Version Classique [9]
- Cette version est une Ă©volution de la version 2.2 et cible les systĂšmes limitĂ©s en ressources et qui supportent les applications basĂ©es sur les Applets. Elle apporte des correctifs et offre lâexploitation de nouveaux algorithmes de sĂ©curitĂ© (Exemple support des clĂ©s RSA 4096 bits). De plus, un ajustement avec les rĂ©cents standards des cartes «sans contact» a Ă©tĂ© rĂ©alisĂ©.
- Version Connectée [9]
- Cette version apporte un environnement amĂ©liorĂ© dâexĂ©cution et une nouvelle machine virtuelle. Une nouvelle architecture a Ă©tĂ© conçue pour transformer la carte Ă puce en Ă©lĂ©ment sĂ©curisĂ© de rĂ©seau. La carte Ă puce peut alors fournir des services rĂ©seaux IP tels que serveur web HTTP, serveur web sĂ©curisĂ© HTTPS, identification, accĂšs aux ressources d'un rĂ©seau. Cette version cible des produits moins limitĂ©s en ressources incluant de nouvelles fonctionnalitĂ©s orientĂ©es rĂ©seau telles que les applications web, appelĂ©es servlet. Cette version intĂšgre les fonctionnalitĂ©s de la version classique.
Version Java Card 2.x et Java Card 3 « classique »
Java Card est donc l'adaptation de la technologie Java pour les cartes à puce. Les applets sont développées dans le langage Java, elles sont ensuite transformées afin de satisfaire les contraintes de mémoire, puis sont chargées dans la carte[3]. Une fois installé sur la plate-forme et sélectionné, le bytecode[note 4], de l'applet est exécuté par la machine virtuelle embarquée JCVM[10].
Machine Virtuelle Java Card
La JCVM exécute le bytecode, contrÎle l'attribution de la mémoire, gÚre les objets et met en application la sécurité pendant l'exécution. La capacité des cartes à puces étant trop limité pour contenir toutes les informations des fichiers de classe Java, vérificateur de code objet, la JVCM est donc implémentée en deux parties distinctes (principale différence entre la JVM et la JCVM)[11] :
- Une partie externe à la carte à puce[note 5], intégrant le convertisseur et vérificateur fonctionnant sur un PC[note 6] ou un poste de travail distant[11].
- Une partie interne Ă la carte Ă puce[note 7] c'est-Ă -dire prĂ©sente sur la carte qui inclut lâinterprĂ©teur de code Java Card[11].
Ensemble, ils implĂ©mentent le chargement des fichiers de classe Java par lâintermĂ©diaire du vĂ©rificateur et convertisseur pour enfin exĂ©cuter l'applet Ă l'aide de lâinterprĂ©teur.
- le vérificateur[12]
- examine un ou plusieurs fichiers de classe contenant le bytecode, pour assurer qu'il respecte la syntaxe et les rĂšgles du langage et vĂ©rifie statiquement que les flux de contrĂŽle et de donnĂ©es ne produiront pas d'erreur lors de lâexĂ©cution[13].
- le convertisseur
- charge les fichiers de classe vĂ©rifiĂ©s par le vĂ©rificateur. Il produit un fichier CAP[note 8], (contenant une reprĂ©sentation compacte d'un ou plusieurs fichiers Java compilĂ©s) correspondant Ă la conversion dâune applet[14].
En plus de la création d'un fichier CAP, le convertisseur produit un fichier d'exportation[note 9] contenant des informations API publiques pour un ou plusieurs fichiers de classe[15]. Il définit le niveau d'accÚs et le nom d'une classe ainsi que le niveau d'accÚs et les signatures des méthodes et champs de la classe. Un fichier d'exportation contient aussi des informations utilisées pour résoudre des jonctions de référence entre différentes applets sur la carte[10].
LâinterprĂ©teur de Java Card fournit le support d'exĂ©cution du langage Java, il exĂ©cute les tĂąches suivantes[16] :
- exécute des instructions de code des applets ;
- contrÎle la création d'objet et l'attribution de mémoire ;
- joue un rÎle crucial dans l'assurance de la sécurité pendant l'exécution.
LâinterprĂ©teur de Java Card ne charge pas de fichier de classe ou fichier CAP, il en exĂ©cute seulement le code[16]. Dans la technologie de Java Card, les mĂ©canismes de tĂ©lĂ©chargement et d'installation sont inclus dans une unitĂ© appelĂ©e l'installateur rĂ©sidant dans la carte Ă puce[16]. Il coopĂšre avec un programme d'installation non-implĂ©mentĂ© sur la carte. Le programme d'installation transmet le(s) fichier(s) Ă l'installateur sur la carte via un dispositif d'acceptation de carte (CAD[note 10]). L'installateur Ă©crit le(s) fichier(s) dans la mĂ©moire de carte Ă puce pour ĂȘtre lu avec les autres classes qui sont dĂ©jĂ embarquĂ©es sur la carte. Il crĂ©e et initialise les structures de donnĂ©es qui sont utilisĂ©es par la JCRE.
Environnement d'exécution Java Card
Le JCRE est responsable de la gestion des ressources de la carte, des communications réseaux, de l'exécution et la sécurité des applets[17]. Il est implémenté sur la carte à puce et sert essentiellement au systÚme d'exploitation présent sur la carte[17]. Le JCRE est composé de la JCVM, des APIs, d'extensions spécifiques à une industrie[note 11]. et des systÚmes de classes[17].
Le JCRE distingue les applets des propriétés techniques de la carte à puce. Il fournit le systÚme standard et les APIs pour les applets. Celles-ci sont donc plus simples à écrire et sont donc facilement portables sur différentes architectures de cartes à puce[17].
La couche inférieure du JCRE contient la JCVM et les méthodes natives[note 12]. Elles fournissent le support à la JCVM et le systÚme de classes pour la couche suivante. Le systÚme de classes cadre le fonctionnement du JCRE[18] et son rÎle est similaire à un systÚme d'exploitation. Il est responsable :
- de la gestion des transactions
- mĂ©canisme permettant de rendre un ensemble dâopĂ©rations atomiques (ex : transaction bancaire)[19].
- des communications avec le serveur CAD
- La gestion des communications d'Applets, se fait via lâApplication Protocol Data Unit (APDU)s dont la structure est dĂ©finie par la norme ISO 7816[19].
- du cycle de vie des applets
- Le JCRE initialise l'applet aprĂšs son installation. Il peut sĂ©lectionner alors l'applet pour lui signifier de sâexĂ©cuter, la dĂ© sĂ©lectionner ou lui transmettre un signal APDU[19].
Le systÚme de classes invoque les méthodes natives[20]. Elles contiennent un ensemble de fonctions bas niveau qui permettent au JCRE de gérer les ressources physiques de la carte telles que les entrées-sorties, la gestion de la mémoire ou le coprocesseur cryptographique. Ces méthodes sont compilées en code exécutable dédié au processeur de la carte[17].
La structure de classes API définit les interfaces de programmation d'application, API[18]. L'avantage majeur est qu'elle rend plus facile la création d'applet. Les développeurs d'applet peuvent concentrer leurs efforts sur la programmation vis-à -vis des contraintes de l'infrastructure de systÚme de carte à puce grùce aux extensions d'API disponibles[20]. Les applets ont accÚs aux services JCRE par des classes API.
La structure extension spécifique à une industrie fournit les bibliothÚques complémentaires de services supplémentaires ou des modÚles de systÚme et de sécurité (ex : industries financiÚres)[18].
L'installateur permet le tĂ©lĂ©chargement sĂ©curisĂ© de logiciels et dâapplets sur la carte aprĂšs que la carte a Ă©tĂ© produite et fournie Ă l'utilisateur[18]. L'installateur interne coopĂšre avec l'installateur externe Ă la carte. Ensemble, ils accomplissent la tĂąche de charger le contenu binaire du fichier CAP ou fichier de(s) classe(s). Cependant, l'installateur est un composant JCRE facultatif, mais sans lui tous logiciels de carte, y compris les applets, devraient ĂȘtre Ă©crits dans la mĂ©moire de la carte pendant le procĂ©dĂ© de fabrication[17].
API
Lâinterface de programmation d'application API disponible permet de dĂ©velopper des applications et fournir des services Ă ces applications[21] : Ces classes dĂ©finissent les conventions selon lesquelles une Applet Java Card a accĂšs au JCRE et aux fonctions natales, y compris la fonction de systĂšme d'exploitation, l'accĂšs Ă la mĂ©moire et les opĂ©rations d'entrĂ©e-sortie. Les API utilisĂ©es par la carte sont :
- java.io
- est un sous-ensemble du paquet java.io dans le langage de programmation Java standard.
- Java.lang
- fournit les fondamentaux pour la conception du sous-ensemble de technologie de Java Card du langage de programmation Java. Les classes fournies sont tirées de java.lang dans le langage de programmation Java standard et représentent la fonction principale requise par la JVCM. Cette fonction principale est représentée par la classe d'Objet, qui est la super-classe pour toutes les classes de langage Java et la classe Exception, qui est la super-classe pour l'exception et les classes d'exception pendant l'exécution.
- Java.rmi
- dĂ©finit l'interface Ă distance qui identifie les interfaces dont les mĂ©thodes peuvent ĂȘtre invoquĂ©es du pĂ©riphĂ©rique de rĂ©ception de carte (CAD) des applications client.
- Javacard.framework
- fournit une structure de classes et des interfaces pour la conception et la communication des applets, contient les fonctionnalités essentielles de fonctionnement avec Java Card.
- Javacard.framework.service
- fournit une structure de services de classes et dâinterfaces qui permettent Ă une Applet de Java Card d'ĂȘtre conçue comme une liste de composants de services.
- Javacard.security
- fournit les classes et les interfaces qui contiennent la fonction disponible pour implémenter une sécurité et une structure de cryptographie sur la Java Card. Les classes du paquet Javacard.security fournissent les définitions des algorithmes qui exécutent cette sécurité et les fonctions de cryptographie[22]
- Mises en Ćuvre de clĂ©s de chiffrement diffĂ©rentes par la classe KeyBuilder ;
- Hachage des données par la classe MessageDigest ;
- Génération de données aléatoires par la classe RandomData ;
- Signature par la classe Signature ;
- Ăchanges de clĂ© de session par la classe KeyAgreement.
- Javacardx.crypto
- contient la fonction qui implĂ©mente la sĂ©curitĂ© et la structure de cryptographie sur la Java Card. C'est une extension du paquet prĂ©cĂ©dent. Il contient la classe Cipher et l'interface KeyEncryption. Cipher est une classe qui fournit des mĂ©thodes pour chiffrer et dĂ©chiffrer des messages[23]. KeyEncryption est une interface qui fournit la fonction qui permet aux clĂ©s d'ĂȘtre mises Ă jour d'une façon continue sĂ©curisĂ©e.
Version Java Card 3 « Connectée »
La version 3 « Connectée » des spécifications de la plateforme Java Card présente des différences profondes avec les autres versions existantes.
Tout d'abord, alors que les versions antérieures ne pouvaient charger que des fichiers binaires spécifiques (les fichiers CAP), les applications Java Card 3 « Connectées » sont déployées sous forme de fichiers java compilés de façon conventionnelle (des fichiers .class
) regroupés dans des fichiers .jar
, à l'instar des machines virtuelles java conventionnelles[24]. Il n'est alors plus nécessaire d'avoir recours à des outils de conversions de code.
Par ailleurs Java Card 3 « Connectée » privilégie le mode de communication de l'internet : les protocoles internet via norme IP ISO 7816-4 pour les interfaces « avec contacts ». La norme ISO 14443 est elle utilisée pour les interfaces «sans contact»[9]. Les applications Java Card 3 « Connectées » sont en fait, des Servlets, c'est-à -dire de véritables Services Web, qui respectent, à ce titre, le protocole HTTP.
La machine virtuelle Java Card 3 est basée sur le CLDC[note 13] largement utilisé dans le monde de la téléphonie mobile[25]. Cette plate-forme donne accÚs aux fonctionnalités les plus riches du langage JAVA[9]. La plate-forme CLDC a été réduite en taille, les protocoles et les systÚmes sécurités de cartes à puce ont été intégrés[9].
Ăvolution des pĂ©riphĂ©riques supportant la technologie Java Card[26]
Carte à puce traditionnelle | Carte à puce récente compatible V3 |
---|---|
8/16-bit CPU | 32-bit CPU |
2 kb RAM | 24 kb RAM |
48 kb - 64 kb ROM | >256 kb ROM |
8â32 kb EEPROM | >128 kb EEPROM |
Serial I/O interface | High-speed interfaces |
9,6 kb/s - 30 kb/s | 1,5 Mb/s - 12 Mb/s |
Full duplex | Half duplex |
Amélioration apportée par la version 3 connectée[24].
- Applications de type servlets[24].
- Gestion de multitĂąches (Multithreading)[24].
- VĂ©rification par byte code interne[24](VĂ©rification de.class par la machine virtuelle interne).
- Ramasse Miette automatique (Garbage collector) inclut dans la machine virtuelle[24].
- Ajout des types Char, Long et String[24].
- Tableau multidimensionnel[27].
- Classe reprĂ©sentant les types primitifs (Boolean, Integer,âŠ)[27] - [28]
- Classe de la manipulation de Chaines de caractĂšres (StringBuilderâŠ)[27] - [29].
- Classe pour la gestion des Entrées/Sorties (Reader, Writer et Stream)[27].
- Classe pour la gestion du réseau[27].
- Classe pour la gestion des collections (Vector, hashtableâŠ)[27].
- Classe pour la gestion des dates[27].
- Classe pour la gestion de la localisation et de lâinternationalisation[27].
- Le langage de programmation a été étoffé de spécificités issues de Java SE[27] :
Spécificités |
Générics[30] |
Métadonnées |
Autoboxing[31] |
Amélioration de la boucle for |
Assert (test unitaire) |
ĂnumĂ©ration[32] |
Utilisation de méthodes à argument Variables[31] |
Import static[33] |
Limitation du moteur de servlet de java card V3[34]
Liste des principales caractéristiques présentes dans les spécifications Java Serlet 2.4[35] qui ne sont pas supportées par la plate-forme Java Card V3.
- API non supportĂ©es (java.io.File, java.net.URL, java.util.Map, java.util.Set, java.security.cert.X509Certificate...). Par exemple, il est impossible d'effacer un fichier avec la mĂ©thode delete de la classe java.io.File, impossible dâutiliser la structure hashmap, impossible d'utiliser la gestion des certificats X509 (RFC 2459[36]).
- Nombre flottant (float). Il est impossible de réaliser des opérations sur des nombres à virgules.
- Sérialisation et clonage d'objets (java.io.Serializable, java.lang.Cloneable). Il impossible de convertir les objets en flux binaire pour gérer persistance. Il est impossible de créer de nouvelles instances à partir d'une référence d'objet (clone).
- Support des Java Server Pages V2.0. Les balises JSP ne sont pas reconnues, donc obligation d'Ă©crire des servlets en Java.
- Java Naming and Directory Interface. Pas dâaccĂšs aux classes de gestion d'annuaires.
Sécurité des applications Java Card
La gestion de la sécurité développée pour les cartes à puce est implémentée par la JCVM qui fournit les rÚgles de sécurité suivantes[37] :
- Chaque JCVM contient une fonction vérificateur dont le rÎle est de vérifier les fichiers Java compilés (.class) issue d'un compilateur java. Cependant sur la plate-forme Java Card version 3, il est possible de charger directement des fichiers de classes sans passer par le vérificateur et le convertisseur.
- La fonction sĂ©curitĂ© de la JCRE met en application des pare-feu pour isoler chaque applet ou servlet, ce qui empĂȘche l'accĂšs non autorisĂ© d'objets crĂ©Ă©s par une autre applet.
- Tous les accĂšs aux mĂ©thodes et variables dans un fichier de classe se font par accesseurs[note 14]. Ces accesseurs dĂ©finissent un contrĂŽle de cohĂ©rence du type primitif pour chaque mĂ©thode. Il est possible de dĂ©clarer une mĂ©thode « public », « protected » (accessibles par des mĂ©thodes dans la mĂȘme sous-classe ou « package ») ou « private » (aucun accĂšs par d'autres classes). Si aucune dĂ©claration n'est faite, la mĂ©thode peut ĂȘtre accessible par n'importe quelle classe dans le mĂȘme paquet.
Au-delà de la vérification de code objet implémentée par la JCVM, la plate-forme de Java Card 3 implémente des mécanismes de sécurité qui fournissent le niveau d'application et la sécurité des communications[38].
La plate-forme de Java Card supporte un mécanisme d'isolement de code. L'isolement de code assure que le code chargé d'une application ne se heurte pas au code d'autres applications[39].
La plate-forme de Java Card supporte l'isolement de contexte[note 15] et dâapplications. L'isolement de contexte assure que les objets crĂ©Ă©s, donc en possession dâapplications fonctionnant dans un mĂȘme contexte, ne peuvent pas ĂȘtre accĂ©dĂ©s par des applications d'un autre contexte Ă moins que ces applications possĂ©dant ces objets ne fournissent explicitement des interfaces pour l'accĂšs. De telles interfaces sont appelĂ©es des interfaces en commun et des objets implĂ©mentant ces interfaces, appelĂ©s commun interface objets, constituent des points d'entrĂ©e lĂ©gaux Ă ces applications[39].
La sĂ©curitĂ© Ă base de rĂŽles permet Ă la politique de sĂ©curitĂ© d'une application de limiter l'accĂšs aux ressources protĂ©gĂ©es de lâapplication. Les restrictions sont basĂ©es sur les caractĂ©ristiques de l'application demandant l'accĂšs, comme son identitĂ© et l'identitĂ© de l'utilisateur sur lequel la dĂ©fense dâaccĂšs est demandĂ©e[39].
L'authentification de l'utilisateur est le processus par lequel un utilisateur prouve son identité à la carte. Cette identité authentifiée est alors utilisée par la plate-forme pour exécuter des décisions d'autorisation, comme celles requises par la sécurité à base de rÎles, pour avoir accÚs aux ressources protégées[40].
L'authentification d'application client est le processus par lequel une application cliente prouve son identité à une application serveuse. Cette identité authentifiée est alors utilisée par l'application serveuse pour exécuter des décisions d'autorisation dans le but d'avoir accÚs aux ressources protégées[40].
Avec la plate-forme java Card, les applications peuvent interagir avec des applications à distance par des communications de réseaux sécurisées (TLS, SSL)[41].
Un développeur d'application Web peut déclarer des prérequis pour l'intégrité et la confidentialité lors du déploiement d'une application Web. Le développeur d'application ou le fournisseur peut aussi exiger que l'on héberge l'application sur un port sécurisé dédié avec des connexions HTTPS ouvertes[41].
La plate-forme Java Card supporte une structure de cryptographie. Un développeur d'application ou un fournisseur peut choisir l'algorithme de cryptographie qui répond le mieux aux besoins de son application [42].
Concept de programmation
Principe de programmation d'une Applet
Un Applet Java Card respecte la norme ISO 7816. Câest-Ă -dire quâelle rĂ©pond Ă des requĂȘtes de la mĂȘme maniĂšre quâelle les reçoit sous la forme de commandes en byte codes. Ceci simplifie considĂ©rablement le dĂ©veloppement dâune application, car il nây a plus besoin de coder en bas niveau lâenvoi et la rĂ©ception des commandes. En effet cette partie est maintenant encapsulĂ©e dans un framework java.
Les commandes en byte code sont appelĂ©es des APDU (Application Protocol Data Unit). Celles-ci sont codĂ©es diffĂ©remment en fonction de lâenvoi et de la rĂ©ception[43].
Une commande APDU telle qu'elle est envoyée depuis le lecteur à la carte Java est une série de cinq octets éventuellement suivis d'un nombre variable d'octets, formatés comme suit :
- CLA
- CLA est le nom du premier octet, dit octet de classe, défini par la norme ISO 7816, indiquant le numéro de commande[43].
- INS
- INS est le nom du second octet, dit octet dâinstruction[43].
- P1
- P1 est le nom du troisiĂšme octet, dit octet de paramĂštre 1[43].
- P2
- P2 est le nom du quatriĂšme octet, dit octet de paramĂštre 2[43].
- Ln
- Ln est le nom du cinquiÚme octet, il indique le nombre d'octets de données qui vont suivre (qu'elles soient envoyées ou reçues, 0x00 indiquant qu'aucune donnée additionnelle ne suivra)[43].
- Données
- Ce sont les données, au nombre de Ln, qui sont transmises par le lecteur à la carte. Si l'application embarquée prévoit seulement une transmission en sens inverse, aucune donnée n'est transmise ici[43].
- Le
- Le est le dernier octet aprÚs les données indiquant la taille maximale des données pour la réponse[43].
Une réponse APDU telle qu'elle est envoyée depuis la carte Java au lecteur, est une série d'octets, retournée en réponse à une commande et formatée comme suit :
- Données
- Ce sont les données, au nombre de Le, qui sont envoyées par la carte au lecteur[43].
- Statut
- statut renvoyé par la carte, codé sur deux octets nommés : SW1 et SW2.
- SW1
- le premier octet, appelé SW1 indique le type de réponse. La valeur hexadécimale une valeur entre
0x90
et0x9F
indique que la commande a été correctement exécutée. Une valeur entre0x60
et0x6F
indique que la commande n'a pas pu ĂȘtre exĂ©cutĂ©e par le programme placĂ© dans la carte[43]. - SW2
- le second octet, appelé SW2 rapporte éventuellement des informations supplémentaires concernant la réponse[43].
Lorsque la commande au niveau de lâapplet sâexĂ©cute normalement, la valeur du statut renvoyĂ© correspond Ă 90 00.
Si une instruction INS prĂ©voit Ă la fois d'envoyer et de recevoir des donnĂ©es, Java Card normalise un systĂšme d'APDU en deux phases. Dans un premier temps, l'APDU est envoyĂ©e avec pour <Ln> un nombre d'octets Ă envoyer, puis lorsque la carte rĂ©pond 0x91 <Le> (indiquant que <Le> octets sont prĂȘts Ă ĂȘtre retournĂ©s par la carte, en rĂ©ponse Ă la commande) une APDU Get Response est transmise pour dĂ©clencher la rĂ©ception de ces <Le> octets sortants[43].
En résumé, le champ de donnée(s) est optionnel dans les deux cas, APDU de commande et APDU de réponse. Par conséquent, il y a quatre cas possibles de communication entre le client et la plateforme Java Card Platform, Version 2.2.2 (ou Version 3.0.1 Classic Edition) :
Cas 1 | APDU de commande sans donnée | APDU de réponse sans donnée |
Cas 2 | APDU de commande avec donnée(s) | APDU de réponse sans donnée |
Cas 3 | APDU de commande sans donnée | APDU de réponse avec donnée(s) |
Cas 4 | APDU de commande avec donnée(s) | APDU de réponse avec donnée(s) |
Avant de pouvoir transmettre une commande Ă une Applet dĂ©ployĂ©e dans une Java Card, il est nĂ©cessaire de la sĂ©lectionner par lâenvoi dâune commande APDU spĂ©cifique en prĂ©cisant lâidentifiant de lâapplication AID[note 16]. Lâidentifiant dâapplication est composĂ© de deux parties. La premiĂšre sur 5 octets, le RID[note 17], est assignĂ© par la norme ISO. Celui-ci correspond Ă lâidentifiant propre Ă lâentreprise. Le second, PIX[note 18] est quant Ă lui composĂ© entre 0 et 11 octets. Lâassignation de celui-ci reste Ă la charge de lâentreprise qui dĂ©veloppe l'application Java Card[44].
Pour la programmation dâune Java Card, il y a cinq Ă©tapes importantes :
- Ăcriture du code Java source ;
- Compilation du code ;
- Conversion des fichiers
.class
en.cap
; - VĂ©rification du fichier
.cap
(optionnel) ; - Installation du fichier
.cap
dans la Java Card.
Le point fort du dĂ©veloppement Java Card est que les deux premiĂšres Ă©tapes peuvent ĂȘtre rĂ©alisĂ©es avec un environnement de dĂ©veloppement JAVA classique.
Voici un exemple de code renvoyant tout simplement la chaine de caractĂšres âHello Worldâ sur la demande liĂ©e Ă lâinstruction 0x10. Dans cet exemple le AID est composĂ© des valeurs de RID = DA8EF6DD26 et de PIX = 86E899.
Exemple dâapplet âHello Worldâ[45].
import javacard.framework.*;
public class HelloWorld extends Applet {
// Initialisation de la variable avec âHâ, âeâ, âlâ, âlâ, âoâ, ' ', 'W', 'o', 'r', 'l', 'd'.
private final static byte[] message = { 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64 };
public static void install(byte[] bArray, short bOffset, byte bLength) { new HelloWorld(); }
protected HelloWorld() { register(); }
public void process(APDU apdu) {
if (selectingApplet()) {
// Retourne le status Ă OK
return;
}
byte[] buffer = apdu.getBuffer() ;
if ( buffer[ISO7816.OFFSET_CLA] != (byte)(0x80) )
ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED); // Retourne le status word CLA NOT SUPPORTED
switch(buffer[ISO7816.OFFSET_INS]) {
case 0x10 :
// Copie du contenu du message dans le buffer de la reponse
Util.arrayCopy(message, (byte)0, buffer, ISO7816.OFFSET_CDATA, (byte)message.length);
// Envoi de la réponse
apdu.setOutgoingAndSend(ISO7816.OFFSET_CDATA, (byte)message.length);
break;
default:
// Retourne le status Ă la valeur INS NOT SUPPORTED
ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED);
}
}
}
Pour cet exemple, deux échanges d'APDU sont nécessaires entre le client et la Java Card : Le premier envoi correspond à la sélection de l'application en précisant l'AID :
Commande : 0x00 0xA4 0x04 0x00 0X08 0XDA 0X8E 0XF6 0XDD 0X26 0X86 0XE8 0X9A
RĂ©ponse : 90 00
Le second appel, envoi le code instruction 0x10 correspondant à la fonction 'char* hello()' sans données supplémentaires
Commande : 0x80 0x10 0x00 0x00 0x00
RĂ©ponse : 48 65 6C 6C 6F 20 77 6F 72 6C 64 90 00
Le contenu de l'APDU de réponse contient les données envoyées par l'Applet suivies du code de retour qui a pour valeur 90 00. Celle-ci nous indique que la fonction a été exécutée sans problÚme. Les données sont composées d'une série d'octets contenant les 11 caractÚres de la chaßne de caractÚres 'Hello World'.
Principe de programmation d'une Servlet
Voici un exemple de code renvoyant la chaine de caractĂšres âHello World from Java Cardâ lors de l'appel Ă la Servlet.
Exemple de Servlet âHello Worldâ
Contenu du fichier .java
package org.carte.web;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloWorldWeb extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
try {
out.println("<html><head><title>HelloWorldWeb</title></head>");
out.println("<body><h1>HelloWorldWeb</h1>");
out.println("Hello World from Java Card</body></html>");
} finally {
out.close();
}
}
}
Contenu du fichier web.xml
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
version="2.4"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/javacard/jcweb-app_3_0.xsd">
<description>The web application deployment descriptor conveys web application model
elements and configuration information of an application between application
developers, application assemblers, and deployers.
</description>
<display-name>Hello World Web</display-name>
<servlet>
<servlet-name>HelloWorldWeb</servlet-name>
<servlet-class>org.carte.web.HelloWorldWeb</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorldWeb</servlet-name>
<url-pattern>/helloworldweb</url-pattern>
</servlet-mapping>
</web-app>
L'appel de la Servlet se fait par lâintermĂ©diaire d'un navigateur web en prĂ©cisant l'URL suivante :
http://adresse_de_la_carte/helloworldweb
L'utilisation des Servlets sur une Java card se fait exactement de la mĂȘme maniĂšre que sur une plate-forme JAVA EE.
IntĂ©rĂȘts
Les producteurs de cartes à puces (tel que Gemalto, Idemia...) implémentent les fonctionnalités de Java Card suivantes[46] :
- Interopérabilité : les Applets développées avec la technologie Java Card fonctionnent sur n'importe quel type de cartes à puce (et indépendamment du matériel sous-jacent).
- Sécurité : la technologie de Java Card repose sur la sécurité du langage de programmation Java pour fournir un environnement d'exécution sécurisé.
- Possibilité d'applications multiples[note 19] : la technologie de Java Card permet à de multiples applications de cohabiter en sécurité sur une seule carte à puce.
- Dynamique : de nouvelles applications peuvent ĂȘtre installĂ©es en toute sĂ©curitĂ© aprĂšs qu'une carte a Ă©tĂ© fournie Ă l'utilisateur, permettant aux producteurs de carte de rĂ©pondre dynamiquement aux besoins de changement de leur client.
- Compatible avec les normes existantes : l'API de Carte Java est compatible avec les standards internationaux pour Carte Ă puce comme ISO7816 ou Europay Mastercard Visa :
L'utilisation du langage de programmation Java apporte un gain pour les développeurs d'applications[46] :
- La programmation orientée objet apporte une plus grande modularité du code et sa réutilisation, augmentant la productivité du programmeur.
- La protection figurant dans les caractéristiques du langage de programmation Java s'applique aux applets de Java Card, mettant en application des attributs de protection et de typage fort.
Marché
De nombreux types de cartes Ă puce peuvent profiter de la technologie de Java Card[47]:
- Carte SIM (Subcriber Identity Module) utilisée dans les téléphones cellulaire sur les réseaux sans fil.
- Carte bancaire.
- Carte d'identité.
- Carte santé.
- Les cartes qui fournissent l'accĂšs logique et physique aux ressources d'entreprises.
Sur la majorité de réseaux téléphoniques cellulaires, un abonné utilise une carte à puce généralement appelée une carte SIM pour activer le téléphone. La carte authentifie l'utilisateur et fournit des clés de chiffrement pour le transport de la voix numérique. les cartes SIM implémentées de la technologie de Java Card peuvent aussi fournir des services transactionnels bancaires à distance. Des centaines de millions de cartes SIM basées sur la technologie de Java Card fonctionnent déjà avec des services innovants sur les téléphones cellulaires.
Dans le secteur bancaire, les cartes à puce donnent l'accÚs sécurisé aux utilisateurs à une large gamme de services financiers incluant les distributeurs automatiques de billets, le paiement de factures et de péages. La technologie de Java Card permet à une seule carte à puce d'héberger de multiples applications financiÚres et de livrer des services tiers ou de sécuriser sur le commerce en ligne.
De nombreuses applications sont disponibles dans les domaines oĂč la sĂ©curitĂ© et l'authentification sont importantes tel que l'accĂšs sĂ©curisĂ© Ă des installations, dossiers mĂ©dicaux.
La technologie de Java Card amĂ©liore l'accĂšs grand public aux nouveaux services de commerce en ligne par lâintermĂ©diaire d'appareils connectĂ©s. En effet, les tĂ©lĂ©phones cellulaires et les Ă©quipements de tĂ©lĂ©vision pour chaĂźnes payantes sont les exemples de marchĂ©s oĂč la majoritĂ© de produits, dĂ©jĂ disponibles, incluent dĂ©jĂ des lecteurs de carte Ă puce.
Acteurs du marché[48].
Fabricant | Gamme de Produits |
---|---|
STMicroelectronics, Atmel, Infineon, Samsung, NXP, Inside Contactless | Semi-Conducteur et Micro-Processeur |
Thales, IDEMIA, Safran Morpho, Giesecke & Devrient | Cartes |
Ingenico, Verifone, Hypercom, Nokia | Terminaux et lecteurs |
Orange, RATP, Véolia, BNP Paribas | Opérateur de services et e-Gouvernement |
Trusted Logic, Prism, Multos | Logiciel embarqués OS et Applications |
Cesti, Fime | Ăvaluation et Test |
Experian, Atos Worldline, First Data, Sopra | Intégration et systÚmes |
Chiffres
Selon le rapport gouvernemental «Dimension économique et industrielle des cartes à puces» de , le marché mondial des cartes à puces a dépassé les 5 milliards d'unités. (Source Nodal)[49].
Glossaire
- AID (Application IDentifier) : une chaine de caractÚre utilisé comme identifiant unique des Applets de la carte à puce selon la norme ISO 7816
- APDU : Abréviation pour Application Protocol Data Units défini selon la norme ISO 7816-4.
- APPLET : un composant simple d'une application Java Card qui s'exĂ©cute dans lâenvironnement APDU.
- APPLET ETENDU: Dans le contexte Java Card, Une Applet étendu possÚde les fonctionnalités de la version connectée. (Exemple : Manipulation de Chaine de caractÚre).
- Conteneur d'Applet : Mécanisme qui manage le cycle de vie des Applets. Dans le contexte Java Card, le conteneur fournit les services de communication sur lesquels les commandes d'APDU et des réponses sont envoyés.
- Ramasse Miette automatique (Garbage collector) : Mécanisme qui libÚre automatiquement la mémoire utilisé par des objets qui ne sont plus utilisés par l'application. (Uniquement disponible dans la version 3 connectée).
- SERVLET : Un composant gĂ©nĂ©rant dynamiquement du contenu web sâexĂ©cutant au sein d'une application web.
Notes et références
Notes
- qui est nommée dans la littérature scientifique anglo-saxonne Java Card Virtual Machine
- qui est nommé dans la littérature scientifique anglo-saxonne Java Card Runtime Environment
- qui sont nommées dans la littérature scientifique anglo-saxonne Application Programmer Interface
- bytecode ou code binaire intermédiaire en français inclus dans les fichiers de classe (extension .class ).
- qui est nommé dans la littérature scientifique anglo-saxonne Off-Card
- qui est nommé dans la littérature scientifique anglo-saxonne Private Computer, «Ordinateur personnel» en français.
- qui est nommé dans la littérature scientifique anglo-saxonne On-Card
- qui est nommé dans la littérature scientifique anglo-saxonne CAP file (Converted APplet)
- qui est nommé dans la littérature scientifique anglo-saxonne Export File
- qui est nommé dans la littérature scientifique anglo-saxonne Card Acceptance Device
- qui est nommée dans la littérature scientifique anglo-saxonne industry-specific extensions
- méthodes de bases qui sont nommées dans la littérature scientifique anglo-saxonne natives method
- qui est nommée dans la littérature scientifique anglo-saxonne Connected Limited Device Configuration
- . Un accesseur est une méthode permettant de récupérer le contenu d'une donnée membre protégée
- contexte : Un service de nom associe des noms avec des objets. Une association entre un nom et un objet est appelĂ©e une attache et des jeux d'attaches sont appelĂ©s un contexte. Un nom dans un contexte peut devoir nĂ©cessairement un autre contexte qui utilise les mĂȘmes conventions de nommage ; le contexte attachĂ© est appelĂ© un sous-contexte.
- Application IDentifiant Identifiant d'application en français
- Ressource IDentifier Identifiant de la ressource en français
- Proprietary IDentifier extension extension de l'identifiant propriétaire en français
- qui est nommé dans la littérature scientifique anglo-saxonne Application multi capability.
Références
- Baentsch 1999, p. 37
- Oracle : Spécifications des versions
- Zhiqun 2000, p. 29
- ISO7816
- Oracle : Chapitre Composants
- Zhiqun 2000, p. 30
- Sun 2008, p. 7
- Sun 2008, p. 1
- Sun 2008, p. 2
- Zhiqun 2000, p. 34
- Zhiqun 2000, p. 31
- Oracle 2002, p. 1
- Casset 2002, p. 209
- Zhiqun 2000, p. 32
- Zhiqun 2000, p. 33
- Zhiqun 2000, p. 35
- Zhiqun 2000, p. 36
- Zhiqun 2000, p. 37
- Dufay,2003, p.28
- Zhiqun 2000, p. 38
- Gemalto : Chapitre APIs
- Sun 2002, p. 147
- Ghindici 2006, p. 6
- Sun 2008, p. 5
- Sun CLDC : Introduction
- Sun 2008, p. 4
- Sun 2008, p. 6
- Type utilisé dans la programmation Java
- Classe StringBuilder
- Types génériques du langage Java
- Autoboxing en Java
- ĂnumĂ©ration du langage Java
- Import statique du langage Java
- Java Servlet Specification : Java Card Platform, Version 3.0.1 Connected Edition, p. 3-1
- Java Servlet V2.4
- (en) « Internet X.509 Public Key Infrastructure / Certificate and CRL Profile », Request for comments no 2459, .
- Gemalto : Chapitre sécurité
- Sun 2008, p. 13
- Sun 2008, p. 14
- Sun 2008, p. 16
- Sun 2008, p. 17
- Sun 2008, p. 19
- ISO : norme ISO7816-4
- ISO : norme ISO7816-5
- Gemalto 2009, p. 19
- Oracle : Chapitre bénéfices
- Oracle : Chapitre Industries
- Dimension Ă©conomique et industrielle des cartes Ă puces, p. 29
- Dimension Ă©conomique et industrielle des cartes Ă puces, p. 19
Bibliographie
- (en) Zhiqun Chen, Java Card Technology for Smart Cards : Architecture and Programmer's Guide, Addison Wesley, (lire en ligne)
- (en) M. Baentsch, P. Buhler, T. Eirich, F. Horing et M. Oestreiche, « JavaCard-from hype to reality », IEEE Concurrency, vol. 7, no 4,â , p. 36-43 (ISSN 1092-3063, DOI 10.1109/4434.806977)Secure Syst. Group, IBM Res. Div. Zurich
- (en) L. Casset et JL. Lanet, « Increasing smart card dependability », ACM,â , p. 209 - 212 (DOI 10.1145/1133373.1133416)EW 10 Proceedings of the 10th workshop on ACM SIGOPS European workshop
- (en) P.H. Hartel et L. Moreau, « Formalizing the safety of Java, the Java virtual machine, and Java card », ACM Computing Surveys (CSUR), vol. 33, no 4,â , p. 517-558 (ISSN 0360-0300, e-ISSN 1557-7341, DOI 10.1145/503112.503115)
- (en) Dorina Ghindici, Gilles Grimaud et Isabelle Simplot-Ryl, « Embedding verifiable information flow analysis », ACM Computing Surveys (CSUR),â , p. 1-9 (ISBN 1-59593-604-1, DOI 10.1145/1501434.1501481)
- Guillaume Dufay, VĂ©rification formelle de la plate-forme Java Card, (lire en ligne)
- (en) Java Cardâą 2.2 Application Programming Interface : Revision 1.1 for the 2.2_01 Release, 901 San Antonio Road Palo Alto, CA 94303 USA, Sun Microsystems, Inc, , 2.2_01 Ă©d., 278 p. (lire en ligne)
- (en) THE JAVA CARDâą 3 PLATFORM, 901 San Antonio Road Palo Alto, CA 94303 USA, Sun Microsystems, Inc, , 34 p. (lire en ligne)
- (en) Gemalto, Java Cardâą & STK Applet Development Guidelines : version 2, , WG.GGS.4.0042 Ă©d., 53 p. (lire en ligne)
- (en) Oracle, Java Card 2.2 Off-Card Verifier : version 2.2, 901 San Antonio Road Palo Alto, CA 94303 USA, , 24 p. (lire en ligne)
- (en) Javaâą Servlet Specification : Java Cardâą Platform, Version 3.0.1 Connected Edition, 901 San Antonio Road Palo Alto, CA 94303 USA, Sun Microsystems, Inc, , 162 p.
- (en) ISO7816-4 Cartes d'identification -- Cartes à circuit intégré : Partie 4 : Organisation, sécurité et commandes pour les échanges, , 2e éd.
- Dimension Ă©conomique et industrielle des cartes Ă puces, www.industrie.gouv.fr, , 1re Ă©d. (lire en ligne), p. 74
Voir aussi
Liens externes
- (en) « Spécifications de Java Card Version 3.0.1 »
- (en) « Oracle Javacard Overview »
- (en) « Organisation internationale de normalisation »
- (en) « Gemalto Java Card⹠»
- (en) « Oracle Java Card Spécifications »
- (en) « Classic_Features Java Card Release Note »
- (en) « Oracle Java Card 2.2.2 »,
- (en) « Oracle Java Card Industries »
- (en) « Sun CLDC »
- (en) « Java Servlet V2.4 »
- (en) « Type utilisé dans la programmation Java »
- (en) « Classe StringBuilder »
- (en) « Types génériques du langage Java »
- (en) « Autoboxing en Java »
- (en) « ĂnumĂ©ration du langage Java »
- (en) « Méthodes à arguments multiples du langage Java »
- (en) « Import statique du langage Java »