diff --git a/AES128_8cpp_source.html b/AES128_8cpp_source.html index 5d191d81..828ed98f 100644 --- a/AES128_8cpp_source.html +++ b/AES128_8cpp_source.html @@ -175,7 +175,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/AES192_8cpp_source.html b/AES192_8cpp_source.html index 888f835e..073abea7 100644 --- a/AES192_8cpp_source.html +++ b/AES192_8cpp_source.html @@ -175,7 +175,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/AES256_8cpp_source.html b/AES256_8cpp_source.html index f3c48fbc..6bf10a6f 100644 --- a/AES256_8cpp_source.html +++ b/AES256_8cpp_source.html @@ -182,7 +182,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/AESCommon_8cpp_source.html b/AESCommon_8cpp_source.html index 102f2b8a..666bd4cd 100644 --- a/AESCommon_8cpp_source.html +++ b/AESCommon_8cpp_source.html @@ -415,7 +415,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/AES_8h_source.html b/AES_8h_source.html index ad4108de..a58e252c 100644 --- a/AES_8h_source.html +++ b/AES_8h_source.html @@ -206,7 +206,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/BLAKE2b_8cpp_source.html b/BLAKE2b_8cpp_source.html index f15f0bf4..ba7bf664 100644 --- a/BLAKE2b_8cpp_source.html +++ b/BLAKE2b_8cpp_source.html @@ -308,7 +308,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/BLAKE2b_8h_source.html b/BLAKE2b_8h_source.html index cdb59400..27596d60 100644 --- a/BLAKE2b_8h_source.html +++ b/BLAKE2b_8h_source.html @@ -158,7 +158,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/BLAKE2s_8cpp_source.html b/BLAKE2s_8cpp_source.html index 245879f4..7c42b8ef 100644 --- a/BLAKE2s_8cpp_source.html +++ b/BLAKE2s_8cpp_source.html @@ -300,7 +300,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/BLAKE2s_8h_source.html b/BLAKE2s_8h_source.html index 637db3bf..969a376f 100644 --- a/BLAKE2s_8h_source.html +++ b/BLAKE2s_8h_source.html @@ -157,7 +157,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Bitmap_8cpp_source.html b/Bitmap_8cpp_source.html index 86c4ad76..95420349 100644 --- a/Bitmap_8cpp_source.html +++ b/Bitmap_8cpp_source.html @@ -694,7 +694,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Bitmap_8h_source.html b/Bitmap_8h_source.html index 67454c57..5e0a5ea6 100644 --- a/Bitmap_8h_source.html +++ b/Bitmap_8h_source.html @@ -271,7 +271,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/BlinkLED_8cpp_source.html b/BlinkLED_8cpp_source.html index b3347b94..60101433 100644 --- a/BlinkLED_8cpp_source.html +++ b/BlinkLED_8cpp_source.html @@ -196,7 +196,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/BlinkLED_8h_source.html b/BlinkLED_8h_source.html index f68a9b03..9cdd4975 100644 --- a/BlinkLED_8h_source.html +++ b/BlinkLED_8h_source.html @@ -157,7 +157,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/BlockCipher_8cpp_source.html b/BlockCipher_8cpp_source.html index 60f89a6e..5233dbac 100644 --- a/BlockCipher_8cpp_source.html +++ b/BlockCipher_8cpp_source.html @@ -125,7 +125,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/BlockCipher_8h_source.html b/BlockCipher_8h_source.html index d787e115..c24614b0 100644 --- a/BlockCipher_8h_source.html +++ b/BlockCipher_8h_source.html @@ -146,7 +146,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/BoolField_8cpp_source.html b/BoolField_8cpp_source.html index 65c72120..a608ca5e 100644 --- a/BoolField_8cpp_source.html +++ b/BoolField_8cpp_source.html @@ -202,7 +202,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/BoolField_8h_source.html b/BoolField_8h_source.html index 2faa79c4..11589674 100644 --- a/BoolField_8h_source.html +++ b/BoolField_8h_source.html @@ -160,7 +160,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/CBC_8cpp_source.html b/CBC_8cpp_source.html index 1491ccc9..25835312 100644 --- a/CBC_8cpp_source.html +++ b/CBC_8cpp_source.html @@ -208,7 +208,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/CBC_8h_source.html b/CBC_8h_source.html index 4aa2fde9..80b63bad 100644 --- a/CBC_8h_source.html +++ b/CBC_8h_source.html @@ -172,7 +172,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/CFB_8cpp_source.html b/CFB_8cpp_source.html index fac0cd51..f1594d61 100644 --- a/CFB_8cpp_source.html +++ b/CFB_8cpp_source.html @@ -233,7 +233,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/CFB_8h_source.html b/CFB_8h_source.html index f8b58d01..c03cdf59 100644 --- a/CFB_8h_source.html +++ b/CFB_8h_source.html @@ -171,7 +171,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/CTR_8cpp_source.html b/CTR_8cpp_source.html index 8a2aa7ae..1a1ad9ae 100644 --- a/CTR_8cpp_source.html +++ b/CTR_8cpp_source.html @@ -228,7 +228,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/CTR_8h_source.html b/CTR_8h_source.html index bd688730..f78dba4e 100644 --- a/CTR_8h_source.html +++ b/CTR_8h_source.html @@ -175,7 +175,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/ChaCha_8cpp_source.html b/ChaCha_8cpp_source.html index d802704f..9253ccde 100644 --- a/ChaCha_8cpp_source.html +++ b/ChaCha_8cpp_source.html @@ -300,7 +300,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/ChaCha_8h_source.html b/ChaCha_8h_source.html index bdf32b9b..68dd98d9 100644 --- a/ChaCha_8h_source.html +++ b/ChaCha_8h_source.html @@ -163,7 +163,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Charlieplex_8cpp_source.html b/Charlieplex_8cpp_source.html index e3efb326..dcdb2810 100644 --- a/Charlieplex_8cpp_source.html +++ b/Charlieplex_8cpp_source.html @@ -232,7 +232,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Charlieplex_8h_source.html b/Charlieplex_8h_source.html index fb06ef9b..5a22cbce 100644 --- a/Charlieplex_8h_source.html +++ b/Charlieplex_8h_source.html @@ -162,7 +162,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/ChaseLEDs_8cpp_source.html b/ChaseLEDs_8cpp_source.html index 86a4ff2b..16366eb0 100644 --- a/ChaseLEDs_8cpp_source.html +++ b/ChaseLEDs_8cpp_source.html @@ -160,7 +160,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/ChaseLEDs_8h_source.html b/ChaseLEDs_8h_source.html index e88e6927..4a1e4d2d 100644 --- a/ChaseLEDs_8h_source.html +++ b/ChaseLEDs_8h_source.html @@ -149,7 +149,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Cipher_8cpp_source.html b/Cipher_8cpp_source.html index 5bea2fd0..90a0aacd 100644 --- a/Cipher_8cpp_source.html +++ b/Cipher_8cpp_source.html @@ -125,7 +125,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Cipher_8h_source.html b/Cipher_8h_source.html index 26b150c5..64e5858e 100644 --- a/Cipher_8h_source.html +++ b/Cipher_8h_source.html @@ -148,7 +148,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Crypto_8cpp_source.html b/Crypto_8cpp_source.html index 0e93fde8..2ea64301 100644 --- a/Crypto_8cpp_source.html +++ b/Crypto_8cpp_source.html @@ -127,7 +127,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Crypto_8h_source.html b/Crypto_8h_source.html index fcff9631..7f40f85d 100644 --- a/Crypto_8h_source.html +++ b/Crypto_8h_source.html @@ -128,7 +128,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Curve25519_8cpp_source.html b/Curve25519_8cpp_source.html index e13bc3b9..c53a53dd 100644 --- a/Curve25519_8cpp_source.html +++ b/Curve25519_8cpp_source.html @@ -717,7 +717,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Curve25519_8h_source.html b/Curve25519_8h_source.html index 2db152bd..c4bcedb6 100644 --- a/Curve25519_8h_source.html +++ b/Curve25519_8h_source.html @@ -188,7 +188,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/DMD_8cpp_source.html b/DMD_8cpp_source.html index 261e7faf..e16b128c 100644 --- a/DMD_8cpp_source.html +++ b/DMD_8cpp_source.html @@ -456,7 +456,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/DMD_8h_source.html b/DMD_8h_source.html index c1ffea8c..17167213 100644 --- a/DMD_8h_source.html +++ b/DMD_8h_source.html @@ -170,7 +170,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/DS1307RTC_8cpp_source.html b/DS1307RTC_8cpp_source.html index 1e98bd65..164c84bf 100644 --- a/DS1307RTC_8cpp_source.html +++ b/DS1307RTC_8cpp_source.html @@ -415,7 +415,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/DS1307RTC_8h_source.html b/DS1307RTC_8h_source.html index 83309edd..4b9fc498 100644 --- a/DS1307RTC_8h_source.html +++ b/DS1307RTC_8h_source.html @@ -172,7 +172,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/DS3232RTC_8cpp_source.html b/DS3232RTC_8cpp_source.html index 83fb083c..66ce0a1e 100644 --- a/DS3232RTC_8cpp_source.html +++ b/DS3232RTC_8cpp_source.html @@ -575,7 +575,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/DS3232RTC_8h_source.html b/DS3232RTC_8h_source.html index dace665f..6f82f896 100644 --- a/DS3232RTC_8h_source.html +++ b/DS3232RTC_8h_source.html @@ -190,7 +190,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/DejaVuSans9_8h_source.html b/DejaVuSans9_8h_source.html index 32cced0a..c48dcacd 100644 --- a/DejaVuSans9_8h_source.html +++ b/DejaVuSans9_8h_source.html @@ -257,7 +257,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/DejaVuSansBold9_8h_source.html b/DejaVuSansBold9_8h_source.html index c10bf507..e56b0074 100644 --- a/DejaVuSansBold9_8h_source.html +++ b/DejaVuSansBold9_8h_source.html @@ -257,7 +257,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/DejaVuSansItalic9_8h_source.html b/DejaVuSansItalic9_8h_source.html index c122831a..a0a74483 100644 --- a/DejaVuSansItalic9_8h_source.html +++ b/DejaVuSansItalic9_8h_source.html @@ -257,7 +257,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/EEPROM24_8cpp_source.html b/EEPROM24_8cpp_source.html index a061d0c6..591ee0ac 100644 --- a/EEPROM24_8cpp_source.html +++ b/EEPROM24_8cpp_source.html @@ -282,7 +282,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/EEPROM24_8h_source.html b/EEPROM24_8h_source.html index 6e8d71da..bb62e351 100644 --- a/EEPROM24_8h_source.html +++ b/EEPROM24_8h_source.html @@ -186,7 +186,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Field_8cpp_source.html b/Field_8cpp_source.html index d32dd103..f4dbee7e 100644 --- a/Field_8cpp_source.html +++ b/Field_8cpp_source.html @@ -196,7 +196,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Field_8h_source.html b/Field_8h_source.html index f9eeb4e7..ec2f81a6 100644 --- a/Field_8h_source.html +++ b/Field_8h_source.html @@ -164,7 +164,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Form_8cpp_source.html b/Form_8cpp_source.html index 47c0422e..cdd45397 100644 --- a/Form_8cpp_source.html +++ b/Form_8cpp_source.html @@ -278,7 +278,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Form_8h_source.html b/Form_8h_source.html index 6f647c95..30b60d6d 100644 --- a/Form_8h_source.html +++ b/Form_8h_source.html @@ -172,7 +172,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Hash_8cpp_source.html b/Hash_8cpp_source.html index 4ca4c053..c24661e4 100644 --- a/Hash_8cpp_source.html +++ b/Hash_8cpp_source.html @@ -125,7 +125,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Hash_8h_source.html b/Hash_8h_source.html index 44436b09..754247e7 100644 --- a/Hash_8h_source.html +++ b/Hash_8h_source.html @@ -145,7 +145,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/I2CMaster_8cpp_source.html b/I2CMaster_8cpp_source.html index ada39857..770d0901 100644 --- a/I2CMaster_8cpp_source.html +++ b/I2CMaster_8cpp_source.html @@ -115,7 +115,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/I2CMaster_8h_source.html b/I2CMaster_8h_source.html index 9c0bfc5b..b4b5d502 100644 --- a/I2CMaster_8h_source.html +++ b/I2CMaster_8h_source.html @@ -140,7 +140,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/IRreceiver_8cpp_source.html b/IRreceiver_8cpp_source.html index fa2a84cc..47b61afb 100644 --- a/IRreceiver_8cpp_source.html +++ b/IRreceiver_8cpp_source.html @@ -261,7 +261,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/IRreceiver_8h_source.html b/IRreceiver_8h_source.html index 9ad0a8a2..3bb9a0d9 100644 --- a/IRreceiver_8h_source.html +++ b/IRreceiver_8h_source.html @@ -157,7 +157,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/IntField_8cpp_source.html b/IntField_8cpp_source.html index 21fe0878..2f0d6392 100644 --- a/IntField_8cpp_source.html +++ b/IntField_8cpp_source.html @@ -208,7 +208,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/IntField_8h_source.html b/IntField_8h_source.html index 2fe4a72a..625ac57e 100644 --- a/IntField_8h_source.html +++ b/IntField_8h_source.html @@ -173,7 +173,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/KeccakCore_8cpp_source.html b/KeccakCore_8cpp_source.html index d266b429..e697d1c8 100644 --- a/KeccakCore_8cpp_source.html +++ b/KeccakCore_8cpp_source.html @@ -334,7 +334,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/KeccakCore_8h_source.html b/KeccakCore_8h_source.html index f46e28da..ad3ad9fd 100644 --- a/KeccakCore_8h_source.html +++ b/KeccakCore_8h_source.html @@ -163,7 +163,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/LCD_8cpp_source.html b/LCD_8cpp_source.html index 5f6105dd..76d23dac 100644 --- a/LCD_8cpp_source.html +++ b/LCD_8cpp_source.html @@ -290,7 +290,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/LCD_8h_source.html b/LCD_8h_source.html index a1e5d000..484d3c8f 100644 --- a/LCD_8h_source.html +++ b/LCD_8h_source.html @@ -201,7 +201,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/ListField_8cpp_source.html b/ListField_8cpp_source.html index 496fe971..5377aa13 100644 --- a/ListField_8cpp_source.html +++ b/ListField_8cpp_source.html @@ -221,7 +221,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/ListField_8h_source.html b/ListField_8h_source.html index 6ec3d173..c52cb556 100644 --- a/ListField_8h_source.html +++ b/ListField_8h_source.html @@ -159,7 +159,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Melody_8cpp_source.html b/Melody_8cpp_source.html index 9917f3f4..514cac3e 100644 --- a/Melody_8cpp_source.html +++ b/Melody_8cpp_source.html @@ -215,7 +215,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Melody_8h_source.html b/Melody_8h_source.html index 42a48c9c..c8f47f43 100644 --- a/Melody_8h_source.html +++ b/Melody_8h_source.html @@ -258,7 +258,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Mono5x7_8h_source.html b/Mono5x7_8h_source.html index b0ff658c..3e1abb02 100644 --- a/Mono5x7_8h_source.html +++ b/Mono5x7_8h_source.html @@ -246,7 +246,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/NoiseSource_8cpp_source.html b/NoiseSource_8cpp_source.html index 7117ea50..5a460460 100644 --- a/NoiseSource_8cpp_source.html +++ b/NoiseSource_8cpp_source.html @@ -132,7 +132,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/NoiseSource_8h_source.html b/NoiseSource_8h_source.html index fc1c270a..9bd6b645 100644 --- a/NoiseSource_8h_source.html +++ b/NoiseSource_8h_source.html @@ -139,7 +139,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/OFB_8cpp_source.html b/OFB_8cpp_source.html index 79d52669..bc749183 100644 --- a/OFB_8cpp_source.html +++ b/OFB_8cpp_source.html @@ -206,7 +206,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/OFB_8h_source.html b/OFB_8h_source.html index 9fa3266b..ae497a9a 100644 --- a/OFB_8h_source.html +++ b/OFB_8h_source.html @@ -171,7 +171,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/PowerSave_8cpp_source.html b/PowerSave_8cpp_source.html index f7e1ca50..0aa22da0 100644 --- a/PowerSave_8cpp_source.html +++ b/PowerSave_8cpp_source.html @@ -155,7 +155,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/PowerSave_8h_source.html b/PowerSave_8h_source.html index 637fef14..a60bc456 100644 --- a/PowerSave_8h_source.html +++ b/PowerSave_8h_source.html @@ -158,7 +158,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/RC5_8h_source.html b/RC5_8h_source.html index 77cc2529..5856c56c 100644 --- a/RC5_8h_source.html +++ b/RC5_8h_source.html @@ -435,7 +435,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/RNG_8cpp_source.html b/RNG_8cpp_source.html index 99afb3aa..cd0018de 100644 --- a/RNG_8cpp_source.html +++ b/RNG_8cpp_source.html @@ -365,7 +365,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/RNG_8h_source.html b/RNG_8h_source.html index 2fd29ddb..6e2d19dc 100644 --- a/RNG_8h_source.html +++ b/RNG_8h_source.html @@ -173,7 +173,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/RTC_8cpp_source.html b/RTC_8cpp_source.html index 44e33921..9bbc14c0 100644 --- a/RTC_8cpp_source.html +++ b/RTC_8cpp_source.html @@ -380,7 +380,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/RTC_8h_source.html b/RTC_8h_source.html index 448adbe0..6151a573 100644 --- a/RTC_8h_source.html +++ b/RTC_8h_source.html @@ -231,7 +231,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/RingOscillatorNoiseSource_8cpp_source.html b/RingOscillatorNoiseSource_8cpp_source.html new file mode 100644 index 00000000..e20dc95b --- /dev/null +++ b/RingOscillatorNoiseSource_8cpp_source.html @@ -0,0 +1,293 @@ + + + + + + +ArduinoLibs: RingOscillatorNoiseSource.cpp Source File + + + + + + + + + +
+
+ + + + + + +
+
ArduinoLibs +
+
+
+ + + + + + +
+ All Classes Files Functions Variables Typedefs Enumerations Enumerator Groups Pages
+ + +
+ +
+ + +
+
+
+
RingOscillatorNoiseSource.cpp
+
+
+
1 /*
+
2  * Copyright (C) 2015 Southern Storm Software, Pty Ltd.
+
3  *
+
4  * Permission is hereby granted, free of charge, to any person obtaining a
+
5  * copy of this software and associated documentation files (the "Software"),
+
6  * to deal in the Software without restriction, including without limitation
+
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+
8  * and/or sell copies of the Software, and to permit persons to whom the
+
9  * Software is furnished to do so, subject to the following conditions:
+
10  *
+
11  * The above copyright notice and this permission notice shall be included
+
12  * in all copies or substantial portions of the Software.
+
13  *
+
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+
15  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+
16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+
17  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+
18  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+
19  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+
20  * DEALINGS IN THE SOFTWARE.
+
21  */
+
22 
+
23 #include "RingOscillatorNoiseSource.h"
+
24 #include "Crypto.h"
+
25 #include "RNG.h"
+
26 #include <Arduino.h>
+
27 
+
100 // Choose the input capture timer and pin to use for this board.
+
101 #if defined(__AVR_ATmega2560__) || defined(__AVR_ATmega1280__)
+
102 // Arduino Mega or Mega 2560 - input capture on TIMER4 and D49/PL0.
+
103 #define RING_TIMER 4
+
104 #define RING_PIN 49
+
105 #define RING_CAPT_vect TIMER4_CAPT_vect
+
106 #define RING_ICR ICR4
+
107 #elif defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega16U4__)
+
108 // Arduino Leonardo - input capture on Timer1 and D4/PD4.
+
109 #define RING_TIMER 1
+
110 #define RING_PIN 4
+
111 #define RING_CAPT_vect TIMER1_CAPT_vect
+
112 #define RING_ICR ICR1
+
113 #else
+
114 // Assuming Arduino Uno or equivalent - input capture on TIMER1 and D8/PB0.
+
115 #define RING_TIMER 1
+
116 #define RING_PIN 8
+
117 #define RING_CAPT_vect TIMER1_CAPT_vect
+
118 #define RING_ICR ICR1
+
119 #endif
+
120 
+
121 // Calibration states.
+
122 #define NOISE_NOT_CALIBRATING 0
+
123 #define NOISE_CALIBRATING 1
+
124 
+
125 // If there is no capture event for this many milliseconds,
+
126 // then assume that the oscillator is stopped or disconnected.
+
127 #define RING_DISCONNECT_TIME 200
+
128 
+
129 RingOscillatorNoiseSource::RingOscillatorNoiseSource()
+
130  : calState(NOISE_CALIBRATING)
+
131  , lastSignal(millis())
+
132 {
+
133  // Initialize the bit collection routines.
+
134  restart();
+
135 
+
136  // Set up the capture pin as an input with no pull-ups.
+
137  pinMode(RING_PIN, INPUT);
+
138  digitalWrite(RING_PIN, LOW);
+
139 
+
140 #if RING_TIMER == 1
+
141  // Set up TIMER1 to perform input capture on PB8/D8.
+
142  TCCR1B = 0; // Turn off TIMER1.
+
143  TIMSK1 = 0; // Turn off TIMER1 interrupts.
+
144  TCNT1 = 0; // Zero the timer.
+
145  TCCR1A = 0; // Turn off output compare.
+
146  TCCR1B |= (1 << ICES1); // Input capture on rising edge.
+
147  TIMSK1 |= (1 << ICIE1); // Input capture interrupts enabled.
+
148 
+
149  // Start TIMER1 at the highest frequency with no prescaling.
+
150  TCCR1B |= (1 << CS10);
+
151 #elif RING_TIMER == 4
+
152  // Set up TIMER4 to perform input capture on PL0/D49.
+
153  TCCR4B = 0; // Turn off TIMER4.
+
154  TIMSK4 = 0; // Turn off TIMER4 interrupts.
+
155  TCNT4 = 0; // Zero the timer.
+
156  TCCR4A = 0; // Turn off output compare.
+
157  TCCR4B |= (1 << ICES4); // Input capture on rising edge.
+
158  TIMSK4 |= (1 << ICIE4); // Input capture interrupts enabled.
+
159 
+
160  // Start TIMER4 at the highest frequency with no prescaling.
+
161  TCCR4B |= (1 << CS10);
+
162 #endif
+
163 }
+
164 
+
165 RingOscillatorNoiseSource::~RingOscillatorNoiseSource()
+
166 {
+
167  // Turn off the capture timer.
+
168 #if RING_TIMER == 1
+
169  TCCR1B = 0;
+
170 #elif RING_TIMER == 4
+
171  TCCR4B = 0;
+
172 #endif
+
173 
+
174  // Clean up.
+
175  clean(buffer);
+
176 }
+
177 
+ +
179 {
+
180  return calState == NOISE_CALIBRATING;
+
181 }
+
182 
+
183 static uint16_t volatile out = 0;
+
184 static uint8_t volatile outBits = 0;
+
185 
+
186 // Interrupt service routine for the timer's input capture interrupt.
+
187 ISR(RING_CAPT_vect)
+
188 {
+
189  // We are interested in the jitter; that is the difference in
+
190  // time between one rising edge and the next in the signal.
+
191  // Extract a single bit from the jitter and add it to the
+
192  // rolling "out" buffer for the main code to process later.
+
193  // If the buffer overflows, we discard bits and keep going.
+
194  static uint16_t prev = 0;
+
195  uint16_t next = RING_ICR;
+
196  out = (out << 1) | ((next - prev) & 1);
+
197  prev = next;
+
198  ++outBits;
+
199 }
+
200 
+ +
202 {
+
203  // If the "out" buffer is full, then convert the bits. Turn off
+
204  // interrupts while we read the "out" buffer and reset "outBits".
+
205  unsigned long now = millis();
+
206  cli();
+
207  if (outBits >= 16) {
+
208  uint16_t bits = out;
+
209  outBits = 0;
+
210  sei();
+
211  for (uint8_t index = 0; index < 8; ++index) {
+
212  // Collect two bits of input and remove bias using the Von Neumann
+
213  // method. If both bits are the same, then discard both.
+
214  // Otherwise choose one of the bits and output that one.
+
215  // We have to do this carefully so that instruction timing does
+
216  // not reveal the value of the bit that is chosen.
+
217  if ((bits ^ (bits << 1)) & 0x8000) {
+
218  // The bits are different: add the top-most to the buffer.
+
219  if (posn < sizeof(buffer)) {
+
220  buffer[posn] = (buffer[posn] >> 1) |
+
221  (((uint8_t)(bits >> 8)) & (uint8_t)0x80);
+
222  if (++bitNum >= 8) {
+
223  ++posn;
+
224  bitNum = 0;
+
225  }
+
226  }
+
227  }
+
228  bits = bits << 2;
+
229  }
+
230  } else {
+
231  // The "out" buffer isn't full yet. Re-enable interrupts.
+
232  sei();
+
233 
+
234  // If it has been too long since the last useful block,
+
235  // then go back to calibrating. The oscillator may be
+
236  // stopped or disconnected.
+
237  if (calState == NOISE_NOT_CALIBRATING) {
+
238  if ((now - lastSignal) >= RING_DISCONNECT_TIME) {
+
239  restart();
+
240  calState = NOISE_CALIBRATING;
+
241  }
+
242  }
+
243  }
+
244 
+
245  // If the buffer is full, then stir it into the random number pool.
+
246  // We credit 1 bit of entropy for every 8 bits of output because
+
247  // ring oscillators aren't quite as good as a true noise source.
+
248  // We have to collect a lot more data to get something random enough.
+
249  if (posn >= sizeof(buffer)) {
+
250  output(buffer, posn, posn);
+
251  restart();
+
252  calState = NOISE_NOT_CALIBRATING;
+
253  lastSignal = now;
+
254  }
+
255 }
+
256 
+
257 void RingOscillatorNoiseSource::restart()
+
258 {
+
259  clean(buffer);
+
260  prevBit = 0;
+
261  posn = 0;
+
262  bitNum = 0;
+
263 }
+
void stir()
Stirs entropy from this noise source into the global random number pool.
+
bool calibrating() const
Determine if the noise source is still calibrating itself.
+
virtual void output(const uint8_t *data, size_t len, unsigned int credit)
Called from subclasses to output noise to the global random number pool.
+
+ + + + diff --git a/RingOscillatorNoiseSource_8h_source.html b/RingOscillatorNoiseSource_8h_source.html new file mode 100644 index 00000000..1acb4d25 --- /dev/null +++ b/RingOscillatorNoiseSource_8h_source.html @@ -0,0 +1,153 @@ + + + + + + +ArduinoLibs: RingOscillatorNoiseSource.h Source File + + + + + + + + + +
+
+ + + + + + +
+
ArduinoLibs +
+
+
+ + + + + + +
+ All Classes Files Functions Variables Typedefs Enumerations Enumerator Groups Pages
+ + +
+ +
+ + +
+
+
+
RingOscillatorNoiseSource.h
+
+
+
1 /*
+
2  * Copyright (C) 2015 Southern Storm Software, Pty Ltd.
+
3  *
+
4  * Permission is hereby granted, free of charge, to any person obtaining a
+
5  * copy of this software and associated documentation files (the "Software"),
+
6  * to deal in the Software without restriction, including without limitation
+
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+
8  * and/or sell copies of the Software, and to permit persons to whom the
+
9  * Software is furnished to do so, subject to the following conditions:
+
10  *
+
11  * The above copyright notice and this permission notice shall be included
+
12  * in all copies or substantial portions of the Software.
+
13  *
+
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+
15  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+
16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+
17  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+
18  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+
19  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+
20  * DEALINGS IN THE SOFTWARE.
+
21  */
+
22 
+
23 #ifndef CRYPTO_RINGOSCILLATORNOISESOURCE_H
+
24 #define CRYPTO_RINGOSCILLATORNOISESOURCE_H
+
25 
+
26 #include <inttypes.h>
+
27 #include "NoiseSource.h"
+
28 
+ +
30 {
+
31 public:
+ +
33  virtual ~RingOscillatorNoiseSource();
+
34 
+
35  bool calibrating() const;
+
36 
+
37  void stir();
+
38 
+
39 private:
+
40  uint8_t prevBit;
+
41  uint8_t posn;
+
42  uint8_t bitNum;
+
43  uint8_t calState;
+
44  uint8_t buffer[32];
+
45  unsigned long lastSignal;
+
46 
+
47  void restart();
+
48 };
+
49 
+
50 #endif
+
void stir()
Stirs entropy from this noise source into the global random number pool.
+
bool calibrating() const
Determine if the noise source is still calibrating itself.
+
Abstract base class for random noise sources.
Definition: NoiseSource.h:29
+
Processes the signal from a ring oscillator based noise source.
+
+ + + + diff --git a/SHA1_8cpp_source.html b/SHA1_8cpp_source.html index 9bfdf149..e0af757c 100644 --- a/SHA1_8cpp_source.html +++ b/SHA1_8cpp_source.html @@ -301,7 +301,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/SHA1_8h_source.html b/SHA1_8h_source.html index 5572640f..0f012319 100644 --- a/SHA1_8h_source.html +++ b/SHA1_8h_source.html @@ -155,7 +155,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/SHA256_8cpp_source.html b/SHA256_8cpp_source.html index 2a85c94f..ebdfcb46 100644 --- a/SHA256_8cpp_source.html +++ b/SHA256_8cpp_source.html @@ -317,7 +317,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/SHA256_8h_source.html b/SHA256_8h_source.html index 8a99c980..5b9f54a0 100644 --- a/SHA256_8h_source.html +++ b/SHA256_8h_source.html @@ -155,7 +155,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/SHA3_8cpp_source.html b/SHA3_8cpp_source.html index e6b083fa..f5b28b02 100644 --- a/SHA3_8cpp_source.html +++ b/SHA3_8cpp_source.html @@ -221,7 +221,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/SHA3_8h_source.html b/SHA3_8h_source.html index e28f28eb..24b7fc1d 100644 --- a/SHA3_8h_source.html +++ b/SHA3_8h_source.html @@ -178,7 +178,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/SHA512_8cpp_source.html b/SHA512_8cpp_source.html index aa2510d5..ed0f2f9c 100644 --- a/SHA512_8cpp_source.html +++ b/SHA512_8cpp_source.html @@ -333,7 +333,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/SHA512_8h_source.html b/SHA512_8h_source.html index 2870a7b0..57107f09 100644 --- a/SHA512_8h_source.html +++ b/SHA512_8h_source.html @@ -156,7 +156,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/SoftI2C_8cpp_source.html b/SoftI2C_8cpp_source.html index 4e3b4b7b..59bf1d6c 100644 --- a/SoftI2C_8cpp_source.html +++ b/SoftI2C_8cpp_source.html @@ -283,7 +283,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/SoftI2C_8h_source.html b/SoftI2C_8h_source.html index 85eb1038..9a7cd4ca 100644 --- a/SoftI2C_8h_source.html +++ b/SoftI2C_8h_source.html @@ -157,7 +157,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/TextField_8cpp_source.html b/TextField_8cpp_source.html index 6fd7da7d..5144db5f 100644 --- a/TextField_8cpp_source.html +++ b/TextField_8cpp_source.html @@ -156,7 +156,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/TextField_8h_source.html b/TextField_8h_source.html index ccbcc222..ee9c4780 100644 --- a/TextField_8h_source.html +++ b/TextField_8h_source.html @@ -142,7 +142,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/TimeField_8cpp_source.html b/TimeField_8cpp_source.html index 333c3e12..ceb23aef 100644 --- a/TimeField_8cpp_source.html +++ b/TimeField_8cpp_source.html @@ -325,7 +325,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/TimeField_8h_source.html b/TimeField_8h_source.html index dcabdb93..7f764528 100644 --- a/TimeField_8h_source.html +++ b/TimeField_8h_source.html @@ -167,7 +167,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/TransistorNoiseSource_8cpp_source.html b/TransistorNoiseSource_8cpp_source.html index c96a5b76..56341e29 100644 --- a/TransistorNoiseSource_8cpp_source.html +++ b/TransistorNoiseSource_8cpp_source.html @@ -295,7 +295,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/TransistorNoiseSource_8h_source.html b/TransistorNoiseSource_8h_source.html index 5a687d62..7b358ed4 100644 --- a/TransistorNoiseSource_8h_source.html +++ b/TransistorNoiseSource_8h_source.html @@ -151,7 +151,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/alarm-clock_8dox.html b/alarm-clock_8dox.html index c9c10071..40cd8027 100644 --- a/alarm-clock_8dox.html +++ b/alarm-clock_8dox.html @@ -87,7 +87,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/alarm_clock.html b/alarm_clock.html index 9af73308..907f730b 100644 --- a/alarm_clock.html +++ b/alarm_clock.html @@ -140,7 +140,7 @@ Completed Clock diff --git a/annotated.html b/annotated.html index 3f758c4b..f5d30b37 100644 --- a/annotated.html +++ b/annotated.html @@ -127,26 +127,27 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); oCNoiseSourceAbstract base class for random noise sources oCOFBImplementation of the Output Feedback (OFB) mode for 128-bit block ciphers oCOFBCommonConcrete base class to assist with implementing OFB for 128-bit block ciphers -oCRNGClassPseudo random number generator suitable for cryptography -oCRTCBase class for realtime clock handlers -oCRTCAlarmStores alarm information from a realtime clock chip -oCRTCDateStores date information from a realtime clock chip -oCRTCTimeStores time information from a realtime clock chip -oCSHA1SHA-1 hash algorithm -oCSHA256SHA-256 hash algorithm -oCSHA3_256SHA3-256 hash algorithm -oCSHA3_512SHA3-512 hash algorithm -oCSHA512SHA-512 hash algorithm -oCSoftI2CBit-banged implementation of an I2C master -oCTextFieldField that displays a read-only text value -oCTimeFieldField that manages the display and editing of a time value -\CTransistorNoiseSourceProcesses the signal from a transistor-based noise source +oCRingOscillatorNoiseSourceProcesses the signal from a ring oscillator based noise source +oCRNGClassPseudo random number generator suitable for cryptography +oCRTCBase class for realtime clock handlers +oCRTCAlarmStores alarm information from a realtime clock chip +oCRTCDateStores date information from a realtime clock chip +oCRTCTimeStores time information from a realtime clock chip +oCSHA1SHA-1 hash algorithm +oCSHA256SHA-256 hash algorithm +oCSHA3_256SHA3-256 hash algorithm +oCSHA3_512SHA3-512 hash algorithm +oCSHA512SHA-512 hash algorithm +oCSoftI2CBit-banged implementation of an I2C master +oCTextFieldField that displays a read-only text value +oCTimeFieldField that manages the display and editing of a time value +\CTransistorNoiseSourceProcesses the signal from a transistor-based noise source diff --git a/blink-blink_8dox.html b/blink-blink_8dox.html index 4411c7c8..6c2519f6 100644 --- a/blink-blink_8dox.html +++ b/blink-blink_8dox.html @@ -87,7 +87,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/blink-charlieplex_8dox.html b/blink-charlieplex_8dox.html index 014e4f44..4d1b66d4 100644 --- a/blink-charlieplex_8dox.html +++ b/blink-charlieplex_8dox.html @@ -87,7 +87,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/blink-cylon_8dox.html b/blink-cylon_8dox.html index a34468dd..55149c5e 100644 --- a/blink-cylon_8dox.html +++ b/blink-cylon_8dox.html @@ -87,7 +87,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/blink-startrek_8dox.html b/blink-startrek_8dox.html index 2ab2a884..3f923899 100644 --- a/blink-startrek_8dox.html +++ b/blink-startrek_8dox.html @@ -87,7 +87,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/blink_blink.html b/blink_blink.html index e337c98c..3ac79dda 100644 --- a/blink_blink.html +++ b/blink_blink.html @@ -120,7 +120,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/blink_charlieplex.html b/blink_charlieplex.html index 2ecb54d3..0fa687f6 100644 --- a/blink_charlieplex.html +++ b/blink_charlieplex.html @@ -160,7 +160,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/blink_cylon.html b/blink_cylon.html index 67033cf1..ea1ad046 100644 --- a/blink_cylon.html +++ b/blink_cylon.html @@ -171,7 +171,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/blink_startrek.html b/blink_startrek.html index d4a7096a..68a980e6 100644 --- a/blink_startrek.html +++ b/blink_startrek.html @@ -237,7 +237,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classAES128-members.html b/classAES128-members.html index d27ee9ad..0992a4a9 100644 --- a/classAES128-members.html +++ b/classAES128-members.html @@ -105,7 +105,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classAES128.html b/classAES128.html index 68ecb927..a4a736da 100644 --- a/classAES128.html +++ b/classAES128.html @@ -265,7 +265,7 @@ Additional Inherited Members diff --git a/classAES192-members.html b/classAES192-members.html index 554a7ab7..be8b6457 100644 --- a/classAES192-members.html +++ b/classAES192-members.html @@ -105,7 +105,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classAES192.html b/classAES192.html index 64597179..f41bcd17 100644 --- a/classAES192.html +++ b/classAES192.html @@ -265,7 +265,7 @@ Additional Inherited Members diff --git a/classAES256-members.html b/classAES256-members.html index dc207877..644dcdc2 100644 --- a/classAES256-members.html +++ b/classAES256-members.html @@ -105,7 +105,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classAES256.html b/classAES256.html index a0b1e69b..9e26bdac 100644 --- a/classAES256.html +++ b/classAES256.html @@ -265,7 +265,7 @@ Additional Inherited Members diff --git a/classAESCommon-members.html b/classAESCommon-members.html index a96ab57d..6f0574e9 100644 --- a/classAESCommon-members.html +++ b/classAESCommon-members.html @@ -103,7 +103,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classAESCommon.html b/classAESCommon.html index c4230843..9676b4f6 100644 --- a/classAESCommon.html +++ b/classAESCommon.html @@ -322,7 +322,7 @@ Protected Member Functions diff --git a/classBLAKE2b-members.html b/classBLAKE2b-members.html index 3763229c..5e4c06a5 100644 --- a/classBLAKE2b-members.html +++ b/classBLAKE2b-members.html @@ -110,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classBLAKE2b.html b/classBLAKE2b.html index f28ea0db..3db6be26 100644 --- a/classBLAKE2b.html +++ b/classBLAKE2b.html @@ -405,7 +405,7 @@ virtual  diff --git a/classBLAKE2s-members.html b/classBLAKE2s-members.html index 2784e350..cbdb4e75 100644 --- a/classBLAKE2s-members.html +++ b/classBLAKE2s-members.html @@ -109,7 +109,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classBLAKE2s.html b/classBLAKE2s.html index 8ca02e76..0d908666 100644 --- a/classBLAKE2s.html +++ b/classBLAKE2s.html @@ -405,7 +405,7 @@ virtual  diff --git a/classBitmap-members.html b/classBitmap-members.html index 2221b4be..7b76af7b 100644 --- a/classBitmap-members.html +++ b/classBitmap-members.html @@ -138,7 +138,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classBitmap.html b/classBitmap.html index 28a34cbe..4ba30530 100644 --- a/classBitmap.html +++ b/classBitmap.html @@ -1745,7 +1745,7 @@ class DMD diff --git a/classBlinkLED-members.html b/classBlinkLED-members.html index 36ce6a71..f3392b5f 100644 --- a/classBlinkLED-members.html +++ b/classBlinkLED-members.html @@ -103,7 +103,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classBlinkLED.html b/classBlinkLED.html index ef461e9e..4c9c613d 100644 --- a/classBlinkLED.html +++ b/classBlinkLED.html @@ -428,7 +428,7 @@ Public Member Functions diff --git a/classBlockCipher-members.html b/classBlockCipher-members.html index a32815f7..82f9b8ac 100644 --- a/classBlockCipher-members.html +++ b/classBlockCipher-members.html @@ -101,7 +101,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classBlockCipher.html b/classBlockCipher.html index e2cf3d1c..6f7b208b 100644 --- a/classBlockCipher.html +++ b/classBlockCipher.html @@ -407,7 +407,7 @@ Public Member Functions diff --git a/classBoolField-members.html b/classBoolField-members.html index 3f4cec7e..0a1b6e33 100644 --- a/classBoolField-members.html +++ b/classBoolField-members.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classBoolField.html b/classBoolField.html index 4adea552..969e49e1 100644 --- a/classBoolField.html +++ b/classBoolField.html @@ -506,7 +506,7 @@ LiquidCrystal *  diff --git a/classCBC-members.html b/classCBC-members.html index 97c6cb4c..4c03814d 100644 --- a/classCBC-members.html +++ b/classCBC-members.html @@ -106,7 +106,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classCBC.html b/classCBC.html index abc3a280..4ee3d756 100644 --- a/classCBC.html +++ b/classCBC.html @@ -185,7 +185,7 @@ class CBC< T > diff --git a/classCBCCommon-members.html b/classCBCCommon-members.html index 35bb8bf6..899f8178 100644 --- a/classCBCCommon-members.html +++ b/classCBCCommon-members.html @@ -105,7 +105,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classCBCCommon.html b/classCBCCommon.html index b6a06f17..520f1735 100644 --- a/classCBCCommon.html +++ b/classCBCCommon.html @@ -534,7 +534,7 @@ Protected Member Functions diff --git a/classCFB-members.html b/classCFB-members.html index d35b9f41..b72edd7f 100644 --- a/classCFB-members.html +++ b/classCFB-members.html @@ -106,7 +106,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classCFB.html b/classCFB.html index a1731b58..3f7cf584 100644 --- a/classCFB.html +++ b/classCFB.html @@ -185,7 +185,7 @@ class CFB< T > diff --git a/classCFBCommon-members.html b/classCFBCommon-members.html index 12bbea11..5a7268f5 100644 --- a/classCFBCommon-members.html +++ b/classCFBCommon-members.html @@ -105,7 +105,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classCFBCommon.html b/classCFBCommon.html index 5045c938..b421a47a 100644 --- a/classCFBCommon.html +++ b/classCFBCommon.html @@ -534,7 +534,7 @@ Protected Member Functions diff --git a/classCTR-members.html b/classCTR-members.html index 0c9edfdd..ea1b42d6 100644 --- a/classCTR-members.html +++ b/classCTR-members.html @@ -107,7 +107,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classCTR.html b/classCTR.html index 08a96cab..f222cc5e 100644 --- a/classCTR.html +++ b/classCTR.html @@ -181,7 +181,7 @@ class CTR< T > diff --git a/classCTRCommon-members.html b/classCTRCommon-members.html index a5bce5be..cf778002 100644 --- a/classCTRCommon-members.html +++ b/classCTRCommon-members.html @@ -106,7 +106,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classCTRCommon.html b/classCTRCommon.html index 2dcec73a..08f5acae 100644 --- a/classCTRCommon.html +++ b/classCTRCommon.html @@ -563,7 +563,7 @@ Protected Member Functions diff --git a/classChaCha-members.html b/classChaCha-members.html index ae4c4b3f..fe989c08 100644 --- a/classChaCha-members.html +++ b/classChaCha-members.html @@ -108,7 +108,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classChaCha.html b/classChaCha.html index cd27e6e9..75525ca6 100644 --- a/classChaCha.html +++ b/classChaCha.html @@ -666,7 +666,7 @@ Static Public Member Functions diff --git a/classCharlieplex-members.html b/classCharlieplex-members.html index 60fc06e6..a94f3471 100644 --- a/classCharlieplex-members.html +++ b/classCharlieplex-members.html @@ -104,7 +104,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classCharlieplex.html b/classCharlieplex.html index 7b6f8f72..2dc58cc3 100644 --- a/classCharlieplex.html +++ b/classCharlieplex.html @@ -538,7 +538,7 @@ Public Member Functions diff --git a/classChaseLEDs-members.html b/classChaseLEDs-members.html index 221e2ed3..8a6935f5 100644 --- a/classChaseLEDs-members.html +++ b/classChaseLEDs-members.html @@ -99,7 +99,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classChaseLEDs.html b/classChaseLEDs.html index ce151eff..b9f525e6 100644 --- a/classChaseLEDs.html +++ b/classChaseLEDs.html @@ -347,7 +347,7 @@ Protected Member Functions diff --git a/classCipher-members.html b/classCipher-members.html index 560ef866..0074639f 100644 --- a/classCipher-members.html +++ b/classCipher-members.html @@ -102,7 +102,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classCipher.html b/classCipher.html index 10b6e61d..e87629c6 100644 --- a/classCipher.html +++ b/classCipher.html @@ -479,7 +479,7 @@ Public Member Functions diff --git a/classCurve25519-members.html b/classCurve25519-members.html index e2d4aca9..62a9e4fe 100644 --- a/classCurve25519-members.html +++ b/classCurve25519-members.html @@ -96,7 +96,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classCurve25519.html b/classCurve25519.html index 8aa9f163..de1b79e1 100644 --- a/classCurve25519.html +++ b/classCurve25519.html @@ -295,7 +295,7 @@ Static Public Member Functions diff --git a/classDMD-members.html b/classDMD-members.html index 0502f168..1fe68461 100644 --- a/classDMD-members.html +++ b/classDMD-members.html @@ -150,7 +150,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classDMD.html b/classDMD.html index 2c91b0cb..850755e9 100644 --- a/classDMD.html +++ b/classDMD.html @@ -755,7 +755,7 @@ Multiple panels diff --git a/classDS1307RTC-members.html b/classDS1307RTC-members.html index ff69e367..9406c334 100644 --- a/classDS1307RTC-members.html +++ b/classDS1307RTC-members.html @@ -125,7 +125,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classDS1307RTC.html b/classDS1307RTC.html index 59399528..97adc0c2 100644 --- a/classDS1307RTC.html +++ b/classDS1307RTC.html @@ -598,7 +598,7 @@ static const uint8_t  diff --git a/classDS3232RTC-members.html b/classDS3232RTC-members.html index dd446ff4..148c0930 100644 --- a/classDS3232RTC-members.html +++ b/classDS3232RTC-members.html @@ -130,7 +130,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classDS3232RTC.html b/classDS3232RTC.html index 5e78bb2f..439e3744 100644 --- a/classDS3232RTC.html +++ b/classDS3232RTC.html @@ -750,7 +750,7 @@ static const uint8_t  diff --git a/classEEPROM24-members.html b/classEEPROM24-members.html index 3c291a28..a0bb0d5e 100644 --- a/classEEPROM24-members.html +++ b/classEEPROM24-members.html @@ -101,7 +101,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classEEPROM24.html b/classEEPROM24.html index 555e1e4e..5ec3ecbe 100644 --- a/classEEPROM24.html +++ b/classEEPROM24.html @@ -431,7 +431,7 @@ Public Member Functions diff --git a/classField-members.html b/classField-members.html index dc0645a0..9e330222 100644 --- a/classField-members.html +++ b/classField-members.html @@ -106,7 +106,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classField.html b/classField.html index a682841d..55d70000 100644 --- a/classField.html +++ b/classField.html @@ -424,7 +424,7 @@ class Form diff --git a/classForm-members.html b/classForm-members.html index afb7a9bc..d3fbaa59 100644 --- a/classForm-members.html +++ b/classForm-members.html @@ -108,7 +108,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classForm.html b/classForm.html index 3c446ac8..72aad5d8 100644 --- a/classForm.html +++ b/classForm.html @@ -485,7 +485,7 @@ class Field diff --git a/classHash-members.html b/classHash-members.html index 6475adb7..246205e0 100644 --- a/classHash-members.html +++ b/classHash-members.html @@ -101,7 +101,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classHash.html b/classHash.html index 8cb5e253..855ec0a4 100644 --- a/classHash.html +++ b/classHash.html @@ -389,7 +389,7 @@ Public Member Functions diff --git a/classI2CMaster-members.html b/classI2CMaster-members.html index f7b51261..5d4919f0 100644 --- a/classI2CMaster-members.html +++ b/classI2CMaster-members.html @@ -100,7 +100,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classI2CMaster.html b/classI2CMaster.html index 273717a6..e7e43576 100644 --- a/classI2CMaster.html +++ b/classI2CMaster.html @@ -328,7 +328,7 @@ virtual unsigned int  diff --git a/classIRreceiver-members.html b/classIRreceiver-members.html index ad2506ea..723d3f92 100644 --- a/classIRreceiver-members.html +++ b/classIRreceiver-members.html @@ -100,7 +100,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classIRreceiver.html b/classIRreceiver.html index eff78d7f..66f3ac09 100644 --- a/classIRreceiver.html +++ b/classIRreceiver.html @@ -328,7 +328,7 @@ void _IR_receive_interrupt diff --git a/classIntField-members.html b/classIntField-members.html index d4a4ceed..ffeb89ba 100644 --- a/classIntField-members.html +++ b/classIntField-members.html @@ -118,7 +118,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classIntField.html b/classIntField.html index 24ddf26f..e873fce3 100644 --- a/classIntField.html +++ b/classIntField.html @@ -647,7 +647,7 @@ LiquidCrystal *  diff --git a/classKeccakCore-members.html b/classKeccakCore-members.html index aab23f6d..bc6da467 100644 --- a/classKeccakCore-members.html +++ b/classKeccakCore-members.html @@ -107,7 +107,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classKeccakCore.html b/classKeccakCore.html index fe91b78d..3960d19e 100644 --- a/classKeccakCore.html +++ b/classKeccakCore.html @@ -370,7 +370,7 @@ void  diff --git a/classLCD-members.html b/classLCD-members.html index 6925d2b8..7100f2be 100644 --- a/classLCD-members.html +++ b/classLCD-members.html @@ -110,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classLCD.html b/classLCD.html index 04f8dc49..9cf7d268 100644 --- a/classLCD.html +++ b/classLCD.html @@ -528,7 +528,7 @@ Support for DFRobot LCD Shield diff --git a/classListField-members.html b/classListField-members.html index e0f3df34..5716eb43 100644 --- a/classListField-members.html +++ b/classListField-members.html @@ -111,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classListField.html b/classListField.html index e82ced3f..08ae4035 100644 --- a/classListField.html +++ b/classListField.html @@ -411,7 +411,7 @@ LiquidCrystal *  diff --git a/classMelody-members.html b/classMelody-members.html index a1e593be..4d02f363 100644 --- a/classMelody-members.html +++ b/classMelody-members.html @@ -103,7 +103,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classMelody.html b/classMelody.html index e8224cd5..8352158a 100644 --- a/classMelody.html +++ b/classMelody.html @@ -371,7 +371,7 @@ bool  diff --git a/classNoiseSource-members.html b/classNoiseSource-members.html index 10c19f78..36c1df58 100644 --- a/classNoiseSource-members.html +++ b/classNoiseSource-members.html @@ -98,7 +98,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classNoiseSource.html b/classNoiseSource.html index 35cbf4eb..e1b0f804 100644 --- a/classNoiseSource.html +++ b/classNoiseSource.html @@ -102,7 +102,8 @@ Inheritance diagram for NoiseSource:
-TransistorNoiseSource +RingOscillatorNoiseSource +TransistorNoiseSource
@@ -162,7 +163,7 @@ Protected Member Functions

It is possible that the noise source never exits calibration. This can happen if the input voltage is insufficient to trigger noise or if the noise source is not connected. Noise sources may also periodically recalibrate themselves.

See Also
stir()
-

Implemented in TransistorNoiseSource.

+

Implemented in RingOscillatorNoiseSource, and TransistorNoiseSource.

@@ -246,7 +247,7 @@ Protected Member Functions

The noise source should batch up the entropy data, providing between 16 and 48 bytes of data each time. If the noise source does not have sufficient entropy data at the moment, it should return without stiring the current data in.

See Also
calibrating(), output()
-

Implemented in TransistorNoiseSource.

+

Implemented in RingOscillatorNoiseSource, and TransistorNoiseSource.

@@ -257,7 +258,7 @@ Protected Member Functions diff --git a/classNoiseSource.png b/classNoiseSource.png index 785a8ea5..ece76a1f 100644 Binary files a/classNoiseSource.png and b/classNoiseSource.png differ diff --git a/classOFB-members.html b/classOFB-members.html index 1b0ae222..02a5fb33 100644 --- a/classOFB-members.html +++ b/classOFB-members.html @@ -106,7 +106,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
diff --git a/classOFB.html b/classOFB.html index 76ddb4c1..b900aa3e 100644 --- a/classOFB.html +++ b/classOFB.html @@ -181,7 +181,7 @@ class OFB< T > diff --git a/classOFBCommon-members.html b/classOFBCommon-members.html index f33b5a5e..27223c02 100644 --- a/classOFBCommon-members.html +++ b/classOFBCommon-members.html @@ -105,7 +105,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classOFBCommon.html b/classOFBCommon.html index 423fd7fe..e77d2016 100644 --- a/classOFBCommon.html +++ b/classOFBCommon.html @@ -534,7 +534,7 @@ Protected Member Functions diff --git a/classRNGClass-members.html b/classRNGClass-members.html index 5334223f..91b65af0 100644 --- a/classRNGClass-members.html +++ b/classRNGClass-members.html @@ -105,7 +105,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classRNGClass.html b/classRNGClass.html index d6703414..d28d30c3 100644 --- a/classRNGClass.html +++ b/classRNGClass.html @@ -516,7 +516,7 @@ static const int  diff --git a/classRTC-members.html b/classRTC-members.html index 4478d84f..3bdd2d46 100644 --- a/classRTC-members.html +++ b/classRTC-members.html @@ -123,7 +123,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classRTC.html b/classRTC.html index d33062ec..1e8c9b01 100644 --- a/classRTC.html +++ b/classRTC.html @@ -778,7 +778,7 @@ static const uint8_t  diff --git a/classRTCAlarm-members.html b/classRTCAlarm-members.html index 5600b9d3..a47e1c96 100644 --- a/classRTCAlarm-members.html +++ b/classRTCAlarm-members.html @@ -96,7 +96,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classRTCDate-members.html b/classRTCDate-members.html index 05f6ed68..6fe4168c 100644 --- a/classRTCDate-members.html +++ b/classRTCDate-members.html @@ -96,7 +96,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classRTCTime-members.html b/classRTCTime-members.html index 8028896a..99afaffd 100644 --- a/classRTCTime-members.html +++ b/classRTCTime-members.html @@ -96,7 +96,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classRingOscillatorNoiseSource-members.html b/classRingOscillatorNoiseSource-members.html new file mode 100644 index 00000000..90c2bed3 --- /dev/null +++ b/classRingOscillatorNoiseSource-members.html @@ -0,0 +1,108 @@ + + + + + + +ArduinoLibs: Member List + + + + + + + + + +
+
+ + + + + + +
+
ArduinoLibs +
+
+
+ + + + + + + + + +
+ +
+ +
+
+
+
RingOscillatorNoiseSource Member List
+
+
+ +

This is the complete list of members for RingOscillatorNoiseSource, including all inherited members.

+ + + + + + + + +
calibrating() const RingOscillatorNoiseSourcevirtual
NoiseSource()NoiseSource
output(const uint8_t *data, size_t len, unsigned int credit)NoiseSourceprotectedvirtual
RingOscillatorNoiseSource() (defined in RingOscillatorNoiseSource)RingOscillatorNoiseSource
stir()RingOscillatorNoiseSourcevirtual
~NoiseSource()NoiseSourcevirtual
~RingOscillatorNoiseSource() (defined in RingOscillatorNoiseSource)RingOscillatorNoiseSourcevirtual
+ + + + diff --git a/classRingOscillatorNoiseSource.html b/classRingOscillatorNoiseSource.html new file mode 100644 index 00000000..3a587bda --- /dev/null +++ b/classRingOscillatorNoiseSource.html @@ -0,0 +1,258 @@ + + + + + + +ArduinoLibs: RingOscillatorNoiseSource Class Reference + + + + + + + + + +
+
+ + + + + + +
+
ArduinoLibs +
+
+
+ + + + + + + + + +
+ +
+ +
+
+ +
+
RingOscillatorNoiseSource Class Reference
+
+
+ +

Processes the signal from a ring oscillator based noise source. + More...

+ +

#include <RingOscillatorNoiseSource.h>

+
+Inheritance diagram for RingOscillatorNoiseSource:
+
+
+ + +NoiseSource + +
+ + + + + + + + + + + + + + + +

+Public Member Functions

bool calibrating () const
 Determine if the noise source is still calibrating itself. More...
 
void stir ()
 Stirs entropy from this noise source into the global random number pool. More...
 
- Public Member Functions inherited from NoiseSource
NoiseSource ()
 Constructs a new random noise source.
 
+virtual ~NoiseSource ()
 Destroys this random noise source.
 
+ + + + + +

+Additional Inherited Members

- Protected Member Functions inherited from NoiseSource
virtual void output (const uint8_t *data, size_t len, unsigned int credit)
 Called from subclasses to output noise to the global random number pool. More...
 
+

Detailed Description

+

Processes the signal from a ring oscillator based noise source.

+

This class processes input from a ring oscillator noise source, such as that described here.

+
Note
The output from a ring oscillator is not generally as good as a "true" noise source. The oscillation can easily settle into regular patterns or sync up with other clock sources on the board. It is even possible to "hack" a ring oscillator by injecting chosen frequencies on the power supply rails to force the oscillation into a predictable waveform (see this paper for an example). It is very important that the output of this class be whitened with RNG before it is used for cryptography and that the device is isolated from attacker-controlled sources of power. Unless you have a very good reason to use a ring oscillator, TransistorNoiseSource is usually a better option.
+

The noise is read from an input capture pin on the Arduino and stirred into the random number pool on a regular basis. The following pins are used on different Arduino variants:

+ + + + + + + + + +
VariantArduino Pin / AVR PinTimer
Arduino UnoD8 / PB0Timer 1
Arduino LeonardoD4 / PD4Timer 1
Arduino Mega or Mega 2560D49 / PL0Timer 4
+

If your board is not pin-compatible with one of the above, then the source for the RingOscillatorNoiseSource class will need to be modified to use a different pin/timer combination. Also, when the timer is in use by this class it cannot be used for other application tasks.

+

The example below shows how to initialize a ring oscillator based noise source and use it with RNG:

+
#include <Crypto.h>
+
#include <RNG.h>
+
#include <RingOscillatorNoiseSource.h>
+
+
// Noise source to seed the random number generator.
+ +
+
void setup() {
+
// Initialize the random number generator with the application tag
+
// "MyApp 1.0" and load the previous seed from EEPROM address 500.
+
RNG.begin("MyApp 1.0", 500);
+
+
// ...
+
}
+
+
void loop() {
+
// ...
+
+
// If the noise source has accumulated new entropy, then stir it in.
+
RNG.stir(noise);
+
+
// Perform regular housekeeping on the random number generator.
+
RNG.loop();
+
+
// ...
+
}
+

For more information, see the documentation for RNG.

+
See Also
RNG, NoiseSource, TransistorNoiseSource
+ +

Definition at line 29 of file RingOscillatorNoiseSource.h.

+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + +
bool RingOscillatorNoiseSource::calibrating () const
+
+virtual
+
+ +

Determine if the noise source is still calibrating itself.

+
Returns
Returns true if calibration is in progress; false if the noise source is generating valid random data.
+

Noise sources that require calibration start doing so at system startup and then switch over to random data generation once calibration is complete. Since no random data is being generated during calibration, the output from RNG.rand() may be predictable. Use RNG.available() to determine when sufficient entropy is available to generate good random values.

+

It is possible that the noise source never exits calibration. This can happen if the input voltage is insufficient to trigger noise or if the noise source is not connected. Noise sources may also periodically recalibrate themselves.

+
See Also
stir()
+ +

Implements NoiseSource.

+ +

Definition at line 178 of file RingOscillatorNoiseSource.cpp.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + +
void RingOscillatorNoiseSource::stir ()
+
+virtual
+
+ +

Stirs entropy from this noise source into the global random number pool.

+

This function should call output() to add the entropy from this noise source to the global random number pool.

+

The noise source should batch up the entropy data, providing between 16 and 48 bytes of data each time. If the noise source does not have sufficient entropy data at the moment, it should return without stiring the current data in.

+
See Also
calibrating(), output()
+ +

Implements NoiseSource.

+ +

Definition at line 201 of file RingOscillatorNoiseSource.cpp.

+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/classRingOscillatorNoiseSource.png b/classRingOscillatorNoiseSource.png new file mode 100644 index 00000000..138a6eb9 Binary files /dev/null and b/classRingOscillatorNoiseSource.png differ diff --git a/classSHA1-members.html b/classSHA1-members.html index c127be6e..93dc10ce 100644 --- a/classSHA1-members.html +++ b/classSHA1-members.html @@ -107,7 +107,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classSHA1.html b/classSHA1.html index c429671c..6ec612e7 100644 --- a/classSHA1.html +++ b/classSHA1.html @@ -375,7 +375,7 @@ virtual  diff --git a/classSHA256-members.html b/classSHA256-members.html index 24263d83..e06a3bbe 100644 --- a/classSHA256-members.html +++ b/classSHA256-members.html @@ -107,7 +107,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classSHA256.html b/classSHA256.html index d28eae79..47d8eb76 100644 --- a/classSHA256.html +++ b/classSHA256.html @@ -375,7 +375,7 @@ virtual  diff --git a/classSHA3__256-members.html b/classSHA3__256-members.html index c394a09a..93cc483d 100644 --- a/classSHA3__256-members.html +++ b/classSHA3__256-members.html @@ -103,7 +103,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classSHA3__256.html b/classSHA3__256.html index da6c29d7..20b074f9 100644 --- a/classSHA3__256.html +++ b/classSHA3__256.html @@ -375,7 +375,7 @@ virtual  diff --git a/classSHA3__512-members.html b/classSHA3__512-members.html index edb0322a..c329e6e9 100644 --- a/classSHA3__512-members.html +++ b/classSHA3__512-members.html @@ -103,7 +103,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classSHA3__512.html b/classSHA3__512.html index 063bc552..823b4fa0 100644 --- a/classSHA3__512.html +++ b/classSHA3__512.html @@ -375,7 +375,7 @@ virtual  diff --git a/classSHA512-members.html b/classSHA512-members.html index ef0ac72e..25c583e0 100644 --- a/classSHA512-members.html +++ b/classSHA512-members.html @@ -108,7 +108,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classSHA512.html b/classSHA512.html index 61efd699..e78e2a29 100644 --- a/classSHA512.html +++ b/classSHA512.html @@ -375,7 +375,7 @@ virtual  diff --git a/classSoftI2C-members.html b/classSoftI2C-members.html index 89e78ab0..3842013f 100644 --- a/classSoftI2C-members.html +++ b/classSoftI2C-members.html @@ -101,7 +101,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classSoftI2C.html b/classSoftI2C.html index 1aa27cc7..be56e478 100644 --- a/classSoftI2C.html +++ b/classSoftI2C.html @@ -346,7 +346,7 @@ unsigned int  diff --git a/classTextField-members.html b/classTextField-members.html index a0bde0cf..217cdf6c 100644 --- a/classTextField-members.html +++ b/classTextField-members.html @@ -109,7 +109,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classTextField.html b/classTextField.html index 1a31cd4b..ee73a91c 100644 --- a/classTextField.html +++ b/classTextField.html @@ -343,7 +343,7 @@ LiquidCrystal *  diff --git a/classTimeField-members.html b/classTimeField-members.html index de9aa470..b344902e 100644 --- a/classTimeField-members.html +++ b/classTimeField-members.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classTimeField.html b/classTimeField.html index d159a3db..fc91c6ca 100644 --- a/classTimeField.html +++ b/classTimeField.html @@ -541,7 +541,7 @@ LiquidCrystal *  diff --git a/classTransistorNoiseSource-members.html b/classTransistorNoiseSource-members.html index a0dd3093..433f8c9f 100644 --- a/classTransistorNoiseSource-members.html +++ b/classTransistorNoiseSource-members.html @@ -100,7 +100,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classTransistorNoiseSource.html b/classTransistorNoiseSource.html index ed1ba003..beb53b88 100644 --- a/classTransistorNoiseSource.html +++ b/classTransistorNoiseSource.html @@ -166,7 +166,7 @@ Additional Inherited Members
// ...
}
-
See Also
RNG, NoiseSource
+
See Also
RNG, NoiseSource, RingOscillatorNoiseSource

Definition at line 29 of file TransistorNoiseSource.h.

Constructor & Destructor Documentation

@@ -277,7 +277,7 @@ Additional Inherited Members diff --git a/classes.html b/classes.html index 1cc68dc5..186b3ad1 100644 --- a/classes.html +++ b/classes.html @@ -91,37 +91,37 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); + + - - + - + + + - - + + + + + - + + + - + +
  A  
CBCCommon   
  F  
-
ListField   RTCTime   
ListField   RTCDate   
CFB   
  M  
-
  S  
+
RTCTime   
AES128   CFBCommon   Field   
  S  
AES128   CFBCommon   Field   
AES192   ChaCha   Form   Melody   SHA1   
AES192   ChaCha   Form   Melody   
AES256   Charlieplex   
  H  
  N  
-
SHA256   
AESCommon   ChaseLEDs   SHA3_256   
SHA1   
AESCommon   ChaseLEDs   SHA256   
  B  
-
Cipher   Hash   NoiseSource   SHA3_512   
Cipher   Hash   NoiseSource   SHA3_256   
CTR   
  I  
  O  
-
SHA512   
Bitmap   CTRCommon   SoftI2C   
BLAKE2b   Curve25519   I2CMaster   OFB   
  T  
-
SHA3_512   
Bitmap   CTRCommon   SHA512   
BLAKE2b   Curve25519   I2CMaster   OFB   SoftI2C   
BLAKE2s   
  D  
-
IntField   OFBCommon   
IntField   OFBCommon   
  T  
+
BlinkLED   IRreceiver   
  R  
-
TextField   
BlockCipher   DMD   
  K  
-
TimeField   
BoolField   DS1307RTC   RNGClass   TransistorNoiseSource   
TextField   
BoolField   DS1307RTC   RingOscillatorNoiseSource   TimeField   
  C  
-
DS3232RTC   KeccakCore   RTC   
DS3232RTC   KeccakCore   RNGClass   TransistorNoiseSource   
  E  
  L  
-
RTCAlarm   
CBC   RTCDate   
RTC   
CBC   RTCAlarm   
EEPROM24   LCD   
@@ -129,7 +129,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/crypto-rng-ring_8dox.html b/crypto-rng-ring_8dox.html new file mode 100644 index 00000000..7952825c --- /dev/null +++ b/crypto-rng-ring_8dox.html @@ -0,0 +1,95 @@ + + + + + + +ArduinoLibs: crypto-rng-ring.dox File Reference + + + + + + + + + +
+
+ + + + + + +
+
ArduinoLibs +
+
+
+ + + + + + + + + +
+ +
+ +
+
+
+
crypto-rng-ring.dox File Reference
+
+
+
+ + + + diff --git a/crypto-rng_8dox.html b/crypto-rng_8dox.html new file mode 100644 index 00000000..5e1ec0cf --- /dev/null +++ b/crypto-rng_8dox.html @@ -0,0 +1,95 @@ + + + + + + +ArduinoLibs: crypto-rng.dox File Reference + + + + + + + + + +
+
+ + + + + + +
+
ArduinoLibs +
+
+
+ + + + + + + + + +
+ +
+ +
+
+
+
crypto-rng.dox File Reference
+
+
+
+ + + + diff --git a/crypto.html b/crypto.html index a5a7575e..79aa6fa4 100644 --- a/crypto.html +++ b/crypto.html @@ -87,11 +87,16 @@ Supported Algorithms
  • Stream ciphers: ChaCha
  • Hash algorithms: SHA1, SHA256, SHA512, SHA3_256, SHA3_512, BLAKE2s, BLAKE2b
  • Public key algorithms: Curve25519
  • -
  • Random number generation: RNG, TransistorNoiseSource
  • +
  • Random number generation: RNG, TransistorNoiseSource, RingOscillatorNoiseSource
  • All cryptographic algorithms have been optimized for 8-bit Arduino platforms like the Uno. Memory usage is also reduced, particularly for SHA1, SHA256, and SHA512 which save 256, 192, and 512 bytes respectively over traditional implementations. For all algorithms, static sbox tables and the like are placed into program memory to further reduce data memory usage.

    ChaCha with 20 rounds and 256-bit keys is the recommended symmetric encryption algorithm because it is twice as fast as AES128, constant-time, and much more secure. AES128, AES192, and AES256 are provided for use in applications where compatibility with other systems is desirable.

    BLAKE2s and BLAKE2b are variations on the ChaCha stream cipher, designed for hashing, with 256-bit and 512-bit hash outputs respectively. They are intended as high performance replacements for SHA256 and SHA512 for when speed is critical but exact bit-compatibility of hash values is not.

    +

    +Examples and other topics

    +

    Performance

    All figures are for the Arduino Uno running at 16 MHz. Figures for the Ardunino Mega 2560 running at 16 MHz are similar:

    @@ -140,7 +145,7 @@ Performance diff --git a/crypto_8dox.html b/crypto_8dox.html index 9533567a..c1fa35d8 100644 --- a/crypto_8dox.html +++ b/crypto_8dox.html @@ -87,7 +87,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/crypto_rng.html b/crypto_rng.html new file mode 100644 index 00000000..b7d316ba --- /dev/null +++ b/crypto_rng.html @@ -0,0 +1,189 @@ + + + + + + +ArduinoLibs: Generating random numbers + + + + + + + + + +
    +
    + + + + + + +
    +
    ArduinoLibs +
    +
    +
    + + + + + + + + +
    + +
    + +
    +
    +
    +
    Generating random numbers
    +
    +
    +

    Random numbers are one of the most important aspects of secure cryptography. Without a good source of random numbers it may be possible for an attacker to predict the encryption and authentication keys that are used to protect a session, or to predict the private component of a public/private key pair. This is especially difficult in embedded environments that do not have input sources like keystrokes, mouse movements, disk drive write times, etc to collect entropy from the user.

    +

    +Features of the random number generator

    +

    This library provides the RNG class to manage the global random number pool. It has the following features:

    +
      +
    • Provision for plug-in environmental noise sources and entropy estimation.
    • +
    • Whitening of noise values to scatter the input noise across the entire random number pool.
    • +
    • Support for mixing in static values like serial numbers and MAC addresses so that otherwise identical devices do not generate the same sequence of random numbers upon first boot.
    • +
    • Cryptographically secure pseudo random number generator (PRNG) for expanding the noise-based seed into an arbitrary amount of random material for the application.
    • +
    • Periodic saving of the random seed into EEPROM so that the accumulated entropy is not lost across a power restart.
    • +
    • Built-in protection so that if an attacker captures the seed, it cannot be used to predict past outputs. And after mixing in a modest amount of new noise, cannot be used to predict future outputs.
    • +
    +

    The whitening function and the PRNG are based on ChaCha::hashCore() with 20 rounds. The structure of the PRNG is very similar to OpenBSD's ChaCha20-based arc4random() implementation.

    +

    +Standard noise sources

    +

    The library provides two standard noise sources:

    + +

    The transistor design needs an input voltage of 10 to 15 VDC to trigger the avalanche effect, which can sometimes be difficult in a 5V Arduino environment. The ring oscillator design can run at 5V but the quality of the noise is less than for the transistor design. The RingOscillatorNoiseSource class attempts to make up for this by collecting more input bits for the same amount of output entropy. See this page for more information on ring oscillators.

    +

    For both of the standard noise sources, the system should have enough entropy to safely generate 256 bits of key material about 3 to 4 seconds after startup. This is sufficient to create a private key for Curve25519 for example.

    +

    If you are unsure which noise source to use, then I suggest TransistorNoiseSource as Rob's design has had more review. Another approach is to mix multiple noise sources together to get the best of both worlds.

    +

    +Initializing the random number generator

    +

    To use the random number generator, both RNG and a noise source must first be initialized. We start by including the necessary libraries:

    +
    #include <Crypto.h>
    +
    #include <RNG.h>
    +
    #include <TransistorNoiseSource.h>
    +

    Next we create a global variable for the noise source and specify the I/O pin that the noise circuit is connected to:

    +

    Then in the setup() function we call RNG.begin() to start the random number generator running:

    +
    void setup() {
    +
    // Initialize the random number generator with the application tag
    +
    // "MyApp 1.0" and load the previous seed from EEPROM address 500.
    +
    RNG.begin("MyApp 1.0", 500);
    +
    +
    // ...
    +
    }
    +

    The begin() function is passed two arguments: a tag string that should be different for every application and an EEPROM address to use to load and save the random number seed. The tag string ensures that different applications and versions will generate different random numbers upon first boot before the noise source has collected any entropy. If the device also has a unique serial number or a MAC address, then those can be mixed in during the setup() function after calling begin():

    +
    void setup() {
    +
    RNG.begin("MyApp 1.0", 500);
    +
    RNG.stir(serial_number, sizeof(serial_number));
    +
    RNG.stir(mac_address, sizeof(mac_address));
    +
    ...
    +
    }
    +

    The random number generator needs 49 bytes of EEPROM space at the specified address to store the previous seed. When the system is started next time, the previous saved seed is loaded and then deliberately overwritten with a new seed. This ensures that the device will not accidentally generate the same sequence of random numbers if it is restarted before a new seed can be saved.

    +

    By default the seed is saved once an hour, although this can be changed with RNG.setAutoSaveTime(). Because the device may be restarted before the first hour expires, there is a special case in the code: the first time that the entropy pool fills up, a save will be automatically forced.

    +

    To use the random number generator properly, there are some regular tasks that must be performed every time around the application's main loop(). Newly accumulated noise must be mixed in with RNG.stir() and the RNG.loop() function must be called to perform auto-saves:

    +
    void loop() {
    +
    // ...
    +
    +
    // If the noise source has accumulated new entropy, then stir it in.
    +
    RNG.stir(noise);
    +
    +
    // Perform regular housekeeping on the random number generator.
    +
    RNG.loop();
    +
    +
    // ...
    +
    }
    +

    The random number generator is now ready to generate data.

    +

    +Generating data with the random number generator

    +

    Whenever the application needs random data, it calls RNG.rand() with a buffer to fill. The following example generates a 256-bit encryption key and a 128-bit initialization vector; e.g. for use with AES256 in CTR mode:

    +
    byte key[32];
    +
    byte iv[16];
    +
    +
    void generateKeys() {
    +
    RNG.rand(key, sizeof(key));
    +
    RNG.rand(iv, sizeof(iv));
    +
    }
    +

    The data will be generated immediately, using whatever entropy happens to be in the global random number pool at the time. In Linux terms, the rand() function acts like the /dev/urandom device.

    +

    If the system has been running for a while then this should be safe as the noise source would have already permuted the pool with noise-based entropy. However, when the system first starts up there may not be much entropy available other than that from the saved seed (which could have been compromised).

    +

    In Linux terms we want the effect of the /dev/random device which blocks until sufficient entropy is available to service the request. Blocking isn't compatible with the Arduino way of doing things, so the library instead provides the RNG.available() function to poll how much entropy is in the global random number pool:

    +
    byte key[32];
    +
    byte iv[16];
    +
    bool haveKeys = false;
    +
    +
    void generateKeys() {
    +
    if (!haveKeys && RNG.available(sizeof(key) + sizeof(iv))) {
    +
    RNG.rand(key, sizeof(key));
    +
    RNG.rand(iv, sizeof(iv));
    +
    haveKeys = true;
    +
    }
    +
    }
    +

    This feature should allow applications to generate secret material safely at startup. The application may want to implement a timeout: if the application has to wait too long to generate a key then the noise source may be disconnected or faulty.

    +

    The global random number pool can hold up to 48 bytes, or 384 bits, of entropy. Requests for more than 384 bits will be allowed if the entropy is at maximum. That is, a request for 64 bytes (512 bits) of data will be allowed when there is only 384 bits of entropy in the pool. This behaviour prevents the application from waiting indefinitely if the request is too large.

    +

    If the application truly needs more than 384 bits of real entropy (e.g. to generate a public/private key pair for an algorithm like RSA), then it should break the request up into smaller chunks and poll available() for each chunk.

    +

    +Destroying secret data

    +

    When the application is finished with the secret key material and plaintext, it should destroy the data to remove it from RAM permanently. The memset() function can be used for this purpose:

    +
    memset(key, 0, sizeof(key));
    +
    memset(iv, 0, sizeof(iv));
    +

    However, this may not be safe. Optimizing compilers have been known to optimize away memset() calls if the compiler thinks that the value won't be used again. A safer method is to use the clean() function in the library:

    +
    clean(key);
    +
    clean(iv);
    +

    The clean() function attempts to implement the memory clear in a way that the compiler shouldn't optimize away. By default the clean() function figures out the size of the buffer itself at compile time. In some cases (e.g. buffers that are passed by pointer), it may be necessary to specify the size manually:

    +
    clean(key, 32);
    +
    clean(iv, 16);
    +
    + + + + diff --git a/crypto_rng_ring.html b/crypto_rng_ring.html new file mode 100644 index 00000000..162dd90c --- /dev/null +++ b/crypto_rng_ring.html @@ -0,0 +1,159 @@ + + + + + + +ArduinoLibs: Ring Oscillator Noise Sources + + + + + + + + + +
    +
    + + + + + + +
    +
    ArduinoLibs +
    +
    +
    + + + + + + + + +
    + +
    + +
    +
    +
    +
    Ring Oscillator Noise Sources
    +
    +
    +

    This page discusses how to construct and use a noise source based on the jitter from a ring oscillator. The circuit here is very simple: more complex ring oscillator designs are possible and may give better results.

    +
    Note
    The output from a ring oscillator is not generally as good as a "true" noise source. The oscillation can easily settle into regular patterns or sync up with other clock sources on the board. It is even possible to "hack" a ring oscillator by injecting chosen frequencies on the power supply rails to force the oscillation into a predictable waveform (see this paper for an example). It is very important that the output of this class be whitened with RNG before it is used for cryptography and that the device is isolated from attacker-controlled sources of power. Unless you have a very good reason to use a ring oscillator, TransistorNoiseSource is usually a better option.
    +

    +Ring oscillator theory

    +

    A ring oscillator is formed out of an odd number of inverter gates. A 1 value on the input to the first gate will be inverted several times, resulting in a 0 value being fed back into the first gate. In turn that 0 is inverted several times to generate another 1. And so on. In schematic form, a 3-stage ring oscillator looks like this:

    +
    +ring_oscillator_basic.png +
    +

    Because electronic circuits are not instanteous devices it can take some time for the values to propagate down the inverter chain. The longer the chain (5-stage, 7-stage, 9-stage, or more) the longer the propagation delay. The important thing is that the delay is not fixed: differences in components, ambient temperature, and other factors combine to introduce a little bit of random jitter in the output waveform.

    +

    For our purposes, the jitter is what we are after. The timing differences from one rising edge to the the next gives us the random bits.

    +

    The triangular-shaped output from the final inverter isn't very friendly to microprocessors. So it is common to select out the jitter using a D flip-flop and a periodic clock signal:

    +
    +ring_oscillator_sampled.png +
    +

    Practical designs inside CPU's often use multiple ring oscillators XOR'ed together:

    +
    +ring_oscillator_multi.png +
    +

    Even after all that the output won't be uniformly random. It is necessary to whiten the output with a secure hash function before using the data for cryptography. Fortunately for us, RNG.stir() has built-in support for whitening so we just need to collect the raw bits.

    +

    +Our ring oscillator

    +

    To keep things simple, we are going to use a single 5-stage ring oscillator with a sampling clock provided by a 555 timer:

    +
    +ring_oscillator.png +
    +

    The components were deliberately chosen to be commonly available. The only special one is the 555. I recommend using the CMOS LM7555 variant (or something equivalent) instead because it can operate at higher frequencies than a garden variety 555. The 56 ohm resistor on the output of U2 inhibits ringing on the clock line: we want the noise to come from U1 not U2.

    +

    The frequency output from U1 will depend upon the properties of your 4069 chip. A cheap bargain bin chip is actually better than a high quality chip. Some inverter datasheets I have read proudly advertise reduced jitter but the jitter is what we are after here. My 4069 was generating about 1.7MHz with a 5-stage ring oscillator. Other chips I tried were able to exceed 12MHz with a 3-stage ring oscillator. Because the Arduino isn't fast enough to sample high frequency signals, lower is actually better for our needs.

    +

    To further lower the frequency to something the Arduino can measure, the 555 timer should be set to between 100kHz and 200kHz (it's ok to be a little over 200kHz). Start with an R1 value of about 2.2K and adjust it up or down to get the frequency into the target range. Also measure the output frequency from U3A and try to target between 20kHz and 50kHz. The Arduino can easily sample that without putting too much burden on the CPU. The signal should be very jittery at this point.

    +

    This design can of course be improved by using multiple ring oscillators and an XOR gate, but I wanted to keep the component count low for the basic design.

    +

    +Parts list

    +
      +
    • 1 x 4069 CMOS Hex Inverter
    • +
    • 1 x 4013 Dual D Flip-Flop
    • +
    • 1 x LM7555 CMOS Timer
    • +
    • 1 x 10uF electrolytic capacitor (25V or better)
    • +
    • 1 x 100nF ceramic capacitor
    • +
    • 1 x 10nF ceramic capacitor
    • +
    • 1 x 1nF ceramic capacitor
    • +
    • 1 x 56 ohm resistor
    • +
    • 1 x 1.2k ohm resistor
    • +
    • 1 x 2.2k ohm resistor (or some other value for R1)
    • +
    +

    +Connecting to the Arduino

    +

    The RingOscillatorNoiseSource class uses the input capture feature of the AVR microcontroller to measure the time between successive rising edges. Input capture is only possible on certain pins and the output of the circuit above needs to be connected to the correct pin:

    + + + + + + + + + +
    VariantArduino Pin / AVR PinTimer
    Arduino UnoD8 / PB0Timer 1
    Arduino LeonardoD4 / PD4Timer 1
    Arduino Mega or Mega 2560D49 / PL0Timer 4
    +

    If your board is not pin-compatible with one of the above, then the source for the RingOscillatorNoiseSource class will need to be modified to use a different pin/timer combination. Also, when the timer is in use by this class it cannot be used for other application tasks.

    +

    The timer is set up in free-running mode to count as fast as possible. Whenever a rising edge occurs on the input signal, the timer's current value is written to a special register and an interrupt occurs. Within the interrupt service routine, the previous register value is subtracted from the current value to determine the amount of time that has elapsed between the two rising edges.

    +

    The jitter is extracted from the time difference in a very simple way: the lowest bit of the difference is the jitter and all other bits are discarded. The interrupt service routine collects up 16 bits of jitter over successive input pulses and then passes them to the higher level code in the RingOscillatorNoiseSource class.

    +

    Within the higher level code, the input bits are first debiased using the Von Neumann method to discard the parts of the signal that don't jitter very much:

    +
      +
    • Collect two input bits.
    • +
    • If they are the same, then discard both.
    • +
    • If they are different, then choose one as the output bit and discard the other one.
    • +
    +

    The debiased bits are collected up into a 256-bit buffer. Once the buffer is full it is passed to RNG.stir() to be whitened and incorporated into the global random number pool.

    +

    And that's it!

    +

    As noted earlier, the output from a ring oscillator is not uniform. To deal with this, the RingOscillatorNoiseSource class takes a fairly conservative approach. It credits a very small amount of entropy to each full buffer, forcing the system to collect more input data to achieve full entropy.

    +

    My investigations showed that at 20kHz it takes about a second to generate 256 bits of good random data after Von Neumann debiasing and whitening. Two to three seconds after startup there should be enough entropy in the random number pool to generate encryption keys and other secret material safely. The RNG.available() function can be used to determine when there is enough entropy in the pool for the application's needs.

    +
    + + + + diff --git a/dir_1586d320a3b1e622174530fde769cda9.html b/dir_1586d320a3b1e622174530fde769cda9.html index d50bf07d..2bb3eded 100644 --- a/dir_1586d320a3b1e622174530fde769cda9.html +++ b/dir_1586d320a3b1e622174530fde769cda9.html @@ -102,7 +102,7 @@ Files diff --git a/dir_48f64e79f12bd77ba047e9e436ec978c.html b/dir_48f64e79f12bd77ba047e9e436ec978c.html index 8d11af30..10a3df0c 100644 --- a/dir_48f64e79f12bd77ba047e9e436ec978c.html +++ b/dir_48f64e79f12bd77ba047e9e436ec978c.html @@ -122,7 +122,7 @@ Files diff --git a/dir_5e87a7229a108582288ef7eda1233dc3.html b/dir_5e87a7229a108582288ef7eda1233dc3.html index 4099700e..3754b447 100644 --- a/dir_5e87a7229a108582288ef7eda1233dc3.html +++ b/dir_5e87a7229a108582288ef7eda1233dc3.html @@ -94,7 +94,7 @@ Files diff --git a/dir_6591a2127a29f6cea3994dcb5b0596d1.html b/dir_6591a2127a29f6cea3994dcb5b0596d1.html index 4ff75b18..9f8af89e 100644 --- a/dir_6591a2127a29f6cea3994dcb5b0596d1.html +++ b/dir_6591a2127a29f6cea3994dcb5b0596d1.html @@ -106,7 +106,7 @@ Files diff --git a/dir_9a34040863d1190c0e01b23e6b44de01.html b/dir_9a34040863d1190c0e01b23e6b44de01.html index 6cce5163..c5e30adc 100644 --- a/dir_9a34040863d1190c0e01b23e6b44de01.html +++ b/dir_9a34040863d1190c0e01b23e6b44de01.html @@ -96,7 +96,7 @@ Files diff --git a/dir_bc0718b08fb2015b8e59c47b2805f60c.html b/dir_bc0718b08fb2015b8e59c47b2805f60c.html index 2262ac4b..b1696c91 100644 --- a/dir_bc0718b08fb2015b8e59c47b2805f60c.html +++ b/dir_bc0718b08fb2015b8e59c47b2805f60c.html @@ -108,7 +108,7 @@ Directories diff --git a/dir_be059bf9978ae156837504b1b8a7568c.html b/dir_be059bf9978ae156837504b1b8a7568c.html index d61aa09c..439c4096 100644 --- a/dir_be059bf9978ae156837504b1b8a7568c.html +++ b/dir_be059bf9978ae156837504b1b8a7568c.html @@ -94,7 +94,7 @@ Files diff --git a/dir_e2ce51835550ba18edf07a8311722290.html b/dir_e2ce51835550ba18edf07a8311722290.html index e1ee2372..200a9240 100644 --- a/dir_e2ce51835550ba18edf07a8311722290.html +++ b/dir_e2ce51835550ba18edf07a8311722290.html @@ -152,6 +152,10 @@ Files   file  OFB.h [code]   +file  RingOscillatorNoiseSource.cpp [code] +  +file  RingOscillatorNoiseSource.h [code] +  file  RNG.cpp [code]   file  RNG.h [code] @@ -180,7 +184,7 @@ Files diff --git a/dir_f34881fcf60f680b800190d5274dfaea.html b/dir_f34881fcf60f680b800190d5274dfaea.html index 4b4ef65b..34cb1893 100644 --- a/dir_f34881fcf60f680b800190d5274dfaea.html +++ b/dir_f34881fcf60f680b800190d5274dfaea.html @@ -102,7 +102,7 @@ Files diff --git a/dir_f9b96888882c2691b8eeaeafd1b9501d.html b/dir_f9b96888882c2691b8eeaeafd1b9501d.html index 7b87f368..14672f9b 100644 --- a/dir_f9b96888882c2691b8eeaeafd1b9501d.html +++ b/dir_f9b96888882c2691b8eeaeafd1b9501d.html @@ -102,7 +102,7 @@ Files diff --git a/dmd-demo_8dox.html b/dmd-demo_8dox.html index b651c8d1..e0c22396 100644 --- a/dmd-demo_8dox.html +++ b/dmd-demo_8dox.html @@ -87,7 +87,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/dmd-running-figure_8dox.html b/dmd-running-figure_8dox.html index 59acde6f..7347f9ae 100644 --- a/dmd-running-figure_8dox.html +++ b/dmd-running-figure_8dox.html @@ -87,7 +87,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/dmd_demo.html b/dmd_demo.html index b709bbde..7a9d6b58 100644 --- a/dmd_demo.html +++ b/dmd_demo.html @@ -236,7 +236,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/dmd_running_figure.html b/dmd_running_figure.html index cefba62f..1fa1a655 100644 --- a/dmd_running_figure.html +++ b/dmd_running_figure.html @@ -430,7 +430,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/files.html b/files.html index b4549156..93f351e8 100644 --- a/files.html +++ b/files.html @@ -160,32 +160,34 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); o*PowerSave.cpp o*PowerSave.h o*RC5.h -o*RNG.cpp -o*RNG.h -o*RTC.cpp -o*RTC.h -o*SHA1.cpp -o*SHA1.h -o*SHA256.cpp -o*SHA256.h -o*SHA3.cpp -o*SHA3.h -o*SHA512.cpp -o*SHA512.h -o*SoftI2C.cpp -o*SoftI2C.h -o*TextField.cpp -o*TextField.h -o*TimeField.cpp -o*TimeField.h -o*TransistorNoiseSource.cpp -\*TransistorNoiseSource.h +o*RingOscillatorNoiseSource.cpp +o*RingOscillatorNoiseSource.h +o*RNG.cpp +o*RNG.h +o*RTC.cpp +o*RTC.h +o*SHA1.cpp +o*SHA1.h +o*SHA256.cpp +o*SHA256.h +o*SHA3.cpp +o*SHA3.h +o*SHA512.cpp +o*SHA512.h +o*SoftI2C.cpp +o*SoftI2C.h +o*TextField.cpp +o*TextField.h +o*TimeField.cpp +o*TimeField.h +o*TransistorNoiseSource.cpp +\*TransistorNoiseSource.h diff --git a/functions.html b/functions.html index ae808e1f..01fb991b 100644 --- a/functions.html +++ b/functions.html @@ -169,7 +169,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_b.html b/functions_b.html index 93a832e5..d8f2fd8f 100644 --- a/functions_b.html +++ b/functions_b.html @@ -181,7 +181,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_c.html b/functions_c.html index ab927dec..1ef0036e 100644 --- a/functions_c.html +++ b/functions_c.html @@ -125,6 +125,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');

    - c -