Brevet FR3094107A1 — publié le 20200925

Description Titre de l'invention : PROCÉDÉ D'EXÉCUTION D'UN CODE BINAIRE D'UNE FONCTION SÉCURISÉE PAR UN MICRO- PROCESSEUR [pool j L'invention concerne un procédé d'exécution d'un code binaire d'une fonction sécurisée par un microprocesseur. L'invention concerne également : - un code binaire d'une fonction sécurisée, un support d'enregistrement d'informations et un microprocesseur pour la mise en oeuvre de ce procédé d'exécution, et - un compilateur pour générer ce code binaire. [0002] Pour obtenir des informations sur un code binaire ou provoquer un fonctionnement inattendu du code binaire, de nombreuses attaques sont possibles. Par exemple, des attaques connues sous le terme d'« injection de fautes » ou « fault attack » en anglais peuvent être mises en oeuvre. Ces attaques consistent à perturber le fonctionnement du microprocesseur ou de la mémoire contenant le code binaire, par divers moyens physiques comme des modifications des tensions d'alimentation, des modifications du signal d'horloge, l'exposition du microprocesseur à des ondes électromagnétiques et autres. [0003] À l'aide de telles attaques, un attaquant peut altérer l'intégrité des instructions machines ou des données pour, par exemple, retrouver une clé secrète d'un système cryptographique, contourner des mécanismes de sécurité tels que la vérification d'un code PIN lors d'une authentification ou simplement empêcher l'exécution d'une fonction essentielle pour la sécurité d'un système critique. [0004] Ces attaques peuvent provoquer notamment trois types de fautes, dites fautes d'exécution, lors de l'exécution du code binaire : 1) une altération des instructions du code machine exécuté, 2) une altération des données stockées dans la mémoire piincipale ou dans des registres du microprocesseur, et 3) une altération du flot de contrôle du code machine. [0005] Le flot de contrôle correspond au chemin d'exécution suivi lors de l'exécution du code machine. Le flot de contrôle est classiquement représenté sous la forme d'un graphe connu sous le terme de graphe de flot de contrôle ou « control flow graph » en anglais. [0006] Le code binaire d'une fonction peut être instrumenté pour permettre la détection et le signalement des fautes d'exécution. Lorsque le code binaire d'une fonction est. ainsi instrumenté, ce code binaire est qualifié de « code binaire d'une fonction sécurisée ». En effet, contrairement au code binaire d'une fonction non-sécurisée, ce code binaire est 2 apte à permettre le signalement de fautes d'exécution typiquement rencontrées en cas d'attaques. [0007] A cc sujet, de l'état de la technique est connu de W02012/010205A1 et US2017214523A1. Cet état de la technique décrit des solutions pour sécuriser le code binaire contre des attaques qui provoquent un détournement du flot d'exécution. [0008] Les solutions connues fonctionnent correctement dans le cas d'un code binaire statique, c'est-à-dire d'un code binaire comportant uniquement des instructions de branchement direct. En effet, dans ce cas, on connaît, au moment de la génération du code binaire, le ou les fonctions qui seront appelées et donc la façon de les déchiffrées. [0009] Toutefois, il existe aussi des codes binaires dynamiques, c'est-à-dire des codes binaires comportant des instructions de branchement indirect utilisées, par exemple, pour déclencher l'exécution d'une fonction externe sécurisée. A titre d'illustration, la fonction externe sécurisée peut être une fonction d'une bibliothèque pré-enregistrée de fonctions sécurisées. L'emplacement où est enregistrée une telle bibliothèque n'est pas connue au moment de la génération du code binaire dynamique. Dans ce cas, il faut donc nécessairement utiliser des instructions de branchement indirect pour appeler les fonctions de la bibliothèque au moment de l'exécution du code binaire. En effet, l'instruction de branchement indirect permet d'obtenir l'adresse de branchement à partir du contenu d'un registre de destination du microprocesseur. [0010] Le contenu du registre de destination n'est pas connu au moment de la compilation du code binaire dynamique. De plus, le code binaire de la fonction externe sécurisée a généralement été compilé indépendamment du code binaire dynamique. Les vecteurs d'initialisations nécessaires aux déchiffrements des blocs de base de la fonction externe sécurisée ne sont donc pas non plus connus au moment de la compilation du code binaire dynamique. [0011] Ainsi, les solutions proposées dans W02012/010205A1 et US2017214523A1 ne peuvent pas être appliquées à de tels codes binaires dynamiques. [0012] L'objectif ici est de proposer un procédé d'exécution d'un code binaire d'une fonction sécurisée qui offre au moins simultanément les deux possibilités suivantes : - fonctionner avec des codes binaires dynamiques, et - sécuriser le code binaire contre les attaques qui provoquent un détournement du flot d'exécution. [0013] L'invention a donc pour objet un tel procédé d'exécution d'un code binaire (l'une fonction sécurisée par un microprocesseur, ce procédé comportant les étapes suivantes : a) la fourniture du code binaire, le code binaire fourni comportant un code machine contenant une succession de blocs de base dans lequel : - chaque bloc de base comporte une succession de lignes d'instructions chiffrées 3 contenant chacune le cryptogramme d'une instruction, les instructions chiffrées dans ces lignes d'instructions successives étant destinées à être exécutées par le microprocesseur systématiquement dans l'ordre de ces lignes d'instructions, - chaque bloc de base débute à une adresse de branchement et se termine par une ligne d'instruction contenant le cryptogramme d'une instruction de branchement vers une adresse de branchement d'un autre bloc de base, cet autre bloc de base étant appelé « le bloc de base suivant » et le bloc de base qui se termine par la ligne d'instruction contenant le cryptogramme de cette instruction de branchement vers ce bloc de base suivant étant appelé « le bloc de base précédent », - le cryptogramme contenu dans chaque ligne d'instruction chiffrée d'un bloc de base ayant été obtenu à l'aide d'un même vecteur d' initialisation différent des vecteurs d'initialisation utilisés pour obtenir les cryptogrammes de lignes d'instructions chiffrées des autres blocs de base, - chaque bloc de base précédent contient une ligne d'instruction contenant le cryptogramme d'une instruction de chargement qui, lorsqu'elle est exécutée par le microprocesseur, provoque le chargement, dans le microprocesseur, du vecteur d'initialisation à utiliser pour déchiffrer le cryptogramme de chaque ligne d'instruction chiffrée du bloc de base suivant, h) l'exécution du code binaire par le microprocesseur,lors de cette exécution le procédé comporte les opérations suivantes : - l'exécution d'un bloc de base précédent, cette exécution du bloc de base précédent comportant le déchiffrement et l'exécution de l'instruction de chargement contenu dans ce bloc de base précédent, puis le déchiffrement et l'exécution de l'instruction de branchement, puis - l'exécution du bloc de base suivant, cette exécution du bloc de base suivant comportant le déchiffrement du cryptogramme de chaque ligne d'instruction chiffrée du bloc de base suivant à l'aide du vecteur d'initialisation chargé dans le microprocesseur lors de l'exécution du bloc de base précédent, dans lequel : - lors de l'étape a), le code machine fourni comporte au moins un premier bloc de base précédent dans lequel : - l'instruction de branchement est une instruction de branchement indirect, c'est-à-dire une instruction de branchement contenant un opérande qui identifie un registre de destination et qui, lorsqu'elle est exécutée par le microprocesseur, provoque un branchement directement vers la première ligne d'instruction chiffrée d'un bloc de base suivant dont l'adresse est obtenue à partir du contenu de ce registre de destination, - l'instruction de chargement est une instruction de chargement indirect, c'est-à-dire une instruction de chargement contenant un opérande qui identifie le même registre de destination que celui identifié par l'opérande de l'instruction de branchement indirect et qui, lorsqu'elle est exécutée par le microprocesseur, provoque : - la lecture d'une ligne de donnée associée à l'adresse obtenue à partir du contenu du registre de destination, puis - la construction d'un vecteur d'initialisation à partir du contenu de cette ligne de donnée, puis - le chargement de ce vecteur d'initialisation construit dans le microprocesseur, - l'étape b) comporte en plus : l'exécution de l'instruction de chargement indirect du premier bloc de base précédent, puis l'exécution de l'instruction de branchement indirect du premier bloc de base précédent. [0014] Les modes de réalisation de cc procédé d'exécution peuvent comporter une ou plusieurs des caractéristiques suivantes : lors de l'étape a), dans le code machine fourni, ladite ligne de donnée est la première ligne de chaque bloc de base suivant le premier bloc de base précédent, cette ligne de donnée, contrairement à une ligne d'instruction, ne codant aucun opcode d'une instruction exécutable par le microprocesseur; lors de l'étape b), la construction du vecteur d'initialisation à partir du contenu de la ligne de donnée, comporte le déchiffrement d'un cryptogramme ivisbi* contenu dans cette ligne de donnée pour obtenir une première valeur, puis l'utilisation de cette première valeur pour construire le vecteur d'initialisation: lors de l'étape b), la construction du vecteur d'initialisation à partir du contenu de la ligne de donnée comporte : - la construction d'une seconde valeur à partir de l'adresse @i de la ligne de donnée, puis, - le déchiffrement du cryptogramme à l'aide de cette seconde valeur construite à partir de l'adresse @i; - lors de l'étape a), la ligne de donnée est fournie et comporte en plus un code détecteur d'erreur (ECC,i) permettant de détecter une erreur dans la première valeur obtenue après déchiffrement du cryptogramme ivisbi*, puis - lors de l'étape b), la construction du vecteur d'initialisation à partir du contenu de la ligne de donnée, comporte en plus les opérations suivantes : - la vérification, à l'aide du code détecteur d'erreur contenu dans cette ligne de donnée, s'il existe une erreur dans la première valeur obtenue après déchiffrement du cryptogramme ivisbi*, et - lorsqu'une telle erreur existe, le déclenchement d'un signalement d'une faute d'exécution et, en alternance, lorsqu'une telle erreur n'existe pas, l'inhibition de ce si- gnalemcnt d'une faute d'exécution; - - lors de l'étape a), chaque ligne d'instruction chiffrée fournie contient : - un cryptogramme d'une concaténation : - de ladite instruction, et - d'un premier code détecteur d'erreur permettant de détecter une erreur dans l'instruction avec laquelle il est concaténé, et - lors de l'étape b), à chaque fois que le microprocesseur charge une ligne d'instruction, le procédé comporte les opérations suivantes : - le déchiffrement du cryptogramme pour obtenir une instruction déchiffrée et le premier code détecteur d'erreur déchiffré, puis - la vérification, à l'aide du premier code détecteur d'erreur déchiffré, s'il existe une erreur dans cette instruction déchiffrée, et, dans le cas où une telle erreur est détectée dans cette instruction déchiffrée, le déclenchement du signalement d'un faute d'exécution, et, dans le cas où aucune erreur n'a été détectée dans cette instruction déchiffrée, le microprocesseur décode l'instruction déchiffrée et la transmet à l'unité arithmétique et logique qui l'exécute; - lors de l'étape a), chaque ligne d'instruction contient en plus un code d'authentification de message permettant de vérifier l'intégrité et l'authenticité du cryptogramme contenu dans la même ligne, et - lors de l'étape b), à chaque fois que le microprocesseur charge une ligne d'instruction, le procédé comporte les opérations suivantes : - la construction d'une étiquette à partir du cryptogramme contenu dans la ligne de code chargée, puis - le chiffrement de l'étiquette construite à l'aide d'une clé secrète enregistrée dans une mémoire non volatile d'un module matériel de sécurisation, puis - la comparaison de l'étiquette chiffrée au code d'authentification de message contenu dans la ligne d'instruction chargée, puis - lorsque l'étiquette chiffrée n'est pas identique au code d'authentification de message contenu dans la ligne d'instruction chargée, le déclenchement du signalement d'un faute d'exécution, et, dans le cas contraire, le microprocesseur décode l'instruction déchiffrée et la transmet à l'unité arithmétique et logique qui l'exécute; le contenu du registre de destination est inconnu au moment où le code binaire est généré par un compilateur. [0015] L'invention a également pour objet un code binaire d'une fonction sécurisée exécutable par un microprocesseur pour la mise en oeuvre du procédé revendiqué, dans lequel le code binaire comprend un code machine contenant une succession de blocs de base et dans lequel : - chaque bloc de base comporte une succession de lignes d'instructions chiffrées 6 contenant chacune le cryptogramme d'une instruction, les instructions chiffrées dans ces lignes d'instructions successives étant destinées à être exécutées par le microprocesseur systématiquement dans l'ordre de ces lignes d'instructions, - chaque bloc de base débute à une adresse de branchement et se termine par une ligne d'instruction contenant le cryptogramme d'une instruction de branchement vers une adresse de branchement d'un autre bloc de base, cet autre bloc de base étant appelé « le bloc de base suivant » et le bloc de base qui se termine par la ligne d'instruction contenant le cryptogramme de cette instruction de branchement vers ce bloc de base suivant étant appelé « le bloc de base précédent », - le cryptogramme contenu dans chaque ligne d'instruction chiffrée d'un bloc de base ayant été obtenu à l'aide d'un même vecteur d' initialisation différent des vecteurs d'initialisation utilisés pour obtenir les cryptogrammes de lignes d'instructions chiffrées des autres blocs de base, - chaque bloc de base précédent contient une ligne d'instruction contenant le cryptogramme d'une instruction de chargement qui, lorsqu'elle est exécutée par le microprocesseur, provoque le chargement, dans le microprocesseur, du vecteur d'initialisation à utiliser pour déchiffrer le cryptogramme de chaque ligne d'instruction chiffrée du bloc de base suivant, dans lequel le code machine comporte au moins un premier bloc de base précédent dans lequel : - l'instruction de branchement est une instruction de branchement indirect, c'est-à-dire une instruction de branchement contenant un opérande qui identifie un registre de destination et qui, lorsqu'elle est exécutée par le microprocesseur, provoque un branchement directement vers la première ligne d'instruction chiffrée d'un bloc de base suivant dont l'adresse est obtenue à partir du contenu de ce registre de destination, - l'instruction de chargement est une instruction de chargement indirect, c'est-à-dire une instruction de chargement contenant un opérande qui identifie le même registre de destination que celui identifié par l'opérande de l'instruction de branchement indirect et qui, lorsqu'elle est exécutée par le microprocesseur, provoque : - la lecture d'une ligne de donnée associée à l'adresse obtenue à partir du contenu du registre de destination, puis - la construction d'un vecteur d'initialisation à partir du contenu de cette ligne de donnée, puis - le chargement de ce vecteur d'initialisation construit dans le microprocesseur. [0016] L'invention a également pour objet un support d'enregistrement d'informations lisible par un microprocesseur, ce support d'enregistrement d'informations contenant le code binaire revendiqué. [0017] L'invention a également pour objet un microprocesseur pour la mise en oeuvre du 7 procédé revendiqué, ce microprocesseur comportant une unité arithmétique et logique et un module matériel de sécurisation, dans lequel le module matériel dc sécurisation est configure pour construire le vecteur d'initialisation à partir du contenu de la ligne de donnée associée à l'adresse obtenue à partir du contenu du registre de destination. [0018] Enfin, l'invention a également pour objet un compilateur apte à transformer automa- tiquement un code source d'une fonction sécurisée en un code binaire tel que revendiqué. [0019] L'invention sera mieux comprise à la lecture de la description qui va suivre, donnée uniquement à titre d'exemple non limitatif et faite en se référant aux dessins sur lesquels : - la figure 1 est une illustration schématique de l'architecture d'un appareil électronique apte à exécuter un code binaire d'une fonction sécurisée ; - la figure 2 est une illustration schématique de la structure d'une ligne d'instruction codant une instruction du code binaire exécuté par l'appareil de la figure 1, - les figures 3 à 5 sont des illustrations schématiques de différentes portions du code binaire de la fonction sécurisée susceptible d'être exécutée par l'appareil de la figure 1 ; - la figure 6 est une illustration schématique de différents registres de l'appareil électronique, utilisés lors de l'exécution de la fonction sécurisée, - la figure 7 est un organigramme d'un procédé d'exécution du code binaire de la fonction sécurisée ; - la figure 8 est une illustration schématique de la structure d'une ligne de donnée du code binaire exécuté par l'appareil de la figure 1, - la figure 9 est un organigramme d'un détail d'une étape du procédé de la figure 7 mise en oeuvre pour sécuriser les données enregistrées dans une pile d 'exécution de l'appareil de la figure 1; - la figure 10 est illustrations schématiques de différentes portions du code binaire de la fonction sécurisée susceptible d'être exécutée par l'appareil de la figure 1; - la figure 11 est un organigramme d'un détail d'une étape du procédé de la figure 6 mise en oeuvre pour rendre plus difficile les attaques par dépassement de tampon, - la figure 12 est une illustration schématique d'une pile d'exécution de l'appareil de la figure 1, - la figure 13 est une illustration schématique d'un compilateur apte à générer le code binaire exécuté par l'appareil de la figure 1. [0020] Chapitre I: Conventions, notations et définitions : [0021] Dans les figures, les mêmes références sont utilisées pour désigner les mêmes éléments. Dans la suite de cette description, les caractéristiques et fonctions bien connues de l'homme du métier ne sont pas décrites en détails. [0022] Dans cette description, les définitions suivantes sont adoptées. 8 [0023] Un « programme » désigne un ensemble d'une ou de plusieurs fonctions prédé- terminées que l'on souhaite faire exécuter par un microprocesseur. [0024] Un « code source » est une représentation du programme dans un langage in- formatique, n'étant pas directement exécutable par un microprocesseur et étant destiné à âtre transformé par un compilateur en un code machine directement exécutable par le microprocesseur. [0025] Un programme ou un code est dit être « directement exécutable » lorsqu'il est apte à être exécuté par un microprocesseur sans que ce microprocesseur n'ait besoin au préalable de le compiler au moyen d'un compilateur ou de l'interpréter au moyen d'un interpréteur. [0026] Une « instruction » désigne une instruction machine exécutable par un micro- processeur. Une telle instruction est constituée : - d'un opcodc, ou code d'opération, codant la nature de l'opération à exécuter, et -d'un ou plusieurs opérandes définissant la ou les valeurs des paramètres de cette opération. [0027] Un « code machine » est un ensemble d'instructions machines. Il s'agit typiquement d'un fichier contenant une succession de bits portant la valeur «O » ou « 1 », ces bits codant les instructions à exécuter par le microprocesseur. Le code machine est directement exécutable par le microprocesseur, c'est-à-dire sans nécessiter une compilation ou une interprétation préalable. [0028] Un « code binaire » est un fichier contenant une succession de bits ponant la valeur « 0 » ou « 1 ». Ces bits codent des données et des instructions à exécuter par le microprocesseur. Ainsi, le code binaire comprend au moins un code machine et en plus, généralement, des données numériques traitées par ce code machine. [0029] Un « flot d'instructions » est une succession d'instructions classées les unes après les autres et qui forme, dans le code machine, une suite ordonnée de bits. Le flot d'instructions débute par une instruction initiale et se termine par une instruction finale. Par rapport à une instruction donnée du flot d'instructions, les instructions situées du côté de l'instruction initiale sont appelées « instructions précédentes » et les instructions situées du côté de l'instruction finale, sont appelées « instructions suivantes ». Dans ce texte, ce flot d'instructions en mémoire est découpé en une succession de blocs de base immédiatement consécutifs ou séparés par des blocs de données. [0030] Dans ce texte, un « bloc de base » est un groupe d'instructions successives du flot d'instructions qui débute à une adresse de branchement et qui se termine par une seule instruction de branchement explicite ou implicite. Une instruction de branchement explicite se caractérise par la présence explicite d'un opcode dans le code machine qui code l'instruction de branchement. Une instruction de branchement implicite correspond au cas où l'exécution d'un bloc de base précédent se poursuit systéma- 9 tiquement par l'exécution d'un bloc de base suivant situé, dans le code machine, immédiatement après le bloc de base précédent. Dans ce cas, étant donné qu'en absence d'instruction de branchement explicite, les instructions du code machine sont exécutées dans l'ordre les unes après les autres, il n'est pas nécessaire d'introduire à la fin du bloc de base précédent une instruction de branchement explicite vers le bloc de base suivant. Dans cette description, on dit que dans cc cas, le bloc de base précédent se termine par une instruction de branchement implicite car elle n'est pas explicitement codée dans le code machine. Dans ce cas, le bloc de base précédent se termine juste avant l'adresse de branchement du bloc de base suivant. Dans cette demande, l'expression « instruction de branchement » désigne une instruction de branchement explicite à défaut de mention contraire. Ainsi, l'exécution d'un bloc de base débute systématiquement par l'exécution de sa première instruction et se termine systématiquement par l'exécution de l'instruction de branchement qui termine cc bloc de base. Un bloc de base ne comporte pas d'autres instructions de branchement que celle située à la fin de ce bloc de base. Ainsi, les instructions d'un bloc de base sont systématiquement toutes lues par le microprocesseur les unes après les autres dans l'ordre où elles sont présentes dans ce bloc de base. L'instruction de branchement peut diriger, lorsqu'elle est exécutée, le flot de contrôle systématiquement vers la même adresse de branchement ou, en alternance, vers différentes adresses de branchement. Cc dernier cas de figure se rencontre, par exemple, lorsqu'à la fin du bloc de base exécuté, le flot de contrôle peut se poursuivre vers un premier et, en alternance, vers un deuxième bloc de base. [0031] Une « instruction de branchement » est une instruction qui, lorsqu'elle est exécutée par le microprocesseur, déclenche un saut vers l'adresse de branchement d'un autre bloc de base. Typiquement, à cet effet, cette instruction remplace la valeur actuelle du compteur ordinal par la valeur de l'adresse de branchement. On rappelle que le compteur ordinal contient l'adresse de la prochaine instruction à exécuter par le microprocesseur. En absence d'instruction de branchement, à chaque fois qu'une instruction est exécutée, le compteur ordinal est incrémenté de la taille de l'instruction actuellement exécutée. En absence d'instruction de branchement, les instructions sont systématiquement exécutées séquentiellement les unes après les autres dans l'ordre où elles sont enregistrées dans une mémoire principale. L'instruction de branchement peut être inconditionnelle, c'est à dire que le saut vers l'adresse de branchement est systématiquement réalisé dès que cette instruction est exécutée. Une instruction de branchement inconditionnel est par exemple l'instruction « JAL » dans le jeu d'instructions "RISC V". L'instruction de branchement peut aussi être conditionnelle, c'est-à-dire que le saut vers l'adresse de branchement est déclenché lors de son exécution uniquement si une condition particulière est vérifiée. Par exemple, une ins- truction de branchement conditionnel est une instruction « BRANCH » dans le jeu d'instructions "RISC-V" . L'instruction de branchement peut aussi bien être un appel à une fonction. Dans ce texte, à défaut d'indication contraire, le terme « instruction de branchement » désigne aussi bien les instructions de branchement direct qu'indirect. Une instruction de branchement direct est une instruction de branchement qui contient directement la valeur numérique de l'adresse de branchement. Une instruction de branchement indirect, est une instruction de branchement vers une adresse de branchement contenue dans une mémoire ou un registre du microprocesseur. Ainsi, contrairement à une instruction de branchement direct, une instruction de branchement indirect ne contient pas directement la valeur numérique de l'adresse de branchement. Par exemple, une instruction de branchement indirect est l'instruction "JALR" du jeu d'instructions RISC-V. [0032] Une « adresse de branchement » est l'adresse dans la mémoire principale à laquelle se trouve la première ligne d'instruction d'un bloc de base. Par la suite, on parle d'adresse de branchement même pour les blocs de base dont la première instruction est exécutée suite à l'exécution d'une instruction de branchement implicite. [0033] On parle d'exécution d'une fonction pour désigner l'exécution des instructions réalisant cette fonction. [0034] Dans un souci de simplification, dans cette description et dans les figures, les ins- tructions ne sont pas représentées sous forme binaire, mais plutôt sous une forme symbolique exprimée dans un langage évolué de plus haut niveau. [0035] Chapitre II: Architecture de l'appareil : [0036] La figure 1 représente un appareil électronique 1 comportant un microprocesseur 2, une mémoire principale 4 et un support 6 de stockage de masse. Par exemple, l'appareil 1 est un ordinateur, un smartphone, une tablette électronique ou similaire. [0037] Le microprocesseur 2 comporte ici : - une unité arithmétique et logique 10; - un ensemble 12 de registres ; - un module de commande 14; - une interface 16 d'entrée/sortie de données, - un chargeur 18 d'instructions comportant un compteur ordinal 26. - une file 22 d'instructions à exécuter, et - un module matériel 28 de sécurisation. [0038] La mémoire 4 est configurée pour stocker des instructions et des données d'un code binaire 30 d'un programme devant être exécuté par le microprocesseur 2. La mémoire 4 est une mémoire à accès aléatoire. Typiquement, la mémoire 4 est une mémoire volatile. La mémoire 4 peut être une mémoire externe au microprocesseur 2 comme représenté sur la figure 1. Dans ce cas, la mémoire 4 est réalisée sur un substrat méca- 11 niquemcnt séparé du substrat sur lequel sont réalisés les différents éléments du microprocesseur 2 comme l'unité 10. [0039] Ici, la mémoire 4 est divisée en mots-machines successifs de longueur fixe. Chaque mot-machine peut être transféré en un seul cycle d'horloge depuis la mémoire 4 jusque dans un registre du microprocesseur. A cet effet, la taille NMM d'un mot-machine est égale au nombre maximum de bits qui peuvent être transférés simultanément de la mémoire 4 vers un registre de l'ensemble 12. Ici, la taille 1\11 est strictement supérieure Nli bits, où Ni, bits est le nombre de bits des instructions du jeu d'instructions du microprocesseur 2. Typiquement, Ni'' est un entier supérieure ou égale à 8, 16, 32 ou 64. Dans cet exemple, Ras, est égal à 32 et la taille INImm est égale à 128 bits. [0040] Classiquement, la mémoire 4 est principalement divisées en trois partie : - une première partie 42 contenant les instructions à exécuter, - une deuxième partie 44 contenant les données à traiter, et - une troisième partie 46 utilisée pour sauvegarder le contexte d'exécution d'une fonction lorsqu'elle appelle une autre fonction. La partie 46 est connue sous le terme de "pile d'exécution" ou "call stack" en anglais. Par conséquent, par la suite la partie 46 est également appelée "pile 46". [0041] Le code binaire 30 comporte notamment un code machine 32 d'une fonction sécurisée et un bloc 34 de données nécessaires à l'exécution du code binaire 30. Le code machine 32 et le bloc 34 sont enregistrés dans, respectivement, les parties 42 et 44. [0042] Chaque fonction sécurisée correspond à un ensemble de plusieurs lignes de code, par exemple plusieurs centaines ou milliers de lignes de code, enregistrées à des adresses successives dans la mémoire 4. Ici, chaque ligne de code correspond à un mot-machine. Ainsi, une ligne de code est chargée dans un registre du microprocesseur 2 en une seule opération de lecture. De même, une ligne de code est écrite dans la mémoire 4 par le microprocesseur 2 en une seule opération d'écriture. Chaque ligne de code correspond à une seule instruction ou à une seule donnée. Par la suite, lorsque la ligne de code contient une instruction, elle est appelée "ligne d'instruction". Lorsque la ligne de code contient une donnée, elle est appelée "ligne de donnée". Les structures d'une ligne d'instruction et d'une ligne de donnée sont décrites en détail en référence aux figures 2 et 8. [0043] Le bloc 34 est typiquement situé dans une plage d'adresses prédéterminée au début du code binaire 30. Ainsi, l'exécution du code binaire 30 débute par le chargement et le traitement des données du bloc 34. Ici, le bloc 34 comporte notamment : - un cryptogramme ka* obtenu en chiffrant une clé ka à l'aide d'une clé publique pk cpu du microprocesseur 2, et 12 - des cryptogramme iv''bi*, ivnisbd*, ive,ed*, h/pile*, ivcite, chiffrés à l'aide de la clé publique pkc,,,, de différentes valeurs destinées à initialiser le contenu de différents registres du microprocesseur 2 afin de permettre le déchiffrement du code binaire 30. [0044] A titre d'illustration, le microprocesseur 2 est conforme à l'architecture RISC (« Reduced Instructions Set Computer ») et il met en oeuvre le jeu d'instructions "RISCV". [0045] TeL l'unité 10 est une unité arithmétique et logique de Txli bits. [0046] Le chargeur 18 charge dans la file 22 la prochaine instruction à exécuter par l'unité 10 à partir de la partie 42 de la mémoire 4. Plus précisément, le chargeur 18 charge l'instruction sur laquelle pointe le compteur ordinal 26. [0047] L'unité 10 est notamment configurée pour exécuter les unes après les autres les ins- tructions chargées dans la file 22. Les instructions chargées dans la file 22 sont généralement systématiquement exécutées dans l'ordre où ces instructions ont été enregistrées dans cette file 22. L'unité 10 est aussi capable d'enregistrer le résultat de ces instructions exécutées dans un ou plusieurs des registres de l'ensemble 12. [0048] Dans cette description, on utilisera comme synonymes « exécution par le micro- processeur 2» et « exécution par l'unité 10». [0049] Le module 14 est configure pour déplacer des données entre l'ensemble 12 de registres et l'interface 16. L'interface 16 est notamment apte à acquérir des données et des instructions, par exemple, depuis la mémoire 4 et/ou le support 6 extérieurs au microprocesseur 2. [0050] Le module 28 est capable d'exécuter automatiquement les différentes opérations décrites en détails dans les chapitres suivants pour sécuriser l'exécution des fonctions sécurisées. Le module 28 fonctionne indépendamment et sans utiliser l'unité 10 Ainsi, il est capable de traiter les lignes de code avant et/ou après que celles-ci soient traitées par l'unité 10. A cet effet, il comporte notamment une mémoire non-volatile sécurisée 29. Aucun accès à cette mémoire 29 sans passer par l'intermédiaire du module 28 n'est prévu. Dans ce mode de réalisation, le module 28 est pré-programmé, par exemple lors de sa conception, pour exécuter des opérations telles que les opérations suivantes : - vérifier l'intégrité et l'authenticité d'une donnée à partir d'un code d'authentification de message plus connu sous l'acronyme MAC (« Message Authentification Code »), - construire un code d'authentification de message, - chiffrer une donnée pour obtenir un cryptogramme, - déchiffrer un cryptogramme pour obtenir une donnée en claire, - exécuter une fonction préprogrammée [0051] La mémoire 29 est utilisée pour stocker les informations secrètes nécessaires à la mise en oeuvre du procédé de la figure 6. Ici, elle comporte donc notamment des in- 13 formations secrètes pré-enregistrées avant le début de l'exécution du code binaire 30. En particulier, elle comporte les informations pré-enregistrées suivantes : - une clé secrète k' utilisée pour la vérification des codes d'authentification de message, - un clé privée secrète skc,,,, qui permet de déchiffrer les données qui ont été chiffrées à l'aide de la clé publique pkc,,,. [0052] Dans cet exemple de réalisation, l'ensemble 12 comporte des registres généraux uti- lisables pour stocker tout type de données. La taille de chacun de ces registres est, par exemple, égale à Nmm. [0053] Un bus d'échange de données 24 qui relie les différents composants du micro- processeur 2 entre eux est représenté sur la figure 1 pour indiquer que les différents composants du microprocesseur peuvent échanger des données entre eux. [0054] Le support 6 est typiquement une mémoire non volatile. Par exemple, il s'agit d'une mémoire du type EEPROM ou Flash. Il contient ici une copie 40 de sauvegarde du code binaire 30. Typiquement, c'est cette copie 40 qui est automatiquement recopiée dans la mémoire 4 pour restaurer le code 30, par exemple, après une coupure de courant ou similaire ou juste avant que débute l'exécution du code 30. [0055] CHAPITRE HI: SÉCURISATION DU CODE MACHINE: [0056] Ici, la structure du code machine de la fonction sécurisée est décrite dans le cas par- ticulier du code machine 32. Toutefois, ce qui est décrit dans ce cas particulier se transpose sans difficulté à tout code machine d'une fonction sécurisée. [0057] Le code machine 32 comporte une succession de lignes d'instruction LI; enregistrées les unes après les autres dans la mémoire 4. Par la suite, dans ce chapitre, l'indice j est utilisé pour identifier la ligne d'instruction LI; parmi les autres lignes d'instruction du code machine 32. De plus, l'indice j est aussi utilisé comme un numéro d'ordre indiquant dans quel ordre les lignes LI; sont classées. Ainsi, on note ET+, la ligne d'instruction située immédiatement après la ligne LT. Chaque ligne d'instruction LI; code une instruction du jeu d'instructions du microprocesseur 2 apte à être exécutée après avoir été déchiffrée et décodée par l'unité 10 de ce microprocesseur. [0058] Les structures de toutes les lignes LI; sont identiques. Cette structure est représentée en détail sur la figure 2 dans le cas particulier de la ligne LT. [0059] La ligne LI; comporte un cryptogramme un code MACi, et un code ECC,,i. [0060] Le cryptogramme CT* est obtenu en chiffrant une concaténation CI; à l'aide de la clé secrète ka et d'un vecteur d'initialisation iv. Plus précisément, le cryptogramme OC est obtenu à l'aide de la relation suivante : CT* = fka(CT ; ivk), où fka est une fonction de chiffrement correspondant à une fonction de déchiffrement fka-I préprogrammée dans le module 28. Typiquement, la fonction fka est une fonction de chiffrement symétrique. Dès lors, la clé ka permettant de déchiffrer le cryptogramme CL" est préenregistrée dans la mémoire 29 afin de permettre au module 28 de déchiffrer ce cryptogramme CL 14 *. Le vecteur d' initialisation ivk est construit comme décrit plus loin dans ce chapitre. [0061] La concaténation CT est ici la concaténation d'une instruction T à exécuter par le mi- croprocesseur 2 et d'un code ECC,J. Le code ECC,, permet de détecter une erreur dans l'instruction I, et, éventuellement, de corriger cette erreur. Par exemple, le code ECC,' peut être le code connu sous l'acronyme BCH (Bose, Ray-Chaudhuri, Hocquenghem) qui présente l'avantage d'être particulièrement facile à mettre en oeuvre. Toutefois, tout autre code détecteur ou correcteur d'erreur connu peut être mis en oeuvre. La taille du code ECC,, est supérieure ou égale à 1 ou 2 ou 3 bits et, généralement, inférieure à La taille du code ECC,, est déterminée en fonction de la robustesse souhaitée. Plus on veut être capable de corriger un nombre de bits erronés important dans l'instruction 1, plus la taille du code ECC,, sera grande. [0062] Le code MAC; est un code permettant de vérifier l'intégrité et l'authenticité du cryp- togramme Cl. Ce code est communément appelé « code d'authentification de message » et connu sous l'acronyme MAC (« Message Authentification Code »). Un tel code MAC; est obtenu en construisant une étiquette à partir du cryptogramme Cl qui comporte normalement moins de bits que le cryptogramme CI;*. Cette étiquette est construite à l'aide d'une fonction prédéterminée et de la clé secrète k' connue seulement de l'auteur du code binaire 30 et du microprocesseur 2. Ici, la clé k' est préenregistrée dans la mémoire 29. Par exemple, la fonction prédéterminée est une fonction de hachage. Dans ce cas, généralement, l'étiquette est le résultat de l'application de cette fonction de hachage à une combinaison, par exemple une concaténation, du cryptogramme CI;* et de la clé k'. [0063] À titre d'exemple, pour générer le cryptogramme CI;* et le code MAC;, un al- gorithme de chiffrement authentifié est utilisé. Cet algorithme de chiffrement authentifié peut être choisi parmi les différents candidats à la compétition CAESAR (« Competition for Authentificated Encryption : Security, Applicability, and Robustness ») comme par exemple l'un des algorithmes désignés par les noms suivants : « ACORN », « ASCON », « SILC », « CLOC », « JAMBU », « KETJE ». [0064] Le code ECC, ; est un code con-ecteur d'erreur qui permet de détecter et de corriger une erreur dans le cryptogramme CI;* et le code MAC;. Il est par exemple construit comme décrit dans le cas du code ECC,;. [0065] Le cryptogramme CI,;* et les codes ECC,;, MAC; et ECC, sont, typiquement, construits au moment où le code machine 32 est généré. [0066] Par la suite, on note @; l'adresse dans la mémoire 4 à laquelle est enregistrée la ligne [0067] Le code machine 32 se compose d'une succession de blocs de base qui doivent être exécutés les uns après les autres. Ici, il existe un premier et un deuxième types de structures pour les blocs de base. Par la suite, les blocs de base qui présentent les structures du premier et du deuxième types sont appelés, respectivement, "bloc du premier type" et "bloc du deuxième type". Le premier type de structure est utilisé en cas de branchement direct. Le deuxième type de structure est utilisé en cas de branchement indirect. [0068] La figure 3 représente le premier type de structure. Plus précisément, la figure 3 re- présente un premier agencement de deux blocs de base 50 et 52 du code machine 32. Dans ce premier agencement, les blocs de base 50 et 52 sont systématiquement exécutés l'un après l'autre. Dans l'ordre d'exécution, le bloc de base 50 précède le bloc de base 52. Dans cette figure et les figures suivantes : - l'ordre d'exécution des blocs de base est représenté par une flèche qui pointe du bloc de base précédent vers le bloc de base suivant, - une flèche en pointillés qui pointe sur un bloc de base représenté indique que le ou les blocs de base qui précèdent ce bloc de base n'ont pas été représentés pour simplifier la figure, - une flèche en pointillés qui pointe dans le vide depuis un bloc de base représenté indique que le ou les blocs de base suivants ce bloc de base représenté n'ont pas été représentés pour simplifier la figure, - le symbole « » à l'intérieur d'un bloc de base indique que toutes les lignes d'instructions de cc bloc de base n'ont pas été représentées. [0069] Chaque bloc de base se compose d'une succession de lignes d'instructions qui chacune comporte le cryptogramme CIC de l'instruction I; à exécuter et le code MACi. De plus, chaque bloc de base débute par une adresse de branchement et se termine par une ligne d'instruction qui contient le cryptogramme d'une instruction de branchement. Plus précisément, dans le cas du premier type de structure, la première ligne du bloc de base, située à l'adresse de branchement, est la première ligne d'instruction du bloc de base. Le bloc de base du premier type ne comporte aucune ligne de donnée. [0070] Sur la figure 2, les symboles « @50 » et « @52» à côté de la première ligne de chaque bloc de base désignent les adresses de branchement, respectivement, des blocs de base 50 et 52. Le symbole « @XX » désigne l'adresse de branchement d'un autre bloc de base non représenté sur la figure 2. [0071] Le symbole « Load ivisbx,» indiqué dans l'avant dernière ligne d'instruction du bloc de base indique que cette ligne d'instruction comporte le cryptogramme d'une instruction de chargement direct. Lorsque l'instruction de chargement direct est exécutée par le microprocesseur 2, elle provoque le chargement d'une nouvelle valeur ivisbxx dans un registre ivb,''h du microprocesseur 2. La valeur ivIb est directement contenue dans l'instruction "Load ivisb'x". Autrement dit, la valeur ivish,' est un opérande de l'instruction "Load ivisbn". On notera que la valeur iv1b est ici codée sur 32 bits et a donc la même longueur qu'une instruction. Ainsi, bien que l'on parle dans ce texte 16 d'une instruction de chargement direct, en pratique cette instruction est généralement implémentée sous la forme d'une première et d'une deuxième instructions de 32 bits du jeu d'instructions du microprocesseur 2. Typiquement, lorsqu'elles sont exécutées, la première instruction charge une première partie des bits de la valeur ivisbn dans le registre ivbrk et la seconde instruction charge les autres bits de la valeur ivisb' dans ce registre ivbra',k. [0072] Le symbole "xx" dans la valeur ivi'.' est un identifiant de cette valeur. En effet, à chaque fois que l'instruction "Load ivi" est exécutée, elle provoque le chargement d'une valeur spécifique qui permet de déchiffrer les lignes d'instructions du bloc de base suivant. Ainsi, le symbole « Load ivisby,» indique que la valeur ivlb2 est chargée dans le registre ivb,''Lek avant que débute l'exécution du bloc de base 52. [0073] Le symbole « Branch @XX» indiqué à l'intérieur de la dernière ligne d'instruction du bloc de base indique que cette dernière ligne comporte le cryptogramme d'une instruction de branchement direct qui, lorsqu'elle est exécutée par le microprocesseur 2, provoque un branchement direct vers l'adresse de branchement @XX. Lorsqu'elle est exécutée, cette instruction provoque aussi le chargement de la valeur contenue dans le registre ivb,1h dans un registre ivishi du microprocesseur 2. Le registre ivishi contient les 32 bits de poids faible ("least significant bit" en anglais) du vecteur d'initial isation iv, actuellement utilisé pour déchiffrer les lignes d'instructions. [0074] Dans ce mode de réalisation, le vecteur iv, est codé sur 128 bits. Les 32 bits de poids fort ("most significant bit" en anglais) sont enregistrés dans un registre iv,'bi. Les 64 bits situés entre les 32 bits de poids faible et les 32 bits de poids fort sont enregistrés dans un ou plusieurs registres collectivement désignés par le terme "registre iv". Chaque vecteur iv, est donc le résultat de la concaténation des bits des registres et ivishi. Ici, les valeurs contenues dans les registres iv,'shi et ivcroi sont constantes durant toute l'exécution du code machine Par exemple, les registres iv,',,,i et iv'ei sont chargés avec ces valeurs constantes au début de l'exécution du code machine 32. Ces valeurs constantes sont obtenues en déchiffrant les cryptogrammes iv,'1,;* et contenus dans le bloc 34. [0075] Le même vecteur d'initialisation iv, est utilisé pour déchiffrer tous les cryptogrammes CI' de toutes les lignes d'instructions du même bloc de base BBk. L'indice k identifie sans ambiguïté le bloc de base BBk parmi l'ensemble des blocs de base du code machine 32. Dans les figures et dans la description, le symbole ivk est par la suite utilisé pour désigner de façon générale le vecteur d'initialisation à utiliser pour déchiffrer les lignes d'instructions du bloc de base BBk. De plus, dans les cas simples comme celui représenté sur la figure 3 où deux blocs de base se suivent dans l'ordre d'exécution du code machine 32, l'indice k est aussi utilisé pour indiquer l'ordre dans lequel ces blocs de base sont exécutés. Par exemple, la notation BBk_i est, dans ces cas 17 simples, utilisée pour désigner le bloc de base précédent systématiquement exécuté immédiatement avant le bloc de base BBk. [0076] Ici, le vecteur d'initialisation ivk est unique pour chaque bloc de base BBk. Par « unique pour chaque bloc de base», on désigne le fait que la probabilité que deux blocs de base différents du code machine 32 soient chiffrés avec le même vecteur d'initialisation ivk est inférieure à une chance sur 100 ou sur 1000. En particulier, l'expression « unique pour chaque bloc de base» couvre donc le cas où les vecteurs d'initialisation ivk de tous les blocs de base sont systématiquement différents les uns des autres. Par exemple, dans un mode de réalisation simple, lors de la génération du code 32, les 32 bits de poids faible des vecteurs d'initialisation ivk dc chaque bloc dc base sont tirées de façon aléatoire ou pseudo-aléatoire dans l'ensemble {1 ; ...; »thst}. [0077] Comme représenté sur la figure 3, dans le code 32, les 32 bits de poids faible du vecteur d'initialisation ivk sont chargés dans le registre ivb'k uniquement lors de l'exécution d'un bloc dc base précédent le bloc de base B131. Sur la figure 3, le vecteur d'initialisation iv1,1,2 nécessaire pour déchiffrer le bloc 52 est chargé lors de l'exécution du bloc 50. [0078] La figure 4 représente un autre agencement possible de plusieurs blocs de base du code 32 dans le cas particulier de deux blocs de base précédents 60 et 62 et d'un bloc de base suivant 64. Les blocs 60, 62 et 64 sont des blocs de base du premier type. Ici, les blocs 60 et 64 sont, par exemple, identiques, respectivement, aux blocs 50 et 52 sauf que les 32 bits de poids faible du vecteur d'initialisation du bloc 64 est noté «iv1,,,64 ». Le bloc 62 est construit comme le bloc 60 et, en particulier, il se termine par deux lignes d'instructions qui codent les mêmes instructions que celles codées dans les deux dernières lignes du bloc 60. Toutefois, même si ces deux dernières lignes codent les mêmes instructions, les cryptogrammes de ces instructions sont différents parce que le bloc 62 est chiffré en utilisant un vecteur d'initialisation iv62 diffèrent du vecteur iv60 utilisé pour chiffrer le bloc 60. Les autres lignes d'instruction du bloc 62 sont différentes de celles du bloc 60. [0079] La figure 5 représente une partie de l'architecture du code machine 32 lorsqu'une fonction F, du code machine 32 appelle une fonction F2 externe. A cet effet, le code machine de la fonction F, comporte un bloc 70 de base qui se termine par un appel au code machine 68 de la fonction F2. [0080] Le code machine 68 est agencé comme précédemment décrit pour le code machine 32. Il se compose donc d'une succession de blocs de base. Pour simplifier la figure 5, seul le premier bloc de base 80 et le dernier bloc de base 82 de ce code machine 68 ont été représentés. Ici, lorsque l'exécution de la fonction F, est terminée, c'est-à-dire après l'exécution du bloc 82, l'exécution du code machine 32 se poursuit par l'exécution d'un bloc 72 de base. 18 [0081] Les lignes d'instructions des blocs 70, 72, 80 et 82 sont chiffrées à l'aide, respec- tivement, des vecteurs iv,,,, iv72, ivso et iv82. [0082] Ici, le code machine 32 est un code dynamique qui a été généré indépendamment du code machine 68. Par exemple, le code machine 68 a été généré avant ou après que le code machine 32 ait été généré. Par exemple, le code machine 68 est le code d'une fonction d'une bibliothèque de fonctions pré-enregistrées. Dans ce cas, typiquement, le code machine 68 peut être appelé, à des instants différents, par différents codes machines. L'adresse @80 du bloc 80 n'est donc pas connue au moment où le code machine 32 est compilé. A cause de cela, le bloc 70 se termine par une ligne d'instruction contenant le cryptogramme d'une instruction de branchement indirect notée "BranchTV rd" sur la figure 5. Lorsque l'instruction "BranchIV rd" est exécutée par le microprocesseur 2, elle provoque un saut vers une adresse @, de branchement construite à partir du contenu actuel d'un registre rd du microprocesseur 2. La construction de l'adresse @ à partir du contenu du registre rd est typiquement réalisé à l'aide de la relation suivante : @i = rd + offset + 4, où : - est l'adresse construite, - rd est la valeur contenue dans le registre rd, - "offset" est une valeur numérique prédéterminée, et - le symbole "+4" indique qu'une valeur constante est ajoutée au résultat de la somme rd + offset de manière à ce que l'adresse @i soit égale à l'adresse de la ligne d'instruction qui suit immédiatement celle située à l'adresse rd + offset. Classiquement, la valeur "offset" est passée en tant qu'opérande de l'instruction "BranchIV rd". [0083] A ce stade, on remarquera que lorsque la somme rd + offset correspond à l'adresse de la première ligne d'un bloc de base, la somme rd + offset + 4 correspond à l'adresse de la deuxième ligne de ce bloc de base. Ainsi, contrairement à une instruction de branchement indirect conventionnelle, l'instruction "BranchIV" provoque un saut directement vers la deuxième ligne du bloc de base suivant. La première ligne de ce bloc de base suivant n'est donc pas exécutée dans ce mode de réalisation. [0084] Le registre rd est chargé avec une valeur permettant de construire l'adresse @80. Ty- piquement, le registre rd est chargé avec la valeur qui permet de construire l'adresse @80, au début de l'exécution du code binaire 30, par un chargeur de bibliothèque dynamique plus connu sous le terme anglais de udynamic library loader" ou simplement "loader". Ce chargeur de bibliothèque dynamique est, par exemple, celui d'un système d'exploitation exécuté par la microprocesseur 2. Ce mécanisme de chargement de bibliothèque dynamique étant bien connu, il n'est pas décrit ici. [0085] De même, puisque le code machine 68 à exécuter n'est pas connu au moment de la compilation du code machine 32, le vecteur iv80 à utiliser pour déchiffrer les lignes 19 d'instructions de cc bloc 80 n'est pas non plus connu. Il n'est donc pas possible d'introduire, lors de la compilation du code machine 32, l'instruction "Load ivisbe", précédemment décrite, dans le bloc 70 pour provoquer le chargement direct du vecteur iv hbSo dans le registre ivek. A la place, lors de la génération du code machine 32, une instruction de chargement indirect d'un vecteur d'initialisation, notée "LoadIV rd", est introduite juste avant l'instruction "BranchIV rd". Lorsqu'elle est exécutée par le microprocesseur 2, l'instruction "LoadIV rd" provoque : - la lecture du contenu de la ligne de donnée située à une adresse construite à partir du contenu du registre rd, puis - la construction des 32 bits de poids faible du vecteur ive à partir du contenu de la ligne de donnée lue, puis - le chargement des 32 bits de poids faible ainsi construit dans le registre ivb,''ch. [0086] Ici, dans le cas de l'instruction "LoadTV rd", la construction d'une adresse à partir du contenu du registre rd est réalisée à l'aide de la relation suivante : @k = rd + offset, où "rd" et "offset" sont les mêmes que ceux utilisés dans l'instruction "BranchTV rd". Ainsi, l'adresse construite est l'adresse de la première ligne du bloc de base suivant. Par la suite, l'adresse de la première ligne du bloc de base BBk est notée @k. [0087] A cet effet, le bloc 80 est un bloc de base du deuxième type. Un bloc de base BBk du deuxième type est identique à un bloc de base du premier type sauf que la première ligne de cc bloc de base comporte une ligne de donnée Ln, et non pas une ligne d'instruction. Cette ligne LDk contient les données permettant de construire les 32 bits de poids faible du vecteur d'initialisation iv, utilisé pour chiffrer les lignes d'instruction de ce bloc de base BBk. A cet effet, elle comporte un cryptogramme, noté ivishi* sur les figures, des 32 bits de poids faible du vecteur iv. Dans ce mode de réalisation, le cryp- togramme est obtenu à l'aide de la relation suivante : ivi.');* = fk'(iv' ; iv), où : - iv,,bi est la valeur des 32 bits de poids faible du vecteur iv, - iv i est un vecteur d'initialisation, différent du vecteur iv, utilisé pour chiffrer les lignes de données, et - la fonction fk' est la même que celle précédemment décrite dans le cas du chiffrement des instructions. [0088] La structure d'une ligne de donnée telle que la ligne LDk est décrite plus loin en référence à la figure 8. [0089] De façon similaire à ce qui a été décrit pour le vecteur iv, le vecteur iv i est codé sur 128 bits. Les 32 bits de poids fort ("most significant bit" en anglais) sont enregistrés dans un registre ivinsbd. Les 32 bits de poids faible sont enregistrés dans un registre ivisbd. Les 64 bits situés entre les 32 bits de poids faible et les 32 bits de poids fort sont enregistrés dans un ou plusieurs registres collectivement désignés par le terme "registre iv eted". Chaque vecteur iv; est donc le résultat de la concaténation des bits des registres iv iVeLed et iVI,13d- Ici, les contenus des registres iv,',bd et iv,ed sont constants durant toute l'exécution du code machine. Par exemple, les registres iv'''d et iv,,ed sont chargés avec ces valeurs constantes au début de l'exécution du code machine 32. De préférence, les valeurs chargées dans les registres iv''b, et iv,d sont différentes de celles chargées dans les registres iv''bi et [0090] Le contenu du registre ivlbd, utilisé lors du chiffrement des données, est fonction de l'adresse @k où est enregistrée la ligne LDk. À cet effet, le module 28 comporte une fonction préprogrammée Fi, qui, à chaque adresse @; de la mémoire 4 associe une valeur différente du registre VIbII. Par exemple, la fonction F. est une fonction de hachage ou de chiffrement. On a donc la relation suivante : ivlbd = Fh(@;), 0- -visbd désigne le contenu du registre iv. [0091] Le code machine 68 peut être appelé à partir de différents blocs de base du code machine 32 ou à partir de différents codes machines. Ainsi, le bloc de base qui doit être exécuté après le bloc de base 82 dépend du bloc de base qui a appelé le code machine 68. Il n'est pas connu au moment de la génération du code machine 68. Par conséquent, comme le bloc 70, le bloc de base 82 est un bloc de base du premier type qui se termine par une ligne d'instruction qui code une instruction "LoadIV ra" suivie d'une ligne d'instruction qui code l'instruction « BranchIV ra ». Les instructions "LoadIV ra" et "BranchIV ra" sont identiques, respectivement, aux instructions "LoadIV rd" et "BranchIV rd" précédemment décrites sauf que le registre rd est remplacé par le registre ra. [0092] Lorsque le code 68 est appelée à partir du bloc 70, l'adresse @72 de retour du code machine 68 est typiquement sauvegardée dans le registre ra du microprocesseur 2. Si le code machine 68 appelle lui-même une autre fonction, alors l'adresse @72 est sauvegardée dans la pile 46 d'exécution et restaurée dans le registre ra juste avant d'exécuter les instructions "LoadIV ra" et "BranchIV ra" du bloc 82. [0093] Le bloc 72 est un bloc de base du deuxième type. Sa première ligne à l'adresse @72 est donc une ligne de donnée qui contient le cryptogramme ivisbi* nécessaire pour construire le vecteur iv72 qui permet de déchiffrer ses lignes d'instruction. [0094] La figure 6 représente les principaux registres décrits jusqu'à présent. Ces registres peuvent être des registres de l'ensemble 12 et/ou des registres du module 28. De préférence, les registres du module 28 sont utilisés pour enregistrer les informations utilisées pour chiffrer ou déchiffrer Ainsi, de préférence, les registres iv, iv',i, ivmsbd, iveted, ivre, iveep, iv1b, ivtemp, ivbrana, ivrnd sont des registres contenus dans la mémoire 29. En plus des registres déjà décrits, le microprocesseur 2 comporte des registres ivcted, ivb, ivpjle,ivne', 'vis* iVoemp, iVbranch, iVrnd et sp décrits plus en détails dans les chapitres suivants. [0095] La figure 7 représente un procédé d'exécution du code binaire 30 par le micro- 21 processeur 2. [0096] Le procédé débute par une étape 150 de fourniture du code binaire 30 dans la mémoire 4. Pour cela, par exemple, le microprocesseur 2 recopie la copie 40 à l'intérieur de la mémoire 4 pour obtenir le code binaire 30 enregistré dans la mémoire 4. [0097] Ensuite, lors d'une phase 152, le microprocesseur 2 exécute le code binaire 30 et, en particulier, le code machine 32. [0098] Éventuellement, l'exécution du code binaire 30 commence par une étape 154 d'authentification de l'auteur de ce code binaire. Si toutes l'authentification a été réussie avec succès, alors le procédé se poursuit par une étape 162. À l'inverse, si l'authentification n'a pas été réussie avec succès, le module 28 considère alors que l'authentification de l'auteur du code binaire 30 a échoué et le procédé se poursuit par une étape 163. Lors de l'étape 163, l'exécution du code binaire 30 est arrêtée. [0099] Lors de l'étape 162, le module 28 charge les cryptogrammes ka* et iv''bi*, ivisbi iv',", iv,,i,c*, iv'')* contenus dans le bloc 34 et les déchiffre à l'aide de la clé sic°, contenue dans la mémoire 29. Le module 28 initialise les valeurs contenues dans les registres iv), iv',,iv110.ivc', à partir, respectivement, des cryp- togrammes iv,',,,i*, iv''*, ivpne*, iv,* déchiffrés. À l'issue de l'étape 162, la clé ka et le vecteur d'initial isation iv k utilisé pour déchiffrer le premier bloc de base du code machine 32 sont contenus dans la mémoire 29. [0100] Après l'étape 162, le microprocesseur 2 exécute, les uns après les autres, les blocs de base en commençant par le premier bloc de base BBI du code machine 32. [0101] L'exécution de chaque bloc de base consiste à exécuter, dans l'ordre où les lignes d'instruction LI; de ce bloc de base sont enregistrées dans la mémoire 4, les instructions codées par chacune de ces lignes d'instruction. [0102] Pour chacune des lignes d'instruction LI; à exécuter du code machine 32, le micro- processeur 2 exécute les étapes suivantes. [0103] Lors d'une étape 164, le microprocesseur 2 charge dans un registre de l'ensemble 12, la ligne d'instruction enregistrée à l'adresse @i contenue dans le compteur ordinal 26. [0104] Ensuite, le module 28 procède à une étape 166 de sécurisation de l'instruction codée dans la ligne d'instruction chargée. [0105] Le fonctionnement de l'étape 166 est maintenant décrit dans le cas de la ligne LIi. Plus précisément, lors de l'étape 166, le module 28 réalise successivement les opérations suivantes. [0106] Lors d'une opération 170, le module 28 vérifie s'il existe une erreur dans le cryp- togramme Cl;* ou le code MAC; à l'aide du code ECCL; contenu dans la ligne LI; chargée. Par exemple, pour cela, le module 28 construit, à l'aide d'une fonction pré-programmée et du cryptogramme CI;* et du code MAQ, un code ECCL;'. Si le code ECC,_,' est différent du code ECC,_,a alors une erreur est détectée. Si une erreur est détectée, le module 28 procède immédiatement à une étape 172. [0107] Lors de l'étape 172, le module 28 déclenche le signalement d'une faute d'exécution. [0108] Ici, en parallèle de l'étape 172, si une erreur est détectée, le module 28 procède à une opération 174. Lors de l'opération 174, il corrige le cryptogramme CI,* et le code MAC à partir des informations contenues dans le code ECC,,,. À l'issue de l'étape 174, le cryptogramme Cl* corrigé et le code MAC, corrigé sont utilisés à la place, respectivement, du cryptogramme Cl,* et du code MAC, contenus dans la ligne LI,. [0109] L'opération 170 permet notamment de détecter et de corriger des fautes introduites dans les lignes d'instruction stockées dans la mémoire 4. [0110] À l'issue de l'opération 174 ou si aucune erreur n'a été détectée lors de l'opération 170, le procédé se poursuit par une opération 176. [0111] Lors de l'opération 176, le module 28 vérifie l'intégrité et l'authenticité du cryp- togramme Cl* à l'aide du code MAÇ;. Par exemple, pour cela, le module 28 construit une étiquette du cryptogramme Cl* puis chiffre cette étiquette avec la clé k' contenue dans sa mémoire 29. Si le cryptogramme ainsi construit est identique au code MAC; chargé, alors l'intégrité et l'authenticité du cryptogramme Cl* est confirmée. Dans ce cas, le module 28 procède à une opération 178. Dans le cas contraire, le module 28 procède à l'étape 172. [0112] L'opération 176 permet d'une part de valider l'authenticité de la ligne de code chargée et aussi de valider que, lors de l'opération 174, le cryptogramme CI;* et/ou le code MAC; ont correctement été corrigés. La vérification de l'authenticité empêche le remplacement de la ligne de code par une autre ligne de code construite par un auteur qui ne connaît pas la clé k'. [0113] Lors de l'opération 178, le module 28 déchiffre le cryptogramme CI;* en utilisant la clé ka et le vecteur d'initialisation iv, pour obtenir l'instruction Let le code ECC,; déchiffrés. La clé ka a été enregistrée dans la mémoire 29 lors de l'étape 162. Le vecteur iv k nécessaire pour déchiffrer le cryptogramme CIC a été enregistré dans les registres iv'e; et iv11,1 lors de l'exécution de l'instruction "Branch @xx" ou ou "BranchIV rd" ou "BranchIV ra" codée dans le bloc de base précédent celui qui contient cette ligne LI; actuellement traitée. Si la ligne LI; est contenue dans le premier bloc de base BBini du code machine 32, c'est les valeurs initiales des registres ivbi, iv',i et iv,,i qui sont utilisées. [0114] Ici, c'est l'exécution de l'instruction de branchement "Branch @xx" ou "BranchIV rd" ou "BranchIV ra", par l'unité 10, qui indique au module 28 qu'il doit remplacer le contenu du registre ivisbi par le contenu du registre ivbr.mch. Le contenu du registre ivbranch est mis à jour lors de l'exécution de l'instruction "Load iv" ou "LoadIV rd" ou "LoadIV ra" qui précède l'instruction de branchement. 23 [0115] Ensuite, lors d'une opération 180, le module 28 enregistre l'instruction I, déchiffrée et le code ECC,, déchiffré dans la file 22. [0116] Une fois que l'unité 10 a exécuté toutes les instructions qui précédent l'instruction I, dans la file 22, c'est-à-dire lorsque l'instruction -1; est la prochaine instruction à exécuter par l'unité 10, le module 28 procède à une opération 184. [0117] Lors de l'opération 184, le module 28 vérifie s'il existe une erreur dans l'instruction contenue dans la file 22 à l'aide du code ECC,; associé à l'instruction Iet contenu dans cette même file 22. Cette opération est réalisée de façon similaire à ce qui a été décrit pour l'opération 170. [0118] Si le module 28 détecte une erreur, alors il procède immédiatement à l'étape 172. De plus, en parallèle, lors d'une opération 186, le module 28 corrige l'instruction -1; à l'aide du code ECC,J. L'opération 186 est similaire à l'opération 174. [0119] Ensuite, à l'issue de l'opération 186 ou si aucune erreur n'a été détectée lors de l'opération 184, l'étape 166 se termine et le procédé se poursuit par une étape 190 d'exécution de l'instruction I; par l'unité 10. [0120] Lors de l'étape 190, l'unité 10 exécute l'instruction L. [0121] Comme représenté sur la figure 7, en parallèle de l'étape 190, le procédé peut comporter : - une étape 198 de sécurisation de la pile 46 d'exécution, et/ou - une étape 250 de sécurisation des données traitées. [0122] Ces étapes 198 et 250 sont décrites plus en détail dans les chapitres suivants. [0123] L'opération 184 permet de détecter une modification de l'instruction I; qui inter- viendrait entre l'instant où elle est enregistrée dans la file 22 et l'instant où elle est exécutée par l'unité 10. [0124] L'opération 184 permet aussi de déclencher une faute d'exécution si le flot de contrôle du code machine 32 a été modifié. En effet, une modification du flot de contrôle se traduit par le fait qu'après l'exécution du bloc de base BBk , ce n'est pas le bloc de base BBk qui est exécuté mais un autre bloc de base BB,. Dans ce cas, lors de l'exécution du bloc BBk 1, le vecteur d'initialisation iv k , est chargé dans les registres iv iv et ivishi. Dès lors, lors de l'exécution du bloc BB' le cryptogramme CIi* est déchiffré à l'aide du vecteur ivk qui correspond au BB1 et non pas à l'aide du vecteur iv , qui correspond au bloc BB,. Par conséquent, le déchiffrement du cryptogramme CIC à l'aide du vecteur ivk conduit à l'obtention d'une instruction I; et d'un code ECC,i incorrects et ceci est détecté lors de l'opération 184. L'opération 184 permet aussi bien de détecter une perturbation de l'exécution de l'opération "Branch @XX" que de l'opération " BranchIV ra" ou "BranchIV rd". [0125] L'opération 184 permet aussi de détecter la permutation, dans la mémoire 4, des deux blocs de base BBk et BB, du deuxième type. En effet, si le bloc BBk est remplacé par le 24 bloc BB' alors, lors de l'exécution de l'instruction "LoadIV ra" du bloc BBk_,, la première ligne de donnée du bloc BBL est déchiffrée à l'aide d'un vecteur ivi construit à partir de l'adresse @k et non pas à partir de l'adresse @,. Cela conduit donc à un déchiffrement incorrect du cryptogramme ivb,b,* et donc à un déchiffrement incorrect de la première ligne d'instruction du bloc BB,. Cc déchiffrement incorrect de la première ligne d'instruction du bloc BB, est détecté lors de l'opération 184. [0126] Lors de l'exécution du code machine 32, si des attaques conduisent à altérer une ins- truction à protéger ou à modifier le flot de contrôle, le microprocesseur 2 signale, lors de l'étape 172, une faute dans l'exécution du code machine 32. En réponse à un tel signalement, lors d'une étape 192, le microprocesseur 2 met en oeuvre une ou plusieurs contre-mesures. De très nombreuses contre-mesures sont possibles. Les contre-mesures mises en oeuvre peuvent avoir des degrés de sévérité très différents. Par exemple, les contre-mesures mises en oeuvre peuvent aller d'un simple affichage ou une simple mémorisation d'un message d'erreur sans interrompre l'exécution normale du code machine 32 jusqu'à une mise hors service définitive du microprocesseur 2. Le microprocesseur 2 est considéré comme étant hors service lorsqu'il est définitivement placé dans un état où il est incapable d'exécuter un quelconque code machine. Entre ces degrés de sévérité extrêmes, il existe de nombreuses autres contre-mesures possibles telles que : - l'indication par l'intermédiaire d'une interface homme-machine de la détection des fautes, - l'interruption immédiate de l'exécution du code machine 32 et/ou sa réinitialisation, et - la suppression du code machine 32 de la mémoire 4 et/ou la suppression de la copie 40 de sauvegarde et/ou la suppression des données secrètes. [0127] De plus, ici, la contre-mesure mise en oeuvre lors de l'étape 192 peut être sélectionnée en fonction de l'erreur détectée et donc en fonction de l'opération qui a conduit à la détection de cette faute. Par exemple, la contre-mesure sélectionnée ne sera pas la même selon que l'erreur a été détectée lors de l'opération 176 ou 184. [0128] CHAPITRE IV : SÉCURISATION DES DONNEES DE LA PILE D'EXECUTION : [0129] A chaque fois qu'une fonction appelante déclenche l'exécution d'une fonction appelée, le contexte d'exécution de la fonction appelante est sauvegardé dans la pile 46. De plus, la fonction appelée sauvegarde également dans la pile 46 des données telles que des variables locales. [0130] De façon similaire à ce qui a été décrit dans le cas des instructions Ij, une donnée D; enregistrée dans la pile 46 peut être corrompue par la mise en oeuvre d'attaques par dépassement de tampon ou par d'autres types d'attaques telle qu'une attaque par injection de fautes. [0131] Pour rendre la pile 46 plus robuste vis-à-vis de telles attaques, ici, chaque donnée D; enregistrée dans la pile 46 est codée dans une ligne respective LD,. La ligne LD, est une ligne de donnée. Contrairement aux lignes d'instructions LI; décrites dans le chapitre HI, la ligne LD, code une donnée D, à traiter par le microprocesseur et non pas une instruction I; exécutable par l'unité 10. [0132] La structure d'une ligne LD, est représentée sur la figure 8. Ici, la structure de la ligne LD, est identique à la structure de la ligne LI, sauf que le cryptogramme Cl;* est remplacé par un cryptogramme CD,*. Étant donné que les codes MAC; et ECCL; de la ligne LD, sont calculés comme déjà décrit dans le cas des lignes Lir ils sont ici désignés par les mêmes symboles et ne sont pas décrits à nouveau. [0133] Le cryptogramme CD,* est obtenu en chiffrant, avec la fonction fice, une conca- ténation op,. Ici, la fonction fht est la même que celle déjà décrite dans le cas des lignes LI,. Ainsi, le cryptogramme CD," est obtenu à l'aide de la relation suivante : CD; = fk'(CD; ; ive). La fonction fk', est préprograrnmée dans le module 28. [0134] De façon similaire à ce qui a été décrit pour le vecteur iv, le vecteur iv,, est codé sur 128 bits. Les 32 bits de poids fort ("rnost significant bit" en anglais) sont enregistrés dans un registre ivee, du microprocesseur 2. Les 32 bits de poids faible sont enregistrés dans un registre iv1,1, du microprocesseur 2. Les 64 bits situés entre les 32 bits de poids faible et les 32 bits de poids fort sont enregistrés dans un ou plusieurs registres du microprocesseur 2 collectivement désignés par le terme "registre ive',,". Chaque vecteur iv est donc le résultat de la concaténation des bits des registres iv, et ivisbe. Ici, le contenu du registre iv,' est constant durant toute l'exécution du code machine. Par exemple, le registre iv'' est chargé avec cette valeur constante au début de l'exécution du code machine 32. Ici, la valeur contenue dans le registre iv', est obtenue en déchiffrant le cryptograme ive',,* du bloc 34. Par exemple, le registre iv,, est chargée au début de l'exécution du code 32 avec une valeur constante différente de celles contenues dans les registres iv'' et iv. [0135] Le contenu du registre utilisé lors du chiffrement des données, est fonction de l'adresse @; où est enregistrée la ligne LD; contenant cette donnée. À cet effet, le module 28 utilise la fonction Fi, précédemment décrite. On a donc la relation suivante : = Fe,(@;), où iv11,1, désigne le contenu du registre ivisbe. [0136] La concaténation CD; est la concaténation de la donnée D; et d'un code ECCE,;. Le code ECCT); permet de détecter et de corriger une erreur dans la donnée De Il est typiquement construit comme décrit pour le code ECCe. [0137] Le cryptogramme CD,* diffère du cryptogramme CI,* en ce que le vecteur d'initialisation ive utilisé lors du chiffrement de la concaténation CD, change en fonction de l'adresse de la ligne LD, et aussi à chaque fois qu'une nouvelle fonction enregistre des données dans la pile 46. 26 [0138] La sécurisation des données D, sauvegardées dans la pile 46 va maintenant être décrite plus en détail en référence au procédé de la figure 9 et dans le cas particulier où elle est mise en oeuvre en combinaison avec les enseignements des autres chapitres. Plus précisément, la sécurisation des données D, intervient à chaque fois que l'instruction exécutée lors de l'étape 190 est une instruction de lecture ou d'écriture dans la pile 46 d'une donnée D. Le procédé de la figure 9 représente les opérations exécutées lors de l'étape 198 pour sécuriser les données D. [0139] À chaque fois que lors de l'étape 190, l'unité 10 exécute une instruction qui conduit à enregistrer une nouvelle donnée D; dans un registre, noté ici R. de l'ensemble 12, lors d'une opération 252, le module 28 calcule le code ECC,,,, à partir de la donnée D. Ce code ECC,); calculé est ensuite concaténé avec la donnée D; dans le registre R. [0140] Ultérieurement, lors d'une nouvelle exécution de l'étape 190, l'unité 10 exécute une instruction d'enregistrement de la donnée D, contenue dans le registre R à l'adresse @, de la pile 46. [0141] En réponse, lors d'une opération 254, le module 28 construit la ligne de code LD; qui doit être enregistrée à l'adresse @; à partir de la donnée D. Pour cela, lors de cette opération, le module 28 : - met à jour le contenu du registre ivlb1, à l'aide de la relation iv,,,,,, = F(@;), puis - chiffre la concaténation CD; de la donnée D; et du code ECO); à l'aide de la fonction fk' et du vecteur d' initialisation iv,, en utilisant la relation suivante : CD;* = fk', (CD; ; iv,,), puis - calcule le code MAC; à partir du cryptogramme CD;'', puis - calcule le code ECC, ; à partir du cryptogramme CD;* et du code MAC; calculé. [0142] Ensuite, la ligne LD; construite est transférée et enregistrée dans la pile 46 à l'adresse @i. [0143] Si la prochaine instruction à exécuter lors de l'étape 190 est une instruction de chargement d'une ligne LD;, alors, l'unité 10 exécute cette instruction et la ligne LD; est chargée dans un registre du microprocesseur 2. Typiquement, cette instruction de chargement comporte un opérande qui indique à quelle adresse @; se trouve la ligne LD; à charger. Ici, lorsque l'unité 10 exécute cette instruction de chargement, elle charge la ligne LD; dans un registre R; de l'ensemble 12 par exemple. [0144] Ensuite, le module 28 exécute des opérations 270, 274, 276 et 278 identiques, respec- tivement, aux opérations 170, 174, 176 et 178 du procédé de la figure 7 sauf que ce sont les codes correspondants contenus dans la ligne LI); qui sont utilisés et non pas ceux contenus dans une ligne 1_4 [0145] De plus, lors de l'opération 278, le module 28 met à jour le contenu du registre ivisbp nécessaire pour déchiffrer le cryptogramme CD;* à partir de l'adresse @; et en utilisant la relation ivIbP = 27 [0146] Une fois que le cryptogramme CD,* a été déchiffré, lors d'une opération 280, le module 28 enregistre la donnée D, déchiffrée et le code ECC,', déchiffré dans le registre R, en attendant que cette donnée soit traitée par l'unité 10. [0147] Lorsque la prochaine instruction qui va être exécutée par l'unité 10 est une ins- truction qui traite la donnée Di, le module 28 procède à des opérations 284 et 286. Le module 28 identifie que la prochaine instruction à exécuter va traiter la donnée D, car cette instruction comporte généralement un opérande qui identifie le registre -Ri dans lequel est enregistré la donnée D. Les opérations 284 et 286 sont, par exemple, identiques, respectivement, aux opérations 184 et 186 du procédé de la figure 7, sauf qu'ici, c'est la donnée D, et le code ECC,), qui sont utilisés et non pas l'instruction I, et le code ECC4. [0148] Ensuite, à l'issue de l'opération 286 ou si aucune erreur n'a été détectée lors de l'opération 284, l'unité 10 exécute l'instruction qui traite la donnée D. [0149] Le procédé de sécurisation des données décrit ici présente en outre les mêmes avantages que ceux présentés au chapitre III notamment à cause du fait que la structure de la ligne LID; est pratiquement identique à celle de la ligne LI. [0150] De plus, le fait de chiffrer la donnée Di à l'aide d'un vecteur d' initial isation iv1 qui dépend de l'adresse @i permet de détecter si une ligne LE); a été déplacée à l'intérieur de la pile 46. En effet, si deux lignes LDI et LD2 sont permutées, une telle permutation des lignes LD, et LD2 n'est pas nécessairement détectée lors de l'opération 270 ou 276. Par contre, puisque la donnée D, est chiffrée avec un vecteur d'initialisation ivi qui dépend de l'adresse @ ,, si la ligne LDI est déplacée et se situe à une adresse @2 dans la pile 46, lors du chargement de cette ligne à partir de cette adresse @2, le cryptogramme CD,* va être déchiffré à l'aide du vecteur d'initialisation iv2 et non pas à l'aide du vecteur iv I. Un tel déchiffrement incorrect de la donnée DI et du code ECC,-,1 est alors détecté lors de l'opération 284. [0151] CHAPITRE V : SÉCURISATION CONTRE LES ATTAQUES PAR DE-PASSEMENT DE TAMPON [0152] Comme déjà expliqué en référence à la figure 5 dans le cas du jeu d'instructions RISV-V, lorsque la fonction F, est appelée à partir de la fonction F,, l'adresse de retour @ra2 à utiliser pour poursuivre l'exécution de la fonction EI après l'exécution de la fonction F2 est enregistrée dans un registre ra de l'ensemble 12. Par contre, si au cours de l'exécution de la fonction F2, une fonction Fi est appelée, alors à ce moment-là, l'adresse @ra2 et, plus généralement, le contexte d'exécution de la fonction R, est sauvegardé dans la pile 46. [0153] Le contexte d'exécution comporte notamment toutes les informations nécessaires à la reprise de l'exécution de la fonction F, une fois que l'exécution de la fonction F3 est terminée. Cela comprend, en outre : 28 - l'adresse @ra2, - la valeur d'un pointeur sp qui pointe vers le haut de la pile 46, - éventuellement, les valeurs de certaines données en cours de traitement par la fonction R. [0154] Lors de son exécution, la fonction F3 peut, elle aussi, sauvegarder des données dans la pile 46, dans un espace prédéterminé de la mémoire appelée « tampon » ou « buffer » en anglais. Il est possible d'écrire dans cc tampon des données plus grandes que l'espace alloué à ce tampon pour sauvegarder ces données. Cela conduit à ce qui est connu sous les termes de « dépassement de tampon » ou « débordement de tampon » et plus connu sous le terme anglais de « buffer overflow ». [0155] Lorsque cc dépassement de tampon est intentionnel, il peut être utilisé pour remplacer l'adresse @ra2 par une autre adresse @rat choisie par un attaquant. Dans ces conditions, à l'issue de l'exécution des fonctions F2 et F3, ce n'est pas l'exécution de la fonction FI qui est poursuivie, mais l'exécution des instructions situées à l'adresse @rat qui débute. Un dépassement de tampon peut donc être utilisé pour détourner le flot de contrôle vers un code développé et conçu par un attaquant. Typiquement, ce genre d'attaque est mis en oeuvre pour contourner des mesures de sécurité et/ou obtenir des informations secrètes sur le fonctionnement de la fonction sécurisée. [0156] Dans ce chapitre, une solution pour lutter contre ce type d'attaque est décrite. Ici, cette solution est décrite dans le cas particulier où l'enseignement des autres chapitres, et en particulier du chapitre IV, est, en même temps, mis en oeuvre. [0157] Plus précisément, pour rendre plus difficile les attaques par dépassement de tampon, le vecteur iv, utilisé pour chiffrer l'adresse de retour @ra2 sauvegardée dans la pile 46 est différent de celui utilisé lors de la sauvegarde dans la pile 46 de données par la fonction appelée F. [0158] A cet effet, le prologue PF3 et l'épilogue EF3 de l'appel à la fonction F3 sont modifiés comme représenté sur la figure 10. [0159] La figure 10 est divisée en trois colonnes verticales désignées par les références F,, F 2 et R. Les blocs de base des fonctions FI, F2 et F3 sont représentés, respectivement, dans les colonnes FI, F, et R. [0160] Les lignes d'instruction des blocs de base des fonctions F,, F, et Fi sont sécurisées comme décrit dans le chapitre III. Par conséquent, les blocs de base des fonctions FI, F 2 et F' sont, soit des blocs de base du premier type, soit des blocs de base du deuxième type tel que précédemment décrit. [0161] La fonction FI comporte un bloc de base 202 et un bloc de base 204. Le bloc 202 est ici un bloc de base du premier type. Le bloc de base 202 se termine par une ligne d'instruction codant une instruction de branchement, notée « Branch @F2» sur la figure 10, vers la première ligne d'instruction du premier bloc de base 208 de la 29 fonction F,. On rappelle ici que lorsque l'instruction notée « Branch @F, » est exécutée, l'adresse @ra2 de retour est stockée dans le registre rade l'ensemble 12. [0162] Le bloc de base 204 est le bloc de base de la fonction FI qui doit être exécutée quand l'exécution de la fonction Fo est terminée. Sa première ligne est donc située à l'adresse @m2. Ici, l'exécution du bloc de base 204 est déclenchée suite à l'exécution d'une instruction de branchement indirect située à la fin de la fonction F2. Par conséquent, ici, le bloc de base 204 est un bloc de base du deuxième type. [0163] La fonction Fo débute par le bloc de base 208 et se termine par un bloc de base 214. Ici, ces blocs de base 208 et 214 sont des blocs de base du premier type. [0164] Entre ces blocs 204 et 214, la fonction F, comporte un bloc de base 210 et un bloc de base 212. Le bloc de base 210 comporte les lignes d'instructions du prologue PF3 qui est exécuté par le microprocesseur 2 avant le début de l'exécution du premier bloc de base 220 de la fonction F.,. [0165] La dernière ligne d'instruction du prologue PEI code une instruction de branchement direct, notée « Branch @F; », vers la première ligne d'instruction du bloc 220. Lors de l'exécution de cette instruction, l'adresse @ra3 de retour de la fonction F3 est stockée dans le registre ra. Par conséquent, au préalable, l'adresse @m2 qui se trouvait dans cc registre m doit être sauvegardée dans la pile 46. A cet effet, le prologue PF3 comporte une ligne d'instruction notée « Store @ra2, @, » qui, lorsqu'elle est exécutée par le microprocesseur 2, sauvegarde l'adresse @m2 à l'adresse @, dans la pile 46. Comme expliqué au chapitre IV, c'est donc une ligne LI:), contenant un cryptogramme CD,* construit à partir de l'adresse @ra2 qui est sauvegardé à l'adresse @, dans la pile 46. [0166] On rappelle ici que le cryptogramme CD,* est obtenu en utilisant le vecteur iv' Ce vecteur iv,, est le résultat de la concaténation des bits contenus dans les registres iv,'' et iv,,,,. Le contenu du registre iv,,,,,, est égal à F'(@,), où @, est l'adresse dans la pile 46 où doit être sauvegardé la donnée. [0167] Par la suite, on note iv a la valeur contenue dans le registre iv,', au moment où l'instruction « Store @ra2, @, » est exécutée. Ainsi, l'adresse @ra2 est chiffrée à l'aide de la valeur iv a contenue dans le registre iv,,i,' et de l'adresse @,. [0168] Ensuite, entre les instructions « Store @ra2, @, » et «Branch @F; », le prologue PF3 comporte des lignes d'instructions codant des instructions pour : - sauvegarder la valeur iv' dans la pile 46, et - remplacer la valeur iv' du registre iv,,i,' par une nouvelle valeur ivb. [0169] A cet effet, le prologue PF3 comporte successivement : - une ligne d'instruction codant une instruction notée « LoadIV ivternp, ivp,' », - une ligne d'instruction codant une instruction notée « LoadIV ivoe, iv'd », et - une ligne d'instruction codant une instruction notée « StoreIV ivtemp, @;+1». [0170] Lorsqu'elle est exécutée par le microprocesseur 2, l'instruction « LoadIV iv'll,' » provoque l'enregistrement du contenu du registre iv,,,,, dans le registre iv Lernp Ainsi, après l'exécution de cette instruction, la valeur iv3 est sauvegardée dans le registre iv Lemp- [0171] Lorsqu'elle est exécutée par le microprocesseur 2, l'instruction « LoadIV ivpjle, iv1fld» provoque l'enregistrement dans le registre ivi',' du contenu du registre iv,' [0172] Le registre iv',d est ici un registre qui est connecté à un générateur de nombres aléatoires ou pseudo-aléatoires. Ainsi, chaque fois que son contenu est lu ou chargé dans un autre registre, le registre iv,'d contient une nouvelle valeur construite par le générateur de nombres aléatoires ou pseudo-aléatoires. [0173] Ainsi, après l'exécution de l'instruction « LoadIV ivpjle, ivmd », le registre ivp,' contient la nouvelle valeur iv b et cette nouvelle valeur ivb a été générée de façon aléatoire ou pseudo-aléatoire. [0174] Lorsque l'instruction « StoreIV ivr,,i,, @,', » est exécutée par le microprocesseur 2, elle provoque la sauvegarde dc la valeur iv' contenue dans le registre iv',, dans la pile 46 à l'adresse notée Par exemple, l'adresse est l'adresse qui suit immé- diatement l'adresse C.)) dans la pile 46. Puisque l'instruction « StoreIv » est exécutée après l'instruction « LoadIV iv1 », la valeur iv, est chiffrée en utilisant la nouvelle valeur ivb contenue dans le registre [0175] Enfin, comme déjà décrit dans le chapitre III, le prologue PF3 comporte aussi une ligne d'instruction codant l'instruction « Load lV1. » pour charger dans le registre iv brandi la valeur qui sera utilisée pour déchiffrer les instructions I, du bloc de base suivant, c'est-à-dire ici, du bloc de base 220 de la fonction F. [0176] Le bloc 212 est le bloc de base de la fonction F, exécuté juste après l'exécution de la fonction F. Puisque l'exécution du bloc de base est déclenchée suite à l'exécution d'un branchement indirect, le bloc 212 est ici un bloc de base du deuxième type. [0177] Le premier bloc de base 220 de la fonction F' est un bloc de base du premier type. [0178] La fonction Fi se termine par un bloc de base 222 du premier type qui comporte une première partie de l'épilogue FFI. Cette première partie FFI se termine par une ligne d'instruction codant une instruction « BranchIV ra ». Lorsque l'instruction "BranchIV ra" est exécutée par le microprocesseur 2, cela provoque un saut vers la seconde ligne du bloc de base 212. Pour cela, elle est précédée d'une ligne d'instruction comportant l'instruction « LoadIV ra ». Ces instructions ont déjà été expliquées dans le chapitre III. [0179] L'épilogue EF3 comporte également une seconde partie qui débute à la première ligne d'instruction du bloc 212. Cette seconde partie de l'épilogue EF3 comporte successivement : - une ligne d'instruction codant une instruction « LoadIV iv,''' puis - une ligne d'instruction codant une instruction « Load ra, @; ». 31 [0180] L'exécution de l'instruction « LoadTV ivpjle, @,._, » par le microprocesseur 2 provoque le déchiffrement et le chargement dans le registre ivpi1, de la donnée contenue dans la ligne de données située à l'adresse Comme expliqué ci-dessus, lors de l'exécution du prologue PF3, c'est le cryptogramme de la valeur iv chiffrée en utilisant la valeur iv b qui est sauvegardé dans cette ligne. Ainsi, l'exécution de r instruction « LoadIV » provoque le remplacement de la valeur iv, contenue dans le registre ivpjl. par la valeur iv sauvegardée dans la pile 46. [0181] L'exécution de l'instruction « Load ra, @, » provoque le déchiffrement et le chargement dans le registre ra de la donnée contenue dans la ligne de donnée située à l'adresse @,. Comme expliqué ci-dessus, lors de l'exécution du prologue PF3, c'est le cryptogramme de l'adresse @ra2 chiffrée en utilisant la valeur iv qui est sauvegardé dans cette ligne. Ainsi, l'exécution de l'instruction « Load ra, @, » provoque le déchiffrement et le chargement dans le registre ra de la donnée contenue dans cette ligne. [0182] Le fonctionnement du procédé pour sécuriser la pile 46 contre les attaques par dé- passement de tampon va maintenant être décrit plus en détails en référence aux figures 11 et 12 dans le cas particulier des fonctions FI, F2 et F' précédemment décrites. Les instructions des fonctions FI, Fi et F; sont exécutées conformément à ce qui a été décrit dans le chapitre III. On suppose aussi que la fonction FI est la fonction principale, également connue sous le nom anglais de « main », du code machine 32. [0183] Lors d'une étape 230, au cours de l'exécution de la fonction F,, le bloc 202 est exécuté pour appeler la fonction F. Lors de l'exécution du bloc 202, le prologue de l'appel à la fonction F2 est exécuté. L'exécution de ce prologue provoque le chargement de l'adresse @ra2 dans le registre ra du microprocesseur 2. Il provoque également la sauvegarde d'au moins une partie du contexte d'exécution de la fonction F, dans la pile 46. Ensuite, l'instruction « Branch @F2 » est exécutée, ce qui provoque un saut sur la première ligne d'instruction de la fonction F, située à l'adresse @208. [0184] Lors d'une étape 232, la fonction F2 s'exécute. Lors de son exécution, la fonction F2 sauvegarde dans la pile 46 des données DF2 (Figure 12) comme, par exemple, des variables locales. A chaque fois qu'une donnée est sauvegardée dans la pile 46, le procédé du chapitre IV est mis en oeuvre. Lors de l'exécution de la fonction F.,, le registre iv,,i,' contient la valeur iv'. [0185] Lors d'une étape 234, au cours de l'exécution de la fonction F2, le bloc 210 est exécuté. Le prologue PF' de l'appel à la fonction F; est alors exécuté par le microprocesseur 2. [0186] Lors de l'étape 234, les opérations classiquement exécutées lors de l'exécution d'un prologue d'un appel à une fonction sont réalisées. Ces opérations étant classiques, elles ne sont pas reprises ici. On rappelle simplement que l'exécution de ces opérations provoque la sauvegarde des différentes données du contexte d'exécution de la fonction 31 F2 dans la pile 46. Ces données comportent par exemple, la valeur d'un pointeur sp qui pointe sur le sommet de la pile 46 et d'autres informations nécessaires pour reprendre correctement l'exécution de la fonction F, après l'exécution de la fonction F. De plus, l'exécution du prologue PF3 conduit à exécuter les unes après les autres les lignes d'instruction représentées sur la figure 10. L'exécution de ces lignes d'instruction par le microprocesseur 2 provoque dans l'ordre : - la sauvegarde de l'adresse @ra2 sur le sommet de la pile 46, puis - la sauvegarde de la valeur actuelle iva du registre ivpik. dans le registre iv,',p, puis - le chargement de la nouvelle valeur iv b dans le registre ivo' puis - la sauvegarde de la valeur iv3 contenue dans le registre iv'. dans la pile 46, puis - le chargement d'une nouvelle valeur dans le registre ivIb permettant de déchiffrer les lignes d'instructions LI; du bloc 220, puis - l'exécution de la première ligne d'instruction du bloc 220. [0187] L'adresse @ra2 est sauvegardée dans la pile 46 comme toutes les autres données sau- vegardées dans sa pile, c'est-à-dire en mettant en oeuvre le procédé du chapitre W. L'adresse @ra2 est sauvegardée dans la pile 46 à un moment où la valeur contenue dans le registre ivI,1 est égale à la valeur iv'. Par conséquent, c'est seulement un cryptogramme @ra2* obtenu en chiffrant l'adresse @ra2 à l'aide de la valeur iv' qui est enregistré dans la pile 46. Sur la figure 12, ce cryptogramme est noté "@ra2*". De façon similaire, la valeur iva est sauvegardée dans la pile 46 en mettant en oeuvre le procédé du chapitre IV. Au moment où la valeur iva est sauvegardée, le registre iv,,,.. contient la valeur iv,,. Ainsi, le cryptogramme iv'* de la valeur iv' sauvegardée dans la pile 46 est obtenu en chiffrant la valeur iv' à l'aide de la valeur iv,. [0188] Lors d'une étape 236, après l'exécution du prologue PF1, la fonction F3 est exécutée. Lors de son exécution, la fonction F3 enregistre des données DF3 dans la pile 46 en mettant en oeuvre le procédé du chapitre IV. Ici, la fonction F1 est une fonction feuille, c'est-à-dire une fonction qui n'appelle pas une autre fonction au cours de son exécution. Dans ces conditions, le contenu du registre ivi, est laissé inchangé entre l'exécution du prologue PF-,, et l'exécution de l'épilogue EF3. Ainsi, chaque donnée sauvegardée dans la pile 46 par la fonction Fi est chiffrée à l'aide de la valeur iv,, qui est différente de la valeur iv'. [0189] Lors d'une étape 238, lorsque l'exécution de la fonction F1 se termine, l'épilogue EF3 est exécuté. L'exécution de l'épilogue EF3 provoque, en plus de l'exécution des opérations conventionnelles d'un épilogue : 1) Le déchiffrement du cryptogramme ivisbn't contenu dans la première ligne de données du bloc 212 et le chargement de la valeur déchiffrée dans le registre ivisbi (exécution de l'instruction « LoadIV ra »), puis 2) Un saut sur la première ligne d'instruction du bloc 212 (exécution de l'instruction 33 « BranchIV ra »), puis 3) Le remplacement de la valeur iv, contenue dans le registre iv1, par la valeur iv' (exécution de l'instruction « LoadIV »), puis 4) Le chargement à partir de la pile 46 de l'adresse @ra2 dans le registre ra (exécution de l'opération « Load ra, @j »). [0190] Les opérations 1) et 2) ci-dessus ont déjà été décrites en détails dans le chapitre III. [0191] Lors de l'opération 3) ci-dessus, le cryptogramme iv," est lu dans la pile 46 puis déchiffré à l'aide de la valeur contenue dans le registre ivpite, c'est-à-dire à l'aide de la valeur iv. [0192] Lors de l'opération 4) ci-dessus, le cryptogramme @ra2* est lu dans la pile 46 et déchiffré à l'aide de la valeur courante contenue dans le registre ivpie, c'est-à-dire à ce stade, à l'aide de la valeur iva. [0193] Ensuite, lors d'une étape 240, l'exécution de la fonction F, se poursuit en utilisant la valeur iv' contenue dans le registre pour déchiffrer et chiffrer les données DF2 sau- vegardées dans la pile 46. [0194] Lors d'une étape 242, lorsque l'exécution de la fonction F2 est terminée, l'exécution de la fonction F, reprend. Pour cela, le branchement vers l'adresse @ra2 contenue dans le registre ra est exécuté. Ici le basculement de l'exécution de la fonction F, vers la fonction F2, puis le retour de l'exécution de la fonction Fo vers la fonction F, sont mis en oeuvre comme décrit en détails dans le cas des fonctions Ei et F3. [0195] Si une attaque par dépassement de tampon est mise en oeuvre en forçant la fonction F 3 à enregistrer une donnée qui dépasse la taille allouée pour sauvegarder les données DEI, alors le cryptogramme @ra2' peut être remplacé par un autre cryptogramme noté @rat*. Puisque le remplacement du cryptogramme @ra2* par le cryptogramme @rat* intervient au cours de l'exécution de la fonction F', le cryptogramme @rat* est le résultat du chiffrement d'une adresse @rat à l'aide de la valeur ivb actuellement contenue dans le registre ivoc. [0196] Lors de l'exécution de l'épilogue EF;, le cryptogramme @rat* est déchiffré à l'aide de la valeur iva et non pas à l'aide de la valeur iv,. Dès lors, l'adresse de retour déchiffrée est différente de l'adresse @rat. L'attaquant ne peut donc pas choisir l'adresse vers laquelle le flot de contrôle est détourné. [0197] Enfin, dans ce mode de réalisation qui met aussi en oeuvre ce qui a été décrit dans le chapitre IV, l'attaquant ne connaît pas les clés ka et k'. Il ne peut donc pas construire correctement un code MAC; et le cryptogramme CD;* correspondant à l'adresse @rat. Ainsi, si la ligne de donnée contenant le cryptogramme @ra2' est remplacée par une ligne de donnée contenant le cryptogramme @rat*, un tel remplacement est détecté lors des opérations 270 et 276 de vérification. Ainsi, une erreur d'exécution est détectée avant l'exécution du bloc 214. 34 [0198] CHAPITRE VI: SECURISATION DES DONNEES [0199] Le code binaire 30, en plus du code machine 32, peut comporter des données à traiter lors de l'exécution du code machine 32. De plus, lors de l'exécution du code machine 32, celui-ci peut générer des données. Ces données sont typiquement contenues dans la partie 44 de la mémoire 4. [0200] Ce qui a été décrit dans le chapitre IV pour sécuriser les données sauvegardées dans la pile 46 est, de préférence, également mis en oeuvre pour sécuriser les données enregistrées dans la partie 44. En particulier, chaque donnée enregistrée dans la partie 44 est codée dans une ligne LD dont la structure est identique à ce qui a été décrit dans le cas de la pile 46. Des lors, l'écriture et la lecture dune donnée dans la partie 44 sont réalisés comme décrit au chapitre IV sauf que le terme "pile 46" est remplacé par le terme "partie 44". [0201] CHAPITRE VII: GENERATION DU CODE BINAIRE [0202] La figure 13 représente un compilateur 300 apte à générer automatiquement le code binaire 30 à partir d'un code source 302. À cet effet, le compilateur 300 comporte typiquement un microprocesseur 304 programmable et une mémoire 306. La mémoire 306 contient les instructions et les données nécessaires pour, lorsqu'elles sont exécutées par le microprocesseur 304, générer automatiquement le code binaire 30 à partir du code source 302. En particulier, lors de la compilation du code source 302, le microprocesseur 304 génère automatiquement les vecteurs d'initialisation ivk appropriés et les lignes de code LI; et LD. Lors de cette compilation, le compilateur 300 introduit également automatiquement dans le code machine les instructions précédemment décrites pour la mise en oeuvre des procédés des figures?, 9 et 11. La conception et la réalisation d'un tel compilateur sont à la portée de l'homme du métier à partir des explications données dans cette description. Par exemple, pour cela, le compilateur 30 repère et identifie automatiquement les instructions de branchement et, en fonction de l'instruction de branchement identifiée, introduit automatiquement avant et/ou après les instructions nécessaires pour la mise en oeuvre des procédés décrits ici. [0203] CHAPITRE VIII: VARIANTES: [0204] Variantes de l'appareil 1 : [0205] La mémoire 4 peut aussi être une mémoire non volatile. Dans ce cas, il n'est pas né- cessaire de copier le code binaire 30 à l'intérieur de cette mémoire avant le lancement de son exécution puisqu'il s'y trouve déjà. [0206] En variante, la mémoire 4 peut aussi être une mémoire interne intégrée à l'intérieur du microprocesseur 2. Dans ce dernier cas, elle est réalisée sur le même substrat que les autres éléments du microprocesseur 2. Enfin, dans d'autres configurations, la mémoire 4 se compose de plusieurs mémoires dont certaines sont des mémoires internes et d'autres des mémoires externes. [0207] La mémoire principale 4 peut comporter une première mémoire volatile de grande capacité et une seconde mémoire volatile de plus petite capacité mais dans laquelle les opérations de lecture et d'écriture sont plus rapides. La deuxième mémoire est connue sous le terme de « mémoire cache ». La mémoire cache peut être une mémoire externe au microprocesseur 2 ou une mémoire interne du microprocesseur 2. Dans certains modes de réalisation, plusieurs mémoires caches de niveaux différents peuvent être utilisées. [0208] De nombreuses architectures matérielles différentes sont possibles pour réaliser le module 28. En particulier, le module 28 peut être composé par la combinaison de plusieurs blocs matériels du microprocesseur 2 remplissant des fonctions respectives et situés chacun dans une aire différente de la puce du microprocesseur 2. [0209] Dans un autre mode de réalisation, le module 28 est remplacé par un module logiciel qui, lorsqu'il est exécuté par l'unité 10, réalise les mêmes fonctions et opérations que celles décrites pour le module 28. [0210] Variantes de la sécurisation du code machine : [0211] En variante, seule la structure du deuxième type décrite en référence à la figure 5 est utilisée pour tous les blocs de base du code machine 32. Dans ce cas, ce qui a précédemment été décrit dans le cas particulier des branchements indirects et aussi mis en oeuvre pour les branchements directs. [0212] D'autres modes de réalisation du contenu de la première ligne d'un bloc BBk du deuxième type sont possibles. Par exemple, ce contenu n'est pas nécessairement chiffré. Dans une autre variante, ce contenu est chiffrée en utilisant une autre clé que l'adresse @k de la première ligne. Par exemple, le contenu de la première ligne est seulement chiffré avec la clé ka. Le contenu de la première ligne peut aussi contenir, à la place du cryptogramme ivisbi*, un cryptogramme @,,;* d'une adresse @kti. Dans ce cas, lorsque l'instruction "LoadIV ra" ou "LoadIV rd" est exécutée, elle provoque la lecture et le déchiffrement du cryptogramme pour obtenir l'adresse Ensuite, le contenu à partir duquel sont construits les 32 bits de poids faible du vecteur iv k est lu à l'adresse [0213] D'autres modes de réalisation sont possibles pour construire le vecteur iv, à partir de l'adresse @k. Par exemple, une table d'association est chargée dans la mémoire 29 avant ou au début de l'exécution du code 32. Cette table associe à chaque adresse @k d'un bloc BBk du deuxième type, le contenu qui permet de construire les 32 bits de poids faible du vecteur iv. Par exemple, ce contenu est identique à celui décrit dans le cas où il est enregistré dans la première ligne du bloc de base du deuxième type. Le fonctionnement de ce mode de réalisation est identique à celui précédemment décrit sauf que l'instruction "LoadIV ra" ou "LoadIV rd" provoque, lorsqu'elle est exécutée par le microprocesseur 2, la lecture du contenu du registre ivisbi à partir de la table 36 d'association et non pas dans la première ligne du bloc de base BBk. Dans ce cas, les blocs de base du deuxième type sont remplacés par des blocs de base du premier type et l'instruction "BranchIV rd" ou "BranchIV ra" est modifiée pour provoquer un saut vers la première ligne du bloc de base suivant et non pas vers la deuxième ligne de ce bloc de base. [0214] Il n'est pas non plus nécessaire de construire le vecteur iv, en utilisant les contenus des registres ivbi et iv,ei. Par exemple, en variante, les contenus des registres ivb; et ive,ei sont construits à partir du contenu du registre ivisbi. Par exemple, le vecteur ivk codé sur 128 bits est obtenu en concaténant les 32 bits du registre iv,'; quatre fois avec eux-mêmes. Dans ce cas, les registres iv''bi et ivcrei peuvent être omis. [0215] En variante, certaines fonctions ou parties du code binaire 30 ne sont pas sécurisées. Pour gérer l'exécution d'un tel code binaire qui comporte à la fois une fonction sécurisée et des fonctions non-sécurisées, le jeu d'instructions du microprocesseur 2 peut être complété par : - une instruction d'activation d'un mode sécurisé de fonctionnement du microprocesseur 2, et - une instruction de désactivation de ce mode sécurisé. [0216] Dans ce cas, l'instruction d'activation du mode sécurisé se trouve dans le code binaire 30 juste avant l'appel à la fonction sécurisée et l'instruction de désactivation du mode sécurisé se trouve juste après la fin de la fonction sécurisée. Lorsque l'instruction d'activation du mode sécurisé est chargée par le microprocesseur 2, en réponse, le module 28 commence à traiter les instructions et les données suivantes du code binaire comme décrit dans les chapitres précédents. Lorsque l'instruction de désactivation du mode sécurisé est chargée par le microprocesseur 2, en réponse, le module 28 est désactivé. Dans ce dernier cas, le traitement des instructions et des données suivantes du code binaire ne sont pas traitées par le module 28 mais directement chargées dans la file 22 ou dans les registres de l'ensemble 12. [0217] En variante, une instruction « update » est ajoutée au jeu d'instructions du micro- processeur. Lorsque cette instruction « update » est exécutée par le microprocesseur 2, elle provoque le chargement, dans le registre iv,,,,i, de la valeur actuellement contenue dans le registre ivbra',,. Dès lors, dans ce cas, l'utilisation d'un nouveau vecteur d'initialisation iv, est déclenchée autrement que par l'exécution d'une instruction de branchement. Dans ce cas, le procédé décrit peut aussi être mis en oeuvre avec des instructions de branchement implicites. En effet, la dernière instruction d'un bloc de base qui se termine par une instruction de branchement implicite, est alors l'instruction « update ». Au lieu d'implémenter une instruction « update » en tant qu'instruction à part dans le jeu d'instructions du microprocesseur, il est possible d'ajouter un bit supplémentaire à chaque instruction du jeu d'instructions du microprocesseur 2 et de dé- 37 clencher le changement de vecteur d' initial isation ivk uniquement lorsque ce bit supplémentaire prend une valeur spécifique. [0218] Le code ECC4 peut être remplacé par un simple code détecteur d'erreur permettant seulement de détecter une erreur dans l'instruction I, avec laquelle il est concaténé. Un code détecteur d'erreur ne permet pas de corriger l'erreur détectée. Dans ce cas, l'opération 186 de correction de l'erreur est omise. Dès lors, dès que le module 28 détecte une erreur dans une instruction fi déchiffré, par exemple, l'exécution de la fonction sécurisée est systématiquement interrompue. [0219] Dans une variante simplifiée, le code ECCg est omis. Dans cc cas, le cryptogramme Cli* est seulement le cryptogramme de l'instruction I. Dans ce mode de réalisation, le microprocesseur 2 n'est plus capable de détecter une modification de l' instruction 1, qui interviendrait entre l'instant où celle-ci est enregistrée dans la file 22 et l'instant où elle est exécutée par l'unité 10. [0220] Le code ECC, ; peut être remplacé par un simple code détecteur d'erreur Dans ce cas, l'opération 174 de correction est omise. [0221] Dans une autre variante, le code ECCH est construit de manière à permettre seulement la détection d'une erreur, soit seulement dans le cryptogramme C1;* soit seulement dans le code MAC;. [0222] Le code ECC, ; peut être omis. Dans cc cas, une erreur dans le cryptogramme Cl;* ou dans le code MAC; ne peut être détectée que lors de l'exécution de l'opération 176 de vérification de l'intégrité et de l'authenticité du cryptogramme. La détection d'une erreur à l'aide d'un code MAC est généralement plus complexe qu'à l'aide d'un simple code détecteur d'erreur ou d'un simple code correcteur d'erreur. De plus, lorsque le code ECCH est omis, dans le cas où il existe une erreur dans le cryptogramme CI;* ou le code MAC;, il n'est pas possible de corriger cette erreur. Dans ce dernier cas, par exemple, l'exécution de la fonction sécurisée est donc systématiquement interrompue en cas d'erreur. [0223] Dans un autre mode de réalisation, c'est le code MAC; qui est omis. L'opération 176 est alors également omise. [0224] Variantes de la sécurisation des données : [0225] La structure des lignes LD; utilisée pour sécuriser les données sauvegardée dans la mémoire 4 peut être modifiée. En particulier, les différentes variantes de la structure d'une ligne LI; décrites ci-dessus sont applicables à la structure des lignes LD;. Lorsque la structure de la ligne LD; est modifiée, le procédé de la figure 9 doit être adapté de façon correspondante pour tenir compte de ces modifications. Par exemple, si le code ECCD; est remplacé par un simple code détecteur d'erreur, alors l'opération 286 de correction de l'erreur est omise. Dès lors, dès que le module 28 détecte une erreur dans une donnée D; déchiffrée, par exemple, l'exécution de la fonction sécurisée est systé- 38 matiquemcnt interrompue. [0226] En variante, la fonction Fh, est identique à la fonction fice sauf qu'elle est appliquée à l'adresse @;. La fonction F. peut aussi utiliser le même algorithme de chiffrement que la fonction fk' mais avec une clé de chiffrement différente de la clé ka. [0227] Dans une variante simplifiée, la fonction fi,, est la fonction identité. Dans ce cas, les contenus des registres ivi'd et ivisbe sont systématiquement égaux à l'adresse @;. [0228] Dans d'autres modes de réalisation, pour détecter un déplacement d'une ligne LDJ, le code MAC; est calculé en fonction du vecteur ive. Par exemple, dans le cas d'une ligne de donnée LD; sauvegardée dans la pile 46, le code MAC; est calculé à partir de la concaténation du cryptogramme CD;" et du vecteur ive. Le code MAC; peut aussi être calculé à partir d'une combinaison du cryptogramme ov et du vecteur ive telle que la combinaison suivante : CD;* XOR ive. Dans le cas où le code MAC; dépend du vecteur ive, alors il peut être utilisé à la place du code ECCD; pour détecter une erreur en cas de déplacement de la ligne LD, dans la pile 46. En effet, dans ce cas, lors de la vérification de l'intégrité et de l'authenticité du cryptogramme CD,", le module 28 : - obtient le vecteur ive à partir du contenu des registres et puis - combine le cryptogramme CD;* avec le vecteur ive obtenu, puis - vérifie l'intégrité et l'authenticité de cette combinaison à partir du code MAC; contenu dans la même ligne LD,. Si cette ligne LE), a été déplacée, le vecteur ive obtenu est différent de celui attendu. Dès lors, l'intégrité de la combinaison du cryptogramme CD," et du vecteur iv,, ne peut pas être vérifiée, ce qui déclenche le signalement d'une faute d'exécution. On remarquera que dans ce mode de réalisation, il est possible de détecter un déplacement de la ligne LI:), sans même avoir à déchiffrer le cryptogramme CD,*. Dans cette variante, pour détecter un déplacement de la ligne LD,, le code ECCD, peut être omis. [0229] De façon similaire à ce qui a été décrit ci-dessus pour le code MACe le code ECC,,, peut aussi être construit de manière à dépendre du vecteur ive. Dans ce cas, le déplacement de la ligne LD, est détecté lors de la vérifications du code ECC,. Dès lors, pour détecter un déplacement de la ligne LD,, le code ECCD, peut être omis. [0230] Dans les modes de réalisation décrits jusqu'à présent, à la fois la donnée D, et le code ECCD, sont codés en fonction du vecteur ive puisque le cryptogramme CD," est chiffré à l'aide de ce vecteur ive,. En variante, soit seulement la donnée D, soit seulement le code ECCD, est codé en fonction du vecteur ive. Par exemple, dans la ligne de donnée, le cryptogramme de la donnée D; est obtenu à partir d'une fonction de chiffrement qui n'utilise pas le vecteur ive, tandis que le cryptogramme ECCD;* du code ECCD; est obtenu à l'aide de la fonction de chiffrement fka(ECCD; ; ive). Dans ce cas, lors de l'opération 278, le module 28 déchiffre le cryptogramme de la donnée D; sans utiliser le vecteur ive et déchiffre le cryptogramme ECCD;* en utilisant ce vecteur ive Ensuite, 39 le reste du procédé est identique à ce qui a déjà été décrit. Dans un mode de réalisation simplifiée, puisque la donnée IDJ n'a pas besoin d'être codée en fonction du vecteur ive, il est aussi possible de ne pas la chiffrer. Par exemple, la ligne de code contient alors la donnée IDJ en clair et le cryptogramme ECC,,J*. Dès lors, lors de l'opération 278, le déchiffrement de la donnée DJ est omis puisqu'il suffit de l'extraire de la plage de bits dans laquelle elle est contenue dans la ligne LDJ. [0231] A l'inverse, il est aussi possible de modifier la structure des lignes LDJ de manière à ce que seule la donnée DJ soit codée en fonction du vecteur ive. Par exemple, la ligne LDJ comporte un cryptogramme DJ* de la donnée DJ obtenue en la chiffrant à l'aide de la fonction fk'(DJ ; ive) et un cryptogramme ECC,,J* obtenu en chiffrant le code ECC'J à l'aide d'une fonction de chiffrement indépendante du vecteur ive. Lors de l'opération 270, le module 28 déchiffre le cryptogramme Di* à l'aide du vecteur ive et déchiffre le cryptogramme ECC'J* sans utiliser ce vecteur ive. [0232] Jusqu'à présent, c'est une fonction de chiffrement qui a été décrite comme exemple de mode de réalisation permettant de coder la donnée D, ou le code ECC,,, en fonction du vecteur iv,,. Cette fonction de chiffrement peut toutefois être aussi simple qu'une simple opération « OU Exclusif » logique entre la donnée DJ et le vecteur iv,, ou entre le code ECCD, et le vecteur iv,,. [0233] Toutes les variantes décrites dans le cas particulier de la sécurisation des données sauvegardées dans la pile 46 s'appliquent au cas de la sécurisation des données sauvegardées ailleurs dans la mémoire 4. En particulier, ces variantes s'applique à la ligne LDk de donnée des blocs de base du deuxième type. [0234] Variantes de la sécurisation de la pile d'exécution : [0235] La sécurisation de la pile 46 a été décrit dans le cas particulier où l'adresse de retour @ra2 est sauvegardée dans la pile uniquement au moment où la fonction F2 appelle la fonction F. Toutefois, ce qui a été décrit s'applique aussi aux situations où l'adresse de retour @ra2 est sauvegardée dans la pile 46 au moment où la fonction F2 est appelée par la fonction FI. Dans ce cas, ce qui a été précédemment décrit s'applique à l'identique sauf que c'est le prologue et l'épilogue de la fonction F2 qui sont modifiés. [0236] La nouvelle valeur iv,, contenue dans le registre iv1 peut être générée de nombreuses façons différentes. Par exemple, la nouvelle valeur Vh est égale à la valeur iv a auquel a été ajoutée un incrément prédéterminé. Dans ce cas, la valeur initiale contenue clans le registre iv1111 est par exemple une valeur prédéfinie chargée au démarrage du microprocesseur 2. [0237] Il existe d'autres possibilités pour chiffrer l'adresse @ra2 à l'aide d'un vecteur d'initialisation différent de celui utilisé pour chiffrer les données DF3. Par exemple, en variante, le prologue PF3 est modifié pour réaliser dans l'ordre les opérations suivantes lorsqu'il est exécuté par le microprocesseur 2 : 1) La valeur iv' contenue dans le registre ivpile est sauvegardée dans un registre ivrempi. 2) La valeur iv' contenue dans le registre ivpile est remplacée par une nouvelle valeur ivb générée, par exemple, de façon aléatoire comme précédemment décrit. 3) L'adresse @ra2 contenue dans le registre ra est sauvegardée dans la pile 46. Le cryptogramme @ra2* enregistré dans la pile 46 est donc le résultat du chiffrement de l'adresse @ra2 à l'aide de la valeur ivb actuellement contenue dans le registre ivpile. 4) La valeur iv, contenue dans le registre ivpile est sauvegardée dans un registre iv'p,. 5) La valeur iv, contenue dans le registre ivpile est remplacée par la valeur iva contenue dans le registre ivrempl. 6) La valeur iv, contenue dans le registre iv'p, est sauvegardée dans la pile 46. Le cryptogramme iv,* enregistré dans la pile 46 est donc le résultat du chiffrement de la valeur iv, à l'aide de la valeur iv' actuellement contenue dans le registre ivoe. [0238] Ensuite, au cours de l'exécution de la fonction F3, à chaque fois que des données sont sauvegardées dans la pile 46, celles-ci sont chiffrées à l'aide de la valeur iv' contenue dans le registre iv,,i,c. Ce mode de réalisation permet donc bien de chiffrer l'adresse @ra2 à l'aide d'un vecteur d' initial isation différent de celui utilisé pour chiffrer les données sauvegardées dans la pile 46 lors de l'exécution de la fonction F. Le fonctionnement de ce mode de réalisation se déduit des explications données en référence aux figures 10 à 12. [0239] D'autres modes de réalisation du prologue PF3 et de l'épilogue EFT,, sont possibles. Par exemple, moyennant l'utilisation de registres temporaires supplémentaires, l'ordre des opérations peut être modifié. Ainsi, par exemple, le cryptogramme Iva* peut être sauvegardé dans la pile 46 avant le cryptogramme @rar. Pour cela, par exemple, il faut successivement: 1) Sauvegarder la valeur iv' dans un registre temporaire 2) Générer et sauvegarder la valeur ivi, dans le registre iv,, 3) Sauvegarder dans la pile 46 le contenu du registre iv111,3, 4) Sauvegarder la valeur ivi, dans un registre 5) Restaurer la valeur iv' dans le registre iv1,11 à partir du contenu du registre 6) Sauvegarder dans la pile 46 le contenu du registre ra, 7) Restaurer la valeur ivi, dans le registre iv11 à partir du contenu du registre iv'4. [0240] En variante, seule l'adresse de retour est chiffrée avant d'être sauvegardée dans la pile 46. Les autres données sauvegardées dans la pile 46 ne sont pas chiffrées ou chiffrées à l'aide d'une autre clé. Par exemple, chaque adresse de retour sauvegardée dans la pile 46 est chiffrée, par le module 28, avec la clé ka tandis que les autres données sauvegardées dans la pile 46 ne sont pas chiffrées. Dans ce cas, si une donnée enregistrée dans la pile 46 provoque un dépassement de tampon qui remplace le cryptogramme @rar par une cryptogramme @rat*, alors, après l'exécution des fonctions 41 F3 et F,, l'exécution du code se poursuit par l'exécution de l'instruction située à l'adresse fka-1(@rat*). Or l'attaquant ne connaît pas la clé ka et ne connaît donc pas l'adresse correspondant à fka-1(@rat*). Il ne peut donc pas prévoir vers quelle adresse l'exécution du code 30 va être détournée. Cela rend donc aussi plus difficile les attaques par dépassement de tampon. [0241] Dans un mode de réalisation très simplifié, le chiffrement des données DF3 sau- vegardées dans la pile 46 n'est pas mis en oeuvre. Dans ce cas, la valeur iva et les données DF3 sauvegardées dans la pile 46 ne sont pas chiffrées. Toutefois, même dans cocas simplifié, le fait que l'adresse @ra2 sauvegardée dans la pile 46 soit chiffrée différemment de ce qui est fait pour les données DF3 rend les attaques par dépassement de tampon plus difficiles. [0242] Variantes communes aux différents chapitres précédents [0243] A partir du moment où une ligne de code comporte au moins un des éléments du groupe composé d'un code d'authentification de message, d'un code correcteur d'erreur et d'un code détecteur d'erreur, il est possible de détecter une modification du contenu de cette ligne. Ainsi, pour détecter une modification du contenu d'une ligne d'instruction ou d'une ligne de donnée, un seul quelconque des éléments de ce groupe est nécessaire. [0244] Dans un mode de réalisation très simplifié aucun des codes détecteur ou correcteur d'erreur et aucun des codes MAC; précédemment décrits ne sont mis en oeuvre. Dans ce cas, une erreur dans le déchiffrement d'une donnée ou d'une instruction peut conduire à l'incapacité pour l'unité 10 d'exécuter une instruction et donc à l'arrêt brutal de l'exécution du code machine 30. [0245] Le chiffrement et le déchiffrement ont été décrits dans le cas particulier où les fonctions fic' et fka ' sont des algorithmes de chiffrement qui utilisent un "vecteur d'initialisation" et, de préférence, aussi une clé secrète ka. Toutefois, les fonctions L. et ' peuvent aussi être des algorithmes de chiffrement/déchiffrement dans lesquels un vecteur d'initialisation n'est pas nécessaire. Toutefois, tout ce qui a été décrit ici s'applique à l'identique à un tel algorithme de chiffrement/déchiffrement en remplaçant simplement le terme "vecteur d'initialisation" par le terme "clé". [0246] La fonction utilisée pour générer le cryptogramme CD;* peut être différente de celle utilisée pour générer le cryptogramme CI;*. Par exemple, ces deux fonctions diffèrent par le fait qu'elles utilisent des clés de chiffrement différentes. [0247] Dans une autre variante, les clés ka et k' sont les mêmes. [0248] La clé ka peut être pré-enregistrée dans la mémoire 29. Dans ce cas, le cryptogramme ka* peut être omis du bloc 34. [0249] Le cryptogramme k'* de la clé k' chiffrée avec la clé publique pkcpu peut être en- registré dans le bloc 34. Dans ce cas, la clé k' n'a pas besoin d'être pré-enregistrée dans 42 la mémoire 29. [0250] Une ligne de code peut être plus longue qu'un mot-machine. Dans cc cas, chaque ligne de code se compose de plusieurs mots-machine généralement situés à des adresses mémoires immédiatement consécutives dans la mémoire 4. Dans ce cas, une ligne de code est chargée dans le microprocesseur 2 non pas en une seule opération de lecture, niais en exécutant plusieurs opérations de lecteur. Chaque opération de lecture charge dans le microprocesseur un mot-machine respectif de la ligne de code. [0251] En variante, l'opération 176 ou 276 se poursuit systématiquement par l'opération 178 ou 278 même si l'intégrité ou l'authenticité du cryptogramme n'a pas pu être confirmée. Dans ce cas, l'opération 176 ou 276 sert à déclencher le signalement d'une faute d'exécution sans interrompre l'exécution du code binaire. [0252] Selon le jeu d'instructions utilisé par le microprocesseur 2, les instructions décrites telles que "LoadIV", "BranchIV", "StoreIV" correspondent chacune à une seule instruction de ce jeu ou, au contraire, à un groupe de plusieurs instructions de ce jeu. [0253] Tout ce qui a été décrit au chapitre III peut être mise en oeuvre indépendamment de ce qui a été décrit dans les autres chapitres. Par exemple, les étapes 198 et 250 peuvent être omises et le procédé de la figure 11 n'est pas mis en oeuvre. [0254] Tout ce qui a été décrit au chapitre IV peut être mis en oeuvre indépendamment de cc qui a été décrit dans les autres chapitres. Par exemple, ce qui a été décrit au chapitre IV peut être mis en oeuvre : - dans le contexte d'un code machine dépourvu d'instruction de branchement indirect et d'instruction "LoadIV ra", - sans mettre en oeuvre l'enseignement du chapitre HI pour sécuriser les instructions du code machine, - sans mettre en oeuvre l'enseignement du chapitre V pour sécuriser la pile 46 contre les attaques par dépassement de tampon. [0255] Tout ce qui a été décrit au chapitre V peut également être mis en oeuvre indé- pendamment de ce qui a été décrit dans les autres chapitres. Par exemple, ce qui a été décrit au chapitre V peut être mis en oeuvre : - dans le contexte d'un code machine dépourvu d'instruction de branchement indirect et d'instruction "LoadIV ra", - sans mettre en oeuvre l'enseignement du chapitre HI pour sécuriser les instructions du code machine, - sans mettre en oeuvre l'enseignement du chapitre VI pour sécuriser les données enregistrées dans la partie 44 de la mémoire 4. [0256] Tous les modes de réalisation décrits dans ce texte et, en particulier, les différentes variantes, peuvent être combinés entre eux. [0257] CHAPITRE IX : AVANTAGES DES MODES DE RÉALISATION DÉCRITS: 43 [0258] Avantages de la sécurisation du code machine : [0259] Puisque le chargement du vecteur VIbi nécessaire au déchiffrement des lignes d'instructions du bloc de base BBk est déclenché lors de l'exécution du bloc de base BBk_E, l'intégrité du flot de contrôle est assurée. En effet, si suite à l'exécution du bloc de base BBEE_E, c'est un bloc de base BB, qui est exécuté au lieu du bloc de base BBk alors les lignes d'instruction du bloc de base B13, sont déchiffrées à l'aide du vecteur iv!. chargé. Les lignes d'instruction du bloc de base BB, ne sont donc pas déchiffrées à l'aide du vecteur iv, utilisé pour chiffrer ces lignes d'instruction du bloc de base BB,. Ainsi, le déchiffrement des lignes d'instruction du bloc B13Eest incorrect, cc qui est détecté. Il est donc difficile de détourner le flot d'exécution du bloc BBE, vers le bloc B13,. [0260] L'instruction de chargement indirect ne contient pas directement la valeur du vecteur ivk mais seulement l'identifiant d'un registre destiné à contenir l'adresse @k du bloc BBk. Ainsi, le bloc de base BBk , contient seulement des instructions qui permettent, au moment de l'exécution de ce bloc de base BBk 1, de construire ce vecteur ivk à partir du contenu du registre identifié. Dès lors, le bloc de base B131 , peut être compilé indépendamment du bloc de base suivant BBk. Grâce à cela, l'utilisation d'un branchement indirect à la fin d'un bloc de base est rendue possible tout en conservant la possibilité de contrôler et de garantir l'intégrité du flot de contrôle. [0261] Le fait d'enregistrer le contenu à charger dans le registre iv,i dans la première ligne du bloc de base du deuxième type permet de charger simplement ce contenu dans le microprocesseur. De plus, l'introduction d'une telle première ligne de donnée lors de la génération du code machine est simple. [0262] Le fait que le contenu à charger dans le registre iv11,1 soit enregistré dans la mémoire 4 sous forme chiffrée, augmente la sécurité. [0263] Le fait que le cryptogramme ivEshi* soit déchiffré en utilisant l'adresse @i rend la per- mutation, dans la mémoire 4, de deux blocs du deuxième type difficile et détectable. [0264] Le chiffrement des instructions I; permet de garantir la confidentialité du code binaire 30, ce qui rend le « Reverse Engineering » du code binaire très difficile. La vérification de l'intégrité du cryptogramme CIi* ou CD;* permet de détecter les modifications du code binaire provoquées, par exemple, par des attaques telles que l'injection de fautes dans la mémoire 4. Le fait de vérifier l'authenticité des instructions et des données permet de détecter et de rendre très difficile l'ajout d'instructions supplémentaires dans le code binaire 30 par un attaquant, par exemple, pour y introduire des logiciels malveillants tels que des virus. En effet, même si l'attaquant connaît l'algorithme utilisé pour chiffrer les instructions T ou les données Di, il ne connaît pas la clé secrète k' utilisée pour construire le code MAQ. [0265] La vérification, à l'aide du code ECCE; ou ECCDE, de l'existence d'une erreur dans 44 l'instruction 1, ou la donnée D, juste avant qu'elle soit utilisée permet de détecter une modification de cette instruction ou de cette donnée D. De telles modifications peuvent être provoquées par injection de fautes. Ainsi, l'utilisation du code ECCI, ou ECCD; permet de détecter cc type d'attaque. [0266] Le fait que le code ECC13 ou ECC', soit un code correcteur d'erreur et pas seulement un code détecteur d'erreur, permet de rendre le procédé d'exécution plus robuste vis-à-vis des attaques par injection de fautes. En effet, dans ce cas, le code correcteur d'erreur permet souvent de corriger l'erreur introduite dans l' instruction 1, ou dans la donnée 1D, de sorte que malgré la présence de telles erreurs, la fonction sécurisée continue de s'exécuter correctement. [0267] L'utilisation du code ECCL; permet de détecter plus rapidement une erreur dans le cryptogramme CI, ou CD;" ou dans le code MAC; que si seul le code MAC; était utilisé pour cela. L'utilisation du code ECCL; permet donc d'accélérer l'exécution du code binaire. [0268] L'utilisation d'un code correcteur d'erreur pour le code ECC, permet de rendre le procédé revendiqué plus robuste vis-à-vis des attaques par injection de fautes dans la mémoire 4 ou dans le support 6. En effet, dans ce cas, le code correcteur d'erreur permet souvent de corriger le cryptogramme CI r ou CD;* ou le code MAC; de sorte que malgré la présence de telles erreurs, la fonction sécurisée s'exécute correctement. [0269] Avantages de la sécurisation contre les attaques par dépassement de tampon : [0270] Le fait de chiffrer l'adresse @ra2 de la fonction appelante F2 avec une valeur iva différente de la valeur ivb utilisée lors de la sauvegarde des données DF; de la fonction F3 appelée permet de rendre plus difficile les attaques par dépassement de tampon. [0271] Le fait de chiffrer les données enregistrées dans la pile 46 renforce la sécurité du procédé. [0272] Le fait de chiffrer les données sauvegardées dans la pile en fonction d'une valeur qui dépend en plus de l'adresse où la donnée est sauvegardée dans la pile permet d'autoriser un accès aléatoire aux données chiffrées et sauvegardées dans la pile 46, tout en rendant difficile la permutation de deux lignes de données enregistrées dans cette pile d'exécution. [0273] L'utilisation d'un code détecteur d'erreur associé à chaque donnée sauvegardée dans la pile d'exécution permet de détecter si le déchiffrement d'une donnée s'est correctement déroulé avant que cette donnée ne soit exploitée et traitée lors de l'exécution du code machine 30. [0274] Le déchiffrement et le chiffrement de l'adresse era2 en plus à l'aide de la clé ka seulement connue et stockée dans le module 28 permet de rendre encore plus difficile la mise en oeuvre d'une attaque par dépassement de tampon. [0275] Utiliser un code correcteur d'erreur en tant que code ECCE); permet, en plus. de corriger une erreur détectée. Cela permet donc de poursuivre l'exécution de la fonction sécurisée même si une erreur a été signalée. 46 [Revendication I]