From: Eric Biggers <ebiggers@kernel.org>
To: Gaurav Kashyap <quic_gaurkash@quicinc.com>
Cc: linux-scsi@vger.kernel.org, linux-arm-msm@vger.kernel.org,
linux-mmc@vger.kernel.org, linux-block@vger.kernel.org,
linux-fscrypt@vger.kernel.org, thara.gopinath@linaro.org,
asutoshd@codeaurora.org
Subject: Re: [PATCH 2/4] qcom_scm: scm call for deriving a software secret
Date: Thu, 4 Nov 2021 16:31:45 -0700 [thread overview]
Message-ID: <YYRtYcHMav42zwTR@gmail.com> (raw)
In-Reply-To: <20211103231840.115521-3-quic_gaurkash@quicinc.com>
On Wed, Nov 03, 2021 at 04:18:38PM -0700, Gaurav Kashyap wrote:
>
> However, when keys are hardware wrapped, it can be only unwrapped
> by Qualcomm Trustzone.
Qualcomm Trustzone is software. There is a mode where it passes the key to the
actual HWKM hardware as intended, right?
> +/**
> + * qcom_scm_derive_sw_secret() - Derive SW secret from wrapped encryption key
> + * @wrapped_key: the wrapped key used for inline encryption
> + * @wrapped_key_size: size of the wrapped key
> + * @sw_secret: the secret to be derived
> + * @secret_size: size of the secret derived
Please make the semantics of the @secret_size parameter clear. Will the output
be at least @secret_size, exactly @secret_size, or at most @secret_size?
> + *
> + * Derive a SW secret to be used for inline encryption using Qualcomm ICE.
> + *
> + * Generally, for non-wrapped keys, fscrypt can derive a sw secret from the
> + * key in the clear in the linux keyring.
> + *
> + * However, for wrapped keys, the key needs to be unwrapped, which can be done
> + * only by the secure EE. So, it makes sense for the secure EE to derive the
> + * sw secret and return to the kernel when wrapped keys are used.
It's sort of a layering violation to mention fscrypt here, as this is low-level
driver code. fscrypt is just an example user. I recommend documenting this in
more general terms, and maybe referring to the "Hardware-wrapped keys" section
of Documentation/block/inline-encryption.rst (which my patchset adds) as that is
intended to explain derive_sw_secret already.
> +int qcom_scm_derive_sw_secret(const u8* wrapped_key, u32 wrapped_key_size,
> + u8 *sw_secret, u32 secret_size)
> +{
> + struct qcom_scm_desc desc = {
> + .svc = QCOM_SCM_SVC_ES,
> + .cmd = QCOM_SCM_ES_DERIVE_RAW_SECRET,
> + .arginfo = QCOM_SCM_ARGS(4, QCOM_SCM_RW,
wrapped_key is const. Should it use QCOM_SCM_RO instead of QCOM_SCM_RW?
> + keybuf = dma_alloc_coherent(__scm->dev, wrapped_key_size, &key_phys,
> + GFP_KERNEL);
> + if (!keybuf)
> + return -ENOMEM;
> + secretbuf = dma_alloc_coherent(__scm->dev, secret_size, &secret_phys,
> + GFP_KERNEL);
> + if (!secretbuf)
> + return -ENOMEM;
In the '!secretbuf' case, this leaks 'keybuf'.
Also, my understanding is that the use of dma_alloc_coherent() here is a bit
unusual. It would be helpful to leave a comment like:
/*
* Like qcom_scm_ice_set_key(), we use dma_alloc_coherent() to properly
* get a physical address, while guaranteeing that we can zeroize the
* key material later using memzero_explicit().
*/
> + ret = qcom_scm_call(__scm->dev, &desc, NULL);
> + memcpy(sw_secret, secretbuf, secret_size);
This is copying out the data even if the SCM call failed.
> diff --git a/drivers/firmware/qcom_scm.h b/drivers/firmware/qcom_scm.h
> index d92156ceb3ac..de5d4f8fd20d 100644
> --- a/drivers/firmware/qcom_scm.h
> +++ b/drivers/firmware/qcom_scm.h
> @@ -110,6 +110,7 @@ extern int scm_legacy_call(struct device *dev, const struct qcom_scm_desc *desc,
> #define QCOM_SCM_SVC_ES 0x10 /* Enterprise Security */
> #define QCOM_SCM_ES_INVALIDATE_ICE_KEY 0x03
> #define QCOM_SCM_ES_CONFIG_SET_ICE_KEY 0x04
> +#define QCOM_SCM_ES_DERIVE_RAW_SECRET 0x07
Can this be renamed to DERIVE_SW_SECRET?
If not, then you probably should call the function qcom_scm_derive_raw_secret()
instead of qcom_scm_derive_sw_secret(), since the functions in qcom_scm.c are
intended to be thin wrappers around the SCM calls. The naming difference can be
dealt with at a higher level.
- Eric
next prev parent reply other threads:[~2021-11-04 23:31 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-11-03 23:18 [PATCH 0/4] Adds wrapped key support for inline storage encryption Gaurav Kashyap
2021-11-03 23:18 ` [PATCH 1/4] ufs: move ICE functionality to a common library Gaurav Kashyap
2021-11-04 23:05 ` Eric Biggers
2021-11-03 23:18 ` [PATCH 2/4] qcom_scm: scm call for deriving a software secret Gaurav Kashyap
2021-11-04 23:31 ` Eric Biggers [this message]
2021-11-03 23:18 ` [PATCH 3/4] soc: qcom: add HWKM library for storage encryption Gaurav Kashyap
2021-11-04 23:46 ` Eric Biggers
2021-11-03 23:18 ` [PATCH 4/4] soc: qcom: add wrapped key support for ICE Gaurav Kashyap
2021-11-05 0:08 ` Eric Biggers
2021-11-04 22:49 ` [PATCH 0/4] Adds wrapped key support for inline storage encryption Eric Biggers
2021-12-08 0:09 ` Gaurav Kashyap
2021-12-08 0:23 ` Eric Biggers
2021-12-08 18:13 ` Gaurav Kashyap
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=YYRtYcHMav42zwTR@gmail.com \
--to=ebiggers@kernel.org \
--cc=asutoshd@codeaurora.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-block@vger.kernel.org \
--cc=linux-fscrypt@vger.kernel.org \
--cc=linux-mmc@vger.kernel.org \
--cc=linux-scsi@vger.kernel.org \
--cc=quic_gaurkash@quicinc.com \
--cc=thara.gopinath@linaro.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).