crypto-qti-tz.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Crypto TZ library for storage encryption.
  4. *
  5. * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  6. */
  7. #include <linux/cacheflush.h>
  8. #include <linux/qcom_scm.h>
  9. #include <linux/qtee_shmbridge.h>
  10. #include <linux/crypto-qti-common.h>
  11. #include <linux/module.h>
  12. #include "crypto-qti-platform.h"
  13. #define ICE_CIPHER_MODE_XTS_256 3
  14. #define UFS_CARD_CE 30
  15. int crypto_qti_program_key(const struct ice_mmio_data *mmio_data,
  16. const struct blk_crypto_key *key, unsigned int slot,
  17. unsigned int data_unit_mask, int capid, int storage_type)
  18. {
  19. int err = 0;
  20. struct qtee_shm shm;
  21. err = qtee_shmbridge_allocate_shm(key->size, &shm);
  22. if (err)
  23. return -ENOMEM;
  24. memcpy(shm.vaddr, key->raw, key->size);
  25. qtee_shmbridge_flush_shm_buf(&shm);
  26. err = qcom_scm_config_set_ice_key(slot, shm.paddr, key->size,
  27. ICE_CIPHER_MODE_XTS_256,
  28. data_unit_mask, storage_type);
  29. if (err)
  30. pr_err("%s:SCM call Error: 0x%x slot %d\n",
  31. __func__, err, slot);
  32. qtee_shmbridge_inv_shm_buf(&shm);
  33. qtee_shmbridge_free_shm(&shm);
  34. return err;
  35. }
  36. EXPORT_SYMBOL(crypto_qti_program_key);
  37. int crypto_qti_invalidate_key(const struct ice_mmio_data *mmio_data,
  38. unsigned int slot, int storage_type)
  39. {
  40. int err = 0;
  41. err = qcom_scm_clear_ice_key(slot, storage_type);
  42. if (err)
  43. pr_err("%s:SCM call Error: 0x%x\n", __func__, err);
  44. return err;
  45. }
  46. EXPORT_SYMBOL(crypto_qti_invalidate_key);
  47. int crypto_qti_derive_raw_secret_platform(const struct ice_mmio_data *mmio_data,
  48. const u8 *wrapped_key,
  49. unsigned int wrapped_key_size, u8 *secret,
  50. unsigned int secret_size)
  51. {
  52. int err = 0;
  53. struct qtee_shm shm_key, shm_secret;
  54. err = qtee_shmbridge_allocate_shm(wrapped_key_size, &shm_key);
  55. if (err)
  56. return -ENOMEM;
  57. err = qtee_shmbridge_allocate_shm(secret_size, &shm_secret);
  58. if (err)
  59. return -ENOMEM;
  60. memcpy(shm_key.vaddr, wrapped_key, wrapped_key_size);
  61. qtee_shmbridge_flush_shm_buf(&shm_key);
  62. memset(shm_secret.vaddr, 0, secret_size);
  63. qtee_shmbridge_flush_shm_buf(&shm_secret);
  64. err = qcom_scm_derive_raw_secret(shm_key.paddr, wrapped_key_size,
  65. shm_secret.paddr, secret_size);
  66. if (err) {
  67. pr_err("%s:SCM call Error for derive raw secret: 0x%x\n",
  68. __func__, err);
  69. }
  70. qtee_shmbridge_inv_shm_buf(&shm_secret);
  71. memcpy(secret, shm_secret.vaddr, secret_size);
  72. qtee_shmbridge_inv_shm_buf(&shm_key);
  73. qtee_shmbridge_free_shm(&shm_key);
  74. qtee_shmbridge_free_shm(&shm_secret);
  75. return err;
  76. }
  77. EXPORT_SYMBOL(crypto_qti_derive_raw_secret_platform);
  78. MODULE_LICENSE("GPL");
  79. MODULE_DESCRIPTION("Crypto TZ library for storage encryption");