| /* 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 */ |