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::{
15    FsVerityDescriptor, FsVerityDescriptorRaw, FsVerityHasher, FsVerityHasherOptions,
16};
17
18pub const SHA256_SALT_PADDING: u8 = 64;
19pub const SHA512_SALT_PADDING: u8 = 128;
20
21/// Compute a merkle tree from a `&[u8]` for a particular hasher.
22pub 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}