Design Web Patterns for JavaCards



Documents pareils
Java et les bases de données

Module BD et sites WEB

La technologie Java Card TM

La carte à puce. Jean-Philippe Babau

as Architecture des Systèmes d Information

Java et les bases de données: JDBC: Java DataBase Connectivity SQLJ: Embedded SQL in Java. Michel Bonjour

Principales failles de sécurité des applications Web Principes, parades et bonnes pratiques de développement

TP JEE Développement Web en Java. Dans ce TP nous commencerons la programmation JEE par le premier niveau d une application JEE : l application web.

Programmation Par Objets

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Java DataBaseConnectivity

Projet de Veille Technologique

Dis papa, c est quoi un bus logiciel réparti?

Web Tier : déploiement de servlets

Mise en œuvre des serveurs d application

Projet de programmation (IK3) : TP n 1 Correction

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

L3 informatique TP n o 2 : Les applications réseau

Plan du cours. Historique du langage Nouveautés de Java 7

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Programmer en JAVA. par Tama

Plateforme PAYZEN. Définition de Web-services

Extension SSO Java. Cette note technique décrit la configuration et la mise en œuvre du filtre de custom SSO Java.

La persistance des données dans les applications : DAO, JPA, Hibernate... COMPIL 2010 francois.jannin@inp-toulouse.fr 1

Pour plus de détails concernant le protocole TCP conférez vous à la présentation des protocoles Internet enseignée pendant.

PHP et mysql. Code: php_mysql. Olivier Clavel - Daniel K. Schneider - Patrick Jermann - Vivian Synteta Version: 0.9 (modifié le 13/3/01 par VS)

Programmation en Java IUT GEII (MC-II1) 1

Lambda! Rémi Forax Univ Paris-Est Marne-la-Vallée

Cedric Dumoulin (C) The Java EE 7 Tutorial

Formation Webase 5. Formation Webase 5. Ses secrets, de l architecture MVC à l application Web. Adrien Grand <jpountz@via.ecp.fr> Centrale Réseaux

Développement d applications Internet et réseaux avec LabVIEW. Alexandre STANURSKI National Instruments France

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Java c est quoi? Java. Java. Java : Principe de fonctionnement 31/01/ Vue générale 2 - Mon premier programme 3 - Types de Programme Java

LA CARTE D IDENTITE ELECTRONIQUE (eid)

WEB page builder and server for SCADA applications usable from a WEB navigator

NIMBUS TRAINING. Administration de Citrix NetScaler 10. Déscription : Objectifs. Publics. Durée. Pré-requis. Programme de cette formation

Définition des Webservices Ordre de paiement par . Version 1.0

OpenPaaS Le réseau social d'entreprise

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

INITIATION AU LANGAGE JAVA

Les solutions de paiement CyberMUT (Crédit Mutuel) et CIC. Qui contacter pour commencer la mise en place d une configuration de test?

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Remote Method Invocation (RMI)

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Introduction à JDBC. Accès aux bases de données en Java

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

ADMINISTRATION DE ADOBE LIVECYCLE MOSAIC 9.5

Java Licence Professionnelle CISII,

Plan. Department of Informatics

Alfstore workflow framework Spécification technique

JADE : Java Agent DEvelopment framework. Laboratoire IBISC & Départ. GEII Université & IUT d Evry nadia.abchiche@ibisc.univ-evry.

Communication inter-processus (IPC) : tubes & sockets. exemples en C et en Java. F. Butelle

Serveurs de noms Protocoles HTTP et FTP

Instructions pour mettre à jour un HFFv2 v1.x.yy v2.0.00

Perso. SmartCard. Mail distribution. Annuaire LDAP. SmartCard Distribution OCSP. Codes mobiles ActivX Applet. CRLs

Gestion distribuée (par sockets) de banque en Java

4. Outils pour la synchronisation F. Boyer, Laboratoire Lig

Projet gestion d'objets dupliqués

Modélisation PHP Orientée Objet pour les Projets Modèle MVC (Modèle Vue Contrôleur) Mini Framework

Vulgarisation Java EE Java EE, c est quoi?

Architecture Orientée Service, JSON et API REST

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

Traitement de données

HAUTE DISPONIBILITÉ DE MACHINE VIRTUELLE AVEC HYPER-V 2012 R2 PARTIE CONFIGURATION OPENVPN SUR PFSENSE

TP1 : Initiation à Java et Eclipse

La Latecion protection anti-intrusion Web Web Le concept «Zero effort Security» La protection des applications Extranet

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

La base de données XML exist. A. Belaïd

Installation de SCCM 2012 (v2)

BIRT (Business Intelligence and Reporting Tools)

Installation d'un TSE (Terminal Serveur Edition)

Cours 1: Java et les objets

Utilisation de JAVA coté Application serveur couplé avec Oracle Forms Hafed Benteftifa Novembre 2008

Application Web et J2EE

Sécurité des sites Web Pas un cours un recueil du net. INF340 Jean-François Berdjugin

Threads. Threads. USTL routier 1

Architecture JEE. Objectifs attendus. Serveurs d applications JEE. Architectures JEE Normes JEE. Systèmes distribués

Derrière toi Une machine virtuelle!

27/11/12 Nature. SDK Python et Java pour le développement de services ACCORD Module(s)

Paginer les données côté serveur, mettre en cache côté client

Chapitre VI- La validation de la composition.

Vulnérabilités et sécurisation des applications Web

JOnAS 5. Serveur d application d

JavaServer Pages (JSP)

Attaques applicatives

Supervision et infrastructure - Accès aux applications JAVA. Document FAQ. Page: 1 / 9 Dernière mise à jour: 15/04/12 16:14

RMI le langage Java XII-1 JMF

WORKSHOP OBIEE 11g (version ) PRE-REQUIS:

Remote Method Invocation Les classes implémentant Serializable

Patrons de Conception (Design Patterns)

Développement Logiciel

Jahia. Guillaume Monnette École Ingénieurs 2000 Marne-La-Vallée IR3

SGBDR. Systèmes de Gestion de Bases de Données (Relationnelles)

Gestion centralisée d un réseau de sites discrets. Nicolas JEAN

Network Shutdown Module V3 Extension du Manuel Utilisateur pour architecture Virtualisée VMWare ESX Server 3, 3.5

Guide d'installation et de configuration de Pervasive.SQL 7 dans un environnement réseau Microsoft Windows NT

Network Shutdown Module V3 Extension du Manuel Utilisateur pour architecture Virtualisée VMWare ESX Server

Un ordonnanceur stupide

Transcription:

Design Web Patterns for JavaCards (A PATTERN ORIENTED LIGHTWEIGHT MIDDLEWARE FOR SMARTCARDS) version du 10/Octobre/2004 jm Douin, Cnam/cédric 1

Sommaire JavaCard comme «WebServices» Ou la programmation Java côté serveur(javacard) Architecture «orientée objet» et Composite Gestion d un grand nombre de JavaCard, structuration, hiérarchie, Parcours distribué et Visiteur Mise à jour, interrogations globales ou sélectives, Exemples Deux TPs au Cnam Extensions Toujours possibles 2

Bibliographie(points d entrées) Publications : http://jfod.cnam.fr/tp_cdi/douin/collabpatterns.pdf et http://jfod.cnam.fr/tp_cdi/douin/cardis04.pdf Routaboul Joël, Lebougre Hervé. Présentation Java Card. ValeurC ISTR 04/2003 http://jfod.cnam.fr/tp_cdi/routaboul/javacard.pdf Barber, J. (1999) The Smart Card URL Programming Interface. Gemplus Developer Conference, http://www.microexpert.com/smartcardurl.html Di Georgio R. Develop, build, and test Java Card applications http://www.javaworld.com/javaworld/jw-04-1998/jw-04-ibuttons_p.html Harald Vogt, Michael Rohs, Roger Kilian-Kehr, Middleware for Smart Cards Chapter 16 of the book Middleware for Communications, John Wiley & Sons 2004 http://www.inf.ethz.ch/vs/publ/papers/chapter-16-mw4scs-webversion-031006.pdf Guthery, S., Kehr, R., Posegga, J. (2000) How to turn a GSM SIM into a Web Server. IFIP CARDIS 2000. Rees, J., Honeyman, P. (2000) Webcard: A Java Card Web Server. IFIP CARDIS 2000, CITI TechReport 99-3. http://smarty.citi.umich.edu/. // un serveur Web sur une JavaCard actif depuis plusieurs années Itoi, N., Fukuzawa, T., Honeyman, P. (2000) Secure Internet Smartcards. Java Card Workshop, Cannes, CITI Tech Report 00-6. Chen Sun Zhiqun Chen, Java Card Technology for Smart Cards - Architecture and Programmer's Guide, Addison- Wesley, ISBN 0-201-70329-7 http://www.javaworld.com/javaworld/jw-07-1999/jw-07-javacard_p.html http://java.sun.com/products/javacard/ http://java.sun.com/developer/books/consumerproducts/javacard/index.html Ortiz, Enrique, An Introduction to Java Card Technology http://developers.sun.com/techtopics/mobility/javacard/articles/javacard1/ /javacard2/ /javacard3/ Donsez, D. Transparents des cours http://www-adele.imag.fr/~donsez/cours/#smartcard Brazil http://www.experimentalstuff.com Dallas/JavaCard http://www.ibutton.com/ibuttons/java.html 3

Protocole HTTP Objectifs Intergiciel/middleware léger Les JavaCard sont accessibles depuis le Web Une URL par Applet/Cardlette Quel environnement? Postulat : Toute machine possède un serveur Web «Contraintes» matérielles Serveur Web de petite taille < 50 ko Station, PC, Cartes TINI, Tout type de JavaCard, smartcard 4

JavaCard comme «WebServices» internet Serveur HTTP PC Ajout, retrait Lecteur de cartes Applet == servlette est une des conséquences Une JavaCard devient un ensemble «mobile» de servlettes 5

Prototypes au Cnam Environnement matériel JavaCard de dallas compatible API JavaCard 2.0 Lecteurs sur ports séries et USB Cartes TINI 1-Wire natif PC, Station banalisées PocketPC, contrôle temporaire développements en cours avec d autres JavaCard API2.1(Shareable), API 2.2 (jcrmi) smart-cards OpenCard Framework, PC/SC 6

HTTP <-> APDU http PC ou adresse IP handler ou servlette javacardid ={jc1 jc2 jc3} AppletID = nom de la servlettejc PC /handler/ APDU Lecteur de cartes jc1 jc2 jc3 http://pc/handler/javacardid/appletid/ http://pc/handler/javacardid/appletid/?param=valeur AppletID de 5 à 16 caractères 7

HTTP <-> APDU Applet== servlette Premiers bénéfices escomptés Programmation JavaCard est-elle simplifiée? Nouvelles applications? Une seule classe d Applet Un seul point d entrée Unique format des paramètres en entrée comme en sortie HTTP = Couplage faible? http APDU Lecteur de cartes PC /handler/ jc1 jc2 jc3 http://pc/handler/javacardid/appletid/?clé=valeur http://pc/handler/jc1/crypter/?param=texte 8

HTTP<-> APDU Depuis le PC/Proxy Un exemple de requête (voir en annexe) http://pc/handler/jc1/crypter/?param=texte jc1.select("crypter"); byte[] DataIn = new byte{ {, p, a, r, a, m, =,, t, e, x, t, e, } }; response = jc1.sendapdu(new CommandAPDU(0, 0, 0, DataIn, 0); result = new String(response.getDataOut()); 9

HTTP<-> APDU Depuis la JavaCard Un exemple de servlette (voir en annexe) Requête : http://pc/handler/jc1/crypter/?param=texte apdudata = Réception des données (de type byte) //Toujours le même point d'entrée, if( buffer[iso.offset_ins] == SERVLET_METHOD){ byte[] texte = extrairebytearray(apdudata, param); if(texte!=null){ // traitement associé ici du cryptage 10

Mise en Œuvre du Proxy Serveur Web sur une station, TINI, PocketPC, De petite taille Portable Opensource Une seule servlette d accès aux javacard 11

Serveur Web Brazil : pour l embarqué Serveur Web sur carte TINI < 50 ko Sources Java disponibles, Ses 3 composantes Handler Servlettes légères, 2 méthodes : init et respond Filter Filtrage des transactions entre «handler» Templates Étiquettes XML, interprétées par le serveur avant l envoi d une page HTML aux clients 12

Serveur Web = Brazil Un handler Brazil assure l interface HTTP/APDU Un filtre/template assure l interprétation des balises venant des JavaCard Adéquation URL JavaCard L URL précise la javacard ainsi que la servlette Les paramètres de l URL sont transmis tels quels aux servlettes de la JavaCard JavaCard HTML Les servlettes de la JavaCard retournent un texte HTML, retourné au navigateur ou à une application cliente distante (ou locale) 13

Ou tout autre serveur (de petite taille) Un moteur de servlettes conviendrait Ex. le moteur de servlettes pour TINI n importe quel serveur HTTP ferait un bon candidat! Protocole HTTP/APDU Seul le format des paramètres destinés aux JavaCard est à respecter 14

Couplage faible Une JavaCard est un ensemble de servlettes Un ensemble de servlettes peut remplacer une JavaCard internet internet Serveur HTTP PC Serveur HTTP PC portail Ajout, retrait Lecteur de cartes internet Serveur HTTP servlettes 15

HTTP <-> APDU, quelques questions Quels sont paramètres pour une servlette? Comment découvre-t-on ces paramètres? Mobilité quelles sont les conséquences? Une JavaCard est mobile donc les servlettes sont mobiles Interaction avec l hébergeur comment? Variables partagées? Entre l hébergeur et une javacard, entre 2 javacard Exclusion mutuelle? Accès protégé à une javacard, à une servlette 16

URL et paramètres Quels sont paramètres pour une servlette? Comment les découvre-t-on? Choix effectué Paramètres ou signature = Formulaire HTML <FORM ACTION="http://PC/handler/javacardId/servletId/" > <input type="text" name="texte" size="20"> <input type="submit" name="exec" value="exec" size="10"> </FORM> Ici un seul paramètre : texte Plusieurs signatures par servlette 17

Signatures embarquées Chaque servlette contient la description des paramètres (signature) qu elle attend Plusieurs signatures par servlette sont possibles Une première implémentation : Les formulaires HTML sont compressés et embarqués Ces formulaires deviennent des signatures 18

Embarquées et compressées Méthode de compression inspiré de l algorithme des signatures des méthodes de la JVM <FORM ACTION="http://PC/handler/javacardId/servletId/" method="post" > <input type="text" name="texte" size="20"> <input type="submit" name="exec" value="exec"> </FORM> devient 5Ttexte20Sexec exec (ici codage sur 5 digits) Ou bien 2Tte20Sexex (codage sur 2 digits) Note : un outil est en http://163.173.228.80:8765/formulaire.html 19

Découverte des paramètres(1) Par convention l obtention de la signature n utilise cette URL (n>=0) Exemple : de requête : http://pc/handler/jc1/crypter/?sig=n http://pc/handler/javacardid/servletid/?sig=0 http://pc/handler/javacardid/servletid/?sig=n+1 Le nombre de formulaire est obtenu de la même manière http://pc/handler/javacardid/servletid/?nsig Note : ces implémentations sont à la responsabilité du développeur de la servlette 20

Découverte des paramètres(2) http://pc_a/handler/jc1/engras/?sig=0 Le Handler reçoit 5Ttexte20Sexec exec de jc1 Celui-ci peut le décompresser et le retourner le formulaire «original» au client Ajout, retrait handler PC_A Lecteur de cartes Ou bien http://pc_a/handler/jc1/engras/?texte=test Note : PC_A/Handler/ doit être une variable, servlettes mobiles jc1 21

Découverte des paramètres(3) Serveur HTTP PC_A Serveur HTTP PC_B Lecteur de cartes jc1 Lecteur de cartes jc1 Les JavaCard, (les servlettes) sont mobiles 22

Découverte des paramètres(4) 5Ttexte20Sexec exec devient <FORM ACTION="http://PC_B/handler/javacardId/servletId/" method="post" > <input type="text" name="texte" size="20"> <input type="submit" name="exec" value="exec"> </FORM> http://pc_b/handler/ dépend de la machine hôte C est l hébergeur qui s en charge ou bien une page html dans laquelle PC/Handler/ est un paramètre 23

URL paramétrée Une technique classique ( programmation coté serveur) : une des servlettes propose le formulaire attendu <tag>form action=<get URLHandler>javacardId/servletId/ </tag> <input type="text" size="40" name= "texte" value="formulaire retourné par la JavaCard"> <input type="submit" name="b1" value="exécuter servletid"> </form> balise <get URLHandler> le site d accueil + le nom du Handler Note : à essayer en http://163.173.228.80:8765/javacard/monitor/1c00900000205596/formengras2/ 24

Exemple de formulaire engendré FormEnGras2 retourne un formulaire pour EnGras2 EnGras2 est une servlette qui retourne ce <b> texte </b> Note : les 2 servlettes ne sont pas nécessairement sur la même JavaCard, le cas sur cet exemple 25

Filtre et Template bien utiles Interprétation de balises Les prédéfinies <set <sql <form <sendmail, etc SetTemplate, SqlTemplate, FormTemplate, EMailTemplate Définies par l utilisateur <user <clock <javacard ID <notify... UserTemplate, ClockTemplate, JavaCardTemplate 26

Un exemple <clock 1073414899> PC Serveur HTTP Balises délivrées par les servlettes de la JavaCard 27

Un exemple de page retournée <clock 1073414899> JavaCard ClockTemplate Hébergeur PC Serveur HTTP Client Note : voir en annexe, et à essayer en http://163.173.228.80:8765/javacard/monitor/1c00900000205596/tagclock/?tag=on 28

Un autre exemple <sql prefix=liste> select DATE,TP,NOTE from TP_CDI where MATRICULE='I044733' and tp like 'tp_' order by TP</sql> PC Serveur HTTP BDD Accès à une Base de données : une requête SQL 29

Paramètres et variables partagées Entre deux servlettes à l aide des formulaires (HTML) Champ rempli par une servlette et envoyé à une seconde servlette Ce champ est en «clair» ou «caché» <input type=hidden name= value=... Variables partagées( javacard API 2.1) En interne à l aide de l interface Shareable Encore une technique empruntée à la programmation coté serveur 30

Paramètres et variables partagées Entre une servlette et l hébergeur Balises (SetTemplate, ) <set name= value= <get name> Donc, en conséquence Variables partagées Entre deux servlettes Entre deux javacard «locales» Entre deux javacard distantes Entre une servlette et «internet» http PC APDU Lecteur de cartes variable jc1 jc2 <set.. Note : à essayer en http://163.173.228.80:8765/javacard/monitor/1c00900000205596/setparameter/ suivie de http://163.173.228.80:8765/lesjib.html 31

Accès en exclusion mutuelle Ressource partagée, Section critique sur le Web Exemple : Un classique porte-monnaie internet Serveur HTTP Client1 Client2 PC Un classique en programmation côté serveur Lecteur de cartes synchronized(servlette){ } 32

Exclusion mutuelle Implémentation Reprise de ETFA 2003, (voir pattern Itérateur) Identification du client, Association Client et Cookie Identification la servlette, lors d une requête, Association Servlette/URL et Verrou Gestion installée sur l hébergeur Par un Handler Brazil indépendant Les URLs deviennent les «objets» dont les accès peuvent être en exclusion mutuelle 33

Exclusion mutuelle et URL(1) ClientA http://site/javacardid/servletid/?beginmutex& ClientB http://site/javacardid/servletid/? beginmutex& Le clientb est bloqué ClientA http://site/javacardid/servletid/?endmutex& ClientB Le clientb peut accéder à l URL souhaitée, et entre en section critique Note: l attente contient un délai de garde et permet au clientb de poursuivre son exécution 34

Exclusion mutuelle et URL(2) Utilisation effective de http://sitec Fin du délai de garde clientb A R A R clienta A R A R D D D t A = http://sitec/?beginmutex D = http://sitec/ R = http://sitec/?endmutex Les clients sont distants en mode session 35

Exclusion mutuelle, une trace : ClientA autres requêtes, déconnexion, etc Alias de beginmutex : lock, endmutex : unlock 36

Exclusion mutuelle, une trace : ClientB Le client A possède la «ressource URL» B est bloqué Lorsque le client A libére la «ressource URL» Ou bien le délai est échu 37

Exclusion mutuelle? Que se passe-t-il si Le client bloque indéfiniment la ressource/url? Le client disparaît La JavaCard et ses servlettes sont retirées? Cette JavaCard s est déplacée Des solutions existent... voir avec l usage conjoint du modèle transactionnel JCSystem.beginTransaction(); JCSystem.commitTransaction(); JCSystem.abortTransaction(); 38

Conclusion HTTP<->APDU La conclusion de Barber 1999, Cross platform availability The use of HTTP as the communications protocol means that any browser at all can communicate with the card server. The use of Java to implement the card server means that any platform that supports a Java virtual machine can host the card server Flexibility Easy to add extra functionality in the form of modules. Remote administration is available, so module maintenance doesn't have to be the user's responsibility. Remote administration also means support and troubleshooting is easier Rapid development The use of HTTP allows parameters to be passed in a human readable form, so communication problems tend to be resolved quickly. The use of Java enables cross platform deployment without the problems traditionally associated with it. Security model considerations Responsibility for security now lies in the card server, not the browser. The card server can implement the appropriate model for its intended use, with the Java class library providing enough functionality to implement mechanisms such as code signing, access control lists and so on. 39

Conclusion HTTP<->APDU Programmation Java Côté Serveur Techniques «connues» de programmation des servlettes Retour à une programmation par les objets Adéquation servlette / instance de classes MAIS. 40

Intégration, accès depuis internet Quelle architecture pour Découverte locale des services? Ajout, retrait d une JavaCard Découverte globale des services? Depuis le Web Interrogation, mise à jour, déploiement 41

Découverte locale des services Ajout/retrait d une JavaCard Le Handler Brazil est un observateur(etfa2003) Une liste de toutes les servlettes est maintenue Commandes et gestion locales possibles http://localhost/handler/javacardid/servletid/ PC Lecteur de cartes 42

Gestion locale / HTTP, exemples Liste des commandes possibles http://pc/handler/?command=? Liste de toutes les servlettes disponibles http://pc/handler/?command=list Obtention de la version du firmware http://pc/handler/javacardid/?command=firmware Téléchargement d une servlette http://pc/handler/javacardid/servletid/?command=load Retrait d une servlette http://pc/handler/javacardid/?command=delete 43

Un exemple de gestion en local 44

La liste des servlettes Usage du formulaire ou avec cette URL depuis un navigateur ou une application http://62.147.219.116:8765/javacard/monitor/35009000003ea296/engras2/?texte=engras 45

Gestion locale ou distante / HTTP http://localhost:8765/commandes.html Tests en ligne, décembre 2003 http://vivaldi.cnam.fr:8765/commandes.html et http://lmi80.cnam.fr:8765/commandes.html et aussi http://lmi80.cnam.fr:8765/esiee/commandes.html (Cette URL est une indirection vers http://lse10.esiee.fr:8080, dont le seul client possible est lmi80, Plusieurs JavaCard sont installées dans les locaux de l ESIEE à Marne La Vallée, L accès à l une des servlettes devient http://lmi80.cnam.fr:8765/esiee/javacard/monitor/9000b000004f7296/engras2/?texte=maigre) 46

Découverte et gestion locales en 4 classes JavaCardListenerHandler HTTP <-> APDU JibServletList la liste des servlettes sur ce poste FileData Transfert de fichiers, extrait d un projet de Valeur C Formulaire Compression/Décompression d un formulaire HTML FormulaireHandler est un utilitaire accessible depuis un navigateur 47

Découverte globale des services Voir ETFA 2003 Pattern Observateur Généralisé avec le Modèle Vue Contrôleur Rappel : Environnement, postulat Tout machine possède un serveur Web ou est accessible par un portail (ayant son URL) 48

MVC Modèle Vue(s) Contrôleur, la base Evènements Contrôle Vue 1 modification Mise à jour Vue 2 Modèle 1) inscription des Vues, Modèle.addObserver( ) 2) une modification engendre une mise à jour des Vues -> Ajouts de vues et de contrôles simplifiés 49

MVC Web Evènements Contrôle Vue 1 Mise à jour http://vue1/update/?param.. Modification http://modèle/observable/notify/ Vue 2 Modèle http://vue2/update/?param... 1) inscription des Vues, http://modèle/addobserver/?url=http://vue1/update/ 2) une modification engendre les requêtes http://vue1/update/ 50

Découverte Globale Découverte sur le Web des JavaCard Ajout/retrait Une modification est effectuée La notification devient une requête HTTP Insérer une JavaCard engendre cette requête http://pc_m/notifyobservers/?observable=pc&arg=arrival_javacardid Retirer une JavaCard engendre cette requête http://pc_m/notifyobservers/?observable=pc&arg=departure_javacardid 51

Ajout/retrait de JavaCard ou servlettes internet PC_C1 Contrôle http://pc_m/notify/ http://pc_m/notify/ PC_C2 Contrôle Ajout, retrait Lecteur de cartes Ajout, retrait Lecteur de cartes 52

Le site Modèle/Web PC_M Pattern Observateur http://pc_m/ Les observateurs s inscrivent http://pc_m/notifyobservers/?url=http://pc_v1/update/ Le site reçoit une notification http://pc_m/notifyobservers/?observable=pc&arg=javacardid Les observateurs inscrits ou vues sont mis à jour http://pc_v1/update/?observable=http://pc/handler/&arg=state_javacardid STATE ::= {ARRIVAL DEPARTURE ADD_SERVLET DELETE_SERVLET DELETE_ALL_SERVLET} 53

Ajout retrait de cartes PC_V2 Vue PC_V1 Vue http://pc_v2/update/ http://pc_v1/update/ PC_M Modèle TINI PC_C3 Contrôle intranet http://pc_m/notify/ internet PC_C1 Contrôle http://pc_m/notify/ http://pc_m/notify/ PC_C2 Contrôle Ajout, retrait Lecteur de cartes Ajout, retrait Lecteur de cartes 54

PC_V1 une console/serveur Web LOG: 3 8777-163.173.228.59-63: request done LOG: 4 8777-163.173.228.59-63: socket close LOG: 4 8777-server: 163.173.228.80: new connection LOG: 3 8777-163.173.228.80-64: Request 24 POST /console/update/ HTTP/1.1 LOG: 5 8777-163.173.228.80-64: Request: Reading content: 86 LOG: 5 8777-163.173.228.80-64: main.: invoking handler: console LOG: 4 8777-163.173.228.80-64: console.: {arg=arrival_1c00900000205596, observable=http://163.173.228.80:8765/javacard/monitor/} source : http://163.173.228.80:8765/javacard/monitor/ arg : ARRIVAL_1C00900000205596 LOG: 3 8777-163.173.228.80-64: request done LOG: 3 8777-163.173.228.80-64: Request 23 POST /console/update/ HTTP/1.1 LOG: 5 8777-163.173.228.80-64: Request: Reading content: 86 LOG: 5 8777-163.173.228.80-64: main.: invoking handler: console LOG: 4 8777-163.173.228.80-64: console.: {arg=arrival_a10090000025d296, observable=http://163.173.228.80:8765/javacard/monitor/} source : http://163.173.228.80:8765/javacard/monitor/ arg : ARRIVAL_A10090000025D296 LOG: 3 8777-163.173.228.80-64: request done LOG: 3 8777-163.173.228.80-64: Request 22 POST /console/update/ HTTP/1.1 LOG: 5 8777-163.173.228.80-64: Request: Reading content: 86 LOG: 5 8777-163.173.228.80-64: main.: invoking handler: console LOG: 4 8777-163.173.228.80-64: console.: {arg=arrival_6e00c00000173b96, observable=http://163.173.228.80:8765/javacard/monitor/} source : http://163.173.228.80:8765/javacard/monitor/ arg : ARRIVAL_6E00C00000173B96 LOG: 3 8777-163.173.228.80-64: request done LOG: 3 8777-163.173.228.80-64: Request 21 POST /console/update/ HTTP/1.1 LOG: 5 8777-163.173.228.80-64: Request: Reading content: 86 LOG: 5 8777-163.173.228.80-64: main.: invoking handler: console LOG: 4 8777-163.173.228.80-64: console.: {arg=arrival_3900c0000018c696, observable=http://163.173.228.80:8765/javacard/monitor/} source : http://163.173.228.80:8765/javacard/monitor/ arg : ARRIVAL_3900C0000018C696 http://pc_v1/update/ 55

PC_V2 une applette/serveur Web Une applette peut contenir un serveur Web voir un extrait en annexe Ce serveur s installe dans n importe quel navigateur, n importe où Cette applette ne peut dialoguer qu avec le serveur dont elle est issue, ici le modèle 56

PC_V2 une applette/serveur Web http://pc_v2/update/ 57

PC_V3 une base de données/serveur Web BDD SQL PC_V3 Vue HTTP http://pc_v3/update/ Client/ navigateur HTTP internet Une table de la BDD maintient une liste : Toutes les JavaCard, Servlettes, Formulaires http://pc_v3/update INSERT INTO table VALUES(. 58

PC_V3, base de données, discussion Un table recensant toutes les JavaCard présentes Nom du propriétaire URL Formulaire(s) Informations diverses, (version, Interrogation à distance possible SQL/select, sélection (plus ou moins précise) Un exemple : 100 JavaCard * 10 Servlettes Soit 1000 URLs (au minimum) + formulaires -> Table (très,trop) volumineuse? Structuration faible, Gestion non objet, non répartie 59

PC_V4 maintenance/serveur Web PC_V4 Vue HTTP http://pc_v3/update/ internet http://pc_c1/handler/javacardid/servletid/?command=load&maj=servlet PC_C1 Contrôle Un observateur = Une autre fonctionnalité Dès l insertion, une mise à jour est effectuée Ajout, retrait Lecteur de cartes 60

Redondance, exemple PC_V2 Vue http://pc_v2/update/ PC_V1 Vue http://pc_v1/update/ PC_M1 Modèle PC_M2 Modèle http://pc_m/notify/ http://pc_m/notify/ http://pc_m/notify/ PC_C1 Contrôle PC_C2 Contrôle Ajout, retrait Lecteur de cartes Ajout, retrait Lecteur de cartes 61

Le site Modèle Défini lors de la configuration ou Peut être installé dynamiquement auprès des sites Contrôleurs Note : Une liste des serveurs inaccessibles obtenue par une variante du Pattern HeartBeat est mise en œuvre La notification peut-être conditionnelle (un filtre est transmis lors de l inscription) 62

Ajout dynamique de «modèle» Pour tous (ou certains) PC_Ci Inscrire PC_M2 comme Modèle de i=1 à n http://pc_ci/handler/?command=add& url=http://pc_m2/ 63

Le Modèle en interne Pattern Observateur, Adéquation requête HTTP/ méthodes Java usage de java.util.observable et java.util.observer http://pc_m/observable/addobserver/?url=.. Correspond à l appel addobserver(new urlrequest(url)) (un filtre appliqué aux arguments peut être transmis) http://pc_m/observable/deleteobserver/?url=.. Correspond à l appel deleteobserver(new urlrequest(url)) http://pc_m/observable/notifyobservers/?url=.. Correspond aux appels de setchanged();notifyobserver() (notification conditionnelle en utilisant le filtre) /tostring/ 64

Le Modèle en 2 Classes et 2 interfaces 65

La Vue en interne Un Handler acceptant ce type de requête HTTP ou une Applette contenant un serveur Web (dialogue avec PC_M) ou toute autre application acceptant une requête HTTP 66

Le Contrôleur en intene Un MVC en local Vue contrôle Modèle API de Dallas public void devicearrival(devicemonitorevent dme) public void devicedeparture(devicemonitorevent dme) 67

Le contrôleur en 4 classes JavaCardListener extends java.util.observable MVC Découverte locale, notification 68

Encore plus précis La version initiale assure une notification à la suite de Ajout/retrait de JavaCard, Ajout/retrait de servlettes «Remise à zéro» d une javacard Le «Grain» peut-être plus fin : Ajout/retrait d une JavaCard précise Ajout/retrait d un nom de servlette Seuil maximal de mémoire utilisée est atteint Seuil maximal du nombre de servlettes est atteint Ces observateurs peuvent être précisés dans le fichier de configuration ou ajoutés en cours d exécution 69

Premières conclusions Protocole uniforme Tout ordinateur connecté est un client/acteur Léger, portable, accessible quelques kilo-octets + 50Ko(serveur) + API Programmation Java côté serveur pour JavaCard Sécurité habituelle du Web, https, certificat,.. Cryptage/décryptage embarqués 70

Structuration et parcours Gestion d un grand nombre de serveurs? Plusieurs centaines, milliers de JavaCard? Accès sélectif? Seules quelques JavaCard sont à interroger Pour toutes les JavaCard, dès qu elles se présentent sur le réseau (intranet/internet)? Mise à jour? Déploiement, téléchargement, Distants? Sécurité? 71

Architecture orientée objet et Composite Gestion d un grand nombre de JavaCard Base de données centralisée ou Pattern Composite distribué Définition d une grammaire à l aide du Pattern Composite component ::= composite terminal composite ::= component terminal ::= [symbole] 72

Un Composite possible, ETFA 2003 73

Un Composite pour les JavaCard 74

Quelques classes ou interface public interface Visitable{ abstract public Object accept(visitor v); abstract public boolean isvisitable(string filter); } public abstract class HTTPObject implements Visitable { protected String url; abstract public String geturl(); } public boolean isvisitable(string filter){ return Glob.match(filter, geturl()); } public class Cardlet extends HTTPObject{ public Cardlet(String url){ } this.url = url; public String geturl(){ return url;} public String tostring(){return this.getclass().getname() + "_" + "_ " +geturl();} public Object accept(visitor v){ }} return v.visit(this); 75

Une des configuration(s) Une phrase issue de cette grammaire représente une configuration matérielle particulière Le découpage est logique, structuré par les clients selon leurs souhaits Architecture est (ne peut être que) configurée dynamiquement Collection collect = new Course("Clock","http://localhost:8765/"); collect.add(new Cardlet("http://163.173.228.80:8765/javacard/monitor/1C00900000205596/Clock2/")); collect.add(new Cardlet("http://163.173.228.80:8765/javacard/monitor/1C00900000205596/Clock2/")); Collection vivaldi = new List("vivaldi","http://vivaldi.cnam.fr:8765/"); collect.add(vivaldi); 76

MVC + Composite Comment? Un nœud du composite est un observateur d un Modèle ou le modèle lui-même Ce nœud est issu d une structuration logique des ordinateurs Ce nœud contient le Handler Brazil approprié Le client s adresse au Composite, racine ou à l un de ses composants 77

Un exemple 31 3 02 : Une salle de cours/tp au Cnam Une dizaine de PC avec lecteur Certains étudiants sont chez eux avec une JavaCard D autres utilisent à distance, les JavaCard installées en lmi80.cnam.fr 78

Une architecture possible vivaldi extérieurs lmi80 extérieurs lmi71 31-3-02 lmi72 31-3-02 «adsl» lmi73 31-3-02 lmi75 31-3-02 lmi74 31-3-02 lmi76 31-3-02 79

«Cartographie» vivaldi Collection cours = new Course("CSIML_B2","2003","http://localhost:8765/"); cours.add(new List("http://lmi80.cnam.fr:8080/"); cours.add(new List("http://lmi71.cnam.fr:80/"); cours.add(new List("http://lmi72.cnam.fr:8181/"); lmi80 Collection cours = new Group("http://localhost:8080/"); //ajout dynamique des clients «adsl» lmi71 Collection cours = new Group("http://localhost:80/"); cours.add(new List("http://lmi73.cnam.fr:81/"); cours.add(new List("http://lmi75.cnam.fr:82/"); Inscription des serveurs statique ou dynamique Fichier de configuration ou à l exécution 80

Une Requête en vivaldi http:// vivaldi extérieurs http:// http:// http:// lmi80 extérieurs lmi71 31-3-02 lmi72 31-3-02 http:// «adsl» http:// http:// http:// http:// lmi73 31-3-02 lmi75 31-3-02 lmi74 31-3-02 lmi76 31-3-02 81

Une requête en vivaldi http://adsl http://lmi80 http://lmi73 http://vivaldi http://lmi71 http://lmi75 http://lmi72 http://lmi74 http://lmi76 Collecte distribuée de tous les résultats (par exemple) Accès concurrent, parallélisme possible 82

Les classes du Composite Pattern Composite «classique» Accessible sur tous les serveurs Ajout/retrait dynamiques possibles Nécessaire aux javacard «mobiles» 83

Critiques/ réponses Critiques habituelles du Composite? À priori oui Supporte mal les modifications Ajout d un nouveau composite? Ajout d une nouvelle famille de JavaCard? Parcours : Itérateur ou Visiteur (ETFA2003) 84

Parcours distribué et Visiteur Mise à jour, Maintenance, Interrogations, Déploiement, Déclenchement de certaines servlettes 85

Un Visiteur Possible/ETFA 86

Un Visiteur possible pour JavaCard 87

La classe Visitor public abstract class Visitor{ public Object visit (HTTPObject object){ return object;} public Object visit (Cardlet cardlet){ return cardlet;} public Object visit (DS1957B ibutton){ return ibutton;} public Object visit (DS1955B ibutton){ return ibutton;} public Object visit (List list){ return list;} public Object visit (Course course){ return course;} } 88

Exemple : StringVisitor public class StringVisitor extends Visitor{ public Object visit (Cardlet cardlet){ return cardlet.tostring(); } public Object visit (DS1957B ibutton){ return ibutton.tostring(); } public Object visit (DS1955B ibutton){ return ibutton.tostring(); } public Object visit (Collection c){ } return c.tostring(); } public Object visit(list l){ return visit((collection)l);} public Object visit(course c){ return visit((collection)c);} 89

Exemple HTTPVisitor public Object visit (Cardlet cardlet){ if(cardlet.isvisitable(this.filter)) return cardlet + "[" + résultatdelaconnexion(cardlet.geturl()) + "]"; else return ""; } public Object visit (Collection c){ String str = new String("[" + c.geturl() + "_["); if(c.geturl().startswith("http://localhost")){ Iterator it = c.iterator(); while (it.hasnext()){ } } str = str + ((HTTPObject)it.next()).accept(this); if(it.hasnext()) str= str + ", "; return str + "]"; return str + résultatdelaconnexion(c.geturl() + "visit/?collection=" + c.getclass().getname()) + "]"; } public Object visit (DS1957B ibutton){return this.visit((collection)ibutton);}... 90

D autres visiteurs VisitorSave Sauvegarde d un état sur chaque machine VisitorDownServer Quels sont les serveurs qui ne répondent plus? Etc... 91

Visite distribuée Tout modèle contient un «VisitorHandler» Les ajouts sont dynamiques Un filtre permet de préciser si le nœud doit être visité 92

VisitorHandler Un Handler dédié à la visite adéquation URL <-> visite http://un_site/visit/?collection=list&filter=* http://un_site/visit/html/?collection=list&filter=* cohérence des visites, Ajout et retrait dynamiques de cardlette 93

Une requête en vivaldi http://adsl/visit/ http://lmi80/visit/ http://lmi73/visit/ http://vivaldi/visit/ http://lmi71/visit/ http://lmi75/visit/ http://lmi72/visit/ http://lmi74/visit/ http://lmi76/visit/ Visite distribuée : collecte de tous les résultats Accès concurrent 94

L exemple du composite revisité Sur le site lmi80 : Collection collect = new Course("Clock","http://localhost:8765/"); collect.add(new Cardlet("http://163.173.228.80:8765/javacard/monitor/1C00900000205596/Clock2/")); collect.add(new Cardlet("http://163.173.228.80:8765/javacard/monitor/1C00900000205596/Clock2/")); Collection vivaldi = new List("vivaldi","http://vivaldi.cnam.fr:8765/"); collect.add(vivaldi); System.out.println("HTTP = " + collect.accept(new HTTPVisitor())); System.out.println("String= " + collect.accept(new StringVisitor())); ou http://lmi80:8765/visit/html/?collection=course 95

Sur le site vivaldi : Un exemple, suite gr = new List("vivaldi","http://localhost:8765/"); gr.add(new Cardlet("http://163.173.228.59:8765/javacard/monitor/5000900000225F96/TB_Clock/")); 96

Visiteur : première mise en œuvre Un visiteur HTML Collecte de toutes les URLs accessibles Un visiteur HTTP Collecte de toutes les URLs accessibles http://vivaldi.cnam.fr:8765/commandes.html 97

Exemple : Visiteur HTML 98

Critiques/réponse Ajout d une nouvelle visite Ajout d un nouveau composite Version du serveur, une solution? Emploi de JavaWebStart (hors systèmes embarqués, hors TINI) 99

Exemples Deux tp au Cnam en janvier Lecture de l horloge interne à chaque JavaCard (Java ibutton) Collecte des résultats : http://../clock2/ Installation d une servlette type/un corrigé sur les javacard testées Énoncé en cours de rédaction Carte d auditeur, cryptage Lié à JFOD La javacard comme Unité de stockage de valeur, (DS2438?) Ecriture par http://./?ecrire= Lecture de la moyenne, min, max La javacard contient une page html constituée de balises html telles que <sql, <debug, <queue, <sendmail, À suivre 100

Discussion/Bilan 101

Extensions La JavaCard devient un acteur avec initiatives Premières idées : à compléter Usage de URLClassLoader http://site/javacardid/get/archive.jar http://site/javacardid/put/ post file = archive.jar Téléchargement et exécution d une archive contenu dans une JavaCard Cette archive peut contenir une application de dialogue avec les Servlettes d une ou des JavaCard 102

Une solution toute prête La Javacard contient une page HTML avec des templates adaptées <load archive.jar> URLClassLoader <execute Test.main> Instrospection ou findclass Ces templates sont analysées par le serveur, la machine hôte. A l insertion une requête HTTP particulière est effectuée 103

Un exemple lecture d informations issues d un capteur Dès son insertion au Cnam La «JavaCard» interroge et mémorise les dernières mesures du taux d humidité en 31 3 06, un ibutton DS2438 Ces mesures sont ensuite analysées (sur un autre poste) 104

Un exemple à suivre À vérifier Une javacard ou l hébergeur contient un.jnlp L archive téléchargée contient une application Usage de JavaWebStart possible? 105

Une Conclusion Programmation des JavaCard comme des serveurs Gestion d un grand nombre de JavaCard Déploiement, téléchargements facilités Communication entre deux javacard envisagée ksoap en cours de tests JXTA + TINI + JavaCard Intégration en cours de JiniCard 106

Annexes Installation des outils JavaCardListenerHandler Programmation des Servlettes Passage des Paramètres Signatures embarquées Utilitaires Extrait de l applette/serveur Web Les cookies en Java Les commandes : compilation et édition des liens 107

Installation des outils http://jfod.cnam.fr/tp_cdi/javacard/install.html Ib-IDE win32/other ftp://ftp.dalsemi.com/pub/ib-ide_2.0/ Outils indépendants (sans JavaCard) Compilation : un jdk option target 1.1 édition des liens BuilJibBlet Téléchargement depuis le Web, outil en ligne Formulaire compressé : outil en ligne 108

JavaCardListenerHandler MVC Local Global -> couplage faible Critiques Tests à faire (plusieurs utilisateurs) Accès en exclusion mutuelle à la liste des JavaCard, quelque soit le port physique utilisé 109

Programmation des servlettes Voir la bibliographie démarches Test Unitaire avec Bluej ib-ide mode simulé Enfin le Téléchargement Un exemple la servlette <B>EnGras2</B> 110

La servlette EnGras2, extraits public class EnGras2 extends Applet{ public static final byte SERVLET_METHOD = (byte)0; final static private byte SELECT_INS = (byte)0xa4; private byte[] apdudata; /* le formulaire compressé (20 octets): "5Ttexte20Sexec exec " */ private byte[] signature={'5','t','t','e','x','t','e','2','0','s','e','x','e','c',' ','e','x','e','c',' '}; private final byte[] sig ={'s','i','g'}; /* les paramètres de la servlette */ private final byte[] texte={'t','e','x','t','e'}; // public EnGras2(){/* Register this applet with the JCRE */ register();} public static void install(apdu apdu){ new EnGras2();} public void process(apdu apdu){ byte[] buffer = apdu.getbuffer(); //Determine if the applet is being selected. if((buffer[iso.offset_cla] == SELECT_CLA) && (buffer[iso.offset_ins] == SELECT_INS)){ return;} apdudata = new byte[buffer[iso.offset_lc] & 0x0FF]; short apdudataoffset = 0; 111

La servlette EnGras2, extraits short bytesread = apdu.setincomingandreceive(); //Read in the entire APDU. //Loop until all bytes have been read. while (bytesread > 0){ Util.arrayCopyNonAtomic(buffer, ISO.OFFSET_CDATA, apdudata, apdudataoffset, bytesread); apdudataoffset += bytesread; bytesread = apdu.receivebytes(iso.offset_cdata); } //Prepare the apdu for sending apdu.setoutgoing(); apdu.setoutgoinglength(max_send_length); //Toujours le même point d'entrée, if( buffer[iso.offset_ins] == SERVLET_METHOD){ byte[] txt = extrairebytearray(apdudata, texte); // /?texte=xxxxxxx&... if(txt!=null){ // texte est présent final byte[] pre={'<','b','>'}; final byte[] post={'<','/','b','>'}; sendbytearray(apdu, concat(pre,txt,post)); }else{ // est_ce la signature qui est souhaitée?? //?sig=0, seule 0 est implémentée byte[] sign = extrairebytearray(apdudata, sig); if(sign!=null && sign[0]==(byte)'0'){ sendbytearray(apdu,signature); }else{ ISOException.throwIt(ISO.SW_INS_NOT_SUPPORTED); } } // fin de la'analyse des paramètres de type CGI }else{ ISOException.throwIt(ISO.SW_INS_NOT_SUPPORTED); } } 112

Grammaire Passage des paramètres form ::= n {text other} avec n=n1 text ::= T {name} n1 size other ::= type {name} n1 {value} n1 type ::= S R H C name ::= byte value ::= byte size ::= digit digit n ::= 1 2 3 4 5 6 7 8 9 digit ::= 0 n Exemple 4Topr105Topr212Hidx 1000RRadistopScrypcryp 113

Signature embarquée, exemple <form action="http://jfod.cnam.fr" method="post"> <p><input type="submit" name="b1" value=b1> <input type="text" size="20" name="t1"> </p> </form> est compressé en 2SB1B1T120 2 le nombre significatifs de caractères pour les champs name et value S type="submit" B1 name="b1" B1 value="b1" T type="text" T1 name="t1" 20 size="20" 114

Signatures embarquées Un utilitaire en http://lmi80.cnam.fr:8765/formulaire.html http://vivaldi.cnam.fr:8765/formulaire.html Compression/Vérification Décompression d'une signature retournée par une JavaCard Le source Java (en byte[]) Le contenu d un fichier (en byte[]) 115

Compression/Vérification 116

Compression/Vérification 117

Décompression d'une signature retournée par une JavaCard 118

Le source Java (en byte[]) 119

Déclencher une servlette sur un JiB private synchronized String execute(string servletprefix, byte method, byte[] params) throws OneWireException{ ResponseAPDU response; String result = null; String appletname = extractappletname(servletprefix); OneWireContainer16 jib = (OneWireContainer16)table.get(servletPrefix); if(jib==null) throw new OneWireException("pas de servlettes, ce nom : " + servletprefix); DSPortAdapter adapter = jib.getadapter(); adapter.beginexclusive(true); adapter.setsearchalldevices(); adapter.targetallfamilies(); adapter.setspeed(dsportadapter.speed_regular); } if (jib.select(appletname).getsw() == 0x9000) { response = jib.sendapdu(new CommandAPDU((byte)0x0, method, (byte)0x0, (byte)0x0, params, (byte)0),0); if (response.getsw() == 0x9000){ if(response.getdata()==null) result = new String("success"); else result = new String(response.getData()); }else{ int errorcode = response.getsw(); result = "code failure : 0x" + Integer.toString(errorCode,16) + " soit : " + JibServletList.decodeSW(errorCode); } } adapter.endexclusive(); return result; 120

Côté servlette, schéma de programme A lire deux extraits de l ib-ide de dallas et une présentation de Sun http://jfod.cnam.fr/tp_cdi/javacard/ib-ide/helpdata/ib-idehelp/ib-idehelp/ibutton/fundamentals.html La structure d une Applet http://jfod.cnam.fr/tp_cdi/javacard/ib-ide/helpdata/ib-idehelp/ib-idehelp/ibutton/appletstructure.html Et http://developers.sun.com/techtopics/mobility/javacard/articles/javacard1/ La structure d une Servlette idem Une seule classe CLA = 0x00 à choisir (e.g. 0xA0 GSM) Un seul point d entrée Même type de paramètres 121

Côté servlette, quelques utilitaires Un seul point d entrée Extraction des paramètres en entrée http://site/handler/./?clé=valeur&clé2=valeur2 valeur est un texte, extrairebytearray public static byte[] extrairebytearray(byte[] apdudata, byte[] param) valeur2 est un entier! extraireint public static byte[] extraireint(byte[] apdudata, byte[] param) Renvoi de paramètres Utilitaires de conversion, classe Conversions public static byte[] convertinteger(int num) public static byte[] converthexa(short num) public static byte[] convertserialid(byte[] ID) 122

Paramètres de type CGI Paramètres envoyés à la Servlette Idem (ou presque) aux Paramètres en Brazil Paramètres PC(Brazil) -> Hashtable table = request.getquerydata(); Paramètres javacard apdudata ==table.tostring().getbytes(); 123

Un exemple http://lmi80.cnam.fr:8765/javacard/monitor/6e00c00000173b96/engras2/?texte=test&html=on //côté PC/hébergeur Hashtable table = request.getquerydata(); //côté JavaCard // apdudata = table.tostring().getbytes(); byte[] apdudata = new byte[]{ {, h, t, m, l, =, o, n,,,, t, e, x, t, e, =, t, e, s, t, } } 124

extraireint/javacard public static int extraireint(byte[] apdudata, byte[] param){ short i = 1;short lg = (short)param.length; // apdudata={param=valeur, param1=valeur1,...} while (i+lg < apdudata.length){ if(util.arraycompare(apdudata,i,param,(short)0,lg)==0 && apdudata[i+lg]==egal){ //if(parametres.arraycompare(apdudata,i,param,(short)0,lg)==0 && apdudata[i+lg]==egal){ //trouvé i+=lg +1; /* = */ boolean neg =false; int val=0; if(apdudata[i] == moins){i++;neg=true;} while(apdudata[i]!= virgule && apdudata[i]!= accoladef){ val = (apdudata[i]-'0') + val*10; i++; } if(neg)return -val; else return val; /* au suivant */ }else{ i += lg; while(apdudata[i]!= virgule && apdudata[i]!= accoladef){ i++; } i++;i++;// le blanc, ou l'accolade } } return 0; } http://jfod.cnam.fr/tp_cdi/javacard/util/parametres.java 125

extrairebytearray/javacard public static byte[] extrairebytearray(byte[] apdudata, byte[] param){ short i = 1;short lg = (short)param.length; // apdudata={param=valeur, param1=valeur1,...} while (i+lg < apdudata.length){ if(util.arraycompare(apdudata,i,param,(short)0,lg)==0 && apdudata[i+lg]==egal){ i+=lg +1; /* = */ short debut = i; while(apdudata[i]!= virgule && apdudata[i]!= accoladef){ i++; } short fin = i; byte[] result = new byte[fin-debut]; Util.arrayCopy(apduData, debut, result, (byte)0, (byte)(fin-debut)); return result; /* au suivant */ }else{ i += lg; while(apdudata[i]!= virgule && apdudata[i]!= accoladef){ i++; } i++;i++;// le blanc, ou l'accolade } } return null; } http://jfod.cnam.fr/tp_cdi/javacard/util/parametres.java 126

PC_V2 une applette/serveur Web http://pc_v2/update/ http://lmi80.cnam.fr:8765/applettes/consolejib.java http://lmi80.cnam.fr:8765/applettebrazil/applettehandler.java 127

Une Applette/serveur pour un navigateur, un extrait public void run(){ ServerSocket listen = new ServerSocket(this.port); while(!local.isinterrupted()){ Socket socket = null; BufferedReader in = null; DataOutputStream out = null; try{ socket = listen.accept(); in = new BufferedReader(new InputStreamReader(socket.getInputStream())); out = new DataOutputStream( socket.getoutputstream()); String request = in.readline(); // requête GET en première ligne StringTokenizer st = new StringTokenizer(request); String token = st.nexttoken(); if(token.equals("get")){ String paramurl = st.nexttoken(); st = new StringTokenizer(paramUrl,"/&?= "); token = st.nexttoken(); if(token.equals(this.urlprefix)){ String observable = ""; String arg = ""; while (st.hasmoretokens()){ token = st.nexttoken(" &?="); if(token.equals(this.src)) observable = st.nexttoken(" &?="); if(token.equals(this.value)) arg = st.nexttoken(" &?="); } update(observable, arg); 128

Accès aux javacard depuis une application(1) HttpJavaCardClock2.java private static String javacardclock2(string urlsensor, Properties params) throws Exception{ URL url = new URL(urlSensor); URLConnection connection = url.openconnection(); connection.setdoinput(true); connection.setdooutput(true); PrintWriter out = new PrintWriter(connection.getOutputStream()); for(enumeration e = params.keys();e.hasmoreelements();){ String key = (String) e.nextelement(); String value = (String) params.get(key); out.print(key + "=" + value); if(e.hasmoreelements()) out.print("&"); } out.close(); // lecture en retour BufferedReader in = new BufferedReader( new InputStreamReader(connection.getInputStream())); String result= new String(""); String inputline = in.readline(); while(inputline!= null){ result = result + inputline; inputline = in.readline(); } in.close(); return result; } 129

Accès aux javacard depuis une application(2) HttpJavaCardClock2.java Properties props = new Properties(); props.setproperty("offset",integer.tostring(offset)); s = javacardclock2( "http://localhost:8765/javacard/monitor/35009000003ea296/clock2/", props); System.out.println(" valeur retournée : " + s); props s 130

Mise en Œuvre d une Template <clock value> JavaCard ClockTemplate Hébergeur Date Client 131

La JavaCard retourne <clock valeur> }else{ int ofs = extraireint(apdudata, offset); if(ofs>0) clockoffset = ofs; // (re)définition de clockoffset souhaitée int timesec = Clock.getClock(clockOffset); byte[] time = Conversions.convertInteger(timeSec); if(extrairebytearray(apdudata, tag)!=null){ byte[] tag_clock={'<','c','l','o','c','k',' ',' ',' ',' ',' ', ',' ',' ',' ',' ',' ',' ',' ','>'}; Util.arrayCopy(time,(short)0,tag_clock,(short)7,(short)time.length); sendbytearray(apdu, tag_clock); }else{ sendbytearray(apdu, time); } } 132

L hébergeur transforme cette étiquette public class ClockTemplate extends Template { public boolean init(rewritecontext hr) { return true; } public void tag_clock(rewritecontext hr){ int jibtime = Integer.parseInt(hr.getArgs().trim()); Date d = new Date(jibTime*1000L); } String date = DateFormat.getDateInstance( DateFormat.SHORT,Locale.FRANCE).format(d) + "-" + DateFormat.getTimeInstance( DateFormat.MEDIUM,Locale.FRANCE).format(d); hr.append(date); hr.killtoken(); 133

La configuration et le résultat filtre.class=sunlabs.brazil.filter.filterhandler filtre.handler=javacard filtre.filters=filtreget filtreclock filtreget.class=sunlabs.brazil.filter.templatefilter filtreget.templates=sunlabs.brazil.template.settemplate filtreclock.class=sunlabs.brazil.filter.templatefilter filtreclock.templates=cnam.ibutton.clocktemplate 134

Un autre exemple <sendmail.. Une servlette de la JavaCard déclenche l envoi d un mél <tag>sendmail from=douin@cnam.fr to=douin@free.fr body="accès à <get URLHandler>" subject="accès JiB" cc=douin@cnam.fr /</tag> Note : à essayer en http://163.173.228.80:8765/javacard/monitor/a10090000025d296/e_mail/ 135

Encore un exemple <sql.. Une servlette de la JavaCard déclenche une requête SQL, le résultat en HTML est envoyé au client <sql prefix=liste> select DATE,TP,NOTE from TP_CDI where MATRICULE='I044733' and tp like 'tp_' order by TP</sql> <table border="2"> <caption><b>mes notes en tp_cdi</b></caption> <tr><foreach name=field list="date TP NOTE"> <td><b><property name=field></b> </td> </foreach></tr> <foreach name=index property=liste.rows> <tr> <foreach name=field list="date TP NOTE"> <td><property name="liste.tp_cdi.${field}.${index}"></td> </foreach> </tr> </foreach> </table> Note : à essayer en http://163.173.228.80:8765/javacard/monitor/a10090000025d296/mesnotestpcdi/ 136

<sql, «mes» notes en TP_CDI/JFOD La configuration de l hébergeur filtre.class=sunlabs.brazil.filter.filterhandler filtre.handler=javacard filtre.filters=bsl get clock mail BSL.class=sunlabs.brazil.filter.TemplateFilter BSL.templates=sunlabs.brazil.template.SetTemplate \ sunlabs.brazil.sql.sqltemplate \ sunlabs.brazil.template.bsltemplate #la base est installée sur vivaldi... les données JFOD de 2001-2002 BSL.query=query. BSL.sessionTable=data BSL.headers=header. BSL.driver=org.hsqldb.jdbcDriver BSL.url=jdbc:hsqldb:http://vivaldi.cnam.fr:81/BASE_EAD BSL.sqlPrefix=param. param.user=sa param.password= 137

<notify un événement> Cette balise engendre une notification à tous les observateurs du système! Évènement initié par une javacard exemple : 138

Les cookies en Java(1) Ouverture de la connexion, le cookie est repéré URL url = new URL(urlString); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); conn.getresponsemessage(); This.cookieID = conn.getheaderfield(cookie_from_server); int index = this.cookieid.indexof(";"); if(index >= 0) this.cookieid = this.cookieid.substring(0, index); // cookieid est de la forme cookieid=5k0jfbno6h3bcuc7sam5k Avec private static final String COOKIE_FROM_SERVER = "Set-Cookie"; Et cookieid une variable d instance 139

Les cookies en Java(2) Envoi du Cookie lors d une nouvelle connexion URL url = new URL(urlString); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); conn.setdooutput(true); conn.setinstancefollowredirects(false); conn.setrequestproperty(cookie_to_server, cookieid); conn.getresponsemessage(); return connection.getinputstream(); Avec private static final String COOKIE_TO_SERVER = "Cookie"; 140

Les commandes compilation et édition des liens Notice en http://jfod.cnam.fr/tp_cdi/javacard/install.html Et http://jfod.cnam.fr/tp_cdi/javacard/miseenoeuvre.html Compilation javac -verbose -target 1.1 -classpath.;d:/ib-ide/classes/ibutton52.jar; d:/ib-ide/classes/base-core.jar;d:/ib-ide/classes/selector.jar EnGras2.java Génération du fichier téléchargeable java -cp buildjibblet.jar;d:/ib-ide/classes/ibutton52.jar dallas.buildjiblet -f EnGras2.class -o EnGras2.jib -d d:/ib-ide/classes/jib52.jibdb Téléchargement avec cet utilitaire http://pc/commandes.html déc 2003 PC={lmi80.cnam.fr:8765 vivaldi.cnam.fr:8765 lmi80.cnam.fr:8765/esiee/} 141

La page d accueil http://vivaldi.cnam.fr:8765 142