Skip to main content

easyofd_core/signatures/
reference.rs

1//! 针对一个文件的摘要节点(Reference)。
2//!
3//! 对应 Java: org.ofdrw.core.signatures.range.Reference
4//!
5//! GB/T 33190 第 18.2.2 节 图 87 表 68。
6
7use std::fmt::Write;
8
9/// 针对一个文件的摘要节点。
10///
11/// 描述签名保护范围内某个文件的摘要计算值。
12#[derive(Debug, Clone)]
13pub struct Reference {
14    /// 指向包内文件的绝对路径(必选)。
15    pub file_ref: String,
16    /// 对包内文件进行摘要计算的杂凑值,Base64 编码(必选)。
17    pub check_value: String,
18}
19
20impl Reference {
21    /// 创建新的文件摘要节点。
22    #[must_use]
23    pub fn new(file_ref: impl Into<String>, check_value: impl Into<String>) -> Self {
24        Self {
25            file_ref: file_ref.into(),
26            check_value: check_value.into(),
27        }
28    }
29
30    /// 序列化为 XML 字符串。
31    #[must_use]
32    pub fn to_xml_string(&self) -> String {
33        let mut xml = String::from(r#"<ofd:Reference FileRef=""#);
34        let _ = write!(xml, "{}", self.file_ref);
35        xml.push_str(r#"">"#);
36        let _ = write!(xml, "<ofd:CheckValue>{}</ofd:CheckValue>", self.check_value);
37        xml.push_str("</ofd:Reference>");
38        xml
39    }
40}
41
42#[cfg(test)]
43mod tests {
44    use super::*;
45
46    #[test]
47    fn test_reference_new() {
48        let r = Reference::new("/Doc_0/Document.xml", "abc123base64");
49        assert_eq!(r.file_ref, "/Doc_0/Document.xml");
50        assert_eq!(r.check_value, "abc123base64");
51    }
52
53    #[test]
54    fn test_reference_xml() {
55        let r = Reference::new("/Doc_0/Pages/Page_0/Content.xml", "dGVzdA==");
56        let xml = r.to_xml_string();
57        assert!(xml.contains(r#"FileRef="/Doc_0/Pages/Page_0/Content.xml""#));
58        assert!(xml.contains("<ofd:CheckValue>dGVzdA==</ofd:CheckValue>"));
59        assert!(xml.contains("</ofd:Reference>"));
60    }
61
62    #[test]
63    fn test_reference_clone() {
64        let r = Reference::new("/Res/font.ttf", "hash123");
65        let r2 = r.clone();
66        assert_eq!(r2.file_ref, "/Res/font.ttf");
67        assert_eq!(r2.check_value, "hash123");
68    }
69}