xref: /linux/drivers/md/dm-ima.h (revision 5ea5880764cbb164afb17a62e76ca75dc371409d)
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * Copyright (C) 2021 Microsoft Corporation
4  *
5  * Author: Tushar Sugandhi <tusharsu@linux.microsoft.com>
6  *
7  * Header file for device mapper IMA measurements.
8  */
9 
10 #ifndef DM_IMA_H
11 #define DM_IMA_H
12 
13 #define DM_IMA_MEASUREMENT_BUF_LEN	4096
14 #define DM_IMA_DEVICE_BUF_LEN		1024
15 #define DM_IMA_TARGET_METADATA_BUF_LEN	128
16 #define DM_IMA_TARGET_DATA_BUF_LEN	2048
17 #define DM_IMA_DEVICE_CAPACITY_BUF_LEN	128
18 
19 #define __dm_ima_stringify(s) #s
20 #define __dm_ima_str(s) __dm_ima_stringify(s)
21 
22 #define DM_IMA_VERSION_STR "dm_version="	\
23 	__dm_ima_str(DM_VERSION_MAJOR) "."	\
24 	__dm_ima_str(DM_VERSION_MINOR) "."	\
25 	__dm_ima_str(DM_VERSION_PATCHLEVEL) ";"
26 
27 #ifdef CONFIG_IMA
28 
29 struct dm_ima_device_table_metadata {
30 	/*
31 	 * Contains data specific to the device which is common across
32 	 * all the targets in the table (e.g. name, uuid, major, minor, etc).
33 	 * The values are stored in comma separated list of key1=val1,key2=val2;
34 	 * pairs delimited by a semicolon at the end of the list.
35 	 */
36 	char *device_metadata;
37 	unsigned int device_metadata_len;
38 	unsigned int num_targets;
39 
40 	/*
41 	 * Contains the sha256 hashes of the IMA measurements of the target
42 	 * attributes' key-value pairs from the active/inactive tables.
43 	 */
44 	char *hash;
45 	unsigned int hash_len;
46 };
47 
48 /*
49  * This structure contains device metadata, and table hash for
50  * active and inactive tables for ima measurements.
51  */
52 struct dm_ima_measurements {
53 	struct dm_ima_device_table_metadata active_table;
54 	struct dm_ima_device_table_metadata inactive_table;
55 	unsigned int dm_version_str_len;
56 };
57 
58 void dm_ima_reset_data(struct mapped_device *md);
59 void dm_ima_measure_on_table_load(struct dm_table *table, unsigned int status_flags);
60 void dm_ima_measure_on_device_resume(struct mapped_device *md, bool swap);
61 void dm_ima_measure_on_device_remove(struct mapped_device *md, bool remove_all);
62 void dm_ima_measure_on_table_clear(struct mapped_device *md, bool new_map);
63 void dm_ima_measure_on_device_rename(struct mapped_device *md);
64 
65 #else
66 
67 static inline void dm_ima_reset_data(struct mapped_device *md) {}
68 static inline void dm_ima_measure_on_table_load(struct dm_table *table, unsigned int status_flags) {}
69 static inline void dm_ima_measure_on_device_resume(struct mapped_device *md, bool swap) {}
70 static inline void dm_ima_measure_on_device_remove(struct mapped_device *md, bool remove_all) {}
71 static inline void dm_ima_measure_on_table_clear(struct mapped_device *md, bool new_map) {}
72 static inline void dm_ima_measure_on_device_rename(struct mapped_device *md) {}
73 
74 #endif /* CONFIG_IMA */
75 
76 #endif /* DM_IMA_H */
77