auths_verifier/tlog/
proof.rs1use serde::{Deserialize, Serialize};
4
5use super::error::TransparencyError;
6use super::types::MerkleHash;
7
8#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
25#[allow(missing_docs)]
26pub struct InclusionProof {
27 pub index: u64,
28 pub size: u64,
29 pub root: MerkleHash,
30 pub hashes: Vec<MerkleHash>,
31}
32
33impl InclusionProof {
34 pub fn verify(&self, leaf_hash: &MerkleHash) -> Result<(), TransparencyError> {
36 super::merkle::verify_inclusion(leaf_hash, self.index, self.size, &self.hashes, &self.root)
37 }
38}
39
40#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
57#[allow(missing_docs)]
58pub struct ConsistencyProof {
59 pub old_size: u64,
60 pub new_size: u64,
61 pub old_root: MerkleHash,
62 pub new_root: MerkleHash,
63 pub hashes: Vec<MerkleHash>,
64}
65
66impl ConsistencyProof {
67 pub fn verify(&self) -> Result<(), TransparencyError> {
69 super::merkle::verify_consistency(
70 self.old_size,
71 self.new_size,
72 &self.hashes,
73 &self.old_root,
74 &self.new_root,
75 )
76 }
77}
78
79#[cfg(test)]
80mod tests {
81 use super::*;
82 use crate::tlog::merkle::{hash_children, hash_leaf};
83
84 #[test]
85 fn inclusion_proof_verify() {
86 let a = hash_leaf(b"a");
87 let b = hash_leaf(b"b");
88 let root = hash_children(&a, &b);
89
90 let proof = InclusionProof {
91 index: 0,
92 size: 2,
93 root,
94 hashes: vec![b],
95 };
96 proof.verify(&a).unwrap();
97 }
98
99 #[test]
100 fn inclusion_proof_json_roundtrip() {
101 let proof = InclusionProof {
102 index: 3,
103 size: 8,
104 root: MerkleHash::from_bytes([0xaa; 32]),
105 hashes: vec![
106 MerkleHash::from_bytes([0xbb; 32]),
107 MerkleHash::from_bytes([0xcc; 32]),
108 ],
109 };
110 let json = serde_json::to_string(&proof).unwrap();
111 let back: InclusionProof = serde_json::from_str(&json).unwrap();
112 assert_eq!(proof, back);
113 }
114
115 #[test]
116 fn consistency_proof_json_roundtrip() {
117 let proof = ConsistencyProof {
118 old_size: 4,
119 new_size: 8,
120 old_root: MerkleHash::from_bytes([0x11; 32]),
121 new_root: MerkleHash::from_bytes([0x22; 32]),
122 hashes: vec![MerkleHash::from_bytes([0x33; 32])],
123 };
124 let json = serde_json::to_string(&proof).unwrap();
125 let back: ConsistencyProof = serde_json::from_str(&json).unwrap();
126 assert_eq!(proof, back);
127 }
128}