From 73c9ce445567a07959ab300d7d3e1ae9456a9456 Mon Sep 17 00:00:00 2001 From: Rhys Weatherley Date: Sat, 26 Mar 2016 19:05:43 +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 | 13 +- BigNumberUtil_8h_source.html | 19 +- 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 | 2 +- Curve25519_8h_source.html | 2 +- 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 +- LoginShell_8cpp_source.html | 2 +- LoginShell_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 +- P521_8cpp_source.html | 1342 +++++++++++++++++++ P521_8h_source.html | 223 +++ 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 +- SHAKE_8cpp_source.html | 2 +- SHAKE_8h_source.html | 2 +- Shell_8cpp_source.html | 2 +- Shell_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 +- TelnetDefs_8h_source.html | 2 +- Terminal_8cpp_source.html | 2 +- Terminal_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 +- USBKeysExtra_8h_source.html | 2 +- XOF_8cpp_source.html | 2 +- XOF_8h_source.html | 2 +- XTS_8cpp_source.html | 2 +- XTS_8h_source.html | 2 +- alarm-clock_8dox.html | 2 +- alarm_clock.html | 2 +- annotated.html | 61 +- 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 | 23 +- classBigNumberUtil.html | 52 +- 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 | 2 +- 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 +- classLoginShell-members.html | 2 +- classLoginShell.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 +- classP521-members.html | 111 ++ classP521.html | 654 +++++++++ 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 +- classSHAKE-members.html | 2 +- classSHAKE.html | 2 +- classSHAKE128-members.html | 2 +- classSHAKE128.html | 2 +- classSHAKE256-members.html | 2 +- classSHAKE256.html | 2 +- classShell-members.html | 2 +- classShell.html | 2 +- classShellArguments-members.html | 2 +- classShellArguments.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 +- classTerminal-members.html | 2 +- classTerminal.html | 2 +- classTextField-members.html | 2 +- classTextField.html | 2 +- classTimeField-members.html | 2 +- classTimeField.html | 2 +- classTransistorNoiseSource-members.html | 2 +- classTransistorNoiseSource.html | 2 +- classXOF-members.html | 2 +- classXOF.html | 2 +- classXTS-members.html | 2 +- classXTS.html | 2 +- classXTSCommon-members.html | 2 +- classXTSCommon.html | 2 +- classXTSSingleKey-members.html | 2 +- classXTSSingleKey.html | 2 +- classXTSSingleKeyCommon-members.html | 2 +- classXTSSingleKeyCommon.html | 2 +- classes.html | 52 +- crypto-rng-ring_8dox.html | 2 +- crypto-rng_8dox.html | 2 +- crypto.html | 28 +- crypto_8dox.html | 2 +- crypto_rng.html | 2 +- crypto_rng_ring.html | 2 +- dir_1586d320a3b1e622174530fde769cda9.html | 2 +- dir_1de32c476debcefedf4aa8bb43bea551.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 | 6 +- 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 | 90 +- functions.html | 2 +- functions_b.html | 2 +- functions_c.html | 2 +- functions_d.html | 7 +- functions_e.html | 3 +- 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 | 9 +- functions_func_e.html | 3 +- functions_func_f.html | 2 +- functions_func_g.html | 3 +- functions_func_h.html | 2 +- functions_func_i.html | 14 +- functions_func_k.html | 2 +- functions_func_l.html | 4 +- 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 | 3 +- functions_func_t.html | 2 +- functions_func_u.html | 2 +- functions_func_v.html | 3 +- functions_func_w.html | 2 +- functions_func_x.html | 2 +- functions_func_~.html | 2 +- functions_g.html | 3 +- functions_h.html | 2 +- functions_i.html | 14 +- functions_k.html | 2 +- functions_l.html | 4 +- functions_m.html | 2 +- functions_n.html | 2 +- functions_o.html | 2 +- functions_p.html | 2 +- functions_r.html | 2 +- functions_rela.html | 2 +- functions_s.html | 3 +- functions_t.html | 2 +- functions_type.html | 2 +- functions_u.html | 2 +- functions_v.html | 3 +- functions_vars.html | 2 +- functions_w.html | 2 +- functions_x.html | 2 +- functions_y.html | 2 +- functions_~.html | 2 +- group__power__save.html | 2 +- hierarchy.html | 47 +- index.html | 4 +- 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 +- search/all_10.js | 2 +- search/all_13.js | 2 +- search/all_3.js | 6 +- search/all_4.js | 2 +- search/all_6.js | 2 +- search/all_8.js | 4 + search/all_a.js | 2 +- search/all_e.js | 1 + search/classes_e.js | 1 + search/functions_10.js | 2 +- search/functions_13.js | 2 +- search/functions_3.js | 6 +- search/functions_4.js | 2 +- search/functions_6.js | 2 +- search/functions_8.js | 4 + search/functions_a.js | 2 +- shell-serial_8dox.html | 2 +- shell-telnet_8dox.html | 2 +- shell_serial.html | 2 +- shell_telnet.html | 2 +- structRTCAlarm.html | 2 +- structRTCDate.html | 2 +- structRTCTime.html | 2 +- 422 files changed, 3036 insertions(+), 561 deletions(-) create mode 100644 P521_8cpp_source.html create mode 100644 P521_8h_source.html create mode 100644 classP521-members.html create mode 100644 classP521.html diff --git a/AES128_8cpp_source.html b/AES128_8cpp_source.html index fe98732d..770896f9 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 006d315d..2afa9ecc 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 7dcc7563..93ffe432 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 b1aa21ef..ac1ad716 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 9021ad6e..32d91cdf 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 4113a82e..ee5f43b2 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 0551d88b..1a32ac38 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 9eb05a53..08382b9d 100644 --- a/BLAKE2b_8cpp_source.html +++ b/BLAKE2b_8cpp_source.html @@ -365,7 +365,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/BLAKE2b_8h_source.html b/BLAKE2b_8h_source.html index e7a728f0..dbf7856e 100644 --- a/BLAKE2b_8h_source.html +++ b/BLAKE2b_8h_source.html @@ -164,7 +164,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/BLAKE2s_8cpp_source.html b/BLAKE2s_8cpp_source.html index dcd3d3d4..2666d869 100644 --- a/BLAKE2s_8cpp_source.html +++ b/BLAKE2s_8cpp_source.html @@ -356,7 +356,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/BLAKE2s_8h_source.html b/BLAKE2s_8h_source.html index ba3be186..45912925 100644 --- a/BLAKE2s_8h_source.html +++ b/BLAKE2s_8h_source.html @@ -163,7 +163,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/BigNumberUtil_8cpp_source.html b/BigNumberUtil_8cpp_source.html index a04ab626..476e9f58 100644 --- a/BigNumberUtil_8cpp_source.html +++ b/BigNumberUtil_8cpp_source.html @@ -542,6 +542,16 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
634  --size;
635  }
636 }
+
637 
+
647 limb_t BigNumberUtil::isZero(const limb_t *x, size_t size)
+
648 {
+
649  limb_t word = 0;
+
650  while (size > 0) {
+
651  word |= *x++;
+
652  --size;
+
653  }
+
654  return (limb_t)(((((dlimb_t)1) << LIMB_BITS) - word) >> LIMB_BITS);
+
655 }
static void reduceQuick_P(limb_t *result, const limb_t *x, const limb_t *y, size_t size)
Reduces x modulo y using subtraction where y is in program memory.
static limb_t add(limb_t *result, const limb_t *x, const limb_t *y, size_t size)
Adds two big numbers.
static limb_t sub_P(limb_t *result, const limb_t *x, const limb_t *y, size_t size)
Subtracts one big number from another where one is in program memory.
@@ -553,11 +563,12 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
static void mul(limb_t *result, const limb_t *x, size_t xcount, const limb_t *y, size_t ycount)
Multiplies two big numbers.
static void unpackBE(limb_t *limbs, size_t count, const uint8_t *bytes, size_t len)
Unpacks the big-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 limb_t isZero(const limb_t *x, size_t size)
Determine if a big number is zero.
static limb_t add_P(limb_t *result, const limb_t *x, const limb_t *y, size_t size)
Adds two big numbers where one of them is in program memory.
diff --git a/BigNumberUtil_8h_source.html b/BigNumberUtil_8h_source.html index 884fe9a8..67f3d959 100644 --- a/BigNumberUtil_8h_source.html +++ b/BigNumberUtil_8h_source.html @@ -176,13 +176,15 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
86  static void reduceQuick_P(limb_t *result, const limb_t *x,
87  const limb_t *y, size_t size);
88 
-
89 private:
-
90  // Constructor and destructor are private - cannot instantiate this class.
-
91  BigNumberUtil() {}
-
92  ~BigNumberUtil() {}
-
93 };
-
94 
-
95 #endif
+
89  static limb_t isZero(const limb_t *x, size_t size);
+
90 
+
91 private:
+
92  // Constructor and destructor are private - cannot instantiate this class.
+
93  BigNumberUtil() {}
+
94  ~BigNumberUtil() {}
+
95 };
+
96 
+
97 #endif
static void reduceQuick_P(limb_t *result, const limb_t *x, const limb_t *y, size_t size)
Reduces x modulo y using subtraction where y is in program memory.
static limb_t add(limb_t *result, const limb_t *x, const limb_t *y, size_t size)
Adds two big numbers.
static limb_t sub_P(limb_t *result, const limb_t *x, const limb_t *y, size_t size)
Subtracts one big number from another where one is in program memory.
@@ -195,11 +197,12 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
static void mul(limb_t *result, const limb_t *x, size_t xcount, const limb_t *y, size_t ycount)
Multiplies two big numbers.
static void unpackBE(limb_t *limbs, size_t count, const uint8_t *bytes, size_t len)
Unpacks the big-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 limb_t isZero(const limb_t *x, size_t size)
Determine if a big number is zero.
static limb_t add_P(limb_t *result, const limb_t *x, const limb_t *y, size_t size)
Adds two big numbers where one of them is in program memory.
diff --git a/Bitmap_8cpp_source.html b/Bitmap_8cpp_source.html index 4f4f4760..efda936f 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 b1630cbe..bfe6055e 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 06c29b4f..977d7e85 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 f62ab7dc..ba85a78a 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 a3a4eab4..bd07c7f8 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 71a2d6d0..fe46629e 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 b42caf22..dc6b2132 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 ba9e403b..082a2464 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 099b2d4a..3b257913 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 7c111ed1..3eb20794 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 7aa33474..4fba491d 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 1a2efb1b..157da345 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 5aec1c44..15a6b9a7 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 c4357f8b..30f1b8e1 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 ac5f6254..9e6b5b06 100644 --- a/ChaChaPoly_8cpp_source.html +++ b/ChaChaPoly_8cpp_source.html @@ -263,7 +263,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/ChaChaPoly_8h_source.html b/ChaChaPoly_8h_source.html index 1ca8b6b5..792f50d0 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 ae35b465..d2f8329a 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 1c3f1f43..3fde8694 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 c86fcf21..6a838073 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 73d79090..fe69e9f1 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 b863eef2..a453fd33 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 21ac8c94..d20627f1 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 acde1763..be7ab393 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 55060376..a2890be2 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 9aee5a91..c2623afe 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 8472d9f3..2f277fdb 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 d08769ee..cb4cded8 100644 --- a/Curve25519_8cpp_source.html +++ b/Curve25519_8cpp_source.html @@ -1458,7 +1458,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Curve25519_8h_source.html b/Curve25519_8h_source.html index 12bf1a5d..b42748ac 100644 --- a/Curve25519_8h_source.html +++ b/Curve25519_8h_source.html @@ -173,7 +173,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/DMD_8cpp_source.html b/DMD_8cpp_source.html index 1feed326..4701ac1b 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 958ed2a2..d4bc0807 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 71feb705..2efc76bf 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 1fd34b4a..f40d8e30 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 cd516f0f..00b8f7b8 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 946b07d2..01dad7f4 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 3306d0a9..05339e07 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 3a3bc81b..143ebae0 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 8bfd6b46..21a5e018 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 4f538320..13f70d8d 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 bb5d438b..a4fe7cc2 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 3756218b..a9c11cc5 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 8d02868d..d3a74e7e 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 84f4a5c5..bd5222b7 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 ee9bc60e..6b56e014 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 949e7b0f..9269f6ea 100644 --- a/Ed25519_8cpp_source.html +++ b/Ed25519_8cpp_source.html @@ -571,7 +571,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Ed25519_8h_source.html b/Ed25519_8h_source.html index 7026e895..fd76ae07 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 7df5bf61..cd987ac8 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 e2caf6f3..09a40284 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 70d2549a..225b6bad 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 4c37eb4b..0ef203db 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 06a504d0..2961303f 100644 --- a/GCM_8cpp_source.html +++ b/GCM_8cpp_source.html @@ -353,7 +353,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/GCM_8h_source.html b/GCM_8h_source.html index 1d977c6b..2ba57626 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 1106a9df..d547f107 100644 --- a/GF128_8cpp_source.html +++ b/GF128_8cpp_source.html @@ -578,7 +578,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/GF128_8h_source.html b/GF128_8h_source.html index 72559451..dc0a7077 100644 --- a/GF128_8h_source.html +++ b/GF128_8h_source.html @@ -139,7 +139,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/GHASH_8cpp_source.html b/GHASH_8cpp_source.html index 20b1c698..da4f7e96 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 e6fbf8dd..a0dea5be 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 60ffa11d..753dfe9c 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 c6a32747..ab833294 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 bb715e86..230163b0 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 1f38ec76..2adb1d44 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 dfa71ebf..d4ac16ae 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 e5b4d905..02afc255 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 1ee8d1db..466cb911 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 77b0df18..19355b72 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 1d6adaa3..d190193c 100644 --- a/KeccakCore_8cpp_source.html +++ b/KeccakCore_8cpp_source.html @@ -1991,7 +1991,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/KeccakCore_8h_source.html b/KeccakCore_8h_source.html index f6344f38..db1ffd49 100644 --- a/KeccakCore_8h_source.html +++ b/KeccakCore_8h_source.html @@ -167,7 +167,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/LCD_8cpp_source.html b/LCD_8cpp_source.html index 7db69108..19a19742 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 99b136e1..b470bb78 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 9618a079..1f2db0cd 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 494d0dc7..afe63b4f 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/LoginShell_8cpp_source.html b/LoginShell_8cpp_source.html index 3654c2a4..8450d2f1 100644 --- a/LoginShell_8cpp_source.html +++ b/LoginShell_8cpp_source.html @@ -126,7 +126,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/LoginShell_8h_source.html b/LoginShell_8h_source.html index 873adf5f..09ea12b7 100644 --- a/LoginShell_8h_source.html +++ b/LoginShell_8h_source.html @@ -155,7 +155,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Melody_8cpp_source.html b/Melody_8cpp_source.html index 81d51270..4c3ece29 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 c5660620..a11c1854 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 b47fc09d..5573065a 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 4e6b428e..50151cf4 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 3a8104c8..f53ac991 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 0c582fe6..33964c3e 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 47bca086..9e17eb52 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 6151a749..6cedb99a 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 1230facd..350a9973 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/P521_8cpp_source.html b/P521_8cpp_source.html new file mode 100644 index 00000000..a05f6df3 --- /dev/null +++ b/P521_8cpp_source.html @@ -0,0 +1,1342 @@ + + + + + + +ArduinoLibs: P521.cpp Source File + + + + + + + + + +
+
+ + + + + + +
+
ArduinoLibs +
+
+
+ + + + + + + + + +
+ +
+ + +
+
+
+
P521.cpp
+
+
+
1 /*
+
2  * Copyright (C) 2016 Southern Storm Software, Pty Ltd.
+
3  *
+
4  * Permission is hereby granted, free of charge, to any person obtaining a
+
5  * copy of this software and associated documentation files (the "Software"),
+
6  * to deal in the Software without restriction, including without limitation
+
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+
8  * and/or sell copies of the Software, and to permit persons to whom the
+
9  * Software is furnished to do so, subject to the following conditions:
+
10  *
+
11  * The above copyright notice and this permission notice shall be included
+
12  * in all copies or substantial portions of the Software.
+
13  *
+
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+
15  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+
16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+
17  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+
18  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+
19  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+
20  * DEALINGS IN THE SOFTWARE.
+
21  */
+
22 
+
23 #include "P521.h"
+
24 #include "Crypto.h"
+
25 #include "RNG.h"
+
26 #include "SHA512.h"
+
27 #include "utility/LimbUtil.h"
+
28 #include <string.h>
+
29 #include <Arduino.h>
+
30 
+
49 // Number of limbs that are needed to represent a 521-bit number.
+
50 #define NUM_LIMBS_521BIT NUM_LIMBS_BITS(521)
+
51 
+
52 // Number of limbs that are needed to represent a 1042-bit number.
+
53 // To simply things we also require that this be twice the size of
+
54 // NUM_LIMB_521BIT which involves a little wastage at the high end
+
55 // of one extra limb for 8-bit and 32-bit limbs. There is no
+
56 // wastage for 16-bit limbs.
+
57 #define NUM_LIMBS_1042BIT (NUM_LIMBS_BITS(521) * 2)
+
58 
+
59 // The overhead of clean() calls in mul(), etc can add up to a lot of
+
60 // processing time. Only do such cleanups if strict mode has been enabled.
+
61 #if defined(P521_STRICT_CLEAN)
+
62 #define strict_clean(x) clean(x)
+
63 #else
+
64 #define strict_clean(x) do { ; } while (0)
+
65 #endif
+
66 
+
67 // Expand the partial 9-bit left over limb at the top of a 521-bit number.
+
68 #if BIGNUMBER_LIMB_8BIT
+
69 #define LIMB_PARTIAL(value) ((uint8_t)(value)), \
+
70  ((uint8_t)((value) >> 8))
+
71 #else
+
72 #define LIMB_PARTIAL(value) (value)
+
73 #endif
+
74 
+
77 // The group order "q" value from RFC 4754 and RFC 5903. This is the
+
78 // same as the "n" value from Appendix D.1.2.5 of NIST FIPS 186-4.
+
79 static limb_t const P521_q[NUM_LIMBS_521BIT] PROGMEM = {
+
80  LIMB(0x91386409), LIMB(0xbb6fb71e), LIMB(0x899c47ae), LIMB(0x3bb5c9b8),
+
81  LIMB(0xf709a5d0), LIMB(0x7fcc0148), LIMB(0xbf2f966b), LIMB(0x51868783),
+
82  LIMB(0xfffffffa), LIMB(0xffffffff), LIMB(0xffffffff), LIMB(0xffffffff),
+
83  LIMB(0xffffffff), LIMB(0xffffffff), LIMB(0xffffffff), LIMB(0xffffffff),
+
84  LIMB_PARTIAL(0x1ff)
+
85 };
+
86 
+
87 // The "b" value from Appendix D.1.2.5 of NIST FIPS 186-4.
+
88 static limb_t const P521_b[NUM_LIMBS_521BIT] PROGMEM = {
+
89  LIMB(0x6b503f00), LIMB(0xef451fd4), LIMB(0x3d2c34f1), LIMB(0x3573df88),
+
90  LIMB(0x3bb1bf07), LIMB(0x1652c0bd), LIMB(0xec7e937b), LIMB(0x56193951),
+
91  LIMB(0x8ef109e1), LIMB(0xb8b48991), LIMB(0x99b315f3), LIMB(0xa2da725b),
+
92  LIMB(0xb68540ee), LIMB(0x929a21a0), LIMB(0x8e1c9a1f), LIMB(0x953eb961),
+
93  LIMB_PARTIAL(0x051)
+
94 };
+
95 
+
96 // The "Gx" value from Appendix D.1.2.5 of NIST FIPS 186-4.
+
97 static limb_t const P521_Gx[NUM_LIMBS_521BIT] PROGMEM = {
+
98  LIMB(0xc2e5bd66), LIMB(0xf97e7e31), LIMB(0x856a429b), LIMB(0x3348b3c1),
+
99  LIMB(0xa2ffa8de), LIMB(0xfe1dc127), LIMB(0xefe75928), LIMB(0xa14b5e77),
+
100  LIMB(0x6b4d3dba), LIMB(0xf828af60), LIMB(0x053fb521), LIMB(0x9c648139),
+
101  LIMB(0x2395b442), LIMB(0x9e3ecb66), LIMB(0x0404e9cd), LIMB(0x858e06b7),
+
102  LIMB_PARTIAL(0x0c6)
+
103 };
+
104 
+
105 // The "Gy" value from Appendix D.1.2.5 of NIST FIPS 186-4.
+
106 static limb_t const P521_Gy[NUM_LIMBS_521BIT] PROGMEM = {
+
107  LIMB(0x9fd16650), LIMB(0x88be9476), LIMB(0xa272c240), LIMB(0x353c7086),
+
108  LIMB(0x3fad0761), LIMB(0xc550b901), LIMB(0x5ef42640), LIMB(0x97ee7299),
+
109  LIMB(0x273e662c), LIMB(0x17afbd17), LIMB(0x579b4468), LIMB(0x98f54449),
+
110  LIMB(0x2c7d1bd9), LIMB(0x5c8a5fb4), LIMB(0x9a3bc004), LIMB(0x39296a78),
+
111  LIMB_PARTIAL(0x118)
+
112 };
+
113 
+
136 bool P521::eval(uint8_t result[132], const uint8_t f[66], const uint8_t point[132])
+
137 {
+
138  limb_t x[NUM_LIMBS_521BIT];
+
139  limb_t y[NUM_LIMBS_521BIT];
+
140  bool ok;
+
141 
+
142  // Unpack the curve point from the parameters and validate it.
+
143  if (point) {
+
144  BigNumberUtil::unpackBE(x, NUM_LIMBS_521BIT, point, 66);
+
145  BigNumberUtil::unpackBE(y, NUM_LIMBS_521BIT, point + 66, 66);
+
146  ok = validate(x, y);
+
147  } else {
+
148  memcpy_P(x, P521_Gx, sizeof(x));
+
149  memcpy_P(y, P521_Gy, sizeof(y));
+
150  ok = true;
+
151  }
+
152 
+
153  // Evaluate the curve function.
+
154  evaluate(x, y, f);
+
155 
+
156  // Pack the answer into the result array.
+
157  BigNumberUtil::packBE(result, 66, x, NUM_LIMBS_521BIT);
+
158  BigNumberUtil::packBE(result + 66, 66, y, NUM_LIMBS_521BIT);
+
159 
+
160  // Clean up.
+
161  clean(x);
+
162  clean(y);
+
163  return ok;
+
164 }
+
165 
+
209 void P521::dh1(uint8_t k[132], uint8_t f[66])
+
210 {
+ +
212  derivePublicKey(k, f);
+
213 }
+
214 
+
230 bool P521::dh2(const uint8_t k[132], uint8_t f[66])
+
231 {
+
232  // Unpack the (x, y) point from k.
+
233  limb_t x[NUM_LIMBS_521BIT];
+
234  limb_t y[NUM_LIMBS_521BIT];
+
235  BigNumberUtil::unpackBE(x, NUM_LIMBS_521BIT, k, 66);
+
236  BigNumberUtil::unpackBE(y, NUM_LIMBS_521BIT, k + 66, 66);
+
237 
+
238  // Validate the curve point. We keep going to preserve the timing.
+
239  bool ok = validate(x, y);
+
240 
+
241  // Evaluate the curve function.
+
242  evaluate(x, y, f);
+
243 
+
244  // The secret key is the x component of the final value.
+
245  BigNumberUtil::packBE(f, 66, x, NUM_LIMBS_521BIT);
+
246 
+
247  // Clean up.
+
248  clean(x);
+
249  clean(y);
+
250  return ok;
+
251 }
+
252 
+
277 void P521::sign(uint8_t signature[132], const uint8_t privateKey[66],
+
278  const void *message, size_t len, Hash *hash)
+
279 {
+
280  uint8_t hm[66];
+
281  uint8_t k[66];
+
282  limb_t x[NUM_LIMBS_521BIT];
+
283  limb_t y[NUM_LIMBS_521BIT];
+
284  limb_t t[NUM_LIMBS_521BIT];
+
285  uint64_t count = 0;
+
286 
+
287  // Format the incoming message, hashing it if necessary.
+
288  if (hash) {
+
289  // Hash the message.
+
290  hash->reset();
+
291  hash->update(message, len);
+
292  len = hash->hashSize();
+
293  if (len > 64)
+
294  len = 64;
+
295  memset(hm, 0, 66 - len);
+
296  hash->finalize(hm + 66 - len, len);
+
297  } else {
+
298  // The message is the hash.
+
299  if (len > 64)
+
300  len = 64;
+
301  memset(hm, 0, 66 - len);
+
302  memcpy(hm + 66 - len, message, len);
+
303  }
+
304 
+
305  // Keep generating k values until both r and s are non-zero.
+
306  for (;;) {
+
307  // Generate the k value deterministically according to RFC 6979.
+
308  if (hash)
+
309  generateK(k, hm, privateKey, hash, count);
+
310  else
+
311  generateK(k, hm, privateKey, count);
+
312 
+
313  // Generate r = kG.x mod q.
+
314  memcpy_P(x, P521_Gx, sizeof(x));
+
315  memcpy_P(y, P521_Gy, sizeof(y));
+
316  evaluate(x, y, k);
+
317  BigNumberUtil::reduceQuick_P(x, x, P521_q, NUM_LIMBS_521BIT);
+
318  BigNumberUtil::packBE(signature, 66, x, NUM_LIMBS_521BIT);
+
319 
+
320  // If r is zero, then we need to generate a new k value.
+
321  // This is utterly improbable, but let's be safe anyway.
+
322  if (BigNumberUtil::isZero(x, NUM_LIMBS_521BIT)) {
+
323  ++count;
+
324  continue;
+
325  }
+
326 
+
327  // Generate s = (privateKey * r + hm) / k mod q.
+
328  BigNumberUtil::unpackBE(y, NUM_LIMBS_521BIT, privateKey, 66);
+
329  mulQ(y, y, x);
+
330  BigNumberUtil::unpackBE(x, NUM_LIMBS_521BIT, hm, 66);
+
331  BigNumberUtil::add(x, x, y, NUM_LIMBS_521BIT);
+
332  BigNumberUtil::reduceQuick_P(x, x, P521_q, NUM_LIMBS_521BIT);
+
333  BigNumberUtil::unpackBE(y, NUM_LIMBS_521BIT, k, 66);
+
334  recipQ(t, y);
+
335  mulQ(x, x, t);
+
336  BigNumberUtil::packBE(signature + 66, 66, x, NUM_LIMBS_521BIT);
+
337 
+
338  // Exit the loop if s is non-zero.
+
339  if (!BigNumberUtil::isZero(x, NUM_LIMBS_521BIT))
+
340  break;
+
341 
+
342  // We need to generate a new k value according to RFC 6979.
+
343  // This is utterly improbable, but let's be safe anyway.
+
344  ++count;
+
345  }
+
346 
+
347  // Clean up.
+
348  clean(hm);
+
349  clean(k);
+
350  clean(x);
+
351  clean(y);
+
352  clean(t);
+
353 }
+
354 
+
374 bool P521::verify(const uint8_t signature[132],
+
375  const uint8_t publicKey[132],
+
376  const void *message, size_t len, Hash *hash)
+
377 {
+
378  limb_t x[NUM_LIMBS_521BIT];
+
379  limb_t y[NUM_LIMBS_521BIT];
+
380  limb_t r[NUM_LIMBS_521BIT];
+
381  limb_t s[NUM_LIMBS_521BIT];
+
382  limb_t u1[NUM_LIMBS_521BIT];
+
383  limb_t u2[NUM_LIMBS_521BIT];
+
384  uint8_t t[66];
+
385  bool ok = false;
+
386 
+
387  // Because we are operating on public values, we don't need to
+
388  // be as strict about constant time. Bail out early if there
+
389  // is a problem with the parameters.
+
390 
+
391  // Unpack the signature. The values must be between 1 and q - 1.
+
392  BigNumberUtil::unpackBE(r, NUM_LIMBS_521BIT, signature, 66);
+
393  BigNumberUtil::unpackBE(s, NUM_LIMBS_521BIT, signature + 66, 66);
+
394  if (BigNumberUtil::isZero(r, NUM_LIMBS_521BIT) ||
+
395  BigNumberUtil::isZero(s, NUM_LIMBS_521BIT) ||
+
396  !BigNumberUtil::sub_P(x, r, P521_q, NUM_LIMBS_521BIT) ||
+
397  !BigNumberUtil::sub_P(x, s, P521_q, NUM_LIMBS_521BIT)) {
+
398  goto failed;
+
399  }
+
400 
+
401  // Unpack the public key and check that it is a valid curve point.
+
402  BigNumberUtil::unpackBE(x, NUM_LIMBS_521BIT, publicKey, 66);
+
403  BigNumberUtil::unpackBE(y, NUM_LIMBS_521BIT, publicKey + 66, 66);
+
404  if (!validate(x, y)) {
+
405  goto failed;
+
406  }
+
407 
+
408  // Hash the message to generate hm, which we store into u1.
+
409  if (hash) {
+
410  // Hash the message.
+
411  hash->reset();
+
412  hash->update(message, len);
+
413  len = hash->hashSize();
+
414  if (len > 64)
+
415  len = 64;
+
416  hash->finalize(u2, len);
+
417  BigNumberUtil::unpackBE(u1, NUM_LIMBS_521BIT, (uint8_t *)u2, len);
+
418  } else {
+
419  // The message is the hash.
+
420  if (len > 64)
+
421  len = 64;
+
422  BigNumberUtil::unpackBE(u1, NUM_LIMBS_521BIT, (uint8_t *)message, len);
+
423  }
+
424 
+
425  // Compute u1 = hm * s^-1 mod q and u2 = r * s^-1 mod q.
+
426  recipQ(u2, s);
+
427  mulQ(u1, u1, u2);
+
428  mulQ(u2, r, u2);
+
429 
+
430  // Compute the curve point R = u2 * publicKey + u1 * G.
+
431  BigNumberUtil::packBE(t, 66, u2, NUM_LIMBS_521BIT);
+
432  evaluate(x, y, t);
+
433  memcpy_P(u2, P521_Gx, sizeof(x));
+
434  memcpy_P(s, P521_Gy, sizeof(y));
+
435  BigNumberUtil::packBE(t, 66, u1, NUM_LIMBS_521BIT);
+
436  evaluate(u2, s, t);
+
437  addAffine(u2, s, x, y);
+
438 
+
439  // If R.x = r mod q, then the signature is valid.
+
440  BigNumberUtil::reduceQuick_P(u1, u2, P521_q, NUM_LIMBS_521BIT);
+
441  ok = secure_compare(u1, r, NUM_LIMBS_521BIT * sizeof(limb_t));
+
442 
+
443  // Clean up and exit.
+
444 failed:
+
445  clean(x);
+
446  clean(y);
+
447  clean(r);
+
448  clean(s);
+
449  clean(u1);
+
450  clean(u2);
+
451  clean(t);
+
452  return ok;
+
453 }
+
454 
+
467 void P521::generatePrivateKey(uint8_t privateKey[66])
+
468 {
+
469  // Generate a random 521-bit value for the private key. The value
+
470  // must be generated uniformly at random between 1 and q - 1 where q
+
471  // is the group order (RFC 6090). We use the recommended algorithm
+
472  // from Appendix B of RFC 6090: generate a random 521-bit value
+
473  // and discard it if it is not within the range 1 to q - 1.
+
474  limb_t x[NUM_LIMBS_521BIT];
+
475  do {
+
476  RNG.rand((uint8_t *)x, sizeof(x));
+
477 #if BIGNUMBER_LIMB_8BIT
+
478  x[NUM_LIMBS_521BIT - 1] &= 0x01;
+
479 #else
+
480  x[NUM_LIMBS_521BIT - 1] &= 0x1FF;
+
481 #endif
+
482  BigNumberUtil::packBE(privateKey, 66, x, NUM_LIMBS_521BIT);
+
483  } while (BigNumberUtil::isZero(x, NUM_LIMBS_521BIT) ||
+
484  !BigNumberUtil::sub_P(x, x, P521_q, NUM_LIMBS_521BIT));
+
485  clean(x);
+
486 }
+
487 
+
498 void P521::derivePublicKey(uint8_t publicKey[132], const uint8_t privateKey[66])
+
499 {
+
500  // Evaluate the curve function starting with the generator.
+
501  limb_t x[NUM_LIMBS_521BIT];
+
502  limb_t y[NUM_LIMBS_521BIT];
+
503  memcpy_P(x, P521_Gx, sizeof(x));
+
504  memcpy_P(y, P521_Gy, sizeof(y));
+
505  evaluate(x, y, privateKey);
+
506 
+
507  // Pack the (x, y) point into the public key.
+
508  BigNumberUtil::packBE(publicKey, 66, x, NUM_LIMBS_521BIT);
+
509  BigNumberUtil::packBE(publicKey + 66, 66, y, NUM_LIMBS_521BIT);
+
510 
+
511  // Clean up.
+
512  clean(x);
+
513  clean(y);
+
514 }
+
515 
+
525 bool P521::isValidPrivateKey(const uint8_t privateKey[66])
+
526 {
+
527  // The value "q" as a byte array from most to least significant.
+
528  static uint8_t const P521_q_bytes[66] PROGMEM = {
+
529  0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+
530  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+
531  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+
532  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+
533  0xFF, 0xFA, 0x51, 0x86, 0x87, 0x83, 0xBF, 0x2F,
+
534  0x96, 0x6B, 0x7F, 0xCC, 0x01, 0x48, 0xF7, 0x09,
+
535  0xA5, 0xD0, 0x3B, 0xB5, 0xC9, 0xB8, 0x89, 0x9C,
+
536  0x47, 0xAE, 0xBB, 0x6F, 0xB7, 0x1E, 0x91, 0x38,
+
537  0x64, 0x09
+
538  };
+
539  uint8_t zeroTest = 0;
+
540  uint8_t posn = 66;
+
541  uint16_t borrow = 0;
+
542  while (posn > 0) {
+
543  --posn;
+
544 
+
545  // Check for zero.
+
546  zeroTest |= privateKey[posn];
+
547 
+
548  // Subtract P521_q_bytes from the key. If there is no borrow,
+
549  // then the key value was greater than or equal to q.
+
550  borrow = ((uint16_t)(privateKey[posn])) -
+
551  pgm_read_byte(&(P521_q_bytes[posn])) -
+
552  ((borrow >> 8) & 0x01);
+
553  }
+
554  return zeroTest != 0 && borrow != 0;
+
555 }
+
556 
+
565 bool P521::isValidPublicKey(const uint8_t publicKey[132])
+
566 {
+
567  limb_t x[NUM_LIMBS_521BIT];
+
568  limb_t y[NUM_LIMBS_521BIT];
+
569  BigNumberUtil::unpackBE(x, NUM_LIMBS_521BIT, publicKey, 66);
+
570  BigNumberUtil::unpackBE(y, NUM_LIMBS_521BIT, publicKey + 66, 66);
+
571  bool ok = validate(x, y);
+
572  clean(x);
+
573  clean(y);
+
574  return ok;
+
575 }
+
576 
+
598 void P521::evaluate(limb_t *x, limb_t *y, const uint8_t f[66])
+
599 {
+
600  limb_t x1[NUM_LIMBS_521BIT];
+
601  limb_t y1[NUM_LIMBS_521BIT];
+
602  limb_t z1[NUM_LIMBS_521BIT];
+
603  limb_t x2[NUM_LIMBS_521BIT];
+
604  limb_t y2[NUM_LIMBS_521BIT];
+
605  limb_t z2[NUM_LIMBS_521BIT];
+
606 
+
607  // We want the input in Jacobian co-ordinates. The point (x, y, z)
+
608  // corresponds to the affine point (x / z^2, y / z^3), so if we set z
+
609  // to 1 we end up with Jacobian co-ordinates. Remember that z is 1
+
610  // and continue on.
+
611 
+
612  // Set the answer to the point-at-infinity initially (z = 0).
+
613  memset(x1, 0, sizeof(x1));
+
614  memset(y1, 0, sizeof(y1));
+
615  memset(z1, 0, sizeof(z1));
+
616 
+
617  // Special handling for the highest bit. We can skip dblPoint()/addPoint()
+
618  // and simply conditionally move (x, y, z) into (x1, y1, z1).
+
619  uint8_t select = (f[0] & 0x01);
+
620  cmove(select, x1, x);
+
621  cmove(select, y1, y);
+
622  cmove1(select, z1); // z = 1
+
623 
+
624  // Iterate over the remaining 520 bits of f from highest to lowest.
+
625  uint8_t mask = 0x80;
+
626  uint8_t fposn = 1;
+
627  for (uint16_t t = 520; t > 0; --t) {
+
628  // Double the answer.
+
629  dblPoint(x1, y1, z1, x1, y1, z1);
+
630 
+
631  // Add (x, y, z) to (x1, y1, z1) for the next 1 bit.
+
632  // We must always do this to preserve the overall timing.
+
633  // The z value is always 1 so we can omit that argument.
+
634  addPoint(x2, y2, z2, x1, y1, z1, x, y/*, z*/);
+
635 
+
636  // If the bit was 1, then move (x2, y2, z2) into (x1, y1, z1).
+
637  select = (f[fposn] & mask);
+
638  cmove(select, x1, x2);
+
639  cmove(select, y1, y2);
+
640  cmove(select, z1, z2);
+
641 
+
642  // Move onto the next bit.
+
643  mask >>= 1;
+
644  if (!mask) {
+
645  ++fposn;
+
646  mask = 0x80;
+
647  }
+
648  }
+
649 
+
650  // Convert from Jacobian co-ordinates back into affine co-ordinates.
+
651  // x = x1 * (z1^2)^-1, y = y1 * (z1^3)^-1.
+
652  recip(x2, z1);
+
653  square(y2, x2);
+
654  mul(x, x1, y2);
+
655  mul(y2, y2, x2);
+
656  mul(y, y1, y2);
+
657 
+
658  // Clean up.
+
659  clean(x1);
+
660  clean(y1);
+
661  clean(z1);
+
662  clean(x2);
+
663  clean(y2);
+
664  clean(z2);
+
665 }
+
666 
+
677 void P521::addAffine(limb_t *x1, limb_t *y1, const limb_t *x2, const limb_t *y2)
+
678 {
+
679  limb_t xout[NUM_LIMBS_521BIT];
+
680  limb_t yout[NUM_LIMBS_521BIT];
+
681  limb_t zout[NUM_LIMBS_521BIT];
+
682  limb_t z1[NUM_LIMBS_521BIT];
+
683 
+
684  // z1 = 1
+
685  z1[0] = 1;
+
686  memset(z1 + 1, 0, (NUM_LIMBS_521BIT - 1) * sizeof(limb_t));
+
687 
+
688  // Add the two points.
+
689  addPoint(xout, yout, zout, x1, y1, z1, x2, y2/*, z2*/);
+
690 
+
691  // Convert from Jacobian co-ordinates back into affine co-ordinates.
+
692  // x1 = xout * (zout^2)^-1, y1 = yout * (zout^3)^-1.
+
693  recip(z1, zout);
+
694  square(zout, z1);
+
695  mul(x1, xout, zout);
+
696  mul(zout, zout, z1);
+
697  mul(y1, yout, zout);
+
698 
+
699  // Clean up.
+
700  clean(xout);
+
701  clean(yout);
+
702  clean(zout);
+
703  clean(z1);
+
704 }
+
705 
+
715 bool P521::validate(const limb_t *x, const limb_t *y)
+
716 {
+
717  bool result;
+
718 
+
719  // If x or y is greater than or equal to 2^521 - 1, then the
+
720  // point is definitely not on the curve. Preserve timing by
+
721  // delaying the reporting of the result until later.
+
722  result = inRange(x);
+
723  result &= inRange(y);
+
724 
+
725  // We need to check that y^2 = x^3 - 3 * x + b mod 2^521 - 1.
+
726  limb_t t1[NUM_LIMBS_521BIT];
+
727  limb_t t2[NUM_LIMBS_521BIT];
+
728  square(t1, x);
+
729  mul(t1, t1, x);
+
730  mulLiteral(t2, x, 3);
+
731  sub(t1, t1, t2);
+
732  memcpy_P(t2, P521_b, sizeof(t2));
+
733  add(t1, t1, t2);
+
734  square(t2, y);
+
735  result &= secure_compare(t1, t2, sizeof(t1));
+
736  clean(t1);
+
737  clean(t2);
+
738  return result;
+
739 }
+
740 
+
749 bool P521::inRange(const limb_t *x)
+
750 {
+
751  // Do a trial subtraction of 2^521 - 1 from x, which is equivalent
+
752  // to adding 1 and subtracting 2^521. We only need the carry.
+
753  dlimb_t carry = 1;
+
754  limb_t word = 0;
+
755  for (uint8_t index = 0; index < NUM_LIMBS_521BIT; ++index) {
+
756  carry += *x++;
+
757  word = (limb_t)carry;
+
758  carry >>= LIMB_BITS;
+
759  }
+
760 
+
761  // Determine the carry out from the low 521 bits.
+
762 #if BIGNUMBER_LIMB_8BIT
+
763  carry = (carry << 7) + (word >> 1);
+
764 #else
+
765  carry = (carry << (LIMB_BITS - 9)) + (word >> 9);
+
766 #endif
+
767 
+
768  // If the carry is zero, then x was in range. Otherwise it is out
+
769  // of range. Check for zero in a way that preserves constant timing.
+
770  word = (limb_t)(carry | (carry >> LIMB_BITS));
+
771  word = (limb_t)(((((dlimb_t)1) << LIMB_BITS) - word) >> LIMB_BITS);
+
772  return (bool)word;
+
773 }
+
774 
+
784 void P521::reduce(limb_t *result, const limb_t *x)
+
785 {
+
786 #if BIGNUMBER_LIMB_16BIT || BIGNUMBER_LIMB_32BIT
+
787  // According to NIST FIPS 186-4, we add the high 521 bits to the
+
788  // low 521 bits and then do a trial subtraction of 2^521 - 1.
+
789  // We do both in a single step. Subtracting 2^521 - 1 is equivalent
+
790  // to adding 1 and subtracting 2^521.
+
791  uint8_t index;
+
792  const limb_t *xl = x;
+
793  const limb_t *xh = x + NUM_LIMBS_521BIT;
+
794  limb_t *rr = result;
+
795  dlimb_t carry;
+
796  limb_t word = x[NUM_LIMBS_521BIT - 1];
+
797  carry = (word >> 9) + 1;
+
798  word &= 0x1FF;
+
799  for (index = 0; index < (NUM_LIMBS_521BIT - 1); ++index) {
+
800  carry += *xl++;
+
801  carry += ((dlimb_t)(*xh++)) << (LIMB_BITS - 9);
+
802  *rr++ = (limb_t)carry;
+
803  carry >>= LIMB_BITS;
+
804  }
+
805  carry += word;
+
806  carry += ((dlimb_t)(x[NUM_LIMBS_1042BIT - 1])) << (LIMB_BITS - 9);
+
807  word = (limb_t)carry;
+
808  *rr = word;
+
809 
+
810  // If the carry out was 1, then mask it off and we have the answer.
+
811  // If the carry out was 0, then we need to add 2^521 - 1 back again.
+
812  // To preserve the timing we perform a conditional subtract of 1 and
+
813  // then mask off the high bits.
+
814  carry = ((word >> 9) ^ 0x01) & 0x01;
+
815  rr = result;
+
816  for (index = 0; index < NUM_LIMBS_521BIT; ++index) {
+
817  carry = ((dlimb_t)(*rr)) - carry;
+
818  *rr++ = (limb_t)carry;
+
819  carry = (carry >> LIMB_BITS) & 0x01;
+
820  }
+
821  *(--rr) &= 0x1FF;
+
822 #elif BIGNUMBER_LIMB_8BIT
+
823  // Same as above, but for 8-bit limbs.
+
824  uint8_t index;
+
825  const limb_t *xl = x;
+
826  const limb_t *xh = x + NUM_LIMBS_521BIT;
+
827  limb_t *rr = result;
+
828  dlimb_t carry;
+
829  limb_t word = x[NUM_LIMBS_521BIT - 1];
+
830  carry = (word >> 1) + 1;
+
831  word &= 0x01;
+
832  for (index = 0; index < (NUM_LIMBS_521BIT - 1); ++index) {
+
833  carry += *xl++;
+
834  carry += ((dlimb_t)(*xh++)) << 7;
+
835  *rr++ = (limb_t)carry;
+
836  carry >>= LIMB_BITS;
+
837  }
+
838  carry += word;
+
839  carry += ((dlimb_t)(x[NUM_LIMBS_1042BIT - 1])) << 1;
+
840  word = (limb_t)carry;
+
841  *rr = word;
+
842  carry = ((word >> 1) ^ 0x01) & 0x01;
+
843  rr = result;
+
844  for (index = 0; index < NUM_LIMBS_521BIT; ++index) {
+
845  carry = ((dlimb_t)(*rr)) - carry;
+
846  *rr++ = (limb_t)carry;
+
847  carry = (carry >> LIMB_BITS) & 0x01;
+
848  }
+
849  *(--rr) &= 0x01;
+
850 #else
+
851  #error "Don't know how to reduce values mod 2^521 - 1"
+
852 #endif
+
853 }
+
854 
+
867 void P521::reduceQuick(limb_t *x)
+
868 {
+
869  // Perform a trial subtraction of 2^521 - 1 from x. This is
+
870  // equivalent to adding 1 and subtracting 2^521 - 1.
+
871  uint8_t index;
+
872  limb_t *xx = x;
+
873  dlimb_t carry = 1;
+
874  for (index = 0; index < NUM_LIMBS_521BIT; ++index) {
+
875  carry += *xx;
+
876  *xx++ = (limb_t)carry;
+
877  carry >>= LIMB_BITS;
+
878  }
+
879 
+
880  // If the carry out was 1, then mask it off and we have the answer.
+
881  // If the carry out was 0, then we need to add 2^521 - 1 back again.
+
882  // To preserve the timing we perform a conditional subtract of 1 and
+
883  // then mask off the high bits.
+
884 #if BIGNUMBER_LIMB_16BIT || BIGNUMBER_LIMB_32BIT
+
885  carry = ((x[NUM_LIMBS_521BIT - 1] >> 9) ^ 0x01) & 0x01;
+
886  xx = x;
+
887  for (index = 0; index < NUM_LIMBS_521BIT; ++index) {
+
888  carry = ((dlimb_t)(*xx)) - carry;
+
889  *xx++ = (limb_t)carry;
+
890  carry = (carry >> LIMB_BITS) & 0x01;
+
891  }
+
892  *(--xx) &= 0x1FF;
+
893 #elif BIGNUMBER_LIMB_8BIT
+
894  carry = ((x[NUM_LIMBS_521BIT - 1] >> 1) ^ 0x01) & 0x01;
+
895  xx = x;
+
896  for (index = 0; index < NUM_LIMBS_521BIT; ++index) {
+
897  carry = ((dlimb_t)(*xx)) - carry;
+
898  *xx++ = (limb_t)carry;
+
899  carry = (carry >> LIMB_BITS) & 0x01;
+
900  }
+
901  *(--xx) &= 0x01;
+
902 #endif
+
903 }
+
904 
+
917 void P521::mulNoReduce(limb_t *result, const limb_t *x, const limb_t *y)
+
918 {
+
919  uint8_t i, j;
+
920  dlimb_t carry;
+
921  limb_t word;
+
922  const limb_t *yy;
+
923  limb_t *rr;
+
924 
+
925  // Multiply the lowest word of x by y.
+
926  carry = 0;
+
927  word = x[0];
+
928  yy = y;
+
929  rr = result;
+
930  for (i = 0; i < NUM_LIMBS_521BIT; ++i) {
+
931  carry += ((dlimb_t)(*yy++)) * word;
+
932  *rr++ = (limb_t)carry;
+
933  carry >>= LIMB_BITS;
+
934  }
+
935  *rr = (limb_t)carry;
+
936 
+
937  // Multiply and add the remaining words of x by y.
+
938  for (i = 1; i < NUM_LIMBS_521BIT; ++i) {
+
939  word = x[i];
+
940  carry = 0;
+
941  yy = y;
+
942  rr = result + i;
+
943  for (j = 0; j < NUM_LIMBS_521BIT; ++j) {
+
944  carry += ((dlimb_t)(*yy++)) * word;
+
945  carry += *rr;
+
946  *rr++ = (limb_t)carry;
+
947  carry >>= LIMB_BITS;
+
948  }
+
949  *rr = (limb_t)carry;
+
950  }
+
951 }
+
952 
+
963 void P521::mul(limb_t *result, const limb_t *x, const limb_t *y)
+
964 {
+
965  limb_t temp[NUM_LIMBS_1042BIT];
+
966  mulNoReduce(temp, x, y);
+
967  reduce(result, temp);
+
968  strict_clean(temp);
+
969 }
+
970 
+
990 void P521::mulLiteral(limb_t *result, const limb_t *x, limb_t y)
+
991 {
+
992  uint8_t index;
+
993  dlimb_t carry = 0;
+
994  const limb_t *xx = x;
+
995  limb_t *rr = result;
+
996 
+
997  // Multiply x by the literal and put it into the result array.
+
998  // We assume that y is small enough that overflow from the
+
999  // highest limb will not occur during this process.
+
1000  for (index = 0; index < NUM_LIMBS_521BIT; ++index) {
+
1001  carry += ((dlimb_t)(*xx++)) * y;
+
1002  *rr++ = (limb_t)carry;
+
1003  carry >>= LIMB_BITS;
+
1004  }
+
1005 
+
1006  // Reduce the value modulo 2^521 - 1. The high half is only a
+
1007  // single limb, so we can short-cut some of reduce() here.
+
1008 #if BIGNUMBER_LIMB_16BIT || BIGNUMBER_LIMB_32BIT
+
1009  limb_t word = result[NUM_LIMBS_521BIT - 1];
+
1010  carry = (word >> 9) + 1;
+
1011  word &= 0x1FF;
+
1012  rr = result;
+
1013  for (index = 0; index < (NUM_LIMBS_521BIT - 1); ++index) {
+
1014  carry += *rr;
+
1015  *rr++ = (limb_t)carry;
+
1016  carry >>= LIMB_BITS;
+
1017  }
+
1018  carry += word;
+
1019  word = (limb_t)carry;
+
1020  *rr = word;
+
1021 
+
1022  // If the carry out was 1, then mask it off and we have the answer.
+
1023  // If the carry out was 0, then we need to add 2^521 - 1 back again.
+
1024  // To preserve the timing we perform a conditional subtract of 1 and
+
1025  // then mask off the high bits.
+
1026  carry = ((word >> 9) ^ 0x01) & 0x01;
+
1027  rr = result;
+
1028  for (index = 0; index < NUM_LIMBS_521BIT; ++index) {
+
1029  carry = ((dlimb_t)(*rr)) - carry;
+
1030  *rr++ = (limb_t)carry;
+
1031  carry = (carry >> LIMB_BITS) & 0x01;
+
1032  }
+
1033  *(--rr) &= 0x1FF;
+
1034 #elif BIGNUMBER_LIMB_8BIT
+
1035  // Same as above, but for 8-bit limbs.
+
1036  limb_t word = result[NUM_LIMBS_521BIT - 1];
+
1037  carry = (word >> 1) + 1;
+
1038  word &= 0x01;
+
1039  rr = result;
+
1040  for (index = 0; index < (NUM_LIMBS_521BIT - 1); ++index) {
+
1041  carry += *rr;
+
1042  *rr++ = (limb_t)carry;
+
1043  carry >>= LIMB_BITS;
+
1044  }
+
1045  carry += word;
+
1046  word = (limb_t)carry;
+
1047  *rr = word;
+
1048  carry = ((word >> 1) ^ 0x01) & 0x01;
+
1049  rr = result;
+
1050  for (index = 0; index < NUM_LIMBS_521BIT; ++index) {
+
1051  carry = ((dlimb_t)(*rr)) - carry;
+
1052  *rr++ = (limb_t)carry;
+
1053  carry = (carry >> LIMB_BITS) & 0x01;
+
1054  }
+
1055  *(--rr) &= 0x01;
+
1056 #endif
+
1057 }
+
1058 
+
1069 void P521::add(limb_t *result, const limb_t *x, const limb_t *y)
+
1070 {
+
1071  dlimb_t carry = 0;
+
1072  limb_t *rr = result;
+
1073  for (uint8_t posn = 0; posn < NUM_LIMBS_521BIT; ++posn) {
+
1074  carry += *x++;
+
1075  carry += *y++;
+
1076  *rr++ = (limb_t)carry;
+
1077  carry >>= LIMB_BITS;
+
1078  }
+
1079  reduceQuick(result);
+
1080 }
+
1081 
+
1092 void P521::sub(limb_t *result, const limb_t *x, const limb_t *y)
+
1093 {
+
1094  dlimb_t borrow;
+
1095  uint8_t posn;
+
1096  limb_t *rr = result;
+
1097 
+
1098  // Subtract y from x to generate the intermediate result.
+
1099  borrow = 0;
+
1100  for (posn = 0; posn < NUM_LIMBS_521BIT; ++posn) {
+
1101  borrow = ((dlimb_t)(*x++)) - (*y++) - ((borrow >> LIMB_BITS) & 0x01);
+
1102  *rr++ = (limb_t)borrow;
+
1103  }
+
1104 
+
1105  // If we had a borrow, then the result has gone negative and we
+
1106  // have to add 2^521 - 1 to the result to make it positive again.
+
1107  // The top bits of "borrow" will be all 1's if there is a borrow
+
1108  // or it will be all 0's if there was no borrow. Easiest is to
+
1109  // conditionally subtract 1 and then mask off the high bits.
+
1110  rr = result;
+
1111  borrow = (borrow >> LIMB_BITS) & 1U;
+
1112  borrow = ((dlimb_t)(*rr)) - borrow;
+
1113  *rr++ = (limb_t)borrow;
+
1114  for (posn = 1; posn < NUM_LIMBS_521BIT; ++posn) {
+
1115  borrow = ((dlimb_t)(*rr)) - ((borrow >> LIMB_BITS) & 0x01);
+
1116  *rr++ = (limb_t)borrow;
+
1117  }
+
1118 #if BIGNUMBER_LIMB_8BIT
+
1119  *(--rr) &= 0x01;
+
1120 #else
+
1121  *(--rr) &= 0x1FF;
+
1122 #endif
+
1123 }
+
1124 
+
1140 void P521::dblPoint(limb_t *xout, limb_t *yout, limb_t *zout,
+
1141  const limb_t *xin, const limb_t *yin,
+
1142  const limb_t *zin)
+
1143 {
+
1144  limb_t alpha[NUM_LIMBS_521BIT];
+
1145  limb_t beta[NUM_LIMBS_521BIT];
+
1146  limb_t gamma[NUM_LIMBS_521BIT];
+
1147  limb_t delta[NUM_LIMBS_521BIT];
+
1148  limb_t tmp[NUM_LIMBS_521BIT];
+
1149 
+
1150  // Double the point. If it is the point at infinity (z = 0),
+
1151  // then zout will still be zero at the end of this process so
+
1152  // we don't need any special handling for that case.
+
1153  square(delta, zin); // delta = z^2
+
1154  square(gamma, yin); // gamma = y^2
+
1155  mul(beta, xin, gamma); // beta = x * gamma
+
1156  sub(tmp, xin, delta); // alpha = 3 * (x - delta) * (x + delta)
+
1157  mulLiteral(alpha, tmp, 3);
+
1158  add(tmp, xin, delta);
+
1159  mul(alpha, alpha, tmp);
+
1160  square(xout, alpha); // xout = alpha^2 - 8 * beta
+
1161  mulLiteral(tmp, beta, 8);
+
1162  sub(xout, xout, tmp);
+
1163  add(zout, yin, zin); // zout = (y + z)^2 - gamma - delta
+
1164  square(zout, zout);
+
1165  sub(zout, zout, gamma);
+
1166  sub(zout, zout, delta);
+
1167  mulLiteral(yout, beta, 4);// yout = alpha * (4 * beta - xout) - 8 * gamma^2
+
1168  sub(yout, yout, xout);
+
1169  mul(yout, alpha, yout);
+
1170  square(gamma, gamma);
+
1171  mulLiteral(gamma, gamma, 8);
+
1172  sub(yout, yout, gamma);
+
1173 
+
1174  // Clean up.
+
1175  strict_clean(alpha);
+
1176  strict_clean(beta);
+
1177  strict_clean(gamma);
+
1178  strict_clean(delta);
+
1179  strict_clean(tmp);
+
1180 }
+
1181 
+
1201 void P521::addPoint(limb_t *xout, limb_t *yout, limb_t *zout,
+
1202  const limb_t *x1, const limb_t *y1,
+
1203  const limb_t *z1, const limb_t *x2,
+
1204  const limb_t *y2)
+
1205 {
+
1206  limb_t z1z1[NUM_LIMBS_521BIT];
+
1207  limb_t u2[NUM_LIMBS_521BIT];
+
1208  limb_t s2[NUM_LIMBS_521BIT];
+
1209  limb_t h[NUM_LIMBS_521BIT];
+
1210  limb_t i[NUM_LIMBS_521BIT];
+
1211  limb_t j[NUM_LIMBS_521BIT];
+
1212  limb_t r[NUM_LIMBS_521BIT];
+
1213  limb_t v[NUM_LIMBS_521BIT];
+
1214 
+
1215  // Determine if the first value is the point-at-infinity identity element.
+
1216  // The second z value is always 1 so it cannot be the point-at-infinity.
+
1217  limb_t p1IsIdentity = BigNumberUtil::isZero(z1, NUM_LIMBS_521BIT);
+
1218 
+
1219  // Multiply the points, assuming that z2 = 1.
+
1220  square(z1z1, z1); // z1z1 = z1^2
+
1221  mul(u2, x2, z1z1); // u2 = x2 * z1z1
+
1222  mul(s2, y2, z1); // s2 = y2 * z1 * z1z1
+
1223  mul(s2, s2, z1z1);
+
1224  sub(h, u2, x1); // h = u2 - x1
+
1225  mulLiteral(i, h, 2); // i = (2 * h)^2
+
1226  square(i, i);
+
1227  sub(r, s2, y1); // r = 2 * (s2 - y1)
+
1228  add(r, r, r);
+
1229  mul(j, h, i); // j = h * i
+
1230  mul(v, x1, i); // v = x1 * i
+
1231  square(xout, r); // xout = r^2 - j - 2 * v
+
1232  sub(xout, xout, j);
+
1233  sub(xout, xout, v);
+
1234  sub(xout, xout, v);
+
1235  sub(yout, v, xout); // yout = r * (v - xout) - 2 * y1 * j
+
1236  mul(yout, r, yout);
+
1237  mul(j, y1, j);
+
1238  sub(yout, yout, j);
+
1239  sub(yout, yout, j);
+
1240  mul(zout, z1, h); // zout = 2 * z1 * h
+
1241  add(zout, zout, zout);
+
1242 
+
1243  // Select the answer to return. If (x1, y1, z1) was the identity,
+
1244  // then the answer is (x2, y2, z2). Otherwise it is (xout, yout, zout).
+
1245  // Conditionally move the second argument over the output if necessary.
+
1246  cmove(p1IsIdentity, xout, x2);
+
1247  cmove(p1IsIdentity, yout, y2);
+
1248  cmove1(p1IsIdentity, zout); // z2 = 1
+
1249 
+
1250  // Clean up.
+
1251  strict_clean(z1z1);
+
1252  strict_clean(u2);
+
1253  strict_clean(s2);
+
1254  strict_clean(h);
+
1255  strict_clean(i);
+
1256  strict_clean(j);
+
1257  strict_clean(r);
+
1258  strict_clean(v);
+
1259 }
+
1260 
+
1273 void P521::cmove(limb_t select, limb_t *x, const limb_t *y)
+
1274 {
+
1275  uint8_t posn;
+
1276  limb_t dummy;
+
1277  limb_t sel;
+
1278 
+
1279  // Turn "select" into an all-zeroes or all-ones mask. We don't care
+
1280  // which bit or bits is set in the original "select" value.
+
1281  sel = (limb_t)(((((dlimb_t)1) << LIMB_BITS) - select) >> LIMB_BITS);
+
1282  --sel;
+
1283 
+
1284  // Move y into x based on "select".
+
1285  for (posn = 0; posn < NUM_LIMBS_521BIT; ++posn) {
+
1286  dummy = sel & (*x ^ *y++);
+
1287  *x++ ^= dummy;
+
1288  }
+
1289 }
+
1290 
+
1302 void P521::cmove1(limb_t select, limb_t *x)
+
1303 {
+
1304  uint8_t posn;
+
1305  limb_t dummy;
+
1306  limb_t sel;
+
1307 
+
1308  // Turn "select" into an all-zeroes or all-ones mask. We don't care
+
1309  // which bit or bits is set in the original "select" value.
+
1310  sel = (limb_t)(((((dlimb_t)1) << LIMB_BITS) - select) >> LIMB_BITS);
+
1311  --sel;
+
1312 
+
1313  // Move 1 into x based on "select".
+
1314  dummy = sel & (*x ^ 1);
+
1315  *x++ ^= dummy;
+
1316  for (posn = 1; posn < NUM_LIMBS_521BIT; ++posn) {
+
1317  dummy = sel & *x;
+
1318  *x++ ^= dummy;
+
1319  }
+
1320 }
+
1321 
+
1330 void P521::recip(limb_t *result, const limb_t *x)
+
1331 {
+
1332  limb_t t1[NUM_LIMBS_521BIT];
+
1333 
+
1334  // The reciprocal is the same as x ^ (p - 2) where p = 2^521 - 1.
+
1335  // The big-endian hexadecimal expansion of (p - 2) is:
+
1336  // 01FF FFFFFFF FFFFFFFF ... FFFFFFFF FFFFFFFD
+
1337  //
+
1338  // The naive implementation needs to do 2 multiplications per 1 bit and
+
1339  // 1 multiplication per 0 bit. We can improve upon this by creating a
+
1340  // pattern 1111 and then shifting and multiplying to create 11111111,
+
1341  // and then 1111111111111111, and so on for the top 512-bits.
+
1342 
+
1343  // Build a 4-bit pattern 1111 in the result.
+
1344  square(result, x);
+
1345  mul(result, result, x);
+
1346  square(result, result);
+
1347  mul(result, result, x);
+
1348  square(result, result);
+
1349  mul(result, result, x);
+
1350 
+
1351  // Shift and multiply by increasing powers of two. This turns
+
1352  // 1111 into 11111111, and then 1111111111111111, and so on.
+
1353  for (size_t power = 4; power <= 256; power <<= 1) {
+
1354  square(t1, result);
+
1355  for (size_t temp = 1; temp < power; ++temp)
+
1356  square(t1, t1);
+
1357  mul(result, result, t1);
+
1358  }
+
1359 
+
1360  // Handle the 9 lowest bits of (p - 2), 111111101, from highest to lowest.
+
1361  for (uint8_t index = 0; index < 7; ++index) {
+
1362  square(result, result);
+
1363  mul(result, result, x);
+
1364  }
+
1365  square(result, result);
+
1366  square(result, result);
+
1367  mul(result, result, x);
+
1368 
+
1369  // Clean up.
+
1370  clean(t1);
+
1371 }
+
1372 
+
1381 void P521::reduceQ(limb_t *result, const limb_t *r)
+
1382 {
+
1383  // Algorithm from: http://en.wikipedia.org/wiki/Barrett_reduction
+
1384  //
+
1385  // We assume that r is less than or equal to (q - 1)^2.
+
1386  //
+
1387  // We want to compute result = r mod q. Find the smallest k such
+
1388  // that 2^k > q. In our case, k = 521. Then set m = floor(4^k / q)
+
1389  // and let r = r - q * floor(m * r / 4^k). This will be the result
+
1390  // or it will be at most one subtraction of q away from the result.
+
1391  //
+
1392  // Note: m is a 522-bit number, which fits in the same number of limbs
+
1393  // as a 521-bit number assuming that limbs are 8 bits or more in size.
+
1394  static limb_t const numM[NUM_LIMBS_521BIT] PROGMEM = {
+
1395  LIMB(0x6EC79BF7), LIMB(0x449048E1), LIMB(0x7663B851), LIMB(0xC44A3647),
+
1396  LIMB(0x08F65A2F), LIMB(0x8033FEB7), LIMB(0x40D06994), LIMB(0xAE79787C),
+
1397  LIMB(0x00000005), LIMB(0x00000000), LIMB(0x00000000), LIMB(0x00000000),
+
1398  LIMB(0x00000000), LIMB(0x00000000), LIMB(0x00000000), LIMB(0x00000000),
+
1399  LIMB_PARTIAL(0x200)
+
1400  };
+
1401  limb_t temp[NUM_LIMBS_1042BIT + NUM_LIMBS_521BIT];
+
1402  limb_t temp2[NUM_LIMBS_521BIT];
+
1403 
+
1404  // Multiply r by m.
+
1405  BigNumberUtil::mul_P(temp, r, NUM_LIMBS_1042BIT, numM, NUM_LIMBS_521BIT);
+
1406 
+
1407  // Compute (m * r / 4^521) = (m * r / 2^1042).
+
1408 #if BIGNUMBER_LIMB_8BIT || BIGNUMBER_LIMB_16BIT
+
1409  dlimb_t carry = temp[NUM_LIMBS_BITS(1040)] >> 2;
+
1410  for (uint8_t index = 0; index < NUM_LIMBS_521BIT; ++index) {
+
1411  carry += ((dlimb_t)(temp[NUM_LIMBS_BITS(1040) + index + 1])) << (LIMB_BITS - 2);
+
1412  temp2[index] = (limb_t)carry;
+
1413  carry >>= LIMB_BITS;
+
1414  }
+
1415 #elif BIGNUMBER_LIMB_32BIT
+
1416  dlimb_t carry = temp[NUM_LIMBS_BITS(1024)] >> 18;
+
1417  for (uint8_t index = 0; index < NUM_LIMBS_521BIT; ++index) {
+
1418  carry += ((dlimb_t)(temp[NUM_LIMBS_BITS(1024) + index + 1])) << 14;
+
1419  temp2[index] = (limb_t)carry;
+
1420  carry >>= LIMB_BITS;
+
1421  }
+
1422 #endif
+
1423 
+
1424  // Multiply (m * r) / 2^1042 by q and subtract it from r.
+
1425  // We can ignore the high words of the subtraction result
+
1426  // because they will all turn into zero after the subtraction.
+
1427  BigNumberUtil::mul_P(temp, temp2, NUM_LIMBS_521BIT,
+
1428  P521_q, NUM_LIMBS_521BIT);
+
1429  BigNumberUtil::sub(result, r, temp, NUM_LIMBS_521BIT);
+
1430 
+
1431  // Perform a trial subtraction of q from the result to reduce it.
+
1432  BigNumberUtil::reduceQuick_P(result, result, P521_q, NUM_LIMBS_521BIT);
+
1433 
+
1434  // Clean up and exit.
+
1435  clean(temp);
+
1436  clean(temp2);
+
1437 }
+
1438 
+
1449 void P521::mulQ(limb_t *result, const limb_t *x, const limb_t *y)
+
1450 {
+
1451  limb_t temp[NUM_LIMBS_1042BIT];
+
1452  mulNoReduce(temp, x, y);
+
1453  reduceQ(result, temp);
+
1454  strict_clean(temp);
+
1455 }
+
1456 
+
1465 void P521::recipQ(limb_t *result, const limb_t *x)
+
1466 {
+
1467  // Bottom 265 bits of q - 2. The top 256 bits are all-1's.
+
1468  static limb_t const P521_q_m2[] PROGMEM = {
+
1469  LIMB(0x91386407), LIMB(0xbb6fb71e), LIMB(0x899c47ae), LIMB(0x3bb5c9b8),
+
1470  LIMB(0xf709a5d0), LIMB(0x7fcc0148), LIMB(0xbf2f966b), LIMB(0x51868783),
+
1471  LIMB_PARTIAL(0x1fa)
+
1472  };
+
1473 
+
1474  // Raise x to the power of q - 2, mod q. We start with the top
+
1475  // 256 bits which are all-1's, using a similar technique to recip().
+
1476  limb_t t1[NUM_LIMBS_521BIT];
+
1477  mulQ(result, x, x);
+
1478  mulQ(result, result, x);
+
1479  mulQ(result, result, result);
+
1480  mulQ(result, result, x);
+
1481  mulQ(result, result, result);
+
1482  mulQ(result, result, x);
+
1483  for (size_t power = 4; power <= 128; power <<= 1) {
+
1484  mulQ(t1, result, result);
+
1485  for (size_t temp = 1; temp < power; ++temp)
+
1486  mulQ(t1, t1, t1);
+
1487  mulQ(result, result, t1);
+
1488  }
+
1489  clean(t1);
+
1490 
+
1491  // Deal with the bottom 265 bits from highest to lowest. Square for
+
1492  // each bit and multiply in x whenever there is a 1 bit. The timing
+
1493  // is based on the publicly-known constant q - 2, not on the value of x.
+
1494  size_t bit = 265;
+
1495  while (bit > 0) {
+
1496  --bit;
+
1497  mulQ(result, result, result);
+
1498  if (pgm_read_limb(&(P521_q_m2[bit / LIMB_BITS])) &
+
1499  (((limb_t)1) << (bit % LIMB_BITS))) {
+
1500  mulQ(result, result, x);
+
1501  }
+
1502  }
+
1503 }
+
1504 
+
1515 void P521::generateK(uint8_t k[66], const uint8_t hm[66],
+
1516  const uint8_t x[66], Hash *hash, uint64_t count)
+
1517 {
+
1518  size_t hlen = hash->hashSize();
+
1519  uint8_t V[64];
+
1520  uint8_t K[64];
+
1521  uint8_t marker;
+
1522 
+
1523  // If for some reason a hash function was supplied with more than
+
1524  // 512 bits of output, truncate hash values to the first 512 bits.
+
1525  // We cannot support more than this yet.
+
1526  if (hlen > 64)
+
1527  hlen = 64;
+
1528 
+
1529  // RFC 6979, Section 3.2, Step a. Hash the message, reduce modulo q,
+
1530  // and produce an octet string the same length as q, bits2octets(H(m)).
+
1531  // We support hashes up to 512 bits and q is a 521-bit number, so "hm"
+
1532  // is already the bits2octets(H(m)) value that we need.
+
1533 
+
1534  // Steps b and c. Set V to all-ones and K to all-zeroes.
+
1535  memset(V, 0x01, hlen);
+
1536  memset(K, 0x00, hlen);
+
1537 
+
1538  // Step d. K = HMAC_K(V || 0x00 || x || hm). We make a small
+
1539  // modification here to append the count value if it is non-zero.
+
1540  // We use this to generate a new k if we have to re-enter this
+
1541  // function because the previous one was rejected by sign().
+
1542  // This is slightly different to RFC 6979 which says that the
+
1543  // loop in step h below should be continued. That code path is
+
1544  // difficult to access, so instead modify K and V in steps d and f.
+
1545  // This alternative construction is compatible with the second
+
1546  // variant described in section 3.6 of RFC 6979.
+
1547  hash->resetHMAC(K, hlen);
+
1548  hash->update(V, hlen);
+
1549  marker = 0x00;
+
1550  hash->update(&marker, 1);
+
1551  hash->update(x, 66);
+
1552  hash->update(hm, 66);
+
1553  if (count)
+
1554  hash->update(&count, sizeof(count));
+
1555  hash->finalizeHMAC(K, hlen, K, hlen);
+
1556 
+
1557  // Step e. V = HMAC_K(V)
+
1558  hash->resetHMAC(K, hlen);
+
1559  hash->update(V, hlen);
+
1560  hash->finalizeHMAC(K, hlen, V, hlen);
+
1561 
+
1562  // Step f. K = HMAC_K(V || 0x01 || x || hm)
+
1563  hash->resetHMAC(K, hlen);
+
1564  hash->update(V, hlen);
+
1565  marker = 0x01;
+
1566  hash->update(&marker, 1);
+
1567  hash->update(x, 66);
+
1568  hash->update(hm, 66);
+
1569  if (count)
+
1570  hash->update(&count, sizeof(count));
+
1571  hash->finalizeHMAC(K, hlen, K, hlen);
+
1572 
+
1573  // Step g. V = HMAC_K(V)
+
1574  hash->resetHMAC(K, hlen);
+
1575  hash->update(V, hlen);
+
1576  hash->finalizeHMAC(K, hlen, V, hlen);
+
1577 
+
1578  // Step h. Generate candidate k values until we find what we want.
+
1579  for (;;) {
+
1580  // Step h.1 and h.2. Generate a string of 66 bytes in length.
+
1581  // T = empty
+
1582  // while (len(T) < 66)
+
1583  // V = HMAC_K(V)
+
1584  // T = T || V
+
1585  size_t posn = 0;
+
1586  while (posn < 66) {
+
1587  size_t temp = 66 - posn;
+
1588  if (temp > hlen)
+
1589  temp = hlen;
+
1590  hash->resetHMAC(K, hlen);
+
1591  hash->update(V, hlen);
+
1592  hash->finalizeHMAC(K, hlen, V, hlen);
+
1593  memcpy(k + posn, V, temp);
+
1594  posn += temp;
+
1595  }
+
1596 
+
1597  // Step h.3. k = bits2int(T) and exit the loop if k is not in
+
1598  // the range 1 to q - 1. Note: We have to extract the 521 most
+
1599  // significant bits of T, which means shifting it right by seven
+
1600  // bits to put it into the correct form.
+
1601  for (posn = 65; posn > 0; --posn)
+
1602  k[posn] = (k[posn - 1] << 1) | (k[posn] >> 7);
+
1603  k[0] >>= 7;
+
1604  if (isValidPrivateKey(k))
+
1605  break;
+
1606 
+
1607  // Generate new K and V values and try again.
+
1608  // K = HMAC_K(V || 0x00)
+
1609  // V = HMAC_K(V)
+
1610  hash->resetHMAC(K, hlen);
+
1611  hash->update(V, hlen);
+
1612  marker = 0x00;
+
1613  hash->update(&marker, 1);
+
1614  hash->finalizeHMAC(K, hlen, K, hlen);
+
1615  hash->resetHMAC(K, hlen);
+
1616  hash->update(V, hlen);
+
1617  hash->finalizeHMAC(K, hlen, V, hlen);
+
1618  }
+
1619 
+
1620  // Clean up.
+
1621  clean(V);
+
1622  clean(K);
+
1623 }
+
1624 
+
1637 void P521::generateK(uint8_t k[66], const uint8_t hm[66],
+
1638  const uint8_t x[66], uint64_t count)
+
1639 {
+
1640  SHA512 hash;
+
1641  generateK(k, hm, x, &hash, count);
+
1642 }
+
static void reduceQuick_P(limb_t *result, const limb_t *x, const limb_t *y, size_t size)
Reduces x modulo y using subtraction where y is in program memory.
+
static bool eval(uint8_t result[132], const uint8_t f[66], const uint8_t point[132])
Evaluates the curve function.
Definition: P521.cpp:136
+
static limb_t add(limb_t *result, const limb_t *x, const limb_t *y, size_t size)
Adds two big numbers.
+
static void generatePrivateKey(uint8_t privateKey[66])
Generates a private key for P-521 signing operations.
Definition: P521.cpp:467
+
static limb_t sub_P(limb_t *result, const limb_t *x, const limb_t *y, size_t size)
Subtracts one big number from another where one is in program memory.
+
void rand(uint8_t *data, size_t len)
Generates random bytes into a caller-supplied buffer.
Definition: RNG.cpp:508
+
static bool dh2(const uint8_t k[132], uint8_t f[66])
Performs phase 2 of an ECDH key exchange using P-521.
Definition: P521.cpp:230
+
Abstract base class for cryptographic hash algorithms.
Definition: Hash.h:29
+
virtual void finalizeHMAC(const void *key, size_t keyLen, void *hash, size_t hashLen)=0
Finalizes the HMAC hashing process and returns the hash.
+
static bool isValidPrivateKey(const uint8_t privateKey[66])
Validates a private key value to ensure that it is between 1 and q - 1.
Definition: P521.cpp:525
+
SHA-512 hash algorithm.
Definition: SHA512.h:30
+
static void derivePublicKey(uint8_t publicKey[132], const uint8_t privateKey[66])
Derives the public key from a private key for P-521 signing operations.
Definition: P521.cpp:498
+
static void sign(uint8_t signature[132], const uint8_t privateKey[66], const void *message, size_t len, Hash *hash=0)
Signs a message using a specific P-521 private key.
Definition: P521.cpp:277
+
static limb_t sub(limb_t *result, const limb_t *x, const limb_t *y, size_t size)
Subtracts one big number from another.
+
virtual void reset()=0
Resets the hash ready for a new hashing process.
+
static void dh1(uint8_t k[132], uint8_t f[66])
Performs phase 1 of an ECDH key exchange using P-521.
Definition: P521.cpp:209
+
static void mul_P(limb_t *result, const limb_t *x, size_t xcount, const limb_t *y, size_t ycount)
Multiplies two big numbers where one is in program memory.
+
static void packBE(uint8_t *bytes, size_t len, const limb_t *limbs, size_t count)
Packs the big-endian byte representation of a big number into a byte array.
+
virtual void resetHMAC(const void *key, size_t keyLen)=0
Resets the hash ready for a new HMAC hashing process.
+
static bool verify(const uint8_t signature[132], const uint8_t publicKey[132], const void *message, size_t len, Hash *hash=0)
Verifies a signature using a specific P-521 public key.
Definition: P521.cpp:374
+
static bool isValidPublicKey(const uint8_t publicKey[132])
Validates a public key to ensure that it is a valid curve point.
Definition: P521.cpp:565
+
static void unpackBE(limb_t *limbs, size_t count, const uint8_t *bytes, size_t len)
Unpacks the big-endian byte representation of a big number into a limb array.
+
virtual size_t hashSize() const =0
Size of the hash result from finalize().
+
virtual void update(const void *data, size_t len)=0
Updates the hash with more data.
+
virtual void finalize(void *hash, size_t len)=0
Finalizes the hashing process and returns the hash.
+
static limb_t isZero(const limb_t *x, size_t size)
Determine if a big number is zero.
+
+ + + + diff --git a/P521_8h_source.html b/P521_8h_source.html new file mode 100644 index 00000000..325e5121 --- /dev/null +++ b/P521_8h_source.html @@ -0,0 +1,223 @@ + + + + + + +ArduinoLibs: P521.h Source File + + + + + + + + + +
+
+ + + + + + +
+
ArduinoLibs +
+
+
+ + + + + + + + + +
+ +
+ + +
+
+
+
P521.h
+
+
+
1 /*
+
2  * Copyright (C) 2016 Southern Storm Software, Pty Ltd.
+
3  *
+
4  * Permission is hereby granted, free of charge, to any person obtaining a
+
5  * copy of this software and associated documentation files (the "Software"),
+
6  * to deal in the Software without restriction, including without limitation
+
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+
8  * and/or sell copies of the Software, and to permit persons to whom the
+
9  * Software is furnished to do so, subject to the following conditions:
+
10  *
+
11  * The above copyright notice and this permission notice shall be included
+
12  * in all copies or substantial portions of the Software.
+
13  *
+
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+
15  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+
16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+
17  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+
18  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+
19  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+
20  * DEALINGS IN THE SOFTWARE.
+
21  */
+
22 
+
23 #ifndef CRYPTO_P521_h
+
24 #define CRYPTO_P521_h
+
25 
+
26 #include "BigNumberUtil.h"
+
27 
+
28 class Hash;
+
29 
+
30 class P521
+
31 {
+
32 public:
+
33 
+
34  static bool eval(uint8_t result[132], const uint8_t f[66], const uint8_t point[132]);
+
35 
+
36  static void dh1(uint8_t k[132], uint8_t f[66]);
+
37  static bool dh2(const uint8_t k[132], uint8_t f[66]);
+
38 
+
39  static void sign(uint8_t signature[132], const uint8_t privateKey[66],
+
40  const void *message, size_t len, Hash *hash = 0);
+
41  static bool verify(const uint8_t signature[132],
+
42  const uint8_t publicKey[132],
+
43  const void *message, size_t len, Hash *hash = 0);
+
44 
+
45  static void generatePrivateKey(uint8_t privateKey[66]);
+
46  static void derivePublicKey(uint8_t publicKey[132], const uint8_t privateKey[66]);
+
47 
+
48  static bool isValidPrivateKey(const uint8_t privateKey[66]);
+
49  static bool isValidPublicKey(const uint8_t publicKey[132]);
+
50 
+
51  static bool isValidCurvePoint(const uint8_t point[132])
+
52  {
+
53  return isValidPublicKey(point);
+
54  }
+
55 
+
56 #if defined(TEST_P521_FIELD_OPS)
+
57 public:
+
58 #else
+
59 private:
+
60 #endif
+
61  static void evaluate(limb_t *x, limb_t *y, const uint8_t f[66]);
+
62 
+
63  static void addAffine(limb_t *x1, limb_t *y1,
+
64  const limb_t *x2, const limb_t *y2);
+
65 
+
66  static bool validate(const limb_t *x, const limb_t *y);
+
67  static bool inRange(const limb_t *x);
+
68 
+
69  static void reduce(limb_t *result, const limb_t *x);
+
70  static void reduceQuick(limb_t *x);
+
71 
+
72  static void mulNoReduce(limb_t *result, const limb_t *x, const limb_t *y);
+
73 
+
74  static void mul(limb_t *result, const limb_t *x, const limb_t *y);
+
75  static void square(limb_t *result, const limb_t *x)
+
76  {
+
77  mul(result, x, x);
+
78  }
+
79 
+
80  static void mulLiteral(limb_t *result, const limb_t *x, limb_t y);
+
81 
+
82  static void add(limb_t *result, const limb_t *x, const limb_t *y);
+
83  static void sub(limb_t *result, const limb_t *x, const limb_t *y);
+
84 
+
85  static void dblPoint(limb_t *xout, limb_t *yout, limb_t *zout,
+
86  const limb_t *xin, const limb_t *yin,
+
87  const limb_t *zin);
+
88  static void addPoint(limb_t *xout, limb_t *yout, limb_t *zout,
+
89  const limb_t *x1, const limb_t *y1,
+
90  const limb_t *z1, const limb_t *x2,
+
91  const limb_t *y2);
+
92 
+
93  static void cmove(limb_t select, limb_t *x, const limb_t *y);
+
94  static void cmove1(limb_t select, limb_t *x);
+
95 
+
96  static void recip(limb_t *result, const limb_t *x);
+
97 
+
98  static void reduceQ(limb_t *result, const limb_t *r);
+
99  static void mulQ(limb_t *result, const limb_t *x, const limb_t *y);
+
100  static void recipQ(limb_t *result, const limb_t *x);
+
101 
+
102  static void generateK(uint8_t k[66], const uint8_t hm[66],
+
103  const uint8_t x[66], Hash *hash, uint64_t count);
+
104  static void generateK(uint8_t k[66], const uint8_t hm[66],
+
105  const uint8_t x[66], uint64_t count);
+
106 
+
107  // Constructor and destructor are private - cannot instantiate this class.
+
108  P521() {}
+
109  ~P521() {}
+
110 };
+
111 
+
112 #endif
+
static bool eval(uint8_t result[132], const uint8_t f[66], const uint8_t point[132])
Evaluates the curve function.
Definition: P521.cpp:136
+
Elliptic curve operations with the NIST P-521 curve.
Definition: P521.h:30
+
static void generatePrivateKey(uint8_t privateKey[66])
Generates a private key for P-521 signing operations.
Definition: P521.cpp:467
+
static bool dh2(const uint8_t k[132], uint8_t f[66])
Performs phase 2 of an ECDH key exchange using P-521.
Definition: P521.cpp:230
+
Abstract base class for cryptographic hash algorithms.
Definition: Hash.h:29
+
static bool isValidPrivateKey(const uint8_t privateKey[66])
Validates a private key value to ensure that it is between 1 and q - 1.
Definition: P521.cpp:525
+
static void derivePublicKey(uint8_t publicKey[132], const uint8_t privateKey[66])
Derives the public key from a private key for P-521 signing operations.
Definition: P521.cpp:498
+
static void sign(uint8_t signature[132], const uint8_t privateKey[66], const void *message, size_t len, Hash *hash=0)
Signs a message using a specific P-521 private key.
Definition: P521.cpp:277
+
static void dh1(uint8_t k[132], uint8_t f[66])
Performs phase 1 of an ECDH key exchange using P-521.
Definition: P521.cpp:209
+
static bool verify(const uint8_t signature[132], const uint8_t publicKey[132], const void *message, size_t len, Hash *hash=0)
Verifies a signature using a specific P-521 public key.
Definition: P521.cpp:374
+
static bool isValidPublicKey(const uint8_t publicKey[132])
Validates a public key to ensure that it is a valid curve point.
Definition: P521.cpp:565
+
static bool isValidCurvePoint(const uint8_t point[132])
Validates a point to ensure that it is on the curve.
Definition: P521.h:51
+
+ + + + diff --git a/Poly1305_8cpp_source.html b/Poly1305_8cpp_source.html index 3c4bf0cf..a8ae9059 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 fabac036..5ea949bb 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 7515b29e..e62aebc0 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 56eb7607..b66e7f1c 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 b59c23b0..866a06ca 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 74ac6806..b6e95ae0 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 dc299866..e6185fe1 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 e2336711..7a0b79c3 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 3ea6b832..4b9d8ca0 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 4477401e..20576949 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 5eec576d..5acbaea8 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 3bacbcb0..539d5efb 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 06d4df22..252cff06 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 8c3973ae..12e51cdc 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 5e170bb9..19742da1 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 0ecb20f3..4e5931e6 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 87e580b9..4c069fdc 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/SHAKE_8cpp_source.html b/SHAKE_8cpp_source.html index 9f0bc4d9..86b44faa 100644 --- a/SHAKE_8cpp_source.html +++ b/SHAKE_8cpp_source.html @@ -192,7 +192,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/SHAKE_8h_source.html b/SHAKE_8h_source.html index f28fb65d..cb58192b 100644 --- a/SHAKE_8h_source.html +++ b/SHAKE_8h_source.html @@ -174,7 +174,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Shell_8cpp_source.html b/Shell_8cpp_source.html index f7648e41..ec5b8d52 100644 --- a/Shell_8cpp_source.html +++ b/Shell_8cpp_source.html @@ -848,7 +848,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Shell_8h_source.html b/Shell_8h_source.html index f2af49ef..96767eb3 100644 --- a/Shell_8h_source.html +++ b/Shell_8h_source.html @@ -273,7 +273,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/SoftI2C_8cpp_source.html b/SoftI2C_8cpp_source.html index 47bcab34..f4a84c25 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 c06f016a..08f1ab8a 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 bf3c6fc0..a24217a4 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 5bbcff3f..1f52ca2f 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 00733179..ff8f32dc 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 615db242..2852f700 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 b76ccbc0..56c85db7 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 3471df0a..c860fb54 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/TelnetDefs_8h_source.html b/TelnetDefs_8h_source.html index cc852c43..5a3faa41 100644 --- a/TelnetDefs_8h_source.html +++ b/TelnetDefs_8h_source.html @@ -205,7 +205,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Terminal_8cpp_source.html b/Terminal_8cpp_source.html index 06dcb904..ad0f388c 100644 --- a/Terminal_8cpp_source.html +++ b/Terminal_8cpp_source.html @@ -1037,7 +1037,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Terminal_8h_source.html b/Terminal_8h_source.html index 7e290dca..b5095d42 100644 --- a/Terminal_8h_source.html +++ b/Terminal_8h_source.html @@ -299,7 +299,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/TextField_8cpp_source.html b/TextField_8cpp_source.html index 0b372f4a..db03d150 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 b8e38dac..fc56483f 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 6dd1a3c1..1d10bddb 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 fa7f68db..b2c653e7 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 cf1424a5..2f1daea4 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 e00b07f4..ce2e2274 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/USBKeysExtra_8h_source.html b/USBKeysExtra_8h_source.html index 78f12b32..9ea5ed30 100644 --- a/USBKeysExtra_8h_source.html +++ b/USBKeysExtra_8h_source.html @@ -215,7 +215,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/XOF_8cpp_source.html b/XOF_8cpp_source.html index 6dd29280..db4a495c 100644 --- a/XOF_8cpp_source.html +++ b/XOF_8cpp_source.html @@ -125,7 +125,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/XOF_8h_source.html b/XOF_8h_source.html index 1215f761..913ec891 100644 --- a/XOF_8h_source.html +++ b/XOF_8h_source.html @@ -152,7 +152,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/XTS_8cpp_source.html b/XTS_8cpp_source.html index d8c1aee1..c75d153a 100644 --- a/XTS_8cpp_source.html +++ b/XTS_8cpp_source.html @@ -290,7 +290,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/XTS_8h_source.html b/XTS_8h_source.html index db2dfe7c..34a9f80d 100644 --- a/XTS_8h_source.html +++ b/XTS_8h_source.html @@ -217,7 +217,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/alarm-clock_8dox.html b/alarm-clock_8dox.html index 898ec337..cc6b215b 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 ca677166..c78357e9 100644 --- a/alarm_clock.html +++ b/alarm_clock.html @@ -140,7 +140,7 @@ Completed Clock diff --git a/annotated.html b/annotated.html index a79ee56d..010f4d0e 100644 --- a/annotated.html +++ b/annotated.html @@ -140,41 +140,42 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); oCOFBImplementation of the Output Feedback (OFB) mode for 128-bit block ciphers oCOFBCommonConcrete base class to assist with implementing OFB for 128-bit block ciphers oCOMACImplementation of the OMAC message authenticator -oCPoly1305Poly1305 message authenticator -oCRingOscillatorNoiseSourceProcesses the signal from a ring oscillator based noise source -oCRNGClassPseudo random number generator suitable for cryptography -oCRTCBase class for realtime clock handlers -oCRTCAlarmStores alarm information from a realtime clock chip -oCRTCDateStores date information from a realtime clock chip -oCRTCTimeStores time information from a realtime clock chip -oCSHA256SHA-256 hash algorithm -oCSHA3_256SHA3-256 hash algorithm -oCSHA3_512SHA3-512 hash algorithm -oCSHA512SHA-512 hash algorithm -oCSHAKEAbstract base class for the SHAKE Extendable-Output Functions (XOFs) -oCSHAKE128SHAKE Extendable-Output Function (XOF) with 128-bit security -oCSHAKE256SHAKE Extendable-Output Function (XOF) with 256-bit security -oCShellCommand-line shell access -oCShellArgumentsConvenience class that encapsulates an array of shell command arguments -oCSoftI2CBit-banged implementation of an I2C master -oCSpeckSpeck block cipher with a 128-bit block size -oCSpeckSmallSpeck block cipher with a 128-bit block size (small-memory version) -oCSpeckTinySpeck block cipher with a 128-bit block size (tiny-memory version) -oCTerminalExtended stream interface for terminal operations -oCTextFieldField that displays a read-only text value -oCTimeFieldField that manages the display and editing of a time value -oCTransistorNoiseSourceProcesses the signal from a transistor-based noise source -oCXOFAbstract base class for Extendable-Output Functions (XOFs) -oCXTSImplementation of the XTS mode for 128-bit block ciphers -oCXTSCommonConcrete base class to assist with implementing XTS mode for 128-bit block ciphers -oCXTSSingleKeyImplementation of the single-key XTS mode for 128-bit block ciphers -\CXTSSingleKeyCommonConcrete base class to assist with implementing single-key XTS mode for 128-bit block ciphers +oCP521Elliptic curve operations with the NIST P-521 curve +oCPoly1305Poly1305 message authenticator +oCRingOscillatorNoiseSourceProcesses the signal from a ring oscillator based noise source +oCRNGClassPseudo random number generator suitable for cryptography +oCRTCBase class for realtime clock handlers +oCRTCAlarmStores alarm information from a realtime clock chip +oCRTCDateStores date information from a realtime clock chip +oCRTCTimeStores time information from a realtime clock chip +oCSHA256SHA-256 hash algorithm +oCSHA3_256SHA3-256 hash algorithm +oCSHA3_512SHA3-512 hash algorithm +oCSHA512SHA-512 hash algorithm +oCSHAKEAbstract base class for the SHAKE Extendable-Output Functions (XOFs) +oCSHAKE128SHAKE Extendable-Output Function (XOF) with 128-bit security +oCSHAKE256SHAKE Extendable-Output Function (XOF) with 256-bit security +oCShellCommand-line shell access +oCShellArgumentsConvenience class that encapsulates an array of shell command arguments +oCSoftI2CBit-banged implementation of an I2C master +oCSpeckSpeck block cipher with a 128-bit block size +oCSpeckSmallSpeck block cipher with a 128-bit block size (small-memory version) +oCSpeckTinySpeck block cipher with a 128-bit block size (tiny-memory version) +oCTerminalExtended stream interface for terminal operations +oCTextFieldField that displays a read-only text value +oCTimeFieldField that manages the display and editing of a time value +oCTransistorNoiseSourceProcesses the signal from a transistor-based noise source +oCXOFAbstract base class for Extendable-Output Functions (XOFs) +oCXTSImplementation of the XTS mode for 128-bit block ciphers +oCXTSCommonConcrete base class to assist with implementing XTS mode for 128-bit block ciphers +oCXTSSingleKeyImplementation of the single-key XTS mode for 128-bit block ciphers +\CXTSSingleKeyCommonConcrete base class to assist with implementing single-key XTS mode for 128-bit block ciphers diff --git a/blink-blink_8dox.html b/blink-blink_8dox.html index 05b2bf89..ff6a218c 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 213326a7..986813d0 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 85eac688..77ac1bb0 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 eab3bb92..6d6224fc 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 fab855a4..a867e848 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 6f55d6b2..751a1721 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 6f44f4ae..1f8999e8 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 32a2d75a..570c4a78 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 3a0c964b..8aae3c47 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 b953491c..83c6ad29 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 bb26c4a1..5e46bb31 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 fe3c8026..3a30b3fe 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 75520813..94ba73cc 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 885b0448..c200c0ca 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 18bbf5d7..6fc603bc 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 1667b4f5..cec199ed 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 5a90f83b..d0283c14 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 1604b88a..8bd77f1e 100644 --- a/classAuthenticatedCipher.html +++ b/classAuthenticatedCipher.html @@ -351,7 +351,7 @@ virtual  diff --git a/classBLAKE2b-members.html b/classBLAKE2b-members.html index ab5275eb..2d1355ab 100644 --- a/classBLAKE2b-members.html +++ b/classBLAKE2b-members.html @@ -113,7 +113,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classBLAKE2b.html b/classBLAKE2b.html index abf4e82c..eb2bf8e0 100644 --- a/classBLAKE2b.html +++ b/classBLAKE2b.html @@ -600,7 +600,7 @@ Additional Inherited Members diff --git a/classBLAKE2s-members.html b/classBLAKE2s-members.html index 41063e57..d60ceb04 100644 --- a/classBLAKE2s-members.html +++ b/classBLAKE2s-members.html @@ -112,7 +112,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classBLAKE2s.html b/classBLAKE2s.html index 80560e84..0531bbba 100644 --- a/classBLAKE2s.html +++ b/classBLAKE2s.html @@ -600,7 +600,7 @@ Additional Inherited Members diff --git a/classBigNumberUtil-members.html b/classBigNumberUtil-members.html index f4216529..f8f03763 100644 --- a/classBigNumberUtil-members.html +++ b/classBigNumberUtil-members.html @@ -92,20 +92,21 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); - - - - - - - - - - + + + + + + + + + + +
add(limb_t *result, const limb_t *x, const limb_t *y, size_t size)BigNumberUtilstatic
add_P(limb_t *result, const limb_t *x, const limb_t *y, size_t size)BigNumberUtilstatic
mul(limb_t *result, const limb_t *x, size_t xcount, const limb_t *y, size_t ycount)BigNumberUtilstatic
mul_P(limb_t *result, const limb_t *x, size_t xcount, const limb_t *y, size_t ycount)BigNumberUtilstatic
packBE(uint8_t *bytes, size_t len, const limb_t *limbs, size_t count)BigNumberUtilstatic
packLE(uint8_t *bytes, size_t len, const limb_t *limbs, size_t count)BigNumberUtilstatic
reduceQuick(limb_t *result, const limb_t *x, const limb_t *y, size_t size)BigNumberUtilstatic
reduceQuick_P(limb_t *result, const limb_t *x, const limb_t *y, size_t size)BigNumberUtilstatic
sub(limb_t *result, const limb_t *x, const limb_t *y, size_t size)BigNumberUtilstatic
sub_P(limb_t *result, const limb_t *x, const limb_t *y, size_t size)BigNumberUtilstatic
unpackBE(limb_t *limbs, size_t count, const uint8_t *bytes, size_t len)BigNumberUtilstatic
unpackLE(limb_t *limbs, size_t count, const uint8_t *bytes, size_t len)BigNumberUtilstatic
isZero(const limb_t *x, size_t size)BigNumberUtilstatic
mul(limb_t *result, const limb_t *x, size_t xcount, const limb_t *y, size_t ycount)BigNumberUtilstatic
mul_P(limb_t *result, const limb_t *x, size_t xcount, const limb_t *y, size_t ycount)BigNumberUtilstatic
packBE(uint8_t *bytes, size_t len, const limb_t *limbs, size_t count)BigNumberUtilstatic
packLE(uint8_t *bytes, size_t len, const limb_t *limbs, size_t count)BigNumberUtilstatic
reduceQuick(limb_t *result, const limb_t *x, const limb_t *y, size_t size)BigNumberUtilstatic
reduceQuick_P(limb_t *result, const limb_t *x, const limb_t *y, size_t size)BigNumberUtilstatic
sub(limb_t *result, const limb_t *x, const limb_t *y, size_t size)BigNumberUtilstatic
sub_P(limb_t *result, const limb_t *x, const limb_t *y, size_t size)BigNumberUtilstatic
unpackBE(limb_t *limbs, size_t count, const uint8_t *bytes, size_t len)BigNumberUtilstatic
unpackLE(limb_t *limbs, size_t count, const uint8_t *bytes, size_t len)BigNumberUtilstatic
diff --git a/classBigNumberUtil.html b/classBigNumberUtil.html index 21b5a558..17da9b1c 100644 --- a/classBigNumberUtil.html +++ b/classBigNumberUtil.html @@ -134,6 +134,9 @@ Static Public Member Functions static void reduceQuick_P (limb_t *result, const limb_t *x, const limb_t *y, size_t size)  Reduces x modulo y using subtraction where y is in program memory. More...
  +static limb_t isZero (const limb_t *x, size_t size) + Determine if a big number is zero. More...

Detailed Description

Utilities to assist with implementing big number arithmetic.

@@ -262,6 +265,53 @@ Static Public Member Functions

Definition at line 514 of file BigNumberUtil.cpp.

+
+ + +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
limb_t BigNumberUtil::isZero (const limb_t * x,
size_t size 
)
+
+static
+
+ +

Determine if a big number is zero.

+
Parameters
+ + + +
xPoints to the number to test.
sizeThe number of limbs in x.
+
+
+
Returns
Returns 1 if x is zero or 0 otherwise.
+

This function attempts to make the determination in constant time.

+ +

Definition at line 647 of file BigNumberUtil.cpp.

+
@@ -893,7 +943,7 @@ Static Public Member Functions diff --git a/classBitmap-members.html b/classBitmap-members.html index 60173648..5b3bdcb6 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 b9bac106..e7837a65 100644 --- a/classBitmap.html +++ b/classBitmap.html @@ -1745,7 +1745,7 @@ class DMD diff --git a/classBlinkLED-members.html b/classBlinkLED-members.html index 94ffae55..e065b4bf 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 dbcc2115..eee03b96 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 cb25905d..9b243f1d 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 c5398a36..afb03ae1 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 d93e9524..7ee24a98 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 a2d5c5fb..49092d6e 100644 --- a/classBoolField.html +++ b/classBoolField.html @@ -506,7 +506,7 @@ LiquidCrystal *  diff --git a/classCBC-members.html b/classCBC-members.html index 44d7f715..dad064de 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 a2cd5aef..156546f9 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 481967df..07908507 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 d9bcf3ba..cde88453 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 81122d12..65dd68cd 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 2436974f..5ba50165 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 fd5489c8..d9c0641e 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 0b925b04..fd2c8ceb 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 9252ca69..7a68aebe 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 538fdb35..46c7698b 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 091f6750..af0a9afc 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 7b96d6f7..602a7877 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 bf88f010..0423ea62 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 e9cb4392..e1a537f0 100644 --- a/classChaCha.html +++ b/classChaCha.html @@ -673,7 +673,7 @@ class ChaChaPoly< diff --git a/classChaChaPoly-members.html b/classChaChaPoly-members.html index 3454ec44..28c9f6dd 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 838b8c40..7f906bea 100644 --- a/classChaChaPoly.html +++ b/classChaChaPoly.html @@ -665,7 +665,7 @@ virtual  diff --git a/classCharlieplex-members.html b/classCharlieplex-members.html index b2f4ee49..5264003e 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 f375068b..fd1d76a0 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 c0a090a3..cd8035ab 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 11d8dc55..a9d6221f 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 ee99ae5d..9b3c5113 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 24b12bbf..d0e09851 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 6ac4d011..5cfc7d50 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 f75790ff..889ada79 100644 --- a/classCurve25519.html +++ b/classCurve25519.html @@ -303,7 +303,7 @@ class Ed25519 diff --git a/classDMD-members.html b/classDMD-members.html index 3d5105e3..7acd3353 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 f839ccf2..32a8d978 100644 --- a/classDMD.html +++ b/classDMD.html @@ -755,7 +755,7 @@ Multiple panels diff --git a/classDS1307RTC-members.html b/classDS1307RTC-members.html index a798f09e..bc6d5957 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 ea811f45..7d6fb3e2 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 46069603..a218a4b8 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 511bfe95..44f7b39f 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 d7646fe3..0dd2ebb5 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 dcc8e773..bd63654b 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 027563da..88019c1b 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 d5d6c262..3a776f76 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 42e93094..e043ede8 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 19563807..b7c6ba8d 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 cf7b7c7a..7a95fa4e 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 01c00eaf..55993a3b 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 d4c74bbd..84bc37f8 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 56311368..9945a2ff 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 00d56a57..c01fdf92 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 c8339955..93b7cb6a 100644 --- a/classField.html +++ b/classField.html @@ -424,7 +424,7 @@ class Form diff --git a/classForm-members.html b/classForm-members.html index ec361e16..70e4c39e 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 9e67db18..6ecbf436 100644 --- a/classForm.html +++ b/classForm.html @@ -485,7 +485,7 @@ class Field diff --git a/classGCM-members.html b/classGCM-members.html index 10eb14b4..83389761 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 661199da..a2e7f8a9 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 fb04d64e..c60c0397 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 8d6c6bf8..082f98fe 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 99cf5022..7a36decf 100644 --- a/classGF128-members.html +++ b/classGF128-members.html @@ -98,7 +98,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classGF128.html b/classGF128.html index 1dcfe93e..987db9c7 100644 --- a/classGF128.html +++ b/classGF128.html @@ -334,7 +334,7 @@ Static Public Member Functions diff --git a/classGHASH-members.html b/classGHASH-members.html index 43166f6a..7e4b4b55 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 400c9a06..eb043402 100644 --- a/classGHASH.html +++ b/classGHASH.html @@ -265,7 +265,7 @@ void  diff --git a/classHash-members.html b/classHash-members.html index 663181ce..30d229b2 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 86f7ae1b..4fb18434 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 b729ca8c..b7dea458 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 e2b34c33..d20af435 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 4c3b7f61..6bcdcfc1 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 9fe9e66c..d05f3b3c 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 aaebe8bc..b7718022 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 1a25eb4c..2e055721 100644 --- a/classIntField.html +++ b/classIntField.html @@ -647,7 +647,7 @@ LiquidCrystal *  diff --git a/classKeccakCore-members.html b/classKeccakCore-members.html index 624c472e..6b1a6d42 100644 --- a/classKeccakCore-members.html +++ b/classKeccakCore-members.html @@ -108,7 +108,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classKeccakCore.html b/classKeccakCore.html index 3d5ff17a..b9585a31 100644 --- a/classKeccakCore.html +++ b/classKeccakCore.html @@ -475,7 +475,7 @@ void  diff --git a/classLCD-members.html b/classLCD-members.html index 1eb90768..510110e9 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 2ebe4f55..796c9090 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 98491943..e1cc7841 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 839a23bd..c619363a 100644 --- a/classListField.html +++ b/classListField.html @@ -411,7 +411,7 @@ LiquidCrystal *  diff --git a/classLoginShell-members.html b/classLoginShell-members.html index 39a07a2f..02796f95 100644 --- a/classLoginShell-members.html +++ b/classLoginShell-members.html @@ -180,7 +180,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classLoginShell.html b/classLoginShell.html index 9fe25fcd..f7352c0a 100644 --- a/classLoginShell.html +++ b/classLoginShell.html @@ -572,7 +572,7 @@ Additional Inherited Members diff --git a/classMelody-members.html b/classMelody-members.html index fd3ee331..fe67eb64 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 46a51bcb..542e7a9c 100644 --- a/classMelody.html +++ b/classMelody.html @@ -371,7 +371,7 @@ bool  diff --git a/classNoiseSource-members.html b/classNoiseSource-members.html index da9dfdb9..35e43f94 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 e92bfe98..2a866b4f 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 66f49cd7..74c5c62d 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 bfa04aa6..83164122 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 d26ccf65..87bdbf61 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 0459e03d..f50c7fb8 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 9edd3183..0e26ff88 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 b751aeaa..96fd3c48 100644 --- a/classOMAC.html +++ b/classOMAC.html @@ -387,7 +387,7 @@ void  diff --git a/classP521-members.html b/classP521-members.html new file mode 100644 index 00000000..3f369212 --- /dev/null +++ b/classP521-members.html @@ -0,0 +1,111 @@ + + + + + + +ArduinoLibs: Member List + + + + + + + + + +
+
+ + + + + + +
+
ArduinoLibs +
+
+
+ + + + + + + + + +
+ +
+ +
+
+
+
P521 Member List
+
+
+ +

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

+ + + + + + + + + + + +
derivePublicKey(uint8_t publicKey[132], const uint8_t privateKey[66])P521static
dh1(uint8_t k[132], uint8_t f[66])P521static
dh2(const uint8_t k[132], uint8_t f[66])P521static
eval(uint8_t result[132], const uint8_t f[66], const uint8_t point[132])P521static
generatePrivateKey(uint8_t privateKey[66])P521static
isValidCurvePoint(const uint8_t point[132])P521inlinestatic
isValidPrivateKey(const uint8_t privateKey[66])P521static
isValidPublicKey(const uint8_t publicKey[132])P521static
sign(uint8_t signature[132], const uint8_t privateKey[66], const void *message, size_t len, Hash *hash=0)P521static
verify(const uint8_t signature[132], const uint8_t publicKey[132], const void *message, size_t len, Hash *hash=0)P521static
+ + + + diff --git a/classP521.html b/classP521.html new file mode 100644 index 00000000..f5f111bd --- /dev/null +++ b/classP521.html @@ -0,0 +1,654 @@ + + + + + + +ArduinoLibs: P521 Class Reference + + + + + + + + + +
+
+ + + + + + +
+
ArduinoLibs +
+
+
+ + + + + + + + + +
+ +
+ +
+
+ +
+
P521 Class Reference
+
+
+ +

Elliptic curve operations with the NIST P-521 curve. + More...

+ +

#include <P521.h>

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Static Public Member Functions

static bool eval (uint8_t result[132], const uint8_t f[66], const uint8_t point[132])
 Evaluates the curve function. More...
 
static void dh1 (uint8_t k[132], uint8_t f[66])
 Performs phase 1 of an ECDH key exchange using P-521. More...
 
static bool dh2 (const uint8_t k[132], uint8_t f[66])
 Performs phase 2 of an ECDH key exchange using P-521. More...
 
static void sign (uint8_t signature[132], const uint8_t privateKey[66], const void *message, size_t len, Hash *hash=0)
 Signs a message using a specific P-521 private key. More...
 
static bool verify (const uint8_t signature[132], const uint8_t publicKey[132], const void *message, size_t len, Hash *hash=0)
 Verifies a signature using a specific P-521 public key. More...
 
static void generatePrivateKey (uint8_t privateKey[66])
 Generates a private key for P-521 signing operations. More...
 
static void derivePublicKey (uint8_t publicKey[132], const uint8_t privateKey[66])
 Derives the public key from a private key for P-521 signing operations. More...
 
static bool isValidPrivateKey (const uint8_t privateKey[66])
 Validates a private key value to ensure that it is between 1 and q - 1. More...
 
static bool isValidPublicKey (const uint8_t publicKey[132])
 Validates a public key to ensure that it is a valid curve point. More...
 
static bool isValidCurvePoint (const uint8_t point[132])
 Validates a point to ensure that it is on the curve. More...
 
+

Detailed Description

+

Elliptic curve operations with the NIST P-521 curve.

+

This class supports both ECDH key exchange and ECDSA signatures.

+
Note
The public functions in this class need a substantial amount of stack space to store intermediate results while the curve function is being evaluated. About 2k of free stack space is recommended for safety.
+

References: NIST FIPS 186-4, RFC 6090, RFC 6979, RFC 5903

+
See Also
Curve25519
+ +

Definition at line 30 of file P521.h.

+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void P521::derivePublicKey (uint8_t publicKey[132],
const uint8_t privateKey[66] 
)
+
+static
+
+ +

Derives the public key from a private key for P-521 signing operations.

+
Parameters
+ + + +
publicKeyThe public key.
privateKeyThe private key, which is assumed to have been created by generatePrivateKey().
+
+
+
See Also
generatePrivateKey(), verify()
+ +

Definition at line 498 of file P521.cpp.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
void P521::dh1 (uint8_t k[132],
uint8_t f[66] 
)
+
+static
+
+ +

Performs phase 1 of an ECDH key exchange using P-521.

+
Parameters
+ + + +
kThe key value to send to the other party as part of the exchange.
fThe generated secret value for this party. This must not be transmitted to any party or stored in permanent storage. It only needs to be kept in memory until dh2() is called.
+
+
+

The f value is generated with RNG.rand(). It is the caller's responsibility to ensure that the global random number pool has sufficient entropy to generate the 66 bytes of f safely before calling this function.

+

The following example demonstrates how to perform a full ECDH key exchange using dh1() and dh2():

+
uint8_t f[66];
+
uint8_t k[132];
+
+
// Generate the secret value "f" and the public value "k".
+
P521::dh1(k, f);
+
+
// Send "k" to the other party.
+
...
+
+
// Read the "k" value that the other party sent to us.
+
...
+
+
// Generate the shared secret in "f".
+
if (!P521::dh2(k, f)) {
+
// The received "k" value was invalid - abort the session.
+
...
+
}
+
+
// The "f" value can now be used to generate session keys for encryption.
+
...
+

Reference: RFC 6090

+
See Also
dh2()
+ +

Definition at line 209 of file P521.cpp.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
bool P521::dh2 (const uint8_t k[132],
uint8_t f[66] 
)
+
+static
+
+ +

Performs phase 2 of an ECDH key exchange using P-521.

+
Parameters
+ + + +
kThe public key value that was received from the other party as part of the exchange.
fOn entry, this is the secret value for this party that was generated by dh1(). On exit, this will be the shared secret.
+
+
+
Returns
Returns true if the key exchange was successful, or false if the k value is invalid.
+

Reference: RFC 6090

+
See Also
dh1()
+ +

Definition at line 230 of file P521.cpp.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
bool P521::eval (uint8_t result[132],
const uint8_t f[66],
const uint8_t point[132] 
)
+
+static
+
+ +

Evaluates the curve function.

+
Parameters
+ + + + +
resultThe result of applying the curve function, which consists of the x and y values of the result point encoded in big-endian order.
fThe scalar value to multiply by point to create the result. This is assumed to be be a 521-bit number in big-endian order.
pointThe curve point to multiply consisting of the x and y values encoded in big-endian order. If point is NULL, then the generator Gx and Gy values for the curve will be used instead.
+
+
+
Returns
Returns true if f * point could be evaluated, or false if point is not a point on the curve.
+

This function provides access to the raw curve operation for testing purposes. Normally an application would use a higher-level function like dh1(), dh2(), sign(), or verify().

+
See Also
dh1(), sign()
+ +

Definition at line 136 of file P521.cpp.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
void P521::generatePrivateKey (uint8_t privateKey[66])
+
+static
+
+ +

Generates a private key for P-521 signing operations.

+
Parameters
+ + +
privateKeyThe resulting private key.
+
+
+

The private key is generated with RNG.rand(). It is the caller's responsibility to ensure that the global random number pool has sufficient entropy to generate the 521 bits of the key safely before calling this function.

+
See Also
derivePublicKey(), sign()
+ +

Definition at line 467 of file P521.cpp.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
bool P521::isValidCurvePoint (const uint8_t point[132])
+
+inlinestatic
+
+ +

Validates a point to ensure that it is on the curve.

+
Parameters
+ + +
pointThe point to validate.
+
+
+
Returns
Returns true if point is valid and on the curve, false if not.
+

This is a convenience function that calls isValidPublicKey() as the two operations are equivalent.

+ +

Definition at line 51 of file P521.h.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
bool P521::isValidPrivateKey (const uint8_t privateKey[66])
+
+static
+
+ +

Validates a private key value to ensure that it is between 1 and q - 1.

+
Parameters
+ + +
privateKeyThe private key value to validate.
+
+
+
Returns
Returns true if privateKey is valid, false if not.
+
See Also
isValidPublicKey()
+ +

Definition at line 525 of file P521.cpp.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + +
bool P521::isValidPublicKey (const uint8_t publicKey[132])
+
+static
+
+ +

Validates a public key to ensure that it is a valid curve point.

+
Parameters
+ + +
publicKeyThe public key value to validate.
+
+
+
Returns
Returns true if publicKey is valid, false if not.
+
See Also
isValidPrivateKey()
+ +

Definition at line 565 of file P521.cpp.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void P521::sign (uint8_t signature[132],
const uint8_t privateKey[66],
const void * message,
size_t len,
Hashhash = 0 
)
+
+static
+
+ +

Signs a message using a specific P-521 private key.

+
Parameters
+ + + + + + +
signatureThe signature value.
privateKeyThe private key to use to sign the message.
messagePoints to the message to be signed.
lenThe length of the message to be signed.
hashThe hash algorithm to use to hash the message before signing. If hash is NULL, then the message is assumed to already be a hash value from some previous process.
+
+
+

This function generates deterministic ECDSA signatures according to RFC 6979. The hash function is used to generate the k value for the signature. If hash is NULL, then SHA512 is used. The hash object must be capable of HMAC mode.

+

The length of the hashed message must be less than or equal to 64 bytes in size. Longer messages will be truncated to 64 bytes.

+

References: RFC 6090, RFC 6979

+
See Also
verify(), generatePrivateKey()
+ +

Definition at line 277 of file P521.cpp.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
bool P521::verify (const uint8_t signature[132],
const uint8_t publicKey[132],
const void * message,
size_t len,
Hashhash = 0 
)
+
+static
+
+ +

Verifies a signature using a specific P-521 public key.

+
Parameters
+ + + + + + +
signatureThe signature value to be verified.
publicKeyThe public key to use to verify the signature.
messageThe message whose signature is to be verified.
lenThe length of the message to be verified.
hashThe hash algorithm to use to hash the message before verification. If hash is NULL, then the message is assumed to already be a hash value from some previous process.
+
+
+

The length of the hashed message must be less than or equal to 64 bytes in size. Longer messages will be truncated to 64 bytes.

+
Returns
Returns true if the signature is valid for message; or false if the publicKey or signature is not valid.
+
See Also
sign()
+ +

Definition at line 374 of file P521.cpp.

+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/classPoly1305-members.html b/classPoly1305-members.html index f9e47adc..4700b005 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 15b32745..62f36506 100644 --- a/classPoly1305.html +++ b/classPoly1305.html @@ -280,7 +280,7 @@ void  diff --git a/classRNGClass-members.html b/classRNGClass-members.html index b215715d..9f0bdb56 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 2c0de757..0e40a06a 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 57af686b..9f7bd4dc 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 29adbd49..6bd4c864 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 01e72bcd..390e78aa 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 4f2b10f6..cb61f6e1 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 544cb6aa..ada092dd 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 3fc52025..d9c0afb5 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 71d971b4..03bdab26 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 5a4c8139..670af728 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 406eefc4..66f32690 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 c0019334..36a9b131 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 b200bba5..16e53b18 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 19c7e319..db6b742b 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 d58e256f..da76f5cd 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 b0e78772..b744e9ba 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 0cdb455f..2601b96f 100644 --- a/classSHA512.html +++ b/classSHA512.html @@ -513,7 +513,7 @@ Additional Inherited Members diff --git a/classSHAKE-members.html b/classSHAKE-members.html index 9b7dbab3..2bd97f88 100644 --- a/classSHAKE-members.html +++ b/classSHAKE-members.html @@ -104,7 +104,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classSHAKE.html b/classSHAKE.html index f732da15..b8c1e6a9 100644 --- a/classSHAKE.html +++ b/classSHAKE.html @@ -443,7 +443,7 @@ Protected Member Functions diff --git a/classSHAKE128-members.html b/classSHAKE128-members.html index b3ad44c2..5101430c 100644 --- a/classSHAKE128-members.html +++ b/classSHAKE128-members.html @@ -106,7 +106,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classSHAKE128.html b/classSHAKE128.html index 7728ebd6..28505dfe 100644 --- a/classSHAKE128.html +++ b/classSHAKE128.html @@ -171,7 +171,7 @@ Additional Inherited Members diff --git a/classSHAKE256-members.html b/classSHAKE256-members.html index fe21a077..54c172a9 100644 --- a/classSHAKE256-members.html +++ b/classSHAKE256-members.html @@ -106,7 +106,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classSHAKE256.html b/classSHAKE256.html index 1ec2005c..e5a8dca7 100644 --- a/classSHAKE256.html +++ b/classSHAKE256.html @@ -171,7 +171,7 @@ Additional Inherited Members diff --git a/classShell-members.html b/classShell-members.html index 170bc355..0b4947cd 100644 --- a/classShell-members.html +++ b/classShell-members.html @@ -174,7 +174,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classShell.html b/classShell.html index 8f3c42eb..04f1ff14 100644 --- a/classShell.html +++ b/classShell.html @@ -837,7 +837,7 @@ Additional Inherited Members diff --git a/classShellArguments-members.html b/classShellArguments-members.html index 01a3d1fc..33c29bd8 100644 --- a/classShellArguments-members.html +++ b/classShellArguments-members.html @@ -96,7 +96,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classShellArguments.html b/classShellArguments.html index 7a4720dc..8f378a62 100644 --- a/classShellArguments.html +++ b/classShellArguments.html @@ -182,7 +182,7 @@ class Shell diff --git a/classSoftI2C-members.html b/classSoftI2C-members.html index c1e74c1e..4a8eb29b 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 338d3c17..96933e09 100644 --- a/classSoftI2C.html +++ b/classSoftI2C.html @@ -346,7 +346,7 @@ unsigned int  diff --git a/classSpeck-members.html b/classSpeck-members.html index 01089b03..d7bf76f4 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 c9689721..bf5fd1c3 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 063a554e..083e8287 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 bb4220ed..e0bf3b49 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 4ca43288..50123c0f 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 19a89fb3..0b8689db 100644 --- a/classSpeckTiny.html +++ b/classSpeckTiny.html @@ -428,7 +428,7 @@ class SpeckSmall< diff --git a/classTerminal-members.html b/classTerminal-members.html index 3c8cc9ad..d0bea661 100644 --- a/classTerminal-members.html +++ b/classTerminal-members.html @@ -156,7 +156,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classTerminal.html b/classTerminal.html index 5fa2d80e..dccd49a3 100644 --- a/classTerminal.html +++ b/classTerminal.html @@ -1443,7 +1443,7 @@ Static Public Member Functions diff --git a/classTextField-members.html b/classTextField-members.html index b9ade08a..b67610d2 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 ec7fc861..19af10d3 100644 --- a/classTextField.html +++ b/classTextField.html @@ -343,7 +343,7 @@ LiquidCrystal *  diff --git a/classTimeField-members.html b/classTimeField-members.html index ad33ebbc..2f37e43d 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 50268a01..616bb446 100644 --- a/classTimeField.html +++ b/classTimeField.html @@ -541,7 +541,7 @@ LiquidCrystal *  diff --git a/classTransistorNoiseSource-members.html b/classTransistorNoiseSource-members.html index 7d7e8aa6..a9038924 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 71fe5a2f..75a53dc7 100644 --- a/classTransistorNoiseSource.html +++ b/classTransistorNoiseSource.html @@ -280,7 +280,7 @@ Additional Inherited Members diff --git a/classXOF-members.html b/classXOF-members.html index 54cf54d8..40f70497 100644 --- a/classXOF-members.html +++ b/classXOF-members.html @@ -102,7 +102,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classXOF.html b/classXOF.html index 94bb332a..f7e0258a 100644 --- a/classXOF.html +++ b/classXOF.html @@ -508,7 +508,7 @@ Public Member Functions diff --git a/classXTS-members.html b/classXTS-members.html index c0b79020..4786acd4 100644 --- a/classXTS-members.html +++ b/classXTS-members.html @@ -107,7 +107,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classXTS.html b/classXTS.html index 2f7cb8bc..6004cf03 100644 --- a/classXTS.html +++ b/classXTS.html @@ -220,7 +220,7 @@ template<typename T1, typename T2 = T1> diff --git a/classXTSCommon-members.html b/classXTSCommon-members.html index 05b648c1..cc123610 100644 --- a/classXTSCommon-members.html +++ b/classXTSCommon-members.html @@ -106,7 +106,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classXTSCommon.html b/classXTSCommon.html index aebf68f8..879d6b9b 100644 --- a/classXTSCommon.html +++ b/classXTSCommon.html @@ -497,7 +497,7 @@ class XTSSingleKeyCommon diff --git a/classXTSSingleKey-members.html b/classXTSSingleKey-members.html index 4f0bb42c..d60daa79 100644 --- a/classXTSSingleKey-members.html +++ b/classXTSSingleKey-members.html @@ -109,7 +109,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classXTSSingleKey.html b/classXTSSingleKey.html index 6b46106c..6ae95e6f 100644 --- a/classXTSSingleKey.html +++ b/classXTSSingleKey.html @@ -218,7 +218,7 @@ template<typename T > diff --git a/classXTSSingleKeyCommon-members.html b/classXTSSingleKeyCommon-members.html index c0217315..993d8486 100644 --- a/classXTSSingleKeyCommon-members.html +++ b/classXTSSingleKeyCommon-members.html @@ -107,7 +107,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classXTSSingleKeyCommon.html b/classXTSSingleKeyCommon.html index 47c1a0ef..f473e8db 100644 --- a/classXTSSingleKeyCommon.html +++ b/classXTSSingleKeyCommon.html @@ -257,7 +257,7 @@ Protected Member Functions diff --git a/classes.html b/classes.html index f45b7cfe..3b394ae7 100644 --- a/classes.html +++ b/classes.html @@ -91,47 +91,47 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); - - + + + - + + + + + - - - + + - + + - + + + - + - - + + + - + +
  A  
Charlieplex   GCMCommon   
  O  
-
SHAKE256   
ChaseLEDs   GF128   Shell   
AES128   Cipher   GHASH   OFB   ShellArguments   
SHAKE128   
ChaseLEDs   GF128   SHAKE256   
AES128   Cipher   GHASH   OFB   Shell   
AES192   CTR   
  H  
-
OFBCommon   SoftI2C   
AES256   CTRCommon   OMAC   Speck   
OFBCommon   ShellArguments   
AES256   CTRCommon   OMAC   SoftI2C   
AESCommon   Curve25519   Hash   
  P  
-
SpeckSmall   
Speck   
AuthenticatedCipher   
  D  
  I  
-
SpeckTiny   
SpeckSmall   
  B  
-
Poly1305   
  T  
+
P521   SpeckTiny   
DMD   I2CMaster   Poly1305   
  T  
DMD   I2CMaster   
  R  
+
BigNumberUtil   DS1307RTC   IntField   
  R  
BigNumberUtil   DS1307RTC   IntField   Terminal   
Bitmap   DS3231RTC   IRreceiver   RingOscillatorNoiseSource   TextField   
Bitmap   DS3231RTC   IRreceiver   Terminal   
BLAKE2b   DS3232RTC   
  K  
-
RNGClass   TimeField   
RingOscillatorNoiseSource   TextField   
BLAKE2s   
  E  
-
RTC   TransistorNoiseSource   
BlinkLED   KeccakCore   RTCAlarm   
  X  
-
RNGClass   TimeField   
BlinkLED   KeccakCore   RTC   TransistorNoiseSource   
BlockCipher   EAX   
  L  
-
RTCDate   
BoolField   EAXCommon   RTCTime   XOF   
RTCAlarm   
  X  
+
BoolField   EAXCommon   RTCDate   
  C  
-
Ed25519   LCD   
  S  
+
Ed25519   LCD   RTCTime   XOF   
EEPROM24   ListField   
  S  
XTS   
EEPROM24   ListField   XTSCommon   
CBC   
  F  
-
LoginShell   SHA256   XTSSingleKey   
LoginShell   XTSCommon   
CBCCommon   
  M  
-
SHA3_256   XTSSingleKeyCommon   
CFB   Field   SHA3_512   
CFBCommon   Form   Melody   SHA512   
SHA256   XTSSingleKey   
CFB   Field   SHA3_256   XTSSingleKeyCommon   
CFBCommon   Form   Melody   SHA3_512   
ChaCha   
  G  
  N  
-
SHAKE   
ChaChaPoly   SHAKE128   
SHA512   
ChaChaPoly   SHAKE   
GCM   NoiseSource   
@@ -139,7 +139,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/crypto-rng-ring_8dox.html b/crypto-rng-ring_8dox.html index a31959b3..cb9b996a 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 7de2654a..8bac64d9 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 cde4f0cf..cda22153 100644 --- a/crypto.html +++ b/crypto.html @@ -89,7 +89,7 @@ Supported Algorithms
  • Hash algorithms: SHA256, SHA512, SHA3_256, SHA3_512, BLAKE2s, BLAKE2b (regular and HMAC modes)
  • Extendable output functions (XOF's): SHAKE128, SHAKE256
  • Message authenticators: Poly1305, GHASH, OMAC
  • -
  • Public key algorithms: Curve25519, Ed25519
  • +
  • Public key algorithms: Curve25519, Ed25519, P521
  • Random number generation: RNG, TransistorNoiseSource, RingOscillatorNoiseSource
  • All cryptographic algorithms have been optimized for 8-bit Arduino platforms like the Uno. Memory usage is also reduced, particularly for SHA256 and SHA512 which save 192 and 512 bytes respectively over traditional implementations. For all algorithms, static sbox tables and the like are placed into program memory to further reduce data memory usage.

    @@ -219,6 +219,18 @@ Performance on AVR Ed25519::verify()8196msDigital signature verification Ed25519::derivePublicKey()5102msDerive a public key from a private key + +P521::eval()46290msRaw curve evaluation + +P521::dh1()46293msFirst half of Diffie-Hellman key agreement + +P521::dh2()46304msSecond half of Diffie-Hellman key agreement + +P521::sign()60514msDigital signature generation + +P521::verify()109078msDigital signature verification + +P521::derivePublicKey()46290msDerive 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.

    @@ -337,11 +349,23 @@ Performance on ARM

    Ed25519::verify()306msDigital signature verification Ed25519::derivePublicKey()194msDerive a public key from a private key + +P521::eval()1503msRaw curve evaluation + +P521::dh1()1503msFirst half of Diffie-Hellman key agreement + +P521::dh2()1503msSecond half of Diffie-Hellman key agreement + +P521::sign()1860msDigital signature generation + +P521::verify()3423msDigital signature verification + +P521::derivePublicKey()1503msDerive a public key from a private key diff --git a/crypto_8dox.html b/crypto_8dox.html index 62ac35cb..14626b55 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 09a4d1f8..f710d2ad 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 f1c3b104..e3b989f2 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 c6f9d16d..63b9e35d 100644 --- a/dir_1586d320a3b1e622174530fde769cda9.html +++ b/dir_1586d320a3b1e622174530fde769cda9.html @@ -102,7 +102,7 @@ Files diff --git a/dir_1de32c476debcefedf4aa8bb43bea551.html b/dir_1de32c476debcefedf4aa8bb43bea551.html index 09246bce..7c42f87f 100644 --- a/dir_1de32c476debcefedf4aa8bb43bea551.html +++ b/dir_1de32c476debcefedf4aa8bb43bea551.html @@ -106,7 +106,7 @@ Files diff --git a/dir_3dd03323535933fb3f714c41ff7a94da.html b/dir_3dd03323535933fb3f714c41ff7a94da.html index 3d075d89..b26b6607 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 0e590deb..03be08c8 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 38526a84..3ea5c455 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 2f1af5fa..48745481 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 2b1999e7..9cd87dd3 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 73807a06..870d0bdc 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 ef1729be..088d36cb 100644 --- a/dir_bc0718b08fb2015b8e59c47b2805f60c.html +++ b/dir_bc0718b08fb2015b8e59c47b2805f60c.html @@ -114,7 +114,7 @@ Directories diff --git a/dir_be059bf9978ae156837504b1b8a7568c.html b/dir_be059bf9978ae156837504b1b8a7568c.html index 9885601e..8556356e 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 c2c5e304..a18ce88d 100644 --- a/dir_e2ce51835550ba18edf07a8311722290.html +++ b/dir_e2ce51835550ba18edf07a8311722290.html @@ -188,6 +188,10 @@ Files   file  OMAC.h [code]   +file  P521.cpp [code] +  +file  P521.h [code] +  file  Poly1305.cpp [code]   file  Poly1305.h [code] @@ -236,7 +240,7 @@ Files diff --git a/dir_f34881fcf60f680b800190d5274dfaea.html b/dir_f34881fcf60f680b800190d5274dfaea.html index 82c4ba94..0176db87 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 3da3f6af..e1a35e0c 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 cc213352..fa9285b0 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 8a1c92df..fc4fac17 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 23a4d6c8..2be94e4f 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 e938aa92..9b12ad37 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 eff61d48..97938539 100644 --- a/files.html +++ b/files.html @@ -179,55 +179,57 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); o*OFB.h o*OMAC.cpp o*OMAC.h -o*Poly1305.cpp -o*Poly1305.h -o*PowerSave.cpp -o*PowerSave.h -o*RC5.h -o*RingOscillatorNoiseSource.cpp -o*RingOscillatorNoiseSource.h -o*RNG.cpp -o*RNG.h -o*RTC.cpp -o*RTC.h -o*SHA256.cpp -o*SHA256.h -o*SHA3.cpp -o*SHA3.h -o*SHA512.cpp -o*SHA512.h -o*SHAKE.cpp -o*SHAKE.h -o*Shell.cpp -o*Shell.h -o*SoftI2C.cpp -o*SoftI2C.h -o*Speck.cpp -o*Speck.h -o*SpeckSmall.cpp -o*SpeckSmall.h -o*SpeckTiny.cpp -o*SpeckTiny.h -o*TelnetDefs.h -o*Terminal.cpp -o*Terminal.h -o*TextField.cpp -o*TextField.h -o*TimeField.cpp -o*TimeField.h -o*TransistorNoiseSource.cpp -o*TransistorNoiseSource.h -o*USBKeysExtra.h -o*XOF.cpp -o*XOF.h -o*XTS.cpp -\*XTS.h +o*P521.cpp +o*P521.h +o*Poly1305.cpp +o*Poly1305.h +o*PowerSave.cpp +o*PowerSave.h +o*RC5.h +o*RingOscillatorNoiseSource.cpp +o*RingOscillatorNoiseSource.h +o*RNG.cpp +o*RNG.h +o*RTC.cpp +o*RTC.h +o*SHA256.cpp +o*SHA256.h +o*SHA3.cpp +o*SHA3.h +o*SHA512.cpp +o*SHA512.h +o*SHAKE.cpp +o*SHAKE.h +o*Shell.cpp +o*Shell.h +o*SoftI2C.cpp +o*SoftI2C.h +o*Speck.cpp +o*Speck.h +o*SpeckSmall.cpp +o*SpeckSmall.h +o*SpeckTiny.cpp +o*SpeckTiny.h +o*TelnetDefs.h +o*Terminal.cpp +o*Terminal.h +o*TextField.cpp +o*TextField.h +o*TimeField.cpp +o*TimeField.h +o*TransistorNoiseSource.cpp +o*TransistorNoiseSource.h +o*USBKeysExtra.h +o*XOF.cpp +o*XOF.h +o*XTS.cpp +\*XTS.h diff --git a/functions.html b/functions.html index ea78237c..7541ab4d 100644 --- a/functions.html +++ b/functions.html @@ -193,7 +193,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_b.html b/functions_b.html index b60a18ba..df4cd959 100644 --- a/functions_b.html +++ b/functions_b.html @@ -208,7 +208,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_c.html b/functions_c.html index f28d411b..4ded830a 100644 --- a/functions_c.html +++ b/functions_c.html @@ -263,7 +263,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_d.html b/functions_d.html index 30142fa5..06209f25 100644 --- a/functions_d.html +++ b/functions_d.html @@ -204,15 +204,18 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • derivePublicKey() : Ed25519 +, P521
  • destroy() : RNGClass
  • dh1() : Curve25519 +, P521
  • dh2() : Curve25519 +, P521
  • disable32kHzOutput() : DS3231RTC @@ -273,7 +276,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : Bitmap
  • drawInvertedBitmap() -: Bitmap +: Bitmap
  • drawLine() : Bitmap @@ -297,7 +300,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_e.html b/functions_e.html index d9b984f1..31d402bb 100644 --- a/functions_e.html +++ b/functions_e.html @@ -195,6 +195,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • eval() : Curve25519 +, P521
  • execute() : LoginShell @@ -218,7 +219,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_enum.html b/functions_enum.html index 37bd71aa..113032f8 100644 --- a/functions_enum.html +++ b/functions_enum.html @@ -111,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_eval.html b/functions_eval.html index ae84ee36..99593704 100644 --- a/functions_eval.html +++ b/functions_eval.html @@ -162,7 +162,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_f.html b/functions_f.html index 9c6b814a..78eb0304 100644 --- a/functions_f.html +++ b/functions_f.html @@ -187,7 +187,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func.html b/functions_func.html index c229066d..08151e76 100644 --- a/functions_func.html +++ b/functions_func.html @@ -186,7 +186,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_b.html b/functions_func_b.html index 02c8adcc..825ad43c 100644 --- a/functions_func_b.html +++ b/functions_func_b.html @@ -194,7 +194,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_c.html b/functions_func_c.html index dd54e851..97319852 100644 --- a/functions_func_c.html +++ b/functions_func_c.html @@ -253,7 +253,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_d.html b/functions_func_d.html index 9afcab43..0f1f3d19 100644 --- a/functions_func_d.html +++ b/functions_func_d.html @@ -172,15 +172,18 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • derivePublicKey() : Ed25519 +, P521
  • destroy() : RNGClass
  • dh1() : Curve25519 +, P521
  • dh2() : Curve25519 +, P521
  • disable32kHzOutput() : DS3231RTC @@ -220,7 +223,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : DMD
  • drawBitmap() -: Bitmap +: Bitmap
  • drawChar() : Bitmap @@ -235,7 +238,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : Bitmap
  • drawInvertedBitmap() -: Bitmap +: Bitmap
  • drawLine() : Bitmap @@ -259,7 +262,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_e.html b/functions_func_e.html index 8398da22..db5e22d0 100644 --- a/functions_func_e.html +++ b/functions_func_e.html @@ -194,6 +194,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • eval() : Curve25519 +, P521
  • execute() : LoginShell @@ -217,7 +218,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_f.html b/functions_func_f.html index daa173dd..263aa0ed 100644 --- a/functions_func_f.html +++ b/functions_func_f.html @@ -180,7 +180,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_g.html b/functions_func_g.html index 4ba1fa21..5735a58e 100644 --- a/functions_func_g.html +++ b/functions_func_g.html @@ -132,6 +132,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • generatePrivateKey() : Ed25519 +, P521
  • getButton() : LCD @@ -143,7 +144,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_h.html b/functions_func_h.html index c397479d..ed7f0047 100644 --- a/functions_func_h.html +++ b/functions_func_h.html @@ -161,7 +161,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_i.html b/functions_func_i.html index 0e2f9f05..e392c28a 100644 --- a/functions_func_i.html +++ b/functions_func_i.html @@ -166,12 +166,24 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • isValid() : Bitmap
  • +
  • isValidCurvePoint() +: P521 +
  • +
  • isValidPrivateKey() +: P521 +
  • +
  • isValidPublicKey() +: P521 +
  • isVisible() : Form
  • isWideCharacter() : Terminal
  • +
  • isZero() +: BigNumberUtil +
  • items() : ListField
  • @@ -190,7 +202,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_k.html b/functions_func_k.html index d3be4289..a5d799d6 100644 --- a/functions_func_k.html +++ b/functions_func_k.html @@ -150,7 +150,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_l.html b/functions_func_l.html index 6cd60577..36a01319 100644 --- a/functions_func_l.html +++ b/functions_func_l.html @@ -131,7 +131,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : Field
  • LCD() -: LCD +: LCD
  • led() : Charlieplex @@ -157,7 +157,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_m.html b/functions_func_m.html index 37a59d8d..2dd7bad6 100644 --- a/functions_func_m.html +++ b/functions_func_m.html @@ -160,7 +160,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_n.html b/functions_func_n.html index 81666392..ff11de95 100644 --- a/functions_func_n.html +++ b/functions_func_n.html @@ -143,7 +143,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_o.html b/functions_func_o.html index afe45157..9837daac 100644 --- a/functions_func_o.html +++ b/functions_func_o.html @@ -149,7 +149,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_p.html b/functions_func_p.html index 02835b60..22e0cc68 100644 --- a/functions_func_p.html +++ b/functions_func_p.html @@ -179,7 +179,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_r.html b/functions_func_r.html index e6592427..adef9bfe 100644 --- a/functions_func_r.html +++ b/functions_func_r.html @@ -228,7 +228,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_s.html b/functions_func_s.html index 4a7e8e6b..62fbd573 100644 --- a/functions_func_s.html +++ b/functions_func_s.html @@ -350,6 +350,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • sign() : Ed25519 +, P521
  • size() : EEPROM24 @@ -420,7 +421,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_t.html b/functions_func_t.html index 9789396d..a2c43707 100644 --- a/functions_func_t.html +++ b/functions_func_t.html @@ -161,7 +161,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_u.html b/functions_func_u.html index 3323bea4..8c0c15bb 100644 --- a/functions_func_u.html +++ b/functions_func_u.html @@ -167,7 +167,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_v.html b/functions_func_v.html index b4ee17b3..6e5b52f7 100644 --- a/functions_func_v.html +++ b/functions_func_v.html @@ -133,12 +133,13 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • verify() : Ed25519 +, P521
  • diff --git a/functions_func_w.html b/functions_func_w.html index 7b7524a1..5147e1da 100644 --- a/functions_func_w.html +++ b/functions_func_w.html @@ -166,7 +166,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_x.html b/functions_func_x.html index d8c57200..f559a171 100644 --- a/functions_func_x.html +++ b/functions_func_x.html @@ -143,7 +143,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_~.html b/functions_func_~.html index 902fe744..d84fb33a 100644 --- a/functions_func_~.html +++ b/functions_func_~.html @@ -242,7 +242,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_g.html b/functions_g.html index e4d69ec8..aef1ce68 100644 --- a/functions_g.html +++ b/functions_g.html @@ -133,6 +133,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • generatePrivateKey() : Ed25519 +, P521
  • getButton() : LCD @@ -147,7 +148,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_h.html b/functions_h.html index 73b16e6e..89cfc50f 100644 --- a/functions_h.html +++ b/functions_h.html @@ -166,7 +166,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_i.html b/functions_i.html index 25a75ac1..0c3e5661 100644 --- a/functions_i.html +++ b/functions_i.html @@ -170,12 +170,24 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • isValid() : Bitmap
  • +
  • isValidCurvePoint() +: P521 +
  • +
  • isValidPrivateKey() +: P521 +
  • +
  • isValidPublicKey() +: P521 +
  • isVisible() : Form
  • isWideCharacter() : Terminal
  • +
  • isZero() +: BigNumberUtil +
  • items() : ListField
  • @@ -194,7 +206,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_k.html b/functions_k.html index 94b4cb19..16d2a342 100644 --- a/functions_k.html +++ b/functions_k.html @@ -151,7 +151,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_l.html b/functions_l.html index 0b10ef16..94848bb6 100644 --- a/functions_l.html +++ b/functions_l.html @@ -132,7 +132,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : Field
  • LCD() -: LCD +: LCD
  • led() : Charlieplex @@ -161,7 +161,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_m.html b/functions_m.html index 374c8a4f..efb77552 100644 --- a/functions_m.html +++ b/functions_m.html @@ -174,7 +174,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_n.html b/functions_n.html index 2796811c..ec9bde3a 100644 --- a/functions_n.html +++ b/functions_n.html @@ -150,7 +150,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_o.html b/functions_o.html index 1c76ad29..9d6b99f6 100644 --- a/functions_o.html +++ b/functions_o.html @@ -150,7 +150,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_p.html b/functions_p.html index 06640684..77e0d2a9 100644 --- a/functions_p.html +++ b/functions_p.html @@ -183,7 +183,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_r.html b/functions_r.html index d0f139e7..0da67735 100644 --- a/functions_r.html +++ b/functions_r.html @@ -232,7 +232,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_rela.html b/functions_rela.html index 63876c79..63fa06e2 100644 --- a/functions_rela.html +++ b/functions_rela.html @@ -102,7 +102,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_s.html b/functions_s.html index 01de8625..9d6cda88 100644 --- a/functions_s.html +++ b/functions_s.html @@ -367,6 +367,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • sign() : Ed25519 +, P521
  • size() : EEPROM24 @@ -437,7 +438,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_t.html b/functions_t.html index 119ccbec..ffdd7297 100644 --- a/functions_t.html +++ b/functions_t.html @@ -165,7 +165,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_type.html b/functions_type.html index af1176c3..5479c20f 100644 --- a/functions_type.html +++ b/functions_type.html @@ -108,7 +108,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_u.html b/functions_u.html index 31ecb3ab..750821d3 100644 --- a/functions_u.html +++ b/functions_u.html @@ -168,7 +168,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_v.html b/functions_v.html index 2d346447..c60b8acb 100644 --- a/functions_v.html +++ b/functions_v.html @@ -134,12 +134,13 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
  • verify() : Ed25519 +, P521
  • diff --git a/functions_vars.html b/functions_vars.html index ac7accaf..227ab5c1 100644 --- a/functions_vars.html +++ b/functions_vars.html @@ -157,7 +157,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_w.html b/functions_w.html index adbc4b76..0d86c046 100644 --- a/functions_w.html +++ b/functions_w.html @@ -174,7 +174,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_x.html b/functions_x.html index afcf49bd..b77e0342 100644 --- a/functions_x.html +++ b/functions_x.html @@ -144,7 +144,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_y.html b/functions_y.html index 8120473d..aa5d11ff 100644 --- a/functions_y.html +++ b/functions_y.html @@ -135,7 +135,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_~.html b/functions_~.html index ba88c2b2..6332cbc6 100644 --- a/functions_~.html +++ b/functions_~.html @@ -243,7 +243,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/group__power__save.html b/group__power__save.html index feda8cc5..b6bee944 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 ba93a64b..ac6ab4eb 100644 --- a/hierarchy.html +++ b/hierarchy.html @@ -149,34 +149,35 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); |oCRingOscillatorNoiseSourceProcesses the signal from a ring oscillator based noise source |\CTransistorNoiseSourceProcesses the signal from a transistor-based noise source oCOMACImplementation of the OMAC message authenticator -oCPoly1305Poly1305 message authenticator -oCRNGClassPseudo random number generator suitable for cryptography -oCRTCBase class for realtime clock handlers -|oCDS1307RTCCommunicates with a DS1307 realtime clock chip via I2C -|oCDS3231RTCCommunicates with a DS3231 realtime clock chip via I2C -|\CDS3232RTCCommunicates with a DS3232 realtime clock chip via I2C -oCRTCAlarmStores alarm information from a realtime clock chip -oCRTCDateStores date information from a realtime clock chip -oCRTCTimeStores time information from a realtime clock chip -oCShellArgumentsConvenience class that encapsulates an array of shell command arguments -oCStream -|\CTerminalExtended stream interface for terminal operations -| \CShellCommand-line shell access -|  \CLoginShellCommand-line shell access via a login shell -oCXOFAbstract base class for Extendable-Output Functions (XOFs) -|\CSHAKEAbstract base class for the SHAKE Extendable-Output Functions (XOFs) -| oCSHAKE128SHAKE Extendable-Output Function (XOF) with 128-bit security -| \CSHAKE256SHAKE Extendable-Output Function (XOF) with 256-bit security -\CXTSCommonConcrete base class to assist with implementing XTS mode for 128-bit block ciphers - oCXTS< T1, T2 >Implementation of the XTS mode for 128-bit block ciphers - \CXTSSingleKeyCommonConcrete base class to assist with implementing single-key XTS mode for 128-bit block ciphers -  \CXTSSingleKey< T >Implementation of the single-key XTS mode for 128-bit block ciphers +oCP521Elliptic curve operations with the NIST P-521 curve +oCPoly1305Poly1305 message authenticator +oCRNGClassPseudo random number generator suitable for cryptography +oCRTCBase class for realtime clock handlers +|oCDS1307RTCCommunicates with a DS1307 realtime clock chip via I2C +|oCDS3231RTCCommunicates with a DS3231 realtime clock chip via I2C +|\CDS3232RTCCommunicates with a DS3232 realtime clock chip via I2C +oCRTCAlarmStores alarm information from a realtime clock chip +oCRTCDateStores date information from a realtime clock chip +oCRTCTimeStores time information from a realtime clock chip +oCShellArgumentsConvenience class that encapsulates an array of shell command arguments +oCStream +|\CTerminalExtended stream interface for terminal operations +| \CShellCommand-line shell access +|  \CLoginShellCommand-line shell access via a login shell +oCXOFAbstract base class for Extendable-Output Functions (XOFs) +|\CSHAKEAbstract base class for the SHAKE Extendable-Output Functions (XOFs) +| oCSHAKE128SHAKE Extendable-Output Function (XOF) with 128-bit security +| \CSHAKE256SHAKE Extendable-Output Function (XOF) with 256-bit security +\CXTSCommonConcrete base class to assist with implementing XTS mode for 128-bit block ciphers + oCXTS< T1, T2 >Implementation of the XTS mode for 128-bit block ciphers + \CXTSSingleKeyCommonConcrete base class to assist with implementing single-key XTS mode for 128-bit block ciphers +  \CXTSSingleKey< T >Implementation of the single-key XTS mode for 128-bit block ciphers diff --git a/index.html b/index.html index 271cf781..98df16a7 100644 --- a/index.html +++ b/index.html @@ -135,7 +135,7 @@ Cryptographic Library
  • Hash algorithms: SHA256, SHA512, SHA3_256, SHA3_512, BLAKE2s, BLAKE2b (regular and HMAC modes)
  • Extendable output functions (XOF's): SHAKE128, SHAKE256
  • Message authenticators: Poly1305, GHASH, OMAC
  • -
  • Public key algorithms: Curve25519, Ed25519
  • +
  • Public key algorithms: Curve25519, Ed25519, P521
  • Random number generation: RNG, TransistorNoiseSource, RingOscillatorNoiseSource
  • More information can be found on the Cryptographic Library page.

    @@ -164,7 +164,7 @@ Other diff --git a/ir-dumpir_8dox.html b/ir-dumpir_8dox.html index c06694f9..701e3f6b 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 eda7345f..4ecad919 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 c1c093c7..472ed1d8 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 46bff837..a56410ba 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 4483d84b..652f2249 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 be8779be..4df58411 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 bb10c97e..f7714491 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 a8a30442..0a36d64d 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 34cf392a..6315bf2a 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 b2798eb0..8825cd1a 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 3d0ac579..177f5216 100644 --- a/pages.html +++ b/pages.html @@ -102,7 +102,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/search/all_10.js b/search/all_10.js index a722e1ea..a18703d9 100644 --- a/search/all_10.js +++ b/search/all_10.js @@ -73,7 +73,7 @@ var searchData= ['shellcommandfunc',['ShellCommandFunc',['../classShell.html#ad5bac6a4033cd81e24c1345650bca744',1,'Shell']]], ['shellpasswordcheckfunc',['ShellPasswordCheckFunc',['../classLoginShell.html#adad54b04ec54d3577df4cd11944fff1d',1,'LoginShell']]], ['show',['show',['../classForm.html#a9e8d718ab55a8034c22c606ccfa90d65',1,'Form']]], - ['sign',['sign',['../classEd25519.html#a36ecf67b4c5d2d39a31888f56af1f8a5',1,'Ed25519']]], + ['sign',['sign',['../classEd25519.html#a36ecf67b4c5d2d39a31888f56af1f8a5',1,'Ed25519::sign()'],['../classP521.html#ab050ceff65e49b646b8157fe1474288a',1,'P521::sign()']]], ['size',['size',['../classEEPROM24.html#aa544875cef9bd05bf71d6c19be06cf7c',1,'EEPROM24']]], ['sleep_5f120_5fms',['SLEEP_120_MS',['../group__power__save.html#ggabdc6266a040b28c4d79028ddb0ceae36a96fa577b54aa6f2341ea5ddd839aa8bc',1,'PowerSave.h']]], ['sleep_5f15_5fms',['SLEEP_15_MS',['../group__power__save.html#ggabdc6266a040b28c4d79028ddb0ceae36a3d16487a7386c6348f1c1d886564e3c4',1,'PowerSave.h']]], diff --git a/search/all_13.js b/search/all_13.js index d88e30c6..d2749342 100644 --- a/search/all_13.js +++ b/search/all_13.js @@ -1,5 +1,5 @@ var searchData= [ ['value',['value',['../classBoolField.html#a9147826437fbaf9b29eda9dee9e37b39',1,'BoolField::value()'],['../classIntField.html#a2fb650827ce8cb4662253bb6c32acb52',1,'IntField::value()'],['../classListField.html#aab8477757cd89bacd242c85bac2dccb1',1,'ListField::value()'],['../classTextField.html#a124764b6fc7c19aaf683f72cd42636b1',1,'TextField::value()'],['../classTimeField.html#a400aaa72a83b3b872e1de1c3af1a240f',1,'TimeField::value()']]], - ['verify',['verify',['../classEd25519.html#ae3e2fc405c9cd8cb1d3ab9b8b452d3e4',1,'Ed25519']]] + ['verify',['verify',['../classEd25519.html#ae3e2fc405c9cd8cb1d3ab9b8b452d3e4',1,'Ed25519::verify()'],['../classP521.html#ab075909f5cecbb801c6b7c41f20de223',1,'P521::verify()']]] ]; diff --git a/search/all_3.js b/search/all_3.js index 280caf38..17cbb61a 100644 --- a/search/all_3.js +++ b/search/all_3.js @@ -20,10 +20,10 @@ var searchData= ['defaultfield',['defaultField',['../classForm.html#aba75b59f68b31dd77dbbac9ab5c3124b',1,'Form']]], ['deletechar',['deleteChar',['../classTerminal.html#a7daffb0fe91d76678c5a9f22fe16e2c5',1,'Terminal']]], ['deleteline',['deleteLine',['../classTerminal.html#ae2f95592f13a1a5fe8464176a2b10298',1,'Terminal']]], - ['derivepublickey',['derivePublicKey',['../classEd25519.html#ab62bac52ed07f77f76f3ff0fccd71cb2',1,'Ed25519']]], + ['derivepublickey',['derivePublicKey',['../classEd25519.html#ab62bac52ed07f77f76f3ff0fccd71cb2',1,'Ed25519::derivePublicKey()'],['../classP521.html#a15ca802e298c7ff3be06924b0edb7daa',1,'P521::derivePublicKey()']]], ['destroy',['destroy',['../classRNGClass.html#a9901367d86f2303a59bbc12fe91cad00',1,'RNGClass']]], - ['dh1',['dh1',['../classCurve25519.html#a2b6911583d17ea9a36bbbb40d58b3d89',1,'Curve25519']]], - ['dh2',['dh2',['../classCurve25519.html#a14022d6ac68ec691ffb0247275078ab9',1,'Curve25519']]], + ['dh1',['dh1',['../classCurve25519.html#a2b6911583d17ea9a36bbbb40d58b3d89',1,'Curve25519::dh1()'],['../classP521.html#ae04c439804f445535295bf44ae56afbf',1,'P521::dh1()']]], + ['dh2',['dh2',['../classCurve25519.html#a14022d6ac68ec691ffb0247275078ab9',1,'Curve25519::dh2()'],['../classP521.html#a7b9d4f74cc2d71a488a33ab165537491',1,'P521::dh2()']]], ['disable32khzoutput',['disable32kHzOutput',['../classDS3231RTC.html#a7c9c197c6f27c26e0cb9c5ddc95633c8',1,'DS3231RTC::disable32kHzOutput()'],['../classDS3232RTC.html#ada732bae42fc2833e59ae293aa27ddcb',1,'DS3232RTC::disable32kHzOutput()']]], ['disablealarm',['disableAlarm',['../classDS3231RTC.html#a21e2667c53d30aa425043ec08a117c47',1,'DS3231RTC']]], ['disablealarminterrupts',['disableAlarmInterrupts',['../classDS3231RTC.html#a245a56a9396ef49a4e089d743c759cdb',1,'DS3231RTC::disableAlarmInterrupts()'],['../classDS3232RTC.html#a225b8c62d617aa1b7be7d20e8a033be9',1,'DS3232RTC::disableAlarmInterrupts()']]], diff --git a/search/all_4.js b/search/all_4.js index f01f87ee..860afa89 100644 --- a/search/all_4.js +++ b/search/all_4.js @@ -16,7 +16,7 @@ var searchData= ['end',['end',['../classShell.html#a8a654aadd0b6a379309bb1007749e41d',1,'Shell::end()'],['../classTerminal.html#a9e4c08d43a1a1c039e385d63aca049c0',1,'Terminal::end()']]], ['endwrite',['endWrite',['../classI2CMaster.html#ab29f63551ddeb032a91505d1c0b8ac41',1,'I2CMaster::endWrite()'],['../classSoftI2C.html#aa12ae82813598b2e9ea70463c23c5bf3',1,'SoftI2C::endWrite()']]], ['enterfield',['enterField',['../classBoolField.html#ab3f1e610b52caed7e41016f6ae3d7d09',1,'BoolField::enterField()'],['../classField.html#aa032bbeacb405c56546cb56fbbee94f5',1,'Field::enterField()'],['../classIntField.html#a51d9127b660e8dd7f87718acd230202a',1,'IntField::enterField()'],['../classListField.html#a191b79b460e45cf48e04b04eface2888',1,'ListField::enterField()'],['../classTextField.html#aa78f1354f9240b64fabd6f996e312f32',1,'TextField::enterField()'],['../classTimeField.html#ae914d6b870283a334d2d669460f7646b',1,'TimeField::enterField()']]], - ['eval',['eval',['../classCurve25519.html#a2e4b7dd83a019b32c76584c99bfda21a',1,'Curve25519']]], + ['eval',['eval',['../classCurve25519.html#a2e4b7dd83a019b32c76584c99bfda21a',1,'Curve25519::eval()'],['../classP521.html#ac2e07ce7e846ba180938b41b4a2ae563',1,'P521::eval()']]], ['execute',['execute',['../classLoginShell.html#af54c5c14adac7955cf5e4f9460bd9ca5',1,'LoginShell::execute()'],['../classShell.html#ab4a3f80dc5ff779ac99116a1f7e35cda',1,'Shell::execute()']]], ['exit',['exit',['../classShell.html#ab9dab65bc0757ce3bb0ac926bbefcee3',1,'Shell']]], ['exitfield',['exitField',['../classField.html#ad6805c75ee1e62f8cd8bd550c4530c07',1,'Field::exitField()'],['../classTimeField.html#a5a6b7db2e3fda7745e0ff9c3d8d9a541',1,'TimeField::exitField()']]], diff --git a/search/all_6.js b/search/all_6.js index 8e6d3a81..e7b21dee 100644 --- a/search/all_6.js +++ b/search/all_6.js @@ -3,7 +3,7 @@ var searchData= ['generating_20random_20numbers',['Generating random numbers',['../crypto_rng.html',1,'']]], ['gcm',['GCM',['../classGCM.html',1,'GCM< T >'],['../classGCM.html#acbef04a5593177aabf19df538ad3def7',1,'GCM::GCM()']]], ['gcmcommon',['GCMCommon',['../classGCMCommon.html',1,'GCMCommon'],['../classGCMCommon.html#a1b05ff393e8c20db30cb991e875aab19',1,'GCMCommon::GCMCommon()']]], - ['generateprivatekey',['generatePrivateKey',['../classEd25519.html#ab8be5115ac5adc8a556dbac7d7e90d2e',1,'Ed25519']]], + ['generateprivatekey',['generatePrivateKey',['../classEd25519.html#ab8be5115ac5adc8a556dbac7d7e90d2e',1,'Ed25519::generatePrivateKey()'],['../classP521.html#ae5b727018648e4a165f504024c4ccc45',1,'P521::generatePrivateKey()']]], ['getbutton',['getButton',['../classLCD.html#ac1e80e2603bd1cf0276c36092c416292',1,'LCD']]], ['gf128',['GF128',['../classGF128.html',1,'']]], ['ghash',['GHASH',['../classGHASH.html',1,'GHASH'],['../classGHASH.html#a3a1abd0f641bccd9b4aa1f40beb8dca3',1,'GHASH::GHASH()']]], diff --git a/search/all_8.js b/search/all_8.js index 631289bc..7f84540e 100644 --- a/search/all_8.js +++ b/search/all_8.js @@ -17,8 +17,12 @@ var searchData= ['isrealtime',['isRealTime',['../classDS1307RTC.html#aba01ca4c2f7863b610e5dfe9146886bd',1,'DS1307RTC::isRealTime()'],['../classDS3231RTC.html#a2fa6fdd1f9e2b2b99be077c73639dce0',1,'DS3231RTC::isRealTime()'],['../classDS3232RTC.html#acc5908a3743afb4c26bd75e22cad87a4',1,'DS3232RTC::isRealTime()']]], ['isscreensaved',['isScreenSaved',['../classLCD.html#af5d5ca618a3161aa352027b58fe09d0e',1,'LCD']]], ['isvalid',['isValid',['../classBitmap.html#a3846a240722e847d3cf11f701da1ce7b',1,'Bitmap']]], + ['isvalidcurvepoint',['isValidCurvePoint',['../classP521.html#a3f045e0b7a483fc557747472ade31298',1,'P521']]], + ['isvalidprivatekey',['isValidPrivateKey',['../classP521.html#a5802ebd25142789bb2df930ecd765d39',1,'P521']]], + ['isvalidpublickey',['isValidPublicKey',['../classP521.html#af0bd7851bb15b737a821320b394aec96',1,'P521']]], ['isvisible',['isVisible',['../classForm.html#a3101f288e3e5aa8307c57f35861ad587',1,'Form']]], ['iswidecharacter',['isWideCharacter',['../classTerminal.html#a25fdddd02378250799016cbb714c8a6b',1,'Terminal']]], + ['iszero',['isZero',['../classBigNumberUtil.html#ad0aafacd8e224bd543341973c62ff1dd',1,'BigNumberUtil']]], ['items',['items',['../classListField.html#a4dbbdeebd386551eb8f245b42b45ccf0',1,'ListField']]], ['ivsize',['ivSize',['../classCBCCommon.html#a016277533730284a38bb6ad8cd6f91ce',1,'CBCCommon::ivSize()'],['../classCFBCommon.html#a55db1be69de87aafe5601d31be918ebb',1,'CFBCommon::ivSize()'],['../classChaCha.html#afaa3df343a7d07976bd7e03a0c1bf43c',1,'ChaCha::ivSize()'],['../classChaChaPoly.html#ac3ebfaaaffe9d607905681949e75140d',1,'ChaChaPoly::ivSize()'],['../classCipher.html#ab8b53ddc4ce431f03c2a1903d70ace9c',1,'Cipher::ivSize()'],['../classCTRCommon.html#a98c1717d11d8da8e1fa108607358774a',1,'CTRCommon::ivSize()'],['../classEAXCommon.html#abc6ccfb9338c94699458723f669513bf',1,'EAXCommon::ivSize()'],['../classGCMCommon.html#a01cff072505e861fd20f6cfee1e10fb2',1,'GCMCommon::ivSize()'],['../classOFBCommon.html#a67b4639aaece17a796fcba3a2ce8b43c',1,'OFBCommon::ivSize()']]] ]; diff --git a/search/all_a.js b/search/all_a.js index bd27634d..41efafab 100644 --- a/search/all_a.js +++ b/search/all_a.js @@ -1,7 +1,7 @@ var searchData= [ ['label',['label',['../classField.html#aaa861ef917130c989a955bc75c683afe',1,'Field']]], - ['lcd',['LCD',['../classLCD.html',1,'LCD'],['../classLCD.html#a00bb2db1390721abc7b24ac4b8c276c8',1,'LCD::LCD()'],['../classLCD.html#a067bc741cf27f143aba5d9f147908401',1,'LCD::LCD(uint8_t pin9)'],['../classLCD.html#a203d268bef6c61fa293562dbb0e9f51e',1,'LCD::LCD(uint8_t rs, uint8_t enable, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3)'],['../classField.html#a5cf21bf958a71e51feac9e1bf9f599d1',1,'Field::lcd()']]], + ['lcd',['LCD',['../classLCD.html',1,'LCD'],['../classField.html#a5cf21bf958a71e51feac9e1bf9f599d1',1,'Field::lcd()'],['../classLCD.html#a00bb2db1390721abc7b24ac4b8c276c8',1,'LCD::LCD()'],['../classLCD.html#a067bc741cf27f143aba5d9f147908401',1,'LCD::LCD(uint8_t pin9)'],['../classLCD.html#a203d268bef6c61fa293562dbb0e9f51e',1,'LCD::LCD(uint8_t rs, uint8_t enable, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3)']]], ['lcd_2dform_2edox',['lcd-form.dox',['../lcd-form_8dox.html',1,'']]], ['lcd_2dhelloworld_2edox',['lcd-helloworld.dox',['../lcd-helloworld_8dox.html',1,'']]], ['led',['led',['../classCharlieplex.html#a90fd09f24b62424b0b7b8bcdb0140b9d',1,'Charlieplex']]], diff --git a/search/all_e.js b/search/all_e.js index aacede2a..cd5baeb2 100644 --- a/search/all_e.js +++ b/search/all_e.js @@ -1,5 +1,6 @@ var searchData= [ + ['p521',['P521',['../classP521.html',1,'']]], ['packbe',['packBE',['../classBigNumberUtil.html#af49dd38173ea0310776d283aabea2ba0',1,'BigNumberUtil']]], ['packle',['packLE',['../classBigNumberUtil.html#a989cd5f389ac5adc798d8767383e2810',1,'BigNumberUtil']]], ['pad',['pad',['../classGHASH.html#a8c38ee9313605f1d8b12dca7cd43e4ad',1,'GHASH::pad()'],['../classKeccakCore.html#a97852ee4381ced17ee6d21704cf0b4d7',1,'KeccakCore::pad()'],['../classPoly1305.html#aaea2f40c1f22dcc2f8f690c793fb4388',1,'Poly1305::pad()']]], diff --git a/search/classes_e.js b/search/classes_e.js index 371a76ec..fb585540 100644 --- a/search/classes_e.js +++ b/search/classes_e.js @@ -1,4 +1,5 @@ var searchData= [ + ['p521',['P521',['../classP521.html',1,'']]], ['poly1305',['Poly1305',['../classPoly1305.html',1,'']]] ]; diff --git a/search/functions_10.js b/search/functions_10.js index 86ec3e83..2ed198db 100644 --- a/search/functions_10.js +++ b/search/functions_10.js @@ -63,7 +63,7 @@ var searchData= ['shellcommandfunc',['ShellCommandFunc',['../classShell.html#ad5bac6a4033cd81e24c1345650bca744',1,'Shell']]], ['shellpasswordcheckfunc',['ShellPasswordCheckFunc',['../classLoginShell.html#adad54b04ec54d3577df4cd11944fff1d',1,'LoginShell']]], ['show',['show',['../classForm.html#a9e8d718ab55a8034c22c606ccfa90d65',1,'Form']]], - ['sign',['sign',['../classEd25519.html#a36ecf67b4c5d2d39a31888f56af1f8a5',1,'Ed25519']]], + ['sign',['sign',['../classEd25519.html#a36ecf67b4c5d2d39a31888f56af1f8a5',1,'Ed25519::sign()'],['../classP521.html#ab050ceff65e49b646b8157fe1474288a',1,'P521::sign()']]], ['size',['size',['../classEEPROM24.html#aa544875cef9bd05bf71d6c19be06cf7c',1,'EEPROM24']]], ['sleepfor',['sleepFor',['../group__power__save.html#ga95c1666038493a7f95be6768882eebad',1,'sleepFor(SleepDuration duration, uint8_t mode): PowerSave.cpp'],['../group__power__save.html#ga95c1666038493a7f95be6768882eebad',1,'sleepFor(SleepDuration duration, uint8_t mode=0): PowerSave.cpp']]], ['softi2c',['SoftI2C',['../classSoftI2C.html#adb6e00ee3f930f1d32010a18feb5f6cc',1,'SoftI2C']]], diff --git a/search/functions_13.js b/search/functions_13.js index d88e30c6..d2749342 100644 --- a/search/functions_13.js +++ b/search/functions_13.js @@ -1,5 +1,5 @@ var searchData= [ ['value',['value',['../classBoolField.html#a9147826437fbaf9b29eda9dee9e37b39',1,'BoolField::value()'],['../classIntField.html#a2fb650827ce8cb4662253bb6c32acb52',1,'IntField::value()'],['../classListField.html#aab8477757cd89bacd242c85bac2dccb1',1,'ListField::value()'],['../classTextField.html#a124764b6fc7c19aaf683f72cd42636b1',1,'TextField::value()'],['../classTimeField.html#a400aaa72a83b3b872e1de1c3af1a240f',1,'TimeField::value()']]], - ['verify',['verify',['../classEd25519.html#ae3e2fc405c9cd8cb1d3ab9b8b452d3e4',1,'Ed25519']]] + ['verify',['verify',['../classEd25519.html#ae3e2fc405c9cd8cb1d3ab9b8b452d3e4',1,'Ed25519::verify()'],['../classP521.html#ab075909f5cecbb801c6b7c41f20de223',1,'P521::verify()']]] ]; diff --git a/search/functions_3.js b/search/functions_3.js index bdd224da..2bc4fd18 100644 --- a/search/functions_3.js +++ b/search/functions_3.js @@ -11,10 +11,10 @@ var searchData= ['defaultfield',['defaultField',['../classForm.html#aba75b59f68b31dd77dbbac9ab5c3124b',1,'Form']]], ['deletechar',['deleteChar',['../classTerminal.html#a7daffb0fe91d76678c5a9f22fe16e2c5',1,'Terminal']]], ['deleteline',['deleteLine',['../classTerminal.html#ae2f95592f13a1a5fe8464176a2b10298',1,'Terminal']]], - ['derivepublickey',['derivePublicKey',['../classEd25519.html#ab62bac52ed07f77f76f3ff0fccd71cb2',1,'Ed25519']]], + ['derivepublickey',['derivePublicKey',['../classEd25519.html#ab62bac52ed07f77f76f3ff0fccd71cb2',1,'Ed25519::derivePublicKey()'],['../classP521.html#a15ca802e298c7ff3be06924b0edb7daa',1,'P521::derivePublicKey()']]], ['destroy',['destroy',['../classRNGClass.html#a9901367d86f2303a59bbc12fe91cad00',1,'RNGClass']]], - ['dh1',['dh1',['../classCurve25519.html#a2b6911583d17ea9a36bbbb40d58b3d89',1,'Curve25519']]], - ['dh2',['dh2',['../classCurve25519.html#a14022d6ac68ec691ffb0247275078ab9',1,'Curve25519']]], + ['dh1',['dh1',['../classCurve25519.html#a2b6911583d17ea9a36bbbb40d58b3d89',1,'Curve25519::dh1()'],['../classP521.html#ae04c439804f445535295bf44ae56afbf',1,'P521::dh1()']]], + ['dh2',['dh2',['../classCurve25519.html#a14022d6ac68ec691ffb0247275078ab9',1,'Curve25519::dh2()'],['../classP521.html#a7b9d4f74cc2d71a488a33ab165537491',1,'P521::dh2()']]], ['disable32khzoutput',['disable32kHzOutput',['../classDS3231RTC.html#a7c9c197c6f27c26e0cb9c5ddc95633c8',1,'DS3231RTC::disable32kHzOutput()'],['../classDS3232RTC.html#ada732bae42fc2833e59ae293aa27ddcb',1,'DS3232RTC::disable32kHzOutput()']]], ['disablealarm',['disableAlarm',['../classDS3231RTC.html#a21e2667c53d30aa425043ec08a117c47',1,'DS3231RTC']]], ['disablealarminterrupts',['disableAlarmInterrupts',['../classDS3231RTC.html#a245a56a9396ef49a4e089d743c759cdb',1,'DS3231RTC::disableAlarmInterrupts()'],['../classDS3232RTC.html#a225b8c62d617aa1b7be7d20e8a033be9',1,'DS3232RTC::disableAlarmInterrupts()']]], diff --git a/search/functions_4.js b/search/functions_4.js index 25ab1e47..ff19554e 100644 --- a/search/functions_4.js +++ b/search/functions_4.js @@ -15,7 +15,7 @@ var searchData= ['end',['end',['../classShell.html#a8a654aadd0b6a379309bb1007749e41d',1,'Shell::end()'],['../classTerminal.html#a9e4c08d43a1a1c039e385d63aca049c0',1,'Terminal::end()']]], ['endwrite',['endWrite',['../classI2CMaster.html#ab29f63551ddeb032a91505d1c0b8ac41',1,'I2CMaster::endWrite()'],['../classSoftI2C.html#aa12ae82813598b2e9ea70463c23c5bf3',1,'SoftI2C::endWrite()']]], ['enterfield',['enterField',['../classBoolField.html#ab3f1e610b52caed7e41016f6ae3d7d09',1,'BoolField::enterField()'],['../classField.html#aa032bbeacb405c56546cb56fbbee94f5',1,'Field::enterField()'],['../classIntField.html#a51d9127b660e8dd7f87718acd230202a',1,'IntField::enterField()'],['../classListField.html#a191b79b460e45cf48e04b04eface2888',1,'ListField::enterField()'],['../classTextField.html#aa78f1354f9240b64fabd6f996e312f32',1,'TextField::enterField()'],['../classTimeField.html#ae914d6b870283a334d2d669460f7646b',1,'TimeField::enterField()']]], - ['eval',['eval',['../classCurve25519.html#a2e4b7dd83a019b32c76584c99bfda21a',1,'Curve25519']]], + ['eval',['eval',['../classCurve25519.html#a2e4b7dd83a019b32c76584c99bfda21a',1,'Curve25519::eval()'],['../classP521.html#ac2e07ce7e846ba180938b41b4a2ae563',1,'P521::eval()']]], ['execute',['execute',['../classLoginShell.html#af54c5c14adac7955cf5e4f9460bd9ca5',1,'LoginShell::execute()'],['../classShell.html#ab4a3f80dc5ff779ac99116a1f7e35cda',1,'Shell::execute()']]], ['exit',['exit',['../classShell.html#ab9dab65bc0757ce3bb0ac926bbefcee3',1,'Shell']]], ['exitfield',['exitField',['../classField.html#ad6805c75ee1e62f8cd8bd550c4530c07',1,'Field::exitField()'],['../classTimeField.html#a5a6b7db2e3fda7745e0ff9c3d8d9a541',1,'TimeField::exitField()']]], diff --git a/search/functions_6.js b/search/functions_6.js index 2749475d..fe65d4a0 100644 --- a/search/functions_6.js +++ b/search/functions_6.js @@ -2,7 +2,7 @@ var searchData= [ ['gcm',['GCM',['../classGCM.html#acbef04a5593177aabf19df538ad3def7',1,'GCM']]], ['gcmcommon',['GCMCommon',['../classGCMCommon.html#a1b05ff393e8c20db30cb991e875aab19',1,'GCMCommon']]], - ['generateprivatekey',['generatePrivateKey',['../classEd25519.html#ab8be5115ac5adc8a556dbac7d7e90d2e',1,'Ed25519']]], + ['generateprivatekey',['generatePrivateKey',['../classEd25519.html#ab8be5115ac5adc8a556dbac7d7e90d2e',1,'Ed25519::generatePrivateKey()'],['../classP521.html#ae5b727018648e4a165f504024c4ccc45',1,'P521::generatePrivateKey()']]], ['getbutton',['getButton',['../classLCD.html#ac1e80e2603bd1cf0276c36092c416292',1,'LCD']]], ['ghash',['GHASH',['../classGHASH.html#a3a1abd0f641bccd9b4aa1f40beb8dca3',1,'GHASH']]] ]; diff --git a/search/functions_8.js b/search/functions_8.js index 81e24eac..68ec2f5e 100644 --- a/search/functions_8.js +++ b/search/functions_8.js @@ -13,8 +13,12 @@ var searchData= ['isrealtime',['isRealTime',['../classDS1307RTC.html#aba01ca4c2f7863b610e5dfe9146886bd',1,'DS1307RTC::isRealTime()'],['../classDS3231RTC.html#a2fa6fdd1f9e2b2b99be077c73639dce0',1,'DS3231RTC::isRealTime()'],['../classDS3232RTC.html#acc5908a3743afb4c26bd75e22cad87a4',1,'DS3232RTC::isRealTime()']]], ['isscreensaved',['isScreenSaved',['../classLCD.html#af5d5ca618a3161aa352027b58fe09d0e',1,'LCD']]], ['isvalid',['isValid',['../classBitmap.html#a3846a240722e847d3cf11f701da1ce7b',1,'Bitmap']]], + ['isvalidcurvepoint',['isValidCurvePoint',['../classP521.html#a3f045e0b7a483fc557747472ade31298',1,'P521']]], + ['isvalidprivatekey',['isValidPrivateKey',['../classP521.html#a5802ebd25142789bb2df930ecd765d39',1,'P521']]], + ['isvalidpublickey',['isValidPublicKey',['../classP521.html#af0bd7851bb15b737a821320b394aec96',1,'P521']]], ['isvisible',['isVisible',['../classForm.html#a3101f288e3e5aa8307c57f35861ad587',1,'Form']]], ['iswidecharacter',['isWideCharacter',['../classTerminal.html#a25fdddd02378250799016cbb714c8a6b',1,'Terminal']]], + ['iszero',['isZero',['../classBigNumberUtil.html#ad0aafacd8e224bd543341973c62ff1dd',1,'BigNumberUtil']]], ['items',['items',['../classListField.html#a4dbbdeebd386551eb8f245b42b45ccf0',1,'ListField']]], ['ivsize',['ivSize',['../classCBCCommon.html#a016277533730284a38bb6ad8cd6f91ce',1,'CBCCommon::ivSize()'],['../classCFBCommon.html#a55db1be69de87aafe5601d31be918ebb',1,'CFBCommon::ivSize()'],['../classChaCha.html#afaa3df343a7d07976bd7e03a0c1bf43c',1,'ChaCha::ivSize()'],['../classChaChaPoly.html#ac3ebfaaaffe9d607905681949e75140d',1,'ChaChaPoly::ivSize()'],['../classCipher.html#ab8b53ddc4ce431f03c2a1903d70ace9c',1,'Cipher::ivSize()'],['../classCTRCommon.html#a98c1717d11d8da8e1fa108607358774a',1,'CTRCommon::ivSize()'],['../classEAXCommon.html#abc6ccfb9338c94699458723f669513bf',1,'EAXCommon::ivSize()'],['../classGCMCommon.html#a01cff072505e861fd20f6cfee1e10fb2',1,'GCMCommon::ivSize()'],['../classOFBCommon.html#a67b4639aaece17a796fcba3a2ce8b43c',1,'OFBCommon::ivSize()']]] ]; diff --git a/search/functions_a.js b/search/functions_a.js index 9b3cf49b..f9b30a30 100644 --- a/search/functions_a.js +++ b/search/functions_a.js @@ -1,7 +1,7 @@ var searchData= [ ['label',['label',['../classField.html#aaa861ef917130c989a955bc75c683afe',1,'Field']]], - ['lcd',['LCD',['../classLCD.html#a00bb2db1390721abc7b24ac4b8c276c8',1,'LCD::LCD()'],['../classLCD.html#a067bc741cf27f143aba5d9f147908401',1,'LCD::LCD(uint8_t pin9)'],['../classLCD.html#a203d268bef6c61fa293562dbb0e9f51e',1,'LCD::LCD(uint8_t rs, uint8_t enable, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3)'],['../classField.html#a5cf21bf958a71e51feac9e1bf9f599d1',1,'Field::lcd()']]], + ['lcd',['lcd',['../classField.html#a5cf21bf958a71e51feac9e1bf9f599d1',1,'Field::lcd()'],['../classLCD.html#a00bb2db1390721abc7b24ac4b8c276c8',1,'LCD::LCD()'],['../classLCD.html#a067bc741cf27f143aba5d9f147908401',1,'LCD::LCD(uint8_t pin9)'],['../classLCD.html#a203d268bef6c61fa293562dbb0e9f51e',1,'LCD::LCD(uint8_t rs, uint8_t enable, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3)']]], ['led',['led',['../classCharlieplex.html#a90fd09f24b62424b0b7b8bcdb0140b9d',1,'Charlieplex']]], ['listfield',['ListField',['../classListField.html#a118501da7edb0b0bc6b493734975b4e9',1,'ListField::ListField(const String &label)'],['../classListField.html#aa303898a1f74b52c1c4982653de488b7',1,'ListField::ListField(Form &form, const String &label, ListItems items, int value=0)']]], ['loginshell',['LoginShell',['../classLoginShell.html#a8a6e6c259bc6415eb9cfbb13980e31d4',1,'LoginShell']]], diff --git a/shell-serial_8dox.html b/shell-serial_8dox.html index 8c389d95..2030e26a 100644 --- a/shell-serial_8dox.html +++ b/shell-serial_8dox.html @@ -87,7 +87,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/shell-telnet_8dox.html b/shell-telnet_8dox.html index 49f8868a..a974ac83 100644 --- a/shell-telnet_8dox.html +++ b/shell-telnet_8dox.html @@ -87,7 +87,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/shell_serial.html b/shell_serial.html index 7f38a248..59c2894a 100644 --- a/shell_serial.html +++ b/shell_serial.html @@ -156,7 +156,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/shell_telnet.html b/shell_telnet.html index 81346678..98d84c1b 100644 --- a/shell_telnet.html +++ b/shell_telnet.html @@ -165,7 +165,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/structRTCAlarm.html b/structRTCAlarm.html index 46edf1cc..89603d9d 100644 --- a/structRTCAlarm.html +++ b/structRTCAlarm.html @@ -200,7 +200,7 @@ uint8_t  diff --git a/structRTCDate.html b/structRTCDate.html index 5aa28bcf..ca81b210 100644 --- a/structRTCDate.html +++ b/structRTCDate.html @@ -123,7 +123,7 @@ uint8_t  diff --git a/structRTCTime.html b/structRTCTime.html index bde8bc8a..978065d4 100644 --- a/structRTCTime.html +++ b/structRTCTime.html @@ -123,7 +123,7 @@ uint8_t