我正在研究XML Advanced Electronic Signatures。
要创建“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 The Reference Processing Model)中提取的部分内容:
URI解除引用或后续结果的数据类型 转换是八位字节流或XPath节点集。 (...)
在本说明书中,“同一文档”引用被定义为a 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}}的孩子)不应用摘要变换。这不是要解析的有效XML文件,没有单根。但可以在fakefile.xml上下文中使用“节点集”。
结果(1#,2#和3#)“八位字节流”?
由于: 除非URI-Reference是这样的'同一文档'引用,否则取消引用URI-Reference的结果必须是一个八位字节流。
或者它们是XML高级电子签名所需的“XML节点集”规范化吗?
由于: (...)特别是,URI标识的XML文档不会被签名应用程序解析,除非URI是同一文档引用,或者除非应用了需要XML解析的转换。
或者(除非应用了需要XML解析的转换)仅在Reference上下文中有效且结果是八位字节流?
欢迎收到文章。
答案 0 :(得分:2)
它们都是八位字节流,即二进制,但处理方式不同。
除了Reference Processing Model部分之外,还要考虑Transforms element部分以获得以下解释。
1 :因为http://fakefile.xml不是同一个文档参考,并且:
除非URI-Reference是这样的'同一文档'引用,否则 取消引用URI-Reference的结果必须是八位字节流
由于没有变换,这个八位字节流是摘要计算的输入
2 :如 1 http://fakefile.xml中所述不是同一文档引用,因此转换的输入是八位字节流。
自规范化转换works over XML nodes以来,必须将其输入转换为XML节点集,如Reference Processing Model部分所述:
如果数据对象是八位字节流并且下一个转换需要 一个节点集,签名应用程序必须尝试解析八位字节 通过[XML]格式良好的处理产生所需的节点集。
根据定义,规范化转换的输出是八位字节流。
3 :如 1 http://fakefile.xml中所述不是同一文档引用,因此转换的输入是八位字节流。
XPath转换适用于XML节点,这意味着必须将八位字节流转换为节点集(在XPath filtering部分中再次说明)。 XPath转换的输出也是一个节点集。
以下转换是规范化,需要将XML节点设置为输入。由于输入/输出是链接的(Transforms element部分),并且先前的输出已经是节点集,因此不需要转换。
最后,规范化转换的输出根据定义是八位字节流。
在您的示例中,变换的输出始终是八位字节流,但是,例如,如果您有单个XPath变换,则变换的结果是XML节点集。然后必须按照ArchiveTimeStamp属性定义的要求进行规范化。在这种情况下,您使用ArchiveTimeStamp属性本身定义的规范化算法,或者使用XML-DSIG缺省值(如果未指定)。
希望这有帮助。