tsm_mr_sample.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /* Copyright(c) 2024-2005 Intel Corporation. All rights reserved. */
  3. #define pr_fmt(x) KBUILD_MODNAME ": " x
  4. #include <linux/module.h>
  5. #include <linux/tsm-mr.h>
  6. #include <linux/miscdevice.h>
  7. #include <crypto/hash.h>
  8. static struct {
  9. u8 static_mr[SHA384_DIGEST_SIZE];
  10. u8 config_mr[SHA512_DIGEST_SIZE];
  11. u8 rtmr0[SHA256_DIGEST_SIZE];
  12. u8 rtmr1[SHA384_DIGEST_SIZE];
  13. u8 report_digest[SHA512_DIGEST_SIZE];
  14. } sample_report = {
  15. .static_mr = "static_mr",
  16. .config_mr = "config_mr",
  17. .rtmr0 = "rtmr0",
  18. .rtmr1 = "rtmr1",
  19. };
  20. static int sample_report_refresh(const struct tsm_measurements *tm)
  21. {
  22. struct crypto_shash *tfm;
  23. int rc;
  24. tfm = crypto_alloc_shash(hash_algo_name[HASH_ALGO_SHA512], 0, 0);
  25. if (IS_ERR(tfm)) {
  26. pr_err("crypto_alloc_shash failed: %ld\n", PTR_ERR(tfm));
  27. return PTR_ERR(tfm);
  28. }
  29. rc = crypto_shash_tfm_digest(tfm, (u8 *)&sample_report,
  30. offsetof(typeof(sample_report),
  31. report_digest),
  32. sample_report.report_digest);
  33. crypto_free_shash(tfm);
  34. if (rc)
  35. pr_err("crypto_shash_tfm_digest failed: %d\n", rc);
  36. return rc;
  37. }
  38. static int sample_report_extend_mr(const struct tsm_measurements *tm,
  39. const struct tsm_measurement_register *mr,
  40. const u8 *data)
  41. {
  42. SHASH_DESC_ON_STACK(desc, 0);
  43. int rc;
  44. desc->tfm = crypto_alloc_shash(hash_algo_name[mr->mr_hash], 0, 0);
  45. if (IS_ERR(desc->tfm)) {
  46. pr_err("crypto_alloc_shash failed: %ld\n", PTR_ERR(desc->tfm));
  47. return PTR_ERR(desc->tfm);
  48. }
  49. rc = crypto_shash_init(desc);
  50. if (!rc)
  51. rc = crypto_shash_update(desc, mr->mr_value, mr->mr_size);
  52. if (!rc)
  53. rc = crypto_shash_finup(desc, data, mr->mr_size, mr->mr_value);
  54. crypto_free_shash(desc->tfm);
  55. if (rc)
  56. pr_err("SHA calculation failed: %d\n", rc);
  57. return rc;
  58. }
  59. #define MR_(mr, hash) .mr_value = &sample_report.mr, TSM_MR_(mr, hash)
  60. static const struct tsm_measurement_register sample_mrs[] = {
  61. /* static MR, read-only */
  62. { MR_(static_mr, SHA384) },
  63. /* config MR, read-only */
  64. { MR_(config_mr, SHA512) | TSM_MR_F_NOHASH },
  65. /* RTMR, direct extension prohibited */
  66. { MR_(rtmr0, SHA256) | TSM_MR_F_LIVE },
  67. /* RTMR, direct extension allowed */
  68. { MR_(rtmr1, SHA384) | TSM_MR_F_RTMR },
  69. /* RTMR, crypto agile, alaised to rtmr0 and rtmr1, respectively */
  70. { .mr_value = &sample_report.rtmr0,
  71. TSM_MR_(rtmr_crypto_agile, SHA256) | TSM_MR_F_RTMR },
  72. { .mr_value = &sample_report.rtmr1,
  73. TSM_MR_(rtmr_crypto_agile, SHA384) | TSM_MR_F_RTMR },
  74. /* sha512 digest of the whole structure */
  75. { MR_(report_digest, SHA512) | TSM_MR_F_LIVE },
  76. };
  77. #undef MR_
  78. static struct tsm_measurements sample_tm = {
  79. .mrs = sample_mrs,
  80. .nr_mrs = ARRAY_SIZE(sample_mrs),
  81. .refresh = sample_report_refresh,
  82. .write = sample_report_extend_mr,
  83. };
  84. static const struct attribute_group *sample_groups[] = {
  85. NULL,
  86. NULL,
  87. };
  88. static struct miscdevice sample_misc_dev = {
  89. .name = KBUILD_MODNAME,
  90. .minor = MISC_DYNAMIC_MINOR,
  91. .groups = sample_groups,
  92. };
  93. static int __init tsm_mr_sample_init(void)
  94. {
  95. int rc;
  96. sample_groups[0] = tsm_mr_create_attribute_group(&sample_tm);
  97. if (IS_ERR(sample_groups[0]))
  98. return PTR_ERR(sample_groups[0]);
  99. rc = misc_register(&sample_misc_dev);
  100. if (rc)
  101. tsm_mr_free_attribute_group(sample_groups[0]);
  102. return rc;
  103. }
  104. static void __exit tsm_mr_sample_exit(void)
  105. {
  106. misc_deregister(&sample_misc_dev);
  107. tsm_mr_free_attribute_group(sample_groups[0]);
  108. }
  109. module_init(tsm_mr_sample_init);
  110. module_exit(tsm_mr_sample_exit);
  111. MODULE_LICENSE("GPL");
  112. MODULE_DESCRIPTION("Sample module using tsm-mr to expose emulated MRs");