Java Card
Java Card
fr/donsez/cours
Programmation JavaCard
en collaboration avec
Gilles Grimaud (Univ. Lille 1)
Sylvain Lecomte (Univ. Valenciennes)
Sébastien Jean (IUT de Valence)
21/11/2009
La JavaCard
Carte basée sur un interpréteur de bytecode Java
Applications Carte
JavaCard API
Java VM Flash
Système d ’Exploitation ROM
Couche Matériel Module
Programmation JavaCard, 1997-2009
Chaîne de production
2
21/11/2009
3
21/11/2009
JavaCard : Historique
Carte ’96 (CNIT-Paris)
Schlumberger présente la CyberFlex 1.0
Parallèlement d ’autres projets commun sur base de :
Langage C (Multos)
Langage Forth (Projet Gemplus)
Accord entre les principaux participants
et création du javaCard Forum
1998 : le vrai départ
Programmation JavaCard, 1997-2009
4
21/11/2009
Le JavaCard Forum
Consortium de fabriquant :
Carte : Delarue, Gemplus, Oberthur, Schlumberger
informatique : IBM, SUN
Matériel : DEC, Motorola
Utilisateurs : banques
But :
promouvoir la solution de la Javacard
Faire des choix communs (définition de standards)
Programmation JavaCard, 1997-2009
Solutions :
Un comité technique
Un comité « business »
plus d ’information : [Link]
5
21/11/2009
6
21/11/2009
[Link]
Tableaux à une dimension :
Eléments : types de base
Maximun : 2^15 éléments
7
21/11/2009
8
21/11/2009
Atomicité
Mise à jour de champs d’objets doit être atomique
Modèle transactionnel : beginTransaction(),
commitTransaction() et abortTransaction()
9
21/11/2009
Interface
Méthodes natives
10
21/11/2009
-- NullPointerException
-- SecurityException
-- ArrayStoreException
-- NegativeArraySizeException
-- IndexOutOfBoundsException
-- ArrayIndexOutOfBoundsException
11
Construction d’applications Java
21/11/2009
Card
Une application carte
Code dans la carte (application serveur = applet Java
Card)
Code dans le terminal (application cliente)
Implémentation de services
Installation de l’applet dans les cartes
Initialisation de services
Construction de l’application cliente
Invocation de services
12
21/11/2009
13
21/11/2009
couche de communication
14
21/11/2009
par l’applet
Pas d’API standard de communication avec la carte
15
21/11/2009
16
21/11/2009
17
21/11/2009
package [Link] ;
import [Link].* ;
public class Compteur extends Applet {
private int valeur;
public Compteur() { valeur = 0; register(); }
public static void install( APDU apdu ) { new Compteur(); }
public void process( APDU apdu ) {
byte[] buffer = [Link]();
if ( buffer[ISO.OFFSET_CLA] != 0xAA )
Programmation JavaCard, 1997-2009
[Link](ISO.SW_CLA_NOT_SUPPORTED);
switch ( buffer[ISO.OFFSET_INS] ) {
case 0x01: ... // Opération de lecture
case 0x02: ... // Opération d'incrémentation
case 0x03: ... // Opération de décrémentation
default:
[Link](ISO.SW_INS_NOT_SUPPORTED);
}
}
} 18
21/11/2009
package [Link] ;
import [Link].*;
public class Pme extends Applet {
final static byte Pme_CLA = (byte)0xB0;
final static byte Crediter_INS = (byte)0x10;
final static byte Debiter_INS = (byte)0x20;
final static byte Lire_INS = (byte)0x30;
final static byte Valider_INS = (byte)0x40;
final static byte MaxEssai_PIN = (byte)0x03;
final static byte MaxLg_PIN = (byte)0x08;
final static short BalanceNegative_SW = (short)0x6910;
Programmation JavaCard, 1997-2009
OwnerPin pin;
byte balance;
byte[] buffer;
private Pme() {
pin = new OwnerPIN(MaxEssai_PIN, MaxLg_PIN);
balance = 0;
register() ;
}
20
21/11/2009
21
21/11/2009
// Réception de données
private void crediter( APDU apdu ) {
if ( ![Link]() )
[Link](ISO.SW_PIN_RIQUIRED);
byte octetsLus = [Link]();
if ( octetsLus != 1 )
[Link](ISO.SW_WRONG_LENGTH);
balance = (byte)(balance + buffer[ISO.OFFSET_CDATA]);
}
// Réception de données
private void debiter( APDU apdu ) {
if ( ![Link]() )
Programmation JavaCard, 1997-2009
[Link](ISO.SW_PIN_RIQUIRED);
byte octetsLus = [Link]();
if ( octetsLus != 1 )
[Link](ISO.SW_WRONG_LENGTH);
if ( (balance - buffer[ISO.OFFSET_CDATA]) < 0 )
[Link](BalanceNegative_SW);
balance = (byte)(balance - buffer[ISO.OFFSET_CDATA]);
}
22
21/11/2009
// Émission de données
private void lire( APDU apdu ) {
if ( ![Link]() )
[Link](ISO.SW_PIN_RIQUIRED);
[Link]();
[Link]((byte)1);
buffer[0] = balance;
[Link]((short)0, (short)1) ;
}
// Manipulation du code secret
private void valider( APDU apdu ) {
Programmation JavaCard, 1997-2009
23
21/11/2009
Paquetages
[Link]
[Link]
Principale API pour programmer une applet carte
Définit les classes :
AID, APDU, Applet, ISO, PIN, JCSystem, Util
[Link]
gestion de clés publiques et privées, générateur de nombres
Programmation JavaCard, 1997-2009
aléatoires
Extensions
[Link]
[Link] : fonction de chiffrement et de
hashage...
24
Les APIs utilitaires de
21/11/2009
[Link] (1/3)
public final class AID
Encapsule des identifiants d'applications carte conformes à la
norme ISO 7816-5
public class Util
Méthodes statiques (natives) utiles pour performance carte
arrayCopy() Copie atomique/non atomiques de tableaux de bytes
arrayCopyNonAtomic() Copie non atomiques de tableaux de bytes,
26
Les APIs utilitaires de
21/11/2009
[Link] (3/3)
public class ISO
Champs statiques de constantes
conformes aux normes ISO 7816-3 et 4
public static final short SW_NO_ERROR = (short)
0x9000
public static final short SW_FILE_NOT_FOUND = (short) 0x6A82
public static final short SW_RECORD_NOT_FOUND= (short) 0x6A83
public static final short SW_INCORRECT_P1P2 = (short) 0x6A86
public static final short SW_WRONG_P1P2 = (short) 0x6B00
public static final short SW_CLA_NOT_SUPPORTED = (short)
0x6E00
...
public static final byte CLA_ISO7816= 0x00
public static final byte INS_SELECT= 0xA4
Programmation JavaCard, 1997-2009
27
21/11/2009
Les APIs Cryptographique de
[Link] et [Link]
But: indépendance fonction / algorithmes
Gestion de clés publiques et privées
KeyBuilder est une fabrique de clés
Key, DESKey, DSAPrivateKey, DSAPublicKey, PrivateKey, PublicKey,
RSAPrivateCrtKey, RSAPrivateKey, RSAPublicKey, SecretKey
Générateur de nombres aléatoires : RandomData
Hachage : MessageDigest
Signature : Signature
Programmation JavaCard, 1997-2009
Chiffrage/Déchiffrage : Cypher
28
21/11/2009
Exemple d’usage de la
cryptographique
private DESKey myDESKey;
public static void install(byte[] bArray,
short bOffset, byte bLength) {
new Encryption ();
[Link](bArray, bOffset, bLength);
}
public boolean select() { [Link](); return true; }
public void process( APDU apdu ) {
buffer = [Link]();
if ( buffer[ISO.OFFSET_CLA] != 0x00 )
Programmation JavaCard, 1997-2009
[Link](ISO.SW_CLA_NOT_SUPPORTED);
switch ( buffer[ISO.OFFSET_INS] ) {
case ENCRYPT_INS : encrypt(apdu); return;
case PINCHECK_INS : pinCheck(apdu); return;
default:
[Link](ISO.SW_INS_NOT_SUPPORTED);
}
}
29
21/11/2009
30
21/11/2009
void deselect()
Appelé à la désélection
void process(APDU apdu)
Méthodes appelées par JCRE
31
21/11/2009
32
21/11/2009
GemXpresso DMI
Architecture
Programmation JavaCard, 1997-2009
34
21/11/2009
JavaCard 3.0
[Link]
Sortie en Mars 2008
Spécification JC séparée en 2 éditions
Classic Edition
Compatible avec 2.2.2
Architecture matérielle semblable à celle requise par 2.2.2
Essentiellement une légère évolution de la spécification 2.2.2
Connected Edition
Architecture matérielle requise
Rapprochement de J2ME/CLDC
Processor 32b, MMU/noMMU, 40KB RAM, 256KB FlashNOR
Modèles d’applications
Compatibilité avec les applications dévelopées en Classic Edition
Applets
Programmation JavaCard, 1997-2009
Outils JavaCard
JavaCard Kit de Sun
converter
verifycap
installer
jcre (emulateur accessible via une socket IP)
+maskgen, apdutool, capgen, …
Kits Fabricants
Programmation JavaCard, 1997-2009
Points positifs
Carte ouverte
Langage Java
Programmation JavaCard, 1997-2009
API standard
Nouveautés arrivent...
37
21/11/2009
Global Platform
A l’origine VOP (Visa Open Platform)
bibliothèques
Sélectionner d’une application
38
21/11/2009
Existant
PC/SC : API C/C++ Microsoft pour accéder aux cartes sur les
plates-formes Windows 32 bits (98 et NT4 et 5)
USB CCID 1.0 (Chip/Smart Card Device Interface)
pcsc-lite, JPC/SC
Programmation JavaCard, 1997-2009
39
21/11/2009
Paquetage [Link]
Classe Ifd (Interface Device)
Représente le lecteur
Gère canaux de communication avec le lecteur
Sous-classe pour chaque mode de communication
Classe Icc (Integrated Circuit Card)
Représente la carte
Programmation JavaCard, 1997-2009
[Link]
gemxpresso pcos
[Link]
[Link]
Programmation JavaCard, 1997-2009
JNI JDirect
wjnigcr
w32gcr40
41
21/11/2009
package [Link] ;
import [Link].* ;
/* Application terminal */
Ifd lecteur =
new IfdSerial(IFDTYPE.GCR410, SERIALPORT.G_COM1, 9600);
Icc carte = new Icc() ;
try {
// Connexion à la carte via lecteur GCR410
short canal = [Link]();
SessionParameters atr = [Link](canal);
// Échange d’APDUs (APDU de selection de l’applet Compteur)
Programmation JavaCard, 1997-2009
Driver PC/SC
Programmation JavaCard, 1997-2009
MuscleCard
Javacard Applet d’identifitation
Licence BSD
[Link]
Programmation JavaCard, 1997-2009
46
21/11/2009
Benchmarks JavaCard
Voir la thèse de doctorat de Julien Cordry, CNAM
Paris, 30/11/2009.
Programmation JavaCard, 1997-2009
47
21/11/2009
Bibliographie
JAVACARD
Zhiqun Chen , "Java Card Technology for Smart Cards:
Architecture and Programmer's Guide (The Java
Series) ", 1 edition (June 2, 2000) , Addison-Wesley Pub
Co; ISBN: 0201703297,
[Link]
Site Sun :
[Link]
Java Card Forum :
Programmation JavaCard, 1997-2009
[Link]
Gemplus
[Link]
Une introduction
[Link]
48
21/11/2009
50
21/11/2009
Remerciement à
Jean-Jacques Vandewalle (Gemalto R&D)
Pierre Paradinas (CNAM/INRIA)
Alain Rhélimi (Gemalto)
Programmation JavaCard, 1997-2009
51