1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef __TSM_H
3 #define __TSM_H
4 
5 #include <linux/sizes.h>
6 #include <linux/types.h>
7 #include <linux/uuid.h>
8 
9 #define TSM_INBLOB_MAX 64
10 #define TSM_OUTBLOB_MAX SZ_32K
11 
12 /*
13  * Privilege level is a nested permission concept to allow confidential
14  * guests to partition address space, 4-levels are supported.
15  */
16 #define TSM_PRIVLEVEL_MAX 3
17 
18 /**
19  * struct tsm_desc - option descriptor for generating tsm report blobs
20  * @privlevel: optional privilege level to associate with @outblob
21  * @inblob_len: sizeof @inblob
22  * @inblob: arbitrary input data
23  * @service_provider: optional name of where to obtain the tsm report blob
24  * @service_guid: optional service-provider service guid to attest
25  * @service_manifest_version: optional service-provider service manifest version requested
26  */
27 struct tsm_desc {
28 	unsigned int privlevel;
29 	size_t inblob_len;
30 	u8 inblob[TSM_INBLOB_MAX];
31 	char *service_provider;
32 	guid_t service_guid;
33 	unsigned int service_manifest_version;
34 };
35 
36 /**
37  * struct tsm_report - track state of report generation relative to options
38  * @desc: input parameters to @report_new()
39  * @outblob_len: sizeof(@outblob)
40  * @outblob: generated evidence to provider to the attestation agent
41  * @auxblob_len: sizeof(@auxblob)
42  * @auxblob: (optional) auxiliary data to the report (e.g. certificate data)
43  * @manifestblob_len: sizeof(@manifestblob)
44  * @manifestblob: (optional) manifest data associated with the report
45  */
46 struct tsm_report {
47 	struct tsm_desc desc;
48 	size_t outblob_len;
49 	u8 *outblob;
50 	size_t auxblob_len;
51 	u8 *auxblob;
52 	size_t manifestblob_len;
53 	u8 *manifestblob;
54 };
55 
56 /**
57  * enum tsm_attr_index - index used to reference report attributes
58  * @TSM_REPORT_GENERATION: index of the report generation number attribute
59  * @TSM_REPORT_PROVIDER: index of the provider name attribute
60  * @TSM_REPORT_PRIVLEVEL: index of the desired privilege level attribute
61  * @TSM_REPORT_PRIVLEVEL_FLOOR: index of the minimum allowed privileg level attribute
62  * @TSM_REPORT_SERVICE_PROVIDER: index of the service provider identifier attribute
63  * @TSM_REPORT_SERVICE_GUID: index of the service GUID attribute
64  * @TSM_REPORT_SERVICE_MANIFEST_VER: index of the service manifest version attribute
65  */
66 enum tsm_attr_index {
67 	TSM_REPORT_GENERATION,
68 	TSM_REPORT_PROVIDER,
69 	TSM_REPORT_PRIVLEVEL,
70 	TSM_REPORT_PRIVLEVEL_FLOOR,
71 	TSM_REPORT_SERVICE_PROVIDER,
72 	TSM_REPORT_SERVICE_GUID,
73 	TSM_REPORT_SERVICE_MANIFEST_VER,
74 };
75 
76 /**
77  * enum tsm_bin_attr_index - index used to reference binary report attributes
78  * @TSM_REPORT_INBLOB: index of the binary report input attribute
79  * @TSM_REPORT_OUTBLOB: index of the binary report output attribute
80  * @TSM_REPORT_AUXBLOB: index of the binary auxiliary data attribute
81  * @TSM_REPORT_MANIFESTBLOB: index of the binary manifest data attribute
82  */
83 enum tsm_bin_attr_index {
84 	TSM_REPORT_INBLOB,
85 	TSM_REPORT_OUTBLOB,
86 	TSM_REPORT_AUXBLOB,
87 	TSM_REPORT_MANIFESTBLOB,
88 };
89 
90 /**
91  * struct tsm_ops - attributes and operations for tsm instances
92  * @name: tsm id reflected in /sys/kernel/config/tsm/report/$report/provider
93  * @privlevel_floor: convey base privlevel for nested scenarios
94  * @report_new: Populate @report with the report blob and auxblob
95  * (optional), return 0 on successful population, or -errno otherwise
96  * @report_attr_visible: show or hide a report attribute entry
97  * @report_bin_attr_visible: show or hide a report binary attribute entry
98  *
99  * Implementation specific ops, only one is expected to be registered at
100  * a time i.e. only one of "sev-guest", "tdx-guest", etc.
101  */
102 struct tsm_ops {
103 	const char *name;
104 	unsigned int privlevel_floor;
105 	int (*report_new)(struct tsm_report *report, void *data);
106 	bool (*report_attr_visible)(int n);
107 	bool (*report_bin_attr_visible)(int n);
108 };
109 
110 int tsm_register(const struct tsm_ops *ops, void *priv);
111 int tsm_unregister(const struct tsm_ops *ops);
112 #endif /* __TSM_H */
113