Présentation - LIG Membres

publicité
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
Téléchargement