Brevet FR3071121A1 — publié le 20190315

PROCÉDÉ D'EXÉCUTION D'UN CODE BINAIRE D'UNE FONCTION SÉCURISÉE PAR UN MICROPROCESSEUR [001] 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. [2] 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. [3] À 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. [4] 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 principale ou dans des registres du microprocesseur, et 3) une altération du flot de contrôle du code machine. [5] 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 30 graphe connu sous le terme de graphe de flot de contrôle ou « control flow graph » en anglais. [6] 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 35 fonction sécurisée ». En effet, contrairement au code binaire d'une fonction non-sécurisée, ce code binaire est apte à permettre le signalement de fautes d'exécution typiquement rencontrées en cas d'attaques. [7] 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 l'une des possibilités suivantes : 40 - détecter une faute d'exécution si une instruction du code machine de la fonction 2 sécurisée est altérée, - détecter une faute d'exécution si le flot de contrôle est altéré, - détecter une faute d'exécution en cas de dysfonctionnement d'une unité arithmétique et logique lors de l'exécution d'une instruction par cette unité, 5 - détecter une faute d'exécution si les données traitées lors de l'exécution de la fonction sécurisée sont altérées. [008] 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, dans lequel ce procédé comporte : a) la fourniture du code binaire, ce code binaire comprenant des lignes de code, 10 chaque ligne de code contenant : - un cryptogramme d'une seule instruction exécutable par le microprocesseur ou d'une seule donnée à traiter par le microprocesseur, et - un code d'authentification de message permettant de vérifier l'intégrité et l'authenticité du cryptogramme, 15 b) lors de l'exécution du code binaire par le microprocesseur, à chaque fois que le microprocesseur charge une ligne de code, le procédé comporte les opérations suivantes : 1) un module matériel de sécurisation du microprocesseur vérifie l'intégrité et l'authenticité du cryptogramme contenu dans la ligne de code chargée à l'aide 20 du code d'authentification de message contenu dans cette même ligne et déclenche le signalement d'une faute d'exécution si l'intégrité ou l'authenticité du cryptogramme n'est pas confirmée, puis 2) le module matériel de sécurisation déchiffre le cryptogramme pour obtenir une instruction déchiffrée ou une donnée déchiffrée si l'intégrité et l'authenticité 25 du cryptogramme sont confirmées, puis : - dans le cas d'une instruction déchiffrée, l'instruction déchiffrée est enregistrée dans une file d'instructions à exécuter successivement les unes après les autres par une unité arithmétique et logique du microprocesseur, et - dans le cas d'une donnée déchiffrée, la donnée déchiffrée est enregistrée dans un registre interne du microprocesseur en attendant d'être traitée par l'unité arithmétique et logique. [009] Les modes de réalisation de ce procédé d'exécution peuvent comporter une ou plusieurs des caractéristiques suivantes : - - lors de l'étape a), le cryptogramme contenu dans la ligne de code est un cryptogramme d'une concaténation de ladite instruction ou donnée et d'un premier code détecteur d'erreur permettant de détecter une erreur dans l'instruction ou dans la donnée avec laquelle il est concaténé, - lors de l'opération 2), le déchiffrement du cryptogramme par le module matériel de sécurisation permet d'obtenir, en plus de l'instruction déchiffrée ou de la donnée déchiffrée, le premier code détecteur d'erreur déchiffré, puis : 3 - dans le cas d'une instruction déchiffrée, le premier code d'erreur déchiffré est enregistré dans la file d'instructions avec l'instruction déchiffrée, et - dans le cas d'une donnée déchiffrée, la donnée déchiffrée et le premier code détecteur d'erreur déchiffré sont enregistrés dans un même registre du 5 microprocesseur, et - après l'opération 2), le procédé comporte l'opération 3) suivante : - lorsque la prochaine instruction à exécuter contenue dans la file d'instructions est l'instruction déchiffrée lors de l'opération 2), le module matériel de sécurisation vérifie, à l'aide du premier code détecteur d'erreur enregistré avec 10 cette instruction déchiffrée, s'il existe une erreur dans cette instruction déchiffrée, et, dans le cas où une telle erreur est détectée dans cette instruction déchiffrée, le module matériel de sécurisation déclenche le signalement d'un faute d'exécution, et, dans le cas où aucune erreur n'a été détectée dans cette instruction déchiffrée, le microprocesseur décode 15 l'instruction déchiffrée et la transmet à l'unité arithmétique et logique qui l'exécute, ou - lorsque la prochaine donnée à traiter par l'unité arithmétique et logique est la donnée déchiffrée lors de l'opération 2), le module matériel de sécurisation vérifie, à l'aide du premier code détecteur d'erreur enregistré associé à cette 20 donnée déchiffrée, s'il existe une erreur dans cette donnée déchiffrée, et, dans le cas où une telle erreur est détectée, le module matériel de sécurisation déclenche le signalement d'une faute d'exécution, et, dans le cas où aucune erreur n'est détectée, l'unité arithmétique et logique traite cette donnée déchiffrée ; 25 ^ - lors de l'étape a), le premier code détecteur d'erreur est un code correcteur d'erreur permettant, en plus, de corriger l'erreur détectée dans l'instruction ou dans la donnée avec laquelle il est concaténé, - lors de l'opération 3) : - lorsque le module matériel de sécurisation détecte une erreur dans 30 l'instruction déchiffrée, en plus de déclencher le signalement d'une faute d'exécution, le module matériel de sécurisation corrige cette erreur à l'aide du premier code détecteur d'erreur déchiffré enregistré ensemble avec cette instruction déchiffrée, puis le microprocesseur décode l'instruction ainsi corrigée et la transmet à l'unité arithmétique et logique 35 qui l'exécute, ou - lorsque le module matériel de sécurisation détecte une erreur dans la donnée déchiffrée, en plus de déclencher le signalement d'une faute d'exécution, le module matériel de sécurisation corrige cette erreur à l'aide du premier code détecteur d'erreur déchiffré associé à cette 40 donnée déchiffrée, puis l'unité arithmétique et logique traite la donnée 4 corrigée ; ^ - lors de l'étape a), chaque ligne de code comprend, en plus du cryptogramme et du code d'authentification de message, un second code détecteur d'erreur permettant de détecter une erreur dans le cryptogramme ou le code 5 d'authentification de message contenu dans la même ligne de code, - lors de l'étape b) avant l'exécution de l'opération 1), le procédé comporte une opération lors de laquelle le module matériel de sécurisation vérifie, à l'aide du second code détecteur d'erreur contenu dans la ligne de code chargée, s'il existe une erreur dans le cryptogramme ou le code d'authentification de 10 message contenu dans la ligne de code chargée, et dans le cas où une telle erreur est détectée, le module matériel de sécurisation déclenche le signalement d'une faute d'exécution et, dans le cas où aucune erreur n'est détectée, le procédé se poursuit par l'opération 1) ; ^ - lors de l'étape a), le second code détecteur d'erreur est un code correcteur 15 d'erreur permettant, en plus, de corriger l'erreur détectée dans le cryptogramme ou le code d'authentification de message contenu dans la même ligne de code, - si le module matériel de sécurisation détecte une erreur dans le cryptogramme ou le code d'authentification de message, en plus de 20 déclencher le signalement d'une faute d'exécution, le module matériel de sécurisation corrige cette erreur à l'aide du second code détecteur d'erreur, puis le procédé se poursuit par l'opération 1) lors de laquelle ce sont le cryptogramme corrigé et le code d'authentification de message corrigé qui sont utilisés ; 25 - - lors de l'opération 1), une première clé de chiffrement est utilisée pour vérifier l'authenticité du cryptogramme contenu dans la ligne de code chargée, et lors de l'opération 2), une seconde clé de déchiffrement est utilisée pour déchiffrer le cryptogramme, cette seconde clé de déchiffrement étant différente de la première clé de déchiffrement ; 30 - - lors de l'étape a), le code binaire fourni comporte un code machine contenant une succession de blocs de base dans lequel : - chaque bloc de base comporte une succession de lignes de code contenant chacune le cryptogramme d'une instruction, les instructions chiffrées dans ces lignes de code successives étant destinées à être 35 exécutées par le microprocesseur systématiquement dans l'ordre de ces lignes de code, et - chaque bloc de base débute à une adresse de branchement et se termine par une ligne de code contenant le cryptogramme d'une instruction de branchement vers une adresse de branchement d'un 40 autre bloc de base, cet autre bloc de base étant appelé « le bloc de 5 base suivant » et le bloc de base qui se termine par la ligne de code contenant le cryptogramme de cette instruction de branchement vers ce bloc de base suivant étant appelé « bloc de base précédent », - le cryptogramme contenu dans une ligne de code spécifique d'un bloc 5 de base suivant ayant été obtenu à l'aide d'un vecteur d'initialisation différent des vecteurs d'initialisation utilisés pour obtenir les cryptogrammes de lignes de code des autres blocs de base, - chaque bloc de base précédent comportant une ligne de code contenant le cryptogramme d'une instruction de chargement qui, 10 lorsqu'elle est exécutée par le microprocesseur, provoque le chargement dans le microprocesseur du vecteur d'initialisation à utiliser pour déchiffrer le cryptogramme de la ligne de code spécifique du bloc de base suivant, - lors de l'opération 2), le module matériel de sécurisation déchiffre le 15 cryptogramme de la ligne de code spécifique d'un bloc de base suivant à l'aide du vecteur d'initialisation chargé dans le microprocesseur lors de l'exécution du bloc de base précédent ; ^ - lors de l'étape a), le code binaire comporte un code machine contenant : - un bloc de base appelé « bloc appelant » qui se termine par une ligne 20 de code contenant le cryptogramme d'une instruction de branchement qui, lorsqu'elle est exécutée par le microprocesseur, réalise un branchement vers une adresse de branchement d'une sous-fonction sécurisée, - un autre bloc de base appelé « bloc de retour », et 25 - la sous-fonction sécurisée formée par un ou plusieurs blocs de base, cette sous-fonction sécurisée étant appelable à partir des différents blocs de base de la fonction sécurisée et débutant, par un premier bloc de base et se terminant par un dernier bloc de base, le premier bloc de base débute à l'adresse de branchement de la sous-fonction sécurisée 30 et le dernier bloc de base se termine par une ligne de code contenant le cryptogramme d'une instruction de branchement particulière appelée « instruction de retour » qui, lorsqu'elle est exécutée par le microprocesseur, réalise un branchement vers l'adresse de branchement du bloc de retour, 35 - lors d'une première exécution de l'opération 2), le module matériel de sécurisation enregistre dans un premier registre du microprocesseur l'adresse de branchement du bloc de retour et le vecteur d'initialisation nécessaire pour déchiffrer ce bloc de retour, puis - lors d'une deuxième exécution de l'opération 2) lors de laquelle l'instruction 40 de retour de la sous-fonction sécurisée est déchiffrée, l'adresse de 6 branchement utilisée pour l'exécution de l'instruction de retour est lue dans le premier registre, puis - lors d'une troisième exécution de l'opération 2) lors de laquelle la ligne de code spécifique du bloc de retour est déchiffrée, le module matériel de 5 sécurisation utilise le vecteur d'initialisation enregistré dans le premier registre pour déchiffrer le cryptogramme de la ligne de code spécifique du bloc de retour ; ^ - avant l'étape b), le procédé comporte l'enregistrement : - d'un premier certificat cryptographique permettant d'authentifier une 10 clé publique d'un système d'exploitation exécuté par le microprocesseur, - d'un deuxième certificat cryptographique permettant d'authentifier une clé publique du microprocesseur, - d'un troisième certificat cryptographique permettant d'authentifier une clé publique de l'auteur de la fonction sécurisée, 15 - un cryptogramme d'une clé d'application déchiffrable à l'aide de la clé publique du microprocesseur, - une signature de la clé d'application vérifiable à l'aide de la clé publique de l'auteur, - au début de l'étape b) le module matériel de sécurisation vérifie dans l'ordre : 20 - l'authenticité du premier et du troisième certificat cryptographique à l'aide de la clé publique du système d'exploitation, - seulement si l'authenticité de la clé publique de l'auteur a été confirmée, l'authenticité de la signature de la clé d'application à l'aide de la clé publique de l'auteur, 25 - seulement si l'authenticité de la signature de la clé d'application a été confirmée, le déchiffrement du cryptogramme de la clé d'application avec la clé publique du microprocesseur, puis - lors de l'opération 2), le déchiffrement du cryptogramme est réalisé à l'aide de cette clé d'application déchiffrée ; 30 ^ lors de l'opération 1), le module matériel de sécurisation : - construit une étiquette à partir du cryptogramme contenu dans la ligne de code chargée, puis - chiffre l'étiquette construite à l'aide d'une clé secrète enregistrée dans une mémoire non volatile du module matériel de sécurisation, puis 35 - compare l'étiquette chiffrée au code d'authentification de message contenu dans la ligne de code chargée, puis - confirme l'intégrité et l'authenticité du cryptogramme seulement si l'étiquette chiffrée est identique à ce code d'authentification de message ; - - lors de l'étape a), le code binaire fourni contient : 40 - une instruction arithmétique et logique comportant un opcode et un ou 7 plusieurs opérandes qui, lorsqu'elle est exécutée par une unité arithmétique et logique du microprocesseur, provoque la réalisation de l'opération Di*D2*...*Dn et l'enregistrement du résultat de cette opération dans un registre Rres, où : 5 - D1 à Dn sont des données enregistrées, respectivement, dans des registres R1 à Rn du microprocesseur, - les registres R1 à Rn sont les registres désignés par les opérandes de l'instruction arithmétique et logique, - le symbole « * » est l'opération arithmétique et logique désignée 10 par l'opcode de l'instruction arithmétique et logique, et - l'indice n est un entier supérieur ou égal à un, - pour chaque registre R1 à Rn, une instruction de chargement qui, lorsqu'elle est exécutée par le microprocesseur, provoque le chargement d'une donnée D, dans le registre R,, où l'indice i est un 15 identifiant du registre R, parmi les registres R1 à Rn, - lors de l'exécution de l'étape b), le procédé comporte les opérations suivantes : - à chaque fois qu'une instruction de chargement d'une donnée D, dans le registre R, est exécutée par le microprocesseur, un module matériel 20 de sécurisation du microprocesseur calcule un code Co à l'aide d'une relation Co = F*(D,), et la donnée chargée D, est enregistrée dans le registre R, et le code Co calculé est enregistré dans le même registre R, ou dans un registre associé au registre R,, la fonction F. étant une fonction préprogrammée du module matériel de sécurisation, 25 - dans le cas où n est supérieur ou égal à deux, cette fonction F. étant un homomorphisme d'un ensemble A de nombres munis de l'opération « * » vers un ensemble B de nombres munis de l'opération « # », qui vérifie la relation : F*(Di* D2 * * Dn) = F*(Di) # F*(D2) # # F*(Dn) = # C2,* # # Cn,*, 30 - dans le cas où n est égal à un, cette fonction F. est telle que F*(Di) = T*(F*(Di)), où la fonction T* est une fonction préprogrammée dans le module matériel de sécurisation, - l'exécution par l'unité arithmétique et logique de l'instruction arithmétique et logique contenue dans le code binaire et l'enregistrement du résultat D r'-p de 35 cette exécution dans le registre Rres, puis - le module matériel de sécurisation : - calcule un code Cres_p à l'aide de la relation Ore", = F*(Dres-p) si n est supérieur à un et, sinon, à l'aide de la relation Ore", =1-*(Dres-p) si n est égal à un, et 40 - calcule un code Cres-t à l'aide de la relation Cres-t # 02* # Cn,*5 8 puis - compare les codes Cres_p et Cres-t et déclenche le signalement d'une faute d'exécution si le code Cres_p ne correspond pas au code Cres-t et, dans le cas contraire, inhibe ce signalement ; 5 ^ - le procédé comporte l'enregistrement dans une mémoire principale à une adresse ©- d'une ligne de code, cette ligne de code contenant : - une donnée D, à traiter par le microprocesseur ou un cryptogramme de cette donnée D,, et - un premier code détecteur d'erreur permettant de détecter une erreur 10 dans la donnée D, ou dans son cryptogramme si cette donnée D, ou son cryptogramme est modifié après son enregistrement dans la mémoire principale, au moins l'un de la donnée D,, de son cryptogramme et du premier code détecteur d'erreur étant chiffré en fonction d'un vecteur d'initialisation iv,, 15 ce vecteur d'initialisation iv, variant en fonction de l'adresse © à laquelle la ligne de code est enregistrée selon une relation iv, = F,,(©), où la fonction F,, est une fonction préprogrammée d'un module matériel de sécurisation du microprocesseur qui associe un vecteur d'initialisation iv, différent à chaque adresse ©- différente de la mémoire principale, 20 - lors de l'exécution du code binaire par le microprocesseur, le procédé comporte les opérations suivantes : - l'exécution d'une instruction de chargement par le microprocesseur qui provoque le chargement dans les registres du microprocesseur de la ligne de code enregistrée à l'adresse ©, puis 25 - le module matériel de sécurisation calcule le vecteur d'initialisation iv, à l'aide de la relation = F,,(©), où © est l'adresse à partir de laquelle la ligne de code a été chargée, puis - le module matériel de sécurisation déchiffre la ligne de code chargée à l'aide du vecteur d'initialisation iv, calculé pour obtenir : 30 - la donnée D, ou son cryptogramme, et - le premier code détecteur d'erreur, puis - le module matériel de sécurisation vérifie, à l'aide du premier code détecteur d'erreur obtenu, s'il existe une erreur dans la donnée D, ou son cryptogramme et, si une telle erreur existe, déclenche le signalement d'une faute d'exécution 35 et, si une telle erreur n'existe pas, inhibe ce signalement d'une faute d'exécution. [0010] 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 des lignes de code, chaque ligne de code 40 contenant : 9 - un cryptogramme d'une seule instruction exécutable par le microprocesseur ou d'une seule donnée à traiter par le microprocesseur, et - un code d'authentification de message permettant de vérifier l'intégrité et l'authenticité du cryptogramme. 5 [0011] L'invention a également pour objet un support d'enregistrement d'informations lisible par un microprocesseur, ce support d'enregistrement d'informations contenant le code binaire revendiqué. [0012] L'invention a également pour objet un microprocesseur pour la mise en oeuvre du procédé revendiqué, ce microprocesseur comportant une unité 10 arithmétique et logique et un module matériel de sécurisation, dans lequel le module matériel de sécurisation est configuré pour exécuter les opérations 1) et 2) du procédé revendiqué. [0013] Enfin, l'invention a également pour objet un compilateur apte à transformer automatiquement un code source d'une fonction sécurisée en un code binaire de 15 cette fonction sécurisée, dans lequel le compilateur est apte à transformer automatiquement le code source en un code binaire revendiqué. [0014] 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 : 20 - 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 de code 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 25 binaire de la fonction sécurisée susceptible d'être exécutée par l'appareil de la figure 1, - la figure 6 est un organigramme d'un procédé d'exécution du code binaire de la fonction sécurisée ; - la figure 7 est une illustration schématique de la structure d'un registre du 30 microprocesseur de l'appareil de la figure 1, - la figure 8 est un organigramme d'un détail d'une étape du procédé de la figure 6 mise en oeuvre pour sécuriser le fonctionnement d'une unité arithmétique et logique du microprocesseur de l'appareil de la figure 1, - la figure 9 est une illustration schématique de la structure d'une ligne de code 35 codant une donnée traitée lors de l'exécution du code binaire par l'appareil de la figure 1, - la figure 10 est un organigramme d'un détail d'une étape du procédé de la figure 6 mise en oeuvre pour sécuriser les données traitées lors de l'exécution du code binaire par l'appareil de la figure 1 40 - la figure 11 est une illustration schématique d'un compilateur apte à générer le code 10 machine exécuté par l'appareil de la figure 1. [0015] Chapitre I : Conventions, notations et définitions : [0016] 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 5 bien connues de l'homme du métier ne sont pas décrites en détails. [0017] Dans cette description, les définitions suivantes sont adoptées. [0018] 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. [0019] Un « code source » est une représentation du programme dans un langage 10 informatique, 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. [0020] 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 15 au préalable de le compiler au moyen d'un compilateur ou de l'interpréter au moyen d'un interpréteur. [0021] Une « instruction » désigne une instruction machine exécutable par un microprocesseur. Une telle instruction est constituée : - d'un opcode, ou code d'opération, codant la nature de l'opération à exécuter, et 20 -d'un ou plusieurs opérandes définissant la ou les valeurs des paramètres de cette opération. [0022] 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 25 machine est directement exécutable par le microprocesseur, c'est-à-dire sans nécessiter une compilation ou une interprétation préalable. [0023] 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 30 plus, généralement, des données numériques traitées par ce code machine. [0024] 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 35 situées du côté de l'instruction initiale sont appelées « instructions précédentes » et les instructions situées du côté de l'instruction finale, sont appelées « instructions suivantes ». Dans ce texte, ce flot d'instructions en mémoire est découpé en une succession de blocs de base immédiatement consécutifs ou séparés par des blocs de données. 40 [0025] Dans ce texte, un « bloc de base » est un groupe d'instructions successives 11 du flot d'instructions qui débute à une adresse de branchement et qui se termine par une seule instruction de branchement explicite ou implicite. Une instruction de branchement explicite se caractérise par la présence explicite d'un opcode dans le code machine qui code l'instruction de branchement. Une instruction de branchement 5 implicite correspond au cas où l'exécution d'un bloc de base précédent se poursuit systématiquement par l'exécution d'un bloc de base suivant situé, dans le code machine, immédiatement après le bloc de base précédent. Dans ce cas, étant donné qu'en absence d'instruction de branchement explicite, les instructions du code machine sont exécutées dans l'ordre les unes après les autres, il n'est pas nécessaire 10 d'introduire à la fin du bloc de base précédent une instruction de branchement explicite vers le bloc de base suivant. Dans cette description, on dit que dans ce cas, le bloc de base précédent se termine par une instruction de branchement implicite car elle n'est pas explicitement codée dans le code machine. Dans ce cas, le bloc de base précédent se termine juste avant l'adresse de branchement du bloc de base 15 suivant. Dans cette demande, l'expression « instruction de branchement » désigne une instruction de branchement explicite à défaut de mention contraire. Ainsi, l'exécution d'un bloc de base débute systématiquement par l'exécution de l'instruction située à son adresse de branchement 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 20 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 25 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. [0026] Une « instruction de branchement » est une instruction qui, lorsqu'elle est 30 exécutée par le microprocesseur, déclenche un saut vers l'adresse de branchement d'un autre bloc de base. Cette instruction de branchement comporte donc au moins l'adresse de branchement de cet autre bloc de base. Typiquement, à cet effet, cette instruction remplace la valeur actuelle du compteur ordinal par la valeur de l'adresse de branchement. On rappelle que le compteur ordinal contient l'adresse de la 35 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 40 dans une mémoire principale. L'instruction de branchement peut être inconditionnelle, 12 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 « JMP » en langage assembleur pour les microprocesseurs de la série x86. L'instruction de branchement peut aussi être 5 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 « JE », « JA » ou « JNE » en assembleur. L'instruction de branchement peut aussi bien être un appel à une fonction. Dans ce texte, le terme « instruction de branchement » 10 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 15 à une instruction de branchement direct, une instruction de branchement indirect ne contient pas directement la valeur numérique de l'adresse de branchement. [0027] Une « adresse de branchement » est l'adresse dans la mémoire principale à laquelle se trouve la première instruction exécutée d'un bloc de base. Par la suite, on parle d'adresse de branchement même pour les blocs de base dont la première 20 instruction est exécutée suite à l'exécution d'une instruction de branchement implicite. [0028] On parle d'exécution d'une fonction pour désigner l'exécution des instructions réalisant cette fonction. [0029] Dans un souci de simplification, dans cette description et dans les figures, les instructions ne sont pas représentées sous forme binaire, mais plutôt sous une forme 25 symbolique exprimée dans un langage évolué de plus haut niveau. [0030] Chapitre II : Architecture de l'appareil : [0031] 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 30 ou similaire. [0032] Le microprocesseur 2 comporte ici : - une unité arithmétique et logique 10 ; - un ensemble 12 de registres ; - un module de commande 14 ; 35 - 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. [0033] La mémoire 4 est configurée pour stocker des instructions d'un code binaire 40 30 d'un programme devant être exécuté par le microprocesseur 2. La mémoire 4 est 13 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 5 microprocesseur 2 comme l'unité 10. [0034] Ici, la mémoire 4 est divisée en mots-machines successifs de longueur fixe. Chaque mot-machine peut être transféré en un seul cycle d'horloge depuis la mémoire 4 jusque dans un registre du microprocesseur. A cet effet, la taille NMM d'un mot-machine est égale au nombre maximum de bits qui peuvent être transférés 10 simultanément de la mémoire 4 vers un registre de l'ensemble 12. Ici, la taille NMM est strictement supérieure Ninst bits, où Ninst bits est le nombre de bits des instructions du jeu d'instructions du microprocesseur 2. Typiquement, N Hist est un entier supérieure ou égale à 8, 16, 32 ou 64. Dans cet exemple, N Hist est égal à 32 et la taille NMM est égale à 128 bits. 15 [0035] A titre d'illustration, 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 au déchiffrement du code binaire 30. 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 20 de code correspond à un mot-machine. Ainsi, une ligne de code est chargée dans un registre du microprocesseur 12 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 code soit une seule instruction soit une seule donnée. La structure d'une ligne de code des fonctions sécurisées est décrite 25 en détail en référence aux figures 2 et 9. [0036] 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 : 30 - un cryptogramme ka* obtenu en chiffrant une clé ka à l'aide d'une clé publique pkcpu du microprocesseur 2, - le cryptogramme ivin,* obtenu en chiffrant, à l'aide de la clé publique pkcpu, un vecteur d'initialisation iv,n, utilisé pour chiffrer le premier bloc de base par lequel l'exécution du code machine 32 débute systématiquement, 35 - une signature S ka* du cryptogramme ka* obtenue en chiffrant une étiquette, construite à partir du cryptogramme ka*, à l'aide d'une clé privée sk't d'un auteur du code binaire 30, - un certificat cryptographique Caut qui permet de vérifier la signature Ska*, ce certificat étant signé à l'aide d'une clé privée skos d'un système d'exploitation et contenant une 40 clé publique pk't qui permet de vérifier l'authenticité de la signature Ska*. 14 [0037] L'étiquette du cryptogramme ka* est typiquement obtenue en appliquant une fonction de hachage prédéterminée (« hash function » en anglais) sur le cryptogramme ka*. Une telle étiquette est plus connue sous le terme anglais de « digest ». 5 [0038] A titre d'illustration, le microprocesseur 2 est conforme à l'architecture RISC (« Reduced Instructions Set Computer »). [0039] Ici, l'unité 10 est une unité arithmétique et logique de N inst bits. [0040] Le chargeur 18 charge dans la file 22 la prochaine instruction à exécuter par l'unité 10 à partir de la mémoire 4. Plus précisément, le chargeur 18 charge 10 l'instruction sur laquelle pointe le compteur ordinal 26. Dans ce mode de réalisation, le chargeur 18 charge dans la file 22 systématiquement et à chaque fois une instruction I, et un code correcteur d'erreur ECC1,. Le code ECC1, est codé sur NEccIj bits, où NEcci, est un nombre entier souvent strictement inférieur à N inst et, généralement, supérieur à 1 ou 2 ou 3 bits. A cet effet, la file 22 comprend une 15 succession de plusieurs registres chacun de largeur égale à NEccq+ N,nst bits. [0041] L'unité 10 est notamment configurée pour exécuter les unes après les autres les instructions 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 20 ces instructions exécutées dans un ou plusieurs des registres de l'ensemble 12. [0042] Dans cette description, on utilisera comme synonymes « exécution par le microprocesseur 2 » et « exécution par l'unité 10 ». [0043] 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 25 données et des instructions, par exemple, depuis la mémoire 4 et/ou le support 6 extérieurs au microprocesseur 2. [0044] 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 30 l'unité 10. Ainsi, il est capable de traiter les lignes de code avant et/ou après que celles-ci soient traitées par l'unité 10. A cet effet, il comporte notamment une mémoire non-volatile sécurisée 29. Aucun accès à cette mémoire 29 sans passer par l'intermédiaire du module 28 n'est prévu. Dans ce mode de réalisation, le module 28 est pré-programmé, par exemple lors de sa conception, pour exécuter des opérations 35 telles que les opérations suivantes : - vérifier un code correcteur d'erreur et corriger l'erreur à partir de ce code si nécessaire, - vérifier un code détecteur d'erreur, - construire un code détecteur ou correcteur d'erreur à partir d'une donnée, 40 - vérifier l'intégrité et l'authenticité d'une donnée à partir d'un code d'authentification 15 de message plus connu sous l'acronyme MAC (« Message Authentification Code »), - chiffrer une donnée pour obtenir un cryptogramme, - déchiffrer un cryptogramme pour obtenir une donnée en claire, - vérifier une signature cryptographique et/ou un certificat cryptographique, 5 - exécuter une fonction préprogrammée F. [0045] La mémoire 29 est utilisée pour stocker les informations secrètes nécessaires à la mise en oeuvre du procédé de la figure 6. Ici, elle comporte donc notamment des 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 : 10 - une clé secrète k' utilisée pour la vérifications des codes d'authentification de message, - un certificat cryptographique C' émis par une autorité de confiance et comportant une clé publique pk' de cette autorité de confiance, - un certificat cryptographique Ccpu qui est signé par l'autorité de confiance à l'aide 15 d'une clé privée sk' qui permet de chiffrer des données qui doivent être déchiffrées à l'aide de la clé publique pk', ce certificat contenant une clé publique pkcpu, - un clé privée secrète skcpu qui permet de déchiffrer les données qui ont été chiffrées à l'aide de la clé publique pkcpu. [0046] Dans cet exemple de réalisation, l'ensemble 12 comporte des registres 20 généraux utilisables pour stocker tout type de données. La taille de chacun de ces registres est, par exemple, égale à NMM. [0047] Un bus d'échange de données 24 qui relie les différents composants du microprocesseur 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. 25 [0048] 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. 30 [0049] CHAPITRE III : SÉCURISATION DU CODE MACHINE : [0050] Ici, la structure du code machine de la fonction sécurisée est décrite dans le cas particulier 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. [0051] Le code machine 32 comporte une succession de lignes de code LI] 35 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 de code LI] parmi les autres lignes de code du code machine 32. De plus, l'indice j est aussi utilisé comme un numéro d'ordre indiquant dans quel ordre les lignes Lli sont classées. Ainsi, on note la ligne de code située immédiatement après la ligne LIi. Chaque ligne de code Lli code 40 une instruction du jeu d'instructions du microprocesseur 2 apte à être exécutée après 16 avoir été déchiffrée et décodée par l'unité 10 de ce microprocesseur. [0052] La structure de toutes les lignes LI, sont identiques. Elle est représentée en détail sur la figure 2 dans le cas particulier de la ligne LI,. La ligne LI, comporte un cryptogramme CI,*, un code MAC,, et un code ECCL,. 5 [0053] Le cryptogramme CI,* est obtenu en chiffrant une concaténation CI, à l'aide de la clé secrète ka et d'un vecteur d'initialisation ivk. Plus précisément, le cryptogramme CI,* est obtenu à l'aide de la relation suivante : CI,* = fka(CI, ; ivk), où fka est une fonction de chiffrement correspondant à une fonction de déchiffrement fka-1 préprogrammée dans le module 28. Typiquement, la fonction fka est une fonction de 10 chiffrement symétrique. Dès lors, la clé ka permettant de déchiffrer le cryptogramme CI,* est préenregistrée dans la mémoire 29 afin de permettre au module 28 de déchiffrer ce cryptogramme CI,*. Comme expliqué plus loin, le vecteur d'initialisation ivk est quant à lui contenu dans une ligne de code précédente du code machine 32. [0054] La concaténation CI, est ici la concaténation d'une instruction I, à exécuter par 15 le microprocesseur 2 et d'un code ECC1,. Le code ECC1, permet de détecter une erreur dans l'instruction I, et de corriger cette erreur. Par exemple, le code ECC1, peut être le code connu sous l'acronyme BCH (Bose, Ray-Chaudhuri, Hocquenghem) qui présente l'avantage d'être particulièrement facile à mettre en oeuvre. Toutefois, tout autre code correcteur d'erreur connu peut être mis en oeuvre. La taille du code ECC1, 20 est supérieure ou égale à 1 ou 2 ou 3 bits et, généralement, inférieure à N inst- La taille du code ECC1, est déterminée en fonction de la robustesse souhaitée. Plus on veut être capable de corriger un nombre de bits erronés important dans l'instruction 1,, plus la taille du code ECC1, sera grande. [0055] Le code MAC, est un code permettant de vérifier l'intégrité et l'authenticité du 25 cryptogramme CI,*. 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 CI,* qui comporte normalement moins de bits que le cryptogramme Ci,*. Cette étiquette est construite à l'aide d'une fonction prédéterminée telle qu'une fonction de hachage. 30 Ensuite, cette étiquette est chiffrée avec 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. [0056] À titre d'exemple, pour générer le cryptogramme CI,* et le code MAC,, un algorithme de chiffrement par flot authentifié est utilisé. Cet algorithme de chiffrement 35 par flot 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 ». [0057] Le code ECCL, est un code correcteur d'erreur qui permet de détecter et de 40 corriger une erreur dans le cryptogramme CI,* et le code MAC,. Il est par exemple 17 construit comme décrit dans le cas du code ECC1,. [0058] Par la suite, on note © l'adresse dans la mémoire 4 à laquelle est enregistrée la ligne LI,. [0059] Le code machine 32 se compose d'une succession de blocs de base qui 5 doivent être exécutés les uns après les autres. Ici, chaque bloc de base se compose d'une succession de lignes de code qui chacune comporte le cryptogramme CI,* de l'instruction I, à exécuter. [0060] La figure 3 repré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 10 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 15 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, 20 - le symbole « » à l'intérieur d'un bloc de base indique que toutes les lignes de code de ce bloc de base n'ont pas été représentées. [0061] Chaque bloc de base débute par une adresse de branchement et se termine par une ligne de code qui contient le cryptogramme d'une instruction de branchement. Sur la figure 2, les symboles « @50 » et « @52 » à côté de la première 25 ligne de code 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. [0062] Le symbole « Load ivxx» indiqué dans l'avant dernière ligne de code du bloc de base indique que cette ligne de code comporte le cryptogramme d'une instruction 30 qui, lorsqu'elle est exécutée par le microprocesseur 2, provoque le chargement d'un nouveau vecteur d'initialisation ivxx dans la mémoire 29. Ainsi, le symbole « Load iv52» indique que le vecteur d'initialisation iv52 est chargé dans la mémoire 29 avant que débute l'exécution du bloc de base 52. [0063] Le symbole « Branch ©XX» indiqué à l'intérieur de la dernière ligne de code 35 du bloc de base indique que cette dernière ligne comporte le cryptogramme d'une instruction qui, lorsqu'elle est exécutée par le microprocesseur 2, provoque un branchement inconditionnel vers l'adresse de branchement @XX. [0064] Ici, le même vecteur d'initialisation ivk est utilisé pour déchiffrer tous les cryptogrammes CI,* de toutes les lignes de code du même bloc de base BBk. L'indice 40 k identifie sans ambiguïté le bloc de base BBk parmi l'ensemble des blocs de base du 18 code machine 32. Dans les figures et dans la description, le symbole ivk est par la suite utilisé pour désigner de façon générale le vecteur d'initialisation à utiliser pour déchiffrer le 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 5 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 désigner le bloc de base systématiquement exécuté immédiatement avant le bloc de base BBk. [0065] Ici, le vecteur d'initialisation ivk est unique pour chaque bloc de base BBk. Par 10 « unique pour chaque bloc de base», on désigne le fait que la probabilité que deux blocs de base différent du code machine 32 soient chiffrés avec le même vecteur d'initialisation ivk est inférieure à une chance sur 100 ou sur 1000. En particulier, l'expression « unique pour chaque bloc de base» couvre donc le cas où les vecteurs d'initialisation ivk de tous les blocs de base sont systématiquement différents les uns 15 des autres. Par exemple, dans un mode de réalisation simple, lors de la génération du code 32, les vecteurs d'initialisation ivk de chaque bloc de base sont tirées de façon aléatoire ou pseudo-aléatoire dans l'ensemble {1 ; [0066] Comme représenté sur la figure 3, dans le code 32, le vecteur d'initialisation ivk est chargé dans la mémoire 29 uniquement lors de l'exécution d'un bloc de base 20 précédent le bloc de base BBk. Sur la figure 3, le vecteur d'initialisation iv52 nécessaire pour déchiffrer le bloc 52 est chargé lors de l'exécution du bloc 50. [0067] 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. Ici, les blocs 60 et 64 sont, par exemple, identiques, 25 respectivement, aux blocs 50 et 52 sauf que le vecteur d'initialisation du bloc 64 est noté «iv64 ». Le bloc 62 est construit comme le bloc 60 et, en particulier, il se termine par deux lignes de code 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 30 parce que le bloc 62 est chiffré en utilisant un vecteur d'initialisation iv62 différent du vecteur iv60 utilisé pour chiffrer le bloc 60. Les autres lignes de code du bloc 62 sont différentes de celles du bloc 60. [0068] La figure 5 représente une partie de l'architecture du code machine 32 lorsqu'un bloc de base se termine par un appel à un code machine 68 d'une sous- 35 fonction sécurisée. 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. [0069] Le code machine 68 peut être appelé à partir de différents blocs de base du 40 code machine 32 et, lorsque l'exécution du code machine 68 est terminée, le flot 19 d'instructions peut retourner vers différents blocs de base du code machine 32. Ainsi, le bloc de base qui doit être exécuté après le bloc de base 82 dépend du bloc de base qui a appelé le code machine 68. Par conséquent, contrairement à ce qui a été décrit en référence aux figures 3 et 4, le bloc de base 80 ne se termine pas par une 5 ligne de code qui code une instruction de branchement systématiquement vers la même adresse mais par une ligne de code qui code une instruction « Return ». Par conséquent, sur la figure 5, le symbole « Return » est utilisé pour identifier la dernière ligne du bloc 82. [0070] Contrairement à l'instruction « Branch » précédemment décrite, l'instruction 10 « Return » ne comporte pas explicitement l'adresse du prochain bloc de base à exécuter. L'instruction « Return » n'est pas non plus précédée d'une instruction de chargement d'un vecteur d'initialisation à utiliser pour déchiffrer le prochain bloc de base à exécuter. [0071] Ici, lorsque l'instruction « Return » est exécutée par le microprocesseur 2, elle 15 provoque : - le chargement d'un nouveau vecteur d'initialisation contenu dans un registre Rp2 du microprocesseur, puis - un saut inconditionnel vers une adresse contenue dans un registre Rp1 du microprocesseur 2. 20 [0072] Ces registres Rp1 et Rp2 sont chargés avec les valeurs adéquates lors de l'exécution du bloc de base à partir duquel le code machine 68 est appelé. Par exemple, sur la figure 5, le code machine 68 est appelé à partir d'un bloc de base 70 et, après l'exécution du code machine 68, l'exécution du code machine 32 doit se poursuivre par l'exécution d'un bloc de base 72. Le bloc de base 70 se termine par 25 deux lignes codant respectivement, le chargement du vecteur d'initialisation iv80 dans la mémoire 29 et un saut inconditionnel vers l'adresse ©80 du bloc de base 80 du code machine 68. [0073] De plus, avant ces lignes, le bloc 70 comporte aussi : - une ligne qui code une instruction de chargement dans le registre Rp1 de l'adresse 30 ©72 du bloc de base 72, et - une ligne qui code une instruction de chargement dans le registre Rp2 du vecteur d'initialisation iv72 nécessaire pour déchiffrer le bloc de base 72. [0074] Sur la figure 5, ces lignes sont désignées par les symboles, respectivement « Load Rp1, @72 » et « Load Rp2, iV72 ». 35 [0075] Ainsi, lors de l'exécution de l'instruction « Return », le prochain bloc de base exécuté sera le bloc de base 72 et le vecteur d'initialisation utilisé pour le déchiffrer sera le vecteur iv72 chargé dans le registre Rp2. [0076] De préférence, les registres Rp1 et Rp2 sont des registres d'une pile d'appel de manière à permettre des appels à des sous-fonctions à partir des blocs de base 40 d'autres sous-fonctions. 20 [0077] La figure 6 représente un procédé d'exécution du code binaire 30 par le microprocesseur 2. [0078] Le procédé débute par une étape 150 de fourniture du code binaire 30 dans la mémoire 4. Pour cela, par exemple, le microprocesseur 2 recopie la copie 40 à 5 l'intérieur de la mémoire 4 pour obtenir le code binaire 30 enregistré dans la mémoire 4. [0079] Ensuite, lors d'une phase 152, le microprocesseur 2 exécute le code binaire 30 et, en particulier, le code machine 32. [0080] L'exécution du code binaire 30 commence par une étape 154 10 d'authentification de l'auteur de ce code binaire. Lors de cette étape, le module 28 réalise successivement les opérations suivantes : - lors d'une opération 156, le module 28 vérifie l'authenticité du certificat Copu à l'aide de la clé publique pkos contenue dans le certificat Cos. - lors d'une opération 158, le module 28 charge le certificat CAUT à partir du bloc 34 15 puis vérifie son authenticité à l'aide de la clé publique pkos contenue dans le certificat cos - - lors d'une opération 160, le module 28 charge la signature S ka* à partir du bloc 34 et vérifie son authenticité à l'aide de la clé pkAuT contenue dans le certificat CAUT- [0081] Si toutes les opérations de vérification 156, 158 et 160 ont été réussies avec 20 succès, alors le code binaire est correctement authentifié et le procédé se poursuit par une étape 162. À l'inverse, si l'une des opérations 156, 158 ou 160 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. 25 [0082] Lors de l'étape 162, le module 28 charge les cryptogrammes ka* et ivin,* contenus dans le bloc 34 et les déchiffre à l'aide de la clé skopu contenue dans la mémoire 29. À l'issue de l'étape 162, la clé ka et le vecteur d'initialisation iv,n, utilisé pour déchiffrer le premier bloc de base du code machine 32 sont contenus dans la mémoire 29. 30 [0083] 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,n, du code machine 32. [0084] L'exécution de chaque bloc de base consiste à exécuter, dans l'ordre où les lignes de code LI, de ce bloc de base sont enregistrées dans la mémoire 4, les instructions codées par chacune de ces lignes de code. 35 [0085] Pour chacune des lignes de code LI, à exécuter du code machine 32, le microprocesseur 2 exécute les étapes suivantes. [0086] Lors d'une étape 164, le microprocesseur 2 charge dans un registre de l'ensemble 12, la ligne de code enregistrée à l'adresse © contenue dans le compteur ordinal 26. 40 [0087] Ensuite, le module 28 procède à une étape 166 de sécurisation de 21 l'instruction codée dans la ligne de code chargée. [0088] Le fonctionnement de l'étape 166 est maintenant décrit dans le cas de la ligne LIJ. Plus précisément, lors de l'étape 166, le module 28 réalise successivement les opérations suivantes. 5 [0089] Lors d'une opération 170, le module 28 vérifie s'il existe une erreur dans le cryptogramme CI;* ou le code MAC; à l'aide du code ECCE; contenu dans la ligne LI; chargée. Par exemple, pour cela, le module 28 construit, à l'aide d'une fonction préprogrammée et du cryptogramme CI;* et du code MACJ, un code ECCE;'. Si le code ECCE;' est différent du code ECCE;, alors une erreur est détectée. Si une erreur est 10 détectée, le module 28 procède immédiatement à une étape 172. [0090] Lors de l'étape 172, le module 28 déclenche le signalement d'une faute d'exécution. [0091] 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;* 15 et le code MAC; à partir des informations contenues dans le code ECO* À 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 LIJ. [0092] L'opération 170 permet notamment de détecter et de corriger des fautes 20 introduites dans les lignes de code stockées dans la mémoire 4 ou dans le support 6. [0093] À 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. [0094] Lors de l'opération 176, le module 28 vérifie l'intégrité et l'authenticité du cryptogramme CI;* à l'aide du code MACJ. Par exemple, pour cela, le module 28 25 construit une étiquette du cryptogramme CI;* puis chiffre cette étiquette avec la clé k' contenue dans sa mémoire 29. Si le cryptogramme ainsi construit est identique au code MAC; chargé, alors l'intégrité et l'authenticité du cryptogramme CI;* 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. 30 [0095] L'opération 176 permet d'une part de valider l'authenticité de la ligne de code chargée et aussi de valider que, lors de l'opération 174, le cryptogramme CI;* et/ou le code MAC; ont correctement été corrigés. La vérification de l'authenticité empêche le remplacement de la ligne de code par une autre ligne de code construite par un auteur qui ne connaît pas la clé k'. 35 [0096] Lors de l'opération 178, le module 28 déchiffre le cryptogramme CI;* en utilisant la clé ka et le vecteur d'initialisation ivk pour obtenir l'instruction I; et le code ECC,; déchiffrés. La clé ka a été enregistrée dans la mémoire 29 lors de l'étape 162. Le vecteur ivk nécessaire pour déchiffrer le cryptogramme CI;* a été enregistré dans la mémoire 29 lors de l'exécution du bloc de base précédent celui qui contient cette 40 ligne LI; actuellement traitée. Si la ligne LI; est contenue dans le premier bloc de base 22 BB,,, du code machine 32, c'est le vecteur iv,n, enregistré dans la mémoire 29 lors de l'étape 162 qui est utilisé. [0097] Ici, c'est l'exécution de l'instruction de branchement par l'unité 10 qui indique au module 28 qu'il doit remplacer le vecteur d'initialisation actuellement utilisé par le 5 vecteur d'initialisation chargé lors de l'exécution du bloc de base précédent. [0098] Ensuite, lors d'une opération 180, le module 28 enregistre l'instruction I, déchiffrée et le code ECO', déchiffré dans la file 22. [0099] Une fois que l'unité 10 a exécuté toutes les instructions qui précédent l'instruction I, dans la file 22, c'est-à-dire lorsque l'instruction I, est la prochaine 10 instruction à exécuter par l'unité 10, le module 28 procède à une opération 184. [00100] Lors de l'opération 184, le module 28 vérifie s'il existe une erreur dans l'instruction I, contenue dans la file 22 à l'aide du code ECO', associé à l'instruction I, et contenu dans cette même file 22. Cette opération est réalisée de façon similaire à ce qui a été décrit pour l'opération 170. 15 [00101] Si le module 28 détecte une erreur, alors il procède immédiatement à l'étape 172. De plus, en parallèle, lors d'une opération 186, le module 28 corrige l'instruction I, à l'aide du code ECC4. L'opération 186 est similaire à l'opération 174. [00102] Ensuite, à l'issue de l'opération 186 ou si aucune erreur n'a été détectée lors de l'opération 184, l'étape 166 se termine et le procédé se poursuit par une étape 190 20 d'exécution de l'instruction I; par l'unité 10. [00103] Comme représenté sur la figure 6, en parallèle de l'étape 190, le procédé peut comporter : - une étape 198 de sécurisation de l'unité 10, et/ou - une étape 250 de sécurisation des données traitées. 25 [00104] Ces étapes 198 et 250 sont décrites plus en détail dans les chapitres suivants. [00105] L'opération 184 permet de détecter une modification de l'instruction I, qui interviendrait entre l'instant où elle est enregistrée dans la file 22 et l'instant où elle est exécutée par l'unité 10. L'opération 184 permet aussi de déclencher une faute 30 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-1 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_i, le vecteur d'initialisation est chargé dans la mémoire 29. Dès lors, lors de l'exécution du bloc BBt, le 35 cryptogramme CI,* est déchiffré à l'aide du vecteur ivk qui correspond au BBk et non pas à l'aide du vecteur ivt qui correspond au bloc BBt. Par conséquent, le déchiffrement du cryptogramme CI,* à l'aide du vecteur ivk conduit à l'obtention d'une instruction I, et d'un code ECO', incorrects et ceci est détecté lors de l'opération 184. [00106] De façon similaire, l'opération 184 permet aussi de détecter une perturbation 40 de l'exécution de l'opération « Return » du bloc de base 82. 23 [00107] Lors de l'exécution du code machine 32, si des attaques conduisent à altérer une instruction à 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 5 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 10 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 15 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. 20 [00108] 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 170, 176 ou 184. 25 [00109] CHAPITRE IV : SÉCURISATION DE L'UNITÉ ARITHMÉTIQUE ET LOGIQUE 10 : [00110] Dans ce chapitre, par « instruction arithmétique et logique », on désigne une instruction du jeu d'instructions du microprocesseur 2 qui, lorsqu'elle est exécutée par ce microprocesseur, enregistre dans un registre Rres du microprocesseur une donnée 30 obtenue : - soit en modifiant les bits d'une seule donnée D1 enregistrée dans un registre du microprocesseur, ou, - soit en combinant entre eux les bits de plusieurs données D1 à Dn enregistrées, respectivement, dans des registres R1 à Rn du microprocesseur 2, où n est un entier 35 égal au nombre de données à combiner. Classiquement, n est égal à deux dans le cas où plusieurs données doivent être combinées. n égal à un correspond au cas où l'instruction arithmétique et logique modifie les bits d'une seule donné D1. [00111] Les registres dans lesquels sont enregistrées la ou les données à traiter sont 40 typiquement identifiés par un ou plusieurs opérandes de l'instruction arithmétique et 24 logique. De même, le registre Rres dans lequel le résultat Dres_p de l'instruction arithmétique et logique doit être enregistré peut aussi être identifié par un opérande de cette instruction arithmétique et logique. [00112] L'opcode de l'instruction arithmétique et logique identifie l'opération à 5 exécuter par l'unité 10 pour modifier ou combiner la ou les données D1 à Dn. Par la suite, le symbole « * » est utilisé pour désigner de façon générique cette opération. Ainsi, la notation D1*D2*...*Dn désigne de façon générique l'opération exécutée par l'instruction arithmétique et logique lorsqu'elle est exécutée par le microprocesseur 2. [00113] Dans le cas où n est égal à un, l'opération arithmétique et logique est par 10 exemple choisie dans le groupe constitué : - des opérations de décalage à droite et à gauche des bits de la donnée D1, et - des opérations d'extraction d'une plage de bits prédéfinie de la donnée D1. [00114] Dans le cas où n est supérieur ou égal à deux, l'opération « * » est choisie dans le groupe constitué des opérations suivantes : 15 - l'opération arithmétique d'addition, - l'opération arithmétique de soustraction, - l'opération arithmétique de multiplication, - l'opération arithmétique de division, - l'opération logique « OU », 20 - l'opération logique « OU exclusif », - l'opération logique « ET ». [00115] En injectant des fautes lors du fonctionnement de l'unité 10, il est possible de perturber son fonctionnement de sorte que le résultat de l'exécution de l'instruction arithmétique et logique ne correspond pas à celui attendu. On dit alors qu'on a 25 provoqué un dysfonctionnement de l'unité 10. [00116] Ce chapitre décrit une solution pour détecter un tel dysfonctionnement de l'unité 10. Ici, cette solution est décrite dans le cas particulier où elle est implémentée en combinaison avec la solution décrite au chapitre précédent. Elle correspond à l'étape 198 représentée sur la figure 6. 30 [00117] Les registres R1 à Rn et le registre Rres sont, par exemple, des registres de l'ensemble 12 du microprocesseur 2. [00118] Par la suite, l'étape 198 est décrite dans le cas particulier où les instructions arithmétique et logique dont on souhaite sécuriser l'exécution sont les instructions de la liste suivante : 35 1 : L'instruction d'addition des données D1 et D2 contenues dans, respectivement, les registres R1 et R2. Cette opération est désignée par le pseudocode « ADD R1, R2 ». 2: L'instruction de soustraction des données D1 et D2 contenues dans, respectivement, les registres R1 et R2. Le pseudocode utilisé pour désigner cette opération est « SUB R1, R2 ». 40 3: L'instruction de multiplication des données D1 et D2 contenues dans, 25 respectivement, les registres R1 et R2. Le pseudocode utilisé pour désigner cette opération est « MUL R1, R2 ». 4: L'instruction de division de la donnée D1 par la donnée D2 contenue dans, respectivement, les registres R1 et R2. Le pseudocode utilisé pour désigner cette 5 opération est « DIV R1, R2 ». 5 : L'instruction « OU exlcusif » entre les données D1 et D2 contenues dans, respectivement, les registres R1 et R2. Le pseudocode utilisé pour désigner cette opération est « XOR R1, R2 ». 6 : L'instruction « ET logique » entre les données D1 et D2 contenues dans, 10 respectivement, les registres R1 et R2. Le pseudocode utilisé pour désigner cette opération est « AND R1, R2 ». 7 : L'instruction « OU logique » entre les données D1 et D2 contenues dans, respectivement, les registres R1 et R2. Le pseudocode utilisé pour désigner cette opération est « OR R1, R2 ». 15 8 : L'instruction de décalage d'un bit à droite de la donnée D1 contenue dans le registre R1. Le pseudocode utilisé pour désigner cette opération est « SHIFTR R1 ». 9 : L'instruction de décallage d'un bit à gauche de la donnée D1 contenue dans le registre R1. Le pseudocode utilisé pour désigner cette opération est « SHIFTL R1 ». [00119] Par la suite, le numéro associé par la liste ci-dessus à chaque instruction 20 arithmétique et logique est utilisé pour identifier cette instruction. Ainsi, l'instruction 11 est l'addition, l'instruction 12 est la soustraction et ainsi de suite. [00120] Ici, la taille de chaque donnée D1, D2 et Dr' est par exemple égale à la taille des instructions I; du jeu d'instructions du microprocesseur 2. Ici, cette taille est donc égale à 32 bits. 25 [00121] Les structures des registres R1, R2 et Rres sont identiques et représentées dans le cas particulier du registre R1 sur la figure 7. [00122] Le registre R1 comporte : - une plage de 32 bits contenant la donnée D1, - une plage contenant un code ECCD1 permettant de détecter et de corriger une 30 erreur dans la donnée D1, et - neuf plages de bits successives contenant, respectivement, des codes 01,1 à 01,9. [00123] Le code ECCD1 est par exemple construit comme décrit dans le cas du code ECCIi sauf qu'il est construit à partir de la donnée D1 et non pas à partir de l'instruction Par exemple, ce code ECCIEn est généré lors de l'exécution ou lors de 35 la génération du code binaire 30. [00124] Lors de l'enregistrement de la donnée D1 dans le registre R1, chaque code C1,1 à C1,9 est généré par le module 28 à l'aide d'une relation préprogrammée définie de façon générique de la façon suivante : Ci,* = F*(Di) où : - l'indice i identifie un registre parmi les registres R1, R2 et Rres, 40 - l'indice * identifie l'instruction arithmétique et logique parmi les instructions 11 à 19, et 26 - la fonction F* est une fonction préprogrammée dans le module 28 associée à l'instruction arithmétique et logique identifiée par l'indice *. [00125] La taille du code Co est notée La taille est généralement inférieure à la taille des données D1, D2 et Dres et souvent au moins deux fois plus petite. 5 [00126] Ici, les valeurs 1, 2 et 3 de l'indice i désigne, respectivement, les registres R1, R2 et Rres. Les valeurs 1 à 9 de l'indice * désigne, respectivement, les instructions 11 à 19. [00127] Dans le cas des instructions pour lesquelles n est supérieur ou égal à 2, c'est-à-dire ici dans le cas des instructions 11 à 17, la fonction F* est un 10 homomorphisme d'un ensemble A muni de l'opération « * » vers un ensemble B muni de l'opération « # » telle que F*(D1*D2) = F*(Di) # F*(D2). Ici, l'ensemble A est l'ensemble des nombres codables sur 32 bits, c'est-à-dire l'ensemble des données D1 et D2 possibles. L'ensemble B est l'ensemble des nombres codables sur NI,,* bits. Autrement dit, en utilisant les notations précédemment introduites, la fonction F* est 15 telle que F*(Dr'-p) = C1, # C2,* en cas d'absence de dysfonctionnement de l'unité 10. [00128] Pour chaque instruction 11 à 17, il est possible de trouver de nombreuses fonctions F. qui conviennent. Ci-dessous, à titre d'illustration, pour chacune des instructions 11 àI7, une ou plusieurs fonctions F. possibles sont données. [00129] Une fonction EDC(D,) qui retourne à un code détecteur d'erreur de la donnée 20 D,. Cette fonction EDC est par exemple une somme de contrôles (« checksum » en anglais). De telles fonctions EDC(D,) présentent une ou plusieurs des propriétés suivantes : - EDC(D1 + D2) = EDC(D1) + EDC(D2), - EDC(D1- D2) = EDC(D1) - EDC(D2), 25 - EDC(D1 x D2) = EDC(D1) x EDC(D2), où les symboles « + », « - », et « x » désignent respectivement, les opérations d'addition, de soustraction et de multiplication. [00130] Ainsi, de telle fonctions EDC conviennent pour la réalisation des fonctions F1, F2 et F3. On notera de plus que dans ce cas particulier, les opérations « # » et « * » 30 sur les ensembles B et A sont identiques. [00131] La fonction p(D,) qui retourne 0 si la donnée D, est paire et 1 sinon. Cette fonction présente la propriété suivante : p(D1 + D2) = p(D1) XOR p(D2) et p(D1 x D2) = p(D1) OR p(D2), où les symboles « XOR » et « OR » désignent, respectivement, les opérations « OU exclusif » et « OU ».Cette fonction convient donc pour 35 l'implémentation des fonctions F1 et F3. [00132] Une fonction logarithme notée « Log ». Une fonction logarithme présente les propriétés suivantes : Log(D1 x D2) = Log(D1) + Log(D2) et Log (D1/D2) = Log(D1) Log(D2), où le symbole « / » désigne l'opération de division. Ainsi, un logarithme convient pour des implémentations des fonctions F3 et F4. Dans ce cas, l'opération 40 « # » est l'addition ou la soustraction. 27 [00133] La fonction CS(D,) qui retourne la somme de contrôles de la donnée D,. Cette fonction présente les propriétés suivantes : - CS(D1 XOR D2) = CS(D1) XOR CS(D2), - CS(D1 AND D2) = CS(D1) AND CS(D2), 5 - CS(D1 OR D2) = CS(D1) OR CS(D2), où le symbole « AND » désigne l'opération « ET » logique. Ainsi, cette fonction convient pour une implémentation des fonctions F5, F6 et F7. [00134] Dans le cas où n est égal à 1, c'est-à-dire ici dans le cas des instructions 18 et 19, la fonction F* n'est pas un homomorphisme. Dans ce cas, la fonction F* est tel qu'il 10 existe une fonction T* tel que F*(Di) = T*(F*(Di)). Autrement dit, la fonction T* est invariante par F*(Di). La fonction T* retourne donc le code Cl,* à partir du code C1,*. [00135] Dans le cas de l'instruction 19, la fonction Fg est par exemple la fonction qui calcule une somme de contrôle sur tous les bits de la donnée D1 sauf sur son bit de poids le plus fort, c'est-à-dire sans prendre en compte le bit le plus à gauche de la 15 donnée D1. La fonction T9 est alors la même somme de contrôle sur tous les bits de F9(D1) sauf le bit de poids le plus faible, c'est-à-dire celui situé le plus à droite dans F9(D1). Avec de telles fonctions F9 et T9, on a bien la relation suivante : F9(D1) = T9(F9(D1)). Ces fonctions F9 et T9 conviennent donc pour l'instruction 19. [00136] De plus, en choisissant les fonctions F8 et T8 égales, respectivement, aux 20 fonctions T9 et F9, on obtient une implémentation possible pour les fonctions F8 et T8. [00137] La figure 8 représente le détail des opérations réalisées par microprocesseur 2 lors de l'exécution de l'étape 198 pour sécuriser l'exécution des instructions arithmétique et logique I1 à 19. [00138] À chaque fois qu'une instruction de chargement d'une donnée dans l'un des 25 registres R, est exécutée par l'unité 10, lors de l'étape 190, la donnée D, et le code EECDI sont écrits dans ce registre R,. [00139] En réponse, lors d'une opération 202, pour chaque instruction h à 19, le module 28 calcule chacun des codes Co correspondant à l'aide de la relation Co = F*(D,), où : 30 - D, est la nouvelle donnée chargée dans le registre R,, et - la fonction F* est la fonction préprogrammée dans le module 28 et associée à l'opération « * ». [00140] Chacun des codes Co ainsi calculés est enregistré dans le registres R, comme représenté sur la figure 7. 35 [00141] Avant l'exécution des instructions h à 17, l'opération 202 est exécutée une fois pour la donnée D1 et une fois pour la donnée D2. Dans le cas des instructions 18 et 19, il suffit que l'opération 202 soit exécutée une seule fois pour la donnée D1 avant l'exécution de l'une des instructions 18 et 19. [00142] Ensuite, à chaque fois qu'une instruction arithmétique et logique est sur le 40 point d'être exécutée par l'unité 10, juste avant son exécution, lors d'une opération 28 204, le module 28 vérifie s'il existe une erreur dans la donnée contenue dans le registre R, identifié par un opérande de l'instruction I, à exécuter. [00143] Lors de cette opération, pour chaque registre R, concerné, le module 28 vérifie, à l'aide du code EECD,, si la donnée D, actuellement enregistrée dans ce 5 registre présente une erreur ou pas. Cette opération est, par exemple, réalisée comme décrit dans le cas de l'opération 170. [00144] Si le module 28 détecte une erreur, il procède à l'étape 172 et, en parallèle, à une opération 206. Lors de l'opération 206, il corrige la donnée D,. L'opération 206 est par exemple réalisée de façon similaire à ce qui a été décrit pour l'opération 174. 10 [00145] Si le module 28 ne détecte aucune erreur ou à l'issue de l'opération 206, lors de l'étape 190, le microprocesseur 2 décode l'instruction I, puis l'unité 10 l'exécute et enregistre le résultat Dres-p dans le registre Rres. [00146] En réponse, lors d'une opération 210, le module 28 calcule le code ECCD3 et tous les codes C3,* à partir de la donnée Dres-p enregistrée dans le registre Rres et 15 enregistre ces différents codes calculés dans le registre Rres. Typiquement, le calcul des codes C3,* est ici réalisé comme décrit pour l'opération 202. [00147] Ensuite, lors d'une opération 212, le module 28 vérifie si un dysfonctionnement de l'unité 10 s'est produit lors de l'exécution de l'instruction arithmétique et logique. 20 [00148] Si l'instruction exécutée lors de l'étape 190 est l'une des instructions I1 à 17, alors le module 28 exécuté les sous-opérations suivantes. [00149] Lors d'une sous-opération 214, le module 28 sélectionne, parmi les instructions I1 à 17, celle qui correspond à l'opération arithmétique exécutée. Dans les sous-opérations suivantes, le symbole « * » désigne l'instruction ainsi sélectionnée et 25 F* la fonction préprogrammée qui lui est associée. [00150] Lors d'une sous-opération 216, le module 28 sélectionne aussi, parmi les différents codes C3,* enregistrés dans le registre Rres, le seul code C3,* qui correspond à l'instruction sélectionnée. Par la suite, le code C3,* sélectionné lors de cette sous-opération est noté Cres-p. 30 [00151] Puis, lors d'une sous-opération 218, le module 28 calcule aussi un code Cres_t en combinant les codes Cl,* et C2,* enregistrés, respectivement, dans les registres R1 et R2 préalablement à l'exécution de l'instruction arithmétique et logique. Plus précisément, le module 28 calcule le code Cres-t à l'aide de la relation suivante : Cres-t C1,*# C2,*, où le symbole « # » désigne l'opération telle que F*(D1*D2) = F*(Di) # F*(D2). 35 [00152] Par exemple, dans le cas de l'instruction 11 et de la fonction parité p(..) précédemment décrite, l'opération « # » est l'opération « OU exclusif ». Dans ce cas, le code Cres-t est le résultat du ou exclusif suivant C1,1 XOR C2,1. [00153] Enfin, lors d'une sous-opération 220, le module 28 compare les codes Cres-p et Cres-t calculés. Si ces codes sont différents, le module 28 déclenche l'exécution de 40 l'étape 172. Dans le cas contraire, aucun signalement d'une faute d'exécution n'est 29 déclenché et le procédé se poursuit par l'exécution de l'instruction suivante de la file 22. [00154] L'exécution de ces sous-opérations 214 à 220 permet de détecter un dysfonctionnement de l'unité 10 car les codes calculés Cres_p et Cres-t sont identiques 5 seulement si l'unité 10 a correctement exécuté l'opération « * ». Ceci s'explique par la relation suivante : Otes_p = F*(Dres_p) = F*(D1*D2) = F*(Di) # F*(D2) = C1,*# C2,* Cres-t- [00155] Si l'instruction exécutée lors de l'étape 190 est l'une des instructions 18 et 18, alors lors d'une sous-opération 222, le module 28 sélectionne la fonction T* associée à cette instruction arithmétique et logique, c'est-à-dire la fonction T8 s'il s'agit de 10 l'instruction 18, sinon la fonction T9. [00156] Lors d'une sous-opération 224, le module 28 sélectionne le code Ci,* associé à l'opération « * » exécutée lors de l'étape 190. Ce code sélectionné est noté Cres-t- [00157] Lors d'une sous-opération 226, le module 28 calcule un code Cres_p à l'aide de la relation Cres_p = T*(Dres_p) où T* est la fonction sélectionnée lors de la sous- 15 opération 222. [00158] Après la sous-opération 224, le procédé se poursuit par la sous-opération 220. [00159] Dans le cas des instructions 18 et 18, les codes Cres_p et Cres-t sont identiques uniquement si l'unité 10 a correctement fonctionné. Ceci se démontre à l'aide de la 20 relation suivante : Cres_p = T*(Dres_p) = T*(F*(Di)) = F*(Di) = = Cres-t. [00160] CHAPITRE V : SÉCURISATION DES DONNÉES [00161] 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 25 typiquement contenues dans des blocs de données qui correspondent chacun à une plage prédéterminée d'adresses de la mémoire 4 dédiée au stockage de ces données. De tels blocs de données sont aussi connus sous le terme de « segment de données » ou de « page de données ». [00162] Pour lire une donnée d'un bloc de données, le code machine 32 comporte 30 une instruction de chargement qui, lorsqu'elle est exécutée par le microprocesseur 2, provoque le chargement d'une ligne de code LD, située à l'adresse © à l'intérieur de ce bloc de données. Dans ce cas, contrairement aux lignes de code LI, décrites dans le chapitre III, la ligne LD, code une donnée D, à traiter par le microprocesseur et non pas une instruction I, exécutable par l'unité 10. 35 [00163] Pour écrire une donnée dans un bloc de données, le code machine 32 comporte une instruction d'écriture qui, lorsqu'elle est exécutée par le microprocesseur 2, provoque l'écriture d'une ligne LD, dans l'un des blocs de données. [00164] De façon similaire à ce qui a été décrit dans le cas des instructions I,, une 40 donnée D, peut être corrompue dans la mémoire 4 ou dans des registres du 30 microprocesseur 2 par la mise en oeuvre d'attaques telle qu'une attaque par injection de fautes. De plus, un attaquant peut aussi essayer de modifier le fonctionnement du code binaire 30 en déplaçant les données codées dans la mémoire 4 ou en les remplaçant par des données plus anciennes. Ainsi, il est aussi utile de sécuriser les 5 données enregistrées dans la mémoire 4 ou dans des registres internes du microprocesseur. [00165] À cet effet, chaque ligne de code LD, codant une donnée présente la structure représentée sur la figure 9. La structure des lignes LD, est pratiquement identique à celle des lignes LI, codant des instructions. Plus précisément, la structure de la ligne 10 LD, est identique à la structure de la ligne LI, sauf que le cryptogramme CI,* est remplacé par un cryptogramme CD,*. Étant donné que les codes MAC, et ECCE; de la ligne LD, sont calculés comme déjà décrit dans le cas des lignes LI,, ils sont ici désignés par les mêmes symboles et ne seront pas décrits à nouveau. [00166] Le cryptogramme CD,* est obtenu en chiffrant, avec la fonction f ka, une 15 concaténation CD,. Ici, la fonction fka 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,* = fka(CD, ; iv,). La fonction fka est préprogrammée dans le module 28. [00167] La concaténation CD, est la concaténation de la donnée D, et d'un code ECCD,. Le code ECCD, permet de détecter et de corriger une erreur dans la donnée D. 20 II est typiquement construit comme décrit pour le code ECC1. [00168] Le cryptogramme CD,* diffère du cryptogramme CI,* en ce que le vecteur d'initialisation utilisé lors du chiffrement de la concaténation CD, est fonction de l'adresse ©- où est enregistrée la ligne LD,. À cet effet, le module 28 comporte une fonction préprogrammée F, qui, à chaque adresse © de la mémoire 4 associe un 25 vecteur d'initialisation iv, différent. De préférence, la fonction F,v est telle qu'à deux adresses consécutives quelconque © et elle associe deux vecteurs différents, respectivement et et l'écart entre les valeurs numériques de ces deux vecteurs et varie en fonction de l'indice j. Par exemple, la fonction F,v est une fonction de hachage ou de chiffrement. On a donc la relation suivante : = Fiv(M. 30 [00169] La sécurisation des données D, va maintenant être décrite plus en détail en référence au procédé de la figure 10 et dans le cas particulier où elle est mise en oeuvre en combinaison avec les enseignements des chapitres précédents. 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 chargement ou d'écriture ou de 35 traitement d'une donnée D. Le procédé de la figure 10 représente les opérations exécutées lors de l'étape 250 pour sécuriser les données D. [00170] À chaque fois que lors de l'étape 190, l'unité 10 exécute une instruction qui conduit à enregistrer une nouvelle donnée D, dans un registre noté ici R, du microprocesseur 2, lors d'une opération 252, le module 28 calcule le code ECCD, à 40 partir de la donnée D. Ce code ECCD, calculé est ensuite concaténé avec la donnée 31 D, dans le registre R. [00171] Ultérieurement, lors d'une nouvelle exécution de l'étape 190, l'unité 10 exécute une instruction d'enregistrement de la donnée D, contenue dans le registre R, à l'adresse © de la mémoire 4. 5 [00172] En réponse, lors d'une opération 254, le module 28 construit la ligne de code LD, qui doit être enregistrée à l'adresse © à partir de la donnée D. Pour cela, lors de cette opération, le module 28 : - calcule un vecteur d'initialisation iv, à l'aide de la relation iv, = F,v(©), puis - chiffre la concaténation CD, de la donnée D, et du code ECCD, à l'aide de la fonction 10 fka et du vecteur d'initialisation iv, calculé selon la relation suivante : CD,* = fka(CD, ; puis - calcule le code MAC, à partir du cryptogramme CD,*, puis - calcule le code ECCE; à partir du cryptogramme CD,* et du code MAC, calculé. [00173] Ensuite, la ligne LD, construite est transférée et enregistrée dans la mémoire 15 4 à l'adresse ©. [00174] L'adresse ©- est située à l'intérieur d'un bloc prédéterminé de données BDm. Chaque bloc de données BDm est associé à un code EDCm qui permet de détecter une erreur si l'une des lignes de code contenues dans ce bloc BDm a été modifiée depuis la dernière mise à jour du code EDCm. Le code EDCm est donc un code 20 détecteur d'erreur. [00175] Le code EDCm peut être contenu dans la mémoire 4, par exemple à la fin du bloc de données BDm associé à ce code ou dans un registre du microprocesseur associé au bloc BDm. [00176] Lors d'une opération 256, immédiatement après ou en parallèle de l'exécution 25 de l'instruction d'écriture de la nouvelle ligne LD, dans le bloc BDm, le code EDCm associé à ce bloc BDm est mis à jour puis enregistré. Ici, pour accélérer l'exécution de cette opération 256, le code EDCm est défini par la relation suivante : EDCm = MAC1 MAC2 ... MACmm, où : - le symbole CD désigne l'opération « OU exclusif », 30 - les code MAC1 à MACmm sont les codes MAC, de toutes les lignes LD, du bloc BDm, et - mm est le nombre de lignes LD, contenues dans le bloc BDm. [00177] Lorsque le code EDCm est ainsi défini, l'opération 256 peut être réalisée à l'aide de la relation suivante : EDCm = EDCm CD MAC, old - GD ---- mAr joew, où 35 - les symboles EDCm à droite et à gauche du signe « = » désignent, respectivement, l'ancienne valeur du code EDCm avant l'enregistrement de la nouvelle ligne LD, et la nouvelle valeur du code EDCm après l'enregistrement de cette nouvelle ligne LD,, - MAC oid j désigne le code MAC, de l'ancienne ligne LD, qui est remplacée par la nouvelle ligne LD,, et 40 - MACjnew désigne le code MAC, de la nouvelle ligne LD, qui est enregistrée à 32 l'adresse ©. [00178] Ainsi, le nombre d'opérations à exécuter pour mettre à jour le code EDCm est limité. [00179] L'opération 256 peut être réalisée par le module 28 ou par une unité de calcul 5 incorporée dans la mémoire 4. De telles mémoires 4 incorporant une unité de calcul sont connues sous le terme anglais de « smart RAM » ou « In-memory computing ». [00180] Si la prochaine instruction à exécuter lors de l'étape 190 est une instruction de chargement d'une ligne LD,, alors, lors d'une opération 260, le module 28 vérifie, à l'aide du code EDCm, s'il existe une erreur dans le bloc BDm qui contient cette ligne 10 LD,. [00181] Si le module 28 détecte qu'il existe une erreur, alors le procédé se poursuit par l'exécution de l'étape 172 et la ligne LD, n'est pas chargée dans le microprocesseur 2. [00182] Si le module 28 ne détecte aucune erreur, alors l'unité 10 exécute une 15 instruction de chargement de la ligne LD, et celle-ci est chargée dans un registre du microprocesseur 2. Typiquement, cette instruction de chargement comporte un opérande qui indique à quelle adresse © se trouve la ligne LD, à charger. Ici, lorsque l'unité 10 exécute cette instruction de chargement, elle charge la ligne LD, dans un registre R, de l'ensemble 12 par exemple. 20 [00183] Ensuite, le module 28 exécute des opérations 270, 274, 276 et 278 identiques, respectivement, aux opérations 170, 174, 176 et 178 du procédé de la figure 6 sauf que ce sont les codes correspondants contenus dans la ligne LD, qui sont utilisés et non pas ceux contenus dans une ligne LI,. [00184] De plus, lors de l'opération 278, le module 28 calcule le vecteur d'initialisation 25 nécessaire pour déchiffrer le cryptogramme CD,* à partir de l'adresse © et à l'aide de la relation = Fiv(©). [00185] Une fois que le cryptogramme CD,* a été déchiffré, lors d'une opération 280, le module 28 enregistre la donnée D, déchiffrée et le code ECCD, déchiffré dans le registre R, en attendant que cette donnée soit traitée par l'unité 10. 30 [00186] Lorsque la prochaine instruction qui va être exécutée par l'unité 10 est une instruction qui traite la donnée D,, le module 28 procède à des opérations 284 et 286. Le module 28 identifie que la prochaine instruction à exécuter va traiter la donnée D, car cette instruction comporte généralement un opérande qui identifie le registre R, dans laquelle est enregistrée la donnée D. Les opérations 284 et 286 sont, par 35 exemple, identiques, respectivement, aux opérations 184 et 186 du procédé de la figure 6, sauf qu'ici, c'est la donnée D, et le code ECCD, qui sont utilisés et non pas l'instruction I, et le code ECC1. [00187] 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. 40 [00188] Le procédé de sécurisation des données décrit ici présente en outre les 33 mêmes avantages que ceux présentés au chapitre III notamment à cause du fait que la structure de la ligne LD; est pratiquement identique à celle de la ligne LIJ. [00189] De plus, le fait de chiffrer la donnée D; à l'aide d'un vecteur d'initialisation iv; qui dépend de l'adresse ©; permet de détecter si une ligne LD; a été déplacée à 5 l'intérieur d'un bloc de données BDm. En effet, si deux lignes LD1 et LD2 d'un même bloc BDm sont permutées, cela ne modifie pas nécessairement le code EDCm et une telle permutation des lignes LD1 et LD2 n'est pas nécessairement détectée lors de l'opération 260. Par contre, puisque la donnée D1 est chiffrée avec un vecteur d'initialisation iv1 qui dépend de l'adresse ©1, si la ligne LD1 est déplacée et se situe à 10 une adresse ©2 dans la mémoire 4, lors du chargement de cette ligne à partir de cette adresse ©2, le cryptogramme CD1* va être déchiffré à l'aide du vecteur d'initialisation ive et non pas à l'aide du vecteur iv1. Un tel déchiffrement incorrect de la donnée D1 et du code ECCD1 est alors détecté lors de l'opération 284. [00190] L'étape 250 décrite ici permet aussi de détecter une attaque consistant à 15 remplacer une ligne LD1 par une ligne LDioid différente et précédemment enregistrée à la même adresse ©1. Un tel remplacement ne pourra pas être détecté lors de l'exécution de l'opération 284. Par contre, il sera détecté lors de l'exécution de l'opération 260 car les lignes LD1 et LDioid sont différentes. [00191] La figure 11 représente un compilateur 300 apte à générer automatiquement 20 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 25 code source 302, le microprocesseur 304 génère automatiquement les vecteurs d'initialisation ivk appropriés et les lignes de code LI; et LIDJ. 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. [00192] Chapitre VI : VARIANTES : 30 [00193] Variantes de l'appareil 1 : [00194] La mémoire 4 peut aussi être une mémoire non volatile. Dans ce cas, il n'est pas nécessaire de copier le code binaire 30 à l'intérieur de cette mémoire avant le lancement de son exécution puisqu'il s'y trouve déjà. [00195] En variante, la mémoire 4 peut aussi être une mémoire interne intégrée à 35 l'intérieur du microprocesseur 2. Dans ce dernier cas, elle est réalisée sur le même substrat que les autres éléments du microprocesseur 2. Enfin, dans d'autres configurations, la mémoire 4 se compose de plusieurs mémoires dont certaines sont des mémoires internes et d'autres des mémoires externes. [00196] La mémoire principale 4 peut comporter une première mémoire volatile de 40 grande capacité et une seconde mémoire volatile de plus petite capacité mais dans 34 laquelle les opérations de lecture et d'écriture sont plus rapides. La deuxième mémoire est connue sous le terme de « mémoire cache ». La mémoire cache peut être une mémoire externe au microprocesseur 2 ou une mémoire interne du microprocesseur 2. Dans certains modes de réalisation, plusieurs mémoires caches 5 de niveaux différents peuvent être utilisées. [00197] De nombreuses architectures matérielles différentes sont possibles pour réaliser le module 28. En particulier, le module 28 peut être composé par la combinaison de plusieurs blocs matériels du microprocesseur 2 remplissant des fonctions respectives et situés chacun dans une aire différente de la puce du 10 microprocesseur 2. [00198] Variantes de la sécurisation du code machine : [00199] En variante, certaines fonctions ou parties du code binaire 30 ne sont pas sécurisées. Pour gérer l'exécution d'un tel code binaire qui comporte à la fois une fonction sécurisée et des fonctions non-sécurisées, le jeu d'instructions du 15 microprocesseur 2 peut être complété par : - une instruction d'activation d'un mode sécurisé de fonctionnement du microprocesseur 2, et - une instruction de désactivation de ce mode sécurisé. [00200] Dans ce cas, l'instruction d'activation du mode sécurisé se trouve dans le 20 code binaire 30 juste avant l'appel à la fonction sécurisée et l'instruction de désactivation du mode sécurisé se trouve juste après la fin de la fonction sécurisée. Lorsque l'instruction d'activation du mode sécurisé est chargée par le microprocesseur 2, en réponse, le module 28 commence à traiter les instructions et les données suivantes du code binaire comme décrit dans les chapitres précédents. 25 Lorsque l'instruction de désactivation du mode sécurisé est chargée par le microprocesseur 2, en réponse, le module 28 est désactivé. Dans ce dernier cas, le traitement des instructions et des données suivantes du code binaire ne sont pas traitées par le module 28 mais directement chargées dans la file 22 ou dans les registres de l'ensemble 12. 30 [00201] En variante, une instruction « update » est ajoutée au jeu d'instructions du microprocesseur. Lorsque cette instruction « update » est exécutée par le microprocesseur 2, elle indique au module 28 qu'à partir de maintenant, le nouveau vecteur ivk précédemment chargé dans la mémoire 29 doit être utilisé pour déchiffrer les lignes de code LI,. Dès lors, dans ce cas, l'utilisation d'un nouveau vecteur 35 d'initialisation ivk peut être déclenchée autrement que par l'exécution d'une instruction de branchement. Dans ce cas, le procédé décrit peut aussi être mis en oeuvre avec des instructions de branchement implicites. En effet, la dernière instruction qui se termine par une instruction de branchement implicite, est alors l'instruction « update ». Au lieu d'implémenter une instruction « update » en tant qu'instruction à 40 part dans le jeu d'instructions du microprocesseur, il est possible d'ajouter un bit 35 supplémentaire à chaque instruction du jeu d'instructions du microprocesseur 2 et de déclencher le changement de vecteur d'initialisation ivk uniquement lorsque ce bit supplémentaire prend une valeur spécifique. [00202] Variantes de la structure d'une ligne LI1 ou LD1 5 [00203] En variante, la structure d'une ligne de code décrite en référence à la figure 2 ou 9 est mise en oeuvre seulement pour les instructions I, ou seulement pour les données D, de la fonction sécurisée. [00204] Le code ECC4 ou le code ECCD, peut être remplacé par un simple code détecteur d'erreur permettant seulement de détecter une erreur dans l'instruction I, ou 10 la donnée D, avec laquelle il est concaténé. Un code détecteur d'erreur ne permet pas de corriger l'erreur détectée. Dans ce cas, l'opération 186 ou 286 de correction de l'erreur est omise. Dès lors, dès que le module 28 détecte une erreur dans une instruction I, déchiffré ou dans une donnée D, déchiffrée, par exemple, l'exécution de la fonction sécurisée est systématiquement interrompue. 15 [00205] Dans une variante simplifiée, le code ECC1, ou ECCD, est omis. Dans ce cas, le cryptogramme CI,* ou CD,* est seulement le cryptogramme de l'instruction I, ou de la donnée D,. Dans ce mode de réalisation, le microprocesseur 2 n'est plus capable de détecter une modification de l'instruction I, ou de la donnée D, qui interviendrait entre l'instant où celle-ci est enregistrée dans la file 22 ou un registre de l'ensemble 20 12 et l'instant où elle est exécutée ou traitée par l'unité 10. [00206] Le code ECCL, peut être remplacé par un simple code détecteur d'erreur permettant seulement de détecter une erreur dans le cryptogramme CI,* ou CD,* et/ou le code MAC, contenus dans la même ligne de code. Dans ce cas, l'opération 174 ou 274 de correction est omise. Dès lors, dès que le module 28 détecte une erreur dans 25 le cryptogramme CI,* ou CD,* ou dans le code MAC,, par exemple, l'exécution de la fonction sécurisée est interrompue. [00207] Dans une autre variante, le code ECCL, est construit de manière à permettre seulement la détection d'une erreur, soit seulement dans le cryptogramme CI,* ou CD,* soit seulement dans le code MAC,. 30 [00208] Le code ECCL, peut être omis. Dans ce cas, une erreur dans le cryptogramme CI,* ou CD,* ou dans le code MAC, ne peut être détectée que lors de l'exécution de l'opération 176 ou 276 de vérification de l'intégrité et de l'authenticité du cryptogramme. La détection d'une erreur à l'aide d'un code MAC est généralement plus complexe qu'à l'aide d'un simple code détecteur d'erreur ou d'un simple code 35 correcteur d'erreur. De plus, lorsque le code ECCL, est omis, dans le cas où il existe une erreur dans le cryptogramme CI,* ou CD,* ou le MAC,, il n'est pas possible de corriger cette erreur. Dans ce dernier cas, par exemple, l'exécution de la fonction sécurisée est donc systématiquement interrompue en cas d'erreur. [00209] La fonction utilisée pour générer le cryptogramme CD,* peut être différente de 40 celle utilisée pour générer le cryptogramme CI,*. Par exemple, ces deux fonctions 36 diffèrent par le fait qu'elles utilisent des clés de chiffrement différentes. [00210] Variantes de la sécurisation de l'unité arithmétique et logique : [00211] Le nombre de codes Co calculés et associés à la donnée D, chargée n'est pas forcément égal au nombre total d'instructions arithmétiques et logiques 5 différentes qui existent dans le jeu d'instructions du microprocesseur 2. Par exemple, le nombre de code Co peut être réduit quand les mêmes codes Co sont utilisés pour différentes instructions arithmétiques et logiques. Par exemple, le code 01,4 peut être omis si les fonctions F3 et F4 sont toutes les deux des fonctions logarithmiques. En effet, dans ce cas, lorsque l'instruction arithmétique et logique à exécuter est une 10 multiplication, lors de l'opération 284, le module 28 calcule le code res-t c à l'aide de la - relation suivante : Cres-t = C1,3 + C2,3. Pour vérifier que l'unité 10 a correctement réalisé une instruction arithmétique et logique de division, le module 28 peut calculer le code Cres-t à l'aide de l'opération suivante : Cres-t = C1,3 - C2,3, où les codes 01,3 et C2,3 sont les même que ceux utilisés pour vérifier l'opération de multiplication. Dans ce cas, il 15 n'est pas nécessaire de calculer les codes 01,4 et 02,4 puisqu'ils sont identiques, respectivement, aux codes 01,3 et C2,3. Par contre, le code 03,4 doit être calculé à partir de la donnée Dres-p. De façon similaire, il est possible de détecter le dysfonctionnement de l'unité 10 lors de l'exécution d'une instruction de soustraction en calculant le code Cres_t à l'aide de la relation suivante : Cres_t = C1,1 - 02,1 dans le cas 20 où la fonction F1 est aussi un homomorphisme pour l'ensemble B muni de l'opération de soustraction. [00212] Dans un autre mode de réalisation, il est possible de détecter un dysfonctionnement de l'unité 10 uniquement lorsqu'elle exécute une seule ou un groupe restreint d'instructions arithmétiques et logiques du jeu d'instructions du 25 microprocesseur 2. Dans ce cas, il existe des instructions arithmétiques et logiques pour lesquelles le microprocesseur ne vérifie pas si elles ont correctement été exécutées par l'unité 10. Cela permet de réduire le nombre de codes Co utilisés. [00213] En variante, le code Co n'est pas enregistré dans le même registre R, que celui où est enregistrée la donnée D, mais dans un autre registre spécifiquement 30 associé à ce registre R,. [00214] Variantes de la sécurisation des données : [00215] La structure des lignes LD, utilisée pour sécuriser les données peut être simplifiée. Par exemple, les codes MAC, et/ou ECCE; peuvent être omis. [00216] Le code ECCD, peut être remplacé par un simple code détecteur d'erreur dans 35 la donnée D. [00217] En variante, la fonction F,v est identique à la fonction fka sauf qu'elle est appliquée à l'adresse ©. La fonction F,v peut aussi utiliser le même algorithme de chiffrement que la fonction fka mais avec une clé de chiffrement différente de la clé ka. [00218] Dans une variante simplifiée, la fonction F,v est la fonction identité. Dans ce 40 cas, le vecteur d'initialisation est systématiquement égal à l'adresse ©. 37 [00219] Dans d'autres modes de réalisation, pour détecter un déplacement d'une ligne LDJ, le code MAC; est calculé en fonction du vecteur iv;. Par exemple, le code MAC; est calculé à partir de la concaténation du cryptogramme CD;* et du vecteur iv;. Le code MAC; peut aussi être calculé à partir d'une combinaison du cryptogramme 5 CD;* et du vecteur iv; telle que la combinaison suivante : CD;* Dans le cas où le code MAC; dépend du vecteur iv;, alors il peut être utilisé à la place du code ECCD; pour détecter une erreur en cas de déplacement de la ligne LD; dans la mémoire 4. En effet, dans ce cas, lors de la vérification de l'intégrité et de l'authenticité du cryptogramme CD;*, le module 28 : 10 - calcule le vecteur iv; à l'aide de la relation iv; = Fh,(©;), puis - combine le cryptogramme CD;* lu à l'adresse ©; avec le vecteur iv; calculé, puis - vérifie l'intégrité et l'authenticité de cette combinaison à partir du code MAC; contenu dans la même ligne LDJ. Si cette ligne LD; a été déplacée, le vecteur d'initialisation calculé est différent de celui 15 attendu. Dès lors, l'intégrité de la combinaison du cryptogramme CD;* et du vecteur d'initialisation ne peut pas être vérifiée, ce qui déclenche le signalement d'une faute d'exécution. On remarquera que dans ce mode de réalisation, il est possible de détecter un déplacement de la ligne LD; sans même avoir à déchiffrer le cryptogramme CD;*. Dans cette variante, pour détecter un déplacement de la ligne 20 LDJ, les code ECCD; et ECCE; peuvent être omis. [00220] De façon similaire à ce qui a été décrit ci-dessus pour le code MACJ, le code ECCE; peut aussi être construit de manière à dépendre du vecteur iv;. Dans ce cas, le déplacement de la ligne LD; est détecté lors de la vérifications du code ECO* Dès lors, pour détecter un déplacement de la ligne LDJ, les codes ECCD; et MAC; peuvent 25 être omis. [00221] L'étape 250 a été décrite dans le cas particulier de la sécurisation d'une donnée D. Toutefois, en variante, la même étape peut être réalisée sur des lignes de code comportant une instruction I; à la place de la donnée D. Dans ce cas, le cryptogramme CI;* est obtenu en utilisant un vecteur d'initialisation iv; et non pas le 30 vecteur ivk comme décrit au chapitre III. Puisque le vecteur iv; est fonction de l'adresse ©; où est enregistrée cette ligne de code Ili, il est alors possible de détecter le déplacement d'une ligne de code codant une instruction à exécuter. Dans ce cas, typiquement, le code ECCI; est utilisé pour détecter ce déplacement et non plus pour détecter une modification du flot de contrôle. 35 [00222] Dans les modes de réalisation décrits jusqu'à présent, à la fois la donnée D; et le code ECCD; sont codés en fonction du vecteur iv; puisque le cryptogramme CD;* est chiffré à l'aide de ce vecteur iv;. En variante, soit seulement la donnée D; soit seulement le code ECCD; est codé en fonction du vecteur iv;. Par exemple, dans la ligne de code, le cryptogramme de la donnée D; est obtenu à partir d'une fonction de 40 chiffrement qui n'utilise pas le vecteur iv;, tandis que le cryptogramme ECCD;* du code 38 ECCD; est obtenu à l'aide de la fonction de chiffrement fka(ECCD; ; iv;). Dans ce cas, lors de l'opération 278, le module 28 déchiffre le cryptogramme de la donnée D; sans utiliser le vecteur iv; et déchiffre le cryptogramme ECCD;* en utilisant ce vecteur iv;. Ensuite, le reste du procédé est identique à ce qui a déjà été décrit. Dans un mode de 5 réalisation simplifiée, puisque la donnée D; n'a pas besoin d'être codée en fonction du vecteur iv;, il est aussi possible de ne pas la chiffrer. Par exemple, la ligne de code contient alors la donnée D; en clair et le cryptogramme ECCD;*. Dès lors, lors de l'opération 278, le déchiffrement de la donnée D; est omis puisqu'il suffit de l'extraire de la plage de bits dans laquelle elle est contenue dans la ligne LDJ. 10 [00223] A l'inverse, il est aussi possible de modifier la structure des lignes LD; de manière à ce que seule la donnée D; soit codée en fonction du vecteur iv;. Par exemple, la ligne LD; comporte un cryptogramme D;* de la donnée D; obtenue en la chiffrant à l'aide de la fonction fka(D; ; iv;) et un cryptogramme ECCD;* obtenu en chiffrant le code ECCD; à l'aide d'une fonction de chiffrement indépendante du vecteur 15 Lors de l'opération 270, le module 28 déchiffre le cryptogramme D;* à l'aide du vecteur iv; calculé et déchiffre le cryptogramme ECCD;* sans utiliser ce vecteur iv;. [00224] Jusqu'à présent, c'est une fonction de chiffrement qui a été décrite comme exemple de mode de réalisation permettant de coder la donnée D; ou le code ECCD; en fonction du vecteur iv;. Cette fonction de chiffrement peut toutefois être aussi 20 simple qu'une simple opération « OU » logique entre la donnée D; et le vecteur iv; ou entre le code ECCD; et le vecteur [00225] Dans un autre mode de réalisation simplifié, le code ECCD; et le code MAC; sont omis. Dans ce cas, au moins l'un du cryptogramme D;* et du code ECCE; est construit en fonction du vecteur iv;. 25 [00226] Pour la détection du déplacement de la ligne LDJ, il n'est pas nécessaire d'utiliser un code correcteur d'erreur. Un simple code détecteur d'erreur est suffisant. Ainsi, en variante, le ou les codes correcteurs d'erreur sont remplacés par des codes détecteurs d'erreur. [00227] Dans un autre mode de réalisation, le code EDCm est omis. Dans ce cas, les 30 opérations de traitement de ce code EDCm sont également omises, telles que les opérations 256 et 260. [00228] Il est possible de construire le code EDCm différemment. Par exemple, en variante, le code EDCm est un code correcteur d'erreur qui permet en plus de corriger une erreur dans le bloc de données BDm. Dans ce cas, lorsqu'une erreur est détectée 35 dans le bloc BDm, le code EDCm est utilisé pour corriger l'erreur détectée, puis le procédé se poursuit par l'opération 270. [00229] D'autres méthodes de calcul du code EDCm sont possibles. Par exemple, en variante, le code EDCm est une somme de contrôles ou un code d'authentification de message. 40 [00230] Avantageusement le code EDCm est enregistré dans la mémoire 29. 39 [00231] Autres variantes : [00232] Dans une autre variante, les clés ka et k' sont les mêmes. [00233] La clé ka peut être pré-enregistrée dans la mémoire 29. Dans ce cas, le cryptogramme ka* peut être omis du bloc 34. 5 [00234] Une ligne de code peut être plus longue qu'un mot-machine. Dans ce cas, chaque ligne de code se compose de plusieurs mots-machine généralement situés à des adresses mémoires immédiatement consécutives dans la mémoire 4. Dans ce cas, une ligne de code est chargée dans le microprocesseur 2 non pas en une seule opération de lecture, mais en exécutant plusieurs opérations de lecteur. Chaque 10 opération de lecture charge dans le microprocesseur un mot-machine respectif de la ligne de code. [00235] En variante, l'opération 176 ou 276 se poursuit systématiquement par l'opération 178 ou 278 même si l'intégrité ou l'authenticité du cryptogramme n'a pas pu être confirmée. Dans ce cas, l'opération 176 ou 276 sert à déclencher le 15 signalement d'une faute d'exécution sans interrompre l'exécution du code binaire. [00236] Tout ce qui a été décrit au chapitre III peut être mise en oeuvre indépendamment de ce qui a été décrit dans les autres chapitres. Par exemple, les étapes 198 et 250 peuvent être omises. [00237] Dans une autre variante, le procédé décrit au chapitre III pour détecter une 20 erreur dans le flot de contrôle est mis en oeuvre indépendamment de ce qui a été décrit dans les chapitres IV et V mais aussi indépendamment de certaines des caractéristiques du procédé décrit dans le chapitre III. En particulier, pour être capable de détecter une erreur dans le flot de contrôle, les codes ECCE; et MAC, peuvent être omis, ainsi que toutes les opérations de traitement de ces deux codes. 25 [00238] Tout ce qui a été décrit au chapitre IV peut être mis en oeuvre indépendamment de ce qui a été décrit dans les autres chapitres. Par exemple, ce qui a été décrit au chapitre IV peut être mis en oeuvre : - sans que le code binaire soit chiffré, - sans que le code MAC, soit compris dans chaque ligne de code, 30 - sans que les codes ECCE; et ECC1, ou ECCD, soient mis en oeuvre, - sans que les données D, soient chiffrées à l'aide du vecteur [00239] Tout ce qui a été décrit au chapitre V peut également être mis en oeuvre indépendamment de ce qui a été décrit dans les autres chapitres. Par exemple, ce qui a été décrit au chapitre V peut être mis en oeuvre : 35 - sans que les données D, soient chiffrées, - en ne conservant qu'un seul code détecteur d'erreur choisi dans le groupe constitué des codes ECCE;, MAC, et ECCD,, et - sans qu'un code Co soit calculé à chaque chargement d'une donnée dans un registre. 40 [00240] Tous les modes de réalisation décrits dans ce texte et, en particulier, les 40 différentes variantes, peuvent être combinés entre eux. [00241] CHAPITRE VII : AVANTAGES DES MODES DE RÉALISATION DÉCRITS : [00242] Avantage de la sécurisation du code binaire : [00243] Le chiffrement des instructions I, ou des données D, permet de garantir la 5 confidentialité du code binaire 30, ce qui rend le « Reverse Engineering » du code binaire très difficile. La vérification de l'intégrité du cryptogramme CI,* ou CD,* permet de détecter les modifications du code binaire provoquées, par exemple, par des attaques telles que l'injection de fautes dans la mémoire 4 ou le support 6. Le fait de vérifier l'authenticité des instructions et des données permet de détecter et de rendre 10 très difficile l'ajout d'instructions supplémentaires dans le code binaire 30 par un attaquant, par exemple, pour y introduire des logiciels malveillants tels que des virus. En effet, même si l'attaquant connaît l'algorithme utilisé pour chiffrer les instructions I, ou les données D,, il ne connaît pas la clé secrète k' utilisée pour construire le code MAC,. 15 [00244] La vérification, à l'aide du code ECC1, ou ECCD,, de l'existence d'une erreur dans l'instruction I, ou la donnée D, juste avant qu'elle soit utilisée permet de détecter une modification de cette instruction ou de cette donnée D, alors qu'elle est stockée dans la file 22 ou un registre de l'ensemble 12. En effet, de telles modifications peuvent être provoquées par injection de fautes dans la file 22 ou les registres de 20 l'ensemble 12. Ainsi, l'utilisation du code ECC1, ou ECCD, permet de détecter ce type d'attaque. [00245] Le fait que le code ECC1, ou ECCD, soit un code correcteur d'erreur et pas seulement un code détecteur d'erreur, permet de rendre le procédé d'exécution plus robuste vis-à-vis des attaques par injection de fautes dans la file 22 ou dans les 25 registres de l'ensemble 12. En effet, dans ce cas, le code correcteur d'erreur permet souvent de corriger l'erreur introduite dans l'instruction I, ou dans la donnée D, de sorte que malgré la présence de telles erreurs, la fonction sécurisée continue de s'exécuter correctement. [00246] L'utilisation du code ECCE; permet de détecter plus rapidement une erreur 30 dans le cryptogramme CI,* ou CD,* ou dans le code MAC, que si seul le code MAC, était utilisé pour cela. L'utilisation du code ECCE; permet donc d'accélérer l'exécution du code binaire. [00247] L'utilisation d'un code correcteur d'erreur pour le code ECCE; permet de rendre le procédé revendiqué plus robuste vis-à-vis des attaques par injection de 35 fautes dans la mémoire 4 ou dans le support 6. En effet, dans ce cas, le code correcteur d'erreur permet souvent de corriger le cryptogramme CI,* 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. [00248] Le fait d'utiliser des clés secrètes différentes pour déchiffrer le cryptogramme 40 CI,* ou CD,* et pour vérifier l'intégrité et l'authenticité du code MAC, permet d'accroître 41 la sécurité du procédé. [00249] Lors de l'exécution d'un bloc de base précédent, le fait de charger dans le microprocesseur le vecteur d'initialisation ivk nécessaire au déchiffrement du bloc de base BBk suivant permet de déclencher le signalement d'une faute d'exécution si un 5 attaquant essaie de modifier l'ordre dans lequel les blocs de base du code machine 32 doivent normalement être exécutés. Plus précisément, une telle modification du flot de contrôle sera détectée grâce au code ECC1 lors de l'opération 184. [00250] L'enregistrement dans un registre du microprocesseur du vecteur d'initialisation ivk à utiliser pour déchiffrer le bloc de base exécuté après l'exécution 10 d'une sous-fonction sécurisée permet d'appeler cette sous-fonction sécurisée depuis différents blocs de base du code machine 32 de la fonction sécurisée. En effet, dans ce cas, il n'est pas possible de coder le vecteur ivk à utiliser dans le dernier bloc de base de la sous-fonction sécurisée puisque le bloc de base suivant n'est pas toujours le même et n'est donc pas toujours chiffré à l'aide du même vecteur ivk. 15 [00251] La vérification de l'authenticité de la clé d'application ka à partir de différents certificats cryptographiques dont au moins un est enregistré dans la mémoire sécurisée du microprocesseur permet de garantir que le code binaire 30 a été généré par un auteur autorisé à faire cela et non pas par un tiers qui n'a pas le droit de générer de tel code binaire pour le microprocesseur 2. 20 [00252] Avantages de la sécurisation de l'unité arithmétique et logique : [00253] Lorsque des fautes sont injectées dans l'unité 10, le résultat Dres-p obtenu à l'issue de l'exécution de l'opération arithmétique et logique peut être différent du résultat théorique Dres-t attendu. Le procédé revendiqué permet de détecter un tel dysfonctionnement de l'unité 10 sans, par exemple, avoir à exécuter plusieurs fois 25 l'opération arithmétique et logique défaillante. [00254] Avantages de la sécurisation des données : [00255] Dans le procédé revendiqué, si un attaquant déplace une ligne LD,, une erreur est alors détectée à l'aide d'un code détecteur d'erreur. Grâce à cela, il est donc beaucoup plus difficile de mettre en oeuvre une attaque dans laquelle les lignes de 30 code sont déplacées sans que cette attaque soit détectée. [00256] L'utilisation du code détecteur d'erreur EDCm permet de détecter une attaque qui consiste à remplacer une ligne de code située à une adresse © par une autre ligne de code qui était précédemment enregistrée à la même adresse ©. En effet, un tel remplacement ne peut pas toujours être détecté en absence de ce code EDCm. 35 [00257] Le fait de construire le code EDCm uniquement à partir des codes MAC, des lignes LD, accélère le calcul de ce code EDCm car les codes MAC, sont généralement beaucoup plus courts que la ligne de code complète. De plus, cette accélération du calcul est obtenue sans modifier la fiabilité de la détection d'erreur car le code MAC, dépend de la donnée D. 40 [00258] L'utilisation d'un « OU exclusif » pour mettre à jour le code EDCm permet une 42 mise à jour de ce code de manière itérative, ce qui est bien plus rapide que de calculer, à chaque écriture d'une nouvelle ligne de code, le nouveau code EDCm à partir du contenu de chacune des lignes contenues dans le bloc BDm. [00259] Utiliser un code correcteur d'erreur en tant que code ECCD; permet, en plus, 5 de corriger une erreur détectée. Cela permet donc de poursuivre l'exécution de la fonction sécurisée même si une erreur a été signalée. [00260] Enregistrer le code EDCm dans la mémoire 29 accroît la sécurité du procédé car cette mémoire est très difficilement modifiable par un attaquant. [00261] Le fait de coder à la fois la donnée D; et le code ECCD; en le chiffrant à l'aide 10 d'une fonction de chiffrement paramétrée par le vecteur iv; permet d'accroître la sécurité du procédé. En effet, en plus, la confidentialité de la donnée D; et du code ECCD; est assurée. [00262] Le fait d'utiliser en tant que code détecteur d'erreur un code capable de détecter une erreur dans le cryptogramme CD;* permet de détecter un déplacement 15 d'une ligne de code sans même avoir à déchiffrer ce cryptogramme CD;*. REVENDICATIONS1. Procédé d'exécution d'un code binaire d'une fonction sécurisée par un microprocesseur, caractérisé en ce que ce procédé comporte : a) la fourniture (150) du code binaire, ce code binaire comprenant des lignes de code, chaque ligne de code contenant : - un cryptogramme (CI,*, CD,*) d'une seule instruction exécutable par le microprocesseur ou d'une seule donnée à traiter par le microprocesseur, et - un code d'authentification de message (MAC,) permettant de vérifier l'intégrité et 10 l'authenticité du cryptogramme, b) lors de l'exécution (152) du code binaire par le microprocesseur, à chaque fois que le microprocesseur charge une ligne de code, le procédé comporte les opérations suivantes : 1) un module matériel de sécurisation du microprocesseur vérifie (176) 15 l'intégrité et l'authenticité du cryptogramme contenu dans la ligne de code chargée à l'aide du code d'authentification de message contenu dans cette même ligne et déclenche (172) le signalement d'une faute d'exécution si l'intégrité ou l'authenticité du cryptogramme n'est pas confirmée, puis 2) le module matériel de sécurisation déchiffre (178) le cryptogramme pour 20 obtenir une instruction déchiffrée ou une donnée déchiffrée si l'intégrité et l'authenticité du cryptogramme sont confirmées, puis : - dans le cas d'une instruction déchiffrée, l'instruction déchiffrée est enregistrée (180) dans une file d'instructions à exécuter successivement les unes après les autres par une unité arithmétique et logique du microprocesseur, et 25 - dans le cas d'une donnée déchiffrée, la donnée déchiffrée est enregistrée (280) dans un registre interne du microprocesseur en attendant d'être traitée par l'unité arithmétique et logique. 2. Procédé selon la revendication 1, dans lequel : 30 - lors de l'étape a), le cryptogramme contenu dans la ligne de code est un cryptogramme d'une concaténation : - de ladite instruction ou donnée, et - d'un premier code détecteur d'erreur (ECCI,, ECCD,) permettant de détecter une erreur dans l'instruction ou dans la donnée avec laquelle il est concaténé, 35 - lors de l'opération 2), le déchiffrement du cryptogramme par le module matériel de sécurisation permet d'obtenir, en plus de l'instruction déchiffrée ou de la donnée déchiffrée, le premier code détecteur d'erreur déchiffré, puis : - dans le cas d'une instruction déchiffrée, le premier code d'erreur déchiffré est enregistré (180) dans la file d'instructions avec l'instruction déchiffrée, et 40 - dans le cas d'une donnée déchiffrée, la donnée déchiffrée et le premier code 44 détecteur d'erreur déchiffré sont enregistrés (280) dans un même registre du microprocesseur, et - après l'opération 2), le procédé comporte l'opération 3) suivante : - lorsque la prochaine instruction à exécuter contenue dans la file d'instructions 5 est l'instruction déchiffrée lors de l'opération 2), le module matériel de sécurisation vérifie (184), à l'aide du premier code détecteur d'erreur enregistré avec cette instruction déchiffrée, s'il existe une erreur dans cette instruction déchiffrée, et, dans le cas où une telle erreur est détectée dans cette instruction déchiffrée, le module matériel de sécurisation déclenche (172) le signalement d'un faute d'exécution, et, dans le cas où aucune erreur n'a été détectée dans cette instruction déchiffrée, le microprocesseur décode l'instruction déchiffrée et la transmet à l'unité arithmétique et logique qui l'exécute (190), ou - lorsque la prochaine donnée à traiter par l'unité arithmétique et logique est la donnée déchiffrée lors de l'opération 2), le module matériel de sécurisation vérifie (284), à l'aide du premier code détecteur d'erreur enregistré associé à cette donnée déchiffrée, s'il existe une erreur dans cette donnée déchiffrée, et, dans le cas où une telle erreur est détectée, le module matériel de sécurisation déclenche (172) le signalement d'une faute d'exécution, et, dans le cas où aucune erreur n'est détectée, l'unité arithmétique et logique traite (190) cette donnée déchiffrée. 3. Procédé selon la revendication 2, dans lequel : - lors de l'étape a), le premier code détecteur d'erreur (ECCIJ, ECCD) est un code 25 correcteur d'erreur permettant, en plus, de corriger l'erreur détectée dans l'instruction ou dans la donnée avec laquelle il est concaténé, - lors de l'opération 3) : - lorsque le module matériel de sécurisation détecte une erreur dans l'instruction déchiffrée, en plus de déclencher le signalement d'une faute 30 d'exécution, le module matériel de sécurisation corrige (186) cette erreur à l'aide du premier code détecteur d'erreur déchiffré enregistré ensemble avec cette instruction déchiffrée, puis le microprocesseur décode l'instruction ainsi corrigée et la transmet à l'unité arithmétique et logique qui l'exécute (190), ou - lorsque le module matériel de sécurisation détecte une erreur dans la donnée 35 déchiffrée, en plus de déclencher le signalement d'une faute d'exécution, le module matériel de sécurisation corrige (286) cette erreur à l'aide du premier code détecteur d'erreur déchiffré associé à cette donnée déchiffrée, puis l'unité arithmétique et logique traite (190) la donnée corrigée. 40 4. Procédé selon l'une quelconque des revendications précédentes, dans lequel : 45 - lors de l'étape a), chaque ligne de code comprend, en plus du cryptogramme et du code d'authentification de message, un second code détecteur d'erreur (ECCE;) permettant de détecter une erreur dans le cryptogramme ou le code d'authentification de message contenu dans la même ligne de code, 5 - lors de l'étape b) avant l'exécution de l'opération 1), le procédé comporte une opération (170, 270) lors de laquelle le module matériel de sécurisation vérifie, à l'aide du second code détecteur d'erreur contenu dans la ligne de code chargée, s'il existe une erreur dans le cryptogramme ou le code d'authentification de message contenu dans la ligne de code chargée, et dans le cas où une telle erreur est 10 détectée, le module matériel de sécurisation déclenche (172) le signalement d'une faute d'exécution et, dans le cas où aucune erreur n'est détectée, le procédé se poursuit par l'opération 1). 5. Procédé selon la revendication 4, dans lequel : 15 - lors de l'étape a), le second code détecteur d'erreur (ECCE;) est un code correcteur d'erreur permettant, en plus, de corriger l'erreur détectée dans le cryptogramme ou le code d'authentification de message contenu dans la même ligne de code, - si le module matériel de sécurisation détecte une erreur dans le cryptogramme ou le code d'authentification de message, en plus de déclencher le signalement d'une faute 20 d'exécution, le module matériel de sécurisation corrige (174, 274) cette erreur à l'aide du second code détecteur d'erreur, puis le procédé se poursuit par l'opération 1) lors de laquelle ce sont le cryptogramme corrigé et le code d'authentification de message corrigé qui sont utilisés. 6. Procédé selon l'une quelconque des revendications précédentes, dans lequel : - lors de l'opération 1), une première clé de chiffrement (k') est utilisée pour vérifier l'authenticité du cryptogramme contenu dans la ligne de code chargée, et - lors de l'opération 2), une seconde clé de déchiffrement (ka) est utilisée pour déchiffrer le cryptogramme, cette seconde clé de déchiffrement étant différente de la 30 première clé de déchiffrement. 7. Procédé selon la revendication 2, dans lequel : - lors de l'étape a), le code binaire fourni comporte un code machine contenant une succession de blocs de base dans lequel : 35 - chaque bloc de base comporte une succession de lignes de code contenant chacune le cryptogramme d'une instruction, les instructions chiffrées dans ces lignes de code successives étant destinées à être exécutées par le microprocesseur systématiquement dans l'ordre de ces lignes de code, et - chaque bloc de base débute à une adresse de branchement et se termine 40 par une ligne de code contenant le cryptogramme d'une instruction de 46 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 de code contenant le cryptogramme de cette instruction de branchement vers ce bloc de base suivant étant appelé « bloc de 5 base précédent », - le cryptogramme contenu dans une ligne de code spécifique d'un bloc de base suivant ayant été obtenu à l'aide d'un vecteur d'initialisation différent des vecteurs d'initialisation utilisés pour obtenir les cryptogrammes de lignes de code des autres blocs de base, 10 - chaque bloc de base précédent comportant une ligne de code contenant le cryptogramme d'une instruction de chargement qui, lorsqu'elle est exécutée par le microprocesseur, provoque le chargement dans le microprocesseur du vecteur d'initialisation à utiliser pour déchiffrer le cryptogramme de la ligne de code spécifique du bloc de base suivant, 15 - lors de l'opération 2), le module matériel de sécurisation déchiffre (178) le cryptogramme de la ligne de code spécifique d'un bloc de base suivant à l'aide du vecteur d'initialisation chargé dans le microprocesseur lors de l'exécution du bloc de base précédent. 20 8. Procédé selon la revendication 7, dans lequel : - lors de l'étape a), le code binaire comporte un code machine contenant : - un bloc de base appelé « bloc appelant » qui se termine par une ligne de code contenant le cryptogramme d'une instruction de branchement qui, lorsqu'elle est exécutée par le microprocesseur, réalise un branchement vers 25 une adresse de branchement d'une sous-fonction sécurisée, - un autre bloc de base appelé « bloc de retour », et - la sous-fonction sécurisée formée par un ou plusieurs blocs de base, cette sous-fonction sécurisée étant appelable à partir des différents blocs de base de la fonction sécurisée et débutant, par un premier bloc de base et se terminant par un dernier bloc de base, le premier bloc de base débute à l'adresse de branchement de la sous-fonction sécurisée et le dernier bloc de base se termine par une ligne de code contenant le cryptogramme d'une instruction de branchement particulière appelée « instruction de retour » qui, lorsqu'elle est exécutée par le microprocesseur, réalise un branchement vers l'adresse de branchement du bloc de retour, - lors d'une première exécution de l'opération 2), le module matériel de sécurisation enregistre dans un premier registre du microprocesseur l'adresse de branchement du bloc de retour et le vecteur d'initialisation nécessaire pour déchiffrer ce bloc de retour, puis - lors d'une deuxième exécution de l'opération 2) lors de laquelle l'instruction de 47 retour de la sous-fonction sécurisée est déchiffrée, l'adresse de branchement utilisée pour l'exécution de l'instruction de retour est lue dans le premier registre, puis - lors d'une troisième exécution de l'opération 2) lors de laquelle la ligne de code spécifique du bloc de retour est déchiffrée, le module matériel de sécurisation utilise 5 le vecteur d'initialisation enregistré dans le premier registre pour déchiffrer le cryptogramme de la ligne de code spécifique du bloc de retour. 9. Procédé selon l'une quelconque des revendications précédentes, dans lequel : - avant l'étape b), le procédé comporte l'enregistrement : 10 - d'un premier certificat cryptographique (Cos) permettant d'authentifier une clé publique d'un système d'exploitation exécuté par le microprocesseur, - d'un deuxième certificat cryptographique (Copi) permettant d'authentifier une clé publique du microprocesseur, - d'un troisième certificat cryptographique (Caul) permettant d'authentifier une 15 clé publique de l'auteur de la fonction sécurisée, - un cryptogramme (ka*) d'une clé d'application déchiffrable à l'aide de la clé publique du microprocesseur, - une signature (Ska*) de la clé d'application vérifiable à l'aide de la clé publique de l'auteur, 20 - au début de l'étape b) le module matériel de sécurisation vérifie (154) dans l'ordre : - l'authenticité (156, 158) du premier et du troisième certificat cryptographique à l'aide de la clé publique du système d'exploitation, - seulement si l'authenticité de la clé publique de l'auteur a été confirmée, l'authenticité (160) de la signature de la clé d'application à l'aide de la clé 25 publique de l'auteur, - seulement si l'authenticité de la signature de la clé d'application a été confirmée, le déchiffrement (162) du cryptogramme de la clé d'application avec la clé publique du microprocesseur, puis - lors de l'opération 2), le déchiffrement du cryptogramme est réalisé à l'aide de cette 30 clé d'application déchiffrée. 10. Procédé selon l'une quelconque des revendications précédentes, dans lequel, lors de l'opération 1) (178, 278), le module matériel de sécurisation : - construit une étiquette à partir du cryptogramme contenu dans la ligne de code 35 chargée, puis - chiffre l'étiquette construite à l'aide d'une clé secrète enregistrée dans une mémoire non volatile du module matériel de sécurisation, puis - compare l'étiquette chiffrée au code d'authentification de message contenu dans la ligne de code chargée, puis 40 - confirme l'intégrité et l'authenticité du cryptogramme seulement si l'étiquette chiffrée 48 est identique à ce code d'authentification de message. 11. Procédé selon l'une quelconque des revendications précédentes, dans lequel : - lors de l'étape a) (150), le code binaire fourni contient : 5 - une instruction arithmétique et logique comportant un opcode et un ou plusieurs opérandes qui, lorsqu'elle est exécutée par une unité arithmétique et logique du microprocesseur, provoque la réalisation de l'opération D1*D2*...*Dn et l'enregistrement du résultat de cette opération dans un registre Rres, où : - D1 à Dn sont des données enregistrées, respectivement, dans des 10 registres R1 à Rn du microprocesseur, - les registres R1 à Rn sont les registres désignés par les opérandes de l'instruction arithmétique et logique, - le symbole « * » est l'opération arithmétique et logique désignée par l'opcode de l'instruction arithmétique et logique, et 15 - l'indice n est un entier supérieur ou égal à un, - pour chaque registre R1 à Rn, une instruction de chargement qui, lorsqu'elle est exécutée par le microprocesseur, provoque le chargement d'une donnée D, dans le registre Ri, où l'indice i est un identifiant du registre R, parmi les registres R1 à Rn, 20 - lors de l'exécution de l'étape b), le procédé comporte les opérations suivantes : - à chaque fois qu'une instruction de chargement d'une donnée D, dans le registre R, est exécutée par le microprocesseur, un module matériel de sécurisation du microprocesseur calcule (202) un code C,,* à l'aide d'une relation C,,* = F*(D,), et la donnée chargée D, est enregistrée dans le registre R, 25 et le code C,,* calculé est enregistré dans le même registre R, ou dans un registre associé au registre R,, la fonction F* étant une fonction préprogrammée du module matériel de sécurisation, - dans le cas où n est supérieur ou égal à deux, cette fonction F* étant un homomorphisme d'un ensemble A de nombres munis de l'opération 30 «* » vers un ensemble B de nombres munis de l'opération « # », qui vérifie la relation : F*(Di * D2 * * Dn) = F*(Di) # F*(D2) # # F*(Dn) # C2,* # # Cn,*, - dans le cas où n est égal à un, cette fonction F* est telle que F*(Di) = T*(F*(Di)), où la fonction T* est une fonction préprogrammée dans le 35 module matériel de sécurisation, - l'exécution (190) par l'unité arithmétique et logique de l'instruction arithmétique et logique contenue dans le code binaire et l'enregistrement du résultat Dres-p de cette exécution dans le registre Rres, puis - le module matériel de sécurisation : 40 - calcule (210, 226) un code Cres_p à l'aide de la relation Cres_p = F*(Dres_p) 49 si n est supérieur à un et, sinon, à l'aide de la relation Cres-p =T*(Dr'_p) si n est égal à un, et - calcule un code Cr'_t (218, 224) à l'aide de la relation Cres_t = # C2,*# # puis 5 - compare (220) les codes Cres_p et Cres-t et déclenche (172) le signalement d'une faute d'exécution si le code Cres_p ne correspond pas au code Cres-t et, dans le cas contraire, inhibe ce signalement. 12. Procédé selon l'une quelconque des revendications précédentes, dans lequel : 10 - le procédé comporte l'enregistrement (150) dans une mémoire principale à une adresse ©- d'une ligne de code, cette ligne de code contenant : - une donnée Di à traiter par le microprocesseur ou un cryptogramme de cette donnée Di, et - un premier code détecteur d'erreur (ECCD,, MAC,, ECCE;) permettant de 15 détecter une erreur dans la donnée Di ou dans son cryptogramme si cette donnée Di ou son cryptogramme est modifié après son enregistrement dans la mémoire principale, au moins l'un de la donnée Di, de son cryptogramme et du premier code détecteur d'erreur étant chiffré en fonction d'un vecteur d'initialisation iv,, ce 20 vecteur d'initialisation iv, variant en fonction de l'adresse © à laquelle la ligne de code est enregistrée selon une relation iv, = où la fonction F,, est une fonction préprogrammée d'un module matériel de sécurisation du microprocesseur qui associe un vecteur d'initialisation iv, différent à chaque adresse © différente de la mémoire principale, 25 - lors de l'exécution (152) du code binaire par le microprocesseur, le procédé comporte les opérations suivantes : - l'exécution d'une instruction de chargement par le microprocesseur qui provoque le chargement dans les registres du microprocesseur de la ligne de code enregistrée à l'adresse ©, puis 30 - le module matériel de sécurisation calcule (278) le vecteur d'initialisation iv, à l'aide de la relation iv, = F,,(©), où ©- est l'adresse à partir de laquelle la ligne de code a été chargée, puis - le module matériel de sécurisation déchiffre (278) la ligne de code chargée à l'aide du vecteur d'initialisation iv, calculé pour obtenir : 35 - la donnée Di ou son cryptogramme, et - le premier code détecteur d'erreur, puis - le module matériel de sécurisation vérifie (284), à l'aide du premier code détecteur d'erreur obtenu, s'il existe une erreur dans la donnée Di ou son cryptogramme et, si une telle erreur existe, déclenche (172) le signalement 40 d'une faute d'exécution et, si une telle erreur n'existe pas, inhibe ce 50 signalement d'une faute d'exécution. 13. 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 5 revendications précédentes, dans lequel le code binaire comprend des lignes de code, chaque ligne de code contenant : - un cryptogramme (CI,*, CD,*) d'une seule instruction exécutable par le microprocesseur ou d'une seule donnée à traiter par le microprocesseur, et - un code d'authentification de message (MAC,) permettant de vérifier l'intégrité et 10 l'authenticité du cryptogramme. 14. Support d'enregistrement d'informations lisibles par un microprocesseur, caractérisé en ce qu'il comporte un code binaire conforme à la revendication 13. 15 15. Microprocesseur (2) pour la mise en oeuvre d'un procédé conforme à l'une quelconque des revendications 1 à 12, ce microprocesseur comportant une unité arithmétique et logique (10) et un module matériel de sécurisation (28), caractérisé en ce que le module matériel de sécurisation (28) est configuré pour exécuter les opérations 1) et 2) du procédé conforme à la revendication 1. 20 16. Compilateur (300) apte à transformer automatiquement un code source d'une fonction sécurisée en un code binaire de cette fonction sécurisée, caractérisé en ce que le compilateur est apte à transformer automatiquement le code source en un code binaire conforme à revendication 13. 25