610 likes | 932 Views
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 : Dépots de brevets par Roland Moreno
E N D
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 : Dépots de brevets par Roland Moreno • 1978 : M. Ugon (Bull CP8) invente le M.A.M • 1981 : Début de la normalisation AFNOR • 1982 : Expérimentation baptisée «IPSO» • 1984 : 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
2 types de cartes Technologie • 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 Bus de données ROM EEPROM RAM Bus d’adresses Microcontact Microchip Micromodule 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
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 85 mm 54 mm Epaisseur 0,76 mm • Caractéristiques physiques, dimensions
ISO 7816-2 2 1 3 8 4 7 5 6 • Emplacement des contacts et aspects électriques 1 - 2 : Alimentation 3 à 5 V 3 : Horloge 4 : Remise à Zéro 5 : Optionnel 6 : Optionnel 7 : I/O asynchrone 8 : 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 • 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.
Etiquette Longueur valeur ISO 7816-6 • Spécifie les éléments de données inter-industrie : Nom du porteur de la carte Date d’expiration …
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
Avantages JavaCard • • Facilité de développement (Java) • • Sécurité • • Portabilité • • Stockage et gestion de multiples applications • • Compatibilité
Exemple JavaCard 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 ()) ); } }
Les algorithmes Sécurité 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
Mécanisme de paiement par carte bleue Sécurité • Authentification de la carte : Algo RSA, fonctions de tests, identifie la carte de manière unique.
Mécanisme de paiement par carte bleue Sécurité • 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.
Le standard EMV Sécurité (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 Framework OpenCard • 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
Exemple de programmation OpenCard
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(); } } Exemple de programmation OpenCard Phase d’initialisation : // Initialize the framework SmartCard.start (); // register the new SignatureCard as a Card Terminal Event Listener CardTerminalRegistry.getRegistry().addCTListener(this);
Exemple de programmation OpenCard 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(); ...
Exemple de programmation OpenCard 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 ();
Schéma OpenCard
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
Fraudes des cartes bancaires Fraude sur Internet : • 16 chiffres de la carte bancaire, vérifiés par un simple algorithme Suppléments 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é
MONEO Suppléments • 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