1mod builder;
8pub use crate::builder::MerkleTreeBuilder;
9
10mod tree;
11pub use crate::tree::MerkleTree;
12
13mod util;
14pub use crate::util::{FsVerityHasher, FsVerityHasherOptions};
15
16pub const SHA256_SALT_PADDING: u8 = 64;
17pub const SHA512_SALT_PADDING: u8 = 128;
18
19pub fn from_slice(slice: &[u8], hasher: FsVerityHasher) -> MerkleTree {
21 let mut builder = MerkleTreeBuilder::new(hasher);
22 builder.write(slice);
23 builder.finish()
24}
25
26#[cfg(test)]
27mod tests {
28 use super::*;
29
30 #[test]
31 fn test_from_slice_sha256() {
32 let file = vec![0xFF; 2105344];
33 let hasher = FsVerityHasher::Sha256(FsVerityHasherOptions::new(vec![0xFF; 8], 4096));
34 let mut builder = MerkleTreeBuilder::new(hasher.clone());
35 builder.write(&file[..]);
36 let expected = builder.finish();
37 let actual = from_slice(&file[..], hasher);
38 assert_eq!(expected.root(), actual.root());
39 }
40
41 #[test]
42 fn test_from_slice_sha512() {
43 let file = vec![0xFF; 2105344];
44 let hasher = FsVerityHasher::Sha512(FsVerityHasherOptions::new(vec![0xFF; 8], 4096));
45 let mut builder = MerkleTreeBuilder::new(hasher.clone());
46 builder.write(&file[..]);
47 let expected = builder.finish();
48 let actual = from_slice(&file[..], hasher);
49 assert_eq!(expected.root(), actual.root());
50 }
51}