fsverity_merkle/
lib.rs

1// Copyright 2023 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5//! `fsverity_merkle` contains types and methods for building and working with fsverity merkle trees.
6
7mod 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
19/// Compute a merkle tree from a `&[u8]` for a particular hasher.
20pub 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}