]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
crypto: caam - warn if blob_gen key is insecure
authorNikolaus Voss <nikolaus.voss@haag-streit.com>
Mon, 21 Nov 2022 14:12:41 +0000 (15:12 +0100)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 2 Dec 2022 10:12:39 +0000 (18:12 +0800)
If CAAM is not in "trusted" or "secure" state, a fixed non-volatile key
is used instead of the unique device key. This is the default mode of
operation without secure boot (HAB). In this scenario, CAAM encrypted
blobs should be used only for testing but not in a production
environment, so issue a warning.

Signed-off-by: Nikolaus Voss <nikolaus.voss@haag-streit.com>
Reviewed-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/caam/blob_gen.c
drivers/crypto/caam/regs.h

index 6345c7269eb030393dc45459786d21bb948e176f..1f65df48984783a992d8e6d77dcdd7e6d803ff0d 100644 (file)
@@ -6,6 +6,7 @@
 
 #define pr_fmt(fmt) "caam blob_gen: " fmt
 
+#include <linux/bitfield.h>
 #include <linux/device.h>
 #include <soc/fsl/caam-blob.h>
 
@@ -61,12 +62,14 @@ static void caam_blob_job_done(struct device *dev, u32 *desc, u32 err, void *con
 int caam_process_blob(struct caam_blob_priv *priv,
                      struct caam_blob_info *info, bool encap)
 {
+       const struct caam_drv_private *ctrlpriv;
        struct caam_blob_job_result testres;
        struct device *jrdev = &priv->jrdev;
        dma_addr_t dma_in, dma_out;
        int op = OP_PCLID_BLOB;
        size_t output_len;
        u32 *desc;
+       u32 moo;
        int ret;
 
        if (info->key_mod_len > CAAM_BLOB_KEYMOD_LENGTH)
@@ -100,6 +103,12 @@ int caam_process_blob(struct caam_blob_priv *priv,
                goto out_unmap_in;
        }
 
+       ctrlpriv = dev_get_drvdata(jrdev->parent);
+       moo = FIELD_GET(CSTA_MOO, ioread32(&ctrlpriv->ctrl->perfmon.status));
+       if (moo != CSTA_MOO_SECURE && moo != CSTA_MOO_TRUSTED)
+               dev_warn(jrdev,
+                        "using insecure test key, enable HAB to use unique device key!\n");
+
        /*
         * A data blob is encrypted using a blob key (BK); a random number.
         * The BK is used as an AES-CCM key. The initial block (B0) and the
index 66d6dad841bb2aa5d4f2871c4dfe990cbd9e60f0..66928f8a0c4b1e8baa4507eb70a1b5e6bce41c33 100644 (file)
@@ -426,6 +426,9 @@ struct caam_perfmon {
        u32 rsvd2;
 #define CSTA_PLEND             BIT(10)
 #define CSTA_ALT_PLEND         BIT(18)
+#define CSTA_MOO               GENMASK(9, 8)
+#define CSTA_MOO_SECURE        1
+#define CSTA_MOO_TRUSTED       2
        u32 status;             /* CSTA - CAAM Status */
        u64 rsvd3;