Skip to contentSkip to conversation

hwrng: bcm2835: set quality to 1000

PATCH In review Álvaro Fernández Rojas 5 participants 12 messages Feb 20, 2021 – Mar 12, 2021

Subsystems (4)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 hwrng: bcm2835: set quality to 1000

This allows devices without a high precission timer to reduce boot from >100s to <30s.

---
 drivers/char/hw_random/bcm2835-rng.c | 1 +
 1 file changed, 1 insertion(+)
drivers/char/hw_random/bcm2835-rng.c +1 -0
index 1a7c43b43c6b..4b48cb7176b0 100644
@@ -163,6 +163,7 @@ static int bcm2835_rng_probe(struct platform_device *pdev)
 	priv->rng.init = bcm2835_rng_init;
 	priv->rng.read = bcm2835_rng_read;
 	priv->rng.cleanup = bcm2835_rng_cleanup;
+	priv->rng.quality = 1000;
 
 	if (dev_of_node(dev)) {
 		rng_id = of_match_node(bcm2835_rng_of_match, dev->of_node);
Signature · 1 line
2.20.1
#1 lore raw

drivers/char/hw_random/bcm2835-rng.c static int bcm2835_rng_probe(struct platform_device *pdev) · line 166

Quoted 11 lines · Álvaro Fernández Rojas

This allows devices without a high precission timer to reduce boot from >100s to <30s.

drivers/char/hw_random/bcm2835-rng.c +1 -0
index 1a7c43b43c6b..4b48cb7176b0 100644
@@ -163,6 +163,7 @@ static int bcm2835_rng_probe(struct platform_device *pdev)
 	priv->rng.init = bcm2835_rng_init;
 	priv->rng.read = bcm2835_rng_read;
 	priv->rng.cleanup = bcm2835_rng_cleanup;
+	priv->rng.quality = 1000;

Hi Alvero

* @quality: Estimation of true entropy in RNG's bitstream
* (in bits of entropy per 1024 bits of input;
* valid values: 1 to 1024, or 0 for unknown).

How did you determine this device produces 1000 bits of true entropy per 1024?

Andrew

#2 lore raw

Hi Andrew,

I ran rngtest and this is what I got:

root@OpenWrt:/# cat /dev/hwrng | rngtest -c 1000
rngtest 6.10
Copyright (c) 2004 by Henrique de Moraes Holschuh
This is free software; see the source for copying conditions.  There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

rngtest: starting FIPS tests...
rngtest: bits received from input: 20000032
rngtest: FIPS 140-2 successes: 996
rngtest: FIPS 140-2 failures: 4
rngtest: FIPS 140-2(2001-10-10) Monobit: 0
rngtest: FIPS 140-2(2001-10-10) Poker: 0
rngtest: FIPS 140-2(2001-10-10) Runs: 1
rngtest: FIPS 140-2(2001-10-10) Long run: 3
rngtest: FIPS 140-2(2001-10-10) Continuous run: 0
rngtest: input channel speed: (min=146.002; avg=349.394; max=1302083.333)Kibits/s
rngtest: FIPS tests speed: (min=12.126; avg=22.750; max=23.432)Mibits/s
rngtest: Program run time: 56826982 microseconds

996 successes and 4 failures -> 99.6% success rate 1024 * 99.6% = 1019 (rounded down to 1000)

I'm not sure if I can rely on rngtest for that...

Best regards,
Álvaro.

Quoted 24 lines · Andrew Lunn

drivers/char/hw_random/bcm2835-rng.c static int bcm2835_rng_probe(struct platform_device *pdev) · line 166

Quoted 11 lines · Álvaro Fernández Rojas

This allows devices without a high precission timer to reduce boot from >100s to <30s.

drivers/char/hw_random/bcm2835-rng.c +1 -0
index 1a7c43b43c6b..4b48cb7176b0 100644
@@ -163,6 +163,7 @@ static int bcm2835_rng_probe(struct platform_device *pdev)
  	priv->rng.init = bcm2835_rng_init;
  	priv->rng.read = bcm2835_rng_read;
  	priv->rng.cleanup = bcm2835_rng_cleanup;
+	priv->rng.quality = 1000;

Hi Alvero

* @quality: Estimation of true entropy in RNG's bitstream
* (in bits of entropy per 1024 bits of input;
* valid values: 1 to 1024, or 0 for unknown).

How did you determine this device produces 1000 bits of true entropy per 1024?

Andrew

#3 lore raw
Quoted 23 lines · Álvaro Fernández Rojas

Hi Andrew,

I ran rngtest and this is what I got:

root@OpenWrt:/# cat /dev/hwrng | rngtest -c 1000
rngtest 6.10
Copyright (c) 2004 by Henrique de Moraes Holschuh
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

rngtest: starting FIPS tests...
rngtest: bits received from input: 20000032
rngtest: FIPS 140-2 successes: 996
rngtest: FIPS 140-2 failures: 4
rngtest: FIPS 140-2(2001-10-10) Monobit: 0
rngtest: FIPS 140-2(2001-10-10) Poker: 0
rngtest: FIPS 140-2(2001-10-10) Runs: 1
rngtest: FIPS 140-2(2001-10-10) Long run: 3
rngtest: FIPS 140-2(2001-10-10) Continuous run: 0
rngtest: input channel speed: (min=146.002; avg=349.394; max=1302083.333)Kibits/s
rngtest: FIPS tests speed: (min=12.126; avg=22.750; max=23.432)Mibits/s
rngtest: Program run time: 56826982 microseconds

Quoted 4 lines

996 successes and 4 failures -> 99.6% success rate 1024 * 99.6% = 1019 (rounded down to 1000)

I'm not sure if I can rely on rngtest for that...

Hi Álvaro

You need some sort of justification for setting the quality value. Please include what you have written above in the commit message. It then becomes possible for reviewers to say if this justification is valid or not.

Andrew

maintainer
#4 lore raw
In reply to Álvaro Fernández Rojas
Quoted 2 lines · Álvaro Fernández Rojas

I ran rngtest and this is what I got:

This is meaningless except for sources that have not been whitened.

Your justification needs to be based on what the hardware does or is documented to do.

Thanks,

Signature · 3 lines
Email: Herbert Xu <[email protected]>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
#5 lore raw

Hi Herbert,

Quoted 10 lines · Herbert Xu
Quoted 2 lines · Álvaro Fernández Rojas

I ran rngtest and this is what I got:

This is meaningless except for sources that have not been whitened.

Your justification needs to be based on what the hardware does or is documented to do.

Ok, so I guess that we’re never setting that value to anything since there’s no public documentation about that ¯\_(ツ)_/¯.

Quoted 6 lines

Thanks,

Signature · 3 lines
Email: Herbert Xu <[email protected]>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt

Best regards,
Álvaro.

#6 lore raw
Quoted 8 lines · Álvaro Fernández Rojas

Hi Herbert,

Quoted 6 lines · Herbert Xu
Quoted 2 lines · Álvaro Fernández Rojas

I ran rngtest and this is what I got:

Quoted 7 lines
Quoted 4 lines

This is meaningless except for sources that have not been whitened.

Your justification needs to be based on what the hardware does or is documented to do.

Ok, so I guess that we’re never setting that value to anything since there’s no public documentation about that ¯\_(ツ)_/¯.

@Florian, is there a way you might be able to get the official value?

Regards,
Nicolas

#7 lore raw
Quoted 11 lines · Nicolas Saenz Julienne
Quoted 10 lines · Álvaro Fernández Rojas

Hi Herbert,

Quoted 8 lines · Herbert Xu
Quoted 2 lines · Álvaro Fernández Rojas

I ran rngtest and this is what I got:

This is meaningless except for sources that have not been whitened.

Quoted 7 lines
Quoted 5 lines
Quoted 2 lines

Your justification needs to be based on what the hardware does or is documented to do.

Ok, so I guess that we’re never setting that value to anything since there’s no public documentation about that ¯\_(ツ)_/¯.

@Florian, is there a way you might be able to get the official value?

I will be looking into the documentation this weekend and let you know whether we can change the driver's quality accordingly.

Signature · 1 line
Florian
#8 lore raw

Hi Florian,

Quoted 17 lines · Florian Fainelli
Quoted 14 lines · Nicolas Saenz Julienne
Quoted 13 lines · Álvaro Fernández Rojas

Hi Herbert,

Quoted 10 lines · Herbert Xu
Quoted 2 lines · Álvaro Fernández Rojas

I ran rngtest and this is what I got:

This is meaningless except for sources that have not been whitened.

Your justification needs to be based on what the hardware does or is documented to do.

Quoted 7 lines
Quoted 4 lines
Quoted 2 lines

Ok, so I guess that we’re never setting that value to anything since there’s no public documentation about that ¯\_(ツ)_/¯.

@Florian, is there a way you might be able to get the official value?

I will be looking into the documentation this weekend and let you know whether we can change the driver's quality accordingly.

Could you do that for iproc-rng200.c too?

Quoted 2 lines
Signature · 1 line
Florian

Best regards,
Álvaro.

#9 lore raw
Quoted 22 lines · Álvaro Fernández Rojas

Hi Florian,

Quoted 20 lines · Florian Fainelli
Quoted 17 lines · Nicolas Saenz Julienne
Quoted 15 lines · Álvaro Fernández Rojas

Hi Herbert,

Quoted 10 lines · Herbert Xu
Quoted 2 lines · Álvaro Fernández Rojas

I ran rngtest and this is what I got:

This is meaningless except for sources that have not been whitened.

Your justification needs to be based on what the hardware does or is documented to do.

Ok, so I guess that we’re never setting that value to anything since there’s no public documentation about that ¯\_(ツ)_/¯.

Quoted 6 lines
Quoted 4 lines
Quoted 1 line

@Florian, is there a way you might be able to get the official value?

I will be looking into the documentation this weekend and let you know whether we can change the driver's quality accordingly.

Could you do that for iproc-rng200.c too?

From looking at some documentation and the design of the 6368 RNG which is supposedly the same as the Raspberry Pi 1/2/3 RNG, this appears to be a random number generator that does not go through any post-processing and just collects random bits into a FIFO.

The rbg200 is also similar except that it is integrated into a wrapper called the rng200 which supposedly only accepts data that has passed "NIST industry standard random data quality algorithm" without being specific. So it seems to me you may be able to set the quality field for bcm2835-rng, but not for iproc-rng200.

Stephan does that sound right?

Signature · 1 line
Florian
#10 lore raw

PATCH v2 1/1 hwrng: bcm2835: set quality to 1000

In reply to Álvaro Fernández Rojas

This allows devices without a high precission timer to speed up boot from more 100 s to lest than 30s.

Justification:

root@OpenWrt:/# cat /dev/hwrng | rngtest -c 1000
rngtest 6.10
Copyright (c) 2004 by Henrique de Moraes Holschuh
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

rngtest: starting FIPS tests...
rngtest: bits received from input: 20000032
rngtest: FIPS 140-2 successes: 996
rngtest: FIPS 140-2 failures: 4
rngtest: FIPS 140-2(2001-10-10) Monobit: 0
rngtest: FIPS 140-2(2001-10-10) Poker: 0
rngtest: FIPS 140-2(2001-10-10) Runs: 1
rngtest: FIPS 140-2(2001-10-10) Long run: 3
rngtest: FIPS 140-2(2001-10-10) Continuous run: 0
rngtest: input channel speed: (min=146.002; avg=349.394; max=1302083.333)Kibits/s
rngtest: FIPS tests speed: (min=12.126; avg=22.750; max=23.432)Mibits/s
rngtest: Program run time: 56826982 microseconds

996 successes and 4 failures -> 99.6% success rate 1024 * 99.6% = 1019 (rounded down to 1000)

---
v2: add jusftification

 drivers/char/hw_random/bcm2835-rng.c | 1 +
 1 file changed, 1 insertion(+)
drivers/char/hw_random/bcm2835-rng.c +1 -0
index 1a7c43b43c6b..4b48cb7176b0 100644
@@ -163,6 +163,7 @@ static int bcm2835_rng_probe(struct platform_device *pdev)
 	priv->rng.init = bcm2835_rng_init;
 	priv->rng.read = bcm2835_rng_read;
 	priv->rng.cleanup = bcm2835_rng_cleanup;
+	priv->rng.quality = 1000;
 
 	if (dev_of_node(dev)) {
 		rng_id = of_match_node(bcm2835_rng_of_match, dev->of_node);
Signature · 1 line
2.20.1
#11 lore raw

PATCH v3 1/1 hwrng: bcm2835: set quality

This allows devices without a high precission timer to speed up boot from more than 100s to lest than 30s.

BCM2835 rngtest:

root@OpenWrt:/# cat /dev/hwrng | rngtest -c 1000
rngtest 6.10
Copyright (c) 2004 by Henrique de Moraes Holschuh
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

rngtest: starting FIPS tests...
rngtest: bits received from input: 20000032
rngtest: FIPS 140-2 successes: 996
rngtest: FIPS 140-2 failures: 4
rngtest: FIPS 140-2(2001-10-10) Monobit: 0
rngtest: FIPS 140-2(2001-10-10) Poker: 0
rngtest: FIPS 140-2(2001-10-10) Runs: 1
rngtest: FIPS 140-2(2001-10-10) Long run: 3
rngtest: FIPS 140-2(2001-10-10) Continuous run: 0
rngtest: input channel speed: (min=146.002; avg=349.394; max=1302083.333)Kibits/s
rngtest: FIPS tests speed: (min=12.126; avg=22.750; max=23.432)Mibits/s
rngtest: Program run time: 56826982 microseconds

996 successes and 4 failures -> 99.6% success rate 1024 * 99.6% = 1019 (rounded down to 1000)

BCM6368 rngtest:

root@OpenWrt:/# root@OpenWrt:/# cat /dev/hwrng | rngtest -c 1000
rngtest 6.10
Copyright (c) 2004 by Henrique de Moraes Holschuh
This is free software; see the source for copying conditions.  There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

rngtest: starting FIPS tests...
rngtest: bits received from input: 20000032
rngtest: FIPS 140-2 successes: 751
rngtest: FIPS 140-2 failures: 249
rngtest: FIPS 140-2(2001-10-10) Monobit: 0
rngtest: FIPS 140-2(2001-10-10) Poker: 34
rngtest: FIPS 140-2(2001-10-10) Runs: 245
rngtest: FIPS 140-2(2001-10-10) Long run: 0
rngtest: FIPS 140-2(2001-10-10) Continuous run: 0
rngtest: input channel speed: (min=1.202; avg=16.434; max=1003.868)Mibits/s
rngtest: FIPS tests speed: (min=761.155; avg=8343.383; max=15662.590)Kibits/s
rngtest: Program run time: 3539183 microseconds
cat: write error: Broken pipe

---
v3: set different qualities for each SoC
v2: add jusftification

 drivers/char/hw_random/bcm2835-rng.c | 17 ++++++++++++++---
 1 file changed, 14 insertions(+), 3 deletions(-)
drivers/char/hw_random/bcm2835-rng.c +14 -3
index 1a7c43b43c6b..a6121a04f624 100644
@@ -121,6 +121,15 @@ static void bcm2835_rng_cleanup(struct hwrng *rng)
 
 struct bcm2835_rng_of_data {
 	bool mask_interrupts;
+	unsigned short quality;
+};
+
+static const struct bcm2835_rng_of_data bcm283x_rng_of_data = {
+	.quality = 1000,
+};
+
+static const struct bcm2835_rng_of_data bcm6368_rng_of_data = {
+	.quality = 700,
 };
 
 static const struct bcm2835_rng_of_data nsp_rng_of_data = {
@@ -128,10 +137,10 @@ static const struct bcm2835_rng_of_data nsp_rng_of_data = {
 };
 
 static const struct of_device_id bcm2835_rng_of_match[] = {
-	{ .compatible = "brcm,bcm2835-rng"},
+	{ .compatible = "brcm,bcm2835-rng", .data = &bcm283x_rng_of_data },
 	{ .compatible = "brcm,bcm-nsp-rng", .data = &nsp_rng_of_data },
 	{ .compatible = "brcm,bcm5301x-rng", .data = &nsp_rng_of_data },
-	{ .compatible = "brcm,bcm6368-rng"},
+	{ .compatible = "brcm,bcm6368-rng", .data = &bcm6368_rng_of_data },
 	{},
 };
 
@@ -171,8 +180,10 @@ static int bcm2835_rng_probe(struct platform_device *pdev)
 
 		/* Check for rng init function, execute it */
 		of_data = rng_id->data;
-		if (of_data)
+		if (of_data) {
 			priv->mask_interrupts = of_data->mask_interrupts;
+			priv->rng.quality = of_data->quality;
+		}
 	}
 
 	/* register driver */
Signature · 1 line
2.20.1