2016-03-17 5 views
2

J'essaie de valider un fichier MS Word * .docx avec signature numérique. Pour faire la validation, je dois calculer le résumé des noeuds référencés et vérifier s'il est identique à celui donné dans la signature (sig1.xml). Je ne peux pas trouver d'informations sur la façon dont ti implémente la transformation de relation afin de calculer ce résumé.Algorithme de transformation de relation XML

la partie XML de signature (sig1.xml) est la suivante:

<Object Id="idPackageObject" xmlns:mdssi="http://schemas.openxmlformats.org/package/2006/digital-signature"> 
<Manifest><Reference URI="/_rels/.rels?ContentType=application/vnd.openxmlformats-package.relationships+xml"> 
<Transforms><Transform Algorithm="http://schemas.openxmlformats.org/package/2006/RelationshipTransform">  
<mdssi:RelationshipReference SourceId="rId1"/></Transform> 
<Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/></Transforms> 
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> 
<DigestValue>1vWU/YTF/7t6ZjnE44gAFTbZvvA=</DigestValue>....(next ref node ....).. 
<Reference URI="/word/document.xml?ContentType=application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml"> 
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> 
<DigestValue>s2yQEJrQSfC0YoRe1hvm+IGBpJQ=</DigestValue></Reference>.....More Reference Nodes..... 

/_rels/.rels lui-même fichier:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"> 
<Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties" Target="docProps/app.xml"/> 
<Relationship Id="rId2" Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" Target="docProps/core.xml"/> 
<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="word/document.xml"/> 
<Relationship Id="rId4" Type="http://schemas.openxmlformats.org/package/2006/relationships/digital-signature/origin" Target="_xmlsignatures/origin.sigs"/> 
</Relationships> 

donc je dois calculer SHA1/_rels/.rels, mais avant le calcul je dois appliquer la transformation de relation et C14N.

Quand je suis calcul condensé de noeud sans relation de transformation (de ce nœud, par exemple :)

<Reference URI="/word/document.xml?ContentType=application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml"> 
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> 
<DigestValue>s2yQEJrQSfC0YoRe1hvm+IGBpJQ=</DigestValue> 
</Reference> 

tout va bien, faire juste SHA1 URI (/word/document.xml mentionné dans ce cas) me donne le même hachage que celui donné dans le nœud de signature. Mais quand il s'agit de nœud avec transformation de relation - les calculs ne donne jamais la même valeur que celle indiquée dans la signature.

Ma question en général est où trouver des informations sur cette transformation de la relation et comment l'implémenter?

Merci,

Georgi

Répondre

4

La principale source d'information sur les transformations et la relation se transforme dans ce cas, se trouvent dans ECMA "Office Open Formats de fichiers XML - Ouvert Packaging Conventions" papier. Lien here.

La section d'importance est 13.2.4.24.

relation Transformer devrait créer une copie du fichier .rels, dans ce cas « /_rels/.rels » et de supprimer tous les Relationship nœuds qui ne correspondent pas avec SourceId. Ce fichier est ce qui est finalement haché et crée le condensé.

Le implémenteur package doit supprimer tous les éléments relationnels qui n'ont soit une valeur Id qui correspond à une valeur de SourceId ou une valeur de type qui correspond à une valeur SourceType, parmi les valeurs sourceid et SourceType spécifiées dans la transformer la définition.

Dans l'étape 3, « Prépare canonicalisation », il déclare aussi:

Le implémenteur paquet doit ajouter un TargetMode attribut avec sa valeur par défaut , si cette option attribut est absent de l'élément Relation

Parce que nous créons une relation entre les fichiers dans le même package, nous avons la valeur de "Interne". Vous devez ajouter cet attribut avant de le hacher.

Ainsi, après la transformation et C14N, vous devriez avoir:

<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId1" Target="word/document.xml" TargetMode="Internal" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument"></Relationship></Relationships> 

REMARQUE: Si vous utilisez un système unix, tenez compte des sauts de ligne, le CPVP utilise CRLF pas LF.