Looking to buy a FG? Contact me.
FG is a joy to use. I can not think of an easier piece of hardware to install and use -- be it a keyboard or a hard drive. Granted, I had to recompile a kernel to get the USB TTY adapter to show up, but that is arguably not a strike against FG itself. The thing just works. Plug it in and right away see data flow forth. I used it to create two files over the course of about four days, and ran them through the recommended tests.
peninnah ~ # du -h fg.bin 1.4G fg.bin peninnah ~ # ent fg.bin Entropy = 8.000000 bits per byte. Optimum compression would reduce the size of this 1465266688 byte file by 0 percent. Chi square distribution for 1465266688 samples is 261.00, and randomly would exceed this value 38.48 percent of the times. Arithmetic mean value of data bytes is 127.5008 (127.5 = random). Monte Carlo value for Pi is 3.141552305 (error 0.00 percent). Serial correlation coefficient is -0.000011 (totally uncorrelated = 0.0). peninnah ~ # dieharder -a -g 201 -f fg.bin #=============================================================================# # dieharder version 3.31.1 Copyright 2003 Robert G. Brown # #=============================================================================# rng_name | filename |rands/second| file_input_raw| fg.bin| 1.55e+07 | #=============================================================================# test_name |ntup| tsamples |psamples| p-value |Assessment #=============================================================================# diehard_birthdays| 0| 100| 100|0.87587112| PASSED diehard_operm5| 0| 1000000| 100|0.96015925| PASSED diehard_rank_32x32| 0| 40000| 100|0.63388649| PASSED diehard_rank_6x8| 0| 100000| 100|0.42921798| PASSED diehard_bitstream| 0| 2097152| 100|0.66727620| PASSED # The file file_input_raw was rewound 1 times diehard_opso| 0| 2097152| 100|0.78465705| PASSED # The file file_input_raw was rewound 1 times diehard_oqso| 0| 2097152| 100|0.74785318| PASSED # The file file_input_raw was rewound 2 times diehard_dna| 0| 2097152| 100|0.29367572| PASSED # The file file_input_raw was rewound 2 times diehard_count_1s_str| 0| 256000| 100|0.99999624| WEAK # The file file_input_raw was rewound 2 times diehard_count_1s_byt| 0| 256000| 100|0.17355435| PASSED # The file file_input_raw was rewound 2 times diehard_parking_lot| 0| 12000| 100|0.79600924| PASSED # The file file_input_raw was rewound 2 times diehard_2dsphere| 2| 8000| 100|0.21990710| PASSED # The file file_input_raw was rewound 2 times diehard_3dsphere| 3| 4000| 100|0.19449387| PASSED # The file file_input_raw was rewound 3 times diehard_squeeze| 0| 100000| 100|0.74343805| PASSED # The file file_input_raw was rewound 3 times diehard_sums| 0| 100| 100|0.62449613| PASSED # The file file_input_raw was rewound 3 times diehard_runs| 0| 100000| 100|0.64815009| PASSED diehard_runs| 0| 100000| 100|0.65768515| PASSED # The file file_input_raw was rewound 3 times diehard_craps| 0| 200000| 100|0.59858631| PASSED diehard_craps| 0| 200000| 100|0.69964834| PASSED # The file file_input_raw was rewound 8 times marsaglia_tsang_gcd| 0| 10000000| 100|0.48645093| PASSED marsaglia_tsang_gcd| 0| 10000000| 100|0.92449907| PASSED # The file file_input_raw was rewound 8 times sts_monobit| 1| 100000| 100|0.14747070| PASSED # The file file_input_raw was rewound 8 times sts_runs| 2| 100000| 100|0.43752663| PASSED # The file file_input_raw was rewound 8 times sts_serial| 1| 100000| 100|0.49942085| PASSED sts_serial| 2| 100000| 100|0.79110527| PASSED sts_serial| 3| 100000| 100|0.13521837| PASSED sts_serial| 3| 100000| 100|0.75936926| PASSED sts_serial| 4| 100000| 100|0.71378645| PASSED sts_serial| 4| 100000| 100|0.82458666| PASSED sts_serial| 5| 100000| 100|0.91349881| PASSED sts_serial| 5| 100000| 100|0.77236497| PASSED sts_serial| 6| 100000| 100|0.83690635| PASSED sts_serial| 6| 100000| 100|0.11520241| PASSED sts_serial| 7| 100000| 100|0.59018155| PASSED sts_serial| 7| 100000| 100|0.71582962| PASSED sts_serial| 8| 100000| 100|0.94832462| PASSED sts_serial| 8| 100000| 100|0.79664845| PASSED sts_serial| 9| 100000| 100|0.61190018| PASSED sts_serial| 9| 100000| 100|0.46706842| PASSED sts_serial| 10| 100000| 100|0.59175209| PASSED sts_serial| 10| 100000| 100|0.43626668| PASSED sts_serial| 11| 100000| 100|0.07062130| PASSED sts_serial| 11| 100000| 100|0.06074906| PASSED sts_serial| 12| 100000| 100|0.33158937| PASSED sts_serial| 12| 100000| 100|0.39439959| PASSED sts_serial| 13| 100000| 100|0.46472363| PASSED sts_serial| 13| 100000| 100|0.51269561| PASSED sts_serial| 14| 100000| 100|0.07918865| PASSED sts_serial| 14| 100000| 100|0.16238744| PASSED sts_serial| 15| 100000| 100|0.15625993| PASSED sts_serial| 15| 100000| 100|0.97190190| PASSED sts_serial| 16| 100000| 100|0.07682345| PASSED sts_serial| 16| 100000| 100|0.58495694| PASSED # The file file_input_raw was rewound 9 times rgb_bitdist| 1| 100000| 100|0.91212650| PASSED # The file file_input_raw was rewound 9 times rgb_bitdist| 2| 100000| 100|0.68566372| PASSED # The file file_input_raw was rewound 9 times rgb_bitdist| 3| 100000| 100|0.24740597| PASSED # The file file_input_raw was rewound 9 times rgb_bitdist| 4| 100000| 100|0.92670153| PASSED # The file file_input_raw was rewound 9 times rgb_bitdist| 5| 100000| 100|0.58055076| PASSED # The file file_input_raw was rewound 10 times rgb_bitdist| 6| 100000| 100|0.24329557| PASSED # The file file_input_raw was rewound 10 times rgb_bitdist| 7| 100000| 100|0.28990384| PASSED # The file file_input_raw was rewound 10 times rgb_bitdist| 8| 100000| 100|0.06298846| PASSED # The file file_input_raw was rewound 11 times rgb_bitdist| 9| 100000| 100|0.55779701| PASSED # The file file_input_raw was rewound 11 times rgb_bitdist| 10| 100000| 100|0.10205715| PASSED # The file file_input_raw was rewound 12 times rgb_bitdist| 11| 100000| 100|0.43845244| PASSED # The file file_input_raw was rewound 13 times rgb_bitdist| 12| 100000| 100|0.81873239| PASSED # The file file_input_raw was rewound 13 times rgb_minimum_distance| 2| 10000| 1000|0.86683062| PASSED # The file file_input_raw was rewound 13 times rgb_minimum_distance| 3| 10000| 1000|0.95287146| PASSED # The file file_input_raw was rewound 13 times rgb_minimum_distance| 4| 10000| 1000|0.15691677| PASSED # The file file_input_raw was rewound 13 times rgb_minimum_distance| 5| 10000| 1000|0.87747412| PASSED # The file file_input_raw was rewound 13 times rgb_permutations| 2| 100000| 100|0.47847209| PASSED # The file file_input_raw was rewound 13 times rgb_permutations| 3| 100000| 100|0.82402816| PASSED # The file file_input_raw was rewound 13 times rgb_permutations| 4| 100000| 100|0.17345085| PASSED # The file file_input_raw was rewound 13 times rgb_permutations| 5| 100000| 100|0.96936326| PASSED # The file file_input_raw was rewound 14 times rgb_lagged_sum| 0| 1000000| 100|0.34427016| PASSED # The file file_input_raw was rewound 14 times rgb_lagged_sum| 1| 1000000| 100|0.40381806| PASSED # The file file_input_raw was rewound 15 times rgb_lagged_sum| 2| 1000000| 100|0.19408856| PASSED # The file file_input_raw was rewound 16 times rgb_lagged_sum| 3| 1000000| 100|0.92897681| PASSED # The file file_input_raw was rewound 18 times rgb_lagged_sum| 4| 1000000| 100|0.16649980| PASSED # The file file_input_raw was rewound 19 times rgb_lagged_sum| 5| 1000000| 100|0.61412624| PASSED # The file file_input_raw was rewound 21 times rgb_lagged_sum| 6| 1000000| 100|0.42159442| PASSED # The file file_input_raw was rewound 23 times rgb_lagged_sum| 7| 1000000| 100|0.48185104| PASSED # The file file_input_raw was rewound 26 times rgb_lagged_sum| 8| 1000000| 100|0.75025588| PASSED # The file file_input_raw was rewound 29 times rgb_lagged_sum| 9| 1000000| 100|0.49625842| PASSED # The file file_input_raw was rewound 32 times rgb_lagged_sum| 10| 1000000| 100|0.74186420| PASSED # The file file_input_raw was rewound 35 times rgb_lagged_sum| 11| 1000000| 100|0.95075159| PASSED # The file file_input_raw was rewound 38 times rgb_lagged_sum| 12| 1000000| 100|0.20457436| PASSED # The file file_input_raw was rewound 42 times rgb_lagged_sum| 13| 1000000| 100|0.38380392| PASSED # The file file_input_raw was rewound 46 times rgb_lagged_sum| 14| 1000000| 100|0.36071578| PASSED # The file file_input_raw was rewound 51 times rgb_lagged_sum| 15| 1000000| 100|0.00829390| PASSED # The file file_input_raw was rewound 55 times rgb_lagged_sum| 16| 1000000| 100|0.57666395| PASSED # The file file_input_raw was rewound 60 times rgb_lagged_sum| 17| 1000000| 100|0.76473173| PASSED # The file file_input_raw was rewound 65 times rgb_lagged_sum| 18| 1000000| 100|0.41578459| PASSED # The file file_input_raw was rewound 71 times rgb_lagged_sum| 19| 1000000| 100|0.99159799| PASSED # The file file_input_raw was rewound 77 times rgb_lagged_sum| 20| 1000000| 100|0.32769294| PASSED # The file file_input_raw was rewound 83 times rgb_lagged_sum| 21| 1000000| 100|0.93908723| PASSED # The file file_input_raw was rewound 89 times rgb_lagged_sum| 22| 1000000| 100|0.21834900| PASSED # The file file_input_raw was rewound 95 times rgb_lagged_sum| 23| 1000000| 100|0.77669306| PASSED # The file file_input_raw was rewound 102 times rgb_lagged_sum| 24| 1000000| 100|0.67332002| PASSED # The file file_input_raw was rewound 109 times rgb_lagged_sum| 25| 1000000| 100|0.38258605| PASSED # The file file_input_raw was rewound 117 times rgb_lagged_sum| 26| 1000000| 100|0.04205557| PASSED # The file file_input_raw was rewound 124 times rgb_lagged_sum| 27| 1000000| 100|0.97791293| PASSED # The file file_input_raw was rewound 132 times rgb_lagged_sum| 28| 1000000| 100|0.65316434| PASSED # The file file_input_raw was rewound 140 times rgb_lagged_sum| 29| 1000000| 100|0.80146132| PASSED # The file file_input_raw was rewound 149 times rgb_lagged_sum| 30| 1000000| 100|0.37987553| PASSED # The file file_input_raw was rewound 158 times rgb_lagged_sum| 31| 1000000| 100|0.00162210| WEAK # The file file_input_raw was rewound 167 times rgb_lagged_sum| 32| 1000000| 100|0.63803843| PASSED # The file file_input_raw was rewound 167 times rgb_kstest_test| 0| 10000| 1000|0.96115995| PASSED # The file file_input_raw was rewound 167 times dab_bytedistrib| 0| 51200000| 1|0.31793136| PASSED # The file file_input_raw was rewound 167 times dab_dct| 256| 50000| 1|0.45562880| PASSED Preparing to run test 207. ntuple = 0 # The file file_input_raw was rewound 167 times dab_filltree| 32| 15000000| 1|0.79566020| PASSED dab_filltree| 32| 15000000| 1|0.01492029| PASSED Preparing to run test 208. ntuple = 0 # The file file_input_raw was rewound 168 times dab_filltree2| 0| 5000000| 1|0.88946088| PASSED dab_filltree2| 1| 5000000| 1|0.66182840| PASSED Preparing to run test 209. ntuple = 0 # The file file_input_raw was rewound 168 times dab_monobit2| 12| 65000000| 1|0.42576186| PASSED peninnah ~ # du -h fg2.bin 1.3G fg2.bin peninnah ~ # ent fg2.bin Entropy = 8.000000 bits per byte. Optimum compression would reduce the size of this 1303843328 byte file by 0 percent. Chi square distribution for 1303843328 samples is 284.35, and randomly would exceed this value 9.99 percent of the times. Arithmetic mean value of data bytes is 127.4954 (127.5 = random). Monte Carlo value for Pi is 3.141632114 (error 0.00 percent). Serial correlation coefficient is -0.000032 (totally uncorrelated = 0.0). peninnah ~ # dieharder -a -g 201 -f fg2.bin #=============================================================================# # dieharder version 3.31.1 Copyright 2003 Robert G. Brown # #=============================================================================# rng_name | filename |rands/second| file_input_raw| fg2.bin| 2.25e+07 | #=============================================================================# test_name |ntup| tsamples |psamples| p-value |Assessment #=============================================================================# diehard_birthdays| 0| 100| 100|0.51690876| PASSED diehard_operm5| 0| 1000000| 100|0.40346765| PASSED diehard_rank_32x32| 0| 40000| 100|0.93217934| PASSED diehard_rank_6x8| 0| 100000| 100|0.43367847| PASSED diehard_bitstream| 0| 2097152| 100|0.66720249| PASSED diehard_opso| 0| 2097152| 100|0.86010573| PASSED diehard_oqso| 0| 2097152| 100|0.24593153| PASSED diehard_dna| 0| 2097152| 100|0.06138150| PASSED diehard_count_1s_str| 0| 256000| 100|0.43683325| PASSED diehard_count_1s_byt| 0| 256000| 100|0.35921097| PASSED diehard_parking_lot| 0| 12000| 100|0.66609484| PASSED diehard_2dsphere| 2| 8000| 100|0.89297189| PASSED diehard_3dsphere| 3| 4000| 100|0.96687561| PASSED diehard_squeeze| 0| 100000| 100|0.72926845| PASSED diehard_sums| 0| 100| 100|0.00070732| WEAK diehard_runs| 0| 100000| 100|0.58813360| PASSED diehard_runs| 0| 100000| 100|0.85788145| PASSED diehard_craps| 0| 200000| 100|0.72997672| PASSED diehard_craps| 0| 200000| 100|0.78468205| PASSED marsaglia_tsang_gcd| 0| 10000000| 100|0.00004506| WEAK marsaglia_tsang_gcd| 0| 10000000| 100|0.55156943| PASSED sts_monobit| 1| 100000| 100|0.45774566| PASSED sts_runs| 2| 100000| 100|0.96042269| PASSED sts_serial| 1| 100000| 100|0.99443515| PASSED sts_serial| 2| 100000| 100|0.10639532| PASSED sts_serial| 3| 100000| 100|0.75641448| PASSED sts_serial| 3| 100000| 100|0.90420108| PASSED sts_serial| 4| 100000| 100|0.75016342| PASSED sts_serial| 4| 100000| 100|0.08575288| PASSED sts_serial| 5| 100000| 100|0.03281594| PASSED sts_serial| 5| 100000| 100|0.19524235| PASSED sts_serial| 6| 100000| 100|0.25109686| PASSED sts_serial| 6| 100000| 100|0.58659811| PASSED sts_serial| 7| 100000| 100|0.43221129| PASSED sts_serial| 7| 100000| 100|0.81175508| PASSED sts_serial| 8| 100000| 100|0.63456658| PASSED sts_serial| 8| 100000| 100|0.65063391| PASSED sts_serial| 9| 100000| 100|0.58288735| PASSED sts_serial| 9| 100000| 100|0.71193409| PASSED sts_serial| 10| 100000| 100|0.62519797| PASSED sts_serial| 10| 100000| 100|0.55146077| PASSED sts_serial| 11| 100000| 100|0.76770489| PASSED sts_serial| 11| 100000| 100|0.59139324| PASSED sts_serial| 12| 100000| 100|0.94453984| PASSED sts_serial| 12| 100000| 100|0.94841134| PASSED sts_serial| 13| 100000| 100|0.31653993| PASSED sts_serial| 13| 100000| 100|0.14829483| PASSED sts_serial| 14| 100000| 100|0.42320056| PASSED sts_serial| 14| 100000| 100|0.10925685| PASSED sts_serial| 15| 100000| 100|0.83878977| PASSED sts_serial| 15| 100000| 100|0.25782489| PASSED sts_serial| 16| 100000| 100|0.66793322| PASSED sts_serial| 16| 100000| 100|0.55162347| PASSED rgb_bitdist| 1| 100000| 100|0.89591957| PASSED rgb_bitdist| 2| 100000| 100|0.98614161| PASSED rgb_bitdist| 3| 100000| 100|0.80316018| PASSED rgb_bitdist| 4| 100000| 100|0.89736784| PASSED rgb_bitdist| 5| 100000| 100|0.29428507| PASSED rgb_bitdist| 6| 100000| 100|0.95422575| PASSED rgb_bitdist| 7| 100000| 100|0.39659444| PASSED rgb_bitdist| 8| 100000| 100|0.46010761| PASSED rgb_bitdist| 9| 100000| 100|0.76510075| PASSED rgb_bitdist| 10| 100000| 100|0.95714334| PASSED rgb_bitdist| 11| 100000| 100|0.35646381| PASSED rgb_bitdist| 12| 100000| 100|0.98517330| PASSED rgb_minimum_distance| 2| 10000| 1000|0.34562317| PASSED rgb_minimum_distance| 3| 10000| 1000|0.00929810| PASSED rgb_minimum_distance| 4| 10000| 1000|0.75795839| PASSED rgb_minimum_distance| 5| 10000| 1000|0.00873640| PASSED rgb_permutations| 2| 100000| 100|0.49694367| PASSED rgb_permutations| 3| 100000| 100|0.65402344| PASSED rgb_permutations| 4| 100000| 100|0.79788641| PASSED rgb_permutations| 5| 100000| 100|0.58529553| PASSED rgb_lagged_sum| 0| 1000000| 100|0.52287218| PASSED rgb_lagged_sum| 1| 1000000| 100|0.22764333| PASSED rgb_lagged_sum| 2| 1000000| 100|0.17172871| PASSED rgb_lagged_sum| 3| 1000000| 100|0.05124946| PASSED rgb_lagged_sum| 4| 1000000| 100|0.49713592| PASSED rgb_lagged_sum| 5| 1000000| 100|0.45635542| PASSED rgb_lagged_sum| 6| 1000000| 100|0.96830965| PASSED rgb_lagged_sum| 7| 1000000| 100|0.53419506| PASSED rgb_lagged_sum| 8| 1000000| 100|0.86494381| PASSED rgb_lagged_sum| 9| 1000000| 100|0.72881545| PASSED rgb_lagged_sum| 10| 1000000| 100|0.56544878| PASSED rgb_lagged_sum| 11| 1000000| 100|0.43609672| PASSED rgb_lagged_sum| 12| 1000000| 100|0.91400206| PASSED rgb_lagged_sum| 13| 1000000| 100|0.60227275| PASSED rgb_lagged_sum| 14| 1000000| 100|0.56538826| PASSED rgb_lagged_sum| 15| 1000000| 100|0.06302978| PASSED rgb_lagged_sum| 16| 1000000| 100|0.16808054| PASSED rgb_lagged_sum| 17| 1000000| 100|0.55036083| PASSED rgb_lagged_sum| 18| 1000000| 100|0.93720548| PASSED rgb_lagged_sum| 19| 1000000| 100|0.37353185| PASSED rgb_lagged_sum| 20| 1000000| 100|0.13472207| PASSED rgb_lagged_sum| 21| 1000000| 100|0.44509225| PASSED rgb_lagged_sum| 22| 1000000| 100|0.76205513| PASSED rgb_lagged_sum| 23| 1000000| 100|0.62304135| PASSED rgb_lagged_sum| 24| 1000000| 100|0.39094558| PASSED rgb_lagged_sum| 25| 1000000| 100|0.50961722| PASSED rgb_lagged_sum| 26| 1000000| 100|0.15803949| PASSED rgb_lagged_sum| 27| 1000000| 100|0.09251363| PASSED rgb_lagged_sum| 28| 1000000| 100|0.58331044| PASSED rgb_lagged_sum| 29| 1000000| 100|0.12363069| PASSED rgb_lagged_sum| 30| 1000000| 100|0.71458079| PASSED rgb_lagged_sum| 31| 1000000| 100|0.66807924| PASSED rgb_lagged_sum| 32| 1000000| 100|0.65399068| PASSED rgb_kstest_test| 0| 10000| 1000|0.02178401| PASSED dab_bytedistrib| 0| 51200000| 1|0.36573309| PASSED dab_dct| 256| 50000| 1|0.56628701| PASSED Preparing to run test 207. ntuple = 0 dab_filltree| 32| 15000000| 1|0.28801332| PASSED dab_filltree| 32| 15000000| 1|0.59182162| PASSED Preparing to run test 208. ntuple = 0 dab_filltree2| 0| 5000000| 1|0.19562700| PASSED dab_filltree2| 1| 5000000| 1|0.13690412| PASSED Preparing to run test 209. ntuple = 0 dab_monobit2| 12| 65000000| 1|0.52568327| PASSED
As another test, I used a FG to seed /dev/random
via something called rngd
i and then told gnupg to generate a new 4096 bit key. It was done within a minute, whereas a very similar machine operating without a FG took several minutes. I don't know if this is the right way to generate a key using such a device. I get strange results catting it directly into /dev/random
-- if I then cat /dev/random > somewhere.bin
the data barely trickles out. Even the rngd
thing goes slow relative to a direct dd
from /dev/myFG
, and I know from very quick research that this is likely the result of obnoxious built-in saftey measures on /dev/random
.
- Gentoo has it in the sys-apps/rng-tools package. ^
[...] Others have done of course better than me and published their own tests waaaaay faster: mod6, danielpbarron, trinque, BingoBoingo. How about you, what's your own FG saying to you? [...]
As it turns out, and I think the official documentation (i barely skimmed) says, you can and should “mv /dev/USBttywhatever /dev/random” and simply use fg as your dev random. No symbolic linking or other weird maneuvers. I works (mostly) perfectly fine in this manner. Due to the fact that it is really random, it sometimes hiccups out objectionable randomness, causing the real bitcoin to die. Easy enough to run it again, no harm done.
"objectionable randomness, causing the real bitcoin to die"?
I don't understand what is meant by this.
Sometimes a stream of real entropy will include a long enough patch of order to cause applications to barf. Imagine if you are flipping coins, and happen to flip ten heads in a row. It is unlikely to happen, and it doesn't look very random, but it is necessarily possible.