L’anti-tearing : principe et mécanismes
Tearing et anti-tearing
Une carte à puce sans contact est un objet électronique dépourvu de sa propre source d’alimentation : elle ne fonctionne que lorsqu’elle est téléalimentée par le champ RF du lecteur.
Or l’utilisateur qui tient la carte peut, à tout moment, l’éloigner du lecteur. C’est ce que l’on appelle le tearing (l’arrachement). La source d’alimentation qui fait fonctionner la puce est par nature fragile, puisque l’utilisateur peut la faire disparaître à tout instant. Si l’alimentation disparaît pendant que la puce écrit dans une mémoire non volatile (E2PROM ou flash), la zone mémoire concernée peut se retrouver écrite partiellement, voire corrompue.
Cette problématique existe aussi pour les cartes à contact, mais elle y est moins gênante : l’utilisateur a l’habitude de laisser sa carte dans le lecteur jusqu’à la fin de la transaction. Les distributeurs automatiques de billets ou les horodateurs disposent d’ailleurs souvent d’un lecteur motorisé qui « retient » la carte le temps de la transaction.
L’anti-tearing désigne l’ensemble des contre-mesures, matérielles et/ou logicielles, qui évitent qu’un arrachement pendant une écriture ne corrompe le contenu stocké en mémoire.
Prenons l’exemple d’une carte stockant un nombre de points ou de jetons, dont la valeur initiale est 12345. Le terminal souhaite ajouter 1 pour obtenir 12346. Si la carte ne dispose d’aucune mesure d’anti-tearing et qu’elle est arrachée pendant que sa logique interne réécrit la valeur en mémoire, la valeur finale pourrait devenir 12300, 123FF, 00000, FFFFF, ou toute autre valeur incohérente.
Cette valeur est généralement associée à une somme de contrôle ou à un contrôle d’intégrité et d’authenticité cryptographique (CMAC), qui permet de déterminer plus tard si elle est correcte. Mais si elle ne l’est pas, comment retrouver la valeur qui aurait dû être écrite ?
Les méthodes d’anti-tearing
La méthode la plus simple consiste à utiliser une technique de « miroir » : doubler la mémoire de stockage et écrire successivement dans une zone puis dans l’autre.
Si l’écriture est interrompue, l’ancienne valeur reste disponible dans l’une des deux zones, utilisée comme sauvegarde, ce qui permet de restaurer un état cohérent au prochain rallumage. En contrepartie de cette simplicité, cette méthode peut augmenter le coût de la carte, puisque la taille de la mémoire de stockage doit être doublée.
Pour les cartes qui ne disposent pas d’anti-tearing natif, il est possible d’implémenter le même principe de « miroir » au niveau applicatif, en stockant chaque donnée en double. En contrepartie, la mémoire utile est divisée par deux et le temps de transaction est doublé.
Une autre méthode consiste à doter la puce d’un condensateur et d’une mémoire tampon. Lorsque le terminal demande une écriture, celle-ci n’est pas réalisée directement dans la mémoire de stockage non volatile, mais placée en attente dans la mémoire tampon volatile. Une fois toutes les données attendues reçues, la carte vérifie sa source d’alimentation et le niveau de charge de son condensateur. Si celui-ci a accumulé suffisamment d’énergie, l’écriture peut débuter car la carte sait qu’elle pourra la terminer même en cas d’arrachement. Si l’alimentation n’est plus présente et que le condensateur n’a pas assez d’énergie, l’écriture n’a tout simplement pas lieu.
Ces deux méthodes peuvent se combiner pour aboutir, sur certaines cartes, à un mécanisme transactionnel puissant. Plutôt que de protéger chaque écriture individuellement, l’anti-tearing couplé à un mécanisme transactionnel garantit l’atomicité d’une chaîne de plusieurs écritures : soit elles réussissent toutes, soit le contenu précédent est préservé.
L’intérêt d’un tel mécanisme transactionnel est aussi d’accélérer la reprise sur erreur, ce qui compte pour des applications comme le transport. Si l’utilisateur retire sa carte pendant la transaction, le terminal signale l’erreur et refuse l’accès ; l’utilisateur représente alors sa carte et le terminal doit relancer un traitement complet, ce qui prend du temps et risque de compter deux trajets au lieu d’un. Si la carte dispose d’un anti-tearing transactionnel, le terminal peut simplement relire le dernier événement inscrit dans son journal de transactions : s’il est cohérent avec son propre historique, il peut immédiatement laisser passer l’utilisateur.
Les cartes sans contact de milieu et de haut de gamme intègrent le plus souvent un mécanisme d’anti-tearing qui protège leurs métadonnées : zones de configuration, clés cryptographiques, organisation du système de fichiers. En revanche, l’anti-tearing appliqué aux zones de données n’est pas systématique : il doit, le cas échéant, être activé fichier par fichier dès le formatage initial.