FR 2777372 A1 19991015 FR 9804454 A 19980409 L'invention concerne les cartes à microcircuit, et plus particulièrement les cartes à microprocesseur, qui réalisent elles-mêmes diverses modifications de leur mémoire non volatile. Lorsque de telles modifications sont opérées, il est bien entendu nécessaire de s'assurer qu'elles ont été correctement effectuées avant de pouvoir exploiter l'information nouvellement écrite. Dans le cas contraire, l'information nouvellement écrite devra être ignorée ou effacée et l'information à considérer devra être celle qui était écrite dans la carte avec l'exécution de l'opération incorrecte. La cause habituelle d'une telle opération imparfaite est la rupture inattendue de l'alimentation due à un "arrachement" de la carte, c'està-dire un retrait de celle-ci avant la fin du traitement, entraînant une interruption prématurée du couplage avec le terminal. Ce risque est particulièrement élevé avec les cartes du type "sans contact", où les limites du volume dans lequel la carte peut fonctionner correctement autour du terminal ne sont pas perceptibles. Il existe dans ce cas un risque non négligeable de rupture inattendue de la communication entre carte et terminal, dû à la sortie de la carte du rayon d'action du terminal avant la fin du traitement, ou du fait d'une perturbation passagère, par exemple le passage d'une masse métallique à proximité. Une difficulté supplémentaire se présente dans le cas des mémoires non volatiles de type E2PROM avec lesquelles, si l'on interrompt une opération d'écriture avant sa fin normale, il peut se faire que les données soient néanmoins écrites, et puissent donc être correctement lues peu après l'écriture. Toutefois, si l'on réitère cette lecture plus tard, il n'est pas certain que l'on puisse l'effectuer correctement, car la rétention de l'information dans la cellule mémoire aura été insuffisante du fait de l'écriture interrompue avant terme. Pour assurer l'intégrité des données, il est donc souhaitable que, par leur gestion interne de la mémoire, les cartes se protègent à l'encontre de tels risques, en garantissant que les données sont soit dans l'état modifié, soit dans l'état avant demande de modification, mais jamais dans un état intermédiaire indéterminé résultant d'un "arrachement". Une première solution consiste à réserver une zone, fixe, de la mé moire non volatile pour l'écriture temporaire des données à modifier. Outre les données, cette zone comporte un champ de localisation (indication de l'adresse de ces données dans la mémoire) et un champ de contrôle (par exemple un contrôle de type parité ou analogue) qui assure l'intégrité du champ de données et du champ de localisation. Lors d'une lecture, la carte ignore cette zone temporaire et les données sont lues à leur emplacement réel. Lors d'une modification, la carte écrit tout d'abord les données à modifier dans la zone temporaire (supposée effacée), efface l'emplacement réel des données, écrit les données à partir du contenu de la zone temporaire et termine l'opération en effaçant la zone temporaire. Avant le premier accès aux données depuis la dernière interruption (normale ou anormale) du fonctionnement de la carte, par exemple à la remise à zéro ("reset"), la carte contrôle la zone temporaire et - si elle est effacée, la carte ne fait rien; - si elle n'est pas effacée mais que les données et leur localisation sont intègres, la carte écrit les données à partir du contenu de la zone temporaire et termine l'opération en effaçant la zone tempo raire; - si la zone temporaire n'est pas effacée et que les données et/ou leur localisation ne sont pas intègres, la carte efface la zone temporaire. Cette première solution, la plus courante, présente l'avantage de n'impliquer qu'un surcoût très faible en espace mémoire (seulement pour la zone temporaire). En revanche, elle présente deux inconvénients sérieux, à savoir (i) d'user rapidement la mémoire non volatile car la zone temporaire est utilisée à chaque opération, ce qui limite la durée de vie de la carte (avec les technologies actuelles une cellule mémoire E2PROM supporte au plus 105 à 106 écritures) et (ii) de prendre beaucoup de temps, ce qui est un inconvénient majeur dans les applications sans contact. Une deuxième solution consiste à dédoubler la mémoire en deux zones "flip-flop" susceptibles de contenir les données à protéger. Chaque zone comporte en plus des données un champ de contrôle qui indique quelle est la zone qui contient les données réelles (zone "pertinente") et qui assure l'intégrité des données et de leur pertinence. Lors d'une lecture, la carte détermine la zone pertinente et opère la lecture dans cette dernière. Lors d'une modification, la carte détermine la zone pertinente et opère l'écriture dans l'autre zone (supposée effacée) des nouvelles données et du nouveau champ de contrôle, qui indique que c'est désormais cette autre zone qui devient la zone pertinente, puis efface la zone initialement pertinente, devenue obsolète. Lors de tout accès à une zone, la carte en contrôle l'intégrité et l'efface si elle n'est pas intègre. Cette deuxième solution ne ralentit pas les traitements (une seule opération d'écriture à chaque modification), et double la limite d'usure de la mémoire non volatile. En revanche, elle fait plus que doubler l'espace mémoire nécessaire au stockage des données, ce qui grève significativement le coût de la carte. L'un des buts de l'invention est de proposer un procédé qui pallie ces divers inconvénients et garantisse parfaitement l'intégrité des données sans grever significativement l'espace mémoire, le temps de traitement ni la durée de vie de la mémoire non volatile. Pour la mise en oeuvre du procédé de l'invention, la mémoire étant organisée en secteurs comportant chacun un champ de données, conservant un contenu informatif, un champ d'identifiant, formant clef d'accès au secteur, et un champ de pertinence, formant sous-champ du champ d'identifiant pour discriminer parmi plusieurs secteurs de même identifiant celui dont le champ de données est à prendre en compte. L'écriture de données dans un secteur consiste à: a) appliquer en entrée les données à écrire et l'identifiant du secteur correspondant ; b) scruter la mémoire à la recherche d'éventuels secteurs dont l'identifiant est le même que celui appliqué en entrée ; c) scruter la mémoire à la recherche d'un secteur disponible ; et d) écrire dans ce secteur disponible les données appliquées en entrée; l'identifiant appliqué en entrée ; et une valeur de pertinence plus grande que celle éventuellement trouvée à l'étape b). Dans une forme de mise en oeuvre avantageuse, si la recherche de l'étape b) est infructueuse, on prévoit préalablement à l'étape d) l'ins cription d'un témoin, et son effacement postérieurement à l'étape d), ce témoin indiquant une possible réalisation incomplète de l'étape d). De préférence, lorsque l'on trouve à l'étape b) un secteur dont l'identifiant est le même que celui appliqué en entrée, alors on l'efface à une étape consécutive à l'étape d). Chaque secteur peut également comprendre un champ de contrôle, contenant une information de vérification de l'intégrité conjointe des trois champs de données, d'identifiant et de pertinence ; à l'étape b), on ignore alors les secteurs non intègres, que l'on peut également effacer. De préférence, le choix de l'emplacement mémoire qui sera écrit est opéré de manière à répartir l'usure de la mémoire, notamment par choix aléatoire d'un secteur parmi ceux disponibles. En ce qui concerne la lecture de données dans un secteur, celle-ci consiste à: A) appliquer en entrée l'identifiant du secteur à lire ; B) scruter la mémoire à la recherche de secteurs dont l'identifiant est le même que celui appliqué en entrée ; et C) délivrer en sortie le champ de données d'un secteur choisi par comparaison des champs de pertinence parmi les secteurs trouvés à l'étape B). Avantageusement, lorsque l'on trouve à l'étape B) une pluralité de secteurs dont l'identifiant est le même que celui appliqué en entrée, on efface ultérieurement ou concomitamment ces secteurs à l'exception de celui dont les données sont délivrées en sortie à l'étape C). Dans le cas où chaque secteur comprend également un champ de contrôle, lorsque l'on trouve à l'étape B) une pluralité de secteurs dont l'identifiant est le même que celui appliqué en entrée, on réitère l'écriture du secteur dont les données sont délivrées en sortie à l'étape C). On peut également ne retenir à l'étape C) que les secteurs intègres et effacer les secteurs non intègres. # D'autres caractéristiques et avantages ressortiront de la description ci-dessous d'un exemple de mise en oeuvre de l'invention. Exemple Dans cet exemple les données de la mémoire sont organisées en secteurs comportant chacun quatre champs: 1. données 2. identifiant (clé d'accès permettant de sélectionner un secteur); 3. pertinence : permet de déterminer le secteur pertinent si deux sec teurs ont le même identifiant; 4. contrôle : permet de vérifier l'intégrité des trois champs précédents (par exemple un contrôle de type parité). Un secteur sera désigné par son identifiant, notion qui se substitue à celle d'adresse. La procédure d'écriture d'un secteur a comme paramètre un identifiant et des données à associer à cet identifiant. La procédure de lecture d'un secteur a comme paramètre un identifiant, et retourne les données associées à cet identifiant lors de la dernière écriture effectuée avec ce même identifiant (ou une indication appropriée si cet identifiant n'a jamais été utilisé). En d'autres termes, on réalise un accès de type associatif au lieu d'un accès indexé. Lors de la procédure de lecture d'un secteur, la carte recherche les secteurs dont l'identifiant a la valeur demandée, et qui (sur la base du champ de contrôle) sont intègres. Au cas où plusieurs secteurs répondent à ces deux critères, elle en retient un sur la base du champ de pertinence. Lors d'une écriture de secteur, la carte écrit, dans un secteur disponible, les champs données et identifiant demandés, le champ pertinence tel que ce secteur sera, pour la procédure de lecture, le plus pertinent des secteurs intègres possédant cet identifiant, et le champ contrôle en accord avec les trois champs précédents (en d'autres termes, l'écriture est gérée de manière que la lecture ultérieure puisse être correctement opérée). Avantageusement, la procédure d'écriture se poursuit par l'efface- ment du secteur rendu non pertinent par l'écriture du nouveau secteur, créant ainsi un nouveau secteur disponible. On prévoit avantageusement un système (complémentaire) de type garbage collection, c'est-à-dire de récupération des secteurs inutiles, qu'ils soient non intègres ou non pertinents. On prévoit avantageusement un système qui répartit l'usure résultant de l'écriture en évitant d'utiliser toujours les mêmes secteurs, par exemple en choisissant aléatoirement un secteur parmi les secteurs disponibles. Une variante généralement avantageuse de la procédure de recherche de secteur consiste à profiter de cette étape de recherche pour effacer les secteurs dont il est déterminé qu'ils sont non intègres, et/ou ceux qui ne sont pas les plus pertinents, recréant ainsi des secteurs libres (cela perd du temps lors de cette lecture, en faveur de la vitesse des lectures et écritures ultérieures). Avantageusement, avant l'effacement d'un secteur dont on a déterminé qu'il est intègre mais non pertinent, on écrira à nouveau le secteur pertinent, dont l'écriture peut être imparfaite. La taille utile de la mémoire est égale au nombre de secteurs disponibles, moins un secteur qui doit rester effacé. Tous les secteurs (y compris celui effacé) sont répartis dynamiquement dans la mémoire. Si les données doivent être structurées en fichiers, par exemple selon la norme ISO/IEC 7816-4, l'identifiant de secteur se décompose en deux sous-champs, un identifiant de fichier et un identifiant du secteur dans ce fichier. On va donner ci-dessous une implémentation (non limitative) des opérations de lecture/écriture utilisant cette structuration particulière en secteurs: - Le champ de contrôle contient, codé en binaire, le nombre de bits à zéro dans les trois autres champs ; on montre que si un problème tel qu'une écriture ou un effacement interrompu modifie un nombre quelconque de bits du secteur tous dans le même sens, le contrôle de la valeur du champ de contrôle permet toujours la détection du problème. - Le champ pertinence est un entier de 0 à 3, codé sur 2 bits. - La procédure de lecture parcourt séquentiellement tous les secteurs jusqu'à trouver un premier secteur possédant l'identifiant re cherché, et intègre. Si cette recherche ne trouve aucun secteur, on termine la procédure avec un compte-rendu "secteur non trouvé". Si on trouve un tel premier secteur, on mémorise sa position, ses données, et sa pertinence p. La recherche se poursuit. Si l'on dé tecte un second secteur possédant l'identifiant recherché, et intè gre, on teste si sa pertinence q est le.reste de la division entière de p+1 par 3 ; si oui, on écrit à nouveau le second secteur, on efface le premier et on retourne les données du second ; sinon, on écrit à nouveau le premier secteur, on efface le second et on retourne les données du premier. Si un second secteur n'est pas trouvé et si la pertinence du premier secteur est p=3, on efface ce secteur et on donne le compte-rendu "secteur non trouvé" ; dans les autres cas, on retourne les données du premier secteur trouvé. - La procédure d'écriture commence comme la procédure de lecture ci-dessus. Si l'on a trouvé le secteur que retournerait la procédure de lecture pour l'identifiant fourni, on mémorise la position de ce secteur et sa pertinence p (qui vaut 0, 1 ou 2); si on ne l'a pas trou vé, on sélectionne un secteur libre (par la procédure ci-après) et on écrit dans ce secteur les champs identifiant, données, pertinence p=3 et contrôle, et l'on mémorise la position et la pertinence de ce secteur. Dans les deux cas, on poursuit en sélectionnant un secteur libre (par la procédure ci-après). On écrit dans ce secteur les champs identifiant, données, pertinence q (calculée comme le reste de la division entière de p+1 par 3) et contrôle. Puis on efface le secteur mémorisé. - Pour la recherche de secteur libre, on initialise à zéro le nombre n de secteurs libres trouvés. On examine séquentiellement les sec teurs. Pour chaque secteur, s'il est non vierge et non intègre, on l'efface et il devient vierge (contribuant ainsi à la garbage collec tion mentionnée plus haut) ; s'il est intègre et si sa pertinence est p=3, on l'efface (idem) ; s'il est intègre et si sa pertinence n'est pas p=3, alors on recherche dans la zone non encore parcourue un autre secteur intègre de même identifiant, et si l'on en trouve un on ef face celui qui n'est pas pertinent, en procédant comme pour la lec ture ; si à l'issue de ce processus le secteur est vierge, on incrémen te le nombre n de secteurs libres trouvés, et l'on effectue le tirage aléatoire d'un entier de 0 à n-1; si cet entier est 0, on mémorise la position du secteur vierge. Quand tous les secteurs ont été parcou rus, tous les secteurs non vierges sont intègres, il n'existe pas deux secteurs de même identifiant, on connaît le nombre n de secteurs vierges, et l'on a mémorisé l'un d'eux choisi aléatoirement de ma nière équiprobable. Si aucun secteur libre n'est trouvé, la procédure d'écriture est interrompue. Le procédé selon l'invention que l'on vient d'exposer présente, comme on peut le comprendre, de nombreux avantages: - en cas d'interruption du fonctionnement pendant une écriture ou un effacement, une lecture ultérieure restituera toujours fiable ment les données, soit les données avant l'écriture (dans le cas d'une interruption tôt dans le processus d'écriture), soit les données nouvellement écrites (dans le cas d'une interruption tardive en fin de processus d'écriture); - le nombre d'opérations qui modifient l'état de la mémoire non vo latile est minimisé (une écriture puis un effacement de secteur par utilisation de la procédure d'écriture, dans le cas le plus fréquent où il n'y a pas de traitement d'exception), d'où un gain de temps; - les modifications de secteurs qui provoquent une usure de la mé moire non volatile sont réparties ; dans le pire des cas (où tous les secteurs sont utilisés sauf un, et où l'écriture est répétée avec le même identifiant), la carte double l'endurance théorique par rap port à un processus de lecture connu; si l'on choisit judicieusement, par exemple au hasard, le secteur où l'on va écrire parmi N sec teurs effacés, l'usure est diminuée statistiquement d'un facteur de l'ordre de N+1. - ces avantages sont obtenus avec un surcoût très faible en espace mémoire; - on peut sans difficulté implémenter dans la carte une structure de fichiers et prévoir une allocation dynamique de la mémoire : lors que l'on crée des fichiers, il n'est en effet pas nécessaire de prédéfi nir et figer leur taille. REVENDICATIONS 1. Un procédé d'écriture du contenu de la mémoire non volatile d'une carte à microcircuit, caractérisé en ce que, cette mémoire étant organisée en secteurs comportant chacun: - un champ de données, conservant un contenu informatif, - un champ d'identifiant, formant clef d'accès au secteur, et - un champ de pertinence, formant sous-champ du champ d'iden tifiant pour discriminer parmi plusieurs secteurs de même iden tifiant celui dont le champ de données est à prendre en compte, l'écriture de données dans un secteur consiste à: a) appliquer en entrée les données à écrire et l'identifiant du secteur correspondant; b) scruter la mémoire à la recherche d'éventuels secteurs dont l'iden tifiant est le même que celui appliqué en entrée; c) scruter la mémoire à la recherche d'un secteur disponible ; et d) écrire dans ce secteur disponible : les données appliquées en en trée; l'identifiant appliqué en entrée ; et une valeur de pertinence plus grande que celle éventuellement trouvée à l'étape b). 2. Le procédé d'écriture de la revendication 1, dans lequel, si la recherche de l'étape b) est infructueuse, on prévoit préalablement à l'éta- pe d) l'inscription d'un témoin, et son effacement postérieurement à l'étape d), ce témoin indiquant une possible réalisation incomplète de l'étape d). 3. Le procédé d'écriture de l'une des revendications 1 ou 2, dans lequel, lorsque l'on trouve à l'étape b) un secteur dont l'identifiant est le même que celui appliqué en entrée, alors on l'efface à une étape consécutive à l'étape d). 4. Le procédé d'écriture de l'une des revendications 1 ou 2, dans lequel chaque secteur comprend également: - un champ de contrôle, contenant une information de vérification de l'intégrité conjointe des trois champs de données, d'identifi ant et de pertinence, et dans lequel, à l'étape b), on ignore les secteurs non intègres. 5. Le procédé d'écriture de la revendication 4, dans lequel on efface les secteurs non intègres. 6. Le procédé d'écriture de la revendication 1, dans lequel le choix de l'emplacement mémoire qui sera écrit est opéré de manière à répartir l'usure de la mémoire, notamment par choix aléatoire d'un secteur parmi ceux disponibles. 7. Un procédé de lecture du contenu de la mémoire non volatile d'une carte à microcircuit apte à faire l'objet d'une écriture par le procédé de l'une des revendications 1 à 6, caractérisé en ce que la lecture de données dans un secteur consiste à: A) appliquer en entrée l'identifiant du secteur à lire; B) scruter la mémoire à la recherche de secteurs dont l'identifiant est le même que celui appliqué en entrée ; et C) délivrer en sortie le champ de données d'un secteur choisi par com paraison des champs de pertinence parmi les secteurs trouvés à l'é tape B). 8. Le procédé de lecture de la revendication 7, dans lequel, lorsque l'on trouve à l'étape B) une pluralité de secteurs dont l'identifiant est le même que celui appliqué en entrée, on efface ultérieurement ou concomitamment ces secteurs à l'exception de celui dont les données sont délivrées en sortie à l'étape C). 9. Le procédé de lecture de l'une des revendications 7 et 8, dans lequel, lorsque l'on trouve à l'étape B) une pluralité de secteurs dont l'identifiant est le même que celui appliqué en entrée, on réitère l'écriture du secteur dont les données sont délivrées en sortie à l'étape C). 10. Le procédé de lecture de l'une des revendications 7 à 9 prises en dépendance de la revendication 4, dans lequel on ne retient à l'étape C) que les secteurs intègres. 11. Le procédé de lecture de la revendication 10, dans lequel on efface les secteurs non intègres.