| /* SPDX-License-Identifier: GPL-2.0 */ | 
 | /* | 
 |  * Copyright 2019 Google LLC | 
 |  */ | 
 | #ifndef _INCFS_INTEGRITY_H | 
 | #define _INCFS_INTEGRITY_H | 
 | #include <linux/types.h> | 
 | #include <linux/kernel.h> | 
 | #include <crypto/hash.h> | 
 |  | 
 | #include <uapi/linux/incrementalfs.h> | 
 |  | 
 | #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 */ |