Я пытаюсь проверить файл MS Word * .docx с цифровой подписью. Чтобы выполнить проверку, мне нужно вычислить дайджест узлов, на которые есть ссылка, и проверить, совпадает ли он с указанным в подписи (sig1.xml). Я не могу найти информацию о том, как реализовать преобразование отношений, чтобы вычислить этот дайджест.
часть XML подписи (sig1.xml) выглядит следующим образом:
<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 сам файл:
<?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>
Поэтому мне нужно вычислить SHA1 для /_rels/.rels, но перед вычислением я должен применить преобразование отношений и C14N.
Когда я вычисляю дайджест узла без преобразования отношения (например, этого узла :)
<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>
все в порядке, просто выполнение SHA1 указанного URI (в данном случае /word/document.xml) дает мне такой же хеш, как и тот, что указан в узле подписи. Но когда дело доходит до узла с преобразованием отношений - вычисления никогда не дают того же значения, что указано в подписи.
Мой вопрос в целом: где найти информацию об этой трансформации отношений и как ее реализовать?
Спасибо,
Георгий