FR 2977342 A1 20130104 FR 1155874 A 20110630 B10875 - 11-ZV2-0077 1 VERIFICATION D'INTEGRITE D'UN PROGRAMME EXECUTE PAR UN CIRCUIT ELECTRONIQUE Domaine de l'invention La présente invention concerne de façon générale des circuits électroniques et, plus particulièrement, la vérification d'intégrité de programmes exécutés par un micro- s processeur. Exposé de l'art antérieur Les circuits électroniques et plus particulièrement les microprocesseurs exécutant des programmes sont susceptibles de subir des perturbations (introduction de virus ou attaque par 10 injection de fautes). Ils sont alors souvent équipés de mécanismes de vérification d'intégrité. Une technique particulièrement répandue consiste à vérifier que les instructions exécutées correspondent aux instructions attendues. Une signature des instructions du 15 programme est calculée lors de la conception du programme ou lors de son enregistrement dans une mémoire généralement non volatile associée à l'unité de traitement. Puis, lors de l'exécution du programme, une signature courante est calculée et comparée à la signature de référence préenregistrée. 20 Ces techniques fonctionnent correctement sur des programmes dont le déroulement est figé, mais posent problème B10875 - 11-ZV2-0077 2 dès que le programme comporte des branchements conditionnels ou des nombres d'itérations variables d'un même calcul. En effet, il est alors particulièrement complexe de calculer la signature sans savoir lors de la conception quels branchements ou combien d'itérations seront effectués. Une solution est de ne pas tenir compte, dans le calcul de la signature, des éventuelles sections (instruction, groupes d'instructions, sous-programmes, etc.) liés à des branchements conditionnels ou aux itérations. Toutefois, l'intégrité de ces sections n'est alors pas vérifiée. Dans des applications cryptographiques, où des calculs sont souvent effectués par itérations successives et ou le type d'opération dépend souvent de l'état d'un bit lié à l'itération courante, cela rend les calculs vulnérables à d'éventuelles attaques par injection de fautes. Résumé Un objet d'un mode de réalisation de la présente invention est de proposer un mécanisme de vérification d'intégrité d'un programme qui pallie tout ou partie des inconvénients des solutions usuelles. Un autre objet d'un mode de réalisation de la présente invention est de proposer un mécanisme de vérification d'intégrité compatible avec la vérification d'instructions dans des branchements conditionnels et dans des itérations. Pour atteindre tout ou partie de ces objets ainsi que d'autres, on prévoit un procédé de vérification d'intégrité d'un programme exécuté par un circuit électronique et comportant au moins un branchement conditionnel, dans lequel : une première valeur est mise à jour pour toute 30 instruction ne correspondant pas à une instruction de branchement ; une deuxième valeur est mise à jour avec la première valeur à chaque instruction de branchement conditionnel ; et B10875 - 11-ZV2-0077 3 la deuxième valeur est comparée à une troisième valeur, calculée en fonction des branchements conditionnels effectués. Selon un mode de réalisation de la présente invention, la troisième valeur est calculée au cours de l'exécution du programme à partir de valeurs de référence précalculées, au moins une valeur de référence étant affectée à une section appelée par un branchement conditionnel. Selon un mode de réalisation de la présente invention, à chaque nouvelle instruction exécutée, on détermine si l'instruction est une instruction de branchement conditionnel, pour mettre à jour la première valeur ou incrémenter la deuxième valeur selon le cas. Selon un mode de réalisation de la présente invention, 15 aucune des première et deuxième valeurs n'est modifiée en cas d'instruction de branchement non conditionnel. Selon un mode de réalisation de la présente invention, la mise à jour de la première valeur est effectuée par une fonction de cumul des valeurs des bits des instructions. 20 Selon un mode de réalisation de la présente invention, la mise à jour de la première valeur est effectuée par une fonction de calcul de CRC. Selon un mode de réalisation de la présente invention, la première valeur est réinitialisée après chaque incrément de 25 la deuxième valeur. Selon un mode de réalisation de la présente invention, le calcul de la troisième valeur est effectué pendant le déroulement du programme. Selon un mode de réalisation de la présente invention, 30 le calcul de la troisième valeur est effectué à la fin de l'exécution du programme, au moins un compteur du nombre de branchements conditionnels étant mis à jour pendant l'exécution du programme. B10875 - 11-ZV2-0077 4 On prévoit également un circuit électronique comportant un circuit de mise en oeuvre du procédé de vérification d'intégrité. Brève description des dessins Ces objets, caractéristiques et avantages, ainsi que d'autres seront exposés en détail dans la description suivante de modes de réalisation particuliers faite à titre non limitatif en relation avec les figures jointes parmi lesquelles : la figure 1 est un schéma bloc partiel d'un exemple de circuit électronique du type auquel s'applique les modes de réalisation décrits ; la figure 2 est un schéma bloc illustrant un détail du circuit de la figure 1 ; la figure 3 illustre, sous forme de blocs, un mode de 15 réalisation du mécanisme de vérification d'intégrité ; et la figure 4 est un exemple d'application du mécanisme de la figure 3. Description détaillée De mêmes éléments ont été désignés par de mêmes 20 références aux différentes figures. Par souci de clarté, seuls les éléments utiles à la compréhension des modes de réalisation décrits ont été représentés et seront détaillés. En particulier, les fonctions mises en oeuvre par les programmes vérifiés n'ont pas été 25 détaillées, l'invention étant compatible avec les programmes usuels. De plus, l'utilisation faite du résultat de la vérification d'intégrité n'a pas n'ont plus été détaillée, l'invention étant là encore compatible avec les exploitations usuelles des résultats de vérification d'intégrité. 30 La figure 1 est un schéma bloc partiel d'un circuit électronique équipé d'un mode de réalisation d'un mécanisme de vérification d'intégrité. Ce circuit comporte une unité de traitement 1 (PU) chargée d'exécuter des instructions I d'un programme. Dans les 35 applications plus particulièrement visées par les modes de B10875 - 11-ZV2-0077 réalisation décrits, ces instructions proviennent d'une mémoire non volatile et sont susceptibles de subir des modifications (volontaires ou accidentelles) entre leur extraction de la mémoire et l'exécution par l'unité centrale. Ces instructions 5 peuvent aussi provenir d'une mémoire non volatile dans laquelle elles transitent, d'un autre circuit que celui intégrant l'unité 1, etc., les modes de réalisation décrits vérifiant l'intégrité en interceptant les instructions au moment de leur chargement pour exécution dans l'unité de traitement. Pour vérifier que ces instructions n'aient pas été modifiées, le circuit de la figure 1 comporte un circuit 2, de préférence dédié, de vérification de l'intégrité des instructions (SIGN COMP) exécutées. Ce mécanisme consiste en une vérification d'une signature des instructions. Un calcul est effectué sur la base des instructions chargées dans l'unité de traitement et le résultat de ce calcul est comparé à une valeur calculée au chargement du programme dans la mémoire non volatile. Le circuit 2 fournit un résultat (OK/NOK) par exemple à l'unité de traitement qui prend les mesures appropriées en fonction de ce résultat. Le plus souvent, la vérification de signature s'effectue à la fin du programme ou à certaines étapes de celui-ci et permet d'interrompre la poursuite de l'exécution ou de valider/invalider le résultat fourni. La figure 2 est une représentation plus détaillée, sous forme de blocs, d'un mode de réalisation du circuit 2. Ce circuit comporte deux éléments de mémorisation 21 (LC) et 22 (GC) destinés à contenir des première et deuxième valeurs ou signatures courantes. Ces éléments de mémorisation sont, par exemple, des registres réalisés avec des éléments de mémoire volatile. Le circuit 2 comporte également un élément 23 (INST TYPE ?) de détection du type d'instruction I reçu (en cours d'exécution par l'unité de traitement). Les types d'instruction distingués sont les instructions de branchement conditionnel (CBI), les instructions de branchement non B10875 - 11-ZV2-0077 6 conditionnel (UBI) et les autres instructions (0I). Un calcul en boucle (itérations) correspond à un branchement conditionnel si le nombre d'itérations n'est pas fixe. En fonction du type d'instruction, le circuit 2 met à jour l'une ou l'autre ou aucune des valeurs courantes LC ou GC. Pour toute instruction ne correspondant pas à une instruction de branchement conditionnel, la signature courante LC est mise à jour. Pour toute instruction correspondant à un branchement conditionnel, la signature courante de GC est mise à jour. Le cas échéant, en présence d'une instruction correspondant à un branchement non conditionnel, aucune des signatures courantes n'est mise à jour. Une fois la mise à jour éventuelle d'une signature courante effectuée, on passe à l'instruction suivante. Dans une réalisation préférée par un circuit 2 dédié, ce dernier comporte deux cellules 24 (LC UPD) et 25 (GC UPD) de mise à jour des valeurs LC et GC. La figure 3 est un organigramme simplifié d'un mode de mise en oeuvre du mécanisme de vérification d'intégrité à l'aide du circuit 2. Une première étape (bloc 31, INT) consiste en une initialisation des signatures courantes LC et GC qui sont, par exemple, initialisées à une valeur nulle. Puis, la première instruction est chargée et on détermine (bloc 32, 01 ?) si cette instruction est une instruction autre qu'une instruction de branchement. Dans l'affirmative (sortie Y du bloc 32), la signature LC est mise à jour (bloc 33, LC = f(LC, I)) par application d'une fonction f à la valeur précédente contenue dans l'élément de mémorisation 21 et à la valeur de l'instruction I. Cette fonction f est par exemple une fonction de cumul des valeurs des bits de l'instruction au total précédent (CHECKSUM). Selon un autre exemple conférant une meilleure diffusion de la signature, la fonction f est une fonction de type CRC (Cyclic Redundancy Check). B10875 - 11-ZV2-0077 7 Une fois la valeur LC mise à jour, on passe à l'instruction suivante (bloc 34, NEXT I). Si l'instruction est une instruction de branchement (sortie N du bloc 32), on détermine (bloc 35, CBI ?) s'il s'agit 5 d'une instruction de branchement conditionnel. Dans l'affirmative, (sortie Y du bloc 35), on met à jour la deuxième valeur GC en y ajoutant la valeur LC et on réinitialise la valeur LC (bloc 36, GC = GC+LC ; LC = 0). On passe à l'instruction suivante (bloc 34). L'opération est, par n 10 exemple, effectuée modulo la cardinalité du registre (modulo 2 où n représente le nombre de bits du registre 22). En variante, l'opération d'addition est une opération de type Ou-Exclusif (XOR), c'est-à-dire une addition bit à bit. Si l'instruction de branchement est une instruction de 15 branchement non conditionnel (sortie N du bloc 35), on passe directement à l'instruction suivante (bloc 34) sans effectuer de mise à jour des signatures. Le fait de ne pas mettre à jour la signature en cas de branchement non conditionnel (UBI) facilite la mise en oeuvre du 20 procédé pour le programmeur. Toutefois, on peut aussi prévoir de considérer une instruction de branchement non conditionnel comme toute autre instruction et mettre alors à jour la valeur LC. Lorsque la dernière instruction a été traitée, on sort (END) de la boucle de calcul de signature courante et la valeur 25 contenue par l'élément de mémorisation 22 (GC) contient la valeur à vérifier à une valeur ou signature de référence. Pour effectuer cette vérification, la signature de référence doit tenir compte du nombre de branchements conditionnels effectués, comme cela va maintenant être décrit en 30 relation avec un exemple simplifié. La figure 4 est un exemple simplifié de programme 4 susceptible d'être vérifié par le mécanisme décrit. Le programme 4 comporte plusieurs sections A, B, C, D et E, par exemple écrites les unes à la suite des autres, et démarre dans la 35 section A. B10875 - 11-ZV2-0077 8 On suppose que : la section A est une section inconditionnelle, exécutée systématiquement ; les sections B et C sont des sections conditionnelles exécutées selon le résultat d'une instruction de branchement (COND(k) JUMP TO C) conditionnelle sur la valeur (par exemple 0 ou 1) prise par une variable k, en fin de section A (k=0/1), l'instruction COND JUMP étant par exemple une instruction de type "if ... then ... else" réalisant soit un branchement sur la section C, soit une poursuite de l'exécution qui correspond à la section B ; la section D est une section inconditionnelle exécutée soit à la suite de la section B par un branchement inconditionnel (UNDCON JUMP TO D) soit à la suite de la section C par poursuite de l'exécution ; et la section E est une boucle (LOOP(N)) de N itérations, la valeur N étant déterminée dans la section D (SELECT N). Si N vaut 0, la boucle est sautée et le programme passe directement à l'instruction qui suit (dans l'exemple, l'instruction de fin). Dans cet exemple, quatre signatures de référence RC(A), RC(BD), RC(CD) et RC(E) sont calculées lors de l'installation ou du chargement du programme en mémoire non volatile du circuit électronique. Ces signatures correspondent à la valeur donnée par application de la fonction f aux instructions des sections (par exemple A et E) ou groupes de sections (par exemple B et D, et C et D) exécutées sans condition. Le cas échéant l'instruction de branchement non conditionnel UNCOND JUMP TO D est incluse dans la section B. Un avantage de calculer les signatures RC(BD) et RC(CD) plutôt que de calculer trois signatures RC(B), RC(C) et RC(D), puis de les cumuler est que cela réduit le nombre de signatures à stocker. De plus, cela améliore la sécurité en vérifiant à la suite l'exécution des sections B et D, ou C et D. Si le programme se poursuit de façon non conditionnelle après la section E, la signature des instructions correspondantes est B10875 - 11-ZV2-0077 9 calculée avec celle de la section A. On voit donc que les signatures de référence peuvent se chevaucher et partager de mêmes sections. Les quatre valeurs précalculées sont utilisées par le mécanisme de vérification d'intégrité pour, en fonction de l'exécution du programme, calculer une valeur courante GC à comparer à la signature de référence RC. Par exemple, une instruction de vérification CHECK correspond à la dernière instruction. Selon un mode de réalisation, la signature RC est calculée en même temps que la signature courante. Elle est initialisée à l'étape 31 (figure 3) avec la valeur RC(A). Puis, selon le résultat de l'instruction de branchement conditionnel (en reprenant l'exemple d'une signature GC basée sur un n incrément modulo 2 ), la valeur RC(BD) ou RC(CD) est ajoutée (bloc 38 en pointillés) en fonction de la section C ou D appelée. Puis, en fonction de la valeur N, un multiple de la signature RC(E) est ajouté à la somme précédente. Côté calcul de signature courante (bloc 36), il n'est pas nécessaire de distinguer les sections. Si l'exécution est correcte (programme intègre), la valeur LC contient, au moment de la mise à jour suivante de la valeur GC, la valeur RC (BD) ou RC(CD) selon la section qui s'est exécutée. Selon un autre mode de réalisation, autant de compteurs qu'il y a de signatures de sections, sont initialisés à zéro et sont incrémentés d'un à chaque fois que la section correspondante est appelée. Puis, à la fin de l'exécution (END), la signature de référence RC est calculée en ajoutant, à la valeur RC(A), les produits respectifs des signatures par les nombres d'exécutions correspondants. Dans l'exemple de la figure 4, cela revient à calculer la relation suivante : RC = RC(A) + k*RC(BD) + (1-k)*RC(CD) + N*RC(E). Quel que soit son mode d'obtention, la signature de 35 référence RC est comparée à la signature courante. B10875 - 11-ZV2-0077 10 Le nombre de signatures de référence dépend du nombre de sections différentes susceptibles d'être appelés en branchements conditionnels. Dans le mode de réalisation où la signature de référence n'est pas calculée au fur et à mesure, le nombre de compteurs des nombres d'exécutions augmente de façon correspondante (sauf si plusieurs sections ont la même signature). Le contrôle de la signature peut intervenir à la fin du programme ou à certaines étapes, pourvu que cela ne soit pas 10 au milieu d'une section. Un avantage du mécanisme de vérification décrit est qu'il permet de prendre en compte la présence de branchements conditionnels dans un programme sans nuire à sa sécurité. Divers modes de réalisation ont été décrits, diverses 15 variantes et modifications apparaîtront à l'homme de l'art. En particulier, le choix de la fonction f dépend de l'application et, par exemple, des cellules de calcul facilement réalisables. On pourra par exemple avoir recours à des signatures plus complexes pourvu que les ressources du circuit électronique et 20 le temps d'exécution le permette. La taille des registres 21 et 22 dépend des tailles susceptibles d'être prises par les valeurs n LC et GC. L'incrément de la valeur GC s'effectue modulo 2 , où n représente le nombre de bit du registre 22. La valeur RC est calculée sur un même nombre de bits que la valeur GC. 25 Enfin, la mise en oeuvre pratique de l'invention est à la portée de l'homme de métier à partir des indications fonctionnelles données ci-dessus. REVENDICATIONS1. Procédé de vérification d'intégrité d'un programme (4) exécuté par un circuit électronique (1) et comportant au moins un branchement conditionnel, dans lequel : une première valeur (LC) est mise à jour pour toute 5 instruction (0I) ne correspondant pas à une instruction de branchement ; une deuxième valeur (GC) est mise à jour avec la première valeur à chaque instruction de branchement conditionnel (CBI) ; et 10 la deuxième valeur est comparée à une troisième valeur (RC), calculée en fonction des branchements conditionnels effectués. 2. Procédé selon la revendication 1, dans lequel la troisième valeur (RC) est calculée au cours de l'exécution du 15 programme à partir de valeurs de référence précalculées (RC(A), RC(BD), RC(CD), RC(E)), au moins une valeur de référence étant affectée à une section (C, D, E) appelée par un branchement conditionnel. 3. Procédé selon la revendication 1 ou 2, dans lequel, 20 à chaque nouvelle instruction exécutée, on détermine (23) si l'instruction est une instruction de branchement conditionnel (CBI), pour mettre à jour la première valeur (LC) ou incrémenter la deuxième valeur (GC) selon le cas. 4. Procédé selon l'une quelconque des revendications 1 25 à 3, dans lequel aucune des première (LC) et deuxième (GC) valeurs n'est modifiée en cas d'instruction de branchement non conditionnel (UBI). 5. Procédé selon l'une quelconque des revendications 1 à 4, dans lequel la mise à jour de la première valeur (LC) est 30 effectuée par une fonction (f) de cumul des valeurs des bits des instructions (I). 6. Procédé selon l'une quelconque des revendications 1 à 4, dans lequel la mise à jour de la première valeur (LC) est effectuée par une fonction (f) de calcul de CRC.B10875 - 11-ZV2-0077 12 7. Procédé selon l'une quelconque des revendications 1 à 6, dans lequel la première valeur (LC) est réinitialisée après chaque incrément de la deuxième valeur (GC). 8. Procédé selon l'une quelconque des revendications 1 5 à 4, dans lequel le calcul de la troisième valeur (RC) est effectué (38) pendant le déroulement du programme. 9. Procédé selon l'une quelconque des revendications 1 à 4, dans lequel le calcul de la troisième valeur (RC) est effectué à la fin de l'exécution du programme, au moins un 10 compteur du nombre de branchements conditionnels étant mis à jour pendant l'exécution du programme. 10. Circuit électronique comportant un circuit de mise en oeuvre du procédé de vérification d'intégrité conforme à l'une quelconque des revendications 1 à 9.