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.
Diff: main.cpp
- 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();
+ }
+}