Brevet FR2816729A1 — publié le 20020517

PROCÉDÉ DE VÉRIFICATION AVANT ACTIVATION D'UN PROGRAMME CHARGÉ DANS UNE CARTE À PUCE. La présente invention concerne un procédé pour vérifier un programme chargé dans une carte à puce, avant son activation. Elle s'applique notamment, mais non exclusivement aux dispositifs électroniques portatifs tels que les cartes à microcircuits électroniques, dites cartes à puce. Elle s'applique plus généralement à tout dispositif embarqué indépendant, doté d'une unité de traitement ou microprocesseur, associée à des mémoires de programme et de données, et d'un module de communication avec ou sans contact pour être connecté avec un dispositif électronique de lecture et/ou d'écriture. Les mémoires de programme et de données comprennent généralement une mémoire morte ou non réinscriptible, mais programmable une seule fois au moment de sa fabrication, par exemple de type ROM (Read Only Memory), et une mémoire volatile et accessible en écriture et en lecture, par exemple de type RAM (Random Access Memory), servant au stockage de données temporaires durant l'exécution d'un programme. Les puces les plus évoluées comprennent également une mémoire non volatile, accessible à la fois en lecture et en écriture, par exemple de type EEPROM (Electrically Erasable Programmable Read Only Memory) ou FLASH. Jusqu'à présent, la plus grande partie des informations à stocker dans une carte à puce était le programme de la carte lui-même. Pour gagner de la place mémoire, le programme était stocké dans une mémoire ROM qui présente l'avantage d'occuper moins de surface qu'une mémoire non volatile programmable, normalement utilisée pour stocker des données variables comme la balance d'un porte-monnaie électronique. Cependant, la mémoire ROM présente l'inconvénient de devoir être chargée au moment de sa fabrication, son contenu étant défini par un masque. Il est donc nécessaire de prévoir un masque par programme, la réalisation d'un tel masque étant effectuée par le fabricant de la puce et étant longue et coûteuse. En outre, si une erreur de programmation est découverte, il faut réaliser un nouveau masque. Récemment, est apparue une nouvelle technologie, dite Flash, alliant les avantages de la mémoire ROM en terme de surface, et de l'EEPROM en ce qui concerne les possibilités de programmation. Cette technologie permet une nouvelle architecture dans laquelle la puce comprend une mémoire ROM de faible capacité dans laquelle est chargé un petit programme de chargement appelé"bootloader"de la mémoire non volatile programmable, à la suite d'un tel chargement le programme de chargement active le programme chargé qui est généralement écrit en langage machine c'est-à-dire le langage de commande du microprocesseur de la puce. De cette manière, le contenu de la mémoire ROM est rendu générique en permettant le chargement d'un grand nombre de programmes applicatifs. Cette possibilité est très intéressante pour le programmeur, car elle lui permet de tester ses programmes directement sur la carte sans avoir besoin de lancer la fabrication d'un nouveau masque de mémoire ROM. Elle permet également de réduire la durée de conception et de mise au point d'une nouvelle application. Cette solution offre également la possibilité de faire fonctionner la puce à l'aide de plusieurs systèmes d'exploitation, et d'adapter celui-ci en fonction des besoins du client. Il est également envisageable de livrer des cartes dont la mémoire programmable est vierge, le client effectuant lui-même le chargement d'un système d'exploitation et le test de la carte. Toutefois, si le programme de chargement dans la mémoire ROM permet de charger n'importe quel programme, cela pose des problèmes de sécurité. En effet, si une personne malintentionnée se procure une telle carte, elle peut en toute liberté y charger un programme lui donnant accès à toutes les ressources de la carte, ce qui lui permet d'étudier très finement le comportement de la puce, et donc de mettre au point facilement des stratégies d'attaque sur d'autres cartes du même type. Il existe par ailleurs le principe de la machine virtuelle selon lequel le système d'exploitation de la carte n'accepte que des commandes ou des programmes qui sont écrits dans un langage différent du langage de commande du microprocesseur. Si le langage de commande du système d'exploitation ne donne pas accès à toutes les ressources de la carte, celle-ci est moins vulnérable. Toutefois, le système d'exploitation et la machine virtuelle doivent être préalablement chargés. S'ils sont chargés dans la mémoire non effaçable, on retrouve les problèmes de mise au point et de délais et coûts de fabrication mentionnés ci-avant. S'ils sont chargés dans la mémoire non volatile, comme ils sont écrits dans en langage machine, ils peuvent donc être remplacés par d'autres programmes permettant d'analyser le fonctionnement de la puce. Par conséquent, cette dernière solution rend la puce vulnérable. Dans ce contexte, l'invention a pour objet un procédé permettant au programme de chargement stocké dans la mémoire ROM de s'assurer qu'il charge un programme autorisé. A cet effet, elle propose un procédé de chargement d'un programme dans une mémoire d'un composant électronique comprenant une unité de traitement. Selon l'invention, ce procédé est caractérisé en ce qu'il comprend : - une première phase de chargement comprenant le chargement dans une première mémoire du composant par une première entité d'au moins une valeur caractéristique prédéfinie d'un programme autorisé à être utilisé par le composant, - une seconde phase de chargement comprenant le chargement par une seconde entité d'un programme dans une seconde mémoire du composant, ladite seconde entité n'étant pas apte à effectuer un chargement dans la première mémoire, - une phase de vérification par l'unité de traitement du programme chargé, comprenant la détermination d'une valeur caractéristique du programme chargé, et la comparaison de cette valeur caractéristique aux valeurs caractéristiques prédéfinies chargées dans la première mémoire, et - une phase d'activation par l'unité de traitement du programme chargé, comprenant l'activation du programme chargé uniquement si la valeur caractéristique du programme déterminée correspond à l'une des valeurs caractéristiques prédéfinies, chargées dans la première mémoire. Grâce à ces dispositions, seuls les programmes préalablement vérifiés et référencés dans la première mémoire de la puce, qui peut être une mémoire non effaçable, peuvent être chargés dans la seconde mémoire et activés. Il n'est donc pas possible de charger un programme permettant d'étudier précisément le fonctionnement de la puce. Avantageusement, la phase de vérification est effectuée à la suite de la réception par l'unité de traitement d'une commande de fin de chargement associée à une signature d'authentification, et de la vérification que cette signature est acceptable. La valeur caractéristique peut être un identifiant de programme ou une valeur condensée du programme, obtenue en appliquant au programme une fonction de "hash"ou une fonction MAC (Message Authentification Code). Selon une particularité de l'invention, la première phase de chargement comprend le chargement dans la première mémoire du composant d'une table de correspondance associant pour chaque programme susceptible d'être chargé dans la seconde mémoire, une valeur caractéristique du programme et une définition d'adresses de zones mémoire où peut être chargé le programme, une commande de chargement d'un programme dans la seconde mémoire du composant n'étant exécutée que si elle contient des adresses de chargement correspondant à celles figurant dans la table de correspondance en association avec la valeur caractéristique transmise. Si la valeur caractéristique du programme chargé est une valeur condensée du programme, la détermination de la valeur caractéristique du programme chargé peut être effectuée uniquement sur les zones mémoire définies dans la table de correspondance en association avec la valeur condensée transmise. Selon une autre particularité de l'invention, la table de correspondance comprend en outre une référence respective de tous les programmes susceptibles d'être chargés dans la seconde mémoire du composant, le procédé comprenant la transmission au composant de la référence du programme à charger, la lecture de table pour obtenir la valeur condensée associée à la référence de programme reçue, et la comparaison de la valeur condensée calculée avec la valeur condensée lue dans la table pour déterminer si le programme chargé dans la seconde mémoire peut être activé. Si la phase de vérification a échoué, on peut prévoir d'effacer le programme chargé dans la seconde mémoire. Alternativement, chaque programme chargé en mémoire peut être associé à un indicateur d'autorisation d'activation, permettant d'interdire ou d'autoriser l'activation ultérieure du programme correspondant selon que la phase de 'f v vérification a échoué ou non. Les programmes susceptibles d'être chargés dans la seconde mémoire, comprennent des zones libres dont les adresses sont prédéfinies pour recevoir des informations ponctuelles. Ils peuvent être des programmes modulaires, chaque module ayant une valeur caractéristique stockée dans la première mémoire. La première phase est avantageusement effectuée une seule fois et de manière irréversible. On peut prévoir en outre un mode d'extension sécurisé permettant d'ajouter dans une mémoire du composant une valeur caractéristique de programme susceptible d'être chargé dans la seconde mémoire. L'invention concerne également un composant électronique permettant de mettre en oeuvre le procédé décrit ci-avant. Un mode de mise en oeuvre du procédé selon l'invention sera décrit ci-après, à titre d'exemple non limitatif, avec référence aux dessins annexés dans lesquels : La figure 1 représente schématiquement le composant électronique d'une carte à puce ; La figure 2 montre l'organisation de la mémoire non volatile du composant à la fin de la phase de chargement des informations non confidentielles ; La figure 3 montre sous la forme d'un organigramme l'enchaînement des différentes étapes du procédé selon l'invention. La figure 1 montre un composant électronique 1 conçu pour être intégré dans une carte à puce dite intelligente. Ce composant comprend généralement une unité de traitement 2 ou microprocesseur, reliée par un bus de communication 3 à des mémoires 4,5, 6, et à une liaison 7 vers un terminal de lecture et éventuellement d'écriture. Cette liaison est constituée soit de plages de contact dans le cas d'une carte à puce à contacts, soit par une antenne dans le cas d'une carte à puce sans contact. Ces mémoires comportent une mémoire non réinscriptible et non effaçable 4, par exemple de type ROM, une mémoire non volatile 5 accessible en écriture et en lecture, par exemple de type EEPROM ou FLASH, et une mémoire volatile 6 ou RAM. Conformément au procédé selon l'invention 20 illustré sur la figure 3, on applique tout d'abord au composant électronique un traitement d'initialisation 21 effectué au moment de sa fabrication. Ce traitement consiste à inscrire dans la mémoire 4 un programme permettant le chargement de la mémoire non volatile 5, ainsi qu'une table comprenant pour chaque programme susceptible d'être chargé dans la mémoire 5, une valeur caractéristique du programme ou des adresses de chargement de celui-ci dans la mémoire 5. Cette valeur caractéristique peut être un identifiant du programme ou une valeur condensée de celui-ci ou des adresses de chargement. Cette valeur condensée peut-être obtenue par un calcul de CRC (Cyclic Redundancy Check), ou encore par un algorithme de"hash", par exemple la fonction SHA-1 (Secure Hash Algorithm- l), permettant d'obtenir une séquence binaire, par exemple de 160 bits, représentant de manière condensée le code du programme. Une telle fonction est conçue de manière à ce qu'une légère modification de contenu entraîne une modification importante de la séquence binaire ainsi calculée. La table comprend de préférence également, la définition des adresses de la c zone mémoire où doit être chargé le programme dans la mémoire 5. Cette table peut également comprendre une référence de chaque programme susceptible d'être chargé dans la mémoire 5, en association avec la valeur caractéristique du programme. Durant cette phase, on peut également prévoir de charger dans la mémoire 4 des informations confidentielles, telles qu'un numéro de série et une clé secrète qui peut être déterminée en fonction du numéro de série. Le programme de chargement stocké dans la mémoire 4 est conçu de manière à être activé dès la mise sous tension du composant 1 et pour se mettre en attente du chargement d'un programme applicatif ou d'un système d'exploitation. Durant la phase suivante du procédé selon l'invention, le composant 1 est connecté à un terminal de programmation par l'intermédiaire de la liaison 7, le terminal transmettant au composant une ou plusieurs commandes d'écriture d'un programme applicatif (étape 22). Chaque commande contient une adresse d'écriture et le programme ou la partie de programme à charger à l'adresse indiquée, et éventuellement la taille des informations à charger contenues dans la commande de chargement. Le programme ainsi transmis est chargé dans la mémoire 5. A la fin de ce chargement qui peut être indiqué par le terminal en envoyant une commande de fin de chargement, le microprocesseur 2 passe à une phase de vérification 23. La commande de fin de chargement peut être associée à une signature, par exemple un code MAC, permettant d'authentifier l'entité qui vient d'effectuer le chargement. Si la signature n'est pas valide, le programme chargé ne peut pas être validé et activé. Durant la phase de vérification du programme chargé, le microprocesseur 2 détermine la valeur caractéristique du programme ainsi chargé dans la mémoire 5. Ensuite, le microprocesseur 2 compare 24 la valeur caractéristique ainsi obtenue aux valeurs de référence qui ont été préalablement chargées dans la mémoire non effaçable 4. Si la valeur calculée ne correspond pas à l'une des valeurs mémorisées dans la mémoire 4, le chargement du programme est considéré comme ayant échoué et le programme de chargement se met en attente d'une nouvelle commande de chargement, après avoir éventuellement émis un message d'erreur au terminal de programmation. Dans le cas contraire, la phase de chargement du programme applicatif est validée et celui-ci peut être activé 25. A la fin du chargement du programme applicatif, le contenu de la mémoire peut être par exemple tel quel représenté sur la figure 2. Sur cette figure, le programme chargé est un système d'exploitation occupant deux zones 13,14, dans la mémoire 5, les autres zones 12 de la mémoire (entre les zones 13 et 14 et après la zone 14) restant libres et permettant à l'utilisateur d'inclure ses propres données ou programmes. Le programme applicatif chargé peut également inclure des zones libres 11 prévues pour recevoir des informations confidentielles au cours d'une étape de personnalisation confidentielle. Dans ce cas, le programme applicatif lorsqu'il est activé à l'étape 25 se met en attente de commandes de chargement de ces informations confidentielles. A la réception d'une telle commande, le programme de chargement en mémoire 4 vérifie dans la table de correspondance que l'adresse d'écriture transmise fait partie de la zone mémoire où doit être chargé le programme ayant la référence transmise. Chaque valeur caractéristique de programme susceptible d'être chargé dans la mémoire 5 peut être avantageusement stockée dans la mémoire 4 dans une table de correspondance où elle est associée à des valeurs d'adresses de zones mémoire où doit être chargé le programme. On peut ainsi prévoir qu'un chargement de programme n'est effectué par l'unité de traitement 2 que si les adresses transmises dans la commande de chargement du programme, correspondent à celles qui sont stockées dans la mémoire 4 en association avec la valeur caractéristique du programme. On peut également prévoir que le calcul de valeur caractéristique effectué par le programme de chargement ne porte que sur les zones mémoires définies dans la table de correspondance en association avec la valeur caractéristique du programme chargé. La mémoire 4 peut également mémoriser une référence de programme en association avec chaque valeur caractéristique de programme susceptible d'être chargé dans la mémoire 5. Dans ce cas, les commandes de chargement incluent cette référence, et le programme de chargement recherche dans la mémoire 4, la référence transmise dans la commande de chargement reçue, et compare la valeur caractéristique calculée avec celle qui est mémorisée dans la mémoire 4 en association avec la référence transmise. Le procédé qui vient d'être décrit peut être réalisé de manière à pouvoir s'appliquer au chargement de plusieurs programmes applicatifs ou systèmes d'exploitation. Dans ce cas, les zones de la mémoire 5 où doivent être chargés les programmes à stocker simultanément sont bien entendu disjointes. Ainsi, on peut prévoir d'effectuer la vérification du chargement (étape 23) lorsque toutes les commandes de chargement ont été exécutées, en effectuant un calcul de valeur caractéristique sur chaque zone mémoire associée dans la table de correspondance à une référence de programme reçue. En outre, à la mise sous tension du composant, il faut prévoir un moyen de sélection du programme applicatif à activer. De même, le procédé qui vient d'être décrit peut également être appliqué à un programme applicatif ou système d'exploitation modulaire. Dans ce cas, chaque module du programme applicatif est associé à une référence de programme qui figure dans la table de correspondance en association avec une adresse de chargement et une valeur caractéristique du module. Bien entendu, un tel programme modulaire doit être conçu pour n'exécuter une commande que si elle appartient à un module préalablement chargé. On peut donc prévoir d'exécuter une procédure d'initialisation au cours de laquelle le microprocesseur 2 détecte les modules chargés pour valider les commandes correspondantes. Il est à noter que le procédé selon l'invention est parfaitement adapté au chargement de systèmes d'exploitation réalisant ce que l'on appelle une machine virtuelle, c'est-à-dire capables d'exécuter des programmes écrits dans un langage spécifique différent du langage de commande du microprocesseur 2. On peut prévoir un moyen pour interdire l'exécution d'un programme non validé. Ce moyen peut consister à effacer la zone mémoire qui a été chargée avec le programme reçu non valide. Il peut également consister en une table d'indicateurs, à raison d'un indicateur par programme chargé, l'activation d'un programme n'étant effectuée que si l'indicateur correspondant autorise cette activation. Dans le cas où les adresses de chargement de chaque programme autorisé ne sont pas imposées, on peut autoriser un nouveau chargement de programme dans une zone mémoire dans laquelle un programme a déjà été validé. Dans ce cas, il faut prévoir une procédure qui peut être activée systématiquement à chaque chargement, permettant d'interdire l'utilisation ultérieure du programme préalablement chargé qui est écrasé par le nouveau chargement. On peut à cet effet prévoir une table de validation dans laquelle est inscrite la définition des adresses de la zone mémoire où est chargé chaque programme, en association avec un indicateur de validation représentant l'état validé ou non du programme correspondant. Si l'unité de traitement reçoit une commande de chargement dans une zone mémoire qui est référencée dans la table de validation comme ayant été préalablement validée, elle exécute la commande de chargement en ayant au préalable changé l'état de l'indicateur de validation correspondant. On peut prévoir également un mode d'extension sécurisé permettant d'ajouter une valeur condensée de programme susceptible d'être chargé dans la mémoire 5. Une telle extension peut par exemple être effectuée à l'aide d'une commande prévue à cet effet, cette commande étant associée à un code MAC appliqué à la commande permettant au microprocesseur 2 d'authentifier l'entité qui a émis une telle commande. De cette manière, l'ensemble des valeurs caractéristiques des programmes susceptibles d'être chargés dans la mémoire du composant peuvent être toutes stockées dans une mémoire non volatile et effaçable du composant. REVENDICATIONS 1. Procédé de chargement d'un programme dans une mémoire d'un composant électronique (1) comprenant une unité de traitement (2), caractérisé en ce qu'il comprend : - une première phase de chargement comprenant le chargement dans une première mémoire (4) du composant (1) par une première entité d'au moins une valeur caractéristique prédéfinie d'un programme autorisé à être utilisé par le composant, - une seconde phase de chargement (22) comprenant le chargement par une seconde entité d'un programme dans une seconde mémoire (5) du composant (1), ladite seconde entité n'étant pas apte à effectuer un chargement dans la première mémoire (4), - une phase de vérification (23) par l'unité de traitement du programme chargé, comprenant la détermination d'une valeur caractéristique du programme chargé, et la comparaison de cette valeur caractéristique aux valeurs caractéristiques prédéfinies chargées dans la première mémoire, et - une phase d'activation (25) par l'unité de traitement du programme chargé, comprenant l'activation du programme chargé uniquement si la valeur caractéristique du programme déterminée correspond à l'une des valeurs caractéristiques prédéfinies, chargées dans la première mémoire. 2. Procédé selon la revendication 1, caractérisé en ce que la phase de vérification est effectuée à la suite de la réception par l'unité de traitement (2) d'une commande de fin de chargement. 3. Procédé selon la revendication 2, caractérisé en ce que la commande de fin de chargement est associée à une signature d'authentification qui est vérifiée, la phase de vérification n'étant effectuée que si cette signature est acceptable. 4. Procédé selon la revendication 1 ou 3, caractérisé en ce que la valeur caractéristique est un identifiant de programme. 5. Procédé selon la revendication 1 ou 3, caractérisé en ce que la valeur caractéristique est une valeur condensée du programme. 6. Procédé selon la revendication 1 ou 3, caractérisé en ce que la valeur caractéristique est une valeur condensée du programme obtenue en appliquant au programme une fonction de"hash". 7. Procédé selon la revendication 1 ou 3, caractérisé en ce que la valeur caractéristique est une valeur condensée du programme obtenue en appliquant au programme une fonction MAC. 8. Procédé selon l'une des revendications 1 à 7, caractérisé en ce que la première phase de chargement comprend le chargement dans la première mémoire (4) du composant d'une table de correspondance associant pour chaque programme susceptible d'être chargé dans la seconde mémoire (5), une valeur caractéristique du programme et des informations de définition de zones mémoire où peut être chargé le programme, une commande de chargement d'un programme dans la seconde mémoire (5) du composant n'étant exécutée que si elle contient des adresses de chargement correspondant à celles figurant dans la table de correspondance en association avec la valeur caractéristique transmise. 9. Procédé selon la revendication 8, caractérisé en ce la valeur caractéristique est une valeur condensée du programme, et en ce que la détermination de la valeur caractéristique du programme chargé est effectuée uniquement sur les zones mémoire définies dans la table de correspondance en association avec la valeur condensée transmise. 10. Procédé selon la revendication 8 ou 9, caractérisé en ce qu'il comprend en outre la transmission au composant d'une référence du programme à charger, la lecture de la table de correspondance dans laquelle chaque valeur condensée de programme est associée à une référence de programme respective, pour obtenir la valeur condensée associée à la référence de programme reçue, et la comparaison de la valeur condensée calculée avec la valeur condensée lue dans la table pour déterminer si le programme chargé dans la seconde mémoire peut être activé. 11. Procédé selon l'une des revendications 1 à 10, caractérisé en ce que si la phase de vérification a échoué, le programme chargé dans la seconde mémoire est effacé. 12. Procédé selon l'une des revendications 1 à 10, caractérisé en ce que chaque programme chargé en mémoire est associé à un indicateur d'autorisation d'activation, permettant d'interdire ou d'autoriser l'utilisation du programme correspondant selon que la phase de vérification a échoué ou non. 13. Procédé selon l'une des revendications 1 à 12, caractérisé en ce qu'il comprend avant chaque chargement d'une zone mémoire l'invalidation de ladite zone mémoire pour rendre son contenu inutilisable, de manière à interdire l'utilisation ultérieure d'un programme préalablement chargé dans ladite zone mémoire qui est modifié par un nouveau chargement. 14. Procédé selon l'une des revendications 1 à 13, caractérisé en ce que les programmes susceptibles d'être chargés dans la seconde mémoire, comprennent des zones libres dont les adresses sont prédéfinies pour recevoir des informations ponctuelles. 15. Procédé selon l'une des revendications 1 à 14, caractérisé en ce que les programmes susceptibles d'être chargés dans la seconde mémoire, sont des programmes modulaires, chaque module ayant une valeur caractéristique stockée dans la première mémoire. 16. Procédé selon l'une des revendications 1 à 15, caractérisé en ce que la première phase est effectuée une seule fois et de manière irréversible. 17. Procédé selon l'une des revendications 1 à 15, caractérisé en ce qu'il comprend un mode d'extension sécurisé permettant d'ajouter dans la première mémoire une valeur caractéristique de programme susceptible d'être chargé dans la seconde mémoire. 18. Composant électronique (1) comprenant une unité de traitement (2), caractérisé en ce qu'il comprend au moins une première mémoire (4) accessible uniquement par une première entité et dans laquelle est stocké au moins une valeur caractéristique d'un programme susceptible d'être chargé dans une seconde mémoire (5), l'unité de traitement (2) comprenant des moyens pour recevoir une commande de chargement d'un programme et charger ce programme dans la seconde mémoire, des moyens pour déterminer une valeur caractéristique du programme chargé dans la seconde mémoire, des moyens pour comparer la valeur caractéristique déterminée avec les valeurs caractéristiques stockées dans la première mémoire, et des moyens pour activer le programme chargé dans la seconde mémoire si la valeur caractéristique déterminée correspond à une valeur caractéristique stockée dans la première mémoire. 19. Composant électronique selon la revendication 18, caractérisé en ce que la première mémoire (4) est une mémoire non effaçable, et la seconde mémoire (5) est une mémoire non volatile et effaçable. 20. Composant électronique selon la revendication 18, caractérisé en ce que la première mémoire (4) est une mémoire effaçable, protégée de manière a être accessible en écriture uniquement par une entité autorisée. 21. Carte à microcircuit, caractérisée en ce qu'elle comprend un composant électronique selon l'une des revendications 18 à 20.