L'anti-tearing: concept et mécanismes
Tearing et anti-tearing
Une carte à puce sans-contact est un objet électronique sans source d'énergie propre. Il ne fonctionne que lorsqu'il est télé-alimenté par le champ RF du lecteur.
Or l'utilisateur qui tient la carte peut à tout moment l'éloigner du lecteur. C'est ce qu'on nomme le tearing, ou arrachement. La source d'énergie qui fait fonctionner la puce est donc intrinsèquement peu fiable puisque l'utilisateur peut la faire disparaître à tout moment. Or, si l'énergie disparaît pendant que la puce est en train de réaliser une opération d'écriture sur sa mémoire non-volatile (E2PROM ou flash), la zone mémoire concernée n'aura été écrite que partiellement, ou aura été altérée.
Cette problématique existe également dans le cas des cartes à contact mais est alors moins gênante dans la mesure où l'utilisateur est habitué à laisser sa carte en place jusqu'à la fin de la transaction. Les automates bancaires ou les bornes de parking disposent même de lecteurs motorisés qui "emprisonnent" la carte pendant toute la durée de la transaction.
L'anti-tearing est le concept qui consiste à doter la carte de contre-mesures, hardware et/ou software, pour éviter que l'arrachement durant une écriture ne débouche sur la corruption du contenu stocké en mémoire.
Supposons par exemple que si la carte stocke un nombre de points ou de jetons, dont la valeur initiale est 12345. Le terminal souhaite l'incrémenter de 1 pour le porter à 12346. Si la carte ne dispose pas de mesures anti-tearing et qu'elle est arrachée au moment précis où sa logique interne réécrit le compteur en mémoire, la valeur finale peut être 12300, ou 123FF, ou 00000, ou FFFFF…
Le compteur sera vraisemblablement associé à une somme de contrôle ou à un contrôle d'intégrité et d'authenticité cryptographique (CMAC) pour déterminer à la prochaine transaction s'il est correct ou non. Mais s'il n'est plus correct, comment savoir quelle aurait été la valeur correcte ?
Les méthodes anti-tearing
La méthode la plus simple pour résoudre ce problème est d'utiliser une technologie de "mirroring", c'est à dire de doubler toute la mémoire de stockage et d'écrire sur une zone puis sur l'autre.
Si l'écriture n'est pas menée à son terme, l'ancienne valeur est toujours présente dans une des deux zones qui sert ainsi de backup et permet de restaurer un état cohérent à la mise sous tension suivante.
En contrepartie de sa simplicité, cette méthode peut augmenter significativement le coût de la carte car la taille de mémoire de stockage de la carte doit être doublée.
Pour les cartes qui ne disposent d'anti-tearing, il est possible d'implémenter le même principe de "mirroring" au niveau applicatif, en stockant toutes les données en double. En contrepartie, la taille 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 opération d'écriture, elle n'est pas effectuée directement dans la mémoire de stockage non volatile, mais mise en attente provisoirement dans la mémoire tampon.
Lorsque toutes les données attendues ont été reçues, la carte vérifie l'état de son alimentation et le niveau de charge de son condensateur. Si son condensateur a accumulé suffisamment d'énergie, elle sait qu'elle peut désormais commencer l'opération d'écriture car elle pourra la mener à son terme même en cas de tearing.
Par contre, si l'alimentation n'est plus présente et que le condensateur ne dispose pas d'assez d'énergie, l'écriture n'aura simplement pas lieu.
Ces deux méthodes peuvent se combiner pour amener sur certaines cartes, à un mécanisme transactionnel puissant. Au lieu de protéger des opérations d'écriture individuelles, l'anti-tearing couplé au mécanisme transactionnel va assurer l'atomicité d'un enchaînement de plusieurs écritures. Soit elles sont toutes effectuées avec succès, soit le contenu précédent est préservé.
L'intérêt d'un tel mécanisme transactionnel est aussi de d'accélérer significativement la reprise sur erreur, et c'est particulièrement important dans les applications comme les transports urbains.
Si l'utilisateur retire sa carte pendant la transaction, le terminal signale l'erreur et refuse l'accès. L'utilisateur présente alors sa carte de nouveau. Le terminal devrait logiquement commencer une nouvelle transaction et effectuer de nouveau le traitement complet, ce qui prend du temps, et risque de décompter dans la carte deux voyages au lieu d'un.
Or, si la carte dispose d'un anti-tearing transactionnel, le terminal peut se contenter de relire le dernier événement qui a été écrit dans le journal de transaction. S'il est cohérent avec son propre historique, il peut immédiatement libérer le passage.
Les cartes sans-contact de moyenne et haute gamme, intègrent généralement un mécanisme anti-tearing qui protège systématiquement toutes leurs métadonnées: zones de configurations, clés cryptographiques, organisation du système de fichiers…
Par contre, l'anti-tearing pour protéger les zones de données n'est pas forcément systématique. Le cas échéant, il faut l'activer fichier par fichier lors du formatage initial.
Publié le 20/11/2018
Laisser un commentaire