EP 1 538 509 A1
4
5
10
15
20
25
30
35
40
45
50
55
cution. Dans le cas où des tests conditionnels ou appels
de routine ou retour d'appel se suivent, la section de
code peut compter seulement quelques instructions
avant l'embranchement suivant dans l'arborescence
des chemins d'exécution possibles. Dans le cas d'un
saut à une autre routine, le point d'entrée de la routine
est susceptible d'être atteint par différents chemins.
Dans la présente invention, chaque point d'entrée ou
instruction de saut ou équivalent dans le code du pro-
gramme constitue le début d'une nouvelle section de co-
de pour le calcul de sommes de contrôle.
[0018] Pour implémenter un mécanisme de vérifica-
tion de sommes de contrôle, le procédé selon la présen-
te invention effectue un pré-calcul des sommes de con-
trôle sur chaque portion de code à protéger délimitée
par des points d'entrée ou de sortie ou des adresses de
saut ou par des instructions de branchement ou de saut
ou d'appel de routine ou de retour d'appel ou équivalent.
Pour appliquer ledit procédé à l'ensemble du code, com-
me le montrent les figures 3 et 4, la présente invention
utilise un compilateur spécifiquement adapté pour réa-
liser la tâche de pré-calcul des sommes de contrôle (ac-
colade « somme de contrôle pré-calculée sur les figures
3 et 4 »). Le passage des sommes de contrôle pré-cal-
culées en paramètre des instructions de fin de section
de code exige des modifications importantes des com-
pilateurs de type connu puisque le jeu d'instruction du
processeur est modifié.
[0019] La vérification de la somme de contrôle peut
être effectuée par le processeur. Pour cela, le procédé
selon la présente invention fournit au microprocesseur
à la fin de chaque portion de code à protéger la somme
de contrôle pré-calculée qui sera comparée
(« Vérification CKS » sur les figures 1 et 2) à la somme
de contrôle calculée par le processeur au fil de l'exécu-
tion (« Calcule CKS » fig. 1 et 2). Cette valeur est fournie
par exemple en paramètre de l'instruction de branche-
ment ou de saut ou d'appel de routine ou de retour d'ap-
pel ou équivalent et/ou marquant la fin d'une portion de
code à protéger ou d'une instruction marquant la fin
d'une portion de code à protéger. Dans le cas d'une por-
tion de code à protéger terminée par une adresse de
saut, la vérification de la somme de contrôle peut s'ef-
fectuer soit par une instruction spécialement ajoutée
dans le jeu d'instruction du processeur ou simplement
en ajoutant une instruction de saut inconditionnel à l'ins-
truction suivante.
[0020] La vérification est effectuée pendant l'instruc-
tion de fin de portion de code à protéger avec la valeur
pré-calculée fournie en paramètre. La somme de con-
trôle calculée par le processeur au cours de l'exécution
est réinitialisée pour la section de code suivante. Dans
le cas où la vérification de la somme de contrôle révèle
une différence, une action est déclenchée (« Détection
anomalie sur la figure 4).
[0021] La vérification de la somme de contrôle pour-
rait également être effectuée par le logiciel sans modi-
fication du jeu d'instruction du processeur en comparant
la valeur calculée par le processeur et la valeur pré-cal-
culée. Dans ce cas, il n'est pas nécessaire de modifier
le jeu d'instructions du processeur pour passer la som-
me de contrôle pré-calculée en paramètre de l'instruc-
tion de fin de section de code à protéger. Il suffit que la
somme de contrôle calculée par le processeur à l'exé-
cution soit accessible au programme dans un registre
ou autre.
[0022] Cette méthode peu consommatrice en res-
sources présente l'avantage de fournir une protection
intégrale sur le code à exécuter comprenant non seule-
ment le codop mais également les paramètres.
[0023] Selon une autre forme de réalisation du procé-
dé selon la présente invention représentée sur les figu-
res 5 à 7, un compteur 15 est attribué à au moins une
fonction, une séquence ou plus généralement à au
moins une portion dudit programme, et selon une forme
de réalisation, à chaque portion, au début de son exé-
cution. Une portion de programme comprend au moins
une instruction. Dans la suite de la description, à titre
illustratif, la portion considérée est une fonction. Le pro-
cédé consiste à incrémenter ledit compteur par le pro-
cesseur simultanément à l'exécution de chaque instruc-
tion de ladite fonction en cours d'une valeur spécifique
à l'instruction exécutée. A la fin de la fonction, la valeur
atteinte, résultat de la séquence d'instruction exécutée,
est vérifiée en comparaison à une valeur pré-calculée
lors du développement du programme et inscrite dans
le code protégé.
[0024] Le procédé selon ladite forme de réalisation
est implémentable sans ajout ou modification du jeu
d'instruction du processeur. Le procédé peut également
être mis en oeuvre sans adaptation du compilateur.
[0025] Au début de chaque fonction, un compteur est
attribué à la fonction dans une structure de données qui
peut être la pile du processeur. Le compteur est initialisé
à 0 ou à une valeur fixée pour la fonction (« Initialisation
compteur » sur les figures 5 à 7). Pour chaque instruc-
tion du corps de la fonction exécutée avant l'instruction
de retour d'appel, le compteur de la fonction est incré-
menté d'une valeur spécifique à l'instruction (« Calcule
CF ou CP » sur les figures 5 à 7). A la fin de la fonction,
la valeur atteinte par le compteur est comparée à la va-
leur attendue, pré-calculée et utilisée comme valeur de
référence dans le logiciel (« Comparaison CF » sur les
figures 5 à 7).
[0026] Comme le montre la figure 6, dans le cas où
une attaque aurait eu lieu au cours de la fonction, les
instructions n'ont pas été exécutées selon la séquence
prévue dans le programme et la valeur du compteur à
la fin de la fonction (CF1=0x25 sur la figure 6) est diffé-
rente de la valeur attendue et contrôlée (Valeur pré cal-
culée VP=0x92 sur la figure 6) ; l'attaque est ainsi dé-
tectée (« Détection anomalie » sur la figure) et une ac-
tion spécifique est effectuée par le programme ou le pro-
cesseur. Dans le cas où la vérification ne révélerait
aucune anomalie, le compteur de la fonction est dé-al-
loué dans la structure de donnée (sur la figure 5, le
5 6