1 #ifndef __VTPMMGR_DISK_FORMAT_H
2 #define __VTPMMGR_DISK_FORMAT_H
3 
4 static const uint8_t TPM_MGR_MAGIC[12] = {
5 	'T','P','M',0xfe,'M','G','R',0xdd,'D','O','M',0x00
6 };
7 
8 /**
9  * Sector 0 on disk: stored in plaintext
10  */
11 struct disk_header {
12 	char magic[12];
13 #define TPM_MGR_VERSION 0
14 	be32_t version;
15 };
16 
17 /**
18  * Raw contents of disk sectors that need both encryption and authentication
19  */
20 struct disk_crypt_sector_plain {
21 	struct mac128 mac;
22 	union {
23 		struct {
24 			uint8_t iv[16];
25 			char data[4096-32];
26 		};
27 		uint8_t iv_data[4096-16];
28 	};
29 };
30 
31 /**
32  * Contents of the sealed blob in the root seal list
33  */
34 struct disk_root_sealed_data {
35 #define DISK_ROOT_BOUND_MAGIC "Root"
36 	char magic[4];
37 	uuid_t tpm_manager_uuid;
38 
39 	be32_t nvram_slot;
40 	struct tpm_authdata nvram_auth;
41 	be32_t counter_index;
42 	struct tpm_authdata counter_auth;
43 
44 	/* encrypted (AES-ECB) with key from NVRAM */
45 	struct key128 tm_key;
46 };
47 
48 /**
49  * Contents of the sealed blob in a group's seal list
50  */
51 struct disk_group_sealed_data {
52 #define DISK_GROUP_BOUND_MAGIC "TGrp"
53 	char magic[4];
54 	uuid_t tpm_manager_uuid;
55 	struct tpm_authdata aik_authdata;
56 
57 	struct key128 group_key;
58 	struct key128 rollback_mac_key;
59 };
60 
61 /**
62  * Contents of the seal_list_N sectors on disk (plaintext, linked list)
63  *
64  * The hdr field is unused except in sector 0
65  */
66 struct disk_seal_list {
67 	struct disk_header hdr;
68 	be32_t length;
69 	sector_t next;
70 #define SEALS_PER_ROOT_SEAL_LIST 13
71 	struct disk_seal_entry entry[SEALS_PER_ROOT_SEAL_LIST];
72 };
73 
74 /**
75  * TODO - overflow for struct disk_group_boot_config_list
76  */
77 struct disk_group_seal_list {
78 	sector_t next;
79 #define SEALS_PER_GROUP_SEAL_LIST 13
80 	struct disk_seal_entry entry[SEALS_PER_GROUP_SEAL_LIST];
81 };
82 
83 /**
84  * Rollback detection MAC entry
85  */
86 struct disk_rb_mac_entry {
87 	be32_t id;
88 	struct mac128 mac;
89 };
90 
91 #define NR_ENTRIES_PER_ROOT 16
92 /**
93  * The area of the root sector protected by rollback MACs
94  */
95 struct disk_root_sector_mac1_area {
96 	be64_t sequence;
97 	be32_t tpm_counter_value;
98 
99 	be32_t nr_groups;
100 	struct hash256 group_hash[NR_ENTRIES_PER_ROOT];
101 };
102 
103 /**
104  * Decrypted contents of the root sector (sector 1 and 2) on disk
105  */
106 struct disk_root_sector {
107 	struct disk_root_sector_mac1_area v;
108 
109 	sector_t group_loc[NR_ENTRIES_PER_ROOT];
110 
111 	uint8_t pad[8];
112 
113 	/* Rollback detection MACs */
114 	be32_t nr_rb_macs;
115 	sector_t rb_next_loc;
116 	/* used if rb_macs overflows */
117 	struct hash256 rb_next_hash;
118 
119 #define NR_RB_MACS_PER_ROOT 128
120 	struct disk_rb_mac_entry rb_macs[NR_RB_MACS_PER_ROOT];
121 };
122 
123 /**
124  * Hash tree for list expansion. Used for the list of groups in the root and for
125  * the list of vTPMs in a group.
126  */
127 struct disk_itree_sector {
128 #define NR_ENTRIES_PER_ITREE 112
129 	sector_t location[NR_ENTRIES_PER_ITREE];
130 	/* SECTOR-HASH { */
131 	struct hash256 hash[NR_ENTRIES_PER_ITREE];
132 	/* SECTOR-HASH } */
133 };
134 
135 #define NR_ENTRIES_PER_GROUP_BASE 16
136 /**
137  * Data that must remain constant if a group is not open
138  */
139 struct disk_group_sector_mac3_area {
140 	struct group_id_data id_data; /* MAC2 */
141 	struct group_details details;
142 	struct disk_group_boot_config_list boot_configs;
143 
144 	be32_t nr_vtpms;
145 	struct hash256 vtpm_hash[NR_ENTRIES_PER_GROUP_BASE];
146 };
147 
148 /**
149  * Group metadata sector
150  *
151  * Encrypted with TM_KEY - takes 16 bytes for IV; integrity from parent.
152  */
153 struct disk_group_sector {
154 	/* SECTOR-HASH { */
155 	struct disk_group_sector_mac3_area v;
156 
157 	/* MAC(MAC3, group_key) */
158 	struct mac128 group_mac;
159 	/* SECTOR-HASH } */
160 
161 	sector_t vtpm_location[NR_ENTRIES_PER_GROUP_BASE];
162 	sector_t boot_configs_next;
163 };
164 
165 /**
166  * Data on a vTPM which is available when its group is not open
167  */
168 struct disk_vtpm_plain {
169 	uuid_t uuid;
170 	be32_t flags;
171 };
172 
173 /**
174  * Data on a vTPM which is only available when its group is open
175  */
176 struct disk_vtpm_secret {
177 	uint8_t data[64];
178 };
179 
180 /**
181  * Contents of a vTPM data disk sector
182  *
183  * Encrypted with TM_KEY - takes 16 bytes for IV
184  */
185 struct disk_vtpm_sector {
186 	/* SECTOR-HASH { */
187 	struct disk_vtpm_plain header[VTPMS_PER_SECTOR];
188 	struct mac128 iv;
189 	struct disk_vtpm_secret data[VTPMS_PER_SECTOR];
190 	/* SECTOR-HASH } */
191 };
192 
193 #endif
194