FR 3095869 A1 20201113 FR 1904818 A 20190509 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 la demande EP3457620A1. Dans cette demande, chaque ligne LD, de donnée enregistrée dans la mémoire principale à une adresse @, comporte un cryptogramme CD,* de la donnée D, enregistrée dans la mémoire. Ce cryptogramme CD,* est construit en utilisant un vecteur d'initial isation iv, qui dépend de l'adresse @, à laquelle la ligne LD, est enregistrée. Ensuite, en réponse à l'exécution d'une instruction de chargement d'une ligne de donnée à partir de l'adresse un vecteur iv, est construit à partir de cette adresse Ensuite, le cryptogramme CD,* contenu dans la ligne chargée est déchiffré en utilisant le vecteur iv, construit. Si la ligne LE), a été construite pour être enregistrée à une adresse @,d puis déplacée à l'adresse @, sans que ce déplacement soit réalisé par le microprocesseur, alors le vecteur iv, construit n'est pas le même que celui utilisé pour construire le cryptogramme CDi". Le déchiffrement de la donnée Di est donc incorrect dans ce cas. Ce déchiffrement incorrect déclenche le signalement d'une faute d'exécution. Ainsi, le procédé décrit dans la demande EP3457620A1 permet de détecter un déplacement malveillant d'une ligne de donnée. [0008] En plus, dans la demande EP3457620A1, chaque ligne d'instruction LI; enregistrée dans la mémoire principale comporte un cryptogramme Cl)* de l'instruction à exécuter. Ce cryptogramme Cli* est construit en utilisant un vecteur iv, associé au bloc de base BBk qui contient cette ligne d'instruction. La valeur correcte du vecteur iv, à utiliser pour déchiffrer les lignes d'instruction du bloc BBI est chargée dans le microprocesseur uniquement lors de l'exécution du bloc de base précédent BBI ,. Ainsi, si un attaquant provoque un détournement du flot de contrôle qui conduit à exécuter un bloc BB, au lieu du bloc BBk, alors les lignes d'instructions du bloc BB,ne sont pas correctement déchiffrées En effet, dans ce cas, c'est le vecteur iv, qui est utilisé pour déchiffrer les lignes d'instruction du bloc BB, et non pas le vecteur iv, associé à ce bloc BB,. Grace cela le procédé de la demande EP3457620A1 pet-met de vérifier l'intégrité du flot de contrôle. [0009] En parallèle de l'exécution de la fonction sécurisée, le microprocesseur peut exécuter une phase de réagencement de la mémoire principale. Une telle phase de réagencement de la mémoire principale permet de réorganiser l'agencement des lignes de la mémoire principale. Cette phase permet, par exemple, d'optimiser le fonctionnement de la mémoire principale et/ou d'allouer de la mémoire principale à un nouveau programme à exécuter. L'exécution de cette phase de réagencement conduit normalement à déplacer des lignes d'instruction et de donnée. Plus précisément, pour chaque ligne à déplacer, une instruction de chargement de cette ligne dans le microprocesseur est exécutée. Ensuite, une instruction d'enregistrement de la ligne chargée à un autre cm- 3 placement dans la mémoire principale est exécutée. Autrement dit, chaque ligne déplacée est traitée comme s'il s'agissait d'une ligne de donnée. Dès lors, comme décrit dans la demande EP3457620A1, l'exécution de l'instruction de chargement par le microprocesseur déclenche notamment la vérification que le cryptogramme CD,* contenu dans la ligne chargée a bien été construit à l'aide du vecteur iv, correspondant à l'adresse @, à partir de laquelle cette ligne a été chargée. Dans le cas où la ligne déplacée est une ligne de donnée, cette vérification, lors d'un fonctionnement normal, ne déclenche pas le signalement d'une faute d'exécution. Ainsi, le déplacement des lignes de donnée ne pose pas de problème particulier. [0010] Par contre si la ligne déplacée est une ligne d'instruction, alors le microprocesseur vérifie si le cryptogramme Cl,* a bien été construit à partir du vecteur iv, correspondant à l'adresse @, à partir de laquelle cette ligne a été chargée. Or, cc n'est jamais le cas puisque le cryptogramme CI,* est construit à l'aide du vecteur ivk associé au bloc de base BBk auquel appartient cette ligne. Le vecteur ivis est indépendant de l'adresse @. Dès lors, le déplacement d'une ligne d'instruction provoque systématiquement le signalement d'une faute d'exécution. Autrement dit, il n'est pas possible de déplacer les lignes d'instruction. [0011] Cette demande EP3457620A1 divulgue aussi une variante dans laquelle le cryp- togramme Cl* de chaque ligne d'instruction est construit de la même manière que le cryptogramme CD;*. Le cryptogramme Cl* est donc construit en chiffrant la concaténation CI; à l'aide du vecteur iv i correspondant à l'adresse @i où cette ligne d'instruction est enregistrée dans la mémoire principale. Dans cette variante, le vecteur iv k n'est plus utilisé. Cette variante est intéressante car, dans ce cas, le déplacement de lignes d'instruction lors de la phase de réagencement ne déclenche plus systématiquement le signalement d'une faute d'exécution. Par contre, dans cette variante, il n'est plus possible de vérifier l'intégrité du flot de contrôle puisque le vecteur iv k ne peut plus être utilisé. [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 possibilités suivantes : - sécuriser les données et, en particulier, sécuriser les données contre des déplacements malveillants de ces données dans la mémoire principale, - sécuriser le code machine contre les attaques qui provoquent un détournement du flot de contrôle, et - permettre l'exécution de la phase de réagencement des lignes de la mémoire principal même si pour cela il faut déplacer des lignes d'instruction. [0013] L'invention a donc pour objet un tel procédé d'exécution d'un code binaire d'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 ligne d'instructions contenant chacune un cryptogramme d'une instruction, les instructions codées dans ces lignes d'instructions successives étant destinées à être exécutées par le microprocesseur systématiquement dans l'ordre où elles apparaissent dans ce bloc de base, - 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 est fonction d'un masque associé à ce bloc de base, ce masque étant différent des masques associés aux autres blocs de base, - chaque bloc de base précédent contient une ligne d'instruction contenant le cryptogramme d'une instruction de chargement d'un masque qui, lorsqu'elle est exécutée par le microprocesseur, provoque le chargement, dans le microprocesseur, du masque à utiliser pour obtenir une instruction à partir du cryptogramme de chaque ligne d'instruction du bloc de base suivant, b) l'exécution du code binaire par le microprocesseur, lors de cette exécution le procédé comporte : - l'enregistrement de données dans la mémoire principale, pour chaque donnée à enregistrer, le procédé comportant : l'exécution d'un algorithme de construction d'une ligne de donnée contenant un cryptogramme de cette donnée construit à l'aide d'un vecteur d'initialisation iv i associé à une adresse @i de la mémoire principale par une relation iv i = Fiv(@;), où la fonction Fi, est une fonction préprogrammée qui associe un vecteur d'initialisation iv i différent à chaque adresse @i différente de la mémoire principale, puis l'enregistrement, dans la mémoire principale, de cette ligne de donnée construite à l'adresse @i, - l'exécution, par l'unité arithmétique et logique, d'une instruction de chargement de la ligne de donnée, cette instruction de chargement comportant un opérande à partir duquel est obtenu l'adresse @; où est enregistrée la ligne de donnée à charger depuis la mémoire principale, suivie de la vérification que la ligne de donnée chargée a bien été construite à l'aide du vecteur d'initialisation ivj associé à cette adresse @; par la fonction Fiv, et lorsque cette vérification échoue, le déclenchement du signalement d'une faute d'exécution et, lorsque cette vérification réussie l'inhibition du signalement de cette faute d'exécution, - l'exécution de blocs de base précédent et suivant et lors de l'exécution de chaque instruction du bloc de base suivant : le chargement, à partir de la mémoire principale, de la ligne d'instruction désignée par un compteur ordinal du microprocesseur, suivi du déchiffrement du cryptogramme contenu dans la ligne d'instruction chargée en utilisant le masque chargé dans le microprocesseur lors de l'exécution du bloc de base précédent, puis l'exécution, par une unité arithmétique et logique du microprocesseur, de l'instruction déchiffrée, dans lequel chaque ligne d'instruction d'un bloc de base est construite en exécutant le même algorithme de construction que celui exécuté pour construire la ligne de donnée et en utilisant la même fonction Fiv, la donnée étant prise égale pour cela à l'instruction masquée à l'aide du masque associé à ce bloc de base, de sorte que le chargement de cette ligne d'instruction par l'exécution d'une instruction de chargement d'une ligne de donnée ne déclenche pas systématiquement le signalement d'une faute d'exécution. [0014] Les modes de réalisation de cc procédé d'exécution peuvent comporter une ou plusieurs des caractéristiques suivantes : le procédé comporte une phase de M'agencement de la mémoire principale lors de laquelle des lignes d'instructions sont déplacées dans la mémoire principale, cette phase de réagencement de la mémoire principale comportant pour chaque ligne d'instruction déplacée : - l'exécution, pal- l'unité arithmétique et logique, d'une instruction de chargement d'une ligne de donnée dans laquelle l'adresse obtenue à partir de l'opérande est l'adresse de la ligne d'instruction à déplacer, puis - la vérification, de la même manière que pour toute ligne de donnée chargée, que la ligne d'instruction ainsi chargée à bien été construite à l'aide du vecteur d'initialisation ivi, associé, par la fonction Fiv, à l'adresse @ii obtenue à partir de l'opérande de l'instruction de chargement, et lorsque cette vérification échoue, le déclenchement du signalement d'une faute d'exécution et, lorsque cette vérification réussie, l'inhibition de ce signalement (l'une faute d'exécution; - lors de l'étape b), le chargement de la ligne d'instruction désignée par le compteur ordinal du microprocesseur, est également systématiquement suivi par la vérification, de la même manière que pour la ligne de donnée, que la ligne d'instruction chargée à bien été construite à l'aide du vecteur d'initialisation iv; associé, par la fonction Fiv, à l'adresse @; désignée par le compteur ordinal, et lorsque cette vérification échoue, le déclenchement du si- 6 gnalemcnt d'une faute d'exécution et, lorsque cette vérification réussie, l'inhibition de ce signalement d'une faute d'exécution; le déchiffrement du cryptogramme contenu dans la ligne d'instruction chargée comporte : - un déchiffrement du cryptogramme à l'aide du vecteur d'initialisation ivi associé, par la fonction Fin à l'adresse @; désignée par le compteur ordinal pour obtenir une instruction masquée déchiffrée, - l'exécution d'une fonction prédéterminée d'évolution pour obtenir un masque dérivé du masque chargé, le masque dérivé obtenu étant différent à chaque exécution de cette fonction d'évolution, puis - un déchiffrement de l'instruction masquée déchiffrée à l'aide du masque dérivé obtenu pour obtenir l'instruction déchiffrée exécutée par l'unité arithmétique et logique; la fonction d'évolution est choisie dans le groupe composé : - d'une fonction de permutation, - d'un registre à décalage à rétroaction linéaire, - d'un chiffrement pas flot, - d'une combinaison bit-à-bit entre les bits du masque chargé et des bits susceptibles de varier à chaque exécution d'une précédente instruction du même bloc de base, et - d'une composition d'une ou plusieurs des fonctions précédentes; les bits susceptibles de varier à chaque exécution d'une précédente instruction du même bloc de base sont choisis dans le groupe composé : - des bits d'une précédente instruction du même bloc de base, et - des bits de contrôle de l'exécution d'une précédente instruction du même bloc de base, ces bits de contrôle étant des bits distincts des bits des instructions et mis à jour par le microprocesseur à chaque exécution d'une instruction; chaque exécution de l'algorithme de construction d'une ligne de donnée à enregistrer à une adresse @i comporte : - le calcul d'un vecteur d'initialisation iv i à l'aide de la relation iv i = Fiv(@ où @i est l'adresse à laquelle la ligne de donnée doit être enregistrée dans la mémoire principale, - la construction d'un code détecteur d'erreur permettant de détecter une erreur dans la donnée, - la concaténation du code détecteur d'erreur construit avec la donnée pour obtenir une concaténation CDi, puis - le chiffrement de la concaténation CD ; à l'aide du vecteur d'initialisation iv i calculé pour obtenir le cryptogramme de la donnée, puis - l'incorporation du cryptogramme de la donnée dans la ligne de donnée construite, chaque vérification que la ligne de donnée chargée a bien été construite à l'aide du vecteur d'initialisation iv; associé, par la fonction Fin à une adresse @; à partir de 7 laquelle cette ligne de donnée a été chargée, est précédée par les opérations suivantes : - le calcul d'un vecteur d'initialisation ivi à l'aide de la relation ivi = Fiv(@;), où @; est l'adresse à partir de laquelle la ligne de donnée a été chargée depuis la mémoire principale, puis - le déchiffrement du cryptogramme de la donnée contenue dans la ligne de donnée chargée à l'aide du vecteur d'initialisation ivi calculé pour obtenir une concaténation déchiffrée, puis chaque vérification que la ligne de donnée chargée a bien été construite à l'aide du vecteur d'initialisation ivi associé, par la fonction Fin à une adresse @; à partir de laquelle cette ligne de donnée a été chargée, comporte : - l'utilisation du code détecteur d'erreur contenu dans la concaténation déchiffrée, pour détecter une erreur dans la donnée contenue dans cette concaténation déchiffrée, et - si une erreur est détectée, la vérification que la ligne de donnée chargée a bien été construite à l'aide du vecteur d'initialisation iv i associé, par la fonction F1,, à l'adresse @i à partir de laquelle cette ligne de donnée a été chargée, échoue et, dans le cas contraire, la vérification réussie; la phase de réagencement comporte également pour chaque ligne d'instruction chargée : - le déchiffrement du cryptogramme de la concaténation contenue dans la ligne d'instruction chargée pour obtenir une instruction masquée, puis - l'exécution de l'algorithme de construction d'une ligne de donnée avec une donnée égale à cette instruction masquée pour obtenir une nouvelle ligne d'instruction destinée à être enregistrée dans la mémoire principale à une adresse @i2 différente de l'adresse @il, puis - l'enregistrement, dans la mémoire principale, de la nouvelle ligne d'instruction construite à l'adresse @; l'algorithme de construction construit le cryptogramme de la donnée également en utilisant une clef secrète indépendante de l'adresse @i; lors de l'étape a), les blocs de base enregistrés 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 8 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 masque à partir du contenu de cette ligne de donnée lue, puis - le chargement de ce masque construit dans le microprocesseur, - l'étape c) 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; la ligne de donnée associée à l'adresse obtenue à partir du contenu du registre de destination est la première ligne de chaque bloc de base suivant, cette ligne de donnée, contrairement à une ligne d'instruction, ne codant aucun opcode d'une instruction exécutable par le microprocesseur. [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 ligne d'instructions contenant chacune un cryptogramme d'une instruction, les instructions codées dans ces lignes d'instructions successives étant destinées à être exécutées par le microprocesseur systématiquement dans l'ordre où elles apparaissent dans ce bloc de base, - 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 est fonction d'un masque associé à ce bloc de base, ce masque étant différent des masques associés aux autres blocs de base, - chaque bloc de base précédent contient une ligne d'instruction contenant le cryptogramme d'une instruction de chargement d'un masque qui, lorsqu'elle est exécutée par le microprocesseur, provoque le chargement, dans le microprocesseur, du masque à utiliser pour obtenir une instruction à partir du cryptogramme de chaque ligne d'instruction du bloc de base suivant, - le code machine comporte aussi des instructions qui, lorsqu'elles sont exécutées par le microprocesseur, provoque : 9 - l'enregistrement de données dans la mémoire principale et pour chaque donnée à enregistrer : l'exécution d'un algorithme de construction d'une ligne de donnée contenant un cryptogramme de cette donnée construit à l'aide d'un vecteur d'initialisation iv, associé à une adresse @, de la mémoire principale par une relation iv, = F(@,), où la fonction Fi,/ est une fonction préprogrammec qui associe un vecteur d'initialisation iv différent à chaque adresse @, différente de la mémoire principale, puis l'enregistrement, dans la mémoire principale, de cette ligne de donnée construite à l'adresse @,, - l'exécution, par l'unité arithmétique et logique, d'une instruction de chargement de la ligne de donnée, cette instruction de chargement comportant un opérande à partir duquel est obtenu l'adresse @, où est enregistrée la ligne de donnée à charger depuis la mémoire principale, suivie de la vérification que la ligne de donnée chargée a bien été construite à l'aide du vecteur d'initialisation iv i associé à cette adresse @ par la fonction Fi' et lorsque cette vérification échoue, le déclenchement du signalement d'une faute d'exécution et, lorsque cette vérification réussie l'inhibition de ce signalement d'une faute d'exécution, - l'exécution de blocs de base précédent et suivant et lors de l'exécution de chaque instruction du bloc de base suivant : le chargement, à partir de la mémoire principale, de la ligne d'instruction désignée par un compteur ordinal du microprocesseur, suivi du déchiffrement du cryptogramme contenu dans la ligne d'instruction chargée en utilisant le masque chargé dans le microprocesseur lors de l'exécution du bloc de base précédent, puis l'exécution, par une unité arithmétique et logique du microprocesseur, de l'instruction déchiffrée dans lequel chaque ligne d'instruction d'un bloc de base est construite de la même manière que la ligne de donnée et en utilisant la même fonction Fin la donnée étant égale pour cela à l'instruction masquée à l'aide du masque associé à ce bloc de base, de sorte que le chargement de cette ligne d'instruction pal- l'exécution d'une instruction de chargement d'une ligne de donnée ne déclenche pas systématiquement le signalement d'une faute d'exécution. [0016] L'invention a également pour objet un support d'enregistrement d'informations lisible par un microprocesseur, ce support d'enregistrement d'informations comportant le code binaire revendiqué. [0017] L'invention a également pour objet un microprocesseur pour la mise en oeuvre du procédé revendiqué, ce microprocesseur étant configuré pour exécuter les étapes suivantes : - l'enregistrement de données dans la mémoire principale et pour chaque donnée à enregistrer, exécuter les opérations suivantes : l'exécution d'un algorithme de construction d'une ligne de donnée contenant un cryptogramme de cette donnée construit à l'aide d'un vecteur d'initialisation iv, associé à une adresse @, de la mémoire principale par une relation iv, = F(@,), où la fonction Eh, est une fonction préprogramtnéc qui associe un vecteur d' initial isation iv différent à chaque adresse @, différente de la mémoire principale, puis l'enregistrement, dans la mémoire principale, de cette ligne de donnée construite à l'adresse @,, - l'exécution d'une instruction de chargement de la ligne de donnée, cette instruction de chargement comportant un opérande à partir duquel est obtenu l'adresse @, où est enregistrée la ligne de donnée à charger depuis la mémoire principale, suivie de la vérification que la ligne de donnée chargée a bien été construite à l'aide du vecteur d'initial isation iv i associé à cette adresse @i par la fonction f1. et lorsque cette vérification échoue, le déclenchement du signalement d'une faute d'exécution et, lorsque cette vérification réussie l'inhibition de ce signalement d'une faute d'exécution, - l'exécution de blocs de base précédent et suivant et lors de l'exécution de chaque instruction du bloc de base suivant : le chargement, à partir de la mémoire principale, de la ligne d'instruction désignée par un compteur ordinal du microprocesseur, suivi du déchiffrement du cryptogramme contenu dans la ligne d'instruction chargée en utilisant le masque chargé dans le microprocesseur lors de l'exécution du bloc de base précédent, puis l'exécution, par une unité arithmétique et logique du microprocesseur, de l'instruction déchiffrée dans lequel le microprocesseur est également configuré pour exécuter le chargement d'une ligne d'instruction d'un bloc de base par l'exécution d'une instruction de chargement d'une ligne de donnée, chaque ligne d'instruction d'un bloc de base ayant été construite au préalable à cet effet en exécutant le même algorithme de construction que celui exécuté pour construire la ligne de donnée et en utilisant la même fonction la donnée étant prise égale pour cela à l'instruction masquée à l'aide du masque associé à ce bloc de base, de sorte que ce chargement ne déclenche pas systématiquement le signalement d'une faute d'exécution. [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é. 11 [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 mémoire principale de l'appareil de la figure 1; - la figure 10 est un organigramme d'une phase de m'agencement d'une mémoire principale, - la figure 11 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. [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- 1-> 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 «0 » 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 portant 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 cc texte, cc 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. 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. Ainsi, l'exécution d'un bloc de base débute systématiquement pal.- l'exécution de sa première instruction et se termine systématiquement par l'exécution de l'instruction de branchement qui termine ce 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. Ce 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 13 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 instruction 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. [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 : 14 - 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 configure° 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écaniquement 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 Nm,', 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 N. est strictement supérieure Nlin' bits, où Nin' bits est le nombre de bits des instructions du jeu d'instructions du microprocesseur 2. Typiquement, brins, est un entier supérieure ou égale à 8, 16, 32 ou 64. Dans cet exemple, Ni,', est égal à 32 et la taille N,,,,, 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 du microprocesseur 2, et - des cryptogramme ive*, MASK,' chiffrés à l'aide de la clé publique pkcpu, 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] Ici, l'unité 10 est une unité arithmétique et logique de N11,1, 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 configuré 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 16 29. Aucun accès à cette mémoire 29 sans passer par l'intermédiaire du module 28 n'est prévu. Dans cc 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 F et - exécuter une fonction préprogrammée Fe. [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 7. Ici, elle comporte donc notamment des informations 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 skr, qui permet de déchiffrer les données qui ont été chiffrées à l'aide de la clé publique pkcpu. [0052] Dans cet exemple dc réalisation, l'ensemble 12 comporte des registres généraux uti- lisables pour stocker tout type de données. La taille de chacun dc 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 III: 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 L4_1 la ligne 17 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 cc 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 CT", un code MACJ, et un code ECC4. Par la suite, on note @, l'adresse dans la mémoire 4 à laquelle est enregistrée la ligne LT. [0060] Le cryptogramme cy est obtenu en chiffrant une concaténation CL à l'aide de la clé secrète ka et d'un vecteur d' initialisation iv,. Plus précisément, le cryptogramme CI," est obtenu à l'aide de la relation suivante : CI,* = fk'(CI, ; iv,), où -ru est une fonction de chiffrement correspondant à une fonction de déchiffrement fk» préprogrammée dans le module 28. Typiquement, la fonction fk, 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 CI; *. [0061] Le vecteur iv i est un vecteur dont la valeur dépend de l'adresse @i. Dans cc mode de réalisation, 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 iv,''bd. Les 32 bits de poids faible sont enregistrés dans un registre ivisbri. 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 iveted". Chaque vecteur iv i est donc le résultat de la concaténation des bits des registres iv11hl, ive,cd et iv1b1. Ici, les contenus des registres iv1,1 et iveted sont constants durant toute l'exécution du code machine. Par exemple, les registres ivbd et ivcrcri 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 iv1',* et iva',* contenus dans le bloc 34. [0062] Le contenu du registre ivlb1, utilisé lors du chiffrement de la concaténation CIi, est fonction de l'adresse @i où est enregistrée la ligne LIi. À cet effet, le module 28 comporte une fonction bijective préprogrammée Fi, qui, à chaque adresse @i de la mémoire 4 associe une valeur différente du registre ivlhd. Par exemple, la fonction Fi, est une fonction de hachage ou de chiffrement. On a donc la relation suivante : = Fh,(@;), où ivisbri désigne le contenu du registre i [0063] La concaténation CI; est ici la concaténation d'une instruction masquée JM et d'un code ECCum. L'instruction masquée It est construite à partir d'une instruction I à exécuter par le microprocesseur 2 et d'un masque dérivé M. Par exemple, l'instruction masquée i» est le résultat de l'opération L XOR Mi, où le symbole XOR désigne l'opération booléenne "OU EXCLUSIF'. Le masque Mi est obtenu en utilisant la fonction F. de la même manière que ce qui est décrit plus loin en référence à 18 l'opération 184. Le code ECC';,', permet de détecter une erreur dans l'instruction masquée Lm et, éventuellement, de corriger cette erreur. Par exemple, le code ECC,Jm peut être le code connu sous l'acronyme BCH (Bose, Ray-Chaudhuri, Hocquenghern) 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 à N iILsL 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 masquée plus la taille du code ECC',, sera grande. [0064] 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 Cl* et de la clé k'. [0065] À 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 ». [0066] 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,;,,. [0067] Le cryptogramme CI,;* et les codes ECC,;,,, MAC; et ECC,,; sont, typiquement, construits au moment où le code machine 32 est généré. A cet effet, lors de la génération du code machine 32, un premier algorithme Cd de construction d'un code correcteur d'erreur est d'abord exécuté. Cet algorithme Cd reçoit en entrée la donnée pour laquelle il doit calculer le code correcteur d'erreur et retourne en sortie la concaténation de cette donnée avec son code correcteur d'erreur. Ainsi, pour construire la concaténation CI, cet algorithme Cd réalise la fonction suivante : CI; = Cd(V). Ensuite, un second algorithme F. est exécuté pour construire la ligne de code contenant le cryptogramme de la concaténation. Cet algorithme F, reçoit en entrée la concaténation à 19 coder dans la ligne de code et l'adresse @; de la ligne de code à construire. Après avoir été exécuté, il retourne en sortie la ligne contenant le cryptogramme de la concaténation. Ainsi, pour construire la ligne LIJ, cet algorithme P. réalise la fonction suivante : LI; = FJCT3, @;). L'exécution de l'algorithme Cd pour obtenir une concaténation puis de l'algorithme P. pour obtenir une ligne de code codant cette concaténation forme un algorithme de construction de cette ligne de code. [0068] 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. [0069] 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 ce bloc de base n'ont pas été représentées. [0070] 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 les codes MAC et ECC,. 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. [0071] 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. [0072] Le symbole « Load Mx'» 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'un nouveau masque 1\4),' dans un registre MASKb,',d, du microprocesseur 2. La valeur du masque M. est directement contenue dans l'instruction "Load M'". Autrement dit, la valeur du masque M' est un opérande de l'instruction "Load M". On notera que la valeur du masque M' 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 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 du masque M. dans le registre MASKI,,',1C1, et la seconde instruction charge les autres bits de la valeur du masque M', dans cc registre MASICF'',,,,,. [0073] Le symbole "xx" dans le terme Mn est un identifiant de ce masque. En effet, à chaque fois que l'instruction "Load M" est exécutée, elle provoque le chargement d'un masque spécifique qui permet de déchiffrer les lignes d'instructions du bloc de base suivant. Ainsi, le symbole « Load M2» indique que la valeur du masque M.'2 est chargée dans le registre MASK,,,''d, avant que débute l'exécution du bloc de base 52. Ici, chaque bloc de base est associé à son propre masque. [0074] 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 MASKI,''1, dans un registre MASK, du microprocesseur 2. Le registre MASK, contient les 32 bits du masque actuellement utilisé pour déchiffrer les lignes d'instructions. [0075] Le même masque Mk est utilisé pour déchiffrer toutes les instructions du même bloc de base B131. 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 Mk est par la suite utilisé pour désigner de façon générale le masque associé au 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 simples, utilisée pour 21 désigner le bloc de base précédent systématiquement exécuté immédiatement avant le bloc de base BBk. [0076] Ici, le masque Mk est unique pour chaque bloc de base BBk. Par « unique pour chaque bloc de base», on désigne le fait que la probabilité que le même masque Mk soit utilisé pour chiffrer les lignes d'instructions de deux blocs de base différents du code machine 32 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 masque Mk 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 du masque Mk de chaque bloc de base sont tirés de façon aléatoire ou pseudo-aléatoire dans l'ensemble {1 ; ...; 2Ni11sL}. [0077] Comme représenté sur la figure 3, dans le code 32, les 32 bits du masque MI, sont chargés dans le registre MASK,,,,, uniquement lors de l'exécution d'un bloc de base précédent le bloc de base BBk. Sur la figure 3, le masque Ms, nécessaire pour déchiffrer les instructions du 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 le masque nécessaire pour déchiffrer les instructions du bloc 64 est noté «M64 ». 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 les instructions du bloc 62 sont chiffrées en utilisant un masque M62 différent du masque M60 utilisé pour chiffrer les instructions du 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 de la fonction FI. [0081] Les blocs 70. 72. 80 et 82 sont associés à des masques respectifs M70, M77, Mso et n2 [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 cc 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 à cc 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 "dynamic library loader" ou simplement "loader". Ce chargeur de bibliothèque dynamique est, par exemple, celui d'un système d'exploitation exécuté par le 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 masque no à utiliser pour déchiffrer les lignes d'instructions de ce bloc 80 n'est pas non plus connu. Il n'est donc pas possible 23 d'introduire, lors de la compilation du code machine 32, l'instruction "Load M", précédemment décrite, dans le bloc 70 pour provoquer le chargement direct du masque M ,0 dans le registre MASKE'ek. A la place, lors de la génération du code machine 32, une instruction de chargement indirect d'un masque, 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 du masque M80 à partir du contenu de la ligne de donnée lue, puis - le chargement des 32 bits ainsi construit dans le registre MASKEek. [0086] Ici, dans le cas de l'instruction "LoadTV rd", la construction d'une adresse @k à 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 "BranchIV rd". Ainsi, l'adresse @k 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 ce bloc de base comporte une ligne de donnée Ln, et non pas une ligne d'instruction. Cette ligne LDk contient la donnée permettant de construire les 32 bits du masque Mk associé au bloc de base B131. A cet effet, elle comporte un cryptogramme, noté Mk* sur les figures, des 32 bits du masque Mk. Dans ce mode de réalisation, le cryptogramme Mk* est obtenu à l'aide de la relation suivante : Mk* = fka(Mk ; iv), Où : - MI est la valeur des 32 bits du masque Mk, - iv i est un vecteur d'initialisation construit comme précédemment décrit dans le cas du chiffrement de la concaténation CL, et - la fonction fk' est la même que celle précédemment décrite dans le cas du chiffrement des instructions. [0088] Le vecteur d'initialisation iv i utilisé pour obtenir le cryptogramme Mi* est donc lui aussi le résultat de la concaténation du contenu des registres iv,',,,d, ivcr', et ivishd. Dans ce cas, le contenu du registre ivish, est égal à F(@), où : - est la même fonction que celle précédemment définie, et - ek est l'adresse de la première ligne du bloc BBk. [0089] La structure d'une ligne de donnée telle que la ligne La est décrite plus loin en référence à la figure 8. [0090] 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 24 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. [0091] 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. [0092] 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 M72* du masque 1\472 associé au bloc B1372. [0093] 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 etcd utilisées pour chiffrer ou déchiffrer. Ainsi, de préférence, les registres iv11,1, iv, MASK, sont des registres contenus dans la mémoire 29. [0094] La figure 7 représente un procédé d'exécution du code binaire 30 par le micro- processeur 2. [0095] Le procédé débute par une étape 150 de génération puis de fourniture du code binaire 30 dans la mémoire 4. La génération du code binaire 30 est typiquement réalisée par un compilateur tel que celui décrit en référence à la figure 11. La fourniture du code binaire 30 consiste ici ensuite à fournir la copie 40 puis, 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. [0096] Ensuite, lors d'une phase 152, le microprocesseur 2 exécute le code binaire 30 et, en particulier, le code machine 32. [0097] É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. [0098] Lors de l'étape 162, le module 28 charge les cryptogrammes ka* et MASK,*, ivmsbd*, iv,'d*, contenus dans le bloc 34 et les déchiffre à l'aide de la clé skcpu contenue dans la mémoire 29. Le module 28 initialise les valeurs contenues dans les registres MASK,, iv,',bd, ivut', à partir, respectivement, des cryptogrammes MASKe*, iv*, iveLed*, déchiffrés. À l'issue de l'étape 162, la clé ka et le masque Mk utilisé pour déchiffrer le premier bloc de base du code machine 32 sont contenus dans la mémoire 29. [0099] 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 BB, du code machine 32. [0100] L'exécution de chaque bloc de base consiste à exécuter, dans l'ordre où les lignes d'instruction LI, de cc bloc de base sont enregistrées dans la mémoire 4, les instructions codées par chacune de ces lignes d'instruction. [0101] Pour chacune des lignes d'instruction LI, à exécuter, le microprocesseur 2 exécute les étapes suivantes. [0102] Lors d'une étape 164, le microprocesseur 2 charge dans un registre de l'ensemble 12, la ligne d'instruction LI, enregistrée à l'adresse @; contenue dans le compteur ordinal 26. [0103] Ensuite, le module 28 procède à une étape 166 de sécurisation de l'instruction codée dans la ligne d'instruction chargée. [0104] 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. [0105] Lors d'une opération 170, le module 28 vérifie s'il existe une erreur dans le cryp- togramme CI;* ou le code MAC; à l'aide du code ECC, ; 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 C et du code MACi, un code ECC,;'. Si le code ECC, est différent du code ECC, ;, alors une erreur est détectée. Si une erreur est détectée, le module 28 procède immédiatement à une étape 172. [0106] Lors de l'étape 172, le module 28 déclenche le signalement d'une faute d'exécution. [0107] 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 ECCH. À l'issue de l'étape 174, le cryptogramme CI;* corrigé et le code MAC; corrigé sont utilisés à la place, respectivement, du cryptogramme CI* et du code MAC; contenus dans la ligne LI;. [0108] 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. [0109] À 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. [0110] Lors de l'opération 176, le module 28 vérifie l'intégrité et l'authenticité du cryp- togramme CI,* à l'aide du code MAC,. Par exemple, pour cela, le module 28 construit une étiquette du cryptogramme CI,* puis chiffre cette étiquette avec la clé k' contenue 26 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. [0111] 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 Cl y` 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'. [0112] Lors de l'opération 178, le module 28 déchiffre le cryptogramme Cl en utilisant la clé ka, le vecteur d' initialisation iv; et la fonction pour obtenir la concaténation Cl; déchiffrée. On rappelle que cette concaténation CL contient l'instruction masquée Lm et le code ECC,;' déchiffrés. La clé ka a été enregistrée dans la mémoire 29 lors de l'étape 162. Lors de l'opération 178, le vecteur est calculé par le module 28 à l'aide de la relation : iv,,,,, = F1(@;), où @i est l'adresse à partir de laquelle la ligne LI a été chargée lors de l'étape 164. Ensuite, le vecteur iv i utilisé pour déchiffrer le cryptogramme Cli* est le résultat de la concaténation du vecteur ivisbd calculé et des vecteurs ivm,d et ive,cd initialisés lors de l'étape 162. [0113] Ensuite, lors d'une opération 180, le module 28 vérifie s'il existe une erreur dans l'instruction masquée i à l'aide du code ECC,im obtenue lors de l'opération 178. Cette opération est réalisée de façon similaire à ce qui a été décrit pour l'opération 170. Cette opérations 180 permet de vérifier que la ligne chargée à bien été construite à partir du vecteur iv i correspondant à l'adresse @i. [0114] 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 182, le module 28 corrige l'instruction masquée Iim à l'aide du code ECC,im. L'opération 182 est similaire à l'opération 174. [0115] Ensuite, à l'issue de l'opération 182 ou si aucune erreur n'a été détectée lors de l'opération 180, le procédé se poursuit par une opération 184. [0116] Lors de l'opération 184, le module 28 déchiffre l'instruction masquée JM obtenue. Pour cela, il obtient le masque dérivé Mi à partir du masque Mk actuellement enregistré dans le registre MASK,. Le registre MASK, contient le masque chargé lors de l'exécution du 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 BBI du code machine 32, c'est les valeurs initiales des registres MASK, qui est utilisée. [0117] 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 MASK, par le contenu du registre MASKb','ch. Le contenu du registre MASKb',',,, est mis à jour lors de l'exécution de l'instruction "Load Mx," ou 27 "LoadIV rd" ou "LoadIV ra" qui précède l'instruction de branchement. [0118] Le masque dérivé M, est dérivé du masque M, en utilisant la fonction pré- programmée Fe. Ici, le masque M, est obtenu à l'aide de la relation suivante : M = F,(VI H), où MF, est le masque dérivé obtenu lors du déchiffrement de la précédente instruction Io du même bloc de base BBk. La fonction F, est une fonction qui modifie dune façon prédéterminée le précédent masque dérivé MF, de sorte que le masque Mi obtenu est différent du masque Mo et, généralement, différent de tous les masques dérivés obtenus pour les précédentes lignes d'instruction de ce même bloc de base BBk. De nombreuses fonctions Fe sont possibles. Par exemple, la fonction Fe est choisie dans le groupe composé des fonctions suivantes et de leur composition : - Fe, : une fonction de permutation, - F2: un registre à décalage à rétroaction linéaire ou LFSR ("litzear feedback shift register"), - un chiffrement pas flot ou par bloc, - Fok : une combinaison bit-à-bit entre les bits du masque Mk et des bits susceptibles de varier à chaque exécution d'une précédente instruction du bloc BBk. A titre d'exemple de la fonction Fee[, on peut citer la fonction suivante Mi = Mk XOR I il ou encore la combinaison des bits du masque Mk avec des bits de contrôle mis à jour lors de l'exécution de l'instruction 1-j'et distinct des bits de l'instruction I. ,. A titre d'exemple de bits de contrôle, on peut citer le bit qui indique à l'unité 10 la présence d'une retenue ou celui qui indique à l'unité 10 si la donnée traitée lors de l'exécution de l'instruction I i est une donnée signée ou non. Ici, la fonction Fe est la fonction Fel. [0119] Lorsque l'instruction I; est l'instruction contenue dans la première ligne d'instruction du bloc de base, la valeur du masque Mi est initialisée à partir de la valeur du masque Mk. Par exemple, dans ce cas, le masque Mi est pris égal à Fe(Mk) ou à M. Ainsi, tous les masques dérivés utilisés pour déchiffrer les instructions du bloc BBk sont dérivés du masque Mk. Dès lors, si le masque chargé dans le registre MASKe n'est pas celui associé au bloc BBk, les instructions du bloc BBk ne sont pas correctement déchiffrées. Les instructions du bloc BBk ne sont pas non plus correctement déchiffrées si une attaque conduit à sauter directement au milieu du bloc BBk. Dans ce cas, le masque dérivé Mi calculé ne permet pas de déchiffrer correctement l'instruction Lm car la fonction Fe n'a pas été exécutée pour les précédentes lignes d'instruction. [0120] Une fois que le masque dérivé M, a été obtenu, l'instruction masquée 1 est ici dé- chiffrée selon la relation suivante : L = Jpi XOR M. [0121] A la fin de l'opération 184, le module 28 enregistre l'instruction I, déchiffrée dans la file 22. [0122] Une fois que l'unité 10 a exécuté toutes les instructions qui précédent l'instruction 28 dans la file 22, c'est-à-dire lorsque l'instruction I, est la prochaine instruction à exécuter par l'unité 10, lors d'une étape 190, l'unité 10 exécute l'instruction I,. [0123] Comme représenté sur la figure 7, en parallèle de l'étape 190, le procédé comporte une étape 250 de sécurisation des données traitées. Cette étape 250 est décrite plus en détail dans le chapitre suivant. [0124] Le fait de chiffrer la concaténation C1 à l'aide du vecteur d' initialisation iv, qui dépend de l'adresse @, permet de détecter si la ligne LI, a été déplacée dans la mémoire 4 sans que cela soit fait par le microprocesseur 10. Par exemple, si deux lignes LI, et Lb sont permutées, une telle permutation des lignes LI, et LI, n'est pas nécessairement détectée lors de l'opération 170 ou 176. Par contre, puisque la concaténation CI, est chiffrée avec un vecteur d' initial isation iv, qui dépend de l'adresse @I, si la ligne LI, est déplacée et se situe à une adresse @2 dans la mémoire 4, lors du chargement de cette ligne à partir de cette adresse @2, le cryptogramme CD,* va être déchiffré à l'aide du vecteur ivk et non pas à l'aide du vecteur ivi. Un tel déchiffrement incorrect de la concaténation CI, est alors détecté lors de l'opération 180. Ainsi, l'opération 180 permet de vérifier que la ligne LI, a bien été construite à partir du vecteur ivi. [0125] L'opération 184 permet 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 BBt. Dans ce cas, lors de l'exécution du bloc BBk le masque Mk est chargé dans le registre MASICh,',,,,,. Dès lors, lors de l'exécution du bloc BB' l'instruction masquée JM est déchiffrée à l'aide du masque Mk associé au bloc BBk et non pas à l'aide du masque Mt associé au bloc BBt. Par conséquent, le déchiffrement de l'instruction masquée à l'aide du masque conduit à l'obtention d'une instruction I; incorrecte. Cette instruction I; incorrecte a typiquement plus d'une chance sur deux ou plus d'une chance sur quatre de ne pas appartenir au jeu d'instructions prédéfini de l'unité 10. Lorsque l'instruction à exécuter par l'unité 10 n'appartient pas à son jeu d'instructions, cela déclenche une faute d'exécution. Par exemple, dans ce cas, le procédé se poursuit par l'étape 172 et/ou cela provoque l'arrêt brutal de l'exécution du code machine 30. Ainsi, l'opération 184 permet de rendre le code machine plus robuste vis-à-vis des attaques visant à modifier le flot de contrôle. Typiquement, ces attaques perturbent l'exécution de l'opération "Branch @XX" ou " BranchIV ra" ou "BranchIV rd". [0126] 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 bloc BBt, alors, lors de l'exécution de l'instruction "LoadIV ra" du bloc BBk_i, la première ligne de donnée du bloc BB, est déchiffrée à l'aide d'un vecteur iv, construit à 29 partir de l'adresse @k et non pas à partir de l'adresse @,. Cela conduit donc à un déchiffrement incorrect du cryptogramme Mk* et donc à un déchiffrement incorrect de la première ligne d'instruction du bloc BB,. [0127] 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. [0128] 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 180. [0129] CHAPITRE IV : SÉCURISATION DES DONNEES : [0130] Des données Di traitées lors de l'exécution du code machine 32 sont enregistrées dans la mémoire 4. Par exemple, 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. [0131] De même, à 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. La fonction appelée sauvegarde également dans la pile 46 des données telles que des variables locales. [0132] De façon similaire à ce qui a été décrit dans le cas des instructions T, une donnée D; enregistrée dans la partie 44 ou dans la pile 46 peut être corrompue par la mise en oeuvre d'attaques comme, par exemple, une attaque par injection de fautes. [0133] Pour protéger les données vis-à-vis de telles attaques, ici, chaque donnée D; en- registrée dans la mémoire 4 est codée dans une ligne respective LDJ. 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. [0134] 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 Uri, ils sont ici désignés par les mêmes symboles et ne sont pas décrits à nouveau. [0135] Le cryptogramme CD;* est obtenu en chiffrant, avec la fonction fk, une conca- ténation CDJ. La fonction fk' 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; ; iv;). La fonction fka est préprogrammée dans le module 28. [0136] Le vecteur iv; est construit de la même façon que ce qui a précédemment été décrit pour les lignes d'instructions. À cet effet, le module 28 utilise la fonction Fi, précédemment décrite. On utilise donc toujours la relation suivante : ivlbl = F1,(@;), où @); est l'adresse où est enregistrée la donnée D; dans la mémoire 4. [0137] La concaténation CD; est la concaténation de la donnée D; et d'un code ECC,-,;. Le code ECCD; permet de détecter et de corriger une erreur dans la donnée D. Il est construit comme décrit pour le code ECC]; sauf que l'instruction masquée Iim est remplacée par la donnée D. Ici, la donnée D; n'est pas masquée ou chiffrée avant d'être insérée dans la concaténation CD;. [0138] La sécurisation des données D; sauvegardées dans la mémoire 4 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 d'une donnée D; dans la mémoire 4. 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 Ri, de l'ensemble 12, lors d'une opération 252, le module 28 construit la concaténation CD; et l'enregistre dans le registre R. Ici, pour cela, le module 28 exécute le même algorithme Cd que celui exécuté pour construire la concaténation CIJ. Cette exécution de l'algorithme Cd réalise la fonction suivante : CD; = Cd(Di). [0140] Ultérieurement, lors d'une nouvelle exécution de l'étape 190, l'unité 10 exécute une 31 instruction d'enregistrement de la donnée D, contenue dans le registre 12, à l'adresse @, de la pile 46. [0141] En réponse, lors d'une opération 254, le module 28 construit la ligne de donnée LD, qui doit être enregistrée à l'adresse @,. Pour cela, il exécute le même algorithme F1. que celui utilisé pour construire une ligne LI,. Lors de cette exécution, il réalise la fonction suivante : LD; = Fe(CDJ, @,). L'exécution de l'algorithme Fe conduit notamment le module 28 à réaliser les opérations suivantes : - mise à jour du contenu du registre à l'aide de la relation iv,b, = Fiv(@,), puis - chiffrement de la concaténation CD, de la donnée D, et du code ECC,,, à l'aide de la fonction f,' 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 fin de l'opération 254, la ligne LEC); construite est transférée et enregistrée dans la mémoire 4 à l'adresse @i. [0143] Si la prochaine instruction à exécuter lors de l'étape 190 est une instruction de chargement d'une ligne LDi, 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 @i 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 Ri 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 LIi. [0145] Une fois que le cryptogramme CD;* a été déchiffré, lors d'une opération 280, le module 28 enregistre la donnée Di déchiffrée et le code ECCD; déchiffré dans le registre Ri en attendant que cette donnée soit traitée par l'unité 10. [0146] 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 Di car cette instruction comporte généralement un opérande qui identifie le registre 12; dans lequel est enregistré la donnée D. Les opérations 284 et 286 sont identiques, respectivement, aux opérations 180 et 182 du procédé de la figure 7, sauf qu'ici c'est la donnée D, et le code ECCE), qui sont utilisés et non pas l'instruction masquée et le code ECCiim. [0147] 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. 32 [0148] 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 LD; est identique à celle dc la ligne LL. [0149] CHAPITRE V : REAGENCEMENT DE LA MEMOIRE PRINCIPALE [0150] Généralement, le microprocesseur 2 exécute un système d'exploitation qui, en outre, optimise de temps en temps l'usage de la mémoire 4. A cet effet, il procédé à une phase 230 (Figure 10) de réagencement des lignes de la mémoire 4. Cette phase 230 va maintenant être décrite plus en détail en référence au procédé de la figure 10. [0151] La phase 230 est typiquement exécutée en parallèle de l'exécution des autres programmes en cours d'exécution et, par exemple, au cours de l'exécution du code machine 32. Lors de cette phase 230, des lignes enregistrées dans la mémoire 4 sont déplacées d'une première adresse vers une seconde adresse différente. Typiquement, dans le contexte où un mécanisme de mémoire virtuelle paginée est mis en oeuvre, les lignes sont déplacées par page entière. On rappelle que lorsqu'un mécanisme de mémoire virtuelle est mis en oeuvre, il existe une table, connue sous le nom de "table des pages", qui associe à chaque adresse virtuelle de l'espace mémoire d'un programme en cours d'exécution, une adresse physique dans la mémoire 4. Ainsi, chaque adresse virtuelle correspond à une adresse physique et vice-versa. Il existe aussi un module, connu sous l'acronyme MMU ("Memory Management Unit"), qui est chargé de gérer et, en particulier, de mettre à jour automatiquement la table des pages dès que des lignes sont déplacées de manière à conserver la correspondance entre les adresses virtuelles et les adresses physiques. [0152] Lors de ces opérations de déplacement de lignes de la mémoire 4, toutes les lignes déplacées sont traitées de la même façon. Plus précisément, toutes les lignes déplacées sont traitées comme s'il s'agissait de lignes de donnée. Ainsi, lors de la phase 230, si des lignes d'instructions doivent être déplacées, celles-ci sont lues et écrites en mettant en oeuvre le procédé de la figure 9. Autrement dit, chaque ligne d'instruction est chargée en réponse à l'exécution par l'unité 10 d'une instruction de chargement et non pas parce que l'adresse contenue dans le compteur ordinal 26 correspond à cette ligne d'instruction. Par conséquent, le chargement d'une ligne d'instruction lors de la phase 230 ne déclenche pas l'exécution de l'instruction chargée par l'unité 10. Dès lors, par la suite, les étapes mises en oeuvre pour déplacer une ligne de la mémoire 4 sont décrites en utilisant les notations introduites pour les lignes de données. Toutefois, ces étapes s'appliquent aussi bien au cas d'une ligne de donnée que d'une ligne d'instruction. Dans le cas d'une ligne d'instruction, l'instruction masquée Ijm est traitée comme étant une donnée. [0153] Les étapes de la phase 230 sont décrites ci-dessous dans le cas particulier du dé- placement d'une donnée DI d'une adresse @I vers une adresse @,. Toutefois, ce qui est 33 décrit dans cc cas particulier s'applique à toutes les lignes déplacées pendant la phase 230. [0154] Lors d'une étape 232, une instruction de chargement de la ligne LDI enregistrée à l'adresse @lest exécutée par l'unité 10. Cette instruction de chargement est une instruction de chargement d'une donnée. Elle est donc exécutée comme décrit en référence à procédé de la figure 9. A cette occasion les opérations 270, 276, 278, 280 et, éventuellement, l'opération 274, sont d'abord exécutées pour enregistrer la donnée DI et son code ECC', dans une registre RI de l'ensemble 12. [0155] Ensuite, lors d'une étape 234, une instruction d'enregistrement de la donnée DI à l'adresse @, est exécutée par l'unité 10. Cela déclenche alors successivement : - l'exécution de l'opération 284 de vérification du code ECCD, et, éventuellement de l'opération 286 de correction de la donnée DI à l'aide du code ECC'' puis - l'exécution de l'opération 254 de construction et d'enregistrement d'une nouvelle ligne LD2 contenant le cryptogramme de la donnée DI obtenu à partir de l'adresse @2. [0156] En absence d'attaque et lors d'un fonctionnement normal, les étapes 232 et 234 peuvent être appliquées aux lignes d'instruction sans que cela déclenche systématiquement le signalement d'une faute d'exécution. En effet, à l'exception du fait que dans le cas particulier d'une ligne d'instruction la donnée est l'instruction masquée Tm, les lignes d'instruction et de donnée sont construites de la même façon. [0157] CHAPITRE VI: GENERATION DU CODE BINAIRE [0158] La figure 11 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 masques Mk 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 7 et 9. 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. [0159] CHAPITRE VII: VARIANTES: [0160] Variantes de l'appareil 1 : [0161] D'autres modes de réalisation de l'appareil 1 sont possibles. En particulier, toutes les 34 variantes décrites dans les paragraphes 191 à 194 de la demande EP3457620A1 sont applicables ici. [0162] 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. [0163] Variantes de la sécurisation du code machine : [0164] En variante, l'utilisation du masque dérivé M; à la place du masque Mk est omise. Dans ce cas, chaque instruction masquée est obtenue directement et sculemnet à partir du masque Mk. Par exemple, l'instruction masquée est obtenue à l'aide de la relation suivante : 110 = T XOR Mk. Ainsi, la fonction d'évolution F, peut être omise dans ce mode de réalisation puisqu'elle n'est plus utilisée. [0165] De nombreux modes de réalisation sont possibles pour construire l'instruction masquée » à partir de l'instruction I; et du masque dérivé M. Par exemple, à cet effet, une fonction de chiffrement peut être utilisée. Dans ce cas, l'instruction masquée Iim est obtenue à l'aide de la relation suivante : Jim = F,'(1), Mi), où F, est une fonction de chiffrement correspondant à une fonction F,' ' préprogramtnée dans le module 28 et permettant de déchiffrer l'instruction masquée Ti'''. Par exemple, la fonction F' est identique à la fonction Fka ou à la fonction Fi,. Dans une autre variante, la fonction En est un générateur pscudo-aléatoire initialisé avec la valeur du masque mi ` 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. 41 [Revendication I] REVENDICATIONSProcédé d'exécution d'un code binaire d'une fonction sécurisée par un microprocesseur, ce procédé comportant les étapes suivantes : a) la fourniture (150) 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 ligne d'instructions contenant chacune un cryptogramme d'une instruction, les instructions codées dans ces lignes d'instructions successives étant destinées à être exécutées par le microprocesseur systématiquement dans l'ordre où elles apparaissent dans ce bloc de base, - 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 est fonction d'un masque associé à ce bloc de base, ce masque étant différent des masques associés aux autres blocs de base, - chaque bloc de base précédent contient une ligne d'instruction contenant le cryptogramme d'une instruction de chargement d'un masque qui, lorsqu'elle est exécutée par le microprocesseur, provoque le chargement, dans le microprocesseur, du masque à utiliser pour obtenir une instruction à partir du cryptogramme de chaque ligne d'instruction du bloc de base suivant, b) l'exécution (152) du code binaire par le microprocesseur, lors de cette exécution le procédé comporte : - l'enregistrement de données dans la mémoire principale, pour chaque donnée à enregistrer, le procédé comportant : l'exécution (254) d'un algorithme de construction d'une ligne de donnée contenant un cryptogramme de cette donnée construit à l'aide d'un vecteur d'initialisation iv1 associé à une adresse @i de la mémoire principale par une relation iv1 = (@;), où la fonction Fi, est une fonction préprogrammée qui associe un vecteur d'initialisation iv1 différent à chaque 42 [Revendication 2] adresse @i différente de la mémoire principale, puis [enregistrement, dans la mémoire principale, de cette ligne de donnée construite à l'adresse @i, - l'exécution, par l'unité arithmétique et logique, d'une instruction de chargement de la ligne de donnée, cette instruction de chargement comportant un opérande à partir duquel est obtenu l'adresse (ci); où est enregistrée la ligne de donnée à charger depuis la mémoire principale, suivie de la vérification (284) que la ligne de donnée chargée a bien été construite à l'aide du vecteur d'initialisation ivi associé à cette adresse C7D; par la fonction Fiv, et lorsque cette vérification échoue, le déclenchement (172) du signalement d'une faute d'exécution et, lorsque cette vérification réussie l'inhibition de ce signalement d'une faute d'exécution, - l'exécution de blocs de base précédent et suivant et lors de l'exécution de chaque instruction du bloc de base suivant : le chargement, à partir de la mémoire principale, de la ligne d'instruction désignée par un compteur ordinal du microprocesseur, suivi du déchiffrement (178, 184) du cryptogramme contenu dans la ligne d'instruction chargée en utilisant le masque chargé dans le microprocesseur lors de l'exécution du bloc de base précédent, puis l'exécution (190), par une unité arithmétique et logique du microprocesseur, de l'instruction déchiffrée, caractérisé en ce que chaque ligne d'instruction d'un bloc de base est construite (150) en exécutant le même algorithme de construction que celui exécuté pour construire la ligne de donnée et en utilisant la même fonction Fiv, la donnée étant prise égale pour cela à l'instruction masquée à l'aide du masque associé à ce bloc de base, de sorte que le chargement de cette ligne d'instruction par l'exécution d'une instruction de chargement d'une ligne de donnée ne déclenche pas systématiquement le signalement d'une faute d'exécution. Procédé selon la revendication I. dans lequel le procédé comporte une phase (230) de réaeencement de la mémoire principale lors de laquelle des lignes d'instructions sont déplacées dans la mémoire principale, cette phase de réagencement de la mémoire principale comportant. pour 43 [Revendication 3] [Revendication 4] [Revendication 5] chaque ligne d'instruction déplacée : - l'exécution (232), par l'unité arithmétique et logique, d'une instruction de chargement d'une ligne de donnée dans laquelle l'adresse obtenue à partir de l'opérande est l'adresse @ii de la ligne d'instruction à déplacer, puis - la vérification (284), de la même manière que pour toute ligne de donnée chargée, que la ligne d'instruction ainsi chargée à bien été construite à l'aide du vecteur d'initialisation iv1 associé, par la fonction -Eh., à l'adresse @ii obtenue à partir de l'opérande de l'instruction de chargement, et lorsque cette vérification échoue, le déclenchement du signalement d'une faute d'exécution et, lorsque cette vérification réussie, l'inhibition de ce signalement d'une faute d'exécution. Procédé selon l'une quelconque des revendications précédentes, dans lequel, lors de l'étape b), le chargement de la ligne d'instruction désignée par le compteur ordinal du microprocesseur, est également systématiquement suivi par la vérification (180), de la même manière que pour la ligne de donnée, que la ligne d'instruction chargée à bien été construite à l'aide du vecteur d'initialisation iv i associé, par la fonction F à l'adresse @i désignée par le compteur ordinal, et lorsque cette vérification échoue, le déclenchement du signalement d'une faute d'exécution et, lorsque cette vérification réussie, l'inhibition de ce signalement d'une faute d'exécution. Procédé selon l'une quelconque des revendications précédentes, dans lequel le déchiffrement du cryptogramme contenu dans la ligne d'instruction chargée comporte : - un déchiffrement (178) du cryptogramme à l'aide du vecteur d'initialisation iv i associé, par la fonction Fi' à l'adresse @i désignée par le compteur ordinal pour obtenir une instruction masquée déchiffrée, - l'exécution (184) d'une fonction prédétemlinée d'évolution pour obtenir un masque dérivé du masque chargé, le masque dérivé obtenu étant différent à chaque exécution de cette fonction d'évolution, puis - un déchiffrement (184) de l'instruction masquée déchiffrée à l'aide du masque dérivé obtenu pour obtenir l'instruction déchiffrée exécutée par l'unité arithmétique et logique. Procédé selon la revendication 4, dans lequel la fonction d'évolution est choisie dans le groupe composé : - d'une fonction de permutation, - d'un registre à décalage à rétroaction linéaire, 44 [Revendication 6] [Revendication 7] - d'un chiffrement pas flot, - d'une combinaison bit-à-bit entre les bits du masque chargé et des bits susceptibles de varier à chaque exécution d'une précédente instruction du même bloc de base, et - d'une composition d'une ou plusieurs des fonctions précédentes. Procédé selon la revendication 5, dans lequel les bits susceptibles de varier à chaque exécution d'une précédente instruction du même bloc de base sont choisis dans le groupe composé : - des bits d'une précédente instruction du même bloc de base, et - des bits de contrôle de l'exécution d'une précédente instruction du même bloc de base, ces bits de contrôle étant des bits distincts des bits des instructions et mis à jour par le microprocesseur à chaque exécution dune instruction. Procédé selon l'une quelconque des revendications précédentes, dans lequel : - chaque exécution (252, 254) de l'algorithme de construction d'une ligne de donnée à enregistrer à une adresse @i comporte : le calcul d'un vecteur d'initialisation iv i à l'aide de la relation iv i = Fi,(@), où @i est l'adresse à laquelle la ligne de donnée doit être enregistrée dans la mémoire principale, la construction d'un code détecteur d'erreur permettant de détecter une erreur dans la donnée, la concaténation du code détecteur d'erreur construit avec la donnée pour obtenir une concaténation CDi, puis le chiffrement de la concaténation CD; à l'aide du vecteur d'initialisation iv i calculé pour obtenir le cryptogramme de la donnée, puis l'incorporation du cryptogramme de la donnée dans la ligne de donnée construite, - chaque vérification que la ligne de donnée chargée a bien été construite à l'aide du vecteur d'initialisation iv associé, par la fonction F à une adresse @i à partir de laquelle cette ligne de donnée a été chargée, est précédée par les opérations suivantes : le calcul (278) d'un vecteur d'initialisation iv à l'aide de la relation iv = Fi,(@i), où @i est l'adresse à partir de laquelle la ligne de donnée a été chargée depuis la mémoire principale, 45 puis le déchiffrement (278) du cryptogramme de la donnée contenue dans la ligne de donnée chargée à l'aide du vecteur d'initialisation iv i calculé pour obtenir une concaténation déchiffrée, puis - chaque vérification (284) que la ligne de donnée chargée a bien été construite à l'aide du vecteur d'initialisation ivi associé, par la fonction F in à une adresse e7; à partir de laquelle cette ligne de donnée a été chargée, comporte : l'utilisation du code détecteur d'erreur contenu dans la concaténation déchiffrée, pour détecter une erreur dans la donnée contenue dans cette concaténation déchiffrée, et si une erreur est détectée, la vérification que la ligne de donnée chargée a bien été construite à l'aide du vecteur d'initialisation ivi associé, par la fonction Fiv, à l'adresse Ca à partir de laquelle cette ligne de donnée a été chargée, échoue et, dans le cas contraire, la vérification réussie. [Revendication 8] [Revendication 9] [Revendication 10] Procédé selon les revendications 2 et 7 prises ensemble, dans lequel, la phase (230) de réagencement comporte également pour chaque ligne d'instruction chargée : - le déchiffrement (278) du cryptogramme de la concaténation contenue dans la ligne d'instruction chargée pour obtenir une instruction masquée, puis - l'exécution (254) de l'algorithme de construction d'une ligne de donnée avec une donnée égale à cette instruction masquée pour obtenir une nouvelle ligne d'instruction destinée à être enregistrée dans la mémoire principale à une adresse @j, différente de l'adresse @il, puis - l'enregistrement (254), dans la mémoire principale, de la nouvelle ligne d'instruction construite à l'adresse @i2. Procédé selon l'une quelconque des revendications précédentes, dans lequel l'algorithme de construction construit le cryptogramme de la donnée également en utilisant une clef secrète indépendante de l'adresse @i. Procédé selon l'une quelconque des revendications précédentes, dans 46 lequel, lors de l'étape a), les blocs de base enregistrés comporte au moins un premier bloc (70, 82) 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 masque à partir du contenu de cette ligne de donnée lue, puis - le chargement de ce masque construit dans le microprocesseur, - l'étape c) 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. [Revendication 11] Procédé selon la revendication 10, dans lequel, la ligne de donnée associée à l'adresse obtenue à partir du contenu du registre de destination est la première ligne de chaque bloc de base suivant, cette ligne de donnée, contrairement à une ligne d'instruction, ne codant aucun opcode d'une instruction exécutable par le microprocesseur. [Revendication 12] Code binaire d'une fonction sécurisée exécutable par un microprocesseur pour la mise en oeuvre d'un procédé d'exécution conforme à l'une quelconque des revendications précédentes, dans lequel le code binaire comporte un code machine contenant une succession de blocs de base et dans lequel : - chaque bloc de base comporte une succession de ligne d'instructions contenant chacune un cryptogramme d'une instruction, les instructions 47 codées dans ces lignes d'instructions successives étant destinées à être exécutées par le microprocesseur systématiquement dans l'ordre où clics apparaissent dans ce bloc de base, - 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 est fonction d'un masque associé à ce bloc de base, ce masque étant différent des masques associés aux autres blocs de base, - chaque bloc de base précédent contient une ligne d'instruction contenant le cryptogramme d'une instruction de chargement d'un masque qui, lorsqu'elle est exécutée par le microprocesseur, provoque le chargement, dans le microprocesseur, du masque à utiliser pour obtenir une instruction à partir du cryptogramme de chaque ligne d'instruction du bloc de base suivant, - le code machine comporte aussi des instructions qui, lorsqu'elles sont exécutées par le microprocesseur, provoque : - l'enregistrement de données dans la mémoire principale et pour chaque donnée à enregistrer : l'exécution d'un algorithme de construction d'une ligne de donnée contenant un cryptogramme de cette donnée construit à l'aide d'un vecteur d'initialisation iv associé à une adresse @i de la mémoire principale par une relation iv = Fiv(@;), où la fonction Fi, est une fonction préprogrammée qui associe un vecteur d'initialisation iv différent à chaque adresse @i différente de la mémoire principale, puis l'enregistrement, dans la mémoire principale, de cette ligne de donnée construite à l'adresse - l'exécution, par l'unité arithmétique et logique, d'une instruction de chargement de la ligne de donnée, cette instruction de chargement comportant un opérande à partir duquel est obtenu l'adresse @; où est enregistrée la ligne de donnée à charger depuis la mémoire principale, 48 [Revendication 13] [Revendication 14] suivie de la vérification que la ligne de donnée chargée a bien été construite à l'aide du vecteur d'initialisation iv, associé à cette adresse @, par la fonction f, et lorsque cette vérification échoue, le déclenchement du signalement dune faute d'exécution et, lorsque cette vérification réussie l'inhibition de ce signalement dune faute d'exécution, - l'exécution de blocs de base précédent et suivant et lors de l'exécution de chaque instruction du bloc de base suivant : le chargement, à partir de la mémoire principale, de la ligne d'instruction désignée par un compteur ordinal du microprocesseur, suivi du déchiffrement du cryptogramme contenu dans la ligne d'instruction chargée en utilisant le masque chargé dans le microprocesseur lors de l'exécution du bloc de base précédent, puis l'exécution, par une unité arithmétique et logique du microprocesseur, de l'instruction déchiffrée, caractérisé en ce que chaque ligne d'instruction d'un bloc de base est construite de la même manière que la ligne de donnée et en utilisant la même fonction Fiv, la donnée étant égale pour cela à l'instruction masquée à l'aide du masque associé à ce bloc de base, de sorte que le chargement de cette ligne d'instruction par l'exécution d'une instruction de chargement d'une ligne de donnée ne déclenche pas systématiquement le signalement d'une faute d'exécution. Support d'enregistrement d'informations, lisibles par un microprocesseur, caractérisé en ce qu'il comporte un code binaire conforme à la revendication 12. Microprocesseur (2) pour la mise en oeuvre d'un procédé conforme à l'une quelconque des revendications 1 à 11, ce microprocesseur étant configuré pour exécuter les étapes suivantes : - l'enregistrement de données dans la mémoire principale et pour chaque donnée à enregistrer, exécuter les opérations suivantes : l'exécution d'un algorithme de construction d'une ligne de donnée contenant un cryptogramme de cette donnée construit à l'aide d'un vecteur d'initialisation iv associé à une adresse @i de la mémoire principale par une relation iv = Fiv(@;), où la fonction Fi, est une fonction préprogrammée qui associe un vecteur d'initialisation iv, différent à chaque adresse @, 49 différente de la mémoire principale, puis [enregistrement, dans la mémoire principale, de cette ligne de donnée construite à l'adresse @i, - l'exécution d'une instruction de chargement de la ligne de donnée, cette instruction de chargement comportant un opérande à partir duquel est obtenu l'adresse (co; où est enregistrée la ligne de donnée à charger depuis la mémoire principale, suivie de la vérification que la ligne de donnée chargée a bien été construite à l'aide du vecteur d'initialisation iv associé à cette adresse C7); par la fonction Fiy, et lorsque cette vérification échoue, le déclenchement du signalement d'une faute d'exécution et, lorsque cette vérification réussie l'inhibition de ce signalement d'une faute d'exécution, - l'exécution de blocs de base précédent et suivant et lors de l'exécution de chaque instruction du bloc de base suivant : le chargement, à partir de la mémoire principale, de la ligne d'instruction désignée par un compteur ordinal du microprocesseur, suivi du déchiffrement du cryptogramme contenu dans la ligne d'instruction chargée en utilisant le masque chargé dans le microprocesseur lors de l'exécution du bloc de base précédent, puis l'exécution, par une unité arithmétique et logique du microprocesseur, de l'instruction déchiffrée, [Revendication 15] caractérisé en ce que le microprocesseur est également configuré pour exécuter le chargement d'une ligne d'instruction d'un bloc de base par l'exécution d'une instruction de chargement d'une ligne de donnée, chaque ligne d'instruction d'un bloc de base ayant été construite au préalable à cet effet en exécutant le même algorithme de construction que celui exécuté pour construire la ligne de donnée et en utilisant la même fonction Fiv, la donnée étant prise égale pour cela à l'instruction masquée à l'aide du masque associé à ce bloc de base, de sorte que ce chargement ne déclenche pas systématiquement le signalement d'une faute d'exécution. Compilateur (300) apte à transformer automatiquement un code source d'une fonction sécurisée en un code binaire de cette fonction sécurisée, 50 caractérisé en ce que le compilateur est apte à transformer automatiquement le code source en un code binaire conforme à revendication 12.