]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
crypto: crypto4xx - Remove insecure and unused rng_alg
authorEric Biggers <ebiggers@kernel.org>
Fri, 29 May 2026 22:04:30 +0000 (15:04 -0700)
committerHerbert Xu <herbert@gondor.apana.org.au>
Thu, 11 Jun 2026 05:53:59 +0000 (13:53 +0800)
Remove crypto4xx_rng, as it is insecure and unused:

- It has only a 64-bit security strength, which is highly inadequate.
  This can be seen by the fact that crypto4xx_hw_init() seeds it with
  only 64 bits of entropy, and the fact that the original commit
  mentions that it implements ANSI X9.17 Annex C.

  Another issue was that this driver didn't implement the crypto_rng API
  correctly, as crypto4xx_prng_generate() didn't return 0 on success.

- No user of this code is known.  It's usable only theoretically via the
  "rng" algorithm type of AF_ALG.  But userspace actually just uses the
  actual Linux RNG (/dev/random etc) instead.  And rng_algs don't
  contribute entropy to the actual Linux RNG either.  (This may have
  been confused with hwrng, which does contribute entropy.)

Fixes: d072bfa48853 ("crypto: crypto4xx - add prng crypto support")
Cc: stable@vger.kernel.org
Signed-off-by: Eric Biggers <ebiggers@kernel.org>
Acked-by: Christian Lamparter <chunkeey@gmail.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/Kconfig
drivers/crypto/amcc/crypto4xx_core.c
drivers/crypto/amcc/crypto4xx_core.h
drivers/crypto/amcc/crypto4xx_reg_def.h

index 3449b3c9c6adfdaf1ab5740d6b3542c39c7d5745..5dab813a9f74fa3c228298a9b231e79e132138cf 100644 (file)
@@ -301,7 +301,6 @@ config CRYPTO_DEV_PPC4XX
        select CRYPTO_CCM
        select CRYPTO_CTR
        select CRYPTO_GCM
-       select CRYPTO_RNG
        select CRYPTO_SKCIPHER
        help
          This option allows you to have support for AMCC crypto acceleration.
index b7b6c97d2147bef05291a3716172eb903f72c5fe..68c5ff7a85b4f9934cfc6e61714e1520317bc0c8 100644 (file)
 #include <crypto/ctr.h>
 #include <crypto/gcm.h>
 #include <crypto/sha1.h>
-#include <crypto/rng.h>
 #include <crypto/scatterwalk.h>
 #include <crypto/skcipher.h>
 #include <crypto/internal/aead.h>
-#include <crypto/internal/rng.h>
 #include <crypto/internal/skcipher.h>
 #include "crypto4xx_reg_def.h"
 #include "crypto4xx_core.h"
@@ -985,10 +983,6 @@ static int crypto4xx_register_alg(struct crypto4xx_device *sec_dev,
                        rc = crypto_register_aead(&alg->alg.u.aead);
                        break;
 
-               case CRYPTO_ALG_TYPE_RNG:
-                       rc = crypto_register_rng(&alg->alg.u.rng);
-                       break;
-
                default:
                        rc = crypto_register_skcipher(&alg->alg.u.cipher);
                        break;
@@ -1014,10 +1008,6 @@ static void crypto4xx_unregister_alg(struct crypto4xx_device *sec_dev)
                        crypto_unregister_aead(&alg->alg.u.aead);
                        break;
 
-               case CRYPTO_ALG_TYPE_RNG:
-                       crypto_unregister_rng(&alg->alg.u.rng);
-                       break;
-
                default:
                        crypto_unregister_skcipher(&alg->alg.u.cipher);
                }
@@ -1076,69 +1066,6 @@ static irqreturn_t crypto4xx_ce_interrupt_handler_revb(int irq, void *data)
                PPC4XX_TMO_ERR_INT);
 }
 
-static int ppc4xx_prng_data_read(struct crypto4xx_device *dev,
-                                u8 *data, unsigned int max)
-{
-       unsigned int i, curr = 0;
-       u32 val[2];
-
-       do {
-               /* trigger PRN generation */
-               writel(PPC4XX_PRNG_CTRL_AUTO_EN,
-                      dev->ce_base + CRYPTO4XX_PRNG_CTRL);
-
-               for (i = 0; i < 1024; i++) {
-                       /* usually 19 iterations are enough */
-                       if ((readl(dev->ce_base + CRYPTO4XX_PRNG_STAT) &
-                            CRYPTO4XX_PRNG_STAT_BUSY))
-                               continue;
-
-                       val[0] = readl_be(dev->ce_base + CRYPTO4XX_PRNG_RES_0);
-                       val[1] = readl_be(dev->ce_base + CRYPTO4XX_PRNG_RES_1);
-                       break;
-               }
-               if (i == 1024)
-                       return -ETIMEDOUT;
-
-               if ((max - curr) >= 8) {
-                       memcpy(data, &val, 8);
-                       data += 8;
-                       curr += 8;
-               } else {
-                       /* copy only remaining bytes */
-                       memcpy(data, &val, max - curr);
-                       break;
-               }
-       } while (curr < max);
-
-       return curr;
-}
-
-static int crypto4xx_prng_generate(struct crypto_rng *tfm,
-                                  const u8 *src, unsigned int slen,
-                                  u8 *dstn, unsigned int dlen)
-{
-       struct rng_alg *alg = crypto_rng_alg(tfm);
-       struct crypto4xx_alg *amcc_alg;
-       struct crypto4xx_device *dev;
-       int ret;
-
-       amcc_alg = container_of(alg, struct crypto4xx_alg, alg.u.rng);
-       dev = amcc_alg->dev;
-
-       mutex_lock(&dev->core_dev->rng_lock);
-       ret = ppc4xx_prng_data_read(dev, dstn, dlen);
-       mutex_unlock(&dev->core_dev->rng_lock);
-       return ret;
-}
-
-
-static int crypto4xx_prng_seed(struct crypto_rng *tfm, const u8 *seed,
-                       unsigned int slen)
-{
-       return 0;
-}
-
 /*
  * Supported Crypto Algorithms
  */
@@ -1268,18 +1195,6 @@ static struct crypto4xx_alg_common crypto4xx_alg[] = {
                        .cra_module     = THIS_MODULE,
                },
        } },
-       { .type = CRYPTO_ALG_TYPE_RNG, .u.rng = {
-               .base = {
-                       .cra_name               = "stdrng",
-                       .cra_driver_name        = "crypto4xx_rng",
-                       .cra_priority           = 300,
-                       .cra_ctxsize            = 0,
-                       .cra_module             = THIS_MODULE,
-               },
-               .generate               = crypto4xx_prng_generate,
-               .seed                   = crypto4xx_prng_seed,
-               .seedsize               = 0,
-       } },
 };
 
 /*
@@ -1353,9 +1268,6 @@ static int crypto4xx_probe(struct platform_device *ofdev)
        core_dev->dev->core_dev = core_dev;
        core_dev->dev->is_revb = is_revb;
        core_dev->device = dev;
-       rc = devm_mutex_init(&ofdev->dev, &core_dev->rng_lock);
-       if (rc)
-               return rc;
        spin_lock_init(&core_dev->lock);
        INIT_LIST_HEAD(&core_dev->dev->alg_list);
        ratelimit_default_init(&core_dev->dev->aead_ratelimit);
index ee36630c670f2b34fe522c637c44f31e298cae68..3a028aec3f0c158286edbea097d91e4d6aeec81d 100644 (file)
 #define __CRYPTO4XX_CORE_H__
 
 #include <linux/ratelimit.h>
-#include <linux/mutex.h>
 #include <linux/scatterlist.h>
 #include <crypto/internal/aead.h>
-#include <crypto/internal/rng.h>
 #include <crypto/internal/skcipher.h>
 #include "crypto4xx_reg_def.h"
 #include "crypto4xx_sa.h"
@@ -111,7 +109,6 @@ struct crypto4xx_core_device {
        u32 irq;
        struct tasklet_struct tasklet;
        spinlock_t lock;
-       struct mutex rng_lock;
 };
 
 struct crypto4xx_ctx {
@@ -135,7 +132,6 @@ struct crypto4xx_alg_common {
        union {
                struct skcipher_alg cipher;
                struct aead_alg aead;
-               struct rng_alg rng;
        } u;
 };
 
index 1038061224da667d47a057df224e6c669c97e4c1..73d626308a8484ce320a93d3db0bf564d7a6f5bb 100644 (file)
 #define CRYPTO4XX_BYTE_ORDER_CFG               0x000600d8
 #define CRYPTO4XX_ENDIAN_CFG                   0x000600d8
 
-#define CRYPTO4XX_PRNG_STAT                    0x00070000
-#define CRYPTO4XX_PRNG_STAT_BUSY               0x1
 #define CRYPTO4XX_PRNG_CTRL                    0x00070004
 #define CRYPTO4XX_PRNG_SEED_L                  0x00070008
 #define CRYPTO4XX_PRNG_SEED_H                  0x0007000c
-
-#define CRYPTO4XX_PRNG_RES_0                   0x00070020
-#define CRYPTO4XX_PRNG_RES_1                   0x00070024
-#define CRYPTO4XX_PRNG_RES_2                   0x00070028
-#define CRYPTO4XX_PRNG_RES_3                   0x0007002C
-
-#define CRYPTO4XX_PRNG_LFSR_L                  0x00070030
-#define CRYPTO4XX_PRNG_LFSR_H                  0x00070034
-
 /*
  * Initialize CRYPTO ENGINE registers, and memory bases.
  */