FR 2879781 A1 20060623 FR 0413575 A 20041220 La présente invention se rapporte à un procédé de remplissage de sécurisation d'une mémoire, notamment dans une carte à microcircuit (aussi appelée carte à puce ), un dispositif mettant en oeuvre un tel procédé et une mémoire dans lequel le procédé est mis en oeuvre. Dans la suite de ce document, on entendra par mémoire toute mémoire, c'est-à-dire, une mémoire permanente, par exemple une mémoire ROM ou EEPROM ou un disque dur, ou une mémoire volatile, par exemple de type RAM. Par ailleurs, on entendra par sécurisation d'une mémoire tout traitement visant à se prémunir contre des attaques notamment par perturbation du fonctionnement d'une entité électronique, aussi appelées attaques par génération de fautes (en anglais "Fault Attack"). La présente invention vise, en particulier, à protéger une mémoire à la fois contre les attaques consistant à analyser la structure d'une mémoire, notamment dans une entité électronique sécurisée et contre des attaques destinées à modifier le déroulement de l'exécution d'un programme informatique s'exécutant sur une entité électronique sécurisée, (par exemple, une carte à microcircuit, une carte PCMCIA sécurisée (par exemple une carte IBM4758), une clef USB ou un passeport intégrant une puce avec une interface sans contact dans une de ses pages). Les attaques par génération de fautes visent à modifier illicitement le contenu ou la lecture du contenu d'un registre, d'une mémoire ou d'un bus, ou à obliger un processeur à ne pas, ou mal, exécuter certaines instructions d'un 2879781 2 programme informatique. Le programme informatique attaqué peut alors se dérouler d'une façon très différente de celle qui avait été prévue au moment de sa conception. Ces attaques peuvent, entre autres et de façon connue, être 5 effectuées: - en générant un pic de tension à l'une des bornes d'alimentation du processeur; - en élevant brusquement sa température; - en changeant rapidement sa fréquence d'horloge ou sa tension 10 d'alimentation; - en appliquant un flash de lumière, un rayon laser, ou un champ électromagnétique, sur une partie du silicium qui le compose. De telles attaques sont particulièrement actives sur certaines instructions d'un programme, notamment du fait des instructions de saut, ou de 15 la manipulation du compteur de programme. Selon l'état actuel de la technique, l'homme du métier dispose de différentes méthodes pour résister aux intrusions visant la détection de la structure d'une mémoire. Une méthode pour lutter contre les attaques consistant à analyser la structure d'une mémoire repose sur le remplissage de chaque octet libre de la mémoire en cause par un nombre aléatoire, lorsqu'on veut sécuriser, par exemple la mémoire ROM d'un microcontrôleur sécurisé. Cette mémoire stocke des programmes et des données associés aux programmes nécessaires au fonctionnement du microcontrôleur sécurisé. Ces programmes et données sont, principalement, le système d'exploitation de la carte à puce, des applications et des données propres au fonctionnement et au comportement de la carte à puce. Chaque microcontrôleur possède une mémoire ROM de taille fixe prédéterminée. Après que les applications, notamment le système d'exploitation et les données ont été mémorisées dans la mémoire ROM, un ou plusieurs espaces mémoires restent inoccupés, c'est-à-dire sont libres. Ces espaces 2879781 3 mémoires résiduels sont plus ou moins importants selon la taille de la mémoire ROM et celle des programmes et données stockés dans cette mémoire. La taille de la mémoire ROM peut être, par exemple, de 64 Ko, et les espaces mémoires résiduels peuvent être, par exemple, de taille 1 Ko, 4 Ko, 7 Ko ou 23 Ko. II est connu que le fait de remplir un espace mémoire résiduel par une donnée fixe peut aider un attaquant du microcontrôleur à analyser la structure de la mémoire ROM, ce qui peut contribuer à mettre en péril la sécurité de la carte à puce. C'est pourquoi, selon l'état de la technique, pour sécuriser une telle mémoire, on remplit chaque octet de l'espace mémoire résiduel par des données généralement aléatoires. Ces données aléatoires étant codées sur un octet, il s'agit de nombres compris entre 0 et 255. Cependant, il a été observé que cette méthode présente des 15 inconvénients importants en termes de sécurité et de fiabilité. En effet, en cas d'attaque par faute, ou plus généralement en cas d'erreur d'exécution suite à une perturbation, le déroulement de l'exécution d'un programme peut être perturbé de telle manière qu'à la suite de la perturbation, le microcontrôleur est amené à lire en un endroit imprévisible des données quelconques dans la mémoire ROM et à exécuter ces données. Cela provient du fait que les données codées sur un octet, utilisées pour remplir les espaces mémoires résiduels de la mémoire ROM, peuvent correspondre à des instructions. En effet, à une donnée est associée (ou correspond), en général, une instruction. Par exemple, selon l'assembleur 8051, la donnée 0x36 correspond à l'instruction de saut jmp . Suite à la perturbation d'un programme, lorsque l'exécution est amenée à se poursuivre au sein d'un espace mémoire correspondant à un espace mémoire résiduel rempli par des données aléatoires, la première donnée lue est considérée par le microcontrôleur comme une instruction. Donc, si la donnée aléatoire a la valeur 0x36, alors le microcontrôleur interprète cette donnée comme étant l'instruction jmp ; cette instruction étant normalement suivie de l'adresse de saut, les octets suivants (en général provenant 2879781 4 également du remplissage aléatoire) sont lus et interprétés comme étant l'adresse relative ou absolue du saut. En effet, après la lecture d'une donnée interprétée par le microcontrôleur comme étant une instruction, celui-ci détermine automatiquement, en fonction de l'instruction "lue", le nombre d'opérandes de l'instruction et donc le nombre d'octets à lire afin d'obtenir ses opérandes. L'exécution de cette donnée de remplissage interprétée comme une instruction de saut peut conduire à sauter dans un espace mémoire correspondant à une zone de remplissage par des données aléatoires, mais risque aussi de conduire à sauter dans la mémoire vers une adresse pouvant correspondre à un programme ou à des données sensibles pour la sécurité de la carte à puce. Ainsi cette méthode de remplissage d'espaces mémoires résiduels par des données aléatoires présente l'inconvénient suivant. Suite à une perturbation, le processeur peut être amené à lire des données quelconques de la mémoire, notamment des données aléatoires d'un espace mémoire résiduel, à les exécuter comme s'il s'agissait du déroulement de l'exécution et à revenir de manière non autorisée dans une zone sensible de l'application ou de la mémoire et donc mettre en péril la sécurité de la carte à puce. La présente invention vise une méthode de remplissage de sécurisation de mémoire ne présentant pas les inconvénients précédents. A cet effet, elle propose un procédé de remplissage de sécurisation d'au moins un espace mémoire résiduel d'une mémoire comprenant, en pratique, au moins un programme. Ce procédé est applicable notamment dans une carte à puce. Selon ce procédé, on effectue des cycles successifs selon lesquels on choisit au moins une donnée parmi un ensemble de données autorisées prédéterminé, l'ensemble de données autorisées excluant au moins une donnée correspondant à une instruction déterminée, et on insère ladite au moins une donnée choisie dans ledit au moins un espace mémoire résiduel de manière à remplir au moins une partie de cet espace mémoire résiduel. Le procédé selon l'invention permet donc de remplir des espaces mémoires résiduels d'une mémoire à partir de données appartenant à un 2879781 5 ensemble prédéterminé de données autorisées, cet ensemble excluant au moins une donnée correspondant à une instruction déterminée. En effet, les données correspondent généralement à des instructions et on peut souhaiter exclure certaines d'entre elles de tout espace mémoire résiduel. Cet ensemble de données autorisées exclut en pratique au moins une donnée dont l'instruction correspondante peut mettre en péril la sécurité du système si cette donnée est amenée à être exécutée. Les données insérées dans des espaces mémoires résiduels risquant d'être exécutées suite à une perturbation, en pratique du type attaque par fautes, on minimise ainsi le risque de mettre en péril la sécurité de la carte. Ce mode de réalisation permet également de résister à des attaques consistant à détecter et analyser la structure de la mémoire dès lors que le choix de la donnée de remplissage varie d'un cycle à l'autre. Selon une caractéristique préférée, les données de l'ensemble de données autorisées correspondent à des instructions sans effet dangereux sur le déroulement dudit au moins un programme. En d'autres termes, la présence de ces données ne met pas en péril la sécurité de la carte si ces données sont amenées, suite à une perturbation, à être exécutées. Selon une autre caractéristique préférée, ladite au moins une donnée exclue correspond à au moins une instruction de type instruction de saut car l'exécution d'une telle instruction risquerait d'avoir pour conséquence la poursuite de cette exécution dans le programme ou dans une zone sensible. Selon encore une autre caractéristique avantageuse, ladite au moins une donnée exclue correspond à au moins une instruction de type instruction d'utilisation de la pile d'exécution, en particulier une instruction de modification de la pile d'exécution. Selon encore une autre caractéristique préférée, au moins une donnée exclue correspond à au moins un opérande de type registres de configuration. Selon un mode de réalisation particulièrement avantageux, pour chaque espace mémoire élémentaire de l'espace mémoire résiduel, on détermine une donnée dans l'ensemble de données autorisées dont l'instruction 2879781 6 correspondante et ses opérandes sont codées sur au maximum n espaces mémoire élémentaires, n étant la taille de l'espace mémoire résiduel restant à remplir; on insère la donnée déterminée dans l'espace mémoire élémentaire considéré de l'espace mémoire résiduel; et on détermine la nouvelle taille n de l'espace mémoire résiduel restant à remplir. Selon ce mode de réalisation, on détermine et on insère une donnée élémentaire à la fois, indépendamment des données suivantes qui pourraient être interprétées comme des opérandes de l'instruction correspondant à cette donnée élémentaire. L'insertion de la donnée peut être réalisée au début de l'espace mémoire résiduel ce qui correspond à un remplissage séquentiel. En variante, le remplissage peut être un remplissage dans un ordre aléatoire ou en sens inverse, notamment. La détermination de la nouvelle taille de l'espace mémoire résiduel est, notamment, réalisée par la diminution de la taille de l'espace mémoire résiduel de la taille de la donnée insérée dans l'espace mémoire résiduel en cours de remplissage, c'est-à-dire d'une seule unité puisque la donnée est ici élémentaire. Ce procédé de remplissage permet, ainsi, de remplir un espace mémoire résiduel de telle manière que les données faisant suite à l'espace mémoire résiduel et appartenant à un programme ne risquent pas d'être considérées comme des opérandes d'une instruction associée à une donnée de remplissage lorsque les données de remplissage sont exécutées suite à une perturbation. En effet, le remplissage est réalisé de telle manière que lorsqu'une donnée est exécutée comme une instruction, ses opérandes sont contenus dans l'espace mémoire résiduel. Le programme ou les données suivant l'espace mémoire résiduel ne seront ainsi pas considérés comme des opérandes. Selon une caractéristique complémentaire avantageuse, le procédé comprend en outre l'insertion d'une instruction d'éjection vers un programme d'action et de l'adresse du programme d'action. 2879781 7 Selon cette caractéristique préférée, l'espace mémoire résiduel est rempli de telle sorte qu'il contient une instruction d'éjection vers un programme d'action en vue de traiter l'anomalie ayant conduit à l'espace mémoire résiduel. Ainsi le programme et les données faisant suite à l'espace mémoire résiduel ne seront pas exécutés, alors que l'anomalie sera traitée. Selon une autre caractéristique préférée additionnelle, l'insertion de cette instruction d'éjection est réalisée à la fin de l'espace mémoire résiduel. Selon encore une autre caractéristique préférée additionnelle, l'adresse du programme d'action est représentée par des données de l'ensemble de données autorisées. Selon cette caractéristique, si les données codant l'adresse du programme d'action sont exécutées comme des instructions, alors la sécurité de la carte à puce n'est pas mise en péril. Selon encore une caractéristique avantageuse, le procédé comprend, en complément ou non d'une instruction d'éjection, l'insertion d'un programme d'action; dans ce cas, l'espace mémoire résiduel comprend aussi le programme traitant l'anomalie. Selon encore une caractéristique avantageuse additionnelle, l'insertion du programme d'action est réalisée à la fin de l'espace mémoire résiduel. Selon encore une autre caractéristique préférée, le programme d'action comprend des instructions de contre mesure. Selon encore une autre caractéristique préférée, le choix de ladite au moins une donnée parmi l'ensemble de données autorisées est fait aléatoirement. En variante, il peut, par exemple, être fait cycliquement. Selon encore une autre caractéristique préférée, la mémoire est une mémoire permanente de type mémoire ROM. L'invention propose également un procédé d'exécution sécurisé de programmes, notamment dans une carte à puce, selon lequel on met en oeuvre un procédé de remplissage de sécurisation d'au moins un espace mémoire résiduel d'une mémoire, du type précité selon l'invention, préalablement à l'exécution desdits programmes. 2879781 8 Corrélativement, l'invention propose un dispositif de remplissage de sécurisation d'au moins un espace mémoire résiduel d'une mémoire comprenant au moins un programme, notamment dans une carte à puce; ce dispositif comprend une zone de stockage contenant un ensemble de données autorisées prédéterminé , ledit ensemble de données autorisées excluant au moins une donnée correspondant à une instruction déterminée; des moyens de choix d'au moins une donnée parmi l'ensemble de données autorisées prédéterminé ; et des moyens d'insertion de ladite au moins une donnée choisie dans ledit au moins un espace mémoire résiduel de manière à remplir au moins une partie dudit au moins un espace mémoire résiduel, et des moyens pour commander cycliquement les moyens de choix et les moyens d'insertion. Ce dispositif présente les mêmes avantages que le procédé de remplissage de sécurisation d'au moins un espace mémoire résiduel d'une mémoire. L'invention propose également une mémoire comprenant au moins un programme et au moins un espace mémoire résiduel rempli par le procédé de remplissage d'au moins un espace mémoire résiduel selon l'invention. En particulier, l'invention propose également une mémoire comprenant au moins un programme et au moins un espace mémoire résiduel rempli par des données choisies dans un ensemble de données autorisées excluant au moins une donnée correspondant à une instruction déterminée D'autres aspects et avantages de la présente invention apparaissent plus clairement à la lecture de la description de modes particuliers de réalisation qui suit, cette description étant donnée uniquement à titre d'exemple illustratif non limitatif, en regard des dessins annexés sur lesquels: - la figure 1 est un algorithme de remplissage d'un espace mémoire résiduel; - la figure 2 est une variante de l'algorithme de remplissage d'un tel espace mémoire résiduel de la figure 1; - la figure 3 est un exemple du résultat de remplissage d'un espace mémoire résiduel selon l'algorithme de la figure 2; 2879781 9 - la figure 4 est une autre variante de l'algorithme de remplissage d'un espace mémoire résiduel de la figure 1. Comme on le sait, un programme mémorisé au sein d'une mémoire est composé d'instructions et d'opérandes. A chaque instruction (en langage assembleur) est associée une donnée dont la taille est d'au moins un espace mémoire élémentaire, par exemple, un octet. Ces instructions peuvent avoir zéro, un, deux opérandes, voire plus. Ces opérandes sont généralement stockés après l'instruction. On suppose, dans la suite, à titre d'exemple, que chaque instruction est codée sur un octet et que les opérandes sont codés sur un ou deux octets, voire davantage. Mais l'invention se généralise aisément à des cas où les données occupent plus d'un octet. A l'exécution, le microcontrôleur analyse le premier octet afin de déterminer l'instruction à exécuter et déduire le nombre d'opérandes associés à cette instruction, puis lit ces opérandes. Ainsi, l'exécution d'une instruction nécessite la lecture d'un ou plusieurs octets dans un ordre donné. Un programme inséré est donc composé d'un ensemble d'instructions et d'opérandes codés respectivement sur une succession d'octets. De manière également connue, les programmes et éventuellement les données associées sont insérés dans une mémoire selon des règles d'ordonnancement telles qu'il y subsiste nécessairement un ou plusieurs espace(s) mémoire(s) inoccupé(s). Cette mémoire peut être une mémoire permanente, par exemple, une mémoire ROM, EEPROM, FLASH ou un disque dur, ou une mémoire volatile, 25 par exemple de type RAM. En vue de sécuriser une mémoire, notamment une mémoire ROM, par remplissage, les espaces mémoires inoccupés (aussi appelés espaces mémoires résiduels) de celle-ci sont remplis par des données qui, en régime normal, ne sont jamais lues. Cependant, tel que vu précédemment, parmi l'ensemble de données qu'il est possible de coder sur un espace mémoire élémentaire, on trouve en pratique un certain nombre de données qui ne sont pas inoffensives, c'est-à2879781 10 dire qu'elles correspondent à des instructions dont l'exécution, suite à une attaque, peut être dangereuse pour la sécurité et la fiabilité de la carte. A titre d'exemple, les données correspondant à des instructions de saut peuvent faire aboutir l'exécution perturbée en cours dans une zone de la mémoire de la carte contenant des données sensibles. Selon l'invention, l'ensemble de données possibles que l'on accepte de coder sur un espace mémoire élémentaire, par exemple un octet, sont préalablement triées. Ainsi, on détermine, d'une part, les données correspondant à des instructions qui peuvent être dangereuses pour la sécurité de la carte et, d'autre part, les données correspondant à des instructions sans effet dangereux sur le comportement des programmes dans la carte à puce et donc qui n'introduisent pas un risque quant à la sécurité de la carte à puce si elles venaient à être exécutées par accident. A l'issue de cette opération, on obtient donc un ensemble de données non autorisées car dangereuses pour la sécurité de la carte à puce lors de leur exécution et un ensemble de données autorisées. Le remplissage des espaces mémoires résiduels est réalisé en ne choisissant, par exemple aléatoirement, que des valeurs faisant partie de l'ensemble de données autorisées en excluant donc les données non autorisées. De manière alternative, les valeurs peuvent notamment être prises séquentiellement dans l'ensemble de données autorisées, dans un quelconque ordre prédéfini. Les instructions dangereuses pour la sécurité de la carte à puce comprennent notamment les instructions de saut telles que, par exemple, dans le langage assembleur 8051, les instructions de type jnz (qui peut être traduit par saut si le résultat de l'instruction précédente (résultat présent au sommet de la pile d'exécution) est non égal à 0 ), jz (que l'on peut traduire par saut si le résultat de l'instruction précédente (résultat présent au sommet de la pile d'exécution) est égal à 0 ), jmp (qui peut être traduit par saut ). 2879781 11 En effet, ces instructions risquent, en cas d'exécution intempestive, d'atteindre une partie du programme qui pourrait mettre en péril la sécurité du système. Ainsi, selon un mode de réalisation préféré, les données correspondant à ces instructions sont identifiées comme appartenant à l'ensemble de données non autorisées et non à l'ensemble de données autorisées. En outre, les instructions non autorisées peuvent comprendre les instructions manipulant la pile d'exécution. La pile d'exécution sert, notamment, à placer l'adresse de retour lors d'un appel de fonction, sauvegarder le contexte d'exécution lorsqu'une interruption doit être traitée, placer les variables locales, passer les arguments à une fonction. Selon le langage utilisé, les instructions manipulant la pile d'exécution sont l'appel de fonction (instruction call ), l'instruction de retour lors de la fin d'exécution d'une fonction (instruction ret ), les instructions mettant des valeurs ou retirant une valeur de la pile (instructions push et pop ). Les données correspondant à ces instructions sont notamment mises dans l'ensemble de données non autorisées, et donc ne sont avantageusement pas présentes dans l'ensemble de données autorisées. De plus, l'ensemble de données autorisées ne comprend avantageusement pas les données correspondant à des opérandes pouvant être dangereuses pour la sécurité et la fiabilité de la carte à puce. En effet, très souvent, les instructions ne sont pas dangereuses en tant que telles, mais elles le deviennent lorsqu'elles sont manipulées avec des 25 opérandes dits dangereux. Par exemple, l'instruction d'appel de fonction ( call ) est surtout une instruction dangereuse pour la sécurité de la carte à puce, lorsque l'opérande contenant l'adresse de la fonction pointe sur un programme ou sous-programme dangereux pour la sécurité de la carte à puce, c'est-à-dire pointe sur un programme qui ne doit être exécuté que de manière prévue, c'est-à-dire au bon moment. 2879781 12 De plus, l'ensemble de données autorisées ne comprend avantageusement pas l'ensemble des opérandes correspondant aux registres de configuration. Ces registres de configuration sont aussi appelés SFR (en terminologie anglaise Special Function Register ). II s'agit, par exemple, des registres de configuration de l'horloge, ou des registres de configuration de l'UART (en terminologie anglaise Universal Asynchronous Receiver / Transmitter ). De cette manière, l'ensemble de données autorisées ne comprenant pas les données correspondant aux registres de configuration, on interdit l'utilisation d'opérandes dangereuses associées à des instructions non dangereuses en soi. II en est de même concernant, par exemple, les instructions d'addition (instruction add ), d'incrémentation (instruction inc ) : elles ne sont pas dangereuses lorsqu'elles sont exécutées avec des opérandes non dangereux mais peuvent le devenir lors de leur exécution avec, notamment, des opérandes manipulant un registre de configuration. Ainsi, tel que précédemment mentionné, préalablement au remplissage d'un ou plusieurs espaces mémoires résiduels d'une mémoire, on détermine l'ensemble de données autorisées à être utilisées lors du remplissage des espaces mémoires résiduels. Selon une variante, il est possible de commencer par déterminer trois ensembles de données. Le premier ensemble comprend les données autorisées c'est-à-dire ne mettant nullement en péril la sécurité de la carte à puce (tel que décrit précédemment) ; cet ensemble est appelé ensemble de données autorisées. Un second ensemble comprend les données non autorisées, c'est-à-dire les données identifiées comme dangereuses (tel que décrit précédemment) ; cet ensemble est appelé ensemble de données non autorisées. Il s'agit, en effet, des données correspondant à des instructions ou à des opérandes dangereux pour la sécurité et la fiabilité de la carte à puce. Enfin, un troisième ensemble comprend les données dont la correspondance n'est pas définie dans la spécification du composant microcontrôleur de la carte à puce et qui peuvent, selon les cas, être dangereuses ou non. 2879781 13 Le troisième ensemble correspondant aux données non définies dans la spécification du composant peut ensuite être réparti entre les premier et second ensembles selon la spécification du composant. Notamment, si l'utilisation des données du troisième ensemble déclenche une action sécuritaire sur le composant, alors cet ensemble peut être associé à l'ensemble de données autorisées. Il est maintenant décrit un premier mode de réalisation du remplissage d'un espace mémoire résiduel. Cette mise en oeuvre est basée sur un microcontrôleur dont les données correspondant aux instructions sont codées sur un octet et les opérandes sur un ou deux octets. En référence à la figure 1, il est présenté un algorithme de remplissage d'un espace mémoire résiduel dont la taille est de n octets. L'algorithme débute à l'étape E11 par l'initialisation de la variable n et de la liste I, la variable n étant initialisée à la taille de l'espace mémoire résiduel et représente la taille de l'espace mémoire résiduel restant à remplir, et la liste I contenant l'ensemble de données autorisées. L'étape E11 est suivie de l'étape E12 dans laquelle on teste si la taille de l'espace mémoire résiduel restant à remplir est supérieure à zéro, c'est-à-dire s'il reste un espace mémoire résiduel à remplir. Dans la négative, il est mis fin à l'algorithme par l'étape E16. Dans le cas contraire, c'est-à-dire l'espace mémoire résiduel n'a pas été complètement rempli, l'étape E12 est suivie de l'étape E13. A l'étape E13, on prend dans l'ensemble de données autorisées, par exemple aléatoirement, une donnée v dont l'instruction correspondante (si elle venait à être exécutée par un microcontrôleur) serait codée avec ses opérandes sur au maximum n octets. Selon une variante, on prend la première donnée de la liste I telle que l'instruction correspondante et ses opérandes sont codées sur au maximum n octets. Ensuite, l'étape E14 consiste à insérer la donnée v dans l'espace mémoire résiduel, de préférence à la première place libre. 2879781 14 L'étape E14 est suivie de l'étape E15 qui consiste à décrémenter la taille de l'espace mémoire résiduel restant à remplir n de la taille de la donnée v. En effet, la taille de l'espace mémoire résiduel restant à remplir est diminuée par l'insertion de cette donnée. Cette diminution est ici d'une unité puisque les données sont ici codées sur un seul octet. L'étape E15 est suivie d'un retour à l'étape E12, précédemment décrite. Les étapes E12 à E15 sont ainsi itérées afin de remplir l'espace mémoire résiduel. Selon une variante de réalisation, l'insertion de la donnée v à l'étape E14 est réalisée dans un emplacement mémoire défini aléatoirement dansl'espace mémoire résiduel. Si cet emplacement a déjà été rempli, alors l'insertion est réalisée, par exemple, au premier emplacement libre suivant. La figure 2 illustre une variante de réalisation de l'algorithme de la figure 1 selon laquelle le remplissage de l'espace mémoire résiduel se termine par l'insertion d'une instruction d'éjection vers un programme d'action en vue de traiter l'anomalie. Si l'instruction d'éjection est codée sur un octet et l'adresse absolue du programme d'action sur deux octets, alors, l'algorithme de remplissage s'exécute de manière similaire à l'algorithme de la figure 1 sur l'espace mémoire résiduel de taille n - 3 octets puis insère l'instruction d'éjection et l'adresse du programme d'action sur les trois derniers octets de l'espace mémoire résiduel. En variante, cette insertion peut se faire en premier. En effet, selon cette variante, le remplissage de l'espace mémoire résiduel est réalisé selon l'algorithme de la figure 1 tant que l'espace mémoire résiduel restant à remplir est supérieur à un seuil donné qui est, dans l'exemple ici considéré la taille cumulée de l'instruction d'éjection et du codage de l'adresse du programme d'action. Selon une autre variante, le seuil peut être supérieur à la taille cumulée de l'instruction d'éjection et du codage de l'adresse du programme d'action. 2879781 15 Ainsi, l'algorithme selon cette variante est le suivant. L'algorithme de remplissage de la figure 2 débute à l'étape E21 similaire à l'étape E11 de la figure 1 au cours de laquelle une variable n est initialisée à la valeur de la taille de l'espace mémoire résiduel et représente la taille de l'espace mémoire résiduel restant à remplir et une liste I est initialisée à l'ensemble de données autorisées. L'étape E21 est suivie de l'étape E22 dans laquelle on teste si l'espace mémoire résiduel restant à remplir est de taille supérieure au seuil donné, c'est-à-dire à trois octets selon l'exemple, trois octets étant la taille cumulée de l'instruction d'éjection et de l'adresse du programme d'action. Dans l'affirmative, l'étape E22 est suivie de l'étape E23. Dans le cas contraire, c'est-à-dire lorsque la taille de l'espace mémoire résiduel restant à remplir est inférieure ou égale au seuil donné, c'est-à-dire trois octets, l'étape E22 est suivie de l'étape E26 décrite ci-après. Au cours de l'étape E23, on prend, notamment aléatoirement, une donnée v dans l'ensemble I des données autorisées dont l'instruction correspondante, si elle venait à être exécutée par le microcontrôleur approprié, serait codée avec et ses opérandes sur au maximum n - 3 octets. Selon une variante, on prend la première donnée de la liste I telle que l'instruction correspondante et ses opérandes sont codées sur au maximum n-3 octets. L'étape E23 est ensuite suivie de l'étape E24 consistant à insérer la donnée v dans l'espace mémoire résiduel, de préférence, à la première place libre. L'étape E24 est suivie de l'étape E25 qui consiste à décrémenter la valeur n de la taille de l'espace mémoire résiduel restant à remplir de la taille de la donnée v. En effet, la taille de l'espace mémoire résiduel restant à remplir est diminuée par l'insertion de cette donnée. Les étapes E22 à E25 sont alors itérées tant que la taille de l'espace mémoire résiduel restant à remplir est supérieure à trois octets. 2879781 16 Lorsque, à l'étape E22, le test est négatif, c'est-à- dire que la taille de l'espace mémoire résiduel restant à remplir est inférieure ou égale au seuil donné, c'est-à-dire trois octets, alors l'étape E22 est suivie de l'étape E26. L'étape E26 consiste à insérer dans l'espace mémoire résiduel restant à remplir une instruction d'éjection vers un programme d'action et l'adresse du programme d'action. L'instruction d'éjection est, par exemple, une instruction de type instruction de saut, par exemple l'instruction jmp ou l'instruction Ijmp , ou une instruction de type instruction d'appel de sous programme qui a comme argument l'adresse du programme d'action, par exemple, l'instruction "call". L'instruction d'éjection est suivie de deux octets indiquant l'adresse du programme d'action. L'espace mémoire résiduel étant rempli, l'algorithme se termine ensuite à l'étape E27. Selon cet algorithme, l'espace mémoire résiduel est rempli jusqu'à ce que la taille de l'espace mémoire résiduel restant à remplir soit égale à trois octets. Ainsi, cet espace mémoire est rempli de manière à laisser subsister les trois derniers octets de l'espace mémoire résiduel pour une insertion prédéfinie. En d'autres termes, on commence le remplissage en simulant l'absence des trois derniers octets de l'espace mémoire résiduel, avant de remplir ceux-ci d'une manière prédéfinie. Ce mode de réalisation permet d'éviter que les octets de l'instruction d'éjection et l'adresse de l'instruction d'éjection soient considérés comme des opérandes d'instructions précédentes si celles-ci sont exécutées suite à une perturbation. D'autre part, on s'assure également que, en cas de perturbation conduisant dans l'espace mémoire résiduel considéré, l'instruction d'éjection est exécutée. Ainsi, en cas de perturbation, lorsque l'exécution du programme aboutit au sein de l'espace mémoire non occupé par les programmes et 2879781 17 données de la carte, l'exécution des instructions de cet espace mémoire est déroutée vers un programme d'action. Afin d'augmenter la sécurité de la carte à puce, l'adresse de l'instruction d'éjection est avantageusement formée d'une ou plusieurs données choisies parmi l'ensemble de données autorisées. Si l'adresse est codée sur deux octets, alors chacun de ces octets correspond à une donnée de l'ensemble de données autorisées. Dans un mode de réalisation préféré, les données de l'adresse sont choisies dans l'ensemble de données non définies dans la spécification du composant microcontrôleur de la carte à puce si l'utilisation de ces données déclenche une action sécuritaire sur le composant. Pour cela, lors de la compilation, on indique en paramètres de compilation, l'adresse dans la mémoire où doit être positionné le programme d'action. De manière avantageuse, le programme d'action est composé d'au moins une instruction visant à exécuter une contre mesure ou plus généralement un lot sécuritaire. Par exemple, il peut s'agir d'un programme de destruction de la carte, l'exécution d'une boucle infinie ou la réinitialisation du programme. Selon une variante de réalisation particulière, l'insertion de la donnée v à l'étape E24 est réalisée dans un emplacement mémoire défini aléatoirement dans l'espace mémoire résiduel. Si cet emplacement a déjà été rempli, alors l'insertion est réalisée, par exemple, au premier emplacement libre suivant. Selon une autre variante, l'étape E26 consistant à insérer l'instruction d'éjection vers un programme d'action et l'adresse du programme d'action peut être réalisée au début de l'algorithme. La figure 3 illustre un exemple de résultat du remplissage d'un espace mémoire résiduel de taille 8 octets réalisé selon la variante de réalisation du remplissage de la figure 2. 2879781 18 Ainsi les trois derniers octets ont été réservés en vue de contenir l'instruction d'éjection et l'adresse du programme d'action, soit l'instruction call traitement anomalie . Cet espace peut être analysé a posteriori comme suit. Le premier octet a été rempli avec la donnée 0x65 correspondant à l'instruction d'ajout add appartenant à la liste des instructions autorisées. Cette instruction a été codée, selon l'exemple, sur un seul octet, donc sur une taille inférieure à n-3 octets (8 - 3 = 5 octets). La donnée insérée au second emplacement est une donnée correspondant à une instruction qui est normalement codée, avec ses opérandes, sur au maximum la taille de l'espace mémoire résiduel à remplir diminué de 3 octets, soit 4 octets. En effet, la donnée choisie est OxD2, correspondant à l'instruction mov . Cette instruction et ses opérandes sont normalement codés sur 3 octets, soit une taille inférieure à 4 octets. La donnée suivante est une donnée dont l'instruction correspondante et ses opérandes sont codées sur au maximum 3 octets (la taille de l'espace mémoire résiduel restant à remplir étant ici de 6 octets diminuée de 3 octets pour l'insertion de l'instruction d'éjection). La donnée ici choisie est 0x56 correspondant à l'instruction inc . Or cette instruction nécessite un seul octet pour son exécution. La donnée suivante est une donnée dont l'instruction correspondante et ses opérandes sont codées sur au maximum 2 octets. En effet, la taille de l'espace résiduel restant à remplir est de 5 octets diminuée de 3 octets pour l'insertion de l'instruction d'éjection. La donnée choisie est 0x89 correspondant à l'instruction add . Cette instruction nécessite un seul octet pour son exécution. Enfin, la donnée suivante est une donnée dont l'instruction correspondante et ses opérandes sont codées sur au maximum un octet. En effet, la taille de l'espace résiduel restant à remplir est de 4 octets diminuée de 3 octets pour l'insertion de l'instruction d'éjection. La donnée choisie est 0x56 correspondant à l'instruction inc . Cette instruction nécessite un seul octet pour son exécution. 2879781 19 L'espace mémoire résiduel restant à remplir est de taille 3 octets. C'est là qu'est insérée l'instruction d'éjection. L'instruction d'éjection call traitement anomalie est codée de la manière suivante. La donnée 0x16 correspond à l'instruction call c'est-à-dire à l'appel de fonction, et les données 0x65 0x56 représentent l'adresse du programme d'action appelé traitement anomalie . Les octets de l'adresse du programme d'action traitement anomalie correspondent à des données (0x65 et 0x56) appartenant à l'ensemble de données autorisées. La figure 4 illustre une seconde variante de réalisation du remplissage d'un espace mémoire résiduel de taille n octets, selon laquelle l'espace mémoire résiduel est rempli de manière à contenir le corps du programme d'action, ici à la fin de l'espace mémoire résiduel. Ainsi, selon cette variante de réalisation, l'algorithme de la figure 1 est appliqué sur l'espace mémoire résiduel diminué de la taille du programme 15 d'action. En effet, le remplissage est réalisé tant que l'espace mémoire résiduel restant à remplir est supérieur à un seuil donné, ce seuil étant ici, de la taille du programme d'action. Selon une autre variante, le seuil peut être supérieur à la taille du 20 programme d'action. L'algorithme selon cette variante est le suivant. L'algorithme débute à l'étape E31 similaire à l'étape E11 de la figure 1. Cette étape initialise la variable n à la taille de l'espace mémoire résiduel et représente la taille de l'espace mémoire résiduel restant à remplir, la liste I avec l'ensemble de données autorisées et la variable p à la taille du programme d'action. L'étape E31 est suivie de l'étape E32 dans laquelle on teste si la taille de l'espace mémoire résiduel restant à remplir est supérieure au seuil donné, 30 c'est-à-dire à la taille du programme d'action p. Dans la négative, l'algorithme se poursuit à l'étape E36 décrit ci- après. 2879781 20 Dans le cas contraire, c'est-à-dire lorsque la taille de l'espace mémoire résiduel restant à remplir est de taille supérieure au seuil donné, c'est-à-dire à la taille du programme d'action, l'étape E32 est suivie de l'étape E33. L'étape E33 prend aléatoirement une donnée v dans l'ensemble de données dont l'instruction correspondante, si elle était exécutée par le microcontrôleur approprié, et ses opérandes sont codés sur au maximum n p octets, c'est-à-dire la taille de l'espace mémoire résiduel restant à remplir diminuée de la taille du programme d'action. L'étape E33 est suivie de l'étape E34 consistant à insérer la donnée v dans l'espace mémoire résiduel respectivement à la première place libre. L'étape E34 est ensuite suivie de l'étape E35 qui consiste à décrémenter la taille de l'espace mémoire résiduel restant à remplir n d'une unité. En effet, la taille de l'espace mémoire résiduel restant à remplir est diminuée par l'insertion de cette donnée, dont la taille est d'un octet. L'étape E35 est suivie de l'étape E32 précédemment décrite. Les étapes E32 à E35 sont ainsi itérées jusqu'à remplir l'espace mémoire résiduel de taille n - p. A l'étape E32, lorsque la taille de l'espace mémoire résiduel est égale au seuil donné, c'est-à-dire à la taille du programme d'action dans cet exemple, alors l'étape E32 est suivie de l'étape E36 consistant à insérer dans l'espace mémoire résiduel restant à remplir le programme d'action. Ensuite, il est mis fin à l'algorithme à l'étape E37. Selon un mode de réalisation particulier, l'insertion de la donnée v à l'étape E24 est réalisée dans un emplacement mémoire défini aléatoirement dans l'espace mémoire résiduel. Si cet emplacement a déjà été rempli, alors l'insertion est réalisée, par exemple, au premier emplacement libre suivant. Selon une autre variante, l'étape E36 consistant à insérer le programme d'action peut être réalisée au début de l'algorithme. Selon d'autres variantes de mode de réalisation, les espaces mémoires résiduels peuvent être remplis par des données correspondant à des instructions, tels que l'instruction et ses opérandes sont codés sur un seul 2879781 21 espace mémoire élémentaire. Ces données peuvent être choisies par exemple, aléatoirement ou séquentiellement dans la liste des données autorisées. Il est à noter que les programmes et les données associées sont insérés dans une mémoire selon des règles d'ordonnancement et il subsiste très souvent un espace mémoire résiduel à la fin de cette mémoire, cette mémoire étant soit une mémoire permanente, par exemple, une mémoire ROM, EEPROM, FLASH ou un disque dur, soit une mémoire volatile, par exemple de type RAM. Ainsi, les modes de réalisation du procédé de remplissage sont 10 particulièrement adaptés au remplissage de l'espace mémoire résiduel présent à la fin de la mémoire. La figure 5 représente un dispositif qui possède l'ensemble des moyens nécessaires à la mise en oeuvre du procédé de l'invention pour le remplissage de sécurisation d'au moins un espace mémoire résiduel d'une mémoire. Ce dispositif est, par exemple, implanté dans un micro-ordinateur et est destiné au remplissage d'un espace mémoire résiduel d'une mémoire, notamment d'une mémoire contenue dans une carte à puce. Selon le mode de réalisation choisi, ce dispositif peut être, par exemple, un micro-ordinateur 500, comportant une zone de stockage contenant l'ensemble des données autorisées prédéterminé 501; à chacune des données y est associée une information de taille de codage. Cette taille indique le nombre d'espaces mémoires élémentaires sur lequel l'instruction correspondant à la donnée et ses opérandes sont codées si cette donnée est exécutée par un microcontrôleur. Le micro-ordinateur comporte également des moyens de choix 502 qui sont aptes à choisir au moins une donnée parmi l'ensemble de données autorisées stocké. Selon une variante, les moyens de choix 502 sont aptes à déterminer 30 une donnée dans l'ensemble de données autorisées dont l'instruction correspondante et ses opérandes sont codées sur au maximum n espaces 2879781 22 mémoires élémentaires, n étant la taille de l'espace mémoire résiduel restant à remplir. Pour cela, l'information de taille associée à une donnée est utilisée. Le micro-ordinateur comporte aussi des moyens d'insertion 503 de la donnée choisie de manière à remplir au moins une partie de l'espace mémoire résiduel 504 d'une mémoire qui a été préalablement connectée, par exemple temporairement, au dispositif 500. De plus, le dispositif 500 comporte des moyens 505 pour commander cycliquement les moyens de choix 501 et les moyens d'insertion 502. Bien entendu, la présente invention n'est nullement limitée aux modes de réalisation décrits et représentés; elle est par exemple également applicable au remplissage de sécurisation d'au moins un espace mémoire résiduel d'une mémoire comprenant au moins un programme écrit en Java Card et compilé en bytecode interprétable par une machine virtuelle Java Card. 23 REVENDICATIONS 1. Procédé de remplissage de sécurisation d'au moins un espace mémoire résiduel d'une mémoire comprenant au moins un programme, notamment dans une carte à puce, caractérisé en ce qu'on effectue des cycles successifs selon lesquels - on choisit (E13, E23, E33) au moins une donnée parmi un ensemble de données autorisées prédéterminé, ledit ensemble de données autorisées excluant au moins une donnée correspondant à une instruction déterminée, - on insère (E14, E24, E34) ladite au moins une donnée choisie dans ledit au moins un espace mémoire résiduel de manière à remplir au moins une partie de cet espace mémoire résiduel. 2. Procédé selon la revendication 1, dans lequel les données de l'ensemble de données autorisées correspondent à des instructions sans effet dangereux sur le déroulement dudit au moins un programme. 3. Procédé selon la revendication 1 ou la revendication 2, dans lequel ladite au moins une donnée exclue correspond à au moins une 20 instruction de type instruction de saut. 4. Procédé selon l'une quelconque des revendications précédentes, dans lequel ladite au moins une donnée exclue correspond à au moins une instruction de type instruction d'utilisation de la pile d'exécution. 5. Procédé selon l'une quelconque des revendications précédentes, dans lequel ladite au moins une donnée exclue correspond à au moins un opérande de type registres de configuration. 6. Procédé selon l'une quelconque des revendications précédentes, dans lequel, pour chaque espace mémoire élémentaire de l'espace mémoire résiduel: 2879781 24 - on détermine une donnée dans l'ensemble de données autorisées dont l'instruction correspondante et ses opérandes sont codées sur au maximum n espaces mémoire élémentaires, n étant la taille de l'espace mémoire résiduel restant à remplir; - on insère la donnée déterminée dans l'espace mémoire élémentaire considéré de l'espace mémoire résiduel; - on détermine la nouvelle taille n de l'espace mémoire résiduel restant à remplir. 7. Procédé selon l'une quelconque des revendications précédentes, comportant en outre l'insertion d'une instruction d'éjection vers un programme d'action et de l'adresse du programme d'action. 8. Procédé selon la revendication 7, dans lequel l'insertion d'une instruction d'éjection est réalisée à la fin de l'espace mémoire résiduel. 9. Procédé selon la revendication 8, dans lequel l'adresse du programme d'action est représentée par des données de l'ensemble de données autorisées. 10. Procédé selon l'une quelconque des revendications 1 à 6, comportant en outre l'insertion d'un programme d'action. 11. Procédé selon la revendication 10, dans lequel l'insertion du 25 programme d'action est réalisée à la fin de l'espace mémoire résiduel. 12. Procédé selon l'une quelconque des revendications 7 à 11, dans lequel le programme d'action comprend des instructions de contre mesure. 13. Procédé selon l'une quelconque des revendications précédentes, selon lequel le choix de ladite au moins une donnée parmi l'ensemble de données autorisées est fait aléatoirement. 2879781 25 14. Procédé selon l'une quelconque des revendications précédentes, dans lequel la mémoire est une mémoire permanente de type mémoire ROM. 15. Mémoire comprenant au moins un programme, des données associées audit au moins un programme et au moins un espace mémoire résiduel rempli par le procédé de remplissage de sécurisation selon l'une quelconque des revendications 1 à 14. 16. Procédé d'exécution sécurisé de programmes, notamment dans une carte à puce, caractérisé en ce que, préalablement à l'exécution desdits programmes, on met en oeuvre un procédé de remplissage de sécurisation d'au moins un espace mémoire résiduel d'une mémoire, conforme à l'une quelconque des revendications 1 à 14. 17. Dispositif de remplissage de sécurisation d'au moins un espace mémoire résiduel d'une mémoire comprenant au moins un programme, notamment dans une carte à puce, caractérisé en ce que le dispositif comprend: - une zone de stockage (501) contenant un ensemble de données autorisées prédéterminé, ledit ensemble de données autorisées excluant au moins une donnée correspondant à une instruction déterminée, - des moyens (502) de choix d'au moins une donnée parmi 25 l'ensemble de données autorisées, des moyens (503) d'insertion de ladite au moins une donnée choisie dans ledit au moins un espace mémoire résiduel de manière à remplir au moins une partie dudit au moins un espace mémoire résiduel, - des moyens (505) pour commander cycliquement les moyens de 30 choix et les moyens d'insertion. 2879781 26 18. Dispositif selon la revendication 17, dans lequel les données de l'ensemble de données autorisées correspondent à des instructions sans effet dangereux sur le déroulement dudit au moins un programme. 19. Dispositif selon la revendication 17 ou la revendication 18, dans lequel, à chaque donnée de l'ensemble de données autorisées prédéterminé est associée une information de taille de l'instruction correspondant à la donnée avec ses opérandes. 20. Dispositif selon l'une quelconque des revendications 17 à 19, dans lequel ladite au moins une donnée exclue correspond à au moins une instruction de type instruction de saut. 21. Dispositif selon l'une quelconque des revendications 17 à 20, 15 dans lequel ladite au moins une donnée exclue correspond à au moins une instruction de type instruction d'utilisation de la pile d'exécution. 22. Dispositif selon l'une quelconque des revendications 17 à 21, dans lequel ladite au moins une donnée exclue correspond à au moins un opérande de type registres de configuration. 23. Dispositif selon l'une quelconque des revendications 17 à 22, dans lequel pour chaque espace mémoire élémentaire de l'espace mémoire résiduel: - les moyens de choix sont aptes à déterminer une donnée dans l'ensemble de données autorisées dont l'instruction correspondante et ses opérandes sont codées sur au maximum n espaces mémoire élémentaires, n étant la taille de l'espace mémoire résiduel restant à remplir; - les moyens d'insertion sont aptes à insérer la donnée 30 déterminée dans l'espace mémoire élémentaire considéré de l'espace mémoire résiduel; 2879781 27 - les moyens de commande sont aptes à déterminer la nouvelle taille n de l'espace mémoire résiduel restant à remplir. 24. Dispositif selon l'une quelconque des revendications 17 à 23, dans lequel les moyens d'insertion sont aptes, en outre, à insérer une instruction d'éjection vers un programme d'action et l'adresse du programme d'action. 25. Dispositif selon la revendication 24, dans lequel les moyens d'insertion d'une instruction d'éjection sont aptes à insérer l'instruction d'éjection à la fin de l'espace mémoire résiduel. 26. Dispositif selon la revendication 24, dans lequel l'adresse du programme d'action est représentée par des données de l'ensemble de données autorisées. 27. Dispositif selon l'une quelconque des revendications 17 à 23, dans lequel les moyens d'insertion sont, en outre, aptes à insérer un programme d'action. 28. Dispositif selon la revendication 27, dans lequel les moyens d'insertion sont aptes à insérer le programme d'action à la fin de l'espace mémoire résiduel. 29. Dispositif selon l'une quelconque des revendications 24 à 28, dans lequel le programme d'action comprend des instructions de contre mesure. 30. Dispositif selon l'une quelconque des revendications 21 à 35, selon lequel les moyens de choix d'au moins une donnée parmi l'ensemble de données autorisées sont aptes à choisir ladite au moins une donnée aléatoirement. 2879781 28 31. Dispositif selon l'une quelconque des revendications 17 à 31, dans lequel la mémoire est une mémoire permanente de type mémoire ROM. 32. Mémoire comprenant au moins un programme et au moins un espace mémoire résiduel rempli par des données choisies dans un ensemble de données autorisées excluant au moins une donnée correspondant à une instruction déterminée. 33. Mémoire selon la revendication 32, dans lequel les données de l'ensemble de données autorisées correspondent à des instructions sans effet dangereux sur le déroulement dudit au moins un programme. 34. Mémoire selon la revendication 32 ou 33, dans lequel ladite au moins une donnée exclue correspond à au moins une instruction de type instruction de saut. 35. Mémoire selon l'une quelconque des revendications 32 à 34, dans lequel ladite au moins une donnée exclue correspond à au moins une instruction de type instruction d'utilisation de la pile d'exécution. 36. Mémoire selon l'une quelconque des revendications 32 à 35, dans lequel ladite au moins une donnée exclue correspond à au moins un opérande de type registres de configuration. 37. Mémoire selon l'une quelconque des revendications 32 à 36, dans lequel pour chaque espace mémoire élémentaire de l'espace mémoire résiduel, la donnée choisie est déterminée dans l'ensemble de données autorisées de telle manière que l'instruction correspondante et ses opérandes sont codées sur au maximum n espace mémoire élémentaire, n étant la taille de l'espace mémoire résiduel restant à remplir, y compris cette donnée. 2879781 29 38. Mémoire selon l'une quelconque des revendications 32 à 37, dans lequel une donnée parmi les données choisies est une instruction d'éjection vers un programme d'action, la donnée étant suivie de l'adresse du programme d'action. 39. Mémoire selon la revendication 38, dans lequel l'instruction d'éjection est à la fin de l'espace mémoire résiduel. 40. Mémoire selon la revendication 38, dans lequel l'adresse du 10 programme d'action est représentée par des données de l'ensemble de données autorisées. 41. Mémoire selon l'une quelconque des revendications 32 à 37, dans lequel l'espace mémoire résiduel comprend un programme d'action. 42. Mémoire selon la revendication 41, dans lequel le programme d'action est à la fin de l'espace mémoire résiduel.