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 | #define DM_IMA_TABLE_HASH_ALG "sha256" |
19 | |
20 | #define __dm_ima_stringify(s) #s |
21 | #define __dm_ima_str(s) __dm_ima_stringify(s) |
22 | |
23 | #define DM_IMA_VERSION_STR "dm_version=" \ |
24 | __dm_ima_str(DM_VERSION_MAJOR) "." \ |
25 | __dm_ima_str(DM_VERSION_MINOR) "." \ |
26 | __dm_ima_str(DM_VERSION_PATCHLEVEL) ";" |
27 | |
28 | #ifdef CONFIG_IMA |
29 | |
30 | struct dm_ima_device_table_metadata { |
31 | /* |
32 | * Contains data specific to the device which is common across |
33 | * all the targets in the table (e.g. name, uuid, major, minor, etc). |
34 | * The values are stored in comma separated list of key1=val1,key2=val2; |
35 | * pairs delimited by a semicolon at the end of the list. |
36 | */ |
37 | char *device_metadata; |
38 | unsigned int device_metadata_len; |
39 | unsigned int num_targets; |
40 | |
41 | /* |
42 | * Contains the sha256 hashes of the IMA measurements of the target |
43 | * attributes' key-value pairs from the active/inactive tables. |
44 | */ |
45 | char *hash; |
46 | unsigned int hash_len; |
47 | }; |
48 | |
49 | /* |
50 | * This structure contains device metadata, and table hash for |
51 | * active and inactive tables for ima measurements. |
52 | */ |
53 | struct dm_ima_measurements { |
54 | struct dm_ima_device_table_metadata active_table; |
55 | struct dm_ima_device_table_metadata inactive_table; |
56 | unsigned int dm_version_str_len; |
57 | }; |
58 | |
59 | void dm_ima_reset_data(struct mapped_device *md); |
60 | void dm_ima_measure_on_table_load(struct dm_table *table, unsigned int status_flags); |
61 | void dm_ima_measure_on_device_resume(struct mapped_device *md, bool swap); |
62 | void dm_ima_measure_on_device_remove(struct mapped_device *md, bool remove_all); |
63 | void dm_ima_measure_on_table_clear(struct mapped_device *md, bool new_map); |
64 | void dm_ima_measure_on_device_rename(struct mapped_device *md); |
65 | |
66 | #else |
67 | |
68 | static inline void dm_ima_reset_data(struct mapped_device *md) {} |
69 | static inline void dm_ima_measure_on_table_load(struct dm_table *table, unsigned int status_flags) {} |
70 | static inline void dm_ima_measure_on_device_resume(struct mapped_device *md, bool swap) {} |
71 | static inline void dm_ima_measure_on_device_remove(struct mapped_device *md, bool remove_all) {} |
72 | static inline void dm_ima_measure_on_table_clear(struct mapped_device *md, bool new_map) {} |
73 | static inline void dm_ima_measure_on_device_rename(struct mapped_device *md) {} |
74 | |
75 | #endif /* CONFIG_IMA */ |
76 | |
77 | #endif /* DM_IMA_H */ |
78 | |