xref: /OK3568_Linux_fs/kernel/fs/incfs/integrity.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Copyright 2019 Google LLC
4*4882a593Smuzhiyun  */
5*4882a593Smuzhiyun #ifndef _INCFS_INTEGRITY_H
6*4882a593Smuzhiyun #define _INCFS_INTEGRITY_H
7*4882a593Smuzhiyun #include <linux/types.h>
8*4882a593Smuzhiyun #include <linux/kernel.h>
9*4882a593Smuzhiyun #include <crypto/hash.h>
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #include <uapi/linux/incrementalfs.h>
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun #include "internal.h"
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun #define INCFS_MAX_MTREE_LEVELS 8
16*4882a593Smuzhiyun #define INCFS_MAX_HASH_AREA_SIZE (1280 * 1024 * 1024)
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun struct incfs_hash_alg {
19*4882a593Smuzhiyun 	const char *name;
20*4882a593Smuzhiyun 	int digest_size;
21*4882a593Smuzhiyun 	enum incfs_hash_tree_algorithm id;
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun 	struct crypto_shash *shash;
24*4882a593Smuzhiyun };
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun /* Merkle tree structure. */
27*4882a593Smuzhiyun struct mtree {
28*4882a593Smuzhiyun 	struct incfs_hash_alg *alg;
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun 	u8 root_hash[INCFS_MAX_HASH_SIZE];
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun 	/* Offset of each hash level in the hash area. */
33*4882a593Smuzhiyun 	u32 hash_level_suboffset[INCFS_MAX_MTREE_LEVELS];
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun 	u32 hash_tree_area_size;
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun 	/* Number of levels in hash_level_suboffset */
38*4882a593Smuzhiyun 	int depth;
39*4882a593Smuzhiyun };
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun struct incfs_hash_alg *incfs_get_hash_alg(enum incfs_hash_tree_algorithm id);
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun struct mtree *incfs_alloc_mtree(struct mem_range signature,
44*4882a593Smuzhiyun 				int data_block_count);
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun void incfs_free_mtree(struct mtree *tree);
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun size_t incfs_get_mtree_depth(enum incfs_hash_tree_algorithm alg, loff_t size);
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun size_t incfs_get_mtree_hash_count(enum incfs_hash_tree_algorithm alg,
51*4882a593Smuzhiyun 					loff_t size);
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun int incfs_calc_digest(struct incfs_hash_alg *alg, struct mem_range data,
54*4882a593Smuzhiyun 			struct mem_range digest);
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun #endif /* _INCFS_INTEGRITY_H */
57