mirror of
https://github.com/torvalds/linux.git
synced 2026-06-06 21:45:45 +02:00
scsi: ufs: qcom: Add support for wrapped keys
Wire up the wrapped key support for ufs-qcom by implementing the needed methods in struct blk_crypto_ll_ops and setting the appropriate flag in blk_crypto_profile::key_types_supported. For more information about this feature and how to use it, refer to the sections about hardware-wrapped keys in Documentation/block/inline-encryption.rst and Documentation/filesystems/fscrypt.rst. Based on patches by Gaurav Kashyap <quic_gaurkash@quicinc.com>. Reworked to use the custom crypto profile support. Acked-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org> Tested-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org> # sm8650 Signed-off-by: Eric Biggers <ebiggers@google.com> Link: https://lore.kernel.org/r/20250404231533.174419-4-ebiggers@kernel.org Acked-by: Ulf Hansson <ulf.hansson@linaro.org> # For MMC Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
7cc6e0c34b
commit
50dda49835
|
|
@ -156,11 +156,6 @@ static int ufs_qcom_ice_init(struct ufs_qcom_host *host)
|
|||
if (IS_ERR_OR_NULL(ice))
|
||||
return PTR_ERR_OR_ZERO(ice);
|
||||
|
||||
if (qcom_ice_get_supported_key_type(ice) != BLK_CRYPTO_KEY_TYPE_RAW) {
|
||||
dev_warn(dev, "Wrapped keys not supported. Disabling inline encryption support.\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
host->ice = ice;
|
||||
|
||||
/* Initialize the blk_crypto_profile */
|
||||
|
|
@ -174,7 +169,7 @@ static int ufs_qcom_ice_init(struct ufs_qcom_host *host)
|
|||
|
||||
profile->ll_ops = ufs_qcom_crypto_ops;
|
||||
profile->max_dun_bytes_supported = 8;
|
||||
profile->key_types_supported = BLK_CRYPTO_KEY_TYPE_RAW;
|
||||
profile->key_types_supported = qcom_ice_get_supported_key_type(ice);
|
||||
profile->dev = dev;
|
||||
|
||||
/*
|
||||
|
|
@ -242,9 +237,53 @@ static int ufs_qcom_ice_keyslot_evict(struct blk_crypto_profile *profile,
|
|||
return err;
|
||||
}
|
||||
|
||||
static int ufs_qcom_ice_derive_sw_secret(struct blk_crypto_profile *profile,
|
||||
const u8 *eph_key, size_t eph_key_size,
|
||||
u8 sw_secret[BLK_CRYPTO_SW_SECRET_SIZE])
|
||||
{
|
||||
struct ufs_hba *hba = ufs_hba_from_crypto_profile(profile);
|
||||
struct ufs_qcom_host *host = ufshcd_get_variant(hba);
|
||||
|
||||
return qcom_ice_derive_sw_secret(host->ice, eph_key, eph_key_size,
|
||||
sw_secret);
|
||||
}
|
||||
|
||||
static int ufs_qcom_ice_import_key(struct blk_crypto_profile *profile,
|
||||
const u8 *raw_key, size_t raw_key_size,
|
||||
u8 lt_key[BLK_CRYPTO_MAX_HW_WRAPPED_KEY_SIZE])
|
||||
{
|
||||
struct ufs_hba *hba = ufs_hba_from_crypto_profile(profile);
|
||||
struct ufs_qcom_host *host = ufshcd_get_variant(hba);
|
||||
|
||||
return qcom_ice_import_key(host->ice, raw_key, raw_key_size, lt_key);
|
||||
}
|
||||
|
||||
static int ufs_qcom_ice_generate_key(struct blk_crypto_profile *profile,
|
||||
u8 lt_key[BLK_CRYPTO_MAX_HW_WRAPPED_KEY_SIZE])
|
||||
{
|
||||
struct ufs_hba *hba = ufs_hba_from_crypto_profile(profile);
|
||||
struct ufs_qcom_host *host = ufshcd_get_variant(hba);
|
||||
|
||||
return qcom_ice_generate_key(host->ice, lt_key);
|
||||
}
|
||||
|
||||
static int ufs_qcom_ice_prepare_key(struct blk_crypto_profile *profile,
|
||||
const u8 *lt_key, size_t lt_key_size,
|
||||
u8 eph_key[BLK_CRYPTO_MAX_HW_WRAPPED_KEY_SIZE])
|
||||
{
|
||||
struct ufs_hba *hba = ufs_hba_from_crypto_profile(profile);
|
||||
struct ufs_qcom_host *host = ufshcd_get_variant(hba);
|
||||
|
||||
return qcom_ice_prepare_key(host->ice, lt_key, lt_key_size, eph_key);
|
||||
}
|
||||
|
||||
static const struct blk_crypto_ll_ops ufs_qcom_crypto_ops = {
|
||||
.keyslot_program = ufs_qcom_ice_keyslot_program,
|
||||
.keyslot_evict = ufs_qcom_ice_keyslot_evict,
|
||||
.derive_sw_secret = ufs_qcom_ice_derive_sw_secret,
|
||||
.import_key = ufs_qcom_ice_import_key,
|
||||
.generate_key = ufs_qcom_ice_generate_key,
|
||||
.prepare_key = ufs_qcom_ice_prepare_key,
|
||||
};
|
||||
|
||||
#else
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user