mirror of https://github.com/torvalds/linux.git
mmc: sdhci-msm: Add support for wrapped keys
Add the wrapped key support for sdhci-msm by implementing the needed methods in struct blk_crypto_ll_ops and setting the appropriate flag in blk_crypto_profile::key_types_supported. Tested on SC7280 eMMC variant. How to test: Use the "v1.3.0" tag from https://github.com/google/fscryptctl and build fscryptctl that supports generating wrapped keys. Enable the following config options: CONFIG_BLK_INLINE_ENCRYPTION=y CONFIG_QCOM_INLINE_CRYPTO_ENGINE=y CONFIG_FS_ENCRYPTION_INLINE_CRYPT=y CONFIG_MMC_CRYPTO=y Enable "qcom_ice.use_wrapped_keys" via kernel command line. $ mkfs.ext4 -F -O encrypt,stable_inodes /dev/disk/by-partlabel/vm-data $ mount /dev/disk/by-partlabel/vm-data -o inlinecrypt /mnt $ fscryptctl generate_hw_wrapped_key /dev/disk/by-partlabel/vm-data > /mnt/key.longterm $ fscryptctl prepare_hw_wrapped_key /dev/disk/by-partlabel/vm-data < /mnt/key.longterm > /tmp/key.ephemeral $ KEYID=$(fscryptctl add_key --hw-wrapped-key < /tmp/key.ephemeral /mnt) $ rm -rf /mnt/dir $ mkdir /mnt/dir $ fscryptctl set_policy --iv-ino-lblk-32 "$KEYID" /mnt/dir $ dmesg > /mnt/dir/test.txt $ sync Reboot the board $ mount /dev/disk/by-partlabel/vm-data -o inlinecrypt /mnt $ ls /mnt/dir # File should be encrypted $ fscryptctl prepare_hw_wrapped_key /dev/disk/by-partlabel/vm-data < /mnt/key.longterm > /tmp/key.ephemeral $ KEYID=$(fscryptctl add_key --hw-wrapped-key < /tmp/key.ephemeral /mnt) $ fscryptctl set_policy --iv-ino-lblk-32 "$KEYID" /mnt/dir $ cat /mnt/dir/test.txt # File should now be decrypted Tested-by: Wenjia Zhang <wenjia.zhang@oss.qualcomm.com> Signed-off-by: Neeraj Soni <neeraj.soni@oss.qualcomm.com> Acked-by: Adrian Hunter <adrian.hunter@intel.com> Reviewed-by: Eric Biggers <ebiggers@kernel.org> Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
This commit is contained in:
parent
d75c6c7d8e
commit
fd78e2b582
|
|
@ -1944,7 +1944,7 @@ static int sdhci_msm_ice_init(struct sdhci_msm_host *msm_host,
|
|||
|
||||
profile->ll_ops = sdhci_msm_crypto_ops;
|
||||
profile->max_dun_bytes_supported = 4;
|
||||
profile->key_types_supported = BLK_CRYPTO_KEY_TYPE_RAW;
|
||||
profile->key_types_supported = qcom_ice_get_supported_key_type(ice);
|
||||
profile->dev = dev;
|
||||
|
||||
/*
|
||||
|
|
@ -2024,6 +2024,42 @@ static int sdhci_msm_ice_keyslot_evict(struct blk_crypto_profile *profile,
|
|||
return qcom_ice_evict_key(msm_host->ice, slot);
|
||||
}
|
||||
|
||||
static int sdhci_msm_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 sdhci_msm_host *msm_host = sdhci_msm_host_from_crypto_profile(profile);
|
||||
|
||||
return qcom_ice_derive_sw_secret(msm_host->ice, eph_key, eph_key_size,
|
||||
sw_secret);
|
||||
}
|
||||
|
||||
static int sdhci_msm_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 sdhci_msm_host *msm_host = sdhci_msm_host_from_crypto_profile(profile);
|
||||
|
||||
return qcom_ice_import_key(msm_host->ice, raw_key, raw_key_size, lt_key);
|
||||
}
|
||||
|
||||
static int sdhci_msm_ice_generate_key(struct blk_crypto_profile *profile,
|
||||
u8 lt_key[BLK_CRYPTO_MAX_HW_WRAPPED_KEY_SIZE])
|
||||
{
|
||||
struct sdhci_msm_host *msm_host = sdhci_msm_host_from_crypto_profile(profile);
|
||||
|
||||
return qcom_ice_generate_key(msm_host->ice, lt_key);
|
||||
}
|
||||
|
||||
static int sdhci_msm_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 sdhci_msm_host *msm_host = sdhci_msm_host_from_crypto_profile(profile);
|
||||
|
||||
return qcom_ice_prepare_key(msm_host->ice, lt_key, lt_key_size, eph_key);
|
||||
}
|
||||
|
||||
static void sdhci_msm_non_cqe_ice_init(struct sdhci_host *host)
|
||||
{
|
||||
struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
|
||||
|
|
@ -2089,6 +2125,10 @@ static void sdhci_msm_request(struct mmc_host *mmc, struct mmc_request *mrq)
|
|||
static const struct blk_crypto_ll_ops sdhci_msm_crypto_ops = {
|
||||
.keyslot_program = sdhci_msm_ice_keyslot_program,
|
||||
.keyslot_evict = sdhci_msm_ice_keyslot_evict,
|
||||
.derive_sw_secret = sdhci_msm_ice_derive_sw_secret,
|
||||
.import_key = sdhci_msm_ice_import_key,
|
||||
.generate_key = sdhci_msm_ice_generate_key,
|
||||
.prepare_key = sdhci_msm_ice_prepare_key,
|
||||
};
|
||||
|
||||
#else /* CONFIG_MMC_CRYPTO */
|
||||
|
|
|
|||
Loading…
Reference in New Issue