Micro-ECC is an open source implementation for ECC running in an embedded microcontroller. This is a port for mbed. Please do more test and update assembly optimization for Cortex-M, aka, ARM-thumb.

Dependencies:   mbed uECC

Revision:
0:f83fc7ecf97b
Child:
2:a2a77f01dd26
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Thu Sep 07 12:10:39 2017 +0000
@@ -0,0 +1,138 @@
+/*
+ *  Micro-ECC ported to mbed platform
+ *  Original Author:    Ken MacKay
+ *  Original Project:   https://github.com/kmackay/micro-ecc
+ *  Ported by:  Allan K Liu
+ *
+ *  Micro-ECC is ported to mbed to evalute its performance 
+ *  Micro-ECC is optimized for ARM/ARM-thumb/ARM-thumb2/AVR platform
+ *  Micro-ECC mbed version disabled thumb/thumb2 optimization because of its GCC syntax. 
+ *      PS: I am not good at assembly for those projects.
+ */
+
+#include "mbed.h"
+#include "uECC.h"
+
+Serial pc(USBTX, USBRX);
+AnalogIn rnd(A1);
+Timer t;
+
+void dumprand()
+{
+    uint8_t buf[16];
+    
+    pc.printf("plain_random:");
+    for(int i=0; i<16; i++){
+        buf[i] = rand();
+        pc.printf("%02X",buf[i]);
+    }
+    pc.printf("\r\n");
+    
+}
+    
+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.
+  pc.printf("Random:\r\n");
+  while (size) {
+    uint8_t val = 0;    
+    for (unsigned i = 0; i < 8; ++i) {
+      //int init = rnd.read();
+      int init = rand();
+      pc.printf("%04X",init);
+      int count = 0;
+      //while (rnd.read() == init) {
+      while (rand() == init) {  
+        ++count;
+      }
+      
+      if (count == 0) {
+         val = (val << 1) | (init & 0x01);
+      } else {
+         val = (val << 1) | (count & 0x01);
+      }
+    }
+    *dest = val;
+    ++dest;
+    --size;
+    pc.printf("\r\n");
+  }
+  
+  // NOTE: it would be a good idea to hash the resulting random data using SHA-256 or similar.
+  return 1;
+}
+
+void dumphex(const char* name, uint8_t* buf, uint8_t size){
+  pc.printf(name);
+  for(int i=0; i<size; i++){
+    pc.printf("%02X",buf[i]);  
+  }
+  pc.printf("\r\n");  
+}
+    
+void loop(){
+  const struct uECC_Curve_t * curve = uECC_secp160r1();
+  int r;
+  long d;
+  
+  uint8_t private1[21];
+  uint8_t private2[21];
+  
+  uint8_t public1[40];
+  uint8_t public2[40];
+  
+  uint8_t secret1[20];
+  uint8_t secret2[20];
+
+  pc.printf("Start ECC computation\r\n");
+  pc.printf("make key 1\r\n");
+  t.start();
+  uECC_make_key(public1, private1, curve);
+  dumphex("public1: ", public1, sizeof(public1));
+  dumphex("private1: ", private1, sizeof(private1));
+  t.stop(); d = t.read_ms();
+  t.reset(); t.start();  
+  pc.printf("time: %dms\r\n",d);
+  
+  pc.printf("make key 2\r\n");
+  t.start();
+  uECC_make_key(public2, private2, curve);
+  dumphex("public2: ", public2, sizeof(public2));
+  dumphex("private2: ", private2, sizeof(private2));
+  t.stop(); d = t.read_ms();
+  t.reset(); t.start();  
+  pc.printf("time: %dms\r\n",d);
+  
+  pc.printf("make share secret 1\r\n");
+  t.start();
+  r = uECC_shared_secret(public2, private1, secret1, curve);
+  pc.printf("r: %04X\r\n",r);
+  t.stop(); d = t.read_ms();
+  t.reset(); t.start();  
+  pc.printf("time: %dms\r\n",d);
+  
+  pc.printf("make share secret 2\r\n");
+  t.start();
+  r = uECC_shared_secret(public1, private2, secret2, curve);
+  pc.printf("r: %04X\r\n",r);
+  t.stop(); d = t.read_ms();
+  t.reset(); t.start();  
+  pc.printf("time: %dms\r\n",d);
+  
+  pc.printf("\r\n\r\n");
+  wait(1);
+}
+
+int main() {
+    pc.baud(115200);
+    dumprand();
+    wait(1);
+    pc.printf("\r\n\r\nmicroECC test\r\n");
+    uECC_set_rng(&RNG);
+    pc.printf("\r\n");
+    
+    while(1) {
+        loop();
+    }
+}