Les cartes COS: exemple de cartes à SGF 1. Généralités COS = Chip Operating System Les cartes COS (Gemplus) représentent une gamme de cartes à structure de données de type SGF (système de gestion de fichiers). Ces cartes suivent la normalisation ISO 7816-4, qui décrit les types de fichiers, les structures de données, les clés d'accès. Les cartes abritent un `masque' en ROM, qui contient l'OS et l'application. Il est donc impossible a priori de charger dynamiquement du code dans une carte. Pour pallier cet inconvénienet on utilise un système dit de `filtres'; i.e. du code spécifique installé en EPROM, non modifiable par la suite. Famille des cartes COS : - COS : année 1988, 8 et 16 Kbits EEPROM - MCOS (Multiple Chip Operating System) : année 90, de 8 à 32 Kbits EEPROM - PCOS (Paiement Chip Operating System) : cartes comprenant des instructions dédiées au paiment électronique; année 1991, 8 à 32 Kbits EEPROM - MPCOS (Multiple Paiement Chip operating System) avec chiffrement des données en interne (algorithme DES ou triple DES) : année 1996, 8 32 et 64 Kbits EEPROM 2. La mémoire Les données contenues dans l'EEPROM des cartes sont modifiables et accessibles par un jeu d'instructions (code APDU) compris par les cartes. La mémoire est gérée par mots de 4 octets (lecture/écriture par 32 bits à la fois). Chaque carte a un numéro de série unique identifiable. Exemple carte MCOS : numéro de série sur 64 bits (2 mots), le numéro est placé dans les 8 premiers octets de la mémoire; l'octet 7 contient l'année de fabrication. Le troisième mot (octets 8 à 11) contient la référence de l'émetteur de la carte. L'octet VERROU : un octet spécial est placé en EPROM (non réinscriptible) et permet de suivre la vie de la carte. Chacun de ses bits est monté à 1 après chaque phase du cycle de vie de la carte : phase de fabrication (bit Bfab), phase de personnalisation (bit Bpers). exemple : sur une carte MCOS 16Kbits, il se trouve à l'@ 000Eh. Cet octet est disponible en octet historique numéro 10 de la réponse au reset. 3. Structure des donnees : Remarque : pour les cartes récentes ( PCOS et MPCOS), on trouve des fichiers normalisés ISO et des fichiers spécifiques constructeurs (pour compatibilité ascendante avec les applications antérieures à la normalisation). Tous les fichiers d'un même répertoire doivent être au même format. certaines instructions spécifiques PCOS ne s'appliquent qu'aux fichiers de format PCOS. La carte MCOS 3.1 répertoires Il existe une hiérarchie de répertoires à deux niveaux : - un répertoire principal (équivalent d'un répertoire root), qui peut contenir des fichiers et des répertoires - des répertoires sous la racine qui contiennent des fichiers. 3.2 fichiers Un fichier est repéré par son numéro (alloué séquentiellement par le système pour un répertoire donné) et un type (affecté par l'utilisateur ou l'application qui crée le fichier). Un fichier a une taille fixée à sa création et non modifiable. 3.3 bloc sécurité Un bloc de sécurité est rattaché à chaque répertoire; c'est un fichier système spécial qui contient 8 codes secrets et la description de leur fonction (valeurs d'autorisation). Il est utilisé par le système à chaque fois qu'un utilisateur veut lire ou écrire dans un fichier du répertoire. Un code secret est repéré par son numéro (de 0 à 7); le code secret de niveau 0 est réservé à l'émetteur de la carte. A la fabrication de la carte il existe seulement dans la carte : le répertoire racine et son bloc de sécurité contenant le code secret de l'émetteur. il faut donc connaître ce code secret pour créer d'autres répertoires. 3.4 répertoire ou fichier courant Un seul répertoire est " en ligne" : le répertoire courant; à la mise sous tension de la carte c'est le répertoire racine; ensuite on utilise l'instruction de sélection de répertoire pour modifier le répertoire courant; il n'y a pas de notion de "path", ni de navigation dans la hiérarchie; l'utilisateur n'accède qu'aux fichiers du répertoire courant. Il n'y a également qu'un fichier courant : le fichier sur lequel a porté la dernière instruction (création, sélection, lecture, écriture). 3.5 cryptographie il existe un jeu d'instructions pour crypter et décrypter les données transitant sur la liaison série entre la carte et le lecteur; l'algorithme utilisé est le DES (Data Encryption Standard). 3.6 demande de status STCARD CLA : 00 INS : F2 P1 : rfu P2 : 0y (y= 0, 1 ou 2) lg : 14, 32 ou 32 octets (fn de y) valeurs de y : y=0 ==> lg=0x0E réponse carte : 8 octets : numéro de série de la carte 1 octet : nombre de fichiers alloués dans le répertoire courant 2 octets : mémoire EEPROM libre en octets dans la carte 1 octet : codes secrets ayant eu une présentation fausse (bloc de sécurité courant) 1 octet : idem pour 2 présentations fausses 1 octet : idem pour 3 présentations fausses y=1 ==> lg=0x20 (il faut avoir présenté le code secret émetteur pour être autorisé à utiliser cette instruction) réponse carte : les descripteurs des 8 codes secrets du répertoire en cours (mais pas leur valeur) = 8 fois 4 octets. y=1 ==> lg=0x20 (il faut avoir présenté le code secret émetteur pour être autorisé à utiliser cette instruction) réponse carte : le fichier de contrôle du code ROM; à ne pas utiliser. 3.7 réponse au reset réponse classique avec 12 octets historique : TS T0 TB TC T1 T2 T3 T4 T5 T6 T7 T8 T9 T10 ME1 ME2 T1 T2 T3 : ox24 oxA0 ox30 : référence ROM et composant T4 T5 T6 T7 : référence émetteur T8 : nombre de répertoires présents dans la carte T9 : octet de statut des codes secrets (bit à 1 = code bloqué) T10 : octet "Verrous" Me1 Me2 : 90 00 4. Gestion des codes secrets et des droits d'accès La gestion des codes secrets et des droits d'accès comprend plusieurs étapes : - la création de nouveaux codes - protection des fichiers par les codes secrets - la validation des droits de l'utilisateur après la saisie d'un code secret correct 4.1 Principe de fonctionnement de la vérification des droits d'accès: A la création d'un fichier, l'utilisateur précise si un code secret doit avoir été présenté pour la lecture, pour l'écriture et pour l'effacement/réécriture du fichier (droits d'accès Cr, Cw et Cu). D'autre part, il existe en RAM un registre de 16 bits appelé le registre d'autorisation. fonctionnement : - l'utilisateur présente un code secret (par l'instruction CHKCOD) de numéro précis - la carte vérifie la correspondance entre le code présenté et le code secret de même numéro qui est dans son fichier des codes secrets - si le code secret est correct, la carte vient monter à 1 le bit correspondant à ce code secret dans le registre d'autorisation - l'utilisateur demande une opération sur un fichier (read/write/update) - la carte cherche dans le descripteur du fichier quel bit du registre d'autorisation doit être à 1 pour donner le droit à l'utilisateur d'exécuter cette instruction - elle cherche dans le registre d'autorisation si le bit correspondant est à 1 - elle exécute l'instruction ou refuse le droit 4.2 création de nouveaux codes secrets à la fabrication la carte ne connaît qu'un seul code secret : le code de numéro 0 du répertoire racine. On peut entrer dans le fichier des codes secrets de chaque répertoire 8 codes secrets par l'instruction LOACOD (Load Code). LOACOD : CLA : 00 INS : 22 P1 : 0 P2 : cs = numéro du code secret dans le fichier des codes secrets lg : 0x08 = longueur en octets du code secret (fixée) Data : le code secret (ou mot de passe) exemple : 0x00 0x22 0x00 0x03 0x08 [MOTPASSE] : création du code secret numéro 3 dans le répertoire courant 4.3 présentation de code secret CHKCOD : CLA : 00 INS : 20 P1 : 00 P2 : cs = numéro du code secret entre 0 et 7 lg : longueur en octets du code secret Data : le code secret exemple : 0x00 0x20 0x00 0x03 0x08 [MOTPASSE] : présentation de la chaîne de caractères MOTPASSE comme code secret numéro 3 ==> après vérification la carte va monter à 1 le bit 3 du registre d'autorisation Si le code présenté est incorrect, la carte ajoute 1 à un registre spécial, le compteur de ratification; dès que le compteur de ratification est égal à 3 (3 présentations incorrectes) ce code secret est bloqué; tous les fichiers qui en ont besoin seront donc inaccessibles. Le bloquage d'un code secret n'empêche pas les autres codes secrets de fonctionner. On peut réhabiliter un code secret bloqué. 4.4 création d'un fichier et de ses protections : MKFIL CLA: 00 INS : D4 P1 : 00 P2 : 00 \x11\x11\x11remarque : on ne fournit pas d'adresse mémoire d'emplacement, la carte gère elle-même lg : 04, 05 - lg=04 ==> 4octets en Data [type Cr Cw L]\x11\x11\x11 - lg=05 ==>5 octets en Data [type Cr Cw L Cu] L=longueur du fichier en MOTS type = numéro, qui affecte un type à un fichier (entre 1 et 255, au choix de l'utilisateur) Cr = numéro de bit du registre d'autorisation qui protège le fichier en lecture (0 si lecture libre) Cw= idem pour écriture Cu=idem pour effacement/réécriture (paramètre facultatif : si non précisé l'effacement et la réécriture sont impossibles) exemple : 0x00 0xD4 0x00 0x00 0x04 [02 01 02 04] : création d'un fichier de type 2, protégé en lecture par le code secret 1, en écriture par le code secret 2 et de longueur 4 mots (16 octets). Le système affecte un numéro séquentiel au fichier à sa création. (pour les cartes plus récentes, l'utilisateur peut affecter lui-même un nom et un numéro au fichier créé). Pour connaître les numéros des fichiers créés, on utilise l'instruction RDDIR (Read Directory) qui fournit la table système de description des fichiers du répertoire courant. 4.5 contenu d'un répertoire RDDIR : CLA : 00 INS : B4 P1 : 00 P2 : y = 1 = lecture étendue (2 octets par fichier de la table) \x11\x11\x11\x11\x11\x11\x11\x11\x11\x11= 0 = lecture simple (1 octet par fichier de la table) lg : nombre d'octets attendus en réponse lg doit impérativement être un multiple entier de 4 octets et être compris entre 4 et 256. La réponse de la carte commence par le dernier fichier créé. 5. Utilisation des fichiers 5.1 création d'un répertoire : instruction utilisable seulement après présentation du code secret émetteur MKDIR CLA : 00 INS : D4 P1 : 00 (rfu) P2 : 01 (toujours égal à 1) lg : 02 Data : Id Op Id = identifiant du répertoire entre 1 et 254 Attention 255 est réservé !!!! Op = options; 2 bits sont utilisés bit 0 à 1 : création avec bloc de sécurité associé bit 0 à 0 : création sans bloc de sécurité associé bit 1 à 0 : instruction de réécriture interdite dans tout le répertoire bit 1 à 1 : instruction de réécriture autorisée dans tout le répertoire 5.2 lecture d'un fichier RDFIL CLA : 00 INS : B2 P1 : Po position (en mots : 0 à 255) du début de lecture dans le fichier (offset) P2 : nn numéro du fichier à lire lg : longueur des données attendues en octets 5.3 écriture d'un fichier WRFIL CLA:00 INS:D2 P1: po = position en mots à partir du début du fichier pour écriture (offset) P2: nn = numéro de fichier lg : nombre d'octets à écrire Data : octets à écrire exemple : 0x00 0xD2 0x00 0x03 0x04 [`/N','/O','/E','/L'] = écrire NOEL en première position du fichier numéro 3. 5.5 sélection d'un répertoire SELDIR CLA:00 INS:A4 P1 : 00 (rfu) P2 : Id identifiant du répertoire lg : 08 longueur des données fournies 6. résumé des instructions et codes d'erreur CHKCOD : présentation d'un code secret 00 20 00 nn 08 [MOTPASSE] (nn=numéro du code secret entre 0 et 7) codes retour : 6B : numéro de code > 7 67 : la longueur n'est pas de 8 92 02 : pb écriture en EEPROM 98 02 : code secret non validé 98 04 : code secret présenté faux 98 06 : code secret annulé 98 40 : code secret verrouillé (3 présentations fausses) LOACOD : création d'un code secret 00 22 00 nn 08 [MOTPASSE\ (nn=numéro du code secret entre 1 et 7) codes retour : 67 : longueur incorrecte 6B : numéro de code incorrect (>7 ou <1) 6D : instruction non disponible 92 02 : erreur en relecture : code non validé 94 80 : code secret déjà utilisé ou annulé 98 10 : registre d'autorisation incorrect MKDIR : création d'un répertoire sous la racine 00 D4 00 01 02 [Id Op] codes retour : 67 : longueur des données <> 2 6D : instruction non disponible 6F : erreur de parité sur le dernier descripteur 92 02 : erreur de programmation en EEPROM 94 02 : Id = 0 INTERDIT ou Id déjà existant 94 80 : plus de place pour créer un répertoire 98 10 : registre d'autorisation incorrect MKFIL : création d'un fichier 00 D4 00 00 04 (05) [tt Cr Cw L [Cu]] tt = type de fichier entre 1 et 255 Cr = droits en lecture Cw = droits en écriture L = longueur du fichier en mots Cu = droits en effacement codes retour: 67 : longueur de données <> 4 ou 5 6B : P1 et P2 incorrects 6F : erreur de parité sur le dernier descripteur 92 02 : erreur de programmation en EEPROM 94 02 : valeurs de conditions d'accès impossible (>15) ou type 0 (interdit) ou code émetteur non présenté 94 80 : plus de place dans la FAT ou dans l'EEPROM 98 10 : registre d'autorisation incorrect RDDIR : "dir" d'un répertoire 00 B4 Po 0y lg : Po = déplacement en nombre de descripteurs dans la FAT (0 pour le dernier alloué); y=0 lecture simple (1 mot/descripteur) y=1 (2 mots par descripteur); lg = longueur en octets des données demandées (4 à 256) codes retour: 67 : la longueur n'est pas un multiple de 4 ou 8 ou longueur > nb de descripteurs existants 6B : y <> 0 ou 1 RDFIL: lecture de fichier 00 B2 Po nn lg : Po=position en mots (0 à 255) du début de lecture; nn = numéro du fichier; lg=longueur en octets des données attendues (1 à 256) codes retour : 67 : longueur de données Po+lg > adresse de fin de fichier 6B : nn=0 6D : numéro de descripteur invalide ou non alloué 98 04 : fichier verrouillé en lecture ou registre d'autorisation non positionné SELDIR : sélection d'un répertoire 00 A4 00 Id 08 : Id=identifiant du répertoire codes retour: 67 : longueur des données <>8 6B : identifiant du répertoire = 0 6D : l'identifiant ne correspond pas à un répertoire valide 90 02 : répertoire avec identifiant Id n'existe pas STCARD : status carte 00 F2 00 0y lg (y=0 et lg=0Eh; y=1 et lg=20h; y=2 et lg=20h) codes retour: 67 : lg incorrect 68 : y incorrect 98 02 : la mémoire libre n'est pas vierge 98 10 : y=1 ou 2 et registre d'autorisation incorrect WRFIL: écriture dans un fichier 00 D2 Po nn lg [data] : Po= position en mots de début d'écriture dans le fichier, nn=numéro de fichier; lg=longueur en octets de données à écrire; data=valeur des octets à écrire codes retour ; 67 : longueur de données Po+lg > fin de fichier 6B : nn=0 6D : numéro de descripteur invalide ou non alloué 92 02 : écriture incorrecte en mémoire 98 04 : fichier verrouillé en écriture ou registre d'autorisation incorrect TP matériel : carte MCOS vierge + logiciel gci 1. créer les codes secrets suivants dans le bloc de sécurité de la racine : code 2 : IUT19982 code 5 : IUT19985 2. créer sous la racine un fichier à accès libre (2 mots) 3. créer sous la racine un fichier à lecture protégée par le code 2, écriture protégée par le code 5, sans réécriture possible (12 mots) 4. écrire votre nom dans le fichier 2 5. écrire ce que vous voulez dans le fichier 1 6. lire les fichiers 1 et 2 7. créer un répertoire Id=1 sans bloc de sécurité et sans autorisation de réécriture