hwrng: bcm2835: set quality to 1000
Subsystems (4)
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
@@ -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
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@@ -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
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@@ -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
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
Herbert Xu
maintainerQuoted 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
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.
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
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
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.
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.ctoo?
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
PATCH v2 1/1 hwrng: bcm2835: set quality to 1000
In reply to Álvaro Fernández RojasThis 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
@@ -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
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
@@ -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