我正在学习XML 高级电子签名。
要创建“ArchiveTimeStamp”(第 58 页),规范说:
根据 XMLDSIG 的引用处理模型处理检索到的 ds:Reference 元素。
如果结果是 XML 节点集,则对其进行规范化。(...)
参考处理模型结束于此:
<ds:Reference Id="myId" URI="http://fakefile.xml">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
</ds:Transforms>
<ds:DigestMethod/>
<ds:DigestValue/>
</ds:Reference>
该过程使用“URI=...”和“ds:Transforms”来检索数据。
以下是从( 4.3.3.2 参考处理模型)中摘录的部分内容:
URI 解引用或后续转换结果的数据类型是八位字节流或 XPath 节点集。(...)
在本规范中,'same-document' 引用被定义为一个 URI-Reference,它由一个井号 ('#') 和一个片段组成,或者由一个空 URI (...)
除非 URI-Reference 是这样的“相同文档”引用,否则取消引用 URI-Reference 的结果必须是八位字节流。特别是,由 URI 标识的 XML 文档不会被签名应用程序解析,除非 URI 是同一文档引用,或者除非应用了需要 XML 解析的转换。
以下示例演示了 URI 属性标识的内容以及取消引用的方式:
URI="http://example.com/bar.xml"
标识八位字节 (...)URI="http://example.com/bar.xml#chapter1"
标识外部 XML 资源 (...) 的 ID 属性值为“chapter1”的元素,以八位字节流的形式提供。(...)URI=""
标识节点集 (...)URI="#chapter1"
标识包含 (...) 的节点集
这个问题。
对于这些参考:
<ds:Reference Id="myId" URI="http://fakefile.xml">
...
(empty transform list)
...
</ds:Reference>
结果 1#: ( <file> ... childs ... <file>
)。不应用摘要转换
<ds:Reference Id="myId" URI="http://fakefile.xml">
...
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
...
</ds:Reference>
结果 2#:( xml with exc-c14n
)。不应用摘要转换
<ds:Reference Id="myId" URI="http://fakefile.xml">
...
<ds:Transform "fake_Xpath_transform_to_get_all_childs"/>
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
...
</ds:Reference>
结果 3#:(只有具有 exc-c14n 的孩子<child_1/>...<child_x/>
)没有应用摘要转换。这不是要解析的有效 XML 文件,没有单个根。但可以在 fakefile.xml 上下文中使用“节点集”。
结果(1#、2# 和 3#)是“八位字节流”吗?
因为: 除非 URI-Reference 是这样的“相同文档”引用,否则取消引用 URI-Reference 的结果必须是八位字节流。
或者它们是 XML 高级电子签名规范化所需的“XML 节点集”?
因为: (...) 特别是,除非 URI 是同文档引用或应用了需要 XML 解析的转换,否则签名应用程序不会解析由 URI 标识的 XML 文档。
或者(除非应用需要 XML 解析的转换)仅在参考上下文中有效并且结果是八位字节流?
欢迎文章。