Cartes à puce et programmation Nicolas Droze Jean-Noel Isnard SOMMAIRE • • • • • • • Historique Technologie Normes en vigueur Javacard Sécurité et cartes bancaires OpenCard Framework Suppléments • Glossaire • Références Historique • • • • • 1974 1978 1981 1982 1984 : : : : : Dépots de brevets par Roland Moreno M. Ugon (Bull CP8) invente le M.A.M Début de la normalisation AFNOR Expérimentation baptisée «IPSO» Adoption de la Carte Bleue (Bull) Création du groupement des cartes bancaires Historique • 1983 : Lancement de la «télécarte» par la D.G.T. Début de la normalisation ISO Décodeur Canal+ avec une carte mémoire • Depuis 1992 : Essor des applications – Toutes les CB en France ont une puce – Cartes santé (Vitale, Sesame) – Porte-monnaies électroniques (Proton) – Téléphonie mobile (GSM) avec carte SIM – Premières Javacard Historique • 1997 : EMV, standard international de carte à puce Affaire Humpich : le secret des CB tombe • 1999 : Lancement de moneo • 2002 : 400 Millions de cartes bancaires Carte à puce sonore Technologie 2 types de cartes • Carte à mémoire : Simple mémoire (lecture / écriture) (EPROM / EEPROM) Non standardisé • Carte à microprocesseur : Mémoire + processeur programmable (algo sécurité : DES, RSA) Normes ISO 7816 Carte à contacts et sans contacts Technologie Mémoire et processeur CPU : 8 / 16 / 32 bits, architecture RISC (souvent) ROM : 8 – 32 Ko (Card Operating System) RAM : < 1Ko mémoire temporaire EEPROM / FlashRAM / FeRAM : 8 – 64 Ko mémoire persistante Bus de données EEPROM ROM Bus d’adresses Microcontact Microchip Micromodule RAM Cycle de vie • FABRICATION : Inscription dans la ROM des fonctionnalités de base • INITIALISATION : Inscription dans l’EEPROM des données de l’application • PERSONNALISATION : Inscription dans l’EEPROM des données utilisateur • UTILISATION : Envoi de commandes à la carte • MORT : Invalidation logique, destruction, … NORMES EN VIGUEUR ISO 7816-1 à 7816-10 ISO 7816-1 • Caractéristiques physiques, dimensions 85 mm 54 mm Epaisseur 0,76 mm ISO 7816-2 • Emplacement des contacts et aspects électriques 3 4 2 1 8 7 5 6 1 3 4 5 6 7 8 : : : : : : 2 : Alimentation 3 à 5 V Horloge Remise à Zéro Optionnel Optionnel I/O asynchrone Ecriture EEPROM ISO 7816-3 • Caractéristiques électriques : Fréquence d’horloge 1 - 5 Mhz Vitesse des communications < 115200 bauds • Protocole de transmission : TPDU (Transmission Protocol Data Unit) T=0 Protocole orienté octet T=1 Protocole orienté paquet • Sélection du type de protocole : PTS (Protocol Type Selection) • Réponse au reset : ATR (Answer To Reset) ISO 7816-4 APDU (Application Programming Data Units) CLA : 1 octet pour identifier l’application INS : 1 octet pour le code de l’instruction P1 - P2 : Paramètres de l’instruction Lc : Longueur du champ de données Le : Longueur maxi du champ de données de la réponse SW1 - SW2 : Code d’exécution 90 00 OK ISO 7816-4 ISO 7816-4 • Le système de fichiers des cartes à puce. Système de fichiers hiérarchique qui peut contenir 3 types de fichiers : "Master File" (Fichier racine) "Dedicated File" (Répertoire + qq infos) "Elementary File" (Fichier de données) ISO 7816-4 • 4 structures de données : ISO 7816-5 • Spécifie des identifiants d’applications (Application IDentifier) Un AID = identication unique d'une application de la carte et de certains types de fichiers. ISO 7816-6 • Spécifie les éléments de données inter-industrie : Nom du porteur de la carte Date d’expiration … Etiquette Longueur valeur ISO 7816-7 • Données organisées en tables, avec des colonnes, lignes, … (Similarité aux bases de données) • Langage spécifique de requêtes : SCQL (Smart Card Query Language) 2000 PicoDBMS : Un SGBD sur carte à puce ISO 7816-8 à 10 • ISO 7816-8 : Sécurité de l'architecture et des commandes inter-industrie. • ISO 7816-9 : Commandes inter-industries améliorées • ISO 7816-10 : Spécifiques aux cartes synchrones JavaCard Présentation • Langage à objet simplifié pour carte à puce • 1996 : Sun adopte le JavaCard (Schlumberger). • 1997 : Java Card Forum (Bull,Gemplus et Schlumberger) • 2000: 40 entreprises ont une licence d'exploitation JavaCard Architecture • Peu de memoire – 1Ko de RAM, 16Ko d'EEPROM et de 24Ko de ROM – Supporte un sous-ensemble du langage Java – Machine virtuelle en 2 étapes (On-card et Off-card) • Java Card Runtime Environment – Machine virtuelle Javacard – APIs – Méthodes natives JavaCard APIs • java.io – IOException • java.lang – Object (has default constructor and method equals()) – Throwable (10 Exception classes) • java.rmi, javacardx.rmi (support for limited RMI) JavaCard APIs • javacard.framework • javacard.security, javacardx.crypto – algorithmes (RSA, DSA, DES, …), security management – SecurityManager doit être construit dans VM JavaCard • • • • Applet JavaCard application Seulement une instance de chaque Hérite de javacard.framework.Applet Doit comporter les méthodes : – Install : créé une instance – Select : Active l’applet – Process : exécute APDU – Deselect : Suspend l’applet JavaCard Fonctions Java non supportées • Type simple de donnée de grosse taille : long, double, float • Tableau plusieurs dimensions • Caractères et chaînes • Chargement dynamique des classes • Security Manager • Ramasse-miettes et finalisation • Threads • Serialisation d'objet • Clonage d'objet JavaCard Fonctions Java supportées • Type simple de donnée de petite taille : boolean, byte, short • Tableau à 1 dimension • Paquetage Java, classes, interfaces et exceptions • Caractéristique orientée objet : héritage, surcharge • Le mot clé int et le support des entiers sur 32 bits sont optionnels JavaCard Avantages • Facilité de développement (Java) • Sécurité • Portabilité • Stockage et gestion de multiples applications • Compatibilité JavaCard Exemple public class PorteMonnaie extends Applet { final static byte PorteMonnaie_CLA = (byte) 0xD0; final static byte VERIFIE_PIN = (byte) 0x20; final static byte CREDIT = (byte) 0x30; final static byte DEBIT = (byte) 0x40; final static byte SOLDE = (byte) 0x50; final static short SOLDE_MAX = 0x01F4; final static byte TRANSACTION_MAX = 0x64; final static byte NB_ESSAIS = (byte) 0x05; final static byte TAILLE_MAX_PIN = (byte) 0x08; final static short SW_CODE_ERRONE = (short) 0x9110; final static short SW_VERIFICATION_PIN_REQUISE = (short) 0x9120; final static short SW_MONTANT_TRANSACTION_INVALIDE = (short) 0x9130; final static short SW_MONTANT_TRANSACTION_DEPASSE = (short) 0x9140; final static short SW_SOLDE_NEGATIF = (short) 0x9150; OwnerPIN CodePin; short Solde; JavaCard Exemple public static void install ( byte[] bArray, short bOffset, byte bLength) { new PorteMonnaie ( bArray, bOffset, bLength ); } private PorteMonnaie ( byte[] bArray, short bOffset, byte bLength) { … byte TailleCodePin = bArray[bOffset++]; CodePin = new OwnerPIN ( NB_ESSAIS, TAILLE_MAX_PIN ); try { CodePin.update ( bArray , bOffset, TailleCodePin ); } catch (PINException exc ) { ISOException.throwIt ((short) ((short) 0x9500 + TailleCodePin)); } Solde = 0; register (); } public boolean select () { CodePin.reset (); return(true); } public void deselect () { CodePin.reset (); } JavaCard Exemple public void process (javacard.framework.APDU apdu) throws javacard.framework.ISOException { byte[] buffer = apdu.getBuffer (); if ( selectingApplet () && buffer[ISO7816.OFFSET_CLA]== ISO7816.CLA_ISO7816 && buffer[ISO7816.OFFSET_INS] == ISO7816.INS_SELECT ) {…} else { if (buffer[ISO7816.OFFSET_CLA] != PorteMonnaie_CLA) ISOException.throwIt (ISO7816.SW_CLA_NOT_SUPPORTED); switch ( buffer[ISO7816.OFFSET_INS] ) { case SOLDE : getBalance (apdu); return; case DEBIT : debit (apdu); return; case CREDIT : credit (apdu); return; case VERIFIE_PIN : verify (apdu); return; default JavaCard Exemple private void credit (APDU apdu) { if ( !CodePin.isValidated () ) ISOException.throwIt (SW_VERIFICATION_PIN_REQUISE); byte[] buffer = apdu.getBuffer (); byte numBytes = buffer[ISO7816.OFFSET_LC]; byte byteRead = (byte) (apdu.setIncomingAndReceive ()); if ( byteRead != 1 ) ISOException.throwIt (ISO7816.SW_WRONG_LENGTH); byte MontantCredit = buffer[ISO7816.OFFSET_CDATA]; if ( (MontantCredit > TRANSACTION_MAX) || (MontantCredit < 0) ) ISOException.throwIt (SW_MONTANT_TRANSACTION_INVALIDE); if ( (short) (Solde + MontantCredit) > SOLDE_MAX) ISOException.throwIt (SW_MONTANT_TRANSACTION_DEPASSE); Solde = (short)(Solde + MontantCredit); } JavaCard Exemple private void debit (APDU apdu) { if ( !CodePin.isValidated () ) ISOException.throwIt (SW_VERIFICATION_PIN_REQUISE); byte[] buffer = apdu.getBuffer (); byte numBytes = buffer[ISO7816.OFFSET_LC]; byte byteRead = (byte) (apdu.setIncomingAndReceive ()); if ( byteRead != 1 ) ISOException.throwIt (ISO7816.SW_WRONG_LENGTH); byte MontantDebit = buffer[ISO7816.OFFSET_CDATA]; if ( (MontantDebit > TRANSACTION_MAX) || (MontantDebit < 0) ) ISOException.throwIt (SW_MONTANT_TRANSACTION_INVALIDE); if ( (short) (Solde - MontantDebit) < 0) ISOException.throwIt (SW_SOLDE_NEGATIF); Solde = (short)(Solde - MontantDebit); } JavaCard Exemple private void getBalance (APDU apdu) { byte[] buffer = apdu.getBuffer (); short le = apdu.setOutgoing (); apdu.setOutgoingLength ( (byte) 2); Util.setShort (buffer, (short)0, Solde); apdu.sendBytes ( (short)0, (short)2 ); } private void verify (APDU apdu) { byte[] buffer = apdu.getBuffer (); byte byteRead = (byte) (apdu.setIncomingAndReceive ()); if( CodePin.check (buffer, ISO7816.OFFSET_CDATA, byteRead) == false ) ISOException.throwIt ( (short) (SW_CODE_ERRONE + CodePin.getTriesRemaining ()) ); } } Sécurité Les algorithmes 2 principaux algorithmes : • RSA (Rivest Shamir Adleman) 1977 : 320 bits, nombres premier, algorithme d’Euclide (clé publique) • DES (Data Encryption Standard) 1974 : clé de 56 bits (clé privée) • TDES (Triple Data Encryption Standard) 1998 : 3 applications de DES avec 2 clés de 56 bits • AES (Advanced Encryption Standard) 1998 : clé de 128,192 ou 256 bits Sécurité Mécanisme de paiement par carte bleue • Authentification de la carte : Algo RSA, fonctions de tests, identifie la carte de manière unique. Sécurité Mécanisme de paiement par carte bleue • Code confidentiel : Terminal de paiement envoie requête à la carte, carte calcule puis envoi réponse au terminal. • Authentification de la transaction : Algo DES et TDES, fonctions de tests, code les informations de la transaction. Sécurité Le standard EMV (Europay Mastercard Visa) • Transaction cryptée par TDES avec une clé de 90 bits • Signature RSA doit passer à 1024 bits pour être tranquille 10 ans. • Protocole d’authentification statique : 1 contrôle de certificats • Protocole d’authentification dynamique : 3 contrôles de certificats en cascade Nécessite des cartes puissantes et des ressources OpenCard 3 raisons : • Les terminaux des cartes, n’ont pas d’interfaces standardisées différents protocoles • Card Operating System divers différentes commandes et codes de réponse • Les émetteurs des cartes décident de l’emplacement des applications sur la carte But : Rendre le développement d’applications indépendant des fabricants, technologies, … OpenCard OpenCard Framework • CardTerminal layer permet de faire abstraction des terminaux. Fournit des accès au lecteur et à la carte insérée. • CardService layer permet de faire abstraction des Card Operating System. Ex : FileAccessCardService, SignatureCardService, ApplicationManagementCardService, PurseCardService OpenCard Exemple de programmation OpenCard Exemple de programmation Phase d’initialisation : // Initialize the framework SmartCard.start (); // register the new SignatureCard as a Card Terminal Event Listener CardTerminalRegistry.getRegistry().addCTListener(this); Phase de récupération des paramètres : public void cardInserted(CardTerminalEvent ctEvent) try { fileService = (FileAccessCardService)card.getCardService(FileAccessCardService.class, true); signatureService = (SignatureCardService)card.getCardService(SignatureCardService.class, true); SBCHVDialog dialog = new SBCHVDialog(); fileService.setCHVDialog(dialog); signatureService.setCHVDialog(dialog); } catch(Exception e) { e.printStackTrace(); } } OpenCard Exemple de programmation Phase de lecture dans le fichier : ... // mount file system to get access to the root directory CardFile root = new CardFile(fileService); // This is the file holding card holder name and e-Mail address CardFile file = new CardFile(root, ":C009"); // Create a CardFileInputStream for file DataInputStream dis = new DataInputStream(new CardFileInputStream(file)); // Read in the owner’s name byte[] cardHolderData = new byte[file.getLength()]; dis.read(cardHolderData); // Explicitly close the InputStream to yield the smart card to other applications dis.close(); ... OpenCard Exemple de programmation Génération de la signature numérique : // specify the key used for signing PrivateKeyFile kf = new PrivateKeyFile (new CardFilePath(":C110"), keyNumber); // Let the card generate a signature signature = signatureService.signData(kf, JCAStandardNames.SHA1_RSA, JCAStandardNames.ZERO_PADDING, data); Terminaison : SmartCard.shutdown (); OpenCard Schéma Suppléments -Sécurité : Les fraudes des cartes bancaires -Applications générales : Par secteur -Application : La carte MONEO -Conférences : Le salon Cartes 2002 à Paris -Technologies : FINREAD pour sécuriser l’e-business -Glossaire -Références Suppléments Fraudes des cartes bancaires L’affaire Humpich : En 1998 un informaticien a réussi à falsifier les cartes à puces en contournant 2 sécurités sur 3. • Découvre la clé RSA pour l’authentification de la carte • Carte répond « code bon » lorsque n’importe quel code est entré Fraude sur Internet : • 16 chiffres de la carte bancaire, vérifiés par un simple algorithme Suppléments MONEO • Porte Monnaie Electronique Idée de Société Européenne de la Monnaie Electronique (SEME) • Technologie allemande « Geldkarte » de la banque allemande ZKA. • Sécurité : Algorithme DES 56 bits seulement ! • Pas de paiement sur Internet Suppléments Applications générales • Télécommunications – L’un des plus gros secteurs – GSM – Télécarte (Cabines, Publiphones) • Les transports – Système Transcarte (SEMURVAL, SNCF) – STO (Réseau d’autobus , sans contact) Suppléments Applications générales • La santé : – carte SesamE-Vitale – HC-Forum (identification et milieu familial) • Les banques : – CB – Porte-monnaie électronique Suppléments • Le – – – – Applications générales marketing : Télécarte La carte téléphonique publicitaire Carte à puce sérigraphiée Carte de fidélité • Contrôle d’accès – Logique – Physique Suppléments Salon Cartes 2002 5 – 7 novembre 2002 à Paris • Oberthur : Gestion de la carte SIM sur Internet ajout de services et prestations. • Schlumberger : SIM to SIM copie l’intégralité d’une puce vers une autre pour les évolutions vers de nouvelles technologies. • 2007 : Carte d’identité électronique : Identification par empreinte digitale intégrée ? Suppléments FINREAD : Pour sécuriser l’ebusiness • Définition de normes et de spécifications techniques d'un nouveau standard européen. • Lecteur avec une sécurité maximale pour les transactions à distance, idéal pour les paiements multi supports. Glossaire AES : Advanced Encryption Standard AFNOR : Association Française de Normalisation AID : Application Identifier APDU : Application Programming Data Units ATR : Answer To Reset COS : Card Operating System DES : Data Encryption Standard EEPROM : Electrical Erasable Programmable Read Only Memory EPROM : Erasable Programmable Read Only Memory EMV : Europay Mastercard Visa FeRAM : Ferroelectric Random Access Memory MAM : Microprocesseur Autoprogrammable Monolithique PTS : Protocol Type Selection RAM : Random Access Memory RSA : Rivest Shamir Adelman SCQL : Smart Card Query Language TDES : Triple Data Encryption Standard TPDU : Transmission Protocol Data Unit Références http://www.opencard.org http://www.xcard3.com http://www.dell.com http://www.gemplus.com http://www.smartcards.net http://www.smartcardalliance.org http://www.cartes.com http://www.cartes-bancaires.com