AccueilđŸ‡«đŸ‡·Chercher

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].

présentation architecture

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.
Schéma de l'architecture

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] :

Java Card Virtual Machine

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.
gestion transfert fichier(s)

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].

JCRE Architecture

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]
  1. Mises en Ɠuvre de clĂ©s de chiffrement diffĂ©rentes par la classe KeyBuilder ;
  2. Hachage des données par la classe MessageDigest ;
  3. Génération de données aléatoires par la classe RandomData ;
  4. Signature par la classe Signature ;
  5. É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]

Diagramme appel mode connecté (utilisation Http)
Carte à puce traditionnelleCarte à puce récente compatible V3
8/16-bit CPU32-bit CPU
2 kb RAM24 kb RAM
48 kb - 64 kb ROM>256 kb ROM
8–32 kb EEPROM>128 kb EEPROM
Serial I/O interfaceHigh-speed interfaces
9,6 kb/s - 30 kb/s1,5 Mb/s - 12 Mb/s
Full duplexHalf 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 :

Format d'une commande APDU.
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 :

Format d'une réponse APDU.
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 et 0x9F indique que la commande a Ă©tĂ© correctement exĂ©cutĂ©e. Une valeur entre 0x60 et 0x6F 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 1APDU de commande sans donnéeAPDU de réponse sans donnée
Cas 2APDU de commande avec donnée(s)APDU de réponse sans donnée
Cas 3APDU de commande sans donnéeAPDU de réponse avec donnée(s)
Cas 4APDU de commande avec donnée(s)APDU de réponse avec donnée(s)
Format de l'identifiant d'application.

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);
        }
    }
}
Diagramme d'appel de l'exemple

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].

FabricantGamme de Produits
STMicroelectronics, Atmel, Infineon, Samsung, NXP, Inside ContactlessSemi-Conducteur et Micro-Processeur
Thales, IDEMIA, Safran Morpho, Giesecke & DevrientCartes
Ingenico, Verifone, Hypercom, NokiaTerminaux et lecteurs
Orange, RATP, Véolia, BNP ParibasOpérateur de services et e-Gouvernement
Trusted Logic, Prism, MultosLogiciel embarqués OS et Applications
Cesti, FimeÉvaluation et Test
Experian, Atos Worldline, First Data, SopraInté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

  1. qui est nommée dans la littérature scientifique anglo-saxonne Java Card Virtual Machine
  2. qui est nommé dans la littérature scientifique anglo-saxonne Java Card Runtime Environment
  3. qui sont nommées dans la littérature scientifique anglo-saxonne Application Programmer Interface
  4. bytecode ou code binaire intermédiaire en français inclus dans les fichiers de classe (extension .class ).
  5. qui est nommé dans la littérature scientifique anglo-saxonne Off-Card
  6. qui est nommé dans la littérature scientifique anglo-saxonne Private Computer, «Ordinateur personnel» en français.
  7. qui est nommé dans la littérature scientifique anglo-saxonne On-Card
  8. qui est nommé dans la littérature scientifique anglo-saxonne CAP file (Converted APplet)
  9. qui est nommé dans la littérature scientifique anglo-saxonne Export File
  10. qui est nommé dans la littérature scientifique anglo-saxonne Card Acceptance Device
  11. qui est nommée dans la littérature scientifique anglo-saxonne industry-specific extensions
  12. méthodes de bases qui sont nommées dans la littérature scientifique anglo-saxonne natives method
  13. qui est nommée dans la littérature scientifique anglo-saxonne Connected Limited Device Configuration
  14. . Un accesseur est une méthode permettant de récupérer le contenu d'une donnée membre protégée
  15. 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.
  16. Application IDentifiant Identifiant d'application en français
  17. Ressource IDentifier Identifiant de la ressource en français
  18. Proprietary IDentifier extension extension de l'identifiant propriétaire en français
  19. qui est nommé dans la littérature scientifique anglo-saxonne Application multi capability.

Références

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

Cet article est issu de wikipedia. Text licence: CC BY-SA 4.0, Des conditions supplĂ©mentaires peuvent s’appliquer aux fichiers multimĂ©dias.