jeudi 21 juillet 2016

Silvercard et autres cartes à puce à base de PIC

Il y a 3 types de cartes à puce. Tout d’abord, et ce sont les plus répandues, les cartes émises par les fondeurs de cartes. C’est le cas de toutes les cartes bancaires, navigo, et autres. Ces cartes ont ce qu’on appelle dans le jargon un « masque », c’est-à-dire un logiciel intégré en dur sur la base d’un système d’exploitation maison dédié. Ces cartes sont programmées une fois pour toutes en usine.

Ensuite il y a les cartes programmables de haut niveau, comme les java cards ou les basic cards. Il s’agit de cartes comportant un système d’exploitation capable de faire tourner des applications écrites dans un langage de haut niveau (java, basic) et qui surtout fournit aux programmeurs de la carte des fonctions de haut niveau déjà écrites (briques logicielles) permettant l’utilisation directe de composants logiciels déjà programmés et réutilisables, sur la gestion des entrées/sorties par exemple ou pour l’utilisation de fonctions cryptographiques.

Enfin, il y a les cartes programmables de bas niveau. Ce sont celles qui m’intéressent et qui font l’objet de cet article. Dans cette catégorie, on retrouve les cartes wafer gold, silvercard ou greencard. Ici pas de brique logicielle ni de composant logiciel réutilisable. La carte est programmable mais est fournie nue, sans rien de logiciel dedans. Le langage de prédilection pour les programmer est l’assembleur, voire le C dans le meilleur des cas (mais pas de java ni de basic).
Dit comme cela, ces cartes semblent moins intéressantes que les cartes programmables de haut niveau. Elles ont pourtant un intérêt, cela dépend de ce que l’on veut faire. Si l’on veut développer une application qui ne nécessite pas trop de mémoire, elles sont faciles à programmer et l’investissement initial est minime (un simple programmateur de cartes à quelques dizaines d’euros).
En tout cas, pour le projet que j’ai en tête, une silvercard est largement suffisante. Présentons donc cette famille de cartes à puce dans le détail.
Des puces à micro-contrôleur
Si les années 60-70 ont vu l’explosion de l’utilisation des micro-processeurs, les années 80-90 ont-elles été le théâtre de l’explosion de l’utilisation des micro-contrôleurs. Un micro-contrôleur c’est un micro-processeur simple, mais avec de la RAM, de la PROM (ou mieux de l’EEPROM) et des entrées/sorties dedans. En fait, dans un micro-contrôleur on a pratiquement un ordinateur complet dans une seule puce à quelques euros.
Bien sûr les micro-contrôleurs ne sont pas destinés à équiper des ordinateurs, mais plutôt des lave-vaisselle, des robots industriels, ou des lave-linge. Dans ce cadre sont apparus sur le marché plusieurs marques de micro-contrôleurs.
Dans les années 90, l’explosion de l’utilisation des cartes à puce a amené certains fabricants à avoir l’idée d’intégrer des micro-contrôleurs standards dans des cartes à puce. C’est ainsi que sont apparues ces cartes programmables de bas niveau. Deux fabricants de micro-contrôleurs en particulier ont bénéficié de cette dynamique : Microchip qui fabrique les micro-contrôleurs PIC, et Atmel qui fabrique les micro-contrôleurs du même nom.
Ainsi on retrouve des cartes programmables de bas niveau à base de micro-contrôleurs PIC comme les wafer gold cards, les silvercards, ou les greencards. D’autres cartes comme la Funcard ou la Jupiter embarquent un micro-contrôleur Atmel.
La différence entre ces cartes tient en la référence exacte du micro-contrôleur embarqué ainsi que la quantité de mémoire EEPROM l’accompagnant. En effet, la quantité de mémoire nécessaire au développement d’applications sérieuses n’étant généralement pas compatible avec le peu de mémoire embarquée dans le micro-contrôleur, les cartes embarquent une mémoire EEPROM en plus du micro-contrôleur.
Les cartes à puce à base de PIC
Nous voilà donc au cœur du sujet. L’architecture interne de ces cartes est toujours la même : les pattes externes de la carte à puce sont reliées en interne aux pattes équivalentes du micro-contrôleur (la patte horloge externe par exemple est reliée en interne à la patte horloge du micro-contrôleur, idem pour l’alimentation, etc.), y compris la patte input/ouput qui elle est reliée à l’une des pattes d’un des ports de communication du micro-contrôleur. La mémoire EEPROM est elle aussi reliée à des pattes internes du micro-contrôleur (ce qui permet au PIC de lire ou d’écrire dedans), mais n’est pas accessible depuis l’extérieur de la carte à puce.
Cette mémoire EEPROM interne, non accessible depuis l’extérieur de la puce, pose problème quant à son remplissage initial puisque justement … elle n’est pas accessible depuis l’extérieur de la puce. On est donc obligé de passer par un programme spécial, appelé « loader », à charger dans le PIC et dont le but est de prendre les données qu’on lui envoie et c’est le PIC qui transfère ces données vers l’EEPROM. Une fois que l’EEPROM est remplie, on efface le loader du PIC et on y met le programme final.
D’un point de vue de la sécurité le PIC est protégé, car il dispose d’un bit de sécurité qu’on peut positionner à 1 et qui empêche de pouvoir le lire pour y analyser le programme qu’il contient. Ce n’est pas le cas de l’EEPROM. Il faut donc faire attention à mettre les données sensibles dans le PIC et non dans l’EEPROM quand on design un système. En effet, si votre PIC est protégé en lecture, un assaillant peut toujours écraser votre programme par un programme à lui qui communique à l’extérieur le contenu de l’EEPROM.
La carte wafer gold est une carte à puce de couleur or renfermant un PIC16F84 et une mémoire EEPROM 24LC16B (de 2 Ko) câblée selon le schéma ci-dessous.

Il est à noter qu’il est tout à fait possible de recréer ces cartes en mettant sur un bout d’epoxy le PIC, l’EEPROM et en les reliant comme sur le schéma, en reliant le tout à des connexions de carte à puce.
La silvercard est une carte à puce de couleur argent refermant un PIC16F876 (ou 16F877) et une EEPROM 24LC64 (8 Ko) câblée selon le schéma ci-dessous.

On trouve aussi des greencards  (PIC16F876 + 24C128), des greencards 2 (PIC16F876 + 24C256), des bluecards, des emeraldcards, des canarycards.
Programmation de ces cartes
Hormis le fait qu’il faut disposer d’un programmateur physique, c’est-à-dire un dispositif à même d’injecter dans le PIC qui est dans la carte le programme qu’on a écrit pour lui (un simple lecteur de carte à puce en est incapable), encore faut-il savoir écrire un programme pour un PIC.
Et là il faut trois choses :
  • Un : maitriser un langage de programmation supporté
  • Deux : être capable de compiler le programme qu’on a écrit
  • Trois : connaitre parfaitement le fonctionnement du PIC
Concernant le point 3, il n’y a pas 36 manières de faire : il faut récupérer et bûcher le datasheet du PIC sur le site de Microchip.
Concernant le point 1, en gros, il y a le choix entre 2 langages : le C ou l’assembleur. Le problème du C, c’est qu’on ne maitrise pas aussi bien la bête qu’en assembleur, et surtout les compilateurs C pour PIC sont payants à ma connaissance.
Concernant le point 2, il faut un compilateur. Soit on achète un compilateur C, soit on installe un compilateur assembleur gratuit, son on programme son propre compilateur. Cela parait bizarre de suggérer de programmer son propre compilateur, mais en réalité c’est assez facile, le PIC ne connaissant que 35 instructions assembleur. Je l’ai fait plus jeune pour le PIC16F84, le compilateur ne faisait que quelques centaines de lignes de C. J’ai aussi fait dernièrement un désassembleur de PIC16F876 en C, que je présenterai dans un prochain article. Sous Linux, il suffit d’installer le compilateur ASM PIC du GNU, gpasm (sudo apt-get install gputils).
Les compilateurs produisent des fichiers textes au format hex intel.
Il va de soi que, quel que soit le projet qu’on envisage de faire avec une PIC card, il y a des routines assembleur incontournables qui seront nécessairement à mettre dans le programme. On peut citer :
  • Une routine capable d’émettre un octet pour un APDU en convention directe ( !)
  • Une routine capable d’émettre un octet pour un APDU en convention inverse ( !)
  • Une routine capable de recevoir un octet APDU en convention directe ( !)
  • Une routine capable de recevoir un octet APDU en convention inverse ( !)
  • Une routine capable de lire dans l’EEPROM interne du PIC (*)
  • Une routine capable d’écrire dans l’EEPROM interne du PIC (*)
  • Une routine capable de lire dans l’EEPROM externe ( !)
  • Une routine capable d’écrire dans l’EEPROM externe ( !)
  • Des routines de cryptographie
Il faut donc avoir ces routines dans sa boite à outil. Il se trouve que les routines (*) sont données dans la datasheet des PIC, et les routines ( !) sont aisément retrouvables dans les programmes « loaders » (vu au-dessus) qui pullulent sur Internet.
Pour un programme personnel, il n’y a pas besoin de routines en convention directe et en convention inverse. On en choisit une. En ce qui me concerne, j’ai récupéré une routine SEND et une routine RECEIVE en convention inverse.
Concernant les routines de cryptographie, elles sont normalement indispensables. En effet, généralement si l’on utilise une application à base de carte à puce, c’est qu’il y a un processus à sécuriser. Or, dans notre époque moderne, la sécurité c’est la cryptographie.
Microchip met à disposition de la doc et une librairie pour faire de la crypto avec les PIC. En ce qui me concerne j’ai l’intention d’utiliser l’algorithme TEA pour sécuriser les communications. Ce sera l’objet d’un prochain article.

Piratage

Bien sûr, ce genre de carte peut servir, et a servi dans le passé, pour faire du piratage. Cependant, pour faire une bonne carte à puce de contrefaçon, il faut à la fois simuler un fonctionnement correct de la puce et reproduire le look de la partie plastique de la carte à puce.

D'aucuns seraient tentés, pour simplifier le problème du look de la partie plastique de la puce, de desceller la puce d'une vraie carte pour la remplacer par la puce d'une PIC card correctement programmée. Comme cela, ni vu ni connu je t'embrouille.

Sauf que non. Les concepteurs des PIC cards ont pensé à cette éventualité et l'ont contré en personnalisant la puce des PIC cards : elles contiennent toutes un dessin du symbole "alpha" ce qui rend les fausses puces collées très vite décelables.

Symbole alpha présent sur la puce d'une Silvercard
Publié le 21 juillet 2016 par Alan Cartman

Aucun commentaire: