Skip to content

Commit 4c45dba

Browse files
ebiggersmartinkpetersen
authored andcommitted
scsi: ufs: core: Add UFSHCD_QUIRK_KEYS_IN_PRDT
Since the nonstandard inline encryption support on Exynos SoCs requires that raw cryptographic keys be copied into the PRDT, it is desirable to zeroize those keys after each request to keep them from being left in memory. Therefore, add a quirk bit that enables the zeroization. We could instead do the zeroization unconditionally. However, using a quirk bit avoids adding the zeroization overhead to standard devices. Reviewed-by: Bart Van Assche <bvanassche@acm.org> Reviewed-by: Peter Griffin <peter.griffin@linaro.org> Signed-off-by: Eric Biggers <ebiggers@google.com> Link: https://lore.kernel.org/r/20240708235330.103590-6-ebiggers@kernel.org Reviewed-by: Alim Akhtar <alim.akhtar@samsung.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
1 parent 8ecea3d commit 4c45dba

File tree

3 files changed

+26
-0
lines changed

3 files changed

+26
-0
lines changed

drivers/ufs/core/ufshcd-crypto.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,20 @@ static inline int ufshcd_crypto_fill_prdt(struct ufs_hba *hba,
5050
return 0;
5151
}
5252

53+
static inline void ufshcd_crypto_clear_prdt(struct ufs_hba *hba,
54+
struct ufshcd_lrb *lrbp)
55+
{
56+
if (!(hba->quirks & UFSHCD_QUIRK_KEYS_IN_PRDT))
57+
return;
58+
59+
if (!(scsi_cmd_to_rq(lrbp->cmd)->crypt_ctx))
60+
return;
61+
62+
/* Zeroize the PRDT because it can contain cryptographic keys. */
63+
memzero_explicit(lrbp->ucd_prdt_ptr,
64+
ufshcd_sg_entry_size(hba) * scsi_sg_count(lrbp->cmd));
65+
}
66+
5367
bool ufshcd_crypto_enable(struct ufs_hba *hba);
5468

5569
int ufshcd_hba_init_crypto_capabilities(struct ufs_hba *hba);
@@ -73,6 +87,9 @@ static inline int ufshcd_crypto_fill_prdt(struct ufs_hba *hba,
7387
return 0;
7488
}
7589

90+
static inline void ufshcd_crypto_clear_prdt(struct ufs_hba *hba,
91+
struct ufshcd_lrb *lrbp) { }
92+
7693
static inline bool ufshcd_crypto_enable(struct ufs_hba *hba)
7794
{
7895
return false;

drivers/ufs/core/ufshcd.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5479,6 +5479,7 @@ void ufshcd_release_scsi_cmd(struct ufs_hba *hba,
54795479
struct scsi_cmnd *cmd = lrbp->cmd;
54805480

54815481
scsi_dma_unmap(cmd);
5482+
ufshcd_crypto_clear_prdt(hba, lrbp);
54825483
ufshcd_release(hba);
54835484
ufshcd_clk_scaling_update_busy(hba);
54845485
}

include/ufs/ufshcd.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -665,6 +665,14 @@ enum ufshcd_quirks {
665665
* host controller initialization fails if that bit is set.
666666
*/
667667
UFSHCD_QUIRK_BROKEN_CRYPTO_ENABLE = 1 << 23,
668+
669+
/*
670+
* This quirk needs to be enabled if the host controller driver copies
671+
* cryptographic keys into the PRDT in order to send them to hardware,
672+
* and therefore the PRDT should be zeroized after each request (as per
673+
* the standard best practice for managing keys).
674+
*/
675+
UFSHCD_QUIRK_KEYS_IN_PRDT = 1 << 24,
668676
};
669677

670678
enum ufshcd_caps {

0 commit comments

Comments
 (0)