2022-02-25 15:09:00

by Pankaj Gupta

[permalink] [raw]
Subject: RE: [EXT] Re: [PATCH v5 4/5] crypto: caam - add in-kernel interface for blob generator



> -----Original Message-----
> From: Ahmad Fatoum <[email protected]>
> Sent: Wednesday, February 23, 2022 9:50 PM
> To: Jarkko Sakkinen <[email protected]>
> Cc: Horia Geanta <[email protected]>; Aymen Sghaier
> <[email protected]>; Herbert Xu <[email protected]>;
> David S. Miller <[email protected]>; [email protected]; David Gstir
> <[email protected]>; Pankaj Gupta <[email protected]>;
> [email protected]; Matthias Schiffer <[email protected]
> group.com>; James Bottomley <[email protected]>; Mimi Zohar
> <[email protected]>; David Howells <[email protected]>; James Morris
> <[email protected]>; Eric Biggers <[email protected]>; Serge E. Hallyn
> <[email protected]>; Jan Luebbe <[email protected]>; Richard
> Weinberger <[email protected]>; Franck Lenormand
> <[email protected]>; Sumit Garg <[email protected]>; linux-
> [email protected]; [email protected]; linux-
> [email protected]; [email protected]; linux-security-
> [email protected]
> Subject: [EXT] Re: [PATCH v5 4/5] crypto: caam - add in-kernel interface for blob
> generator
>
> Caution: EXT Email
>
> On 23.02.22 16:41, Jarkko Sakkinen wrote:
> > On Tue, Feb 22, 2022 at 08:58:18PM +0100, Ahmad Fatoum wrote:
> >> The NXP Cryptographic Acceleration and Assurance Module (CAAM) can be
> >> used to protect user-defined data across system reboot:
> >>
> >> - When the system is fused and boots into secure state, the master
> >> key is a unique never-disclosed device-specific key
> >> - random key is encrypted by key derived from master key
> >> - data is encrypted using the random key
> >> - encrypted data and its encrypted random key are stored alongside
> >> - This blob can now be safely stored in non-volatile memory
> >>
> >> On next power-on:
> >> - blob is loaded into CAAM
> >> - CAAM writes decrypted data either into memory or key register
> >>
> >> Add functions to realize encrypting and decrypting into memory
> >> alongside the CAAM driver.
> >>
> >> They will be used in a later commit as a source for the trusted key
> >> seal/unseal mechanism.
> >>
> >> Reviewed-by: David Gstir <[email protected]>
> >> Reviewed-by: Pankaj Gupta <[email protected]>
> >> Tested-By: Tim Harvey <[email protected]>
> >> Tested-by: Matthias Schiffer <[email protected]>
> >> Signed-off-by: Steffen Trumtrar <[email protected]>
> >> Signed-off-by: Ahmad Fatoum <[email protected]>
> >> ---
> >> To: "Horia Geant?" <[email protected]>
> >> To: Aymen Sghaier <[email protected]>
> >> To: Herbert Xu <[email protected]>
> >> To: "David S. Miller" <[email protected]>
> >> Cc: James Bottomley <[email protected]>
> >> Cc: Jarkko Sakkinen <[email protected]>
> >> Cc: Mimi Zohar <[email protected]>
> >> Cc: David Howells <[email protected]>
> >> Cc: James Morris <[email protected]>
> >> Cc: Eric Biggers <[email protected]>
> >> Cc: "Serge E. Hallyn" <[email protected]>
> >> Cc: Jan Luebbe <[email protected]>
> >> Cc: David Gstir <[email protected]>
> >> Cc: Richard Weinberger <[email protected]>
> >> Cc: Franck LENORMAND <[email protected]>
> >> Cc: Sumit Garg <[email protected]>
> >> Cc: Tim Harvey <[email protected]>
> >> Cc: Matthias Schiffer <[email protected]>
> >> Cc: Pankaj Gupta <[email protected]>
> >> Cc: [email protected]
> >> Cc: [email protected]
> >> Cc: [email protected]
> >> Cc: [email protected]
> >> Cc: [email protected]
> >> ---
> >> drivers/crypto/caam/Kconfig | 3 +
> >> drivers/crypto/caam/Makefile | 1 +
> >> drivers/crypto/caam/blob_gen.c | 230
> +++++++++++++++++++++++++++++++++
> >> include/soc/fsl/caam-blob.h | 56 ++++++++
> >> 4 files changed, 290 insertions(+)
> >> create mode 100644 drivers/crypto/caam/blob_gen.c create mode
> >> 100644 include/soc/fsl/caam-blob.h
> >>
> >> diff --git a/drivers/crypto/caam/Kconfig
> >> b/drivers/crypto/caam/Kconfig index 84ea7cba5ee5..ea9f8b1ae981 100644
> >> --- a/drivers/crypto/caam/Kconfig
> >> +++ b/drivers/crypto/caam/Kconfig
> >> @@ -151,6 +151,9 @@ config CRYPTO_DEV_FSL_CAAM_RNG_API
> >> Selecting this will register the SEC4 hardware rng to
> >> the hw_random API for supplying the kernel entropy pool.
> >>
> >> +config CRYPTO_DEV_FSL_CAAM_BLOB_GEN
> >> + bool
> >> +
> >> endif # CRYPTO_DEV_FSL_CAAM_JR
> >>
> >> endif # CRYPTO_DEV_FSL_CAAM
> >> diff --git a/drivers/crypto/caam/Makefile
> >> b/drivers/crypto/caam/Makefile index 3570286eb9ce..25f7ae5a4642
> >> 100644
> >> --- a/drivers/crypto/caam/Makefile
> >> +++ b/drivers/crypto/caam/Makefile
> >> @@ -21,6 +21,7 @@ caam_jr-
> $(CONFIG_CRYPTO_DEV_FSL_CAAM_CRYPTO_API_QI)
> >> += caamalg_qi.o
> >> caam_jr-$(CONFIG_CRYPTO_DEV_FSL_CAAM_AHASH_API) += caamhash.o
> >> caam_jr-$(CONFIG_CRYPTO_DEV_FSL_CAAM_RNG_API) += caamrng.o
> >> caam_jr-$(CONFIG_CRYPTO_DEV_FSL_CAAM_PKC_API) += caampkc.o
> >> pkc_desc.o
> >> +caam_jr-$(CONFIG_CRYPTO_DEV_FSL_CAAM_BLOB_GEN) += blob_gen.o
> >>
> >> caam-$(CONFIG_CRYPTO_DEV_FSL_CAAM_CRYPTO_API_QI) += qi.o ifneq
> >> ($(CONFIG_CRYPTO_DEV_FSL_CAAM_CRYPTO_API_QI),)
> >> diff --git a/drivers/crypto/caam/blob_gen.c
> >> b/drivers/crypto/caam/blob_gen.c new file mode 100644 index
> >> 000000000000..513d3f90e438
> >> --- /dev/null
> >> +++ b/drivers/crypto/caam/blob_gen.c
> >> @@ -0,0 +1,230 @@
> >> +// SPDX-License-Identifier: GPL-2.0-only
> >> +/*
> >> + * Copyright (C) 2015 Pengutronix, Steffen Trumtrar
> >> +<[email protected]>
> >> + * Copyright (C) 2021 Pengutronix, Ahmad Fatoum
> >> +<[email protected]> */
> >> +
> >> +#include <linux/device.h>
> >> +#include <soc/fsl/caam-blob.h>
> >> +
> >> +#include "compat.h"
> >> +#include "desc_constr.h"
> >> +#include "desc.h"
> >> +#include "error.h"
> >> +#include "intern.h"
> >> +#include "jr.h"
> >> +#include "regs.h"
> >> +
> >> +struct caam_blob_priv {
> >> + struct device jrdev;
> >> +};
> >> +
> >> +struct caam_blob_job_result {
> >> + int err;
> >> + struct completion completion;
> >> +};
> >> +
> >> +static void caam_blob_job_done(struct device *dev, u32 *desc, u32
> >> +err, void *context) {
> >> + struct caam_blob_job_result *res = context;
> >> + int ecode = 0;
> >> +
> >> + dev_dbg(dev, "%s %d: err 0x%x\n", __func__, __LINE__, err);
> >> +
> >> + if (err)
> >> + ecode = caam_jr_strstatus(dev, err);
> >> +
> >> + res->err = ecode;
> >> +
> >> + /*
> >> + * Upon completion, desc points to a buffer containing a CAAM job
> >> + * descriptor which encapsulates data into an externally-storable
> >> + * blob.
> >> + */
> >> + complete(&res->completion);
> >> +}
> >> +
> >> +static u32 *caam_blob_alloc_desc(size_t keymod_len) {
> >> + size_t len;
> >> +
> >> + /* header + (key mod immediate) + 2x pointers + op */
> >> + len = 4 + (4 + ALIGN(keymod_len, 4)) + 2*(4 + 4 +
> >> + CAAM_PTR_SZ_MAX) + 4;
> >
> > Nit: the amount of magic numbers is overwhelming here. I neither
> > understand the statement nor how that comment should help me to
> understand it.
>
> header = 4
> (key mod immediate) = (4 + ALIGN(keymod_len, 4))
> 2x pointer = 2 * (4 + 4 + CAAM_PTR_SZ_MAX)
> op = 4

Instead of the function caam_blob_alloc_desc(), it will be great if the caller functions caam_encap_blob()/caam_encap_blob (), could add local array:
uint32_t desc[CAAM_DESC_BYTES_MAX];

>
> I haven't heard back from the CAAM maintainers yet since v1. Perhaps now is a
> good occasion to chime in? :-)
>
> @Jarkko, could you take a look at patch 5? That's the gist of the series and I
> have yet to get maintainer feedback on that one.
>
> Cheers,
> Ahmad
>
>
> >
> > BR, Jarkko
> >
>
>
> --
> Pengutronix e.K. | |
> Steuerwalder Str. 21 |
> https://eur01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fwww.pen
> gutronix.de%2F&amp;data=04%7C01%7Cpankaj.gupta%40nxp.com%7Cc97e9d4
> aaf304124407908d9f6e87101%7C686ea1d3bc2b4c6fa92cd99c5c301635%7C0%
> 7C0%7C637812300459173929%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wL
> jAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000&amp;s
> data=CvnfIXR68DPRCaYrOYQKSv2eSBSNSSJYx2BQJee4yLg%3D&amp;reserved=0
> |
> 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
> Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |


2022-03-15 07:35:15

by Ahmad Fatoum

[permalink] [raw]
Subject: Re: [EXT] Re: [PATCH v5 4/5] crypto: caam - add in-kernel interface for blob generator

Hello Pankaj,

On 25.02.22 13:20, Pankaj Gupta wrote:
>>>> +static u32 *caam_blob_alloc_desc(size_t keymod_len) {
>>>> + size_t len;
>>>> +
>>>> + /* header + (key mod immediate) + 2x pointers + op */
>>>> + len = 4 + (4 + ALIGN(keymod_len, 4)) + 2*(4 + 4 +
>>>> + CAAM_PTR_SZ_MAX) + 4;
>>>
>>> Nit: the amount of magic numbers is overwhelming here. I neither
>>> understand the statement nor how that comment should help me to
>> understand it.
>>
>> header = 4
>> (key mod immediate) = (4 + ALIGN(keymod_len, 4))
>> 2x pointer = 2 * (4 + 4 + CAAM_PTR_SZ_MAX)
>> op = 4
>
> Instead of the function caam_blob_alloc_desc(), it will be great if the caller functions caam_encap_blob()/caam_encap_blob (), could add local array:
> uint32_t desc[CAAM_DESC_BYTES_MAX];

I just looked into this and placing desc on stack is not possible
as it is used for DMA inside caam_jr_enqueue().

Cheers,
Ahmad


--
Pengutronix e.K. | |
Steuerwalder Str. 21 | http://www.pengutronix.de/ |
31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |