diff --git a/AES128_8cpp_source.html b/AES128_8cpp_source.html index b649c075..1a843aea 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 aa66934f..185b43d8 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 ba5e71bb..b255964a 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 c7be49c7..fd016229 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 c2cd0ff4..fe250160 100644 --- a/AES_8h_source.html +++ b/AES_8h_source.html @@ -206,7 +206,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/AuthenticatedCipher_8cpp_source.html b/AuthenticatedCipher_8cpp_source.html index bb203b8c..d2236523 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 11bcc49b..df098438 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 d4d53b82..50a1977e 100644 --- a/BLAKE2b_8cpp_source.html +++ b/BLAKE2b_8cpp_source.html @@ -330,7 +330,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/BLAKE2b_8h_source.html b/BLAKE2b_8h_source.html index 7192699a..154376f2 100644 --- a/BLAKE2b_8h_source.html +++ b/BLAKE2b_8h_source.html @@ -163,7 +163,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/BLAKE2s_8cpp_source.html b/BLAKE2s_8cpp_source.html index 31bc7033..8b702994 100644 --- a/BLAKE2s_8cpp_source.html +++ b/BLAKE2s_8cpp_source.html @@ -322,7 +322,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/BLAKE2s_8h_source.html b/BLAKE2s_8h_source.html index 6aad69e0..87128561 100644 --- a/BLAKE2s_8h_source.html +++ b/BLAKE2s_8h_source.html @@ -162,7 +162,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/BigNumberUtil_8cpp_source.html b/BigNumberUtil_8cpp_source.html new file mode 100644 index 00000000..645a56d6 --- /dev/null +++ b/BigNumberUtil_8cpp_source.html @@ -0,0 +1,394 @@ + + + + + + +ArduinoLibs: BigNumberUtil.cpp Source File + + + + + + + + + +
+
+ + + + + + +
+
ArduinoLibs +
+
+
+ + + + + + +
+ All Classes Files Functions Variables Typedefs Enumerations Enumerator Groups Pages
+ + +
+ +
+ + +
+
+
+
BigNumberUtil.cpp
+
+
+
1 /*
+
2  * Copyright (C) 2015 Southern Storm Software, Pty Ltd.
+
3  *
+
4  * Permission is hereby granted, free of charge, to any person obtaining a
+
5  * copy of this software and associated documentation files (the "Software"),
+
6  * to deal in the Software without restriction, including without limitation
+
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+
8  * and/or sell copies of the Software, and to permit persons to whom the
+
9  * Software is furnished to do so, subject to the following conditions:
+
10  *
+
11  * The above copyright notice and this permission notice shall be included
+
12  * in all copies or substantial portions of the Software.
+
13  *
+
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+
15  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+
16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+
17  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+
18  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+
19  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+
20  * DEALINGS IN THE SOFTWARE.
+
21  */
+
22 
+
23 #include "BigNumberUtil.h"
+
24 #include "utility/EndianUtil.h"
+
25 #include <string.h>
+
26 
+
54 void BigNumberUtil::unpackLE(limb_t *limbs, size_t count,
+
55  const uint8_t *bytes, size_t len)
+
56 {
+
57 #if BIGNUMBER_LIMB_8BIT
+
58  if (len < count) {
+
59  memcpy(limbs, bytes, len);
+
60  memset(limbs + len, 0, count - len);
+
61  } else {
+
62  memcpy(limbs, bytes, count);
+
63  }
+
64 #elif CRYPTO_LITTLE_ENDIAN
+
65  count *= sizeof(limb_t);
+
66  if (len < count) {
+
67  memcpy(limbs, bytes, len);
+
68  memset(((uint8_t *)limbs) + len, 0, count - len);
+
69  } else {
+
70  memcpy(limbs, bytes, count);
+
71  }
+
72 #elif BIGNUMBER_LIMB_16BIT
+
73  while (count > 0 && len >= 2) {
+
74  *limbs++ = ((limb_t)(bytes[0])) |
+
75  (((limb_t)(bytes[1])) << 8);
+
76  bytes += 2;
+
77  --count;
+
78  len -= 2;
+
79  }
+
80  if (count > 0 && len == 1) {
+
81  *limbs++ = ((limb_t)(bytes[0]));
+
82  --count;
+
83  }
+
84  while (count > 0) {
+
85  *limbs++ = 0;
+
86  --count;
+
87  }
+
88 #elif BIGNUMBER_LIMB_32BIT
+
89  while (count > 0 && len >= 4) {
+
90  *limbs++ = ((limb_t)(bytes[0])) |
+
91  (((limb_t)(bytes[1])) << 8) |
+
92  (((limb_t)(bytes[2])) << 16) |
+
93  (((limb_t)(bytes[3])) << 24);
+
94  bytes += 4;
+
95  --count;
+
96  len -= 4;
+
97  }
+
98  if (count > 0) {
+
99  if (len == 3) {
+
100  *limbs++ = ((limb_t)(bytes[0])) |
+
101  (((limb_t)(bytes[1])) << 8) |
+
102  (((limb_t)(bytes[2])) << 16);
+
103  } else if (len == 2) {
+
104  *limbs++ = ((limb_t)(bytes[0])) |
+
105  (((limb_t)(bytes[1])) << 8);
+
106  } else if (len == 1) {
+
107  *limbs++ = ((limb_t)(bytes[0]));
+
108  }
+
109  --count;
+
110  }
+
111  while (count > 0) {
+
112  *limbs++ = 0;
+
113  --count;
+
114  }
+
115 #endif
+
116 }
+
117 
+
133 void BigNumberUtil::unpackBE(limb_t *limbs, size_t count,
+
134  const uint8_t *bytes, size_t len)
+
135 {
+
136 #if BIGNUMBER_LIMB_8BIT
+
137  while (count > 0 && len > 0) {
+
138  --count;
+
139  --len;
+
140  *limbs++ = bytes[len];
+
141  }
+
142  memset(limbs, 0, count);
+
143 #elif BIGNUMBER_LIMB_16BIT
+
144  bytes += len;
+
145  while (count > 0 && len >= 2) {
+
146  --count;
+
147  bytes -= 2;
+
148  len -= 2;
+
149  *limbs++ = ((limb_t)(bytes[1])) |
+
150  (((limb_t)(bytes[0])) << 8);
+
151  }
+
152  if (count > 0 && len == 1) {
+
153  --count;
+
154  --bytes;
+
155  *limbs++ = (limb_t)(bytes[0]);
+
156  }
+
157  memset(limbs, 0, count * sizeof(limb_t));
+
158 #elif BIGNUMBER_LIMB_32BIT
+
159  bytes += len;
+
160  while (count > 0 && len >= 4) {
+
161  --count;
+
162  bytes -= 4;
+
163  len -= 4;
+
164  *limbs++ = ((limb_t)(bytes[3])) |
+
165  (((limb_t)(bytes[2])) << 8) |
+
166  (((limb_t)(bytes[1])) << 16) |
+
167  (((limb_t)(bytes[0])) << 24);
+
168  }
+
169  if (count > 0) {
+
170  if (len == 3) {
+
171  --count;
+
172  bytes -= 3;
+
173  *limbs++ = ((limb_t)(bytes[2])) |
+
174  (((limb_t)(bytes[1])) << 8) |
+
175  (((limb_t)(bytes[0])) << 16);
+
176  } else if (len == 2) {
+
177  --count;
+
178  bytes -= 2;
+
179  *limbs++ = ((limb_t)(bytes[1])) |
+
180  (((limb_t)(bytes[0])) << 8);
+
181  } else if (len == 1) {
+
182  --count;
+
183  --bytes;
+
184  *limbs++ = (limb_t)(bytes[0]);
+
185  }
+
186  }
+
187  memset(limbs, 0, count * sizeof(limb_t));
+
188 #endif
+
189 }
+
190 
+
207 void BigNumberUtil::packLE(uint8_t *bytes, size_t len,
+
208  const limb_t *limbs, size_t count)
+
209 {
+
210 #if BIGNUMBER_LIMB_8BIT
+
211  if (len <= count) {
+
212  memcpy(bytes, limbs, len);
+
213  } else {
+
214  memcpy(bytes, limbs, count);
+
215  memset(bytes + count, 0, len - count);
+
216  }
+
217 #elif CRYPTO_LITTLE_ENDIAN
+
218  count *= sizeof(limb_t);
+
219  if (len <= count) {
+
220  memcpy(bytes, limbs, len);
+
221  } else {
+
222  memcpy(bytes, limbs, count);
+
223  memset(bytes + count, 0, len - count);
+
224  }
+
225 #elif BIGNUMBER_LIMB_16BIT
+
226  limb_t word;
+
227  while (count > 0 && len >= 2) {
+
228  word = *limbs++;
+
229  bytes[0] = (uint8_t)word;
+
230  bytes[1] = (uint8_t)(word >> 8);
+
231  --count;
+
232  len -= 2;
+
233  bytes += 2;
+
234  }
+
235  if (count > 0 && len == 1) {
+
236  bytes[0] = (uint8_t)(*limbs);
+
237  --len;
+
238  ++bytes;
+
239  }
+
240  memset(bytes, 0, len);
+
241 #elif BIGNUMBER_LIMB_32BIT
+
242  limb_t word;
+
243  while (count > 0 && len >= 4) {
+
244  word = *limbs++;
+
245  bytes[0] = (uint8_t)word;
+
246  bytes[1] = (uint8_t)(word >> 8);
+
247  bytes[2] = (uint8_t)(word >> 16);
+
248  bytes[3] = (uint8_t)(word >> 24);
+
249  --count;
+
250  len -= 4;
+
251  bytes += 4;
+
252  }
+
253  if (count > 0) {
+
254  if (len == 3) {
+
255  word = *limbs;
+
256  bytes[0] = (uint8_t)word;
+
257  bytes[1] = (uint8_t)(word >> 8);
+
258  bytes[2] = (uint8_t)(word >> 16);
+
259  len -= 3;
+
260  bytes += 3;
+
261  } else if (len == 2) {
+
262  word = *limbs;
+
263  bytes[0] = (uint8_t)word;
+
264  bytes[1] = (uint8_t)(word >> 8);
+
265  len -= 2;
+
266  bytes += 2;
+
267  } else if (len == 1) {
+
268  bytes[0] = (uint8_t)(*limbs);
+
269  --len;
+
270  ++bytes;
+
271  }
+
272  }
+
273  memset(bytes, 0, len);
+
274 #endif
+
275 }
+
276 
+
293 void BigNumberUtil::packBE(uint8_t *bytes, size_t len,
+
294  const limb_t *limbs, size_t count)
+
295 {
+
296 #if BIGNUMBER_LIMB_8BIT
+
297  if (len > count) {
+
298  size_t size = len - count;
+
299  memset(bytes, 0, size);
+
300  len -= size;
+
301  bytes += size;
+
302  } else if (len < count) {
+
303  count = len;
+
304  }
+
305  limbs += count;
+
306  while (count > 0) {
+
307  --count;
+
308  *bytes++ = *(--limbs);
+
309  }
+
310 #elif BIGNUMBER_LIMB_16BIT
+
311  size_t countBytes = count * sizeof(limb_t);
+
312  limb_t word;
+
313  if (len >= countBytes) {
+
314  size_t size = len - countBytes;
+
315  memset(bytes, 0, size);
+
316  len -= size;
+
317  bytes += size;
+
318  limbs += count;
+
319  } else {
+
320  count = len / sizeof(limb_t);
+
321  limbs += count;
+
322  if ((len & 1) != 0)
+
323  *bytes++ = (uint8_t)(*limbs);
+
324  }
+
325  while (count > 0) {
+
326  --count;
+
327  word = *(--limbs);
+
328  *bytes++ = (uint8_t)(word >> 8);
+
329  *bytes++ = (uint8_t)word;
+
330  }
+
331 #elif BIGNUMBER_LIMB_32BIT
+
332  size_t countBytes = count * sizeof(limb_t);
+
333  limb_t word;
+
334  if (len >= countBytes) {
+
335  size_t size = len - countBytes;
+
336  memset(bytes, 0, size);
+
337  len -= size;
+
338  bytes += size;
+
339  limbs += count;
+
340  } else {
+
341  count = len / sizeof(limb_t);
+
342  limbs += count;
+
343  if ((len & 3) == 3) {
+
344  word = *limbs;
+
345  *bytes++ = (uint8_t)(word >> 16);
+
346  *bytes++ = (uint8_t)(word >> 8);
+
347  *bytes++ = (uint8_t)word;
+
348  } else if ((len & 3) == 2) {
+
349  word = *limbs;
+
350  *bytes++ = (uint8_t)(word >> 8);
+
351  *bytes++ = (uint8_t)word;
+
352  } else if ((len & 3) == 1) {
+
353  *bytes++ = (uint8_t)(*limbs);
+
354  }
+
355  }
+
356  while (count > 0) {
+
357  --count;
+
358  word = *(--limbs);
+
359  *bytes++ = (uint8_t)(word >> 24);
+
360  *bytes++ = (uint8_t)(word >> 16);
+
361  *bytes++ = (uint8_t)(word >> 8);
+
362  *bytes++ = (uint8_t)word;
+
363  }
+
364 #endif
+
365 }
+
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.
+
static void unpackLE(limb_t *limbs, size_t count, const uint8_t *bytes, size_t len)
Unpacks the little-endian byte representation of a big number into a limb array.
+
static void 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.
+
+ + + + diff --git a/BigNumberUtil_8h_source.html b/BigNumberUtil_8h_source.html index 091a49a0..6c5ecfca 100644 --- a/BigNumberUtil_8h_source.html +++ b/BigNumberUtil_8h_source.html @@ -114,35 +114,59 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
24 #define CRYPTO_BIGNUMBERUTIL_h
25 
26 #include <inttypes.h>
-
27 
-
28 // Define exactly one of these to 1 to set the size of the basic limb type.
-
29 // 16-bit limbs seem to give the best performance on 8-bit AVR micros.
-
30 #define BIGNUMBER_LIMB_8BIT 0
-
31 #define BIGNUMBER_LIMB_16BIT 1
-
32 #define BIGNUMBER_LIMB_32BIT 0
-
33 
-
34 // Define the limb types to use on this platform.
-
35 #if BIGNUMBER_LIMB_8BIT
-
36 typedef uint8_t limb_t;
-
37 typedef int8_t slimb_t;
-
38 typedef uint16_t dlimb_t;
-
39 #elif BIGNUMBER_LIMB_16BIT
-
40 typedef uint16_t limb_t;
-
41 typedef int16_t slimb_t;
-
42 typedef uint32_t dlimb_t;
-
43 #elif BIGNUMBER_LIMB_32BIT
-
44 typedef uint32_t limb_t;
-
45 typedef int32_t slimb_t;
-
46 typedef uint64_t dlimb_t;
-
47 #else
-
48 #error "limb_t must be 8, 16, or 32 bits in size"
-
49 #endif
-
50 
-
51 #endif
+
27 #include <stddef.h>
+
28 
+
29 // Define exactly one of these to 1 to set the size of the basic limb type.
+
30 // 16-bit limbs seem to give the best performance on 8-bit AVR micros.
+
31 #define BIGNUMBER_LIMB_8BIT 0
+
32 #define BIGNUMBER_LIMB_16BIT 1
+
33 #define BIGNUMBER_LIMB_32BIT 0
+
34 
+
35 // Define the limb types to use on this platform.
+
36 #if BIGNUMBER_LIMB_8BIT
+
37 typedef uint8_t limb_t;
+
38 typedef int8_t slimb_t;
+
39 typedef uint16_t dlimb_t;
+
40 #elif BIGNUMBER_LIMB_16BIT
+
41 typedef uint16_t limb_t;
+
42 typedef int16_t slimb_t;
+
43 typedef uint32_t dlimb_t;
+
44 #elif BIGNUMBER_LIMB_32BIT
+
45 typedef uint32_t limb_t;
+
46 typedef int32_t slimb_t;
+
47 typedef uint64_t dlimb_t;
+
48 #else
+
49 #error "limb_t must be 8, 16, or 32 bits in size"
+
50 #endif
+
51 
+
52 class BigNumberUtil
+
53 {
+
54 public:
+
55  static void unpackLE(limb_t *limbs, size_t count,
+
56  const uint8_t *bytes, size_t len);
+
57  static void unpackBE(limb_t *limbs, size_t count,
+
58  const uint8_t *bytes, size_t len);
+
59  static void packLE(uint8_t *bytes, size_t len,
+
60  const limb_t *limbs, size_t count);
+
61  static void packBE(uint8_t *bytes, size_t len,
+
62  const limb_t *limbs, size_t count);
+
63 
+
64 private:
+
65  // Constructor and destructor are private - cannot instantiate this class.
+
66  BigNumberUtil() {}
+
67  ~BigNumberUtil() {}
+
68 };
+
69 
+
70 #endif
+
BigNumberUtil
Utilities to assist with implementing big number arithmetic.
Definition: BigNumberUtil.h:52
+
BigNumberUtil::packBE
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.
Definition: BigNumberUtil.cpp:293
+
BigNumberUtil::unpackLE
static void unpackLE(limb_t *limbs, size_t count, const uint8_t *bytes, size_t len)
Unpacks the little-endian byte representation of a big number into a limb array.
Definition: BigNumberUtil.cpp:54
+
BigNumberUtil::unpackBE
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.
Definition: BigNumberUtil.cpp:133
+
BigNumberUtil::packLE
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.
Definition: BigNumberUtil.cpp:207
diff --git a/Bitmap_8cpp_source.html b/Bitmap_8cpp_source.html index 5a3eda0d..7a9d5124 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 aed02cf3..9afe823d 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 744ac6b5..151c24b5 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 5768081c..8ab33dea 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 e2dc6923..d2acca86 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 73ae9976..aba70a9f 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 bef24d94..1a8142e9 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 348f608b..7f09374e 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 0962df34..0302e1fb 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 0c8679d0..0df22e60 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 cd1d365b..341a7b43 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 c50e16d9..24741487 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 cb9e9092..d0f446c7 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 25026fa0..470da414 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 332e935f..bfdd0f54 100644 --- a/ChaChaPoly_8cpp_source.html +++ b/ChaChaPoly_8cpp_source.html @@ -262,7 +262,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/ChaChaPoly_8h_source.html b/ChaChaPoly_8h_source.html index cdd8c9e1..67200ed1 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 471105cc..33fa3826 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 1cdddb88..df283015 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 755625b6..9d56867d 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 233680f9..fd67e3b6 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 5c2571df..a9053193 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 5c7325db..91dacb83 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 c106bfea..b85401b7 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 eac0a424..67496273 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 745c767c..50052e43 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 4e0f2c3c..1097082f 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 9529613f..6e49bdb8 100644 --- a/Curve25519_8cpp_source.html +++ b/Curve25519_8cpp_source.html @@ -123,601 +123,594 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
46 // Number of bits in limb_t.
47 #define LIMB_BITS (8 * sizeof(limb_t))
48 
-
68 bool Curve25519::eval(uint8_t result[32], const uint8_t s[32], const uint8_t x[32])
-
69 {
-
70  limb_t x_1[NUM_LIMBS];
-
71  limb_t x_2[NUM_LIMBS];
-
72  limb_t x_3[NUM_LIMBS];
-
73  limb_t z_2[NUM_LIMBS];
-
74  limb_t z_3[NUM_LIMBS];
-
75  limb_t A[NUM_LIMBS];
-
76  limb_t B[NUM_LIMBS];
-
77  limb_t C[NUM_LIMBS];
-
78  limb_t D[NUM_LIMBS];
-
79  limb_t E[NUM_LIMBS];
-
80  limb_t AA[NUM_LIMBS];
-
81  limb_t BB[NUM_LIMBS];
-
82  limb_t DA[NUM_LIMBS];
-
83  limb_t CB[NUM_LIMBS];
-
84  uint8_t mask;
-
85  uint8_t sposn;
-
86  uint8_t select;
-
87  uint8_t swap;
-
88  bool retval;
-
89 
-
90  // Unpack the "x" argument into the limb representation
-
91  // which also masks off the high bit. NULL means 9.
-
92  if (x) {
-
93  unpack(x_1, x); // x_1 = x
-
94  } else {
-
95  memset(x_1, 0, sizeof(x_1)); // x_1 = 9
-
96  x_1[0] = 9;
-
97  }
-
98 
-
99  // Check that "x" is within the range of the modulo field.
-
100  // We can do this with a reduction - if there was no borrow
-
101  // then the value of "x" was out of range. Timing is sensitive
-
102  // here so that we don't reveal anything about the value of "x".
-
103  // If there was a reduction, then continue executing the rest
-
104  // of this function with the (now) in-range "x" value and
-
105  // report the failure at the end.
-
106  retval = (bool)(reduceQuick(x_1) & 0x01);
-
107 
-
108  // Initialize the other temporary variables.
-
109  memset(x_2, 0, sizeof(x_2)); // x_2 = 1
-
110  x_2[0] = 1;
-
111  memset(z_2, 0, sizeof(z_2)); // z_2 = 0
-
112  memcpy(x_3, x_1, sizeof(x_1)); // x_3 = x
-
113  memcpy(z_3, x_2, sizeof(x_2)); // z_3 = 1
-
114 
-
115  // Iterate over all 255 bits of "s" from the highest to the lowest.
-
116  // We ignore the high bit of the 256-bit representation of "s".
-
117  mask = 0x40;
-
118  sposn = 31;
-
119  swap = 0;
-
120  for (uint8_t t = 255; t > 0; --t) {
-
121  // Conditional swaps on entry to this bit but only if we
-
122  // didn't swap on the previous bit.
-
123  select = s[sposn] & mask;
-
124  swap ^= select;
-
125  cswap(swap, x_2, x_3);
-
126  cswap(swap, z_2, z_3);
+
49 // The overhead of clean() calls in mul(), reduceQuick(), etc can
+
50 // add up to a lot of processing time during eval(). Only do such
+
51 // cleanups if strict mode has been enabled. Other implementations
+
52 // like curve25519-donna don't do any cleaning at all so the value
+
53 // of cleaning up the stack is dubious at best anyway.
+
54 #if defined(CURVE25519_STRICT_CLEAN)
+
55 #define strict_clean(x) clean(x)
+
56 #else
+
57 #define strict_clean(x) do { ; } while (0)
+
58 #endif
+
59 
+
79 bool Curve25519::eval(uint8_t result[32], const uint8_t s[32], const uint8_t x[32])
+
80 {
+
81  limb_t x_1[NUM_LIMBS];
+
82  limb_t x_2[NUM_LIMBS];
+
83  limb_t x_3[NUM_LIMBS];
+
84  limb_t z_2[NUM_LIMBS];
+
85  limb_t z_3[NUM_LIMBS];
+
86  limb_t A[NUM_LIMBS];
+
87  limb_t B[NUM_LIMBS];
+
88  limb_t C[NUM_LIMBS];
+
89  limb_t D[NUM_LIMBS];
+
90  limb_t E[NUM_LIMBS];
+
91  limb_t AA[NUM_LIMBS];
+
92  limb_t BB[NUM_LIMBS];
+
93  limb_t DA[NUM_LIMBS];
+
94  limb_t CB[NUM_LIMBS];
+
95  uint8_t mask;
+
96  uint8_t sposn;
+
97  uint8_t select;
+
98  uint8_t swap;
+
99  bool retval;
+
100 
+
101  // Unpack the "x" argument into the limb representation
+
102  // which also masks off the high bit. NULL means 9.
+
103  if (x) {
+
104  // x1 = x
+
105  BigNumberUtil::unpackLE(x_1, NUM_LIMBS, x, 32);
+
106  x_1[NUM_LIMBS - 1] &= ((((limb_t)1) << (LIMB_BITS - 1)) - 1);
+
107  } else {
+
108  memset(x_1, 0, sizeof(x_1)); // x_1 = 9
+
109  x_1[0] = 9;
+
110  }
+
111 
+
112  // Check that "x" is within the range of the modulo field.
+
113  // We can do this with a reduction - if there was no borrow
+
114  // then the value of "x" was out of range. Timing is sensitive
+
115  // here so that we don't reveal anything about the value of "x".
+
116  // If there was a reduction, then continue executing the rest
+
117  // of this function with the (now) in-range "x" value and
+
118  // report the failure at the end.
+
119  retval = (bool)(reduceQuick(x_1) & 0x01);
+
120 
+
121  // Initialize the other temporary variables.
+
122  memset(x_2, 0, sizeof(x_2)); // x_2 = 1
+
123  x_2[0] = 1;
+
124  memset(z_2, 0, sizeof(z_2)); // z_2 = 0
+
125  memcpy(x_3, x_1, sizeof(x_1)); // x_3 = x
+
126  memcpy(z_3, x_2, sizeof(x_2)); // z_3 = 1
127 
-
128  // Evaluate the curve.
-
129  add(A, x_2, z_2); // A = x_2 + z_2
-
130  square(AA, A); // AA = A^2
-
131  sub(B, x_2, z_2); // B = x_2 - z_2
-
132  square(BB, B); // BB = B^2
-
133  sub(E, AA, BB); // E = AA - BB
-
134  add(C, x_3, z_3); // C = x_3 + z_3
-
135  sub(D, x_3, z_3); // D = x_3 - z_3
-
136  mul(DA, D, A); // DA = D * A
-
137  mul(CB, C, B); // CB = C * B
-
138  add(x_3, DA, CB); // x_3 = (DA + CB)^2
-
139  square(x_3, x_3);
-
140  sub(z_3, DA, CB); // z_3 = x_1 * (DA - CB)^2
-
141  square(z_3, z_3);
-
142  mul(z_3, z_3, x_1);
-
143  mul(x_2, AA, BB); // x_2 = AA * BB
-
144  mulA24(z_2, E); // z_2 = E * (AA + a24 * E)
-
145  add(z_2, z_2, AA);
-
146  mul(z_2, z_2, E);
-
147 
-
148  // Move onto the next lower bit of "s".
-
149  mask >>= 1;
-
150  if (!mask) {
-
151  --sposn;
-
152  mask = 0x80;
-
153  swap = select << 7;
-
154  } else {
-
155  swap = select >> 1;
-
156  }
-
157  }
-
158 
-
159  // Final conditional swaps.
-
160  cswap(swap, x_2, x_3);
-
161  cswap(swap, z_2, z_3);
-
162 
-
163  // Compute x_2 * (z_2 ^ (p - 2)) where p = 2^255 - 19.
-
164  recip(z_3, z_2);
-
165  mul(x_2, x_2, z_3);
-
166 
-
167  // Pack the result into the return array.
-
168  pack(result, x_2);
-
169 
-
170  // Clean up and exit.
-
171  clean(x_1);
-
172  clean(x_2);
-
173  clean(x_3);
-
174  clean(z_2);
-
175  clean(z_3);
-
176  clean(A);
-
177  clean(B);
-
178  clean(C);
-
179  clean(D);
-
180  clean(E);
-
181  clean(AA);
-
182  clean(BB);
-
183  clean(DA);
-
184  clean(CB);
-
185  return retval;
-
186 }
-
187 
-
231 void Curve25519::dh1(uint8_t k[32], uint8_t f[32])
-
232 {
-
233  do {
-
234  // Generate a random "f" value and then adjust the value to make
-
235  // it valid as an "s" value for eval(). According to the specification
-
236  // we need to mask off the 3 right-most bits of f[0], mask off the
-
237  // left-most bit of f[31], and set the second to left-most bit of f[31].
-
238  RNG.rand(f, 32);
-
239  f[0] &= 0xF8;
-
240  f[31] = (f[31] & 0x7F) | 0x40;
-
241 
-
242  // Evaluate the curve function: k = Curve25519::eval(f, 9).
-
243  // We pass NULL to eval() to indicate the value 9. There is no
-
244  // need to check the return value from eval() because we know
-
245  // that 9 is a valid field element.
-
246  eval(k, f, 0);
-
247 
-
248  // If "k" is weak for contributory behaviour then reject it,
-
249  // generate another "f" value, and try again. This case is
-
250  // highly unlikely but we still perform the check just in case.
-
251  } while (isWeakPoint(k));
-
252 }
-
253 
-
269 bool Curve25519::dh2(uint8_t k[32], uint8_t f[32])
-
270 {
-
271  uint8_t weak;
-
272 
-
273  // Evaluate the curve function: k = Curve25519::eval(f, k).
-
274  // If "k" is weak for contributory behaviour before or after
-
275  // the curve evaluation, then fail the exchange. For safety
-
276  // we perform every phase of the weak checks even if we could
-
277  // bail out earlier so that the execution takes the same
-
278  // amount of time for weak and non-weak "k" values.
-
279  weak = isWeakPoint(k); // Is "k" weak before?
-
280  weak |= ((eval(k, f, k) ^ 0x01) & 0x01); // Is "k" weak during?
-
281  weak |= isWeakPoint(k); // Is "k" weak after?
-
282  clean(f, 32);
-
283  return (bool)((weak ^ 0x01) & 0x01);
-
284 }
+
128  // Iterate over all 255 bits of "s" from the highest to the lowest.
+
129  // We ignore the high bit of the 256-bit representation of "s".
+
130  mask = 0x40;
+
131  sposn = 31;
+
132  swap = 0;
+
133  for (uint8_t t = 255; t > 0; --t) {
+
134  // Conditional swaps on entry to this bit but only if we
+
135  // didn't swap on the previous bit.
+
136  select = s[sposn] & mask;
+
137  swap ^= select;
+
138  cswap(swap, x_2, x_3);
+
139  cswap(swap, z_2, z_3);
+
140 
+
141  // Evaluate the curve.
+
142  add(A, x_2, z_2); // A = x_2 + z_2
+
143  square(AA, A); // AA = A^2
+
144  sub(B, x_2, z_2); // B = x_2 - z_2
+
145  square(BB, B); // BB = B^2
+
146  sub(E, AA, BB); // E = AA - BB
+
147  add(C, x_3, z_3); // C = x_3 + z_3
+
148  sub(D, x_3, z_3); // D = x_3 - z_3
+
149  mul(DA, D, A); // DA = D * A
+
150  mul(CB, C, B); // CB = C * B
+
151  add(x_3, DA, CB); // x_3 = (DA + CB)^2
+
152  square(x_3, x_3);
+
153  sub(z_3, DA, CB); // z_3 = x_1 * (DA - CB)^2
+
154  square(z_3, z_3);
+
155  mul(z_3, z_3, x_1);
+
156  mul(x_2, AA, BB); // x_2 = AA * BB
+
157  mulA24(z_2, E); // z_2 = E * (AA + a24 * E)
+
158  add(z_2, z_2, AA);
+
159  mul(z_2, z_2, E);
+
160 
+
161  // Move onto the next lower bit of "s".
+
162  mask >>= 1;
+
163  if (!mask) {
+
164  --sposn;
+
165  mask = 0x80;
+
166  swap = select << 7;
+
167  } else {
+
168  swap = select >> 1;
+
169  }
+
170  }
+
171 
+
172  // Final conditional swaps.
+
173  cswap(swap, x_2, x_3);
+
174  cswap(swap, z_2, z_3);
+
175 
+
176  // Compute x_2 * (z_2 ^ (p - 2)) where p = 2^255 - 19.
+
177  recip(z_3, z_2);
+
178  mul(x_2, x_2, z_3);
+
179 
+
180  // Pack the result into the return array.
+
181  BigNumberUtil::packLE(result, 32, x_2, NUM_LIMBS);
+
182 
+
183  // Clean up and exit.
+
184  clean(x_1);
+
185  clean(x_2);
+
186  clean(x_3);
+
187  clean(z_2);
+
188  clean(z_3);
+
189  clean(A);
+
190  clean(B);
+
191  clean(C);
+
192  clean(D);
+
193  clean(E);
+
194  clean(AA);
+
195  clean(BB);
+
196  clean(DA);
+
197  clean(CB);
+
198  return retval;
+
199 }
+
200 
+
244 void Curve25519::dh1(uint8_t k[32], uint8_t f[32])
+
245 {
+
246  do {
+
247  // Generate a random "f" value and then adjust the value to make
+
248  // it valid as an "s" value for eval(). According to the specification
+
249  // we need to mask off the 3 right-most bits of f[0], mask off the
+
250  // left-most bit of f[31], and set the second to left-most bit of f[31].
+
251  RNG.rand(f, 32);
+
252  f[0] &= 0xF8;
+
253  f[31] = (f[31] & 0x7F) | 0x40;
+
254 
+
255  // Evaluate the curve function: k = Curve25519::eval(f, 9).
+
256  // We pass NULL to eval() to indicate the value 9. There is no
+
257  // need to check the return value from eval() because we know
+
258  // that 9 is a valid field element.
+
259  eval(k, f, 0);
+
260 
+
261  // If "k" is weak for contributory behaviour then reject it,
+
262  // generate another "f" value, and try again. This case is
+
263  // highly unlikely but we still perform the check just in case.
+
264  } while (isWeakPoint(k));
+
265 }
+
266 
+
282 bool Curve25519::dh2(uint8_t k[32], uint8_t f[32])
+
283 {
+
284  uint8_t weak;
285 
-
293 uint8_t Curve25519::isWeakPoint(const uint8_t k[32])
-
294 {
-
295  // List of weak points from http://cr.yp.to/ecdh.html
-
296  // That page lists some others but they are variants on these
-
297  // of the form "point + i * (2^255 - 19)" for i = 0, 1, 2.
-
298  // Here we mask off the high bit and eval() catches the rest.
-
299  static const uint8_t points[5][32] PROGMEM = {
-
300  {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
301  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
302  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
303  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
-
304  {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
305  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
306  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-
307  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
-
308  {0xE0, 0xEB, 0x7A, 0x7C, 0x3B, 0x41, 0xB8, 0xAE,
-
309  0x16, 0x56, 0xE3, 0xFA, 0xF1, 0x9F, 0xC4, 0x6A,
-
310  0xDA, 0x09, 0x8D, 0xEB, 0x9C, 0x32, 0xB1, 0xFD,
-
311  0x86, 0x62, 0x05, 0x16, 0x5F, 0x49, 0xB8, 0x00},
-
312  {0x5F, 0x9C, 0x95, 0xBC, 0xA3, 0x50, 0x8C, 0x24,
-
313  0xB1, 0xD0, 0xB1, 0x55, 0x9C, 0x83, 0xEF, 0x5B,
-
314  0x04, 0x44, 0x5C, 0xC4, 0x58, 0x1C, 0x8E, 0x86,
-
315  0xD8, 0x22, 0x4E, 0xDD, 0xD0, 0x9F, 0x11, 0x57},
-
316  {0xEC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-
317  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-
318  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-
319  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F}
-
320  };
-
321 
-
322  // Check each of the weak points in turn. We perform the
-
323  // comparisons carefully so as not to reveal the value of "k"
-
324  // in the instruction timing. If "k" is indeed weak then
-
325  // we still check everything so as not to reveal which
-
326  // weak point it is.
-
327  uint8_t result = 0;
-
328  for (uint8_t posn = 0; posn < 5; ++posn) {
-
329  const uint8_t *point = points[posn];
-
330  uint8_t check = (pgm_read_byte(point + 31) ^ k[31]) & 0x7F;
-
331  for (uint8_t index = 31; index > 0; --index)
-
332  check |= (pgm_read_byte(point + index - 1) ^ k[index - 1]);
-
333  result |= (uint8_t)((((uint16_t)0x0100) - check) >> 8);
-
334  }
-
335 
-
336  // The "result" variable will be non-zero if there was a match.
-
337  return result;
-
338 }
-
339 
-
352 void Curve25519::reduce(limb_t *result, limb_t *x, uint8_t size)
-
353 {
-
354  /*
-
355  Note: This explaination is best viewed with a UTF-8 text viewer.
-
356 
-
357  To help explain what this function is doing, the following describes
-
358  how to efficiently compute reductions modulo a base of the form (2ⁿ - b)
-
359  where b is greater than zero and (b + 1)² <= 2ⁿ.
-
360 
-
361  Here we are interested in reducing the result of multiplying two
-
362  numbers that are less than or equal to (2ⁿ - b - 1). That is,
-
363  multiplying numbers that have already been reduced.
-
364 
-
365  Given some x less than or equal to (2ⁿ - b - 1)², we want to find a
-
366  y less than (2ⁿ - b) such that:
-
367 
-
368  y ≡ x mod (2ⁿ - b)
+
286  // Evaluate the curve function: k = Curve25519::eval(f, k).
+
287  // If "k" is weak for contributory behaviour before or after
+
288  // the curve evaluation, then fail the exchange. For safety
+
289  // we perform every phase of the weak checks even if we could
+
290  // bail out earlier so that the execution takes the same
+
291  // amount of time for weak and non-weak "k" values.
+
292  weak = isWeakPoint(k); // Is "k" weak before?
+
293  weak |= ((eval(k, f, k) ^ 0x01) & 0x01); // Is "k" weak during?
+
294  weak |= isWeakPoint(k); // Is "k" weak after?
+
295  clean(f, 32);
+
296  return (bool)((weak ^ 0x01) & 0x01);
+
297 }
+
298 
+
306 uint8_t Curve25519::isWeakPoint(const uint8_t k[32])
+
307 {
+
308  // List of weak points from http://cr.yp.to/ecdh.html
+
309  // That page lists some others but they are variants on these
+
310  // of the form "point + i * (2^255 - 19)" for i = 0, 1, 2.
+
311  // Here we mask off the high bit and eval() catches the rest.
+
312  static const uint8_t points[5][32] PROGMEM = {
+
313  {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
314  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
315  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
316  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+
317  {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
318  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
319  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
320  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+
321  {0xE0, 0xEB, 0x7A, 0x7C, 0x3B, 0x41, 0xB8, 0xAE,
+
322  0x16, 0x56, 0xE3, 0xFA, 0xF1, 0x9F, 0xC4, 0x6A,
+
323  0xDA, 0x09, 0x8D, 0xEB, 0x9C, 0x32, 0xB1, 0xFD,
+
324  0x86, 0x62, 0x05, 0x16, 0x5F, 0x49, 0xB8, 0x00},
+
325  {0x5F, 0x9C, 0x95, 0xBC, 0xA3, 0x50, 0x8C, 0x24,
+
326  0xB1, 0xD0, 0xB1, 0x55, 0x9C, 0x83, 0xEF, 0x5B,
+
327  0x04, 0x44, 0x5C, 0xC4, 0x58, 0x1C, 0x8E, 0x86,
+
328  0xD8, 0x22, 0x4E, 0xDD, 0xD0, 0x9F, 0x11, 0x57},
+
329  {0xEC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+
330  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+
331  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+
332  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F}
+
333  };
+
334 
+
335  // Check each of the weak points in turn. We perform the
+
336  // comparisons carefully so as not to reveal the value of "k"
+
337  // in the instruction timing. If "k" is indeed weak then
+
338  // we still check everything so as not to reveal which
+
339  // weak point it is.
+
340  uint8_t result = 0;
+
341  for (uint8_t posn = 0; posn < 5; ++posn) {
+
342  const uint8_t *point = points[posn];
+
343  uint8_t check = (pgm_read_byte(point + 31) ^ k[31]) & 0x7F;
+
344  for (uint8_t index = 31; index > 0; --index)
+
345  check |= (pgm_read_byte(point + index - 1) ^ k[index - 1]);
+
346  result |= (uint8_t)((((uint16_t)0x0100) - check) >> 8);
+
347  }
+
348 
+
349  // The "result" variable will be non-zero if there was a match.
+
350  return result;
+
351 }
+
352 
+
365 void Curve25519::reduce(limb_t *result, limb_t *x, uint8_t size)
+
366 {
+
367  /*
+
368  Note: This explaination is best viewed with a UTF-8 text viewer.
369 
-
370  We know that for all integer values of k >= 0:
-
371 
-
372  y ≡ x - k * (2ⁿ - b)
-
373  ≡ x - k * 2ⁿ + k * b
-
374 
-
375  In our case we choose k = ⌊x / 2ⁿ⌋ and then let:
-
376 
-
377  w = (x mod 2ⁿ) + ⌊x / 2ⁿ⌋ * b
-
378 
-
379  The value w will either be the answer y or y can be obtained by
-
380  repeatedly subtracting (2ⁿ - b) from w until it is less than (2ⁿ - b).
-
381  At most b subtractions will be required.
+
370  To help explain what this function is doing, the following describes
+
371  how to efficiently compute reductions modulo a base of the form (2ⁿ - b)
+
372  where b is greater than zero and (b + 1)² <= 2ⁿ.
+
373 
+
374  Here we are interested in reducing the result of multiplying two
+
375  numbers that are less than or equal to (2ⁿ - b - 1). That is,
+
376  multiplying numbers that have already been reduced.
+
377 
+
378  Given some x less than or equal to (2ⁿ - b - 1)², we want to find a
+
379  y less than (2ⁿ - b) such that:
+
380 
+
381  y ≡ x mod (2ⁿ - b)
382 
-
383  In our case b is 19 which is more subtractions than we would like to do,
-
384  but we can handle that by performing the above reduction twice and then
-
385  performing a single trial subtraction:
-
386 
-
387  w = (x mod 2ⁿ) + ⌊x / 2ⁿ⌋ * b
-
388  y = (w mod 2ⁿ) + ⌊w / 2ⁿ⌋ * b
-
389  if y >= (2ⁿ - b)
-
390  y -= (2ⁿ - b)
+
383  We know that for all integer values of k >= 0:
+
384 
+
385  y ≡ x - k * (2ⁿ - b)
+
386  ≡ x - k * 2ⁿ + k * b
+
387 
+
388  In our case we choose k = ⌊x / 2ⁿ⌋ and then let:
+
389 
+
390  w = (x mod 2ⁿ) + ⌊x / 2ⁿ⌋ * b
391 
-
392  The value y is the answer we want for reducing x modulo (2ⁿ - b).
-
393  */
-
394 
-
395  dlimb_t carry;
-
396  uint8_t posn;
-
397 
-
398  // Calculate (x mod 2^255) + ((x / 2^255) * 19) which will
-
399  // either produce the answer we want or it will produce a
-
400  // value of the form "answer + j * (2^255 - 19)".
-
401  carry = ((dlimb_t)(x[NUM_LIMBS - 1] >> (LIMB_BITS - 1))) * 19U;
-
402  x[NUM_LIMBS - 1] &= ((((limb_t)1) << (LIMB_BITS - 1)) - 1);
-
403  for (posn = 0; posn < size; ++posn) {
-
404  carry += ((dlimb_t)(x[posn + NUM_LIMBS])) * 38U;
-
405  carry += x[posn];
-
406  x[posn] = (limb_t)carry;
-
407  carry >>= LIMB_BITS;
-
408  }
-
409  if (size < NUM_LIMBS) {
-
410  // The high order half of the number is short; e.g. for mulA24().
-
411  // Propagate the carry through the rest of the low order part.
-
412  for (posn = size; posn < NUM_LIMBS; ++posn) {
-
413  carry += x[posn];
-
414  x[posn] = (limb_t)carry;
-
415  carry >>= LIMB_BITS;
-
416  }
-
417  }
-
418 
-
419  // The "j" value may still be too large due to the final carry-out.
-
420  // We must repeat the reduction. If we already have the answer,
-
421  // then this won't do any harm but we must still do the calculation
-
422  // to preserve the overall timing.
-
423  carry *= 38U;
-
424  carry += ((dlimb_t)(x[NUM_LIMBS - 1] >> (LIMB_BITS - 1))) * 19U;
-
425  x[NUM_LIMBS - 1] &= ((((limb_t)1) << (LIMB_BITS - 1)) - 1);
-
426  for (posn = 0; posn < NUM_LIMBS; ++posn) {
-
427  carry += x[posn];
-
428  x[posn] = (limb_t)carry;
-
429  carry >>= LIMB_BITS;
+
392  The value w will either be the answer y or y can be obtained by
+
393  repeatedly subtracting (2ⁿ - b) from w until it is less than (2ⁿ - b).
+
394  At most b subtractions will be required.
+
395 
+
396  In our case b is 19 which is more subtractions than we would like to do,
+
397  but we can handle that by performing the above reduction twice and then
+
398  performing a single trial subtraction:
+
399 
+
400  w = (x mod 2ⁿ) + ⌊x / 2ⁿ⌋ * b
+
401  y = (w mod 2ⁿ) + ⌊w / 2ⁿ⌋ * b
+
402  if y >= (2ⁿ - b)
+
403  y -= (2ⁿ - b)
+
404 
+
405  The value y is the answer we want for reducing x modulo (2ⁿ - b).
+
406  */
+
407 
+
408  dlimb_t carry;
+
409  uint8_t posn;
+
410 
+
411  // Calculate (x mod 2^255) + ((x / 2^255) * 19) which will
+
412  // either produce the answer we want or it will produce a
+
413  // value of the form "answer + j * (2^255 - 19)".
+
414  carry = ((dlimb_t)(x[NUM_LIMBS - 1] >> (LIMB_BITS - 1))) * 19U;
+
415  x[NUM_LIMBS - 1] &= ((((limb_t)1) << (LIMB_BITS - 1)) - 1);
+
416  for (posn = 0; posn < size; ++posn) {
+
417  carry += ((dlimb_t)(x[posn + NUM_LIMBS])) * 38U;
+
418  carry += x[posn];
+
419  x[posn] = (limb_t)carry;
+
420  carry >>= LIMB_BITS;
+
421  }
+
422  if (size < NUM_LIMBS) {
+
423  // The high order half of the number is short; e.g. for mulA24().
+
424  // Propagate the carry through the rest of the low order part.
+
425  for (posn = size; posn < NUM_LIMBS; ++posn) {
+
426  carry += x[posn];
+
427  x[posn] = (limb_t)carry;
+
428  carry >>= LIMB_BITS;
+
429  }
430  }
431 
-
432  // At this point "x" will either be the answer or it will be the
-
433  // answer plus (2^255 - 19). Perform a trial subtraction which
-
434  // is equivalent to adding 19 and subtracting 2^255. We put the
-
435  // trial answer into the top-most limbs of the original "x" array.
-
436  // We add 19 here; the subtraction of 2^255 occurs in the next step.
-
437  carry = 19U;
-
438  for (posn = 0; posn < NUM_LIMBS; ++posn) {
-
439  carry += x[posn];
-
440  x[posn + NUM_LIMBS] = (limb_t)carry;
-
441  carry >>= LIMB_BITS;
-
442  }
-
443 
-
444  // If there was a borrow, then the bottom-most limbs of "x" are the
-
445  // correct answer. If there was no borrow, then the top-most limbs
-
446  // of "x" are the correct answer. Select the correct answer but do
-
447  // it in a way that instruction timing will not reveal which value
-
448  // was selected. Borrow will occur if the high bit of the previous
-
449  // result is 0: turn the high bit into a selection mask.
-
450  limb_t mask = (limb_t)(((slimb_t)(x[NUM_LIMBS * 2 - 1])) >> (LIMB_BITS - 1));
-
451  limb_t nmask = ~mask;
-
452  x[NUM_LIMBS * 2 - 1] &= ((((limb_t)1) << (LIMB_BITS - 1)) - 1);
-
453  for (posn = 0; posn < NUM_LIMBS; ++posn) {
-
454  result[posn] = (x[posn] & nmask) | (x[posn + NUM_LIMBS] & mask);
+
432  // The "j" value may still be too large due to the final carry-out.
+
433  // We must repeat the reduction. If we already have the answer,
+
434  // then this won't do any harm but we must still do the calculation
+
435  // to preserve the overall timing.
+
436  carry *= 38U;
+
437  carry += ((dlimb_t)(x[NUM_LIMBS - 1] >> (LIMB_BITS - 1))) * 19U;
+
438  x[NUM_LIMBS - 1] &= ((((limb_t)1) << (LIMB_BITS - 1)) - 1);
+
439  for (posn = 0; posn < NUM_LIMBS; ++posn) {
+
440  carry += x[posn];
+
441  x[posn] = (limb_t)carry;
+
442  carry >>= LIMB_BITS;
+
443  }
+
444 
+
445  // At this point "x" will either be the answer or it will be the
+
446  // answer plus (2^255 - 19). Perform a trial subtraction which
+
447  // is equivalent to adding 19 and subtracting 2^255. We put the
+
448  // trial answer into the top-most limbs of the original "x" array.
+
449  // We add 19 here; the subtraction of 2^255 occurs in the next step.
+
450  carry = 19U;
+
451  for (posn = 0; posn < NUM_LIMBS; ++posn) {
+
452  carry += x[posn];
+
453  x[posn + NUM_LIMBS] = (limb_t)carry;
+
454  carry >>= LIMB_BITS;
455  }
-
456 }
-
457 
-
471 limb_t Curve25519::reduceQuick(limb_t *x)
-
472 {
-
473  limb_t temp[NUM_LIMBS];
-
474  dlimb_t carry;
-
475  uint8_t posn;
-
476 
-
477  // Perform a trial subtraction of (2^255 - 19) from "x" which is
-
478  // equivalent to adding 19 and subtracting 2^255. We add 19 here;
-
479  // the subtraction of 2^255 occurs in the next step.
-
480  carry = 19U;
-
481  for (posn = 0; posn < NUM_LIMBS; ++posn) {
-
482  carry += x[posn];
-
483  temp[posn] = (limb_t)carry;
-
484  carry >>= LIMB_BITS;
-
485  }
-
486 
-
487  // If there was a borrow, then the original "x" is the correct answer.
-
488  // If there was no borrow, then "temp" is the correct answer. Select the
-
489  // correct answer but do it in a way that instruction timing will not
-
490  // reveal which value was selected. Borrow will occur if the high bit
-
491  // of "temp" is 0: turn the high bit into a selection mask.
-
492  limb_t mask = (limb_t)(((slimb_t)(temp[NUM_LIMBS - 1])) >> (LIMB_BITS - 1));
-
493  limb_t nmask = ~mask;
-
494  temp[NUM_LIMBS - 1] &= ((((limb_t)1) << (LIMB_BITS - 1)) - 1);
-
495  for (posn = 0; posn < NUM_LIMBS; ++posn) {
-
496  x[posn] = (x[posn] & nmask) | (temp[posn] & mask);
-
497  }
-
498 
-
499  // Clean up "temp".
-
500  clean(temp);
-
501 
-
502  // Return a zero value if we actually subtracted (2^255 - 19) from "x".
-
503  return nmask;
-
504 }
-
505 
-
516 void Curve25519::mul(limb_t *result, const limb_t *x, const limb_t *y)
-
517 {
-
518  limb_t temp[NUM_LIMBS * 2];
-
519  uint8_t i, j;
-
520  dlimb_t carry;
-
521  limb_t word;
-
522 
-
523  // Multiply the lowest word of x by y.
-
524  carry = 0;
-
525  word = x[0];
-
526  for (i = 0; i < NUM_LIMBS; ++i) {
-
527  carry += ((dlimb_t)(y[i])) * word;
-
528  temp[i] = (limb_t)carry;
-
529  carry >>= LIMB_BITS;
-
530  }
-
531  temp[NUM_LIMBS] = (limb_t)carry;
-
532 
-
533  // Multiply and add the remaining words of x by y.
-
534  for (i = 1; i < NUM_LIMBS; ++i) {
-
535  word = x[i];
-
536  carry = 0;
-
537  for (j = 0; j < NUM_LIMBS; ++j) {
-
538  carry += ((dlimb_t)(y[j])) * word;
-
539  carry += temp[i + j];
-
540  temp[i + j] = (limb_t)carry;
-
541  carry >>= LIMB_BITS;
-
542  }
-
543  temp[i + NUM_LIMBS] = (limb_t)carry;
-
544  }
-
545 
-
546  // Reduce the intermediate result modulo 2^255 - 19.
-
547  reduce(result, temp, NUM_LIMBS);
-
548  clean(temp);
-
549 }
-
550 
-
570 void Curve25519::mulA24(limb_t *result, const limb_t *x)
-
571 {
-
572  // The constant a24 = 121665 (0x1DB41) as a limb array.
-
573 #if BIGNUMBER_LIMB_8BIT
-
574  static limb_t const a24[3] PROGMEM = {0x41, 0xDB, 0x01};
-
575  #define pgm_read_a24(index) (pgm_read_byte(&(a24[(index)])))
-
576 #elif BIGNUMBER_LIMB_16BIT
-
577  static limb_t const a24[2] PROGMEM = {0xDB41, 0x0001};
-
578  #define pgm_read_a24(index) (pgm_read_word(&(a24[(index)])))
-
579 #elif BIGNUMBER_LIMB_32BIT
-
580  static limb_t const a24[1] PROGMEM = {0x0001DB41};
-
581  #define pgm_read_a24(index) (pgm_read_dword(&(a24[(index)])))
-
582 #else
-
583  #error "limb_t must be 8, 16, or 32 bits in size"
-
584 #endif
-
585  #define NUM_A24_LIMBS (sizeof(a24) / sizeof(limb_t))
-
586 
-
587  // Multiply the lowest limb of a24 by x and zero-extend into the result.
-
588  limb_t temp[NUM_LIMBS * 2];
-
589  uint8_t i, j;
-
590  dlimb_t carry = 0;
-
591  limb_t word = pgm_read_a24(0);
-
592  for (i = 0; i < NUM_LIMBS; ++i) {
-
593  carry += ((dlimb_t)(x[i])) * word;
-
594  temp[i] = (limb_t)carry;
-
595  carry >>= LIMB_BITS;
-
596  }
-
597  temp[NUM_LIMBS] = (limb_t)carry;
-
598 
-
599  // Multiply and add the remaining limbs of a24.
-
600  for (i = 1; i < NUM_A24_LIMBS; ++i) {
-
601  word = pgm_read_a24(i);
-
602  carry = 0;
-
603  for (j = 0; j < NUM_LIMBS; ++j) {
-
604  carry += ((dlimb_t)(x[j])) * word;
-
605  carry += temp[i + j];
-
606  temp[i + j] = (limb_t)carry;
-
607  carry >>= LIMB_BITS;
-
608  }
-
609  temp[i + NUM_LIMBS] = (limb_t)carry;
-
610  }
-
611 
-
612  // Reduce the intermediate result modulo 2^255 - 19.
-
613  reduce(result, temp, NUM_A24_LIMBS);
-
614  clean(temp);
-
615 }
-
616 
-
627 void Curve25519::add(limb_t *result, const limb_t *x, const limb_t *y)
-
628 {
-
629  dlimb_t carry = 0;
-
630  uint8_t posn;
-
631 
-
632  // Add the two arrays to obtain the intermediate result.
-
633  for (posn = 0; posn < NUM_LIMBS; ++posn) {
-
634  carry += x[posn];
-
635  carry += y[posn];
-
636  result[posn] = (limb_t)carry;
-
637  carry >>= LIMB_BITS;
-
638  }
-
639 
-
640  // Reduce the result using the quick trial subtraction method.
-
641  reduceQuick(result);
-
642 }
-
643 
-
654 void Curve25519::sub(limb_t *result, const limb_t *x, const limb_t *y)
-
655 {
-
656  dlimb_t borrow;
-
657  uint8_t posn;
-
658 
-
659  // Subtract y from x to generate the intermediate result.
-
660  borrow = 0;
-
661  for (posn = 0; posn < NUM_LIMBS; ++posn) {
-
662  borrow = ((dlimb_t)x[posn]) - y[posn] - ((borrow >> LIMB_BITS) & 0x01);
-
663  result[posn] = (limb_t)borrow;
-
664  }
-
665 
-
666  // If we had a borrow, then the result has gone negative and we
-
667  // have to add 2^255 - 19 to the result to make it positive again.
-
668  // The top bits of "borrow" will be all 1's if there is a borrow
-
669  // or it will be all 0's if there was no borrow. Easiest is to
-
670  // conditionally subtract 19 and then mask off the high bit.
-
671  borrow = (borrow >> LIMB_BITS) & 19U;
-
672  borrow = ((dlimb_t)result[0]) - borrow;
-
673  result[0] = (limb_t)borrow;
-
674  for (posn = 1; posn < NUM_LIMBS; ++posn) {
-
675  borrow = ((dlimb_t)result[posn]) - ((borrow >> LIMB_BITS) & 0x01);
-
676  result[posn] = (limb_t)borrow;
-
677  }
-
678  result[NUM_LIMBS - 1] &= ((((limb_t)1) << (LIMB_BITS - 1)) - 1);
-
679 }
-
680 
-
691 void Curve25519::cswap(uint8_t select, limb_t *x, limb_t *y)
-
692 {
-
693  uint8_t posn;
-
694  limb_t dummy;
-
695  limb_t sel;
-
696 
-
697  // Turn "select" into an all-zeroes or all-ones mask. We don't care
-
698  // which bit or bits is set in the original "select" value.
-
699  sel = (limb_t)(((((dlimb_t)1) << LIMB_BITS) - select) >> LIMB_BITS);
-
700  --sel;
-
701 
-
702  // Swap the two values based on "select". Algorithm from:
-
703  // https://tools.ietf.org/html/draft-irtf-cfrg-curves-02
-
704  for (posn = 0; posn < NUM_LIMBS; ++posn) {
-
705  dummy = sel & (x[posn] ^ y[posn]);
-
706  x[posn] ^= dummy;
-
707  y[posn] ^= dummy;
-
708  }
-
709 }
-
710 
-
718 void Curve25519::recip(limb_t *result, const limb_t *x)
-
719 {
-
720  limb_t t1[NUM_LIMBS];
-
721  uint8_t i, j;
-
722 
-
723  // The reciprocal is the same as x ^ (p - 2) where p = 2^255 - 19.
-
724  // The big-endian hexadecimal expansion of (p - 2) is:
-
725  // 7FFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFEB
-
726  //
-
727  // The naive implementation needs to do 2 multiplications per 1 bit and
-
728  // 1 multiplication per 0 bit. We can improve upon this by creating a
-
729  // pattern 0000000001 ... 0000000001. If we square and multiply the
-
730  // pattern by itself we can turn the pattern into the partial results
-
731  // 0000000011 ... 0000000011, 0000000111 ... 0000000111, etc.
-
732  // This averages out to about 1.1 multiplications per 1 bit instead of 2.
-
733 
-
734  // Build a pattern of 250 bits in length of repeated copies of 0000000001.
-
735  #define RECIP_GROUP_SIZE 10
-
736  #define RECIP_GROUP_BITS 250 // Must be a multiple of RECIP_GROUP_SIZE.
-
737  square(t1, x);
-
738  for (j = 0; j < (RECIP_GROUP_SIZE - 1); ++j)
-
739  square(t1, t1);
-
740  mul(result, t1, x);
-
741  for (i = 0; i < ((RECIP_GROUP_BITS / RECIP_GROUP_SIZE) - 2); ++i) {
-
742  for (j = 0; j < RECIP_GROUP_SIZE; ++j)
-
743  square(t1, t1);
-
744  mul(result, result, t1);
-
745  }
-
746 
-
747  // Multiply bit-shifted versions of the 0000000001 pattern into
-
748  // the result to "fill in" the gaps in the pattern.
-
749  square(t1, result);
-
750  mul(result, result, t1);
-
751  for (j = 0; j < (RECIP_GROUP_SIZE - 2); ++j) {
-
752  square(t1, t1);
-
753  mul(result, result, t1);
-
754  }
+
456 
+
457  // If there was a borrow, then the bottom-most limbs of "x" are the
+
458  // correct answer. If there was no borrow, then the top-most limbs
+
459  // of "x" are the correct answer. Select the correct answer but do
+
460  // it in a way that instruction timing will not reveal which value
+
461  // was selected. Borrow will occur if the high bit of the previous
+
462  // result is 0: turn the high bit into a selection mask.
+
463  limb_t mask = (limb_t)(((slimb_t)(x[NUM_LIMBS * 2 - 1])) >> (LIMB_BITS - 1));
+
464  limb_t nmask = ~mask;
+
465  x[NUM_LIMBS * 2 - 1] &= ((((limb_t)1) << (LIMB_BITS - 1)) - 1);
+
466  for (posn = 0; posn < NUM_LIMBS; ++posn) {
+
467  result[posn] = (x[posn] & nmask) | (x[posn + NUM_LIMBS] & mask);
+
468  }
+
469 }
+
470 
+
484 limb_t Curve25519::reduceQuick(limb_t *x)
+
485 {
+
486  limb_t temp[NUM_LIMBS];
+
487  dlimb_t carry;
+
488  uint8_t posn;
+
489  limb_t *xx;
+
490  limb_t *tt;
+
491 
+
492  // Perform a trial subtraction of (2^255 - 19) from "x" which is
+
493  // equivalent to adding 19 and subtracting 2^255. We add 19 here;
+
494  // the subtraction of 2^255 occurs in the next step.
+
495  carry = 19U;
+
496  xx = x;
+
497  tt = temp;
+
498  for (posn = 0; posn < NUM_LIMBS; ++posn) {
+
499  carry += *xx++;
+
500  *tt++ = (limb_t)carry;
+
501  carry >>= LIMB_BITS;
+
502  }
+
503 
+
504  // If there was a borrow, then the original "x" is the correct answer.
+
505  // If there was no borrow, then "temp" is the correct answer. Select the
+
506  // correct answer but do it in a way that instruction timing will not
+
507  // reveal which value was selected. Borrow will occur if the high bit
+
508  // of "temp" is 0: turn the high bit into a selection mask.
+
509  limb_t mask = (limb_t)(((slimb_t)(temp[NUM_LIMBS - 1])) >> (LIMB_BITS - 1));
+
510  limb_t nmask = ~mask;
+
511  temp[NUM_LIMBS - 1] &= ((((limb_t)1) << (LIMB_BITS - 1)) - 1);
+
512  xx = x;
+
513  tt = temp;
+
514  for (posn = 0; posn < NUM_LIMBS; ++posn) {
+
515  *xx = ((*xx) & nmask) | ((*tt++) & mask);
+
516  ++xx;
+
517  }
+
518 
+
519  // Clean up "temp".
+
520  strict_clean(temp);
+
521 
+
522  // Return a zero value if we actually subtracted (2^255 - 19) from "x".
+
523  return nmask;
+
524 }
+
525 
+
536 void Curve25519::mul(limb_t *result, const limb_t *x, const limb_t *y)
+
537 {
+
538  limb_t temp[NUM_LIMBS * 2];
+
539  uint8_t i, j;
+
540  dlimb_t carry;
+
541  limb_t word;
+
542  const limb_t *yy;
+
543  limb_t *tt;
+
544 
+
545  // Multiply the lowest word of x by y.
+
546  carry = 0;
+
547  word = x[0];
+
548  yy = y;
+
549  tt = temp;
+
550  for (i = 0; i < NUM_LIMBS; ++i) {
+
551  carry += ((dlimb_t)(*yy++)) * word;
+
552  *tt++ = (limb_t)carry;
+
553  carry >>= LIMB_BITS;
+
554  }
+
555  *tt = (limb_t)carry;
+
556 
+
557  // Multiply and add the remaining words of x by y.
+
558  for (i = 1; i < NUM_LIMBS; ++i) {
+
559  word = x[i];
+
560  carry = 0;
+
561  yy = y;
+
562  tt = temp + i;
+
563  for (j = 0; j < NUM_LIMBS; ++j) {
+
564  carry += ((dlimb_t)(*yy++)) * word;
+
565  carry += *tt;
+
566  *tt++ = (limb_t)carry;
+
567  carry >>= LIMB_BITS;
+
568  }
+
569  *tt = (limb_t)carry;
+
570  }
+
571 
+
572  // Reduce the intermediate result modulo 2^255 - 19.
+
573  reduce(result, temp, NUM_LIMBS);
+
574  strict_clean(temp);
+
575 }
+
576 
+
596 void Curve25519::mulA24(limb_t *result, const limb_t *x)
+
597 {
+
598  // The constant a24 = 121665 (0x1DB41) as a limb array.
+
599 #if BIGNUMBER_LIMB_8BIT
+
600  static limb_t const a24[3] PROGMEM = {0x41, 0xDB, 0x01};
+
601  #define pgm_read_a24(index) (pgm_read_byte(&(a24[(index)])))
+
602 #elif BIGNUMBER_LIMB_16BIT
+
603  static limb_t const a24[2] PROGMEM = {0xDB41, 0x0001};
+
604  #define pgm_read_a24(index) (pgm_read_word(&(a24[(index)])))
+
605 #elif BIGNUMBER_LIMB_32BIT
+
606  static limb_t const a24[1] PROGMEM = {0x0001DB41};
+
607  #define pgm_read_a24(index) (pgm_read_dword(&(a24[(index)])))
+
608 #else
+
609  #error "limb_t must be 8, 16, or 32 bits in size"
+
610 #endif
+
611  #define NUM_A24_LIMBS (sizeof(a24) / sizeof(limb_t))
+
612 
+
613  // Multiply the lowest limb of a24 by x and zero-extend into the result.
+
614  limb_t temp[NUM_LIMBS * 2];
+
615  uint8_t i, j;
+
616  dlimb_t carry = 0;
+
617  limb_t word = pgm_read_a24(0);
+
618  const limb_t *xx = x;
+
619  limb_t *tt = temp;
+
620  for (i = 0; i < NUM_LIMBS; ++i) {
+
621  carry += ((dlimb_t)(*xx++)) * word;
+
622  *tt++ = (limb_t)carry;
+
623  carry >>= LIMB_BITS;
+
624  }
+
625  *tt = (limb_t)carry;
+
626 
+
627  // Multiply and add the remaining limbs of a24.
+
628  for (i = 1; i < NUM_A24_LIMBS; ++i) {
+
629  word = pgm_read_a24(i);
+
630  carry = 0;
+
631  xx = x;
+
632  tt = temp + i;
+
633  for (j = 0; j < NUM_LIMBS; ++j) {
+
634  carry += ((dlimb_t)(*xx++)) * word;
+
635  carry += *tt;
+
636  *tt++ = (limb_t)carry;
+
637  carry >>= LIMB_BITS;
+
638  }
+
639  *tt = (limb_t)carry;
+
640  }
+
641 
+
642  // Reduce the intermediate result modulo 2^255 - 19.
+
643  reduce(result, temp, NUM_A24_LIMBS);
+
644  strict_clean(temp);
+
645 }
+
646 
+
657 void Curve25519::add(limb_t *result, const limb_t *x, const limb_t *y)
+
658 {
+
659  dlimb_t carry = 0;
+
660  uint8_t posn;
+
661  limb_t *rr = result;
+
662 
+
663  // Add the two arrays to obtain the intermediate result.
+
664  for (posn = 0; posn < NUM_LIMBS; ++posn) {
+
665  carry += *x++;
+
666  carry += *y++;
+
667  *rr++ = (limb_t)carry;
+
668  carry >>= LIMB_BITS;
+
669  }
+
670 
+
671  // Reduce the result using the quick trial subtraction method.
+
672  reduceQuick(result);
+
673 }
+
674 
+
685 void Curve25519::sub(limb_t *result, const limb_t *x, const limb_t *y)
+
686 {
+
687  dlimb_t borrow;
+
688  uint8_t posn;
+
689  limb_t *rr = result;
+
690 
+
691  // Subtract y from x to generate the intermediate result.
+
692  borrow = 0;
+
693  for (posn = 0; posn < NUM_LIMBS; ++posn) {
+
694  borrow = ((dlimb_t)(*x++)) - (*y++) - ((borrow >> LIMB_BITS) & 0x01);
+
695  *rr++ = (limb_t)borrow;
+
696  }
+
697 
+
698  // If we had a borrow, then the result has gone negative and we
+
699  // have to add 2^255 - 19 to the result to make it positive again.
+
700  // The top bits of "borrow" will be all 1's if there is a borrow
+
701  // or it will be all 0's if there was no borrow. Easiest is to
+
702  // conditionally subtract 19 and then mask off the high bit.
+
703  rr = result;
+
704  borrow = (borrow >> LIMB_BITS) & 19U;
+
705  borrow = ((dlimb_t)(*rr)) - borrow;
+
706  *rr++ = (limb_t)borrow;
+
707  for (posn = 1; posn < NUM_LIMBS; ++posn) {
+
708  borrow = ((dlimb_t)(*rr)) - ((borrow >> LIMB_BITS) & 0x01);
+
709  *rr++ = (limb_t)borrow;
+
710  }
+
711  *(--rr) &= ((((limb_t)1) << (LIMB_BITS - 1)) - 1);
+
712 }
+
713 
+
724 void Curve25519::cswap(uint8_t select, limb_t *x, limb_t *y)
+
725 {
+
726  uint8_t posn;
+
727  limb_t dummy;
+
728  limb_t sel;
+
729 
+
730  // Turn "select" into an all-zeroes or all-ones mask. We don't care
+
731  // which bit or bits is set in the original "select" value.
+
732  sel = (limb_t)(((((dlimb_t)1) << LIMB_BITS) - select) >> LIMB_BITS);
+
733  --sel;
+
734 
+
735  // Swap the two values based on "select". Algorithm from:
+
736  // https://tools.ietf.org/html/draft-irtf-cfrg-curves-02
+
737  for (posn = 0; posn < NUM_LIMBS; ++posn) {
+
738  dummy = sel & (x[posn] ^ y[posn]);
+
739  x[posn] ^= dummy;
+
740  y[posn] ^= dummy;
+
741  }
+
742 }
+
743 
+
751 void Curve25519::recip(limb_t *result, const limb_t *x)
+
752 {
+
753  limb_t t1[NUM_LIMBS];
+
754  uint8_t i, j;
755 
-
756  // Deal with the 5 lowest bits of (p - 2), 01011, from highest to lowest.
-
757  square(result, result);
-
758  square(result, result);
-
759  mul(result, result, x);
-
760  square(result, result);
-
761  square(result, result);
-
762  mul(result, result, x);
-
763  square(result, result);
-
764  mul(result, result, x);
-
765 
-
766  // Clean up and exit.
-
767  clean(t1);
-
768 }
-
769 
-
782 void Curve25519::unpack(limb_t *result, const uint8_t *x)
-
783 {
-
784 #if BIGNUMBER_LIMB_8BIT
-
785  memcpy(result, x, 32);
-
786  result[31] &= 0x7F;
-
787 #elif BIGNUMBER_LIMB_16BIT
-
788  for (uint8_t posn = 0; posn < 16; ++posn) {
-
789  result[posn] = ((limb_t)x[posn * 2]) | (((limb_t)x[posn * 2 + 1]) << 8);
-
790  }
-
791  result[15] &= 0x7FFF;
-
792 #elif BIGNUMBER_LIMB_32BIT
-
793  for (uint8_t posn = 0; posn < 8; ++posn) {
-
794  result[posn] = ((limb_t)x[posn * 4]) |
-
795  (((limb_t)x[posn * 4 + 1]) << 8) |
-
796  (((limb_t)x[posn * 4 + 2]) << 16) |
-
797  (((limb_t)x[posn * 4 + 3]) << 24);
-
798  }
-
799  result[7] &= 0x7FFFFFFF;
-
800 #endif
-
801 }
-
802 
-
812 void Curve25519::pack(uint8_t *result, const limb_t *x)
-
813 {
-
814 #if BIGNUMBER_LIMB_8BIT
-
815  memcpy(result, x, 32);
-
816 #elif BIGNUMBER_LIMB_16BIT
-
817  for (uint8_t posn = 0; posn < 16; ++posn) {
-
818  limb_t value = x[posn];
-
819  result[posn * 2] = (uint8_t)value;
-
820  result[posn * 2 + 1] = (uint8_t)(value >> 8);
-
821  }
-
822 #elif BIGNUMBER_LIMB_32BIT
-
823  for (uint8_t posn = 0; posn < 8; ++posn) {
-
824  limb_t value = x[posn];
-
825  result[posn * 4] = (uint8_t)value;
-
826  result[posn * 4 + 1] = (uint8_t)(value >> 8);
-
827  result[posn * 4 + 2] = (uint8_t)(value >> 16);
-
828  result[posn * 4 + 3] = (uint8_t)(value >> 24);
-
829  }
-
830 #endif
-
831 }
+
756  // The reciprocal is the same as x ^ (p - 2) where p = 2^255 - 19.
+
757  // The big-endian hexadecimal expansion of (p - 2) is:
+
758  // 7FFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFEB
+
759  //
+
760  // The naive implementation needs to do 2 multiplications per 1 bit and
+
761  // 1 multiplication per 0 bit. We can improve upon this by creating a
+
762  // pattern 0000000001 ... 0000000001. If we square and multiply the
+
763  // pattern by itself we can turn the pattern into the partial results
+
764  // 0000000011 ... 0000000011, 0000000111 ... 0000000111, etc.
+
765  // This averages out to about 1.1 multiplications per 1 bit instead of 2.
+
766 
+
767  // Build a pattern of 250 bits in length of repeated copies of 0000000001.
+
768  #define RECIP_GROUP_SIZE 10
+
769  #define RECIP_GROUP_BITS 250 // Must be a multiple of RECIP_GROUP_SIZE.
+
770  square(t1, x);
+
771  for (j = 0; j < (RECIP_GROUP_SIZE - 1); ++j)
+
772  square(t1, t1);
+
773  mul(result, t1, x);
+
774  for (i = 0; i < ((RECIP_GROUP_BITS / RECIP_GROUP_SIZE) - 2); ++i) {
+
775  for (j = 0; j < RECIP_GROUP_SIZE; ++j)
+
776  square(t1, t1);
+
777  mul(result, result, t1);
+
778  }
+
779 
+
780  // Multiply bit-shifted versions of the 0000000001 pattern into
+
781  // the result to "fill in" the gaps in the pattern.
+
782  square(t1, result);
+
783  mul(result, result, t1);
+
784  for (j = 0; j < (RECIP_GROUP_SIZE - 2); ++j) {
+
785  square(t1, t1);
+
786  mul(result, result, t1);
+
787  }
+
788 
+
789  // Deal with the 5 lowest bits of (p - 2), 01011, from highest to lowest.
+
790  square(result, result);
+
791  square(result, result);
+
792  mul(result, result, x);
+
793  square(result, result);
+
794  square(result, result);
+
795  mul(result, result, x);
+
796  square(result, result);
+
797  mul(result, result, x);
+
798 
+
799  // Clean up and exit.
+
800  clean(t1);
+
801 }
RNGClass::rand
void rand(uint8_t *data, size_t len)
Generates random bytes into a caller-supplied buffer.
Definition: RNG.cpp:298
-
Curve25519::eval
static bool eval(uint8_t result[32], const uint8_t s[32], const uint8_t x[32])
Evaluates the raw Curve25519 function.
Definition: Curve25519.cpp:68
-
Curve25519::dh1
static void dh1(uint8_t k[32], uint8_t f[32])
Performs phase 1 of a Diffie-Hellman key exchange using Curve25519.
Definition: Curve25519.cpp:231
-
Curve25519::dh2
static bool dh2(uint8_t k[32], uint8_t f[32])
Performs phase 2 of a Diffie-Hellman key exchange using Curve25519.
Definition: Curve25519.cpp:269
+
Curve25519::eval
static bool eval(uint8_t result[32], const uint8_t s[32], const uint8_t x[32])
Evaluates the raw Curve25519 function.
Definition: Curve25519.cpp:79
+
BigNumberUtil::unpackLE
static void unpackLE(limb_t *limbs, size_t count, const uint8_t *bytes, size_t len)
Unpacks the little-endian byte representation of a big number into a limb array.
Definition: BigNumberUtil.cpp:54
+
BigNumberUtil::packLE
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.
Definition: BigNumberUtil.cpp:207
+
Curve25519::dh1
static void dh1(uint8_t k[32], uint8_t f[32])
Performs phase 1 of a Diffie-Hellman key exchange using Curve25519.
Definition: Curve25519.cpp:244
+
Curve25519::dh2
static bool dh2(uint8_t k[32], uint8_t f[32])
Performs phase 2 of a Diffie-Hellman key exchange using Curve25519.
Definition: Curve25519.cpp:282
diff --git a/Curve25519_8h_source.html b/Curve25519_8h_source.html index 00c4d322..3df3ed47 100644 --- a/Curve25519_8h_source.html +++ b/Curve25519_8h_source.html @@ -110,62 +110,58 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
20  * DEALINGS IN THE SOFTWARE.
21  */
22 
-
23 #ifndef CRYPTO_CURVE15519_h
-
24 #define CRYPTO_CURVE15519_h
+
23 #ifndef CRYPTO_CURVE25519_h
+
24 #define CRYPTO_CURVE25519_h
25 
26 #include "BigNumberUtil.h"
-
27 #include <stddef.h>
-
28 
-
29 class Curve25519
-
30 {
-
31 public:
-
32  static bool eval(uint8_t result[32], const uint8_t s[32], const uint8_t x[32]);
-
33 
-
34  static void dh1(uint8_t k[32], uint8_t f[32]);
-
35  static bool dh2(uint8_t k[32], uint8_t f[32]);
-
36 
-
37 #if defined(TEST_CURVE25519_FIELD_OPS)
-
38 public:
-
39 #else
-
40 private:
-
41 #endif
-
42  static uint8_t isWeakPoint(const uint8_t k[32]);
-
43 
-
44  static void reduce(limb_t *result, limb_t *x, uint8_t size);
-
45  static limb_t reduceQuick(limb_t *x);
-
46 
-
47  static void mul(limb_t *result, const limb_t *x, const limb_t *y);
-
48  static void square(limb_t *result, const limb_t *x)
-
49  {
-
50  mul(result, x, x);
-
51  }
-
52 
-
53  static void mulA24(limb_t *result, const limb_t *x);
-
54 
-
55  static void add(limb_t *result, const limb_t *x, const limb_t *y);
-
56  static void sub(limb_t *result, const limb_t *x, const limb_t *y);
-
57 
-
58  static void cswap(uint8_t select, limb_t *x, limb_t *y);
-
59 
-
60  static void recip(limb_t *result, const limb_t *x);
-
61 
-
62  static void unpack(limb_t *result, const uint8_t *x);
-
63  static void pack(uint8_t *result, const limb_t *x);
-
64 
-
65  // Constructor and destructor are private - cannot instantiate this class.
-
66  Curve25519() {}
-
67  ~Curve25519() {}
-
68 };
-
69 
-
70 #endif
-
Curve25519
Diffie-Hellman key agreement based on the elliptic curve modulo 2^255 - 19.
Definition: Curve25519.h:29
-
Curve25519::eval
static bool eval(uint8_t result[32], const uint8_t s[32], const uint8_t x[32])
Evaluates the raw Curve25519 function.
Definition: Curve25519.cpp:68
-
Curve25519::dh1
static void dh1(uint8_t k[32], uint8_t f[32])
Performs phase 1 of a Diffie-Hellman key exchange using Curve25519.
Definition: Curve25519.cpp:231
-
Curve25519::dh2
static bool dh2(uint8_t k[32], uint8_t f[32])
Performs phase 2 of a Diffie-Hellman key exchange using Curve25519.
Definition: Curve25519.cpp:269
+
27 
+
28 class Curve25519
+
29 {
+
30 public:
+
31  static bool eval(uint8_t result[32], const uint8_t s[32], const uint8_t x[32]);
+
32 
+
33  static void dh1(uint8_t k[32], uint8_t f[32]);
+
34  static bool dh2(uint8_t k[32], uint8_t f[32]);
+
35 
+
36 #if defined(TEST_CURVE25519_FIELD_OPS)
+
37 public:
+
38 #else
+
39 private:
+
40 #endif
+
41  static uint8_t isWeakPoint(const uint8_t k[32]);
+
42 
+
43  static void reduce(limb_t *result, limb_t *x, uint8_t size);
+
44  static limb_t reduceQuick(limb_t *x);
+
45 
+
46  static void mul(limb_t *result, const limb_t *x, const limb_t *y);
+
47  static void square(limb_t *result, const limb_t *x)
+
48  {
+
49  mul(result, x, x);
+
50  }
+
51 
+
52  static void mulA24(limb_t *result, const limb_t *x);
+
53 
+
54  static void add(limb_t *result, const limb_t *x, const limb_t *y);
+
55  static void sub(limb_t *result, const limb_t *x, const limb_t *y);
+
56 
+
57  static void cswap(uint8_t select, limb_t *x, limb_t *y);
+
58 
+
59  static void recip(limb_t *result, const limb_t *x);
+
60 
+
61  // Constructor and destructor are private - cannot instantiate this class.
+
62  Curve25519() {}
+
63  ~Curve25519() {}
+
64 };
+
65 
+
66 #endif
+
Curve25519
Diffie-Hellman key agreement based on the elliptic curve modulo 2^255 - 19.
Definition: Curve25519.h:28
+
Curve25519::eval
static bool eval(uint8_t result[32], const uint8_t s[32], const uint8_t x[32])
Evaluates the raw Curve25519 function.
Definition: Curve25519.cpp:79
+
Curve25519::dh1
static void dh1(uint8_t k[32], uint8_t f[32])
Performs phase 1 of a Diffie-Hellman key exchange using Curve25519.
Definition: Curve25519.cpp:244
+
Curve25519::dh2
static bool dh2(uint8_t k[32], uint8_t f[32])
Performs phase 2 of a Diffie-Hellman key exchange using Curve25519.
Definition: Curve25519.cpp:282
diff --git a/DMD_8cpp_source.html b/DMD_8cpp_source.html index 2a864651..b75180ce 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 49ea7f17..c80982c9 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 7b90fa27..eff184c3 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 c69c9f89..e8ffaa30 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 97ee32b1..a665c440 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 0efc482e..6c3a8248 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 8d47fee5..94e02360 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 037e1b49..f209e96a 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 79d5858f..73a6c8e8 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 da379078..a9504e17 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 dc0e8750..45d96bbe 100644 --- a/DejaVuSansItalic9_8h_source.html +++ b/DejaVuSansItalic9_8h_source.html @@ -257,7 +257,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/EEPROM24_8cpp_source.html b/EEPROM24_8cpp_source.html index e84d5dec..5a574af0 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 c558d1ce..ae479006 100644 --- a/EEPROM24_8h_source.html +++ b/EEPROM24_8h_source.html @@ -186,7 +186,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Field_8cpp_source.html b/Field_8cpp_source.html index 1426b9a8..805753a7 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 f49fa485..43e8ba7c 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 8a003b74..9ee254f3 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 3924f6ea..a6fe27b2 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 12e1ae23..8f543348 100644 --- a/GCM_8cpp_source.html +++ b/GCM_8cpp_source.html @@ -352,7 +352,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/GCM_8h_source.html b/GCM_8h_source.html index e7393685..bfdbfd81 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/GHASH_8cpp_source.html b/GHASH_8cpp_source.html index 3391e46b..f7c026b3 100644 --- a/GHASH_8cpp_source.html +++ b/GHASH_8cpp_source.html @@ -239,7 +239,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/GHASH_8h_source.html b/GHASH_8h_source.html index e99283a2..ca5d4e90 100644 --- a/GHASH_8h_source.html +++ b/GHASH_8h_source.html @@ -152,7 +152,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Hash_8cpp_source.html b/Hash_8cpp_source.html index fec52240..37fae6e2 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 3fad11e2..8e8a63c8 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 3f506844..9854a226 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 e36d113d..92492cf9 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 80c5a3fe..d9646a71 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 da639c44..430c81ff 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 2a095b7a..705986f3 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 77fb06a5..455eae43 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 9e688153..495f6d07 100644 --- a/KeccakCore_8cpp_source.html +++ b/KeccakCore_8cpp_source.html @@ -358,7 +358,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/KeccakCore_8h_source.html b/KeccakCore_8h_source.html index 8c7ddb07..a75f379f 100644 --- a/KeccakCore_8h_source.html +++ b/KeccakCore_8h_source.html @@ -166,7 +166,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/LCD_8cpp_source.html b/LCD_8cpp_source.html index 89830910..bf744ef1 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 e59b49ee..c77ff5b2 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 888ffe3a..7a5dfc31 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 1e71e21f..83c62371 100644 --- a/ListField_8h_source.html +++ b/ListField_8h_source.html @@ -159,7 +159,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Melody_8cpp_source.html b/Melody_8cpp_source.html index ed85a191..66bfa73a 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 a6276667..f1599865 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 6fbe2368..aab288e0 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 15f44eda..907ae237 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 d2b91f99..eeb882b5 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 aa2effd6..b6e15c13 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 167b2e24..4e89aa34 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/Poly1305_8cpp_source.html b/Poly1305_8cpp_source.html index 5426c450..de315b99 100644 --- a/Poly1305_8cpp_source.html +++ b/Poly1305_8cpp_source.html @@ -353,7 +353,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/Poly1305_8h_source.html b/Poly1305_8h_source.html index 69810bae..6196b287 100644 --- a/Poly1305_8h_source.html +++ b/Poly1305_8h_source.html @@ -154,7 +154,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/PowerSave_8cpp_source.html b/PowerSave_8cpp_source.html index 7e815ea8..c1cec514 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 4947e4b0..0fb9536b 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 ba5736dd..6b733f8f 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 da75e535..2a88ed2c 100644 --- a/RNG_8cpp_source.html +++ b/RNG_8cpp_source.html @@ -375,7 +375,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/RNG_8h_source.html b/RNG_8h_source.html index abfa3a75..1cadff17 100644 --- a/RNG_8h_source.html +++ b/RNG_8h_source.html @@ -176,7 +176,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/RTC_8cpp_source.html b/RTC_8cpp_source.html index 432f5083..496bd8fb 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 af1b44d3..65be2122 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 ebbd13df..edec38fb 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 2bbcf37a..acea9ddb 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/SHA1_8cpp_source.html b/SHA1_8cpp_source.html index 1918c450..7fadeaa2 100644 --- a/SHA1_8cpp_source.html +++ b/SHA1_8cpp_source.html @@ -323,7 +323,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/SHA1_8h_source.html b/SHA1_8h_source.html index 459f6d29..a0750d7c 100644 --- a/SHA1_8h_source.html +++ b/SHA1_8h_source.html @@ -160,7 +160,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/SHA256_8cpp_source.html b/SHA256_8cpp_source.html index a53c144c..b696bdf3 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 7a532619..812234ad 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 863c5ebc..4f392502 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 f4936c22..d177dc0f 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 6424afda..ea468960 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 d454abf2..56edd76f 100644 --- a/SHA512_8h_source.html +++ b/SHA512_8h_source.html @@ -161,7 +161,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/SoftI2C_8cpp_source.html b/SoftI2C_8cpp_source.html index 59c3e48c..c147cdc5 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 27e52f59..dd8d0429 100644 --- a/SoftI2C_8h_source.html +++ b/SoftI2C_8h_source.html @@ -157,7 +157,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/TextField_8cpp_source.html b/TextField_8cpp_source.html index 4922cc42..163be570 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 fc14dabe..ac2e9546 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 1499f228..b67e5676 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 9f32df40..c9745670 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 7d5ea5a6..ceb33af8 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 4098be2c..182cf214 100644 --- a/TransistorNoiseSource_8h_source.html +++ b/TransistorNoiseSource_8h_source.html @@ -151,7 +151,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/alarm-clock_8dox.html b/alarm-clock_8dox.html index 15137a5d..1e423622 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 87638130..7be52572 100644 --- a/alarm_clock.html +++ b/alarm_clock.html @@ -140,7 +140,7 @@ Completed Clock diff --git a/annotated.html b/annotated.html index 32e4f31a..27a9a17d 100644 --- a/annotated.html +++ b/annotated.html @@ -94,67 +94,68 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); oCAES256AES block cipher with 256-bit keys oCAESCommonAbstract base class for AES block ciphers oCAuthenticatedCipherAbstract base class for authenticated ciphers -oCBitmapRepresents a monochrome bitmap within main memory -oCBLAKE2bBLAKE2b hash algorithm -oCBLAKE2sBLAKE2s hash algorithm -oCBlinkLEDBlink a LED on a digital output pin -oCBlockCipherAbstract base class for block ciphers -oCBoolFieldField that manages the input of a boolean value -oCCBCImplementation of the Cipher Block Chaining (CBC) mode for 128-bit block ciphers -oCCBCCommonConcrete base class to assist with implementing CBC for 128-bit block ciphers -oCCFBImplementation of the Cipher Feedback (CFB) mode for 128-bit block ciphers -oCCFBCommonConcrete base class to assist with implementing CFB for 128-bit block ciphers -oCChaChaChaCha stream cipher -oCChaChaPolyAuthenticated cipher based on ChaCha and Poly1305 -oCCharlieplexManage an array of LED's in a charlieplexed arrangement -oCChaseLEDsChase LED's on output pins in a defined sequence -oCCipherAbstract base class for stream ciphers -oCCTRImplementation of the Counter (CTR) mode for 128-bit block ciphers -oCCTRCommonConcrete base class to assist with implementing CTR mode for 128-bit block ciphers -oCCurve25519Diffie-Hellman key agreement based on the elliptic curve modulo 2^255 - 19 -oCDMDHandle large dot matrix displays composed of LED's -oCDS1307RTCCommunicates with a DS1307 realtime clock chip via I2C -oCDS3231RTCCommunicates with a DS3231 realtime clock chip via I2C -oCDS3232RTCCommunicates with a DS3232 realtime clock chip via I2C -oCEEPROM24Reading and writing EEPROM's from the 24LCXX family -oCFieldManages a single data input/output field within a Form -oCFormManager for a form containing data input/output fields -oCGCMImplementation of the Galois Counter Mode (GCM) -oCGCMCommonConcrete base class to assist with implementing GCM for 128-bit block ciphers -oCGHASHImplementation of the GHASH message authenticator -oCHashAbstract base class for cryptographic hash algorithms -oCI2CMasterAbstract base class for I2C master implementations -oCIntFieldField that manages the input of an integer value -oCIRreceiverManages the reception of RC-5 commands from an infrared remote control -oCKeccakCoreKeccak core sponge function -oCLCDEnhanced library for Freetronics 16x2 LCD shields -oCListFieldField that manages selection from a static list of items -oCMelodyPlays a melody on a digital output pin using tone() -oCNoiseSourceAbstract base class for random noise sources -oCOFBImplementation of the Output Feedback (OFB) mode for 128-bit block ciphers -oCOFBCommonConcrete base class to assist with implementing OFB for 128-bit block ciphers -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 -oCSHA1SHA-1 hash algorithm -oCSHA256SHA-256 hash algorithm -oCSHA3_256SHA3-256 hash algorithm -oCSHA3_512SHA3-512 hash algorithm -oCSHA512SHA-512 hash algorithm -oCSoftI2CBit-banged implementation of an I2C master -oCTextFieldField that displays a read-only text value -oCTimeFieldField that manages the display and editing of a time value -\CTransistorNoiseSourceProcesses the signal from a transistor-based noise source +oCBigNumberUtilUtilities to assist with implementing big number arithmetic +oCBitmapRepresents a monochrome bitmap within main memory +oCBLAKE2bBLAKE2b hash algorithm +oCBLAKE2sBLAKE2s hash algorithm +oCBlinkLEDBlink a LED on a digital output pin +oCBlockCipherAbstract base class for block ciphers +oCBoolFieldField that manages the input of a boolean value +oCCBCImplementation of the Cipher Block Chaining (CBC) mode for 128-bit block ciphers +oCCBCCommonConcrete base class to assist with implementing CBC for 128-bit block ciphers +oCCFBImplementation of the Cipher Feedback (CFB) mode for 128-bit block ciphers +oCCFBCommonConcrete base class to assist with implementing CFB for 128-bit block ciphers +oCChaChaChaCha stream cipher +oCChaChaPolyAuthenticated cipher based on ChaCha and Poly1305 +oCCharlieplexManage an array of LED's in a charlieplexed arrangement +oCChaseLEDsChase LED's on output pins in a defined sequence +oCCipherAbstract base class for stream ciphers +oCCTRImplementation of the Counter (CTR) mode for 128-bit block ciphers +oCCTRCommonConcrete base class to assist with implementing CTR mode for 128-bit block ciphers +oCCurve25519Diffie-Hellman key agreement based on the elliptic curve modulo 2^255 - 19 +oCDMDHandle large dot matrix displays composed of LED's +oCDS1307RTCCommunicates with a DS1307 realtime clock chip via I2C +oCDS3231RTCCommunicates with a DS3231 realtime clock chip via I2C +oCDS3232RTCCommunicates with a DS3232 realtime clock chip via I2C +oCEEPROM24Reading and writing EEPROM's from the 24LCXX family +oCFieldManages a single data input/output field within a Form +oCFormManager for a form containing data input/output fields +oCGCMImplementation of the Galois Counter Mode (GCM) +oCGCMCommonConcrete base class to assist with implementing GCM for 128-bit block ciphers +oCGHASHImplementation of the GHASH message authenticator +oCHashAbstract base class for cryptographic hash algorithms +oCI2CMasterAbstract base class for I2C master implementations +oCIntFieldField that manages the input of an integer value +oCIRreceiverManages the reception of RC-5 commands from an infrared remote control +oCKeccakCoreKeccak core sponge function +oCLCDEnhanced library for Freetronics 16x2 LCD shields +oCListFieldField that manages selection from a static list of items +oCMelodyPlays a melody on a digital output pin using tone() +oCNoiseSourceAbstract base class for random noise sources +oCOFBImplementation of the Output Feedback (OFB) mode for 128-bit block ciphers +oCOFBCommonConcrete base class to assist with implementing OFB for 128-bit block ciphers +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 +oCSHA1SHA-1 hash algorithm +oCSHA256SHA-256 hash algorithm +oCSHA3_256SHA3-256 hash algorithm +oCSHA3_512SHA3-512 hash algorithm +oCSHA512SHA-512 hash algorithm +oCSoftI2CBit-banged implementation of an I2C master +oCTextFieldField that displays a read-only text value +oCTimeFieldField that manages the display and editing of a time value +\CTransistorNoiseSourceProcesses the signal from a transistor-based noise source diff --git a/blink-blink_8dox.html b/blink-blink_8dox.html index c35a856a..0dcac3ee 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 d8c7a93b..5f281297 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 642e1612..8946c7af 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 c4501a05..a492cd37 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 4b608230..c539550b 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 fee6f2ee..8c1450ab 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 03f0130c..45e823a6 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 623719ae..c3cc4e9a 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 0878f0c7..cc80f0e0 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 a86caa3d..6986c767 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 a30dd55e..55fc6cd2 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 5bd03482..15219d2e 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 cccac764..f4ba54d6 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 81daeff9..7ce2d321 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 9ca1f258..f4842162 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 e6e760ee..0ade6e15 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 dd89ba6c..e8238ccf 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 69a3afcb..d0249b0c 100644 --- a/classAuthenticatedCipher.html +++ b/classAuthenticatedCipher.html @@ -349,7 +349,7 @@ virtual  diff --git a/classBLAKE2b-members.html b/classBLAKE2b-members.html index 780a2073..0a1a5af3 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 2fee8635..4330adbb 100644 --- a/classBLAKE2b.html +++ b/classBLAKE2b.html @@ -536,7 +536,7 @@ Additional Inherited Members diff --git a/classBLAKE2s-members.html b/classBLAKE2s-members.html index be74f920..475fc24b 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 42f16f6b..0cba593c 100644 --- a/classBLAKE2s.html +++ b/classBLAKE2s.html @@ -536,7 +536,7 @@ Additional Inherited Members diff --git a/classBigNumberUtil-members.html b/classBigNumberUtil-members.html new file mode 100644 index 00000000..e9e645d5 --- /dev/null +++ b/classBigNumberUtil-members.html @@ -0,0 +1,105 @@ + + + + + + +ArduinoLibs: Member List + + + + + + + + + +
+
+ + + + + + +
+
ArduinoLibs +
+
+
+ + + + + + +
+ All Classes Files Functions Variables Typedefs Enumerations Enumerator Groups Pages
+ + +
+ +
+ +
+
+
+
BigNumberUtil Member List
+
+
+ +

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

+ + + + + +
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
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 new file mode 100644 index 00000000..be3b3615 --- /dev/null +++ b/classBigNumberUtil.html @@ -0,0 +1,377 @@ + + + + + + +ArduinoLibs: BigNumberUtil Class Reference + + + + + + + + + +
+
+ + + + + + +
+
ArduinoLibs +
+
+
+ + + + + + +
+ All Classes Files Functions Variables Typedefs Enumerations Enumerator Groups Pages
+ + +
+ +
+ +
+
+
+Static Public Member Functions | +List of all members
+
+
BigNumberUtil Class Reference
+
+
+ +

Utilities to assist with implementing big number arithmetic. + More...

+ +

#include <BigNumberUtil.h>

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

+Static Public Member Functions

static void unpackLE (limb_t *limbs, size_t count, const uint8_t *bytes, size_t len)
 Unpacks the little-endian byte representation of a big number into a limb array. More...
 
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. More...
 
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. More...
 
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. More...
 
+

Detailed Description

+

Utilities to assist with implementing big number arithmetic.

+

Big numbers are represented as arrays of limb_t words, which may be 8 bits, 16 bits, or 32 bits in size depending upon how the library was configured. For AVR, 16 bit limbs usually give the best performance.

+

Limb arrays are ordered from the least significant word to the most significant.

+ +

Definition at line 52 of file BigNumberUtil.h.

+

Member Function Documentation

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void BigNumberUtil::packBE (uint8_t * bytes,
size_t len,
const limb_t * limbs,
size_t count 
)
+
+static
+
+ +

Packs the big-endian byte representation of a big number into a byte array.

+
Parameters
+ + + + + +
bytesThe byte array to pack into.
lenThe number of bytes in the destination bytes array.
limbsThe limb array representing the big number, starting with the least significant word.
countThe number of elements in the limbs array.
+
+
+

If len is shorter than the length of limbs, then the number will be truncated to the least significant len bytes. If len is longer than the length of limbs, then the high bytes will be filled with zeroes.

+
See Also
unpackLE(), packBE()
+ +

Definition at line 293 of file BigNumberUtil.cpp.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void BigNumberUtil::packLE (uint8_t * bytes,
size_t len,
const limb_t * limbs,
size_t count 
)
+
+static
+
+ +

Packs the little-endian byte representation of a big number into a byte array.

+
Parameters
+ + + + + +
bytesThe byte array to pack into.
lenThe number of bytes in the destination bytes array.
limbsThe limb array representing the big number, starting with the least significant word.
countThe number of elements in the limbs array.
+
+
+

If len is shorter than the length of limbs, then the number will be truncated to the least significant len bytes. If len is longer than the length of limbs, then the high bytes will be filled with zeroes.

+
See Also
unpackLE(), packBE()
+ +

Definition at line 207 of file BigNumberUtil.cpp.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void BigNumberUtil::unpackBE (limb_t * limbs,
size_t count,
const uint8_t * bytes,
size_t len 
)
+
+static
+
+ +

Unpacks the big-endian byte representation of a big number into a limb array.

+
Parameters
+ + + + + +
limbsThe limb array, starting with the least significant word.
countThe number of elements in the limbs array.
bytesThe bytes to unpack.
lenThe number of bytes to unpack.
+
+
+

If len is shorter than the length of limbs, then the high bytes will be filled with zeroes. If len is longer than the length of limbs, then the high bytes will be truncated and lost.

+
See Also
packBE(), unpackLE()
+ +

Definition at line 133 of file BigNumberUtil.cpp.

+ +
+
+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void BigNumberUtil::unpackLE (limb_t * limbs,
size_t count,
const uint8_t * bytes,
size_t len 
)
+
+static
+
+ +

Unpacks the little-endian byte representation of a big number into a limb array.

+
Parameters
+ + + + + +
limbsThe limb array, starting with the least significant word.
countThe number of elements in the limbs array.
bytesThe bytes to unpack.
lenThe number of bytes to unpack.
+
+
+

If len is shorter than the length of limbs, then the high bytes will be filled with zeroes. If len is longer than the length of limbs, then the high bytes will be truncated and lost.

+
See Also
packLE(), unpackBE()
+ +

Definition at line 54 of file BigNumberUtil.cpp.

+ +
+
+
The documentation for this class was generated from the following files: +
+ + + + diff --git a/classBitmap-members.html b/classBitmap-members.html index 2d65a945..d61293a2 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 722fff33..c68a88e0 100644 --- a/classBitmap.html +++ b/classBitmap.html @@ -1745,7 +1745,7 @@ class DMD diff --git a/classBlinkLED-members.html b/classBlinkLED-members.html index 9c988cbc..6da626ee 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 191a4518..8dee45c4 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 ad6aef26..e23ec9d1 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 2b4091ee..989ec03c 100644 --- a/classBlockCipher.html +++ b/classBlockCipher.html @@ -407,7 +407,7 @@ Public Member Functions diff --git a/classBoolField-members.html b/classBoolField-members.html index f09e8578..03d3e35c 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 34c59044..77d089a6 100644 --- a/classBoolField.html +++ b/classBoolField.html @@ -506,7 +506,7 @@ LiquidCrystal *  diff --git a/classCBC-members.html b/classCBC-members.html index f0673628..5ef11f95 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 e3632311..0d12d5ef 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 30428371..d66d42b8 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 17a2d372..762d38c3 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 fd29b043..ec8696ff 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 13ebb550..bfa7ba82 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 6b8f8de9..5e79af84 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 5daeb050..1a2e84af 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 b27b863c..805da335 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 47c1e10b..50e1755f 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 31a67118..6d9f9bfa 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 f9d67289..3738dbec 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 80bb88fe..6f60bbae 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 d2baa8d1..1ca44874 100644 --- a/classChaCha.html +++ b/classChaCha.html @@ -673,7 +673,7 @@ class ChaChaPoly< diff --git a/classChaChaPoly-members.html b/classChaChaPoly-members.html index 1d70a9c7..6b2dc01e 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 cf4be798..301c4b5e 100644 --- a/classChaChaPoly.html +++ b/classChaChaPoly.html @@ -665,7 +665,7 @@ virtual  diff --git a/classCharlieplex-members.html b/classCharlieplex-members.html index 2082fa0a..e66a5e17 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 ee88b9b6..4cf45e3f 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 e2cec4c2..53d1122f 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 86573c22..bbc086d3 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 148662b8..22ea8953 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 f86a1129..08060bb4 100644 --- a/classCipher.html +++ b/classCipher.html @@ -483,7 +483,7 @@ Public Member Functions diff --git a/classCurve25519-members.html b/classCurve25519-members.html index 5d70e06e..12d44cf7 100644 --- a/classCurve25519-members.html +++ b/classCurve25519-members.html @@ -96,7 +96,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classCurve25519.html b/classCurve25519.html index 54e24033..c9a29521 100644 --- a/classCurve25519.html +++ b/classCurve25519.html @@ -110,10 +110,10 @@ Static Public Member Functions

Detailed Description

Diffie-Hellman key agreement based on the elliptic curve modulo 2^255 - 19.

-
Note
This public functions in this class need a substantial amount of stack space to store intermediate results while the curve function is being evaluated. About 1k of free stack space is recommended for safety.
+
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 1k of free stack space is recommended for safety.

References: http://cr.yp.to/ecdh.html https://tools.ietf.org/html/draft-irtf-cfrg-curves-02

-

Definition at line 29 of file Curve25519.h.

+

Definition at line 28 of file Curve25519.h.

Member Function Documentation

@@ -180,7 +180,7 @@ Static Public Member Functions

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

See Also
dh2()
-

Definition at line 231 of file Curve25519.cpp.

+

Definition at line 244 of file Curve25519.cpp.

@@ -228,7 +228,7 @@ Static Public Member Functions

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

See Also
dh1()
-

Definition at line 269 of file Curve25519.cpp.

+

Definition at line 282 of file Curve25519.cpp.

@@ -284,7 +284,7 @@ Static Public Member Functions

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

See Also
dh1(), dh2()
-

Definition at line 68 of file Curve25519.cpp.

+

Definition at line 79 of file Curve25519.cpp.

@@ -295,7 +295,7 @@ Static Public Member Functions diff --git a/classDMD-members.html b/classDMD-members.html index f2fbbc29..a22c626c 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 207b822e..de9bc879 100644 --- a/classDMD.html +++ b/classDMD.html @@ -755,7 +755,7 @@ Multiple panels diff --git a/classDS1307RTC-members.html b/classDS1307RTC-members.html index 3e5a870c..1132e12d 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 df275509..75f0535b 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 48896725..85c97f7f 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 97c60234..217cbd65 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 83008710..bf955e7b 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 68cf641a..e41d5bb7 100644 --- a/classDS3232RTC.html +++ b/classDS3232RTC.html @@ -750,7 +750,7 @@ static const uint8_t  diff --git a/classEEPROM24-members.html b/classEEPROM24-members.html index 61c6e5f3..4b958120 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 51866f60..a24316f6 100644 --- a/classEEPROM24.html +++ b/classEEPROM24.html @@ -431,7 +431,7 @@ Public Member Functions diff --git a/classField-members.html b/classField-members.html index af5533a6..9603c9a6 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 9cd8d961..8d92eb0c 100644 --- a/classField.html +++ b/classField.html @@ -424,7 +424,7 @@ class Form diff --git a/classForm-members.html b/classForm-members.html index 0eb29883..acf17ae5 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 642def68..96411281 100644 --- a/classForm.html +++ b/classForm.html @@ -485,7 +485,7 @@ class Field diff --git a/classGCM-members.html b/classGCM-members.html index 6ec05e85..c49538a2 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 c54b0326..fe414b58 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 4471de74..78c84b0d 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 d14b4890..8500eb80 100644 --- a/classGCMCommon.html +++ b/classGCMCommon.html @@ -736,7 +736,7 @@ Protected Member Functions diff --git a/classGHASH-members.html b/classGHASH-members.html index 8ca0ff54..8a628eda 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 5c75a0d9..ba639471 100644 --- a/classGHASH.html +++ b/classGHASH.html @@ -265,7 +265,7 @@ void  diff --git a/classHash-members.html b/classHash-members.html index 90d9efd8..d7c7ca82 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 d0b294ff..218c66f8 100644 --- a/classHash.html +++ b/classHash.html @@ -576,7 +576,7 @@ Protected Member Functions diff --git a/classI2CMaster-members.html b/classI2CMaster-members.html index 8c671db2..b6135c9b 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 041853f2..3b384600 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 5b769224..0ef442ce 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 6900d10c..7e106f37 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 a4e754ec..a00807be 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 e4f5e71f..27821a0d 100644 --- a/classIntField.html +++ b/classIntField.html @@ -647,7 +647,7 @@ LiquidCrystal *  diff --git a/classKeccakCore-members.html b/classKeccakCore-members.html index 8d9dab9e..c2295ada 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 80200693..ee5bfb00 100644 --- a/classKeccakCore.html +++ b/classKeccakCore.html @@ -425,7 +425,7 @@ void  diff --git a/classLCD-members.html b/classLCD-members.html index d3ce6447..739a4b84 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 cc46db9a..b89d973f 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 08ec14ec..7f9456ab 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 567605d9..b699571d 100644 --- a/classListField.html +++ b/classListField.html @@ -411,7 +411,7 @@ LiquidCrystal *  diff --git a/classMelody-members.html b/classMelody-members.html index eac5383d..2a5660d7 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 1fb3bb60..f5fdeb81 100644 --- a/classMelody.html +++ b/classMelody.html @@ -371,7 +371,7 @@ bool  diff --git a/classNoiseSource-members.html b/classNoiseSource-members.html index ff6f4552..f7ba2955 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 f356eec7..a2e92876 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 548f0c2d..3df2218b 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 cac0666a..6f17d4fa 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 26922f7b..a86ee4d7 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 66818d72..6d94cff9 100644 --- a/classOFBCommon.html +++ b/classOFBCommon.html @@ -534,7 +534,7 @@ Protected Member Functions diff --git a/classPoly1305-members.html b/classPoly1305-members.html index 98b049b6..ad9ddf0d 100644 --- a/classPoly1305-members.html +++ b/classPoly1305-members.html @@ -105,7 +105,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classPoly1305.html b/classPoly1305.html index e3c349c1..d2a234ec 100644 --- a/classPoly1305.html +++ b/classPoly1305.html @@ -280,7 +280,7 @@ void  diff --git a/classRNGClass-members.html b/classRNGClass-members.html index 4af5e126..7704ad6f 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 6ce6d978..d75790b1 100644 --- a/classRNGClass.html +++ b/classRNGClass.html @@ -517,7 +517,7 @@ static const int  diff --git a/classRTC-members.html b/classRTC-members.html index ad9c0ce4..c1c8313f 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 1217395e..aeb178da 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 c31e4086..e0f9136c 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 c7301d5f..e8ed3666 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 4fdaa45d..e043dc2c 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 1e1e2980..5ce88f6e 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 9dc7d79e..203db7cb 100644 --- a/classRingOscillatorNoiseSource.html +++ b/classRingOscillatorNoiseSource.html @@ -253,7 +253,7 @@ Additional Inherited Members diff --git a/classSHA1-members.html b/classSHA1-members.html index 426bec2f..5f74ee46 100644 --- a/classSHA1-members.html +++ b/classSHA1-members.html @@ -110,7 +110,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classSHA1.html b/classSHA1.html index 3d61c8bc..0c026d8c 100644 --- a/classSHA1.html +++ b/classSHA1.html @@ -506,7 +506,7 @@ Additional Inherited Members diff --git a/classSHA256-members.html b/classSHA256-members.html index 9f0eb6f3..f12b334e 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 ddfe66a1..6d7a328e 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 61437658..706cbfe2 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 8fdaf91c..6e534d01 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 65a58cca..7424b638 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 8343e2f7..4899dea2 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 6ddff70a..f3207cd5 100644 --- a/classSHA512-members.html +++ b/classSHA512-members.html @@ -111,7 +111,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/classSHA512.html b/classSHA512.html index 01f823b3..f9f6cc92 100644 --- a/classSHA512.html +++ b/classSHA512.html @@ -506,7 +506,7 @@ Additional Inherited Members diff --git a/classSoftI2C-members.html b/classSoftI2C-members.html index 56cf56e1..c2889795 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 e98762e9..ec0adc59 100644 --- a/classSoftI2C.html +++ b/classSoftI2C.html @@ -346,7 +346,7 @@ unsigned int  diff --git a/classTextField-members.html b/classTextField-members.html index f467c9dc..31f1d91a 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 f75baa1b..2b7f4741 100644 --- a/classTextField.html +++ b/classTextField.html @@ -343,7 +343,7 @@ LiquidCrystal *  diff --git a/classTimeField-members.html b/classTimeField-members.html index 1056025b..07eca50b 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 ff425429..2a4c062c 100644 --- a/classTimeField.html +++ b/classTimeField.html @@ -541,7 +541,7 @@ LiquidCrystal *  diff --git a/classTransistorNoiseSource-members.html b/classTransistorNoiseSource-members.html index f7c21378..33104a88 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 2b23e3b6..5c89ac3b 100644 --- a/classTransistorNoiseSource.html +++ b/classTransistorNoiseSource.html @@ -280,7 +280,7 @@ Additional Inherited Members diff --git a/classes.html b/classes.html index 53dc8ab9..9b93e65b 100644 --- a/classes.html +++ b/classes.html @@ -90,43 +90,44 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
A | B | C | D | E | F | G | H | I | K | L | M | N | O | P | R | S | T
- + - - - + - - + - - + - - - - - + + + - - + + - + +
  A  
-
CFBCommon   Form   ListField   RTCDate   
ChaCha   
  G  
+
CFB   Form   ListField   RTCDate   
CFBCommon   
  G  
  M  
RTCTime   
AES128   ChaChaPoly   
  S  
+
AES128   ChaCha   
  S  
AES192   Charlieplex   GCM   Melody   
AES256   ChaseLEDs   GCMCommon   
  N  
+
AES192   ChaChaPoly   GCM   Melody   
AES256   Charlieplex   GCMCommon   
  N  
SHA1   
AESCommon   Cipher   GHASH   SHA256   
AuthenticatedCipher   CTR   
  H  
+
AESCommon   ChaseLEDs   GHASH   SHA256   
AuthenticatedCipher   Cipher   
  H  
NoiseSource   SHA3_256   
  B  
-
CTRCommon   
  O  
+
CTR   
  O  
SHA3_512   
Curve25519   Hash   SHA512   
Bitmap   
  D  
-
  I  
+
CTRCommon   Hash   SHA512   
BigNumberUtil   Curve25519   
  I  
OFB   SoftI2C   
BLAKE2b   OFBCommon   
  T  
+
Bitmap   
  D  
+
OFBCommon   
  T  
BLAKE2s   DMD   I2CMaster   
  P  
+
BLAKE2b   I2CMaster   
  P  
BlinkLED   DS1307RTC   IntField   TextField   
BlockCipher   DS3231RTC   IRreceiver   Poly1305   TimeField   
BoolField   DS3232RTC   
  K  
+
BLAKE2s   DMD   IntField   TextField   
BlinkLED   DS1307RTC   IRreceiver   Poly1305   TimeField   
BlockCipher   DS3231RTC   
  K  
  R  
TransistorNoiseSource   
BoolField   DS3232RTC   
  C  
  E  
-
KeccakCore   RingOscillatorNoiseSource   
CBC   EEPROM24   
  L  
+
KeccakCore   RingOscillatorNoiseSource   
  L  
RNGClass   
CBC   EEPROM24   RTC   
CBCCommon   
  F  
-
RTC   
CFB   LCD   RTCAlarm   
LCD   RTCAlarm   
Field   
@@ -134,7 +135,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/crypto-rng-ring_8dox.html b/crypto-rng-ring_8dox.html index 6c7893af..8d34062a 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 054c5599..99e0a161 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 d6ee3c29..d8c43523 100644 --- a/crypto.html +++ b/crypto.html @@ -166,17 +166,17 @@ Performance Public Key OperationTime (per operation)Comment -Curve25519::eval()3738msRaw curve evaluation +Curve25519::eval()3119msRaw curve evaluation -Curve25519::dh1()3740msFirst half of Diffie-Hellman key agreement +Curve25519::dh1()3121msFirst half of Diffie-Hellman key agreement -Curve25519::dh2()3738msSecond half of Diffie-Hellman key agreement +Curve25519::dh2()3120msSecond half of Diffie-Hellman key agreement

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.

diff --git a/crypto_8dox.html b/crypto_8dox.html index bf9a764a..334e89c5 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 b1ec4c9d..f894aee9 100644 --- a/crypto_rng.html +++ b/crypto_rng.html @@ -182,7 +182,7 @@ Destroying secret data diff --git a/crypto_rng_ring.html b/crypto_rng_ring.html index 3c8f807d..7fdcec70 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 bc03b795..57190919 100644 --- a/dir_1586d320a3b1e622174530fde769cda9.html +++ b/dir_1586d320a3b1e622174530fde769cda9.html @@ -102,7 +102,7 @@ Files diff --git a/dir_3dd03323535933fb3f714c41ff7a94da.html b/dir_3dd03323535933fb3f714c41ff7a94da.html index 91503a82..baa6e1a7 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 b1ff3324..ceea8e56 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 2038091c..15e97168 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 f9caa14e..d2f3cae9 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 8c751674..d4ce78d0 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 34426467..5eee7c9f 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 39d566d9..f7b15b09 100644 --- a/dir_bc0718b08fb2015b8e59c47b2805f60c.html +++ b/dir_bc0718b08fb2015b8e59c47b2805f60c.html @@ -112,7 +112,7 @@ Directories diff --git a/dir_be059bf9978ae156837504b1b8a7568c.html b/dir_be059bf9978ae156837504b1b8a7568c.html index bc74cd3c..81c3e295 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 60a4ddd3..1390df44 100644 --- a/dir_e2ce51835550ba18edf07a8311722290.html +++ b/dir_e2ce51835550ba18edf07a8311722290.html @@ -100,6 +100,8 @@ Files   file  AuthenticatedCipher.h [code]   +file  BigNumberUtil.cpp [code] +  file  BigNumberUtil.h [code]   file  BLAKE2b.cpp [code] @@ -198,7 +200,7 @@ Files diff --git a/dir_f34881fcf60f680b800190d5274dfaea.html b/dir_f34881fcf60f680b800190d5274dfaea.html index c9faa8cf..887ba87e 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 5bda7c6c..09176c71 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 802d6ded..dc61c742 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 ba5aa25f..d95827b2 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 a408c379..823ec634 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 d3c2aed4..82083655 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 f5878f38..982c519b 100644 --- a/files.html +++ b/files.html @@ -93,114 +93,115 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); o*AESCommon.cpp o*AuthenticatedCipher.cpp o*AuthenticatedCipher.h -o*BigNumberUtil.h -o*Bitmap.cpp -o*Bitmap.h -o*BLAKE2b.cpp -o*BLAKE2b.h -o*BLAKE2s.cpp -o*BLAKE2s.h -o*BlinkLED.cpp -o*BlinkLED.h -o*BlockCipher.cpp -o*BlockCipher.h -o*BoolField.cpp -o*BoolField.h -o*CBC.cpp -o*CBC.h -o*CFB.cpp -o*CFB.h -o*ChaCha.cpp -o*ChaCha.h -o*ChaChaPoly.cpp -o*ChaChaPoly.h -o*Charlieplex.cpp -o*Charlieplex.h -o*ChaseLEDs.cpp -o*ChaseLEDs.h -o*Cipher.cpp -o*Cipher.h -o*Crypto.cpp -o*Crypto.h -o*CTR.cpp -o*CTR.h -o*Curve25519.cpp -o*Curve25519.h -o*DejaVuSans9.h -o*DejaVuSansBold9.h -o*DejaVuSansItalic9.h -o*DMD.cpp -o*DMD.h -o*DS1307RTC.cpp -o*DS1307RTC.h -o*DS3231RTC.cpp -o*DS3231RTC.h -o*DS3232RTC.cpp -o*DS3232RTC.h -o*EEPROM24.cpp -o*EEPROM24.h -o*Field.cpp -o*Field.h -o*Form.cpp -o*Form.h -o*GCM.cpp -o*GCM.h -o*GHASH.cpp -o*GHASH.h -o*Hash.cpp -o*Hash.h -o*I2CMaster.cpp -o*I2CMaster.h -o*IntField.cpp -o*IntField.h -o*IRreceiver.cpp -o*IRreceiver.h -o*KeccakCore.cpp -o*KeccakCore.h -o*LCD.cpp -o*LCD.h -o*ListField.cpp -o*ListField.h -o*Melody.cpp -o*Melody.h -o*Mono5x7.h -o*NoiseSource.cpp -o*NoiseSource.h -o*OFB.cpp -o*OFB.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*SHA1.cpp -o*SHA1.h -o*SHA256.cpp -o*SHA256.h -o*SHA3.cpp -o*SHA3.h -o*SHA512.cpp -o*SHA512.h -o*SoftI2C.cpp -o*SoftI2C.h -o*TextField.cpp -o*TextField.h -o*TimeField.cpp -o*TimeField.h -o*TransistorNoiseSource.cpp -\*TransistorNoiseSource.h +o*BigNumberUtil.cpp +o*BigNumberUtil.h +o*Bitmap.cpp +o*Bitmap.h +o*BLAKE2b.cpp +o*BLAKE2b.h +o*BLAKE2s.cpp +o*BLAKE2s.h +o*BlinkLED.cpp +o*BlinkLED.h +o*BlockCipher.cpp +o*BlockCipher.h +o*BoolField.cpp +o*BoolField.h +o*CBC.cpp +o*CBC.h +o*CFB.cpp +o*CFB.h +o*ChaCha.cpp +o*ChaCha.h +o*ChaChaPoly.cpp +o*ChaChaPoly.h +o*Charlieplex.cpp +o*Charlieplex.h +o*ChaseLEDs.cpp +o*ChaseLEDs.h +o*Cipher.cpp +o*Cipher.h +o*Crypto.cpp +o*Crypto.h +o*CTR.cpp +o*CTR.h +o*Curve25519.cpp +o*Curve25519.h +o*DejaVuSans9.h +o*DejaVuSansBold9.h +o*DejaVuSansItalic9.h +o*DMD.cpp +o*DMD.h +o*DS1307RTC.cpp +o*DS1307RTC.h +o*DS3231RTC.cpp +o*DS3231RTC.h +o*DS3232RTC.cpp +o*DS3232RTC.h +o*EEPROM24.cpp +o*EEPROM24.h +o*Field.cpp +o*Field.h +o*Form.cpp +o*Form.h +o*GCM.cpp +o*GCM.h +o*GHASH.cpp +o*GHASH.h +o*Hash.cpp +o*Hash.h +o*I2CMaster.cpp +o*I2CMaster.h +o*IntField.cpp +o*IntField.h +o*IRreceiver.cpp +o*IRreceiver.h +o*KeccakCore.cpp +o*KeccakCore.h +o*LCD.cpp +o*LCD.h +o*ListField.cpp +o*ListField.h +o*Melody.cpp +o*Melody.h +o*Mono5x7.h +o*NoiseSource.cpp +o*NoiseSource.h +o*OFB.cpp +o*OFB.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*SHA1.cpp +o*SHA1.h +o*SHA256.cpp +o*SHA256.h +o*SHA3.cpp +o*SHA3.h +o*SHA512.cpp +o*SHA512.h +o*SoftI2C.cpp +o*SoftI2C.h +o*TextField.cpp +o*TextField.h +o*TimeField.cpp +o*TimeField.h +o*TransistorNoiseSource.cpp +\*TransistorNoiseSource.h diff --git a/functions.html b/functions.html index b1d58be5..6ea411bc 100644 --- a/functions.html +++ b/functions.html @@ -183,7 +183,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_b.html b/functions_b.html index 9ffad0bd..e09b1ea1 100644 --- a/functions_b.html +++ b/functions_b.html @@ -181,7 +181,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_c.html b/functions_c.html index 0c5d0f27..7b29a071 100644 --- a/functions_c.html +++ b/functions_c.html @@ -220,7 +220,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_d.html b/functions_d.html index 2c92c3d5..cd6bfa4b 100644 --- a/functions_d.html +++ b/functions_d.html @@ -248,7 +248,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_e.html b/functions_e.html index c70f09c1..ef292123 100644 --- a/functions_e.html +++ b/functions_e.html @@ -186,7 +186,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_enum.html b/functions_enum.html index fe3a8258..6ab62d9b 100644 --- a/functions_enum.html +++ b/functions_enum.html @@ -104,7 +104,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_eval.html b/functions_eval.html index 4e559cc7..f06f308b 100644 --- a/functions_eval.html +++ b/functions_eval.html @@ -107,7 +107,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_f.html b/functions_f.html index c46c821c..21b186d7 100644 --- a/functions_f.html +++ b/functions_f.html @@ -183,7 +183,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func.html b/functions_func.html index c8c6d67b..dc6c70e2 100644 --- a/functions_func.html +++ b/functions_func.html @@ -176,7 +176,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_b.html b/functions_func_b.html index ac07c8ed..57b5277f 100644 --- a/functions_func_b.html +++ b/functions_func_b.html @@ -171,7 +171,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_c.html b/functions_func_c.html index aec8ac5d..375fc8ae 100644 --- a/functions_func_c.html +++ b/functions_func_c.html @@ -216,7 +216,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_d.html b/functions_func_d.html index 9363be17..1ced7931 100644 --- a/functions_func_d.html +++ b/functions_func_d.html @@ -231,7 +231,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_e.html b/functions_func_e.html index 353c0cb5..67dab14b 100644 --- a/functions_func_e.html +++ b/functions_func_e.html @@ -185,7 +185,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_f.html b/functions_func_f.html index f129ac72..ede5fc40 100644 --- a/functions_func_f.html +++ b/functions_func_f.html @@ -176,7 +176,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_g.html b/functions_func_g.html index c7030197..b67886ec 100644 --- a/functions_func_g.html +++ b/functions_func_g.html @@ -138,7 +138,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_h.html b/functions_func_h.html index fc325b9a..1896ea46 100644 --- a/functions_func_h.html +++ b/functions_func_h.html @@ -157,7 +157,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_i.html b/functions_func_i.html index 3d527b2e..d0ac6486 100644 --- a/functions_func_i.html +++ b/functions_func_i.html @@ -172,7 +172,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_k.html b/functions_func_k.html index a688de3f..4f0410a3 100644 --- a/functions_func_k.html +++ b/functions_func_k.html @@ -143,7 +143,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_l.html b/functions_func_l.html index 297724c6..d96d4e75 100644 --- a/functions_func_l.html +++ b/functions_func_l.html @@ -129,7 +129,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); : Field
  • LCD() -: LCD +: LCD
  • led() : Charlieplex @@ -151,7 +151,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_m.html b/functions_func_m.html index b38eca69..bc23b9f2 100644 --- a/functions_func_m.html +++ b/functions_func_m.html @@ -142,7 +142,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_n.html b/functions_func_n.html index b09452bf..80eb9b1c 100644 --- a/functions_func_n.html +++ b/functions_func_n.html @@ -138,7 +138,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_o.html b/functions_func_o.html index 8a11194f..3b6beaf6 100644 --- a/functions_func_o.html +++ b/functions_func_o.html @@ -141,7 +141,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search'); diff --git a/functions_func_p.html b/functions_func_p.html index e15442e9..0de34a52 100644 --- a/functions_func_p.html +++ b/functions_func_p.html @@ -122,6 +122,12 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');  

    - p -