/* SPDX-License-Identifier: GPL-2.0 */ /* * Copyright 2019 Google LLC */ #ifndef _INCFS_INTEGRITY_H #define _INCFS_INTEGRITY_H #include #include #include #include #include "internal.h" #define INCFS_MAX_MTREE_LEVELS 8 #define INCFS_MAX_HASH_AREA_SIZE (1280 * 1024 * 1024) struct incfs_hash_alg { const char *name; int digest_size; enum incfs_hash_tree_algorithm id; struct crypto_shash *shash; }; /* Merkle tree structure. */ struct mtree { struct incfs_hash_alg *alg; u8 root_hash[INCFS_MAX_HASH_SIZE]; /* Offset of each hash level in the hash area. */ u32 hash_level_suboffset[INCFS_MAX_MTREE_LEVELS]; u32 hash_tree_area_size; /* Number of levels in hash_level_suboffset */ int depth; }; struct incfs_hash_alg *incfs_get_hash_alg(enum incfs_hash_tree_algorithm id); struct mtree *incfs_alloc_mtree(struct mem_range signature, int data_block_count); void incfs_free_mtree(struct mtree *tree); size_t incfs_get_mtree_depth(enum incfs_hash_tree_algorithm alg, loff_t size); size_t incfs_get_mtree_hash_count(enum incfs_hash_tree_algorithm alg, loff_t size); int incfs_calc_digest(struct incfs_hash_alg *alg, struct mem_range data, struct mem_range digest); #endif /* _INCFS_INTEGRITY_H */