Алгоритм преобразования XML-отношений

Я пытаюсь проверить файл 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) дает мне такой же хеш, как и тот, что указан в узле подписи. Но когда дело доходит до узла с преобразованием отношений - вычисления никогда не дают того же значения, что указано в подписи.

Мой вопрос в целом: где найти информацию об этой трансформации отношений и как ее реализовать?

Спасибо,

Георгий


person Georgi Iliev    schedule 17.03.2016    source источник


Ответы (1)


Основной источник информации о преобразованиях и преобразованиях отношений в данном случае можно найти в документе ECMA «Форматы файлов Office Open XML - Open Packaging Conventions». Ссылка здесь.

Важный раздел - 13.2.4.24.

Преобразование отношений должно создать копию файла .rels, в данном случае «/_rels/.rels», и удалить все узлы Relationship, которые не совпадают с SourceId. Этот файл в конечном итоге хэшируется и создает дайджест.

Разработчик пакета должен удалить все элементы Relationship, которые не имеют ни значения Id, которое соответствует любому значению SourceId, ни значения Type, которое соответствует любому значению SourceType, среди значений SourceId и SourceType, указанных в определении преобразования.

В шаге 3 «Подготовка к канонизации» также говорится:

Разработчик пакета должен добавить атрибут TargetMode со своим значением по умолчанию, если этот необязательный атрибут отсутствует в элементе Relationship.

Поскольку мы создаем связь между файлами в одном пакете, у нас есть значение «Internal». Вам нужно добавить этот атрибут перед хешированием.

Итак, после преобразования и c14n у вас должно получиться:

<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>

ПРИМЕЧАНИЕ. Если вы используете систему unix, помните о переносах строк, OPC использует CRLF, а не LF.

person emplor    schedule 16.02.2017