From c74770a34373bcfb2e182fcda6cd89db0e47ba79 Mon Sep 17 00:00:00 2001 From: Rhys Weatherley Date: Sun, 14 Feb 2016 07:48:23 +1000 Subject: [PATCH] Update docs --- AES128_8cpp_source.html | 2 +- AES192_8cpp_source.html | 2 +- AES256_8cpp_source.html | 2 +- AESCommon_8cpp_source.html | 2 +- AES_8h_source.html | 2 +- AuthenticatedCipher_8cpp_source.html | 2 +- AuthenticatedCipher_8h_source.html | 2 +- BLAKE2b_8cpp_source.html | 2 +- BLAKE2b_8h_source.html | 2 +- BLAKE2s_8cpp_source.html | 2 +- BLAKE2s_8h_source.html | 2 +- BigNumberUtil_8cpp_source.html | 2 +- BigNumberUtil_8h_source.html | 2 +- Bitmap_8cpp_source.html | 2 +- Bitmap_8h_source.html | 2 +- BlinkLED_8cpp_source.html | 2 +- BlinkLED_8h_source.html | 2 +- BlockCipher_8cpp_source.html | 2 +- BlockCipher_8h_source.html | 2 +- BoolField_8cpp_source.html | 2 +- BoolField_8h_source.html | 2 +- CBC_8cpp_source.html | 2 +- CBC_8h_source.html | 2 +- CFB_8cpp_source.html | 2 +- CFB_8h_source.html | 2 +- CTR_8cpp_source.html | 2 +- CTR_8h_source.html | 2 +- ChaChaPoly_8cpp_source.html | 2 +- ChaChaPoly_8h_source.html | 2 +- ChaCha_8cpp_source.html | 2 +- ChaCha_8h_source.html | 2 +- Charlieplex_8cpp_source.html | 2 +- Charlieplex_8h_source.html | 2 +- ChaseLEDs_8cpp_source.html | 2 +- ChaseLEDs_8h_source.html | 2 +- Cipher_8cpp_source.html | 2 +- Cipher_8h_source.html | 2 +- Crypto_8cpp_source.html | 2 +- Crypto_8h_source.html | 2 +- Curve25519_8cpp_source.html | 2016 ++++++++++++------- Curve25519_8h_source.html | 8 +- DMD_8cpp_source.html | 2 +- DMD_8h_source.html | 2 +- DS1307RTC_8cpp_source.html | 2 +- DS1307RTC_8h_source.html | 2 +- DS3231RTC_8cpp_source.html | 2 +- DS3231RTC_8h_source.html | 2 +- DS3232RTC_8cpp_source.html | 2 +- DS3232RTC_8h_source.html | 2 +- DejaVuSans9_8h_source.html | 2 +- DejaVuSansBold9_8h_source.html | 2 +- DejaVuSansItalic9_8h_source.html | 2 +- EAX_8cpp_source.html | 2 +- EAX_8h_source.html | 2 +- EEPROM24_8cpp_source.html | 2 +- EEPROM24_8h_source.html | 2 +- Ed25519_8cpp_source.html | 2 +- Ed25519_8h_source.html | 2 +- Field_8cpp_source.html | 2 +- Field_8h_source.html | 2 +- Form_8cpp_source.html | 2 +- Form_8h_source.html | 2 +- GCM_8cpp_source.html | 2 +- GCM_8h_source.html | 2 +- GF128_8cpp_source.html | 2 +- GF128_8h_source.html | 2 +- GHASH_8cpp_source.html | 2 +- GHASH_8h_source.html | 2 +- Hash_8cpp_source.html | 2 +- Hash_8h_source.html | 2 +- I2CMaster_8cpp_source.html | 2 +- I2CMaster_8h_source.html | 2 +- IRreceiver_8cpp_source.html | 2 +- IRreceiver_8h_source.html | 2 +- IntField_8cpp_source.html | 2 +- IntField_8h_source.html | 2 +- KeccakCore_8cpp_source.html | 2 +- KeccakCore_8h_source.html | 2 +- LCD_8cpp_source.html | 2 +- LCD_8h_source.html | 2 +- ListField_8cpp_source.html | 2 +- ListField_8h_source.html | 2 +- Melody_8cpp_source.html | 2 +- Melody_8h_source.html | 2 +- Mono5x7_8h_source.html | 2 +- NoiseSource_8cpp_source.html | 2 +- NoiseSource_8h_source.html | 2 +- OFB_8cpp_source.html | 2 +- OFB_8h_source.html | 2 +- OMAC_8cpp_source.html | 2 +- OMAC_8h_source.html | 2 +- Poly1305_8cpp_source.html | 2 +- Poly1305_8h_source.html | 2 +- PowerSave_8cpp_source.html | 2 +- PowerSave_8h_source.html | 2 +- RC5_8h_source.html | 2 +- RNG_8cpp_source.html | 2 +- RNG_8h_source.html | 2 +- RTC_8cpp_source.html | 2 +- RTC_8h_source.html | 2 +- RingOscillatorNoiseSource_8cpp_source.html | 2 +- RingOscillatorNoiseSource_8h_source.html | 2 +- SHA256_8cpp_source.html | 2 +- SHA256_8h_source.html | 2 +- SHA3_8cpp_source.html | 2 +- SHA3_8h_source.html | 2 +- SHA512_8cpp_source.html | 2 +- SHA512_8h_source.html | 2 +- SoftI2C_8cpp_source.html | 2 +- SoftI2C_8h_source.html | 2 +- SpeckSmall_8cpp_source.html | 2 +- SpeckSmall_8h_source.html | 2 +- SpeckTiny_8cpp_source.html | 2 +- SpeckTiny_8h_source.html | 2 +- Speck_8cpp_source.html | 2 +- Speck_8h_source.html | 2 +- TextField_8cpp_source.html | 2 +- TextField_8h_source.html | 2 +- TimeField_8cpp_source.html | 2 +- TimeField_8h_source.html | 2 +- TransistorNoiseSource_8cpp_source.html | 2 +- TransistorNoiseSource_8h_source.html | 2 +- alarm-clock_8dox.html | 2 +- alarm_clock.html | 2 +- annotated.html | 2 +- blink-blink_8dox.html | 2 +- blink-charlieplex_8dox.html | 2 +- blink-cylon_8dox.html | 2 +- blink-startrek_8dox.html | 2 +- blink_blink.html | 2 +- blink_charlieplex.html | 2 +- blink_cylon.html | 2 +- blink_startrek.html | 2 +- classAES128-members.html | 2 +- classAES128.html | 2 +- classAES192-members.html | 2 +- classAES192.html | 2 +- classAES256-members.html | 2 +- classAES256.html | 2 +- classAESCommon-members.html | 2 +- classAESCommon.html | 2 +- classAuthenticatedCipher-members.html | 2 +- classAuthenticatedCipher.html | 2 +- classBLAKE2b-members.html | 2 +- classBLAKE2b.html | 2 +- classBLAKE2s-members.html | 2 +- classBLAKE2s.html | 2 +- classBigNumberUtil-members.html | 2 +- classBigNumberUtil.html | 2 +- classBitmap-members.html | 2 +- classBitmap.html | 2 +- classBlinkLED-members.html | 2 +- classBlinkLED.html | 2 +- classBlockCipher-members.html | 2 +- classBlockCipher.html | 2 +- classBoolField-members.html | 2 +- classBoolField.html | 2 +- classCBC-members.html | 2 +- classCBC.html | 2 +- classCBCCommon-members.html | 2 +- classCBCCommon.html | 2 +- classCFB-members.html | 2 +- classCFB.html | 2 +- classCFBCommon-members.html | 2 +- classCFBCommon.html | 2 +- classCTR-members.html | 2 +- classCTR.html | 2 +- classCTRCommon-members.html | 2 +- classCTRCommon.html | 2 +- classChaCha-members.html | 2 +- classChaCha.html | 2 +- classChaChaPoly-members.html | 2 +- classChaChaPoly.html | 2 +- classCharlieplex-members.html | 2 +- classCharlieplex.html | 2 +- classChaseLEDs-members.html | 2 +- classChaseLEDs.html | 2 +- classCipher-members.html | 2 +- classCipher.html | 2 +- classCurve25519-members.html | 2 +- classCurve25519.html | 8 +- classDMD-members.html | 2 +- classDMD.html | 2 +- classDS1307RTC-members.html | 2 +- classDS1307RTC.html | 2 +- classDS3231RTC-members.html | 2 +- classDS3231RTC.html | 2 +- classDS3232RTC-members.html | 2 +- classDS3232RTC.html | 2 +- classEAX-members.html | 2 +- classEAX.html | 2 +- classEAXCommon-members.html | 2 +- classEAXCommon.html | 2 +- classEEPROM24-members.html | 2 +- classEEPROM24.html | 2 +- classEd25519-members.html | 2 +- classEd25519.html | 2 +- classField-members.html | 2 +- classField.html | 2 +- classForm-members.html | 2 +- classForm.html | 2 +- classGCM-members.html | 2 +- classGCM.html | 2 +- classGCMCommon-members.html | 2 +- classGCMCommon.html | 2 +- classGF128-members.html | 2 +- classGF128.html | 2 +- classGHASH-members.html | 2 +- classGHASH.html | 2 +- classHash-members.html | 2 +- classHash.html | 2 +- classI2CMaster-members.html | 2 +- classI2CMaster.html | 2 +- classIRreceiver-members.html | 2 +- classIRreceiver.html | 2 +- classIntField-members.html | 2 +- classIntField.html | 2 +- classKeccakCore-members.html | 2 +- classKeccakCore.html | 2 +- classLCD-members.html | 2 +- classLCD.html | 2 +- classListField-members.html | 2 +- classListField.html | 2 +- classMelody-members.html | 2 +- classMelody.html | 2 +- classNoiseSource-members.html | 2 +- classNoiseSource.html | 2 +- classOFB-members.html | 2 +- classOFB.html | 2 +- classOFBCommon-members.html | 2 +- classOFBCommon.html | 2 +- classOMAC-members.html | 2 +- classOMAC.html | 2 +- classPoly1305-members.html | 2 +- classPoly1305.html | 2 +- classRNGClass-members.html | 2 +- classRNGClass.html | 2 +- classRTC-members.html | 2 +- classRTC.html | 2 +- classRTCAlarm-members.html | 2 +- classRTCDate-members.html | 2 +- classRTCTime-members.html | 2 +- classRingOscillatorNoiseSource-members.html | 2 +- classRingOscillatorNoiseSource.html | 2 +- classSHA256-members.html | 2 +- classSHA256.html | 2 +- classSHA3__256-members.html | 2 +- classSHA3__256.html | 2 +- classSHA3__512-members.html | 2 +- classSHA3__512.html | 2 +- classSHA512-members.html | 2 +- classSHA512.html | 2 +- classSoftI2C-members.html | 2 +- classSoftI2C.html | 2 +- classSpeck-members.html | 2 +- classSpeck.html | 2 +- classSpeckSmall-members.html | 2 +- classSpeckSmall.html | 2 +- classSpeckTiny-members.html | 2 +- classSpeckTiny.html | 2 +- classTextField-members.html | 2 +- classTextField.html | 2 +- classTimeField-members.html | 2 +- classTimeField.html | 2 +- classTransistorNoiseSource-members.html | 2 +- classTransistorNoiseSource.html | 2 +- classes.html | 2 +- crypto-rng-ring_8dox.html | 2 +- crypto-rng_8dox.html | 2 +- crypto.html | 14 +- crypto_8dox.html | 2 +- crypto_rng.html | 2 +- crypto_rng_ring.html | 2 +- dir_1586d320a3b1e622174530fde769cda9.html | 2 +- dir_3dd03323535933fb3f714c41ff7a94da.html | 2 +- dir_48f64e79f12bd77ba047e9e436ec978c.html | 2 +- dir_5e87a7229a108582288ef7eda1233dc3.html | 2 +- dir_6591a2127a29f6cea3994dcb5b0596d1.html | 2 +- dir_7e6ab9b017486261fe80629d442521f0.html | 2 +- dir_9a34040863d1190c0e01b23e6b44de01.html | 2 +- dir_bc0718b08fb2015b8e59c47b2805f60c.html | 2 +- dir_be059bf9978ae156837504b1b8a7568c.html | 2 +- dir_e2ce51835550ba18edf07a8311722290.html | 2 +- dir_f34881fcf60f680b800190d5274dfaea.html | 2 +- dir_f9b96888882c2691b8eeaeafd1b9501d.html | 2 +- dmd-demo_8dox.html | 2 +- dmd-running-figure_8dox.html | 2 +- dmd_demo.html | 2 +- dmd_running_figure.html | 2 +- files.html | 2 +- functions.html | 2 +- functions_b.html | 2 +- functions_c.html | 2 +- functions_d.html | 2 +- functions_e.html | 2 +- functions_enum.html | 2 +- functions_eval.html | 2 +- functions_f.html | 2 +- functions_func.html | 2 +- functions_func_b.html | 2 +- functions_func_c.html | 2 +- functions_func_d.html | 2 +- functions_func_e.html | 2 +- functions_func_f.html | 2 +- functions_func_g.html | 2 +- functions_func_h.html | 2 +- functions_func_i.html | 2 +- functions_func_k.html | 2 +- functions_func_l.html | 2 +- functions_func_m.html | 2 +- functions_func_n.html | 2 +- functions_func_o.html | 2 +- functions_func_p.html | 2 +- functions_func_r.html | 2 +- functions_func_s.html | 2 +- functions_func_t.html | 2 +- functions_func_u.html | 2 +- functions_func_v.html | 2 +- functions_func_w.html | 2 +- functions_func_~.html | 2 +- functions_g.html | 2 +- functions_h.html | 2 +- functions_i.html | 2 +- functions_k.html | 2 +- functions_l.html | 2 +- functions_m.html | 2 +- functions_n.html | 2 +- functions_o.html | 2 +- functions_p.html | 2 +- functions_r.html | 2 +- functions_s.html | 2 +- functions_t.html | 2 +- functions_type.html | 2 +- functions_u.html | 2 +- functions_v.html | 2 +- functions_vars.html | 2 +- functions_w.html | 2 +- functions_y.html | 2 +- functions_~.html | 2 +- group__power__save.html | 2 +- hierarchy.html | 2 +- index.html | 2 +- ir-dumpir_8dox.html | 2 +- ir-snake_8dox.html | 2 +- ir_dumpir.html | 2 +- ir_snake.html | 2 +- lcd-form_8dox.html | 2 +- lcd-helloworld_8dox.html | 2 +- lcd_form.html | 2 +- lcd_hello_world.html | 2 +- mainpage_8dox.html | 2 +- modules.html | 2 +- pages.html | 2 +- structRTCAlarm.html | 2 +- structRTCDate.html | 2 +- structRTCTime.html | 2 +- 356 files changed, 1698 insertions(+), 1052 deletions(-) diff --git a/AES128_8cpp_source.html b/AES128_8cpp_source.html index 4cb985b3..b65e87e5 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 3c4ff069..85e58d4b 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 480d8577..6e1e6e48 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 1a427735..48f6ae28 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 42e787ee..e6ad3da5 100644 --- a/AES_8h_source.html +++ b/AES_8h_source.html @@ -203,7 +203,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/AuthenticatedCipher_8cpp_source.html b/AuthenticatedCipher_8cpp_source.html index 595c620c..348b59cf 100644 --- a/AuthenticatedCipher_8cpp_source.html +++ b/AuthenticatedCipher_8cpp_source.html @@ -125,7 +125,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/AuthenticatedCipher_8h_source.html b/AuthenticatedCipher_8h_source.html index e8e0f6c4..7cd82cd6 100644 --- a/AuthenticatedCipher_8h_source.html +++ b/AuthenticatedCipher_8h_source.html @@ -141,7 +141,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/BLAKE2b_8cpp_source.html b/BLAKE2b_8cpp_source.html index b247798f..e2b8a5d1 100644 --- a/BLAKE2b_8cpp_source.html +++ b/BLAKE2b_8cpp_source.html @@ -331,7 +331,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/BLAKE2b_8h_source.html b/BLAKE2b_8h_source.html index 1e1f53aa..65d74fa4 100644 --- a/BLAKE2b_8h_source.html +++ b/BLAKE2b_8h_source.html @@ -162,7 +162,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/BLAKE2s_8cpp_source.html b/BLAKE2s_8cpp_source.html index c7c09fa3..ee9c8c1b 100644 --- a/BLAKE2s_8cpp_source.html +++ b/BLAKE2s_8cpp_source.html @@ -323,7 +323,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/BLAKE2s_8h_source.html b/BLAKE2s_8h_source.html index 54020a45..c04b1b15 100644 --- a/BLAKE2s_8h_source.html +++ b/BLAKE2s_8h_source.html @@ -161,7 +161,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/BigNumberUtil_8cpp_source.html b/BigNumberUtil_8cpp_source.html index 5e7da7bf..903e58c9 100644 --- a/BigNumberUtil_8cpp_source.html +++ b/BigNumberUtil_8cpp_source.html @@ -557,7 +557,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/BigNumberUtil_8h_source.html b/BigNumberUtil_8h_source.html index dfd2f18a..8cd0888d 100644 --- a/BigNumberUtil_8h_source.html +++ b/BigNumberUtil_8h_source.html @@ -199,7 +199,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Bitmap_8cpp_source.html b/Bitmap_8cpp_source.html index 73a7ecbc..2ef6b900 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 d1926915..f31c7be1 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 d7e1cb5f..f0ba4bae 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 724ba89b..fea4fa7a 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 f689c795..71b20cb8 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 614f14a8..b173a17e 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 d68b90db..7bca766d 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 5fa2de76..6313863a 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 37e41687..93ef13a5 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 05bf32f1..9ba8c098 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 ce2dc7ca..0a9a3e8b 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 2547e47b..be5831e0 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 d6c8db93..cc109eb0 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 e6e51c89..801d29ed 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/ChaChaPoly_8cpp_source.html b/ChaChaPoly_8cpp_source.html index 513aa00b..10d5c33a 100644 --- a/ChaChaPoly_8cpp_source.html +++ b/ChaChaPoly_8cpp_source.html @@ -262,7 +262,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/ChaChaPoly_8h_source.html b/ChaChaPoly_8h_source.html index 211cda1c..a80dde0d 100644 --- a/ChaChaPoly_8h_source.html +++ b/ChaChaPoly_8h_source.html @@ -173,7 +173,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/ChaCha_8cpp_source.html b/ChaCha_8cpp_source.html index 2c7203a8..bbe8195e 100644 --- a/ChaCha_8cpp_source.html +++ b/ChaCha_8cpp_source.html @@ -311,7 +311,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/ChaCha_8h_source.html b/ChaCha_8h_source.html index 573e6801..f2a2fe55 100644 --- a/ChaCha_8h_source.html +++ b/ChaCha_8h_source.html @@ -170,7 +170,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Charlieplex_8cpp_source.html b/Charlieplex_8cpp_source.html index c4159459..2b8fac9a 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 8ad23ed4..d88b7685 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 ce26f00c..020138d1 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 6a7eca17..c33c133d 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 a898b7a6..c9d97826 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 a9b6c2b9..9f870889 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 e9d9247c..6a8a89ae 100644 --- a/Crypto_8cpp_source.html +++ b/Crypto_8cpp_source.html @@ -138,7 +138,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Crypto_8h_source.html b/Crypto_8h_source.html index 66b2b022..bba15f43 100644 --- a/Crypto_8h_source.html +++ b/Crypto_8h_source.html @@ -130,7 +130,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Curve25519_8cpp_source.html b/Curve25519_8cpp_source.html index b3b9bc25..f3d73581 100644 --- a/Curve25519_8cpp_source.html +++ b/Curve25519_8cpp_source.html @@ -116,703 +116,1349 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
26 #include "utility/LimbUtil.h"
27 #include <string.h>
28 
-
44 // The overhead of clean() calls in mul(), reduceQuick(), etc can
-
45 // add up to a lot of processing time during eval(). Only do such
-
46 // cleanups if strict mode has been enabled. Other implementations
-
47 // like curve25519-donna don't do any cleaning at all so the value
-
48 // of cleaning up the stack is dubious at best anyway.
-
49 #if defined(CURVE25519_STRICT_CLEAN)
-
50 #define strict_clean(x) clean(x)
-
51 #else
-
52 #define strict_clean(x) do { ; } while (0)
-
53 #endif
-
54 
-
74 bool Curve25519::eval(uint8_t result[32], const uint8_t s[32], const uint8_t x[32])
-
75 {
-
76  limb_t x_1[NUM_LIMBS_256BIT];
-
77  limb_t x_2[NUM_LIMBS_256BIT];
-
78  limb_t x_3[NUM_LIMBS_256BIT];
-
79  limb_t z_2[NUM_LIMBS_256BIT];
-
80  limb_t z_3[NUM_LIMBS_256BIT];
-
81  limb_t A[NUM_LIMBS_256BIT];
-
82  limb_t B[NUM_LIMBS_256BIT];
-
83  limb_t C[NUM_LIMBS_256BIT];
-
84  limb_t D[NUM_LIMBS_256BIT];
-
85  limb_t E[NUM_LIMBS_256BIT];
-
86  limb_t AA[NUM_LIMBS_256BIT];
-
87  limb_t BB[NUM_LIMBS_256BIT];
-
88  limb_t DA[NUM_LIMBS_256BIT];
-
89  limb_t CB[NUM_LIMBS_256BIT];
-
90  uint8_t mask;
-
91  uint8_t sposn;
-
92  uint8_t select;
-
93  uint8_t swap;
-
94  bool retval;
-
95 
-
96  // Unpack the "x" argument into the limb representation
-
97  // which also masks off the high bit. NULL means 9.
-
98  if (x) {
-
99  // x1 = x
-
100  BigNumberUtil::unpackLE(x_1, NUM_LIMBS_256BIT, x, 32);
-
101  x_1[NUM_LIMBS_256BIT - 1] &= ((((limb_t)1) << (LIMB_BITS - 1)) - 1);
-
102  } else {
-
103  memset(x_1, 0, sizeof(x_1)); // x_1 = 9
-
104  x_1[0] = 9;
-
105  }
-
106 
-
107  // Check that "x" is within the range of the modulo field.
-
108  // We can do this with a reduction - if there was no borrow
-
109  // then the value of "x" was out of range. Timing is sensitive
-
110  // here so that we don't reveal anything about the value of "x".
-
111  // If there was a reduction, then continue executing the rest
-
112  // of this function with the (now) in-range "x" value and
-
113  // report the failure at the end.
-
114  retval = (bool)(reduceQuick(x_1) & 0x01);
-
115 
-
116  // Initialize the other temporary variables.
-
117  memset(x_2, 0, sizeof(x_2)); // x_2 = 1
-
118  x_2[0] = 1;
-
119  memset(z_2, 0, sizeof(z_2)); // z_2 = 0
-
120  memcpy(x_3, x_1, sizeof(x_1)); // x_3 = x
-
121  memcpy(z_3, x_2, sizeof(x_2)); // z_3 = 1
-
122 
-
123  // Iterate over all 255 bits of "s" from the highest to the lowest.
-
124  // We ignore the high bit of the 256-bit representation of "s".
-
125  mask = 0x40;
-
126  sposn = 31;
-
127  swap = 0;
-
128  for (uint8_t t = 255; t > 0; --t) {
-
129  // Conditional swaps on entry to this bit but only if we
-
130  // didn't swap on the previous bit.
-
131  select = s[sposn] & mask;
-
132  swap ^= select;
-
133  cswap(swap, x_2, x_3);
-
134  cswap(swap, z_2, z_3);
-
135 
-
136  // Evaluate the curve.
-
137  add(A, x_2, z_2); // A = x_2 + z_2
-
138  square(AA, A); // AA = A^2
-
139  sub(B, x_2, z_2); // B = x_2 - z_2
-
140  square(BB, B); // BB = B^2
-
141  sub(E, AA, BB); // E = AA - BB
-
142  add(C, x_3, z_3); // C = x_3 + z_3
-
143  sub(D, x_3, z_3); // D = x_3 - z_3
-
144  mul(DA, D, A); // DA = D * A
-
145  mul(CB, C, B); // CB = C * B
-
146  add(x_3, DA, CB); // x_3 = (DA + CB)^2
-
147  square(x_3, x_3);
-
148  sub(z_3, DA, CB); // z_3 = x_1 * (DA - CB)^2
-
149  square(z_3, z_3);
-
150  mul(z_3, z_3, x_1);
-
151  mul(x_2, AA, BB); // x_2 = AA * BB
-
152  mulA24(z_2, E); // z_2 = E * (AA + a24 * E)
-
153  add(z_2, z_2, AA);
-
154  mul(z_2, z_2, E);
-
155 
-
156  // Move onto the next lower bit of "s".
-
157  mask >>= 1;
-
158  if (!mask) {
-
159  --sposn;
-
160  mask = 0x80;
-
161  swap = select << 7;
-
162  } else {
-
163  swap = select >> 1;
-
164  }
-
165  }
-
166 
-
167  // Final conditional swaps.
-
168  cswap(swap, x_2, x_3);
-
169  cswap(swap, z_2, z_3);
-
170 
-
171  // Compute x_2 * (z_2 ^ (p - 2)) where p = 2^255 - 19.
-
172  recip(z_3, z_2);
-
173  mul(x_2, x_2, z_3);
-
174 
-
175  // Pack the result into the return array.
-
176  BigNumberUtil::packLE(result, 32, x_2, NUM_LIMBS_256BIT);
-
177 
-
178  // Clean up and exit.
-
179  clean(x_1);
-
180  clean(x_2);
-
181  clean(x_3);
-
182  clean(z_2);
-
183  clean(z_3);
-
184  clean(A);
-
185  clean(B);
-
186  clean(C);
-
187  clean(D);
-
188  clean(E);
-
189  clean(AA);
-
190  clean(BB);
-
191  clean(DA);
-
192  clean(CB);
-
193  return retval;
-
194 }
-
195 
-
239 void Curve25519::dh1(uint8_t k[32], uint8_t f[32])
-
240 {
-
241  do {
-
242  // Generate a random "f" value and then adjust the value to make
-
243  // it valid as an "s" value for eval(). According to the specification
-
244  // we need to mask off the 3 right-most bits of f[0], mask off the
-
245  // left-most bit of f[31], and set the second to left-most bit of f[31].
-
246  RNG.rand(f, 32);
-
247  f[0] &= 0xF8;
-
248  f[31] = (f[31] & 0x7F) | 0x40;
-
249 
-
250  // Evaluate the curve function: k = Curve25519::eval(f, 9).
-
251  // We pass NULL to eval() to indicate the value 9. There is no
-
252  // need to check the return value from eval() because we know
-
253  // that 9 is a valid field element.
-
254  eval(k, f, 0);
-
255 
-
256  // If "k" is weak for contributory behaviour then reject it,
-
257  // generate another "f" value, and try again. This case is
-
258  // highly unlikely but we still perform the check just in case.
-
259  } while (isWeakPoint(k));
-
260 }
-
261 
-
277 bool Curve25519::dh2(uint8_t k[32], uint8_t f[32])
-
278 {
-
279  uint8_t weak;
-
280 
-
281  // Evaluate the curve function: k = Curve25519::eval(f, k).
-
282  // If "k" is weak for contributory behaviour before or after
-
283  // the curve evaluation, then fail the exchange. For safety
-
284  // we perform every phase of the weak checks even if we could
-
285  // bail out earlier so that the execution takes the same
-
286  // amount of time for weak and non-weak "k" values.
-
287  weak = isWeakPoint(k); // Is "k" weak before?
-
288  weak |= ((eval(k, f, k) ^ 0x01) & 0x01); // Is "k" weak during?
-
289  weak |= isWeakPoint(k); // Is "k" weak after?
-
290  clean(f, 32);
-
291  return (bool)((weak ^ 0x01) & 0x01);
-
292 }
-
293 
-
301 uint8_t Curve25519::isWeakPoint(const uint8_t k[32])
-
302 {
-
303  // List of weak points from http://cr.yp.to/ecdh.html
-
304  // That page lists some others but they are variants on these
-
305  // of the form "point + i * (2^255 - 19)" for i = 0, 1, 2.
-
306  // Here we mask off the high bit and eval() catches the rest.
-
307  static const uint8_t points[5][32] PROGMEM = {
-
308  {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
309  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
310  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
311  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
-
312  {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
313  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
44 // Global switch to enable/disable AVR inline assembly optimizations.
+
45 #if defined(__AVR__)
+
46 #define CURVE25519_ASM_AVR 1
+
47 #endif
+
48 
+
49 // The overhead of clean() calls in mul(), reduceQuick(), etc can
+
50 // add up to a lot of processing time during eval(). Only do such
+
51 // cleanups if strict mode has been enabled. Other implementations
+
52 // like curve25519-donna don't do any cleaning at all so the value
+
53 // of cleaning up the stack is dubious at best anyway.
+
54 #if defined(CURVE25519_STRICT_CLEAN)
+
55 #define strict_clean(x) clean(x)
+
56 #else
+
57 #define strict_clean(x) do { ; } while (0)
+
58 #endif
+
59 
+
79 bool Curve25519::eval(uint8_t result[32], const uint8_t s[32], const uint8_t x[32])
+
80 {
+
81  limb_t x_1[NUM_LIMBS_256BIT];
+
82  limb_t x_2[NUM_LIMBS_256BIT];
+
83  limb_t x_3[NUM_LIMBS_256BIT];
+
84  limb_t z_2[NUM_LIMBS_256BIT];
+
85  limb_t z_3[NUM_LIMBS_256BIT];
+
86  limb_t A[NUM_LIMBS_256BIT];
+
87  limb_t B[NUM_LIMBS_256BIT];
+
88  limb_t C[NUM_LIMBS_256BIT];
+
89  limb_t D[NUM_LIMBS_256BIT];
+
90  limb_t E[NUM_LIMBS_256BIT];
+
91  limb_t AA[NUM_LIMBS_256BIT];
+
92  limb_t BB[NUM_LIMBS_256BIT];
+
93  limb_t DA[NUM_LIMBS_256BIT];
+
94  limb_t CB[NUM_LIMBS_256BIT];
+
95  uint8_t mask;
+
96  uint8_t sposn;
+
97  uint8_t select;
+
98  uint8_t swap;
+
99  bool retval;
+
100 
+
101  // Unpack the "x" argument into the limb representation
+
102  // which also masks off the high bit. NULL means 9.
+
103  if (x) {
+
104  // x1 = x
+
105  BigNumberUtil::unpackLE(x_1, NUM_LIMBS_256BIT, x, 32);
+
106  x_1[NUM_LIMBS_256BIT - 1] &= ((((limb_t)1) << (LIMB_BITS - 1)) - 1);
+
107  } else {
+
108  memset(x_1, 0, sizeof(x_1)); // x_1 = 9
+
109  x_1[0] = 9;
+
110  }
+
111 
+
112  // Check that "x" is within the range of the modulo field.
+
113  // We can do this with a reduction - if there was no borrow
+
114  // then the value of "x" was out of range. Timing is sensitive
+
115  // here so that we don't reveal anything about the value of "x".
+
116  // If there was a reduction, then continue executing the rest
+
117  // of this function with the (now) in-range "x" value and
+
118  // report the failure at the end.
+
119  retval = (bool)(reduceQuick(x_1) & 0x01);
+
120 
+
121  // Initialize the other temporary variables.
+
122  memset(x_2, 0, sizeof(x_2)); // x_2 = 1
+
123  x_2[0] = 1;
+
124  memset(z_2, 0, sizeof(z_2)); // z_2 = 0
+
125  memcpy(x_3, x_1, sizeof(x_1)); // x_3 = x
+
126  memcpy(z_3, x_2, sizeof(x_2)); // z_3 = 1
+
127 
+
128  // Iterate over all 255 bits of "s" from the highest to the lowest.
+
129  // We ignore the high bit of the 256-bit representation of "s".
+
130  mask = 0x40;
+
131  sposn = 31;
+
132  swap = 0;
+
133  for (uint8_t t = 255; t > 0; --t) {
+
134  // Conditional swaps on entry to this bit but only if we
+
135  // didn't swap on the previous bit.
+
136  select = s[sposn] & mask;
+
137  swap ^= select;
+
138  cswap(swap, x_2, x_3);
+
139  cswap(swap, z_2, z_3);
+
140 
+
141  // Evaluate the curve.
+
142  add(A, x_2, z_2); // A = x_2 + z_2
+
143  square(AA, A); // AA = A^2
+
144  sub(B, x_2, z_2); // B = x_2 - z_2
+
145  square(BB, B); // BB = B^2
+
146  sub(E, AA, BB); // E = AA - BB
+
147  add(C, x_3, z_3); // C = x_3 + z_3
+
148  sub(D, x_3, z_3); // D = x_3 - z_3
+
149  mul(DA, D, A); // DA = D * A
+
150  mul(CB, C, B); // CB = C * B
+
151  add(x_3, DA, CB); // x_3 = (DA + CB)^2
+
152  square(x_3, x_3);
+
153  sub(z_3, DA, CB); // z_3 = x_1 * (DA - CB)^2
+
154  square(z_3, z_3);
+
155  mul(z_3, z_3, x_1);
+
156  mul(x_2, AA, BB); // x_2 = AA * BB
+
157  mulA24(z_2, E); // z_2 = E * (AA + a24 * E)
+
158  add(z_2, z_2, AA);
+
159  mul(z_2, z_2, E);
+
160 
+
161  // Move onto the next lower bit of "s".
+
162  mask >>= 1;
+
163  if (!mask) {
+
164  --sposn;
+
165  mask = 0x80;
+
166  swap = select << 7;
+
167  } else {
+
168  swap = select >> 1;
+
169  }
+
170  }
+
171 
+
172  // Final conditional swaps.
+
173  cswap(swap, x_2, x_3);
+
174  cswap(swap, z_2, z_3);
+
175 
+
176  // Compute x_2 * (z_2 ^ (p - 2)) where p = 2^255 - 19.
+
177  recip(z_3, z_2);
+
178  mul(x_2, x_2, z_3);
+
179 
+
180  // Pack the result into the return array.
+
181  BigNumberUtil::packLE(result, 32, x_2, NUM_LIMBS_256BIT);
+
182 
+
183  // Clean up and exit.
+
184  clean(x_1);
+
185  clean(x_2);
+
186  clean(x_3);
+
187  clean(z_2);
+
188  clean(z_3);
+
189  clean(A);
+
190  clean(B);
+
191  clean(C);
+
192  clean(D);
+
193  clean(E);
+
194  clean(AA);
+
195  clean(BB);
+
196  clean(DA);
+
197  clean(CB);
+
198  return retval;
+
199 }
+
200 
+
244 void Curve25519::dh1(uint8_t k[32], uint8_t f[32])
+
245 {
+
246  do {
+
247  // Generate a random "f" value and then adjust the value to make
+
248  // it valid as an "s" value for eval(). According to the specification
+
249  // we need to mask off the 3 right-most bits of f[0], mask off the
+
250  // left-most bit of f[31], and set the second to left-most bit of f[31].
+
251  RNG.rand(f, 32);
+
252  f[0] &= 0xF8;
+
253  f[31] = (f[31] & 0x7F) | 0x40;
+
254 
+
255  // Evaluate the curve function: k = Curve25519::eval(f, 9).
+
256  // We pass NULL to eval() to indicate the value 9. There is no
+
257  // need to check the return value from eval() because we know
+
258  // that 9 is a valid field element.
+
259  eval(k, f, 0);
+
260 
+
261  // If "k" is weak for contributory behaviour then reject it,
+
262  // generate another "f" value, and try again. This case is
+
263  // highly unlikely but we still perform the check just in case.
+
264  } while (isWeakPoint(k));
+
265 }
+
266 
+
282 bool Curve25519::dh2(uint8_t k[32], uint8_t f[32])
+
283 {
+
284  uint8_t weak;
+
285 
+
286  // Evaluate the curve function: k = Curve25519::eval(f, k).
+
287  // If "k" is weak for contributory behaviour before or after
+
288  // the curve evaluation, then fail the exchange. For safety
+
289  // we perform every phase of the weak checks even if we could
+
290  // bail out earlier so that the execution takes the same
+
291  // amount of time for weak and non-weak "k" values.
+
292  weak = isWeakPoint(k); // Is "k" weak before?
+
293  weak |= ((eval(k, f, k) ^ 0x01) & 0x01); // Is "k" weak during?
+
294  weak |= isWeakPoint(k); // Is "k" weak after?
+
295  clean(f, 32);
+
296  return (bool)((weak ^ 0x01) & 0x01);
+
297 }
+
298 
+
306 uint8_t Curve25519::isWeakPoint(const uint8_t k[32])
+
307 {
+
308  // List of weak points from http://cr.yp.to/ecdh.html
+
309  // That page lists some others but they are variants on these
+
310  // of the form "point + i * (2^255 - 19)" for i = 0, 1, 2.
+
311  // Here we mask off the high bit and eval() catches the rest.
+
312  static const uint8_t points[5][32] PROGMEM = {
+
313  {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
314  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
315  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
-
316  {0xE0, 0xEB, 0x7A, 0x7C, 0x3B, 0x41, 0xB8, 0xAE,
-
317  0x16, 0x56, 0xE3, 0xFA, 0xF1, 0x9F, 0xC4, 0x6A,
-
318  0xDA, 0x09, 0x8D, 0xEB, 0x9C, 0x32, 0xB1, 0xFD,
-
319  0x86, 0x62, 0x05, 0x16, 0x5F, 0x49, 0xB8, 0x00},
-
320  {0x5F, 0x9C, 0x95, 0xBC, 0xA3, 0x50, 0x8C, 0x24,
-
321  0xB1, 0xD0, 0xB1, 0x55, 0x9C, 0x83, 0xEF, 0x5B,
-
322  0x04, 0x44, 0x5C, 0xC4, 0x58, 0x1C, 0x8E, 0x86,
-
323  0xD8, 0x22, 0x4E, 0xDD, 0xD0, 0x9F, 0x11, 0x57},
-
324  {0xEC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-
325  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-
326  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-
327  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F}
-
328  };
-
329 
-
330  // Check each of the weak points in turn. We perform the
-
331  // comparisons carefully so as not to reveal the value of "k"
-
332  // in the instruction timing. If "k" is indeed weak then
-
333  // we still check everything so as not to reveal which
-
334  // weak point it is.
-
335  uint8_t result = 0;
-
336  for (uint8_t posn = 0; posn < 5; ++posn) {
-
337  const uint8_t *point = points[posn];
-
338  uint8_t check = (pgm_read_byte(point + 31) ^ k[31]) & 0x7F;
-
339  for (uint8_t index = 31; index > 0; --index)
-
340  check |= (pgm_read_byte(point + index - 1) ^ k[index - 1]);
-
341  result |= (uint8_t)((((uint16_t)0x0100) - check) >> 8);
-
342  }
-
343 
-
344  // The "result" variable will be non-zero if there was a match.
-
345  return result;
-
346 }
-
347 
-
360 void Curve25519::reduce(limb_t *result, limb_t *x, uint8_t size)
-
361 {
-
362  /*
-
363  Note: This explaination is best viewed with a UTF-8 text viewer.
-
364 
-
365  To help explain what this function is doing, the following describes
-
366  how to efficiently compute reductions modulo a base of the form (2ⁿ - b)
-
367  where b is greater than zero and (b + 1)² <= 2ⁿ.
-
368 
-
369  Here we are interested in reducing the result of multiplying two
-
370  numbers that are less than or equal to (2ⁿ - b - 1). That is,
-
371  multiplying numbers that have already been reduced.
-
372 
-
373  Given some x less than or equal to (2ⁿ - b - 1)², we want to find a
-
374  y less than (2ⁿ - b) such that:
-
375 
-
376  y ≡ x mod (2ⁿ - b)
+
315  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
316  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+
317  {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
318  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
319  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
320  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+
321  {0xE0, 0xEB, 0x7A, 0x7C, 0x3B, 0x41, 0xB8, 0xAE,
+
322  0x16, 0x56, 0xE3, 0xFA, 0xF1, 0x9F, 0xC4, 0x6A,
+
323  0xDA, 0x09, 0x8D, 0xEB, 0x9C, 0x32, 0xB1, 0xFD,
+
324  0x86, 0x62, 0x05, 0x16, 0x5F, 0x49, 0xB8, 0x00},
+
325  {0x5F, 0x9C, 0x95, 0xBC, 0xA3, 0x50, 0x8C, 0x24,
+
326  0xB1, 0xD0, 0xB1, 0x55, 0x9C, 0x83, 0xEF, 0x5B,
+
327  0x04, 0x44, 0x5C, 0xC4, 0x58, 0x1C, 0x8E, 0x86,
+
328  0xD8, 0x22, 0x4E, 0xDD, 0xD0, 0x9F, 0x11, 0x57},
+
329  {0xEC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+
330  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+
331  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+
332  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F}
+
333  };
+
334 
+
335  // Check each of the weak points in turn. We perform the
+
336  // comparisons carefully so as not to reveal the value of "k"
+
337  // in the instruction timing. If "k" is indeed weak then
+
338  // we still check everything so as not to reveal which
+
339  // weak point it is.
+
340  uint8_t result = 0;
+
341  for (uint8_t posn = 0; posn < 5; ++posn) {
+
342  const uint8_t *point = points[posn];
+
343  uint8_t check = (pgm_read_byte(point + 31) ^ k[31]) & 0x7F;
+
344  for (uint8_t index = 31; index > 0; --index)
+
345  check |= (pgm_read_byte(point + index - 1) ^ k[index - 1]);
+
346  result |= (uint8_t)((((uint16_t)0x0100) - check) >> 8);
+
347  }
+
348 
+
349  // The "result" variable will be non-zero if there was a match.
+
350  return result;
+
351 }
+
352 
+
365 void Curve25519::reduce(limb_t *result, limb_t *x, uint8_t size)
+
366 {
+
367  /*
+
368  Note: This explaination is best viewed with a UTF-8 text viewer.
+
369 
+
370  To help explain what this function is doing, the following describes
+
371  how to efficiently compute reductions modulo a base of the form (2ⁿ - b)
+
372  where b is greater than zero and (b + 1)² <= 2ⁿ.
+
373 
+
374  Here we are interested in reducing the result of multiplying two
+
375  numbers that are less than or equal to (2ⁿ - b - 1). That is,
+
376  multiplying numbers that have already been reduced.
377 
-
378  We know that for all integer values of k >= 0:
-
379 
-
380  y ≡ x - k * (2ⁿ - b)
-
381  ≡ x - k * 2ⁿ + k * b
+
378  Given some x less than or equal to (2ⁿ - b - 1)², we want to find a
+
379  y less than (2ⁿ - b) such that:
+
380 
+
381  y ≡ x mod (2ⁿ - b)
382 
-
383  In our case we choose k = ⌊x / 2ⁿ⌋ and then let:
+
383  We know that for all integer values of k >= 0:
384 
-
385  w = (x mod 2ⁿ) + ⌊x / 2ⁿ⌋ * b
-
386 
-
387  The value w will either be the answer y or y can be obtained by
-
388  repeatedly subtracting (2ⁿ - b) from w until it is less than (2ⁿ - b).
-
389  At most b subtractions will be required.
-
390 
-
391  In our case b is 19 which is more subtractions than we would like to do,
-
392  but we can handle that by performing the above reduction twice and then
-
393  performing a single trial subtraction:
-
394 
-
395  w = (x mod 2ⁿ) + ⌊x / 2ⁿ⌋ * b
-
396  y = (w mod 2ⁿ) + ⌊w / 2ⁿ⌋ * b
-
397  if y >= (2ⁿ - b)
-
398  y -= (2ⁿ - b)
+
385  y ≡ x - k * (2ⁿ - b)
+
386  ≡ x - k * 2ⁿ + k * b
+
387 
+
388  In our case we choose k = ⌊x / 2ⁿ⌋ and then let:
+
389 
+
390  w = (x mod 2ⁿ) + ⌊x / 2ⁿ⌋ * b
+
391 
+
392  The value w will either be the answer y or y can be obtained by
+
393  repeatedly subtracting (2ⁿ - b) from w until it is less than (2ⁿ - b).
+
394  At most b subtractions will be required.
+
395 
+
396  In our case b is 19 which is more subtractions than we would like to do,
+
397  but we can handle that by performing the above reduction twice and then
+
398  performing a single trial subtraction:
399 
-
400  The value y is the answer we want for reducing x modulo (2ⁿ - b).
-
401  */
-
402 
-
403  dlimb_t carry;
-
404  uint8_t posn;
-
405 
-
406  // Calculate (x mod 2^255) + ((x / 2^255) * 19) which will
-
407  // either produce the answer we want or it will produce a
-
408  // value of the form "answer + j * (2^255 - 19)".
-
409  carry = ((dlimb_t)(x[NUM_LIMBS_256BIT - 1] >> (LIMB_BITS - 1))) * 19U;
-
410  x[NUM_LIMBS_256BIT - 1] &= ((((limb_t)1) << (LIMB_BITS - 1)) - 1);
-
411  for (posn = 0; posn < size; ++posn) {
-
412  carry += ((dlimb_t)(x[posn + NUM_LIMBS_256BIT])) * 38U;
-
413  carry += x[posn];
-
414  x[posn] = (limb_t)carry;
-
415  carry >>= LIMB_BITS;
-
416  }
-
417  if (size < NUM_LIMBS_256BIT) {
-
418  // The high order half of the number is short; e.g. for mulA24().
-
419  // Propagate the carry through the rest of the low order part.
-
420  for (posn = size; posn < NUM_LIMBS_256BIT; ++posn) {
-
421  carry += x[posn];
-
422  x[posn] = (limb_t)carry;
-
423  carry >>= LIMB_BITS;
-
424  }
-
425  }
-
426 
-
427  // The "j" value may still be too large due to the final carry-out.
-
428  // We must repeat the reduction. If we already have the answer,
-
429  // then this won't do any harm but we must still do the calculation
-
430  // to preserve the overall timing.
-
431  carry *= 38U;
-
432  carry += ((dlimb_t)(x[NUM_LIMBS_256BIT - 1] >> (LIMB_BITS - 1))) * 19U;
-
433  x[NUM_LIMBS_256BIT - 1] &= ((((limb_t)1) << (LIMB_BITS - 1)) - 1);
-
434  for (posn = 0; posn < NUM_LIMBS_256BIT; ++posn) {
-
435  carry += x[posn];
-
436  x[posn] = (limb_t)carry;
-
437  carry >>= LIMB_BITS;
-
438  }
-
439 
-
440  // At this point "x" will either be the answer or it will be the
-
441  // answer plus (2^255 - 19). Perform a trial subtraction which
-
442  // is equivalent to adding 19 and subtracting 2^255. We put the
-
443  // trial answer into the top-most limbs of the original "x" array.
-
444  // We add 19 here; the subtraction of 2^255 occurs in the next step.
-
445  carry = 19U;
-
446  for (posn = 0; posn < NUM_LIMBS_256BIT; ++posn) {
-
447  carry += x[posn];
-
448  x[posn + NUM_LIMBS_256BIT] = (limb_t)carry;
-
449  carry >>= LIMB_BITS;
-
450  }
-
451 
-
452  // If there was a borrow, then the bottom-most limbs of "x" are the
-
453  // correct answer. If there was no borrow, then the top-most limbs
-
454  // of "x" are the correct answer. Select the correct answer but do
-
455  // it in a way that instruction timing will not reveal which value
-
456  // was selected. Borrow will occur if the high bit of the previous
-
457  // result is 0: turn the high bit into a selection mask.
-
458  limb_t mask = (limb_t)(((slimb_t)(x[NUM_LIMBS_512BIT - 1])) >> (LIMB_BITS - 1));
-
459  limb_t nmask = ~mask;
-
460  x[NUM_LIMBS_512BIT - 1] &= ((((limb_t)1) << (LIMB_BITS - 1)) - 1);
-
461  for (posn = 0; posn < NUM_LIMBS_256BIT; ++posn) {
-
462  result[posn] = (x[posn] & nmask) | (x[posn + NUM_LIMBS_256BIT] & mask);
-
463  }
-
464 }
-
465 
-
479 limb_t Curve25519::reduceQuick(limb_t *x)
-
480 {
-
481  limb_t temp[NUM_LIMBS_256BIT];
-
482  dlimb_t carry;
-
483  uint8_t posn;
-
484  limb_t *xx;
-
485  limb_t *tt;
-
486 
-
487  // Perform a trial subtraction of (2^255 - 19) from "x" which is
-
488  // equivalent to adding 19 and subtracting 2^255. We add 19 here;
-
489  // the subtraction of 2^255 occurs in the next step.
-
490  carry = 19U;
-
491  xx = x;
-
492  tt = temp;
-
493  for (posn = 0; posn < NUM_LIMBS_256BIT; ++posn) {
-
494  carry += *xx++;
-
495  *tt++ = (limb_t)carry;
-
496  carry >>= LIMB_BITS;
-
497  }
-
498 
-
499  // If there was a borrow, then the original "x" is the correct answer.
-
500  // If there was no borrow, then "temp" is the correct answer. Select the
-
501  // correct answer but do it in a way that instruction timing will not
-
502  // reveal which value was selected. Borrow will occur if the high bit
-
503  // of "temp" is 0: turn the high bit into a selection mask.
-
504  limb_t mask = (limb_t)(((slimb_t)(temp[NUM_LIMBS_256BIT - 1])) >> (LIMB_BITS - 1));
-
505  limb_t nmask = ~mask;
-
506  temp[NUM_LIMBS_256BIT - 1] &= ((((limb_t)1) << (LIMB_BITS - 1)) - 1);
-
507  xx = x;
-
508  tt = temp;
-
509  for (posn = 0; posn < NUM_LIMBS_256BIT; ++posn) {
-
510  *xx = ((*xx) & nmask) | ((*tt++) & mask);
-
511  ++xx;
-
512  }
-
513 
-
514  // Clean up "temp".
-
515  strict_clean(temp);
-
516 
-
517  // Return a zero value if we actually subtracted (2^255 - 19) from "x".
-
518  return nmask;
-
519 }
-
520 
-
533 void Curve25519::mulNoReduce(limb_t *result, const limb_t *x, const limb_t *y)
-
534 {
-
535  uint8_t i, j;
-
536  dlimb_t carry;
-
537  limb_t word;
-
538  const limb_t *yy;
-
539  limb_t *rr;
-
540 
-
541  // Multiply the lowest word of x by y.
-
542  carry = 0;
-
543  word = x[0];
-
544  yy = y;
-
545  rr = result;
-
546  for (i = 0; i < NUM_LIMBS_256BIT; ++i) {
-
547  carry += ((dlimb_t)(*yy++)) * word;
-
548  *rr++ = (limb_t)carry;
-
549  carry >>= LIMB_BITS;
-
550  }
-
551  *rr = (limb_t)carry;
+
400  w = (x mod 2ⁿ) + ⌊x / 2ⁿ⌋ * b
+
401  y = (w mod 2ⁿ) + ⌊w / 2ⁿ⌋ * b
+
402  if y >= (2ⁿ - b)
+
403  y -= (2ⁿ - b)
+
404 
+
405  The value y is the answer we want for reducing x modulo (2ⁿ - b).
+
406  */
+
407 
+
408 #if !defined(CURVE25519_ASM_AVR)
+
409  dlimb_t carry;
+
410  uint8_t posn;
+
411 
+
412  // Calculate (x mod 2^255) + ((x / 2^255) * 19) which will
+
413  // either produce the answer we want or it will produce a
+
414  // value of the form "answer + j * (2^255 - 19)".
+
415  carry = ((dlimb_t)(x[NUM_LIMBS_256BIT - 1] >> (LIMB_BITS - 1))) * 19U;
+
416  x[NUM_LIMBS_256BIT - 1] &= ((((limb_t)1) << (LIMB_BITS - 1)) - 1);
+
417  for (posn = 0; posn < size; ++posn) {
+
418  carry += ((dlimb_t)(x[posn + NUM_LIMBS_256BIT])) * 38U;
+
419  carry += x[posn];
+
420  x[posn] = (limb_t)carry;
+
421  carry >>= LIMB_BITS;
+
422  }
+
423  if (size < NUM_LIMBS_256BIT) {
+
424  // The high order half of the number is short; e.g. for mulA24().
+
425  // Propagate the carry through the rest of the low order part.
+
426  for (posn = size; posn < NUM_LIMBS_256BIT; ++posn) {
+
427  carry += x[posn];
+
428  x[posn] = (limb_t)carry;
+
429  carry >>= LIMB_BITS;
+
430  }
+
431  }
+
432 
+
433  // The "j" value may still be too large due to the final carry-out.
+
434  // We must repeat the reduction. If we already have the answer,
+
435  // then this won't do any harm but we must still do the calculation
+
436  // to preserve the overall timing.
+
437  carry *= 38U;
+
438  carry += ((dlimb_t)(x[NUM_LIMBS_256BIT - 1] >> (LIMB_BITS - 1))) * 19U;
+
439  x[NUM_LIMBS_256BIT - 1] &= ((((limb_t)1) << (LIMB_BITS - 1)) - 1);
+
440  for (posn = 0; posn < NUM_LIMBS_256BIT; ++posn) {
+
441  carry += x[posn];
+
442  x[posn] = (limb_t)carry;
+
443  carry >>= LIMB_BITS;
+
444  }
+
445 
+
446  // At this point "x" will either be the answer or it will be the
+
447  // answer plus (2^255 - 19). Perform a trial subtraction which
+
448  // is equivalent to adding 19 and subtracting 2^255. We put the
+
449  // trial answer into the top-most limbs of the original "x" array.
+
450  // We add 19 here; the subtraction of 2^255 occurs in the next step.
+
451  carry = 19U;
+
452  for (posn = 0; posn < NUM_LIMBS_256BIT; ++posn) {
+
453  carry += x[posn];
+
454  x[posn + NUM_LIMBS_256BIT] = (limb_t)carry;
+
455  carry >>= LIMB_BITS;
+
456  }
+
457 
+
458  // If there was a borrow, then the bottom-most limbs of "x" are the
+
459  // correct answer. If there was no borrow, then the top-most limbs
+
460  // of "x" are the correct answer. Select the correct answer but do
+
461  // it in a way that instruction timing will not reveal which value
+
462  // was selected. Borrow will occur if the high bit of the previous
+
463  // result is 0: turn the high bit into a selection mask.
+
464  limb_t mask = (limb_t)(((slimb_t)(x[NUM_LIMBS_512BIT - 1])) >> (LIMB_BITS - 1));
+
465  limb_t nmask = ~mask;
+
466  x[NUM_LIMBS_512BIT - 1] &= ((((limb_t)1) << (LIMB_BITS - 1)) - 1);
+
467  for (posn = 0; posn < NUM_LIMBS_256BIT; ++posn) {
+
468  result[posn] = (x[posn] & nmask) | (x[posn + NUM_LIMBS_256BIT] & mask);
+
469  }
+
470 #else
+
471  __asm__ __volatile__ (
+
472  // Calculate (x mod 2^255) + ((x / 2^255) * 19) which will
+
473  // either produce the answer we want or it will produce a
+
474  // value of the form "answer + j * (2^255 - 19)".
+
475  "ldd r24,Z+31\n" // Extract the high bit of x[31]
+
476  "mov r25,r24\n" // and mask it off
+
477  "andi r25,0x7F\n"
+
478  "std Z+31,r25\n"
+
479  "lsl r24\n" // carry = high bit * 19
+
480  "mov r24,__zero_reg__\n"
+
481  "sbc r24,__zero_reg__\n"
+
482  "andi r24,19\n"
+
483 
+
484  "mov r25,%1\n" // load "size" into r25
+
485  "ldi r23,38\n" // r23 = 38
+
486  "mov r22,__zero_reg__\n" // r22 = 0 (we're about to destroy r1)
+
487  "1:\n"
+
488  "ld r16,Z\n" // r16 = x[0]
+
489  "ldd r17,Z+32\n" // r17 = x[32]
+
490  "mul r17,r23\n" // r0:r1 = r17 * 38
+
491  "add r0,r24\n" // r0:r1 += carry
+
492  "adc r1,r22\n"
+
493  "add r0,r16\n" // r0:r1 += r16
+
494  "adc r1,r22\n"
+
495  "st Z+,r0\n" // *x++ = r0
+
496  "mov r24,r1\n" // carry = r1
+
497  "dec r25\n" // if (--r25 != 0) loop
+
498  "brne 1b\n"
+
499 
+
500  // If the size is short, then we need to continue propagating carries.
+
501  "ldi r25,32\n"
+
502  "cp %1,r25\n"
+
503  "breq 3f\n"
+
504  "sub r25,%1\n"
+
505  "ld __tmp_reg__,Z\n"
+
506  "add __tmp_reg__,r24\n"
+
507  "st Z+,__tmp_reg__\n"
+
508  "dec r25\n"
+
509  "2:\n"
+
510  "ld __tmp_reg__,Z\n" // *x++ += carry
+
511  "adc __tmp_reg__,r22\n"
+
512  "st Z+,__tmp_reg__\n"
+
513  "dec r25\n"
+
514  "brne 2b\n"
+
515  "mov r24,r22\n" // put the carry back into r24
+
516  "adc r24,r22\n"
+
517  "3:\n"
+
518  "sbiw r30,32\n" // Point Z back to the start of "x"
+
519 
+
520  // The "j" value may still be too large due to the final carry-out.
+
521  // We must repeat the reduction. If we already have the answer,
+
522  // then this won't do any harm but we must still do the calculation
+
523  // to preserve the overall timing.
+
524  "mul r24,r23\n" // carry *= 38
+
525  "ldd r24,Z+31\n" // Extract the high bit of x[31]
+
526  "mov r25,r24\n" // and mask it off
+
527  "andi r25,0x7F\n"
+
528  "std Z+31,r25\n"
+
529  "lsl r24\n" // carry += high bit * 19
+
530  "mov r24,r22\n"
+
531  "sbc r24,r22\n"
+
532  "andi r24,19\n"
+
533  "add r0,r24\n"
+
534  "adc r1,r22\n" // 9-bit carry is now in r0:r1
+
535 
+
536  // Propagate the carry through the rest of x.
+
537  "ld r24,Z\n" // x[0]
+
538  "add r0,r24\n"
+
539  "adc r1,r22\n"
+
540  "st Z+,r0\n"
+
541  "ld r24,Z\n" // x[1]
+
542  "add r1,r24\n"
+
543  "st Z+,r1\n"
+
544  "ldi r25,30\n" // x[2..31]
+
545  "4:\n"
+
546  "ld r24,Z\n"
+
547  "adc r24,r22\n"
+
548  "st Z+,r24\n"
+
549  "dec r25\n"
+
550  "brne 4b\n"
+
551  "sbiw r30,32\n" // Point Z back to the start of "x"
552 
-
553  // Multiply and add the remaining words of x by y.
-
554  for (i = 1; i < NUM_LIMBS_256BIT; ++i) {
-
555  word = x[i];
-
556  carry = 0;
-
557  yy = y;
-
558  rr = result + i;
-
559  for (j = 0; j < NUM_LIMBS_256BIT; ++j) {
-
560  carry += ((dlimb_t)(*yy++)) * word;
-
561  carry += *rr;
-
562  *rr++ = (limb_t)carry;
-
563  carry >>= LIMB_BITS;
-
564  }
-
565  *rr = (limb_t)carry;
-
566  }
-
567 }
-
568 
-
579 void Curve25519::mul(limb_t *result, const limb_t *x, const limb_t *y)
-
580 {
-
581  limb_t temp[NUM_LIMBS_512BIT];
-
582  mulNoReduce(temp, x, y);
-
583  reduce(result, temp, NUM_LIMBS_256BIT);
-
584  strict_clean(temp);
-
585 }
-
586 
-
606 void Curve25519::mulA24(limb_t *result, const limb_t *x)
-
607 {
-
608  // The constant a24 = 121665 (0x1DB41) as a limb array.
-
609 #if BIGNUMBER_LIMB_8BIT
-
610  static limb_t const a24[3] PROGMEM = {0x41, 0xDB, 0x01};
-
611 #elif BIGNUMBER_LIMB_16BIT
-
612  static limb_t const a24[2] PROGMEM = {0xDB41, 0x0001};
-
613 #elif BIGNUMBER_LIMB_32BIT
-
614  static limb_t const a24[1] PROGMEM = {0x0001DB41};
-
615 #else
-
616  #error "limb_t must be 8, 16, or 32 bits in size"
-
617 #endif
-
618  #define NUM_A24_LIMBS (sizeof(a24) / sizeof(limb_t))
-
619 
-
620  // Multiply the lowest limb of a24 by x and zero-extend into the result.
-
621  limb_t temp[NUM_LIMBS_512BIT];
-
622  uint8_t i, j;
-
623  dlimb_t carry = 0;
-
624  limb_t word = pgm_read_limb(&(a24[0]));
-
625  const limb_t *xx = x;
-
626  limb_t *tt = temp;
-
627  for (i = 0; i < NUM_LIMBS_256BIT; ++i) {
-
628  carry += ((dlimb_t)(*xx++)) * word;
-
629  *tt++ = (limb_t)carry;
-
630  carry >>= LIMB_BITS;
-
631  }
-
632  *tt = (limb_t)carry;
-
633 
-
634  // Multiply and add the remaining limbs of a24.
-
635  for (i = 1; i < NUM_A24_LIMBS; ++i) {
-
636  word = pgm_read_limb(&(a24[i]));
-
637  carry = 0;
-
638  xx = x;
-
639  tt = temp + i;
-
640  for (j = 0; j < NUM_LIMBS_256BIT; ++j) {
-
641  carry += ((dlimb_t)(*xx++)) * word;
-
642  carry += *tt;
-
643  *tt++ = (limb_t)carry;
-
644  carry >>= LIMB_BITS;
-
645  }
-
646  *tt = (limb_t)carry;
-
647  }
-
648 
-
649  // Reduce the intermediate result modulo 2^255 - 19.
-
650  reduce(result, temp, NUM_A24_LIMBS);
-
651  strict_clean(temp);
-
652 }
-
653 
-
665 void Curve25519::mul_P(limb_t *result, const limb_t *x, const limb_t *y)
-
666 {
-
667  limb_t temp[NUM_LIMBS_512BIT];
-
668  uint8_t i, j;
-
669  dlimb_t carry;
-
670  limb_t word;
-
671  const limb_t *yy;
-
672  limb_t *tt;
-
673 
-
674  // Multiply the lowest word of x by y.
-
675  carry = 0;
-
676  word = x[0];
-
677  yy = y;
-
678  tt = temp;
-
679  for (i = 0; i < NUM_LIMBS_256BIT; ++i) {
-
680  carry += ((dlimb_t)(pgm_read_limb(yy))) * word;
-
681  *tt++ = (limb_t)carry;
-
682  carry >>= LIMB_BITS;
-
683  ++yy;
-
684  }
-
685  *tt = (limb_t)carry;
-
686 
-
687  // Multiply and add the remaining words of x by y.
-
688  for (i = 1; i < NUM_LIMBS_256BIT; ++i) {
-
689  word = x[i];
-
690  carry = 0;
-
691  yy = y;
-
692  tt = temp + i;
-
693  for (j = 0; j < NUM_LIMBS_256BIT; ++j) {
-
694  carry += ((dlimb_t)(pgm_read_limb(yy))) * word;
-
695  carry += *tt;
-
696  *tt++ = (limb_t)carry;
-
697  carry >>= LIMB_BITS;
-
698  ++yy;
-
699  }
-
700  *tt = (limb_t)carry;
-
701  }
-
702 
-
703  // Reduce the intermediate result modulo 2^255 - 19.
-
704  reduce(result, temp, NUM_LIMBS_256BIT);
-
705  strict_clean(temp);
-
706 }
-
707 
-
718 void Curve25519::add(limb_t *result, const limb_t *x, const limb_t *y)
-
719 {
-
720  dlimb_t carry = 0;
-
721  uint8_t posn;
-
722  limb_t *rr = result;
-
723 
-
724  // Add the two arrays to obtain the intermediate result.
-
725  for (posn = 0; posn < NUM_LIMBS_256BIT; ++posn) {
-
726  carry += *x++;
-
727  carry += *y++;
-
728  *rr++ = (limb_t)carry;
-
729  carry >>= LIMB_BITS;
-
730  }
-
731 
-
732  // Reduce the result using the quick trial subtraction method.
-
733  reduceQuick(result);
-
734 }
-
735 
-
746 void Curve25519::sub(limb_t *result, const limb_t *x, const limb_t *y)
-
747 {
-
748  dlimb_t borrow;
-
749  uint8_t posn;
-
750  limb_t *rr = result;
-
751 
-
752  // Subtract y from x to generate the intermediate result.
-
753  borrow = 0;
-
754  for (posn = 0; posn < NUM_LIMBS_256BIT; ++posn) {
-
755  borrow = ((dlimb_t)(*x++)) - (*y++) - ((borrow >> LIMB_BITS) & 0x01);
-
756  *rr++ = (limb_t)borrow;
-
757  }
-
758 
-
759  // If we had a borrow, then the result has gone negative and we
-
760  // have to add 2^255 - 19 to the result to make it positive again.
-
761  // The top bits of "borrow" will be all 1's if there is a borrow
-
762  // or it will be all 0's if there was no borrow. Easiest is to
-
763  // conditionally subtract 19 and then mask off the high bit.
-
764  rr = result;
-
765  borrow = (borrow >> LIMB_BITS) & 19U;
-
766  borrow = ((dlimb_t)(*rr)) - borrow;
-
767  *rr++ = (limb_t)borrow;
-
768  for (posn = 1; posn < NUM_LIMBS_256BIT; ++posn) {
-
769  borrow = ((dlimb_t)(*rr)) - ((borrow >> LIMB_BITS) & 0x01);
-
770  *rr++ = (limb_t)borrow;
-
771  }
-
772  *(--rr) &= ((((limb_t)1) << (LIMB_BITS - 1)) - 1);
-
773 }
-
774 
-
787 void Curve25519::cswap(limb_t select, limb_t *x, limb_t *y)
-
788 {
-
789  uint8_t posn;
-
790  limb_t dummy;
-
791  limb_t sel;
-
792 
-
793  // Turn "select" into an all-zeroes or all-ones mask. We don't care
-
794  // which bit or bits is set in the original "select" value.
-
795  sel = (limb_t)(((((dlimb_t)1) << LIMB_BITS) - select) >> LIMB_BITS);
-
796  --sel;
-
797 
-
798  // Swap the two values based on "select". Algorithm from:
-
799  // https://tools.ietf.org/html/draft-irtf-cfrg-curves-02
-
800  for (posn = 0; posn < NUM_LIMBS_256BIT; ++posn) {
-
801  dummy = sel & (x[posn] ^ y[posn]);
-
802  x[posn] ^= dummy;
-
803  y[posn] ^= dummy;
-
804  }
-
805 }
-
806 
-
819 void Curve25519::cmove(limb_t select, limb_t *x, const limb_t *y)
-
820 {
-
821  uint8_t posn;
-
822  limb_t dummy;
-
823  limb_t sel;
-
824 
-
825  // Turn "select" into an all-zeroes or all-ones mask. We don't care
-
826  // which bit or bits is set in the original "select" value.
-
827  sel = (limb_t)(((((dlimb_t)1) << LIMB_BITS) - select) >> LIMB_BITS);
-
828  --sel;
-
829 
-
830  // Move y into x based on "select". Similar to conditional swap above.
-
831  for (posn = 0; posn < NUM_LIMBS_256BIT; ++posn) {
-
832  dummy = sel & (x[posn] ^ y[posn]);
-
833  x[posn] ^= dummy;
-
834  }
-
835 }
-
836 
-
843 void Curve25519::pow250(limb_t *result, const limb_t *x)
-
844 {
-
845  limb_t t1[NUM_LIMBS_256BIT];
-
846  uint8_t i, j;
-
847 
-
848  // The big-endian hexadecimal expansion of (2^250 - 1) is:
-
849  // 03FFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
-
850  //
-
851  // The naive implementation needs to do 2 multiplications per 1 bit and
-
852  // 1 multiplication per 0 bit. We can improve upon this by creating a
-
853  // pattern 0000000001 ... 0000000001. If we square and multiply the
-
854  // pattern by itself we can turn the pattern into the partial results
-
855  // 0000000011 ... 0000000011, 0000000111 ... 0000000111, etc.
-
856  // This averages out to about 1.1 multiplications per 1 bit instead of 2.
-
857 
-
858  // Build a pattern of 250 bits in length of repeated copies of 0000000001.
-
859  #define RECIP_GROUP_SIZE 10
-
860  #define RECIP_GROUP_BITS 250 // Must be a multiple of RECIP_GROUP_SIZE.
-
861  square(t1, x);
-
862  for (j = 0; j < (RECIP_GROUP_SIZE - 1); ++j)
-
863  square(t1, t1);
-
864  mul(result, t1, x);
-
865  for (i = 0; i < ((RECIP_GROUP_BITS / RECIP_GROUP_SIZE) - 2); ++i) {
-
866  for (j = 0; j < RECIP_GROUP_SIZE; ++j)
-
867  square(t1, t1);
-
868  mul(result, result, t1);
-
869  }
-
870 
-
871  // Multiply bit-shifted versions of the 0000000001 pattern into
-
872  // the result to "fill in" the gaps in the pattern.
-
873  square(t1, result);
-
874  mul(result, result, t1);
-
875  for (j = 0; j < (RECIP_GROUP_SIZE - 2); ++j) {
-
876  square(t1, t1);
-
877  mul(result, result, t1);
-
878  }
-
879 
-
880  // Clean up and exit.
-
881  clean(t1);
-
882 }
-
883 
-
891 void Curve25519::recip(limb_t *result, const limb_t *x)
-
892 {
-
893  // The reciprocal is the same as x ^ (p - 2) where p = 2^255 - 19.
-
894  // The big-endian hexadecimal expansion of (p - 2) is:
-
895  // 7FFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFEB
-
896  // Start with the 250 upper bits of the expansion of (p - 2).
-
897  pow250(result, x);
-
898 
-
899  // Deal with the 5 lowest bits of (p - 2), 01011, from highest to lowest.
-
900  square(result, result);
-
901  square(result, result);
-
902  mul(result, result, x);
-
903  square(result, result);
-
904  square(result, result);
-
905  mul(result, result, x);
-
906  square(result, result);
-
907  mul(result, result, x);
-
908 }
-
909 
-
925 bool Curve25519::sqrt(limb_t *result, const limb_t *x)
-
926 {
-
927  // sqrt(-1) mod (2^255 - 19).
-
928  static limb_t const numSqrtM1[NUM_LIMBS_256BIT] PROGMEM = {
-
929  LIMB(0x4A0EA0B0), LIMB(0xC4EE1B27), LIMB(0xAD2FE478), LIMB(0x2F431806),
-
930  LIMB(0x3DFBD7A7), LIMB(0x2B4D0099), LIMB(0x4FC1DF0B), LIMB(0x2B832480)
-
931  };
-
932  limb_t y[NUM_LIMBS_256BIT];
-
933 
-
934  // Algorithm from:
-
935  // https://tools.ietf.org/id/draft-josefsson-eddsa-ed25519-02.txt
-
936 
-
937  // Compute a candidate root: result = x^((p + 3) / 8) mod p.
-
938  // (p + 3) / 8 = (2^252 - 2) which is 251 one bits followed by a zero:
-
939  // 0FFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE
-
940  pow250(result, x);
-
941  square(result, result);
-
942  mul(result, result, x);
-
943  square(result, result);
-
944 
-
945  // Did we get the square root immediately?
-
946  square(y, result);
-
947  if (memcmp(x, y, sizeof(y)) == 0) {
-
948  clean(y);
-
949  return true;
-
950  }
-
951 
-
952  // Multiply the result by sqrt(-1) and check again.
-
953  mul_P(result, result, numSqrtM1);
-
954  square(y, result);
-
955  if (memcmp(x, y, sizeof(y)) == 0) {
-
956  clean(y);
-
957  return true;
-
958  }
-
959 
-
960  // The number does not have a square root.
-
961  clean(y);
-
962  return false;
-
963 }
+
553  // We destroyed __zero_reg__ (r1) above, so restore its zero value.
+
554  "mov __zero_reg__,r22\n"
+
555 
+
556  // At this point "x" will either be the answer or it will be the
+
557  // answer plus (2^255 - 19). Perform a trial subtraction which
+
558  // is equivalent to adding 19 and subtracting 2^255. We put the
+
559  // trial answer into the top-most limbs of the original "x" array.
+
560  // We add 19 here; the subtraction of 2^255 occurs in the next step.
+
561  "ldi r24,8\n" // Loop counter.
+
562  "ldi r25,19\n" // carry = 19
+
563  "5:\n"
+
564  "ld r16,Z+\n" // r16:r19:carry = *xx++ + carry
+
565  "ld r17,Z+\n"
+
566  "ld r18,Z+\n"
+
567  "ld r19,Z+\n"
+
568  "add r16,r25\n" // r16:r19:carry += carry
+
569  "adc r17,__zero_reg__\n"
+
570  "adc r18,__zero_reg__\n"
+
571  "adc r19,__zero_reg__\n"
+
572  "mov r25,__zero_reg__\n"
+
573  "adc r25,r25\n"
+
574  "std Z+28,r16\n" // *tt++ = r16:r19
+
575  "std Z+29,r17\n"
+
576  "std Z+30,r18\n"
+
577  "std Z+31,r19\n"
+
578  "dec r24\n"
+
579  "brne 5b\n"
+
580 
+
581  // Subtract 2^255 from x[32..63] which is equivalent to extracting
+
582  // the top bit and then masking it off. If the top bit is zero
+
583  // then a borrow has occurred and this isn't the answer we want.
+
584  "mov r25,r19\n"
+
585  "andi r19,0x7F\n"
+
586  "std Z+31,r19\n"
+
587  "lsl r25\n"
+
588  "mov r25,__zero_reg__\n"
+
589  "sbc r25,__zero_reg__\n"
+
590 
+
591  // At this point, r25 is 0 if the original x[0..31] is the answer
+
592  // we want, or 0xFF if x[32..63] is the answer we want. Essentially
+
593  // we need to do a conditional move of either x[0..31] or x[32..63]
+
594  // into "result".
+
595  "sbiw r30,32\n" // Point Z back to x[0].
+
596  "ldi r24,8\n"
+
597  "6:\n"
+
598  "ldd r16,Z+32\n"
+
599  "ldd r17,Z+33\n"
+
600  "ldd r18,Z+34\n"
+
601  "ldd r19,Z+35\n"
+
602  "ld r20,Z+\n"
+
603  "ld r21,Z+\n"
+
604  "ld r22,Z+\n"
+
605  "ld r23,Z+\n"
+
606  "eor r16,r20\n"
+
607  "eor r17,r21\n"
+
608  "eor r18,r22\n"
+
609  "eor r19,r23\n"
+
610  "and r16,r25\n"
+
611  "and r17,r25\n"
+
612  "and r18,r25\n"
+
613  "and r19,r25\n"
+
614  "eor r20,r16\n"
+
615  "eor r21,r17\n"
+
616  "eor r22,r18\n"
+
617  "eor r23,r19\n"
+
618  "st X+,r20\n"
+
619  "st X+,r21\n"
+
620  "st X+,r22\n"
+
621  "st X+,r23\n"
+
622  "dec r24\n"
+
623  "brne 6b\n"
+
624 
+
625  : : "z"(x), "r"((uint8_t)(size * sizeof(limb_t))), "x"(result)
+
626  : "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
+
627  "r24", "r25"
+
628  );
+
629 #endif
+
630 }
+
631 
+
645 limb_t Curve25519::reduceQuick(limb_t *x)
+
646 {
+
647 #if !defined(CURVE25519_ASM_AVR)
+
648  limb_t temp[NUM_LIMBS_256BIT];
+
649  dlimb_t carry;
+
650  uint8_t posn;
+
651  limb_t *xx;
+
652  limb_t *tt;
+
653 
+
654  // Perform a trial subtraction of (2^255 - 19) from "x" which is
+
655  // equivalent to adding 19 and subtracting 2^255. We add 19 here;
+
656  // the subtraction of 2^255 occurs in the next step.
+
657  carry = 19U;
+
658  xx = x;
+
659  tt = temp;
+
660  for (posn = 0; posn < NUM_LIMBS_256BIT; ++posn) {
+
661  carry += *xx++;
+
662  *tt++ = (limb_t)carry;
+
663  carry >>= LIMB_BITS;
+
664  }
+
665 
+
666  // If there was a borrow, then the original "x" is the correct answer.
+
667  // If there was no borrow, then "temp" is the correct answer. Select the
+
668  // correct answer but do it in a way that instruction timing will not
+
669  // reveal which value was selected. Borrow will occur if the high bit
+
670  // of "temp" is 0: turn the high bit into a selection mask.
+
671  limb_t mask = (limb_t)(((slimb_t)(temp[NUM_LIMBS_256BIT - 1])) >> (LIMB_BITS - 1));
+
672  limb_t nmask = ~mask;
+
673  temp[NUM_LIMBS_256BIT - 1] &= ((((limb_t)1) << (LIMB_BITS - 1)) - 1);
+
674  xx = x;
+
675  tt = temp;
+
676  for (posn = 0; posn < NUM_LIMBS_256BIT; ++posn) {
+
677  *xx = ((*xx) & nmask) | ((*tt++) & mask);
+
678  ++xx;
+
679  }
+
680 
+
681  // Clean up "temp".
+
682  strict_clean(temp);
+
683 
+
684  // Return a zero value if we actually subtracted (2^255 - 19) from "x".
+
685  return nmask;
+
686 #else // CURVE25519_ASM_AVR
+
687  limb_t temp[NUM_LIMBS_256BIT];
+
688  uint8_t result;
+
689  __asm__ __volatile__ (
+
690  // Subtract (2^255 - 19) from "x", which is the same as adding 19
+
691  // and then subtracting 2^255.
+
692  "ldi r24,8\n" // Loop counter.
+
693  "ldi r25,19\n" // carry = 19
+
694  "1:\n"
+
695  "ld r16,Z+\n" // r16:r19:carry = *xx++ + carry
+
696  "ld r17,Z+\n"
+
697  "ld r18,Z+\n"
+
698  "ld r19,Z+\n"
+
699  "add r16,r25\n" // r16:r19:carry += carry
+
700  "adc r17,__zero_reg__\n"
+
701  "adc r18,__zero_reg__\n"
+
702  "adc r19,__zero_reg__\n"
+
703  "mov r25,__zero_reg__\n"
+
704  "adc r25,r25\n"
+
705  "st X+,r16\n" // *tt++ = r16:r19
+
706  "st X+,r17\n"
+
707  "st X+,r18\n"
+
708  "st X+,r19\n"
+
709  "dec r24\n"
+
710  "brne 1b\n"
+
711 
+
712  // Subtract 2^255 from "temp" which is equivalent to extracting
+
713  // the top bit and then masking it off. If the top bit is zero
+
714  // then a borrow has occurred and this isn't the answer we want.
+
715  "mov r25,r19\n"
+
716  "andi r19,0x7F\n"
+
717  "st -X,r19\n"
+
718  "lsl r25\n"
+
719  "mov r25,__zero_reg__\n"
+
720  "sbc r25,__zero_reg__\n"
+
721 
+
722  // At this point, r25 is 0 if the original "x" is the answer
+
723  // we want, or 0xFF if "temp" is the answer we want. Essentially
+
724  // we need to do a conditional move of "temp" into "x".
+
725  "sbiw r26,31\n" // Point X back to the start of "temp".
+
726  "sbiw r30,32\n" // Point Z back to the start of "x".
+
727  "ldi r24,8\n"
+
728  "2:\n"
+
729  "ld r16,X+\n"
+
730  "ld r17,X+\n"
+
731  "ld r18,X+\n"
+
732  "ld r19,X+\n"
+
733  "ld r20,Z\n"
+
734  "ldd r21,Z+1\n"
+
735  "ldd r22,Z+2\n"
+
736  "ldd r23,Z+3\n"
+
737  "eor r16,r20\n"
+
738  "eor r17,r21\n"
+
739  "eor r18,r22\n"
+
740  "eor r19,r23\n"
+
741  "and r16,r25\n"
+
742  "and r17,r25\n"
+
743  "and r18,r25\n"
+
744  "and r19,r25\n"
+
745  "eor r20,r16\n"
+
746  "eor r21,r17\n"
+
747  "eor r22,r18\n"
+
748  "eor r23,r19\n"
+
749  "st Z+,r20\n"
+
750  "st Z+,r21\n"
+
751  "st Z+,r22\n"
+
752  "st Z+,r23\n"
+
753  "dec r24\n"
+
754  "brne 2b\n"
+
755  "mov %0,r25\n"
+
756  : "=r"(result)
+
757  : "x"(temp), "z"(x)
+
758  : "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
+
759  "r24", "r25"
+
760  );
+
761  strict_clean(temp);
+
762  return result;
+
763 #endif // CURVE25519_ASM_AVR
+
764 }
+
765 
+
778 void Curve25519::mulNoReduce(limb_t *result, const limb_t *x, const limb_t *y)
+
779 {
+
780 #if !defined(CURVE25519_ASM_AVR)
+
781  uint8_t i, j;
+
782  dlimb_t carry;
+
783  limb_t word;
+
784  const limb_t *yy;
+
785  limb_t *rr;
+
786 
+
787  // Multiply the lowest word of x by y.
+
788  carry = 0;
+
789  word = x[0];
+
790  yy = y;
+
791  rr = result;
+
792  for (i = 0; i < NUM_LIMBS_256BIT; ++i) {
+
793  carry += ((dlimb_t)(*yy++)) * word;
+
794  *rr++ = (limb_t)carry;
+
795  carry >>= LIMB_BITS;
+
796  }
+
797  *rr = (limb_t)carry;
+
798 
+
799  // Multiply and add the remaining words of x by y.
+
800  for (i = 1; i < NUM_LIMBS_256BIT; ++i) {
+
801  word = x[i];
+
802  carry = 0;
+
803  yy = y;
+
804  rr = result + i;
+
805  for (j = 0; j < NUM_LIMBS_256BIT; ++j) {
+
806  carry += ((dlimb_t)(*yy++)) * word;
+
807  carry += *rr;
+
808  *rr++ = (limb_t)carry;
+
809  carry >>= LIMB_BITS;
+
810  }
+
811  *rr = (limb_t)carry;
+
812  }
+
813 #else
+
814  __asm__ __volatile__ (
+
815  // Save Y and copy the "result" pointer into it.
+
816  "push r28\n"
+
817  "push r29\n"
+
818  "mov r28,%A2\n"
+
819  "mov r29,%B2\n"
+
820 
+
821  // Multiply the first byte of "x" by y[0..31].
+
822  "ldi r25,8\n" // loop 8 times: 4 bytes of y each time
+
823  "clr r24\n" // carry = 0
+
824  "clr r22\n" // r22 = 0 to replace __zero_reg__
+
825  "ld r23,X+\n" // r23 = *x++
+
826  "1:\n"
+
827  "ld r16,Z\n" // r16 = y[0]
+
828  "mul r16,r23\n" // r8:r9 = y[0] * r23
+
829  "movw r8,r0\n"
+
830  "ldd r16,Z+2\n" // r16 = y[2]
+
831  "mul r16,r23\n" // r10:r11 = y[2] * r23
+
832  "movw r10,r0\n"
+
833  "ldd r16,Z+1\n" // r16 = y[1]
+
834  "mul r16,r23\n" // r9:r10:r11 += y[1] * r23
+
835  "add r9,r0\n"
+
836  "adc r10,r1\n"
+
837  "adc r11,r22\n"
+
838  "ldd r16,Z+3\n" // r16 = y[3]
+
839  "mul r16,r23\n" // r11:r1 += y[3] * r23
+
840  "add r11,r0\n"
+
841  "adc r1,r22\n"
+
842  "add r8,r24\n" // r8:r9:r10:r11:r1 += carry
+
843  "adc r9,r22\n"
+
844  "adc r10,r22\n"
+
845  "adc r11,r22\n"
+
846  "adc r1,r22\n"
+
847  "mov r24,r1\n" // carry = r1
+
848  "st Y+,r8\n" // *rr++ = r8:r9:r10:r11
+
849  "st Y+,r9\n"
+
850  "st Y+,r10\n"
+
851  "st Y+,r11\n"
+
852  "adiw r30,4\n"
+
853  "dec r25\n"
+
854  "brne 1b\n"
+
855  "st Y+,r24\n" // *rr++ = carry
+
856  "sbiw r28,32\n" // rr -= 32
+
857  "sbiw r30,32\n" // Point Z back to the start of y
+
858 
+
859  // Multiply and add the remaining bytes of "x" by y[0..31].
+
860  "ldi r21,31\n" // 31 more bytes of x to go.
+
861  "2:\n"
+
862  "ldi r25,8\n" // loop 8 times: 4 bytes of y each time
+
863  "clr r24\n" // carry = 0
+
864  "ld r23,X+\n" // r23 = *x++
+
865  "3:\n"
+
866  "ld r16,Z\n" // r16 = y[0]
+
867  "mul r16,r23\n" // r8:r9 = y[0] * r23
+
868  "movw r8,r0\n"
+
869  "ldd r16,Z+2\n" // r16 = y[2]
+
870  "mul r16,r23\n" // r10:r11 = y[2] * r23
+
871  "movw r10,r0\n"
+
872  "ldd r16,Z+1\n" // r16 = y[1]
+
873  "mul r16,r23\n" // r9:r10:r11 += y[1] * r23
+
874  "add r9,r0\n"
+
875  "adc r10,r1\n"
+
876  "adc r11,r22\n"
+
877  "ldd r16,Z+3\n" // r16 = y[3]
+
878  "mul r16,r23\n" // r11:r1 += y[3] * r23
+
879  "add r11,r0\n"
+
880  "adc r1,r22\n"
+
881  "add r8,r24\n" // r8:r9:r10:r11:r1 += carry
+
882  "adc r9,r22\n"
+
883  "adc r10,r22\n"
+
884  "adc r11,r22\n"
+
885  "adc r1,r22\n"
+
886  "ld r16,Y\n" // r8:r9:r10:r11:r1 += rr[0..3]
+
887  "add r8,r16\n"
+
888  "ldd r16,Y+1\n"
+
889  "adc r9,r16\n"
+
890  "ldd r16,Y+2\n"
+
891  "adc r10,r16\n"
+
892  "ldd r16,Y+3\n"
+
893  "adc r11,r16\n"
+
894  "adc r1,r22\n"
+
895  "mov r24,r1\n" // carry = r1
+
896  "st Y+,r8\n" // *rr++ = r8:r9:r10:r11
+
897  "st Y+,r9\n"
+
898  "st Y+,r10\n"
+
899  "st Y+,r11\n"
+
900  "adiw r30,4\n"
+
901  "dec r25\n"
+
902  "brne 3b\n"
+
903  "st Y+,r24\n" // *r++ = carry
+
904  "sbiw r28,32\n" // rr -= 32
+
905  "sbiw r30,32\n" // Point Z back to the start of y
+
906  "dec r21\n"
+
907  "brne 2b\n"
+
908 
+
909  // Restore Y and __zero_reg__.
+
910  "pop r29\n"
+
911  "pop r28\n"
+
912  "clr __zero_reg__\n"
+
913  : : "x"(x), "z"(y), "r"(result)
+
914  : "r8", "r9", "r10", "r11", "r16", "r20", "r21", "r22",
+
915  "r23", "r24", "r25"
+
916  );
+
917 #endif
+
918 }
+
919 
+
930 void Curve25519::mul(limb_t *result, const limb_t *x, const limb_t *y)
+
931 {
+
932  limb_t temp[NUM_LIMBS_512BIT];
+
933  mulNoReduce(temp, x, y);
+
934  reduce(result, temp, NUM_LIMBS_256BIT);
+
935  strict_clean(temp);
+
936 }
+
937 
+
957 void Curve25519::mulA24(limb_t *result, const limb_t *x)
+
958 {
+
959 #if !defined(CURVE25519_ASM_AVR)
+
960  // The constant a24 = 121665 (0x1DB41) as a limb array.
+
961 #if BIGNUMBER_LIMB_8BIT
+
962  static limb_t const a24[3] PROGMEM = {0x41, 0xDB, 0x01};
+
963 #elif BIGNUMBER_LIMB_16BIT
+
964  static limb_t const a24[2] PROGMEM = {0xDB41, 0x0001};
+
965 #elif BIGNUMBER_LIMB_32BIT
+
966  static limb_t const a24[1] PROGMEM = {0x0001DB41};
+
967 #else
+
968  #error "limb_t must be 8, 16, or 32 bits in size"
+
969 #endif
+
970  #define NUM_A24_LIMBS (sizeof(a24) / sizeof(limb_t))
+
971 
+
972  // Multiply the lowest limb of a24 by x and zero-extend into the result.
+
973  limb_t temp[NUM_LIMBS_512BIT];
+
974  uint8_t i, j;
+
975  dlimb_t carry = 0;
+
976  limb_t word = pgm_read_limb(&(a24[0]));
+
977  const limb_t *xx = x;
+
978  limb_t *tt = temp;
+
979  for (i = 0; i < NUM_LIMBS_256BIT; ++i) {
+
980  carry += ((dlimb_t)(*xx++)) * word;
+
981  *tt++ = (limb_t)carry;
+
982  carry >>= LIMB_BITS;
+
983  }
+
984  *tt = (limb_t)carry;
+
985 
+
986  // Multiply and add the remaining limbs of a24.
+
987  for (i = 1; i < NUM_A24_LIMBS; ++i) {
+
988  word = pgm_read_limb(&(a24[i]));
+
989  carry = 0;
+
990  xx = x;
+
991  tt = temp + i;
+
992  for (j = 0; j < NUM_LIMBS_256BIT; ++j) {
+
993  carry += ((dlimb_t)(*xx++)) * word;
+
994  carry += *tt;
+
995  *tt++ = (limb_t)carry;
+
996  carry >>= LIMB_BITS;
+
997  }
+
998  *tt = (limb_t)carry;
+
999  }
+
1000 #else
+
1001  limb_t temp[NUM_LIMBS_512BIT];
+
1002  #define NUM_A24_LIMBS ((3 + sizeof(limb_t) - 1) / sizeof(limb_t))
+
1003  __asm__ __volatile__ (
+
1004  // Load the two low bytes of a24 into r16 and r17.
+
1005  // The third byte is 0x01 which we can deal with implicitly.
+
1006  "ldi r16,0x41\n"
+
1007  "ldi r17,0xDB\n"
+
1008 
+
1009  // Iterate over the bytes of "x" and multiply each with a24.
+
1010  "ldi r25,32\n" // 32 bytes in "x"
+
1011  "clr r22\n" // r22 = 0
+
1012  "clr r18\n" // r18:r19:r11 = 0 (carry)
+
1013  "clr r19\n"
+
1014  "clr r11\n"
+
1015  "1:\n"
+
1016  "ld r21,X+\n" // r21 = *x++
+
1017  "mul r21,r16\n" // r8:r9 = r21 * a24[0]
+
1018  "movw r8,r0\n"
+
1019  "mul r21,r17\n" // r9:r1 += r21 * a24[1]
+
1020  "add r9,r0\n"
+
1021  "adc r1,r21\n" // r1:r10 += r21 * a24[2] (implicitly 1)
+
1022  "mov r10,r22\n"
+
1023  "adc r10,r22\n"
+
1024  "add r8,r18\n" // r8:r9:r1:r10 += carry
+
1025  "adc r9,r19\n"
+
1026  "adc r1,r11\n"
+
1027  "adc r10,r22\n"
+
1028  "st Z+,r8\n" // *tt++ = r8
+
1029  "mov r18,r9\n" // carry = r9:r1:r10
+
1030  "mov r19,r1\n"
+
1031  "mov r11,r10\n"
+
1032  "dec r25\n"
+
1033  "brne 1b\n"
+
1034  "st Z,r18\n" // *tt = carry
+
1035  "std Z+1,r19\n"
+
1036  "std Z+2,r11\n"
+
1037 #if BIGNUMBER_LIMB_16BIT || BIGNUMBER_LIMB_32BIT
+
1038  "std Z+3,r22\n" // Zero pad to a limb boundary
+
1039 #endif
+
1040 
+
1041  // Restore __zero_reg__
+
1042  "clr __zero_reg__\n"
+
1043 
+
1044  : : "x"(x), "z"(temp)
+
1045  : "r8", "r9", "r10", "r11", "r16", "r17", "r18", "r19",
+
1046  "r20", "r21", "r22", "r25"
+
1047  );
+
1048 #endif
+
1049 
+
1050  // Reduce the intermediate result modulo 2^255 - 19.
+
1051  reduce(result, temp, NUM_A24_LIMBS);
+
1052  strict_clean(temp);
+
1053 }
+
1054 
+
1066 void Curve25519::mul_P(limb_t *result, const limb_t *x, const limb_t *y)
+
1067 {
+
1068  limb_t temp[NUM_LIMBS_512BIT];
+
1069  uint8_t i, j;
+
1070  dlimb_t carry;
+
1071  limb_t word;
+
1072  const limb_t *xx;
+
1073  limb_t *tt;
+
1074 
+
1075  // Multiply the lowest word of y by x.
+
1076  carry = 0;
+
1077  word = pgm_read_limb(&(y[0]));
+
1078  xx = x;
+
1079  tt = temp;
+
1080  for (i = 0; i < NUM_LIMBS_256BIT; ++i) {
+
1081  carry += ((dlimb_t)(*xx++)) * word;
+
1082  *tt++ = (limb_t)carry;
+
1083  carry >>= LIMB_BITS;
+
1084  }
+
1085  *tt = (limb_t)carry;
+
1086 
+
1087  // Multiply and add the remaining words of y by x.
+
1088  for (i = 1; i < NUM_LIMBS_256BIT; ++i) {
+
1089  word = pgm_read_limb(&(y[i]));
+
1090  carry = 0;
+
1091  xx = x;
+
1092  tt = temp + i;
+
1093  for (j = 0; j < NUM_LIMBS_256BIT; ++j) {
+
1094  carry += ((dlimb_t)(*xx++)) * word;
+
1095  carry += *tt;
+
1096  *tt++ = (limb_t)carry;
+
1097  carry >>= LIMB_BITS;
+
1098  }
+
1099  *tt = (limb_t)carry;
+
1100  }
+
1101 
+
1102  // Reduce the intermediate result modulo 2^255 - 19.
+
1103  reduce(result, temp, NUM_LIMBS_256BIT);
+
1104  strict_clean(temp);
+
1105 }
+
1106 
+
1117 void Curve25519::add(limb_t *result, const limb_t *x, const limb_t *y)
+
1118 {
+
1119 #if !defined(CURVE25519_ASM_AVR)
+
1120  dlimb_t carry = 0;
+
1121  uint8_t posn;
+
1122  limb_t *rr = result;
+
1123 
+
1124  // Add the two arrays to obtain the intermediate result.
+
1125  for (posn = 0; posn < NUM_LIMBS_256BIT; ++posn) {
+
1126  carry += *x++;
+
1127  carry += *y++;
+
1128  *rr++ = (limb_t)carry;
+
1129  carry >>= LIMB_BITS;
+
1130  }
+
1131 #else // CURVE25519_ASM_AVR
+
1132  __asm__ __volatile__ (
+
1133  // Save Y and copy the "result" pointer into it.
+
1134  "push r28\n"
+
1135  "push r29\n"
+
1136  "mov r28,%A2\n"
+
1137  "mov r29,%B2\n"
+
1138 
+
1139  // Unroll the loop to operate on 4 bytes at a time (8 iterations).
+
1140  "ldi r24,8\n" // Loop counter.
+
1141  "clr r25\n" // carry = 0
+
1142  "1:\n"
+
1143  "ld r16,X+\n" // r16:r19 = *x++
+
1144  "ld r17,X+\n"
+
1145  "ld r18,X+\n"
+
1146  "ld r19,X+\n"
+
1147  "ld r20,Z+\n" // r20:r23 = *y++
+
1148  "ld r21,Z+\n"
+
1149  "ld r22,Z+\n"
+
1150  "ld r23,Z+\n"
+
1151  "add r16,r25\n" // r16:r19:carry += carry
+
1152  "adc r17,__zero_reg__\n"
+
1153  "adc r18,__zero_reg__\n"
+
1154  "adc r19,__zero_reg__\n"
+
1155  "mov r25,__zero_reg__\n"
+
1156  "adc r25,r25\n"
+
1157  "add r16,r20\n" // r16:r19:carry += r20:r23
+
1158  "adc r17,r21\n"
+
1159  "adc r18,r22\n"
+
1160  "adc r19,r23\n"
+
1161  "adc r25,__zero_reg__\n"
+
1162  "st Y+,r16\n" // *rr++ = r16:r23
+
1163  "st Y+,r17\n"
+
1164  "st Y+,r18\n"
+
1165  "st Y+,r19\n"
+
1166  "dec r24\n"
+
1167  "brne 1b\n"
+
1168 
+
1169  // Restore Y.
+
1170  "pop r29\n"
+
1171  "pop r28\n"
+
1172  : : "x"(x), "z"(y), "r"(result)
+
1173  : "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
+
1174  "r24", "r25"
+
1175  );
+
1176 #endif // CURVE25519_ASM_AVR
+
1177 
+
1178  // Reduce the result using the quick trial subtraction method.
+
1179  reduceQuick(result);
+
1180 }
+
1181 
+
1192 void Curve25519::sub(limb_t *result, const limb_t *x, const limb_t *y)
+
1193 {
+
1194 #if !defined(CURVE25519_ASM_AVR)
+
1195  dlimb_t borrow;
+
1196  uint8_t posn;
+
1197  limb_t *rr = result;
+
1198 
+
1199  // Subtract y from x to generate the intermediate result.
+
1200  borrow = 0;
+
1201  for (posn = 0; posn < NUM_LIMBS_256BIT; ++posn) {
+
1202  borrow = ((dlimb_t)(*x++)) - (*y++) - ((borrow >> LIMB_BITS) & 0x01);
+
1203  *rr++ = (limb_t)borrow;
+
1204  }
+
1205 
+
1206  // If we had a borrow, then the result has gone negative and we
+
1207  // have to add 2^255 - 19 to the result to make it positive again.
+
1208  // The top bits of "borrow" will be all 1's if there is a borrow
+
1209  // or it will be all 0's if there was no borrow. Easiest is to
+
1210  // conditionally subtract 19 and then mask off the high bit.
+
1211  rr = result;
+
1212  borrow = (borrow >> LIMB_BITS) & 19U;
+
1213  borrow = ((dlimb_t)(*rr)) - borrow;
+
1214  *rr++ = (limb_t)borrow;
+
1215  for (posn = 1; posn < NUM_LIMBS_256BIT; ++posn) {
+
1216  borrow = ((dlimb_t)(*rr)) - ((borrow >> LIMB_BITS) & 0x01);
+
1217  *rr++ = (limb_t)borrow;
+
1218  }
+
1219  *(--rr) &= ((((limb_t)1) << (LIMB_BITS - 1)) - 1);
+
1220 #else // CURVE25519_ASM_AVR
+
1221  __asm__ __volatile__ (
+
1222  // Save Y and copy the "result" pointer into it.
+
1223  "push r28\n"
+
1224  "push r29\n"
+
1225  "mov r28,%A2\n"
+
1226  "mov r29,%B2\n"
+
1227 
+
1228  // Unroll the sub loop to operate on 4 bytes at a time (8 iterations).
+
1229  "ldi r24,8\n" // Loop counter.
+
1230  "clr r25\n" // borrow = 0
+
1231  "1:\n"
+
1232  "ld r16,X+\n" // r16:r19 = *x++
+
1233  "ld r17,X+\n"
+
1234  "ld r18,X+\n"
+
1235  "ld r19,X+\n"
+
1236  "ld r20,Z+\n" // r20:r23 = *y++
+
1237  "ld r21,Z+\n"
+
1238  "ld r22,Z+\n"
+
1239  "ld r23,Z+\n"
+
1240  "sub r16,r25\n" // r16:r19:borrow -= borrow
+
1241  "sbc r17,__zero_reg__\n"
+
1242  "sbc r18,__zero_reg__\n"
+
1243  "sbc r19,__zero_reg__\n"
+
1244  "mov r25,__zero_reg__\n"
+
1245  "sbc r25,__zero_reg__\n"
+
1246  "sub r16,r20\n" // r16:r19:borrow -= r20:r23
+
1247  "sbc r17,r21\n"
+
1248  "sbc r18,r22\n"
+
1249  "sbc r19,r23\n"
+
1250  "sbc r25,__zero_reg__\n"
+
1251  "st Y+,r16\n" // *rr++ = r16:r23
+
1252  "st Y+,r17\n"
+
1253  "st Y+,r18\n"
+
1254  "st Y+,r19\n"
+
1255  "andi r25,1\n" // Only need the bottom bit of the borrow
+
1256  "dec r24\n"
+
1257  "brne 1b\n"
+
1258 
+
1259  // If there was a borrow, then we need to add 2^255 - 19 back.
+
1260  // We conditionally subtract 19 and then mask off the high bit.
+
1261  "neg r25\n" // borrow = mask(borrow) & 19
+
1262  "andi r25,19\n"
+
1263  "sbiw r28,32\n" // Point Y back to the start of "result"
+
1264  "ldi r24,8\n"
+
1265  "2:\n"
+
1266  "ld r16,Y\n" // r16:r19 = *rr
+
1267  "ldd r17,Y+1\n"
+
1268  "ldd r18,Y+2\n"
+
1269  "ldd r19,Y+3\n"
+
1270  "sub r16,r25\n"
+
1271  "sbc r17,__zero_reg__\n" // r16:r19:borrow -= borrow
+
1272  "sbc r18,__zero_reg__\n"
+
1273  "sbc r19,__zero_reg__\n"
+
1274  "mov r25,__zero_reg__\n"
+
1275  "sbc r25,__zero_reg__\n"
+
1276  "andi r25,1\n"
+
1277  "st Y+,r16\n" // *r++ = r16:r19
+
1278  "st Y+,r17\n"
+
1279  "st Y+,r18\n"
+
1280  "st Y+,r19\n"
+
1281  "dec r24\n"
+
1282  "brne 2b\n"
+
1283  "andi r19,0x7F\n" // Mask off the high bit in the last byte
+
1284  "sbiw r28,1\n"
+
1285  "st Y,r19\n"
+
1286 
+
1287  // Restore Y.
+
1288  "pop r29\n"
+
1289  "pop r28\n"
+
1290  : : "x"(x), "z"(y), "r"(result)
+
1291  : "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
+
1292  "r24", "r25"
+
1293  );
+
1294 #endif // CURVE25519_ASM_AVR
+
1295 }
+
1296 
+
1309 void Curve25519::cswap(limb_t select, limb_t *x, limb_t *y)
+
1310 {
+
1311 #if !defined(CURVE25519_ASM_AVR)
+
1312  uint8_t posn;
+
1313  limb_t dummy;
+
1314  limb_t sel;
+
1315 
+
1316  // Turn "select" into an all-zeroes or all-ones mask. We don't care
+
1317  // which bit or bits is set in the original "select" value.
+
1318  sel = (limb_t)(((((dlimb_t)1) << LIMB_BITS) - select) >> LIMB_BITS);
+
1319  --sel;
+
1320 
+
1321  // Swap the two values based on "select". Algorithm from:
+
1322  // https://tools.ietf.org/html/draft-irtf-cfrg-curves-02
+
1323  for (posn = 0; posn < NUM_LIMBS_256BIT; ++posn) {
+
1324  dummy = sel & (x[posn] ^ y[posn]);
+
1325  x[posn] ^= dummy;
+
1326  y[posn] ^= dummy;
+
1327  }
+
1328 #else // CURVE25519_ASM_AVR
+
1329  __asm__ __volatile__ (
+
1330  // Combine all bytes from "select" into one and then turn
+
1331  // that byte into the "sel" mask in r24.
+
1332  "clr r24\n"
+
1333 #if BIGNUMBER_LIMB_8BIT
+
1334  "sub r24,%2\n"
+
1335 #elif BIGNUMBER_LIMB_16BIT
+
1336  "or %A2,%B2\n"
+
1337  "sub r24,%A2\n"
+
1338 #elif BIGNUMBER_LIMB_32BIT
+
1339  "or %A2,%B2\n"
+
1340  "or %A2,%C2\n"
+
1341  "or %A2,%D2\n"
+
1342  "sub r24,%A2\n"
+
1343 #endif
+
1344  "mov r24,__zero_reg__\n"
+
1345  "sbc r24,r24\n"
+
1346 
+
1347  // Perform the conditional swap 4 bytes at a time.
+
1348  "ldi r25,8\n"
+
1349  "1:\n"
+
1350  "ld r16,X+\n" // r16:r19 = *x
+
1351  "ld r17,X+\n"
+
1352  "ld r18,X+\n"
+
1353  "ld r19,X\n"
+
1354  "ld r20,Z\n" // r20:r23 = *y
+
1355  "ldd r21,Z+1\n"
+
1356  "ldd r22,Z+2\n"
+
1357  "ldd r23,Z+3\n"
+
1358  "mov r12,r16\n" // r12:r15 = (r16:r19 ^ r20:r23) & sel
+
1359  "mov r13,r17\n"
+
1360  "mov r14,r18\n"
+
1361  "mov r15,r19\n"
+
1362  "eor r12,r20\n"
+
1363  "eor r13,r21\n"
+
1364  "eor r14,r22\n"
+
1365  "eor r15,r23\n"
+
1366  "and r12,r24\n"
+
1367  "and r13,r24\n"
+
1368  "and r14,r24\n"
+
1369  "and r15,r24\n"
+
1370  "eor r16,r12\n" // r16:r19 ^= r12:r15
+
1371  "eor r17,r13\n"
+
1372  "eor r18,r14\n"
+
1373  "eor r19,r15\n"
+
1374  "eor r20,r12\n" // r20:r23 ^= r12:r15
+
1375  "eor r21,r13\n"
+
1376  "eor r22,r14\n"
+
1377  "eor r23,r15\n"
+
1378  "st X,r19\n" // *x++ = r16:r19
+
1379  "st -X,r18\n"
+
1380  "st -X,r17\n"
+
1381  "st -X,r16\n"
+
1382  "adiw r26,4\n"
+
1383  "st Z+,r20\n" // *y++ = r20:r23
+
1384  "st Z+,r21\n"
+
1385  "st Z+,r22\n"
+
1386  "st Z+,r23\n"
+
1387  "dec r25\n"
+
1388  "brne 1b\n"
+
1389 
+
1390  : : "x"(x), "z"(y), "r"(select)
+
1391  : "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19",
+
1392  "r20", "r21", "r22", "r23", "r24", "r25"
+
1393  );
+
1394 #endif // CURVE25519_ASM_AVR
+
1395 }
+
1396 
+
1409 void Curve25519::cmove(limb_t select, limb_t *x, const limb_t *y)
+
1410 {
+
1411 #if !defined(CURVE25519_ASM_AVR)
+
1412  uint8_t posn;
+
1413  limb_t dummy;
+
1414  limb_t sel;
+
1415 
+
1416  // Turn "select" into an all-zeroes or all-ones mask. We don't care
+
1417  // which bit or bits is set in the original "select" value.
+
1418  sel = (limb_t)(((((dlimb_t)1) << LIMB_BITS) - select) >> LIMB_BITS);
+
1419  --sel;
+
1420 
+
1421  // Move y into x based on "select". Similar to conditional swap above.
+
1422  for (posn = 0; posn < NUM_LIMBS_256BIT; ++posn) {
+
1423  dummy = sel & (x[posn] ^ y[posn]);
+
1424  x[posn] ^= dummy;
+
1425  }
+
1426 #else // CURVE25519_ASM_AVR
+
1427  __asm__ __volatile__ (
+
1428  // Combine all bytes from "select" into one and then turn
+
1429  // that byte into the "sel" mask in r24.
+
1430  "clr r24\n"
+
1431 #if BIGNUMBER_LIMB_8BIT
+
1432  "sub r24,%2\n"
+
1433 #elif BIGNUMBER_LIMB_16BIT
+
1434  "or %A2,%B2\n"
+
1435  "sub r24,%A2\n"
+
1436 #elif BIGNUMBER_LIMB_32BIT
+
1437  "or %A2,%B2\n"
+
1438  "or %A2,%C2\n"
+
1439  "or %A2,%D2\n"
+
1440  "sub r24,%A2\n"
+
1441 #endif
+
1442  "mov r24,__zero_reg__\n"
+
1443  "sbc r24,r24\n"
+
1444 
+
1445  // Perform the conditional move 4 bytes at a time.
+
1446  "ldi r25,8\n"
+
1447  "1:\n"
+
1448  "ld r16,X+\n" // r16:r19 = *x
+
1449  "ld r17,X+\n"
+
1450  "ld r18,X+\n"
+
1451  "ld r19,X\n"
+
1452  "ld r20,Z+\n" // r20:r23 = *y++
+
1453  "ld r21,Z+\n"
+
1454  "ld r22,Z+\n"
+
1455  "ld r23,Z+\n"
+
1456  "eor r20,r16\n" // r20:r23 = (r16:r19 ^ r20:r23) & sel
+
1457  "eor r21,r17\n"
+
1458  "eor r22,r18\n"
+
1459  "eor r23,r19\n"
+
1460  "and r20,r24\n"
+
1461  "and r21,r24\n"
+
1462  "and r22,r24\n"
+
1463  "and r23,r24\n"
+
1464  "eor r16,r20\n" // r16:r19 ^= r20:r23
+
1465  "eor r17,r21\n"
+
1466  "eor r18,r22\n"
+
1467  "eor r19,r23\n"
+
1468  "st X,r19\n" // *x++ = r16:r19
+
1469  "st -X,r18\n"
+
1470  "st -X,r17\n"
+
1471  "st -X,r16\n"
+
1472  "adiw r26,4\n"
+
1473  "dec r25\n"
+
1474  "brne 1b\n"
+
1475 
+
1476  : : "x"(x), "z"(y), "r"(select)
+
1477  : "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
+
1478  "r24", "r25"
+
1479  );
+
1480 #endif // CURVE25519_ASM_AVR
+
1481 }
+
1482 
+
1489 void Curve25519::pow250(limb_t *result, const limb_t *x)
+
1490 {
+
1491  limb_t t1[NUM_LIMBS_256BIT];
+
1492  uint8_t i, j;
+
1493 
+
1494  // The big-endian hexadecimal expansion of (2^250 - 1) is:
+
1495  // 03FFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF
+
1496  //
+
1497  // The naive implementation needs to do 2 multiplications per 1 bit and
+
1498  // 1 multiplication per 0 bit. We can improve upon this by creating a
+
1499  // pattern 0000000001 ... 0000000001. If we square and multiply the
+
1500  // pattern by itself we can turn the pattern into the partial results
+
1501  // 0000000011 ... 0000000011, 0000000111 ... 0000000111, etc.
+
1502  // This averages out to about 1.1 multiplications per 1 bit instead of 2.
+
1503 
+
1504  // Build a pattern of 250 bits in length of repeated copies of 0000000001.
+
1505  #define RECIP_GROUP_SIZE 10
+
1506  #define RECIP_GROUP_BITS 250 // Must be a multiple of RECIP_GROUP_SIZE.
+
1507  square(t1, x);
+
1508  for (j = 0; j < (RECIP_GROUP_SIZE - 1); ++j)
+
1509  square(t1, t1);
+
1510  mul(result, t1, x);
+
1511  for (i = 0; i < ((RECIP_GROUP_BITS / RECIP_GROUP_SIZE) - 2); ++i) {
+
1512  for (j = 0; j < RECIP_GROUP_SIZE; ++j)
+
1513  square(t1, t1);
+
1514  mul(result, result, t1);
+
1515  }
+
1516 
+
1517  // Multiply bit-shifted versions of the 0000000001 pattern into
+
1518  // the result to "fill in" the gaps in the pattern.
+
1519  square(t1, result);
+
1520  mul(result, result, t1);
+
1521  for (j = 0; j < (RECIP_GROUP_SIZE - 2); ++j) {
+
1522  square(t1, t1);
+
1523  mul(result, result, t1);
+
1524  }
+
1525 
+
1526  // Clean up and exit.
+
1527  clean(t1);
+
1528 }
+
1529 
+
1537 void Curve25519::recip(limb_t *result, const limb_t *x)
+
1538 {
+
1539  // The reciprocal is the same as x ^ (p - 2) where p = 2^255 - 19.
+
1540  // The big-endian hexadecimal expansion of (p - 2) is:
+
1541  // 7FFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFEB
+
1542  // Start with the 250 upper bits of the expansion of (p - 2).
+
1543  pow250(result, x);
+
1544 
+
1545  // Deal with the 5 lowest bits of (p - 2), 01011, from highest to lowest.
+
1546  square(result, result);
+
1547  square(result, result);
+
1548  mul(result, result, x);
+
1549  square(result, result);
+
1550  square(result, result);
+
1551  mul(result, result, x);
+
1552  square(result, result);
+
1553  mul(result, result, x);
+
1554 }
+
1555 
+
1571 bool Curve25519::sqrt(limb_t *result, const limb_t *x)
+
1572 {
+
1573  // sqrt(-1) mod (2^255 - 19).
+
1574  static limb_t const numSqrtM1[NUM_LIMBS_256BIT] PROGMEM = {
+
1575  LIMB(0x4A0EA0B0), LIMB(0xC4EE1B27), LIMB(0xAD2FE478), LIMB(0x2F431806),
+
1576  LIMB(0x3DFBD7A7), LIMB(0x2B4D0099), LIMB(0x4FC1DF0B), LIMB(0x2B832480)
+
1577  };
+
1578  limb_t y[NUM_LIMBS_256BIT];
+
1579 
+
1580  // Algorithm from:
+
1581  // https://tools.ietf.org/id/draft-josefsson-eddsa-ed25519-02.txt
+
1582 
+
1583  // Compute a candidate root: result = x^((p + 3) / 8) mod p.
+
1584  // (p + 3) / 8 = (2^252 - 2) which is 251 one bits followed by a zero:
+
1585  // 0FFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE
+
1586  pow250(result, x);
+
1587  square(result, result);
+
1588  mul(result, result, x);
+
1589  square(result, result);
+
1590 
+
1591  // Did we get the square root immediately?
+
1592  square(y, result);
+
1593  if (memcmp(x, y, sizeof(y)) == 0) {
+
1594  clean(y);
+
1595  return true;
+
1596  }
+
1597 
+
1598  // Multiply the result by sqrt(-1) and check again.
+
1599  mul_P(result, result, numSqrtM1);
+
1600  square(y, result);
+
1601  if (memcmp(x, y, sizeof(y)) == 0) {
+
1602  clean(y);
+
1603  return true;
+
1604  }
+
1605 
+
1606  // The number does not have a square root.
+
1607  clean(y);
+
1608  return false;
+
1609 }
void rand(uint8_t *data, size_t len)
Generates random bytes into a caller-supplied buffer.
Definition: RNG.cpp:508
-
static bool eval(uint8_t result[32], const uint8_t s[32], const uint8_t x[32])
Evaluates the raw Curve25519 function.
Definition: Curve25519.cpp:74
+
static bool eval(uint8_t result[32], const uint8_t s[32], const uint8_t x[32])
Evaluates the raw Curve25519 function.
Definition: Curve25519.cpp:79
static void unpackLE(limb_t *limbs, size_t count, const uint8_t *bytes, size_t len)
Unpacks the little-endian byte representation of a big number into a limb array.
static void packLE(uint8_t *bytes, size_t len, const limb_t *limbs, size_t count)
Packs the little-endian byte representation of a big number into a byte array.
-
static void dh1(uint8_t k[32], uint8_t f[32])
Performs phase 1 of a Diffie-Hellman key exchange using Curve25519.
Definition: Curve25519.cpp:239
-
static bool dh2(uint8_t k[32], uint8_t f[32])
Performs phase 2 of a Diffie-Hellman key exchange using Curve25519.
Definition: Curve25519.cpp:277
+
static void dh1(uint8_t k[32], uint8_t f[32])
Performs phase 1 of a Diffie-Hellman key exchange using Curve25519.
Definition: Curve25519.cpp:244
+
static bool dh2(uint8_t k[32], uint8_t f[32])
Performs phase 2 of a Diffie-Hellman key exchange using Curve25519.
Definition: Curve25519.cpp:282
diff --git a/Curve25519_8h_source.html b/Curve25519_8h_source.html index f2fe2346..50bf0bfb 100644 --- a/Curve25519_8h_source.html +++ b/Curve25519_8h_source.html @@ -166,14 +166,14 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
76 
77 #endif
Diffie-Hellman key agreement based on the elliptic curve modulo 2^255 - 19.
Definition: Curve25519.h:30
-
static bool eval(uint8_t result[32], const uint8_t s[32], const uint8_t x[32])
Evaluates the raw Curve25519 function.
Definition: Curve25519.cpp:74
+
static bool eval(uint8_t result[32], const uint8_t s[32], const uint8_t x[32])
Evaluates the raw Curve25519 function.
Definition: Curve25519.cpp:79
Digital signatures based on the elliptic curve modulo 2^255 - 19.
Definition: Ed25519.h:29
-
static void dh1(uint8_t k[32], uint8_t f[32])
Performs phase 1 of a Diffie-Hellman key exchange using Curve25519.
Definition: Curve25519.cpp:239
-
static bool dh2(uint8_t k[32], uint8_t f[32])
Performs phase 2 of a Diffie-Hellman key exchange using Curve25519.
Definition: Curve25519.cpp:277
+
static void dh1(uint8_t k[32], uint8_t f[32])
Performs phase 1 of a Diffie-Hellman key exchange using Curve25519.
Definition: Curve25519.cpp:244
+
static bool dh2(uint8_t k[32], uint8_t f[32])
Performs phase 2 of a Diffie-Hellman key exchange using Curve25519.
Definition: Curve25519.cpp:282
diff --git a/DMD_8cpp_source.html b/DMD_8cpp_source.html index 622f02e6..bee84b77 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 00753185..2f0817a0 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 88566f9c..23e79d08 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 d3b98adf..2806e06f 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/DS3231RTC_8cpp_source.html b/DS3231RTC_8cpp_source.html index cb3da432..3347f462 100644 --- a/DS3231RTC_8cpp_source.html +++ b/DS3231RTC_8cpp_source.html @@ -657,7 +657,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/DS3231RTC_8h_source.html b/DS3231RTC_8h_source.html index 87b7aec3..37f0ae4e 100644 --- a/DS3231RTC_8h_source.html +++ b/DS3231RTC_8h_source.html @@ -202,7 +202,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/DS3232RTC_8cpp_source.html b/DS3232RTC_8cpp_source.html index 8dc3c697..95015c64 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 26eda76e..1313b8bf 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 87ccedde..235b0641 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 16fe07f0..b5965bb8 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 fde2358c..def61f91 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/EAX_8cpp_source.html b/EAX_8cpp_source.html index 69588957..c7cea0aa 100644 --- a/EAX_8cpp_source.html +++ b/EAX_8cpp_source.html @@ -301,7 +301,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/EAX_8h_source.html b/EAX_8h_source.html index ee84af62..f9bacae4 100644 --- a/EAX_8h_source.html +++ b/EAX_8h_source.html @@ -196,7 +196,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/EEPROM24_8cpp_source.html b/EEPROM24_8cpp_source.html index 775f3857..b32ab281 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 9325ecf7..b844d7a1 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/Ed25519_8cpp_source.html b/Ed25519_8cpp_source.html index 02b771d4..cf363010 100644 --- a/Ed25519_8cpp_source.html +++ b/Ed25519_8cpp_source.html @@ -572,7 +572,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Ed25519_8h_source.html b/Ed25519_8h_source.html index eb8a0937..d31186b8 100644 --- a/Ed25519_8h_source.html +++ b/Ed25519_8h_source.html @@ -168,7 +168,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Field_8cpp_source.html b/Field_8cpp_source.html index 1ffb0f5e..ace44362 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 51a95b6b..b66e7599 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 3e2d577b..952e6527 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 051cef36..445f17f1 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/GCM_8cpp_source.html b/GCM_8cpp_source.html index 0f93df08..cb4d5519 100644 --- a/GCM_8cpp_source.html +++ b/GCM_8cpp_source.html @@ -352,7 +352,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/GCM_8h_source.html b/GCM_8h_source.html index b03512cd..530f7af5 100644 --- a/GCM_8h_source.html +++ b/GCM_8h_source.html @@ -191,7 +191,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/GF128_8cpp_source.html b/GF128_8cpp_source.html index 759c169b..9a4b0e03 100644 --- a/GF128_8cpp_source.html +++ b/GF128_8cpp_source.html @@ -501,7 +501,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/GF128_8h_source.html b/GF128_8h_source.html index cf0ddcba..86ce4146 100644 --- a/GF128_8h_source.html +++ b/GF128_8h_source.html @@ -137,7 +137,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/GHASH_8cpp_source.html b/GHASH_8cpp_source.html index 8d0dd3ad..3b24f0ac 100644 --- a/GHASH_8cpp_source.html +++ b/GHASH_8cpp_source.html @@ -190,7 +190,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/GHASH_8h_source.html b/GHASH_8h_source.html index b33e848c..692a65a0 100644 --- a/GHASH_8h_source.html +++ b/GHASH_8h_source.html @@ -150,7 +150,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Hash_8cpp_source.html b/Hash_8cpp_source.html index bcf83d56..44c5e6b9 100644 --- a/Hash_8cpp_source.html +++ b/Hash_8cpp_source.html @@ -151,7 +151,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Hash_8h_source.html b/Hash_8h_source.html index 7da88424..1d4c1cd0 100644 --- a/Hash_8h_source.html +++ b/Hash_8h_source.html @@ -154,7 +154,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/I2CMaster_8cpp_source.html b/I2CMaster_8cpp_source.html index b0fd2223..c59ac350 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 af3faba9..e495dbeb 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 dfbe0eb4..14d665ac 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 c007c7bd..a9e67053 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 7e7ae077..677f948b 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 767af035..3b8358b4 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 57e55be6..2f8aad65 100644 --- a/KeccakCore_8cpp_source.html +++ b/KeccakCore_8cpp_source.html @@ -1958,7 +1958,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/KeccakCore_8h_source.html b/KeccakCore_8h_source.html index 646202b4..60c3d0dd 100644 --- a/KeccakCore_8h_source.html +++ b/KeccakCore_8h_source.html @@ -165,7 +165,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/LCD_8cpp_source.html b/LCD_8cpp_source.html index 29a14fa9..826773f9 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 676a1d06..8b1b24bf 100644 --- a/LCD_8h_source.html +++ b/LCD_8h_source.html @@ -202,7 +202,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/ListField_8cpp_source.html b/ListField_8cpp_source.html index d54e0e14..ce64067e 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 4ea0873f..2797df4b 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 dc9cf995..50562774 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 cecf4559..b3e84a58 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 23b75777..d6f55480 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 5756ced3..1ae0e2a5 100644 --- a/NoiseSource_8cpp_source.html +++ b/NoiseSource_8cpp_source.html @@ -138,7 +138,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/NoiseSource_8h_source.html b/NoiseSource_8h_source.html index e8dd0951..be2e3bfd 100644 --- a/NoiseSource_8h_source.html +++ b/NoiseSource_8h_source.html @@ -142,7 +142,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/OFB_8cpp_source.html b/OFB_8cpp_source.html index ecec7d43..a869fc8e 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 93f38107..615b8a5e 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/OMAC_8cpp_source.html b/OMAC_8cpp_source.html index 59640739..038e77ce 100644 --- a/OMAC_8cpp_source.html +++ b/OMAC_8cpp_source.html @@ -208,7 +208,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/OMAC_8h_source.html b/OMAC_8h_source.html index 4bd36e69..968f9767 100644 --- a/OMAC_8h_source.html +++ b/OMAC_8h_source.html @@ -152,7 +152,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Poly1305_8cpp_source.html b/Poly1305_8cpp_source.html index 46965be0..15f146f9 100644 --- a/Poly1305_8cpp_source.html +++ b/Poly1305_8cpp_source.html @@ -355,7 +355,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Poly1305_8h_source.html b/Poly1305_8h_source.html index 30f1bec2..2860a8c2 100644 --- a/Poly1305_8h_source.html +++ b/Poly1305_8h_source.html @@ -153,7 +153,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/PowerSave_8cpp_source.html b/PowerSave_8cpp_source.html index de8d4a22..f322a19b 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 a543d8a1..958b1c2f 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 ad5b0221..e78f0241 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 65577c21..b304d121 100644 --- a/RNG_8cpp_source.html +++ b/RNG_8cpp_source.html @@ -651,7 +651,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/RNG_8h_source.html b/RNG_8h_source.html index 9ee9b21d..b5540a07 100644 --- a/RNG_8h_source.html +++ b/RNG_8h_source.html @@ -177,7 +177,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/RTC_8cpp_source.html b/RTC_8cpp_source.html index 404def9b..bed913fe 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 b873dc92..bb02d16a 100644 --- a/RTC_8h_source.html +++ b/RTC_8h_source.html @@ -237,7 +237,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/RingOscillatorNoiseSource_8cpp_source.html b/RingOscillatorNoiseSource_8cpp_source.html index 570d054e..8f9cefe4 100644 --- a/RingOscillatorNoiseSource_8cpp_source.html +++ b/RingOscillatorNoiseSource_8cpp_source.html @@ -285,7 +285,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/RingOscillatorNoiseSource_8h_source.html b/RingOscillatorNoiseSource_8h_source.html index e1441707..86bdf8b4 100644 --- a/RingOscillatorNoiseSource_8h_source.html +++ b/RingOscillatorNoiseSource_8h_source.html @@ -145,7 +145,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/SHA256_8cpp_source.html b/SHA256_8cpp_source.html index d8afe86e..540dc530 100644 --- a/SHA256_8cpp_source.html +++ b/SHA256_8cpp_source.html @@ -339,7 +339,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/SHA256_8h_source.html b/SHA256_8h_source.html index 5a8ce465..e0e6173b 100644 --- a/SHA256_8h_source.html +++ b/SHA256_8h_source.html @@ -160,7 +160,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/SHA3_8cpp_source.html b/SHA3_8cpp_source.html index e7a729bd..d9c37142 100644 --- a/SHA3_8cpp_source.html +++ b/SHA3_8cpp_source.html @@ -257,7 +257,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/SHA3_8h_source.html b/SHA3_8h_source.html index 06437354..18170c57 100644 --- a/SHA3_8h_source.html +++ b/SHA3_8h_source.html @@ -188,7 +188,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/SHA512_8cpp_source.html b/SHA512_8cpp_source.html index 7d15ed09..a3b42005 100644 --- a/SHA512_8cpp_source.html +++ b/SHA512_8cpp_source.html @@ -355,7 +355,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/SHA512_8h_source.html b/SHA512_8h_source.html index 3866be72..7be41e06 100644 --- a/SHA512_8h_source.html +++ b/SHA512_8h_source.html @@ -166,7 +166,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/SoftI2C_8cpp_source.html b/SoftI2C_8cpp_source.html index a6a398b3..3d4035ab 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 409b1703..4f74eeb2 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/SpeckSmall_8cpp_source.html b/SpeckSmall_8cpp_source.html index 49479185..56a1e019 100644 --- a/SpeckSmall_8cpp_source.html +++ b/SpeckSmall_8cpp_source.html @@ -715,7 +715,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/SpeckSmall_8h_source.html b/SpeckSmall_8h_source.html index aa45320b..79e60a7f 100644 --- a/SpeckSmall_8h_source.html +++ b/SpeckSmall_8h_source.html @@ -141,7 +141,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/SpeckTiny_8cpp_source.html b/SpeckTiny_8cpp_source.html index cc096d16..01dd2d74 100644 --- a/SpeckTiny_8cpp_source.html +++ b/SpeckTiny_8cpp_source.html @@ -596,7 +596,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/SpeckTiny_8h_source.html b/SpeckTiny_8h_source.html index 2cffd6b5..b1fb4234 100644 --- a/SpeckTiny_8h_source.html +++ b/SpeckTiny_8h_source.html @@ -154,7 +154,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Speck_8cpp_source.html b/Speck_8cpp_source.html index 54f5f948..d2cd8f75 100644 --- a/Speck_8cpp_source.html +++ b/Speck_8cpp_source.html @@ -679,7 +679,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Speck_8h_source.html b/Speck_8h_source.html index c4cc2654..aa9965f4 100644 --- a/Speck_8h_source.html +++ b/Speck_8h_source.html @@ -149,7 +149,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/TextField_8cpp_source.html b/TextField_8cpp_source.html index b5b926c5..62dddd57 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 c919cced..72bd5200 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 5045dd75..4d460835 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 afa22733..147c312e 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 9a33bf02..eff79077 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 e53e9832..e11728fe 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 d46e3713..43c4f330 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 531ce356..3478c8d0 100644 --- a/alarm_clock.html +++ b/alarm_clock.html @@ -140,7 +140,7 @@ Completed Clock diff --git a/annotated.html b/annotated.html index f927cee7..c0eba14c 100644 --- a/annotated.html +++ b/annotated.html @@ -162,7 +162,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/blink-blink_8dox.html b/blink-blink_8dox.html index 066e06fa..53408895 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 820346b9..8f6b972b 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 cc66b8cd..848c3eeb 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 f04ca114..535fb047 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 ff0d2cf1..215aec08 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 ba8f222b..466fadd3 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 31b8e03f..e54cc09c 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 9508c30e..d4f46124 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 4ad01acf..0ca1fa7b 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 6ac3c18f..d37d2f72 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 39565308..d7d7ec13 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 8a224fdb..1bca45bd 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 5a66da36..377ab5c9 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 9d1da2cd..10e08ae5 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 2c1d9863..9caa52ee 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 d4dec83d..1fde19ee 100644 --- a/classAESCommon.html +++ b/classAESCommon.html @@ -322,7 +322,7 @@ Protected Member Functions diff --git a/classAuthenticatedCipher-members.html b/classAuthenticatedCipher-members.html index cdcaaeae..9bfb9467 100644 --- a/classAuthenticatedCipher-members.html +++ b/classAuthenticatedCipher-members.html @@ -108,7 +108,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classAuthenticatedCipher.html b/classAuthenticatedCipher.html index 9e833e10..b52cd756 100644 --- a/classAuthenticatedCipher.html +++ b/classAuthenticatedCipher.html @@ -351,7 +351,7 @@ virtual  diff --git a/classBLAKE2b-members.html b/classBLAKE2b-members.html index 01c5309c..3f6be4e3 100644 --- a/classBLAKE2b-members.html +++ b/classBLAKE2b-members.html @@ -112,7 +112,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classBLAKE2b.html b/classBLAKE2b.html index 4501b94e..3cbd0da8 100644 --- a/classBLAKE2b.html +++ b/classBLAKE2b.html @@ -536,7 +536,7 @@ Additional Inherited Members diff --git a/classBLAKE2s-members.html b/classBLAKE2s-members.html index 96d1bd27..274443f0 100644 --- a/classBLAKE2s-members.html +++ b/classBLAKE2s-members.html @@ -111,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classBLAKE2s.html b/classBLAKE2s.html index 02741e39..7e84f7f0 100644 --- a/classBLAKE2s.html +++ b/classBLAKE2s.html @@ -536,7 +536,7 @@ Additional Inherited Members diff --git a/classBigNumberUtil-members.html b/classBigNumberUtil-members.html index 9e27b223..2765ffa1 100644 --- a/classBigNumberUtil-members.html +++ b/classBigNumberUtil-members.html @@ -105,7 +105,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classBigNumberUtil.html b/classBigNumberUtil.html index 869fb3e8..5b04eef6 100644 --- a/classBigNumberUtil.html +++ b/classBigNumberUtil.html @@ -893,7 +893,7 @@ Static Public Member Functions diff --git a/classBitmap-members.html b/classBitmap-members.html index 44fa0eba..8eaf9ab0 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 bfa84696..a1e7a2b6 100644 --- a/classBitmap.html +++ b/classBitmap.html @@ -1745,7 +1745,7 @@ class DMD diff --git a/classBlinkLED-members.html b/classBlinkLED-members.html index 6abe3f7e..1524e861 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 9de1915e..96ea8da6 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 e20a9793..6fca229b 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 c93fe4e1..27628c5f 100644 --- a/classBlockCipher.html +++ b/classBlockCipher.html @@ -410,7 +410,7 @@ Public Member Functions diff --git a/classBoolField-members.html b/classBoolField-members.html index 6a086f8e..c8b5b0cc 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 f587778c..3213fa3e 100644 --- a/classBoolField.html +++ b/classBoolField.html @@ -506,7 +506,7 @@ LiquidCrystal *  diff --git a/classCBC-members.html b/classCBC-members.html index c77a7b56..a450fb3d 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 d4e677b7..402d9879 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 69e99884..c086ca11 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 93d43bae..00dfc5c4 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 4f525413..5fc9fc04 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 2b0e903e..b44a4f87 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 52872f34..6791ad17 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 284561bc..f113b1be 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 2244ff90..38786795 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 21e02614..3cf53fdd 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 c0753356..f3aad020 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 20a839c1..52a6a84b 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 1111fc1c..3d1a2bf7 100644 --- a/classChaCha-members.html +++ b/classChaCha-members.html @@ -109,7 +109,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classChaCha.html b/classChaCha.html index 82bf9133..3d696e58 100644 --- a/classChaCha.html +++ b/classChaCha.html @@ -673,7 +673,7 @@ class ChaChaPoly< diff --git a/classChaChaPoly-members.html b/classChaChaPoly-members.html index bb1510d6..ce6eac98 100644 --- a/classChaChaPoly-members.html +++ b/classChaChaPoly-members.html @@ -115,7 +115,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classChaChaPoly.html b/classChaChaPoly.html index 32a3ff29..b4248daf 100644 --- a/classChaChaPoly.html +++ b/classChaChaPoly.html @@ -665,7 +665,7 @@ virtual  diff --git a/classCharlieplex-members.html b/classCharlieplex-members.html index d2cacc4b..56e74985 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 f377791b..e3520419 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 dfb06970..6491dc8a 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 44f49738..0824fb6e 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 e22de4ab..b3622585 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 42534134..c2a392cc 100644 --- a/classCipher.html +++ b/classCipher.html @@ -485,7 +485,7 @@ Public Member Functions diff --git a/classCurve25519-members.html b/classCurve25519-members.html index e322a9f9..2e935a92 100644 --- a/classCurve25519-members.html +++ b/classCurve25519-members.html @@ -97,7 +97,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classCurve25519.html b/classCurve25519.html index ad2a7dc5..0ffaf0dc 100644 --- a/classCurve25519.html +++ b/classCurve25519.html @@ -188,7 +188,7 @@ class Ed25519

Reference: https://tools.ietf.org/html/draft-irtf-cfrg-curves-02

See Also
dh2()
-

Definition at line 239 of file Curve25519.cpp.

+

Definition at line 244 of file Curve25519.cpp.

@@ -236,7 +236,7 @@ class Ed25519Reference: https://tools.ietf.org/html/draft-irtf-cfrg-curves-02

See Also
dh1()
-

Definition at line 277 of file Curve25519.cpp.

+

Definition at line 282 of file Curve25519.cpp.

@@ -292,7 +292,7 @@ class Ed25519Reference: https://tools.ietf.org/html/draft-irtf-cfrg-curves-02

See Also
dh1(), dh2()
-

Definition at line 74 of file Curve25519.cpp.

+

Definition at line 79 of file Curve25519.cpp.

@@ -303,7 +303,7 @@ class Ed25519 diff --git a/classDMD-members.html b/classDMD-members.html index 55f6ef21..ee65f53d 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 cb2f32de..0c379658 100644 --- a/classDMD.html +++ b/classDMD.html @@ -755,7 +755,7 @@ Multiple panels diff --git a/classDS1307RTC-members.html b/classDS1307RTC-members.html index a90a50a8..e891b96b 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 3dcbfbbb..cc3f7885 100644 --- a/classDS1307RTC.html +++ b/classDS1307RTC.html @@ -598,7 +598,7 @@ static const uint8_t  diff --git a/classDS3231RTC-members.html b/classDS3231RTC-members.html index 20e2102c..817940e4 100644 --- a/classDS3231RTC-members.html +++ b/classDS3231RTC-members.html @@ -133,7 +133,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classDS3231RTC.html b/classDS3231RTC.html index 5dd32711..b24e5177 100644 --- a/classDS3231RTC.html +++ b/classDS3231RTC.html @@ -713,7 +713,7 @@ static const uint8_t  diff --git a/classDS3232RTC-members.html b/classDS3232RTC-members.html index de662771..d8e10001 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 32d89c48..f833450b 100644 --- a/classDS3232RTC.html +++ b/classDS3232RTC.html @@ -750,7 +750,7 @@ static const uint8_t  diff --git a/classEAX-members.html b/classEAX-members.html index 809605bc..c00ff04d 100644 --- a/classEAX-members.html +++ b/classEAX-members.html @@ -118,7 +118,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classEAX.html b/classEAX.html index 86c02397..d03178f0 100644 --- a/classEAX.html +++ b/classEAX.html @@ -219,7 +219,7 @@ class EAX< T > diff --git a/classEAXCommon-members.html b/classEAXCommon-members.html index 598434ac..1bbc02bb 100644 --- a/classEAXCommon-members.html +++ b/classEAXCommon-members.html @@ -117,7 +117,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classEAXCommon.html b/classEAXCommon.html index 8250f035..f2040263 100644 --- a/classEAXCommon.html +++ b/classEAXCommon.html @@ -732,7 +732,7 @@ Protected Member Functions diff --git a/classEEPROM24-members.html b/classEEPROM24-members.html index 5e1d769b..3c6c4c78 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 1bcc12ef..ca86dd13 100644 --- a/classEEPROM24.html +++ b/classEEPROM24.html @@ -431,7 +431,7 @@ Public Member Functions diff --git a/classEd25519-members.html b/classEd25519-members.html index d9bc1cb7..30b796d4 100644 --- a/classEd25519-members.html +++ b/classEd25519-members.html @@ -97,7 +97,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classEd25519.html b/classEd25519.html index 3d6929eb..f62d9b9f 100644 --- a/classEd25519.html +++ b/classEd25519.html @@ -354,7 +354,7 @@ Static Public Member Functions diff --git a/classField-members.html b/classField-members.html index 4dc86050..4a83a3d9 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 8c80bc21..f73046ca 100644 --- a/classField.html +++ b/classField.html @@ -424,7 +424,7 @@ class Form diff --git a/classForm-members.html b/classForm-members.html index caa7dbda..eceed3f3 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 9fc5dc32..6ec3a2c0 100644 --- a/classForm.html +++ b/classForm.html @@ -485,7 +485,7 @@ class Field diff --git a/classGCM-members.html b/classGCM-members.html index cc8e52e7..35b8dcac 100644 --- a/classGCM-members.html +++ b/classGCM-members.html @@ -119,7 +119,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classGCM.html b/classGCM.html index 26eedb5c..db9b29c7 100644 --- a/classGCM.html +++ b/classGCM.html @@ -223,7 +223,7 @@ class GCM< T > diff --git a/classGCMCommon-members.html b/classGCMCommon-members.html index 5a394dfe..1e2a7f12 100644 --- a/classGCMCommon-members.html +++ b/classGCMCommon-members.html @@ -118,7 +118,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classGCMCommon.html b/classGCMCommon.html index 65b681f6..f1b7e52f 100644 --- a/classGCMCommon.html +++ b/classGCMCommon.html @@ -736,7 +736,7 @@ Protected Member Functions diff --git a/classGF128-members.html b/classGF128-members.html index e0ebb360..7cb50fa6 100644 --- a/classGF128-members.html +++ b/classGF128-members.html @@ -97,7 +97,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classGF128.html b/classGF128.html index 9e1b1ce6..29546349 100644 --- a/classGF128.html +++ b/classGF128.html @@ -294,7 +294,7 @@ Static Public Member Functions diff --git a/classGHASH-members.html b/classGHASH-members.html index 67044711..f640f4eb 100644 --- a/classGHASH-members.html +++ b/classGHASH-members.html @@ -103,7 +103,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classGHASH.html b/classGHASH.html index 71d22e97..e794dc76 100644 --- a/classGHASH.html +++ b/classGHASH.html @@ -265,7 +265,7 @@ void  diff --git a/classHash-members.html b/classHash-members.html index 91067879..86861ba9 100644 --- a/classHash-members.html +++ b/classHash-members.html @@ -104,7 +104,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classHash.html b/classHash.html index 109202aa..1ef7af6b 100644 --- a/classHash.html +++ b/classHash.html @@ -575,7 +575,7 @@ Protected Member Functions diff --git a/classI2CMaster-members.html b/classI2CMaster-members.html index 7c3e01d6..c9cb007c 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 ba9bb7af..be8bd12b 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 182aacd3..c460f746 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 8b8f1db0..043a3c33 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 ae9f5904..3eb63123 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 c89eb205..866e6396 100644 --- a/classIntField.html +++ b/classIntField.html @@ -647,7 +647,7 @@ LiquidCrystal *  diff --git a/classKeccakCore-members.html b/classKeccakCore-members.html index d2255ff7..af4fa075 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 42beeabb..db1ce0ff 100644 --- a/classKeccakCore.html +++ b/classKeccakCore.html @@ -425,7 +425,7 @@ void  diff --git a/classLCD-members.html b/classLCD-members.html index 760f832e..0d3d1abe 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 e1eadf78..c3d24d50 100644 --- a/classLCD.html +++ b/classLCD.html @@ -592,7 +592,7 @@ Support for DFRobot LCD Shield diff --git a/classListField-members.html b/classListField-members.html index 7937d4e3..a9fb0110 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 4dd1c922..57c418d2 100644 --- a/classListField.html +++ b/classListField.html @@ -411,7 +411,7 @@ LiquidCrystal *  diff --git a/classMelody-members.html b/classMelody-members.html index 511b8af5..43024971 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 adb68e68..b60c2c85 100644 --- a/classMelody.html +++ b/classMelody.html @@ -371,7 +371,7 @@ bool  diff --git a/classNoiseSource-members.html b/classNoiseSource-members.html index 17c4218d..9bbefa21 100644 --- a/classNoiseSource-members.html +++ b/classNoiseSource-members.html @@ -99,7 +99,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classNoiseSource.html b/classNoiseSource.html index 0c42e68e..4c7a3b71 100644 --- a/classNoiseSource.html +++ b/classNoiseSource.html @@ -289,7 +289,7 @@ Protected Member Functions diff --git a/classOFB-members.html b/classOFB-members.html index ff808b39..15a84b4a 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 ec38d2b5..ff24272b 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 a8fc82a7..ef349868 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 6677158b..96250eba 100644 --- a/classOFBCommon.html +++ b/classOFBCommon.html @@ -534,7 +534,7 @@ Protected Member Functions diff --git a/classOMAC-members.html b/classOMAC-members.html index 9e8e7e1d..5746ee59 100644 --- a/classOMAC-members.html +++ b/classOMAC-members.html @@ -102,7 +102,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classOMAC.html b/classOMAC.html index 73c1e160..eccbff05 100644 --- a/classOMAC.html +++ b/classOMAC.html @@ -387,7 +387,7 @@ void  diff --git a/classPoly1305-members.html b/classPoly1305-members.html index 1953337a..57742282 100644 --- a/classPoly1305-members.html +++ b/classPoly1305-members.html @@ -104,7 +104,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classPoly1305.html b/classPoly1305.html index 358d78fc..9ff7db36 100644 --- a/classPoly1305.html +++ b/classPoly1305.html @@ -280,7 +280,7 @@ void  diff --git a/classRNGClass-members.html b/classRNGClass-members.html index 656f8ac9..25aac167 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 82ede467..9463bbc5 100644 --- a/classRNGClass.html +++ b/classRNGClass.html @@ -519,7 +519,7 @@ static const int  diff --git a/classRTC-members.html b/classRTC-members.html index c71c297e..9bea3903 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 40ddffc0..11e8e717 100644 --- a/classRTC.html +++ b/classRTC.html @@ -779,7 +779,7 @@ static const uint8_t  diff --git a/classRTCAlarm-members.html b/classRTCAlarm-members.html index 91f49e32..f53d2202 100644 --- a/classRTCAlarm-members.html +++ b/classRTCAlarm-members.html @@ -99,7 +99,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classRTCDate-members.html b/classRTCDate-members.html index c12661d8..c701321f 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 3672d164..0176ec06 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 index 235d32df..e76e887b 100644 --- a/classRingOscillatorNoiseSource-members.html +++ b/classRingOscillatorNoiseSource-members.html @@ -101,7 +101,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classRingOscillatorNoiseSource.html b/classRingOscillatorNoiseSource.html index 596b13e1..636a9184 100644 --- a/classRingOscillatorNoiseSource.html +++ b/classRingOscillatorNoiseSource.html @@ -253,7 +253,7 @@ Additional Inherited Members diff --git a/classSHA256-members.html b/classSHA256-members.html index 37252cf8..15c73199 100644 --- a/classSHA256-members.html +++ b/classSHA256-members.html @@ -110,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classSHA256.html b/classSHA256.html index e6443f3b..5c6bc48f 100644 --- a/classSHA256.html +++ b/classSHA256.html @@ -506,7 +506,7 @@ Additional Inherited Members diff --git a/classSHA3__256-members.html b/classSHA3__256-members.html index 0339b08c..34accb26 100644 --- a/classSHA3__256-members.html +++ b/classSHA3__256-members.html @@ -106,7 +106,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classSHA3__256.html b/classSHA3__256.html index fcebb1aa..ec1c86e8 100644 --- a/classSHA3__256.html +++ b/classSHA3__256.html @@ -506,7 +506,7 @@ Additional Inherited Members diff --git a/classSHA3__512-members.html b/classSHA3__512-members.html index 6a21c0fc..54ebb20f 100644 --- a/classSHA3__512-members.html +++ b/classSHA3__512-members.html @@ -106,7 +106,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classSHA3__512.html b/classSHA3__512.html index 887ad224..af593639 100644 --- a/classSHA3__512.html +++ b/classSHA3__512.html @@ -506,7 +506,7 @@ Additional Inherited Members diff --git a/classSHA512-members.html b/classSHA512-members.html index ef5f2247..27a3dce0 100644 --- a/classSHA512-members.html +++ b/classSHA512-members.html @@ -112,7 +112,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classSHA512.html b/classSHA512.html index 587a8904..87bde03d 100644 --- a/classSHA512.html +++ b/classSHA512.html @@ -513,7 +513,7 @@ Additional Inherited Members diff --git a/classSoftI2C-members.html b/classSoftI2C-members.html index c21b53bb..3d934a9d 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 527e7208..a92b1954 100644 --- a/classSoftI2C.html +++ b/classSoftI2C.html @@ -346,7 +346,7 @@ unsigned int  diff --git a/classSpeck-members.html b/classSpeck-members.html index 5d7f8328..857d5e78 100644 --- a/classSpeck-members.html +++ b/classSpeck-members.html @@ -103,7 +103,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classSpeck.html b/classSpeck.html index b8e51751..911b42e2 100644 --- a/classSpeck.html +++ b/classSpeck.html @@ -415,7 +415,7 @@ Public Member Functions diff --git a/classSpeckSmall-members.html b/classSpeckSmall-members.html index cd3c7b9b..6d4bb4ab 100644 --- a/classSpeckSmall-members.html +++ b/classSpeckSmall-members.html @@ -105,7 +105,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classSpeckSmall.html b/classSpeckSmall.html index 5ca494c6..7b3db349 100644 --- a/classSpeckSmall.html +++ b/classSpeckSmall.html @@ -319,7 +319,7 @@ Public Member Functions diff --git a/classSpeckTiny-members.html b/classSpeckTiny-members.html index 4fe482bb..1fb51048 100644 --- a/classSpeckTiny-members.html +++ b/classSpeckTiny-members.html @@ -104,7 +104,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classSpeckTiny.html b/classSpeckTiny.html index 8ff79543..41a1967e 100644 --- a/classSpeckTiny.html +++ b/classSpeckTiny.html @@ -428,7 +428,7 @@ class SpeckSmall< diff --git a/classTextField-members.html b/classTextField-members.html index 9859b9f8..aed0bc40 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 e6230f03..1111e34e 100644 --- a/classTextField.html +++ b/classTextField.html @@ -343,7 +343,7 @@ LiquidCrystal *  diff --git a/classTimeField-members.html b/classTimeField-members.html index 28d558b1..b34d5ad4 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 3681511c..d738c9d1 100644 --- a/classTimeField.html +++ b/classTimeField.html @@ -541,7 +541,7 @@ LiquidCrystal *  diff --git a/classTransistorNoiseSource-members.html b/classTransistorNoiseSource-members.html index 2382b223..ab2ae22d 100644 --- a/classTransistorNoiseSource-members.html +++ b/classTransistorNoiseSource-members.html @@ -101,7 +101,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classTransistorNoiseSource.html b/classTransistorNoiseSource.html index 42b285ee..9fc876c4 100644 --- a/classTransistorNoiseSource.html +++ b/classTransistorNoiseSource.html @@ -280,7 +280,7 @@ Additional Inherited Members diff --git a/classes.html b/classes.html index f5f6b4d0..3c7c72ad 100644 --- a/classes.html +++ b/classes.html @@ -134,7 +134,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/crypto-rng-ring_8dox.html b/crypto-rng-ring_8dox.html index bf2659db..54a2fb0d 100644 --- a/crypto-rng-ring_8dox.html +++ b/crypto-rng-ring_8dox.html @@ -87,7 +87,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/crypto-rng_8dox.html b/crypto-rng_8dox.html index 5b9bf598..6dfd043e 100644 --- a/crypto-rng_8dox.html +++ b/crypto-rng_8dox.html @@ -87,7 +87,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/crypto.html b/crypto.html index 52475927..baf3e171 100644 --- a/crypto.html +++ b/crypto.html @@ -195,17 +195,17 @@ Performance on AVR Public Key OperationTime (per operation)Comment -Curve25519::eval()3119msRaw curve evaluation +Curve25519::eval()2716msRaw curve evaluation -Curve25519::dh1()3121msFirst half of Diffie-Hellman key agreement +Curve25519::dh1()2718msFirst half of Diffie-Hellman key agreement -Curve25519::dh2()3120msSecond half of Diffie-Hellman key agreement +Curve25519::dh2()2717msSecond half of Diffie-Hellman key agreement -Ed25519::sign()5688msDigital signature generation +Ed25519::sign()5148msDigital signature generation -Ed25519::verify()9030msDigital signature verification +Ed25519::verify()8196msDigital signature verification -Ed25519::derivePublicKey()5642msDerive a public key from a private key +Ed25519::derivePublicKey()5102msDerive a public key from a private key

Where a cipher supports more than one key size (such as ChaCha), the values are typically almost identical for 128-bit and 256-bit keys so only the maximum is shown above.

@@ -316,7 +316,7 @@ Performance on ARM

diff --git a/crypto_8dox.html b/crypto_8dox.html index 53e9f927..4ab0e815 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 index bd735828..83fbb32d 100644 --- a/crypto_rng.html +++ b/crypto_rng.html @@ -190,7 +190,7 @@ Destroying secret data diff --git a/crypto_rng_ring.html b/crypto_rng_ring.html index 2b3b662f..546186c2 100644 --- a/crypto_rng_ring.html +++ b/crypto_rng_ring.html @@ -151,7 +151,7 @@ Connecting to the Arduino diff --git a/dir_1586d320a3b1e622174530fde769cda9.html b/dir_1586d320a3b1e622174530fde769cda9.html index 435a032f..2f54eba8 100644 --- a/dir_1586d320a3b1e622174530fde769cda9.html +++ b/dir_1586d320a3b1e622174530fde769cda9.html @@ -102,7 +102,7 @@ Files diff --git a/dir_3dd03323535933fb3f714c41ff7a94da.html b/dir_3dd03323535933fb3f714c41ff7a94da.html index 434e9477..0f5c5fd3 100644 --- a/dir_3dd03323535933fb3f714c41ff7a94da.html +++ b/dir_3dd03323535933fb3f714c41ff7a94da.html @@ -94,7 +94,7 @@ Files diff --git a/dir_48f64e79f12bd77ba047e9e436ec978c.html b/dir_48f64e79f12bd77ba047e9e436ec978c.html index bd4c2570..ee058286 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 979b162c..38883138 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 548053b9..49f6a01d 100644 --- a/dir_6591a2127a29f6cea3994dcb5b0596d1.html +++ b/dir_6591a2127a29f6cea3994dcb5b0596d1.html @@ -106,7 +106,7 @@ Files diff --git a/dir_7e6ab9b017486261fe80629d442521f0.html b/dir_7e6ab9b017486261fe80629d442521f0.html index 96d7a1d1..da1ce07e 100644 --- a/dir_7e6ab9b017486261fe80629d442521f0.html +++ b/dir_7e6ab9b017486261fe80629d442521f0.html @@ -94,7 +94,7 @@ Files diff --git a/dir_9a34040863d1190c0e01b23e6b44de01.html b/dir_9a34040863d1190c0e01b23e6b44de01.html index 9fa478c5..e47dca93 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 878a9987..23258fec 100644 --- a/dir_bc0718b08fb2015b8e59c47b2805f60c.html +++ b/dir_bc0718b08fb2015b8e59c47b2805f60c.html @@ -112,7 +112,7 @@ Directories diff --git a/dir_be059bf9978ae156837504b1b8a7568c.html b/dir_be059bf9978ae156837504b1b8a7568c.html index a2d5424f..9d2356de 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 5608eea5..575702ee 100644 --- a/dir_e2ce51835550ba18edf07a8311722290.html +++ b/dir_e2ce51835550ba18edf07a8311722290.html @@ -224,7 +224,7 @@ Files diff --git a/dir_f34881fcf60f680b800190d5274dfaea.html b/dir_f34881fcf60f680b800190d5274dfaea.html index 3b5265b2..8fbeb882 100644 --- a/dir_f34881fcf60f680b800190d5274dfaea.html +++ b/dir_f34881fcf60f680b800190d5274dfaea.html @@ -106,7 +106,7 @@ Files diff --git a/dir_f9b96888882c2691b8eeaeafd1b9501d.html b/dir_f9b96888882c2691b8eeaeafd1b9501d.html index 105ff6d6..87ad810d 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 d121466d..835a0f8e 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 43093c45..9662a4fe 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 d2387138..53433b7c 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 9aa45b54..2db9da04 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 44b8ae26..169996a6 100644 --- a/files.html +++ b/files.html @@ -213,7 +213,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions.html b/functions.html index 41c39196..d62f3e7c 100644 --- a/functions.html +++ b/functions.html @@ -190,7 +190,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_b.html b/functions_b.html index bd2abb1f..40320a71 100644 --- a/functions_b.html +++ b/functions_b.html @@ -185,7 +185,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_c.html b/functions_c.html index 7c16d1cf..a4c21a97 100644 --- a/functions_c.html +++ b/functions_c.html @@ -226,7 +226,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_d.html b/functions_d.html index 471bf344..580ba795 100644 --- a/functions_d.html +++ b/functions_d.html @@ -261,7 +261,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_e.html b/functions_e.html index 96566454..ec7a91fa 100644 --- a/functions_e.html +++ b/functions_e.html @@ -195,7 +195,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_enum.html b/functions_enum.html index 187ab51d..e944a2ec 100644 --- a/functions_enum.html +++ b/functions_enum.html @@ -104,7 +104,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_eval.html b/functions_eval.html index 6644524f..b252c885 100644 --- a/functions_eval.html +++ b/functions_eval.html @@ -107,7 +107,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_f.html b/functions_f.html index 35e6032a..caa522a3 100644 --- a/functions_f.html +++ b/functions_f.html @@ -182,7 +182,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func.html b/functions_func.html index 8dad0de2..0301e6ec 100644 --- a/functions_func.html +++ b/functions_func.html @@ -183,7 +183,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_b.html b/functions_func_b.html index 343743d2..ff7f588f 100644 --- a/functions_func_b.html +++ b/functions_func_b.html @@ -175,7 +175,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_c.html b/functions_func_c.html index 4a303baa..7c6976b1 100644 --- a/functions_func_c.html +++ b/functions_func_c.html @@ -222,7 +222,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_d.html b/functions_func_d.html index 1279d92e..1a734904 100644 --- a/functions_func_d.html +++ b/functions_func_d.html @@ -244,7 +244,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_e.html b/functions_func_e.html index 473e9c9b..ed7fdc3a 100644 --- a/functions_func_e.html +++ b/functions_func_e.html @@ -194,7 +194,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_f.html b/functions_func_f.html index 1fe269bb..b0452fe2 100644 --- a/functions_func_f.html +++ b/functions_func_f.html @@ -175,7 +175,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_g.html b/functions_func_g.html index f6c61063..96c69a8b 100644 --- a/functions_func_g.html +++ b/functions_func_g.html @@ -141,7 +141,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_h.html b/functions_func_h.html index c9998679..fac530d7 100644 --- a/functions_func_h.html +++ b/functions_func_h.html @@ -156,7 +156,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_i.html b/functions_func_i.html index 083e721b..4ef15572 100644 --- a/functions_func_i.html +++ b/functions_func_i.html @@ -179,7 +179,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_k.html b/functions_func_k.html index 1137b91f..090d606b 100644 --- a/functions_func_k.html +++ b/functions_func_k.html @@ -146,7 +146,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_l.html b/functions_func_l.html index 824b2724..c0219568 100644 --- a/functions_func_l.html +++ b/functions_func_l.html @@ -151,7 +151,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_m.html b/functions_func_m.html index eac74765..7c52f558 100644 --- a/functions_func_m.html +++ b/functions_func_m.html @@ -152,7 +152,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_n.html b/functions_func_n.html index 9675d333..203a8a45 100644 --- a/functions_func_n.html +++ b/functions_func_n.html @@ -138,7 +138,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_o.html b/functions_func_o.html index 2b5f0f4a..9b50557d 100644 --- a/functions_func_o.html +++ b/functions_func_o.html @@ -144,7 +144,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_p.html b/functions_func_p.html index 766bb902..c9e6babd 100644 --- a/functions_func_p.html +++ b/functions_func_p.html @@ -164,7 +164,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_r.html b/functions_func_r.html index 7f5c49d5..9c0feecb 100644 --- a/functions_func_r.html +++ b/functions_func_r.html @@ -211,7 +211,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_s.html b/functions_func_s.html index f8fc762c..1cccc8a2 100644 --- a/functions_func_s.html +++ b/functions_func_s.html @@ -362,7 +362,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_t.html b/functions_func_t.html index 8faca5a3..1ebe8e34 100644 --- a/functions_func_t.html +++ b/functions_func_t.html @@ -153,7 +153,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_u.html b/functions_func_u.html index 54865312..bc4ec50c 100644 --- a/functions_func_u.html +++ b/functions_func_u.html @@ -148,7 +148,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_v.html b/functions_func_v.html index ae379698..32dae1c9 100644 --- a/functions_func_v.html +++ b/functions_func_v.html @@ -136,7 +136,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_w.html b/functions_func_w.html index a399eed6..65961519 100644 --- a/functions_func_w.html +++ b/functions_func_w.html @@ -157,7 +157,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_~.html b/functions_func_~.html index ee1c771c..f05a76f1 100644 --- a/functions_func_~.html +++ b/functions_func_~.html @@ -207,7 +207,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_g.html b/functions_g.html index 552a51f9..96a1015e 100644 --- a/functions_g.html +++ b/functions_g.html @@ -142,7 +142,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_h.html b/functions_h.html index a0c07b0f..b5190067 100644 --- a/functions_h.html +++ b/functions_h.html @@ -161,7 +161,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_i.html b/functions_i.html index f6039530..be5a9f77 100644 --- a/functions_i.html +++ b/functions_i.html @@ -183,7 +183,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_k.html b/functions_k.html index b88daf24..a7fa99f7 100644 --- a/functions_k.html +++ b/functions_k.html @@ -147,7 +147,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_l.html b/functions_l.html index 9dca3caa..ee23d8fc 100644 --- a/functions_l.html +++ b/functions_l.html @@ -152,7 +152,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_m.html b/functions_m.html index 4452f37b..bd25fc03 100644 --- a/functions_m.html +++ b/functions_m.html @@ -160,7 +160,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_n.html b/functions_n.html index f376de65..8b363df5 100644 --- a/functions_n.html +++ b/functions_n.html @@ -145,7 +145,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_o.html b/functions_o.html index 39b8df41..a84540f0 100644 --- a/functions_o.html +++ b/functions_o.html @@ -145,7 +145,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_p.html b/functions_p.html index e6ee622c..3c47effa 100644 --- a/functions_p.html +++ b/functions_p.html @@ -168,7 +168,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_r.html b/functions_r.html index c76f45e0..c206132f 100644 --- a/functions_r.html +++ b/functions_r.html @@ -212,7 +212,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_s.html b/functions_s.html index cc15d9bd..aa93e2b2 100644 --- a/functions_s.html +++ b/functions_s.html @@ -373,7 +373,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_t.html b/functions_t.html index 656b9588..7dc51025 100644 --- a/functions_t.html +++ b/functions_t.html @@ -154,7 +154,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_type.html b/functions_type.html index ed6613c5..265c4733 100644 --- a/functions_type.html +++ b/functions_type.html @@ -107,7 +107,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_u.html b/functions_u.html index e9c07dbc..807a2aed 100644 --- a/functions_u.html +++ b/functions_u.html @@ -149,7 +149,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_v.html b/functions_v.html index a991e767..a8e05dfa 100644 --- a/functions_v.html +++ b/functions_v.html @@ -137,7 +137,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_vars.html b/functions_vars.html index 63c3d64d..bc18f852 100644 --- a/functions_vars.html +++ b/functions_vars.html @@ -156,7 +156,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_w.html b/functions_w.html index 7c837c83..9cd28d1e 100644 --- a/functions_w.html +++ b/functions_w.html @@ -164,7 +164,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_y.html b/functions_y.html index 407bda58..e59cef11 100644 --- a/functions_y.html +++ b/functions_y.html @@ -130,7 +130,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_~.html b/functions_~.html index 2d9c1e08..30f75115 100644 --- a/functions_~.html +++ b/functions_~.html @@ -208,7 +208,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/group__power__save.html b/group__power__save.html index e674f9bd..25f6a091 100644 --- a/group__power__save.html +++ b/group__power__save.html @@ -201,7 +201,7 @@ void  diff --git a/hierarchy.html b/hierarchy.html index f4a6254f..8f47bc03 100644 --- a/hierarchy.html +++ b/hierarchy.html @@ -163,7 +163,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/index.html b/index.html index a026edb6..87a21309 100644 --- a/index.html +++ b/index.html @@ -154,7 +154,7 @@ Other diff --git a/ir-dumpir_8dox.html b/ir-dumpir_8dox.html index 26fdeb5c..c1ae4445 100644 --- a/ir-dumpir_8dox.html +++ b/ir-dumpir_8dox.html @@ -87,7 +87,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/ir-snake_8dox.html b/ir-snake_8dox.html index 792c612b..fc0fb83f 100644 --- a/ir-snake_8dox.html +++ b/ir-snake_8dox.html @@ -87,7 +87,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/ir_dumpir.html b/ir_dumpir.html index 3a16580a..b4978da2 100644 --- a/ir_dumpir.html +++ b/ir_dumpir.html @@ -283,7 +283,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/ir_snake.html b/ir_snake.html index 44970980..ed6dc03f 100644 --- a/ir_snake.html +++ b/ir_snake.html @@ -273,7 +273,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/lcd-form_8dox.html b/lcd-form_8dox.html index 0971c1bb..1476402f 100644 --- a/lcd-form_8dox.html +++ b/lcd-form_8dox.html @@ -87,7 +87,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/lcd-helloworld_8dox.html b/lcd-helloworld_8dox.html index 940b7432..5b7302d0 100644 --- a/lcd-helloworld_8dox.html +++ b/lcd-helloworld_8dox.html @@ -87,7 +87,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/lcd_form.html b/lcd_form.html index 9d876333..e7cdb544 100644 --- a/lcd_form.html +++ b/lcd_form.html @@ -216,7 +216,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/lcd_hello_world.html b/lcd_hello_world.html index a65dfc76..3c9d1a3f 100644 --- a/lcd_hello_world.html +++ b/lcd_hello_world.html @@ -166,7 +166,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/mainpage_8dox.html b/mainpage_8dox.html index d4595416..04aa8ddf 100644 --- a/mainpage_8dox.html +++ b/mainpage_8dox.html @@ -87,7 +87,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/modules.html b/modules.html index 12cef39d..d308df8b 100644 --- a/modules.html +++ b/modules.html @@ -87,7 +87,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/pages.html b/pages.html index 4aa46056..c84b4a38 100644 --- a/pages.html +++ b/pages.html @@ -100,7 +100,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/structRTCAlarm.html b/structRTCAlarm.html index 4eb99735..07d2c6d5 100644 --- a/structRTCAlarm.html +++ b/structRTCAlarm.html @@ -200,7 +200,7 @@ uint8_t  diff --git a/structRTCDate.html b/structRTCDate.html index e1a33c5a..db3b52c9 100644 --- a/structRTCDate.html +++ b/structRTCDate.html @@ -123,7 +123,7 @@ uint8_t  diff --git a/structRTCTime.html b/structRTCTime.html index 85a3ff4e..001fac5a 100644 --- a/structRTCTime.html +++ b/structRTCTime.html @@ -123,7 +123,7 @@ uint8_t