The Cryptographic Acceleration and Assurance Module (CAAM) is an IP core
built into many newer i.MX and QorIQ SoCs by NXP.
The CAAM does crypto acceleration, hardware number generation and
has a blob mechanism for encapsulation/decapsulation of sensitive material.
This blob mechanism depends on a device specific random 256-bit One Time
Programmable Master Key that is fused in each SoC at manufacturing
time. This key is unreadable and can only be used by the CAAM for AES
encryption/decryption of user data.
This makes it a suitable backend (source) for kernel trusted keys.
Previous commits generalized trusted keys to support multiple backends
and added an API to access the CAAM blob mechanism. Based on these,
provide the necessary glue to use the CAAM for trusted keys.
Reviewed-by: David Gstir <[email protected]>
Tested-By: Tim Harvey <[email protected]>
Tested-by: Matthias Schiffer <[email protected]>
Signed-off-by: Ahmad Fatoum <[email protected]>
---
To: Jonathan Corbet <[email protected]>
To: David Howells <[email protected]>
To: Jarkko Sakkinen <[email protected]>
To: James Bottomley <[email protected]>
To: Mimi Zohar <[email protected]>
Cc: James Morris <[email protected]>
Cc: "Serge E. Hallyn" <[email protected]>
Cc: "Horia Geantă" <[email protected]>
Cc: Aymen Sghaier <[email protected]>
Cc: Herbert Xu <[email protected]>
Cc: "David S. Miller" <[email protected]>
Cc: Eric Biggers <[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]
Cc: [email protected]
---
.../admin-guide/kernel-parameters.txt | 1 +
.../security/keys/trusted-encrypted.rst | 40 +++++++++-
MAINTAINERS | 9 +++
include/keys/trusted_caam.h | 11 +++
security/keys/trusted-keys/Kconfig | 11 ++-
security/keys/trusted-keys/Makefile | 2 +
security/keys/trusted-keys/trusted_caam.c | 74 +++++++++++++++++++
security/keys/trusted-keys/trusted_core.c | 6 +-
8 files changed, 151 insertions(+), 3 deletions(-)
create mode 100644 include/keys/trusted_caam.h
create mode 100644 security/keys/trusted-keys/trusted_caam.c
diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt
index 844c883ca9d8..9e7ef4c6585d 100644
--- a/Documentation/admin-guide/kernel-parameters.txt
+++ b/Documentation/admin-guide/kernel-parameters.txt
@@ -5875,6 +5875,7 @@
sources:
- "tpm"
- "tee"
+ - "caam"
If not specified then it defaults to iterating through
the trust source list starting with TPM and assigns the
first trust source as a backend which is initialized
diff --git a/Documentation/security/keys/trusted-encrypted.rst b/Documentation/security/keys/trusted-encrypted.rst
index 99cf34d7c025..ed60c48cb692 100644
--- a/Documentation/security/keys/trusted-encrypted.rst
+++ b/Documentation/security/keys/trusted-encrypted.rst
@@ -35,6 +35,13 @@ safe.
Rooted to Hardware Unique Key (HUK) which is generally burnt in on-chip
fuses and is accessible to TEE only.
+ (3) CAAM (Cryptographic Acceleration and Assurance Module: IP on NXP SoCs)
+
+ When High Assurance Boot (HAB) is enabled and the CAAM is in secure
+ mode, trust is rooted to the OTPMK, a never-disclosed 256-bit key
+ randomly generated and fused into each SoC at manufacturing time.
+ Otherwise, a common fixed test key is used instead.
+
* Execution isolation
(1) TPM
@@ -46,6 +53,10 @@ safe.
Customizable set of operations running in isolated execution
environment verified via Secure/Trusted boot process.
+ (3) CAAM
+
+ Fixed set of operations running in isolated execution environment.
+
* Optional binding to platform integrity state
(1) TPM
@@ -63,6 +74,11 @@ safe.
Relies on Secure/Trusted boot process for platform integrity. It can
be extended with TEE based measured boot process.
+ (3) CAAM
+
+ Relies on the High Assurance Boot (HAB) mechanism of NXP SoCs
+ for platform integrity.
+
* Interfaces and APIs
(1) TPM
@@ -74,10 +90,13 @@ safe.
TEEs have well-documented, standardized client interface and APIs. For
more details refer to ``Documentation/staging/tee.rst``.
+ (3) CAAM
+
+ Interface is specific to silicon vendor.
* Threat model
- The strength and appropriateness of a particular TPM or TEE for a given
+ The strength and appropriateness of a particular trust source for a given
purpose must be assessed when using them to protect security-relevant data.
@@ -104,6 +123,12 @@ selected trust source:
from platform specific hardware RNG or a software based Fortuna CSPRNG
which can be seeded via multiple entropy sources.
+ * CAAM: Kernel RNG
+
+ The normal kernel random number generator is used. To seed it from the
+ CAAM HWRNG, enable CRYPTO_DEV_FSL_CAAM_RNG_API and ensure the device
+ is probed.
+
Users may override this by specifying ``trusted.rng=kernel`` on the kernel
command-line to override the used RNG with the kernel's random number pool.
@@ -192,6 +217,19 @@ Usage::
specific to TEE device implementation. The key length for new keys is always
in bytes. Trusted Keys can be 32 - 128 bytes (256 - 1024 bits).
+Trusted Keys usage: CAAM
+------------------------
+
+Usage::
+
+ keyctl add trusted name "new keylen" ring
+ keyctl add trusted name "load hex_blob" ring
+ keyctl print keyid
+
+"keyctl print" returns an ASCII hex copy of the sealed key, which is in format
+specific to CAAM device implementation. The key length for new keys is always
+in bytes. Trusted Keys can be 32 - 128 bytes (256 - 1024 bits).
+
Encrypted Keys usage
--------------------
diff --git a/MAINTAINERS b/MAINTAINERS
index f670002134e0..6eca4476bb76 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -10655,6 +10655,15 @@ S: Supported
F: include/keys/trusted_tee.h
F: security/keys/trusted-keys/trusted_tee.c
+KEYS-TRUSTED-CAAM
+M: Ahmad Fatoum <[email protected]>
+R: Pengutronix Kernel Team <[email protected]>
+L: [email protected]
+L: [email protected]
+S: Maintained
+F: include/keys/trusted_caam.h
+F: security/keys/trusted-keys/trusted_caam.c
+
KEYS/KEYRINGS
M: David Howells <[email protected]>
M: Jarkko Sakkinen <[email protected]>
diff --git a/include/keys/trusted_caam.h b/include/keys/trusted_caam.h
new file mode 100644
index 000000000000..2fba0996b0b0
--- /dev/null
+++ b/include/keys/trusted_caam.h
@@ -0,0 +1,11 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Copyright (C) 2021 Pengutronix, Ahmad Fatoum <[email protected]>
+ */
+
+#ifndef __CAAM_TRUSTED_KEY_H
+#define __CAAM_TRUSTED_KEY_H
+
+extern struct trusted_key_ops caam_trusted_key_ops;
+
+#endif
diff --git a/security/keys/trusted-keys/Kconfig b/security/keys/trusted-keys/Kconfig
index fc4abd581abb..dbfdd8536468 100644
--- a/security/keys/trusted-keys/Kconfig
+++ b/security/keys/trusted-keys/Kconfig
@@ -24,6 +24,15 @@ config TRUSTED_KEYS_TEE
Enable use of the Trusted Execution Environment (TEE) as trusted
key backend.
-if !TRUSTED_KEYS_TPM && !TRUSTED_KEYS_TEE
+config TRUSTED_KEYS_CAAM
+ bool "CAAM-based trusted keys"
+ depends on CRYPTO_DEV_FSL_CAAM_JR >= TRUSTED_KEYS
+ select CRYPTO_DEV_FSL_CAAM_BLOB_GEN
+ default y
+ help
+ Enable use of NXP's Cryptographic Accelerator and Assurance Module
+ (CAAM) as trusted key backend.
+
+if !TRUSTED_KEYS_TPM && !TRUSTED_KEYS_TEE && !TRUSTED_KEYS_CAAM
comment "No trust source selected!"
endif
diff --git a/security/keys/trusted-keys/Makefile b/security/keys/trusted-keys/Makefile
index 2e2371eae4d5..735aa0bc08ef 100644
--- a/security/keys/trusted-keys/Makefile
+++ b/security/keys/trusted-keys/Makefile
@@ -12,3 +12,5 @@ trusted-$(CONFIG_TRUSTED_KEYS_TPM) += trusted_tpm2.o
trusted-$(CONFIG_TRUSTED_KEYS_TPM) += tpm2key.asn1.o
trusted-$(CONFIG_TRUSTED_KEYS_TEE) += trusted_tee.o
+
+trusted-$(CONFIG_TRUSTED_KEYS_CAAM) += trusted_caam.o
diff --git a/security/keys/trusted-keys/trusted_caam.c b/security/keys/trusted-keys/trusted_caam.c
new file mode 100644
index 000000000000..066f08d6eb2c
--- /dev/null
+++ b/security/keys/trusted-keys/trusted_caam.c
@@ -0,0 +1,74 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (C) 2021 Pengutronix, Ahmad Fatoum <[email protected]>
+ */
+
+#include <keys/trusted_caam.h>
+#include <keys/trusted-type.h>
+#include <linux/build_bug.h>
+#include <linux/key-type.h>
+#include <soc/fsl/caam-blob.h>
+
+static struct caam_blob_priv *blobifier;
+
+#define KEYMOD "SECURE_KEY"
+
+static_assert(MAX_KEY_SIZE + CAAM_BLOB_OVERHEAD <= CAAM_BLOB_MAX_LEN);
+static_assert(MAX_BLOB_SIZE <= CAAM_BLOB_MAX_LEN);
+
+static int trusted_caam_seal(struct trusted_key_payload *p, char *datablob)
+{
+ int length = p->key_len + CAAM_BLOB_OVERHEAD;
+ int ret;
+
+ ret = caam_encap_blob(blobifier, KEYMOD, p->key, p->blob, length);
+ if (ret)
+ return ret;
+
+ p->blob_len = length;
+ return 0;
+}
+
+static int trusted_caam_unseal(struct trusted_key_payload *p, char *datablob)
+{
+ int length = p->blob_len;
+ int ret;
+
+ ret = caam_decap_blob(blobifier, KEYMOD, p->blob, p->key, length);
+ if (ret)
+ return ret;
+
+ p->key_len = length - CAAM_BLOB_OVERHEAD;
+ return 0;
+}
+
+static int trusted_caam_init(void)
+{
+ int ret;
+
+ blobifier = caam_blob_gen_init();
+ if (IS_ERR(blobifier)) {
+ pr_err("Job Ring Device allocation for transform failed\n");
+ return PTR_ERR(blobifier);
+ }
+
+ ret = register_key_type(&key_type_trusted);
+ if (ret)
+ caam_blob_gen_exit(blobifier);
+
+ return ret;
+}
+
+static void trusted_caam_exit(void)
+{
+ unregister_key_type(&key_type_trusted);
+ caam_blob_gen_exit(blobifier);
+}
+
+struct trusted_key_ops caam_trusted_key_ops = {
+ .migratable = 0, /* non-migratable */
+ .init = trusted_caam_init,
+ .seal = trusted_caam_seal,
+ .unseal = trusted_caam_unseal,
+ .exit = trusted_caam_exit,
+};
diff --git a/security/keys/trusted-keys/trusted_core.c b/security/keys/trusted-keys/trusted_core.c
index 9235fb7d0ec9..640434cd437a 100644
--- a/security/keys/trusted-keys/trusted_core.c
+++ b/security/keys/trusted-keys/trusted_core.c
@@ -9,6 +9,7 @@
#include <keys/user-type.h>
#include <keys/trusted-type.h>
#include <keys/trusted_tee.h>
+#include <keys/trusted_caam.h>
#include <keys/trusted_tpm.h>
#include <linux/capability.h>
#include <linux/err.h>
@@ -29,7 +30,7 @@ MODULE_PARM_DESC(rng, "Select trusted key RNG");
static char *trusted_key_source;
module_param_named(source, trusted_key_source, charp, 0);
-MODULE_PARM_DESC(source, "Select trusted keys source (tpm or tee)");
+MODULE_PARM_DESC(source, "Select trusted keys source (tpm, tee or caam)");
static const struct trusted_key_source trusted_key_sources[] = {
#if defined(CONFIG_TRUSTED_KEYS_TPM)
@@ -38,6 +39,9 @@ static const struct trusted_key_source trusted_key_sources[] = {
#if defined(CONFIG_TRUSTED_KEYS_TEE)
{ "tee", &trusted_key_tee_ops },
#endif
+#if defined(CONFIG_TRUSTED_KEYS_CAAM)
+ { "caam", &caam_trusted_key_ops },
+#endif
};
DEFINE_STATIC_CALL_NULL(trusted_key_init, *trusted_key_sources[0].ops->init);
--
2.30.2
Reviewed-by: Pankaj Gupta <[email protected]>
> -----Original Message-----
> From: Ahmad Fatoum <[email protected]>
> Sent: Wednesday, February 23, 2022 1:28 AM
> To: Jonathan Corbet <[email protected]>; David Howells
> <[email protected]>; Jarkko Sakkinen <[email protected]>; James
> Bottomley <[email protected]>; Mimi Zohar <[email protected]>
> Cc: [email protected]; David Gstir <[email protected]>;
> [email protected]; Matthias Schiffer <[email protected]
> group.com>; Ahmad Fatoum <[email protected]>; James Morris
> <[email protected]>; Serge E. Hallyn <[email protected]>; Horia Geanta
> <[email protected]>; Aymen Sghaier <[email protected]>; Herbert
> Xu <[email protected]>; David S. Miller <[email protected]>;
> Eric Biggers <[email protected]>; Jan Luebbe <[email protected]>;
> Richard Weinberger <[email protected]>; Franck Lenormand
> <[email protected]>; Sumit Garg <[email protected]>; Pankaj
> Gupta <[email protected]>; [email protected]; linux-
> [email protected]; [email protected]; linux-
> [email protected]; [email protected]; linux-security-
> [email protected]
> Subject: [EXT] [PATCH v5 5/5] KEYS: trusted: Introduce support for NXP CAAM-
> based trusted keys
>
> Caution: EXT Email
>
> The Cryptographic Acceleration and Assurance Module (CAAM) is an IP core built
> into many newer i.MX and QorIQ SoCs by NXP.
>
> The CAAM does crypto acceleration, hardware number generation and has a
> blob mechanism for encapsulation/decapsulation of sensitive material.
>
> This blob mechanism depends on a device specific random 256-bit One Time
> Programmable Master Key that is fused in each SoC at manufacturing time. This
> key is unreadable and can only be used by the CAAM for AES
> encryption/decryption of user data.
>
> This makes it a suitable backend (source) for kernel trusted keys.
>
> Previous commits generalized trusted keys to support multiple backends and
> added an API to access the CAAM blob mechanism. Based on these, provide the
> necessary glue to use the CAAM for trusted keys.
>
> Reviewed-by: David Gstir <[email protected]>
> Tested-By: Tim Harvey <[email protected]>
> Tested-by: Matthias Schiffer <[email protected]>
> Signed-off-by: Ahmad Fatoum <[email protected]>
> ---
> To: Jonathan Corbet <[email protected]>
> To: David Howells <[email protected]>
> To: Jarkko Sakkinen <[email protected]>
> To: James Bottomley <[email protected]>
> To: Mimi Zohar <[email protected]>
> Cc: James Morris <[email protected]>
> Cc: "Serge E. Hallyn" <[email protected]>
> Cc: "Horia Geantă" <[email protected]>
> Cc: Aymen Sghaier <[email protected]>
> Cc: Herbert Xu <[email protected]>
> Cc: "David S. Miller" <[email protected]>
> Cc: Eric Biggers <[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]
> Cc: [email protected]
> ---
> .../admin-guide/kernel-parameters.txt | 1 +
> .../security/keys/trusted-encrypted.rst | 40 +++++++++-
> MAINTAINERS | 9 +++
> include/keys/trusted_caam.h | 11 +++
> security/keys/trusted-keys/Kconfig | 11 ++-
> security/keys/trusted-keys/Makefile | 2 +
> security/keys/trusted-keys/trusted_caam.c | 74 +++++++++++++++++++
> security/keys/trusted-keys/trusted_core.c | 6 +-
> 8 files changed, 151 insertions(+), 3 deletions(-) create mode 100644
> include/keys/trusted_caam.h create mode 100644 security/keys/trusted-
> keys/trusted_caam.c
>
> diff --git a/Documentation/admin-guide/kernel-parameters.txt
> b/Documentation/admin-guide/kernel-parameters.txt
> index 844c883ca9d8..9e7ef4c6585d 100644
> --- a/Documentation/admin-guide/kernel-parameters.txt
> +++ b/Documentation/admin-guide/kernel-parameters.txt
> @@ -5875,6 +5875,7 @@
> sources:
> - "tpm"
> - "tee"
> + - "caam"
> If not specified then it defaults to iterating through
> the trust source list starting with TPM and assigns the
> first trust source as a backend which is initialized diff --git
> a/Documentation/security/keys/trusted-encrypted.rst
> b/Documentation/security/keys/trusted-encrypted.rst
> index 99cf34d7c025..ed60c48cb692 100644
> --- a/Documentation/security/keys/trusted-encrypted.rst
> +++ b/Documentation/security/keys/trusted-encrypted.rst
> @@ -35,6 +35,13 @@ safe.
> Rooted to Hardware Unique Key (HUK) which is generally burnt in on-chip
> fuses and is accessible to TEE only.
>
> + (3) CAAM (Cryptographic Acceleration and Assurance Module: IP on
> + NXP SoCs)
> +
> + When High Assurance Boot (HAB) is enabled and the CAAM is in secure
> + mode, trust is rooted to the OTPMK, a never-disclosed 256-bit key
> + randomly generated and fused into each SoC at manufacturing time.
> + Otherwise, a common fixed test key is used instead.
> +
> * Execution isolation
>
> (1) TPM
> @@ -46,6 +53,10 @@ safe.
> Customizable set of operations running in isolated execution
> environment verified via Secure/Trusted boot process.
>
> + (3) CAAM
> +
> + Fixed set of operations running in isolated execution environment.
> +
> * Optional binding to platform integrity state
>
> (1) TPM
> @@ -63,6 +74,11 @@ safe.
> Relies on Secure/Trusted boot process for platform integrity. It can
> be extended with TEE based measured boot process.
>
> + (3) CAAM
> +
> + Relies on the High Assurance Boot (HAB) mechanism of NXP SoCs
> + for platform integrity.
> +
> * Interfaces and APIs
>
> (1) TPM
> @@ -74,10 +90,13 @@ safe.
> TEEs have well-documented, standardized client interface and APIs. For
> more details refer to ``Documentation/staging/tee.rst``.
>
> + (3) CAAM
> +
> + Interface is specific to silicon vendor.
>
> * Threat model
>
> - The strength and appropriateness of a particular TPM or TEE for a given
> + The strength and appropriateness of a particular trust source for
> + a given
> purpose must be assessed when using them to protect security-relevant data.
>
>
> @@ -104,6 +123,12 @@ selected trust source:
> from platform specific hardware RNG or a software based Fortuna CSPRNG
> which can be seeded via multiple entropy sources.
>
> + * CAAM: Kernel RNG
> +
> + The normal kernel random number generator is used. To seed it from the
> + CAAM HWRNG, enable CRYPTO_DEV_FSL_CAAM_RNG_API and ensure the
> device
> + is probed.
> +
> Users may override this by specifying ``trusted.rng=kernel`` on the kernel
> command-line to override the used RNG with the kernel's random number pool.
>
> @@ -192,6 +217,19 @@ Usage::
> specific to TEE device implementation. The key length for new keys is always in
> bytes. Trusted Keys can be 32 - 128 bytes (256 - 1024 bits).
>
> +Trusted Keys usage: CAAM
> +------------------------
> +
> +Usage::
> +
> + keyctl add trusted name "new keylen" ring
> + keyctl add trusted name "load hex_blob" ring
> + keyctl print keyid
> +
> +"keyctl print" returns an ASCII hex copy of the sealed key, which is in
> +format specific to CAAM device implementation. The key length for new
> +keys is always in bytes. Trusted Keys can be 32 - 128 bytes (256 - 1024 bits).
> +
> Encrypted Keys usage
> --------------------
>
> diff --git a/MAINTAINERS b/MAINTAINERS
> index f670002134e0..6eca4476bb76 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -10655,6 +10655,15 @@ S: Supported
> F: include/keys/trusted_tee.h
> F: security/keys/trusted-keys/trusted_tee.c
>
> +KEYS-TRUSTED-CAAM
> +M: Ahmad Fatoum <[email protected]>
> +R: Pengutronix Kernel Team <[email protected]>
> +L: [email protected]
> +L: [email protected]
> +S: Maintained
> +F: include/keys/trusted_caam.h
> +F: security/keys/trusted-keys/trusted_caam.c
> +
> KEYS/KEYRINGS
> M: David Howells <[email protected]>
> M: Jarkko Sakkinen <[email protected]>
> diff --git a/include/keys/trusted_caam.h b/include/keys/trusted_caam.h new file
> mode 100644 index 000000000000..2fba0996b0b0
> --- /dev/null
> +++ b/include/keys/trusted_caam.h
> @@ -0,0 +1,11 @@
> +/* SPDX-License-Identifier: GPL-2.0-only */
> +/*
> + * Copyright (C) 2021 Pengutronix, Ahmad Fatoum <[email protected]>
> +*/
> +
> +#ifndef __CAAM_TRUSTED_KEY_H
> +#define __CAAM_TRUSTED_KEY_H
> +
> +extern struct trusted_key_ops caam_trusted_key_ops;
> +
> +#endif
> diff --git a/security/keys/trusted-keys/Kconfig b/security/keys/trusted-
> keys/Kconfig
> index fc4abd581abb..dbfdd8536468 100644
> --- a/security/keys/trusted-keys/Kconfig
> +++ b/security/keys/trusted-keys/Kconfig
> @@ -24,6 +24,15 @@ config TRUSTED_KEYS_TEE
> Enable use of the Trusted Execution Environment (TEE) as trusted
> key backend.
>
> -if !TRUSTED_KEYS_TPM && !TRUSTED_KEYS_TEE
> +config TRUSTED_KEYS_CAAM
> + bool "CAAM-based trusted keys"
> + depends on CRYPTO_DEV_FSL_CAAM_JR >= TRUSTED_KEYS
> + select CRYPTO_DEV_FSL_CAAM_BLOB_GEN
> + default y
> + help
> + Enable use of NXP's Cryptographic Accelerator and Assurance Module
> + (CAAM) as trusted key backend.
> +
> +if !TRUSTED_KEYS_TPM && !TRUSTED_KEYS_TEE && !TRUSTED_KEYS_CAAM
> comment "No trust source selected!"
> endif
> diff --git a/security/keys/trusted-keys/Makefile b/security/keys/trusted-
> keys/Makefile
> index 2e2371eae4d5..735aa0bc08ef 100644
> --- a/security/keys/trusted-keys/Makefile
> +++ b/security/keys/trusted-keys/Makefile
> @@ -12,3 +12,5 @@ trusted-$(CONFIG_TRUSTED_KEYS_TPM) +=
> trusted_tpm2.o
> trusted-$(CONFIG_TRUSTED_KEYS_TPM) += tpm2key.asn1.o
>
> trusted-$(CONFIG_TRUSTED_KEYS_TEE) += trusted_tee.o
> +
> +trusted-$(CONFIG_TRUSTED_KEYS_CAAM) += trusted_caam.o
> diff --git a/security/keys/trusted-keys/trusted_caam.c b/security/keys/trusted-
> keys/trusted_caam.c
> new file mode 100644
> index 000000000000..066f08d6eb2c
> --- /dev/null
> +++ b/security/keys/trusted-keys/trusted_caam.c
> @@ -0,0 +1,74 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +/*
> + * Copyright (C) 2021 Pengutronix, Ahmad Fatoum <[email protected]>
> +*/
> +
> +#include <keys/trusted_caam.h>
> +#include <keys/trusted-type.h>
> +#include <linux/build_bug.h>
> +#include <linux/key-type.h>
> +#include <soc/fsl/caam-blob.h>
> +
> +static struct caam_blob_priv *blobifier;
> +
> +#define KEYMOD "SECURE_KEY"
> +
> +static_assert(MAX_KEY_SIZE + CAAM_BLOB_OVERHEAD <=
> CAAM_BLOB_MAX_LEN);
> +static_assert(MAX_BLOB_SIZE <= CAAM_BLOB_MAX_LEN);
> +
> +static int trusted_caam_seal(struct trusted_key_payload *p, char
> +*datablob) {
> + int length = p->key_len + CAAM_BLOB_OVERHEAD;
> + int ret;
> +
> + ret = caam_encap_blob(blobifier, KEYMOD, p->key, p->blob, length);
> + if (ret)
> + return ret;
> +
> + p->blob_len = length;
> + return 0;
> +}
> +
> +static int trusted_caam_unseal(struct trusted_key_payload *p, char
> +*datablob) {
> + int length = p->blob_len;
> + int ret;
> +
> + ret = caam_decap_blob(blobifier, KEYMOD, p->blob, p->key, length);
> + if (ret)
> + return ret;
> +
> + p->key_len = length - CAAM_BLOB_OVERHEAD;
> + return 0;
> +}
> +
> +static int trusted_caam_init(void)
> +{
> + int ret;
> +
> + blobifier = caam_blob_gen_init();
> + if (IS_ERR(blobifier)) {
> + pr_err("Job Ring Device allocation for transform failed\n");
> + return PTR_ERR(blobifier);
> + }
> +
> + ret = register_key_type(&key_type_trusted);
> + if (ret)
> + caam_blob_gen_exit(blobifier);
> +
> + return ret;
> +}
> +
> +static void trusted_caam_exit(void)
> +{
> + unregister_key_type(&key_type_trusted);
> + caam_blob_gen_exit(blobifier);
> +}
> +
> +struct trusted_key_ops caam_trusted_key_ops = {
> + .migratable = 0, /* non-migratable */
> + .init = trusted_caam_init,
> + .seal = trusted_caam_seal,
> + .unseal = trusted_caam_unseal,
> + .exit = trusted_caam_exit,
> +};
> diff --git a/security/keys/trusted-keys/trusted_core.c b/security/keys/trusted-
> keys/trusted_core.c
> index 9235fb7d0ec9..640434cd437a 100644
> --- a/security/keys/trusted-keys/trusted_core.c
> +++ b/security/keys/trusted-keys/trusted_core.c
> @@ -9,6 +9,7 @@
> #include <keys/user-type.h>
> #include <keys/trusted-type.h>
> #include <keys/trusted_tee.h>
> +#include <keys/trusted_caam.h>
> #include <keys/trusted_tpm.h>
> #include <linux/capability.h>
> #include <linux/err.h>
> @@ -29,7 +30,7 @@ MODULE_PARM_DESC(rng, "Select trusted key RNG");
>
> static char *trusted_key_source;
> module_param_named(source, trusted_key_source, charp, 0); -
> MODULE_PARM_DESC(source, "Select trusted keys source (tpm or tee)");
> +MODULE_PARM_DESC(source, "Select trusted keys source (tpm, tee or
> +caam)");
>
> static const struct trusted_key_source trusted_key_sources[] = { #if
> defined(CONFIG_TRUSTED_KEYS_TPM) @@ -38,6 +39,9 @@ static const struct
> trusted_key_source trusted_key_sources[] = { #if
> defined(CONFIG_TRUSTED_KEYS_TEE)
> { "tee", &trusted_key_tee_ops }, #endif
> +#if defined(CONFIG_TRUSTED_KEYS_CAAM)
> + { "caam", &caam_trusted_key_ops }, #endif
> };
>
> DEFINE_STATIC_CALL_NULL(trusted_key_init, *trusted_key_sources[0].ops-
> >init);
> --
> 2.30.2
Reviewed-by: Pankaj Gupta <[email protected]>
> -----Original Message-----
> From: Ahmad Fatoum <[email protected]>
> Sent: Wednesday, February 23, 2022 1:28 AM
> To: Jonathan Corbet <[email protected]>; David Howells
> <[email protected]>; Jarkko Sakkinen <[email protected]>; James
> Bottomley <[email protected]>; Mimi Zohar <[email protected]>
> Cc: [email protected]; David Gstir <[email protected]>;
> [email protected]; Matthias Schiffer <[email protected]
> group.com>; Ahmad Fatoum <[email protected]>; James Morris
> <[email protected]>; Serge E. Hallyn <[email protected]>; Horia Geanta
> <[email protected]>; Aymen Sghaier <[email protected]>;
> Herbert Xu <[email protected]>; David S. Miller
> <[email protected]>; Eric Biggers <[email protected]>; Jan Luebbe
> <[email protected]>; Richard Weinberger <[email protected]>; Franck
> Lenormand <[email protected]>; Sumit Garg
> <[email protected]>; Pankaj Gupta <[email protected]>;
> [email protected]; [email protected]; linux-
> [email protected]; [email protected]; linux-
> [email protected]; [email protected]
> Subject: [EXT] [PATCH v5 5/5] KEYS: trusted: Introduce support for NXP
> CAAM-based trusted keys
>
> Caution: EXT Email
>
> The Cryptographic Acceleration and Assurance Module (CAAM) is an IP core
> built into many newer i.MX and QorIQ SoCs by NXP.
>
> The CAAM does crypto acceleration, hardware number generation and has a
> blob mechanism for encapsulation/decapsulation of sensitive material.
>
> This blob mechanism depends on a device specific random 256-bit One Time
> Programmable Master Key that is fused in each SoC at manufacturing time.
> This key is unreadable and can only be used by the CAAM for AES
> encryption/decryption of user data.
>
> This makes it a suitable backend (source) for kernel trusted keys.
>
> Previous commits generalized trusted keys to support multiple backends and
> added an API to access the CAAM blob mechanism. Based on these, provide
> the necessary glue to use the CAAM for trusted keys.
>
> Reviewed-by: David Gstir <[email protected]>
> Tested-By: Tim Harvey <[email protected]>
> Tested-by: Matthias Schiffer <[email protected]>
> Signed-off-by: Ahmad Fatoum <[email protected]>
> ---
> To: Jonathan Corbet <[email protected]>
> To: David Howells <[email protected]>
> To: Jarkko Sakkinen <[email protected]>
> To: James Bottomley <[email protected]>
> To: Mimi Zohar <[email protected]>
> Cc: James Morris <[email protected]>
> Cc: "Serge E. Hallyn" <[email protected]>
> Cc: "Horia Geantă" <[email protected]>
> Cc: Aymen Sghaier <[email protected]>
> Cc: Herbert Xu <[email protected]>
> Cc: "David S. Miller" <[email protected]>
> Cc: Eric Biggers <[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]
> Cc: [email protected]
> ---
> .../admin-guide/kernel-parameters.txt | 1 +
> .../security/keys/trusted-encrypted.rst | 40 +++++++++-
> MAINTAINERS | 9 +++
> include/keys/trusted_caam.h | 11 +++
> security/keys/trusted-keys/Kconfig | 11 ++-
> security/keys/trusted-keys/Makefile | 2 +
> security/keys/trusted-keys/trusted_caam.c | 74 +++++++++++++++++++
> security/keys/trusted-keys/trusted_core.c | 6 +-
> 8 files changed, 151 insertions(+), 3 deletions(-) create mode 100644
> include/keys/trusted_caam.h create mode 100644 security/keys/trusted-
> keys/trusted_caam.c
>
> diff --git a/Documentation/admin-guide/kernel-parameters.txt
> b/Documentation/admin-guide/kernel-parameters.txt
> index 844c883ca9d8..9e7ef4c6585d 100644
> --- a/Documentation/admin-guide/kernel-parameters.txt
> +++ b/Documentation/admin-guide/kernel-parameters.txt
> @@ -5875,6 +5875,7 @@
> sources:
> - "tpm"
> - "tee"
> + - "caam"
> If not specified then it defaults to iterating through
> the trust source list starting with TPM and assigns the
> first trust source as a backend which is initialized diff --git
> a/Documentation/security/keys/trusted-encrypted.rst
> b/Documentation/security/keys/trusted-encrypted.rst
> index 99cf34d7c025..ed60c48cb692 100644
> --- a/Documentation/security/keys/trusted-encrypted.rst
> +++ b/Documentation/security/keys/trusted-encrypted.rst
> @@ -35,6 +35,13 @@ safe.
> Rooted to Hardware Unique Key (HUK) which is generally burnt in on-
> chip
> fuses and is accessible to TEE only.
>
> + (3) CAAM (Cryptographic Acceleration and Assurance Module: IP on
> + NXP SoCs)
> +
> + When High Assurance Boot (HAB) is enabled and the CAAM is in secure
> + mode, trust is rooted to the OTPMK, a never-disclosed 256-bit key
> + randomly generated and fused into each SoC at manufacturing time.
> + Otherwise, a common fixed test key is used instead.
> +
> * Execution isolation
>
> (1) TPM
> @@ -46,6 +53,10 @@ safe.
> Customizable set of operations running in isolated execution
> environment verified via Secure/Trusted boot process.
>
> + (3) CAAM
> +
> + Fixed set of operations running in isolated execution environment.
> +
> * Optional binding to platform integrity state
>
> (1) TPM
> @@ -63,6 +74,11 @@ safe.
> Relies on Secure/Trusted boot process for platform integrity. It can
> be extended with TEE based measured boot process.
>
> + (3) CAAM
> +
> + Relies on the High Assurance Boot (HAB) mechanism of NXP SoCs
> + for platform integrity.
> +
> * Interfaces and APIs
>
> (1) TPM
> @@ -74,10 +90,13 @@ safe.
> TEEs have well-documented, standardized client interface and APIs. For
> more details refer to ``Documentation/staging/tee.rst``.
>
> + (3) CAAM
> +
> + Interface is specific to silicon vendor.
>
> * Threat model
>
> - The strength and appropriateness of a particular TPM or TEE for a given
> + The strength and appropriateness of a particular trust source for
> + a given
> purpose must be assessed when using them to protect security-relevant
> data.
>
>
> @@ -104,6 +123,12 @@ selected trust source:
> from platform specific hardware RNG or a software based Fortuna
> CSPRNG
> which can be seeded via multiple entropy sources.
>
> + * CAAM: Kernel RNG
> +
> + The normal kernel random number generator is used. To seed it from the
> + CAAM HWRNG, enable CRYPTO_DEV_FSL_CAAM_RNG_API and ensure
> the device
> + is probed.
> +
> Users may override this by specifying ``trusted.rng=kernel`` on the kernel
> command-line to override the used RNG with the kernel's random number
> pool.
>
> @@ -192,6 +217,19 @@ Usage::
> specific to TEE device implementation. The key length for new keys is always
> in bytes. Trusted Keys can be 32 - 128 bytes (256 - 1024 bits).
>
> +Trusted Keys usage: CAAM
> +------------------------
> +
> +Usage::
> +
> + keyctl add trusted name "new keylen" ring
> + keyctl add trusted name "load hex_blob" ring
> + keyctl print keyid
> +
> +"keyctl print" returns an ASCII hex copy of the sealed key, which is in
> +format specific to CAAM device implementation. The key length for new
> +keys is always in bytes. Trusted Keys can be 32 - 128 bytes (256 - 1024 bits).
> +
> Encrypted Keys usage
> --------------------
>
> diff --git a/MAINTAINERS b/MAINTAINERS
> index f670002134e0..6eca4476bb76 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -10655,6 +10655,15 @@ S: Supported
> F: include/keys/trusted_tee.h
> F: security/keys/trusted-keys/trusted_tee.c
>
> +KEYS-TRUSTED-CAAM
> +M: Ahmad Fatoum <[email protected]>
> +R: Pengutronix Kernel Team <[email protected]>
> +L: [email protected]
> +L: [email protected]
> +S: Maintained
> +F: include/keys/trusted_caam.h
> +F: security/keys/trusted-keys/trusted_caam.c
> +
> KEYS/KEYRINGS
> M: David Howells <[email protected]>
> M: Jarkko Sakkinen <[email protected]>
> diff --git a/include/keys/trusted_caam.h b/include/keys/trusted_caam.h
> new file mode 100644 index 000000000000..2fba0996b0b0
> --- /dev/null
> +++ b/include/keys/trusted_caam.h
> @@ -0,0 +1,11 @@
> +/* SPDX-License-Identifier: GPL-2.0-only */
> +/*
> + * Copyright (C) 2021 Pengutronix, Ahmad Fatoum <[email protected]>
> +*/
> +
> +#ifndef __CAAM_TRUSTED_KEY_H
> +#define __CAAM_TRUSTED_KEY_H
> +
> +extern struct trusted_key_ops caam_trusted_key_ops;
> +
> +#endif
> diff --git a/security/keys/trusted-keys/Kconfig b/security/keys/trusted-
> keys/Kconfig
> index fc4abd581abb..dbfdd8536468 100644
> --- a/security/keys/trusted-keys/Kconfig
> +++ b/security/keys/trusted-keys/Kconfig
> @@ -24,6 +24,15 @@ config TRUSTED_KEYS_TEE
> Enable use of the Trusted Execution Environment (TEE) as trusted
> key backend.
>
> -if !TRUSTED_KEYS_TPM && !TRUSTED_KEYS_TEE
> +config TRUSTED_KEYS_CAAM
> + bool "CAAM-based trusted keys"
> + depends on CRYPTO_DEV_FSL_CAAM_JR >= TRUSTED_KEYS
> + select CRYPTO_DEV_FSL_CAAM_BLOB_GEN
> + default y
> + help
> + Enable use of NXP's Cryptographic Accelerator and Assurance Module
> + (CAAM) as trusted key backend.
> +
> +if !TRUSTED_KEYS_TPM && !TRUSTED_KEYS_TEE
> && !TRUSTED_KEYS_CAAM
> comment "No trust source selected!"
> endif
> diff --git a/security/keys/trusted-keys/Makefile b/security/keys/trusted-
> keys/Makefile
> index 2e2371eae4d5..735aa0bc08ef 100644
> --- a/security/keys/trusted-keys/Makefile
> +++ b/security/keys/trusted-keys/Makefile
> @@ -12,3 +12,5 @@ trusted-$(CONFIG_TRUSTED_KEYS_TPM) +=
> trusted_tpm2.o
> trusted-$(CONFIG_TRUSTED_KEYS_TPM) += tpm2key.asn1.o
>
> trusted-$(CONFIG_TRUSTED_KEYS_TEE) += trusted_tee.o
> +
> +trusted-$(CONFIG_TRUSTED_KEYS_CAAM) += trusted_caam.o
> diff --git a/security/keys/trusted-keys/trusted_caam.c
> b/security/keys/trusted-keys/trusted_caam.c
> new file mode 100644
> index 000000000000..066f08d6eb2c
> --- /dev/null
> +++ b/security/keys/trusted-keys/trusted_caam.c
> @@ -0,0 +1,74 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +/*
> + * Copyright (C) 2021 Pengutronix, Ahmad Fatoum <[email protected]>
> +*/
> +
> +#include <keys/trusted_caam.h>
> +#include <keys/trusted-type.h>
> +#include <linux/build_bug.h>
> +#include <linux/key-type.h>
> +#include <soc/fsl/caam-blob.h>
> +
> +static struct caam_blob_priv *blobifier;
> +
> +#define KEYMOD "SECURE_KEY"
> +
> +static_assert(MAX_KEY_SIZE + CAAM_BLOB_OVERHEAD <=
> CAAM_BLOB_MAX_LEN);
> +static_assert(MAX_BLOB_SIZE <= CAAM_BLOB_MAX_LEN);
> +
> +static int trusted_caam_seal(struct trusted_key_payload *p, char
> +*datablob) {
> + int length = p->key_len + CAAM_BLOB_OVERHEAD;
> + int ret;
> +
> + ret = caam_encap_blob(blobifier, KEYMOD, p->key, p->blob, length);
> + if (ret)
> + return ret;
> +
> + p->blob_len = length;
> + return 0;
> +}
> +
> +static int trusted_caam_unseal(struct trusted_key_payload *p, char
> +*datablob) {
> + int length = p->blob_len;
> + int ret;
> +
> + ret = caam_decap_blob(blobifier, KEYMOD, p->blob, p->key, length);
> + if (ret)
> + return ret;
> +
> + p->key_len = length - CAAM_BLOB_OVERHEAD;
> + return 0;
> +}
> +
> +static int trusted_caam_init(void)
> +{
> + int ret;
> +
> + blobifier = caam_blob_gen_init();
> + if (IS_ERR(blobifier)) {
> + pr_err("Job Ring Device allocation for transform failed\n");
> + return PTR_ERR(blobifier);
> + }
> +
> + ret = register_key_type(&key_type_trusted);
> + if (ret)
> + caam_blob_gen_exit(blobifier);
> +
> + return ret;
> +}
> +
> +static void trusted_caam_exit(void)
> +{
> + unregister_key_type(&key_type_trusted);
> + caam_blob_gen_exit(blobifier);
> +}
> +
> +struct trusted_key_ops caam_trusted_key_ops = {
> + .migratable = 0, /* non-migratable */
> + .init = trusted_caam_init,
> + .seal = trusted_caam_seal,
> + .unseal = trusted_caam_unseal,
> + .exit = trusted_caam_exit,
> +};
> diff --git a/security/keys/trusted-keys/trusted_core.c
> b/security/keys/trusted-keys/trusted_core.c
> index 9235fb7d0ec9..640434cd437a 100644
> --- a/security/keys/trusted-keys/trusted_core.c
> +++ b/security/keys/trusted-keys/trusted_core.c
> @@ -9,6 +9,7 @@
> #include <keys/user-type.h>
> #include <keys/trusted-type.h>
> #include <keys/trusted_tee.h>
> +#include <keys/trusted_caam.h>
> #include <keys/trusted_tpm.h>
> #include <linux/capability.h>
> #include <linux/err.h>
> @@ -29,7 +30,7 @@ MODULE_PARM_DESC(rng, "Select trusted key RNG");
>
> static char *trusted_key_source;
> module_param_named(source, trusted_key_source, charp, 0); -
> MODULE_PARM_DESC(source, "Select trusted keys source (tpm or tee)");
> +MODULE_PARM_DESC(source, "Select trusted keys source (tpm, tee or
> +caam)");
>
> static const struct trusted_key_source trusted_key_sources[] = { #if
> defined(CONFIG_TRUSTED_KEYS_TPM) @@ -38,6 +39,9 @@ static const
> struct trusted_key_source trusted_key_sources[] = { #if
> defined(CONFIG_TRUSTED_KEYS_TEE)
> { "tee", &trusted_key_tee_ops }, #endif
> +#if defined(CONFIG_TRUSTED_KEYS_CAAM)
> + { "caam", &caam_trusted_key_ops }, #endif
> };
>
> DEFINE_STATIC_CALL_NULL(trusted_key_init,
> *trusted_key_sources[0].ops->init);
> --
> 2.30.2
Tested-by: Pankaj Gupta <[email protected]>
Testing Details with iMX8 platform:
- Using command "keyctl", successfully able to create/load key from the @s keyring.
- Able to use the key with DM-Crypt utility.
- Across power cycle, Validated the decrypted content with correct key; as well as the incorrect key.
Regards
Pankaj
> -----Original Message-----
> From: Pankaj Gupta <[email protected]>
> Sent: Wednesday, March 2, 2022 10:08 AM
> To: Ahmad Fatoum <[email protected]>; Jonathan Corbet
> <[email protected]>; David Howells <[email protected]>; Jarkko Sakkinen
> <[email protected]>; James Bottomley <[email protected]>; Mimi Zohar
> <[email protected]>
> Cc: [email protected]; David Gstir <[email protected]>;
> [email protected]; Matthias Schiffer <[email protected]
> group.com>; James Morris <[email protected]>; Serge E. Hallyn
> <[email protected]>; Horia Geanta <[email protected]>; Aymen
> Sghaier <[email protected]>; Herbert Xu
> <[email protected]>; David S. Miller <[email protected]>;
> Eric Biggers <[email protected]>; Jan Luebbe <[email protected]>;
> Richard Weinberger <[email protected]>; Franck Lenormand
> <[email protected]>; Sumit Garg <[email protected]>;
> [email protected]; [email protected]; linux-
> [email protected]; [email protected]; linux-
> [email protected]; [email protected]
> Subject: RE: [EXT] [PATCH v5 5/5] KEYS: trusted: Introduce support for NXP
> CAAM-based trusted keys
>
> Caution: EXT Email
>
> Reviewed-by: Pankaj Gupta <[email protected]>
>
> > -----Original Message-----
> > From: Ahmad Fatoum <[email protected]>
> > Sent: Wednesday, February 23, 2022 1:28 AM
> > To: Jonathan Corbet <[email protected]>; David Howells
> > <[email protected]>; Jarkko Sakkinen <[email protected]>; James
> > Bottomley <[email protected]>; Mimi Zohar <[email protected]>
> > Cc: [email protected]; David Gstir <[email protected]>;
> > [email protected]; Matthias Schiffer <[email protected]
> > group.com>; Ahmad Fatoum <[email protected]>; James Morris
> > <[email protected]>; Serge E. Hallyn <[email protected]>; Horia Geanta
> > <[email protected]>; Aymen Sghaier <[email protected]>;
> Herbert
> > Xu <[email protected]>; David S. Miller
> > <[email protected]>; Eric Biggers <[email protected]>; Jan Luebbe
> > <[email protected]>; Richard Weinberger <[email protected]>;
> Franck
> > Lenormand <[email protected]>; Sumit Garg
> > <[email protected]>; Pankaj Gupta <[email protected]>;
> > [email protected]; [email protected]; linux-
> > [email protected]; [email protected]; linux-
> > [email protected]; [email protected]
> > Subject: [EXT] [PATCH v5 5/5] KEYS: trusted: Introduce support for NXP
> > CAAM-based trusted keys
> >
> > Caution: EXT Email
> >
> > The Cryptographic Acceleration and Assurance Module (CAAM) is an IP
> > core built into many newer i.MX and QorIQ SoCs by NXP.
> >
> > The CAAM does crypto acceleration, hardware number generation and has
> > a blob mechanism for encapsulation/decapsulation of sensitive material.
> >
> > This blob mechanism depends on a device specific random 256-bit One
> > Time Programmable Master Key that is fused in each SoC at manufacturing
> time.
> > This key is unreadable and can only be used by the CAAM for AES
> > encryption/decryption of user data.
> >
> > This makes it a suitable backend (source) for kernel trusted keys.
> >
> > Previous commits generalized trusted keys to support multiple backends
> > and added an API to access the CAAM blob mechanism. Based on these,
> > provide the necessary glue to use the CAAM for trusted keys.
> >
> > Reviewed-by: David Gstir <[email protected]>
> > Tested-By: Tim Harvey <[email protected]>
> > Tested-by: Matthias Schiffer <[email protected]>
> > Signed-off-by: Ahmad Fatoum <[email protected]>
> > ---
> > To: Jonathan Corbet <[email protected]>
> > To: David Howells <[email protected]>
> > To: Jarkko Sakkinen <[email protected]>
> > To: James Bottomley <[email protected]>
> > To: Mimi Zohar <[email protected]>
> > Cc: James Morris <[email protected]>
> > Cc: "Serge E. Hallyn" <[email protected]>
> > Cc: "Horia Geantă" <[email protected]>
> > Cc: Aymen Sghaier <[email protected]>
> > Cc: Herbert Xu <[email protected]>
> > Cc: "David S. Miller" <[email protected]>
> > Cc: Eric Biggers <[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]
> > Cc: [email protected]
> > ---
> > .../admin-guide/kernel-parameters.txt | 1 +
> > .../security/keys/trusted-encrypted.rst | 40 +++++++++-
> > MAINTAINERS | 9 +++
> > include/keys/trusted_caam.h | 11 +++
> > security/keys/trusted-keys/Kconfig | 11 ++-
> > security/keys/trusted-keys/Makefile | 2 +
> > security/keys/trusted-keys/trusted_caam.c | 74
> +++++++++++++++++++
> > security/keys/trusted-keys/trusted_core.c | 6 +-
> > 8 files changed, 151 insertions(+), 3 deletions(-) create mode
> > 100644 include/keys/trusted_caam.h create mode 100644
> > security/keys/trusted- keys/trusted_caam.c
> >
> > diff --git a/Documentation/admin-guide/kernel-parameters.txt
> > b/Documentation/admin-guide/kernel-parameters.txt
> > index 844c883ca9d8..9e7ef4c6585d 100644
> > --- a/Documentation/admin-guide/kernel-parameters.txt
> > +++ b/Documentation/admin-guide/kernel-parameters.txt
> > @@ -5875,6 +5875,7 @@
> > sources:
> > - "tpm"
> > - "tee"
> > + - "caam"
> > If not specified then it defaults to iterating through
> > the trust source list starting with TPM and assigns the
> > first trust source as a backend which is
> > initialized diff --git
> > a/Documentation/security/keys/trusted-encrypted.rst
> > b/Documentation/security/keys/trusted-encrypted.rst
> > index 99cf34d7c025..ed60c48cb692 100644
> > --- a/Documentation/security/keys/trusted-encrypted.rst
> > +++ b/Documentation/security/keys/trusted-encrypted.rst
> > @@ -35,6 +35,13 @@ safe.
> > Rooted to Hardware Unique Key (HUK) which is generally burnt
> > in on- chip
> > fuses and is accessible to TEE only.
> >
> > + (3) CAAM (Cryptographic Acceleration and Assurance Module: IP on
> > + NXP SoCs)
> > +
> > + When High Assurance Boot (HAB) is enabled and the CAAM is in
> secure
> > + mode, trust is rooted to the OTPMK, a never-disclosed 256-bit key
> > + randomly generated and fused into each SoC at manufacturing time.
> > + Otherwise, a common fixed test key is used instead.
> > +
> > * Execution isolation
> >
> > (1) TPM
> > @@ -46,6 +53,10 @@ safe.
> > Customizable set of operations running in isolated execution
> > environment verified via Secure/Trusted boot process.
> >
> > + (3) CAAM
> > +
> > + Fixed set of operations running in isolated execution environment.
> > +
> > * Optional binding to platform integrity state
> >
> > (1) TPM
> > @@ -63,6 +74,11 @@ safe.
> > Relies on Secure/Trusted boot process for platform integrity. It can
> > be extended with TEE based measured boot process.
> >
> > + (3) CAAM
> > +
> > + Relies on the High Assurance Boot (HAB) mechanism of NXP SoCs
> > + for platform integrity.
> > +
> > * Interfaces and APIs
> >
> > (1) TPM
> > @@ -74,10 +90,13 @@ safe.
> > TEEs have well-documented, standardized client interface and APIs.
> For
> > more details refer to ``Documentation/staging/tee.rst``.
> >
> > + (3) CAAM
> > +
> > + Interface is specific to silicon vendor.
> >
> > * Threat model
> >
> > - The strength and appropriateness of a particular TPM or TEE for a given
> > + The strength and appropriateness of a particular trust source
> > + for a given
> > purpose must be assessed when using them to protect
> > security-relevant data.
> >
> >
> > @@ -104,6 +123,12 @@ selected trust source:
> > from platform specific hardware RNG or a software based Fortuna
> > CSPRNG
> > which can be seeded via multiple entropy sources.
> >
> > + * CAAM: Kernel RNG
> > +
> > + The normal kernel random number generator is used. To seed it from
> the
> > + CAAM HWRNG, enable CRYPTO_DEV_FSL_CAAM_RNG_API and
> ensure
> > the device
> > + is probed.
> > +
> > Users may override this by specifying ``trusted.rng=kernel`` on the
> > kernel command-line to override the used RNG with the kernel's random
> > number pool.
> >
> > @@ -192,6 +217,19 @@ Usage::
> > specific to TEE device implementation. The key length for new keys
> > is always in bytes. Trusted Keys can be 32 - 128 bytes (256 - 1024 bits).
> >
> > +Trusted Keys usage: CAAM
> > +------------------------
> > +
> > +Usage::
> > +
> > + keyctl add trusted name "new keylen" ring
> > + keyctl add trusted name "load hex_blob" ring
> > + keyctl print keyid
> > +
> > +"keyctl print" returns an ASCII hex copy of the sealed key, which is
> > +in format specific to CAAM device implementation. The key length for
> > +new keys is always in bytes. Trusted Keys can be 32 - 128 bytes (256 - 1024
> bits).
> > +
> > Encrypted Keys usage
> > --------------------
> >
> > diff --git a/MAINTAINERS b/MAINTAINERS index
> > f670002134e0..6eca4476bb76 100644
> > --- a/MAINTAINERS
> > +++ b/MAINTAINERS
> > @@ -10655,6 +10655,15 @@ S: Supported
> > F: include/keys/trusted_tee.h
> > F: security/keys/trusted-keys/trusted_tee.c
> >
> > +KEYS-TRUSTED-CAAM
> > +M: Ahmad Fatoum <[email protected]>
> > +R: Pengutronix Kernel Team <[email protected]>
> > +L: [email protected]
> > +L: [email protected]
> > +S: Maintained
> > +F: include/keys/trusted_caam.h
> > +F: security/keys/trusted-keys/trusted_caam.c
> > +
> > KEYS/KEYRINGS
> > M: David Howells <[email protected]>
> > M: Jarkko Sakkinen <[email protected]>
> > diff --git a/include/keys/trusted_caam.h b/include/keys/trusted_caam.h
> > new file mode 100644 index 000000000000..2fba0996b0b0
> > --- /dev/null
> > +++ b/include/keys/trusted_caam.h
> > @@ -0,0 +1,11 @@
> > +/* SPDX-License-Identifier: GPL-2.0-only */
> > +/*
> > + * Copyright (C) 2021 Pengutronix, Ahmad Fatoum
> > +<[email protected]> */
> > +
> > +#ifndef __CAAM_TRUSTED_KEY_H
> > +#define __CAAM_TRUSTED_KEY_H
> > +
> > +extern struct trusted_key_ops caam_trusted_key_ops;
> > +
> > +#endif
> > diff --git a/security/keys/trusted-keys/Kconfig
> > b/security/keys/trusted- keys/Kconfig index fc4abd581abb..dbfdd8536468
> > 100644
> > --- a/security/keys/trusted-keys/Kconfig
> > +++ b/security/keys/trusted-keys/Kconfig
> > @@ -24,6 +24,15 @@ config TRUSTED_KEYS_TEE
> > Enable use of the Trusted Execution Environment (TEE) as trusted
> > key backend.
> >
> > -if !TRUSTED_KEYS_TPM && !TRUSTED_KEYS_TEE
> > +config TRUSTED_KEYS_CAAM
> > + bool "CAAM-based trusted keys"
> > + depends on CRYPTO_DEV_FSL_CAAM_JR >= TRUSTED_KEYS
> > + select CRYPTO_DEV_FSL_CAAM_BLOB_GEN
> > + default y
> > + help
> > + Enable use of NXP's Cryptographic Accelerator and Assurance Module
> > + (CAAM) as trusted key backend.
> > +
> > +if !TRUSTED_KEYS_TPM && !TRUSTED_KEYS_TEE
> > && !TRUSTED_KEYS_CAAM
> > comment "No trust source selected!"
> > endif
> > diff --git a/security/keys/trusted-keys/Makefile
> > b/security/keys/trusted- keys/Makefile index
> > 2e2371eae4d5..735aa0bc08ef 100644
> > --- a/security/keys/trusted-keys/Makefile
> > +++ b/security/keys/trusted-keys/Makefile
> > @@ -12,3 +12,5 @@ trusted-$(CONFIG_TRUSTED_KEYS_TPM) +=
> trusted_tpm2.o
> > trusted-$(CONFIG_TRUSTED_KEYS_TPM) += tpm2key.asn1.o
> >
> > trusted-$(CONFIG_TRUSTED_KEYS_TEE) += trusted_tee.o
> > +
> > +trusted-$(CONFIG_TRUSTED_KEYS_CAAM) += trusted_caam.o
> > diff --git a/security/keys/trusted-keys/trusted_caam.c
> > b/security/keys/trusted-keys/trusted_caam.c
> > new file mode 100644
> > index 000000000000..066f08d6eb2c
> > --- /dev/null
> > +++ b/security/keys/trusted-keys/trusted_caam.c
> > @@ -0,0 +1,74 @@
> > +// SPDX-License-Identifier: GPL-2.0-only
> > +/*
> > + * Copyright (C) 2021 Pengutronix, Ahmad Fatoum
> > +<[email protected]> */
> > +
> > +#include <keys/trusted_caam.h>
> > +#include <keys/trusted-type.h>
> > +#include <linux/build_bug.h>
> > +#include <linux/key-type.h>
> > +#include <soc/fsl/caam-blob.h>
> > +
> > +static struct caam_blob_priv *blobifier;
> > +
> > +#define KEYMOD "SECURE_KEY"
> > +
> > +static_assert(MAX_KEY_SIZE + CAAM_BLOB_OVERHEAD <=
> > CAAM_BLOB_MAX_LEN);
> > +static_assert(MAX_BLOB_SIZE <= CAAM_BLOB_MAX_LEN);
> > +
> > +static int trusted_caam_seal(struct trusted_key_payload *p, char
> > +*datablob) {
> > + int length = p->key_len + CAAM_BLOB_OVERHEAD;
> > + int ret;
> > +
> > + ret = caam_encap_blob(blobifier, KEYMOD, p->key, p->blob, length);
> > + if (ret)
> > + return ret;
> > +
> > + p->blob_len = length;
> > + return 0;
> > +}
> > +
> > +static int trusted_caam_unseal(struct trusted_key_payload *p, char
> > +*datablob) {
> > + int length = p->blob_len;
> > + int ret;
> > +
> > + ret = caam_decap_blob(blobifier, KEYMOD, p->blob, p->key, length);
> > + if (ret)
> > + return ret;
> > +
> > + p->key_len = length - CAAM_BLOB_OVERHEAD;
> > + return 0;
> > +}
> > +
> > +static int trusted_caam_init(void)
> > +{
> > + int ret;
> > +
> > + blobifier = caam_blob_gen_init();
> > + if (IS_ERR(blobifier)) {
> > + pr_err("Job Ring Device allocation for transform failed\n");
> > + return PTR_ERR(blobifier);
> > + }
> > +
> > + ret = register_key_type(&key_type_trusted);
> > + if (ret)
> > + caam_blob_gen_exit(blobifier);
> > +
> > + return ret;
> > +}
> > +
> > +static void trusted_caam_exit(void)
> > +{
> > + unregister_key_type(&key_type_trusted);
> > + caam_blob_gen_exit(blobifier); }
> > +
> > +struct trusted_key_ops caam_trusted_key_ops = {
> > + .migratable = 0, /* non-migratable */
> > + .init = trusted_caam_init,
> > + .seal = trusted_caam_seal,
> > + .unseal = trusted_caam_unseal,
> > + .exit = trusted_caam_exit,
> > +};
> > diff --git a/security/keys/trusted-keys/trusted_core.c
> > b/security/keys/trusted-keys/trusted_core.c
> > index 9235fb7d0ec9..640434cd437a 100644
> > --- a/security/keys/trusted-keys/trusted_core.c
> > +++ b/security/keys/trusted-keys/trusted_core.c
> > @@ -9,6 +9,7 @@
> > #include <keys/user-type.h>
> > #include <keys/trusted-type.h>
> > #include <keys/trusted_tee.h>
> > +#include <keys/trusted_caam.h>
> > #include <keys/trusted_tpm.h>
> > #include <linux/capability.h>
> > #include <linux/err.h>
> > @@ -29,7 +30,7 @@ MODULE_PARM_DESC(rng, "Select trusted key RNG");
> >
> > static char *trusted_key_source;
> > module_param_named(source, trusted_key_source, charp, 0); -
> > MODULE_PARM_DESC(source, "Select trusted keys source (tpm or tee)");
> > +MODULE_PARM_DESC(source, "Select trusted keys source (tpm, tee or
> > +caam)");
> >
> > static const struct trusted_key_source trusted_key_sources[] = { #if
> > defined(CONFIG_TRUSTED_KEYS_TPM) @@ -38,6 +39,9 @@ static const
> struct
> > trusted_key_source trusted_key_sources[] = { #if
> > defined(CONFIG_TRUSTED_KEYS_TEE)
> > { "tee", &trusted_key_tee_ops }, #endif
> > +#if defined(CONFIG_TRUSTED_KEYS_CAAM)
> > + { "caam", &caam_trusted_key_ops }, #endif
> > };
> >
> > DEFINE_STATIC_CALL_NULL(trusted_key_init,
> > *trusted_key_sources[0].ops->init);
> > --
> > 2.30.2