summaryrefslogtreecommitdiffstats
path: root/web/server/h2o/libh2o/deps/picotls/deps/micro-ecc/test/ecc_test/ecc_test.ino
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--web/server/h2o/libh2o/deps/picotls/deps/micro-ecc/test/ecc_test/ecc_test.ino85
1 files changed, 85 insertions, 0 deletions
diff --git a/web/server/h2o/libh2o/deps/picotls/deps/micro-ecc/test/ecc_test/ecc_test.ino b/web/server/h2o/libh2o/deps/picotls/deps/micro-ecc/test/ecc_test/ecc_test.ino
new file mode 100644
index 00000000..c3c8900d
--- /dev/null
+++ b/web/server/h2o/libh2o/deps/picotls/deps/micro-ecc/test/ecc_test/ecc_test.ino
@@ -0,0 +1,85 @@
+#include <uECC.h>
+
+extern "C" {
+
+static int RNG(uint8_t *dest, unsigned size) {
+ // Use the least-significant bits from the ADC for an unconnected pin (or connected to a source of
+ // random noise). This can take a long time to generate random data if the result of analogRead(0)
+ // doesn't change very frequently.
+ while (size) {
+ uint8_t val = 0;
+ for (unsigned i = 0; i < 8; ++i) {
+ int init = analogRead(0);
+ int count = 0;
+ while (analogRead(0) == init) {
+ ++count;
+ }
+
+ if (count == 0) {
+ val = (val << 1) | (init & 0x01);
+ } else {
+ val = (val << 1) | (count & 0x01);
+ }
+ }
+ *dest = val;
+ ++dest;
+ --size;
+ }
+ // NOTE: it would be a good idea to hash the resulting random data using SHA-256 or similar.
+ return 1;
+}
+
+} // extern "C"
+
+void setup() {
+ Serial.begin(115200);
+ Serial.print("Testing ecc\n");
+ uECC_set_rng(&RNG);
+}
+
+void loop() {
+ const struct uECC_Curve_t * curve = uECC_secp160r1();
+ uint8_t private1[21];
+ uint8_t private2[21];
+
+ uint8_t public1[40];
+ uint8_t public2[40];
+
+ uint8_t secret1[20];
+ uint8_t secret2[20];
+
+ unsigned long a = millis();
+ uECC_make_key(public1, private1, curve);
+ unsigned long b = millis();
+
+ Serial.print("Made key 1 in "); Serial.println(b-a);
+ a = millis();
+ uECC_make_key(public2, private2, curve);
+ b = millis();
+ Serial.print("Made key 2 in "); Serial.println(b-a);
+
+ a = millis();
+ int r = uECC_shared_secret(public2, private1, secret1, curve);
+ b = millis();
+ Serial.print("Shared secret 1 in "); Serial.println(b-a);
+ if (!r) {
+ Serial.print("shared_secret() failed (1)\n");
+ return;
+ }
+
+ a = millis();
+ r = uECC_shared_secret(public1, private2, secret2, curve);
+ b = millis();
+ Serial.print("Shared secret 2 in "); Serial.println(b-a);
+ if (!r) {
+ Serial.print("shared_secret() failed (2)\n");
+ return;
+ }
+
+ if (memcmp(secret1, secret2, 20) != 0) {
+ Serial.print("Shared secrets are not identical!\n");
+ } else {
+ Serial.print("Shared secrets are identical\n");
+ }
+}
+