[U-Boot] [PATCH] drivers: optee: rpmb: fix returning CID to TEE
Jorge Ramirez-Ortiz
jorge at foundries.io
Mon Nov 18 11:18:27 UTC 2019
On 11/18/19 10:36 AM, Jens Wiklander wrote:
> Hi Jorge,
hey!
>
> On Fri, Nov 15, 2019 at 10:37 PM Jorge Ramirez-Ortiz <jorge at foundries.io> wrote:
>> The MMC CID value is one of the input parameters to unequivocally
>> provision the the RPMB key.
>>
>> Before this patch, the value returned by the mmc driver in the Linux
>> kernel differs from the one returned by uboot to optee.
>>
>> This means that if Linux provisions the RPMB key, uboot wont be able
>> to access it (and the other way around).
>>
>> Fix it so both uboot and linux can access the RPMB partition
>> independently of who provisions the key.
>>
>> Signed-off-by: Jorge Ramirez-Ortiz <jorge at foundries.io>
>> ---
>> drivers/tee/optee/rpmb.c | 5 ++++-
>> 1 file changed, 4 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/tee/optee/rpmb.c b/drivers/tee/optee/rpmb.c
>> index 955155b3f8..5dbb1eae4a 100644
>> --- a/drivers/tee/optee/rpmb.c
>> +++ b/drivers/tee/optee/rpmb.c
>> @@ -98,6 +98,7 @@ static struct mmc *get_mmc(struct optee_private *priv, int dev_id)
>> static u32 rpmb_get_dev_info(u16 dev_id, struct rpmb_dev_info *info)
>> {
>> struct mmc *mmc = find_mmc_device(dev_id);
>> + int i;
>>
>> if (!mmc)
>> return TEE_ERROR_ITEM_NOT_FOUND;
>> @@ -105,7 +106,9 @@ static u32 rpmb_get_dev_info(u16 dev_id, struct rpmb_dev_info *info)
>> if (!mmc->ext_csd)
>> return TEE_ERROR_GENERIC;
>>
>> - memcpy(info->cid, mmc->cid, sizeof(info->cid));
>> + for (i = 0; i < ARRAY_SIZE(mmc->cid); i++)
>> + ((u32 *) info->cid)[i] = be32_to_cpu(mmc->cid[i]);
>> +
> So it seems to be a byte order issue. I can't find the place in the
> Linux kernel (or in tee-supplicant) where the corresponding byte
> swapping is done. Have you been able to find it or you just tried to
> swap the bytes and it seemed to work?
I compared against the full CID output from Linux and noticed that in
order to match that exact same output this swap seemed to be required. I
didnt dig any deeper since a similar swap operation is done on other
-different - values returned from U-boot to OP-TEE.
>
> I'm not yet convinced that be32_to_cpu() is the correct function here.
> OP-TEE masks out a few fields from the CID when deriving the key:
sure but isnt that a different matter?
AFAICS U-boot should be providing the same CID than Linux does, and
whatever OP-TEE might be masking out on the receiving end is orthogonal
to such value, isnt it? maybe I am not understanding your point?
>
> CID is a uint8_t[16] here
> /*
> * PRV/CRC would be changed when doing eMMC FFU
> * The following fields should be masked off when deriving RPMB key
> *
> * CID [55: 48]: PRV (Product revision)
> * CID [07: 01]: CRC (CRC7 checksum)
> * CID [00]: not used
> */
>
> Will this work as expected on a big endian machine?
>
> Cheers,
> Jens
>
>> info->rel_wr_sec_c = mmc->ext_csd[222];
>> info->rpmb_size_mult = mmc->ext_csd[168];
>> info->ret_code = RPMB_CMD_GET_DEV_INFO_RET_OK;
>> --
>> 2.23.0
>>
More information about the U-Boot
mailing list