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