efi_secret.c 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * efi_secret module
  4. *
  5. * Copyright (C) 2022 IBM Corporation
  6. * Author: Dov Murik <dovmurik@linux.ibm.com>
  7. */
  8. /**
  9. * DOC: efi_secret: Allow reading EFI confidential computing (coco) secret area
  10. * via securityfs interface.
  11. *
  12. * When the module is loaded (and securityfs is mounted, typically under
  13. * /sys/kernel/security), a "secrets/coco" directory is created in securityfs.
  14. * In it, a file is created for each secret entry. The name of each such file
  15. * is the GUID of the secret entry, and its content is the secret data.
  16. */
  17. #include <linux/platform_device.h>
  18. #include <linux/seq_file.h>
  19. #include <linux/fs.h>
  20. #include <linux/kernel.h>
  21. #include <linux/init.h>
  22. #include <linux/module.h>
  23. #include <linux/io.h>
  24. #include <linux/security.h>
  25. #include <linux/efi.h>
  26. #include <linux/cacheflush.h>
  27. #define EFI_SECRET_NUM_FILES 64
  28. struct efi_secret {
  29. struct dentry *secrets_dir;
  30. struct dentry *fs_dir;
  31. struct dentry *fs_files[EFI_SECRET_NUM_FILES];
  32. void __iomem *secret_data;
  33. u64 secret_data_len;
  34. };
  35. /*
  36. * Structure of the EFI secret area
  37. *
  38. * Offset Length
  39. * (bytes) (bytes) Usage
  40. * ------- ------- -----
  41. * 0 16 Secret table header GUID (must be 1e74f542-71dd-4d66-963e-ef4287ff173b)
  42. * 16 4 Length of bytes of the entire secret area
  43. *
  44. * 20 16 First secret entry's GUID
  45. * 36 4 First secret entry's length in bytes (= 16 + 4 + x)
  46. * 40 x First secret entry's data
  47. *
  48. * 40+x 16 Second secret entry's GUID
  49. * 56+x 4 Second secret entry's length in bytes (= 16 + 4 + y)
  50. * 60+x y Second secret entry's data
  51. *
  52. * (... and so on for additional entries)
  53. *
  54. * The GUID of each secret entry designates the usage of the secret data.
  55. */
  56. /**
  57. * struct secret_header - Header of entire secret area; this should be followed
  58. * by instances of struct secret_entry.
  59. * @guid: Must be EFI_SECRET_TABLE_HEADER_GUID
  60. * @len: Length in bytes of entire secret area, including header
  61. */
  62. struct secret_header {
  63. efi_guid_t guid;
  64. u32 len;
  65. } __attribute((packed));
  66. /**
  67. * struct secret_entry - Holds one secret entry
  68. * @guid: Secret-specific GUID (or NULL_GUID if this secret entry was deleted)
  69. * @len: Length of secret entry, including its guid and len fields
  70. * @data: The secret data (full of zeros if this secret entry was deleted)
  71. */
  72. struct secret_entry {
  73. efi_guid_t guid;
  74. u32 len;
  75. u8 data[];
  76. } __attribute((packed));
  77. static size_t secret_entry_data_len(struct secret_entry *e)
  78. {
  79. return e->len - sizeof(*e);
  80. }
  81. static struct efi_secret the_efi_secret;
  82. static inline struct efi_secret *efi_secret_get(void)
  83. {
  84. return &the_efi_secret;
  85. }
  86. static int efi_secret_bin_file_show(struct seq_file *file, void *data)
  87. {
  88. struct secret_entry *e = file->private;
  89. if (e)
  90. seq_write(file, e->data, secret_entry_data_len(e));
  91. return 0;
  92. }
  93. DEFINE_SHOW_ATTRIBUTE(efi_secret_bin_file);
  94. /*
  95. * Overwrite memory content with zeroes, and ensure that dirty cache lines are
  96. * actually written back to memory, to clear out the secret.
  97. */
  98. static void wipe_memory(void *addr, size_t size)
  99. {
  100. memzero_explicit(addr, size);
  101. #ifdef CONFIG_X86
  102. clflush_cache_range(addr, size);
  103. #endif
  104. }
  105. static int efi_secret_unlink(struct inode *dir, struct dentry *dentry)
  106. {
  107. struct efi_secret *s = efi_secret_get();
  108. struct inode *inode = d_inode(dentry);
  109. struct secret_entry *e = (struct secret_entry *)inode->i_private;
  110. int i;
  111. if (e) {
  112. /* Zero out the secret data */
  113. wipe_memory(e->data, secret_entry_data_len(e));
  114. e->guid = NULL_GUID;
  115. }
  116. inode->i_private = NULL;
  117. for (i = 0; i < EFI_SECRET_NUM_FILES; i++)
  118. if (s->fs_files[i] == dentry)
  119. s->fs_files[i] = NULL;
  120. return simple_unlink(inode, dentry);
  121. }
  122. static const struct inode_operations efi_secret_dir_inode_operations = {
  123. .lookup = simple_lookup,
  124. .unlink = efi_secret_unlink,
  125. };
  126. static int efi_secret_map_area(struct platform_device *dev)
  127. {
  128. int ret;
  129. struct efi_secret *s = efi_secret_get();
  130. struct linux_efi_coco_secret_area *secret_area;
  131. if (efi.coco_secret == EFI_INVALID_TABLE_ADDR) {
  132. dev_err(&dev->dev, "Secret area address is not available\n");
  133. return -EINVAL;
  134. }
  135. secret_area = memremap(efi.coco_secret, sizeof(*secret_area), MEMREMAP_WB);
  136. if (secret_area == NULL) {
  137. dev_err(&dev->dev, "Could not map secret area EFI config entry\n");
  138. return -ENOMEM;
  139. }
  140. if (!secret_area->base_pa || secret_area->size < sizeof(struct secret_header)) {
  141. dev_err(&dev->dev,
  142. "Invalid secret area memory location (base_pa=0x%llx size=0x%llx)\n",
  143. secret_area->base_pa, secret_area->size);
  144. ret = -EINVAL;
  145. goto unmap;
  146. }
  147. s->secret_data = ioremap_encrypted(secret_area->base_pa, secret_area->size);
  148. if (s->secret_data == NULL) {
  149. dev_err(&dev->dev, "Could not map secret area\n");
  150. ret = -ENOMEM;
  151. goto unmap;
  152. }
  153. s->secret_data_len = secret_area->size;
  154. ret = 0;
  155. unmap:
  156. memunmap(secret_area);
  157. return ret;
  158. }
  159. static void efi_secret_securityfs_teardown(struct platform_device *dev)
  160. {
  161. struct efi_secret *s = efi_secret_get();
  162. int i;
  163. for (i = (EFI_SECRET_NUM_FILES - 1); i >= 0; i--) {
  164. securityfs_remove(s->fs_files[i]);
  165. s->fs_files[i] = NULL;
  166. }
  167. securityfs_remove(s->fs_dir);
  168. s->fs_dir = NULL;
  169. securityfs_remove(s->secrets_dir);
  170. s->secrets_dir = NULL;
  171. dev_dbg(&dev->dev, "Removed securityfs entries\n");
  172. }
  173. static int efi_secret_securityfs_setup(struct platform_device *dev)
  174. {
  175. struct efi_secret *s = efi_secret_get();
  176. int ret = 0, i = 0, bytes_left;
  177. unsigned char *ptr;
  178. struct secret_header *h;
  179. struct secret_entry *e;
  180. struct dentry *dent;
  181. char guid_str[EFI_VARIABLE_GUID_LEN + 1];
  182. ptr = (void __force *)s->secret_data;
  183. h = (struct secret_header *)ptr;
  184. if (efi_guidcmp(h->guid, EFI_SECRET_TABLE_HEADER_GUID)) {
  185. /*
  186. * This is not an error: it just means that EFI defines secret
  187. * area but it was not populated by the Guest Owner.
  188. */
  189. dev_dbg(&dev->dev, "EFI secret area does not start with correct GUID\n");
  190. return -ENODEV;
  191. }
  192. if (h->len < sizeof(*h)) {
  193. dev_err(&dev->dev, "EFI secret area reported length is too small\n");
  194. return -EINVAL;
  195. }
  196. if (h->len > s->secret_data_len) {
  197. dev_err(&dev->dev, "EFI secret area reported length is too big\n");
  198. return -EINVAL;
  199. }
  200. s->secrets_dir = NULL;
  201. s->fs_dir = NULL;
  202. memset(s->fs_files, 0, sizeof(s->fs_files));
  203. dent = securityfs_create_dir("secrets", NULL);
  204. if (IS_ERR(dent)) {
  205. dev_err(&dev->dev, "Error creating secrets securityfs directory entry err=%ld\n",
  206. PTR_ERR(dent));
  207. return PTR_ERR(dent);
  208. }
  209. s->secrets_dir = dent;
  210. dent = securityfs_create_dir("coco", s->secrets_dir);
  211. if (IS_ERR(dent)) {
  212. dev_err(&dev->dev, "Error creating coco securityfs directory entry err=%ld\n",
  213. PTR_ERR(dent));
  214. return PTR_ERR(dent);
  215. }
  216. d_inode(dent)->i_op = &efi_secret_dir_inode_operations;
  217. s->fs_dir = dent;
  218. bytes_left = h->len - sizeof(*h);
  219. ptr += sizeof(*h);
  220. while (bytes_left >= (int)sizeof(*e) && i < EFI_SECRET_NUM_FILES) {
  221. e = (struct secret_entry *)ptr;
  222. if (e->len < sizeof(*e) || e->len > (unsigned int)bytes_left) {
  223. dev_err(&dev->dev, "EFI secret area is corrupted\n");
  224. ret = -EINVAL;
  225. goto err_cleanup;
  226. }
  227. /* Skip deleted entries (which will have NULL_GUID) */
  228. if (efi_guidcmp(e->guid, NULL_GUID)) {
  229. efi_guid_to_str(&e->guid, guid_str);
  230. dent = securityfs_create_file(guid_str, 0440, s->fs_dir, (void *)e,
  231. &efi_secret_bin_file_fops);
  232. if (IS_ERR(dent)) {
  233. dev_err(&dev->dev, "Error creating efi_secret securityfs entry\n");
  234. ret = PTR_ERR(dent);
  235. goto err_cleanup;
  236. }
  237. s->fs_files[i++] = dent;
  238. }
  239. ptr += e->len;
  240. bytes_left -= e->len;
  241. }
  242. dev_info(&dev->dev, "Created %d entries in securityfs secrets/coco\n", i);
  243. return 0;
  244. err_cleanup:
  245. efi_secret_securityfs_teardown(dev);
  246. return ret;
  247. }
  248. static void efi_secret_unmap_area(void)
  249. {
  250. struct efi_secret *s = efi_secret_get();
  251. if (s->secret_data) {
  252. iounmap(s->secret_data);
  253. s->secret_data = NULL;
  254. s->secret_data_len = 0;
  255. }
  256. }
  257. static int efi_secret_probe(struct platform_device *dev)
  258. {
  259. int ret;
  260. ret = efi_secret_map_area(dev);
  261. if (ret)
  262. return ret;
  263. ret = efi_secret_securityfs_setup(dev);
  264. if (ret)
  265. goto err_unmap;
  266. return ret;
  267. err_unmap:
  268. efi_secret_unmap_area();
  269. return ret;
  270. }
  271. static void efi_secret_remove(struct platform_device *dev)
  272. {
  273. efi_secret_securityfs_teardown(dev);
  274. efi_secret_unmap_area();
  275. }
  276. static struct platform_driver efi_secret_driver = {
  277. .probe = efi_secret_probe,
  278. .remove_new = efi_secret_remove,
  279. .driver = {
  280. .name = "efi_secret",
  281. },
  282. };
  283. module_platform_driver(efi_secret_driver);
  284. MODULE_DESCRIPTION("Confidential computing EFI secret area access");
  285. MODULE_AUTHOR("IBM");
  286. MODULE_LICENSE("GPL");
  287. MODULE_ALIAS("platform:efi_secret");