Ceci est une traduction de la recommandation du W3C portant sur la canonisation XML exclusive.
Cependant ce n'est pas la version officielle en français de la recommandation. Seul le document original en anglais a valeur de norme. On peut l'obtenir à : http://www.w3.org/TR/xml-exc-c14n.
Des erreurs ont pu survenir malgré le soin apporté à ce travail.
Certains concepts sont difficiles à rendre en français ou peuvent nécessiter une explication,
aussi les expressions originales en anglais viennent parfois en renfort dans le texte sous cette forme :
ex. traduction [ndt. translation]
D'autre part, certains liens renvoient sur des définitions contenues dans les recommandations originales du W3C. Ces liens sont doublés vers leur version française et sont signalés ainsi : vf.
On peut trouver la liste des modifications qui seront apportées dans une prochaine version à http://www.w3.org/2002/07/xml-exc-c14n-errata.
Cette version française intègre toutes les corrections survenues depuis la parution de la recommandation en juillet 2002. Les liens vers l'errata traduit, à jour au 4 mars 2003, apparaissent dans le document sous cette forme : « errata-E01 ».
Cette traduction est disponible au format HTML sous forme d'archive compressée et, le cas échéant, dans d'autres formats à l'adresse http://www.yoyodesign.org/doc/w3c/w3c.html.
On peut consulter les traductions en français d'autres documents du W3C à
http://www.w3.org/Consortium/Translation/French
Copyright © 1994-2003 World Wide Web Consortium,
(Massachusetts Institute of Technology,
European Research Consortium for Informatics and Mathematics,
Keio University).
Tous droits réservés.
Consulter la notice de copyright pour les productions du W3C.
Veuillez consulter l'errata de ce document qui peut inclure des corrections normatives. Voir également les traductions.
Copyright © 2002 W3C® (MIT, INRIA, Keio), tous droits réservés. Les règles de responsabilité, de nom de marque, d'utilisation des documents et de licence des logiciels du W3C s'appliquent.
La recommandation XML canonique [XML-C14N] spécifie une sérialisation standard de XML qui, quand elle est appliquée à un sous-document, inclut le contexte de l'ancêtre du sous-document, comprenant toutes les déclarations d'espaces de nommage et les attributs dans l'espace de nommage « xml: ». Cependant, certaines applications requièrent une méthode excluant, dans la mesure du pratique, le contexte de l'ancêtre du sous-document canonisé. Par exemple, on pourrait demander que la signature numérique sur une charge utile XML (le sous-document) dans un message XML ne soient pas rompue quand ce sous-document est extrait de son message original et/ou inséré dans un contexte différent. Cette exigence est satisfaite par la canonisation XML exclusive.
Ce document est la recommandation de canonisation exclusive du W3C. Ce document, qui a été revu par les membres du W3C et les tiers intéressés, a été homologué par le Directeur comme recommandation du W3C. Ce document est stable et peut être utilisé comme matériel de référence ou cité comme référence normative par un autre document. Le rôle du W3C dans la production de la recommandation est d'attirer l'attention sur la spécification et d'en promouvoir le plus large déploiement. Ceci améliore les fonctionnalités et l'interopérabilité du Web.
Cette spécification a été produite par le groupe de travail XML Signature IETF/W3C (déclaration d'activité du W3C), qui pense que la spécification est suffisante pour la création d'implémentations interopérables indépendantes, comme démontré dans le rapport d'interopérabilité.
On peut trouver les divulgations de patentes concernant cette spécification sur la page de divulgation des patentes du groupe de travail, conformément à la politique du W3C, et sur la page des avis de propriété intellectuelle de l'IETF, conformément à la politique de l'IETF. Au jour de la publication, il n'existe aucune déclaration spécifique à ce document.
Veuillez signaler les erreurs dans ce document sur la liste diffusion w3c-ietf-xmldsig@w3.org (archive).
La liste des erreurs reconnues dans cette spécification est disponible à http://www.w3.org/2002/07/xml-exc-c14n-errata.
La version anglaise de cette spécification est la seule version normative. Les renseignements sur les traductions de ce document (le cas échéant) sont disponibles à http://www.w3.org/Signature/2002/02/xmldsig-translations.
On peut trouver une liste des rapports techniques courants du W3C à http://www.w3.org/TR/.
La recommandation XML [XML] spécifie la syntaxe d'une classe d'objets appelés documents XML. La recommandations des espaces de nommage dans XML [XML-NS] spécifie une syntaxe et une sémantique supplémentaires pour les documents XML. Il est normal que les documents et les sous-documents XML, qui sont équivalents pour les besoins de nombreuses applications, diffèrent dans leur représentation physique. Par exemple, ils peuvent différer dans la structure de leurs entités, l'ordre de leurs attributs et leurs codages de caractères. L'objectif de cette spécification consiste à établir une méthode pour la sérialisation de la représentation de l'ensemble de nœuds XPath d'un document XML, ou d'un sous-ensemble, de sorte que :
Une compréhension de la recommandation XML canonique [XML-C14N] est requise.
Les mots-clés « DOI(VEN)T », « NE DOI(VEN)T PAS », « REQUIS », « DEVRA », « NE DEVRA PAS », « DEVRAIT », « NE DEVRAIT PAS », « RECOMMANDÉ », « PEUT » et « OPTIONNEL », employés dans ce document, doivent s'interpréter comme cela est décrit dans le document RFC2119 [Keywords].
La recommandation XPath 1.0 [XPath] définit le terme ensemble de nœuds [ndt. node-set] et spécifie un modèle de données pour la représentation d'un document XML en entrée comme un rassemblement de nœuds de divers types (élément, attribut, espace de nommage, texte, commentaire, instruction de traitement et racine). Les nœuds sont inclus ou exclus d'un ensemble de nœuds en fonction de l'évaluation d'une expression. Dans cette spécification et dans [XML-C14N], on utilise un ensemble de nœuds pour indiquer directement si chacun des nœuds doit être restitué ou non dans la forme canonique (dans ce sens, on l'utilise comme un ensemble mathématique formel). Un nœud qui est exclus de cet ensemble n'est pas rendu dans la forme canonique qui est générée, même si son nœud parent est lui inclus dans l'ensemble de nœuds. Cependant, un nœud omis peut encore avoir une influence sur la restitution de ses descendants (par exemple, en affectant le contexte d'espace de nommage des descendants).
Un sous-ensemble de document est une portion de document XML, indiquée par un ensemble de nœuds XPath, qui n'inclut pas forcément tous les nœuds dans le document. Comme défini dans la spécification [XPath], chaque nœud (par exemple, un élément, un attribut ou un espace de nommage) possède exactement un seul parent, qui est soit un nœud élément, soit le nœud racine. Un nœud apex [ndt. apex node] est un nœud élément, dans un sous-ensemble de document, qui n'a aucun nœud élément ancêtre dans ce sous-ensemble de document. Un nœud orphelin [ndt. orphan node] est un nœud élément dont l'élément parent ne se trouve pas dans le sous-ensemble de document. Le parent en sortie [ndt. output parent], d'un nœud orphelin qui n'est pas un nœud apex, est l'élément ancêtre le plus proche du nœud orphelin qui est dans le sous-ensemble de document ; un nœud apex n'a aucun parent en sortie. Le parent en sortie d'un nœud non orphelin est le parent de ce nœud. Un ancêtre en sortie [ndt. output ancestor] est tout nœud élément ancêtre dans le sous-ensemble de document.
Par exemple, considérons un arbre de document avec trois générations en aval du nœud racine
A, une majuscule dénotant un nœud qui se trouve dans le sous-ensemble de document (A,E,G).
Représentation imagée :

Représentation textuelle :
A-+-b
`-c-+-d
`-E-+-f
`-G
Les caractéristiques suivantes s'appliquent :
A est un nœud apex, parent en sortie de E et ancêtre en sortie de (E,G) ;E est un nœud orphelin et le parent en sortie de G.Un élément E, dans un sous-ensemble de document, utilise visiblement une déclaration d'espace de nommage, i.e. un préfixe d'espace de nommage P et la valeur rattachée V, si E, ou un nœud attribut dans le sous-ensemble de document dont le parent est E, a un nom qualifié dans lequel P est le préfixe d'espace de nommage. Une définition similaire s'applique à un élément E, dans un sous-ensemble de document, qui utilise visiblement la déclaration d'espace de nommage par défaut, ce qui survient quand E n'a aucun préfixe d'espace de nommage.
L'axe des espaces de nommage d'un élément contient les nœuds de toutes les déclarations d'espaces de nommage, non par défaut, qui ont été faites dans l'élément ainsi que ceux des déclarations d'espaces de nommage, non par défaut, héritées des ancêtre de l'élément en question. L'axe des espaces de nommage contient aussi un nœud qui représente l'espace de nommage par défaut, si ce n'est pas la chaîne vide, que l'espace de nommage par défaut ait été déclaré dans l'élément ou bien par un ancêtre de celui-ci. Tout sous-ensemble des nœuds dans un axe des espaces de nommage peut être inclus dans un sous-ensemble de document.
La méthode de canonisation, décrite dans cette spécification, reçoit un paramètre InclusiveNamespaces PrefixList qui liste les préfixes d'espaces de nommage gérés de la manière décrite par la recommandation XML canonique [XML-C14N].
La forme canonique exclusive d'un sous-ensemble de document est une représentation de l'ensemble de nœuds XPath, en tant que séquence d'octets, produite par la méthode décrite dans cette spécification. C'est celle qui est définie dans la recommandation XML canonique [XML-C14N], à l'exception des changements qui se résument comme suit :
xml:lang et xml:space ne sont pas importés
dans les nœuds orphelins du sous-ensemble de document ;Le terme « XML canonique exclusif » se rapporte à un code XML qui est dans la forme canonique exclusive. Le terme « méthode de canonisation XML exclusive » correspond à l'algorithme, défini par cette spécification, qui génère la forme canonique exclusive d'un sous-ensemble de document XML donné. Le terme « canonisation XML exclusive » se rapporte à l'opération qui consiste à appliquer la méthode de canonisation XML exclusive sur un sous-ensemble de document XML.
Les applications de canonisation XML exclusive sont très semblables à celles de XML canonique [XML-C14N]. Cependant, la canonisation exclusive, ou les moyens équivalents pour exclure la plupart du contexte XML, est nécessaire aux applications de signature, pour lesquelles le contexte XML du XML signé changera. Ce genre de changement est typique de l'application de nombreux protocoles.
Remarquez, dans le cas de l'élément SignedInfo de [XML-DSig], que
la spécification d'une méthode de canonisation adéquate est la seule technique disponible pour protéger
la signature des changements insignifiants dans la forme physique et des changements dans le contexte XML.
La canonisation XML exclusive revêt les limitations du XML canonique [XML-C14N], plus deux limitations supplémentaires, comme suit :
xml:lang, xml:space et xml:base, qui apparaissent dans les nœuds ancêtres.
Pour éviter les problèmes liés à la non importation de ces attributs dans un sous-ensemble de document enveloppé,
il faut soit les donner explicitement dans les nœuds apex du sous-ensemble de
document XML en cours de canonisation, soit toujours les déclarer avec une valeur équivalente dans tous les contextes
dans lesquels le sous-ensemble de document XML sera interprété ;<number
xsi:type="xsd:decimal">10.09</number>.
Pour éviter les problèmes liés à de telles déclarations d'espaces de nommage :
Dans certains cas, notamment pour du XML signé dans les applications de protocoles, il est nécessaire de canoniser un sous-docuemnt, de telle sorte qu'il soit substantiellement indépendant de son contexte XML. C'est parce qu'il est courant, dans les applications de protocoles, d'envelopper le code XML dans diverses couches d'éléments de message ou de transport, d'ôter ces enveloppes et de contruire de nouveaux messages de protocoles, dont certaines parties ont été extraites des divers messages reçus précédemment. Si les morceaux de XML en question sont signés, ils ont besoin d'être canonisés, de telle sorte que ces opérations ne rompent pas la signature et que celle-ci présente encore autant de sécurité que ce qui peut pratiquement obtenu.
En exemple simple du type de problème que peuvent introduire les changements de contexte XML pour les signatures, considérons le document suivant :
<n1:elem1 xmlns:n1="http://b.exemple">
contenu
</n1:elem1>
ceci est ensuite enveloppé dans un autre document :
<n0:pdu xmlns:n0="http://a.exemple">
<n1:elem1 xmlns:n1="http://b.exemple">
contenu
</n1:elem1>
</n0:pdu>
Le premier document ci-dessus est en forme canonique. Mais supposons que ce document soit enveloppé comme dans le second.
Le sous-document, avec l'élément elem1 comme nœud apex, peut s'extraire dans ce cas à l'aide
d'une expression XPath, tel que :
(//. | //@* | //namespace::*)[ancestor-or-self::n1:elem1]
La conséquence de l'application de la canonisation XML canonique sur l'ensemble de nœuds XPath est la suivante (sans tenir compte des sauts de ligne pour présenter ce document) :
<n1:elem1 xmlns:n0="http://a.exemple"
xmlns:n1="http://b.exemple">
contenu
</n1:elem1>
Remarquez que l'espace de nommage n0 a été inclus par la canonisation XML canonique, parce qu'elle inclut
le contexte de l'espace de nommage. Un tel changement romprait la signature sur l'élément elem1
du premier document.
En exemple plus complet des changements dans la forme canonique qui peuvent survenir, quand le contexte d'enveloppement d'un sous-ensemble de document a changé, considérons le document suivant :
<n0:local xmlns:n0="truc:muche"
xmlns:n3="ftp://exemple.org">
<n1:elem2 xmlns:n1="http://exemple.net"
xml:lang="en">
<n3:machin xmlns:n3="ftp://exemple.org"/>
</n1:elem2>
</n0:local>
Et considérons le document suivant, produit en changeant l'enveloppe de l'élément elem2 :
<n2:pdu xmlns:n1="http://exemple.com"
xmlns:n2="http://truc.exemple"
xml:lang="fr"
xml:space="retain"> « errata-E01 »
<n1:elem2 xmlns:n1="http://exemple.net"
xml:lang="en">
<n3:machin xmlns:n3="ftp://exemple.org"/>
</n1:elem2>
</n2:pdu>
Supposons un ensemble de nœuds produit à partir de chacun des cas, en appliquant l'expression XPath suivante :
(//. | //@* | //namespace::*)[ancestor-or-self::n1:elem2]
L'application de la canonisation XML canonique à l'ensemble de nœuds produit à partir du premier document donne la sérialisation suivante (sans tenir compte des sauts de ligne pour présenter ce document) :
<n1:elem2 xmlns:n0="truc:muche"
xmlns:n1="http://exemple.net"
xmlns:n3="ftp://exemple.org"
xml:lang="en">
<n3:machin></n3:machin>
</n1:elem2>
Cependant, bien que l'élément elem2 soit représenté par la même séquence
d'octets dans les deux morceaux XML externes ci-dessus, la version XML canonique de l'élément elem2 du
second cas serait comme suit (sans tenir compte des sauts de ligne pour présenter ce document) :
<n1:elem2 xmlns:n1="http://exemple.net"
xmlns:n2="http://truc.example"
xml:lang="en"
xml:space="retain"> « errata-E01 »
<n3:machin xmlns:n3="ftp://exemple.org"></n3:machin>
</n1:elem2>
Remarquez que le changement dans le contexte a induit énormément de changements dans le sous-document quand celui-ci
est sérialisé par la canonisation inclusive XML canonique [XML-C14N]. Dans le premier exemple,
l'espace de nommage n0 avait été inclus à partir du contexte et la présence d'une
déclaration d'espace de nommage n3 identique dans le contexte avait remonté cette déclaration
à l'apex de la forme canonisée. Dans le second exemple, l'espace de nommage n0 a disparu, mais
l'espace de nommage n2 est apparu, l'espace de nommage n3 n'est plus remonté et une déclaration
xml:space est apparue, en conséquence du changement dans le contexte. Mais les changements de contexte n'ont pas tous d'effet.
Dans le second exemple, la présence aux nœuds ancêtres d'un attribut xml:lang et d'un préfixe
de déclaration d'espace de nommage n1 n'a aucun effet, en raison des déclarations existantes au nœud
elem2.
À l'inverse, en utilisant la canonisation XML exclusive, comme spécifiée ici, la forme physique de
l'élément elem2, tel qu'il serait extrait par l'expression XPath précédente, est comme suit
(sans tenir compte des sauts de ligne pour présenter le document) :
<n1:elem2 xmlns:n1="http://exemple.net"
xml:lang="en">
<n3:machin xmlns:n3="ftp://exemple.org"></n3:machin>
</n1:elem2>
Et ceci dans les deux cas.
Le modèle de données, le traitement, les paramètres en entrée et les données en sortie pour la canonisation XML exclusive sont les mêmes que pour la canonisation XML canonique [XML-C14N], avec les exceptions suivantes :
xml:lang et xml:space. Ceux-ci sont copiés dans les nœuds éléments, sauf si une
déclaration du même attribut se trouve déjà dans l'axe des attributs de l'élément (que
celui-ci soit inclus ou non dans le sous-ensemble du document). Cette recherche et cette copie sont omises dans la méthode
de canonisation XML exclusive ;xmlns="" sont changées comme suit. Lors de la canonisation de l'axe des espaces de nommage d'un
élément E, qui se trouve dans l'ensemble de nœuds, on produit xmlns="" en sortie si
et seulement si toutes les conditions suivantes sont réunies :
(Cette étape pour l'espace de nommage xmlns="" est nécessaire, parce que celui-ci n'est pas représenté
par un nœud espace de nommage dans le modèle de données XPath, mais comme l'absence d'un nœud espace de nommage ;
voir la section « 4.7 La propagation de l'espace de nommage par défaut dans les sous-ensemble du document » [XML-C14N].)
Ce qui suit représente une marche à suivre (non normative) pour l'implémentation de la méthode de canonisation XML exclusive dans un grand nombre de situations communes. Elle suppose un sous-ensemble bien-formé et que l'élément se trouve dans l'ensemble de nœuds, de même que la totalité de son axe des espaces de nommage ; si l'élément n'est pas dans l'ensemble de nœuds, son axe des espaces de nommage ne le sera pas non plus.
xml: de l'ancêtre dans les
nœuds éléments apex en sortie n'est pas réalisée) ;ns_rendered représente la copie d'un dictionnaire de préfixes et de leurs valeurs, pris sur le dessus de la
pile [ndt. stack] state, qui ont déjà été
restitués par un ancêtre en sortie de l'élément parent
du nœud espace de nommage ;ns_rendered.xmlns="", si et seulement si toutes les conditions suivantes sont réunies :ns_rendered.xmlns="") dans le dictionnaire
ns_rendered, en remplaçant les éventuelles entrées existantes. Pousser le dictionnaire
ns_rendered sur la pile state et effectuer la récursion ;state.La canonisation exclusive peut s'utiliser comme algorithme des éléments Transform ou
CanonicalizationMethod dans une signature numérique XML [XML-DSig] et le cryptage XML [XML-Enc].
Tout comme avec [XML-C14N], on peut utiliser le paramètre "#WithComments"
pour inclure la sérialisation des commentaires XML. Cet algorithme admet également le paramètre explicite optionnel
d'un élément InclusiveNamespaces vide avec l'attribut PrefixList. La valeur de cet attribut,
éventuellement nul, est une liste de préfixes d'espaces de nommage séparés par des blancs, dans laquelle
la valeur "#defaut" désigne l'espace de nommage par défaut, préfixes qui sont gérés selon
[XML-C14N]. La liste est dans le format NMTOKENS (liste dont les valeurs sont séparées par des blancs).
« errata-E02 »
Par exemple :
<ds:Transform
Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
<ec:InclusiveNamespaces PrefixList="dsig soap #default"
xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#"/>
</ds:Transform>
cela indique la transformation de canonisation exclusive et, autrement, que les espaces de nommage avec les préfixes "dsig" ou "soap" et les espaces de nommage par défaut devraient être traités selon [XML-C14N].
Définition de schéma :
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE schema
PUBLIC "-//W3C//DTD XMLSchema 200102//EN" "http://www.w3.org/2001/XMLSchema.dtd"
[
<!ATTLIST schema
xmlns:ec CDATA #FIXED 'http://www.w3.org/2001/10/xml-exc-c14n#'>
<!ENTITY ec 'http://www.w3.org/2001/10/xml-exc-c14n#'>
<!ENTITY % p ''>
<!ENTITY % s ''>
]>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#"
targetNamespace="http://www.w3.org/2001/10/xml-exc-c14n#"
version="0.1" elementFormDefault="qualified">
<element name="InclusiveNamespaces"
type="ec:InclusiveNamespaces"/>
<complexType name="InclusiveNamespaces">
<attribute name="PrefixList" type="NMTOKENS"/> « errata-E02 »
</complexType>
</schema>
DTD :
<!ELEMENT InclusiveNamespaces EMPTY >
<!ATTLIST InclusiveNamespaces
PrefixList NMTOKENS #REQUIRED > « errata-E02 »
Cette spécification est utilisée pour la sérialisation d'un ensemble de nœuds XPath, selon certains postulats donnés dans [XML-C14N] et la présente spécification. En voici trois exemples :
xml:lang, xml:space et xml:base) quand ceux-ci se trouvent dans le sous-ensemble
en cours de sérialisation ;Bien que de tels choix soient cohérents par rapport aux autres spécifications XML et satisfassent aux conditions d'application du groupe de travail, il est important qu'une application XML construise soigneusement ses transformations de manière à ce que le résultat soit significatif et non équivoque dans son contexte d'application. En complément de cette section, la section « Les limitations » de la présente spécification, la section « Les résolutions » de [XML-C14N] et la section « Les considérations sur la sécurité » de [XML-DSig] devraient être soigneusement étudiées.
L'objectif de cette spécification est de satisfaire les applications qui « requièrent une méthode excluant, dans la mesure du pratique, le contexte de l'ancêtre du sous-document canonisé ». Étant donné un fragment extrait de son instance source, cette spécification satisfait cette condition en excluant du fragment tout le contexte de ses ancêtres qui n'est pas utilisé. En conséquence, une signature [XML-DSig] sur ce fragment restera valide dans le contexte de sa source, quand il est retiré du contexte source et même dans le contexte d'une nouvelle cible. Cependant, cette spécification n'isole pas le fragment d'une interprétation confuse dans le contexte de la cible.
Par exemple, si l'élément <Truc/> est signé dans son instance source
<Muche/><Truc/></Muche> puis retiré et placé dans l'instance cible
<Machin xmlns="http://exemple.org/truc"/><Truc/></Machin>, la signature devraient toujours être valide,
mais elle ne le sera plus si <Truc/> est interprété comme appartenant à l'espace de nommage
http://exemple.org/truc : cela dépend de la manière dont les nœuds sont traités.
Cette spécification ne définit pas de mécanismes pour retirer, insérer et « réparer »
un ensemble de nœuds. (Pour un exemple de ce genre de spécification, voir le traitement qui est requis pour
« La création de l'ensemble d'information résultat » (section 4.5)
quand un [XInclude] est effectué). Les applications doivent plutôt spécifier
soigneusement le code XML (i.e., source, fragment et target) ou définir le traitement de l'ensemble de nœuds
(i.e., retrait, remplacement et insertion) en fonction des déclarations d'espaces de nommage par défaut
(par exemple, xmlns="") et des attributs XML (par exemple, xml:lang, xml:space et xml:base).
Considérons une application qui pourrait utiliser cette spécification ou bien [XML-C14N] pour sérialiser un seul nœud attribut. Une implémentation de l'une ou l'autre spécification n'émettra pas de déclaration d'espace de nommage pour ce nœud d'attribut seul. Par conséquent, une transformation « construite avec soin » devrait créer un ensemble de nœuds contenant l'attribut et la déclaration d'espace de nommage concernée pour la sérialisation.
Cet exemple est fourni pour attirer l'attention sur le fait que, alors qu'on avance au-delà du [XML] bien-formé et ensuite du XML bien-équilibré [XML-Fragment], il devient de plus en plus difficile d'aboutir à un résultat qui soit « significatif et non équivoque dans le contexte d'application ».
Les personnes suivantes ont fait des remarques pertinentes en retour qui participent à la qualité de cette spécification :