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