• Aucun résultat trouvé

L’objet de ce chapitre est de limiter l’espace de recherche pour les traces de non-inclusion en se limitant aux traces bien typées. Un tel résultat est toujours vrai pour le système de type trivial où tous les termes ont le même type ; la section 2.2.1 définira les systèmes de types en général, ainsi que les systèmes structurés qui nous intéresseront plus particulièrement, puis la section 2.2.2 énoncera les conditions qu’un système de types doit vérifier, par rapport à un protocole donné, pour démontrer le résultat. La section 2.2.3 énoncera les théorèmes qui seront démontrés dans ce chapitre.

2.2.1 Système de types

Définissons d’abord un système de types en toute généralité.

Définition 2.1. Un système de types est la donnée d’une paire (T , δ) où T est un ensemble de types, δ une fonction qui envoie les termes de t ∈ T0c, Σ+0 ∪ N ∪ X ) sur des types de T , et (T , δ) vérifie les propriétés suivantes :

— Si t est un terme et σ une substitution bien typée, alors δ(tσ) = δ(t).

— Pour tous sous-termes unifiables t et t0de même type, c’est-à-dire δ(t) = δ(t0), leur unificateur le plus général (mgu(t, t0)) est bien typé.

où une substitution σ est bien typée si pour tout d ∈ dom(σ), δ(dσ) = δ(d).

Une exécution K=tr=⇒ (P; φ; σ; i) est bien typée si σ est une substitution bien typée, et lorsqu’il existe une telle exécution, on dit également que tr est bien typée. L’un des avantages à considérer seulement les exécutions bien typées consiste à pouvoir borner la taille des messages en termes de nombre d’opérations cryptographiques, c’est-à-dire leur profondeur comme termes. Les systèmes de types structurés donnent naturellement cette propriété.

Définition 2.2. On appelle système de types structuré la donnée d’une paire (T0, δ0) où T0 est un ensemble de types initiaux et δ0 une fonction qui envoie les données de Σ+0 ] N ] X vers les types τ engendrés par la grammaire suivante :

τ, τ1, τ2= τ0| f(τ1, . . . , τn) avec f ∈ Σc et τ0∈ T0

Ensuite, δ0 est étendue aux termes constructeurs de la façon suivante : δ0(f(t1, . . . , tn)) = f(δ0(t1), . . . , δ0(tn)) avec f ∈ Σc

Comme la définition 2.2 ne l’indique pas directement, le lemme suivant montre que les systèmes de types structurés sont bien des systèmes de types.

Lemme 2.1. Soit (T0, δ) un système de types structuré. Alors (T (Σc, T0), δ) est un système de types comme dans la définition 2.1.

Démonstration. Nous devons prouver les deux énoncés suivants :

— Si t est un terme et σ une substitution bien typée, alors δ(tσ) = δ(t).

— Pour tous termes unifiables t et t0 de même type, leur unificateur le plus général mgu(t, t0) est bien typé.

Le premier item se prouve par récurrence sur t. Si t est une donnée et t /∈ dom(σ), alors tσ = t d’où δ(tσ) = δ(t). Si t ∈ dom(σ), alors δ(tσ) = δ(t) car σ est bien typée. Si t = f(t1, . . . , tn), alors δ(f(t1, . . . , tn)) = f(δ(t1), . . . , δ(tn)) par définition de δ pour les termes composés. De même :

δ(tσ) = δ(f(t1, . . . , tn)σ) = δ(f(t1σ, . . . , tnσ)) = f(δ(t1σ), . . . , δ(tnσ))

Par hypothèse de récurrence, pour chaque i, δ(tiσ) = δ(ti) et donc δ(tσ) = δ(t), ce qui conclut la preuve de cet item.

Prouvons maintenant le second item. Étant donné un ensemble Γ d’équations bien typées, on note #vars(Γ) le nombre de variables de Γ, et |Γ| sa taille, à savoir

X

t=t0∈Γ

(|t| + |t0|)

où |t| est le nombre de symboles dans t. Notre mesure kΓk est déterminée par ces deux éléments dans l’ordre lexicographique. Prouvons que mgu(Γ) est bien typé par récurrence sur kΓk, en nous appuyant sur cette mesure.

Initialisation. kΓk = (0, 0), c’est-à-dire Γ = ∅, et donc le résultat est évident. Hérédité. Γ = Γ0] {t = t0}. Plusieurs cas se présentent :

— t ou t0 est une variable. Alors on suppose, sans perte de généralité, que t est une variable x, et on pose σ = {x . t0}. σ est bien typée car les équations de Γ sont bien typées. De plus, en appliquant l’hypothèse de récurrence sur Γ0, on déduit que mgu(Γ0) est bien typé, et donc la substitution {x . t0mgu(Γ0)} est bien typée. Il en découle que mgu(Γ) = mgu(Γ0) ] {x . t0mgu(Γ0)} est bien typé.

— t est une donnée, mais pas une variable. Dans ce cas, t0 est aussi une variable puisque δ(t) = δ(t0), et t0n’est pas une variable (ou bien on est ramené au cas précédent). Comme t et t0 sont unifiables, t = t0et mgu(Γ) = mgu(Γ0), avec kΓ0k < kΓk. Par hypothèse de récurrence, mgu(Γ0) est bien typé, donc mgu(Γ) est bien typé.

— t est un terme composé : t = f(t1, . . . , tk). Dans ce cas, t0 = f(t01, . . . , t0k) car t0 n’est pas une variable et t et t0 sont unifiables. On en déduit que mgu(Γ) = mgu(Γ00) avec Γ00 = Γ ] {t1 = t01, . . . , tk = t0k}. Γ00 est un ensemble d’équations bien typées et kΓ00k < kΓk donc mgu(Γ00) est bien typé par hypothèse de récurrence.

Dans la suite, nous supposerons l’existence d’un nombre infini de constantes de chaque type dans chacun des ensembles Σ0, Σatom

fresh et Σbitstringfresh . L’exemple suivant donne un exemple de système de types structuré, à partir du protocole d’Otway-Rees introduit dans le chapitre précédent. Exemple 2.2. La modélisation du protocole d’Otway-Rees, dans l’exemple 1.12, s’appuyait sur les données

x, ya, yb, ym, zm, z1senc, zsenc2 , zab∈ X a, b ∈ Σ0, m, na, nb, kas, kbs, kab∈ N

Considérons l’ensemble de types initiaux T0 = {τa, τb, τm, τna, τnb, τas, τbs, τab}. La fonction de typage δ se définit naturellement sur les noms et les constantes, par exemple δ(a) = τa, δ(m) = τm,

δ(na) = τna, δ(kas) = τas. Sur les variables, on peut donner le type attendu pour une exécution honnête :

δ(x) = δ(zab) = τab δ(ya) = τna δ(yb) = τnb δ(ym) = δ(zm) = τm δ(z1senc) = senc(hτna, τm, τa, τbi4, τas) δ(zsenc2 ) = senc(hτna, τabi2, τas)

La substitution σ de l’exemple 1.13 est bien typée pour ce système de type, et le témoin tr0 de l’exemple 1.16 est donc un témoin bien typé. Si l’on avait donné des types différents à kabet x, alors il n’y aurait eu aucun témoin de non-inclusion bien typé, puisque senc(hna, kabi2, kas) est le seul message connu de l’attaquant qui peut s’unifier avec senc(hna, kabi2, kas), et que cette unification serait interdite par le système de types.

Un autre système de types (T00, δ0) intéressant consiste à prendre T00 = T0] {τf wd} et δ0 qui coïncide avec δ sauf pour δ0(z1

senc) = δ0(z2

senc) = τf wd, De cette manière, le témoin tr0 est mal typé, mais il existe un autre témoin (par rapport à Σ+0)

tr00= out(cA, w1).in(cB, R1).out(cB, w2).in(cS, R2).out(cS, w3).in(cA, R).phase 1.out(c, w4) où R a été définie à l’exemple 1.13, et :

R1= hproj41(w1), a, b, cf wdi4

R2= hproj41(w1), a, b, proj44(w1), proj44(w2)i5 avec cf wd ∈ Σ+

0 une constante de l’attaquant de type δ(cf wd) = τcf w. Il est facile de transformer tr00 en un témoin par rapport à Σ0 en appliquant le renommage ρ = {cf wd. c} avec c ∈ Σ0 : tr00ρ est alors un témoin par rapport à Σ0. L’utilité des constantes de Σfresh sera plus claire à partir de l’exemple 2.8. Les exécutions bien typées pour (T00, δ0) ont l’avantage de ne pas affecter de messages composés aux variables z1

senc et z2 senc.

2.2.2 Conformité

Nous avons vu dans l’exemple 2.2 qu’il n’était pas possible d’exiger des témoins bien typés pour certains systèmes de types trop contraignants. Plus précisément, lorsque le système de types empêche certaines unifications, une partie des processus peut se transformer en code mort. Une restriction naturelle consisterait à imposer que tous les sous-termes unifiables aient le même type, mais alors seuls des systèmes de types triviaux seraient autorisés. Il faut donc choisir une hypothèse plus fine, et qui concerne uniquement les sous-termes chiffrés. Ces sous-termes sont définis par opposition aux symboles transparents, c’est-à-dire inversibles.

Formellement, soit n un entier et f ∈ Σcun symbole d’arité n. Nous disons que f est transparent s’il existe un terme f(Rf

1, . . . , Rf

n) ∈ T (Σ, ), noté Cf, tel que pour tout t ∈ T0(Σ, Σ+0 ] N ] X ) avec root(t) = f, on a f(Rf

1, . . . , Rf

n){ . t}↓ = t. Pour tout terme t, on note Cf[t] = Cf{ . t}. Intuitivement, les symboles transparents correspondent à des termes qui peuvent toujours être ouverts par l’attaquant, comme les paires ou les tuples. Les sous-termes chiffrés ESt (t) d’un terme t sont les sous-termes de t dont la racine n’est pas transparente, c’est-à-dire

ESt (t) = {u ∈ St (t) | u est un terme composé et root(u) n’est pas transparent.} Exemple 2.3. Considérons les symboles hi2 et senc de la signature Σstd

n définie en section 1.1.7. Pour tout message t avec root(t) = h·, ·i2, t = hproj21(t), proj22(t)i2↓, et donc Chi2 = hproj21(), proj22()i2. Au contraire, le symbole de fonction senc n’est pas transparent car la seule règle qui contient senc ne permet pas d’en déduire la clé.

Les sous-termes chiffrés d’une configuration initiale (P; φ; ∅; i) sont les sous-termes chiffrés de P et ceux de φ. Nous pouvons maintenant exprimer notre hypothèse sur les systèmes de types, qui suit celles de Chrétien, Cortier et Delaune [51] et Blanchet et Podelski [38].

Définition 2.3. Soit Σ0 un ensemble de constantes. Soit K une Σ0-configuration initiale. On dit que K est conforme au système de types (T , δ) si tous les sous-termes chiffrés unifiables ont le même type, c’est-à-dire si pour tous t, t0 ∈ ESt (K), δ(t) = δ(t0) chaque fois que t et t0 sont unifiables.

Dans les cas usuels, il est facile de savoir quels sont les symboles transparents, et les contraintes sur nos règles de réécriture, comme la propriété des sous-termes pour les théories à construc-teurs, doivent permettre de décider si un symbole est transparent ou non. Cependant, comme la conformité porte uniquement sur les sous-termes chiffrés, il est superflu de savoir exactement quels sont les symboles transparents : simplement, lorsque nous savons qu’un symbole est transparent, l’hypothèse nous autorise à ne pas prendre en compte certaines unifications.

Revenons à notre exemple de référence.

Exemple 2.4. Les processus POR0 et POR00 introduits par l’exemple 1.16 sont conformes aux sys-tèmes de types (T0, δ) et (T00, δ0) décrit dans l’exemple 2.2. En effet, les sous-termes chiffrés de POR0 et POR00 sonti ceux de POR, c’est-à-dire :

senc(hna, m, a, bi4, kas) senc(hna, xi2, kas) senc(hya, ym, a, bi4, kas) senc(hya, kabi2, kas) senc(hyb, ym, a, bi4, kbs) senc(hnb, zabi2, kbs) senc(hnb, zm, a, bi4, kbs) senc(hyb, kabi2, kbs) Les termes ne sont unifiables que s’ils sont chiffrés par la même clé (kas ou kbs). Une fois la clé fixée, la taille des tuples empêche toutes les unifications, hormis les unifications honnêtes, et donc les protocoles POR0 et POR00 sont conformes à (T0, δ). Comme (T00, δ0) ne diffère de (T0, δ) que sur z1senc et zsenc2 , qui n’apparaissent pas dans les sous-termes chiffrés, les protocoles POR0 et POR00 sont également conformes à (T00, δ0). Pour chacun de ces systèmes de types, l’exemple 2.2 donnait un témoin bien typé.

Au contraire, ces deux protocoles ne sont pas conformes à l’autre système de types envisagé dans l’exemple 2.2, où x et kab ne sont pas de même type, car alors les sous-termes chiffrés unifiables senc(hna, xi2, kas) et senc(hya, kabi2, kas) n’ont pas le même type. Rappelons qu’il n’existe aucun témoin bien typé pour ce système de types.

L’objet de ce chapitre est de démontrer que l’exemple 2.4 se généralise, c’est-à-dire que pour tous protocoles et tout système de types, lorsque les protocoles sont conformes au système de types, il suffit d’explorer les traces bien typées pour démontrer l’équivalence des protocoles.

2.2.3 Énoncé des résultats du chapitre

Dans ce chapitre, nous démontrons que, pour l’accessibilité et l’équivalence, s’il existe une trace tr, il existe une trace tr0bien typée telle que tr0 et tr partagent la même séquence d’émissions (out) et de réceptions (in) de messages sur les mêmes canaux. En d’autres termes, tr et tr0 ont le même squelette tr.

Pour chaque Σ0-trace tr, la séquence tr est définie récursivement par : — Si tr est vide, alorstr = tr.

— Si tr = tr0.phase i pour un certain entier i, alors tr = tr0.phase i. — Si tr = tr0.out(c, w) pour un certain w ∈ W, alors tr = tr0.out(c, _). — Si tr = tr0.in(c, R) pour une certaine Σ0-recette R alors tr = tr0.in(c, _).

Le résultat constitue une étape intermédiaire pour le théorème principal, qui porte sur l’équi-valence, mais possède un intérêt indépendant.

Théorème 2.1. Soit KP une Σ0-configuration conforme à un système de types (T0, δ0). Si KP =tr=⇒ (P; φ; σ; i) par rapport à Σ0 alors il existe une exécution bien typée KP tr

0

==⇒ (P; φ0; σ0; i) par rapport à Σ+0 telle que tr0= tr.

Réciproquement, si KP tr

0

==⇒ (P; φ0; σ0; i) est une exécution bien typée par rapport à Σ+0, alors il existe une exécution KP

tr

==⇒ (P; φ; σ; i) par rapport à Σ0 telle que tr = tr0.

Ce résultat est suffisant pour modéliser certaines propriétés d’accessibilité, comme le secret. Par exemple, toute trace de P |in(c, s) contenant une réception sur le canal c est un témoin d’attaque sur le secret de s ∈ N , pourvu que c n’apparaisse pas dans le processus P . La démonstration de ce théorème sera exposée dans la section 2.4. Les constantes de Σfresh permettent de remplacer des termes composés d’une exécution arbitraire dans une exécution bien typée : le terme t sera remplacé par une constante c ∈ Σfresh du bon type.

Nous en arrivons au théorème principal de cette section.

Théorème 2.2. Soient KP une Σ0-configuration conforme à (T0, δ0) et KQ une Σ0-configuration déterministe. On a KP 6vatKQ par rapport à Σ0 si, et seulement si, il existe un témoin bien typé (tr, φ) ∈ traceΣ+

0(KP) de cette non-inclusion.

Seule la configuration KP doit être conforme au système de types, puisque la trace n’est bien typée que par rapport à KP. De plus, comme l’inclusion de trace stipule que le protocole KQ doit pouvoir imiter toute exécution de KP, l’attaquant peut choisir l’exécution exacte de KP qui doit être imitée, donc le déterminisme n’est utile que pour KQ. Ce théorème sera démontré précisément dans la section 2.5.