mbox series

[v8,0/6] KEYS: trusted: Introduce support for NXP CAAM-based trusted keys

Message ID 20220428140145.870527-1-a.fatoum@pengutronix.de (mailing list archive)
Headers show
Series KEYS: trusted: Introduce support for NXP CAAM-based trusted keys | expand

Message

Ahmad Fatoum April 28, 2022, 2:21 p.m. UTC
Series applies on top of v5.18-rc4. Would be great if this could make it
into v5.19.

v7 was here:
https://lore.kernel.org/linux-integrity/20220415205647.46056-1-a.fatoum@pengutronix.de

Changelog is beneath each individual patch. No code changes (except for
comments) compared to v7.


The Cryptographic Acceleration and Assurance Module (CAAM) is an IP core
built into many newer i.MX and QorIQ SoCs by NXP.

Its blob mechanism can AES encrypt/decrypt user data using a unique
never-disclosed device-specific key.

There has been multiple discussions on how to represent this within the kernel:

The Cryptographic Acceleration and Assurance Module (CAAM) is an IP core
built into many newer i.MX and QorIQ SoCs by NXP.

Its blob mechanism can AES encrypt/decrypt user data using a unique
never-disclosed device-specific key. There has been multiple
discussions on how to represent this within the kernel:

 - [RFC] crypto: caam - add red blobifier
   Steffen implemented[1] a PoC sysfs driver to start a discussion on how to
   best integrate the blob mechanism.
   Mimi suggested that it could be used to implement trusted keys.
   Trusted keys back then were a TPM-only feature.

 - security/keys/secure_key: Adds the secure key support based on CAAM.
   Udit Agarwal added[2] a new "secure" key type with the CAAM as backend.
   The key material stays within the kernel only.
   Mimi and James agreed that this needs a generic interface, not specific
   to CAAM. Mimi suggested trusted keys. Jan noted that this could serve as
   basis for TEE-backed keys.

 - [RFC] drivers: crypto: caam: key: Add caam_tk key type
   Franck added[3] a new "caam_tk" key type based on Udit's work. This time
   it uses CAAM "black blobs" instead of "red blobs", so key material stays
   within the CAAM and isn't exposed to kernel in plaintext.
   James voiced the opinion that there should be just one user-facing generic
   wrap/unwrap key type with multiple possible handlers.
   David suggested trusted keys.

 - Introduce TEE based Trusted Keys support
   Sumit reworked[4] trusted keys to support multiple possible backends with
   one chosen at boot time and added a new TEE backend along with TPM.
   This now sits in Jarkko's master branch to be sent out for v5.13

This patch series builds on top of Sumit's rework to have the CAAM as yet another
trusted key backend.

The CAAM bits are based on Steffen's initial patch from 2015. His work had been
used in the field for some years now, so I preferred not to deviate too much from it.

This series has been tested with dmcrypt[5] on an i.MX6Q/DL and an i.MX8M[6].

Looking forward to your feedback.

Cheers,
Ahmad

 [1]: https://lore.kernel.org/linux-crypto/1447082306-19946-2-git-send-email-s.trumtrar@pengutronix.de/
 [2]: https://lore.kernel.org/linux-integrity/20180723111432.26830-1-udit.agarwal@nxp.com/
 [3]: https://lore.kernel.org/lkml/1551456599-10603-2-git-send-email-franck.lenormand@nxp.com/
 [4]: https://lore.kernel.org/lkml/1604419306-26105-1-git-send-email-sumit.garg@linaro.org/
 [5]: https://lore.kernel.org/linux-integrity/20210122084321.24012-2-a.fatoum@pengutronix.de/
 [6]: https://lore.kernel.org/linux-integrity/DU2PR04MB8630D83FE9BBC0D782C4FAF595089@DU2PR04MB8630.eurprd04.prod.outlook.com/

---
To: Jarkko Sakkinen <jarkko@kernel.org>
To: "Horia Geantă" <horia.geanta@nxp.com>
To: Mimi Zohar <zohar@linux.ibm.com>
To: Pankaj Gupta <pankaj.gupta@nxp.com>
To: Herbert Xu <herbert@gondor.apana.org.au>
To: "David S. Miller" <davem@davemloft.net>
To: James Bottomley <jejb@linux.ibm.com>
Cc: David Howells <dhowells@redhat.com>
Cc: James Morris <jmorris@namei.org>
Cc: "Serge E. Hallyn" <serge@hallyn.com>
Cc: Steffen Trumtrar <s.trumtrar@pengutronix.de>
Cc: Jan Luebbe <j.luebbe@pengutronix.de>
Cc: David Gstir <david@sigma-star.at>
Cc: Eric Biggers <ebiggers@kernel.org>
Cc: Richard Weinberger <richard@nod.at>
Cc: Franck LENORMAND <franck.lenormand@nxp.com>
Cc: Sumit Garg <sumit.garg@linaro.org>
Cc: Andreas Rammhold <andreas@rammhold.de>
Cc: Tim Harvey <tharvey@gateworks.com>
Cc: Matthias Schiffer <matthias.schiffer@ew.tq-group.com>
Cc: linux-integrity@vger.kernel.org
Cc: keyrings@vger.kernel.org
Cc: linux-crypto@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Cc: linux-security-module@vger.kernel.org

Ahmad Fatoum (6):
  KEYS: trusted: allow use of TEE as backend without TCG_TPM support
  KEYS: trusted: allow use of kernel RNG for key material
  crypto: caam - add in-kernel interface for blob generator
  KEYS: trusted: Introduce support for NXP CAAM-based trusted keys
  doc: trusted-encrypted: describe new CAAM trust source
  MAINTAINERS: add myself as CAAM trusted key maintainer

 .../admin-guide/kernel-parameters.txt         |  11 ++
 .../security/keys/trusted-encrypted.rst       |  60 ++++++-
 MAINTAINERS                                   |   9 +
 drivers/crypto/caam/Kconfig                   |   3 +
 drivers/crypto/caam/Makefile                  |   1 +
 drivers/crypto/caam/blob_gen.c                | 164 ++++++++++++++++++
 include/keys/trusted-type.h                   |   2 +-
 include/keys/trusted_caam.h                   |  11 ++
 include/soc/fsl/caam-blob.h                   | 102 +++++++++++
 security/keys/Kconfig                         |  18 +-
 security/keys/trusted-keys/Kconfig            |  38 ++++
 security/keys/trusted-keys/Makefile           |  10 +-
 security/keys/trusted-keys/trusted_caam.c     |  82 +++++++++
 security/keys/trusted-keys/trusted_core.c     |  45 ++++-
 14 files changed, 527 insertions(+), 29 deletions(-)
 create mode 100644 drivers/crypto/caam/blob_gen.c
 create mode 100644 include/keys/trusted_caam.h
 create mode 100644 include/soc/fsl/caam-blob.h
 create mode 100644 security/keys/trusted-keys/Kconfig
 create mode 100644 security/keys/trusted-keys/trusted_caam.c

Comments

John Ernberg May 5, 2022, 2:58 p.m. UTC | #1
Gave this a go on iMX8QXP with Linux 5.17.5 and I can't quite get it working.

I get -ENODEV from add_key() via keyctl. When I traced it in dmesg I couldn't
get an as clear picture as I would like but CAAM (and thus possibly JRs?)
initialzing after trusted_key.

dmesg snips:
[    1.296772] trusted_key: Job Ring Device allocation for transform failed
...
[    1.799768] caam 31400000.crypto: device ID = 0x0a16040000000100 (Era 9)
[    1.807142] caam 31400000.crypto: job rings = 2, qi = 0
[    1.822667] caam algorithms registered in /proc/crypto
[    1.830541] caam 31400000.crypto: caam pkc algorithms registered in /proc/crypto
[    1.841807] caam 31400000.crypto: registering rng-caam

I didn't quite have the time to get a better trace than that.

Best regards // John Ernberg
Ahmad Fatoum May 5, 2022, 5:33 p.m. UTC | #2
Hello John,

On 05.05.22 16:58, John Ernberg wrote:
> Gave this a go on iMX8QXP with Linux 5.17.5 and I can't quite get it working.
> 
> I get -ENODEV from add_key() via keyctl. When I traced it in dmesg I couldn't
> get an as clear picture as I would like but CAAM (and thus possibly JRs?)
> initialzing after trusted_key.
> 
> dmesg snips:
> [    1.296772] trusted_key: Job Ring Device allocation for transform failed
> ...
> [    1.799768] caam 31400000.crypto: device ID = 0x0a16040000000100 (Era 9)
> [    1.807142] caam 31400000.crypto: job rings = 2, qi = 0
> [    1.822667] caam algorithms registered in /proc/crypto
> [    1.830541] caam 31400000.crypto: caam pkc algorithms registered in /proc/crypto
> [    1.841807] caam 31400000.crypto: registering rng-caam
> 
> I didn't quite have the time to get a better trace than that.

I don't see a crypto@31400000 node upstream. Where can I see your device tree?
Initcall ordering does the right thing, but if CAAM device probe is deferred beyond
late_initcall, then it won't help.

This is a general limitation with trusted keys at the moment. Anything that's
not there by the time of the late_initcall won't be tried again. You can work
around it by having trusted keys as a module. We might be able to do something
with fw_devlinks in the future and a look into your device tree would help here,
but I think that should be separate from this patch series.

Please let me know if the module build improves the situation for you.

Cheers,
Ahmad

>
> Best regards // John Ernberg
John Ernberg May 7, 2022, 9:30 p.m. UTC | #3
Hi Ahmad,

> > 
> > dmesg snips:
> > [    1.296772] trusted_key: Job Ring Device allocation for transform failed
> > ...
> > [    1.799768] caam 31400000.crypto: device ID = 0x0a16040000000100 (Era 9)
> > [    1.807142] caam 31400000.crypto: job rings = 2, qi = 0
> > [    1.822667] caam algorithms registered in /proc/crypto
> > [    1.830541] caam 31400000.crypto: caam pkc algorithms registered in /proc/crypto
> > [    1.841807] caam 31400000.crypto: registering rng-caam
> > 
> > I didn't quite have the time to get a better trace than that.
> 
> I don't see a crypto@31400000 node upstream. Where can I see your device tree?

Apologies for forgetting to mention that, I took it from the NXP tree
while removing the SM and SECO bits [1].
I also had to rebase some of their patches onto 5.17 for the CAAM to
probe, as the SCU makes some register pages unavailable.

> Initcall ordering does the right thing, but if CAAM device probe is deferred beyond
> late_initcall, then it won't help.
> 
> This is a general limitation with trusted keys at the moment. Anything that's
> not there by the time of the late_initcall won't be tried again. You can work
> around it by having trusted keys as a module. We might be able to do something
> with fw_devlinks in the future and a look into your device tree would help here,
> but I think that should be separate from this patch series.

Thank for you the explanation, it makes sense, and I agree that such work
would be a different patch set.

> 
> Please let me know if the module build improves the situation for you.
> 

After I changed trusted keys to a module I got it working. Which is good
enough for me as QXP CAAM support is not upstream yet.

Feel free to add my tested by if you need to make another spin.
Tested-by: John Ernberg <john.ernberg@actia.se> # iMX8QXP

I didn't test v9 as I would have to patch around the new patch due to
the SCU.

Best regards // John Ernberg

[1]: https://source.codeaurora.org/external/imx/linux-imx/tree/arch/arm64/boot/dts/freescale/imx8-ss-security.dtsi?h=lf-5.10.y
Ahmad Fatoum May 11, 2022, 10:44 a.m. UTC | #4
Hello John,

On 07.05.22 23:30, John Ernberg wrote:
> Hi Ahmad,
> 
>>>
>>> dmesg snips:
>>> [    1.296772] trusted_key: Job Ring Device allocation for transform failed
>>> ...
>>> [    1.799768] caam 31400000.crypto: device ID = 0x0a16040000000100 (Era 9)
>>> [    1.807142] caam 31400000.crypto: job rings = 2, qi = 0
>>> [    1.822667] caam algorithms registered in /proc/crypto
>>> [    1.830541] caam 31400000.crypto: caam pkc algorithms registered in /proc/crypto
>>> [    1.841807] caam 31400000.crypto: registering rng-caam
>>>
>>> I didn't quite have the time to get a better trace than that.
>>
>> I don't see a crypto@31400000 node upstream. Where can I see your device tree?
> 
> Apologies for forgetting to mention that, I took it from the NXP tree
> while removing the SM and SECO bits [1].
> I also had to rebase some of their patches onto 5.17 for the CAAM to
> probe, as the SCU makes some register pages unavailable.

If the CAAM has a dependency on some SCU-provided resource, this
would explain why the driver probes it that late.

>> Initcall ordering does the right thing, but if CAAM device probe is deferred beyond
>> late_initcall, then it won't help.
>>
>> This is a general limitation with trusted keys at the moment. Anything that's
>> not there by the time of the late_initcall won't be tried again. You can work
>> around it by having trusted keys as a module. We might be able to do something
>> with fw_devlinks in the future and a look into your device tree would help here,
>> but I think that should be separate from this patch series.
> 
> Thank for you the explanation, it makes sense, and I agree that such work
> would be a different patch set.
> 
>>
>> Please let me know if the module build improves the situation for you.
>>
> 
> After I changed trusted keys to a module I got it working. Which is good
> enough for me as QXP CAAM support is not upstream yet.

Great!

> Feel free to add my tested by if you need to make another spin.
> Tested-by: John Ernberg <john.ernberg@actia.se> # iMX8QXP
> 
> I didn't test v9 as I would have to patch around the new patch due to
> the SCU.

Thanks for the test. I will add it to v10 except for

 - "crypto: caam - determine whether CAAM supports blob encap/decap", which
   was new in v9
 - "doc: trusted-encrypted: describe new CAAM trust source",
   "MAINTAINERS: add KEYS-TRUSTED-CAAM" as runtime test isn't affected by these.

Cheers,
Ahmad

> 
> Best regards // John Ernberg
> 
> [1]: https://source.codeaurora.org/external/imx/linux-imx/tree/arch/arm64/boot/dts/freescale/imx8-ss-security.dtsi?h=lf-5.10.y