Kanonizace XML (C14N)

Kanonizace vytváří z XML definovanou bajtovou reprezentaci, například pro výpočet otisku v digitálním podpisu. Není to běžné odsazení ani obecné srovnání významu dokumentů.

Autor: Aktualizováno

Proč záleží na bajtech

Pořadí atributů a zápis prázdného elementu mohou být v XML různé. Kanonizační algoritmus určuje jejich jednotný zápis. Výstup používá UTF-8, nerozepisuje XML deklaraci a prázdné elementy zapisuje párem značek.

Původní zápis
<p b="2" a="1"/>
Kanonický zápis pro tento kořen
<p a="1" b="2"></p>

Co kanonizace nesjednotí

Whitespace v textu zůstává významový. Prefixy se obecně nepřejmenovávají a aplikací ekvivalentní čísla 1 a 1.0 zůstávají různá. Formatování před ověřením podpisu tak může změnit otisk.

Vyber správný algoritmus

C14N 1.0, C14N 1.1 a Exclusive C14N nejsou zaměnitelné. Exclusive C14N omezuje přenos namespace kontextu do podepisovaného fragmentu. Každý algoritmus má variantu s komentáři nebo bez nich; použij přesnou URI a parametry z podpisu.

Praktická kontrola

Pro jednoduchý lokální dokument lze porovnat xmllint --c14n11 soubor.xml s původním souborem. Neověří to XMLDSig: podpis také vybírá reference a transformace. Pro podpis použij knihovnu, která zpracuje celý řetězec, a po ověření čti přesně podepsaný uzel.

Reprodukovatelný C14N test

a.xml bez dalšího obsahu
<p b="2" a="1"/>
b.xml — stejná struktura
<p a="1" b="2"></p>
Oba výsledky mají v tomto případě stejné bajty
xmllint --c14n11 a.xml > a.c14n
xmllint --c14n11 b.xml > b.c14n
cmp a.c14n b.c14n

Výstup bez komentářů je <p a="1" b="2"></p>. Cmp má vrátit úspěch. Při vložení mezery jako obsahu p se kanonický výsledek změní: whitespace uvnitř elementu není jen volitelné odsazení. U celého dokumentu varianty libxml2 příkazu mohou zahrnovat komentáře, proto variantu a konkrétní chování příkazu ověř podle použití; neodvozuj algoritmus podpisu pouze od názvu přepínače.

Pro XMLDSig použij přesný algoritmus a transformace uvedené v SignedInfo a Reference. C14N 1.1 například řeší některé otázky xml:base a xml:id jinak než 1.0. Exclusive C14N má jiná pravidla přenosu namespace. Prostor s relativním URI může kanonizátor odmítnout; používej platné absolutní identifikátory. Specifikace: Canonical XML 1.1.

Komentáře: rozhoduje algoritmus, ne vzhled výstupu

„Kanonický XML soubor“ není jednoznačný údaj bez názvu algoritmu. Varianta s komentáři zahrne uzly komentářů do výsledných bajtů; varianta bez komentářů je vynechá. Stejné dva dokumenty proto mohou mít stejný otisk v jedné variantě a jiný ve druhé.

U podpisu nevybírej algoritmus odhadem podle pěkného výstupu. Ověř jeho URI a parametry uvedené v SignedInfo i u jednotlivých Reference. Formátovač mění odsazení a může přidat textové bílé znaky, které kanonizace neodstraní. Přesné varianty stanoví Canonical XML 1.1.