]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
mtd: otp: Put factory OTP/NVRAM into the entropy pool
authorLinus Walleij <linus.walleij@linaro.org>
Tue, 6 Jun 2023 14:29:31 +0000 (16:29 +0200)
committerMiquel Raynal <miquel.raynal@bootlin.com>
Fri, 9 Jun 2023 15:27:16 +0000 (17:27 +0200)
The factory OTP, if supported, contains factory-programmed
information such as typically the serial number or production
week for the chip.

As this is device-unique information, submit it into the
system entropy pool.

This does not count as improvement of the entropy as such
but in practice it makes it a bit more random to mix in these
numbers.

Cc: Michael Walle <michael@walle.cc>
Acked-by: Jason A. Donenfeld <Jason@zx2c4.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
Link: https://lore.kernel.org/linux-mtd/20230606142931.3721374-1-linus.walleij@linaro.org
drivers/mtd/mtdcore.c

index 60670b2f70b9f988f8add4fa590b5c11a32a6a86..abf4cb58a8abcf276925f859136ff797304bc380 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/idr.h>
 #include <linux/backing-dev.h>
 #include <linux/gfp.h>
+#include <linux/random.h>
 #include <linux/slab.h>
 #include <linux/reboot.h>
 #include <linux/leds.h>
@@ -966,6 +967,24 @@ static int mtd_otp_nvmem_add(struct mtd_info *mtd)
                }
 
                if (size > 0) {
+                       /*
+                        * The factory OTP contains thing such as a unique serial
+                        * number and is small, so let's read it out and put it
+                        * into the entropy pool.
+                        */
+                       void *otp;
+
+                       otp = kmalloc(size, GFP_KERNEL);
+                       if (!otp)
+                               return -ENOMEM;
+                       err = mtd_nvmem_fact_otp_reg_read(mtd, 0, otp, size);
+                       if (err < 0) {
+                               kfree(otp);
+                               return err;
+                       }
+                       add_device_randomness(otp, err);
+                       kfree(otp);
+
                        nvmem = mtd_otp_nvmem_register(mtd, "factory-otp", size,
                                                       mtd_nvmem_fact_otp_reg_read);
                        if (IS_ERR(nvmem)) {